pax_global_header00006660000000000000000000000064122540363450014516gustar00rootroot0000000000000052 comment=6e2489965e6614a1783f5c959946f9a9ecfdd9d6 xye-0.12.2+dfsg/000077500000000000000000000000001225403634500133245ustar00rootroot00000000000000xye-0.12.2+dfsg/AUTHORS000066400000000000000000000024721225403634500144010ustar00rootroot00000000000000Xye === Víctor Hugo Solíz Kuncar (Vexorian) vexorian@gmail.com Author of Kye for windows 3.11 (1992) ============================== Colin Garbutt Levels ====== - Víctor Hugo Solíz Kuncar : Most of the level files, except: - Colin Phipps : The kye levels included in Phipps.kye - David W. Skinner (http://users.bentonrea.com/~sasquatch/sokoban/index.html ) microban.xsb - phyrex1an : pxlevels.xye - Mc ! : mic4.xye - Eilang: cracked.xye - Ironclash: xyester.xye Ancestral Xye Skin ================== Miguel Angel Soliz Kuncar Base of build system ==================== - David Philips (http://david.acz.org) Special thanks =========================== - http://www.codeblocks.org/ - Code::blocks is a cross platform c++ IDE completelly free and also works like a charm! - http://www.libsdl.org - SDL It is a wonderful cross platform library for game creation. - Jim Babcock , the creator of SKye for helping with a lot of information about kye rules, specially timing and the rules for auto sliders/ rockies. - The Ultimate Packer for eXecutables : Copyright (c) 1996-2002 Markus Oberhumer & Laszlo Molnar http://upx.sourceforge.net Mantains the win32 executable small. - The "Inkscape" and "The Gimp" projects: Without these tools making the sprites could get hard or expensive. - Sourceforge.net for the hosting. xye-0.12.2+dfsg/COPYING000066400000000000000000000021671225403634500143650ustar00rootroot00000000000000 License information: ==================== Xye is released under the PNG/ZLIB license which is very flexible: Xye License (it is a PNG/ZLIB license) Copyright (c) 2006 Victor Hugo Soliz Kuncar This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. 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 appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. ==================== See res/detailed_COPYING for the license for the Ancestral Xye Skin. xye-0.12.2+dfsg/ChangeLog000066400000000000000000000143211225403634500150770ustar00rootroot000000000000000.12.2: SVN Revision 404 0.12.1 SVN Revisions 375 to 392 0.12.0 SVN Revisions 334 to 374 0.11.2 SVN Revisions 295 to 333 0.11.1 SVN Revisions from 266 to 294 0.11.0 SVN Revisions from 229 to 265 0.10.0 SVN Revisions from 229 to 235 0.9.3 SVN Revisions from 165 to 228 0.9.2 SVN Revisions from 127 to 164. 0.9.1 SVN Revisions from 43 to 122. 0.9.0: xye moved to subversion (SVN) All revisions from 0 to 42 are changes from 0.8.1 to 0.9.0 0.8.1 on tutorials.xye : level 5's timers now have a timeout value of 2 , up from 0. on makefile.in: ./configure is now able to correctly handle custom --prefix for documentation. on Mic4.xye: added solution movie to level 2. 0.8.0 on levels.cpp, options.cpp, options.h: The color for selected files with errors in the format can now be determined by the skin file. on levels.cpp, xye.cpp and options.cpp: can now change colors of the select level menu through skin xml. on levels.cpp, font.cpp : Hint marquee now fades for an small amount of time before showing in/out. on levels.cpp: fixed various mistakes that allowed windows version of level browser to list some files twice. on font.cpp and options.cpp : New SDL_ttf requirement, xye now supports truetype fonts and therefore unicode characters in level files through UTF8. on tutorials.xye : The second hint had wrong XML, used " instead of " on xye.cpp,IsXyeAt : Fixed a bug that caused plenty of mistakes in the beast AI. on xye.cpp,IsXyeAt : Fixed a bug that caused plenty of mistakes in the beast AI. on xye.cpp, GoFindASquare : Fixed a bug that made AI unable to take proper advantage from teleports. on xye.cpp and options.cpp : Undo now requires an special tweak in xyeconf.xml, considered a cheat code. on xye.h,xye.cpp,xye_script.cpp,kye_script.cpp: wildcards and number blocks now got a round variation, added metal blocks. on xye.h,xye.cpp: added the "tiger" beast. on xye.h,xye.cpp: Rattler may now go above pits if it is longer than one unit. on xye.cpp : Fixed a bug with colliding fire balls. (They didn't explode and begin to behave like walls) on xye.cpp : changed object and game clock behavior when the game is over, to fix a glitch with explosion graphics. on xye.cpp,TryMagneticMove : Fixed a glitch with bots sometimes pulling yellow sticky blocks. on xye.cpp,xye.h : explosions are now able to slightly offset (graphicaly ) objects and ground objects in their squares, for added eye candy. on xye.cpp: nodes added to a death queue during the death queue evaluation will explode on the next round, this means that contiguous red timers will explode in a sequencial way. on xye.cpp, number class : Fixed a glitch with green timers that made them instantly pass active state to nearby timers depending on the direction they were. 0.7.6 on xye.cpp: - In game::SaveReplay , fixed 2 memory problems regarding the size of arrays to be used as strings. - counter is now correctly initialized by sniper::sniper( - Added xsb_level.cpp and xsb_level.h , allow use of sokoban levels. - Modiffied xye_script.cpp a lot in order to allow usage of xsb levels. - Fixed memory leaks on KyeLevelPack::Load - gem::trypush, earth::trypush and key::trypush will dissallow xye to eath them if they were placed on ground objects that are blocking the path. - levels.cpp : FillArrayWithFilenames() : Made it move tutorials.xye to the top of the list. - Added undo support to classes game and recording - many other changes I forgot to document, sorry On font.cpp: - removed usage of assert, it raised compile errors in some platforms 0.7.5 on xye.cpp: - Added OldBeastPickDirectDir , AI function that behaves in a way like old Kye beasts - Changed BeastAI_Default, BeastAI_Blob, BeastAI_Twister, BeastAI_Spike and BeastAI_Virus to use OldBeastPickDirectDir and act more like the kye versions. They also got every random dependant function replaced with mod operations - beast::trypush will set the beast's tic value so it does not move again in that cycle. - In RoundAdvance_Sub : Replaced Chance(0.5) with a formula so what decides where to move a round object when it slides against another object with both round corners is no longer random. - On game::MoveXye(), game:gameover(, game::Draw( , game::DrawPanel(, : added recording support - On game::AppLoop() added support for S key (play solution) - On game::draw() initialize local shadow boolean correctly. - On game::DrawPanel() draw a film icon if level contains solution. It also now shows the level number/total levels. And the layout is somewhat fixed. - On game::Init : made it cache xye's color, and the colors of blocks. Increased the height of the game window for the panel improvements. - On arrow::loop : added Died pointer to arguments of object::trypush - Added recycle class which is a queue where we leave objects that wanted to "delete this" so this class removes them on the end of the level instead of they getting removed instantly and add risks for memory problems. - On IsXyeAt , it now considers that are adjacent to xye as good results as well. - On game::DrawPanel on xye.h : - reference to OldBeastPickDirectDir - Added record.h and record.cpp, support for recordings On xye_script.cpp - added level solution support. - It now reads the number of levels and the current level. - GetFileData is able to validate kye files and also returns the number of levels of a file On kye_script.cpp - ReadData method that can validate a .kye file. On vxsdl.cpp/h : added RecolorCache class and made Recoloring version of SDL_BlitSurface attempt to use the cache On levels.cpp: - Will also look for .xyr files and is able to play replays. - replaced usage of character array + struct with simply an std::string for the list. - it now considers subfolders of levels/ - Added support for page up/down keys On options.cpp: - Fixed a segmentation fault that could happen if no skin file is found (assigns FontBold instead of Font in the if(b3) block) - removed support for stufflocation attribute in xyeconf.xml - On unix systems xyeconf.xml will be located on /home/user/.xye/xyeconf.xml On main.cpp: - On unix based systems it will try to generate /home/user/.xye/ , /home/user/.xye/levels/ and /home/user/.xye/res/ On font.cpp - Font::WriteWrap : added a +1 in the width calculation to prevent a small glitch with the word wrap. xye-0.12.2+dfsg/INSTALL000066400000000000000000000224651225403634500143660ustar00rootroot00000000000000********************************* * * Installing xye * ********************************* Compiling ========== Unless you got xye from a binary package you'll need to follow the next steps. Xye is based on gcc's library and SDL with SDL_image, it should be usable in many other platforms, but I am going to support win32 and linux only, mainly because I don't have access to other platforms and can't test xye on them currently. * Make sure you have gcc compiler and make * Install SDL, SDL_image and SDL_ttf many linux distributions have packages for these libraries available, otherwise refer http://www.libsdl.org for more information about installing them. * If you found packages in your distribution, make sure to also install the 'dev' versions of those libraries. (Since we want to compile the game) * extract the tar.gz . * From now we'll call the folder where the files were extracted: /xyelocation/ cd /xyelocation/ or chdir /xyelocation/ ./configure * If you get errors here most likely you need to install SDL and SDL_image correctly, we require version 1.2.7 or higher for SDL, and SDL_image requires png support (should be the biggest reason to ever use SDL_image). make make install. xye * some systems require you to use sudo for make install (namely ubuntu) sudo make install instead of make install * For ubuntu I recommend to use "sudo checkinstall" so you can later uninstall the game if you want. * You can now use "xye" on the command line to run xye, you can also set up a desktop icon for the xye command depending on your distribution. Alternative Setup ================= If you don't have priviledges to make install then you can just compile it normally then when you want to run the game: cd /xyelocation/ ./xye ./ Will use the levels/ and res/ folders of the same folder where you are located. You can also use the command /xyelocation/xye/ /xyelocation/ Advanced: Removing SDL_TTF requirement. ============================= You can make remove this requirement and make xye use bitmap fonts instead (no UTF8 support) NOTRUETYPE should be defined when compiling, and also make sure to change the skin files so they point to the bitmap font files instead of truetype fonts (and remove the size attribute). Do not hesitate to send queries to vexorian@gmail.com for more information. --- What's left is the usual INSTALL file for autoconf packages: Basic Installation ================== These are generic installation instructions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, a file `config.cache' that saves the results of its tests to speed up reconfiguring, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.in' is used to create `configure' by a program called `autoconf'. You only need `configure.in' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. If you're using `csh' on an old version of System V, you might need to type `sh ./configure' instead to prevent `csh' from trying to execute `configure' itself. Running `configure' takes a while. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Type `make install' to install the programs and any data files and documentation. NOTE: If you don't have priviledges to make install, you can execute xye like this: ./xye ./ 4. You can remove the program binaries and object files from the source code directory by typing `make clean'. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. You can give `configure' initial values for variables by setting them in the environment. Using a Bourne-compatible shell, you can do that on the command line like this: CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure Or on systems that have the `env' program, you can do it like this: env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you must use a version of `make' that supports the `VPATH' variable, such as GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. If you have to use a `make' that does not supports the `VPATH' variable, you have to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. Installation Names ================== By default, `make install' will install the package's files in `/usr/local/bin', `/usr/local/man', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PATH'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you give `configure' the option `--exec-prefix=PATH', the package will use PATH as the prefix for installing programs and libraries. Documentation and other data files will still use the regular prefix. If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Specifying the System Type ========================== There may be some features `configure' can not figure out automatically, but needs to determine by the type of host the package will run on. Usually `configure' can figure that out, but if it prints a message saying it can not guess the host type, give it the `--host=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name with three fields: CPU-COMPANY-SYSTEM See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the host type. If you are building compiler tools for cross-compiling, you can also use the `--target=TYPE' option to select the type of system they will produce code for and the `--build=TYPE' option to select the type of system on which you are compiling the package. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Operation Controls ================== `configure' recognizes the following options to control how it operates. `--cache-file=FILE' Use and save the results of the tests in FILE instead of `./config.cache'. Set FILE to `/dev/null' to disable caching, for debugging `configure'. `--help' Print a summary of the options to `configure', and exit. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `--version' Print the version of Autoconf used to generate the `configure' script, and exit. `configure' also accepts some other, not widely useful, options. xye-0.12.2+dfsg/Makefile.am000066400000000000000000000044201225403634500153600ustar00rootroot00000000000000# $Id$ DISTCLEANFILES = *~ *.~* bin_PROGRAMS = xye xye_LDFLAGS = docedir = $(datadir)/@PACKAGE@ doce_DATA = ReadMe.html NEWS ChangeLog AUTHORS levelsdir= $(datadir)/@PACKAGE@/levels levels_DATA = levels/5levels.xye \ levels/levels.xye \ levels/logo.xye \ levels/Mic4.xye \ levels/pxlevels.xye \ levels/microban.xsb \ levels/oldtutorials.xye \ levels/sphinx.xye \ levels/cracked.xye \ levels/tutorials.xye \ levels/Phipps.xye \ levels/xyester.xye \ levels/SuperJustin.xye resdir= $(datadir)/@PACKAGE@/res res_DATA = res/default.xml \ res/xye.png \ res/xye_luminosity.png \ res/DejaVuSans.ttf \ res/DejaVuSans-Bold.ttf \ res/fon.bmp \ res/fon_bold.bmp \ res/clean40.xml \ res/clean40.png \ res/clean40_luminosity.png \ res/detailed.xml \ res/detailed20.xml \ res/detailed30.xml \ res/detailed.png \ res/detailed20.png \ res/detailed30.png \ res/detailed_L.png \ res/detailed_L20.png \ res/detailed_L30.png \ res/detailed_icon.png \ res/default_icon.png \ res/detailed_COPYING pixmapsdir = $(datadir)/pixmaps pixmaps_DATA = pixmaps/xye.png desktopdir = $(datadir)/applications desktop_DATA = xye.desktop EXTRA_DIST1 =autogen.sh \ clean.sh \ build-linux.sh \ build-win32.sh \ cross-configure.sh \ cross-make.sh \ src/xye.cbp \ res/xye.xcf \ src/resource.rc \ src/Makefile.in \ pixmaps/xye.svg \ pixmaps/xye.ico \ pixmaps/xye.xpm \ pixmaps/xye.png \ xye.desktop xye_SOURCES = src/main.cpp src/browser.cpp \ src/font.cpp src/gen.cpp src/kye_script.cpp src/levels.cpp src/options.cpp \ src/tinyxml/xye_tinystr.cpp \ src/tinyxml/xye_tinyxml.cpp \ src/tinyxml/xye_tinyxmlerror.cpp \ src/tinyxml/xye_tinyxmlparser.cpp \ src/vxsdl.cpp src/xye.cpp src/xsb_level.cpp \ src/xye_script.cpp src/browser.h src/font.h src/gen.h src/kye_script.h src/xsb_level.h src/levels.h \ src/listbox.cpp src/listbox.h src/options.h \ src/vxsdl.h src/xye.h src/xye_script.h \ src/tinyxml/xye_tinystr.h \ src/tinyxml/xye_tinyxml.h \ src/record.cpp \ src/record.h \ src/xyedit.cpp \ src/editorsave.cpp \ src/editorload.cpp \ src/xyedit.h \ src/window.h \ src/dialogs.h \ src/dialogs.cpp \ src/window.cpp \ src/skins.cpp \ src/skins.h EXTRA_DIST = ${EXTRA_DIST1} ${xye_SOURCES} ${res_DATA} ${levels_DATA} ${doce_DATA} DEFS=@data_path_flag@ #xye_LDADD = @GL_LIBS@ xye-0.12.2+dfsg/Makefile.in000066400000000000000000002070261225403634500154000ustar00rootroot00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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@ # $Id$ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ bin_PROGRAMS = xye$(EXEEXT) subdir = . DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(top_srcdir)/configure AUTHORS COPYING \ ChangeLog INSTALL NEWS config.guess config.sub depcomp \ install-sh missing mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(desktopdir)" \ "$(DESTDIR)$(docedir)" "$(DESTDIR)$(levelsdir)" \ "$(DESTDIR)$(pixmapsdir)" "$(DESTDIR)$(resdir)" PROGRAMS = $(bin_PROGRAMS) am_xye_OBJECTS = main.$(OBJEXT) browser.$(OBJEXT) font.$(OBJEXT) \ gen.$(OBJEXT) kye_script.$(OBJEXT) levels.$(OBJEXT) \ options.$(OBJEXT) xye_tinystr.$(OBJEXT) xye_tinyxml.$(OBJEXT) \ xye_tinyxmlerror.$(OBJEXT) xye_tinyxmlparser.$(OBJEXT) \ vxsdl.$(OBJEXT) xye.$(OBJEXT) xsb_level.$(OBJEXT) \ xye_script.$(OBJEXT) listbox.$(OBJEXT) record.$(OBJEXT) \ xyedit.$(OBJEXT) editorsave.$(OBJEXT) editorload.$(OBJEXT) \ dialogs.$(OBJEXT) window.$(OBJEXT) skins.$(OBJEXT) xye_OBJECTS = $(am_xye_OBJECTS) xye_LDADD = $(LDADD) xye_LINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(xye_LDFLAGS) \ $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = $(xye_SOURCES) DIST_SOURCES = $(xye_SOURCES) am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } DATA = $(desktop_DATA) $(doce_DATA) $(levels_DATA) $(pixmaps_DATA) \ $(res_DATA) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @data_path_flag@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EXEEXT = @EXEEXT@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ data_path_flag = @data_path_flag@ datadir = @datadir@ datarootdir = @datarootdir@ doc_dir = @doc_dir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ DISTCLEANFILES = *~ *.~* xye_LDFLAGS = docedir = $(datadir)/@PACKAGE@ doce_DATA = ReadMe.html NEWS ChangeLog AUTHORS levelsdir = $(datadir)/@PACKAGE@/levels levels_DATA = levels/5levels.xye \ levels/levels.xye \ levels/logo.xye \ levels/Mic4.xye \ levels/pxlevels.xye \ levels/microban.xsb \ levels/oldtutorials.xye \ levels/sphinx.xye \ levels/cracked.xye \ levels/tutorials.xye \ levels/Phipps.xye \ levels/xyester.xye \ levels/SuperJustin.xye resdir = $(datadir)/@PACKAGE@/res res_DATA = res/default.xml \ res/xye.png \ res/xye_luminosity.png \ res/DejaVuSans.ttf \ res/DejaVuSans-Bold.ttf \ res/fon.bmp \ res/fon_bold.bmp \ res/clean40.xml \ res/clean40.png \ res/clean40_luminosity.png \ res/detailed.xml \ res/detailed20.xml \ res/detailed30.xml \ res/detailed.png \ res/detailed20.png \ res/detailed30.png \ res/detailed_L.png \ res/detailed_L20.png \ res/detailed_L30.png \ res/detailed_icon.png \ res/default_icon.png \ res/detailed_COPYING pixmapsdir = $(datadir)/pixmaps pixmaps_DATA = pixmaps/xye.png desktopdir = $(datadir)/applications desktop_DATA = xye.desktop EXTRA_DIST1 = autogen.sh \ clean.sh \ build-linux.sh \ build-win32.sh \ cross-configure.sh \ cross-make.sh \ src/xye.cbp \ res/xye.xcf \ src/resource.rc \ src/Makefile.in \ pixmaps/xye.svg \ pixmaps/xye.ico \ pixmaps/xye.xpm \ pixmaps/xye.png \ xye.desktop xye_SOURCES = src/main.cpp src/browser.cpp \ src/font.cpp src/gen.cpp src/kye_script.cpp src/levels.cpp src/options.cpp \ src/tinyxml/xye_tinystr.cpp \ src/tinyxml/xye_tinyxml.cpp \ src/tinyxml/xye_tinyxmlerror.cpp \ src/tinyxml/xye_tinyxmlparser.cpp \ src/vxsdl.cpp src/xye.cpp src/xsb_level.cpp \ src/xye_script.cpp src/browser.h src/font.h src/gen.h src/kye_script.h src/xsb_level.h src/levels.h \ src/listbox.cpp src/listbox.h src/options.h \ src/vxsdl.h src/xye.h src/xye_script.h \ src/tinyxml/xye_tinystr.h \ src/tinyxml/xye_tinyxml.h \ src/record.cpp \ src/record.h \ src/xyedit.cpp \ src/editorsave.cpp \ src/editorload.cpp \ src/xyedit.h \ src/window.h \ src/dialogs.h \ src/dialogs.cpp \ src/window.cpp \ src/skins.cpp \ src/skins.h EXTRA_DIST = ${EXTRA_DIST1} ${xye_SOURCES} ${res_DATA} ${levels_DATA} ${doce_DATA} all: all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj am--refresh: Makefile @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p; \ then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) xye$(EXEEXT): $(xye_OBJECTS) $(xye_DEPENDENCIES) $(EXTRA_xye_DEPENDENCIES) @rm -f xye$(EXEEXT) $(xye_LINK) $(xye_OBJECTS) $(xye_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/browser.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dialogs.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/editorload.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/editorsave.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/font.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gen.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kye_script.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/levels.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/listbox.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/options.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/record.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/skins.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vxsdl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/window.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xsb_level.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xye.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xye_script.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xye_tinystr.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xye_tinyxml.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xye_tinyxmlerror.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xye_tinyxmlparser.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xyedit.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` main.o: src/main.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT main.o -MD -MP -MF $(DEPDIR)/main.Tpo -c -o main.o `test -f 'src/main.cpp' || echo '$(srcdir)/'`src/main.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/main.Tpo $(DEPDIR)/main.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/main.cpp' object='main.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o main.o `test -f 'src/main.cpp' || echo '$(srcdir)/'`src/main.cpp main.obj: src/main.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT main.obj -MD -MP -MF $(DEPDIR)/main.Tpo -c -o main.obj `if test -f 'src/main.cpp'; then $(CYGPATH_W) 'src/main.cpp'; else $(CYGPATH_W) '$(srcdir)/src/main.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/main.Tpo $(DEPDIR)/main.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/main.cpp' object='main.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o main.obj `if test -f 'src/main.cpp'; then $(CYGPATH_W) 'src/main.cpp'; else $(CYGPATH_W) '$(srcdir)/src/main.cpp'; fi` browser.o: src/browser.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT browser.o -MD -MP -MF $(DEPDIR)/browser.Tpo -c -o browser.o `test -f 'src/browser.cpp' || echo '$(srcdir)/'`src/browser.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/browser.Tpo $(DEPDIR)/browser.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/browser.cpp' object='browser.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o browser.o `test -f 'src/browser.cpp' || echo '$(srcdir)/'`src/browser.cpp browser.obj: src/browser.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT browser.obj -MD -MP -MF $(DEPDIR)/browser.Tpo -c -o browser.obj `if test -f 'src/browser.cpp'; then $(CYGPATH_W) 'src/browser.cpp'; else $(CYGPATH_W) '$(srcdir)/src/browser.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/browser.Tpo $(DEPDIR)/browser.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/browser.cpp' object='browser.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o browser.obj `if test -f 'src/browser.cpp'; then $(CYGPATH_W) 'src/browser.cpp'; else $(CYGPATH_W) '$(srcdir)/src/browser.cpp'; fi` font.o: src/font.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT font.o -MD -MP -MF $(DEPDIR)/font.Tpo -c -o font.o `test -f 'src/font.cpp' || echo '$(srcdir)/'`src/font.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/font.Tpo $(DEPDIR)/font.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/font.cpp' object='font.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o font.o `test -f 'src/font.cpp' || echo '$(srcdir)/'`src/font.cpp font.obj: src/font.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT font.obj -MD -MP -MF $(DEPDIR)/font.Tpo -c -o font.obj `if test -f 'src/font.cpp'; then $(CYGPATH_W) 'src/font.cpp'; else $(CYGPATH_W) '$(srcdir)/src/font.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/font.Tpo $(DEPDIR)/font.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/font.cpp' object='font.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o font.obj `if test -f 'src/font.cpp'; then $(CYGPATH_W) 'src/font.cpp'; else $(CYGPATH_W) '$(srcdir)/src/font.cpp'; fi` gen.o: src/gen.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gen.o -MD -MP -MF $(DEPDIR)/gen.Tpo -c -o gen.o `test -f 'src/gen.cpp' || echo '$(srcdir)/'`src/gen.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/gen.Tpo $(DEPDIR)/gen.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/gen.cpp' object='gen.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gen.o `test -f 'src/gen.cpp' || echo '$(srcdir)/'`src/gen.cpp gen.obj: src/gen.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gen.obj -MD -MP -MF $(DEPDIR)/gen.Tpo -c -o gen.obj `if test -f 'src/gen.cpp'; then $(CYGPATH_W) 'src/gen.cpp'; else $(CYGPATH_W) '$(srcdir)/src/gen.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/gen.Tpo $(DEPDIR)/gen.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/gen.cpp' object='gen.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gen.obj `if test -f 'src/gen.cpp'; then $(CYGPATH_W) 'src/gen.cpp'; else $(CYGPATH_W) '$(srcdir)/src/gen.cpp'; fi` kye_script.o: src/kye_script.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT kye_script.o -MD -MP -MF $(DEPDIR)/kye_script.Tpo -c -o kye_script.o `test -f 'src/kye_script.cpp' || echo '$(srcdir)/'`src/kye_script.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/kye_script.Tpo $(DEPDIR)/kye_script.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/kye_script.cpp' object='kye_script.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o kye_script.o `test -f 'src/kye_script.cpp' || echo '$(srcdir)/'`src/kye_script.cpp kye_script.obj: src/kye_script.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT kye_script.obj -MD -MP -MF $(DEPDIR)/kye_script.Tpo -c -o kye_script.obj `if test -f 'src/kye_script.cpp'; then $(CYGPATH_W) 'src/kye_script.cpp'; else $(CYGPATH_W) '$(srcdir)/src/kye_script.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/kye_script.Tpo $(DEPDIR)/kye_script.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/kye_script.cpp' object='kye_script.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o kye_script.obj `if test -f 'src/kye_script.cpp'; then $(CYGPATH_W) 'src/kye_script.cpp'; else $(CYGPATH_W) '$(srcdir)/src/kye_script.cpp'; fi` levels.o: src/levels.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT levels.o -MD -MP -MF $(DEPDIR)/levels.Tpo -c -o levels.o `test -f 'src/levels.cpp' || echo '$(srcdir)/'`src/levels.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/levels.Tpo $(DEPDIR)/levels.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/levels.cpp' object='levels.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o levels.o `test -f 'src/levels.cpp' || echo '$(srcdir)/'`src/levels.cpp levels.obj: src/levels.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT levels.obj -MD -MP -MF $(DEPDIR)/levels.Tpo -c -o levels.obj `if test -f 'src/levels.cpp'; then $(CYGPATH_W) 'src/levels.cpp'; else $(CYGPATH_W) '$(srcdir)/src/levels.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/levels.Tpo $(DEPDIR)/levels.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/levels.cpp' object='levels.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o levels.obj `if test -f 'src/levels.cpp'; then $(CYGPATH_W) 'src/levels.cpp'; else $(CYGPATH_W) '$(srcdir)/src/levels.cpp'; fi` options.o: src/options.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT options.o -MD -MP -MF $(DEPDIR)/options.Tpo -c -o options.o `test -f 'src/options.cpp' || echo '$(srcdir)/'`src/options.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/options.Tpo $(DEPDIR)/options.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/options.cpp' object='options.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o options.o `test -f 'src/options.cpp' || echo '$(srcdir)/'`src/options.cpp options.obj: src/options.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT options.obj -MD -MP -MF $(DEPDIR)/options.Tpo -c -o options.obj `if test -f 'src/options.cpp'; then $(CYGPATH_W) 'src/options.cpp'; else $(CYGPATH_W) '$(srcdir)/src/options.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/options.Tpo $(DEPDIR)/options.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/options.cpp' object='options.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o options.obj `if test -f 'src/options.cpp'; then $(CYGPATH_W) 'src/options.cpp'; else $(CYGPATH_W) '$(srcdir)/src/options.cpp'; fi` xye_tinystr.o: src/tinyxml/xye_tinystr.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xye_tinystr.o -MD -MP -MF $(DEPDIR)/xye_tinystr.Tpo -c -o xye_tinystr.o `test -f 'src/tinyxml/xye_tinystr.cpp' || echo '$(srcdir)/'`src/tinyxml/xye_tinystr.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/xye_tinystr.Tpo $(DEPDIR)/xye_tinystr.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/tinyxml/xye_tinystr.cpp' object='xye_tinystr.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xye_tinystr.o `test -f 'src/tinyxml/xye_tinystr.cpp' || echo '$(srcdir)/'`src/tinyxml/xye_tinystr.cpp xye_tinystr.obj: src/tinyxml/xye_tinystr.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xye_tinystr.obj -MD -MP -MF $(DEPDIR)/xye_tinystr.Tpo -c -o xye_tinystr.obj `if test -f 'src/tinyxml/xye_tinystr.cpp'; then $(CYGPATH_W) 'src/tinyxml/xye_tinystr.cpp'; else $(CYGPATH_W) '$(srcdir)/src/tinyxml/xye_tinystr.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/xye_tinystr.Tpo $(DEPDIR)/xye_tinystr.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/tinyxml/xye_tinystr.cpp' object='xye_tinystr.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xye_tinystr.obj `if test -f 'src/tinyxml/xye_tinystr.cpp'; then $(CYGPATH_W) 'src/tinyxml/xye_tinystr.cpp'; else $(CYGPATH_W) '$(srcdir)/src/tinyxml/xye_tinystr.cpp'; fi` xye_tinyxml.o: src/tinyxml/xye_tinyxml.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xye_tinyxml.o -MD -MP -MF $(DEPDIR)/xye_tinyxml.Tpo -c -o xye_tinyxml.o `test -f 'src/tinyxml/xye_tinyxml.cpp' || echo '$(srcdir)/'`src/tinyxml/xye_tinyxml.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/xye_tinyxml.Tpo $(DEPDIR)/xye_tinyxml.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/tinyxml/xye_tinyxml.cpp' object='xye_tinyxml.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xye_tinyxml.o `test -f 'src/tinyxml/xye_tinyxml.cpp' || echo '$(srcdir)/'`src/tinyxml/xye_tinyxml.cpp xye_tinyxml.obj: src/tinyxml/xye_tinyxml.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xye_tinyxml.obj -MD -MP -MF $(DEPDIR)/xye_tinyxml.Tpo -c -o xye_tinyxml.obj `if test -f 'src/tinyxml/xye_tinyxml.cpp'; then $(CYGPATH_W) 'src/tinyxml/xye_tinyxml.cpp'; else $(CYGPATH_W) '$(srcdir)/src/tinyxml/xye_tinyxml.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/xye_tinyxml.Tpo $(DEPDIR)/xye_tinyxml.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/tinyxml/xye_tinyxml.cpp' object='xye_tinyxml.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xye_tinyxml.obj `if test -f 'src/tinyxml/xye_tinyxml.cpp'; then $(CYGPATH_W) 'src/tinyxml/xye_tinyxml.cpp'; else $(CYGPATH_W) '$(srcdir)/src/tinyxml/xye_tinyxml.cpp'; fi` xye_tinyxmlerror.o: src/tinyxml/xye_tinyxmlerror.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xye_tinyxmlerror.o -MD -MP -MF $(DEPDIR)/xye_tinyxmlerror.Tpo -c -o xye_tinyxmlerror.o `test -f 'src/tinyxml/xye_tinyxmlerror.cpp' || echo '$(srcdir)/'`src/tinyxml/xye_tinyxmlerror.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/xye_tinyxmlerror.Tpo $(DEPDIR)/xye_tinyxmlerror.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/tinyxml/xye_tinyxmlerror.cpp' object='xye_tinyxmlerror.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xye_tinyxmlerror.o `test -f 'src/tinyxml/xye_tinyxmlerror.cpp' || echo '$(srcdir)/'`src/tinyxml/xye_tinyxmlerror.cpp xye_tinyxmlerror.obj: src/tinyxml/xye_tinyxmlerror.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xye_tinyxmlerror.obj -MD -MP -MF $(DEPDIR)/xye_tinyxmlerror.Tpo -c -o xye_tinyxmlerror.obj `if test -f 'src/tinyxml/xye_tinyxmlerror.cpp'; then $(CYGPATH_W) 'src/tinyxml/xye_tinyxmlerror.cpp'; else $(CYGPATH_W) '$(srcdir)/src/tinyxml/xye_tinyxmlerror.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/xye_tinyxmlerror.Tpo $(DEPDIR)/xye_tinyxmlerror.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/tinyxml/xye_tinyxmlerror.cpp' object='xye_tinyxmlerror.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xye_tinyxmlerror.obj `if test -f 'src/tinyxml/xye_tinyxmlerror.cpp'; then $(CYGPATH_W) 'src/tinyxml/xye_tinyxmlerror.cpp'; else $(CYGPATH_W) '$(srcdir)/src/tinyxml/xye_tinyxmlerror.cpp'; fi` xye_tinyxmlparser.o: src/tinyxml/xye_tinyxmlparser.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xye_tinyxmlparser.o -MD -MP -MF $(DEPDIR)/xye_tinyxmlparser.Tpo -c -o xye_tinyxmlparser.o `test -f 'src/tinyxml/xye_tinyxmlparser.cpp' || echo '$(srcdir)/'`src/tinyxml/xye_tinyxmlparser.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/xye_tinyxmlparser.Tpo $(DEPDIR)/xye_tinyxmlparser.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/tinyxml/xye_tinyxmlparser.cpp' object='xye_tinyxmlparser.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xye_tinyxmlparser.o `test -f 'src/tinyxml/xye_tinyxmlparser.cpp' || echo '$(srcdir)/'`src/tinyxml/xye_tinyxmlparser.cpp xye_tinyxmlparser.obj: src/tinyxml/xye_tinyxmlparser.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xye_tinyxmlparser.obj -MD -MP -MF $(DEPDIR)/xye_tinyxmlparser.Tpo -c -o xye_tinyxmlparser.obj `if test -f 'src/tinyxml/xye_tinyxmlparser.cpp'; then $(CYGPATH_W) 'src/tinyxml/xye_tinyxmlparser.cpp'; else $(CYGPATH_W) '$(srcdir)/src/tinyxml/xye_tinyxmlparser.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/xye_tinyxmlparser.Tpo $(DEPDIR)/xye_tinyxmlparser.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/tinyxml/xye_tinyxmlparser.cpp' object='xye_tinyxmlparser.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xye_tinyxmlparser.obj `if test -f 'src/tinyxml/xye_tinyxmlparser.cpp'; then $(CYGPATH_W) 'src/tinyxml/xye_tinyxmlparser.cpp'; else $(CYGPATH_W) '$(srcdir)/src/tinyxml/xye_tinyxmlparser.cpp'; fi` vxsdl.o: src/vxsdl.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT vxsdl.o -MD -MP -MF $(DEPDIR)/vxsdl.Tpo -c -o vxsdl.o `test -f 'src/vxsdl.cpp' || echo '$(srcdir)/'`src/vxsdl.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/vxsdl.Tpo $(DEPDIR)/vxsdl.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/vxsdl.cpp' object='vxsdl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o vxsdl.o `test -f 'src/vxsdl.cpp' || echo '$(srcdir)/'`src/vxsdl.cpp vxsdl.obj: src/vxsdl.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT vxsdl.obj -MD -MP -MF $(DEPDIR)/vxsdl.Tpo -c -o vxsdl.obj `if test -f 'src/vxsdl.cpp'; then $(CYGPATH_W) 'src/vxsdl.cpp'; else $(CYGPATH_W) '$(srcdir)/src/vxsdl.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/vxsdl.Tpo $(DEPDIR)/vxsdl.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/vxsdl.cpp' object='vxsdl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o vxsdl.obj `if test -f 'src/vxsdl.cpp'; then $(CYGPATH_W) 'src/vxsdl.cpp'; else $(CYGPATH_W) '$(srcdir)/src/vxsdl.cpp'; fi` xye.o: src/xye.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xye.o -MD -MP -MF $(DEPDIR)/xye.Tpo -c -o xye.o `test -f 'src/xye.cpp' || echo '$(srcdir)/'`src/xye.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/xye.Tpo $(DEPDIR)/xye.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/xye.cpp' object='xye.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xye.o `test -f 'src/xye.cpp' || echo '$(srcdir)/'`src/xye.cpp xye.obj: src/xye.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xye.obj -MD -MP -MF $(DEPDIR)/xye.Tpo -c -o xye.obj `if test -f 'src/xye.cpp'; then $(CYGPATH_W) 'src/xye.cpp'; else $(CYGPATH_W) '$(srcdir)/src/xye.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/xye.Tpo $(DEPDIR)/xye.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/xye.cpp' object='xye.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xye.obj `if test -f 'src/xye.cpp'; then $(CYGPATH_W) 'src/xye.cpp'; else $(CYGPATH_W) '$(srcdir)/src/xye.cpp'; fi` xsb_level.o: src/xsb_level.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xsb_level.o -MD -MP -MF $(DEPDIR)/xsb_level.Tpo -c -o xsb_level.o `test -f 'src/xsb_level.cpp' || echo '$(srcdir)/'`src/xsb_level.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/xsb_level.Tpo $(DEPDIR)/xsb_level.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/xsb_level.cpp' object='xsb_level.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xsb_level.o `test -f 'src/xsb_level.cpp' || echo '$(srcdir)/'`src/xsb_level.cpp xsb_level.obj: src/xsb_level.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xsb_level.obj -MD -MP -MF $(DEPDIR)/xsb_level.Tpo -c -o xsb_level.obj `if test -f 'src/xsb_level.cpp'; then $(CYGPATH_W) 'src/xsb_level.cpp'; else $(CYGPATH_W) '$(srcdir)/src/xsb_level.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/xsb_level.Tpo $(DEPDIR)/xsb_level.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/xsb_level.cpp' object='xsb_level.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xsb_level.obj `if test -f 'src/xsb_level.cpp'; then $(CYGPATH_W) 'src/xsb_level.cpp'; else $(CYGPATH_W) '$(srcdir)/src/xsb_level.cpp'; fi` xye_script.o: src/xye_script.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xye_script.o -MD -MP -MF $(DEPDIR)/xye_script.Tpo -c -o xye_script.o `test -f 'src/xye_script.cpp' || echo '$(srcdir)/'`src/xye_script.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/xye_script.Tpo $(DEPDIR)/xye_script.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/xye_script.cpp' object='xye_script.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xye_script.o `test -f 'src/xye_script.cpp' || echo '$(srcdir)/'`src/xye_script.cpp xye_script.obj: src/xye_script.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xye_script.obj -MD -MP -MF $(DEPDIR)/xye_script.Tpo -c -o xye_script.obj `if test -f 'src/xye_script.cpp'; then $(CYGPATH_W) 'src/xye_script.cpp'; else $(CYGPATH_W) '$(srcdir)/src/xye_script.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/xye_script.Tpo $(DEPDIR)/xye_script.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/xye_script.cpp' object='xye_script.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xye_script.obj `if test -f 'src/xye_script.cpp'; then $(CYGPATH_W) 'src/xye_script.cpp'; else $(CYGPATH_W) '$(srcdir)/src/xye_script.cpp'; fi` listbox.o: src/listbox.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT listbox.o -MD -MP -MF $(DEPDIR)/listbox.Tpo -c -o listbox.o `test -f 'src/listbox.cpp' || echo '$(srcdir)/'`src/listbox.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/listbox.Tpo $(DEPDIR)/listbox.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/listbox.cpp' object='listbox.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o listbox.o `test -f 'src/listbox.cpp' || echo '$(srcdir)/'`src/listbox.cpp listbox.obj: src/listbox.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT listbox.obj -MD -MP -MF $(DEPDIR)/listbox.Tpo -c -o listbox.obj `if test -f 'src/listbox.cpp'; then $(CYGPATH_W) 'src/listbox.cpp'; else $(CYGPATH_W) '$(srcdir)/src/listbox.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/listbox.Tpo $(DEPDIR)/listbox.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/listbox.cpp' object='listbox.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o listbox.obj `if test -f 'src/listbox.cpp'; then $(CYGPATH_W) 'src/listbox.cpp'; else $(CYGPATH_W) '$(srcdir)/src/listbox.cpp'; fi` record.o: src/record.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT record.o -MD -MP -MF $(DEPDIR)/record.Tpo -c -o record.o `test -f 'src/record.cpp' || echo '$(srcdir)/'`src/record.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/record.Tpo $(DEPDIR)/record.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/record.cpp' object='record.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o record.o `test -f 'src/record.cpp' || echo '$(srcdir)/'`src/record.cpp record.obj: src/record.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT record.obj -MD -MP -MF $(DEPDIR)/record.Tpo -c -o record.obj `if test -f 'src/record.cpp'; then $(CYGPATH_W) 'src/record.cpp'; else $(CYGPATH_W) '$(srcdir)/src/record.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/record.Tpo $(DEPDIR)/record.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/record.cpp' object='record.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o record.obj `if test -f 'src/record.cpp'; then $(CYGPATH_W) 'src/record.cpp'; else $(CYGPATH_W) '$(srcdir)/src/record.cpp'; fi` xyedit.o: src/xyedit.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xyedit.o -MD -MP -MF $(DEPDIR)/xyedit.Tpo -c -o xyedit.o `test -f 'src/xyedit.cpp' || echo '$(srcdir)/'`src/xyedit.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/xyedit.Tpo $(DEPDIR)/xyedit.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/xyedit.cpp' object='xyedit.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xyedit.o `test -f 'src/xyedit.cpp' || echo '$(srcdir)/'`src/xyedit.cpp xyedit.obj: src/xyedit.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xyedit.obj -MD -MP -MF $(DEPDIR)/xyedit.Tpo -c -o xyedit.obj `if test -f 'src/xyedit.cpp'; then $(CYGPATH_W) 'src/xyedit.cpp'; else $(CYGPATH_W) '$(srcdir)/src/xyedit.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/xyedit.Tpo $(DEPDIR)/xyedit.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/xyedit.cpp' object='xyedit.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xyedit.obj `if test -f 'src/xyedit.cpp'; then $(CYGPATH_W) 'src/xyedit.cpp'; else $(CYGPATH_W) '$(srcdir)/src/xyedit.cpp'; fi` editorsave.o: src/editorsave.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT editorsave.o -MD -MP -MF $(DEPDIR)/editorsave.Tpo -c -o editorsave.o `test -f 'src/editorsave.cpp' || echo '$(srcdir)/'`src/editorsave.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/editorsave.Tpo $(DEPDIR)/editorsave.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/editorsave.cpp' object='editorsave.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o editorsave.o `test -f 'src/editorsave.cpp' || echo '$(srcdir)/'`src/editorsave.cpp editorsave.obj: src/editorsave.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT editorsave.obj -MD -MP -MF $(DEPDIR)/editorsave.Tpo -c -o editorsave.obj `if test -f 'src/editorsave.cpp'; then $(CYGPATH_W) 'src/editorsave.cpp'; else $(CYGPATH_W) '$(srcdir)/src/editorsave.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/editorsave.Tpo $(DEPDIR)/editorsave.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/editorsave.cpp' object='editorsave.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o editorsave.obj `if test -f 'src/editorsave.cpp'; then $(CYGPATH_W) 'src/editorsave.cpp'; else $(CYGPATH_W) '$(srcdir)/src/editorsave.cpp'; fi` editorload.o: src/editorload.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT editorload.o -MD -MP -MF $(DEPDIR)/editorload.Tpo -c -o editorload.o `test -f 'src/editorload.cpp' || echo '$(srcdir)/'`src/editorload.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/editorload.Tpo $(DEPDIR)/editorload.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/editorload.cpp' object='editorload.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o editorload.o `test -f 'src/editorload.cpp' || echo '$(srcdir)/'`src/editorload.cpp editorload.obj: src/editorload.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT editorload.obj -MD -MP -MF $(DEPDIR)/editorload.Tpo -c -o editorload.obj `if test -f 'src/editorload.cpp'; then $(CYGPATH_W) 'src/editorload.cpp'; else $(CYGPATH_W) '$(srcdir)/src/editorload.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/editorload.Tpo $(DEPDIR)/editorload.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/editorload.cpp' object='editorload.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o editorload.obj `if test -f 'src/editorload.cpp'; then $(CYGPATH_W) 'src/editorload.cpp'; else $(CYGPATH_W) '$(srcdir)/src/editorload.cpp'; fi` dialogs.o: src/dialogs.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dialogs.o -MD -MP -MF $(DEPDIR)/dialogs.Tpo -c -o dialogs.o `test -f 'src/dialogs.cpp' || echo '$(srcdir)/'`src/dialogs.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/dialogs.Tpo $(DEPDIR)/dialogs.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/dialogs.cpp' object='dialogs.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dialogs.o `test -f 'src/dialogs.cpp' || echo '$(srcdir)/'`src/dialogs.cpp dialogs.obj: src/dialogs.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dialogs.obj -MD -MP -MF $(DEPDIR)/dialogs.Tpo -c -o dialogs.obj `if test -f 'src/dialogs.cpp'; then $(CYGPATH_W) 'src/dialogs.cpp'; else $(CYGPATH_W) '$(srcdir)/src/dialogs.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/dialogs.Tpo $(DEPDIR)/dialogs.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/dialogs.cpp' object='dialogs.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dialogs.obj `if test -f 'src/dialogs.cpp'; then $(CYGPATH_W) 'src/dialogs.cpp'; else $(CYGPATH_W) '$(srcdir)/src/dialogs.cpp'; fi` window.o: src/window.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT window.o -MD -MP -MF $(DEPDIR)/window.Tpo -c -o window.o `test -f 'src/window.cpp' || echo '$(srcdir)/'`src/window.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/window.Tpo $(DEPDIR)/window.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/window.cpp' object='window.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o window.o `test -f 'src/window.cpp' || echo '$(srcdir)/'`src/window.cpp window.obj: src/window.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT window.obj -MD -MP -MF $(DEPDIR)/window.Tpo -c -o window.obj `if test -f 'src/window.cpp'; then $(CYGPATH_W) 'src/window.cpp'; else $(CYGPATH_W) '$(srcdir)/src/window.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/window.Tpo $(DEPDIR)/window.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/window.cpp' object='window.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o window.obj `if test -f 'src/window.cpp'; then $(CYGPATH_W) 'src/window.cpp'; else $(CYGPATH_W) '$(srcdir)/src/window.cpp'; fi` skins.o: src/skins.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT skins.o -MD -MP -MF $(DEPDIR)/skins.Tpo -c -o skins.o `test -f 'src/skins.cpp' || echo '$(srcdir)/'`src/skins.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/skins.Tpo $(DEPDIR)/skins.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/skins.cpp' object='skins.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o skins.o `test -f 'src/skins.cpp' || echo '$(srcdir)/'`src/skins.cpp skins.obj: src/skins.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT skins.obj -MD -MP -MF $(DEPDIR)/skins.Tpo -c -o skins.obj `if test -f 'src/skins.cpp'; then $(CYGPATH_W) 'src/skins.cpp'; else $(CYGPATH_W) '$(srcdir)/src/skins.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/skins.Tpo $(DEPDIR)/skins.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/skins.cpp' object='skins.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o skins.obj `if test -f 'src/skins.cpp'; then $(CYGPATH_W) 'src/skins.cpp'; else $(CYGPATH_W) '$(srcdir)/src/skins.cpp'; fi` install-desktopDATA: $(desktop_DATA) @$(NORMAL_INSTALL) test -z "$(desktopdir)" || $(MKDIR_P) "$(DESTDIR)$(desktopdir)" @list='$(desktop_DATA)'; test -n "$(desktopdir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(desktopdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(desktopdir)" || exit $$?; \ done uninstall-desktopDATA: @$(NORMAL_UNINSTALL) @list='$(desktop_DATA)'; test -n "$(desktopdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(desktopdir)'; $(am__uninstall_files_from_dir) install-doceDATA: $(doce_DATA) @$(NORMAL_INSTALL) test -z "$(docedir)" || $(MKDIR_P) "$(DESTDIR)$(docedir)" @list='$(doce_DATA)'; test -n "$(docedir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(docedir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(docedir)" || exit $$?; \ done uninstall-doceDATA: @$(NORMAL_UNINSTALL) @list='$(doce_DATA)'; test -n "$(docedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(docedir)'; $(am__uninstall_files_from_dir) install-levelsDATA: $(levels_DATA) @$(NORMAL_INSTALL) test -z "$(levelsdir)" || $(MKDIR_P) "$(DESTDIR)$(levelsdir)" @list='$(levels_DATA)'; test -n "$(levelsdir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(levelsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(levelsdir)" || exit $$?; \ done uninstall-levelsDATA: @$(NORMAL_UNINSTALL) @list='$(levels_DATA)'; test -n "$(levelsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(levelsdir)'; $(am__uninstall_files_from_dir) install-pixmapsDATA: $(pixmaps_DATA) @$(NORMAL_INSTALL) test -z "$(pixmapsdir)" || $(MKDIR_P) "$(DESTDIR)$(pixmapsdir)" @list='$(pixmaps_DATA)'; test -n "$(pixmapsdir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pixmapsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pixmapsdir)" || exit $$?; \ done uninstall-pixmapsDATA: @$(NORMAL_UNINSTALL) @list='$(pixmaps_DATA)'; test -n "$(pixmapsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pixmapsdir)'; $(am__uninstall_files_from_dir) install-resDATA: $(res_DATA) @$(NORMAL_INSTALL) test -z "$(resdir)" || $(MKDIR_P) "$(DESTDIR)$(resdir)" @list='$(res_DATA)'; test -n "$(resdir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(resdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(resdir)" || exit $$?; \ done uninstall-resDATA: @$(NORMAL_UNINSTALL) @list='$(res_DATA)'; test -n "$(resdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(resdir)'; $(am__uninstall_files_from_dir) ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(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; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(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; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(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; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -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 $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__remove_distdir) dist-lzma: distdir tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma $(am__remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__remove_distdir) dist-tarZ: distdir tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__remove_distdir) dist-shar: distdir shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__remove_distdir) dist dist-all: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_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 case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lzma*) \ lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir); chmod a+w $(distdir) mkdir $(distdir)/_build mkdir $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(DATA) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(desktopdir)" "$(DESTDIR)$(docedir)" "$(DESTDIR)$(levelsdir)" "$(DESTDIR)$(pixmapsdir)" "$(DESTDIR)$(resdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done 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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) 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-binPROGRAMS clean-generic mostlyclean-am distclean: distclean-am -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-desktopDATA install-doceDATA \ install-levelsDATA install-pixmapsDATA install-resDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-desktopDATA \ uninstall-doceDATA uninstall-levelsDATA uninstall-pixmapsDATA \ uninstall-resDATA .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am am--refresh check check-am clean \ clean-binPROGRAMS clean-generic ctags dist dist-all dist-bzip2 \ dist-gzip dist-lzip dist-lzma dist-shar dist-tarZ dist-xz \ dist-zip distcheck distclean distclean-compile \ distclean-generic distclean-tags distcleancheck distdir \ distuninstallcheck dvi dvi-am html html-am info info-am \ install install-am install-binPROGRAMS install-data \ install-data-am install-desktopDATA install-doceDATA \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-levelsDATA install-man install-pdf install-pdf-am \ install-pixmapsDATA install-ps install-ps-am install-resDATA \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-binPROGRAMS \ uninstall-desktopDATA uninstall-doceDATA uninstall-levelsDATA \ uninstall-pixmapsDATA uninstall-resDATA #xye_LDADD = @GL_LIBS@ # 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: xye-0.12.2+dfsg/NEWS000066400000000000000000000515131225403634500140300ustar00rootroot00000000000000Version 0.12.2 ============== - Included desktop icon and launcher in the tarball. - Fixed compilation issues in gcc 4.7+. - Level update: "So close yet so far" no longer allows an excessively easy. - Teleports in the editor will now show the "Active" sprite when lined up. - The skin dialog remembers the currently selected skin. Version 0.12.1 ============== - Added option to change white/colorless block color in a skin file. - The default Xye color is closer to the pure green of old. - The skin selector now allows you to disable the ability of levels to customize colors. You might like some skins better by keeping the same color scheme independently of the level data. - The skin selector now shows the correct floor color if the skin modifies it. - Fixed a crash that was related to microban.xsb in some systems. - Fixed a bug related to magnets not behaving deterministically. - In *nix, Xye will no longer use files at ~/.xye, but will instead use $XDG_CONFIG_HOME and $XDG_DATA_HOME to store configuration and custom levels/skins. - Various text updates to the official levels. - 5 new levels have been added to the official levels file. However, these levels were already available in the web before. - Including a new bonus level file. - Some skin tweaks. Version 0.12.0 ============== Major gameplay changes: - A new block has been added, purple. - Purple arrows and dot blocks are as fast as red arrows. - Purple pushers are twice as fast as yellow pushers and bounce differently. - Purple timers are like a mix between the green and red ones, explode a time after Xye activates them. - Purple surprise blocks teleport Xye to their location if pushed. - Purple gems do not exist, instead purple gem blocks are activated once you get all the stars in the level. Other features: - The listbox control has been made closer to the familiar idea in usual GUI environments. For example, it supports the mouse wheel and can have a scroll bar if necessary. - Xye's default color has been changed to a less saturated green tone. Official levels: - Added two new tutorials. - Updated the order of some of the levels. - New levels: Complexity, puzzle, Chekhov's brick, Robot bot trouble, . Updates to other level files: - Phipps.xye: Changed the color scheme for the levels from problem.kye. New editor features: - Slightly more compatibility with level features. - Bug fixes: - Fixed the bug that made .Kye levels in the editor load with black walls, background and earth. - Fixed bugs related to not being able to play the level's solution / a replay file in the first attempt when there is a saved game for that level. - Other minor features and bug fixes. Version 0.11.2 ============== Updates to the official levels: - Firestrikers: It is no longer impossible to get the gems after the star. - Added new levels, for example: "Turn around", "Savage stuff", "So typical", "4x4-4" and more. - Added a new tutorial. - In total we now have 26 tutorials and 60 official levels. - Removed kyeclone.xye. Instead Phipps.xye was added, which includes 44 many great Kye levels. New editor features: - Can place ground hints. - Undo button is no longer disabled when recording a solution. - It is now possible to change wall, earth and floor colors in a level. Bug fixes: - Fix compatibility with OS/X line breaks in xsb level files. - Fix the bug that made the editor load teleporters as doors in .kye files. - Fixed a bug that was causing random editor crashes. - Fixed a bug that could make the game hang if a level was modified and saved data was incompatible. - Fixed a crash that could happen when trying to respawn Xye in a full level. If that situation happens, you will lose the game, however. - There were tweaks and fixes to the skins. A 30x30 of the clean skin was also added. Version 0.11.1 ============== - Fixed a bug that caused the editor to sometimes save wrong round wall data when saving files with multiple levels. - The editor is once again able to rotate teleport objects. - Fixed a bug that made the editor replace description and author of a level file when adding/removing levels from it. - Fixed a crash when typing large words in input boxes. - The editor can now load kye level files. - The editor can now place hidden path squares. - The editor can load and save ground hints from level files. Although there is no interface in place to create or edit them. - The editor can now change the level number of a level in a level file. - We decided to stop including kye.xye with the game's package. As those levels are from shareware Kye and it is probably best not to redistribute them. Instead, a new level file called kyeclone.xye is available, with 14 simple levels that try to explain some of the basic concepts from the original Kye. - New official level: Forces that we are not supposed to control. - In total, this version brings 15 new levels. - Improved the way the game creates its window icon. Version 0.11.0 ============== - A new, detailed game skin. - Also a Kye Jr. appearance skin. - The editor now supports level files with multiple levels. - The editor can also import the levels from multiple level files. - It is now easier to change object rotation in the editor. - Minor bug fixes. - New level: Take them out. Version 0.10.0 ============== - Whenever you leave a level file, the positions of all objects and the UNDO history will be saved automatically. The next time you open the level, it will be loaded automatically. - The undo last move command is now enabled by default. - A prompt Yes/No dialog will ask for confirmation before leaving the game. - Moving Xye once will make the idle arrows go away permanently until Xye moves into a portal or dies. - Fixed colors in one of the extra level files: Mic4. Version 0.9.3 ============= - The in-game buttons now have tooltips. - Many graphical updates, specially to the clean40 skin. - Fast forward now also affects the game's hint marquee's speed. - The text input dialog used by the editor now has a clear button, in case you need to quickly erase long messages. - Change to sprites file: number blocks now have a sprite for each block, insteado of a hard coded alpha channel change. - Change to skin file features: It is now possible to alter the floor , earth, force arrow and hint colors. - Added new official levels, the current count is 25 tutorials, 50 official levels. - Added a new level to sphinx.xye - Some levels have also been updated to remove exploit solutions, to make them more viable and also to look better. - Fixed a game bug that made red turner blocks explode when hit by a scroll (one way) block. This was not intended behavior. - Fixed a bug that made the editor crash or have a wall graphics glitch in the first load in some situations. - Fixed an issue with wall sprites not updating correctly after a blue surprise block becomes a wall nearby, this was not noticeable on skins with border-less walls. - Fixed an issue that stopped replay files from loading correctly. - Fixed a bug with how pits were recolored if they were above non-white floor. - Fixed a bug about large blocks or snakes above a pit that suddenly become a single cell object, they were supposed to fall into the pit, they do now. - The way the side at which round objects slide when pushed against another round object has been updated. It is now guaranteed to pick the side to which the block slides at 50% chance. It was previously not the case and the distribution did not work correctly. This change may make replays/solutions from older versions stop working correctly. - Fixed a bug that made the more advanced monsters able to get confused some times when using teleports. This may also make some old custom solutions and levels stop working correctly. - Fixed a bug that made the editor unable load levels that use the deprecated wall type. Version 0.9.2 ============= - There is now a working GUI to easily change the game's theme. - The bottom panel will now show the number of acquired stars while playing a level. - Hint button will now only require a single click to begin showing the hint and another click to stop it. - The editor can now place wild card blocks above marked areas. - Various graphical updates, including polishing of the skins and the addition of two new skins: classic32 (the classic skin now resized to have a 32 pizels cell size) and celan40 (the default skin resized to have a 40 pixels cell size). The new skins should be useful in larger resolutions. - Small bug fix regarding snakes sometimes causing graphical glitches when their last segment is killed. - New levels: "Choose your own adventure" in the main level list and the xmas level pack. Version 0.9.1 ============= - Game, editor and editor test all execute in the same process. - The editor is now able to record and save solutions for your levels. - Xye will remember the last level number you played in up to 100 level files. - Xye now supports .slc sokoban level file format (XML). - Added some few small levels to balance the load of larger levels. Level count raises to 25 tutorials, 41 official levels. - Sprite rendering system now allows a luminosity mask. - Wall color for each wall type and also the door color can be set in the skin file. - Wall color supports real recolor when the skin supports so, allowing many more wall colors in level files. Take a look at the levels in levels.xye and the skin in default.xml for more information. - Some minor graphic updates for the default skin. - In the classic skin, monsters such as the wards and the spinners were modified to look closer to the ones in the default skin. - The movement of the spinner beasts looks better. - In *n*x* environments, documentation dir has been changed to $prefix/share/doc/xye . Version 0.9.0 ============== - The interface is a little easier to use, adding GUI buttons for actions that were previously only accessible through keyboard. - Many new official and bonus levels. (32 new official levels). - Tutorials were replaced by simpler and quicker levels, The old tutorials are still available in the oldtutorials level file. - The default theme has been heavily modified torwards a different, cleaner style, the older theme is still available. - New objects: stars and large blocks. - The editor now supports portal and factory objects. - Various bug fixes. - "intertia" factories now correctly create the inertia in moving mode. - Fixed a small glitch with blue walls turning darker after an undo operation. - Firepads now turn the red blocks into fire red blocks, which are not too different to fireballs in gameplay, besides that they still count as red blocks. A bug has also been fixed that made these 'fireballs' get ahead by an extra frame, this makes firepads slightly slower than before. - The level browser sorts files alphabetically. - Clicking clear twice in the editor allows you to clear the layout completely, including the border walls. - Source compilable in newer g++ versions (which now require more explicity #includes). - Xye will remember the last file you played and the level number in it. Version 0.8.0 ================ - A level editor is included. - Fixed behaviour of green timer blocks. - Added metal blocks. - Colliding fireballs now destroy each other correctly. - A fire ball destroying a bomb-timer block will cause an explosion. - Number-block (timers) and wildcards now can have a round variation. - Sticky blocks behave correctly with bots. - A new beast: the tiger (very hard)- - Game skins were updated. - The snake creature is able to go above pits if it is long enough. - Using TTF fonts instead of bitmap fonts to support UTF8 encoding in level files. Version 0.7.6.2 =============== - This version simply updates the source package to add a configure script, the game itself has no changes so it still counts as 0.7.6 Version 0.7.6 ============= - Added the ability to undo movements. - Can now play level files in standard sokoban format. - Fixed compile errors in font.cpp - New level: Dilema - levels.xye renamed to tutorials.xye and tour.xye renamed to levels.xye . levels.xye is now to be considered an official level pack. - Improved the sprites for marked areas and gems. - No longer gets to consume a lot of memory if accidentally left open in a level for a long of time. - Various minor fixes. Version 0.7.5 ============= - Added the ability to save/play replays. - Levels may contain and play their solution. - Reduced processor usage thanks to some caching added to recolor methods. - Changed the behaviour of old beasts so it is closer to their behaviour in original kye. - Fixed a timing bug related to the movement of beasts. - Remove every randomization factor that could affect gameplay. The rules that used to rely on random numbers are still difficult to predict, but if you play the same level twice and do exactly the same moves the outcome is supposed to be the same, namely the AI of monsters and the behaviour of round objects when moving towards other round objects were changed - The built-in level browser now supports sub folders. Also supports the Page Up and Page Down keys for faster scrolling when there are a lot of level files. It can also check Kye levels for errors. - The white font is now easier to read on red/blue background - Improved the layout of the info panel. - Improved some sprites, for example the yellow marked areas are easier to see. - Added one level to tour.xye : "The key of the puzzle" - For non-win32 builds, it now uses /home/username/.xye for custom levels, data and xyeconf.xml. And the place where we locate the original data is determined on compile time and no longer has to be the same folder where the executable is located. So make install will work correctly now. And you will be able to use xye as command like other software. Version 0.7 Beta ================== - Fixed the bug that caused xye to freeze after inactivity time. - Built-in level browser now is able to report the line and column which causes a level file to be invalid. - Pressing c during the game enables a coordinate mode that shows the game coordinate of the mouse position. It is useful for level development. - During the game, Backspace will take you back to the level browser. - Fixed a bug that made the level file browser unable to show the complete description of a file sometimes. - An skin may now specify different colors for blocks. - It is now possible to set default color for earth in a level. - Fixed a bug that prevented multiple defaults to be declared. - The official levels are now simply the 10 tutorials, the rest of the levels were moved to tour.xye . - Updated some of the levels in 5levels.xye - Improved the Makefile , it should be able to find SDL in more situations and does not show a bunch of warnings. It won't require you to specify linux either. - It should be easier to compile in posix platforms now (added scripts that allow ./configure then make) - When a level ends it will tell you what keys to use in order to change of level - Fixed problems with font.cpp causing compile errors problems in some OS . Version 0.6.2 Beta ================== - Fixed a bug that caused a crash in linux when you beat a level that didn't have a bye message - Fixed a bug that caused a crash when defeating a level that used kyeformat tag. - Fixed bugs that made the game unable to play levels when stufflocation was specified. Version 0.6 Beta ================ It is the last release that will add any object, the game's rules are finished and it will be safe from now to make levels without worrying about rule shifting, note that bugs with the objects' behaviour may exist and they will still be fixed in new versions. - Xye is now able to play .KYE level files. And the kye level format has been extended to allow some of the new xye objects. - Mouse support. - xyeconf.xml can have an stufflocation attribute that makes it redirect to another folder with another xyeconf and skin, levels folders. - P or - can now take you to the previous level. - Aclockers/clockers now allow the round attribute. - Fixed a graphical glitch that happened when rattlers were hit in the head. - rockies (round arrow blocks) can not be pushed towards other round objects and have the round slide if the direction is not the one they point towards. - as a derivated change the same happens with moving dot-blocks - It is now more probable that blobs, gnashers and viruses will fall in blackies. So they behave closer to their Kye versions. - Bots / Patience no longer move for free at the beginning of the level. - Fixed undefined code related bug with fillers. - New object: the pit. - Old version 0.5 had a couple of erroneus code that could trigger when no skin data is specified by xyeconf/skinfiles. - New beast : static - New beast : ranger - Fireballs are now as fast as red arrows. - The Xye level format has also been updated: * You can embed level data in .KYE format using the tag. You can then use the xye format to add objects/options that are not supported by the kye format. * tag can appear as a child of and allow a hint that does not require xye to step on it, but instead requires the player to press H. - Updates to xye.exe's built-in level file browser: * Can support more quantities of files (allows scrolling down now). * Escape exits the game during level file browsing mode. * Fixed a bug that could make it think folders that end with .xye were level files. * Can browse for .kye and .KYE files. * You can press alphanumeric keys to navigate through the levels easier. * Improved its looks. - The codeblocks project file: * Added multiple target options, there are now windows, linux and ubuntu_debug (ubuntu_debug is just linux' but executes the game in a console so we can see the error messages) * Uses Makefile. * Fixed plenty of things in the source that prevented to compile on other platforms different to win32 * Makefile included in source should now be possible to compile xye in most of the modern platforms that have SDL and SDL_image installed. Version 0.5 Beta ================ - Fixed a bug that prevented a level from being loaded correctly if there were comments in some parts of the xml - Fixed a bug that allowed Gems to be moved by magnetic objects. - Changed the movement code so it no longer gives the sensation that Xye has moved twice instead of one sometimes. - Remade all the level files, now they are XML standard compliant (can be opened by XML editors/viewers) - Fixed a bug that allowed red pushers to kill Xye - New object: the factory - New object: the window - New object: the scroll block - New ground object: Force arrow - New beast : Red Blob. - You can now select Xye's color, Skin file and the starting level of the file (specially if you use XyeGUI). - New skin: classic (16�6 , less shading) - The level format also changed: * now you can just use a single tag instead of using separated and * bc and dir attributes only consider the first character of the values and are not case sensitive ( dir="U" or dir="u" now work the way dir="UP" worked before, also dir="UP" and dir="uuu" would work ). * wall element now also allows a round attribute which lists the round corners instead of using an attribute per corner. instead of round1='1' round3='1' you can now use round="13" ) - Enabled land mines to be used in levels. TODO: Editor Version 0.04 alpha ================= - Now uses SDL should be cross platform (not tested in other OS yet) - Added new monster types: patience, rattler, spinner, aspinner - New objects: Sniper, Filler, Rattler food and low density block. - 2 new tutorials. - Levels from kye included - Finally some GUI: A level selector , currently it is only functional and lacks any eye candy / mouse support Version 0.03 alpha ================== - Playable version but lacks any interface. - Level format done. - Added beasts - Made timing fixes to mimic Kye rules. - Auto arrow blocks, now called clocks, work like the Kye versions but they are different, much more predictable. - A convertor from .kye files to .xye files is available at kye.sourceforge.net too. - Red surprise blocks now act as SKye bombs with the difference they can actually kill xye. - Finally Xye has lives so game over is something that may happen - New object: portal. - 1 new beast: the dard. - New enemy: Robo-xye Todo: - Make more beasts - replace hge with an SDL engine - add interface - Make the editor 2nd early alpha version ======================= Additions: - surprise! blocks - arrow blocks - land mines - low density blocks - magnetic blocks - toggle (+/-) blocks - timer blocks - pushers - auto arrow blocks Todo: - make Xye killing a method of xye class - fix or at least do something about the way to use the game class - script system (let people / me make actual playable levels) - openable doors, locks, keys, and colored areas. - monsters - replace hge with an SDL engine - add interface xye-0.12.2+dfsg/README000066400000000000000000000000231225403634500141770ustar00rootroot00000000000000See Read me.html. xye-0.12.2+dfsg/ReadMe.html000066400000000000000000000112001225403634500153410ustar00rootroot00000000000000 Xye readme

License information

Xye is free, open source software. The license used is a copy of the zlib/libpng license. See COPYING.txt for more information.

Game information

The website at http://xye.sourceforge.net, provides a very detailed description and screenshots.

Win32 users

The windows version of xye is portable software, it means that you do not need to install it and can run it directly from the directory you get after extracting the zip file. Double click on Xye.exe (With a green ball icon) to play.

Linux/*nix users

Compiling the game

You might be able to avoid this step if you can find a package of the game for your operating system distribution. There might be some in your repository (look for Xye). Or in the web.

In order to compile Xye you need:

  • g++ 4 or greater.
  • GNU Make.
  • Autoconf / Automake (if you wish to use autogen.sh
  • The last items may all be installable by using a package called build-essentials.
  • The SDL library (Most *nix systems have an easy to install package for this. Note that since you are compiling a game, you need the -dev (development) packages as well.
  • In the same note, SDL_Image and SDL_ttf.

Extract the tar.gz file. Then open a terminal and go to the extracted folder. (ie: type "cd ~/Downloads/xye-0.XX.Y" (Quotes for clarity).

In the command line type: ./configure && make

IF the last step was succesful, to install type: make install

In many systems there might exist a more convenient alternative to make install. For example, in debian and ubuntu-based systems, try typing : sudo checkinstall

You may also run the game without installing. Just type: "./xye ./" from this directory.

If ./configure is not succesful, try typing ./autoconf.sh before ./configure.

After installing, the xye command should run the game.

Selecting a theme

The first screen you shall see after running the game for the first time is the theme selector. Pick the theme you like the most. If you make the wrong choice, do not worry. You can always return to the theme selector by using the [F3] Theme button.

The level browser

Here you can select a level file. Newcomers shall try the tutorials.xye file first.

The gameplay

Xye is a green ball that can move one cell up, down, left or right in every move. You can use the keyboard cursors to move or you can also use the mouse cursor. I recommend a keyboard because some levels require some speed.

The levels

Tutorial levels are easy to solve by simple experimentation. You can read hints (The light bulb button) or play solution videos (The film with an S button) if you wish.

The levels.xye file holds the official levels. At this moment of beta, the order of the levels may not be optimal. Although level 1 is definitely easier than level 15, level 10 is not necessarily harder than level 4. Either way, Xye is designed in a way that lets you skip any level if you want to. Whenever you leave a level, the progress is saved and will be loaded automatically when you return to it.

There are plenty of other bonus levels, many made by people in the community using the level editor. Also, the web site might have some other levels that are not included in the game.

More levels and the editor

Visit this address: http://xye.sourceforge.net/levels.php if you wish to have information about the level editor and more levels that you can download and play.

Charity

Kye was a charityware, although Xye targets to be completelly free software, it is fair to add these lines to the readme: if you really enjoy this game and want to give me a good reason to continue improving it. Instead of asking for donations I am gonna ask you to donate to any Children Charity. If you do it BECAUSE OF XYE, and feel like making the authors feel better, email me at vexorian@gmail.com to tell me you did it :) (do not include any private information/proof as that is risky, just tell me you donated to charity because you enjoyed Xye). I will admit that after 6 years of development this has not happened yet.

Who is responsible for this mess?

The AUTHORS file contains information about all those who contributed to this open project. Admitedly, a single developer does most of the work. If you have suggestions or bug reports please send them to vexorian@gmail.com.

xye-0.12.2+dfsg/acinclude.m4000066400000000000000000000136251225403634500155240ustar00rootroot00000000000000# 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_PATH_PROG(SDL_CONFIG, sdl-config, no) 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" ], [ 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 ]) xye-0.12.2+dfsg/aclocal.m4000066400000000000000000001042261225403634500151710ustar00rootroot00000000000000# generated automatically by aclocal 1.11.3 -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2007, 2008, 2009, 2010, 2011 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. m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.68],, [m4_warning([this file was generated for autoconf 2.68. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically `autoreconf'.])]) # Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008, 2011 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. # serial 1 # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.11' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.11.3], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.11.3])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001, 2003, 2005, 2011 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. # serial 1 # 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], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008 # 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. # serial 9 # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ(2.52)dnl ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009, # 2010, 2011 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. # serial 12 # 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", "GCJ", 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], UPC, [depcc="$UPC" am_compiler_list=], [$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'. rm -rf conftest.dir 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 # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub 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 am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # 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. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # 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. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; 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 ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE(dependency-tracking, [ --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 # 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. #serial 5 # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. 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 " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/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=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # 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_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2008, 2009 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. # serial 16 # 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. # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.62])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) AM_MISSING_PROG(AUTOCONF, autoconf) AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) AM_MISSING_PROG(AUTOHEADER, autoheader) AM_MISSING_PROG(MAKEINFO, makeinfo) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AM_PROG_MKDIR_P])dnl # 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_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [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 AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES(OBJC)], [define([AC_PROG_OBJC], defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl ]) _AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl dnl The `parallel-tests' driver may need to know about EXEEXT, so add the dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl ]) dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001, 2003, 2005, 2008, 2011 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. # serial 1 # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST(install_sh)]) # Copyright (C) 2003, 2005 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. # serial 2 # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005, 2009 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. # serial 4 # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit 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 # Ignore all kinds of additional output from `make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 # 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. # serial 6 # 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 AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= AC_MSG_WARN([`missing' script is too old or missing]) fi ]) # Copyright (C) 2003, 2004, 2005, 2006, 2011 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. # serial 1 # AM_PROG_MKDIR_P # --------------- # Check for `mkdir -p'. AC_DEFUN([AM_PROG_MKDIR_P], [AC_PREREQ([2.60])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, dnl while keeping a definition of mkdir_p for backward compatibility. dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of dnl Makefile.ins that do not define MKDIR_P, so we do our own dnl adjustment using top_builddir (which is defined more often than dnl MKDIR_P). AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl case $mkdir_p in [[\\/$]]* | ?:[[\\/]]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005, 2008, 2010 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. # serial 5 # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), 1)]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008 # 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. # serial 5 # 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 # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; esac # 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)]) # Copyright (C) 2001, 2003, 2005, 2011 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. # serial 1 # AM_PROG_INSTALL_STRIP # --------------------- # 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 # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be `maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006, 2008, 2010 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. # serial 3 # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004, 2005, 2012 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. # serial 2 # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of `v7', `ustar', or `pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar],, [pax],, [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' _am_tools=${am_cv_prog_tar_$1-$_am_tools} # Do not fold the above two line into one, because Tru64 sh and # Solaris sh will not grok spaces in the rhs of `-'. for _am_tool in $_am_tools do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR m4_include([acinclude.m4]) xye-0.12.2+dfsg/autogen.sh000077500000000000000000000010571225403634500153300ustar00rootroot00000000000000#!/bin/sh # $Id$ # Remove any previously created cache files test -w config.cache && rm config.cache test -w config.cross.cache && rm config.cross.cache # Regenerate configuration files echo " ========aclocal=============" aclocal echo " ======== / aclocal =============" echo " ========Automake=============" automake --add-missing echo " ======== / Automake=============" echo " ========autoconf=============" autoconf echo " ======== / autoconf=============" # Run configure for this platform #./configure $* echo "Now you are ready to run ./configure" xye-0.12.2+dfsg/build-linux.sh000077500000000000000000000001041225403634500161120ustar00rootroot00000000000000#!/bin/sh # $Id$ if !(./configure) then exit 1; fi make clean make xye-0.12.2+dfsg/build-win32.sh000077500000000000000000000003771225403634500157310ustar00rootroot00000000000000#!/bin/sh # $Id$ PROGNAME=xye if !(./cross-configure.sh) then exit 1; fi ./cross-make.sh clean ./cross-make.sh if test $? -ne 0; then exit 1; fi test -w src/$PROGNAME && chmod -x src/$PROGNAME test -w src/$PROGNAME && mv src/$PROGNAME src/$PROGNAME.exe xye-0.12.2+dfsg/clean.sh000077500000000000000000000006131225403634500147450ustar00rootroot00000000000000#!/bin/sh # $Id$ PROGNAME=xye FILES=' aclocal.m4 config.cache config.cross.cache config.log config.status configure Makefile Makefile.in src/*.o src/Makefile src/Makefile.in src/$PROGNAME src/$PROGNAME.exe src/std*.txt' test -w configure && (if (./configure) then make distclean; fi) for file in $FILES; do test -w $file && rm -f $file; done test -w src/.deps && rm -rf src/.deps xye-0.12.2+dfsg/config.guess000066400000000000000000001257621225403634500156560ustar00rootroot00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, # Inc. timestamp='2006-03-13' # 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., 51 Franklin Street - Fifth Floor, Boston, MA # 02110-1301, 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 Per Bothner . # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # 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, 2002, 2003, 2004, 2005 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 ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # 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 trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; 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 ; set_cc_for_build= ;' # 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 # 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. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) 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 # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # 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 ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerppc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # 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. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` exit ;; 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 ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm:riscos:*:*|arm:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; 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 ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:SunOS:5.*:*) echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; 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 ;; 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 ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /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 ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # 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 ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build 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 $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; 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 ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????: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 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; 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 ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi 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 ;; *:AIX:*:[45]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | 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 ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 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]) 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" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build 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 (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep __LP64__ >/dev/null then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build 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 $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; 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 ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; 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 ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) case ${UNAME_MACHINE} in pc98) echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; i*:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; x86:Interix*:[345]*) echo i586-pc-interix${UNAME_RELEASE} exit ;; EM64T:Interix*:[345]*) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; 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 i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; arm*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; cris:Linux:*:*) echo cris-axis-linux-gnu exit ;; crisv32:Linux:*:*) echo crisv32-axis-linux-gnu exit ;; frv:Linux:*:*) echo frv-unknown-linux-gnu exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; mips:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips #undef mipsel #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mipsel #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips #else CPU= #endif #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^CPU/{ s: ::g p }'`" test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips64 #undef mips64el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mips64el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips64 #else CPU= #endif #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^CPU/{ s: ::g p }'`" test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; or32:Linux:*:*) echo or32-unknown-linux-gnu exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu exit ;; 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}-unknown-linux-gnu${LIBC} exit ;; 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-unknown-linux-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-gnu exit ;; x86_64:Linux:*:*) echo x86_64-unknown-linux-gnu exit ;; 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. # Set LC_ALL=C to ensure ld outputs messages in English. ld_supported_targets=`cd /; LC_ALL=C 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}-pc-linux-gnu" ;; a.out-i386-linux) echo "${UNAME_MACHINE}-pc-linux-gnuaout" exit ;; coff-i386) echo "${UNAME_MACHINE}-pc-linux-gnucoff" exit ;; "") # Either a pre-BFD a.out linker (linux-gnuoldld) or # one that does not give us useful --help. echo "${UNAME_MACHINE}-pc-linux-gnuoldld" exit ;; esac # Determine whether the default compiler is a.out or elf eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include #ifdef __ELF__ # ifdef __GLIBC__ # if __GLIBC__ >= 2 LIBC=gnu # else LIBC=gnulibc1 # endif # else LIBC=gnulibc1 # endif #else #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__sun) LIBC=gnu #else LIBC=gnuaout #endif #endif #ifdef __dietlibc__ LIBC=dietlibc #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^LIBC/{ s: ::g p }'`" test x"${LIBC}" != x && { echo "${UNAME_MACHINE}-pc-linux-${LIBC}" exit } test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; } ;; 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 ;; 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 ;; 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 ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; 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 ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. 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 ;; 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|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; 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 ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; 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 ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*: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; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *: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 ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; 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 ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown case $UNAME_PROCESSOR in unknown) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NSE-?:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *: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 ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 eval $set_cc_for_build 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\n"); 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 $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # 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 ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; 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: xye-0.12.2+dfsg/config.sub000066400000000000000000000772551225403634500153240ustar00rootroot00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, # Inc. timestamp='2006-03-07' # 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., 51 Franklin Street - Fifth Floor, Boston, MA # 02110-1301, 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 . Submit a context # diff and a properly formatted ChangeLog entry. # # 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, 2002, 2003, 2004, 2005 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 ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # 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 ;; * ) 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* | linux-dietlibc | linux-newlib* | linux-uclibc* | \ uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) 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 | -knuth | -cray) 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 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -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/'` ;; -sco5v6*) # 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] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | m32r | m32rle | m68000 | m68k | m88k | maxq | mb | microblaze | mcore \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64vr | mips64vrel \ | mips64orion | mips64orionel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | mt \ | msp430 \ | nios | nios2 \ | ns16k | ns32k \ | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ | pyramid \ | sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | strongarm \ | tahoe | thumb | tic4x | tic80 | tron \ | v850 | v850e \ | we32k \ | x86 | xscale | xscalee[bl] | xstormy16 | xtensa \ | z8k) basic_machine=$basic_machine-unknown ;; m32c) 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) ;; ms1) basic_machine=mt-unknown ;; # 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]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64vr-* | mips64vrel-* \ | mips64orion-* | mips64orionel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nios-* | nios2-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | pyramid-* \ | romp-* | rs6000-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ | tahoe-* | thumb-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tron-* \ | v850-* | v850e-* | vax-* \ | we32k-* \ | x86-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \ | xstormy16-* | xtensa-* \ | ymp-* \ | z8k-*) ;; m32c-*) ;; # 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 ;; abacus) basic_machine=abacus-unknown ;; 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 ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; 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 ;; c90) basic_machine=c90-cray os=-unicos ;; 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 | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16c) basic_machine=cr16c-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; 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 ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; 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 ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; 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 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc) 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 ;; rdos) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-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=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tic54x | c54x*) basic_machine=tic54x-unknown os=-coff ;; tic55x | c55x*) basic_machine=tic55x-unknown os=-coff ;; tic6x | c6x*) basic_machine=tic6x-unknown os=-coff ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; 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 ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; ymp) basic_machine=ymp-cray os=-unicos ;; 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 ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; 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 ;; sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) 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 ;; *-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* | -knetbsd* | -mirbsd* | -netbsd* \ | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -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-gnu* | -linux-newlib* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -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 ;; -aros*) os=-aros ;; -kaos*) os=-kaos ;; -zvmoe) os=-zvmoe ;; -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 ;; c4x-* | tic4x-*) os=-coff ;; # This must come before the *-dec entry. 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 ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-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 ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) 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 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: xye-0.12.2+dfsg/configure000077500000000000000000005101401225403634500152340ustar00rootroot00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.68 for xye 0.12.2. # # Report bugs to . # # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software # Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV export CONFIG_SHELL case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"} fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and vexorian@gmail.com $0: about your system, including any error possibly output $0: before this message. Then install a modern shell, or $0: manually run the script under such a shell if you do $0: have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # 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 as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='xye' PACKAGE_TARNAME='xye' PACKAGE_VERSION='0.12.2' PACKAGE_STRING='xye 0.12.2' PACKAGE_BUGREPORT='vexorian@gmail.com' PACKAGE_URL='' ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS doc_dir data_path_flag SDL_LIBS SDL_CFLAGS SDL_CONFIG am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE ac_ct_CXX CXXFLAGS CXX am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_os target_vendor target_cpu target host_os host_vendor host_cpu host build_os build_vendor build_cpu build target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_dependency_tracking with_sdl_prefix with_sdl_exec_prefix enable_sdltest with_docdir ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CXX CXXFLAGS CCC' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # 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. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= 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 case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -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) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$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 ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$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 ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) 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 | -n) 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 ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$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_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=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 ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_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'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe $as_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 ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # 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 the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` 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 test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # 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 <<_ACEOF \`configure' configures xye 0.12.2 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/xye] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] --target=TARGET configure for building compilers for TARGET [HOST] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of xye 0.12.2:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors --disable-sdltest Do not try to compile and run a test SDL program Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-sdl-prefix=PFX Prefix where SDL is installed (optional) --with-sdl-exec-prefix=PFX Exec prefix where SDL is installed (optional) --with-docdir=DPATH Directory where documentation is saved. Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CXX C++ compiler command CXXFLAGS C++ compiler flags Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF xye configure 0.12.2 generated by GNU Autoconf 2.68 Copyright (C) 2010 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by xye $as_me 0.12.2, which was generated by GNU Autoconf 2.68. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/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` /usr/bin/hostinfo = `(/usr/bin/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` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # 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. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } 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. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_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 $ac_precious_vars; 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,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_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 # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## 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 # Detect the canonical host and target build environment 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 as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5 $as_echo_n "checking target system type... " >&6; } if ${ac_cv_target+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$target_alias" = x; then ac_cv_target=$ac_cv_host else ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5 $as_echo "$ac_cv_target" >&6; } case $ac_cv_target in *-*-*) ;; *) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;; esac target=$ac_cv_target ac_save_IFS=$IFS; IFS='-' set x $ac_cv_target shift target_cpu=$1 target_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: target_os=$* IFS=$ac_save_IFS case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac # 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}- # Setup for automake am__api_version='1.11' # 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" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /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 for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir 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. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$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' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Just in case sleep 1 echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; esac # 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". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "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 $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } mkdir_p="$MKDIR_P" case $mkdir_p in [\\/$]* | ?:[\\/]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac for ac_prog in gawk mawk 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='xye' VERSION='0.12.2' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' # Check for tools 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}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&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 as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS 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 ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&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 as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # 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. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; 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 conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end 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; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; 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 for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : 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 DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from `make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-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='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&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'. rm -rf conftest.dir 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 # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub 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 am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # 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. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # 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. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; 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 ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi ac_ext=cpp 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 -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&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 as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$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 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= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CXX_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&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'. rm -rf conftest.dir 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 # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub 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 am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # 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. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # 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. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; 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 ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi # Check for compiler environment { $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 $as_echo_n "checking for an ANSI C-conforming const... " >&6; } if ${ac_cv_c_const+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { /* FIXME: Include the comments suggested by Paul. */ #ifndef __cplusplus /* Ultrix mips cc rejects this. */ typedef int charset[2]; const charset cs; /* SunOS 4.1.1 cc rejects this. */ char const *const *pcpcc; char **ppc; /* 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"; pcpcc = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++pcpcc; ppc = (char**) pcpcc; pcpcc = (char const *const *) ppc; { /* SCO 3.2v4 cc rejects this. */ char *t; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; if (s) return 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; if (!foo) return 0; } return !cs[0] && !zero.x; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_const=yes else ac_cv_c_const=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 $as_echo "$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then $as_echo "#define const /**/" >>confdefs.h fi # Check for SDL SDL_VERSION=1.2.9 # Check whether --with-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 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 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 # Extract the first word of "sdl-config", so it can be a program name with args. set dummy sdl-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_SDL_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $SDL_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_SDL_CONFIG="$SDL_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_SDL_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS 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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SDL_CONFIG" >&5 $as_echo "$SDL_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi min_sdl_version=$SDL_VERSION { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SDL - version >= $min_sdl_version" >&5 $as_echo_n "checking for SDL - version >= $min_sdl_version... " >&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 confdefs.h - <<_ACEOF >conftest.$ac_ext /* end 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 if ac_fn_c_try_run "$LINENO"; then : else no_sdl=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi fi if test "x$no_sdl" = x ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } : else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "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 confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include "SDL.h" int main () { return 0; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; 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 "*** 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 core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi fi SDL_CFLAGS="" SDL_LIBS="" as_fn_error $? "*** SDL version $SDL_VERSION not found!" "$LINENO" 5 fi rm -f conf.sdltest CFLAGS="$CFLAGS $SDL_CFLAGS" CXXFLAGS="$CXXFLAGS $SDL_CFLAGS" LIBS="$LIBS $SDL_LIBS" # Check for SDL_image library { $as_echo "$as_me:${as_lineno-$LINENO}: checking for IMG_LoadPNG_RW in -lSDL_image" >&5 $as_echo_n "checking for IMG_LoadPNG_RW in -lSDL_image... " >&6; } if ${ac_cv_lib_SDL_image_IMG_LoadPNG_RW+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lSDL_image $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char IMG_LoadPNG_RW (); int main () { return IMG_LoadPNG_RW (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_SDL_image_IMG_LoadPNG_RW=yes else ac_cv_lib_SDL_image_IMG_LoadPNG_RW=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_SDL_image_IMG_LoadPNG_RW" >&5 $as_echo "$ac_cv_lib_SDL_image_IMG_LoadPNG_RW" >&6; } if test "x$ac_cv_lib_SDL_image_IMG_LoadPNG_RW" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBSDL_IMAGE 1 _ACEOF LIBS="-lSDL_image $LIBS" else as_fn_error $? " *** Unable to find SDL_image libary with PNG support (http://www.libsdl.org/projects/SDL_image/) " "$LINENO" 5 fi # Check for SDL_font library { $as_echo "$as_me:${as_lineno-$LINENO}: checking for TTF_GlyphMetrics in -lSDL_ttf" >&5 $as_echo_n "checking for TTF_GlyphMetrics in -lSDL_ttf... " >&6; } if ${ac_cv_lib_SDL_ttf_TTF_GlyphMetrics+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lSDL_ttf $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char TTF_GlyphMetrics (); int main () { return TTF_GlyphMetrics (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_SDL_ttf_TTF_GlyphMetrics=yes else ac_cv_lib_SDL_ttf_TTF_GlyphMetrics=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_SDL_ttf_TTF_GlyphMetrics" >&5 $as_echo "$ac_cv_lib_SDL_ttf_TTF_GlyphMetrics" >&6; } if test "x$ac_cv_lib_SDL_ttf_TTF_GlyphMetrics" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBSDL_TTF 1 _ACEOF LIBS="-lSDL_ttf $LIBS" else as_fn_error $? " *** Unable to find SDL_ttf libary (http://www.libsdl.org/projects/SDL_ttf/) " "$LINENO" 5 fi data_path="$datadir/xye/" data_path_flag="-DDATA_PATH=\\\"$data_path\\\"" doc_dir="$prefix/" # Check whether --with-docdir was given. if test "${with_docdir+set}" = set; then : withval=$with_docdir; doc_dir="$withval" fi #Is openGL required by Xye? I don't think so... # Check for OpenGL #AC_MSG_CHECKING(for OpenGL support) #HAVE_OPENGL=no #AC_TRY_COMPILE([ #include #],[ #],[ #HAVE_OPENGL=yes #]) #AC_MSG_RESULT($HAVE_OPENGL) #if test x$HAVE_OPENGL = xyes; then # CFLAGS="$CFLAGS -DHAVE_OPENGL" # GL_LIBS="$SYS_GL_LIBS" #else # GL_LIBS="" #fi #AC_SUBST(GL_LIBS) # Check for standard C++ library #AC_CHECK_LIB(stdc++, main) # Finally create all the generated files ac_config_files="$ac_config_files Makefile src/Makefile" cat >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 overridden 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, we kill variables containing newlines. # 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. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}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 "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} 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}' # 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 branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # 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 ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # 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 ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by xye $as_me 0.12.2, which was generated by GNU Autoconf 2.68. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -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 ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ xye config.status 0.12.2 configured by $0, generated by GNU Autoconf 2.68, with options \\"\$ac_cs_config\\" Copyright (C) 2010 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; 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 # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries 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[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # 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 by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. 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 " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/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=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # 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=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || 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 || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi echo echo The xye binary will be installed in $prefix/bin echo echo Configure complete, now type \'make\' and hope for the best. echo xye-0.12.2+dfsg/configure.in000066400000000000000000000035301225403634500156360ustar00rootroot00000000000000# $Id$ # Process this file with autoconf to produce a configure script. AC_INIT([xye],[0.12.2],[vexorian@gmail.com]) # Detect the canonical host and target build environment AC_CANONICAL_HOST AC_CANONICAL_TARGET # Setup for automake AM_INIT_AUTOMAKE # Check for tools AC_PROG_CC AC_PROG_CXX # Check for compiler environment AC_C_CONST # Check for SDL SDL_VERSION=1.2.9 AM_PATH_SDL($SDL_VERSION, :, AC_MSG_ERROR([*** SDL version $SDL_VERSION not found!])) CFLAGS="$CFLAGS $SDL_CFLAGS" CXXFLAGS="$CXXFLAGS $SDL_CFLAGS" LIBS="$LIBS $SDL_LIBS" # Check for SDL_image library AC_CHECK_LIB(SDL_image, IMG_LoadPNG_RW, , AC_MSG_ERROR([ *** Unable to find SDL_image libary with PNG support (http://www.libsdl.org/projects/SDL_image/) ])) # Check for SDL_font library AC_CHECK_LIB(SDL_ttf, TTF_GlyphMetrics, , AC_MSG_ERROR([ *** Unable to find SDL_ttf libary (http://www.libsdl.org/projects/SDL_ttf/) ])) data_path="$datadir/xye/" data_path_flag="-DDATA_PATH=\\\"$data_path\\\"" AC_SUBST(data_path_flag) dnl documentation path doc_dir="$prefix/" dnl check if manually overwriting doc path AC_ARG_WITH( docdir, [ --with-docdir=DPATH Directory where documentation is saved.], doc_dir="$withval",) AC_SUBST(doc_dir) #Is openGL required by Xye? I don't think so... # Check for OpenGL #AC_MSG_CHECKING(for OpenGL support) #HAVE_OPENGL=no #AC_TRY_COMPILE([ #include #],[ #],[ #HAVE_OPENGL=yes #]) #AC_MSG_RESULT($HAVE_OPENGL) #if test x$HAVE_OPENGL = xyes; then # CFLAGS="$CFLAGS -DHAVE_OPENGL" # GL_LIBS="$SYS_GL_LIBS" #else # GL_LIBS="" #fi #AC_SUBST(GL_LIBS) # Check for standard C++ library #AC_CHECK_LIB(stdc++, main) # Finally create all the generated files AC_OUTPUT(Makefile src/Makefile) echo echo The xye binary will be installed in $prefix/bin echo echo Configure complete, now type \'make\' and hope for the best. echo xye-0.12.2+dfsg/cross-configure.sh000077500000000000000000000001771225403634500170000ustar00rootroot00000000000000#!/bin/sh PATH=/opt/SDL-1.2.13/bin:$PATH ./configure --target=i586-mingw32msvc --host=i586-mingw32msvc --build=i586-linux $* xye-0.12.2+dfsg/cross-make.sh000077500000000000000000000001511225403634500157240ustar00rootroot00000000000000#!/bin/sh PATH=/usr/local/cross-tools/bin:/usr/local/cross-tools/i386-mingw32msvc/bin:$PATH \ make $* xye-0.12.2+dfsg/depcomp000077500000000000000000000367741225403634500147220ustar00rootroot00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2005-02-09.22 # Copyright (C) 1999, 2000, 2003, 2004, 2005 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 . case $1 in '') echo "$0: No command. Try \`$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by `PROGRAMS ARGS'. object Object file output by `PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputing dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac 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 # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} 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. In older versions, 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. # Version 6 uses the directory in both cases. stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'` tmpdepfile="$stripped.u" if test "$libtool" = yes; then "$@" -Wc,-M else "$@" -M fi stat=$? if test -f "$tmpdepfile"; then : else stripped=`echo "$stripped" | sed 's,^.*/,,'` tmpdepfile="$stripped.u" fi if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi if test -f "$tmpdepfile"; then outname="$stripped.o" # 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" ;; icc) # Intel's C compiler understands `-MD -MF file'. However on # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c # ICC 7.0 will fill foo.d with something like # foo.o: sub/foo.c # foo.o: sub/foo.h # which is wrong. We want: # sub/foo.o: sub/foo.c # sub/foo.o: sub/foo.h # sub/foo.c: # sub/foo.h: # ICC 7.1 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using \ : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; tru64) # The Tru64 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. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then # With Tru64 cc, shared objects can also be used to make a # static library. This mecanism is used in libtool 1.4 series to # handle both shared and static libraries in a single compilation. # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. # # With libtool 1.5 this exception was removed, and libtool now # generates 2 separate objects for the 2 libraries. These two # compilations output dependencies in in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 tmpdepfile2=$dir$base.o.d # libtool 1.5 tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.o.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d tmpdepfile4=$dir$base.d "$@" -MD fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" # That's a tab and a space 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 preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for `:' # in the target name. This is to cope with DOS-style filenames: # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. "$@" $dashmflag | sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" 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) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # 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 ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix="`echo $object | sed 's/^.*\././'`" touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" sed '1,2d' "$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 preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E | sed -n '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | sed '$ s: \\$::' > "$tmpdepfile" 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 preprocessed file to stdout, regardless of -o, # because we must use -o when running libtool. "$@" || exit $? IFS=" " for arg do case "$arg" in "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile" 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 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: xye-0.12.2+dfsg/install-sh000066400000000000000000000127361225403634500153360ustar00rootroot00000000000000#!/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 xye-0.12.2+dfsg/levels/000077500000000000000000000000001225403634500146165ustar00rootroot00000000000000xye-0.12.2+dfsg/levels/5levels.xye000066400000000000000000001415551225403634500167370ustar00rootroot00000000000000 Bonus Pack Vexorian 5 levels that were originally for kye and were adapted to Xye so they use some of its features. Crossing The Street Brick game Is Xye a puzzle game or an arcade game? Spikes I am sorry if that was annoying. You will need to have good memory. 0000000000606666608088000202222200000000000002022222224044408088888888888404 8888888404444440000060666000000000000000000000000000002022240444000000006000 0000000000000000060020222240444400404444606666666600000000808886606000000000 0000080888888006066000000006202226068088888860666202222404602022206020200000 0000000020000000020000000002040444448088020222220006060000000000000000004042 0222260400000000000606668088888888000000000040000606800000000080884044420404 4444202222004040000404442022200002020600040448088860666404448088800000000080 8860666020000000202200000000800000000080606666600802022000000000000808888400 808888 The Amazing block can you believe this level? Step by Step The treasure room So many gems! 0000040008088888840444444444260666404444808606666806666808604020240444202606 6666666666666666666680840448080060666808604022260662240444444204444444404204 4444420600006066666668404420404444420008088880000000000000000000000000000000 0000000000000000000000080888002060666666668086066402024444444420222222040226 0666666206666666660000680600062060662040000000602040402040040840008040400408 0404020008060662002060020400402400048040400008400424004804042040400420006006 0020604040402006066660008060800200006204400060666080060666080606680660000006 0666624044420006040444204042004044444444444420086060000026066666666800002606 8062068088600002006202040080606206068060200008088408088608888860662008404202 2224022222222222240440840424044444440008000040200840402400402040002404800202 6066806200006840080020200000606680000600002060666660004080086080606806880886 0668086668088886662008404202224022222222222224042022606840442040000046066808 8840444442024022408040884020004200060668080040808404444800068088888606600000 0000800060666666666668086660020008404002022204202002400084044440000000060600 0000000000000000006066080888886666808666620008404420244420040006804800080886 0600020404444804808000000000040204044044444200008000260000048408088886066008 0888888404000040420222222606206666666666668088866666680866668000000000808000 0000000000000000000808606206662084044202222220000202220404444444444804444448 0888420226062066620666666660808608860886068800242000006808800202000000620222 2222404480444448088804200000000000000420222222222222222222220404808860688886 0666808608860666808886808666204080444202404444444202240002040804048088886066 6640004044460666662026022606666802024044420420224446066600000000000000000606 6680888888888860666808 xye-0.12.2+dfsg/levels/Mic4.xye000066400000000000000000001065121225403634500161460ustar00rootroot00000000000000 Mc! A couple of special levels by Mc. Mic4 Mic4 Good Work 4cols Sometimes you need to slow down the opponent in order to win a race. 000060666666680888888606664044420222000040444606666808888666666666604044 444444420222222222000000000000000080800000000000808888000084044444444000 000000000000000000000000000000000000000000000000000000000006066666202222 000040444444440000000000000000000000000000000000000000600000000000000000 004040000000000000000000000000000006000000000000000000000000000000000000 000000000000000000000000000000000000060666666202222222226066640444480888 844444444606006000060640460400006066668088840444804444444444444000000000 000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000606666666202222222222606666680008080 060000000000480000000000000002040448088888000000000060000000000000000600 000600000000000000606666666660000000000000404444444402022222222006066666 080000204044444480888888888000000006066666000000606666600000808800000000 008000000000000000000000000000000000000000000000000000800000000000000000 000000000000000000000000000000000000000000000000000006000002000000000600 000000000000000000000000040000040000606666000000600000800000000600000000 000000000000000000000000606666600060660000000202000000204000000000000000 000000000000000000000000000000000000606000000080888880000040440000000000 000000000000000000000000000000000000000200000000000000000000000000000000 000000000000000000000000000000000000000000000000404400000000000060000008 000002040040000800002060666680000000000606666000000004044000000000000000 000006066000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000 004000000606000000000000000000000000000000000000000000000002000002002000 040040040002002004004000080060668000606680888840400000000000000000000200 200000000000000000000000000008040442000200000606000000000000002000200000 000000004000000000080060680884044200206000620060000000000000000000000000 000000000000000000000800080000020000000000000000006000060008040068008040 200000000400004000400040000400000400000000000000000000000000060666660000 000000606600000000000000000000000000000000000002000020000000404000000000 040000200200200800080080000000000000000000000600000000000000000000000000 000000000000000000000000606666000000000000000000080888606000000000000000 000000000006000000000000000000000000000000000000404444444444400002000060 660000000000000000000006066000000004000002000800606000002002040040000040 808800000608000080600000000206240000402020404486000000000006002060800000 008006080880000040600000400040000000004060006000000600000002020240000000 680008004040000000400000000040000000000000000000000060000600006000060000 000000000000000000000000000002000204000000000000020006080080080004000000 000000000000040004004004000006066660000000020060002400800000000000008000 068000400000004000400040004000000000000000000000000000006000060060000020 000000000046000000000400004000000000000004000000060000600000006000000002 002004000002000200000006080080000000000000000200040000800000020000000020 000400040800000000020000000006006080800600800000000060800400200000000000 000000400002000400200000000000000600600000004000040080000000200000006000 000060000040000000800000600000000000800800000000000000000000000000000000 000000804044000000020004044400000000000800000000000000000000000000008000 000200020000606600000608000060600000002000000000000000000000000040000040 000004000040004000000000000606666600000000000000020200000000002004000004 000000080006202240000200002004000000000000000000000000000040060660800080 006068000000000000800000000040080006800404444400606660000080404400202004 044000000004002022222404444444444444202222222606808888608800000000000000 000000000000000000000000000000000000000000000000000000000000000000000000 000000000000020226066660008060660080880000000202040444444480888888606666 202266666620222260666000000000000000002022000000000000000000000000200020 000000000000200000000000000606660000000000000020200000000020404440800008 004048000000000000600600006040000400000000000000402600020260668000000000 800000000000000000000000000008000000000060000600404004000000000600020200 000000200000000000000000000600000000000000000000000000000000000000000000 000000000000000000000000000000000000000000404400000040800080408060200002 008080606600002000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000020000 000000000000000000000000060600000000000000000000000000000020000000000000 000000006066668088600000260408008060206062024084060680404606684040606202 266666666666202240446080884044444444202260640480886066666666202240000000 000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000040444444444444444444444444444444400008088000 000000000000000000000000606000000000006060000006066666000000000040000000 000000000000000200000000000202200004044444444400008080000008000000404080 888840444444 xye-0.12.2+dfsg/levels/Phipps.xye000066400000000000000000013424241225403634500166220ustar00rootroot00000000000000 Quests, Jungle, Problem and MysticalColin Phipps This is a collection of Kye levels by Colin Phipps. The file contains levels from quests.kye, jungle.kye, problem.kye and mystical.kye. Intermediate to hard difficulty. The last two levels are for experts only. Find more at http://games.moria.org.uk/kye/mylevels . TRICK Be quick!! Trick the rest. Clever! >>5 5eeee2 2 r*l 5 5 >>>5 5 e uul 5 5 >>>>2 5 7556e4555555555 5 >>>e 556e43 b 5 55555556 5 ^e^ elll S 5 5 e 5 ^ 8<< 7555555 5* 8 5 5 7559 5 5 5 73 15555553 1555 5 555553 2 5 e 5 5 c b 1556 45 5 8 D 7559 b a 5 55555 b 73<<5556b8 c 5 5 2bbb a 2<< 5 5556e45555 5 C b eeeS5 ~ 5e^^u^e 5 5* 8 bb 8 5 * 5 ^^^^s *5 555555555555555555555555555555 ]]> RUSHED Divert, trap and evade. That took cunning and evasion. vvdvd 5 5 >>>2 e<<< ellle eeeeBeBee5 5>>>>e 75555555555559 B BB5 555556 2 2 2 159 8ee5 5>>>e e 8 8 8 5*5 5 5 e 8 B 455555555555555555 5 5 5 e<<<<< e b T 2 5 5 s 5 8<<<<< 8 b e 5 555556 75555555555559 7555555 5>>>>e 5d5 sS 5 2 153 *5 5>>>>8 5d5vvvv5 [ e b 4555 5 eaa5 2e5vvvv5bbb8 b C 5 5* 5 16ee45 5 b 5 555553 1e4555555555555 5*b b*5 559 8ac8 755 555555555555555555555555555555 ]]> DIVERSION Divert with care! That was tricky. FORTRESS Watch sentries and guards You're doing well! STAIRWAY Down the steps! Very good. UNDO Clear up later! You should become a cleaner CASCADE Catch them with a big hand Take up cricket. COLLISION Set them on each other! Don't become a traffic warden. STAIRWAY2 Synchronize the sentries Good organization. GOTCHA Align bricks and FIRE Good shooting! PREPARE Gather equipment That was good. TRACKWAY Don't get run over! They'll get harder (if I've written any!) SHIFTER Don't start a chain reaction! That was tricky. PASSAGEWAY Along the passage That was long! CAPTIVES Capture and imprison Good work. Well done! PURGATORY Enlarge their cell Quite a horde! BLOCK Trigger and block The next one will drive you out of your mind! MINEFIELD Clear a path That was tricky, wasn't it! SEPARATE Trap them That was fun! RETRAP Open the door, then shut it! Good work! DISPOSAL Try an oscillating magnet So you got out of that one, eh! SUPPLY LINES Dispose in turn Come on, it wasn't that hard! HOLD UP! Use sentries to retrap... Bet you had trouble with that! PRESERVATIVE 11 days to Christmas On your marks...Get set... RUNNER Run first, solve later Now for a treat! CORNETTO Need ammo to align the hole Watch out! PATROL Avoid the wandering blob. What a sneak! BYPASS Head off the rounder Watch out... TOMB Remove the sphinx! Get out of this one... SECURITY CHECK Hint? Ask a policeman! Bring your passport next time. GUARD Look out for the guard! Now you are past the guard... BANK VAULT Empty those vaults! Complain to the bank manager. SLIDERS Remember they're square Let's smooth those edges. ROUNDERS Remember they are round! Now, wait a minute... WAITING ROOM Keep the waiting room clear. Now let's re-house you... ROOMS Like the accomodation? That was rather crowded! POWER STATION Feed it fuel... Not very efficient. CROSSFIRE Build a prison This is getting to extremes! EDGING Careful timing, but no rush Fun! SEIGE Attack the Fortress! Fun! DRIVE BELT Do it in order Time to get stuck in... e a5bbb5 5UUUU753 2^^^e5 5S*>e a5 5 5^^^^5 ebe^^^e5 5 >8 a5 5 5 8 5 8e755553 556e555553 CE5 5 2b2 5 5*a>>e 53 5*eeee 5 5 *5H5 >>e He a5* e 5 555555555555555555555555555555 ]]> MAGNETISM When do magnets not pull? Let's see how well you know this game... xye-0.12.2+dfsg/levels/SuperJustin.xye000066400000000000000000005420271225403634500176520ustar00rootroot00000000000000 Superjustinbros SetJustin De Lucia (Superjustinbros) Levels from Superjustinbros, also known as Justin De Lucia. PuruPuruParadise Just have a blast. Now onto the game... Arrow Advice Just to explain some block physics. Don't expect these to be uber-hard. Before we move on, allow me to explain more about the blocks. Aside from being able to activate areas of their color, the color of an arrow block determines its movement speed. Blue moves the slowest, and red moves the fastest. As you know, only red blocks can become Fire Blocks. These are bombs. Handle with care. Don't enter this. Room of Kickers More explaining. Alright, We're done here. Magnets and stickies are simliar, though stickies cannot attract objects a length of two blocks. This wall requires bombing. Raft Don't be greedy. Wow. What a jump in difficulty. Purple Fortress Remember what everything does. I wasn't kidding when I said these levels become harder. Green "!" Blocks can trigger green marked areas, then be pushed to become blue and thus trigger marked blue areas. Reminder: You can push blue and green "!" blocks without changing/triggering them by using the Magnets and Reverse Magnets. Fouran Pick your chambers. Betcha your mind is working, becuase we're far from finished. Dart Land Be the dart. Trap the beast. Keep goin'. Tired of waiting? Hold Control down to speed up the action. Markoone Tread them in the correct order. Let's hope you now know Xye's physics. Cave of Nuking A little bombing won't hurt you. That's not the last of the explosions. Shelden Keep pushing. Excellent. Plumance Carefull with those circular turning blocks. Xye levels were not meant to be easy. I'll tell you that. Murple Purple Intro to Purple objects in this level set. Yea I gave the color Purple special attention on this level. Don't worry, the others will return in the next level. Recently, Purple objects were introduced. Let's go explore them. Pondside Remember how every object operates. That pond now needs to be cleaned... Puzzle of the Snipers Be right next to them, and they will not fire. Now for an additional puzzle, try counting how many round and square blocks are in this level. To the left is a variation of a previous puzzle. Terraforming Use the black hole, Match the shape. Prepare to land, astronauts. Catcher Orders are important. Yada yada yada. Black Star City Find a way to break in and bust out. You have won this level set. More to come soon. xye-0.12.2+dfsg/levels/cracked.xye000066400000000000000000000342731225403634500167520ustar00rootroot00000000000000 Cracked PuzzleEilang Hard Puzzle. Cracked Puzzle Charmender then Squirtle then Bulbasaur Charmender is red. Squirtle is blue. Bulbasaur is green. xye-0.12.2+dfsg/levels/levels.xye000066400000000000000000035153061225403634500166540ustar00rootroot00000000000000 Xye [official] levels Vexorian These levels are various challenges that combine the different objects in the game. Round There is a good reason for the shape of each of the blocks in this level. If you need help you can watch the solution movie. You shall also try to play a couple tutorial levels before playing this package. ... And that's just the beginning. Did you know that in the first playable version of this game, a harder version of this level was the first editorial? 002002404448086066002060062608080880002022224044480888884088888888860620 222000000200080888840420222226066620006006206808008002022606600008040440 204080888002022260666680884020602404440204808800020226066668088888888860 202222222602222222000808804044420444202224448088800020226066808866666666 680880000002022222 Umbrella What's up with the level's name? What are you waiting for? Go solve the next level. Furniture Make sure to select appropriate locations for each green blocks. Ok, I guess you want something more challenging than that. If you feel so confident try the next level. Change their destination There is some charm to the more classical game style of dealing with those moving blocks. Automatic I You can block the flow yourself until the nex pusher is in the right position. Inspired by classic Kye's level 3. Consequences Build a barrier. The flow Do not disturb the flow 00000000000000002000000000000002060666666620226066680008000080606662022222200000000000000000000000000000000000000000006000608000000080060060006000200002000000200400040000040800000800080060006000006000202000200000400040000040008000008000800600060000060020000200002040000400004080000080000800600006000600002000200000200040000400000400800080008006000060000060002000200020606666668080040200000404200404400000004000404004000000004080000800800040004000800080000000000000000000806066666662002060666660000000000808888888860006000200020020002000060006080888888860620224008 The world in movement Believe it or not, back in 2006 this was the very second tutorial level. This is a predicament, is'nt it? You need that block to stay there yet you also need it to leave the red area once you manage to enter the room up there... ...Do you happen to know of a way to move blocks without direct intervention? Those blocks make the arrows rotate. Remember that you can push them to alter the path the arrow blocks take. Those things byte! "Preemptive blockade" Did you remember to get the star:) ? Cautivery Become the hunter. The star could get tough to get, do not forget it is optional. Did you get the star? That is a very tough to get star... The 7th blues Remember the class about wildcards? Having fun? Try the level editor and create more puzzles! 4 Think things through. Red arrows are faster. 0000000002000200000000000002000000400008000060002022000602004008088800808880 0000000000000000000008000000008000020222222220000002000400000008088860888880 0000040006800020200200080080600040800000002022222226020002040000000000040400 0600808880886000000800000020222222222222406066408088888888888800004048400000 0000000080000600000000000060040000400000046066602004044202222260222222040444 4444006066666666666666600000000000000000004044440000000000000000008000000000 0000000000000000000000002000002000000000404804444444400000040000000080060620 6666666666600006006000600600000000000000000000000800400024044444444444444408 0000000008000000000000000000200060020006066666666666666000000000000000020000 0808800000000000000000000000002000000400240444444444444444200000000000000000 0006080060666666666666660000080040000002002000084044444444444440200000040200 806080666666666666666202 Like defusing a bomb! Attack of the sliding blocks Block their path. Catch You'll need a shield to block those arrows. Get at least two keys to win. 00000000002026066660040444444444444400606666000000000000000000000000000000000000 00000000000600000000040000000000000000400000600000000000000000000000040000060000 00000000040000600000000000000000000000000040000000000600000400000060000000000000 00000006000000000000000000400000000000000000000000000000000006000000000000000000 00000000000000000000000000000000000000004000000000000000000000400006000000000000 00000000000040000060000000000000004000060000000000000000000000000400000060000000 00000040000000600000000000000000060000000000600000000400400006006040000400400000 00000000000006000000000600060000000000008000000080000002022222200080888404442022 20008088888860666666666666000000404444200060600000006020008088888000202206066666 600020222240448060666202480888840888606 Fun! The hunter No longer a prey. You have become the hunter! Survival! Letting victory slide Is it possible to move two objects at the same time using a single magnet? Quick relocation Just an easy level before... So typical If going forward does not work, go backwards. 00000000000002022402220000000000000000000202220000006066800040260040448048048086 06806620200426000000626068000062004000400400000200062022220008088880000408040240 02022602022000808408880000000000000000000000000600000004080800006840440080860888 86088404480480444400000240442000202220000008088000000000000000000000000200200000 00000000002000000002000200000000000000000000000000000000000000000002022200000808 88800000060600606000006000020222222000808888888006066680884088888404804440000008 002024040800404206 Don't you get tired of the congratulation messages? So here is a life tip: When life gives you lemons, be happy, I mean, what's the problem with lemons? Really... Yet another wildcard puzzle This and many other levels included were actually made with the editor that comes with the game! Make sure to try it out. Make your own levels and share them. Avoid the greed Magnetism can be blocked, rocks can be detoured. Hope you are enjoying the game. 00000000000000000000040442022222402222240200000002022222220006006000002002600602 02062068000000000000202200606600000000040444808800002000008000202000000606662066 66000404448088000000000000000000000000000000202200606666666666808888888404206066222224044444444420444444444440080008000000000000000000004044008084008088408888886066662066666660000000000004044444420222260680886666808004204442022402404084088888840888886066666620068000680024044000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060660000060680666200006806808000202404444000000000000000000000000000040000000000000000400000000000000000000000002040444444442022224022222200080000000000000000020606666040448088888884088888000000000000000000000080888888888888884088000000000000000000080800000000000000002606000000000800000808000020222220400600400000600400000000000000000000000000000000600400000000000000000000000000000000006000400000000000000000000000000000000006004000000000000000000000000000000000006000000000000000000000000000000000000000000000008088888888884088888600020240226062222222606666660800400400084020624004606668088884044488888408888606806660020002008084044420004042022240000008606888860668066680666000000006000000040444442022402224022240222404202224042000004060000400000000000060060000040002022602 Strawberry pie That was the mere training. 0000060666804044480860666688840442022606662224044422226066666668404420444 4808860 66668088606600060060620200000000000000000000000000000000000000206006808080000000 00006066662020000600002006066620240444204000000808840860666686066202404480888880 06840444420480068404444840206240444444240808006840444444008400202002420608088060 66666000000000000600006020666666666660002606808840444060000000000000000000006066 80666600620666040444000008402400840202222220000000020080888880600624000000000000 00060200002020000000000000000000000002000000060662020000000000000020000000000400 00200000000000000086066620222408088840440000000200000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000008000000000 20000002040000000000000000000000000000000000000000000000000000000000000000040020 222404444400084040000000006062026666680866666808888888860666666666680666202 Which was the difference between a blockdoor and a blocktrap again? How to open that door without getting trapped in that room? Magnetic personality Space is realy important. The disturbing case of the blended arrow puzzles Some things are more connected than other things. Running out of title ideas, are we? 00000000000002022220000000000200000000804000000006808888404444606040446066404000 00006060000000000040444444440080800000000000000000000080000000000000000000000000 00000000000000000000000000000000000000000000800008000000000000600060000000000000 00000000000000000000000000000000000068080000000000000000202606200404444000000002 40800060666660080040008008000000800080008000000000000000000000000000000000000000 00000000000000000000000000000004044000004000000000000000000202222000000000000000 00000000000000020000000020000000040040600000406000000000000000000000000000000000 00006066660000000000000006066000808888860600008088000000606666666404444420000000 04042022606000000404202224040808884806000002060008080002022000000000020222226066 66666666666620222222606666668088606668080000000806066202606404808844808606666808 80000808888880020204044442044442022606660000000008002060666808880020404420444206 06666662066666808880000404442022260666808804044202260666800204008088000404444000 40080260000068000202224044008000000000000000000000000000000000000000000000000000 00008080002000008000000004048002060000068000020000000002022606668000800624044002 48000000000000000004048080600000800000000000800202226808888800000040442022000000 06000000000000000020260666620222240444202220000000204040404202404000800840080002 40000000000000640000600000000000000600000400040000600000000006000000000000000000 00000404400606680888800002022222240444480888884044460604040000004044000000000000 00000000000606000000040444444480888888404800000020226000000002022222260666202666 66660000060406004060000060040400000060600000000040006000000404000000006060000000 04040000000060000000604000000400000600000000000000040006060000000040060000406000 00004060000004060000004060000000040080800002000002060008040888860660808000000480 60600000200400000200000206000000000000000060660000000008088888888888888888888888 88888888888888888888888888888888888888888888888888888888888888888888888888888888 88888888840444444444444444444444444444444444444444444444444444444444444444444444 44444444444444444444444444444444444444444444444444444444444444444444444444444444 44444444444444444444440202222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222200004044420000000020222404000 00840420444 Forces we are not supposed to play with Use all your ammo. Great! 00000000000000000000000000000000006068006000200600000000000000000000006000000000 00000000000000000000404444808888886066620002400060808840440200000000000000000000 00000000000000000000202200000000000000000200200000000006066660000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000006 00060000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000006000000000 00000000000000600000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000006000000 00000000000000600000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000006066666666 66666660000000600040440008080086000620008040004020206006080080402000040000200000 60000000060000000000000000800000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000002020408000680800000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000040000000000020000000000 00000002002000000000000000000004000040000000000000004000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000400 00000400000000000000000000000000000040400000040000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000004000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000040000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000400000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000004000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000040444444400000006808008080000000000000000000000000008 00000000000000000000000000040444000000000000606660000000000004044444444000006066 60000000000000000000000000000808880000000000808800000400084000200020222000000000 00020000000000000002000000000040020006006006008088888000400000840020002022200000 42000000806002042606000000080888886066800804000004804020002020020000004260000086 00080888000000080020224202222000020200020000800000008060000606660000000400040400 00000000600200000000000000000000000000000000000606660060660040444440000000000840 44202260000606680000000404000000000080000806060000200000000000000000000000000000 00000000000000000000000000400600060660000006066660000404444444000000840444200200 60006000620608000000004040000000000040800000000006000000086066004020400000060666 00606666660000404444000040444400000040200000002060000000000840040040008600000000 00000000000000000860000600020040006000060666666666660040444444444400400000040202 60000000800000040440080600000008606020040606660000060666666666600000000000000000 00000000000000000000000000000000000000000006000000000006060000040444444444444444 44000000000000804004020000000000000000000000000000000008088886000008088000000008 00000000000040000004044202200008088800408002060680020606802606660480002022260222 22260600026066600000000000000000000000000000000000000000060660000606666666600000 00060000000004000000000000000000000000000000000000000000000060660000000000000000 00000000008000204040080800640808600420222606668088000000000000002022220000000000 00000000000000000000004040000000000000000000040008088000000004000004000000000000 00000000000000000000000000006062022222222222222000000000800000000000000000800000 00000000000000000000040440200008404200008404420000006002000840420000840420008606 66666666600000020224044080880000202224048088800202222404808880020222404808880020 22240000000000000480880020224040000000000000400040000000000000400000000000000000 00000000000000000000000000000000000000000000860000000000000042000060600000000000 00600000060000000060808860666666620222260000000000000000000000000000000000000000 60680884044442022222220080840444202226066666004000000000006000000004000000000000 00000040808860666000000040000000000000004200000000000000000000000000000000020224 04444444008088404400040808606200000000000000000000000000000000000000000000000000 00080040402000000000000000000000000000000000000000008080606660000000000202200606 66666660000000000006000000600000000000000000060060000006000404444444444440040008 08404202206066666666660000000000000000400200002020006060000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00080000002000060660000008088040444400000000000606666000000000000000000404444000 00000600006060000000004044000000606660000000000000000000000000000000000600000002 02200000000000000000000000000040000000000000060808800040444444444420224044400000 40400000000000000000000000000000000000000000000000000086000000000000000000000002 00006000000000000006000000060060008088606666600000000000000000000000000000606666 20222004040000000000000000400000000000000000000000000000000000004000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000006066666404444480888888600000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000006000 00000000000000000000000000000000000000000000000000000000600006000000000000000000 00000000000000000800000000000000000000000000200000000004000000004040000000040400 00000040000020200000020200000200000020000020000020000200006006000600000008000000 000000000000000000000000000000000000000000042022606662066666 Turn around A little rotation is good for you. Well done. 0000000404002022222402222220000400004000000000000000000000000000000000000000 0000404448088888000000000000000000000000000000000008000008060666002026068040 4400606680840202000606202222224000400000000000000808800204000000002404808800 0004000080000000000600008008600000040000000202222224004000000000000000000000 0000000000000000000000042024046066480888888888888888888888888888888888888404 4444606666666666660202220000000000000020000000000000000006000000000000000080 0006200000000000000080600060068006020426066666662068088848000680620402222404 4420240222226066808840026080880000000000000000040444424004084086066666666206 8088800000008006840842060006006000006800000000000000000000000000000600060000 0000000260800000000000000000400400000000000000000000000000000000000000000000 0000000000000000004000800000000006000206060000000068008040040020000000000004 0002000240040442022224044442044204444480606662068486066666620680888888888002 0222222224044444444448086066806200242606666662068088888888840806066666000000 0060004020002040020402002040000000806066000000000204044406066680060600000240 4444460680860000008600200000024026000000600480888000604000060406000400002002 0020000000200060000000000000000000000000000000000000000000000000000000000000 0000000000006040000000000620222222404420040444426068006066800000000000000000 0000000000000000000000000000000000004044606668088888800000400400400400400404 0000020220000000000000200404444000000000000404480884088888408888000000000008 0000400000408080000040004004600000000400000020004040240444448086062026666808 8666202662022226066202266600000000006060000404080800080000048080606680840442 000020008086066804044888408840888886062024000008 Pluzze It pays to open up some space. Please disregard the unfunny level name. Defying gravity If you need extra space, use your key to block the black hole at the bottom. Note, however, that such a move will make you unable to get the star... 000000000000000000000000000000000200420026006008000000080000000080080804020000602002020020420200080040080080806006240202220080888800000062002004068400000004624062400000040684684000000040624006240000000000000040684684000000000200400000000000000040000008606666008000602022222000080080804020206408086202220080888880000004044440200426066680680086000000620024000000060840000000000000460240062400004068406840000040624062400004068460800000020040000000000000040000000004000000000000086066668006020222222200808888880000040006000000080420240444426066660000640860486000000000600420060042600006004086004086000604206042600000000006048648600000060402600402060000000000000000000808000000060420000006000006000000000000000000000000006000080000000000000000008042022224040000004000000080080000000000000600600000008602402002604000000800606202222000808880400008088000620400000040444444444000400000606666666808888608000080000000000000000000000000000000000000000202222240444442044440008042022220008088800000080080060666666666666200200204044444444440000080880404400200002000064086000604260402600000000648640860000000064260426008088606666680886068000000080000000000000000000000000000000000000000000000000000000000000000000000000000020222224044480444420020020640864000000000000860000000000060426042600006408604860000604264026000604860486000006426040260000060408604860000000064260426000008000000000000000002604864860000026000000000000000060000000000008000404444444460668088860668000080000000000000000000000000000020222222222200202022222260222224044804444444400800420222222200808888800000006066666666666600200200640444444606666662000404444444444400000808840442002640460000008006000000006040260426004808860886066206680860668068608080000608000000000000000000000000000000202224022222240444444442006200684000000800000000408604860006420604260060486004860006040260402600604086048600000000640260402600604086408600060402600402600006408604860000604206042600000604864000080000600008088840800000008000000000000000000000000000000000000000000000000000000020222222000006020222200604000808888408888606662022260222222220000000000000040004004004000800020606806062606680004 Hope you didn't find it repetitive. Citamotua II Does this remind you of anything? Well done! Make your path See through deception. 000000000040040202020080886066620220006066000006404444200008088804044840200202602022040000800008008080080002022206068000008000400080080008000606660000000000000000060060060000000006006200404024080840040202222606080888000202240448088860666660000004020002000200808404402022220004060808886066202260240040046068088404420222262060800000000680080000000000080008000400000006006006040444202240200002420060060068006066620204000080880000000000000020224044484044808888606666662022220000006206800008008000000000000800804048044444442022226066808888408606666600000000000000006200040000006002000600000000000020000200000000080000000080000000000040042026080486000600000000000000000000000000000068008000020000000400000000000000000000000000000000000000000000006202002008008008400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006080666666666620222222240444444804420222222226006800008080020000404480800060060404202000008000002608048000060020222606680402408008000200600060080000600600000000000000000000000060000080800040804042060806066202224004800026000608000040060808402040000000000000006020062400400400000240040080080020026800400400408080080060002004000006204200600200600000000000080080000000000000000000000040000000408008602000004200000000000000000000000080602402000000062006000008088000000000000000000000000000000000000000000000000000000000000000000000000000202006066668084004000000020624044444204808888000000000000000000000000200002000000000000000000000000000000000000000000000000000020600680040024008080080404000008008060000060000000200200080084042600020620200006202004080808000800000000000084044400002408068040444444606666666800006006002000000200004200000000000060020226002006066608008008402000004000000040002000000040000000408006066600000006404444480060000000200600060040000000040008000000006000002402000000260666660000000000000000000000000000000000080000000000000000800804004002002062040440000002400000800800000200600060000800060666680804020020620404440000200000000000400800006066600800800008040200000020620400420404080006020060000000000000000000000000080800000000000000020000404448088444444480444480844444400020020020202000000000008000040002022222404444808606666620224040808 I wonder if there are people whose only reason to work hard to finish the levels is to read these silly messages. Speed Do not ignore the horizontal red pusher. Well done! 86666266644248222226668448444268684688842622222888882222666844444666688666888888 64444464444444444444444466888888884444422222244222622222624444444444488844444444 44288666688626668444444424424864664222222222424624442226666688888444666622244444 44886888888888868666664444424486666626888822222666842444446644466844666266684842 62444842422422222222262686244488888888888482666666688888666644442222444244448866 66666662686242664468462266666666686624466644444444000000000000000000000000000000 00000000000000000000000000000000000000000000000066666666666668888844448886666662 22222224444222244888444444444484444486 So close, yet so far Banana pie 00000000020260666808040444808606680888404420606620222404442226066666806620404444 44808606666806666668088600006000000000000060660200020000000000000000000000000000 00000000000000000000000000000000000000020600680080080000000000000606660200020060 00206066620404424080888408606666800606020200004080888880000068404444424806840444 44842624044444420480806840444440000048400200200020426008088606666666200606666662 06068080000080000004044460666806666620266666086066664040000002040202222260662022 22260808888404444808888888000000000000000080040004000000000000000000000000000000 00000020006240080042022222222222222200020000000002000808888886062022222222224022 22222000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000040000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000004040080 4044446066662066680860666808860668888888886066666202 Congratulations! The mix Timing Take the green portal... (After the yellow one). SELECT endmessage from LEVEL where LEVELID='4'; Chekhov's brick All right, congrats are in place. I guess. MacGyver This level was initially meant to be like the shooting gallery level from the original Kye. I am not sure how this happened... Swing Bridge Use the right combination of values. Thank you for playing. Fire strikers Use a shield. A moving shield if possible. 4 x 4 - 4 Plan your moves ahead and you should be all right. Hah! Heavy surveillance Choose your own adventure Only two keys are needed for victory. Exchange extra keys for stars. Well done! Short ... or is it? #1: Be clever. #2 Don't be unclever.#3 This hint is useless ... ...or is it?. #4 Violence is not the answer. Piece of cake. Tools Pick the best tools for the job Boycott! Do not rush to get the blue gems. The frontier How many could we need? You are on your own now. Good luck with THAT... Flee! But not too fast. Yeah, those things are not really as smart as they seem... Get ready though, you will have to deal with those a lot more times... Keepers Those things are vicious! 00060666662000202000808600000060806008060600002000000600200000000000060200000062 00204000800008000060006000000000000000200400040408006000000000000200006000060000 00400400800808000600000000000040000000200002002000004002000600260800040040040000 00002000600000002608048060002060006000000000200000000000000000000000000000000000 00840440020002040000000000080040000000000000006000800000000006080080400402000600 06008600240206000000000000000000000000000000000000000000000200000000000000000000 00000000004044400000860660800600000002000004044000004000004086000600680060020020 04044408000408008600204026006006008060002000000204000000200000000000000000000000 00000000000000000000000040080080040000000008000000000008000026040800860002002000 00204020006000000000000008006000600002000000000000400000080000004004260000060080 00000000060060002040000000804000400020000000000000200006000000000000000000000200 00000080040808888860886000006020600060000000400080006002060000000200000000000020 00000200200020020020000040040060000000000000000000600000080888800008008000000000 00000000080000000000400000000000000000040000020000000000000000000000000000000060 42022222200000000000000000000000000000000000000000000000000000000000000000000000 00000008088888000060062000000240080888800000008000202220000006020222000048088888 88000000800020222222000000240040200206804860002608088888888800020222222220040048 60026080888888888002022222222000404408006006206808888000068040248000620222224044 44808606600000620068088800068402408080002602222224044480884086066620068088006840 24080880002026022222204044442022268088888884086066600002680080080006840024080888 00202260222222404442222226068088888884088606026080888888840860020222222222404200 20222240808888884086066002608088888888408606600000006200020002000600000000000000 00000000000000000000000000020000000000000000000000000000000000000000000080000000 00000000020000000000000000008060000800000000080000080060006002000002000062000020 00600060000002002002000200200000004000000000004000000008000000040004000020000040 00400000000000000800000000000000060000060000006000000060006000600060006000600600 06006000600600600600600602000200200020020000600600680008000080080000000000000080 00000000600620222222404444444008080000080004008400040008040040004000020002000400 00020000020000000000000000200000000000000000000000000000002000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000020222220000000000000000000000000000002020000000060200 06062006800404480404000000000000606206600800000000000000000020000000000000000200 00000006006006000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000068080000060666 The square Patience! That was not so hard, was it? Timer Madness 00000060666808800000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000606 68008008008060680800000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000060 62400048040800800688040002000206066666680800000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000080004048088806202222048088 80020222404480600268088880020020200040408602680800020222404444446066666666808886 66000006806062006006800800600000000060002060666404448044442044420442024420244444 80040444448088606002020004206066666662068088002022224044444444860666666620680888 40444444806060000860200042606662680800202404448086080620402600602680020222226066 66680680866000000000000000000000000600600600000000000060002006068040400020002040 04840042600600000000000040202006060000006800600624004606668088000040440202222000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000004000000040000000000006066666808888888806060000000000600060000000000 20002000200060600000002022222222220000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000008088000000000000000000000080002022200 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000080888000000000000606666000008060660000000000000000000000000 00000800800000600600000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00200006200400400840042600006000404440000800000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000060600 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000006066666206680666620666666620222240000800000000000000000000000000000 00000000000060000000800800000000000000000000000000000000000000000000000000000000 00000000000000000000000040800680400040000400000000000000000000000000000000000000 00000000000000000000000000000000000000000040000000000000000400000000408040402000 68006200000000000000000000404444444200202604020226068088800048606660000060000404 44800000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000002026066666680666662 0662022240222 The explosive property of red timers can be very useful sometimes. Be careful, the time limit to this puzzle is very tight Puzzle Indiana The blue block is the key. Very good. Big bang That was close! Finding your way Those things don't want to help, but they might be forced to. Happy holidays! Deception When options are limited, reuse as much as possible. The pushers' maze Yellow tetraominoes Should keep you busy for a while. There are irregularities in the marked area, analyze them. Congratulations! Spiked fate Those guys are not as smart as they would like you to believe. Hope you had fun. Double bot trouble Apply the right dose. 00000000000000000000800000020222000000080000006000006000000020000000000080040000 00020400200200608008000400000608000000008000002002600860040448088840420222224022 22222000000000200080888888888888888886060080000000006006204000000000004860002060 00080888000000048000680000006000068080004000000000000000000000000000000000000000 40000080004000000000000000000000000000020222200000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000060080880000600026068088840408004000000000 00000000000000000000200000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000202220000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000068 08800002606808884044408040000000000000000000000002020000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000006000000000020002000000606666666600000000000000040000000004000000 00400000000400000000400000000040000000400000000004000000040000000000000000000000 00400008000000008000020220006800800000600062004008400202200002002000000000004002 06000000000600000004000400000000808880000000000000000000000000008000000000080000 00000000000000000000000000000000000000606660000000000000000002000000000606600000 08088800000000400000000000002404480888408880004804020020026066620006068404444440 60680888404020222000800606000000000020224044408402002000600000002004004004000020 00000000040020222222222008088888800606600000006060000040202606666026808884088606 64044202240204444480048606666662000600804860402048004044444400040020222222200000 00000000000000202222222220000000200000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000008080000060 60000008000006000000000000000000000000404440606000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 06000000040440000060660000000404006066640444000000000400600000000000060000006000 00000000000000060000000000060000800004000004040020000404000020040200000000202000 00000020000000000000800000600004000000000000000000000000000000000000000000000200 00000000020222000002000000000000000002000000400000000680888880008000600600000002 00000002000000006066000000000060660000000000000000000000000006066666000000000606 60000000000000000040444444406066666666600000000600000000000000040444444444440080 60620008040426066666666666040444440000000400040040440000004206066666600006066000 00000604044444444444860666666800000006060000000000000020008040420260666666666660 40444444444448606666666666666404444444444000800000002400860620008040442606000000 00202606666666404444440000008084808606666404444444444080006000020000000004020002 00000000400004040006000000408008000000040004000000020000000008000800008000000000 00080040000000000008600000000080888888800008088888000000000000020222220000080888 88800060000060020200000000800000000000000000000000000000000000000000000000000000 00000000000000000080600020004260660000000000060000000000000000000000606600000000 00000606666666666666040444444444400004000086060020000800400000000402000000006066 66666666600404444444444400000000000400008606200000080404200000060666666666666000 00000000404444444444440000004008600606280000402080404200000000060666666666666666 66600404444444444444400008606020080404420000000000000000000000006066666666666666 66600004044444444444440040004000008000060602008040442000060666666666666666666666 00040444444444444440000400408606000020008404020000000006066666666666666666666666 00000000040444444444444444440000008060600000000020008040004020606666666666666666 66660404444444444444444444000086000000040200268066666664044444808840200204206066 66666666666666666664044444444444440000000000000000004044402000680000060666666666 66666666660000000080000060600002000008000400040202220404444444444444444444440000 80800040000402000200000202200002000020006000000060006000000000200020000600060000 60000200020606666600808008088888886088888800020240060666666666666008400606620266 8088404204420222222222220008400606680866202 Bad news: The star is now impossible to get. Good news: The rest of the puzzle has become much easier to solve. Houdini The perfect key combination, a good magic trick and defeating both time and space! Having fun? Try the level editor and create more puzzles. Complexity Red herrings may or may not be present in this level. Maybe this hint is the red herring. Hmmmm It was easier than it appeared to be, wasn't it? 0000000000606806666666620226040020000000000000000008088002022000000000000000 0000000000000000000000000000000080888800000002000000000000000000020000000000 0000002020000000000000000000000000000080888000000000000000000000000000000000 0000000000000000000000000000000000000000020404444024044440800000000000000000 0000000000606666680888040800800800000000000000000000000000000000000000000000 0000000000000000000000000000000000020002000000000000000000000000000000008006 0666600000000000000000000000000000000000000000000000000000000000000000000000 0000020200000002000040000404000060600000000000000000000000000000000000000000 0000060600800000020240000020222222222222222222222222222222222222222222222222 2222000048080000008000000000000000006066000080000000000000000000000000000000 0000800000000000808880000000020200808880000000000000002022222224044860062006 8088888000000000000000000000000000000008088000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000860000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000040000020 0000000000000000000000000000000000000000000000000000000000000000000000000080 0400000000000000000000000000000000000000000000000000000000000000000000006000 0200000202222200000000000000000000000808000000800000000000000000000000000000 0000000020020000000000000000000000000000800000000000000000000000000000000202 2404202240480888888000000000000000000000000000000000000000000000000000000080 8880000004806066000000000000000020000006066808000000080888000000000020222224 0004860026808888888000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000808008088860800000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000400200000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000008400000000000000000000000000000 0000000000000000006000002000000000000000002000000202222220000000000000000000 0800080000008000000000000000000000000000000000000202220040000400000000000000 0000000000606808800000000000000000000000020220000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000040202220000000000008088800000000 0000000000000000000000000000000000000000060666666000000000000000000000000000 0000040444444202222222222222222200606600000000000000000000000000000000000000 0000000000000000000040480888860666666600000000000000000000000000000000000000 0040444440000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000006066666000000000202226 0666804040202204046066680666000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000004044444448088884444420444444400000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000060608000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000008000000200000000000000000000000000000000 0000000000000000002020000404420222220000000000000000000000000000000000000080 8888888888888888888888888888888888888606666666202220060666666666604044444444 4444260600000080040008088404400000000000000000000000060602020040000680000000 0840444026066024044480888888800000000000020222220000606620040026080006840440 0248008060662060400000000000000060666808886088888408404084088404202222222240 0400000000000004044444000402060666806666660000000000000000080880000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000002000000000000000000000000000000000000000000000000000000000000000 0002022220000000000000000000000000000000000000000008088000000000000000000000 0000000080800060000000000000000040000000200000000000000000000204044444202200 0000000000000000000000000000000000000000000000000000000000000000000000000006 0000000000000000000000000040440000000000000000000000000000000000000000000000 8000000000000000002022206066000000080000000000000404406002006060808000000000 0000000000000000000000000000000000000000000000000000000000000000000000000800 0200000000000000000000000000000000000000080888020222224044486000060000060000 0000000000000000000000000000600000000000080000808800000000000000000008000000 0202222402240444860666668088888408888800000000000000000000000000000000000000 0000800000840000000000000000000000000000000000000000000006000020222222200000 0000000000008088000000000000000000000000000000000000000000202224044000000000 0000000060000084020000040000060200000000000000000000000000000000000000000000 0000000000402020600000000000202606000000000000000000000000000000000000000000 0800000808880000000000000000000000606000000000000000000000000000000000000000 0000000000000080000000000000000000000000000000202222222222222222222222222222 2222222222240406080840060666840444000000000000000000000000000000000000240008 0800006000060600000000000000000000000002026000000000006066808888888888000040 0480000000240404400080600000000206066040448606620000004044840442600006000680 0000000060600000000600020222220004000000204080000600000084004000020060660000 0000000000006066808888800002022220000000240480060026080888888800020222224044 4420000000000000006800060000200000000000000000000000000000404444000000000006 0600000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000080000000000000000000000000000000000000000000000000000 0000400800000000000808888880000000000000000800000000080000000000000000000000 0000006080000006800060608060624000000000040040240040840020000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0606600008004002040000004000000000000002008000000000000000000000000000000000 0000008000000000200000008000000000200068000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000200040000000002022000000000000000000000000000000000000000000000000 0000080880606680666806666620222220400000000000000606808860666666666600000000 0004044444444400006066666666000000000000000000600000020226066000000000000004 0440444444804444444444002020004002022222040040000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000606668088040444202442 0444442000008606680666662022220040040000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000404440000000000000000080 0800020226066000000000000004044808040086066600004044202260668040442048088408 6000000000000600040202260666684000000002404448088600800600000000620006080060 0200000000000000408040442600000000004042022606660804000000002040448088860660 0404420226066640444406066804042048088408606000000000000400200000000040444420 0020002002608088000408600000000000000000608000060000002000000000000000000020 0008086000806066600000000000000002000000000000000000002000202200000404440000 0080880808888880408000000008000068000600000000000006002000000000000000000000 0000000000000000000008088040400202040202240222000008040000000000000000000000 0000000000000000000000000008606800000000600000000006200000000080000006066206 6666666666202606668066662022222000000840400000206066662066800068004044440000 0000000000000000000060000000020000000000000004004000000000000606000000006808 8004000400060202222226022222240440000808000600600020606808888804042022404486 0666600000202222000000008088884044444444444444202240444448080608006062026066 6666666666666662022200000080888404444444444444448088404426066666666666666666 6620222008088840444444444444444444442040000000000000000020004040000020222220 0000020062002400808888000000808000000000008000800000000008000000000000000000 0000000000000000000006066000000004044202222222222222606666666666808666666000 0000260666000080860600000008000000000000000080888888888400400024004260806000 0000000000000000000006000002000000040020222000000200000000000000000000808888 8040040200000000000000000000000000000000000000000000000000000000000000000000 0000000000060008602022222222200000000000000000000000000000000008000000000000 0000200000000808888800000002000000000200000200020000200000000000000008088888 8000000000000000000000000202222208088880008000000000000000000000860620666206 6202602222240222240444480080080000000202260666808888608888840840840408840000 4020000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000840800000000000006062062066206206202222402222404448088444444444 4606620404860666660000000000400000000400000000040000000000004000000000000000 0000000000000040000000040000000000000400000000000400000000040000000000000400 0000026068088888888888400860668066666620240444448048606666666666666660000000 0006002606804000000000080000000000000000002020006060000806062000000000000200 0004000240420222404422240422224022220000004044448088444444420444400000000000 0000000000000000000000404444480444400020400040000008000800000024008000000000 6062066620224042222404226066666666666666620222404448044444442024444202222404 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 000000000040480888800000000000000000000000000000800000006006080886 Contradiction Some explosions are inevitable. The key to the puzzle Good work! You'd probably need more keys than you think 000000404444444444444444444202260666206666662404444444804448088886066688888020222260666666660000000000000000000000000000000202222222222222222222222222 222222222222222222222000000404444444444808800404444444448088888608888404202606666666604044444442024420222260666666666666666640444444444444444444444808 888888606688860666620666808866662022224022402224022240444448080000000000000080888800606808860000002022000000860840420260666040444000000000000080860888 000000000000000000000000000060000020220000080880060202206800020408080400020260668400000480480606200000260200000040444008402022222040020226066666000000 000000000000000000000000000000000000000000000000000000000000000000000000000040444444444444444448084008088888000000000000000000020222222200000000808880 000000000000000000000000080888800000000000000000000000202222260666662066666668404444444000000000000006066666680888888886000408088860660000008004000840 200026240448040202222220006240444444444000000000000000000000000000000000000000000008088404444808000000000020000000000000000000000000000000000000000000 000000000000000000000000000080880000000202200008088888606680000000000004042022222240222200000000000000000080888800000000000000000000000000202220002020 000000006066668404400000000000000200000008400240808888800202222060620666668404444240800680060002000004044000000000606660040444480860666666666666666660 202000000040444444808880000000000000000000000000000000000000000000000000000000000004040000000000606202222004044060666666660000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004044444444444444444808888880000000000000080 606680666662022200062020000000000000000000000000000000000000020020000808000600800000000000000006040206002060600000080004004008004020606206660000000000 040448000000000000000000000000000000606600000000008060020080606620404444804440200040420222404440800020606666660008002022404444444480888606620804044260 806202260600404420222602222606662022240422222402222226066666040444444444444444444444444808888888860666666806666666000000808800000000000000002022226066 666202224044222222226066666666620222222222240444444000002022000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020240444222222606666666666662020000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040 400000000004044444444440808800400000060666666600804202222006060000000040442000000000000060800606600000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000808040444444444444420444448088880002022226066666600000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000006066666662022666660008000000000000000000000000000000000000000000000000000000 002020000004044808888860886066668888606666666688000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000040444442044444420222420222420442022222260000000000000000000000000000000000000000000000000000000000000000000000 000000000000408088888608860666888860666666666000000000000000000000000000000000000000000000000000000000404444440000000000000000202222222240442222222222 260666000000004000808000000000000000606600008080060000808888000000060080068000600202000060000006000000200004 Savage stuff One area is optional. Was it fun? 0000004044442026062026660000040808844420400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000040400002020000000002022240446066660000000000000000000000000000000000000000000000000000000000000000000000000000000000000008088860 6680888666666600000000600006060002022602226022222226022000002000000000000000008000800040444804444808800000000040444440000000804044000000000000 0000000000000000000000000000000000000000000000000000000000000000000040440000060000000000000060000406066620222200000202602404004204444202240006 0680860888886088860666666660000000000000008088888840400006060000004000000404400000000000840442044804442022222222000000000000000000000008000002 0002000000000086004080080006002006000000000006000000408000002608002600000008000026000002000062000000000000000000000000060000000000000004040000 0008404480888800000606662066666666806662022662022200000002080800000000000080008008004000404400840442044480444202200000002060620000062006006006 0806080000000000200000000000400000000000000000000200000000000004044000084044204000000068000000000200040040004000800000000000000000000000000000 0000000400620024080400020020000000000000206066666666666666680008000000000400000004000000000000000000000040000000000000000000000800000000000000 0200000000000606680888000202222222040000000000000000000000000000000000040444000000000000000000000000040444400040444000000008000008000606800606 6000000000000000404442022240226066666600000004044400000000040000000000000000000400004000000000000800000000000000000000000008000000060660000000 0000000000008000060668088888800000000060666206666666806666200000600800060000000000000000202222000000000000000000000000000000000000000200000000 0000000040000004000040000000000000000000000000000000000600000000000000006000000060000600008080000000000000080000800080404444444444480444204448 0444202226020000602020006260668000620042000600000000000006000048040448044000000060000040420444202402222224022000000404400000404440000000000004 0440000000040444400000000000000008088000000000000000000000800000000008088888000000606660000000000000000000000000000000000000000000000000000000 0000000000000000000000000060660000000000000000000000000000000000000000000000000000000404000000040202222222222200000000000000000000000000000000 0000000000000000000000000000000080888886066666200000000000000040840004040000808404444420220000008000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000200000060000000000004002000020000600006060000000600000000000000000080800808000000000000002400006000 0080800000000404000040440000000000204042020000000200000000000000080600000404420206066600000006060060660002006000000000000000000000000000000000 0000000000000600600000002400060806000000000000000000000000000000400000000200000006066000000060600060600060000600000000000000000000000006000000 0006000000004800080000600000000000000400206000004086004000202222600000080880000260000048000000000000004000600000000040000020000000000000000000 0000060008000000000000000002000000000000000000000000000000000000000000000000000020000000606000000600000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000040000600000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000008000000000000000000040000000800000200000000000000000000000000000000000000000000000080000000000000000000000000000000 0040000602000000000000000000000000008004000000000000000002000000620000020000000000000000000080080000002022200000000000000060600000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000020000000000400000800008400000000000060 2022220000000006000000008600000000000000420000086000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0404448040000000000006066000002020000040006066600000000060600060666000060660000060600006060000600000000606000060600000000080000000000000000200 0600000002000200040000400000000000000000000000000000004000000000000000000000606660000000000000000000000000606600000002026022200000808804044444 4444202222404226000002004800000000000000000008000000806066008000000020400000000000000606680000000080080000606666806666666662020062020040440020 2000000000000000000000000000000000008080000060620226662002400680000000000008404000000000000000000000000800000000000000260004080000808008000000 0004000004044400000000000000000000000000000040000000000000000000000000000000000000060000000000000404444202224042260662066600000008060000006000 2000000000000000020000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000202222200000000000000000000404444480800060620266666680800020404 Dilemma 000000000006062066668088666660000040444000000000000000000000000040000000000000000800000000 800000008000000000600000000000000600000000000600000000000000000000000000060000200000000000 000000000000000000000020000000000000000000000000000000000000000000000000000000600000020400 000000000000000400004000000400000000000000000000000000080000000000000000000000000000000080 000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000 000060000000000000000000000000000000000000000000000000000000000000000000000000000000600000 000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000 000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000 000000000000000006000600000060020006000000606660808060666600080084044444444444444400000048 008606666666000080888000020222222200000000060666666600000006202222000000000024044442022222 240444444446066666666666666000000000000000000000000404448088888606666808404444444444444444 808606666666666666666680884044020000080404400000000004044440204000000000000020222000000000 606666666000000600202224044444202222220004044000000000000004004040004080004000000040000000 000000000000000000000000000402024044444840420222222404808886080000000000000000000000000000 000000000000000000000000000800000000000000000000002000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000080080080000008000040444440 000000000000000080000800606600000000000006066668000202222404222222240226066662066666666000 002022240400000000800400600800000000000004020224048084020224008000000084044480886066662000 000000606666666600000000060000000000000000000000020000000000200200000000000080000000000000 000000000000000000000000006060000000000060000000000000000000000000000000000000000006006066 600000000000000000000000000000000400004000000000000006000000000000000000000000000000000000 000000000006000000000000000020020040444480888800000000000000000000000000000000000000000000 000000000000060666600000000000000020020400004044400000808880000000000000606666000000000000 000000000000000000000000000000000000000000000000000000200000404442408000000024040060600000 000000600000000000000606000000004000000600000000080880000000000000000000000000060600000004 000000000000000000000000000600600600000000000000600062000000000000000000000000000000000000 000000000000000000000020640080000008000004044400000002020404444808448044448060666668066666 680888886066000000060600008008000404444444444444400040004000800800000040000000000000000004 000000000000000000000000000202000000000000400000000000000000000000000000000000000006000000 000000000000000020000000000000000000000000000000000000000000000000000000000460000000000000 04044480000260666000008088800060002 Hope you enjoyed it Open your eyes " 5"5ell U 5 2| 5B be*e*>" 2e5ell Ub e 1 1|5 5 bee*e>" 5"ee eeee e" " 0| 5555555555555555555555555555 ]]> Although darts are fast, they are not the brightest monster. They will just charge towards you without regard of their good being. Enough with the magnets! Sometimes a sub-puzzle is not just a sub-puzzle. You win! Remember that you can use anti-magnets to push mines against walls. Note however, that most of the walls inside this section are resistant to explosions. The four seals Face to face! I know, too easy, right? Escape from blob prison The blob saga begins! Better to be safe than sorry. Awesome! Duels of fate Time your moves and you should be just fine. That's awesomesauce! Take them out Protect your yellow blocks. xye-0.12.2+dfsg/levels/logo.xye000066400000000000000000000132331225403634500163070ustar00rootroot00000000000000 Logo Vexorian It is the official Xye logo! Logo LOGO Vexorian Congratulations! xye-0.12.2+dfsg/levels/microban.xsb000066400000000000000000000365621225403634500171420ustar00rootroot00000000000000 ; 1 #### # .# # ### #*@ # # $ # # ### #### ; 2 ###### # # # #@ # # $* # # .* # # # ###### ; 3 #### ### #### # $ # # # #$ # # . .#@ # ######### ; 4 ######## # # # .**$@# # # ##### # #### ; 5 ####### # # # .$. # ## $@$ # # .$. # # # ######## ; 6 ###### ##### # ### # # $$ #@# # $ #... # # ######## ##### ; 7 ####### # # # .$. # # $.$ # # .$. # # $.$ # # @ # ####### ; 8 ###### # ..@# # $$ # ## ### # # # # #### # # ## # # # # # # ### # ##### ; 9 ##### #. ## #@$$ # ## # ## # ##.# ### ; 10 ##### #. # #.# # #######.# # # @ $ $ $ # # # # # ### # # ######### ; 11 ###### # # # ##@## ### # $ # # ..# $ # # # # ###### #### ; 12 ##### # ## # $ # ## $ #### ###@. # # .# # # # ####### ; 13 #### #. ## #.@ # #. $# ##$ ### # $ # # # # ### #### ; 14 ####### # # # # # # #. $*@# # ### ##### ; 15 ### ######@## # .* # # # # #####$# # # # ##### ; 16 #### # #### # ## ## ## # #. .# @$## # # $$ # # .# # ########## ; 17 ##### # @ # #...# #$$$## # # # # ###### ; 18 ####### # # #. . # # ## ## # $ # ###$ # #@ # # # #### ; 19 ######## # .. # # @$$ # ##### ## # # # # # # #### ; 20 ####### # ### # @$$..# #### ## # # # # #### # # #### ; 21 #### # #### # . . # # $$#@# ## # ###### ; 22 ##### # ### #. . # # # # ## # # #@$$ # # # # ### #### ; 23 ####### # * # # # ## # ## #$@.# # # ##### ; 24 # ##### # # ###$$@# # ### # # # . . # ####### ; 25 #### # ### # $$ # ##... # # @$ # # ### ##### ; 26 ##### # @ # # # ###$ # # ...# # $$ # ### # #### ; 27 ###### # .# # ## ## # $$@# # # # #. ### ##### ; 28 ##### # # # @ # # $$### ##. . # # # ###### ; 29 ##### # ## # # ###### # ## #. # # $ $ @ ## # ######.# # # ########## ; 30 #### # ### # $$ # #... # # @$ # # ## ##### ; 31 #### ## # ##@$.## # $$ # # . . # ### # ##### ; 32 #### ## ### # # #.**$@# # ### ## # #### ; 33 ####### #. # # # $ # #. $#@# # $ # #. # # ####### ; 34 #### ### #### # # #@$***. # # # ######### ; 35 #### ## # #. $# #.$ # #.$ # #.$ # #. $## # @# ## # ##### ; 36 #### # ############ # $ $ $ $ $ @ # # ..... # ############### ; 37 ### ##### #.# # ###.# # $ #.# # $ $ # #####@# # # # ##### ; 38 ########## # # # ##.### # # # $$ . # # . @$## # ##### # ###### ; 39 ##### # #### # # # .# # $ ### ### #$. # # #@ # # # ###### # # ##### ; 40 ##### # # ## ## # $$$ # # .+. # ####### ; 41 ####### # # #@$$$ ## # #...# ## ## ###### ; 42 #### # # #@ # ####$.# # $.# # # $.# # ## ###### ; 43 #### # @# # # ###### .# # $ .# # $$# .# # #### ### # #### ; 44 'Duh!' ##### #@$.# ##### ; 45 ###### #... # # $ # # #$## # $ # # @ # ###### ; 46 ###### ## # # ## # # # $ # # * .# ## #@## # # ##### ; 47 ####### ### # # $ $ # # ### ##### # @ . . # # ### # ##### ##### ; 48 ###### # @ # # # ## # .# ## # .$$$ # # .# # #### # ##### ; 49 ###### # @ # # $# # # $ # # $ ## ### #### # # # #... # # # ####### ; 50 #### ### ##### # $ @..# # $ # # ### #### # # # ######## ; 51 #### # ### # ### # $*@ # ### .# # # # ###### ; 52 #### ### @# # $ # # *.# # *.# # $ # ### # #### ; 53 ##### ##. .## # * * # # # # # $ $ # ## @ ## ##### ; 54 ###### # # ##### . # ### ###. # # $ $ . ## # @$$ # . # ## ##### ###### ; 55 ######## # @ # # # # #####$ # # ### ## #$ ..# ## # ### #### ; 56 ##### # ### # $ # ##* . # # @# ###### ; 57 #### # # #@ # # # ### #### # * # # $ # #####. # #### ; 58 #### # #### #.*$ # # .$# # ## @ # # ## ##### ; 59 ############ # # # ####### @## # # # # # $ # # # $$ ##### # ### # # ...# #### # # ###### ; 60 ######### # # ##@##### # # # # # # # $.# # ##$##.# ##$## #.# # $ #.# # # ### ######## ; 61 ######## # # # #### # # #...@# # ###$### # # # # $$ $ # #### ## #.### ### ; 62 ########## #### ## # # $$$....$@# # ### # # #### #### ##### ; 63 ##### #### # ##### .# # $ ######## ### #### .$ @ # # # # #### # #### #### ##### ; 64 ###### ## # # $ # # $$ # ### .##### ##.# @ # #. $ # #. #### #### ; 65 ###### # # # $ # ####$ # ## $ $ # #....# ## # @ # ## # # ######## ; 66 ### #@# ###$### ## . ## # # # # # # # # # # # # # # # # # # # # ## $ $ ## ##. .## # # # # ##### ; 67 ##### # ## # # # #@$*.## ## . # # $# # ## # ##### ; 68 #### # ###### ## $ # # .# $ # # .#$##### # .@ # ###### ; 69 #### #### # #### # # # # # # # $## # . .#$ # #@ ## # $ # # . # # ########### ; 70 ##### # @ #### # # # $ $$ # ##$## # # #### # .. # ##.. # ### # #### ; 71 ########### # # ### # $@$ # . .# # ## ### ## # # # # # # # # # # # ######### # # # ############# ; 72 #### ## ##### # $ @ # # $# # #### ##### # # # # $ # # ..# # # .#### # ## #### ; 73 #### # ##### # $$ $ # # # ## ## ## #...#@# # ### ## # # # # # ######## ; 74 #### # ####### #$ @# .# ## #$$ .# # $ ##..# # # ##### ### # ##### ; 75 ####### ## ....## # ###### # $ $ @# ### $ $ # ### # ###### ; 76 ##### ## # # ##### # #.# # #@ #.# $ # # #.# ## # # # ## ##$$# ## # # #### #### ; 77 ########## # @ .... # # ####$## ## # $ $ # # $ # # ###### ##### ; 78 ####### ## ## # $ $ # # $ $ $ # ## ### #### #@ .....# ## ### ####### ; 79 ######### # # # ## $#$# # # .$.@ # # .# # ########## ; 80 #### # ####### # . ## .# # $# .# ## ## # .# # # # #### # # # @$ ### # $$ # # # ###### ; 81 ##### # # # . # ## * # # *## # @## ## $ # # # ##### ; 82 ##### # ### # . ## ##*#$ # # .# $ # # @## ## # # ####### ; 83 ###### # ## # $ $ ## ## $$ # # # # # ## ## # . .# # @. .# # #### #### ; 84 ######## # ... # # ### ## # # $ # ## #@$ # # # $ # # ### ##### # # # ### # ##### ##### ; 85 #### ####### # # $ # # $ $ # # ######## ## # . # # # # # # @ . ## ## # # # # . # ####### ; 86 #### ### ## ## $ # ## $ # # # @#$$ # # .. ### # ..### ##### ; 87 #### ###### # # # # ... .# ##$###### # $ # # $### ## $ # ## @ # ###### ; 88 #### # ### # # # # # # # # # #$ #.# # # # # # # #$ #.# # # # # # ####$ #.# # # @ # # # # ## # ######## ; 89 ########## # ## # # $ $@# # #### # $ # #.# ## # #.# $# # #. # # #. # ###### ; 90 ######## # @ # # $ $ # ### ## ### # $..$ # # .. # ########## ; 91 ########### # .## # # $$@..$$ # # ##. # ########### ; 92 #### # # ##### # # # # # ######.# # #### $ . # # $$# ###.# # # # # # # ######### #@ ## # # #### ; 93 ######### ## # ## # # # # $ # $ # # *.* # ####.@.#### # *.* # # $ # $ # # # # ## # ## ######### ; 94 ######### # @ # # # $ $ # ##$### ## # ... # # # # ###### # #### ; 95 ######## #@ # # .$$. # # $..$ # # $..$ # # .$$. # # # ######## ; 96 ###### # # # # ##### # # #.##### # $@$ # #####.# # ## ## ## # $.# # ### ##### ; 97 #### # ######## #### $ $.....# # $ ###### #@### ### # $ # # $ # # ## # # # # ###### ; 98 ##### # ## #### # $ ### .# # $ $ .# ## $#####.# #### # $ # # .### # # # # .# @ # ### # # # #### ## ## ####### ; 99 ##### # # ####### ####### # # # # # # # # @ #### # #### # # ....## #### # # ##### ## $$ $ $ # ###### # # # ########## #### ; 100 ####### # @# # #.$ # #. # $## #.$# # #. # $ # # # # ######## ; 101 'Lockdown' ##### # # # # ####### # * # # ## ## # # # #* # ### # # # ### # *#$+ # # # ## ## # # * # ####### # # # # ##### ; 102 ########### #....# # # # $$ # # @ ## # # ##$ # ###### $ # # # ###### ; 103 ##### # . ## ### $ # # . $#@# # #$ . # # $ ### ## . # ##### ; 104 ##### ##### # # $ # # $#$#@# ### # # # ... # ### ## # # #### ; 105 #### #### ## ### ## # # # # # *. .* # ###$ $### # @ # ###$ $### # *. .* # # # # # ## ### ## #### #### ; 106 ######## # # #@ $ # ## ###$ # # .....### # $ $ $ # ###### # # # # ##### ; 107 ######## # # # $*** # # * * # # * * # # ***. # # @# ######## ; 108 #### ##### # ### # ## # # #$ $ # #..# ##### # # # @ # $ $ # #..# ## ## ######### ##### ; 109 ####### # # # # # # # # # @ $ # ### ### # # ### # # $ ##.# ## $ #.# ## $ .# # ## $#.# ## ## #.# ### # # ### ##### ; 110 #### # # # $#### ###. . # # $ # $ # # . .### ####$ # # @# #### ; 111 ###### # #### # ...# # ...# ###### # # # # # $$ ## # @$ # # $$ # ## $# # # # ###### ; 112 ##### ## #### # $$$ # # # $ # # $## ## ### #. # # # # ##### ### # # ## # @....# # # # # # ######## ; 113 ##### ## # ### # # # . # # ## ##### # . . # ## # # @ $ ### #####. # $ # #### $ # ## $ ## # ## # # #### ; 114 ###### # ### # # $ # # $ @ # ## ## ##### # #......# # $ $ $ $ # ## ###### ##### ; 115 ##### ##### #### # # # # #..... # ## ## # ### #$$@$$$ # # ### ####### ; 116 ##### ### # ####.....# # @$$$$$ # # # ## ##### # ##### ; 117 #### #### # ### ## # @ # ##..### # # # # #...#$ # # # ## $$ $ # # $ ### #### ### #### ; 118 ##### ## ## # $ ## # $ $ ## ###$# . ## # # . # ## ##. # # @ . ## # # # ######## ; 119 ###### # ## ## ## # # $$ # # # @$ # # # # # #### # # # ... ## # ## ####### ; 120 #### ####### # # $ ## # $##### # # @# # # ## ##.. # # # ..#### # $ ### # $### # # #### ; 121 ###### # . # ##$.# # # * # # ..### ##$ # ##### ## ## # # # #### # # # @ $ $ # ## # # ########## ; 122 ##### # ### # #$ # # $ # # $ $ # # $# # # @### ## ######## # ...# # # ########..# #### ; 123 ######## # # # $ $$ ######## ##### @##. . # #$ # . # # #. . ## #$# ## # # # # # ### ## # # #### #### ; 124 ############## # # # # $@$$ # . ..# ## ## ### ## # # # # # # # # # # # ######### # # # ############# ; 125 ##### # ## # $ # ######## #@## # . # $ $ # # $# # #...##### # ##### ##### ; 126 ########### ##....... # # $$$$$$$@ # # # # # ## # # # # # ####### ##### ; 127 ## #### #### #### # $ $. # ## # .$ # # ##.### # $ . # # @ # # # ###### #### ; 128 ######### ### # # # * $ . . # # $ ## ## ####*# # # @ ### # ### ##### ; 129 ######### ### @ # # # * $ *.. # # $ # # ####*# ### # ## # ### ##### ; 130 ##### ##### # ####.. # # $$$ # # $# .. # ### @# ## # # ## # ########## ; 131 ##### # # # . # #.@.### ##.# # # $ # # $ # ##$$ # # ### # # #### ; 132 #### # @### #.* ##### #..#$$ $ # ## # # # ## # # ##### ##### ; 133 ####### # . .### # . . . # ### #### # # @$ $ # # $$ $ # #### ### ##### ; 134 #### ######### # # ## $ # # $ ## # ### #. .# ## # #. .#$## # # # # # @ $ # # ####### #### ; 135 ####### # ##### # $$#@##..# # # # # $ # # # #### $ ..# ######## ; 136 ####### # # ## ###$## #.$ @ # # .. #$ # #.## $ # # #### ###### ; 137 #### ## ### #### # $ # # #### $ $ # # ..# #$ # # # @ ### ## #..# ### # ## # # # # ######## ; 138 #### ### # # ### # # . .# # @ ...#### # # # # ## # # $$ # ##### $ $ # ##$ # ## # # ###### ; 139 #### ## #### # ...# # ...# # # ## # #@ #### #### ##### $ ### # # ##$ $ # ### $$ # # $ ## ### # ###### ###### ; 140 ######## ##### # # ### # # ## $ # #.# @ ## $ ## #.# # $ ## #.# $ ## #. ## ##### ## # ###### ; 141 ######## # # . # # .*.# # # * # ####$##.## # $ # # $ ## $ # # @# # ########## ; 142 #### # # # #### ###$.$ # # .@. # # $.$### #### # # # #### ; 143 #### # #### # $ # # .# # # $# ## # . # #### # # # ### ### # $ # ## #$# ## # $ @ $ # # ..#.. # ### ### ##### ; 144 #### ### ##### # $$ # # # $ . .$$## # .. #. $ # ### #** . # # . **# ### # $ .# .. # ##$$.@. $ # # # $$ # ##### ### #### ; 145 ##### # @ # ## ## ###.$$$.### # $...$ # # $.#.$ # # $...$ # ###.$$$.### ## ## # # ##### ; 146 ####### ## . ## # .$$$. # # $. .$ # #.$ @ $.# # $. .$ # # .$$$. # ## . ## ####### ; 147 'reduction of (Mas Sasquatch 7)' ##### ######## # #. . @#.# # ### # ## $ # # # $ ##### # $# # ## # # # ## ##### ; 148 'from (Original 18)' ########### # . # # # #. @ # # #..# ####### ## ## $$ $ $ # ## # ############# ; 149 'from (Boxxle 43)' #### ## ### #@$ # ### $ # # ###### # $....# # # #### ## # # # $# # # # # ### #### ; 150 'from (Original 47)' #### ##### # # $####### ## ## ..# ...# # $ $$#$ @ # # ### # ####### # #### #### ; 151 'from (Original 47)' #### # # ### # ## $ # # # # # #$$ ###### # # # .# # $ @ .# ### ####..# #### #### ; 152 'reduced (Mas Sasquatch 23)' ###### #### # # # #.## #$## # # # # # #$ # ### # # # # # # # # # #### # # # #. @ $ * . # ############### ; 153 'reduction of (Revenge 306)' ############# #.# @# # # #.#$$ # $ # #.# # $# # #.# $# # $## #.# # $# # #.# $# # $# #.. # $ # #.. # # # ############ ; 154 'Take the long way home.' ############################ # # # ######################## # # # # # # # #################### # # # # # # # # # # # ################ # # # # # # # # # # # # # # # ############ # # # # # # # # # # # # # # # # # # ############ # # # # # # # # # # # # # # # ################ # # # # # # # # ##$# # #################### # #. @ # # ############################# ; 155 'The Dungeon' ###### #### #####*# ################# ## # ### # # ######## #### ## # ### #### # #### #### ## #*# # .# # # # # # # #*# # # # ## # ## ## # ### ### ### # ## # ## ## # # #*# # # # # # # ### ##### #### # # ##### ##### ####### ###### # # # #**# # ## # # #**# ####### ## # # ######### # ##### ### # # # $ #*# # ######### ### @##### #*# ##### #### #### ###### xye-0.12.2+dfsg/levels/oldtutorials.xye000066400000000000000000001743531225403634500201070ustar00rootroot00000000000000 Xye Tutorials Vexorian The old tutorials. 10 levels 10 official tutorials, try them before the real levels. Every tutorial includes its solution which you can play by pressing [s] during the game. Tutorial 1 Tutorial 1 - Get the gems Getting all the gems is not always that easy. 00000000000202222220000000000000000000000000 00060662022666666666666666666808888888888884 00680840444444444444444442060666206666662024 04442022222606206666680888860888840444606668 08886066662022222000808840444448044444202222 2260666680008004 Xye can push blocks and remove the soft blocks. Your mission is to get all the gems Tutorial 2 - Colors Hard to believe but there are many other objects in the game, let's move on. 0000000000000002000060666404806066404420222226080840486066668066666666680 6660000200206202004004080600600602002006006006080080006800404008000004004 6006006006006800800402400000240048060602060060800804200624004004000020000 0000008080400404004004806006200600600600602000204004040004008404020020200 2602400404008008060060060800800806006006006200060068008040202000624004004 0000200200000000600000000008000800080000000000000600606666666660000026008 0000204020020602000200206006006800000006006062060006800400400404080420000 8008000600600600600062002060068088888606602000000260660000006000000800000 0600808006060000004040000000000000000000000206066660000604044444444800002 0200000004044400000000000000000000000000000000000000000000000800400000062 0000200006060008606660008086060080886088860666024044202222222404204444420 2222244444444444444444860666666600000000000000000606666666808880000006080 8000000200600000000000860600006000000000000000000000000000200000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000020000000200000200000200002606666680666666 6662066666600000800086060404400606002000204044444480444444444420444444202 22260666806 The Sniper block loves to shoot arrow blocks towards Xye The Filler block constantly shoots arrow blocks towards a predefined direction Blackies are very dangerous holes that take to nowhere, avoid entering them Sometimes the answer is to die and let the game take you back to the start of the level, go towards the blacky and then get to the room that is now available White blocks are just normal blocks but there are no white marked areas. In this case one of the white blocks is blocking the path of the red arrow block, push it Clock blocks are blocks that eventually shoot arrows towards the direction they point at, of course the contiguous space needs to be free in order to let that happen. Note the differences between square arrow blocks and round arrow blocks, in original Kye square arrow blocks are called Rockies and the round ones are called Sliders Arrow blocks will persistently move towards their direction unless something blocks them Seems you forgot to leave the wildcard block in the green marked area of that room. Take a second chance, the orange portal will take you back to that room. Note that most levels don't offer second chances. Block doors/traps that start open get closed by marked areas. A wildcard block can activate marked areas of any color Block-doors get open once you activate all the marked areas of their color. Marked areas get activated by blocks of their color. Gem-blocks are blocks that act like walls until you collect all the gems of their color Gem-blocks can also activate marked areas, in fact every kind of block can activate areas of its color Block-Traps are similar to Block-doors but they only require ONE of the areas of their color to be active Portals can take you to another area of the level when necessary. Round blocks are just like the square blocks but they are able to slide on other objects' round corners. Everything is ready, you just have to get back to the room that was blocked by yellow gem-blocks and push them to get the emerald Tutorial 3 - Just in time Note the way different color also means different behaviour 0000000000000000000000000000000000000000000000000080000000000000000202222000004044808888886066666000202222222240444444808800000000020260666666680888880040442022222260660000808000000400004000404006066666040444444400006066666040444444444000000000000000000000000000000000000000000000000000000000000000000000000000000000000606666666666666666600202240444480886066200042026068088888888000000404442022222222000000008088888000006066620222266666404808886000000000000000000000000202222222224044444448088400000002022220000606666600000008080000004044444444400000000000000000006066666660000404440000000000000000006068088888000000000000000000000000000000000000000000000000000000000000000000000000000020220000404440808886066666202666668088404444444444000000000000006066660040444008606666666662022240444420222222260666666000202600000000080060080008060000000004000000000000000000000000000080886000000006000000000202000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000040400000000000000000000000000000000000000000606660000000000000000000206066666808888002022220040400006068088888888888606668066620000000000068000000860666400000000000200000000000020220000000000000000000000000000000000000040406066600000006002060680666404204444804444446066660000202040444000000060000000020222222000002606666680888888888400020222200000020240444080404420600000000600000000000600000000060000060000004040000000000000004080860060000006200080002002000808606020200000000000000000004000080004008000400000000000004004002000206000600000000000000040000000000000000600800000600000000000000000080000000000002000000000000000020000000000000000000000000000000606000804040000000808800000000000000000000000000000000000000000000000000000000000000000202222240444 The pusher blocks are able to push pushable objects, their yellow kind bounces after it finds an obstacle. The green version turns anticlock-wise, the blue version clockwise and the red version does not push, it just waits till it is able to push the object that is in front of it. Now this seems like a problem that could be solved by the magnetic blocks. You may need to disturb the balance in that room with the green pushers in order to fix this problem As you may have noticed, pushers are able to move blackies during their *eating* animation. Just get the diamonds, that magnetic block might be useful Blue timer-blocks are just like the yellow ones but take way longer to vanish In this case you might actually need to restore the balance... Timer blocks exist until their time expires, you can tell the remaining time by looking at their number, in moments like this one when you have to wait you can always use CTRL , our fast forward button Green timer blocks take as long to vanish as yellow ones, but their self destruction process requires Xye's activation. Tutorial 4 - Surprise! Things are getting interesting aren't they? 0000008008000000006000060000000480000800806000000000000080000000006000060020002020060000000000000000060000000000006060000000006000008008088860660200404020020060666620222222040444440000040200020000060020020002040000608000800400000000000000000000004000000000008000000000000040400000000020000000200000000000000000000000808888000000606666666620222240400008000200006800400002402006840024020222260680606000404806060002404006066668040440840200000804044444000020400040004000000000000000000400004000400040000000200400400400808800080600060060000000000000000000000000000000000000000000000000000000000000000006068066668088884044420222260666222404020222000200606680000480000600000808884088888888000000000000000000000080000040000000020000040200020000200400040040000006080000240804060006800000000404000000000600800048088840006060002000084044440020040440002480000202222606 That is a teleport, it can help you get to another teleport on the same row or column that faces to the opposite direction. Clocker and aclocker blocks are able to change the direction of arrow blocks. They act as normal blocks otherwise. Surprise-blocks do not transform when they are moved by magnetic blocks of any kind You can push teleporters. To get out this place move the teleport to align it with the disabled teleporter outside the room Toggle-blocks are either + or -, the - cannot move and if you push a + one every + block will become a - block and viceversa. One-way doors are sections of the ground that only allow Xye and bots to enter, but they only do so in a specific direction, otherwise they act like walls Tutorial 5 - Safari Each beast has a unique personality, sometimes the differences are obvious, sometimes they are not. 00000000202220000002006000600000000000000080040442022200060408088886062022224026000404808006040808860620222224026060000404480880000060408080062022224026066640448088860202224022606666660000006000000000000600020000000000000000000000000000000080000400400800000800086066666620260660404448088404444420220000060660000202240422240444444000040040040000000000000000000000000000000000000000000000800000000200000000008404444444000000400606666600000000060000000000006066206666666668088040000408088606666000002000000080000040000004002002000060000000006000000006000000000060000000006060000000060000006000000060000060000600000006000006066808404440000000040440202220404444444000200000060000000060000000000000000020006000060020020060008086800040040004000040000000000000000000000000000000000000000000000000000000040000600060000600006202226008088068084044444000000000040440000004008000000000008000000080888888800000000004000000000000000000004060202222222240606666666808888600000040080000008 Teleporters can only be pushed towards their opposite direction when their exit is either missing or blocked, you can use these blocks to block that teleporter's exit by pushing them through it. First make sure you will not need to use the teleporter again. Beasts can some times be really stupid and strike towards land mines or blackies and die. Land mines are objects that xye when it steps above them but they can also destroy other objects - and themselves when they are pushed on them Portals are a great way to escape from monsters, Xye is the only one in the whole game who can use portals Rattlers love to eat these strange blocks, too bad that rattler is blocked by that arrow block, if only we had a red key... Be careful when unleashing the rattler, cause those things also love to eat xye. Tutorial 6 - Shoot 0000000000800000800404420200000600206066662066666800008400080008040000000000004000000000800260080004008000004008080006006000000000060000060068000808008008060006240008402000020000000200000002000000000400040204004080000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000408000600000000000600000800000800000000000000040004004002000000000000000000600000000000000000000060000000000000000000800006066660002000000006000600002002004000000000000404200402000000000400200000200006000600000060000400080004008042006204000000000000606006000006000000000000000060000000000000008000000000000800000000000000008000000000000000000000000000000000000000000000000000000000000000000800000000000000808880000008000800000202222222000020404000080880048060666206808888800000080020222222000040444486066666206808888880002022222224044444480060666666206808888888000202240400804004000800400400800000000000000000000006000000000000000000000200000000000000002040040000020000000000000000002000020000000000000000000000000000000004000000000000000000000000000000000000000000008006008088606608088000000600006000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000040800000000000000000000600000000000000000000000000000040400202240422200404020000020004002000200200040020020060004806000020002402002060048060008006004806000402000202006048060000800604860004020020200604860000008000600486000004200200200600048000000600002022240444448000806066666806620222402606660004040808608888886 Window-blocks are also able to activate marked areas of their color. Blackies are unable to absorb any object during their 'eating' animation Window-block are really special blocks, you cannot move any of them unless all the window-blocks of its color have a block of the same color in an adjacent place. You have to shoot the green dot-blocks, be careful with the pusher This should not be difficult, you know about mines+anti-magnets and you also know enough about window-blocks to be able to solve this one It is possible to move mines using magnets, it is even possible to use mines to destroy non fire resistant objects like most of the walls are Try moving that toggle block and see what happens Tutorial 7 - Kaboom Red is probably the most dangerous block color 0000000000006006080008400808008000020020000620002020400486006006200006808888000002022200000040440808888000000002000000040000000808606000000620222606660040440080880404440020606600000806020042606600404000000804044000020606666600080060000006800000020040000000000000000000000000800006000000080000600000040020000000000020000600000000000000000000000000600060000000000000000060000000000600000000000000000000000000000000000000000000000000000000000000000006000002022222000000000000000000000000200000000000000000000000000000000002000000000000000000000040444000060666808888888000000000000000000000000000000000000000000080000080040000800080008020222200000000000000608088880002022222222222220000020040000000000800060800608088888800000000000040000200020040200600000000000080080000002000006020002040080800606680800000404444444400040400804020004260660040444400000408606000202222200080888000000060666666608040040204044444000000408060600020222200080880000060666666660804004000020404444444444080600000600002022220000000800000200606600000000000000000000000000020222220000000006066000000060000000000000000600600000000000202000006000606200006000000400420000060000000060666000600060600000000606666666008008040200062404444444444000000840444400000000426066666200680888002022240444448606666666200000006808888000000000000000000000606666666000000000000000000000002000000000000000000000000060666080800004044402040800060660000840004000000000000020006066680404444444444444000200020040444400000408088400000400000000040444408088888040000004002002004020020060666660000000000808880404444202222042060666666000000404000080888040444202222402000060666666620600080048606666666668084040606080888000004 Ground stamped with force arrows will not allow anything to enter unless it does in the direction specified by the arrow The red surprise blocks explode whenever an arrow or scroll block hits them Try making that red surprise-block explode Aclocker and clocker blocks are able to turn scroll-blocks when you push the scroll-blocks towards the aclocker/clocker. Do you have the key? If so better think twice before using it. Tutorial 8 - Kaboom II 0000006800404420260200002026066600000620606680602468000062060666000008080404000080000200200062040004080004040002022000808800000600000000000000000000040800000040000800000400408000400004000000000000000000000020224022224044480860666808860666666808608084044080008400400408420008060666800000000000000000000020080000000000000200020020000000606666800086066404204024044444000000000040080000000000000000000000000040000000000004004808008000020200260006800000000000040000000000020624004080402008088888840444202606600404480600060800600600200000000000000000000000000000000000000000000000000000000000000000000000002000000000200806066666666666680062060680840206066666680620004044444044480404426066666666000600086000202222000000600000000000000000000000000000000000000000000000000000000000000000000000000000000000404444444444020020020000000000020600200000006006200020006006000026 This is the kind of puzzle that is solved BEFORE entering its room, if you cannot solve it just skip the level by pressing + or N , it is perfectly legal Round objects behave different to the other objects in many different situations. You should be able to use a bouncer to push the red timer and destroy the wall. hiddenway squares are like combinations of oneway doors, it is simply impossible to know which entrance they will allow. The red timer-blocks do not just vanish, they explode and their value is decreased when they are pushed instead of periodically, be careful with those. Tutorial 9 - Fire balls and Bots Bots can be your greatest friend or your greatest enemy, it is a good thing they do not have any common sense. Bots base their moves on your own and also consider if the squares that sorround them are blocked 000000000020002060006800800068000800008000000000000000000040444448088880000008004000602002002002002002060060000000000000000000000000000000000000008040004020020020006202222222260000600000000200002060060060600400408060006006000000800006200804044444260666600000006008062000004040002000008006006200080000040400200000000000006006000800000600000080000000000000000000000000000000000000000000006066000008088806062024040000202000020000000606620222222000000000200000040000000400040000008000000000000000000000000040000000000000000000000000000000000000000000000000000000060000000000000006000006006000600000000006060002020020000004044444444444000000000000000004000004000020002000200020000040000060000004000006000000080000000200000040000060000004000000600000000080000002000000004000000000040000000000000000000000000040000000000000004000000000008004002002 Fire pads are marks in the ground that cause red blocks to become into deadly fireballs. Seems you will need something to block that sniper Just wait and see Once the dot-block is released go fast towards the left hint. These metal blocks are resistant to fire Seems you will need to make that bot move the yellow blocks to the marked areas Tutorial 10 - Pits and Factories Congratulations! that was the last tutorial, now is the time to browse for more levels. Try the other level files that came with the game, tour.xye for example and if you beat them look for more in the web site. 000000000000260000808860804044444442022060680860602040442026066808606204044406062060668088606020004004002048684000602026068086062040040204806840400060620226068088606200040040024080684000004000000000024080002606620606808860620000400042048608400240080000006060000200200606800606000000000000026000800486064044420206008088606002004000402040806804002408008000000000000000000000000000000040000000000000000000860666666666666600000000000600000000000800000000000000000080000000000000000000000000000000000000000000000000000000000000000000000004020404442024444444440002002000000000006002000000620600000808860602004004020408684002408000800080048060666666666660000006000060200680486000026008088004000400000000004060680884044400020404440000000000000402024044444444202224040000000200000020400000420020420226066808800000004040200000000000240442022008088888606680666202240444804202222226000040808860668088860600806008080006808606666666666808000000806066666666620220400080008000068000040444000040000400000000000080040200000000000600204000400400008040200206240444444444480402002000002040004000004000000000000000000000000000000000000000020000006000000000240000840202000000020000004202606680880404202000808606620224044480442022222260000000600006066666620240480444808888606680880006066806680888888840440200020000000200040004008040442022000020600068 Pits are somehow like land mines you can push things on them so they vanish Now we need a lot of blocks, try using that factory down there, simply press its button What's left of the level is actually pretty easy, you already know enough about factories and pits to beat it. Stalkers Dard beasts are the fastest beast of all the game, they are also the most stupid. A memory challenge! Be careful with that one xye-0.12.2+dfsg/levels/pxlevels.xye000066400000000000000000000034001225403634500172040ustar00rootroot00000000000000 phyrex1an Locker and Factory A couple of levels, Locker might require some fast reflexes and factory is a puzzle. Locker GLHF! The Factory Dont disturbe the factory >15c Hllllllbe Se 76h5 55^5va16 Raaaa8 5* 5 55^5 a *^4555553 a 1555 55^5c8 8 a 759 a5 55^553 2c8 * 55D 79 75 55^5 vL 2 5 7555555S^55 55 55^5b 5 5 2FFFF15 55 55 55^5 * s 5 K e5D 15 55 55^5 5R > c v e59 D5 55 53^5 5 755^S5 55 5d^5 s 753 5T5 5 55 5R^5R > 73 b 5T5 D5 55 5*^5e 73 b 153 c5 55 5R^59 75* c5 55 5u^55c5555555c555HHHH55D553 55 55^15555eel55555555553S<<<< 55 5a^<<<< 555a55 555555555555555555555555555555 ]]> xye-0.12.2+dfsg/levels/sphinx.xye000066400000000000000000002466431225403634500166750ustar00rootroot00000000000000 Sphinxvexorian A great tresure is kept inside the sphinx, can you solve all its riddles? Memory! Use it. : ) The next one That was ok... Patterns Three out of four portals lead to the monsters, the remaining portal leads to the gems. The clues Pay attention. Got to accept these are original levels. The treasure Kudos xye-0.12.2+dfsg/levels/tutorials.xye000066400000000000000000017625461225403634500174200ustar00rootroot00000000000000 Tutorialsvexorian 28 small puzzles intented to introduce players to the objects in the game. You can watch solutions by pressing [S] during the game. If you want a challenge, try getting the optional stars. T1: Piece of cake The objective is to get all the gems. Do not forget about walls. That was easy! 000000006062066666666662066668088800606000000000600000200200200260006800800000080008 T2: When blocks block your way You can push the blocks. Warming up! 0000000606600000000000600260660008006000600606020000200600600608000006000800000600000004080086200060668060202222404060808 T3: Shapes do matter I Round objects behave differently. Warming up! 000000000000602022260600000000060608080002024044480888860666666000000002002020000060060000206006066800000860660000806066020002 T4: Shapes do matter II The star is optional, as always. This is just the beginning. 000000000000000000000000000000000000000020600080480006060600060060060060 000020600000800800000600200006000202000060060000000008000060080060680006 0666202204020004 T5: Moving blocks around Focus on getting the gems. You can always leave the star for another time. That was just a more colorful version of sokoban. 000000000000000000000080880000202000004008088800020226066660000002022200 008008080000020200000600600040040800800602002000040480888060660000020000 000006066002000000204044400000480402020080888860660002020008060660000002 020040444000008400202000008606666666668084086088408 T6: Arrows I The order matters. 000000000000000000000002040000000000000004000400000000000060602022260660 000000040444808844400808606600004048088404444202222444200080860662022404 442200080606662022240420060808888608888884088860666688860666202226620222 260666620000000000806066202260668088840020224 T7: Arrows II Keep going. 000000000000004000000004060600000800000040444000000400000000400008404400 000040000202222606666840444420448040420606806808606800008000400000004000 0000000000000000000000000000000000680888886020000404 T8: Doing and undoing There is a whole machine set up so that you can acquire the star. It just needs energy. 000000000000000000000000000000000060666000000000000000000200000004000000 000000080404442044408088880000600062020004008040444002000200060000000800 000048000060666000000060000040444202220000006066680060660000000000200000 000000000000000000000000000000004000000000000000080040442044202224202200 002060062004000000000000000000040000808880000080060600080080606660200480 404204448088860660000000600002060006804000400400400400400200202002026066 600008060060404444202222260622606668066680666660808408860806062022 T9: Dam Notice how each of the objects behaves. I hope you are having fun. 000000000060000000068000000000000000000800808040840444460666806808888608 886066600000042000020000000000000000000000000000000002020600000000000000 000000000000000086000000002002000000000000000000000020002002020600000068 000060000000000000000000600000060000000000000000000000000000600608000404 008404444000000080060080880400202226066662002404440000000204044808880000 08000400000000000800408008006 T10: Don't lose your keys. Use keys to open the locks. Make sure you do not open the wrong lock. 000000000002000000008000606668066666680800000202222404444442022226066666 662222222602222222222602200000000020000006000000040000000000000000000000 000002000020400680888886066662022222222606808800002022240448088888884044 442022222224046066040808888886066666206666662404804444202222222260666666 0080886066620662022240442222402200000000606 T11: Meet the magnets. Use them to pull objects. 000000000404448088600000600000008000000000800020020060000008000000008000 000060666008400000002000006080866620266666664044448060662026666808602022 404444804480444420244444400080008080080608040004000204002000000400800800 606660404442020060008088000202200040480800060660000004044000000680888888 0404442 T12: Run! Look out! 000000000000000000606666666666666666680888888888888888840444444444444444 420222222 T13: Black holes Use them to your advantage.The star could be hard to get. You shall leave it for later :) 000000000000000000606660000808606660000000000000068000000000000020220000 200002040006066680840888000000800020020006066600000060200020060660000000 600020002000800000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000020404420008606008000680840444 888404444420444444444484044420444448402022240480800000006 T14: [!] Blocks 1 Notice how color can affect behaviour. 000000000000000000000000000002000060002600068008000060006000000000000600 000000000000000000000000000080000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000060000006000000000000000000 000000000000000000000004040260000000000000000000000000000000000000000000 000000000000000000002000008088006080888884044420000000062022404006066200 020002000620222602222222222404440080068084048 T15: Doors They will only allow one direction. 000000000000000606806620260000080002606600080068060666200002402020000000 260000404804044400000000402 T16: [!] Blocks 2 Those guys are not going to move. You'll have to figure out a way to push them without directly touching them... ! ! ! 000000000000040808060006040004200000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000806066666660000080888000000000606 000000060000002000060040000000200400000000000000000000000000000000000000 000000000000000000000000008000000000000000000000000000000000000000000800 000040000000400000000000000000048004040000240040008040400000004020220000 6 T17: Turner blocks Try playing with the blue blocks. 000000000000000000000000000000000000000000000000000000000000000000000000 000000000000080888888606666600000206006080000000000000040444444000002000 042022220020060666660002020060600008000000400000000000000000000000000000 000000000404444000004004008400202222000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000 0000000800404448044444444400000000000000000000000000020060666808880004 T18: Paralel universes Head towards that crazy looking blue portal for a surprise. Take a close look at how those blocks behave. 000008084048404460660080888888800000008008006800060600404408088888888800 000680060604044808888888800080480040440606600000000000000000080888888880 000200020000020002400600600060060000000800000800008040440808888886000000 080608888404 That level was full of different kinds of objects! T19: Dots and repellers Dot blocks do not stop until they hit something. 000000000000000000000000000000000000000000000000000600000000000200000000 000200000020020000080888888800000080000000000000020222000000000000020000 600600000260006800000060000000060660200600080040480800040444020000000600 020002002006000000000000008040440800000804044402000002000606660006000006 000060600000000400006000640440008006000000000000200002060660000060800804 002000200040440008000040800800600000000000000000060660000008606600000006 2000042006006800000620002400402 Great! T20: Avoiding Those things byte. 000000000000006066660000808040440000800000000000000000000000000000000000 000000000000060680866600000000000000040480860600000000000000000000000000 000000000000000000000000000000404480888000000000000000000000000000000000 000000000000000000000202404000080000000000000800000000000000000000000000 000000000000020200004048088000000000000000000000000000000000000000000000 000000002020400004020002000000000000000000000000000000000000000000008040 888000000000000000000000000000000000000000000000000000000000000000000202 24042240420222224048000060000080040080008 T21: Wildcards and one way blocks. Those are wildcard blocks, they count as a block of any color. 000000000000000000000000000000000000040004000800000000000000000000000000 000060000000080080080000600000000000000060000000000060000004044080800000 040008400000080000800600200200200200420600600604000004020020020060026000 008008008000000000020020020004000004000000080880000080886066800008040002 000204040202226000000006000080888888000202222000060808888880000020222226 066666000000024 T22 : [!] Blocks 3 Avoid doing large routes more than once. 000000004202226808840800240444448048084444444204444808606808888888860620 620600002022222222240444444442024000202206000006000606806 6666666620668066206202260660400000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000006206620668404448042024042044444444480800 00040420444420444460666666620666666620222220000804044444 4444806062408088860202606666806664044406060000808000000606624044444806 Objects that can teleport you without permission. What's next? T23: Linked blocks They need to be adjacent to a block of the same color. 0000000000000000008000000000000040606600804040000084048088888886066666600000 0202200000000084000000060040004000200000086062022060680888000 0480080608402480040004260000006006080060680606600008060888606662026668066666024 T24: Mines and pits They are slightly different. 000000000000000000000000000000000000000040000000000008080040200206202224 044860000260080888880002000204002020062024048006000002600808888880020020 000240200200602022204048060660206808884086066000040444402002060202404486 066020680888408606660000600064044444808884088888000202222226066600000600 200000600000600000400402002000600026000080480800602000420600060000000000 600600000086000080080800060000000000000000006040040000000040000002000000 000000000000000000000000000000000000000000200000000000000000000020000000 00000000000000000000002000000000000000060006020020000060060002040444 T25: Green timers Do not get the blue gems too soon. 000000000080000060666600000000000000000000000000000000000080888888884044 440000000000202200000000060604080600404806066004080404444202220060808848 060666000400006006040444202600008486066080600062008400426040444202222600 808840860666680006002000200020420600080080800800000002000000080600042608 060200042040020002060486000808606666202222222222404442222000004006000006 000000000000040000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000040444206008088886062022666662060668088404420 244448088800068088888000000000080000000800000000000000000000000000006000 00600000200020040000008 T26: Time bombs Explosions are dangerous, but they are sometimes the only way to open your path. 000000000000040040000000000006202404860002608088860840440024808800 2060600200206240400606680888000000000000000000000000000000008000000000000000 0006000000000000000000000800000000000000000006062068040040040008008000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000008060666680662000242600040420 2606660000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000080860666 6000000200000060800600200206020024008000800000000000000006800840200000000200 0000602024080000000000000060800840200000080080008000004000000800060060000400 0000000000000000000000020222222222006 This pusher can allow you to detonate the red blocks without getting hurt. T27: The fugitive Those guys are tough! You will have to outsmart them. Just one level left! 000000000000000000000000000000000000000000000000000000000000000000000000 000020000000000000000000000002000002000400000000000008000000000000000000 800006000080000080080008000000000800000040000000040000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000004044000020200002022222220006000800480006 000000000000000000800000000000080008000080080000800000800080000040000000 000000000000000040000800000800008000008000000000400420200000006000060080 0006000200000680080006 T28: Stronger 000000000000000000000000000404000200204004004006006000600606006006006000 004004000020000020000200020000000000020006000060000000000000600000000000 006000000000000000060006000008000808404480448044202240442022260666666666 680880000008000800000000000000600060008008000200260006800080888008000000 000000800800800080000000000040000000000000400000800000004000000000000000 00400800000002000000200002022222220002002000002060060200002000002002 They are stronger, but not smarter. Those are just the tutorials. Do not forget to check the official levels and the other bonus level files. xye-0.12.2+dfsg/levels/xyester.xye000066400000000000000000005626201225403634500170630ustar00rootroot00000000000000 Xyester Ironclash An user-contributed level pack. Very interesting levels. Note they are really tough levels. Original description: Pack #1. Note that all levels are possible to finish. The Amazing Xye You'll need the green bouncer for that gem... Behavior Don't get that red gem just yet... SIMON The red block serves a purpose. Pursuit Block the entry points when the blob mind gets close. Space Invaders Marks Calibration Infiltrator Tomb of the Ancients Somehow you must prevent the guardians from moving... Intrusion Snake Pit Distort the traffic. The Abyss In case you were wondering, you must find the portals somewhere hidden in this area and perhaps another area also. Swap the red blocks. xye-0.12.2+dfsg/missing000066400000000000000000000142131225403634500147210ustar00rootroot00000000000000#! /bin/sh # Common stub for a few missing GNU programs while installing. # Copyright (C) 1996, 1997 Free Software Foundation, Inc. # Franc,ois 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. if test $# -eq 0; then echo 1>&2 "Try \`$0 --help' for more information" exit 1 fi 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 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 lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file yacc create \`y.tab.[ch]', if possible, from existing .[ch]" ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing - GNU libit 0.0" ;; -*) 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.in'. 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.in'. 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.in'. 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.in` 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.in'. 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 ;; makeinfo) 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 ;; *) 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 xye-0.12.2+dfsg/mkinstalldirs000066400000000000000000000013321225403634500161260ustar00rootroot00000000000000#! /bin/sh # mkinstalldirs --- make directory hierarchy # Author: Noah Friedman # Created: 1993-05-16 # Public domain # $Id: mkinstalldirs,v 1.1.1.1 2001/01/17 10:09:36 electrum 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 xye-0.12.2+dfsg/pixmaps/000077500000000000000000000000001225403634500150055ustar00rootroot00000000000000xye-0.12.2+dfsg/pixmaps/xye.ico000066400000000000000000013226261225403634500163220ustar00rootroot00000000000000 hf 00 %v@@ (B; (F} ( n(  @?##?94;=QTMPMPRU<~>39Y,h.HK-0""" #03KN-e.Y9*i+ & 13 (*EFJKBC0235 & +RS,.#$FF]^]^]^^_^_\^PR '  {|vvtussqrppnomnmnnnnoopoptu ?cc[\?,D,Ϡ)D)9aa^^9YlmijY9=G=ϘA>ACFKNVYX[X[@B! 9(\)TVUWGJ14!$### # $ $#'47KNVXUW)Y*9967RULO-0!!!!!!!!"""#26PRTV7{89 56PSCE #  !!$(HKQT5|7 ,%]&NP@C $EHOQ%[',a " JLDG "%IKKN ! a56HK%',/JL57S % FI8:>AGJ $ S&o'DF"%),DG&l',8:>@AC8:,#?A24     79?A#E ) <>*,   12>?BC?@78*+.0<> ) EW6:<%'  ./QSRSSTSSSTSTSUSTCD'))+9;5WW:AC$&    ABYZYZY[ZZZZZ[Z[[[[[[\[]PR>?586WE3vwijNP=?/0"#!"01HI``abababababababbcbcbcbccdcdlmac,E#  }~z{qrqqpqopnonnmnlmklkkjkijijiiiiijijijjjjkjkjlklkltvvw#,rs{{y{yzxywxwwvwuvtuttssrsrrrrrrqrrsrsssrsstststuv}~hi,PP~~}~|}||{{{{{{{|{|||{|{}|}|}|}GGS/-Sssjka,,a,TvTRyS, zzww 9󁤁~99ezeb{b9 (.('/' ,a-2-,2-a-S474CGCCGC474S,#EWWE#+(0` %0(   ( 0 Y Y e  6"E#&N'&N'"E#6  e y  &Q'@BVXZ]Z]Z\Z]Z]Z]Z]Z]WYAB'P(  { S*=?VYX[X[X[X[X[X[X[X[Y[Y[Y\Y\Y\Y\WZ=?) S   <>VYWYWYVYUXKN@C8;260304369=BENQWZWZXZX[WZ=?   #O$SUVXUXUWIK58#& # # # # # $ $ $ $!$&*9@  <>QSQSIK%(      !!"",/NPRTRU=? 3}4OROQDF #  !!'*JMPRPS4z5 S Q!MPMPDG"  &)JMNQNQ N! S  IKLNHK!$),LNMPJM  y45JLJL*-47KNKN46y +HJHJ:= BEILIL* e12GIFH #*-GJGJ13eDEEG69?AFHDGUDFCE$'-0DFDGS Y/1BD?A BDBD/1 Y>@@B35;=@B>@  ?A>@)+           13>@?A  0:=?=?90( K;>:=   !CEOPOPOPOPOPOPOQPQNO@A*,$&:<:=K(  T:<9:   01STSUSUSTTTTUTUTUTUTUTVUVUVPR9;!#8:9:T  U8:79     AAXYXYXYXZXYYYYYXZYZYZYZYZYZYZY[Z[Y[BD+-5768T ( ,Z,hiWX34    67YZ^^]^]^]^]^]^]^]^]^]^^_^_^_^_^_^`_`_`_`deUW8;K( 0$G%wywxoqhj^_PQBC46)+!# $%00?@TUbccdccbcbcbcbcbcbcbcbcbccdcdcdcdcdcddedeeedelmqrkl@0$|}|}wxpqppopnpnomomnmmlmklkljkjkjjijiihihihhhhhhhhhhghhihihihiiihiijijijijijjkrsuvuv"|}~vwuvuvtutuststrsrrqrqrpqpqopoonononnnnmnmmmmmnmnmnnonnnnnononoopopopopopxzy{qr Yac}~{|{|z|z{y{yzyyxywxwxvwvwvvuututuststssssssststststtttttututututuuuuvxy~~VW Y>j>~~}~}}|}||{|{{z{z{yzyyyyyzyzzzzzzzzzz{z{z{z{{{{{{{{|3f3  eii]]e $8$6 yqrjjy!! SFfGGiG Sttrs        )   )XjYWkW ##  S5;54;4 Sygphfpf{ e&(&IMI[a[hnhhoh\b\IMI%(&e  Y Y0(   ( 0(@ B,3 U}} W3+/}}/u*!D"+Y,/b14k54k5/a1+X-!D")u:3l5LNZ]Z]Z]Z]Z]Z]Z]Z]Z][][][]LN4k69, y#4o5SVY\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Z\Z]Z]Z]Z]TW5m6# y-9*>@X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X\Y\>@)9 w7y8WYWYVYVYVYVYVYMP@C6:.2'+$("%"&%))-049@ w9/u0NQNQNPHJ!$  !!*.MPORPRPR0q19,DMPMPMOHJ"%  ,0MONQNQNQB, yGILNKNJM&) 36MOMPMPIK y0}1KMKMKM03=@KNLNLN0y1+JLIKIK?A #GJJMKMKM*35HKHJGJ"%.1IKIKJL45u $ GJGIGI68ADGJHKHK $ u)t*FHFHEG!+.FHGIGI)q+/@BDGDF79ADEGEGAC/}=DFDFCE&(24CFDFDG;}&s'CDBD@B"%BDCEBE&p',79AC@C47>@@CAC78,3 @B?B?A)+46?A?B@B 3 U ,?A>@>?!#               +-=?>@?@ , U}I=?=?<>      +,13686734./$&$&<>=?=?H}a<><>;=     /1JKNNNNNONONONONONONOIJ;<()!:<:=;=`j ;=:<8:    %&MOPRPRQRQRQRQRQRQRQRQSQSRSRSRSPR=>!#9;:<:<i!s":<9;57    33TUTUTUTUTUTUTUTUTUTUTVTVTVUVUVUVUVVWUWJL/079899: s! s!8:8957      CCXXXXXXXYXYXYXYXYXYXYXYXYXYXYYZYZYZYZYZYZYZY[SU34575868s 3x4STAC57       //WW\\[\[\[\[\[\[\[\\\\\[\[]\]\]\]\]]]]]\^\^\^]_]_]_^_Z[JL5758j9s:uvtvnoOP:<&(     ;?MNaaefdeddddcdcdcdcdcdcdcccccccdcdcdcdddcecddddddededeefefefefefklqrqrqr"S"} U7{}{|{|tupqopoonomomnmnmnlmlmllklkljkjkjkijijiiiiiihighghghghghghghghghghghghghghhhhhhihihihihjhjhjijijijpqtuuvtv5 U3  ~z|ttstststrsrsqsqrqrpqppppopopnononomnmmmmlmlmklklklklklkkkkkkkkklklkllmlmlllllmlmlmlmmnmnmnmnmnmnvwwywyvx3,pqxyxyxxwxwxvwvwuwuvuuuututuststrtrsrrrrqrqqpqpqppppopopppppopoppppppqpppppppqpqpqqrqrqrqrqrqrqrst{|{|{|bc,PQ~}}|}{}{}{|{|z{z{zzyyxyxyxyxywxwxwwvvvvuvuvtutututtttttsttutututututuuuuuuuuvuvuvuvuvuvvvvvvwz{~~DD}-M-~~}~}~}~|~|}||||{|z{z{z{y{yzyyxxxxyyxyxyxyyzyzyyyyyzyzyzyzy{z{z{zzz{z{z{z{ G }/~~~~~~~~~}~}~}~}~}~}~~~~~~~~~~~~~~yz/XYJKu/+uoocc$7$5hibb y y,:V;LNWZ[][][][][^[^[^[^[^[^XZLN=}>0c1"G#* MU  92i4JLZ]Z]Z]Z]Z][][][][][][][][][][][][][][][][^[^[^[^JL3h48  U]  +Z,FHY\Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z][][][][][][][][][]Z]FH+Z-  ]?  !G"BDZ]Z]Z]Y]Y]Y]Y]Y]Y]Y]Y]Y]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z][][][][][][]CE"F#  ?,  6t7UXX[X[X[X[X[X[Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\X[X\X\X\Y\Y\Y\Y\Y\Y\Y\Z]Z]Z]Z]Z]Z]Z]Z]Z]Z][][]WY7r9 -k$;~@X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[WZWZWZXZXZXZXZXZXZXZXZXZXZXZXZXZX[X[X[X[X[X[X[X[X[X[X[=@& (K 3p4WZWZWZWZWZWZWZWYWYWYVYVYVYVYVYVYVYVYORGJ?B8;03,/)-'*$'"&#'&)(,+/-147A04#'!%!%!%!%!%!%!%!%!%!%!%!%!%!%!%!%!%!%"%"&*-7;EHRUWZWZWZWZWZX[X[X[X[X[X[XZXZXZXZPR E!2*  BCWYWYWYWYWYWYWYWYWYVXVXVXVXUWGI37#' $ $ $ $ $ $ $ $ $ $ $!$!$!$!$!$!%!%!%!%!%!%!%!%!%!%!%!%,/=APSVYVYVYVYWYWYWZWZWZWZWZWZWZWZBD  *$)BQSVXVXVXVXUXUXUXUXUXUXUXUXJM7:$( $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $!$!$!$!%!%!%!%!%!%.2ADTVWYWYWYWYWYWYWYWZWZWZWZVYRU@$)72r3VXUXUXUXUXUXUXUXUXUWUWTWFI-0 # # ################ # # # # # # # # $ $ $ $ $ $ $ $!$!$!%!%!%$(:=QTUXVXVXVXVXVXVXVXVXVYVYVY2o47E  DFTWTWTWTWTVTVTVTVTVTVSVCF*-#######"""""""""""############ # # # # $ $ $ $ $ $ $!$!$#'8;ORTWTWTWUWUXUXUXUXUXUXVXEG  EU(LOTVTVTVSVSVSVSVSVSVSVIK*-"""""""""""""""""""""""""""""""####### # # # # $ $ $ $ $#&;>RUTWTWTWUWUXUXUXUXUXUXNQ'UE5PQSVSVSVSVSVSUSUSUSUOQ47""""""""!!!!!!!!!!!!!!!!!!""""""""""""""##### # # # $ $ $(+DGTVTVTVTVTVTVTWTWTWTWPS4E7DQTSVSVSUSUSUSURURURUAD"&!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!""""""""""#### # # # $04ORSVTVTVTVTVTVTVTVTWRUC7$)"Q#RTRTRTQTQTQTQTQTQTOR36!!!!!!!!                         !!!!!!!!!!!""""""""#### #%(FISVSVSVTVTVTVTVTVTVTV"O$$)*DRTRTQTQTQTRTRTRTRTIK&)!!                                       !!!!!!!!"""""""### #9              !!!!!!"""""),MOQTQTQTQTQTQTRTRUNQ'K  IKQSPSPSPRPRPRPROQ69        !!!!!!"""&(JLQSQTPSPSQSQSQSQSJL  K(@BOROQOQOQOQOQOQNP14       !!!!!""&GIOQORORORPRPRPRPSAC( .s0NQNQNQNQNQNPNPNP46      !!!!#&HKOQOQORORORPSPRPS/p0 kBNPNPMPMPMPMOMOMO7:      !!%'ILNQNQNQOQOQORORPRAk,  JLNPMPMOMOMOMOMO;>     !&*KMNPNPNQNQNQNQNQJL  ,:?>?>@>@?@?A?AJ !j"?A?@>@>@>?=?),                             <>=?>?>@>@?@?A!i"  )*>@>?=?=?=??>@)* 434>?=?=?=?          "$24BCKLKMKMKMKMKMKMKLKLKLGH=>45*,02<>        !>?MMMMMMMNMNMNMNMNMNMNMNNNNNNONOMOMOMNMNKK=>-0),:=;=;>;><><>:<.*1<>;>;=:<        #$CDNONONONOOOOOOOOOOPOPOPOPOPOPNOOOOOOPOPOPOPOPOPPPPQHI46 !'):<:<:<:=:=;=;>*1&C ;>;>;=:=:<:<8:       BCPQPQPQPQPQPQPQPRPRPRPRPQPQPQPQPQPQPQPRPRPRPRPRQRQRQSQSQSQSQRJL34%'9:9;:<:<:=:=;= &C#S:=:<:<:<:;:;68       $%OQQSQSQSQSQSQSQSRRRRRRRRRSRSRSRSRSRSQSRSRSRTRTRTRTRTRTSTSTSTSTSTSTSTST?@#%"%:;:;:<:<:;:<:<#S_:=:<:<:;9:9:35       ./STTTTTSTSTSTSTSTSTSTSTSTTUTUTTTTTTTTSTSTSUTUTUTUTUTUTTTUTUTUTUTUTUUVUVUVTVTVJL02 "8:9:9:9;:;:;:<_k % :<:<:<:;:;9;23         ==UVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVVVUVUWUWUWUWUWVWVXVXVXVWVWVWWXWXWXWXVXVXTU=> 797989898:9:9: % kk % :;9;9;9:8:8:35             IJWWWWWWWWWWWWWWWXWXWXWXWXWXWXXXXXXXXXWXWXWXWXWXWXXXXXXXXXXYXYXYXYXYXYYYXYXYXYXYXYXYXZXZXZWY?A"68686979797989 % k_9:8:8:89797946            !!TTYZYZYZYZYZYZYZYZYZYZYZYZYZYZYYYYYYYYYZYZYZYZYZYZYZY[Y[Y[Y[Z[Z[Z[Z[Z[Z[YZZZZ[Z[Z[Z[Z[[[[[[[[\[\Z[@A "47575758686869_#S  MM;=7979696857           DD[[[[[[Z[Z[Z[Z[Z[Z[Z[Z[Z\Z\Z\Z\Z[Z[[[[[[[[[Z\Z\Z\Z\[\[\[\[][][][]\\\\\\\\\\\]\]\]\]\]\]\^\^\^\^\^]_]_]^[\JK9<575758686869#S&CstrsfgTVBE6857          =>]]^^^^]^]^]^]^\]\]]]\]\]\]\]\]\]\^\^\]\]\]\]]]]]]]]]]]]]\^]^]^]^]^]^]_]^]^]^]^]^]_]_]_]_]_^_^_^_^`^`^`______fgjkPQ6846475758 &C*1tututususuno`b<>(*         $%EF]^__________^_^_^_^_^_^_^_^___________________^_^_^`^_^_^______`_`_`_`_`````````_`_a`a```````a_a_a_a_a`b`b`b`b`ahinnnnffEF464757*1.stvwvwuwuwuwuvkmijghXZEG13!#          !"=>[\bbbbbbaaaaaa`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`aabababababababababbbbbacababababbbbcbcbcbcbccccccdcdlmopopopop]^;=24.4fgwxwxwxwxwxwxoqjljljljkjjjjii_`RTEF79*+     (*>?STcddeddcdcdccccccbcbcbcbcbcbcbcbcbcbcbcbcccbcccccccbbbbbcbcbcbcbcbcbccccccccdcdcdcdddcdcdcdcdcdcdcdcdcececececededfdfdededeeeopprqqpqpqqrnpCD4 UVy{yzyzyzyzxystlnlmlmlmlmlmllllllkljljljlhj`aXYQRIJAC>@<=9;79679:=>BBEFKKUWabggggfgfgfgfgfgegefeeeeeeeeeededededededededededededddddddddddddededededededfdfdfefefeedededeeeeeeeeeeeefefefeffffgfgfgfgfgggggggfgfgfgqsqsrsrsrsrsrsHI  CDz|z|z|z|z|z{vxnpnpnpnonononnnnmnmnlnlmlmlmlmlmlmlmkmklklkkkkkkjkjkjkijijijijijiihihihihhhhhhhhhhhhhhhhghfhfhfgfgfgfgfgfgfgfgfgfgfffffffffffffgfgfgggggfgfgfgfgghggggggggghghghfhghghghghgigigigigihihihihihihiiijktututututututu<~= 2^2|~|~|}|}|}|}z|qsqrqrqqqqqqopopopopopnonononononononnnnmnmnmnmmlmlmlmklklklklkljljljljkjkjkjjjjjjjjjjijhjhjhihihihihihihihihihhhihihiiiiihihihihihihihihihiiiiiiiijijiiijijijijijikikikijijikikikikjkjkjjjjjkjkjknouvuvuvuwuwuwuw'X(u9 ~~~~~~tussssrsrsrsrsrsrsqrqrqrprprprprpqpqpqpqopopopoooooonononomnmnmnmnmnmnmnmnmmlmlmllkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkjjjjjjjjjkjkjkjkjkjkjljlklklkkkkkkkkklklklklklklklklkmlmlmlmlmlmlmlmlmmmmmmmlmrtvxwxwxwxwxwxwx-u"U  yzuvuvuuuuuutututususustststststssrsqsqrqrqqqqqqqqqqpqpqpqppppppppppopnpnonnnnnnnnnnnnnnmnlnlmlmlmlmlmlmlmlmlllllllllmmmmmlmlmlmlmmmmmmnmnmnmnmnmnmnnnmmmmmnmnmnmnmnmnnnnnnonononononononononononowxxzxzxzxzx{y{rt "U,no~wxwxwwwwwwvwvwvwvwvwuvuvuvuvtvtutututtttttttststrtrsrsrsrsrsrsqsqrqqqqqqqqqqqqpqppppopopopopopopopopoononnnnnnnnnnnononononoooooooooopopopooooooooooopopopopopoqoqoqpqpqpqpqpqprpqpqpqqqqqqqprrsz{z{z{z|z|z|{|VW, MNzzzzyzyzyzyzxzxzxyxywywywywywywxwwwwwwvwvwvwvvvvuvuvuutututususuststssssssssssrsrrrrrrrrrrqrqqqqqqqqqqqqqqqqqqqqqqqqqqpqpqprprqrqrqrqrqqqqqrqrqrrrrrrrrrqrrsrsrsrsrsrsrsrsrsrsrrrrrsrsrsrsrsssvw|}|}|}|}|}|}|~;< +L,~|}|}|}{|{{{{{{z{z{z{z{z{zzzzzzyzyzyzyzyyxxwxwxwxwxwxvxvxvxvwvwvwvvvvvvuvuuuuuuuutututusustststststssssssssssssssststststssrsssssststststssststtttttttttttutusututututututututuuuuuuuuuuvuvuv{|}~~~~~~Ac  ~~~~~}~}~|~|~|~|~|}|}|}|}{}{|{|{|{{{{{{{{z{z{z{yzyzyzyzyzyzyzyyxyxyxxxxxxxxwwwwvwvwvvvvvvvvvvvvvvuuuuuuvvvvvvuutuuvuvuvuvuvuvuvuwuvvvvvvvvvvvvvvwvwvwvwvwvwvwvxvxvxvxwxwwwwwwwxwxwxwxxxwxxyxy c*op~~~~~~~~~~~}~}~}~|~|}|}|}|}|}|}|}{|{|z{zzzzzzzzzzzzyzyyyyxyxyxyxyxyxyxxxxwwwwwwxxxxxxwxwxwxwxwxxxxxxyxyxyxyxxxyxyyyyyyyxxxxxyxyxyyyyyyyyyyyyzyzyzyzzzzzzzyzyzyzyz}~TU* FxG~~~}}}~}}}}}}}}}}}}|}||{|{|{|{|{|{|{|{|{{zzzzzzzzzzzzzzz{z{z{z{z{z{z{z{z{{{{{{{zzzzzzz{z{z{z{z{z{z{z{z|z|z|{|{|{|{{{|{|{|{|{|||{|{|{}.l.   ~~~~~~~~~~~}~|~|||||||||||||||||||||}|}}}}}}}|}|}|}|}|}}}}}}}}}}}}}}~}~}~}~}~}~}~}~}}~}~~~~~~~~~~~~}} &1oo~~~VW&1 :^:$U$ u  |} u*_`HI* ( MjjVVM 0* UqqbbU 3 0 ]aaXX] ߘ ?:[;:];?~~}},#&,k4R5?Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z][][][][][][][][][][][][][][][][^[^[^[^>@;+g1')3m3UXZ]Z]Z]Z]Z]Z]Z]Z]Y]Y]Y]Y]Y]Y]Y]Y]Y]Y]Y]Y]Y]Y]Y]Y]Y]Y]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z][][][][][][][][][][][][][][^VY3l5)1'@$(X)MPY\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\X[X\X\X\X\X\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z][][][][][][][][][][][][]OP(W)$@,Y  /f/VXX[X[X[X[X[X[X[X[X[X[X[X[X[X[X[Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y]Y]Y]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z]Z][][][][][][][][]X[/e1  -[4  3o4X[Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y]Y]Y]Z]Z]Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y]Y]Y]Z]Z]Z]Z]Z]Z]Y\4m4  1&7x8Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[X[X[X[X[X[X[X[X[X[X[X[X[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y]Y]Y]Y]Z]Z]Z]Z]7v9',3&;=Y[Y[Y[Y[Y[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y\Y]X\X\X\Y\Y\:}<&,3({  >?X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[WZWZWZWZWZWZWZWZWZWZWZWZWZWZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZX[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X\X\X\>?  ({? *_+WZX[X[X[X[X[X[X[X[X[WZWZWZWZWZWZWZWZWZWZWZWZWZWZWZWZWZWZWZWZWZWZWZWZWZWZWZWZWZWZWZWZRUKNCF;?8<693704.1+/),%)#'"&#'%)),+/.10437698<;?BEJMRTWZWZWZWZWZWZWZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZX[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X\W[*],? -76LNWZWZWZWZWZWZWZWZWZWZWZWZWZWZWZWZWYWYWYWYWYWYVYVYVYVYVYVYVYVYVYVYVYVYVYVYTWLODGHKUXWZWZWZWZWZWZWZWZWZXZX[X[X[X[X[X[X[X[X[X[X[X[X[WZWZXZXZXZXZXZXZXZUX&U'2 .9/IJWYWYWYWYWYWYWYWYWYWYWYWYWYWYWYWYWYWYWYWYWYWYWYWYWYWYWYWYWYWYPS>A-0"%!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!%!%!%!%!%!%!%!%!%!%!%!%!%!%!%!%!%!%!%!%!%!%!%!%!%!%!%!%!%!%!%!%!%"%"%"&"&"&#'.2>APSVYVYVYVYVYVYVYVYVYVYWYWZWZWZWZWZWZWZWZWZWZWZWZWZWZWZXZXZXZXZXZIK..9*q1n2WYWYWYWYWYWYWYWYWYWYWYWYWYWYWYWYWYWYWYWYWYVXVXVXVXVXVXVXVXSUAD-1 $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $!$!$!$!$!$!$!$!$!$!$!%!%!%!%!%!%!%!%!%!%!%!%!%!%!%!%!%!%!%!%!%!%!%!%"%"%"&/3BESVVYVYWYWYWYWYWYWYWYWYWYWYWZWZWZWZWZWZWZWZWZWZWZWZWZW[W[X[X[X[1l3*q'  DFVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXUXUXUXUXUXUXUXUXUXTWEH15"& $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $!$!$!$!$!$!$!%!%!%!%!%!%!%!%!%!%!%!%!%!%!%!%!%!%!%!%$'36FIUXWYWYWYWYWYWYWYWYWYWYWYWYWYWZWZWZWZWZWZWZWZWZWZWZWZWZW[X[FI  '$>RUVXVXVXVXVXVXVXVXVXVXVXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXJM69$( $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $!$!$!$!$!$!$!%!%!%!%!%!%!%!%!%!%!%!%!%!%!%$(6:KNWYWYWYWYWYWYWYWYWYWYWYWYWYWYWYWZWZWZWZWZWZWZWZVYVYVYVYSV=$ 1n2VYVYVXVXVXVXVXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXHK-1 # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $!$!$!$!$!$!%!%!%!%!%!%!%!%!%!%!%!%.2GJUXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVYVYVYVYVYVYVYVYVYVY0l1 *  DFVXVXVXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUWUWUWUWTVEG,. # # # # # # # ############################## # # # # # # # # # # # # # # # # $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $!$!$!$!$!%!%!%!%!%!%!%!%!%-0FIUXUXUXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVYVYVYVYVYVYVYVYEG  *2 >QSTWTWTWTWTWTWTWTWTWTWTWTWTWTVTVTVTVTVTVTVTVTVTVTVBE(,################################################### # # # # # # # # # # # $ $ $ $ $ $ $ $ $ $ $ $ $ $ $!$!$!$!$!%!%!%!%!%!%*.CFTWTWTWTWTWUWUWUXUXUXUXUXUXUXUXUXUXUXUXVXVXVXVXVXVXRU=2 3/m0TWTWTWTWTWTWTWTWTWTWTVTVTVTVTVTVTVTVTVTVTVTVTVSV?C'*#################""""""""""""""""""""######################## # # # # # # # # # $ $ $ $ $ $ $ $ $ $ $ $ $ $!$!$!$!%!%!%!%),ADTVTWTWTWTWTWTWUWUXUXUXUXUXUXUXUXUXUXUXUXVXVXVXVXVX/k130-8:TWTWTWTWTWTWTVTVTVTVTVTVTVTVTVTVTVTVTVSVSVSVSVEH'*#####"""""""""""""""""""""""""""""""""""""""""""""""""################ # # # # # # # # $ $ $ $ $ $ $ $ $ $ $ $!$!$!$!%!%)-GJTWTWTWTWTWTWUXUXVXVXVYVYVYVYVYVYUXUXUXUXUXVYVYVY9;0-0-  ?@TVTVTVTVTVTVTVTVTVSVSVSVSVSVSVSVSVSVSVSVSVSVMP13""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""############## # # # # # # # $ $ $ $ $ $ $ $ $ $ $!$!$!$26ORTWTWTWTWTWTWTWTWTWTWUWUXUXUXUXUXUXUXUXUXUXUXVY@B  0-3EFTVTVTVTVTVSVSVSVSVSVSVSVSVSVSVSVSVSUSUSUSURT;>"%""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""############ # # # # # # $ $ $ $ $ $ $ $ $ $ $$'@!                           !!!!!!!!!!!!"""""""""""" $?BQTQTQTQTQTQTQTQTQTQTQTQTQTQTQTRTRTRURU>?(-757PRQSQSQSQSQSPSPSPSPSPSPRPRPRPRPRPRPR:<                       !!!!!!!!!!!!"""""""""";=QTQTQTQTQTQTQTQTQTQTQTQTQTQTQTQTQTRTRT78-7? -m.QSQSQSQSPSPSPSPSPSPRPRPRPRPRPRPRPROQ57                  !!!!!!!!!!!!""""""""68QSQSQTQTQTQTPSPSQSQSQSQSQSQSQSQSQSQSQS-j.? =PRPROROROROROROQOQOQOQOQOQOQOQOQOQNQ.2               !!!!!!!!!!!""""""13OQPRPRPSPSPSPSPSPSQSQSQSQSQSQSQSQSQSQS=({  LNOROROROROQOQOQOQOQOQOQOQOQOQOQOQNP-0             !!!!!!!!!!!"""".2OQOQOQOQOQORORORORORPRPRPRPRPSPSPSPSLO  ({,3?BOROROQOQOQOQOQOQOQOQOQOQOQOQOQOQOQ14            !!!!!!!!!!"""26NQNQOQOQOQOQORORORORORPSQSQSQSQTQTQT@B,3,n-NQNQNQNQNQNQNQNQNQNQNQNQNPNPNPNPNP57           !!!!!!!!!!"69ORORORPRPRPRPRPRPSPSPSPSPSPRPRPRPRPS,l-&>NQNQNQNQNQNQNQNQNQNQNPNPMOMOMOMOMO9;           !!!!!!!!!:AHKHKHKIKIKIKIKIKIKILILJLJLJLJL)n+/9GJHKHKHKHKHKHKHKHJHJHJHJHJHJHJ&)'*HKHKHKHKHKIKIKIKIKIKILILILJLJLIK/9!%g&GJGJGJGJGJGJGJGIGIGIGIGIGIGI>A=@GJGJGJGJGKHKHKHKHKHKHKHKHKIKIK&e&! EHGJGJGJGJGJGIGIGIGIGIGIGIGIGH')(+GJGJGJGJGJGKGKHKHKHKHKHKHKHKHKGI *_X HJHJHJHJHJGIGIGIGIGIGIGIGHGH>@=AGJGJGJGJGJGJGKGKHKHKHKHKHKHKHK V!*_>@HJHJHJHIGIGIGIGIGIGIGIGHGHFH'*(+FHGIGIGIGIGIGIGIGJGJGJGJGJGJGJ=@& 'HJHJHJGIFHFHFHFHFHFHFGFGEGEG>@>AFHFHGIGIGIGIGIGIGJGJGJGJGJGJGJ'& ((o(GIGHFHFHFHFHFHFHFHFGEGEGEGEG(+),FHFHFHFIGIGIGIGIGIGIGJGJGJGJGJ(l((CEFHFHFHFHFHFHFHFGFGEGEGEGEG>A>AFHFHFHFHGIGIGIGIGIGIGIGJGJGJDF0#:EGEGEGEGEGEGEGEGDGDGDGDGDGDG+-+-FHFHFHFHFHFHGIGIGIGIGIGIGJGJGJ90#$/0EGEGEGEGEGEGEGDGDGDGDGDGDGDECFEGEGEGEGEGEGEHFHFHFHFHFHFHFI01$EGEGEGEGEGEGEGDGDGDGDGDGDGDF5758EGEGEGEGEGEGEGEGFHFHFHFHFHFHFI/ANEGEGEGEGEGEGDGDGDGDGDGDFDFDF$'$'DGDGEGEGEGEGEGEGEGDGEGEGEGEGEGM/A$89EGEGEGEGDGDGDGDGDGDGDFDFDF?B?BCFCFDFDGDGDGDGDGDGDGEGEGEGEG89$  DGDGDGDFDFDFDFDFDFDFDEDECECE0202CFCFCFCFDGDGDGDGDGDGDGEGEGEGEG  SDGDFDFDFDFDFDFDFDEDECECECECE" #DFDFDFDFDFDFDGDGDGDGDGDGDGEGEGQ,S01DFDFDFDFDFDFDFDEDECECECECE;>;=DFDFDFDFDFDFDGDGDGDGDGDGDGEG02,S#BCCECECECECECECDCDBDBDBDBDBD*,*-DEDFDFDFDFDFDFDFDGDGCFCFCFCFBE#*CECECECECECECDCDBDBDBDBDBDBCBDCDCDCECECECECECECFCFCFCFCFCF)*[ CECECECECECDCDBDBDBDBDBDBD9;;>BDBDCDCECECECECECECFCFCFCFCFY *+Y23CECECECECDCDBDBDBDBDBDBDBD.102ACACACBCBCBDBDBDBDBDCDCECECE23+Y" BDCECECECDCDBDBDBDBDBDBDBDAD"%$'ACACACACBCBCBDBDBDBDBDBDCECEBD "0BDBDBDBCBCACACACACACACAC@C?BACACACACACACBCBDBDBDBDBDBDBDBD/2 !b"BDBDBCBCACACACACACACAC@C@C7989@B@C@C@C@C@CACACACACACACACBD `!2 ,]46BDBCBCACACACAC@C@B@B?B?B?B,/,/?B@B@C@C@C@C@CACACACACACACAC45,]& ACACAC@C@C@C@C@C@B@B?B?B?B?B"$"%?B?B@B@B@C@C@C@C@CACACACACACAC & +ACAC@C@C@C@C@C@B@B?B?B?B?B?@>@?B?B@B@B@C@C@C@C@CACACACACAC* F@B?B?B?B?B?B?A?A?A?A?A?A?@5758?A?A?A?A?A?B?B?B?B?B@B@C@C@CE!e!AC@C@C@C@C@B@B@B@B@B@B@A@A,.-/?A?A?A?A?A?A?B?B?B?B?B@B@B@C d!@+,?B?B?B?B?A?A?A?A?A?A?@?@?@&(                           ')>?>@>@>@>@>@?@?@?A?A?A?A?A?A+,@.978?B?B?B?A?A?A?A?A?A?@?@?@?@"                                        ">?>?>?>@>@>@>@?@?@?A?A?A?A?A78.9)w?A?A?A?A?@?@>@>@>@>@>?>?>?=?                                                 =?>?>?>?>@>@>@>@?@?@?A?A?A?A?A)w#  ?A?A?A?@?@>@>@>@>@>?>?>?=?:=                                                         9<=?=?>?>?>@>@>@>@?@?@?A?A?A?A  #6?A?A?@?@?@>@>@>@>?>?>?=?=?47                                                               36=?=?=?>?>?>@>@>@>@?@?@?A?A?A5R>@>@>?>?=?=?=?=?=?=?=??>@>@R #s%>@>?>?=?=?=?=?=?=?=??45+, "')<><>?>@#r% 4/0>?>?>?=?=?=?=?=?=?"#                   !"03@AKMKMLMLMLMLMLMLMLMLMLMLMLMLMLMLMLMLMLLLMLMLMLMLMLMLMLMLMLMLMJL@A24#$!#<><><>?/04117:>?>?=?=?=?=?=?=?=?<>                 !"??LMMMMMMMMMMNMNMNMNMNMNMNMNMNMNMNMNMNMNMNMNNNNNNNNNNONONONONOMOMOMOMOMOLNLNLNMMCC35$&;=;=;=;=;>;>;><><><><><><><>7811-E=>>?=?=?=?=?=?=?=?<>                $&BDMNNNNNNNNNNNNNNNNNNNNONONONONONONONONONONONONONONOOOOOOOOONONONONONONONONONONONONONONOOONPCF45 ":=:=;=;=;=;>;>;><><><><><><>;=-E,Y=?=?<><>;>;>;>;=;=;=                ()FGNONONONONONONOOOOOOOOOOOOOOOOOOPOPOPOPOPOPOPOPOPOPOPOPOPOPNOOOOOOOOPOPOPOPOPOPOPOPOPOPOPOPOPPPPPPQPQJL79"$:=:=:=;=;=;=:=:=:=;=;=;>;>;>;>,Y*k =?<><><>;>;>;=;=;=:<              +,IJOPOPOPOPOPOPOPOPOPOPOPOPOPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPOPOPOPOPOPPPPPPPPQPQPQPQPQPQPQPQPQPQPQPQPQQQQQQQQQQQMN9:%&9::<:<:<:<:<:<:=:=:=;=;=;>;>;> *k(}=?<>;=:=:=:=:<:<:<8:               IJPQPQPQPQPQPQPQPQPQPQPQPQPQPQPRPRPRPRPRPRPRPRPRPQPQPQPQPQPPPPPPPPPPPQPQPQPQPQPQPQPQPQPQPQPQPQQQQQQRQRQRQRQRQRQRQRQRQRQRQRNO;= "79:;:<:<:<:<:<:<:=:=:=;=;=;>;>(}&;>;>;>;=;=;=;=:=:=:<:<:<:<69             45PRPRPRPRPRPRPRPRPRQRQRQRQRQRQRQRQRQRQRQSQSQSQSQRQRQRQRQRQRQRQRQRRRQRQRQRQRQSQSQSQSQSQSQSQSQSQSQSQSRSRSRSRTRTRTRTRTRTRTRTQSQSQSQSRSGH,.469:9:9;:<:<:<:<:<:=:=:=;=;=;>&% " ;>;>;>;=;=;=:=:=:=:<:<:<:<47            HIQSQSQSQSQSQSQSQSQSQSQSQSQSQSRSRSRRRRRRRRRRRRRRRSRSRSRSRSRSRSRSRSQSQSQSQSRSRSRSRSRTRTRTRTRTRTRTRTRTRTRTRTSTSTSUSUSUSUSTSTSTSTSTSTSTSTTTTUPQ8:24:;:;:;:<:<:<:<:<:<:=:=:=;=;= " %# + :=:=:<:<:<:<:<:<:;:;:;:;9;24             !OPRTRTRTRTRTRTRTRTRTRTRTRTRTRTRTRSRSRSSSSSSSSSSSSSSSSSSSSTSTSTSTSTSTSTSTSTRTRTSTSTSTSTSTSTSTSTSTSTSTSTSUSUSTSTTTTTTTTUTUTUTUTUTUTUTUTUTUTUTUTUTUTUDE'*03:;:;:;:;:<:<:<:<:;:;:<:<:<:< * #!3:=:=:<:<:<:<:<:<:;:;:;9;9;02            (*RSSTSTSTSTSTSTSTSTSTSTSTSTSTSTSTSTSTSTSTSTSTSTTTTTTTTTTTTTTTTTTTTTTTTTTTSTSTSTSUSUSUTUTUTUTUTUTUTUTUTUTUTTTUTUTUTUTUTUTUTUTUTUTUTUUUUVUVUVUVUVUVUVTVTVTVNO35-08:9:9:9:9:9;9;:;:;:;:<:<:<:<3!=:=:=:<:<:<:<:<:;:;9:9:8:8:-/            44UUUUUUUUUUUUUUUUTUTUTUTUTUTUTUTUTUTUTUTUTUTUTUTUTUTVTVTVTVTUTUTUTUTUTUTUTUTUTUTUTUTUTVTVTVTVTVTVTVTVTUTUTUUUUUUUUVUVUVUVUVUVUVUVUVUVUVVVVWVWVWUWUWUWUWUWUWUWUWUV@B$&+-8:8:9:9:9:9:9;9;:;:;:;:<:<:<=G:=:<:<:<:<:<:<:;:;:;9;9;9:+-            BBUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVVVVVVVVVUVUWUWUWUWUWUWUWUWUWUWVWVWVWVXVXVXVXVXVXVXVWVWVWVWWWVXVXVXVXVXVXVXVXVXVXVXVXWXLM02*+797979898989898:8:9:9:9:9;9;FR:=:<:<:<:<:<:;:;:;:;9;9;9:,.                 MMUVUVUVUVUVUWUWUWUWUWUWUWUWUWUWUWUWUWUWUWUWUWUWVWVWVWVWVWVWVWVWVWVWVWVWVWVWVWVWVWVWVWUWVWVWVWVWVXVXVXVXVXVXVXVXVXVXVXWXWXWXWXWXWXWXWXWXWXWXWXWXXXXXXXXXXXXXXXXXWYWYWYWYWYXYXYTV8:+,797979798989898:8:8:9:9:9:9;QQ:;:;:;9;9;9;9:9:9:8:8:8:8:-/                      #$STWWWWWWWWWWWWWWWWWWWWWWWWWWWXWXWXWXWXWXWXWXWXWXWXWXWXWXXXXXXXXXXXXXXXXXXYVXVXVXVXVXVXVXVXVXWXWXWXWXWXWXWXWXWXWXWXWYWYWYWYXYXYXYXYXYXYXYXXXXXYXYXYXYXYXYXYXYXYXYXYXYXZXZXZXZXZXZXZXZUW79+-6868686969797979797979898989QF:;:;:;9;9;9;9:9:9:8:8:8:8:/1                        34XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXYXYXYXYXYXYXYXYXYXYXYYYYYYYYYXXXXXXXXXYXYXYXYXYXYXYXYXYXYYYYYYYYYYYYYYYYYYYYYYYYZYZYZYZYZYZYZYZYZYZZZZZXZXZXZXZXZXZXZXZXZXZXZYZY[Y[Y[Y[Y[Y[Y[Y[Y[UW78,/6868686869697979797979798989F=:;:;:;9;9;9:9:9:9:8:8:8:8:13                         CDZZZZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZXYXYXYXYXYXYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYZYZYZYZYZYZYZYZYZZZZZZZZZZ[Z[Z[Z[Z[Z[Z[Z[Z[YZZZZZZ[Z[Z[Z[Z[Z[Z[Z[Z[Z[Z[[[[[[[[[[[[[[\[\[\[\[\UW67-05757575758585868686869697979=!39:9:8:8:8:898989797979797934                        OOZZZZZZZZZZZZYZYZYZYZYZYZYZYZY[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[Y[ZZZZZZZZZZZZZZZZZZZZZ[Y[Y[Y[Y[Y[Y[Y[Y[Z[Z[Z[Z[Z[Z[Z\Z\Z\Z\Z\Z\Z\Z\Z\[\[\[\Z[Z[Z[Z[Z[Z[Z[Z[Z[Z[[[[[[[[[[[[[[[[[[\[\[\[\[\[\[\[\[\[\[\\]\]\]\]\]\]VX56/147575757575858686868686969792!#-8989797979797979696968686845                      CD[[[[[[[[[[[[Z[Z[Z[Z[Z[Z[Z[Z[Z[Z[Z[Z[Z[Z[Z[Z\Z\Z\Z\Z\Z\Z[Z[Z[Z[Z[Z[[[[[[[[[[[[[[[[[[\[\Z\Z\Z\Z\Z\Z\Z\[\[\[\[\[\[][][][][][][][][]\\\\\\\\\\\\\\\\\\\][][][]\]\]\]\]\]\]\]\]\^\^\^\^\^\^\^\^\^\^\^]_]_]_]_]_\]\]VW352446475768686869697979797:7:7: * #%2jjYZHI9;79797979696968686857                    <=[[\\\\\\\\\\[\[\[\[\[\[\[\[\[\[\[\[\[\[\[\[\[\[\[\[\[\[][][][][][\[\[\[\[\\\\\\\\\\\\\[\[\[][][][][][][][]\]\]\]\]\]\]\]\]\]\]\]\]\]\]]]]]]]]]]]]]]]]]]]]^]^]^\^\^\^\^\^\^\^]^]^]_]_]_]_]_]_]_]_]_]_]_^_^_^_^_^_^_^_^_deJL57475757575758586868686969 ! %&'stststpqbcPR?A69696868686858                    45Z[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]\]\]\]\]\]\]\]\]\]\]\]\^\^\^\^\^\]\]\]\]]]\]\]\]\]\]\]\]\]\]\]\]\]\]\^\^\^]^]^]^]^]^]^]^]^]^]^]_]^]^]^]^]^]^]^]^^^^^]_]_]_]_]_]_]_]_]_]_^_^_^_^_^_^_^_^`^`^`^`^_^____________`_`lmlmdeDF5757575758586868686869&(}ttstsusustststikX[FH79575747                    +,WW______________^_^_]_]_]_]_]_]_\^\^\^\^]^]^]^]^]^]^]^]^]^]^]^]^]^]^]^]^]^]^]^]^]^]^]^]^]^^^^^^^^^^^^^^^^^^^^^^^^^^^]^]_]_]_]_]_]_]_]_^_^_^_^_^`^`^_^_^_^_^_^_]_^_^_^_^_^_^_^_^_^`^`^`^`_`_`_`_`_`_`_`_a_a_a_a_a_a_`_`_`_`_``amnmnmmmmZ\:=464646474757575758(}*k  tututututususususustprbcTUEH                  :;XX__________________^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_________________________________________^_^_^`^`^`^_^_^_^_^_^_^_^_^_^_^`^`^`^`^`^`^`^`_`_`_`___`_`_`_`_`_`_`_`_``````````````````a`a`a_a_a_a_a_a_a_a`a`b`b`b`b`b`b`b`b`a`aacnnnnmnmnmnklPQ5746464747575757 *k,YvvuvuvuvuvuvuvtvtvtututututuijYZGH45 #                 12RR`a`a`a`a``````````````````````___________________________________________`_`_`_`_`_`_`_`````_`_`_`_`_`_`_`_`_`_`_`_`_``````````````a`a`a`a`a`a`a`aaaaaaaaaaaaaaaaaaaaa`b`b`b`b`b`b`a`a`a`a`a`b`b`b`b`b`b`b`b`b`bababababababababababcdnooooooooooooofgDE464747575757,Y-EtuvwvwvvvvvvuvuvuvuvuvuvuvuvmniiiiiihicdQR>@*,                 ()IJ`bababababaaaaaaaaaaaaaaaaaaaaaa`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`aaaaaaa```````````a`a`a`a`a`a`aaaaaaaaaaaaaaaaaaaaaaaababababababababbbababacacacabababababababbbbbbcbcbcbcbcbcbcbcbcbccccccccccccdcdcdcdghopppppopopopoqoqop\]:<46464635-E11nowxwxvxvxvxvxvxvxvxvxvxvxvwprikikikikikikikikij[\HI8:*,                  12FH^^ccccccccccccccccccccbbbbbbbbbbab`b`b`b`b`b`b`b`b`b`b`b`b`b`bababababababababababababaaaaaaaaabababababab`bababababababababababababababacacacacacacacbcbcbcbcbcbcbcbcbcbcbcbcccccccbcbcbcbcbcbcbcbcbcbccccccccccccccccdcdcdcdcdcdcdcdcdcddededejkpqoqpqpqpqpqpppqpqpqmoQQ574600114``wywywxwxwxvxvxvxvxvxvxvxvxstjljljljljljljljkjkjjjjjjjjjjgg[\NOBC46&'              !!78MM`addddddddddddccccccccccccccccccccbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcccccccccccccccccccccbbbbbbbcbcacacacacbcbcbcbcbcbcbcbcbcbcbcbcbcbcbdbdbdbdbdbdbdcdcccccccdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcececececececececededfdfdfdfdfdfdfdedededeeeeemmqrqrqrqrqqpqpqpqqqqqqqqqgiCE'(4 MNxyxyxyxyxyxyxyxyxyxyxyxyxxuwkmkmkmklklklklkljljljkjkjkjkjkjkjkjkjkjjijefXZKL>>01!$         '(33?ARTcdefefefefefefefefdedededededdddddddcdcdcdcdcdcdcdcdcdcccccccccccccccccccccccdcdcdcdcdcdcdcdbccccccccccccccccccccccccccccccccccccccdcdcdcdcdcdcddddddddddddddededededededeeeeeeeddddddddddcdcdcecedededededededededfdfdfdfdfdfdfdfdfdfefefefefefeeefefefefefefffopqrprprqrqrqrqrqrqsqsqsqsqsqs23 ${}tvtvtututututututututtttttttttttttstststststststststssssssssssssssssqrqrqrqrqrqrqrqqqqqqqqqqqqqqqqqqpqoqoqoqoqoqoqopopopopopopopopopopopopnpnpnononnnnnnnnnnnnnnnnnnnnnnnnnnnnmnmnlnlnlnlmlmlmlmlmlmlmlmlmlmlmlmlmlmlmlmlllllllllmlllllllllllllllllllllllllmlmlmlmmmmmmmmmmmmmmmmmmmmmmmmmmmmnmnmnmnmnnnnnnnmmmmmnmnmnlnlnlnlnmnmnmnmnmnmnmnmnmnmomomomomomomomonnnnnnnnnnnnnnnonononononononononotvxzxzxzxzxzxzxzxzxzx{y{y{y{y{su ) &  vwvwvwvwvwvwvvvvvvvvvvuvuvuvuvuvuvtvtvtvtvtututututututususususuststrtrtrtrsrsrsrsrrrrrrrrrrrrrrrrrrrrqrqrqrqrqrqqqqqqqqqqqqqqqqqqqqqqqqpqopopopoooooooooooooooooooooooononononomomomnmnmnmnmnmnmnmnmnmnmnmnmnmnmnmmmmmmmmmmmmmmmmmmmnmnmnnnnnnnnnmnmnmnmnmnmnmnmnmnmnmnmomomomonononononononononononononnnnnnnnnnnnnnnnnnnnnononononononoooooooooooooooooopopopopopopopopopppppopopopopopopnpnpnpxyxzxzxzxzx{y{y{y{y{y{y{y{y{y{ce &,]mmyzwxwxwxwxwxwwwwwwwwwwvwvwvwuwuwuwuwuwuwuwuvuvuvuuuuuuuutututututututututtttttttttttttttttstststststrtrsrsrsrsrsrsrsrsrsrsrsqsqsqsqsqrqqpqpqpqpqppppppppppppppppopopopoooooooooooooooooooooooooooooooooooooooonnnnnnnnnnnnnnnnnnnnnnnnnononooonononononononononononononononpnpnpopopopopooooooooooooooooopopopopopopppppopopoqoqoqoqoqoqoqpqpqpqpqpqpqpqpqpqprprprpqpqpqpqpqpppppqpqpqpqpqpqpqpqrrzzz{z{z{z{z{z{z{z{z{z{z{{{{{{{DD,]2 IJ|~xxxxxxxxwxwxwxwxwxwxwxwxwxwxwxwwwwwwwwwwwwvwvwvwvwvwvwuwuwuwuwuvuvuvuvuuuuuuuuuuuuuuuuuutututusususuststststststststssssssrsrsrsrsrrrrrrrrrrrrrrrrrrrrrrrrrrqrqrqrqqqqqqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqopopopopopooooooooooooooooooooooooooooooooooopoppppppppppppppppppqpqpqpqqqpppppppppppppppppppppppqpqpqpqoqpqpqpqpqpqpqpqpqpqpqprprprprprprprqrqrqrqrqrqrqrqrqrqrqrqrrrrrrrrrrrrrrsqsqsuv{|{|{|{|{|{|{}{}{}{}{}{}{}{}{}!h"2 (E)zzzzzzzzzzyzyzyzyzyzyzyzyzxzxzxyxyxywxwxwxvxvxvxvxvxvxvxvxvxvwvwvwvwvvvvvvvvuvuvuvuvuvuvuvuuuuuuuuuuuuuuuuuuuututututututususususustssssssssssssssssssssssssrsrsrsrrqrqrqrqrqrqrqrqrqrqrqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpqpqpqprprprqrqrqrqrqrqrqrqrqrpqpqpqqqqrqrqqqqqqqqqqqqqqqqqrqrqrqrqrqrrrrrrrrrrrrrrrrrrrrrrsrsrsrsrsrsrsrrrrrrrrrrrrrrrrrsrsrsrsrsrsrsrsrsrsrtrtxz{}{}{}{}{}{}{}|}|}|}|}|}|~|~{| . "  z{z{z{z{z{z{z{z{z{z{zzy{y{y{y{yzyzyzyzyzyzxzxzxzxzxzxzxzxzxzxyxyxxxxxxxxxxxxwxwxwxwxwxwxwxwwwwwwvwvwvwvwvwuvuvtvtvtvtvtvtutututututututututtttttstststssssssssssssssssssssssssssssssrsrsrrrrrrrrrrrrqrqrqqqqqqqqqrqrrrrrrrrrrrrrrrrrrrrrqrqrqrqrqrqrqrqsqsqsrsrrrrrrrrrrrrrrrrrrrrrrrrrsrsrsrsssssssssssssssssssssrsrtrtrtrtrtrtstststststststststrtrtstststssssssssssstststststststststtttttt|}}}}}}}}}}}}}}}}~}~}~}~}~}~}~jk"+Yjj~|}|}|}|}|}|}|}z|z|z{z{z{z{z{z{y{y{y{y{y{y{y{y{y{yzyzyzyzyzyyyyyyxyxyxyxyxyxyxyxxxxxxxxxxwxwxwxwxwxwxwxwxwxwxvxvxvxvxvxvwvwvwvwvwvwvvvvvvvvvvvvuvuvuvuuuuuuuuuuuuuututututututustrtrtrsrsrsrsrsrsrsrsrsrsrsrsrrrrrrrrrrrrrrrrrrrrrsrsssssssssssssssssssrsrsssssssststststststssssssssststststttttttttttttttttstststsusususususututttttttttttttttttutututututututuuuuuuuuuuuuuuuuvuvuvuvuvuvvx}}}~~~~~~~~~}}}FH+Y*GzH|}|}|}|}|}|}|}|}|}||||||||||||{|{|{|{|{|{|{|{|{|{{{{{{{{{{{{{{{{z{z{z{z{z{z{z{zzzzzzxyxyxyxyxyxyxywywywywywywxwxwxwxwxwxwxwxwxwwwwvwvwvwvwvvvvvvvvvvvvvvvvvvvvuvuvuvuvuvuvuvuvuvtvtutututututututututututttttttttttttttttttttttttttutuuutututututuststststststststsususututututututttttttttttttutututututuuuuuuuuuuuuuuuuuuutvtvuvuvuvuvuvuvuvuvuuuvuvuvuvuvuvuvvvvvvvvvvvvvvvvvuwuwuwuwuw{|~~~~~~~!b"*$=%~~~~~~~~~~~~}~}~|~|~|~|~|~|~|~|~|~|}|}|}|}|}|}|}{}{}{}{|{|{|{|{|z{z{z{z{z{zzzzzzzzzzzzzzzzzzzzyzyzyzyzyzyyyyyyyyyyyyyyyyyyyyyyyyxyxyxyxxxxxxxxxxxxxxxxvwvwvwvwvwuwuwuvuvuvuvuvuvuvuvuvuvuvuvuvuvuuuuuuuuuuuuuuuuuuuuuuuuuuuuuututvuvuvuvuvuvuvuvuvuvuvuvuvuvuvuwuwuwvwvwvwvvvvvvvvvvvvvvvvvvvwvwvwvwvwwwvwvwvwvwvwvwuvuvuvuwuwuwuwuwuwuwvwvwvwvwvwvvvvvvvwvwvwvwvwvwvwvwwwwwwwwwwwwwwx|} ( # ~~~~}}}}}}}}}}~}~}~}~}~}~}~}~|}|}|}|}|}|}|}||||||||||||||||||z|z|z|z|z|z|z{z{z{z{z{z{z{z{z{z{z{y{y{y{y{yyyyyyyyyyxxxxxxxxxxxxxxxxxxxxxxxxxxwxwxwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwvvvvvvvvwwwwwwwwwwwwwwuvuvuvuvuvuvuvuvuwuwvwvwvwvwvwvwvwvwvwvwvwvvvvvwvwvwvwwwwwwwwwwwwwwwwwwwwwvxwxwxwxwxwxwxwxwxwxwxwywywywywywywyxyxyxyxxxxxxxxxxxyxyxyxyxyxyxyxyxyyyyyxyxyxy{|eg#,Sgh~~~~~~~~~}~}~}~}~}}}}}}}}}}}}|}|}|}{}{}{}{}{}{}{|{|{|{|{|{|{|{|{|{|{|z|z{z{z{zzzzzzzzzzzzzzzzzzzzzzzzzzyzyzyyyyyyyyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxxwxwwwwwwwwvwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwxwxxxxxxxxxxxxxxxxxxxxxxxxxxxxyxyxyxyyyyyyyyyyyyyyyyywxwxwxwywywywywywyxyxyxyxyxyxyxyxyxyxzxzxzxyxyxyxyyyyyyyyyyyyyyyyyyzyzyzyzyzyzyzyzyz8:,SCqD~~~~~}}}~}~}~}~}~}~}~}~}~}~}~}~}~}~}}|}|}|}|}{|{{{{{{{{{{{{{{{{{{{{z{z{y{y{y{yzyzyzyzyzyzyzyzyzyzyzyzyzyzxzxyxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyxyxyxyxyxyxyxyxyxyxyyyyyyyyzyzyzyzyzyzyzyzyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyzyzyzyzyzzzzzzzzzzzzzzzzzzzzzz{z{z{z{z{z{z{{{{{{{{{{{{{{{{{y{y{y{y{y{y{y{z|S.~~~~~~~~~~~~~~}}}~}~}~}}}}}}}}}}}}}}}}}}}}}}}}|}|}|}||||||{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{{zzzzzzzzyyyyyyyyyyyyyyyyyyyyxzyzyzyzyzyzyzyzyzyzyzyzyzyzyzyzy{y{z{z{z{zzzzzzzzzzzzzzzzzzzzz{z{z{z{{{{{z{z{z{z{z{z{z{z{z{z|z|z|z|z|z|{|{|{|{|{|{|{{{{{{{|{|{|{{{{{{{{{{{{{{{|{|{|{|{|{|{|~pq$ww~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~}~}~|}|}|}|}|}|}|}|}|}|}|}|}|}|}{}{}||||||||{|{{{{{{{{{{{{{{{{{{{{{{{{{{{|||||{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|||||||||||||{{{{{{{{{{{{{{{|{|{|{|{|{|{|{|{|{|{|{|{|{|{|{}{}{}{}{}{}|}|}|}|}|||||||||||}|}|}|}|}|}|}|}}}}}}}|}|}|}|}|~|~GH$/ABkB~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~|~|~|}|}||||||||||||||||||||||||||||||||{|{|{|{|{}{}|}|}|}|}|}|}|}|}|}|}|||||||||}|}|}}}}}}}}}}}}}}}}}}}}}}}}}}~}~}~}~}~}~}~}~}~}~}~}~}~}~}~}}}}~}~}~}~~~}}}}}~}~}~}~}~}~}~}~~~}~}~}~}~}~}~}~Q/A~~~~~~~~~~}}~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~}~~~~~~~~~~~~~~~~~~~}~}~}~}~}~}}}~}~}~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}~~~~~~~~~~~~~~~~~~~~vw$ij~~~~~~~~~~~~~~~~~~~~~~~~;<$0#4R490# hi([[+z+(& $9$$& ӄVX*_MwM]*_  yz  !ZZ,t,!/9/9bb67,S ,ShhBB*_&*_ppOP+k. % +kuu[[)w   )wN{N=u=(ד׈($A$ ? +gooll+g   1'?k@GrH1'$ύҍ$@3&=&@,YUVee,Yņˋ4  #4&$G%=X=&VVkk,3ʼnˏ ,3({  '({$F$BYB? UUll? -7qr-7(Ž ( ͖љ2 ۤߣ2 .9  ",".9*q,/=/*q'!>!>P>'$1S1NeN$ 7V7OeO )B)@P@*/1>1*2 !޳߭$-$2 3  ѩӥ 30-  ě 0-0- 0-3sszz32 BUBK\K2 *!ͭΧ")"* ~~~~ $BUBM\M$'!ΰϬ#)#'*q *q.93@3ֳֹasBIT|d pHYs$$P$tEXtSoftwarewww.inkscape.org< IDATx}{eUuιzt=TMC݀(1$?Dcb2Qt&3>F3 D%DbH11LCp( 66ϦtwUV{k8[a\pgZs.13~)qyKyq%b7rc }p1G@8<|{/rO/ M G 0ը`eͫ0TЎ#(a7 x<w6>xQ(͘&L ;S6tq OqL^vt>fqLU8>yZ^L Ћڞyt-C`o8o9NAb{K%u11[j5Iyۏ1vt:~A/@蝘8խv^:T[}~=Y\|>Rz߇}v>?8?x|` b7p-o篶t͋ /Iz?aQʋ^ɗ׽O;TG ٵc~rO߿[its@,!,u0O@gGppz!Koo;qCO<_: }"|])h# S(u9=¹[56S'H`41yN̞%<>y\ϝo"=cַNQ)/8(a,_~rS7^Ozݫ)SyxKzCW+zlk1!\̏n<MNꋝEWww)i55Vu -ߦ&mc?ܜD`]xKjL޿/?ޮXTdmq|]s4,GzY sc4rjb7_;߼(۱ocXjMN9h-A<`]_ _iIJ !_+c}?by6s^rJ@fď1yo뿿0.7%OTy\[C7Ϻssv0q 42SN ,}ėQ+;t~PEԝ~\6P@5t gl˲t^*E{ [Wߦt\OMko]N*,}<[Mܲ~wnBIz `S- <ف2ߦzWkw\w}iŻO&4FzwMߒF1:/e)[M`o]vqT'Iz+^O)ٹV#8,ZɊ N \ڌg _I[9%s,xxa[41St6OKE%ˏ|YfҬ ;|iKOYmSn*o?#.*ml}D9|sg CxOɻz'O=Fo/Uy)k҃2o,l#ey Kp̧ o~k~RpXs+~k0+?O%0Tt\`zS ÝAw~fN5aCdA4D~mt{_>}C_e5L9_t#2mkU/: m^?J+P5tYlp ,YA|R22ja&bCN2Ob=mcu|w cJyoHoۊ,YJz` 2TجikYFVj氉>3YqF/9NL' omt=| v{G?÷^w|,\ux[or*wFM!~g@bYV<>xO_qAU ץeFzaL[.,C bigټl["KCܩր¹:;HD-g7(a m7e@ iLw]>>l7{+вlf\)/IN!*:%Gt9]1̫8qKPt&}|h׷|-ӡb.Fiq}DQG=#$ֳUbrHZAH.rՅ|dk8LH+O Oqu}>g3 \hw-A̕l ep&piy3A T >\Bo#i#j|+=a9IH2mR짧B ׍A?oJͩ!Yb+@\7ڄ-s9kMɸsdh-Eeg-K9Kw f6e)ݞ{Mh_}DA6 !È>)Gki#X#l@0f'޳nr#f" 6~ĩ>/X`!^JM6;G7+etCY!uzP [=a; A k.Hv"EW]amw6z?AC!ډ\gӶPuo-]k?xbaTK #n9(/|iLRy5 S!N#B=jvQN&9 ZW27b/zZ4El, Z7s*؀52.a%[ cV$k,3B=<ԑG!\"+>p^?0V9,u5.kkYrm9?_=ivE C)ʞ<ǰv ЦT5&Ko(>ӪI_XD${2 ƥW\jN q ?u-Fx4en0qg[i5X")l*.,1Q)3`be SOgڑNJq@6۸.bVYkP\Fb1DD{3wiXF{1AOK1Fq.M3$~d:IJ""'Dpp{{ Ʊ6W`˺WR֍|xѧW\`08FUcOF9+H ˊ5IOZINU0BPEq/Y<tfvLw*T_PT4 \է?3i+HҒ7)Y-'3Z$EҿfmPs\3 r;8U:>+cp;]N\|-ʥ VPǨsx'J3z@3kl,kf^-(6$H yN26Qr!d\S\R+;*qL%Oc@qjZybY8VEy miHO376ɩN%oV5g+@F1;;Of]CQh]ʎJ`X~w7I k&>/"QYg;;fBҺQasN 5d+CIc 5}gcÖ#4K WC3+}gnt)墟K`CϲtyX0#Xx>&Xm?V?Oʃ'dcU E"<O)?@@n][_/v[!7K:$)AR:=RXVcD@g1`bvulWun,X0!{ :e)2VW5Oϕ'j~Z L.z% X"8#Qo>=R}dnYnYnU~u~8'3L\Ro*{Bz@q2w M >`WyϱՉʄO\b>r "7 ڌttn›O){n)u,HYivBc  ^oNxvqyne>J3~IFKI&ȵf!Q-]z%"M1+8q`z>:5ZSJD1NaKĺN-3cs|3 Ecx5l,vۀ*\g=>R L@ v*D#% @!{IR|_e(7;R&!{\ZZTY?g_x+Pp|sBcLpkpKAa1 鬩,RK,@Q4ɧm]{B Lzd傶 8]be8u)qfP@}籝rI MBea0tPHAF, ,?y"kPDi׃# dT|_esisqI~q^\U;H' 8U6,a_)==?Vͨhi8X/R$ y¯$'ƥ %j]50\5 X&ab=xHo2 @%#-3j[M&wYoGfFj=)^нNP\~<6 a tUH)^sN 3AZH} $m3EBt,."v&cM<k d#|lL)H͍{#3HD9# ˌD"t-Fn'lCt_OݲALP =>)q'ۺݮUw:#D/Y~VNڥ.W7DZ‘|u#bĺN@8$s}]#kwkAˮ4F\t XDկCSUVV:܎Ի4# 0U'&^6?H)4pDkmNa>`;䂣']Hl@T[yb|N%V@u;Ps+K+]ELIRo* OԎzGs>F%qb:C[4]'(\PUv;Mr<2`A C D\S\NYMlTs3ЁJt'0qD{qbEh,Q1͉zF`|C@8x86+/ĺR*ƇRUrU4_PPN#ح< ,@n`l؄(a7UY7Y-(:dPz#D̚[< A X.Ϻқ14(lJ0MR3M;y"8E;g 8<pntMHz-.I{ $4f$X-X3)=׺#/Y@ i@DZxs./Fǫ(9pC1hnoe+BK]2AhւhJ H2]Rt,+bii_; [zNʟ,w` C.޴<]v;ۼi-<9%!Q GS^$NRZo +  N -)># Z}TWpmL?;zӞэ)6㱜mZv:VEQB('+l< +Fp(/*?j?yH#ʰl ȡipB:$0h'cM.Ɣ&nl1&:xX~5S0t;[88ZF`Z0E-~W$YCX ~t-M%#-a֭>:uPt^2F:v! c \~0b C?.<8V9?#*t@aL>3S~4v`T\/j$TYg&\/;MCglekuH~ O_Lsm:.rZ聄Y`P i͏FbGY-~XޕHي?Xt A9 }_gS@.nx?[mbYK.l -~4a*G@Nw*}>IrC_1~ܰ`yM ؝ZyX# VŅNrm@h+Idfl.!:NBgi\2p⣺#wrȄ۟@ 2Yӻk 4%X(?_~ދјB$!2yGQΦZ&T:⎤Qi &IksK{mda.{QdO4fX3G41S.2W: 9 Jlok[|ʌ-9DوIMk\+.!Sg?>הoѝMg /.k#*33g˅fqPEV.ωLβv4.#a,XOp{%[ٸ y8s: r6'&(8EZܶ|}reg0 +4}$3-[~\2,%yђ!ݯNJYԔoYO:r+xd }No>tV7q/ IKRR>?Ϋ7R;b eG$Izs䗢dlܱww{e/<~:5!\!s{eے@F 0cEJHE3Y/; a{`#|5UzUp1f*7n 7=z|p/P2@CC.+fI]ϜȜ\ =!dV~O)\I)]b\ fYO4 ?{'7 u 7Q8 W?pG}N-b'Os;>&}HG۬Spj@+tࣹ KY=-S-} I i]|{Z6"p9)~US:>~w.oa =kK?SIo8vc#j^=dX3~(VLځeOεm4ܿ&wW0=WUw &wL=9W'@`{x`༁koL(1groP;ԎTpn@1 ˊ[PrV z ~3~:N?V7Z9ɱQ>`Q$őչWm4(fj^6+* Od,2d8 ޶^Ɉvأ>}mToh?KN)p 0cIU,:g_Լ\crnRMɹI)EfuB}}N޵^8 bܭ7=^>Pvcˉ)_o1{WJ=Ō_ 3f1[LuZMM/3.Ֆ%*u9 J]΂99adofI9z p_p;vm'ת +;ދ];y1|g7o]W.@?lW9oZcOW >{PJbb8p%q8. JT̕/Q)W"׉A#ZXR~O~mz3mc?4I@0Fq%@Ϛog-߲t>Oaf迉bv#7oHnW~^:1-A`]qgЍ؋c63{gVW_n;2S_%sv {wӓɝvŷZhI @h1[؏- eQZ.JFZ_bJaavř3/p9@:m\'S^TčHo(nk-C5 ׇ]rC0dL `gۙypU쨵ٽ{%HLOch6ilW+.YQ[u~sP?BpX|<[{%Hhp|*9K ܿ[y>^ߪ:5[03ӑmOjӵ qpo/wN$ mwb0Vl%T t u]we=ԥܼ3{ S#S珺ig;3:&ktnZ_mA^Ρe(L-GKϼ9pK.9vۂU=g}s>)_1>܎\/yY@ m1c QA L0z1.܏N\6 6S?e؄ItԽbJtc ؆܁ # BщQZl9G~)8hf~/|IENDB`xye-0.12.2+dfsg/pixmaps/xye.svg000066400000000000000000000215051225403634500163360ustar00rootroot00000000000000 image/svg+xml xye-0.12.2+dfsg/pixmaps/xye.xpm000066400000000000000000000242431225403634500163450ustar00rootroot00000000000000/* XPM */ static char * xye_xpm[] = { "32 32 511 2", " c None", ". c #000000", "+ c #000900", "@ c #000600", "# c #010501", "$ c #081408", "% c #162916", "& c #071307", "* c #000500", "= c #000100", "- c #000800", "; c #0A1A0A", "> c #4E6E4E", ", c #B6CBB6", "' c #E5F9E5", ") c #E4F9E4", "! c #E3F9E3", "~ c #E3F9E2", "{ c #B5CCB4", "] c #5B755A", "^ c #0D1C0D", "/ c #071207", "( c #81A180", "_ c #DBF8DA", ": c #DAF8DA", "< c #DAF9DA", "[ c #DAF9D9", "} c #D8F9D8", "| c #D7F9D7", "1 c #D6F9D6", "2 c #83A483", "3 c #0C160C", "4 c #355735", "5 c #CAF2CA", "6 c #CEF7CE", "7 c #CDF8CC", "8 c #CCF8CC", "9 c #CCF9CC", "0 c #CCF9CB", "a c #CBF9CB", "b c #CAF9CA", "c c #C7F4C7", "d c #426041", "e c #588858", "f c #C5F6C4", "g c #C4F7C4", "h c #C4F7C3", "i c #C2F7C1", "j c #C1F7C1", "k c #C1F8C0", "l c #C0F8C0", "m c #BFF8BF", "n c #BFF8BE", "o c #BEF9BE", "p c #BEF8BE", "q c #BDF8BD", "r c #BEF8BC", "s c #BEF8BD", "t c #BFF7BE", "u c #679266", "v c #538753", "w c #BAF5BA", "x c #BAF5B9", "y c #B9F7B7", "z c #B7F7B7", "A c #B6F7B6", "B c #B6F8B6", "C c #B6F8B5", "D c #B5F9B5", "E c #B4F9B4", "F c #B4F9B3", "G c #B3F9B3", "H c #B1F9B1", "I c #B3F9B0", "J c #B3F8B1", "K c #B3F8B3", "L c #B4F8B3", "M c #B4F7B4", "N c #5B8E5B", "O c #275226", "P c #B0F4AF", "Q c #AFF5AF", "R c #ACF5AC", "S c #ABF5AA", "T c #ABF6AA", "U c #AAF7AA", "V c #AAF8A9", "W c #A9F8A8", "X c #A7F9A7", "Y c #A7F9A6", "Z c #A6F9A6", "` c #A5F9A5", " . c #A6F8A5", ".. c #A6F7A5", "+. c #A7F8A7", "@. c #A9F7A8", "#. c #A9F6A8", "$. c #2F592E", "%. c #031003", "&. c #9BEB9B", "*. c #A6F3A5", "=. c #A4F4A2", "-. c #A2F5A2", ";. c #A2F6A1", ">. c #A0F69F", ",. c #A0F79F", "'. c #9FF89E", "). c #9EF99E", "!. c #9DFA9D", "~. c #9DFA9C", "{. c #9CFA9B", "]. c #9BF99B", "^. c #9CF99B", "/. c #9CF89C", "(. c #9CF89B", "_. c #9BF79A", ":. c #9CF69C", "<. c #9FF69F", "[. c #9EF09D", "}. c #051205", "|. c #010901", "1. c #499149", "2. c #9EF39E", "3. c #9BF39A", "4. c #98F397", "5. c #97F497", "6. c #97F596", "7. c #96F694", "8. c #94F793", "9. c #94F893", "0. c #93F892", "a. c #92F992", "b. c #92FB92", "c. c #92FC92", "d. c #91FB91", "e. c #91FB90", "f. c #91FA90", "g. c #91F991", "h. c #91F890", "i. c #91F790", "j. c #91F691", "k. c #94F593", "l. c #469345", "m. c #081A08", "n. c #94F092", "o. c #93F292", "p. c #8EF28E", "q. c #8DF38C", "r. c #8DF48C", "s. c #8CF58C", "t. c #8CF68B", "u. c #8BF78B", "v. c #8BF889", "w. c #8AF989", "x. c #88FA88", "y. c #88FB88", "z. c #87FC86", "A. c #86FD86", "B. c #86FC86", "C. c #87FB86", "D. c #87FA86", "E. c #86FA86", "F. c #87F886", "G. c #87F786", "H. c #87F686", "I. c #87F586", "J. c #88F487", "K. c #8DF48D", "L. c #89F188", "M. c #051705", "N. c #010A01", "O. c #376C36", "P. c #8EF18D", "Q. c #89F187", "R. c #84F184", "S. c #84F283", "T. c #83F382", "U. c #82F581", "V. c #81F780", "W. c #80F880", "X. c #80F97F", "Y. c #7FFA7F", "Z. c #7FFB7E", "`. c #7DFC7D", " + c #7DFE7D", ".+ c #7CFE7C", "++ c #7CFD7C", "@+ c #7DFB7C", "#+ c #7DFA7C", "$+ c #7DF87D", "%+ c #7CF77C", "&+ c #7DF67C", "*+ c #7EF47C", "=+ c #7EF37D", "-+ c #82F281", ";+ c #86F286", ">+ c #296429", ",+ c #000A00", "'+ c #010601", ")+ c #68BF67", "!+ c #86F084", "~+ c #7DF07B", "{+ c #7BF07A", "]+ c #7AF27A", "^+ c #7AF379", "/+ c #79F478", "(+ c #79F577", "_+ c #77F677", ":+ c #77F876", "<+ c #76F975", "[+ c #75FA74", "}+ c #74FC73", "|+ c #73FD73", "1+ c #72FE72", "2+ c #73FD72", "3+ c #73FC72", "4+ c #73FB73", "5+ c #73F973", "6+ c #74F872", "7+ c #73F773", "8+ c #74F574", "9+ c #74F474", "0+ c #75F374", "a+ c #76F174", "b+ c #76F075", "c+ c #7DF07C", "d+ c #5DBD5C", "e+ c #7DEC7D", "f+ c #7CEE7B", "g+ c #73ED72", "h+ c #73EF71", "i+ c #72F071", "j+ c #70F26F", "k+ c #6FF46F", "l+ c #6FF56F", "m+ c #6EF66E", "n+ c #6EF86D", "o+ c #6CF96B", "p+ c #6CFA6B", "q+ c #6CFB6B", "r+ c #6BFC6B", "s+ c #6BFC6A", "t+ c #6BFB6A", "u+ c #6BFA6A", "v+ c #6AF96A", "w+ c #6BF76A", "x+ c #6BF66A", "y+ c #6BF56B", "z+ c #6CF36B", "A+ c #6DF06C", "B+ c #6DEE6B", "C+ c #77EE75", "D+ c #78ED77", "E+ c #081508", "F+ c #78EC77", "G+ c #71EC71", "H+ c #5AE759", "I+ c #47E245", "J+ c #33DF31", "K+ c #25DE24", "L+ c #25E223", "M+ c #25E524", "N+ c #26E825", "O+ c #27EA26", "P+ c #30F030", "Q+ c #4CF44C", "R+ c #61F961", "S+ c #62F962", "T+ c #61F860", "U+ c #62F760", "V+ c #62F661", "W+ c #63F662", "X+ c #64F562", "Y+ c #64F363", "Z+ c #64F163", "`+ c #64F063", " @ c #64EE64", ".@ c #64EC63", "+@ c #6EED6D", "@@ c #61E560", "#@ c #051204", "$@ c #0C260C", "%@ c #46D444", "&@ c #2BCE28", "*@ c #14CC12", "=@ c #13CF10", "-@ c #10D310", ";@ c #10D60E", ">@ c #0FDA0D", ",@ c #0DDD0C", "'@ c #0CE00B", ")@ c #0BE40A", "!@ c #0AE609", "~@ c #09E808", "{@ c #14EA13", "]@ c #48F347", "^@ c #5BF75A", "/@ c #5BF75B", "(@ c #5BF65A", "_@ c #5CF55A", ":@ c #5CF45B", "<@ c #5CF35B", "[@ c #5CF15B", "}@ c #5DEF5B", "|@ c #5DEE5C", "1@ c #5DED5C", "2@ c #5DEB5C", "3@ c #4EE44D", "4@ c #3ED73C", "5@ c #38CE36", "6@ c #082208", "7@ c #0A230A", "8@ c #3DCD39", "9@ c #28CB26", "0@ c #15CA13", "a@ c #14CE12", "b@ c #12D110", "c@ c #10D40F", "d@ c #10D70E", "e@ c #0DDF0B", "f@ c #0CE10B", "g@ c #0AE509", "h@ c #2AEC29", "i@ c #50F14E", "j@ c #54F454", "k@ c #55F253", "l@ c #55F153", "m@ c #55EF54", "n@ c #55EE54", "o@ c #56ED54", "p@ c #55EB55", "q@ c #43E241", "r@ c #25D523", "s@ c #15C913", "t@ c #2DCB29", "u@ c #3BCD39", "v@ c #092209", "w@ c #061306", "x@ c #40CD3D", "y@ c #2ECB2C", "z@ c #16C714", "A@ c #15CB13", "B@ c #13CE10", "C@ c #0FD90E", "D@ c #0EDB0D", "E@ c #0EDC0C", "F@ c #0DDE0C", "G@ c #14E013", "H@ c #2FE62E", "I@ c #3CE93A", "J@ c #42EA3F", "K@ c #37E536", "L@ c #2CDF2B", "M@ c #21D821", "N@ c #16D014", "O@ c #17C514", "P@ c #33CB32", "Q@ c #3FCA3D", "R@ c #42CC40", "S@ c #35CB33", "T@ c #17C515", "U@ c #16C814", "V@ c #13D010", "W@ c #12D210", "X@ c #10D60F", "Y@ c #0FD90D", "Z@ c #17C415", "`@ c #18C116", " # c #3BC938", ".# c #42C940", "+# c #020702", "@# c #369D34", "## c #43CB41", "$# c #1AC318", "%# c #14CB12", "&# c #10D30F", "*# c #16C813", "=# c #18C315", "-# c #19C016", ";# c #1FBF1B", "># c #44C842", ",# c #359B34", "'# c #020B02", ")# c #1F581F", "!# c #47CA45", "~# c #27C324", "{# c #14CE10", "]# c #1ABE17", "^# c #1BBB18", "/# c #2EBF2C", "(# c #46C645", "_# c #1F561E", ":# c #091A09", "<# c #49C847", "[# c #3DC63B", "}# c #1ABC18", "|# c #18C316", "1# c #16C614", "2# c #17C614", "3# c #1ABD17", "4# c #1BB919", "5# c #1EB61B", "6# c #43C441", "7# c #49C347", "8# c #091909", "9# c #030A03", "0# c #2F7C2E", "a# c #4BC949", "b# c #29BD27", "c# c #1BBA19", "d# c #1BBC18", "e# c #19BF17", "f# c #19C116", "g# c #1BBA18", "h# c #1BB819", "i# c #1DB61A", "j# c #1EB41B", "k# c #32B930", "l# c #4CC349", "m# c #2F782E", "n# c #020A02", "o# c #000200", "p# c #4DC24B", "q# c #48C546", "r# c #21B81F", "s# c #1DB51A", "t# c #1EB31B", "u# c #1FB11B", "v# c #26B122", "w# c #4CC048", "x# c #4EBD4B", "y# c #1E4A1D", "z# c #50C44E", "A# c #45C143", "B# c #21B31E", "C# c #1DB41A", "D# c #1EB21B", "E# c #20AF1B", "F# c #20AD1D", "G# c #24AE21", "H# c #4BBD48", "I# c #53BF4F", "J# c #1E481D", "K# c #020802", "L# c #2F6E2D", "M# c #53C450", "N# c #48BD44", "O# c #25AF22", "P# c #1FB01B", "Q# c #1FAF1B", "R# c #20AE1D", "S# c #21AB1D", "T# c #21AB1E", "U# c #22A91E", "V# c #2AAC26", "W# c #4CBB4A", "X# c #56BE53", "Y# c #306C2E", "Z# c #020602", "`# c #306E2F", " $ c #56C253", ".$ c #4FC04D", "+$ c #31B12D", "@$ c #22AA1E", "#$ c #21AA1E", "$$ c #22A81F", "%$ c #23A71F", "&$ c #23A520", "*$ c #38AE33", "=$ c #55BC51", "-$ c #57BD54", ";$ c #306C2F", ">$ c #214B20", ",$ c #56BC54", "'$ c #57C055", ")$ c #4BB948", "!$ c #36AE32", "~$ c #25A622", "{$ c #24A520", "]$ c #24A420", "^$ c #24A321", "/$ c #2AA425", "($ c #38AB35", "_$ c #50B94C", ":$ c #59BC55", "<$ c #57B854", "[$ c #214920", "}$ c #387A37", "|$ c #5BBF57", "1$ c #5BBE57", "2$ c #4DB74A", "3$ c #47B344", "4$ c #43B040", "5$ c #44B040", "6$ c #48B345", "7$ c #50B64D", "8$ c #5BBC57", "9$ c #5ABC57", "0$ c #5BBB59", "a$ c #387837", "b$ c #030B03", "c$ c #0B1C0B", "d$ c #295828", "e$ c #489747", "f$ c #5DBC5B", "g$ c #5DBB5B", "h$ c #5DBA5B", "i$ c #499548", "j$ c #091509", "k$ c #122712", "l$ c #091508", " . . . . . . . . ", " . . + @ # $ % % & * * + . . ", " . = - ; > , ' ' ) ! ! ~ { ] ^ - = . ", " . - / ( _ : < < [ [ } } } | | 1 2 3 - . ", " . @ 4 5 6 6 7 8 9 9 0 a a a a b b b c d @ . ", " . * e f g h i j k l l m n o o p q r s p t u # . ", " . @ v w x y z A B C D D E E F G G H I J K L M N @ . ", " . - O P Q R S T U U V W X X X X Y Z ` . ...+.@.#.$.- . ", " = %.&.*.=.-.;.>.,.'.).).!.!.!.!.~.{.].^./.(._.:.<.[.}.= ", " . |.1.2.3.4.5.6.7.8.9.0.a.b.b.c.c.d.e.e.f.g.h.i.j.k.5.l.- . ", " . m.n.o.p.q.r.s.t.u.v.w.x.y.z.z.A.B.C.D.E.F.G.H.I.J.K.L.M.. ", " N.O.P.Q.R.S.T.U.V.W.X.Y.Z.`. +.+.+++`.@+#+$+%+&+*+=+-+;+>+,+ ", ". '+)+!+~+{+]+^+/+(+_+:+<+[+}+|+1+2+3+4+5+6+7+8+9+0+a+b+c+d+'+. ", ". '+e+f+g+h+i+j+k+l+m+n+o+p+q+r+s+s+t+u+v+w+x+y+z+A+A+B+C+D+# . ", ". E+F+G+H+I+J+K+L+M+N+O+P+Q+R+S+S+T+T+U+V+W+X+Y+Z+`+ @.@+@@@#@. ", ". $@%@&@*@=@-@;@>@,@'@)@!@~@{@]@^@/@(@_@:@<@[@}@|@1@2@3@4@5@6@. ", ". 7@8@9@0@a@b@c@d@>@,@e@f@)@)@g@h@i@j@k@l@m@n@o@p@q@r@s@t@u@v@. ", ". w@x@y@z@A@B@b@c@;@C@D@E@F@e@e@e@G@H@I@J@K@L@M@N@*@s@O@P@Q@}.. ", ". '+R@S@T@U@0@a@V@W@c@X@d@C@Y@Y@Y@C@d@X@c@W@V@a@0@z@Z@`@ #.## . ", ". +#@###$#Z@z@s@%#a@=@b@W@-@-@&#-@W@b@V@B@a@0@*#O@=#-#;#>#,#'+. ", " '#)#!#~#-#=#T@z@s@0@*@a@a@{#{#a@a@*@0@s@z@O@=#-#]#^#/#(#_#N. ", " . :#<#[#}#]#-#|#Z@O@1#z@U@U@U@z@z@2#T@=#`@-#3#^#4#5#6#7#8#. ", " . 9#0#a#b#c#d#3#e#-#f#`@|#|#|#`@`@-#e#3#}#g#h#i#j#k#l#m#n#. ", " o#& p#q#r#i#h#4#g#^#d#}#}#}#d#^#g#4#h#i#s#t#u#v#w#x#& o# ", " . 9#y#z#A#B#t#j#s#i#i#i#i#i#i#s#C#t#D#u#E#F#G#H#I#J#|.. ", " . K#L#M#N#O#E#P#P#u#u#u#u#P#Q#E#R#S#T#U#V#W#X#Y#K#. ", " . Z#`# $.$+$@$T#T#T#T#T##$@$U#$$%$&$*$=$-$;$'+. ", " . K#>$,$'$)$!$~$&$&${$]$]$^$/$($_$:$<$[$K#. ", " . 9#$ }$|$|$1$2$3$4$5$6$7$8$9$0$a$$ n#. ", " . o#b$c$d$e$f$f$g$g$g$h$i$d$c$9#o#. ", " . . b$K#Z#j$k$k$l$Z#K#'#. . ", " . . . . . . . . "}; xye-0.12.2+dfsg/res/000077500000000000000000000000001225403634500141155ustar00rootroot00000000000000xye-0.12.2+dfsg/res/clean40.png000066400000000000000000006531231225403634500160630ustar00rootroot00000000000000PNG  IHDR  phsRGBbKGD pHYs  tIME /mwA IDATxyxU[ҝ @XBADvDTtOQAPu0.Ȉ0 GYU@@HBNwGU5՝dN`몫k}:U}Mf]{N@9@!p8{nÁ4e5dn5(jPs ԰[Cݞ/MYnϗՂ Wc؍. f}̀ Xˢ/ 7"@j{X ,ԠMqkk<_AWhS1]HHUoxTk ]y~21roO|&=@{ ;`p7W $ |k nZ8ȯ箸X&%xTpFҞ4{%..f͚,υ={C߳f.\?gXk1`w YyT4 xxVvYi{OKaFD h4EΝ;Ӷm[6nƍ(--u?o0 OEgl d ɔeĭpxh$8J&}^t.0AѠ$VY}&-2`m ]dj4_cJeH+p*|iRf%^#!d=~㥗^GlIKKclٲEJDFF+0d5kw eee;wUVM!Pw!Y(jp4c$ps۷'::I ȑ#|w[NM`(ٳݻgy~ѠAA@EرcopeCffuޒ*@',))BCC}2JJJXv-V r|Һuk @xx8JHH(""et. @AA呟Onn.iiij%OJ``7l0lI;3w\nݪ] IR;%vgLA # U gC\︚yHA*.sT}rȇWHHe1LYѡC}zUm6&NHzzzJ1^+Yv-M6^d:t+`T5F5:w̴i6lX_̙39xT6 /6111BTT'N`ҥW_a0X,OvU:đ#GtԩS z ߩS'-ZLIIɓʪ%Q@pN;v,΍~!?3:I1cXfٹ]iXtsܹO?T+@;ErMljժs%*w+Y&# w9iGDsX<.BF@4h;5-S9C\jB@"u !# =$S'd%{_d޼yF3Jrr2 ,P^VU%Cƍ駟h֬Yƹsҥ "Rɾ*X iX?\Vv+\zGyVWG1c`4ٰa?|  o߾q}ϙRa֬YYƝrK '3*55E&8ɓ)((@&Ӂ5@ ] NJJb֬Y BTF: Ipp0ř2ebiX(ٳIܹdZQ1fE9Hq[u4|H\--+|IwKֿ4x N}Jus2}HC4m" t&> ɽS}"9=5ߑbFko; V$S'/A `Μ9/ɿ3g'OVR0',ΤIWϟ(Y ] 666mzEtF  Tn}SN<Q~~>$<<Ç_5ʯ]v.boUrXZng}[r%l6a8փ;a^xA`ԩ.**rw;IPPEERC~@VB]p` 99#F}?("Hna>#}XF@|G@\/uAxM# 4x\RUupY6+dRMhȥGd=y빂3H̷ 1 qWbWYf|+̘"HC`Ȑ!6X"u`Fҥ ۷ocǎt,kZjW^tЁ{dffҨQ#._2 9szEN{ԫ_e zHjj*sf񧋐%ƤX,J]222ذa'Otuܿ\oyy8Agh٘3gB/S]6laX6P|9zUY 4Ԍ,*خ^ U^M6kWl͆UGǪ nǘ1cܭ>9v_|]$<]uzF$Cͫ0nݚ4ý.KƍIKKG8q.`>[E=G֭iӦ &|H>C4h`ԩڵ 'ի뮻۷/̛7~Ç3qD<,,cZȑ#ʦ|,ݕH'mtR/_Mz99y PΏ?F#'OddggӵkWF ˻cb޾ ϳe.^:u*+wul۶ A뮻>|8Vӧ3sL>̊+q +WdL:nݺ9/B߾}Zdgg,C | o۶ǏsUʰlt:F3H; 秲#r@ |##v὾X,.ر  n2)ŋILL$,,gDä#?\Qh"tB\\s{`` .TJ@f3s婧N%O{`@o0H iDaz8vl8l6vlm6v;e9SBBB;w2i7,ӵ.Ѡʨ,ryHuHhRxRY`L ,XAU sUecŸ'kw[$ @={dѹsg ƍ^n 11k:Or!VX/t:O>$<ӦM_$%%#G:iѢ 2eeu2Rqc,'R\\Lii)zq8`h4b4Znfuu8̜9S^7Gnd$`띳^bشieee4lؐ={|ШQ#vA^^6mbN+o%{Psg?uevU]gΜɲe˜wOVL&g;'tQQQ̞='rۡ#FDzWD /N+Q,X"VA (J2 ̞=ۧ!W8ODJEթA[-.X\@w/ޘ__꒔35+qc_ 8$%ˏ)u-֞?.:a>#>|'R / ڴiÙ3ghٲ%(2uT"##7n-[d̛7h8wy???JJJ8q7|CϞ=9z(5 ߝw YHcZy駫jߒmٖr8 dkP[@ ;wΝ;{LH9x i1LE: `e{ ]222~3vC!5mX@Ǔ̜9sXxF%Kntu: r8Kt]iE6 j#dePrE 6HIDɬO|Sp{ b3B5\C<PR9^}%~q-8@&kU zMVL{TPP?(16l ֭Zrf`jѢEy…|'NP\\Nlbbb<$!Hn[v]T O@*)" 8g| )`6^nݚ ;;RAxڴi[ORR'|,n2'JaHHK_#F`ԨQ@p<ܸ|DvYYɿKJwq1k PPKؚّٝ϶K\P+.fuIIץfl¡T5j2~izcYI PpR+_c|T_y_۪sT=#;1 7# fmO>vw{pi r Hdd:[VݽmG ""Hq9X3n8&LoFQQ&L`ƌl޼^z8x't[R^^N@Р ISvlɻTwte6mDΝ غu+&=z8 ȑ#GȠafUS t޽,iYw^L&?6 ~&3322GC8l6jVȎv 8}G \NSYgd?΢Eۿ׷riP36ޤkVA@׃]qV+ mz^3f1DQl<_n2eӠAíP*fHTG#a{:G.Z]jlCMBDDt@_'4[jAq u͎AaРA :`PjD**|g˖-ݻXf3/wVW8wK,!2RIKKc̘13rH>dĉ_c6mJ$r<Œv;;v젬L) ʕ+fݻwУbޤCʲ5:<ׯ'++ Ʉ[ .Q>rzGR,HW\!//OlDAAV;vXB<{uرcYh.PX"mgO>dE}D%ؖ,AXKƭuk :0/>::E1vz}a& |8T~*_}W\aܸq,XYow3f裏fN:͛y饗xǜwq/2(o2h ̙ѣG]k޼{z% ҹsgرct:X,N={н` HCC/NkO lݺ"""8p <yf> RPP}\ȯ^wr)}Yűl2f̘Att4.]0_8dڴaa%%{o[={ `Cy&MdbŊ>|+Wrax t:-Zkꉀ(@*c0ٳ`(nM(ҡC1  vY; KJ:DuN'Lo׎'[SxQp61GvV/]$!T+ K2j~;@o HZk֬K.>'##H^^~-=&e;t رo/: eeeNT^Q/Нb]q ÇZ4o%<;;SѣGEQ;t:i_v?iDj2y1BPP)V5   t r[v{>// IJLLtƯdgg;cZnMVVgϞĸj[@/^́t.f4uewŢYC4%_# 4*ɖ-={5=et>mO5$Ubp_tڜv:HgYErbcc _ ""¹uAv؁ 22lY :6ymsn(lnSXX$j{_˃rM 6o?%}'ˇmIm=Aisw ={uO?Q^^lFg&4NC/FWrFv???4hРA:FRB>H1M[@ `5<æq >U"/,,0]pSBmY[N݈p8*(f`Z7n ܹ3Of߾}H߾}O%mݦ[o1|@J۫W/gV3˗IwuP2$ sVގ'--'OҤI{mٳgd׮]Ad29+rtH<1oEDA@A5(V!Q)--e{=Yv鿋v"lvZ1DQdΝXVkO>ɓ'nuJ6?('SN`˖-\rţ vIhh(}qVH! )& |T=U;?uKYWKY9@xg IDAT#'\?cYc+ȦM\\u.Xrܹz' gϪ3-4@NN6TX ,l6sW\aҤI2x`Νr֭[Gqq1k vO)Y /C=T̙3]3U Q`Nv޽{iԨŭ{[>Lǎ3LI%\zQn!DA+cD]RU `n!"~d6nMbX޽5˹; rJj[Vٸqc ~QA(bX+hР c|ѣR8z &U% /=JTHp[lWHc@GGұczˎ; G#GP?9Ecǎ4ir-"00Ο?Ov*(۷w套^"## Y4iÇ_+qFiݺ5ϟwVYw Dqhժٜ:u;v8)b7oLzz:7cǎ~-[ѣf@8[y- oOmq>T#6[pQ=Ltt4O>d^U6 ~,L^=z8pcˉU+VQkcQѿ<ȱc8tϟw ߹s'@\\;vtĂhS%_M & .Iiu8^5=]p7Z7PܮzBri\+\\\l6K.b>~ɇ(R~ڵ27vB;ضmj`]$t: o6 YYY۵zl߾S2tP^z%Ҙ>> I 33Sr'Ob(uڕ 7nLE]v!36uÁ %(fۧ3zhf̘T` L̙Ҋn+ڲm۶cyMΞh箆F3221cGvwS\.k:AVfΝ;EӸ J@u\d qsNG||riP3cL_~^ĥ8 ìw8#!! bCA<3~xƌ㭱JV_[RHf#44RjXXʽ.Xj M4a޽yoEEE9cOQ)5b5ɦAb.ת7͍( ,`ƍL4ə֩[fE5ܐ>|xSg?5i߾=ddduFPfcEJee+|rY?%% ?$M&2++Ǻ_',\\' %l6Hl)+(XlT*+,קO+{6mnڬIT$%%MqqK@;jKC  Qr=*˦u >euH@j nɲ{pM7/ԄɇB@@ y LFE@jD|~ 3g2| J`٘9s=ODQCXXyyytܙ^x{wѣGSVVFƍ1̝;>#GGcvŞ={ӧ?3/_q.~x -(( P!oVO2c ._lo鮹#yI_Et<(tE+tÁC^>oͶ"fC˗ ZbĈnǡQ&Y@JmRO>${^OiiiV :q;S(p8>Ʋ:픋"R<6i}tt4w{~~/fqV+.\ 11BҢ"vA^^eFC*PgWCQРAíH.[¼6R6{eÑ*0E ;Tv†k+R^HYW5f$!׽B@K&NH^\j<23 /&O,{N_СCL:U/U[}4gڵhˣm۶.qZvwR_tL6cn_##Km6ʨE Hff&'OfѨѤ{_i?zAv "zip8Z$v;͆faK͆fnQ3/^|ɓ㏉V2An_aUwzM~~~~.nl]! R:'5}ǎ;tiii$$$кuk=w^gQ͞={j!B(MTAѠ?/ד^^^@O$O7W^DJVLSyhtI}Y%ׯo{VygձHQ՛qEW^}nڵBjEnn.#GD@yv?L-ׯ_X)} vBBBtk׎>}0zh?΀\q%lž={xZ9M$Rc,\_}ns5)))!%%Ev7jsԏ/^t:VE HVV"[e׶ͷqdɒߺv;e_}5j8?6  0`lj'h4:8vz#WE S^ůW8tO#eP C[O_mۖ_ԩS/ի^s9s]7՗8s v} ?q] `.L .0p@N8Cf e bС ;iӆQFŹs8<͚5#77Y}RPP 8v2A#QM3\/_.|Ar9vb@֮](kO; ^5}87+R5(?}zR޽0j(ƌB\S)`0p]w޽{EJF#wy (NgQ&UԠA+ ;@3$H T^"ܶTr=_2`c̞=g뭷u^`^Kuook)R_OϞ=Z!===z(Aݿת>>s-[+(ɤ_wѧO{s5~<իS d^y 99E@HyUWB"ZkWDN{W^ydVϞXI\P ::xVZ^]F Y~ޒeРAC ˢ#@J[TYF׫)&!N}7=؎TCV;.|S'oF>3ΨC UVd^s}*++cҤI|.= R@'tFDDo>5kVܹst҅\H@2HYZ,f͚l,X)S(~Gn5|LԱcGtB뮻*Mep87oo߾<ӮӧOӦM~m ]feORѨTgkoL''A\Ջ?Uo49rHSLa֭kA֖tn jX !&ֿ4x !pJq 9~@wu\5z5!R+g}HIIR7l@jj*zd[>h4jԈ)S0tP7o2Μ9Ú5k_d9&0ɜFDD<IIIoߞr Nȑ#l۶ 6(EA38jD2:MRR=;vHt:6m^O޽ deeQXXȏ?HFFuYF2$RRR *))aڵZJQ4c_iw+E*(Yؽ_~`tWVnݚaÆ1x`VD~~>sU, y@4RTO|) 0pBCC #44Iޡ*␃lt*:A#??\ Ls|hAW ȏHj wX(O1x+v}"8IJJ"..h+Wp>֭[hjXdL "e1#䁜R 9Thffx@ֶXͭE6"C:/H`iXSOe=Dal$%D$eVU~wF L˟ ڑwf]@-ly)Ϫ)uO@6BUe^U]iAn@@nG  )_j)TY#kwCHHGM: Rǩlw5 7 R=fTEJ^ 7=4Dֵ}TȠֿ4xgV6|L$4|$+67)$H߁9 ͆-j -X$wn"}RVsH?Zh LUڽ5REEqR-Ղ WhW"*hDj@Jv)8!׊ C\F 6"Y?nu8T14hРA5ǀ)V!@&~Hq!*BcC )S}!ȟ%~nE ֻ6^EA! DsҠbjP_DT1 )BBq U49TR) )RP5= Ҕ/EY! )5 Rَ|5dZVr"Ҟ} "txܺA蓩펛"ZH7n aH֞"'T+0Z Ѡ:AEQ4  Ff/z^픕 VUZBiiP\\+//$$WVEJzUiiӦ-;u8<<lK<_>EqDe 4ǡ`dg 1Eu2*7.kM A^LazVvmuokР +0h^/flV)l߄˗/Z˓bһ<ίk1cj2{բ(9}t^?ܼy`2<+!!G}Ԧe˖% 3{M6ۗ-*=8Cݺu#""Dxx8۷oW6sEMQ[v,x+W$55DnT=P~@JJg hd21uTۋ8|0/_m۶NFYY 6SL )))Ӡ*[[\_Pkĉ$''3bmbb"[ĉQr_~i?y B-f1PH4h'{6!cUE7ZT5D.j qwHAJ>/(F5 :!H֏&AÇ /駟nطoFaH&*!#\F zbرĉm=QFW Dr Z6(YC-uobbb{ǪO<111%jqW͛w/,EM5}Ov޽С>GqQz).\Hqݠr ӧOgƍX'cbb1bGuJd 0`(2gl6cT/KTbXX,eddaNeȐ6ًwp.}ʕ+9yd4M`0~nFbɽ\,S}YŸVZ1x`RSS׷oG]}}QӪW $*kV i|C4rE/m_CMB-Q?RG Yѷ:wNhڴRFTI#/(Xޮa{DDĥ»Z\\\_XXho NWٮw}7N&G*٥qƍ$$$7n_ci߾}'O:.\pʳc %lْ)Sxtz*?0W\d21i$=ڵk1̜9Lڵklf߾}X+V/C !!!ߟ~ӧO#7u$H۶m\z2l6:шlb@PPDPP!!!.t%]"K@, |2;v젠@BB[I&ݻӧOsEzIXX & _Z8b;o9eYk]Az}3 2W,. 6N;*ʻf~}c !/JD+ ZEVւbX*ڊWXVTD$@vp}9$}]seyyfwz~pUΝ;@ʺ;Fe줥mѣ3d޽;=)))ޱcǖTWWw)ThȐ!;v& F_|{F$f͚oAqq1㣏>"..}Q4rAԶFhdPq۷:p\x^ VIшd ^x<<O Ws! lF#& O%'''˔ABByyyTUUa&Mi/b4bUk%Νvر6Fl̛7ӧS\Ε7ЫG?}RR'C,U&,˘,#(exd7e˗˚56̛7C+[ ˨I3eYskus8T{LknQwK H6dP&۔ݨEŨz1gRv!!FS'τt"?cǢ=KPbN W $@UX, :Tѣ|Iaܹ1DDLL޶+28,={Lҥ;w ~*J):b4p$1$77]va^`" L~7~7Y׭[hk;gg3sLϟϛo>)y` `1"6 `E,bEUR#˸$ $!ȒY~#f9sfUq2A&=!]# GAg*~ 9 6 $!͑(cچ[П n1Q Q"V*~iϨ2BHF>L&!>>^+>}+\MԌNQG1PT 1 %=TbbEњMJJRRRd3l/J=4R9bĈ"vk}q]H .fyԨQ%EEE1Ml({4|p(744| amh YS8|hU$șp'nK}o߾DFvu\**HP7}'0hĦVDhHؾ}{( X4"˲U%Oދݮ[ofyvѢEz(OcZԩ lll:tC~z$IbٳEf{={=ebX͛ئW^l۶-p0hFDgTN>1%Ib͘frrrg߾}䍍pfQ*`0vCxH+uزe %%%8q#F4[`202QTbc7 EEE}1`$Ii&<Oh(,,dΝ?N:4LƬW,YDwL6XElbE,Y~(7$)~SU8ԩE>_`00m4GiSY/mӡCG˯&T5*_SYG! Z~+IHK>&]ˀ-ʰϟ~ǜ !xZ?F9-ݡD@D&gdd!XVyyyx<M@0]vQUUEmmm@`˖-9N-/  vCDDY^R>JJJ0͘fO(//XY=ffQXFXWKmm-UUUyC^^^ \-A{Yd ݺu+VTZ^5+#ةS?4Rȋ#.^yb 6Zi)%%z[uƒ%K{~'p6:p%|X9 !AG8*]fl]w#xD热 b}^RE68ŪKDIb @)ۑ3sh>c| V5r&C4Lrrr 5g3x<*Q_Ͳ,G#%.O 2I%?UTTt68p ԩSFu`3\'-TEMeٺ۷GTy晫Qlܸ~1p6MFՓ`,%'g`֭M$5PBrT5W}&]J MyB 0c 6>jc~[8>S ՜fH-!"Z -LJJl\v %*ŋaSOVsIADFFFvEr\8vV \Du֭Ro63A 'O*g3τx>|_x^L&>BTTUUU,ZÇ%8ydmƦMBHΝý" Z%PD 1!!VZX, 8DF#FϷ~  6e˰&5',͛BHǏϞ={ػw/{k#_(be% 0 aAPꌚ{bb" `lٲn Պ(vZ III[n~R٢(2arssٷo[la֭|8$93V6ݻ3|pFA~tqiM=8ssp$soDjD]`Efˏ32۱c-(T|\(αMk wP{y#mK`??(L:5a/_.|!Z$DlHKKb4%*UuVONY%*фÂKSe0TKFFo촬EǾl@fYܗm^f CxdggeYTӫWUVr7n۷oh4t:CBy睳n:6lرcy$#G4G@1XVپ};.eeN'.>L&Sp 6E0`z!@URU\ӡ:ѡpOFsB\-_{}}>g4Ej/BFnOX?xy@r.SrwVh-[&5-EHTTǙL1Phg<MP ;a( v`CL$4Nr1FCLLR-&&g4ÍT7|C߾}F$Iyf|IV^ͧ~)U.PHII!77=z3j֣>ʕ+F!!A<On@x@, >={xҥKHyYYY "'''^hј30"J@b6X,vmXV!7߬vH`@ \јxƪ@k@JYY))Juݬ,JJJ8q{!###;w"bHiŒ6-nYn <qFF@tp>DQSRIC#J{Jjն2Pg*"vY;4Ugٲe-9IH,,˚ؠ/3 (_3{ _^h2^srq6frm`xr,<\uU,Z[RPP@~b9IHHb**j?ʕ+7  #G$tf `4444y|ZwL[;|@*)gFGGr(4-Vٜ<q#|1j*)3M)Uꫯzl6ATBܵE+4-Zx`zC: |6QRXcrYZ0|>ꤺ:WDDiШ-Hh١,ÃR)˥|/+g2>YW6i|<2 bѣG1Lrf9jOi&jkk aPQQA~~>qqq3Mll,VU' %([Сr oǎ`wn`-ﯺ aÆ,Y%ƪ].P\\?~xC}}}j VTrF|!1\PrzTOIݿv)))-m 3o}πsRl63g =z>}ƍXjnΝt߁^}QYreYxSmS)(ho"8bv;ٳG;~f3v]ͯ5:nYV$ :w!I{_gܸq\{L2)Sp2n8~^uH~ؽW8nhaM1ڳgvF༜C 6طٳgOHxYٽ{76l IE5="w6:!k0IgnA]?u}09*Ah J2y{TWWS]]{5?I>^]q IDAT5nUQQqfSeI=9Z:5*)JeY.eYy<(--<V淑їHwg˖-$eeeUr&~0!\YYɆ Lee%HH$jxgFVVV@);--^x~;$kw}x^^|Ŧ- $$##K^^^P¹A`޽TTTݻwdv(ɲ-Iχ#$I]SoRPPBc|&SlrbtQPPoɃ>ԩSYvmGχO}YƽcF dΐ ݋ 92Ч$%###~{[< :*\U̻wf444Psss5-DnDv(C)8п5h_<|qm+\H˚5tY{jɲ1-WEBe˖q}q}l2|>RwP§T`v:Rqqqɓ'K322D̮U=xO.V$y< ***4]$þ?Jee%uuu]1cƜ&MbҤIzk>;dҥ|W?~]Dv4 6SN4-d޽{ Ç5Y (ڛݻs~?w}7竃YUL&FbÆ gN 8@$ #F7/>%'Wp2~SYYlK,c4p|8w,$xoJD7LtXG:(:m4M=^e =>vy%mZ_i$nggȨQBry~jk' …OTn&l𞥧rOqJ?QLmӡ-+`pR=!-4A><n- Q]7E> ߶9 ,r5Vá}֕7~}.ߵ|hPOJڳgOŋ<hnjsHT;4EݏVFzYdÇlٲÇNnuY: QZZZ駟&vmU?N(~{]aѢE,X P+O;믩 8 .d9JI2:A~ѭ[7&HWpZ]K/Ċ+`jo+*b ԙ z혂!g,_{A ?Id̙B@~<(VW/)7v-Pt@1cz"z"##1# fMpR1n8hhhIG[qh ʲ\@hUjAҡss$d8Jʍ GP?6α%@o|ߪ+{C>VYkw=0Gæ5CZ@Ae]]]8`qӦMq]t1 v@TKʂ HA V: J3leY^ xeY;w߿^YYizѪqX28{䤤x<!???}݇ af lݺx^oX0a555,]3fɌ3~ ̘1}Aӟ?fp|> Į~: x<͛ p`1 gUj.oQO~œ9s^ JP+BY0rժU*0bŊL&O֦~搔>'yΕp8DzU?4p8O! IvnӫW/ztXuUѮDѵxKGc{ EB\ ĵ|ToCG`r+qo̫M =c1ә,YaONgѣA*i\S!ZlB0$ 4p .K$I@|Ԅ]@aa0s̋Yvm Kh:1 Fdff""fذa8pGzYx1φ&6uW^yeH~m(//ՠ)e@\uu5 @.xF5/P5XcC#EeҥY;%+,#M;wpq]=xR⌋Ze|K91 YFdQ/,++YiU5 .$###rUp!X\wWl֭['L# c*{@|>;wP^^NNN111!דGUUFIό2iOS:tl |{Ia;0ފzi-h z9%!9:\K+ ieUI"f /KTzzzlԷo_sϞ=Q%A@,((BTS$Duk. IR(>L GIZru@ .]Ejdff~WGՓ)6\ $IC=DJJ ϧW^<[qƱ`.]ʕ+Yd ?ٻw/{!::ロGFyyy 9}{?6a}ӧOH"q!l2p/XOEfϞʹiwLzȇVh'|GzTV>hIvAf0`10 gW`/I}>D$aA+?kgI߳|I|M/nF;r g uX,mwM b4?~GBbŒvq{Z$t2uY##!L>Ydv˩SN:k#Mrjj KJZ4/ԃ?ہtV[[k*))1Ȳ\& %]D0U 6nsu9.ՙAł 4{ YYYW?G;TǏ?yIǎcΜ9ݛ\x7:t(/UUUo_3Net:5kn_\Ł\KkpvhDzu~XqjYx7.DûU3MvV{[< I:ub„ رBmFII &Ga/?CTۢC"oj6U:BǹHH)%LCG 6pQ#;LѣG-׿YC iȨ2Le Tni.7ck ot8bq֭m۶m6\U5*Qb z+k׮KR`0999,Y|۾[c]$+ڿ>d ~RLn:n7$_nGRVVFΝIKKk׮r!x|>Y'N yٴi'OfanA`ޭZYYv=PYYɊ+ o"`)YF3B0wi7rk֬Pۻ'}֯J)Sp=wf9\}դ}vNPDkM&C NG.qSN:}s xд½*k}v"8͑61B4n4 ތڱcǖׯ{.$=Pf*B@jjjυ<͛]w\eYvǂM0x㍣oVyڴiEp@ Ycǎ핝۷o_>v* PāZhFM^شi:qqqLiii\uU̟?޽{1i$F#wy'QQQkݘo!j*.\7C-͐ deeQXXp;Jmʠ}7u6H'T3̜9=ڛď~#}$*CO>Icǎ!BUٳguuu1ɒРؘL&wӥnIK@$x,_.2~'oڣ-~C脒TQ M;sr+rǁnY "!B>2b@2J}*!U={vȑe&cDQLHHZ1`04Onǃr߿_X~=۶m p.u`S(94<|ҤIgϞMzzb~YY?L),,Nj/XŸYY999-Z`0'g]vΝ; Ջ1_Ruͨ.--%//ݻ#2gϞTWW}G.]xkײa0Lx!øJ5ڛ;~3pH_p!9992;w'*6U/8HVp+\`T K {,?&&y5Yk%I#q g-$xt^37yzJEZn?k֋ܔA^w%  Yٞ дXa0~RI)A9ǑDhdj_nD3\+P<#W_}u͆ iӦ#3%%%sα)))d}}=%%%QQQc䂂>,8qB8ut: (ŪquBs =ztvNNN /bzqqy曒/r#1w^H9q%!!ZB/u]7o>YYYyCGKaG Fǹ;xGؾ};snx-["rgKyy9}~?|xiРA,Y#ǓYfr ~d!|lTq&dff`$ӦMc׮]BS GE4{7d\. ,bZ[QWWC[oot Y#w." [&ڢO=gL$NQ&ϧ^ |K2q7-qbHC%W-(31֡@L>}Rw#))))55ՖlHKK5RWWGII 唗 ǎ2mp}(Y(6(q7~[jf:BypwٵkWRAA/m~UUU 555*==Gz4hP x # c^ˤ j?%,\W^8~ӟi&vʸqZt׋vhwޡ[rY(So-#P\ƍc֬YMN'k֬? kEHsBԛ틬,nVnVj,XyP\ŰNtGVV&L 11@~QLL ,#2*-T ^A@TUUQ]]Mee%k׮ *1պڱ 90;󡏯Du(aWZ޿(Q DK8o "-JZQf(3& l6l.fjԙJY /RC-x^t $:mlQ/r|6͢]Hӟ6lz~?[W_M㏣cvcn1ٳSrrrTttG)9rd~Gukllt9:Tp8|Z\ybXE1`|>Ç?ACY6gJykR'wp%.3QD#/Q*! q/åB-J̇P9m(^ɑnv#Up·}s-7`h^ R5RU5R3M9=XJDH@`ͣj4`HlH C5Zm羷ū+\CKmA$0K5 *&֠{ @n'[ ~j>ޑٚ(a' %D+~gG=S%Y} H@f kF(W_ˀowiFxR7P;ހe9 %d=//ڕ>:tW2qzS}%$B# fq٦Ӛ":*YiPfU3O..^!JnHV%. z YA}|u . U%*ghJnh8QfN(PCPRT@)GJoyz$%O5 VJ#ԥDL@=9cƌEEE[n !!oӹsgRSSIMU"|sZprdY.EFF&Y,Ƅcƌ)ٻwoHzPSS3v666=O5N}jh7$myVSM{J" ֳ_5T!"Dyl6ӿn~?۷ovӹsgDQR__lfֆ ˪l.2ec@Xr/ZjՌ`ʔ)L>#Gb0ŋYB+O<7|1DN@t!ӆbR|츨? :{||1++gϞ~S)**2+i Œiz (+U2r>Ux lrdI~29YCgK lYH^W2S3Q<X+RM&nflTVD Lz~ADZ IDATN.Z܎@Q٭[7*HKK#;;Z ~?\HDYY}!**^{͛7STT4=K az\/K!G@2eb#Fł >|xuVf͚E^^rANot͊+: 4ܑ|u4*99a`0I&>:d2jN6rCC&ѣIJJJb?tTTT$TVVN5rY^yHJl5=zf2[J@ -rLiϭ"YsJ٩kɒL~Tk2ڇx ]"##Hvv6z fǎ\{DFFbCcOyy97o&Q 2%ҠAXdI]Y̚5Gj_Uˀ7awу {%'''/ ;wDE, VՊf ,wv=d]{ݎ(1筷b׮]?͇;A MU\233 qiӦiJE@B\L H'x")//oW~~~d_nk̘1KNNN٨Q͟?B' :ѡ 'n%h{0[ze0an'%%E{}#Pw$ TJo"krIE|`0='XXݣ'̰oBȘH|Haǂ4K l03f Cz$|;v"bbbx衇c6=z4YYYDDDp5+h'sQYYYF>VZ… |$'`֬YM[&f~ٳӧOvj6I@f͚^`u̜9ɓ'{䐕Eaaa:o5MJ>HD Iݷ@x/4uV233;l_Gf֭ >I&}裠CF,3>wm[JO2)0VTAC[Qbbbβ,*ĉwllM(t$KŻQx###k{>}o$$$h 6wzx;r&\I*7Ԗl2m=' W/J>ƈ=n-$8n&GfРA\}rf"""׿Ř1c;9s& .14*55Srw^]] 0a„e.\5JZSKIgi(**O?ѣTVV7łtA}f֦^=}>g…24vW6ͭL#/e+x::իW4L\CɇLV\db#EHС㬧w)%|7CTm`䈌猸x"JF@@$II# Z,xĄkr@גF#GPTTD~~>+Vgv:L)W˖-Ӫ8U&Y "" >m۶K.dffzٲe gy:0`18WXeڽ.mnf0AGLnfA1cFUVx;,)=_~UV͘1cFg}Dt踬0@}$A.#(yZ! ՅLjDd2g$rGZS2'A*:thg}րR.6Z] 4j.ģFeD*pmIIIu h>|t6kؐ/_GDQ䦛nb:t@˛`޼y;g}O?C駟rI֮]`0Aß{q?466v|dfaۉ **H"##"**޽{v#n>}<F!C(۷s1N:ŨQH^%Kӿʶ{YbX`?V&fW İ`zF5jT'?0yyyBQQ{\R:t86ʄhG' @pД۹8!j QKQ|iE:Y*BοP ]s/mjoCJ>)>lJuuuZL0ʇ$7{h"jDQt'&(^z5:~Vo5'D+]kUsb]in I'?hٲeDF#k֬'`֭HÙ6m{Ip:tÇf|>Fbĉd(HMرcQ[[8ihhtvq\n<O`Ѽ5Z{ΝE> X~=X&L T馛 6vZ`gܹ!~Ha2HOOg޼yr40s*hd޼yZ?u֍X`%ku֍x#CelΫP"!֞kq 2gqbŰ\ E^ն>h]$gyx)nB =]FuQ( (=zXo馴C& jܚHzRJ"tP'$˲" Ũxf4x`WRR;##CzGAʌ[Γ;~ߐ @vδ־n7$r|cuǝCՓ;\b: >Pꫯxb{91|pFɨQ۷o`РA_+Kyy9t:w+7|Cii);wɓ/MHx@4hUD#ui$G Fq8dgg7Y5,22\vڅnxm'iජur7-hf̙̟?uHoV3gvX/ _u:L2:mÙ2e +VU4qtq ԡT3Hsݪݴ۰r?].\4&_1IP?Qho DM6BBBW\qsΑ!8eG &J<&(X u]eB@ f/˲hNOOӽA!5<۔&5>:=-aN@P+N:qiJv믿~:~^{ٌ&**_|g CUUa$ &&߯%i!pX,}%oYbEM:tQ <>~E6%dh:sT+S= y/Ae8>(!q7a;G'{گ{Zc-'R߾}~111bO]$|P®*2AjP+QHdKB~iADA廊 7dKP+eX'1F a q:L&.Yv3w[F|y1{ldYD 0`C/3&PtiVZ;d&=!ЫXh".Jq]PX]we]UX"(* ]& $ҦϽ?ι; I$<}ϷU *-b…!77W~DDrhPxXh}Vbš:x8w^rssCmXp!- 3رcgرc/g~^ƍ؂HYUPg pjUƍǽk~'OlΝ񙙙w.Gff&;w8qp.ġáo^СIAB0*EnCɛЄX EW?&Z)`]خHIvB^M3ܰ*{s!33JA-[0`̘1e˖iZp)˜1cxh׮>z {^hNyk@vk1fN['"z_V5db̈́ MKl]Zr1aנz5.9A@6g:+,8ydeed"$TFk*_+D3 C1T+Q)E# S'ͺư}}u/?:t(>,9׿J2ܥKZlg=܃i,\.}6l8نjOQ͛7ڸW^SRRš5&6 jk֭|SLщH+|a#lܦUv2e |AXd/ N@z!iS^n&LZ ! 1I?~_& o#>ms\Oߙ&mi_1D& dgg9Di=a\Ӫ$EIR$H;RtCr@qWDRR-ZO>aǎdgg sgK/p޽{?~<=zk׮a#(&yyyDYAhcv؁f! aʕhF=fa޽[Go7:{^-ZDQQУGuZ?x`6nHNN9993hР~ ݻ枕EYr%Çp`X߿?_}U^i׮]}> C2drssYr%Vb݊np:tࢋ.o߾t5Eiii*@M'^n&L7EDjGh>@X~ <,p?N@'üO9Pdu!̙.Gտ%}jqߋ? ڈԈ8َ;cM@,lْ-[fhƶ!5GYAeHx*3["nQ?4*}ONh2%6aqHaZٽ{7G ksaҥ 7fJcUU+<Ⱦ}HLLiӦo8q"s%99{.=>>>ҁH@:pP^^BSڻwﰄ+W ioݎn ۍ܍!O\\߿JrEdgg|[@nrBB#Gaa!+Wdлwo~V^MfHMMn5 mX޽;ݻworQTTPe7Ѹ(..Nl,uf„9+%hof!hW'EHx^] ۈoO0Մ+>{¿=Dڕ!WI!«&עb/V4 "bI@ͦ'EϑA'P]FF4_^ʐDTN'n""n@I9C6ځ$$-[b C4øqu2kbw,YW>~ˌ3cڴi)Mv=r(4 6n n*ͅDT!$..xZ)))p8BZ#t{$/hVTTjw$?俒Ov۹sg:ٸq#۷$ u~f_u֭[b k/=1 -KHH[9`jC G7Ǘ  8pY`&".ܡuּ+Q׽[UOp:瓙ɐ!Ch֬K,1pa~8q"ڵcɒ%tMZ9;N eee!bv3UTDH'NBp8W4͇~ݍ ݣ!zŤ'~?NEQBtwCV_DŽ &L4*R{ R׈SNĸ%-MQ:deA|L3a*BK33V$ 5(eee2_bbbjȁjXw 7jD B3E8( 4MSEUUѣӭ|HR~FxPSfsy2MD7_kq], [=}mڴ9Z! Pnҩ *ɇ& q^V^^ S (8E@ݾF@\N@<=z --@ cFM5jƍ hu]<CIٳgQFqWpB=;vD8dpi\p\իWIRշo_͛Gaa!7nG݌/s7f?DD@ 57RXXHBB}V&6\p$''P:!F:|>***oW#Y IDAT޽{i!'~MHHHiBt"Ґڷo_jS$ .I MՏß 1oN޿E:QfV*aDϴ}"Tʩ/6P˭uDΧ#2\y!(Lj,XH踻%> !T&Qv Z>\^PPp,99855$jTo?iD"*=aUTT$m۶VRR )ss=}rFsu"\.JJJKB+[j_|w}ƍC~/:~,Y3kV{D3g2yd @RR?0L0,YhG4 Facǎg-[O~!;;=zwwЁM6)Uc 0s\*5}RnwƦMM6oЮ];n5.:Ç(/Ԧl2~?۷cǎ-/h@" † ؼy3?3yyy˗SXX(t֍=z}AL4RRRJ4:uf ƞY"LG~51锏Fp_QD1?3pO9oٞFe隮8Iޫ-.9x`WXQ$鑭Tj@VdsG2EQ9&m}>YyyyKKK[I/;䍼-'1~ϹˤI/?Eᩧb˖-r饗ҡC*>CL۶m ;33fu]GFF sZ'ܣ'hԧO$;3ڵk\HӴoE]o61>''믿)S3OOD$&K\6Lnsp޽L2믿ƺetbBmٵkW8r@KOD>}B(^! a}nXիtRXXȼyBZ.RzWdE6m6|7MNz]0aVJmC$ DA>.^7-˩.QGl+L]m+vF쯺`vXԂp/<O޽{ w]r 7$HRq cݠ$.z݊(av߿?I@!8M_/,%h<0h1}"77CEu >Ν;BDD[oO?u;0tP@Dhݺ5O<K.׿5ql۶>}0hРH߈9i~Han3`l6[߉=zIFFFXw(o3vXxBivD8}Et0\wv,k޽;~/v 333̿G_o0`@"Pg2ɷhтÇӲeK|>_'ea( h42`ܹ0hLAΝV7&L4:+) ED" _E@Cu=kZH s*ȹs"Ċ#L7n,1bG4B}PYTFr$(.ԮA۷cǎ+V(ݾ}{r ȶDuA>+i;ÆU^!+**Bzއ[og^z$tK/Č3BFdE>'#FpYg߄ AKڵ1- < /2`PF'9x* j/2HOA<̰kr뭷2n8H۷ODTU==!!!hxuBgo­ުN̞=[qW#~/q55kgn[.ۄ[o5d:elwƾ Ȏ;XfMXԴh\n:nj~O"z^8uɄ '(Q?"jF >>Zc.XA~rz ׆<e[ğb}h6)[4Ms"2<>v 0 5++aٌuC[(!=R(/h~~~AUUE[vB\ iz+$z^f̘Gw馛3gO?4={/@ף( m۶CTFdӱcGVk('fµslXI8d!#",Xuuxۈmֹ?Ӵoߞ^z>б]v 2$0!!^^\\l:x n:|>?R^^βe(**fѾ}# Ν;t5kV2_5*VZŬYp:tfϘ0$E$kS?wR#4 G9B1"{6J"9.%,CX?zs;٢E2~u(EQ*4M;iZ,Ǩt8/PHQ ӹVUUeX3,Ǔ" _ XG9:AM|\Ogn}xhBSO=Ś5kB Fbdgg?2tPfΜj=O?W^y/˗0p@{9z!f̘O?Dǎ0`˖-3(Bj;--tҪPmb4/X,<ú<8x 'Oֳ+(K,@ ɓ9x`{%0jEܪo2y4b#<>..~ŝuY3|pNJKKYxQ<,$Q\\+^֭cǎ_VoapL8Q77G2\3q0 z`;nݺ?`lh@ax:t(k֬aǎ:tή]¼}t:oh׮-[LyW;*˖-#==]k׮o1aID($a5f= ~=D7"B~ -oǸnoȒ\U9UP/^¸@@|_Bk.ŋ-K,ܹJ$a(Zt2]e5M4͡(J(̓ř999>>{g8&FרD_8pEu靱xy<͛we>+[CA\\[ w3lݺsG[LH`ҤI|G 37^z)W_}uh;33^zSFc֭aײ˜7ѣ'̝;Ws䨀M@ή]B}Nѣc^YCߝ Vf /dű 7G9r:Yti{ҥ/9r=bD*)k!Ϣd.2i1T]^@u<&ʼ Rw!󽀥g{gΜY`ݻwAh$ S`&E3 ԹdfΜiy>VNDzNw42<{vIc }\bIAkzxZl#''vrX%%k3 |]T ŋٰaCB۶m,{[HKKȑ#jժ6zB7FqYhXW( &L`ҤIl6g6Q8j>L|"ks]$kfcҤIL0s8 }$ Յh׮Æ cǎdee ù5L^x{F3jԨ!k.FgĈ+x{̞0a?S98$-# օC5_ocl1oRfQ>X.]߿HQ'E9#>>>9%%WONN+**=Ovyyy۷oO+Vh7o ~=niiVƍƵn}b#'`]` &JVbeaEhSdܸ,fSN~`ϞٲTՃ͖ jS`ફ`Ϟ=l2,F4X// /aÆ 55)S`AOpƪCD[=ӡױƺuQY 3?8Dpv7mN(|Νk+q: RbMka+|_I&;wfСdeeAf 55M4 UU fƢ( PRRBqq1EEESXXA{"V߿dΜ9 iwժUL81UoĈ+v#5f/ eWHuXȻuļQx*ɂ ȊopF||y[⊂-ZƏVtg`0h(TH +Z Z:Q Px~ZE:E$/4p8ҥ fl޼9CUU~?\χX)'D:lFd*_Ie I0HBb>da?;$v6U# BkHrd C@t|n=Hb]wE~`0Ȋ+xğk#G^χٿ&1$ :..X <7H9DH6i#WIJVĸ8ːBFU)I>Nm.WxPa!q#~Tn,/ o )MG^Fd6 r (?_i̗Ez_L$_P_$q-YiCh[%[/4*i*iEl#9eY|HUS@m0~{x}n&ɕW^iݺ5-ZE呗ǁo;wn(IdȐ!+۵kD2$ &~DG_DX 2oSD"Yvb6K:$%A'/lvf$̨.؄xjIy"jSbm7߱cK6ls: u۳gu;wk j}ؤ; Ą0C9To,-kMIBgIyeӨϬ<,Dp~jT׀llJs~B)4-7'A.RTo?&k$uB Ԁ*%%7-;ӹs/&LcN'h<E'$&X0(XRD~(: 4E"ScOHeh$P%Yϊ!i_Ee &LĖ"cnDX-",ubF@ i@e{?=7O=LEEoys ϫ`%}`Cl6TqY,`$"FA?U>V+_yj <r#"t^,1 ^Gj URSwZAPU@@4A0 B r)Q;NBII@'<& 1q*Nc,cMVt0aʫp @ w>6g"4O_HRR?bQchzzfZf]Ŵi_3qTTfX@X?#LZoV<^x,^ Śۣ׋3p@8=Ctt(2-b>bc! =x/3K9p"0$.[ףS?擄4u%.֮tX !..̎jJ(&̬iU&Z&M\4E+a%#ce}!'ڦ! aV/Rrv {HO)d>g,z% 0Y#poљXhNX\J=>ZDo=Hl@6"w8~ic$(mڴ7i)aiuf/< ^ןd玫% V$!5N8gx[bB f'87+-I] bڤ$3⋸%!=NzL H͡%CCG TwF@tkOl׻V_3 ~?{l=N뾚,2X*]`&oxEL:%H ƒ8 $ {o]پ=B8gGSU<;»E 3qR% [%mx& 9)#Y4M6!zM0Ѩa@åh*P?G?M B>G̏D ^D,br?,^k!~( j B)ɐ ))м"*]FJNA>N *6;J,pyܞt H "#Է7p(ʋX тNnn> z^7o҈x"ob3G3N=;TKf[ԟ)WOAӴԙFDQTK/T!q>de j`AӄQ ̶тAeXXh1Nkjb<"y UւAva-*;^\Иz$fGBY. M ~wur'磛y 0e mr_IzJbax[6j`3Bi4Z+iItAwYQUG# =wᅗcss{jGYfM,,.hQR&5Np8f :7Fyxv\3TV >ضK08kOcį*jX,:uPgz(b9Vƫyr$pKDr]J}cj Zh缨aq|^#H@h>+*|"O3>4U–9sYc [fʠsG=~*8\2UCKb|y{L44b$wDI& '4*M43c M6IJq_v7e[4% wl oަW |0u,2K5E@Xr"5J5-Y!@ :0X֭7SUJ:`^8s6=t nY{k''ezmy;lp8DqJ"[%rJKBkMrR +~8Ih8E<#!k?t6vUB@ `XB덄_)V$ZI&hM$FjkZ˱cs?U4=nR|8,ɇxFIQQN0igk]; {n?še%V6y8_.PH /̰#4IHtI3NC M0Ps^_oe)չZ,IGB;Hfv^o&aMQHB1Ȑr` dVYVϣ1Vႜ.Gp)h|tّ{MH>tHA3Z~裳yɛZ 旔eur&;WqC|0E#<"Q Hr"m ! WȃW'LSzGd'}*dB'!rvٖAAruqڤ '\۬vDk(DPyGGk:C8aD:4E n`vJ*t+˥)jTƴ)[nauaĕ-OEuy#} u!e$a1$ &L4a\?D8.<0=PLy-:!̶5~ ˓5laB,]p)Œ*Z^$esŠiKUZȐP~3cƢ*#ZHbV}YÙ2e6[DD^wmn{܂h$$@:q z UdA#Cf}/T"pWp+´:ЧU=+ZǺXWuErd\UKYorUUj-T[*i4Qi 3 d/"4 x#fW"5&0[ӣeUTp "~`}Rjro_q wlSZ":#aW1z;\m9HunDT,bpZ":.@_IB.NuuHDН?h5|TV#0C%FD"_C}:wGؐJPΒlTSllԂ Q`1AyXMn$%'1!IIk:D<ҬR= >1`K-VJߎhl}*|".W+A>I@{fFآ`Y͉%eUC8F8'[c9mcͺ0aFbT4DFP9)Lq# d!a-aͶ aEnHC ,P" FќQgIqWOM֊tɉR#Z8Z|=V"(]Pȇw0z mc=<gܱ2$.5?:0Sgi[6?cS&˚5/^ڢ!t@Uͪ/c3-%_C'TlIJ͔<eM +n%R'F@bu /_}V$_x^,Q#H8ޛш|$DD3fR؁? "1o+YV_O j+1JMVʶ7b(n3 s pdHQHOpFGsNѣc Z^ QWheb"?@:_ÑJVD J/gd ?W`B p"}' .?y+늄c]:61߱vЖ-ʎ;hRKi21ѪW+LF4L٪kep\ |%a4R){x+a@{pیc"F4̉…B:|!K'!-ͺ0AB &¿|`"7oO {GRD#BxГUڮך/}DD\$jl' (UDҀnBX%GC=rj쐍p:f} *UHFMN\zoywu(08~ׇBJqUNmf5DY])} sc0f1iZ_;>~S)uG}K*ZxZSEd,K"--abcT52G Puݪ$ AU DXj@]7,̄ʽm70G?mwXAvpKiE18tZ3" bI#y~$$ &Ln~\}Y7i\\|5 <`_ nDأE7#c/䵦ְ+vd[mh$j? ?HiZAD$(F( 㱳$,ΈNȵ?sgV%Lڱ,`P (YrZSPDjNGd[$'DY!e!.]-z_qj'Z8J߹,$1Qzh^UlZ:cZ!;~\Z\iۚxdAqYPX΢tX,&h*Vss:TTNWhh$ْP 8Kf.e4Y,J#LG&͝ihN3BGaPFEV5HHTDj>*?)IܰBEۍhUG ݮk@tZ_{bEs(tponLB>Yt|!2r$7&L0qJxqhbjHV_a Dagk8j!KCDD$YmkdDia*fmClU1/oa}:(<:"yW|=!NB/Xp?K3<IF#FGP[CTez9t(?߫?OԲoonWA XcZ4r!Eݠs.[DbmB?{?EQx{ۖ[Ͻ=x9\1GO DZ9ڷPA8D/"1@v"4{CrYqQz^zu`0(ɍ@@1f0$a>Y7q^y9_r鍼7.~N<9([#$5ɇI@L0Qǡc gEO?)U{nFؠ;(h!o!2:ZȺߧfy06'>}Qi.ʵz9"zD]R@Dj-n"|˥9H޺d$($dw=…GUD#tiZtI>"_ߝ`0IVTZp;2jE)sy#y@dIOM$V+XZ*EcWq GakcޮMn+1AZ\Y,Ⱦr{u%AA[hJP T/@ QL 1 8 ܮwU \.Xx,x N> K$H)InͲy^l͇Hӂ%c 6L>Lb/ SLp]yaSbЅQ7O=5d[ms˓HI@",E,i|vc$i',1H퉸Us-5LV{:mHm5 ۶-&2>W^ĥ*5 >?dgJapF"ȇ6 o;-8.ҷqʋ655.5ќ,GY,oWF9Z6kιF]oEOPT+MIcz& pS@:C,"5:i>J+@>a KD^ 3#Ft;Zl$ 5fL8mP"z}^^[$u"Hz4 KH1$ !4C0EY8ь%Yuϴ?-[_}5MӪh:# PHHlYtN>^8zʢ* *V(ipTh@~*]!Ir R;ߍpK-F~0Gsn&L8P逽Ҡ!7 YOE"b' B9u,m[cFu" wqRTY~nUa0 `ĄbB1i5aB\Ŵv]1/f]ST IDHLqouWWTM{9iGlGUS=,4cK|P,?)/|pquTByM%kJ^~jߧBl%,! 3v4O={A:ǿȟ:jh~DiM Az6)6h[!ul\h9c )k{?Z䴰V~5֠_i%cpq6y07"[4 a^xLDbbäڠtлVbŚ-#U_!~C궹pTq0pMnZuj +ogx>~AM֎^Ey;5 lM;DEӷd8 8Q;SIgӲ8眱B9G P烹s.}{ܽg +nv|h\Yݖ~*T]ZW= IDAT_|y\V ?3Tc#h9繲*~OX~,i5Ҳ,L'|H$v*e̴LA#۳GQd,FZ&?ߩvU:*p NIROUFǼ7ZT!'?*fKTx?\Q.M.\?m(]a4*:XTznDeOzSopݞP9ߖӾsu0e H<8ݐD@%hW?NR"m6Qv$dwKY̹O(d* 1哏@Oaî{ E' %~ދ: =My<@% Ȗ?PzP< ޾i{y/ϳz^Y,_Q>?&M@HErגf.r4F&"k'坂'ҲpGb U)'OɅ OjD\@M ݃/B9XF|-~v<[Du@? |}O.@p,)JK|\dac%%LNaAa4\퐞[+0yPaÓpB{1;㏆a>F$̠ـ,344"Ǜî]bY2qPA2s@e{zc% !XH! yy|) ZvC!xU6% ɬROa{Nղ*gS4O&䣬;UMe\ӺM.\?_R{z^9{RBl\TQ<17 }QxT췭~q],<.p\p,R!V40F6d$`40hY]z<|L+]3쇈tQbo 34hG"`H30 B"2omZIg֏~4|-{X_+T̉ 2b8eIlO\/cHEE_ySZIJ~J{@RR0LFUc(a@K>*S0:nV&A…(ﴁ,E\ cb3['Da*PT? -蕞< {@l3[@7&[>o$peMd2dx|\[hkC21l-j@kκ9toZrrWJRh_aMӥ^S+ѱ`lj4UdQnP1 *XwH9"I%y GJyk]&!sa!-gc6>@:՛mKCUJCHzp}l`gr%_P\lFrA,KE:#=yg$/8KIMD 3,尫f~}e˫סIz^೗{Y{ @˛'aE,Jq0zwmeʐIr?3.\pW,Izޚr PwPtP^ƺp H}6 YNPyBB }㶡 I-Ż8zrԁpz-ROdR/BšG\? RZXH3, 2XBJI׷}Ul{Jd[ z =;$Jݪ!Uذxt^ddrƌ] 09Җ?ɳRJ| <Gï\Q=<XTۅ >,B%S}W,TGձƾ܁*O Hb_âEvbCL ?ߌ`K/ }&l]WmqAFcwA.<: gM0+(eܭ)ܪy2N& #774xLГ޽kCAy> Lnn (WM{=I5\YBH)TbmO!B .xUf~T s&*:Fm8qgy+iLb}"$?…v4+,˃?+|M>QZ61xXʛOiHY[Ht،{ ?7iGﻲW(YӱcP+GycH" qp([ Dz-+/`|\IY`- ɓRIu8h|pDի,VwkT >^5OO17hJnףGKƍq^xP.Nʥi' | '|fL࿔.jj$$ힸWzyJY kQ'ZJy!opѾ|\>nE)[O+Pl] 9֠I`&pi4.3~iPc)A ,$ L’3rwۻyo?"FH.E@T=|KjB6[>= RʓѨX1q_;.\Է7)0/FU*]K?B;]T50XԳ[jI5\Rxsn4k Pq&< (_G1Uu=$"ɇrY|$4$0ٷ+FTO~up5WݺX-ﺈF8 % pX;|뉄rH,#77T"P1YYYΝ;nDÎ!Z?$cWą:& ~8埡 ,׆m?r QF=XLwp HI.À͡}{U5;_r `&!;kxܣiCÖ. ]dŁx{lB6ml 3;ඍqǭ0w*[ =|Lp"[IlQ]ʕR$gW8IKKCJI~~>SL_O?{Gd\ȇą:! /$}RD︝JHOE@I`^Mr[ Hm􃤬 TCQ>G.f z`;⊣Y7P*2;jPZ6X@?lǣ\;=Ś/o f$ݛNo2dx2d d˖N 'O *LdH%0&{ggRL@6m gÀ m*ʳQdee;pgFH@ 2d{IzԈY1c_rJ0m۶N+rHHx+Da̡®H!*pQJ',< AJf:]Ѷa ֹ%T»Ĭ% ebc!"@ÆQbrGjկNUtkҘ9C/ſ7[QQ][fSfpٝ#yGlD{>4%>d d660\GxhhLccدߐƾfih.~Rxm)!c `QTݛeI,"v)U=mY*D+2c)! xϱڴCr`lff:u޽;|,ZN:qgCB-ZDݻ&f s=<쳄É=apM7SO\Rds!.qN * zrz~k(@7 QG@}\`\l:Q7*Gy&܎JI# "_lT 04 @ƐȇKߖ,$dk}20/eQ2Jx f)?2CvCBk[8K|f3b/+!ioD#_ȲCjeɓd#AArǡ,ضMD~ǂt:6J0,YvcXa.}ﵕB*"/v1 b,Y$RӦMyׯ_ ϸ yn 71c*5\ë*WE@n}+OK@\3rĊ%(_B9%j9I;I0MxM1.Dӿ.E@(y=SWd+*ʰU*G/IBT?vOk RB@F4;"^/4jDdxŲeKiK%PmF}8{u+y!=M4t0M-LC5ֆuXBQ! !wŶuݦ?nk}pkaXwE aGHF##(kD@#s`ցsΖ)Lm*" ;餓8q"eqG3w\Po ԤI.]Jvvv 934iM@ΝQGUm̙3^znȏ(UB]Emn:pMÀo&yWva$LTxَyA*灩Ĺ<` Ou~EC(ٯ؞=uq;IM>Ge\T_oƽO{]ix!!//[o媫z 6Up PGEG@0iijL`NݭFQ!ܩԭՐ_Bqjlq#J -+W {<0qv䧠 ؔ^-B}Z3|}%Ϭx; S.0\HQp By :!ljzMq'#xO? ym0b_nP01M#}>{LL<^ #Y -Ӭ-5ફBJɜ9sl  kl&l۶O>$!C$*w?UHWU8SGͅ !T{]XTO|vj TVeK@O5.Ru6*߶fk2DFjc'C^Tųts!tM>v&q(nB]/яHˆ|u/xL ^χ t$[@&d0(z!tO~_nc9Xž?#e3 8}1ƾ?J|wUfĉue3Ϥm۶hт-ZPTTĶmؾ};+WdXS꧒msE?{d@ouئP }qGjq3t/*Q?>G>F\c6Fuz:[jף$4B$2m B .O(DE%JU_|0z.Gd㨖dذex-$`-1㥗r'1gΏ]52AM DOM<$*+ǡ*Id"rʠo j(,Rl*⎕$dϕsnzf7=߈x { Ql# DVD [a<KZd{cG4zO#g=*NX(J> Gv8R˱ efM[l:;wl?QPRgt5B}A| $43.$ L8G@ȇsiQXE|n-n v5e'6wDyG ((Adي|!H&Z7pQXR(Zu5[*hބ?>dx` OI.r?A+%Ci ax!-MDNawH["_TTgϞp L25J++qXV8sKy@:Qq4g*Zocܸqw\222-\Om .w1*Pp *!چڳscpT~c&0M 6(5V4NYvUx0s/kʻѡ bQmm 5^@i+tFVvLAEMӤnDu%Z5M?q+"ÙP&h19m<pXv=5:=㶭!+jT{0p ,~= ,+}z(tfghmfQC',Og79ۚnXJgvǰc>w%;S"$Cd cOÙə眉*עXȇibM>LOl, 7TvU*JI WNwGo zpXNxc w)Tuںx;zUަgϞjNDYw_~n\اaAu.t*/2qTGsTa@#츿M20P^UIm"80ٵKbr*#FPŨ̓%ڴJy`'^O,=׍>Q_,BE(׸E/dfwܱ IaW6*p >S/BH?}#*Q#։%jzt`URV{j2O?teRTs>pRԃ'tt(rd5{0|l_Ob,ءm_fXaOQǟ{ P/)î|XI J0цzPH 9r+I@&L4)hӦ ='O^/`q1^5.\IL; .Zo 'Pjw}ԩ999Ջ;̟?4^msbߵt;!.ݎPZ@}:^[WF$qsx *l!WI]>]otg/Dh>*i"-)?urvl^ʌgHponqn&ŨȨD#ÛG4 Jv6yWFފJ٪mFLL&~|*';x9;x B`u@d%<ɓO^ç?CLTÆ>ѧJ'Ze]c) T͐BQTE%L[~%)A%4"jibY#kN0pcox/'XVe2ؒi±:7,45IdZ珼{P@sddQގXa/\lǐ>׫G ~9to[>Pz(@%'չE"/=\yÕq]db7:eɇiE>ziiii ˀD=zZ !XVC3~W}*)%iһwdgU4i҄{)%|>@z)rq>`G{R뮻.cժUȇ .\tL[| u`~zY@ R7-q{Wvu|e}󀄵=rL_|=NU9c L < ^9Լ|z> :"õDZ$/:=?Ǐ笳Jn,Z3o<~R2?…TAa"&Z'X<T?b IT>W^݇V$PFsQ=\4 oeb+h^G5 #rUhr>UI4ʇjl#9# %Q.[5="_?b92^WIM6 C[9k4n YY۲By|;G{7lX͐!+P 9o ;|r*0|5{ a}~e)#N+ P&>[2oY\:59M2T(SwݣPх8 ȤIQҭAHwME> ܮRR ` oQ@ k%|,uk" -[m^*)!Ç{ "{x"KJJ_b$dAm[һwoV\Izz:[oCeԩdeeU[c2`J$ӧOG-kpᢶ (ÈCTDiNBU](% +Q:5)JS&j{U?_{Q S>Tu:!ݦ?jNʼns&R *sY_UO$-g,[6J˖2`-+P biPDM>poG<=н6q g܉LeA0 K)!= f iK12|D`aQ"K.6v`Kla[6nYf5JVYͪ=xWKEU@ doh/mΐ8V^Gz<*N:Ty0ʦ[#AOH `o>i!ie~ Cy Y+gJr[ FrVHUJd !+Ģ͋qmWfptK^6~yyeXcX{ZU7lCTڄ1L~ߐyyZVI@>P: HTʝ5G߬^Z>c{yӇ.1cưsNƍСC Ñzy79SI(Z̙3hذa$QFL:ο> ݺuޫt+f .@)?3,:,{jj5-%+'‰<äUK(և,MOD%Jy@;5*&5芊DтSqUTȺʟڱEEAeŊs{lqzK*3ܹaNaժEhTWdn`*慰g/4ohqd-ƪ/ؼ C\ZwX+d1IeLKF- ^l3gϨv\e]:eyOR VWl{0o|>4&GP px>*`'TZ/RIB~mN:$' JzRJ>X6o<"ۼ[㏩J ^z)͛7m۶ 4Ç駟cǎۜwy…{vǼNĆ,$VP=#k=:|˹Q!ׇRP]2LktBVT稈sI 1 b;+*Y~60Rs'rmI/& /*`m|iv#Jx.6fDZyvm?P븍JqmD#,mm!S喼 px^,^>K)Ks~[#G'ey>rssSX'4u*"Q< y+/]T UGXa<'F9 Xmıxif>3][vH(, 1uTc`灖Ǩ<>.K |y4`Уoƒ4HvJnF oJj0vX ݻygc~~m?xPjY`hժU)VZŬBȸ!+)Yxc)Yt9rF!ݶp_a*UF^|T2? AC< 54|wCq-Ei*Rr5~H@\&Sģ(Dou;br!}h)' 68RLk`QӴ$* zjPA&D+ۿ*] zz^V4@oT(:TMRWbG"aݻs6T~u.A7Sg)oj_vAla "cɖ36֮zhߔ0)-!DVy 0ס_C?|kuFN it!ɭOߎVͷ)e+6KhC !0 Mn0 vUpz>b &%%QH(t7<svb9o=}]n Q~վ}R}kð.BOʕ+=z4O>mۖ&Mp 'pwsevܹ'ͅ hܼ˵eUY@yM@@IHYiV/B<j6s?&*6ƌ}LD;7*#$*c&`?@ghƏ,MYۍ2 մ2*!qՁ>Y@5dt#RZ +JkҷA6By;Ryk1D}Ra=ۜtҐJ^ɇ3Jy>vs]Xl6FOqu)0~WQw~?wN>vV.Y*(B[ LNeLAn&򛕴ZwrOKfaZyܴwSWmgÞbC4p!Eȸ$\B;X}Ū` !Uҹ.TsnA&Qo^pXD5Y>f̘1wqtM,\P-x<<wB {_̬Yhr"ʧ4WoZ"===u1Wcǎ >J|WQ^!m.\*g9x7<  H ]2*7EP~^Rlc0c$ /_PmNRSYiCUxMtTKgRD)7w]y =!*$+s?-f6#_YE_^$321'1ȡV,&l1 D *&EV~O ű*]z;U/ػEl|gBr$ !-C0htKW KF<Q EVj'\s3qGw\䝶^{-x=zt yw⋙;wn;TdhhUǎ# ŋ)*}Qim.\P^yWJEo~K(ST>,،Dr'3am:+0=RO&%SQkgV%`D4ŚH(341 (?MRw}KL `Pz{ r_uܹLҹsg/^O?MYf5Du@M!BN*%K /0f̘$%$Pta6?3>; <ۓ(UqD:PP߯,ȧd>uQq'TL@ );k²6NQrH djXyy Ƅyw*ڰ映Iȸ#oK+(gȐ"(|s=gx<4iH&._S V-a6UP'}bNNfz3PH_fv:<r ӟA9eĮ]"Ǜ%-$2:’Vdm[9%93*okTP|0 '`:k *r$A>ݿ 7Dۄ'` 80F+s:nIhU "о}{4hPgaX==M6wtܙ&MФI5jΝ;?ذa ,uKR}#Yn\{ЅZExxad_U7/TTIKu7+É59'SBf%q6QGa=``'5;Y׏](}(M&SQ(>I~/=`aa\3Ls}pd'XVnbH/,< LQWQ<$M}`*tkfqzZyVk|"$CdBqMk Y5&0L~a"y{K*h"GA /(I=b4aڐ!CxgB0j(<Æ od6u?. ;K.ez?lt҅3gi֖-[OOt)eebkt\sЅXlnmh< Vss%)Ѱ)HCD8jq_ ]0ߏ zj[VDd9)>LM@nF1mRn&^]tӓ*z|0|̝ И8T-37勮D:\Bg7{\X"#. vVHD6DJV`_0T;cx؃(s#',!CYb' ʹ#lPMg+c3X }Xz8[*Sy0@?+CGɋ/C2Ռ\ IDAT*`Yj9p+VTpk ދ"{~[B!O'A ąr7%c{-QuHMlW-oAmd5Ph"rUj-@i2|@^=5r͈*|h #7,¨ݨ"&J~TJK oaذDlx*)& Ew@[0hQ1Hhr9|e(T 3gpָ؛WtlQXX&v蕓tē{LO&iaCQ =VJDLG}LfűND3@ Y(7W_?#F+įGdL@:,j5.">@@/\qp\؏ H*~DwX*JQT 'JR&c5PI[g](IߡsUOêO(ybQ%֣6j\ZyP;ė 3.:)b?ٳ'PKuq#b@_>4^۰AS.(TG6F'K!0zZF|@X}z6‘C*َYY&LAޙ&Q\(,ο cúq M3v1`drsK@U}!\'k^{シb״YʾjRA)9)X.ꔀ zwV|˒I@j_/();PV1ALfjwTA78+9 ,+ )((gF~?`I-нGծ5iEיU%(H Ul!O߸"N vvRy_ IS+- *&3cG} ']wرcABh+ߵkWzwB@t[OF U0pbr\ H*g5#/Ξ $l%Db~.[}苜ui#oSRbWȑ3mdek=B>)My˫)E]S܃r!V1$d֬c FQjAFD2EENϗ(hv=|sRM>iѢk֬zU/_jUz:v0RkQSMBBW~J@|+:ڔ_[:}MTN9e,^ow.Hv*Q% G}^cyǏA%kQQxhpsǟzEHH-7>xh\g~q֤;wnGqK@RdhO^8b% .\)ySlt*4@ivK0F`Y-r<<蘷)r ^Y vjS=h_nB3D{\E{zM)&!*"TR5zuO=TЀ9!ϑρ[pQ/H.\GkITN\^=P 6*fP]%szÀɨ*%yΫG Lb'XKaCoK@RghއIfU%uOMB/?.SR0S49hi%B/JTu ?*(IbK@zjfy)JQ1}F, Ej 8H2wf~HyJzִ)ByOOs>'A3Tȯ$OK@RCB^,=+X+⃽\BTb'JZ >ވ۾״]r 6]:ZPl_vH>(..^}뭷^^=[>Csq?ͻD)ui$r Ø"83*4/k TO%ö؀AO5Dӳ'}B@ _\' a a甠p/*GqE#Et wܾ5n<pS ܊ˬƹTfԃ{A"hUUQ9scE!]mnJ~Xd 8E]vONNN/J\AM#uRRy jge5 m !n.BtڵK.]ftӮ]; fsʕ?sK>&\ -1m_m_=CJNnE{$&Q8hݯDJ1 By&  vqLgi\Tj *ޱILZY߮&hwEJz~YQx$J 0TGA6Jax^0sgz}m o9s3x̙ϔB]|CAOdɒ6 QY&[@վ}ߟz)nxO.]dtܙ:{wP(T2~xpڵ*RÐ~'ハŨ4}yGU}$!! AT@E\AAwWUĎd)@ Z@duEXDEP$ -@))9 d2L||!=Ϝ|Dz Y&Bp UDeQOmфԡ0TW`zBB[n!55`޼y<, ѵ(s]Zh/WC:Ē%K4i#vdggoξw…AE}υ%??jԨN\!!n; xYf K,)߃t|MW]uUO??KKKJBϟOoXFT2p0p0@yyёU;֝< 25)%h{>$K"puVD*RʤCv]MY i,0!ғ~IvR:EN@([fΜ_אν_̍7H~~7bQ:-!OgeetRN9唐ּysƎKyy9<*G nS(8.KnjSO=5(o\rIς&Mj…9hO٧; G,BPL)OIG< ; XŲ8z@dg 6ȿJp'z_W6~:$glPzا U)k%V_ bp?= 2ch%OJ` vۋ4خ 7iX Dwn*DZHKKov_mzDx믓i`# { |x!Ԅ4]ש+[ZZ67[,_}]w]3{뭷qt] ﷾>(}qx$! &Ot76 g#ҥ{ b!8H~ED3"C4/R_De,ă Q& s8#y_{5."]c]=N='#8 QiYvym1NZ ׊hٲ%~)#G7LG&mҙwǸu„ ̝;{MډvɆH>$)f8.:8B_}gϞ}M o\sy;w6hРu]E=x?e/ή_PX-b7OeD="ZQr|Θϭ^>cqB>A>%YXIB$B=K=& g!'_mF3My4T&2S @e|l ll"'8Yd :t`ܹ H̝L$FIҧ=cL<IAB|9CJT08tP)/s9wrrwpo뮥ݍm}ʾ8~u& 7IoYM7!=uiJF:&U"@>SƃZm#::MҞS2#Wiɨ}ȗ91w!vdRבTB#l GDSD42sLxѢ/ k=䓊|D|x\Lqq 1Gnr}yE~|_QF]}սe~[uW6>e_\f#wmExsKL#}|X`*Q/uTy3lN=nAE@!ϐ^wGDPxdN.D9Adgqo6m?^uD<|MӴgycǪ>&!*@[i8'̞= ?}fͺ䭷TQQq+^x?e/N_3ѳYT^FfH VD@4@{9h-i b BK:GuPĊnj&ܔ*I&}O|x=HA7U#nm"25Uӕ(Ym mSOmD mpuaM{*Z|WfW+7w߭麾@nFjS#t+xpDӡ~C=}՗rb}… 7|42>e_\fj(^I 'ՍMIA$|1F9?tDg~4,j$DSmxv,I"DABnA4z6Y7w|7/B`{FXXl =}3U6DDVWL9K]N Xt="/A=l/~dD^c.gy@ɇ_H^yg \mg>SO]|("ee/zЃޡn"9ˀkIDŽt}v@D fG]HMG96g"O!oxdT5]dJG(X-hvuVHV(Èfq|f4Z.Qpw,?cJq:|)+d( ;TKi,ZV^Gg}6K.j*f bD>%! uUW]\w_ :Թ`AQE>e_P7Cz5~yT_+[4Ǿ+P><"I Ht1 Y#Qqߓc=wy8AuK?TD׫3 BRbB~[ɂ#B/ !5 \B &ՌW2fQöT(q.#M5)qBk^IPTC1þt67|>}w# oMzzbA ' iLsE ݡs)NϾ]Ub}ʾ8w$ 44h Uy Hy_W9:8FЁN;¶TxF S@VʪH~;kw7{iӆŋ#W' ̟?nݺōݵFEmmm~ 1$ǑGط Ƌekc;Slue_ǎӊS)b|(B~c)Xsw<"kt+ s 7[½G=럯wgٵ7R BAM `_tBD@Z3.Z(DBijnG¢Ũ@DA\NhC F/zq@T(qhyv쨣U%] jL=: /t@aРA3}l0rȸ"N999OmosrrC{"cL>I2yۺ8G{p۵ko):tшQ̟Ozn^6>J@?%hܰQ^!_F B݂i(4?MkDH*kU߾%y R= `#Nl@ &[nt6 謓6* O`"Bq$N^|h5>6zjHB0" } q)X EN3K{ l;wnڵ]>O٧싡}`k:x ~Èf䰆 N?JtH0+$5@`X秞zqaΝ;b}ʾ7Ȕk8=moy ~5X[)j^ ϞKP _At=럯5!=DD@nAhx~LDH* IDATOeZjM3O 8Iits \+?chRPJ:*g +dDz pdST]aa&;+԰-iOk#": &: eeep TUUir|u7p޽{M7'`P}t>+r|H[+$u:[--"ւ_|q\طm۶*<}}ʾ#Rs;A> m2d`9AjJx^ֱhXz=C E ($:CE|L@#R4;!Sˁ/S*5DDJ;y?G+D{޶O]cڽMvX_ȵnL}~T*" kB4"$&: \s5lٲD ٤@*aՙ#G_zƊUVZ !ǐUVѺuF3w IHXĺzŊ¾+WTb}ʾB/.Dj NO@䓼е%GHL[~!@Dyz# F҃>0%1_d!:Q'wt:&pѷ7n|dz{QqH#=ѐ"D@ cZˣ~ Id?rK$x*Z tQ>'ڙɒVPd!}:~;9L M]>_xqrǎ={6 0VbEB#ZjTs篐pDl>&"ٵj}.jݽ?7S)bhߣrqH9P Ȟ(@D>p '¹ yX:#B)AD VNe Ai9T6ϖž X܆yס o_rD5FtH PI@αG*"L9ԉ|dR]By* #;!Y HCk+/3R'?#D"h_\bʔ),^ظɃ7|c%nݚ'*$ѓT`[~uիW[|n,[jF]xo)}1~k4Be#"mLJ˅33 g#,.zD\򹾂s4|h8EV xFhHn96GG>FE Ƕ;LZrW^evDS\"{啊XdF "%UAo')gLF '>: /^u@3g{EC |}ҤIbaa 9!ȇULOƌ:Adϟ?Ծ{N+w:O٧싃7ou'jx37*Lo9E^u3/WB#]@JH} ] n\xEti4_,kޢ1tZl<%}LALu 5)ӡSʋo{0p"-2cR4D*lAQp+y1}tc/x'ň/L8Ql;6eĈ u^pX> 1|DI"P ߷oofS߾}{¾n}QQ)x)}qp/~GS""*: nHC}̙v`^u\>>e_\fbp 8hړ E;'#°Qghg,=S"dz<-t u9o~'xψ8VfWN>{'*;W^oJO|x;vhڷ`+++Ӂ)}qr '&dBV ՟K=-ě8=S#ʓ|Crx բ79rE><`̂`p;3ӭ[  V^ nO٧싓7/BV0HBbm$}%v_DUcDO i6ߦWz_hcZۍ!!9vܮv]jB&+b,X]FrgHR%sM(((`ѢE$&&*a> 9aɇ8<%`VFp\v7Κ5\̴~O\C=i>>e_]fcsDD- 8(>DBm9W&e.F4&h+S'`>C=r .Str7gKdG# E$؞,YrL5u@tItDpTQCzIKKȏRUU-²e@L<\oٳw}-ZDsHI@> ݐC3'Oa}̰﫯ZSkZs2I$~X?#RW{WRYPy6H6!(k8Ec=φzp[?JB/.SfD9xd4T =DQ^'P mNJW&9@5U7x1cƄs 7~z!aDGS|_ҷo_.]J߾}>o |n7j-jkkc}!$'Vq,u}c=tͫG5( >3)}'80PŲHGRW{JiۗNU! цEM?H[>]^E@…/yz9ϮO u e ?o/S QI;{֦!=_i`ĉqr-4owVZ{3[~ΝUVV"j>v7S)5c56 bXXhlNє5$(d\4.|l{ -,H &{*Ǭ: E"=*^΁#7qEo!b_;>}>GXvv5#F=`iVSVf͚gggo7X'@BN! Ҍce7p~ee=У[^7rľ}X,@t:ׯ^)**DDz_#6>>e OdWmm͆Gjjj6n߾mۭv=ބsl߶9]qWSSa׮vzu|'"+߈l B PRDG>I" 'V^=(^nl E|}>" )UPPPPP8!BxށCtȒnGXm[n+!deeMv{IﯦÄχ7> u)(((((D$2^Yéċ] {6l#rᡱ!Xyb>n`w`E747),..6rz8!{hZPYUPPP0~nDԄ|G@B3&Qn!TnHc <0NeHrS B$0Vv{AIRE|7:3#x'.gx\s@R4OԜ'].q.0p?D` 777S\\H #0!smȱnſ@C$~B8NVJAP'.?s*5Pޑtxц'6>_WӣAYx1&Lv" *EtmСC^uW^oG 4ё,l,\p]۟ ~o*77O &Vm۶e\ydffсjjjسgs̡Bc+wF,Zh׮_~9 {tԉ4@ܹ\ >CKaaa7k:%y6D1E@fe[| B̭ n]_#j>rzpO?ѣ㥥s̘1 ҥ! #֥ 7t)YW"XO*D|(>Zݛ>ۛ6Pbb";wfҤIx :M6BD%^ dZ^>}:Æ jݲeKZlɹ˭ފwe̙㏙hDX,}ԉk"R6K? BrvpPᯇl#~Ӑ= !"cM|'ӱZhשg%P\KJJh޼yLr#RN)`AŶvm ly~EE]w+WDӴJ]ol@3j?jkk󓒒YpZ] AቀTM˄*(((DkӦ ׯ'333ٳ>}P\\# {H*nd̙ѣXB*p\bOi\lפvJxHIn]ZtAH*ڱ́hQ]|AfΜ鷘855>QF+ Rn t'6`D&P`q)SN>2332e sHKG@cVgq.ݺu k|w͠A>|8yyy* Nbr&MhVw ߱\/]GЩ*`޿o]C(xK^eԛ`tDd3Y@Wu OX;]vmw/F E*̆LE~$K^Z1Xyw}w?Ajj*SNJDⱂKb%*(ҁD? txOipJ.]Xb)6mڰb .NAt|$<'49vGp6q8ѭNz u#3juXDπR{GYUu-ZvƅS0Gze4̤(lr 1NgBSSis=n^KRVPw0L-)oB?qA>}ِȇ)S0|4,pgc $Q$$$zBa"*x]xgd/_nbRVXlM4O; ωd`w`w$cw&$!.BCIMJkRƷN@(H:umA5؈ȹ'NRz:IhXiڡ-;wӮOv=%͆4iBΝ<|NR=- g$XcXuQ8*G>%_e5V\͛gt ƍc޼y yy"b@>"NBb Оx≰k>9c=y}2tvG|%n֤ .nIN; |\0 ^))wd%h ]KmM ]h{ٜګX)^WbIjޜڑIXp`̀Hp0BU)=R=AHv6  :sLƍ7a(yۍybD>It0짣 :ݛQFEmбc/O?uDerHu֫VmuҩMCb!eGJ~A+ d #"kƿ6:Zt""M..&/qEwԼ9iijߞm(*b5rX\.j˩,*"y>㮭E#t04k),:( WpD`|o<Ȁujlit]O6mZ4iGaV`1MubH>|dŊ\.j*+q 6UEERZXHލSVDG.JUY iiTR[V]Vt: ~ZZ3՟'֍JLtj^DNA7:ȵUHHH.ay/^P3PPP% 98K2TW 1&!- |WPPP[t,W\qEff1tP-Zd|!q Bqצ.uWkYM[NRX6-hnJwVTᨨDihh LM-m5Өk$)=gh,-w;vĞHC޷O`$] $!jwp^tVYiw9YhMƒVloL~2Xmi*Bb}֠ ?y뭷HHH0}@Jvv6_|1ׯ >bĈޞޘu IDAT}ǟⱕp1b1D3ꄥN8p` 4h-6uԃ|l.ÈzihyIgKE-u?հ= Kc)CɆ_VʟjzwD"bCojcxvIz:wIc@KMmUUU8%j* J]Yᗝ"UFج=jؖ %dݣ6%9Npm+J5!VFh̰O"8…} ,]4zɼ[{\h >u7vB=h+Uнь6:@Kߤi&IN~F4Es;_q7eT9nʼnZk 7U$6M6幻:XBd ͚̼NwsC#8tHư H R7Tm8ǑH-HhтS/gɁ[IY>xcC>< {`d0,lKk83L8Z)vf2# ,NYfqyE}SO=\{ 5Bk'x ͍g`piG-"t$t'xFk0y"rlbRpSD(>d:Wl,ƴ>窤K]s-I !Nk .k-.ET79XM "qk*Dd@ r`0'(*-T:DJӦ$&$hڬV @XU][R ؒqi ]6yi=uf@gNπ:yP]aaS<4Bql2;ܹsBQ$>|PQQiujnb enznMq b7vVknZٚqFR1mВN_ v$u!HhF! ҽu@!hhJ'Oϧe.TQ[RE$"`ڵGjvsh߾z@+{( nL~^yO%]$ũ+`&;6#-T Y ,`ɝwI>}ԩSTo3f 飍CwC!8!jx %@r~~~ۍFUh* iڇ4BqFK_@p h)un=蚋!fp{NXy 6%k$qjXu`I3 K؛5%%%]wu|$''G+..榛nqɛ|n(((((((drĀ\O["K 5u}\|`::sK|-ħ/yloveނջ ﳠ H5 ~LdlIL.CDHH hVpaȇHm֌ܼ9Ush^PSVFEhwfAlLَKRF뇦i[{ۥ*ѱBk+ ݘZ)WTDֲ"^ϹAEHL/~.#FwjzUWWsW'ڙbYfP#eD5(e5W˗/O7n=gy|7 ZBKYnZIkJ]Z q-?8Ψ7q8|H7wk2p?uZ u"\= &~ȯG$Akun◇7q]"~窥/"'H'hrHR!cuj qZW "%?cVR$&Ҿ=ͺvEJ$IFlɤwH3Ğftck҄zq!8kj[jE@ !u:ipmeFVQSpÔ.W/ؓ>}L6͔s{aYoK=H" /{=C +jXlEEEpl2P辕u&]D# FyK*ս8 w;xc9 䗀8"D "Q ϐDD#Y*IL%؇9C;Ef{)-v(9|X6ŚHYA:$IN֤I0&*+ɑ"~F '>R: fӧO&''3iҤ3>(O=` {ƒ%((((4͜9lN3g:~}9a]9|O>wd&OJW6ҒU\Ӱp )u*PZC-!I#hTobKJUSTIP~"l))h Ք<=!.Y]Møjkhإe<$;! ׾Pthk7."1o<z!!՛$Q0Vb"!ǐUVѺuPBp(;͛Ahk;*w͍^)=H%l"≪(̔&vt,DD Zj~x=eK.{ws3i7m<`'s~ "&D"[DQ:k,gE㌱P% D $g餲_|mp;MxxHuٿoZee%SL @cĉ袨g$8 ]1$!#Ձ5ԭʌ.z Ԑjjj 3'ypu8{}$D^$Č|((((2={̀];K~ؕǐ!C(,uaa!C !//D0Kx{V% fVjt#]aGވ u5UفBq*BPt{u֬Y}pBv{$uʔ)̙3D0l"rBFLE%B$D pˍc垶nذՅ^Ȳe8s"b͛6l|^,RM_K[CQ?5e*۽lm%40ю" BMu5G:X\,R?osGw믿m.PTM+**hڴiL.փҲeKݯ[TWWy<%%%u eԨQ=pµ-$DHȇ"EYnq"֭[ߓC>}(..ցU)crr2gf̘1!k8N}YNJuu5Do"EG˾LzL~ 0D;>It"!0xʕmXtq+ gĈip2q?z=ztLN2Ytq"!*򡠠/nٵ>O>- 0&L?NYYYN2y>ON '5!|((((M6ѻwo|I<#mƓO>I^ P(57m 7@ff&#GW_e8pZjkk9p}-bȑdffr7f"сMMW?"S~;r]wy'wy>+?ڂUڇLb W0~S1bĈ fZxrY?F$DP?p{Ƹ:"6PrgxWPKkLPP$(E_y9OňSKnAV$ѐ^HA_\۽:^-O5| p[ 0G3ptӣt~q,ddeeM&VMVV֤쿘yH" #!3f&N|K`iW a|5d @hU>C eUH#Nw%36j<2C>Bۧ ./zbcE $q M d$62/!+`_L`"WcaDz3*rCy Si0a>9Fk<|6 Ѷ},6)hfIE+s PPPPPP"i ܎(ր!D\dw:0lْ+]ҦMs(,,_壏>b ^x6pY۶m;w.C !##|G{ ^S\!a$jk!`k;=~fAwrX끿!]B4|iL56 1%|s F!z"cd"'?0?>0HVWx薞O2E?~cvѣ),,dŊ|'n"ҙ#xїtI>ξCӦM2IgŊӿ,..e˖q)h@;uKHH8 Dޤ.qfOgO+JAr%jVH@tYmxk81@޽{о} ZPPСCE >n"@իӧOgذa_.w}3g?W IV؁ӀӁ IݦgnE.5?묳w|TUǿg&A:IHoR(" * Z@\,(6^ۊjEH+^Ҧspg2IfI!s3m[ .4nܘc gnJ)kQʾEJV PK˰r'J%H>HIII1?{2(M1L±\r |Sqqq7I)+"|&)eDfr4k=)eDI˗nfj]uVnʠA^NvAuVʺ|Xb 4G<@y>juЁUV|nݚիWӡCZ|gG~=\15xuVT$T{5d zyo~`߾}ynٳ*|G)eeQP%H> %Os='?J)_\jUWJVJi>ٲeM5:bިQ#[l D/SjժR?'nԺ6>l?~< . +pBƏ_+E {z 4jڴ)K. B0UK.iӦ!j1ώզщ RE(lHƗ PF@Z̞ۢ={6mGcǎޅ.\ Xz5@ իrORyWxW?UozGY>1b}Q8c?g#*UWUBQ!rAѥ4URJ3qr#+} H0*EK% ɇp,s} ~ʗ[L5|Bo t2ٻwoRƍ8pE:0oٲe˶B^ IDATC>N-Zvv8p]e˖"[nٸpxc~jjjR&MVI,\_vøo)n_v:تU+{lll0kl |`gn(|;Ƥ,x:&&F$''[lK.2##TﹲV:pj.b&D֯hdn:Ao'p7cy@D>}(_#G|r?ƎK)_<}1nևse7ŷrr褼J@Jb >\III3Ny$))iFI+:<kJ 5Z6 ńUVU۷onwl6OF2/X=(<(PJ9dժUUAT[o50G-[lٲxK/k/I)h]|?DX *jyѨQl6G}F[&ςٸ>k֬Y͛~m[KzʏM> T+1mڴ"'±&Ol+E/)ssjԨ6NsI2dJ!ĄP_6%5xٰaCXaM or1,*$;/yJx狍| {l|iJQjQ4`8yT@n9x BVXȣ6mˉ gWM[ΧO|qNTlTbaD"}п}ŸaJzye!%9[JjRkJi!̴T~>~Տ~Q:/hĈOv<_|6{,%}ŊSv0⩧qp6پ7~ꩧjVX1%̉ct}m3K:Y#F<-H߬n7]vbŊzktR1IH0Ë;wr]5b*WUرc. ˅x,!i=RR݀^70cP8oDr~ƍ^z5cbbv2S!DVϟ,!B>6.޽{Lc\\ptt-zl۶m؃ ؗxñg۶mMw-2eʏ{Mr\gGFIP2dȧ111իWsܸq׬\_~oz!DaWdRN2d:tObܹsWϙ3' *q4K\(>:}TN&FTdإ¯lbyr"MZ\JP3Dy~zoRGҕjut:q\^zC-aW]jhL.$ ,zPddd47o^HTQqƎ}˖- m4oNvvv/o͚5믿^55kV{UVʷe˖cǎ8M.Ƽyvgdd4 t.O>d 6JEI>0|"VNHA]PUJ qqq>#BnB8w>,3,Sbَ@x"҆BV$${iGPV[5`ַdݱcGjo4' !zde׮-Zp:F-@|< mlݺuĩSF἞E~u;߿Qvx7ԍСC,^s_i,P~?~ȑ#>|}f ._i' :w~#~; p"99㧟~O>[uGyN}lO7&''w 9| #&`儔DTPy^Y$j5{dH< 2G$' JykY<0ԑ)dddpyʗ/3Q1αcp8rH)پ}u>DAÇo߽{g֮]ZI(mX(ytƎ;}H)Ooذ?]v Ԗ1b_J+VڧOcƍ4kÆ %555l\zSL611sXn:w|*lFT ._(S͜Ⱥxۣ͍GJEDlnH!'unOF\̬b,0SNbrSN%yO^@/+ۦ˸%_qvCrpm۶ʦWsA9_|7n `ʔ)aÆvd~ϯT)Юv)ewrV!(2RJB w ! Q/$F !V;221@vvvjtttӒ|6y !'~J)y !> AQ i CUrA>5jtdΝnݡ۳"A#t=yy} fA$?B/)zRW !zFå]vl޼ylrrL3gN FDy@FE<ʟ8qjժl'N+bN{g3k&h[v  ^yby"I;Hu>౹~mN}yQRdr7nќ ͛7'S o#m6pOe4iě|nLǎ3Z<1l0~6ñ._(vb(  *}Kp"]9Qp4͍|ƾBia)QT}@YZ+Ef۱cKϠ:tLNNn6+8;v5k^K'_ 5k,nPs:BPt8ճ*k|M+Czx6w\G#ͅcw;C wÏ5aD]P 1 H)Y4guî]0ir(|%pB=ghժx8Nn7?c\lJK <[۰`BnݺԩSצ&I)OMMԩSu[;w\em̙G:w=C{~hԹsgΜyďڹs0{;v=uԐ2X(u$iTjQSQkoK2ȩ췸_Ǎ׻I&"""*;I)_R^+7SJ3ܓvKIIYӯ_ea|{f̘ѣH)DeD7VJ)=zt3fam[vKNNn3_}W^zG}ۺuz۷Out:lٲe;vW$$> P" Xb\GK=Ԋϊax )c֟I(""G#<)g+ =@ $={իsXxt)*`[3oL߮vi&~!gA  /BB{BFZ`P!c0`@{w1 P}5{16fV.[,J [oM3fLWp,!BĪX>1c[M>-[UV m6[MSMѺu{RÇ{燳HHKNNn v~5!,jL @X(^x\.WtdP[ =$80ͮ`~(/oţî|<v;M$DuEGA=c=>hѢӦM1?fؤ24H9[ dj9&=[2fcǎ%::ڛ|xx9t_YrwƱcǨQF;fJ9T[Ù~)B{[%aML/_Q(JB/-¤`KKB/LRva{v,p,NIIY׬Yj)e#sf͚uOIIYgݹp[SN5kVRBuslG9fzFUߊJL;'|CsM:th+TI&NHp\L4G2SΑq1ʉۖ~MN;ۇtG^BOf,Y¨Q*0k,RSSyXngٳ /TӡC\.'O?gСH)͹h{nڶm[*ݻͲ-w2HvqB%tnq!ėE!RJxB_%gPS=0 + jF?d^zm}*8y ,`ۣ>\o-Z^ ω{-[G-Ƙ~om۶-[z+[hcٲe;իW/[~;sL+Te1ɓ'eIUz511ѫ?Ǝ˷&LXbŊS%~cONH7'g㟙+rMLLL… \.M+BŊyw6lϱur- /xɇfdee7p9 o-ZTj 6?_Bg#sTDfTs-IfzuJ1W"vɒ%O{|'~M(3gzuDu_wu0%Cڵ`۶mm۶]̹ceš3gd7lZG^h:}rɒ% !b[6ׄhN֭[7hݺu飿_ na*#g!$HTT9~byf{9iwY}aϑ\= {6D%sxA޼o ,^xմiSϟO֭"ǖ-[)y.TK#YYY};wѬY3Z:u‡hwdeeoa` T?~6ٳg4h?*Tu$3~x=ԳtYn6Ν;'P#YPQF ~ !9Gi)m kɓ'3dȐyEC1e6\*41xlݍvk)\.o6>,<a*lpe1\v]`ؙ6jGTwq]׋T?CaQKEUB у=zPre.\Hdd${&--/s7NꄿK$+?qgܹ!ܹs :KjBtQ\W\Q*4c7 c=[..12V\G~#>8KRҸ3JI>S|… w~@H)xڶm7|Sl$СCx'$m2Ѷm[ynVGPp:̟?_~\i%*N~6@"؄>_~x C5 ,['ѣG={6ok֬1w8^w4ke8tRzAjjчݻ=z㘖̈W|JҲJL`CNVKkApB/,| ݼy3۷gƌ޽Hӳصk3f̠]v;o(pALo޼CR~}>>9~8dggsq6lٳ_>wy!>gˈ|į3qmZBߺ*mU һ 1T;S 8D\J.nUR%ƎSO=ELLLX9s&p@[F_䧄{{Fus⦅ʕ+k̿k֬y%!!!DÇ/N瑵k׾-bOH||Ɨa_\ D3J| bP)>/6j"^mwI+sh% FTQ"0W^2`*j֬IZBѣG9z(;v`,XvBcj֬?O_죭iii,^gy _50233wGFF64/;;;';gΜ\?:: ""!Ay>,b|!]vTВZT-]jhІ|5_ƅvXn5 TצMFP<<))^Fŧ7F Xq%p@)"=aT)1` g!Ud&*ze\Zn% 4`I) ey)PH! ~iF;vqݸ\{<>SK)9s IIIx7Wrq7ӷo_bccR *TrqN>ݻYz5+V0ф1D,(k6 a*T,4|e (]Y%:kfܸq 8eeeq!kNѣGAy>_ ^ PU?ԩSnxhذ!*U̙3߿o}1nnX`cǎȕԬYR# +VлwoC߹@DJC@2I)Bx'}"11z )g!p-T 7fҤIݞC>ϐ);;k?q.ƨh')+5׆Q^+ڀPpLʇ`K*T۷gѢEԭ[Xvza ͛A5Txuh׮/n+櫯bҤIlڴ8ߣP R!d~YPR| !2\"XV /a\\\I$D˒+ "#Uؿe6pرc2e tAV #7ݎfns~m,Y1}Asu!| >K< ##Lfp8pxoeĉ\p`%qFz Yn?*V~__3- -9X\?(XHx^Ӕ-\ LUԯ_CIMSY2$&&S#Z)_"2k,ƍgx[A>M6e1H\..\dffr)'FDD6 !n N:ũSp:DFF2h -ZDцZpc~^([X,e^Ie}Ə_~? ,^ xhҼys5jTɇ1cn:6mj.W ʙyUxc*Ϳ2 LBl==R&3D)!lg\I ! l8\ݻ? v-ct%E>zB y#>ȼ. 8233q8^a/9N\.a|^s~BxInGAff&ѣ=ThB^IQ޽{3oˌ>.CׁZw+,vMf@5 3C,Y$G8maqQ ? wcذP͛i] [2RI<+2c2[QQ? W,~gY^&1@DD,N>AŒc8{)e[nO;n0}:JkJ 5\Zнn^n2 b|7<vKl233q9do?bŊސ+۝|f/YNC6)%gϞvIhذ!ӷH/&* r/JWjbSF(1TzEvi}.~,c@ll,ʦMtҰZjtR~Ik#5nW6<\s WؑF@6ru)e^#;PIB ^>۲P:%r^Fk0!57d_(a,%LBzE#Y0W2q?Ior&;;;{GGGSB&/r# :ZflѺŞ2rav LmpmLL ,nԨQS\9deeC@*qѣG 2U氯1լY~4!ЩO:7ETXQׁAl'9%UAu;iP|*F]r6-[XDhٗcyJX˷{d390%jH%b- MF˖-|[f´ﲆ6&ɨ5Dw.׊ |M*TO@; ;(YTo bPCbWJ~Jozz6Jҥm RA"YR&K旴]ZoJ"!F9w %?m6w{UtU=Pl>`B"""r׳gOԩ3;$̧f1*k)ޜ oTh_XϨn^_Tղ}҅A*7INOe Zyo*ͨ~ xPUq5Ш}9v:j(ڴih[y& |AӃڝQOtN~7QBMȸ:y؅M/`jX*<I)FTA>/r(rTzJPDAos)OXx[J9Ҩ@0< fr`6}> oɇM(0(yg.L@ߥ 6G0b#*J 9Rߝ )c*1{ε`"r*Z@T{B5'h=J {|v^XFtiӶJĝUjӅhi\eh}1MlT'Rw$6'۫͆c3 bC% ۀ&PI)쬞^.Vb2O>;OF;A٩[5>ao2h6ʹ0{>y@\M7ݔ|$trdiLݲeK#-K^#L!X7Fz;Sp ΛW}-]JgWv9+E-&N(FAdnzT?EwԠ3]K y Цv 4w~mm SY^+)V)Q)SJrK))%L"Z&>1jzΓٿCMvErMn2@9{Riկnl=Oe ! !.$|yQ U12fK)-[ eFJ.BFː_-K.817/|VfiժN˫ T!@%nFB>V}zzU 9 Lo/k"CHGP?oz܋ *>%>Z?} 91| X(~7|3ž `\´هPa@M'69R;,ɒNg ֡u?>'4Y\>8,ǁ]!m4zL"g!b;B۱mצ=<׹P(bSLs ¯Hp!-O<1'KI+c|9oÇ.$t>Pw %m@A@kr$aѼ/ݜ+#y6p#a`$ڑWϠ>J4!Psx*aޗ5lr/nк7*IB]"&\c{*|tqUj#Sbh лw >>*幻试&C8BumM-pTy fzWyEVÁMOrCA7B@t5]#*!lgNj@:VY'!l1ʙz/9KR&?*?at 6gFDH,@F|dПxe)fTVG|sn# 4A0so&oM$xc&z L9 P%yԇwAh/ύM*,PaqLȒ qB[ Y!k9ׁV:lPWJAU*)B<"bbb*i~Ea|~n1?gQB`;%\u s&χv&vW[K'|ֈȃ 4DUrd\Gz&R:G > hp$!’UTMλY) !D&Rq %r^ #a|?* aB Y2 {V>:*U";;'t$G>Q Yl/? t;:cD.ɿsz;Ai|ނ@z!r  Y @< <L}|C8p(%*; U1j& vTRB^#s<<W_< A 3H*C键':/kA.ث]rB\QRH$)HMҎ6g!B+*[fX#@n/8żҌH%| czWiBxv$ߠ' dgg.@ʕ}6E^ޙ 1RddB8QQ ҒA>s[P-FhBd~cRժ*"}3cAT^XT0_BX&\^Eyk`-=6MU} AubWLhx8y Ε49܃ s`Q ľ*JAkk&Q^&Z7JW'Mժ**u=OX}nP )SR3A^'(O]Tn8s'XtdbY:*J~\>æ'R{/P* gըu5zdapƵ5zz(76& !&>2/ 7m[`!:t襑dD@nFFF@ G?I1G /v 1 ũS~/`c\jPaƋy=ϣB棒Н!e0WkZ† # #TP!PIY ]QT86ѺYJFҙAަtz Ay@s|}?lB pܹs>R~ B.鏱ٽMuG|/y'@ )\zU;̵Ze2w~߯orBZzU IDAT怤QӨxJdAɇͼ.ШYMaRz)RF>4<&RRS%UaUj #S/Ixa۽F| GnF#/aߝNV.hzibcc$L<32{g3(EUX$tP#QnǕѻ $tqQ Go X&.':.vԈ$\5r64v)UbJeG6NFrGh_[e!9!z:'RJ"]UQ߀N!D&f4JsYB:?[!ռR|D>$KRZa&!N aXs0: [`| [k?14} F>Q Oa3sQ6(.Z/Dh54'6H=u9yzRRRRJLӾ|ܠm|$|cډAU&0!!ˁ?'''ӿyaWFl$sP@Svv۷,K | LjY`[>D`7K$d%*b[VTRz@d7P ^FC6pz%T#ٜp_@<oFUPKQ}[u*4@$j,ujZxzb ۀ^s=%"ʕ+[D<*do4y]

C?ao:svw[9GFc; pD؜HKLx$}9'WX(R(R!!ݘ<:P $(j0*0RM>,6R>GܜxHTtc(`T~_iٿa |s)[/7χox%`nB&++׆ ӧO8`@ frܹ I~ ߄p~VpsP}Ȏ?gMd@YCyV t(-P9+yyW7mG쑹E|.DyѶ}rHfV~=-\Z$|8l>zhoXw>|;Y~߮.hMt%R׊AD9@ H>Ff< #\[3!QސE5{ E 5 } Rz72u")կJ>$+'0cna$+K.5{h z30G~ aLFsus|6'|⭘2G"y^5 ( "*@-aZ#T$^ٟSsc펐o#MQ<& 9Wv QfRٚ88vg⡛C>ZP3@CC455PGx^z)|nPJ"C{G}}=f7nT!>^Ffekz6+DȱiR""L@~Kb/^!NFs? 9j^xhv2mYcGUO XrJ~gϞիҼùLB^o_L_а+NSmEcj/⽆8>#PheLya>|؃D3j=$TƑF)Gl,e$ oYƚ6qd/pRjq[L>'W]uvi> iҥ =%%%l޼())UHMnp>}sss>5oFz,ر#?0-)R/|477_SO9/yw&׽f.^ o5rURR?L!ˑ)hBu !!Lm1$j;](WXq(Nj:0\ 4(g*N:$b)q=K7rbPI2bW+ }V hw"Ƕ5C%uQb&: 9큍D2,IӝϙiEB?FW%Ȼ4y|b.KNE Հ͚ y8wd)_Eh([!)o 'nEl_"/IjZ΄i޽׷sL5r^ y-[n-[cjjjؽ{w9Hv̎;X~=-bϞ= צRs,h@$% gY;|r?]#=xSg6 yRGjj2g9qcKʜh5jQFQ]] <с?zS?6 ߏy-FQ$`Ht {Ϭ?pk fLY &. Y)'K]xrmy7%q 23Ȝ&!#ik61vqLSSeeeS\\L he ܭ]hnnn$J6B CP͈-˖-gӟvڱm69蠃ĐzKvCrJG͵ܛ1Y6\OcD0Cc_``,b[VXNc޼y <V^_k5iӲ zy5Wi|:/*hV6 ]DHeaQJMAB<@V)dqڄD`*_KRZZzK"Cu MH Hp^CC| 忳9 H>5۶mk%y"Kx7g۶m|'|'԰m6vI]]ܹ[i&֮]G}Ď;l޼z˭8$sQ9œ;J!VAh82g#^9sfF 555̚5YY]fIuu5'x"Kd̽js]#W7?Zy_Y}'c3'.乨d̘1va$At"_ `׮]|GN+kI_ױHrXO! eɐ0Q4̻A~~LN2d-ŸH5555y7I9TJg5dMƄ (--&͛/~ x1j*(d `.Л=$Rt,hnaa C@lٲ%$ѥKBq&H?ѣ_~9zgp͝} {s̰۩ud? :q>гgOZpHCC[l6eqHVH&kA $V^_D@IHX2%Rܩŗ"DD") ~'o$"ѩop>d4 p$Efb[:\N2A=8 bk!mq~LZcNC80dqm%jm~EQ',o(۷~ʔ)F+/" ># cuyi&=$;Ϲj|%p8Yu{ mi6c^ !&pf %H] ߟɱP>`SƘ&wkWeŒ5̱`3mqƶ]3!-,,,1qIĜ"rӄkJp5"&Xl` {8ka `YEn#!f䝵-,,b,~:)[ ɕ.y#:'$x{\~'$HЮMGjħ#\#I x "R¢@ ;P}E3/9JGba % DD$L)>HҺafb<|@ ͚Bg$oАǗ! [Xoo1lmX#Z?DPJ]d!s UY&oY#O$Yhݻs7ryQQQD555̟?;3Zи?IrB{4=L2=z0zhFɠAիWK2;wa֬YòeXhs}jfՐ1{,q$ǭ뭖X1?dXZM% XrnN:t(O?4~/g}Ƙ1cXjHљ Ix=XO)./a ੧bƌ\ҩgߓ|\FwE``v[KB,򔀼 |#âAUHBH" sI/]U„>wcLe}b|&DDGs9ww֍˗SQQkgaذalٲE#X8yy9wy'W_}5&muƒ%KM׀sE>"X\ ((.ɇX !UJf'Hv!ԸHqt yJ ^3ph05uDAsaUKQb9ύ*u3k%RhWuhˣsY`]tI<]ta޼yp a4ƾՀd?p I|P %H K>r3ӎP1RJ)WGJ=fn^\nO | Dl} 7tXi:"9($Ԯ뮻809s2mK@r)u 0煃Հ$b>NZ/B*i򡀿vPW*6Qaw1$ЈfX]V![X\`΍U^UF0l~$֭\nx9F[UyوC媫'O裏qJ泖XX$`pbȾ#v&Lpp76ߴ5煋X$$VZXXxӦM;LJ'Aq1ӧOwkۉYA 4Op UjQ&*^MӵOE>EpJe͵k`Ƀ(XZ뷑\n̪%d][J o)Պɇ{a >LR87f=j=RW>\9I/woY;Gf{54rPݻw/޴i%%/777ӳgO6o.' ZL9^m%Կg;X E!  S4aSDZ5?M||Дue)o ttq5<Ͳӄvaaa @Re  r>jYJR')SJ=zJ)X)  |Հ8֧!'x\ORZH4F44E8~zRjI.rJ)U] @)5>Ah:O<"|_%i8yBDhjWїA|t⽎WD3{y_/r䚏iW޽{gL>}8RGG!`LHyN|8l,{y _2&9wEBZd=BWVK@2VV<$$s,,,RC;gL:ŻE=Uk=Wkz99ܪZj5 m"k(qaaXMxcn-r aB "pR|q b.56eksdb^\ IDAT&{c3b7I"ܻEfSK[Gx7Kˊ <:"54eLݻwC ;X~Lk]j5 qb7ɭ눞č9Jg=Y4CICrHUqx-|p9bAH_ԣ|AE;WRSD}qr~z:u֭[|9̐97,!9GbUwՀX&>n򰼛L\/ Ij|g >$ ր$<a#5k2&ӻȠ^u:?_j@, _(+}i-7_ rR`< 9L7 zCB UMH$͂6*)ySwܽ񛛛&+\l]vYFXtTZ+#SX{ݯ׳Ģ\ڔUZKss=!!\K|($2R&^B \9M2CB,,,BXhQqssЛXx16wMeĤk+PT :FHGZH+wRo Z_Ɂ+YLJyv34U(C ?'?WG8njHy>͘"WKym*uo5 _7Q޴ovV?|&M͛͛d2`٢M|}'XB~Z\ LƆ^29|h_WROXރDۛoE$dLH f̘A _knnfƌW?h&`73qCOSJm$WfZߪ ypy0Y)YR CB$҈WaNZ?Z-Du ZSxLJ-x3;$$VyqTMU*~_2]^z]"ɛR*zK|'+W7o={6WVo-(:B)Q)U0.VJ])s# J[ےm}cxkd h 9tZK_Zd}O"{/ m=a]֫R g맑|(_Ϸc'{hvs-,,_.xSN%"֪U曝&~#?TfbGP< _W#NyN$KCmm%B&oDƪHJޚL.*+ EљIl+lz'?ҽ{ҦMtFڶm b41ʩ?F׏_.]E-[p)P]]Ym׼I@bG~abzɇy@ ͓ `8}nɇE+۸%Ɩ> |T]]ͨQ\ZF吏EB!b$11-G"y$1bG1J+RH-sh7O].ˠڬ$%LDb{i6 xi]ydHv!LśvK],XDkZ>[bv V^)Š+@g ZBOQ{sb$t@ı8I% Rj!p4T{o9h3-,,̜93#Zf͚b8~O<￟S577srdzn:Ǎxv7Wo/k(F:$ !>!|Xͣml#1ZȰhUJ=b\jB\/v*_7o*p!CXh4DMM Fr_%HēX 2iӦ1aJKK*y_‘A#!p4nt^D5`4J$K>,,9.̐XO(.% XrBܹ37tƍsF6n… ٺu+H"ZD1YеkWFgAݻ7;v`׮]_5kְtR/^$YD&tEc 0$Mmm K@|# FWCi1c5yKDݮDNMu OUHl?#N|1k-%q14a&-lHȐǗޓ% d%q&03P}6!Ѯ <|qc#nH&}0`:{ᎷoJ)zx]]֏?Ꭿ]v}mKKKk_]k;@5`9-Щ(jWR_%q?ӔR_x$ JYV}_*&yT^R- Ҋ2yq9hX=Cnaۓ+E xLx1g> O)ey0`@'OTMHD^$4} PJmʒ^z+P u(/wi%bWMgK@r-,VbahOsd-#0,E6滳x*HF' 7 *ؾ>]$U'w77$蟈>_,|7̼4Lڐ>Y?f7ɷ(5yXG!ǘSV>@SJ$B|8;" JPCB&z*6y8ɋ`<,Ԗ7Y'K`d LD[DzMp! ʛ@"<_ݻwoΣ"-kjj?>wy' &?  ѣGfȑ 4^z$!ܹs'6l`͚5,[E9IBk3~[keaj&u $92*fy9̴k+b~u(AP3:ov{!d}\рl2mЄwf9'֣R7xVkT4+ g*ʁE#M8|с @t@4{ڡ"pP9tP~i?]M6ۗ믿 .1cưjժJg-qSfy:c>}:Ǐ8:wLΝ>|8]v@z3frB$)>H'ZBGy@l^ ^9۟XC̾*l?0nz"|Gl󨼶|3]˧j<^qZk[D%4UJn?\oAC0ѭ[7,XV={h"tm١r5{l}]&N|Cqq1&Mw\M.t\?x[baQ8 FU!CVrf[i:A2̞`&̊&$"WyZ%a}=l;Jsaxm&ֺ̣N6ڄtris-/+4u6Cȑ|i \(SRQQ+**:uC8C6`/_ɓ)*J~:[\\5\[oE~@(`Rm yf1)+bZO@7&+2nDVf)QڙGӵP |Glnz8RpR:k6φֺY >ߋ qą-|/ EI:;ҪxUa}>Zf]0oPٔ61^#ΥW#&Te &P'W?oE!A!u]w1p`<3g)S`}U}L8;!C hd1,gtpZX8D8^/*b7GJԧՒ`j`XUkmqrGQn"d־ C:bs䭛^Dt߇OR~< pRjfh*A4}񿐢[}(x  -mC#~d^}q!8Hէ[͂|HT3COS[˳]cvr$`СCywt CNNc\x$e|>#$$K&6+m;kHo> Nm#W}B&<#MD}(i6 'JqO:y@bGZJ=* =(ѯf%J>\qx9:[Ȕ8 BG5oaa>L6mo$:өc;Xb 2 Z_BuZkz}>bɪ<"\$%||B2beNݻwgܸq_ϧk׮l޼dm{刦^Jixi-pc R1I|BBzOҁ0[k=>$"hL3Lۀh=Hޯ!ak;J^$ xuJ2ho)Zq$G:^ub6H4Ɇ1ϐ"}8(;v,%%0fg81}{X f#iJJB^>q.%ؿNֵq:;k!@4(j6f%}7cK7sN[D+ι1O󸓽=\v*䍦[#[\7^^` H^$~ @"x89oxOEÙk1$~9onUI˝I Ӂ"dd11ELX7,HL Du2?fE ݁;БLw1IG4\B brֺQ)GaHȽw^=`]m(ƁdNCE:#rT&{c}m>/SBG/Vk)?amҠ)z9ԧec< aF H'HVAd*ļ:XXi,{h}p:]vH2$Tј#ZcjL:"fK`LJ&Y٘$zeZt,K :]w>;,kfy} %HNW"F# maa=o>ctС,ue|t>AWfNPwD9% Y tJ8NۨN'4O!UQ<>|)\+^߇SMV=\^ي^78|EfD3 q:O`,_!I 30H9\+ _Oۚ|=ڡ ~X $-H_(E6-/lEVr7!OF'ZdԘsSG}4d=֛}Gs Zr$ijfߡfF ICnUJay)SJ\D6,Wŭb]}XkչȩL'P {V }TApC4±*p!p8b>@>/8$q$`0G)# ɂs|/0bmߌ/"a' јit|A'BLM! jR6S,1 vm3oޱ${a:H"z|nmu㽟*KԄxw&—@өSnFTВpp|>Z|rZmJytx^ &Ld7(BQ͉FB|ڬ1](Js +0 ')N`^b$U"jndK6 o UJyX4Mgx8YkB qW4ZX֬Y3"5kzT1(Qsu~ k %!HH\Ck-\9Z_DG@ToI3fs`D !fYeqmH2r!u7+ROo5Fudo \frn*tA0s8OHRŦ~vktI"H$QQW%57\?۫">q<"Ms+s-[e].]||Ц'*4K@, DB|$"ԣcORa-GB&ZL4WJtvpRBmf3N%~ZDBp@rm'8r_:qJ)"V) ʃ>E4V_(όe2']j3ӗ IʃziȗS[[{44c\d" $dTfW!If @Vf9ZDҴg{+Rɨ3:y)b E&3 IDAT:jWO< ;R1dy@ \\ 3Wy}~2SDl>Z^E}x:+A=DUU=4c &L@qq/mnnfƌn,2`Q`[*J}Q>L|<*wAgH>D# P`-A$ڐx3hBX̹ey7ڛzU< kRuiORM;"u;nE~.5s(/^u") A{C.&q\X`LH}@zrf\/9yԫ%F[>?cҠ#o?^{/{\wu!sh~#byXy08 ;P0 N|uL3ɋ5ypQF4̶'ꎆ@Ͻz@6f2]AP蜧uy@|+H)kRo/ãCso28&PNgy7p ׀:u;*Uڰj*nfm=@y 0k2wy-0l D/fM,E1FoRgry?7+dI}mAAlw} 2kp1ڴ 2`Rѣ*=Z {5j'o39i7Ce`gM]}pH#MV~>M@icc#mڴH766e q&L_K.yYo¤IhhhPfZ] OCF$p$x(F|,drrD=3RJ=e~Y&{Xn|u>'1 )B69/{UE~sAMd}GdSׁsR 0TzlkZ <$K#pVN3s"H`#mpbXŏfa ^SSC߾}3"ƍ-jcG3ڐQ!+|R+λA:#/&2r,.[QJէӽXZw4q)Lz:o$Wہ :1[Bg犯Eȕ9Tb>!D-_Wσv_SAXW׏y1x`OdXz5Ǐw2o%$gOnz=#_hL꒽EGQ_l0ӷͤ:nI`l7A|Ez'x|?#e>#J{,_+o tU)\s-/ۅULkAM{ZX#̜9/^SSìYBLwbjN@,~b "2DtIK@,,ø<+E!n|*&r`t2Q u極ܣ#f]Xԃqהc-09PnZV"*"U![fHoEo3j9׍])h??͛73vX_IHMM Fb˖- Ѹ1]܁M.SLa)~Ѧ&Ν˱u]޽{5Q7f#B^B4)Z ܆q./C2q;;Vڄ|^fSeƐ^Dod- 8G)ӷR;瘗ۢ> ?bS-/үyE,,wGZrСtM7Jٸq# .og֭w/(f+7kUVUUE׮]=z4gq wt(yvbYKxb' yXhuiY Q< `C1Sz qPnJ^o8b56y@#R5).C$wϖ cD?E&T U'& ("!)˱wq7OH)Oݤ8O8_\oF̕!-|ՀXX6!ؼD!qdF40)gͦv$9~iϐcb+5) åXF wy5Z3 I_iSuH8?;cQ@ Y`m&]އ Q| փ26ۡH8>@wZ/}dyn Ql~Y51i: 5#L]; M㔚J>0dSԔE+R/\S=(SD#P}J넇OZ`L@OyTz`z~_}hHps=}0+*#ӋXXXbaa)6ڌ 8q`6gum l$&S,=jcY)͢{|V K@,,,|AEܦ?L n ,{u|KJ?/8O\vBkZ;i})*>ZnHH$[|LpGkV)53 u" cExd2ij~UL7B9Ne،$%]Hy|B r$Pu_:]U>#ax-,ry&ax czCH<]Ȧ:- ou{#~ }2\"YطyTD8|R ǁ2=3[&P !Ns*#6J4'O+SyvN.0of E j>5g: ?fǏ4=H"r!O HWE0a;Z&C4rxQ)كkWu (jg78mRjjɇ)#$$hn EBU+?`Wݹ9󨨨HK"šϟϝwImm-fLw?$ѣGfȑ 4^z$#ܹs'6l`͚5,[E91+Xag5mtz"&Xہ!dueq 7d䋄l7R'_08[n,X #={dѢEtD<0Οv&ٳg2qĈ#4i.< ~>,&2 !g¢scY8ޝtί7&3j>D~C ؂C'974>Hzsɇ1 b^}gR.Bd-Mǁ˔R>4kB>H#HΧ"sVFWY'_|rz߮O7#juu5,ܜ6AÆ ctSYjkk3f +Vi>cx`ޣXx,NB"d"ꫀwRbnSaW(p= AV3CV8ܐ !8Aܦ&O5+Bj`9!ޝzc&CJJ]Zs=. R/&ZRSDhP)Ք^g'.+L>,,FW #-c+ ׯK,qLWg!tL]t7^Ӗ̍ʳ2>oС; EJ@C\$+,a:?b&/ KZ3Bk)B%QZJg\>xQ"ZT4D]{ lFwa#bZLPU["@81"2$xsS)uG`d%dnt_Z^%H:TL67kTUU92aXbJ> 6s0~H1 }XX$ӀcRR1c0gΜblmK@,C>"!JZ9r۝Ǵg+xT! 2 ldǛ"drf}xx5>̼,J0!q2c>!hE)z=Y{G8z=y"`,as {b}oA>^2\$$ |,͆E[}&Zʗl{0#FdL#G2gH\^ i D5M?m %c 1֣0ef~棈a)& X\QFNǷ/YR5y@$"252Y)GI!tM!䣌kdrD$DĜ e̾s`Ӑx2)XXX/HTLaРA%R+F@aDIv [Qo92"\^Z|bLڝo:R@4 =$qLR׹&ꗻ>`Ў7r+RxG/Ʊ'#>c@Sr9EH'1Kq0fߝ;vfS:]CNZRղ©Į339xMiY߉N9rp޽372]qm'" XM=`{HzU\ du<> AwD)$ȇ%ϐ:g$v'1ښ½ q vs:ْ9$Mazfe C>0d`1 p~ eȇZG"-$u*}CGMֿQJ6a4Nq4m1_ m=*pQԐ]i)Zy.~ֻI"\xL&a?bEJ5Tcn-r !#3s֣WmAd#$`8o "q-b= ,U$IfQq|2*x=b\n4}AL> ?Ej$|j&Su`D;6z(o0g<ɐ[?^^IDӰMfc^%1 ~`7)o E.s>ٻw":$0`T)-?I4oU E$аd& C"u0G)񁘗l^gRTB)O& py =KQl&_ 85y jv?2c_C.TRjz 1pc䋀m&CkI4d:h$ F|@p- Of"a"^߇#f?W Ǵҧ㇚InQJmZN| s,+7Z g ݒ's7C3:̖I IBaQ"*Z(AZTDKh]oE.un~Ulqc"**u+ "QЈH’ If9?ι$ddfp?}̽w}|γuF>mBB|0qc0I&o"y!D ?\ ^1#z|3 nVR& !z@B*\,h  (ڵ@j+*|EZ߸hnRDW*KgB!J|DpJ4HQ0  ?kȲW}v…eg@6}]^`ݺuD R -t0Go.7 8oz ( W RQb(S(z2o: U9Gdv *6;: B}RʳP'D'8U|kAߧIH8|_fhr# }Uq} 1a[Xxx z5tի0{PISCPE/P ԋjyHJNQ" \}/#!ćRɀ'nCq, JR݇우m*yT w/Fqr|!Dm^6௄fCp.&;:!;0v7ƢlS=4#+oN+T Z\qrʊ+3'^{5q`.K 4BW7 Jk5H)xMq 2 Xɇ~.Xpr!T`Q} @ jnTAC(yn؇}Bot֗Ҙ`^"R~W+gF{}^Z_kr9T0qa0{a֬YXљx!6 g$.~y[QY:ݵ,ƠrH}M= ,B;ĈƻST[@w\`#,X˷A?'o@?u]}QnF{ 6QD@_*Is>x0뀘8rL$f^ǥUZHzSzAtv= $.OʼɇRrUm}2ӁDHgY*40#L#Xp5RJ+&L8Z QERE [l[o5<|EXDd4Pf`H&_h$_Q$c>RJT-^}}xP.RFEÚ yaZݔow~$M]:«%u#R^.DX Ƅ/zS]5GSS111ҵMMM&Ն9f> --2Yjǜ9shllJ|vDY4NѿQ15i1 (5ͨYO3wAHt?E&Dգ0P.h(kszs%v *_(kޯ؇]z 3bB/WCR&f&G/$=^E|b`TO0Q䔗3bĈ^ZŮǖ6m?,\py(܋դ-&L臐RN5ڨGq&_o%~JwƷxo`fV b}F~WBPv瀫0ȒE#wV3|1E(6*ajf\<#FC_8=4^{qƅE[rw Uex3_AL0a-pTxBaAFF!"_ml?FPOPA82a Au@x!&W H{4j\$ڐxFڄìGO4֣|L%pݬ1ݞX3  !| Ak`iUe!gc!1!DX2KI)3b>>}Z[1H++ViuR3v35s-s>g~\w}!|}ӧG3m48 jW_ϤIx饗pxu,["nF\.DYa>Jɇ?DWh4nƀ0ѿaԣh$؏@ͼ)( +w vMDjdG> Dz RJʽ3< X,e6qHZ)0L|"O _o#2ocV871p/Pe˖a&L[na̙=0RVZ}ǁq!6լ7l2fܹssYg1vXILTs]]~-Ŭ[իWEG8:΃*l &)xP#HV ה7F`cPkHd)o;lK0'_czm+GPA x5ڗj H_מZ {*_"p*)q9BeQa[u O{]&bDF*j];jWSPq f@&Gm : 9UܘuO$EP4!~-!tbqHT‚>p}&H) {UYC-aDQUap*#iFeUKb[@/59M,aTodfz4a&L #Q<H;m7ܰ=@\ů߽z{^O !k;F!DXRKJ)GkՇ8pg=Gu$Lop+ܿo_꥿ 5t4 &")a !f U9%ߨ5k&)enHb 4N} "RN] ABRJ06d#FW}7a„ &L0aDTKͮsA.}]"gʵwτnLk„ GƯ7yL&L0q.X&L \d*vQFPaVF]5Vr7D[vT0)_.~;|TZއQf_dړB>%_-!_';c{'qd)P.L"Ҹ5mRr qzU@]n>sDŽX`6p GU}|=/xD-}(AG+f7pe%z O A@h[iP@|TfFkj7iĄ PWl6F9dl ɰpAłdL1ګ)%>RRfCMf*<ρ]]!5g5Do5sVƧ1O_F2 T(> ec8Hr0jT9NrrbΎa0'AR ! 9YeMIQj55nZ͒ʪfvrgOMؾ` n =\s)) *UG3p.gimԑik#h,;BQJP G$vO}Ew  8&33o3fBX|JBOqp+:DVV>SNeر 6amm-vw}7x86"Rٛ&1ab``7=3!IIG-:{=ohZV׃2qH>&碒R>֢2w"̟StD6U$_Oqp O?mW^9HwIY磪 l#AVžҔ5Y&1 % Oߝ0a:yq\-[@YB~_c4EEE~\xX@^/˗/{>3MGNaOU:x -ˑI@LP 1*@c^:N޳{oGbl^ l’%q.KSB ҥT G;~<]E8\r㝺\X]BUE${KlذL8}I`R?xkXWSOq7jjM7EHSC=˄ &.n>jρъv;{/, z-(H1>=8 tٖo0a"Z`ѢEQ'999,ZqFbÆ ,\jrSPP*)ѳE pV l<>= 6kcGYu_cI@L]RΒRˬ>(yRʷR~׼b&"'U^w&&Cڑ78^M<|TQF~1jwFu(/fTxZC fm##gɣ u |aꇈ#@?vi3f5fΜFp2ĉzƍcL8T?FpHHCv$.V 85'gGJFm}1HJʯt"0 X&|TJg^6]˕W9vNC9\+IV§}5N˗p_xa~@o<2* ntTyxP͑(za 77nov9222x7 KxHH+#!.BXLf&(0cp!a"7'ed%XP\l_|!޽4l8\bl9dyU̇#G$5y4$XT0d:pMU5*V2z*CKrbPBעi{ Cz(kj(k#J ʅ&"C>&\d:  -<1(|x1(/W+SR꫓=׿r<{j>x6oxs Y>Z\MHde% B`5[?N^Feh 7bmƢډnCM5 L0JnC=V@7n/~>p.  0ě=a#Hjā9&ˈD @͈]n]Tuv`p)W**kLnDs|+_1PbBdKOk83a~ӟF .*p81 b- qN|?]^ [C I)MAp6 %i([M"׿–- ,z9G6ڒȑ^ Y_*_ ةKGKl`ZqUT?Lm^ A2n-j[J*~0jh OQ:cILiK"" <A&G>棊9u<%B]ee\ĔXr쁽T>uX^_&MMxK~BNf%$0 Vv[sP' 9A`%3s8Uo-\vYSNK&''0zϦMl7uu*"1Jrхq%0T&LHe.K+;K/^/W/Zh?{c9ytmʔɮ%KVҤy' TAĞA?N@6`]@a')PYgT‡:]1,c@U30mюl/ |1!e1*LLYQٳIOO WÁ0 Ewp~+Ƣ| KqwN mE #Mz^PE_@6o*y^G?=z0=KʞnBaQ8/w]YXƜXjۭf >_5l0 >$V=\KzIe!h' RSQExfG4df`Eq|8/*`Nhv'&p8$&*mKM/5ys=>;q=em|č<`Xuୁ/a3|>|N.JH`ɱ11$[$BXu>5^/_65z>s!o;'LݸCB'F x[ؼyI~5q^WhB`.De 5ݎOTCe?PvKT|k**T-Ge]i +sh{ d<Zd W\qEȵd,XEWmXJʪ0*V~,St1vp]a%m ܽ۷RW_GRUI‚/LQ$ &\*.Bh& R ]tNI+3U=/U!_xj ^qYuVDP$ I آ*g̘M]^/eXCW\qRShm6AK((e())-^$}e.Yա*3+P6`'n@U/l$k6b$8*0vƍFcÆ x[i\]ae!8IQ܋]5Pz<v"@6(=T­n_oN+ćr$ &O9ZӋvvkr!ĂptC{1Xߎ֘!?QOZpw W_sז8 1zYzAF| ]eٻwވ{MklX|Dz DyIGD~tVpd\PG]m­Kׯr풰e t+r8pTP'Aox`b2= !x/_<+]l:\ IsS>nm0, x tX::DWmG &E f(+>HYԼi2`Y@[bQu۳<ș]7RRb$p&&8@|b鵩͇U0Oo~_ 5[ мuMq&@BBKAajDn)忁d#_RRqQ:WnT^ )qKb;"n\}?j!碬ĜeOCJ9G5AV*836)O{ MyuMt-=ee BXˇeoQnV ղii>NI8CK:gj 4w}k_輪{9pGHeQ>ܾ!_QǹQ{KUʎJq(g=z}-略Z<,RJeQ$G qb^hDŽΰ…m&"7nnnvqHE6UVm0,߁6۪~u'.\s^uF_įQ7B kiڇ4傥#V2b[҄СC&@}}pl{?Ig'#F*ÈhY|ikZ(a,5 Ci1$ՓQRN oc*ˢ5:^ )CD]nЂУ,B B|YxඃK5Õet8֣{A#lK7ʧg ab5QX_n ~/K|Ϸ]5`;3ݜﱁ'%$LS},__ ʁob@va|- AZ!piF;Zq <٩`m, p]恶/q 8+Ee*s9_/RMv7BTI)Dini34 za/"6KZI˜(*J8m$%ᠶCMmUޗ_:hn/Fa@>Ns b u^ix4/G];v0'!"˜-tZm: uu=6shn *w2; IDAT b* JJC}x]fj%*~?aG?Bq{*meOp Z-BU}y|42~yMx`D50I&_ ?a`(~ܾNSW8$<Vhѥl'l=̐; خ*__3mR(3e8 ]%Xe#k*NҜW0n'fYJR90) x(w[ VYz]!UpV3;B<6<>Tr2Th_72 :ɉ!;;fKZ矇pqL {4Q^DYhF>jZ6noݝs#qGfrş;V|Tx|{r&t;!sޝMx:rmRt3+ !gʮeEm?b; mOw^#z!mrB! +g}WZ`K,AO]}.Zl!DPn_ !Dt֍7M"&|w34f'iMS\2 NB.CY^{J`bi/iȞ$N#z6\lkj֫V- cb(r:ga <_[*+G+fGdTN]yJP^h( < \} B9S>R"GYPl-W&+$ ! {rl:nrrrɒarĎbxW= !)Y"JW-mLR9 a6aK5 EYKrGt>E_ ]o:WdB \oe:>~odg'h '/}Ucho38VʭixL'(G`b`4SQ%*ϋ9;= )2,oݯ 9DDFzήo)_k/Pɩ/2s̉L˖-/6^? N}=ydׁ9B(_O9C?u~ )ת_Obf2ѯ `0a 7̯ζ#W|7\ض~{`~ N(O;!6c`QCٖ~|T>3(Mτ s^7jx,o/ﶕL7.ΪKhIHc;|XUSyNvZ Tc!ߊJoy w s6yx8h^I\wuQGoeQf5D=Mbf2/!@Jy6ʉ"] \*(5{D?EV޹YXwؿe+_|Qiݵ񴖤N\ꄦ QhQAp'ʥȲ0<֍{Q\~ *O@䅒Uvt=<@j0amѢEfر=-[[ FvQ痡\.фp%%q}m_JR҃mZ :GBzBdD`6- ]Y@~3 KJ*wWjRX\2s96yd,x-8<6'F . ,=BK)t_0eclVǞ'YĄ ,]\ѓ.x19p\ԄS%;i oK HKK,cɔxcj[b_CqXq=TI/ !+CjT6 ˻nshqTQ *QaVF9[ۛo~[-oo9ζ(QCū"p*$T OR̞]oy ̄~e(?T UT(B=J ts ]cC=MpH8`[r^zcd&䷛6mbʔ)lݺ5l2lݺɓ'i&o$ &L0qYMB/De.\x!z=]rQv[5]eUŋx^b(+%%%||\$T i"2\+5&1 H$ s2JN4p=`qBw20R$!=~ |s3a„ &#^a?G*yQVYz mXnr~!.&L;M0a_fM\a,5 &ÀɂU;v^3g+L01q)6ȥ r0џҖ3!\\fv3&p :"!OMmG>QA-`„cP4Ä &L$2A!!O4>OLdَAJ)Ygg fzl,?d„ 1`''N}ȟ\<AVT֭>i6 HpT#fAhbSp>SCBH)CJ9V/!Ās)yƢeo>E^i/XX[o!Ԅ !YOX\Kǡ^(ף(p67`}8TB^?l9 ӝ-hAӪ>\T;%)Gh%ONh|"H?vp%x.ӈl>>-R)=7=/ dLH`Enn;~7ff{LF% +͜ʊw~3>v{"p$'o 99p!BJ~Ġf6#RL.QFLD Lnff̘ANNND b |A*++tW d2p*}0YYYL:c2lذbڵb}]x keewP%EѺ#"'2{0XҚj2|aSh1 Ҋv#_燱ufAn`EՏA7* 2z-[۲eyӥg3q&k͟m=o^fo,K ^sC>]~1*@DI,a"2/njR0a"Ld"Ffb!`Ą ظq#7p#F;aĈtMlܸ?`BmJO-**W^g}/'2dv;vT&MW\>ݻy?~<(+͘>_MN#RaoX+ϳ(ljmAowKY?zhG<]2K GQ~?P>7FJ>U]]}w=T]]}pOAs .F>gD= Z Qooi]qzro,F $UWex{njf +8LOHv"xzsd ,|Db"W3 ǚ臘\ʕ+ΎځoAZZ( A5 qy\\x'ٸq#]tV= V+saƍ< kGQrW ER Ev!ʪ 7c_R !A)=dwLkQ,ݩW+j$#f|K`1 *' 0@48r |)ݻwx2~m~m{ݻwϐRϖgeeڳ2n'C헃 ؋J{ rHOè+deuCF#mKHA|Ytbn)UOxŔ,>Lb^WbK*| WLڄb.EɉsrrXhz<$ aQذa .bjk?-? HHM8nY'C]"pAYO䭋tV>gҒm~s>v^APuV*gu G؎S"ǩ5kz31S7}0:KuˆU/P+&R8bE1jqL/?ai)j|"h*mS'ُ 8Nېo2Od}}ǢLl6&A`X3㮻\f y|wy]C=AJy}}ZdZ_cjڎK:Rs;<^灎3f̘k̜9__'NdդMqƱ~z.6m4X4 k(:1n΃kQw*'ʱ/EYE‚m5ÿϤ5T~L`zPt"MtZ{] N͸)Zy2%CɶcNa{.Ȓ,B.)̆+ʈ|z;ήW`[SNLnpSGe,i'Ypޅ~mNd{N!S`͚G;"$@UWWޱc̵kfYFB֮]+֭[-!Y>֭[v#s͚5bڵY;vY]]=[JIvPgZ͉V{!%@xG2äed yfQg`_\vM> rԟ w*8:~Gp ?ws%=[NNJ%u [J<f\:9?|/%YeAb7,X1a#GPk&o|74,!QvV©I3>ՊEJ.U6XU >\d*@eZyHՈmơ N|`[u3%v^Z*?qjs BoqIc-cZ4QZ7eN=-Дyk}15IKKZ [FS?dfl\.hU[|R%x+h6'7g!rM‰Sj)cJqTMdY'}{+-7`b$Q>M#HAoavm{![B:ItfXv-M7gywO%۰@H(-`5kk"ԳYY K-e,:R[FfwwpO}d˽-9^^WڣmwbtrN4l%5yܾEV!_mtT"?=/ ɝ;wʵkZ<̬S \%LMvB4wCioسga`Ν>}nBXrrڑ$ ,f{dg;d|`?OB%$; 'ZKcǏ?iȐ|ұ,j@YJKkqW!ܧ8VGQnch$ȏC;~yb9X6=e/T89sYÙ  6pL'M)6MᤁDzѣGGƍcG֧Հƃ!pNWZV@rn\c(yD@t%fj&B53Κds)]8&.ep^WMWLZZ3T" >9gK<~W9G>9HƓ6*h8^=3Lu69`&ݥ|uĻHLizg+BOFbic}l]5+o}d "5FB:$ƝL{ZU-7qWݞu Íw|cl#9C2 -iyY*UFJvA6ՔM`v^A~(Psss?w{wy' 5ENHpP,RJQ剻38"%%n lpZ_}BHIv H+ (P0+sB a 0b i\A|$DYBƎ;պ'=fa IDATmIHF@ x?؉M{ ?kO܊,I!\*Q9s.˺Y%pX{/C9# 7pBn[n)Ջd EfހE`% FM8OKEt#xη/f EZŷ ;6EcIH=YX䟈%nL!ִ lˑ.kgGt_I\+]`. /1.Qp G,4Tþ!Q_(°9ҝ:MpQwﺎ YGm1cy3,L1d5$VzF|޽xPӊz4%%Ç)E&b|y'=ܽÇ_T oT* >2[H} K2'  >L+3љ| F sim%(>HGZ Xo\xOzaQ25Jl!p0jE^3O:9%w$uӳ9.pibK9n۹?x {O 9 AŻ0a"0vm!)V+~GOl08c7y+`P 2>f.jymqnܙW,H6ZlI1'V`jw[ E7uƬIy""b5oUeķ[e8hTldBߡ&.ydɝ"647>űJ˰ ) BpĶm=[նyuVMB;E}̐G~PsƲ4oU}N EvJ{ wy]gyfmΝ;e #9]yjnnn=77K {w`w$''uvP,{/SNξXfdO].(*g''CLw[ҙk4Dl_W͈+k"*k}.K y+V\rʲ^zIijj²,\i4{+mݺ,˚<8?Hc ,˚sNW]uUߑb>("*++ʕ++'Q\ļMtc)tt)w#լD7J>&5TH<|^ojdv{rsLs:Fs)[I03X⧒!IyR^|qw;ƎzhL!I㐘ݡ kiΞҸfEr.c>|s̴sM^>YSw&/v$@3\ ^{>T)0MN#=\{GmJ|1 p 2 ]\h\s My皦qWa͑1 x,T_'#(NJ^w|fQ|@H ͤ# 5M; |a(%V]ݜufQk9 -UU@Liw]ȘisL?'ұjТ64fkˬlݭ᯳-.[rZr&Xuο2j~O6㘯LFvO7ra+ '):;r)2lAB7~o>.!(Bi?\(msTr䕑e~S~&zPJ5W^dy"~XӃ2/P"ˇ*:)7)WJkk֭+۲e ̝;71I?šQTTıcǸپ}N# -4Fퟢfz yW4߷o8RV;Y#xe-feX<Hmm=~#i۵;)#ɗ 6@4k?1d8nVC,iXI!q}v8Ua[2TN9³']&XyV$b3{6W;V؁/7~\1X5 C::f.2 2|iqL^ rfH?c[(~%ЇN+V`Æ &:TK:̟@N]~TaT$p`?Kc$bq'Ij1 5MQߚg2 V(AQ) %wN5.N YP0ӎ98C)Wx&Ldfe9xl9e(bgۥ(I p0oGc̎d͊ c 7?6(y1ý غ g!NY %PSgo)9RsH%4.lL@h|_+(rU8|8'ϯXʕ+Ӊ 𱖖k }>e3>BdkkX>?/`HAl]J睛=1ηRSFT )!y#tdAiJM7ʗo.|i+u;PNeAjGQ>rwW+?'>ۑKɤXu`GǏݷk 0E,c?*;!=Kn@1A?h$m?cmByY~~&mC7t<  {Qf#; Ƅ`g:]X`Asƽ[ ķ{1q.?KbDE;<TaBNJSqoA@R5E}tHɖoJd9X6GQK}Jϋ7׶(4a+}Kz!;MSpo{kjd؜# NFWVY #jdX)S+"hUҖc0[zvB(DYvBg4#e@Y@| @mR:Y{6V_B*E4dM-3mBBVec1Pն"zB]gu[a+C>n*fJVuE`M%'x`8 ĸ1;ϲ$dyyOwA+5n6 X ])Iѓb#`㧥8~!1!2!ddU>Wj|ee!\v$ܭr-$T'!(X@_MPu@/o?G?wLhqse>9NM-aDwqcII{3 &9\oAMD1L)ᦧPb=rnLǭ<tyҵLt3Ns$j0y M8X!I%%F̓G%R#v|,Fv#Y?!iѻψiĻNݜ'\LSukp.2!1pIDaAhB1< r&Z1d s훖'SoOloϵEpENl(H|H&i!2ct}[O8q2OFWzA :adgg]Vy$ܞLŋT)i%QQ7ZwVx{in RWrd,$vWB@  GLYX}W>feJAx,/"roMS*1+56낌X|ˆ<;bb[Ӱ -5 2GfE{r { ~iDX̱ʧ9jdK<c}4qXBZ[[yhmmMe7iBpN#7hGŹfnTDc8bS2^BBٕ0)K,r1#:YA=ibLs[nv)3 /;7|gdn)ƭ)+i÷7^ DgE'Hۥ>!NrH}G$&Hc>IdO^;3G~@w$]Y_YY_ypДBWrdO4zt6 ix|[1 !' +ZmC.km^q/G$_彲 xڃk7e1 lEZu-}"}l+B}itv(:iB,<$"pODW(Í|5;=DC;}]_#A-3]{:O3p=i_F|AtG)6t'?&פ+g1!hZjkkF$^Lz3J1!l}b'gٹO1zwG8ūI81 }+_µjs,G#wr$:~P]-^z#'=r8S:5?d%.Uğ+ C5ʌd1~9JEg"vjTcy=jFúiMRu Ƃ^&@wwߴ0}lAѩM' B[ʠT]^6_BF:Czv`4Jfu C)Iݬ`@*1_f](8 ziŢvJBv:EC^رp w -Xk }lkE:+ҠnԸ/x!ס;GjH|"+T 1zDyT/u:3_fyx+_pI"B%,<6hXv bB+//Yb5+W,{=D3nRz̙3W\sb>5C8ܮz^ˢ(Ź΁^vMOdo:דHN>$W rtxؔFFפ5Ϧ>XjйF9|;7ؙݭ_{?y?Gτ,e F.Ё烿G\}*[3x<};^) 7޲X+RoFJIUJw2Wiڞ?G.essȸ/sAꦾH7t,,Hrn2 ]}t"}eH@.Қ@;qp$|; * ;C.6?- $DHX9 7]DF$ rې{}zr"/rd77BM m^;%sd\]ЏIKL4;(=8^Vd^K9e~84m쐱 "Gx`;Zov6iͮo[݅9  AÛǛ>uˀ;CB|kՋlqKK|cfЯX|FkK$;b.W(.ߝ'f%MJ?o۶m<@mm9Ο?~+V}xQƀ@,E b绻ٵ-Z\M-wnp#jxLncµǦ{;m2^>ꬁuz#'@lDϙ%->iaȩf P{?v)X8τ/ ]1Òՙ4yb2z̈;WtIWjo|fβx vW^yom۶dY&̋ "4ɗs)pKg n/%)C>ɤ]p xpt.r FXISKBxKW>5Z{㵲 jȰȖZY[o 9'/lSW#hwʖZcl%y(hC"{}VP dWҽm^'>]L eQre@r-ZڱzTž8}_Kf5LHwc,Zl-x񦎆Tn Y=ĴxեK]!p eD)UM IDAT瘦_վoMM+y! ]06Gv/YuM~=W </Nmtk$~l\໖%{l}e}70# qgU**v1±@.b)^<ߣα)M*_8dlvEۿ =c/R?Ȗ$R2FnuA(Jl+x:Yn ] Pd_'_ǎ7~R"Y x|Z%(;DLWӠ}Ps{iLqlG1#DG ||Yn=glkkkȯkn)|ӦM8q`#M8qu!Dl .:[Kl2 ,>NݏtɐI\߀|bH-;d@Aߙ6ϊ C)CCfu\Y4!2cI45WWr-lS)–ilkt/>؈p_AK(Rx8VǯLdD1vϫΊ Ȑ+mK>j^سJGϹPxNh2fmjTTYZg/!{Ey9U%G1/Rx;-ْ%JlV ̙q3KDC%2)u7:Ƈq欒BF#GeY/|+n9sfy'x>p<ݡOs*}4a#aeu1| ][?1e_>|^'vݠkl*Z>f'K"Үmu>P,,JKj}g㍹s~g},ۓ>Z=W*hm\?R긴hI-Gu |GaժU:%#%ծ2X;h/S4'd"lbPұz$ǃXr@}L7b2Fk]64;a1u+w Cɷ~ `6juW:$bLii[T됏Ƴ_0;9|b/O-6lobtY} +:JCxR ;Y&e5!6lic]g6ȰB|_^TinUdzӸaK+QknNx)7)6qju7LNb7no_q~.%B>aW?l I85\*'3!%{ke}n膎KwMk|@-'&ȻpM׏^@c0/oc@JɚZ/k~+w'+v;Xrb1J6޽'|r:޽{LdPQ$qš3VI0ĒsiyJ3Ҷ8"<ܐ~[dY%Vh7:A4#+14*.|U^/߫~u`65VP*1.50}{qzq^.p7I1q Enڸ! З+ lP|xG\7Jq2Xd[?Q[WUoȻp|I )~V#uLMYf6@+)IRJ7PW^)۲e cpEVPT1}˖-ʲef\~J)~!>qO藽yK@&tHsst*K>c 9sr?Ep{n4 : ,s!7]tl'mI |3gzwQ,@qM̺~I"B)%BFG4m"'(D9!$Fp;H)bIaSaS%/Q˛]; M]v+,X0ٳL<IO(w3J 3`dq4lwz;u?$X, ~ߚKHmHޅ8$$[ӴHP=fkAtl NxŢC͏ 7A)1m}W^v%Ҕ}3ӎ}oMӶZ`0TA# ?Ksvɸ } |<_Z1xH$K<qX|=n>.+H$Bgg'0bxҒzFT γݺYZ$"#4Vҽ]w~⽩Bӱ~O3WĀ v:ᑰ;X?&|2y&p!t{ǝ{IVS\nH$l?h)MYzOx#:3@Uss3s=-4O.- ~ɕW^o[JKK'T6jܷ} رkw%Xgw6J ]?8Y F#c" )(M9eVx$}Ne1/:}ZT);02kG|o^:+u/F<+E|=HV7"u$~-WW&_***eY34MC6~XE^^`W(NdUTTկ~P((c0 E9^TTl5 A=uw}wKKWvé_l/kѠH8h!c),zaPӱ?; sn j06aWB0i>ta3 {G;w40xq.evB]~>]u?F\ ߙW但m=_җN˅>sCBC!];cΝ;^zlڴ N{nHT>?g荭]MJK«hò|@؂k8*.0{0UgrMx%n%{s!W@]oʽ@]tkWœ LBL }25˷.2pIQMRͳfͺ;N A,!Li!!Ď,>C~^6 !']k)ǁ cq`6svjfbRڣtE\M; g)mq}:3f }*Kڄ愚 Z[nip(8_M-S6&,&|-z] 5]P氤 X I/;{1nܔo}[g)҉/o~| _@Ʀ=>vٝ|e;Yb&|g27`9Ui+`9on7,A>*~+d^/;}mqp-yX!@}7c)>8(" I) Cc@D\k:#pan]ˆūW=vl ?)-/z_ " T`HlԢ}M &H)ĀGѸ!)~BrxuϠp/o' ;~sĉkl2e$+2} x}6 Z#bG@Bߗ &)"c3~7ږ)qsG[~ J6lx)2Q ƍ^8ǏGPKyMKŮHȄQB6Hn.a$@ =ݳgŋs}q3k,<τvhjj ek6]KcО={z뭔pUW PUU$ qQǶmxEv_\ֺ|Oo9c\ Ls~#s:}]WW?oNvrbKVagjGOՊwQKB}K]؁ K@2@Pcv~ŀ91 2؅FDb[>EI( qlɩL0!2zbg *nMs(άNF|L,ަN&A v+709nH:pJg M@ ,v3PC4ߵϝcbzdG4#ͪ&dAU bԪ2 3  #"Id{bi < 2 ޓ$z~:ULՅWWWWW 9gn 'vS8}?Ȓȗ@1vG:|dAd07HHd}A}vЁ+"!5qg{˱Sv&BuGb 2 Nv6;7$ܔ"+K"+w$]Z"/joKSd}e$ 5cWY_߷)LU$;qs|oMSO=|`Eq]wqyNFٿ?ݻ+i3M|\rɄʳcǎT f 2xa)v0gۏa'=2`%vsJ .4a#v= e Hcag-Hg,BI jR=,.gH0IB!s&0;'EٹfEWFWDW*rSOdɒ)W^/K,ᩧbѢEleALî 3 9^qHxEz7|deee|;ߡh4rB_hzx JKKnȝ7/öf< |lƌwO?oMGG:[7wy'*1좱St+vOUm-&U^a췭ڬ1_Yd}5MA}]vnqSWȗXsz]c췭IFWKW|'bK[5M0߻#[4y懒Dn4Ũdy4 XVXGͽ몢6LJjE!R +WL I) dzUU͛8gݻw8),,5F&, ْ{W)))aٔ%*vOp : tRnvLd<#޽{1vm{LDW^ HXA Ⱦ]c*L+ {'] BIb39?xcVS6(_O$_٪3GA%w "5x2G V'WDd}. 0>[0=x|n4ٍ*J#\kz}+uZDz#ȉ[V%m9BEQ;'R !DB)Ʈzi@b_h*$hb-/ cdaZS"`Y{nʂLyI?ΝKUU>v"I>ˢEPƔF/QWW;É'& PGOC=)4`OO+,ej`3'W3`=!C2xc)p}ii)=ܤ(//g˖-,Y]vrZ ?,o>@UUnfVZSO=Ž+"@_}qp3ttr DY_ئooJ~䅙VhyCE{EH 0^$ĈcVyjW91&B>Y_շ5|V8!dP Px>.ĉY$_c2Q0"+|kZNpuuJ`!(jzsBǿRla= ! _UCq5G6^4٠yZ1m@,5hgy^nՋD|cǎ]veY34MCP((c0 E)--}KJ ![seꫯipgy/ EQJ꼮. ?>$Oy~FЇ>4C<$x~"] vZ***g" IDAT ֮]WmcW}l޼9MEVX7H}}Rwq%$Ahs9AcFq;}pߎopފ녠Z-p/ Dբ+95[=ZY+cx&F, ^lyyX9JǎЁҼ6[ףDsKZ'u?;O0Ud ٤FnA/3ew8DvwPcvws}G7և#+soMSXd9K![l1M.BQg\RX ᐂidRljD",_~}ٵgo('԰S__ܹsƠ7b(ݤ.Y^x ;w\_;rOϔlP慨eX;.2萌@>ѷ)Y_;F PFs_xw{@;Z Ѫ02Әc2#M  0n1,px"۝-;cEjJ\3#lJ枥f^/Hı55rJ4eI+ψpGeWn7@cǎ%/zi/fPlT:`B!^u?EZv6g "8s׳2†UD>zlKv :ϭegs]aFi)ӋBIބC;pLsLvB!j$Xʿ˽l{fL%fYpطlݺӧOlݺ˗S__3}/~eYoy>d 48 v/D@m{ gU"+[UnM -#ʴe=h=9\ߛ ojs,.!3h:u%^vq|M!ÊjNo.n,0V$_OI8\\]]n4Ub9XUn5Ȑ(1۔{, )ſ/oRݕd5U&:S)͊ 4%ެ(f\M*BT c ׹>86D'{(|k{ꪲ￟V9ƥ+N̙3ţ>_/,,|IO c:wߥ.-!99sY|9QXX8)aEw &avO޿x >TZ}f_:)BLK%/cw}zU%AeBmM9CƼYb7;8 pB\ܑs=7)#ӧi&."D>l~r/+V:K`4XQl_v83i "/^pG)3O1OxwiVp'Ku[*\%Cn d;4"U -]U_DȨP U\U+zCpp:c\]R (=I+Ӭ%Î|wU?|9"В#{MUMhBBjw9?mT8;}k>>|jQ?mf[Zh?:7Pf%"9]bF f]9[2[gj\)ɭPx9IE hBZi4,ifu>Ur"E2z-ց&)如s^z% ˲Z\].Wqtܮ(R\R~?lBuRz~arvb%"ƻhs{\gWW*@^iɡ6>uQ-zPfW@+D9E32B ]^OzC/B p^˃ERŲ, L Q gk81/J_ዄBuuKJY&uݶmf444X6/"K.'|ŋ|Nv}/k׮ /? @Bɪ*GeŊgΜc1 eO0o8&X>/.45[4?~)[&0fb0'X>R34|ۧ81l⮖Ԍ[w|P!| H8opYË:2;{sf6d&;jUjQԫji/Uk϶z[+vQ{UZZzzqe' dJ9s&BL629<?~M6.0E|_Lڈ略6zg+ 1؋^/ 1bFVetvr` zLo΂ ؽ{7\kݥ]fN;M!œ{8~r-⤷QL>2mb[mr;ES+&7lEnmz EI:kjv ˠNB1J#>,~aY "e$w?fgȰ-G_@{e~ p)p╟UElks'L@P[jj IsdLԱ~\)vٯ̚9ЫO+Qbcy[G}M$T٘O6 ~U~iGeݺuTv~Í@1fX8[nF`݃bf㞨Hdx⣙bEg}]EpJR"rW/,D"RdR9l7~Vfcf h8 N]$N |c{Ln2qᴳQW?A@3N5eN4Z$F]z!AB>BǙ\Uj?`w\׈#EJVhRb(:&pƉd<Dr-ƄOΉ$-??|? 21c?0>ہ} cEG-9WT`Zec=Fiih:壝p!| #+֋Jti6ƂIaFH#&嶇V(|:fBRJySz̎'S9'LCk|&1N6 ?s~mkf;k> -DJ)ˤ{-RfF)ghP2TGaA*|.~; >< ]ʗ`K)U;ZВݭFˣJ,\Pu,?+P?r( Gh=2^؃43C;"1"v i* Pp]75Ni'50}Rn&9O!!+!e Px 4Mc͚5iM^q MӾf= sљj)fN,{(Xۃ$-x{rN:.3;] WyŽ뀅%eYS%/Ő˾u5[@K$s&>]uU#ܴl\y<6̺ OC|`NUb7?ϴ2`8N6F@@rӅҍ  OJ4NlX^%:' ۦ^z++I#Y8=.B-h},͸ ̿xzD!ڎf&T#vݯzB; OZgaxO*َ%D~fa' pzM8aW=~^/_3[4(~tTcLO>[INsahٍyC%AHN$ l᦬dIW Lŕ$_ -H"҄gx>erFmVv©TUZB(JvPlɨv**l@j :EFĝ!;Mv [plUBgR<Hl2իW^u;6jnK/jժ_oRzA2|˖-р(B;pՁ&nٲeXabd7IgV<. (DHta[@-g:&xe]Ojn,#/8+$o-m栤|BmF&WY|BuBc̐Þ@Qv"ZVz 2B8Sj6#KK^6ΔJHզ# ;C"9%lۖO qs#>|Rkݼy^{ya# d2@<|k97ok\lQCs#0 w7о)̑Wu+*l[#0J i!Bz9S<J5R5kVco͏B|Wվ) . t5logRR0h,#XGj+&b| I,ڂBQ|A] W[LoBm)LSK7^d,9[qkHޖNhBjfݑu,/Jk |FD"ٮdZqyFdŭ ek ??PY߷ܞ-_b;VIqțW 6!)#BSwb*f #rn9tnDqL8~a'WqĽ|O_8! =8.Mb(6"u) : ICCZGEy$$[L:yu1lF l߾Cxs\x^ ~1_/5*~lH;$woSfHӠK ~1fo%J<dŲ)$c` ',N&$>v՛7oku~WFNEO0CP?mB Ðeee^S.qW}(|5`sN3g^cJZH 7|&N磾>ﲭIQXXHKK o^/ao>8p7FzaGU0} VHAӿNtswC||[]?gï#HRR=NNؑ $0 $;,^$9Ꟁi)Fٴ H5S.0>wy"Y)2 DHx9O6a3%;$@VEZ$qv#Y-a%E%S $/ԗAfaA]l ݃^F$~(N.(xJ_۝(拴HJ V +njN%]ի_8 0?pA^> -4chyJC?f‚Zt-|'zd"-5-jf-%GlMن!/-Fu|PS-T2 B0 "A#KsM nJKZ%9=`k `Bц"Z@:0TG#[iBZ|ȼ ,S4-5H@ Jx _-ͪ>g5(^E.r-N酟!'Ak Ύb*>ڂk z*ЄR6CwydOMqƪ/oL@h[a[E\Mڴ^m/l33p*3 S)jn$EM2$D2F@a#9=M6@k}0 #f(-"#&vjOS½[QO|TUUE=0 C 3CI((,,T.Pqq=^ziPQ%z3i"Ĉ5MBK5e3Ŭi7CFu`tδ;$Yi=x.6hvG\G7RɊPN4b_S ?53m*A%IZ^4o8]֩qKJᦀ}ZSXSOƕ4\R;<U-M^4A81l~hf}߮4F)&iYI8dEHr=.w084RЂvLR]qn?昋bS0 EQA(աk5Ae=B?.Bƾ5~ޠ|Ҹ?55.UV/hULHa$r*OYb)O>-[D̍# w8*ӧO" vLK|nss{ X33\=UeL7 $ee^MlTVoWLx )`y>Wiz@[3a^Gyc |;س=n )29rwv8qpG#qd^+,q?] ":J*^Ca3֥ 5ZB_N 'jZQT OdO%Խ$#KuL]xӻiN]GjF =j4 w [$|5x ҷtScUdxD!uTU8zYEWsZ7fKH3= i"L@U@YSH Z%\4,p8]یX1 +}>!PRR?N\燺$R>Dgq k;~a3y:)OMr:~~9n4>.ɐjy֗w\nRlTmTTu#PfzA@ȶu2tଋSotiV,aqZx֗=K[34P?hBa50%GIT[¥5 v-vKV[zWnM* 獀#oc>@;V R [! XJ[vH٤ [qYj(U.T8W 1z=C1 W|IHBeH0PdQ|Ds V"D"_[3zվ;S[Gt^VZ[B !ځ5yyyVZ{IMM>Z.i$I4IMMsjOիW;X-bڴi`f/NvL6m-p~ͯ'O0 Ɗ8,L ~yLo6{_*%BwdVu8p. H"Cҧ i!Z#x"ςQp F  =m?NxLjؼys[qdl:OaF xl{`TSt44E : 0ŋuIX1:jPIl5;wȪM#;þ l=7ڷM6v6{Bߗ#h`\ϧG6}gڡ_Ѿ,*]EEHQ϶%^r\~W2fdyqY xO {'x)Ω9)|8[s- ܱ?#2[U)C0~Aex*$+uW[Q^]]} /u]7oܸ1=w1cfaz8%ֲa`0m Gj:iT !Pgخ!eBĐ$ѵVv\7b.@k f`?4W5(Zf՜n/.+Fk۪:8IF;7"#f`!HR<_6dWx;j՟K@EEaʋku,7(>9 0mՎQ=.]@F _)z%ˀͭWx;ï"$a+E$/RJ wRp2kzUT*RIj 6)%1<'t7dr[W4j~MA@6%ͩ` +lRQ=ah&"QD{ȠGOBZx|'Nĉ׼曾W_}|+>!ؔxO#"q) &ntNqq} yWE[x5;`@p 7c MӾYOpè41?S1fq-tD/o'O)3ȵӬfv_^b r7bERO\IH)qxudc$H$RJ itg)1>#sXV&v/eI*8>G<'^Tmhw EJG2'؅E ⲇDJdNW.vw5zX )#pM[K٢+QWoG7P('~m!GQQ?8[la߾}|G߿4zL>3f0sL-Z41>pZK| Ik!sj`(zX{Rx^/O%A7ňC4@*"ƴ|)@hw/qK.a֬YC]~}'qW8{)O6"PD.H^3gnUb=}oE8BfB[z ͉H3X\%A o6>J)9U.]%e uY)=mcPW6(}]Z,~a 'Tn>JTrzk\xttW)a{e`އ+csG}ms D_K cL,W-1f})@ bi)"!D2e$V8f)R, .d-]"2GD e;FPoNY}?FA &\uoVZEyyyl|&&m No իWxbFF`4NfcCR`n< B= cCy~`,7ۘv^eY_Hn({(,,#SpVI{Pin ӸҖ?b;ϰ=aA!CݑrAg(t P(Kw?,[-[=$\jkkӋ{& ˀB\%|sJ 713d4513 G1cmgK1`Ree%SLTs.]_Wrssʣ+Rs}Ӏ AdvSBѩ̚%]J3j#h]QKH T什KndOZ:!rn6!^+Jof:\Q1?Gu4^BY1J,†=inuB Wo[S:VvM+\1!X[P7b(I8<]߯4.+"YJRl% >^{,閝Ц'I-s +Pp K=>_y-Z4;1MW^͒%K5gqD|8NV~֫䭷bԩ̛7Oտپ};bŌ?o0rzA~?GRz~eG1^Ѧo6 fe1Z<@"kw"؆`+ xsp)Q~ W=!ϊ /Fc/b,1m۶]t7nd*ݳggZ}{@[^\s,8+\pggG8M\GS<|y'bG`m 3~ߐ(,,$''{ͩZbcbߘ^n3 `7nLuG3Y6&b0 ɍGn \Aۘ6!%GcOg?r; ŇaN!ZZZy#<2!sFLJVus3`C@v5jz@{#7nd͚5Dœv];1=>g_ [ IDATgxv_ xڽ< MGLFK0#%im 67mKIɇ~H]]pp8L]]|O<7tǏ|^} G,b&ȳ!`3oh\ӊ}՟beŖ,W2dhZQtغV۱SؒWĕ$0Fz\vyfX 0 nVv 7\u@oo'Tcq{'dcn]3,1=4P,kpa3{ .o.ޏ(^a-'g?4~ $0*ȲQYJct,.7T$^F)~ $ @qG6f*?c,&՟vZYk[)ayfѓ?Vm=3E̔g59ju_Ĝ+9q<,s'}f!/< z /<򈤳_rlt $pFc|x!kgGڋӡhP/{(<񯏒4Q'€R5ŬNSpfjbB$H $0(a(Rof{9vEuu5R~jvņ R1,V՛A' SO=E}}}lcݺu\ 4+y/KMMeZ&6=m}@g*;V̺!@ZBOZ&N?5)e\[{{Xx<L.﮸rsso;r䈖,o>faAЗ/_Rʸ}^MV]q5''';}QΉX $//XQ}bz;Fe1uet/l6;I M}׾5k bPyiG~ܹq"]3VmzjGs7999 ܠ߰a5݈qmTHO2 x# R(wj5=XrMB$|cؑ7nu֭[e]] 2Z'|R|ͱKLĥ0`z!+Bkii6E[tiԨ"Zmm 555QǻM~e鵵f]vY'$d( @gy ,UUUrPYY)Ν8ϫ0O7zM 21_T1ϗ=4k&7l ͛`Xt%.mΜ9Z[[۰---ڜ9s}l|mtG,pX J1jaٱH x|#7͕rQQQ!q8@YHlOx2))IWirڵ2)))zM&GDg&7mDRRҰIII^ 55U7ѷX~_5tfBg@ "gVÆ}_qsgVƏ?=~x38l sZGy/˔[˔%.8 3m4>Co(ʀ97M{=o%D9@O:➅{'Y`q x' HEQ(r'4-n:0(E5dB#2kkkk23354mYc@Lez'aߵ ȯSSS x c^" @q}D@ ! XO`+)>ɣ0M[@ɚ!SSS#~x h7|1o馨q #YXz 2 իWwx`P yur:wT>ScTJ#!4ŷL5VbHJJ{r>wnMd1О{Qcoذ!j?;ȋSO zbG`a |ꩧ Cc&@1EH_FÉH1.@wsM@LIN` ?s8򗿌r /`*ԩSG )+N 21`P K|Ǫ^~_5EY-謼mU@#IX/{vz2fhkǠ1&D1`ʼnps^Qjʆ^#>Oa}L}PBnޝ}E!0S2/>-1{{a|>*|>64M#??u>P3 QJa&]j*ׁBPH`HS_q 72֛0o޼xP0H4{i=,_13@|Xt5ckhh;8 Q`3+ hRGc5ß@Uv`ٸ+lqN/l R^ @uz!1c f6M9s ]oݺub…… u։Z {`&e> c[$2RZ_p4Vw-]d1sa$12 # rKb n_yX x#P\\1w̘0̰ 0k<)AK_IB|{S>>;w`~br,!O>WX"I ZNN(P` b09Uj\)3,Ɔ3$:4vDk2#62?lL3f̞={̚5c6Ϗ !~)嗀ZK_}FbPinO.UU/BGڲ7JUU̙3e܎v~=]އ4_wǬpeӀO{nWz5ynݷLُQqGi믑DfS߯ρ˳qj}O;Riyǡ:~= o= G[]]][ݠ/F)C1V7ǖǙtfS = a'z㧪ގwaVW"+h(1.1k\4&QMb~qC4ɛcQ@PD[EPAf}aNLOw.)΁z"syfJz%@:xlOGoy}=}MyaY-ߟo7Ar5| m9O<_܃km6m߾ݳqY @wcžFxUƘ>Ҩ@Qk/q1!.pV >@c)](CeCXGPpK*«4ƃ]d}7Pw&xнIglLDnx~ F]/4͵NL|Q(18lbŦr\z?Υe(7o6m1 +{e| |ao~(//a˝wޙ:k6l(++a˃>ؐƀĠ|ql㍽lFi[ 4D٩cuߋo]x= Xc\&Wpٶ!^)J1h"M-%k1[kۊS4l>_%΄}L{衇L \_WD/l\^:m#CЕfB?x X)cb`z4}wzt l7@ڲ]sYYݧAr7svn|hf@OA>_/?9]x<&ύjh/1ƔpM BM -ÑF$K_dD|2ryn3[ @=b?26sJI1 7ТxOt*KKE<կ( P3T|6:}Ypf|י:X O|xT/jncSXn]F?뮻 qغu+[neܸqMK&l,ٞ\>g&DX(/(F9 ēܟtwG9$ӀR3{4SvK77%r/ƻnZ~W',x .}>v$3ORw_6Ɣt;@3z2=_ AE% nnkjjvDd-ߡ (L>x.!Ff$hk9f_>w7[*Zcc}w[cL@ӺbĚqX3ص;Or _,.w`9[___2{ k[kWZk묵Xkj=Z[^3f̈q?}tϸVd>]uw c`>ٞ\!;KS[͓(o|:FC)f'|c<Rh1S^uUTyc\}wl%j{]e˖= 7oѣG=P$=DΝUUUi{2G#RUUܹ]ؓ,= ._(ѤH[1ZM<ƻjr|nC16?(.刯,g}lUUUSUUegL&>o n3]ˊ3fLFð?C36nj^H˧DIB.ćoḋ~]sx^{>2N R(g1=p٣afWZZva^yff+WA@m.]>Ȍ;w|` ӳ2YOh*kE'؅  .K3C ߴiS 623+W1}ITWWܠN3'P؈)M^ߜ.߬$:l>} n,_ 9Ki۶TE (_1>qCvҤI.lWwym׮#|],Zp!s7o.X!6mرcYp!+|_XfMl*7g?UUUqk֬T?'e`ű?_Y>GPi.JWUUq)g}Fp -l( ܳuV{饗2tP{1R>~]]ӦMK_?OXl<%|xB>{>{ބρe?ñ~}Jg 8qbl< 'N;E9I_:C†b$J!"zedɒ?qgϞ59c6J7)hQ\psεնj;g{ ._o#񈎽qs+wҥnKvM6tM;vc~>EF{2>һwoORpH`z&ٱRv 8O1w )i@cǎŋG.>/^رWqSpuV]:(9 p>g$!;EH)؟QIj7gH},AgO@-P߳g /~ڴi ,_jUچUϟ_?mڴ /K3>}?CUUUUUU<_|h Lܹsb̘1ɓ''-Z/ҊhhhH|E%&O3f?:|1!'NL,Z1! E%&NPv~jz07a6Zjpr~(0;vSTj\+*@Zs`8xXѾ\4E3r(eec%M ʽ'QUUY%t9MC9B z9tؕh`wmGa{葲ѣ1bu"B%[*@|V(JIǏ̞=M6;>|xM[ٹѺQEɞ2EQ]v `?md_JSE`)QXJnC1_rLAEQT((J8W[W!4 (JTh(saԩ,^kצ=zp0vشgmXd5t\ғ0Pn4.1(NU(RXT~һ\)@VQEI( )oc.u+cNzBEXKR󕲭(QE)73[`5iJ0x䓽.(Exk (Joh "@ =Ɯ^"4LSJQzk;Z^@Oìo[k?^kTI#9aET=ZmG/dR } EQmdwss^^ Xk+*̫J 8st-eUC${M, IDATT`p! M %'<PxA-x|һIbk|jZ[㲗K?Mr " T3}~EO z'Q%=>Z.`1fB5/.Fc>(1ؖeyCp]l>rF\Zkl83^.yLI&1lXQdÇuٳ#sK/m&fPvk ~e~ p04 =@ E'@L.1&zJQJτ.bߪJE|H=ZkmGkkAڶ0emeC*>ql d1`vd \)S*2G#2uԢΦN;.lRJ+} |;[}ߩPE9`~DHxB ^p.~7ԙ7d71.c>C%fǑ<=ۥ{c2Ƭ-ڻkx❾;wb: 礔$,nI(~0'o9fA ;4.M ,w:LiDcvR=0 88ZO 7dE1f1'~@"dc׭@xl.g1fUߕ2ڵ;kD"QTRO)6Np/πsI_+rӵEQ /@Y$$dX TODHo# }oܲ"K1z޳svkkd9NHc.2,GQ  p*04sD}ބ'U9V[9~ŐZvz }2%HM á 4Zk "BH70=1fC\+\b.:K Ksbf=Нk}XcKmpCN}_&p'[?d|jqݾc=L BMƘ9vOɳƘy(J$k[_qpñNoGQhq`L;| ϧFֱzIEQe3$-Ҍ8.2#ˬ)'p0\EKAH"<GTW oЁ>q ,țl nlсMv萷$WcMD8xn࿾G!4tx*^ Dȹy~L/ׄgN4՘/,ZbӺQTDH X*F^Vr|*%tx󾟍i 3KQTH0F" kW3)1g{^yS\DAGbGe^Ik7pK\oAzG tporո!m8׬(1w BX+Ι]̇_lizw}WhIЋ]мG$5 ,lG "+ڮq̈́e5-jq-[x xڛKBmS8~Z4nѸz-c̒,FX7Ne'ʀ% k粳$`vpdRpZ!mX0K+.O}-p=0?]*ocY%A p)$18lry^2Ɯ/cNc)~`"ɢe0ѣGQ|e9[odpO| ,./q[c+ǜկ(R@b=88rvd ^pp /Z9F܅GkmRf6p1Xc.1 c̱а@RpU+++w;AI)Ip/UI?d]$~K2ɷnS)=L K~ii˧(Q OG3"JBI|cBc"cL<I]%c= (}PÍ1/Dvre8\Ac9b-0uƎ[TE? ;v,:ZH։s.07d8/g۴:EQ7Fx}[W6OI~\^.e49.2e{E cMV {"s8->[yYg(JP!Xo^<AzKUƘ10+ej܊:EPoJYt\'~*?^Q%st(q1xlF+R\28YQEͽ(d9spGR7|Ç /y@E)jt(-{{PE7:KQJ;bR= t;7[zYc1ZN@Q%;P1 ˠAH$$ 멫`!mTC FK w|.ǁ,EQV֎)י1tS GO>iիCmCm۶QQQPmhhpUZnݺFcLrК KQEHJc|V"km c괆 **tR4L ++dt.EQhA~!!J:r Y(J)p:᳠#6( ŇVYkNaXi6mdSEQңB4#>"Dc53Ӏ~vn֎3Ƭ VQYlamή6{ i_m(J)YH /B⵶.棭?.hHbdhlkmkm[IݬZkv7E-KcelLYե(%IC|EzB| T6]8`^ݷ;Ƙe< !6аS5VqH$Z9Xt|IGq6nEQs"dgp>tȋ7WZIB 5 >:Wg`*ɡѤ6"?q=Y~^AEHL7/OۀI>cLj1/eC䜮0=7iY2ε WĆ_RR`u 1ww!"d z ؏i-z>{5!cp0!D oɗ!sUVo>5l1f n؁.lmx@Q`v1fmxW:ogmL9=ׯp "DB q;#8x!߀ pTREQ )@x$Kc^LDcO=!{W<2< ]ID!]FȰ~Z{".{Rkm1F`8_'tH!ǁC}Z{7{\[fyNOlzgw! J 'C4LLI.Kӥ_I`kdAќxK"p&;HQ%$7h_Cx{l%1q.}b$$_CSM3_FH_v1\!X~/M"PR g874X7<ApD>o < \rm fU=b@!cA=Gcy5sl4e4Q74~3]_}ޔg  dD?gR*牐x3dAqXji^6x/=-yDZ1L 筵79+oS]Uz`=.D 8W3q(͋a>ix(++SHR(0ZqYڇlS'BFD>n״l#(MDPZC`D1 .>bb|۬ p+|d`ڊ^Aq-p ]'5zIkq&k3/Zk{L wB,]*@TČD?}c!(y IDcB6[Y @\0\Y=pðsĐ^`mv .TS1 PCs'$8Rc~#"!|(cJ~="ZH3"$Z#h2t#n0^:R%.|Gˀ7HP(DHyXŇPE)Phg7<O.d2kp\e,PQ|}DHd#ɻs*ӿT%W`R$M⣩f1ہeqħLH?=@p:mtEQB $"DGukp@'ua*J2QtS!ːaeU/n[py:n( AGZ1ɇ}CI/76깮Z\l۶1Lw}Y/f](n*Pвvi!6ly9m6^gв,/rn;"fm(9ZRel(KȺbiG $w(O$GR0/.yϊ((DmTXŠ@ZCQ%ޔi((Yg}Y/_^EQx!EQl)EQ%DQEɆoムdnR&E)1:k(+Jip'pYLr R B~F^G\~И"W7T8 x[C)vqV1 C~rXx16m k[4 oOk _%\Y,D"I{XdRV*ADZ- EQ" ݺu,۷/;Hyy9ַ7o^XRT>#TT5MkEE˗/SNĤ:q Qr{SWR!SD(T120XZ]vmV/T̩!>UW 0XA]hʀ*)yj8E~sɔ}끆sg| x8xA[,E`5Һ|r(-Ra,$}|v(iIx)/*^5e0xwCs`h0Yw|;Os .!.\|O:☎o<1Zk;`1f{/Pkm+ d1f^Vx`\8##JMWMleЗCk|YѸXg ǁNR./ &4460:0)<7λ14m+ LՖKiDS3`8F?`0#wcT"rI ZWw[p! '.CѤ! #CZ'څέ IDATm:0:bo9DndDm ;" lgY- >E|LΕЦTDCJO!Xu >#7.6cʁJˁ-׳~B3|)Br.>Wcn a8oR}q/GRﰺNYgX}*> 7,!cw3 3]q.L!QeRH v0<"%~q~շ+ޙe96a~,S"?5};\xc$o=oi06fd,'h"碝 t1V4lk5WG|쿕DH1 )ZI#?">< >ɷ UyqH9ݸ5Àp81e;rYCåNw.\D dJ|Q I:`v&pO቏|*eI9K=bmpYzl>*aQHDHixUa׶\5_@ +qi|\*szMX5Spn>M>7 E(󜈮weYBCoݘ:$3Yʽ\B{ʢEH˂@>֎!Ǟ<WGlE@iHų<0E_'5{!0  bpe~wC<17SN+HzMgk䝶O49[rCKI!<=|"n(*@R4TV[kܴcq̳2ƬDG?\D|TIo4cL=έ|0'w,}|Ǫ)Һ(Vε V]}:!5-)yh>g3P\%sH96\du% J5y@¸^l.GRZf1f縞[qÉn'dUx>y>3d6;KWZ}i'd`ϋݙe+rQ0AJH+ʂF˙ö̡ r,aKa`O`.~d2KURޞ:;o.9FΡ2pn-lBaؘˀ&z)M #mr: tFY/F+bwPA{m/\\k3Tb|1 Sdr875el||jٚ͋KSX6ɒZ?HRe"* ID#q!Q  B/]JYAP= 4b^XzznSҶ J3Oh r5W)eo~4XIw_/$_NY 8UlrOj*JIK[kV-^ n,i0SEB.bpwM4|b9B1Rōo >N>f̫ڃqpiZ_zlk\oa@&\-1AmsT.۫W/x4СCԓN:s熝G PJmycNǎwn: PLfu\IE72\7zkCߋs9iOl¤mQ +[~ 0ky$=iHY 2 7ಙc瘍3ĘOAjz >ᔳ޽{`5M1N89s愝G PtR)®Mmݠtc@tx{pqGKyidq=W9ރ9%[zI<1TK~2s:Y`SQ_z4;(EIix\aKZ z3?$`NOr|"/N8G<֟mƘt'YZKϠ'/>rN!{c~j"F[>1>/p0wz=6q8?7rn'qR?RmV!@1(i7Z|9F`U2۸{129$w*UyxBoI\DDH^GPR<ťz+@K {0М/ (asnXMMuc>Di$ /.۸N륧Icj&s7bD? 8Ykgz(rCmy>JB=D9NG9f1WwE wT΄^][ 3 -񶼣ka쌍Z9}פМLcVIEHа቏& @Oj7γ=Tz3:1+ |YY?ׯq)(i#"ćG$QRD4K/t݀sqoS׊1}ЧMrNh+p "0b1ɵO>#.~s}W%ޣ( O~ A_m)=1XkgFvŎ,hNe:Bf-b'R0I|*@G^0&hs!"B&Muϭ np4$]:_ƍ8H Nx5d?%yKQmjD̓$ϴ(/@|gcG}*3Nsu[)J#BTiR~ƠnQ^.oyV8u;&yDM oLfD >SO7'瞏ថs ')DHGc@DR]Gn`܌xob jpN?;ߑe50Q !|""lF3W\Y}x/ukspUrܸܸryayBLSEHDHG*@) jw ~9ndyt+s@}wZ3"n.ps&󡈣m"@pb r^n!!EQJgp=3-"'\],R\.K.瓐:r`{[t~of9֗E5ppnOmU p y*%pUbpQY!*>r%Cual.wh3|:]ia@<\ !S.%ro%'{q_G+J ֚Tֵr(y1K6B$&}Q3|dQm۶Y8mM5yhoruc^^tg1["8}e.Kcq_ĝ rDM).PriK \(ioz^oͫ1mn(VsR?U3Olb nո@lyTs>Jܩ*P%Wlٲkkk&1iD@5ERZ` pwSW\ $~(H"a$P=(-++wޑe9⦆ƌ@v}/K/w\|7蓀7ZEQ j3|ѥmr-w_o;"ۣPZrEQ%hBE)D.@{oOx%t*P=D+B:cjM(J?LGBk[w( EI*B2nVV5DO0Hzo_:ߔ&C%(EJyyy·4vif]vifSVA$u> 7þZyg_Yz+JnQC-yxͼy̪Ur~qa١Cڑ#GrQGeԳU]]֓O>nΝO]]]_k- 444}Ks}nӦ?Go|k޽%+)+ Mh5ݯ~+'.䒆t~1DS}j+Sq3YQر_x eee˅^ذ~- 믿?ዉD$Lvl=Z{v?km*_jhh8Cֶ ][kA!ڎz7gwh+ =.Muޅy@ok(J| H=J4={3fLي+dȑۗ={ҵkA&߳2cذa+W_|Zvm7M0|fg kɒ%piI^Mծs+/_k׮y l3Ƭ l7-Ӳy`k@𳲲e~.'u m} H9nC@'q7zEH/6@Z |lѩ}#?ٰaC )_bC _:;~o3<… mXpak׮ʺo߾5ջ տ'`.>+++Ƙd `p&.kK cLl+uǸ ~nyW;Z^]Kʼr!Fw~ WH]_|['g+ Nm4<刺< Gk:\Bݛۤ(4& *?OcVm]y_}e\ve5&h+//g]wc[+Z^{``ƍt}߆00hjժ{ny9Sc޸وnx}zc}KAyWW^3[1gL15YO= 3pt{8`(7iζ䵓v|i Isb;:^R+?AEɐKa[ `lY7A鷭H^|EFD|oߞ+{z ;}7%Y@| Ǽ`ĉ`xY*k>8OP lbpRDJ_VYʺSal,q(g2~|m*Mx=?y+-08E oQq+wH\EPW6(N C>D5gd*=%7iY\IG/)`M61!oѣǎugz.;>tA̘1~|z25w_;#cBF\ށ׭+1ۥꀕ'r8tck# #c̖4Î^t~_d SuCYu`P)Gcy ){,Rq,+}cpp9^d "Ky;G ?9.r^ÀxRf;KSsn !4>Cq`1fu厲ޜ-o_xzvۭ|ժU\y;< ;:uJ.]ȎƄ\?~bŊ&:޶m[?y!-yXھ}U[n^I}u|g=nN7(dE߉를〣pcAQƘim^/{¬!XG9\oP vf\(λ3GPHȳ; 8xCW"=mp8AO1[ 3pݻI5 }4{˶Xkg[zXI#)Iu'M2ح[76nHv풊Jk/tӓe]%`ly=#|^ʒ=ZNc9e"/,̨FYfY#C"Xť$`+( ٠GaU\r~g> 7teOhnCr=.}HY6IV GwݺuMDWoE{L~C-5)ǰ#{^_u&Ҫ'.'k}I<_TzzcqL(;e4 $?S 4e IV@thDT}H6_sM:ܼ qHj1P Q4ݪc x[ڝn"~%-k+.t\F}/Ki}*nΝ\q0n܇E(d{3A?H]G iKkv^8 ndzzSZ*c/ߺ?|8F6z7H-b83|oEIo49  ڵc}U 7Lχ)+%vz)˳xx˔!y" Ib9VRޝD$N>nYk"ԉ?Lo&&1-y rKG%p=c7rw\Wz?Q9=sN-{zHϗInqC9N7ݩYw}p#Ȱ"dt d84cvkmoi=1q"xB>yVf\Ө灩1l=vgL۶mwZ7`***@gY?Eӹ< 16^{y>.^4MGY'k<@dofkMƘe[qĵ?bCq]J C^&H!1{<)^LT.fD5"ҥL\r{ڂqk?/˚)ߔ:v |KI>;Y{sIDdxm$z1:je]^ +km[%P#IDATӥJc13C< c:kLyz\?Y*/+Pzz(l$Sߒ$FPNҥKc>v]:Z7ͨ0$FJy!pCGjzzڗXM]ÅҎx18 p@e>cٵ%Zl\/|d/ <_a3 |Fu:7e 3]i7$3bs<ϔ(c9EL 5_y,S Mְ_`|) :\L{31jG(J(pޏi[KL^ӳgO}Zs'0=ay,> zy g1fE@DeZ'{_PM n/ 14?*^'%8ć`uYe+xX\j-R'TSpÔs7=K2R>ِ8IWC~ لOC-=p/ɳ9eQ^m|1{wC K^g?'C7:Ly(%ghtFjI(LN)PFn ,;ٻ7w_}fdn<>xSU;!0f1 @.ZNs^/L mF ~rY;ij| d@UT(f - 3ȵQ_\-49 GܸA rHɝ|?Ҳ0A1l-gObezQB2`e %5 Ye?Š؅y:ȵp; Ү3:(VkX_o#NAjn6Ѓpޕ(mq> ~;LY):$3I 0B!B鰅,TIRc @nM~lFR B u9t،{A~+@$֟ޣAZuU3]+2* Tgg w\=wf8YJ04\AVZB8X#+ I<+(d=9~{XJhJ4N!clqHxSYᦨ)O=!ĕXx IƶX fYo$arTPp|AYo$[ b`G!J@yoe%QKs*(@&kOA9$ba밇Uck VA{f$ڎy!ct{ox]~UU7U%(x7 Ȏ(zXv+ -n{ ~xKm;}1^>>~6'bٮ6dgee#(@>MIJ骐Ĥ3V & 08F3aTY !IS.dQ}Q?w[Rˡx|Me %!2 r3)emz䗽cd`Dv+'g\y @.2F[o5A6>u/>YJ#d=h7&*HV*r<߶ H hR\F55e2~Q_4NA)'b-F-1`k'͂U $^HE!2 jfd,04M;bVpVrs0b .4M;:4FA_ kpbݯA b8;QZ nUmcB3IO&!*/@@{) Č7tUx2d^<2%JYS;^[>p{3RG*}g-4M+B`Tp`.䓿tNhH±_@O7܈c! 7@^!RNj3#>Qz}U&@V*r)dc iG ^|dhT t^GYjڪA̚5|Wc-&NٳgA^Z2eLjj5ƁS٦ BG@קq9!.8ǐ$$ClT&`t,i=Fmd=0A.buӘ$]ig@̊ElɇD* vއA{z 70;~<ޗXK&^ |%x CէSiù .pi+ɕ6[pMMͨ }ڵrݴށ|' ||Պ|_ ( & 0g&@qz{ J@]Op}^kz@=UZwܴ6{gu"n} s79ئBvs^|PEGs;~Pge˖oߎH$:Dss3~֭/h7Pe>PJGȉO/ubD2GߘX怐LoYa{eSjWHNa*g3 u߆= # #ʷw)<+ˇd "U: F eee+W|p7}9[ni---]ODӴ!M>c(êU'OBuEG*G GU%.T\tKUe ~F -}09=/l,5+v @T/pްbI}ׇߏ ;@ii)&M*Gى&?_\\g͚UfEt6uSN=.((yi,0c ӣ8q.w!j0tlpΛO@g+_ x#iߏ",_Xt)fΜi5:::ֆfaTTT`֭ŋw__g/3A͠2þ ?% miӦ8x񲲲E|d OB(F8d^*BguyQpz9V`Ȣdl$ # Eu'8P(jq5ki?V\F$9d]k(R Gt͠ a8#3uR(((Sâ)ݻ;v`߾}Z{{ mfyy9EMMUG л߼ysWKKKiggge$!uo*2iަʲ_W.X ( [ ˈ֒8-<  (!- ((QH ((σҵ mjA Q]0~.PPPPPPxm,|APT]` եirލIENDB`xye-0.12.2+dfsg/res/clean40.xml000066400000000000000000000063631225403634500160750ustar00rootroot00000000000000 Vexorian & Mc Simple Xye (40 x 40) A much larger version of the default skin, so that it is more suitable for large screens. Very abstract, simple graphics.

xye-0.12.2+dfsg/res/clean40_luminosity.png000066400000000000000000000373661225403634500203640ustar00rootroot00000000000000PNG  IHDR  phsRGBbKGD pHYs  tIME  {i\ IDATxy\gy'ߩ%˶y`0jl0Y$ a×&xB&!! 8`cwIx.r?j[-Uݺ:WNJ<}9ESW^yd߾}I7~{睝z]GGG~v+0T 0Qj8^=CI~8I裏~|Z$ŋ0e&:cIWUI׾IYfo۶-Ir5qq̀ p5~x[ޒ$9&[z H+LEf@ 00I_-kI^ ˖-K\uUG,I~.EI:inGkEQ'|`hWlv6?$)Z|__ZO>'h@C;gժUI<޺_GOOψIϜ4 $(V~g$')|[>8n9`(#cY\%IwsO>/̀ǭ;I2gΜ!>܎|3I%K$9[$QJc=1noIgOg&[>Ӏ`͘?_opqi%Iq>={zKoo9]]]n}G0Nִ$|7@2~GxKo\xS4j{hp`>ۿM23CXE'"ɧ T1ڙGyO:?WK>|`k,OO> hLxٕ^b"|)|䛼@pItvv~o߾$*X' v~%O>5h@7͛7?Oy;KN㡻 @ @3''|ЀE%I?sf4֬Y$YdIip^$H|ɧ  НO>|8޴V59_ߨ>7Bn]Ek8zQ=~۬Z,6'|4 L:c]`HI"|k>Ѐpe˖%I:::Ls&c s:zkdcq_^O23mڠχ{lǻXo'߸ KQek Xko/e%$1Fo\uU!f_M>\T1D1ߗug׾IYfo۶-Ir5a0f@֌3$'tR_[Z3$cx!-\0I2{l8LYf@ c8nxI9s$I6nl\Ys޽3s`2L3 qoLL6{zz&4G^ON?0e&ߟ$'I,Ydv5X*[>`0e&պi$)"IgϞ u@9!0&X;G`kUzUdǎCwk}uI&8̀  ї/_d9#7o}~]w%Inݚd΀,HsI.Jҕdw=͏mF1N8kAH$*Ia XKqW˲,Oq-3 h|Gqt5GYI7IիWmė4 $$+~vzz'߸4YqO-3 hњh=~=4kݻw'I-[d>Z|5#ZӾr`+ЀL!{2>3Ӓ'߸ #k|NjYݹ5я~4IbŊ{ 1*O>@0g%|o>Ѐ8̝[| _O\|i@@d;ߧ`,wЀǯʯ O}S5'"ɧ DG>?h@ x#' ]q+D>4 S57yCT3+:f̘$ٻwog|`d˖-K|mT!ykqj@X'"ƳO>5h@hMloՕ$Yb~k 2kܛկ&Jr|7@@csf⮻JoLtvvZ?NL> ~/|fGe5?4ַX':/'Öomͭ/IoJnIrcQOqZhYzo3Cњ>G($ۛ[ۑO>*(f@ZWpL޷u,̀ pھ,;LuYIF:;Hر?S`˜[K\ym5qI'`2Lǫ'IZm\aU*3|>LrZYIf$$;l~ܖdMo%XL$˒dϛZd}JPh@&Ǟ=vʕ4Ϲ|ԏHy'6&ٟ/) p$ɇ>$ɶmے!Yf%I>%IԧG`2L3 M HMtww޽;Ir5$I֯_$ٻw<3 10//'I^׍fVPO֌Up8IVO?;߿0̀p:\9.lf8oI5k$Ip?NK<ϜjC$m6kڗ$(f&ڔCh||SJ?ղFq~owp?;s,3 8\f@PwtLsXb I._kww4 I&yR4.jWTaUYo\}}}IZvF\e IIra#Il64sAw1eП67ɂ$l3۞dۀmc8r0e0$TJXݚd{Q='_{僩}@VqZKLKớծ4џMIe=ɶ(Oc4 LƣIdouI~$[VMPhu5 0%X8#ۓO3ɿ&JQ}x],dgQ|7@dk>J'i3ɟEa$D>:G,˿(,VeU>xV1ei,+Q>ԒЀpDʲ\I'v+O>`80"ϧqev8̀L> Ӹ$7{Ts*O>a|NKrwҒ=I'|c{f@&q|2ɬ$3O1C0TH㥯Y`͒O>4h@ ,vO@5W>|ps3Io@$uoLq 5#Ytq.|i>ЀIf117#'%XsufWyL>|1x//&yr:xH>|pܳ `)7$˲/I(O>.``6!{iK|I(|}>8ޙ]i\IV'|&h@t[dc+|M|0X$oMrNW$='ߤNa[$%$KnM$'|m4 $}͟]ia_ݓӸInٕO>@ҕݚgqqFmo<(|U>0uK^ZGpKfmlO>2 ˝&,&ymeINJқƍ >f[Q=9=sAz!֩0~߿0 `r4Iߒt (RTmlc$K2o@Aw'_;|DI&ɬ$7'LEQOpZP y"+I~I~P>7'_;|Dg&I=EQ1,`vQ/k6$%(zߨO>/L!h{(>HrNW}?eiYc5=#s,Xp+_>U0C4Xv$_*ϋ8&'1rRkW7?_gqF^4s:yΜ9Wէ^ygz{N|8_av?;T?eOz_}h^Y˲|qY/:gΜ95/wfe,_^e68˲,/h|>~w/fWX|go~soG4%{oյK/}Ć3fH2-$eYE1e͌?h|>~w, ~O>Ӹ$s|h}{W^yeG3<=$;JR7zvՆ}X 2m,O$)xNLDֹIV%X\ֳ,yIN$[Әؖyby!|M|p,h2QQl7*bKoe4Ҹhk|7C0,jK6j p ,o Ǯ)r`2c_;X'ߘ Ǧi/a Zb"|M|`f< bP2T|79+`pGMC>r@0eYV)\*`I:8U>:@0+jiA-O)4 o,^FsԴƑLd%|Mh>Ѐ0~n@^`'|4 do2eYhA/|7y}L k#'Ʈp0ýϡָ'|3h@YβCK>k| !.yʘO>&L! PWҩsy(]vU9wSO>&o>pf@&G2j=ɳ'>_җyUW[E9xͲ=˿x{Æ ͙3g[ˇsW><@@OV=IOWj,rCFlo}+E/>2gΜ'$ဧu$O>T>ЀpfS//Փ<7ɜ$8D3rկx}?}s,JrB%}O>+h@y=9ϙ,\'ׅٚW e/{ن$9:daIxڨ c9|?1~wX@̷$'5 oP3T!3;ogf2k;m޼o~|3~wX@LQʲ| #|'A:y8(xqs_[K.{3ܓ[O>+h@i^)gW'F(\jQ$+lnng>>(;6o\K~{}Ns 6~wsрPJs+lB?{c3p۹s[pgڵk|k֬{ӛtӟs=?SeϳNj|/LL쿙nK ioK3OOvqg i>6W9ҋcQH$kIN|*ʻ;;;Ϝ'|W9U~,Xञk׮۷ﰚZvwR¾}$&L5 ~ yw… ?M|icx| =g3G?Oxݾ}o߾6!??;k׮i͆b… bŊo/[lݙgᢋ.ژ$7tӼ+Wjժgm޼Y}}}R={kU7n1/߿8N׼5[jբSO=uW_}ٳ{F0EH9L32豖[/Kwڵdڴiw[F;syի?gϞIrꩧW_?d֬Yȗ$>h}/]nݺ5M 6$'_~8n@v__{}wʙg7s$ۛPC}>#ɂ$ʕ+]z/ܾ}7?CR,_/뮷$),X㷾W^y4~I߽s󓔋/C= Ԫ/׆߿8,yϞ=y{w_dƌ=i/C/ip_&9!Iywo˞}/7|cggg_Q;3Θe˖omٲܢ(/$?oK//,JGGwIM|/h@hoKҿw]zSVX>}z_\#>Բ5eWɹ{7u{uYw|󟿥^%)0Cy-[R}#W\q9|oOwM6;v0τE>&L$:;;;OGO~7s=s/߱cG{[oGV xl۞$$ٵvڭKtѾ}\p+/^׻Lkf|}ӞV2_k.ߞ9woܸqw1ٲe7U]v$?;߿0tud|/_.]HGGGOye筯 -[/ٟ֟}7ECEQnڴ_SN=Gz,7opᾶe˖^ZT>O\Ue1_شig&E>4 . #}͟_~kZߠBB _E79ZWJQWrWv1MozWo_ve+f (R}+_|/~_2{S\/wX7m@*+eY|;o=w%i(/˲( ʲ,[Mrճ>\PErJ}{?hudǎ3<̇w jIDAT&VMV)˲_-Z#V*(,˲V7RIRTZIz衮|#?STnᆛN>yGΙ;woܸ7''1,`IWeY'xçvAҴ=wZ^EQio5ף >Kn'UW]kȷdɒN?cRt20z7zW?]7O> h@84b,"zjZ,˲cv\ZaR$)gjzRi0fTmn0===ݻwodz.m$=j蘓>zG)+'?+W>I>O> h@8ȴ4b "IZ֓^\wAzJGGǴz>fժUO+bM/(k|]c:h|wOٶm5 m;~@A8* 6'ʺu6Eџd^ȩa3#I^jZYt7|Z3Cׯ_0cƌK/td{#~@Az{[<,fvzLJ2#ɜGSTj\,`:zm_$~7wtt|'ד4|_U(j jwޚnmygg''_; yk=EQl,rfY(f;Ѭ)RzGPi,hsWu=ל$?G}Qʲd|juU՝ZVV4כMNmݶ'?)`䓯 zMAk6[|&ɖ$6 &,ɒC53T*ʮJR۵k$M5=In63fQtIfҎ՚Yni{H$'9uZV߻w$w4%Qׯ$hekOvueIE,9i,iz('<ؒ%KO(&yU_IHPGT'߲eO:餟+O,L(eYdVQ'Yx;^}쮢(֕e9+ IE$w,[$$oJc-nŋ?k׮eY~bp+܏_kek||j@3 uVPXq>p ju9Lg 7I:;:::F(` [n99΀ w740[|C>Ѐpj^t3 PO,0Ṕ3'}ݷ0#̀ttt*_s_嫬Zj]O>!h@9h y2crY efb\!h@U3>cruQ0O{Y#XͻIJR)_3|䓯(֐W1+p5_L7^iӦA^FkcU` ۀ]cƍ'|4 d.s\t,pWŝ3w=mkX-6[֧άjwqsv?k|0ᜌ09ap4%u$9,7{JRb7:;;gϞs򕯼.d%&coؓlo_LYfݰe˖I1~@p'yquQQhaz~s%4N*߾13[lyQZݵdɒЀ'_ #0-qZvmgX#< ֐}kO9唿Xv{Q_oƍER=6lPӀQ,Y?,'|m4 Ve5IIj;v4 )Oyx;~V*˲>\v_y\{ O~hʾ;곟7'yNGGǖ<)^fͤ?;`9 UX#~Azzzz:g$9-I1ފ$/oݺ/?;C9{w$)mo{ۓN=ԧ%Yؽc&9x+7?n{[OkI8~w,+ @*,K[9O~'y0ٿb,'Y1w܇VZuϜ9sQ:K~xGQ;ʲL'digI$oH23l"|  @& (^x_weYeYՇ:mA[n|GGOnݺxٲegoٲe_W~WYվU$ٹ,˾q1m"kzZxD:k֬9^?O~{Xr1XLKҹ~~/ٹs̙{]EQ|n!ܘIfϞG}wќ9sc^jQ(IO|/IyWސ;;;K˲\T傲,GUDeY *js|,c6w7$zxB+H Ŵig$Lc {ƝJʕ+o9[ bg}1Ettt<)SM~}>׷ IΝ=y˿<餓G6loSa?$jucwwoر'E>Ɠ!sK.>!~v@i0$kL6ݻ? Ζ-[~s֭/k_|um_`msη-[n^lNR|'yW^}]wu 7+I*Oʿ%yqg#|I^$lII):~|M_Qʲ`$}(r| 󒜛{fw;|#LЀG߀$yz%Yz$%1p L |C4 ZǢEz{së_Ur}wE<7k~wϟaÆ,˧53<)fB1S@Ylh>6&E=twb{Gx$7_`Q_{jj>nO|+W{Q_Fp!/_^ Ox*'|ruѢE{־F|hB@kOO=78_fQ|{ 'P={vm̙VZqCm9 059Vq?]]] .`niӋ_ⵃKV̙S9sfuܹjWWע{キLc\hf@`j8s8Z?=~ɒ%KVwÞxX 7DQ/Z4ƿ9?ZYgU]dISN6l}a5 _W6| oܹiӦ՚G(ZoooҥKW~Ѐ戚=i:t~޼yiӦjڂ74FA ȍ7޸%/yɺᚏC h>j}}}JOʍ787 0.XtieҥW̙S5kVm޼yjgggmƌ yE|joҗ:;'?K_X`̍C}-I}޼yKnݺ4c_G .Nz^VW+˲ZvǹЀck˫yϟ_>}z:s̙3mΜ9Oظq믿/x}z#]zYZY}s_Ѐc谛 ͛W7o^e`qYՁGzXnݙh>-oƵ/{6 |n>7ӫAkf^V]tE/y> 058ٙ˗W8bN8:{YxJR΂q{5:|teY+Veh$P3Մz}{o(k͙}}P_۰aê ;cW^lٲmo>9… Goǎ;w(˲棷kW\h p 3ѿU{zz:f̘Q1cF:DqPqGd0 ӓ{{:m\pAmp`k6َᚏh@@MC4y͚5ʲ5k֬jgg~#I}Æ FQ (7 ?}z,Yr@1k֬ڴiӪͷcǎǡ"ɣ~8ܡ>nذaδi4pG3| ,7 Ow͚5{n!a Xv5(l4 7 +rwC/wÆ '/Xh>2BrN }k֬6cƌR1IC4G>w?6D-~8i>Z]uww/cL Hm۶U6mtٳk棞W뵮G}h@sYJHiӦ}5 i>2Cu޽c#\jw5\s{m#4h~!P#i>~nݺ3+Ju…eQ$<8b3C5q/^JWoռyWmQ$gh@o@N>c Z>O?,ˮfQohh@س vj>s#IglW |t?}a4Ѐc I;;j>ZKz뭷JRo6{?O_|`a43f4 kc$많h}~emWT޽wwa6E h@#G|#I6mEQi>Z~ӛ޴ _M===z{{uW^yl>:|p`ذ&,;ۨ(qV%Y{IޟIvꪫf|HcI$OJЀGހڨ(<2Ḑ'\ 9HrY4 |?Ca1$Krnqi$3f>@@T0og`/VIENDB`xye-0.12.2+dfsg/res/default.xml000066400000000000000000000057601225403634500162730ustar00rootroot00000000000000 Vexorian & Mc Simple Xye (default skin) The default skin, very abstract. Very abstract, simple graphics. xye-0.12.2+dfsg/res/default_icon.png000066400000000000000000000013711225403634500172610ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYs%%IR$tEXtSoftwarewww.inkscape.org<vIDATXŗ1o@`1-sV!VĀ 0vT)1X]*H0c%q_ɒ};GDXxs%x )p |>_DJ0d 7T9Gx<4}ߧn!A0NIӔ#ө=OVD~@6+QZ,*dY&D(Fa;xTUB NG$$B$kHgK䑟8oM\DqRt&J)Mnpxxh<(gZGEz={9# ¬tKsDwpX<3">xI&t]#`scFkq /}iY,fi BqlN8C2?(U0 +[[[WRիՂXb(,TdHӴ6)1}}9iDppppq-s`Tk1JD\׽ʂrΆ$c{Ζl8-kdCMiŦ4ZsC}rNDQdvc{PƵ֫xeVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/%ҟ3bKGD pHYs  tIME 4!mYE IDATxy|Ut%v@"##*8*ʌ0^GuJatDeWd A0@BHBN?:iχ:u:U{9e^z|n( QP0- L敱LFR(r2ǟ}wmҫ r. !Iu9^zp_$IRl I\oLܷtA˭\"Q S/H_'ɔEQ,"k.c ⮳>3>Yf~B[vięX}ߵH~e|>[rmcH s E 2M8ChXy7xYcՋ/Iq0w 8X, qXTTT`Y^I$u()Yŋ]rcy'OIƣd >d #QX85/wc'"[Z}Ms8P|(YRqlPqEwJT[b_.II D/М @DEH)'hv#ߗ<+g@WK<%naM s\ML&ciah"A$~Zg9:1XfMZLIV7s7]Kyۊ0ED9[G;fq8ީq6 I,g㗢T?.e$I!pSVwW@\(/b)-@1';vuC}4>߶\D[v)H(J]0 xz+?<:#֜p+|! N͒;,t2?+SQWYRX3/%-̉>S:EdGdi]-U'/dva\.9sJ$lFrrr췓HKKbT((~ӕp23fGcS#Lں򴶶b$ٹs,Ų-)9ϥIf3XVZ hXHxwjjs=2wy44lE(FeU%<vMMM5]Q  x5G론nĔO0a8CܻwjkL Z˲[z; UUŋ;B!99yy=Gyk|ȗS=_QQVA+}_8>tK*u^넔c.X7n>G9K*]uWWx/ "f (֞uIYh.wOż0>_Ë#|2 [ hwp}2 IJM)T/ RrNpY֛3*f^zEvre0 mJLLG^0fd2D[!B=^'+qttZeO2o"Zܔ^=C!W=7뎟ZZ߰Յ f]٦%KOݝ x$i suP%̀ͫ_A4hS_n-fPH&W@J–3 } vߌQ=(? V(zވڪc 0&$CD4UA3@7B&W+jⓠPSq Z:C<vtjc|z#j`mkÓfz_W"Ix+?@#PAP2 m>I ,΅yLRG#=5"K7?rCAJ.63HPThi>Qyql_?seV3dq!^Th%:EZ_аϒD[PYݤФ_CA˯*ը.IHHDm"I  FW`ٕ|{I| A,I`7oޣV?INN 7D}[,<a~JӧO@ 7(,S1sfEyv؅n0PzwGKZtzM I2--įD[?GcS#,}o:4Hg(+;1ew};azaa >]wg u~]wĔ =ow鞧 >'N?(6%@m]m2x}`0 1`Y&vy=Q?=Z%;{oyy1|cڄ8Fdw}sKXD r BDNjW+XRqW89K!H6j NOqT*_^y=1 /zVm3BP0mw: c˟{6<'O_̟.<弭-4Z­L[_MMN;/n!#in/R B*V։~g)DAwV]|5 d@tC}m/- "hFM:t~©StSզ6d􆩿>k>X 9~7 N&eowոuE1M"B$IH$IicY!%I?&nE.,L%Y#3FDBJB!HEHZAPaa:zN7jVduh K,ͺ˕mui^Piy}tښ`eAdNGx 8T 11A -g\Q |^Wi붻x&Z A$ ~;N_0qxش7ܱCGc70֟ {}nlL67׽yqbL~8.=>+W{D!UG{1um3Rk~u:IR:^gZIѠ xM I,i Hyl:9R`RAKuNZ-NGGG .|b76'?'(QyQC&kĨoǗ_lGHHHDzf&ΞiCg|YdDrsA9 Ds$s#'nu$+tM,KsM[6!#s( ƍB] :J%kkvxWXqm]L5y|{㨂] !y᭷'Mq<͛#lFn(L48닋ڊ͛ftI]QQ#Gb;]|WwyG`e)+;pLp_ww=鮻 aÆz A$I<ý*X:AtM >݇{aĈ*>Ç CEE #nسvԗ}כ|WOnX)0m nBkY˅vgP/GJtr jNl_*o\I'Gkſ{},yl2îD"` ai!..:5l)d$'tki.\ eJ/e1vvݕ4hP=SS  `W[98cW;!X9)_ ֬Ճ?2b["rW|U0]k /p>ta.IY4cFA BB$ > crqw{^w*;-==_|>}v@X~f!YP\Z%J"$Q(ICQh]zAoVU]/r+|s¡ТvK2Yg!8  OD" %,=sc^%Y9P(Hs^;=NH%3@c304$lY|L f]%{[nDsӲPn蒋 EV1[x;54B2WALğL\*0, 3$@%uQ{y;?{k֜;>}hN:a7!^dBDPS- D  \8=뫿N[+Tj% i0ƛamm2Go<a#t//!zS|2He]D ol x0~C2206?*^ V K@ T`TZz˃_msorq<<7uz֨rahN|Tj@Y^ 1C0@)8S,F\tvarfؾe3:K;wfz{xJ%%IBA%IRǷnݚeڴi<AHyzࣷجʿfhΗtM͌~7_t7Bz /B*: q7obԩS1;x;7{KK嗻±sZ=(Oy>KA+|,X~N p9qa**F4,C"%!(Ȣ_Xr aV[˨™w4G|Y*o\K*]$-KB=ǏghTzĩMQZ?\HNќ` Ϟiŗ_[x5x6+(i W5e/m?Be;1w,{\԰`4y( ÇGNNF -[\3~?Ky$ ? a.A% $HA HZ~$w-x2,P(T[kM+LaCc@D$G(نԆNw+L.{?q]ɋ_ 0$+LI*@p@:e8Y=!|WV}G;Yh./+=XŒ߬+`e{h7-@$ qaJZ!iIԢʃ(2ըoaj(XZa-t:MQe`X"$>_;~Mp0-0' Qªeυ>> p"~+v ^ r Z vk3hE۬QSwױ:]z|D[3vP4 " CZХ#!AB(2h$nL-ε&! d[>pӳ0dH}ٗ>}߷uB1;'FYK I'xvTz}CALroDcBrRϩPWq"VJN*`.w+gv 2QM$%RfǁEyp"IEQTK8^~ۖ-[T-u $7?~lq⍕64θ@Ee%>Hb8pO©(,5hX+XYRr/>AHذ3,^\VM >%p8EK{eeb3ip8@-߅J]|6[V +^p}hVqИ,jrӜכ@rJC3hG D@ ,'^7j*fP;Ш)p| -@d,A@'јÈp~HbШTJB7PzlcLBeAd挄LnEkS-hLAZdqSHLɌ7֝DrZjAQ6v:pN +pp)N "n4M7_ŀNP+uHaHLI H Pu4 b0*U>Di3.jcM۷o- -zP dE"3MPՂ^4-(GRܹsP(dFIn8M6Udo~0Džkt.8tc⍕?@dX!oԨ,էw>\}V? >Cm]- >.T+/؂~BY7c+.J__͛d c11J?ͷdNVw Ј"|)uW\@ )./ Bfo xADZ|*4r;Sr?8YTvS71$dՎ>9hq@MDFUDi>Y`o= H`i9N7Cu1P&]j,\!Anwvuc{\!W"gH =)5Ӧt͹#O?-,!̟.mxw(pm3(|D^;X %G8\ahwTjJjn+g "!h/:J )b]Ǔ+2ӹ&Q_>ºuo"I(vF@Ef(l߾e|/O?(uw-D$jrn^ZsiN+% d¶U ;w ƌ$TJXc-[?mvZK٥EYKrZ# {ZFV^&!Fh~[wߺcÍ{66Gk֫q[4d"wZ1$WK?w <$FQU~_tfIA@BFAD ԟ@r@DN!O;23FBϟStѱhߎϠPA vo9ch/Pص98ңiц }_ '2:8:"hnd㳏6d\8$|^4K qШ<L6k"|zwktڡhifΔ\YZxAH"L@%*?܂)P(n0PWW\nZѭ IDAT`"(SP/VvY,$Yڰag0{U+*qdṭT*C {C[2V?@掵 FOe.J^R9+V=o~8rUUUbkf;랿(Vkl6)їp8cCJ>g|>0,|W _~13G`)r OE Nn@l4C*1t|@EpÇ;uN?ZRC@Z1x&gp8l<}L rt_g766.zhfԩ/bՊ akoo_k40[`2.e<^hZܻn|&bٰjw/Ytߧ1V6jH ݉m?Ap;:ʘ>ߣq3B*0%3`k6ܺd^Bυ/yuaa8:ڞ5AS*? tU\pp7B 8u v #SH!+ěvNP3/(?R-#Z&x=^>;V(yQ~$σ=CzfXM\N?vZmȄP*[`uWǛz0Zy|f!(F) a>Sڐ;ŒvoBA#ɬE(K*A3 58TĘ R2F"{}}ձ'<vYv_8W @(G 2["` $!u}QJN9{#)CI@HRc!1gO#Iv绖֍D") d, B.PT{||fjjjhLRY__ܜqe" 䵷sg̙ӫ s c2Aٌ0z*Z]pbڕ>}kjtF99`S^]V10͘4i_e~%_wxk465'r! \|_wbyr{;cX/ DD"H,e|\;4'M x9ĺA-oOSTC0ۡVKS Ym?׋eh$DV9l\+ήz< [n8R'58S܌U;MoV?\[ y[[|aB<gPS#DH7 hv.sPŮppہi=$ kuU,Z֏us#DA~g{ ;c#~Yn{" }1pг{$) s̆jUԝiKc"Iq:.7|>?jou3J&N+^L;kW]wn rdtaސ(G$hAҰٰd+ŏ XkyP A=~ 8?IRD"`h Fڌ~zqi|ְֶWf]BEӏ\7vK#j+!F"(2Y9#Q}z'ދ֖(;ANIf-hBF9TD4qꛯlν7 Dռ^0n F @:,͘4e'GEENΡ>iY:.tZ@jjjgXYL^#NGQVV{vKKKSI\.4uʷeVj\_\|Q\IXPSS;cݳ]>|¨Qe8]Sܑزu+n>MKj[էQ[WoSc`W){tTTT"̅/?RqI{PtWWW[K)Q5+ɒE=Uˍ~|wp?F& a>AZZjKmx4^?n?54BR[:QSj:n8}AP$C!3Nҝ_.dǎo ر}5^m0yK $i!)*fݮlQZP֘A {o݉m~i^ rv B/W "LӲk{I@ +.%IP, BAx)9O@UՃ L6Š @*4$(RY,&OvM Lyb.Օ”ٳg{%#Z伒2'=]Oڱ^RQ??#&A@tB!W஻.k?{߽ X?< 11lAPYغjc >LS;y.DHt-{ J5zCo`wq?q(c6<Μ6˼QEeo,r&ibDUP:Ȕ`mA8`iBqy[-\P 7Z@;j]T'%@r,"!!DY0|d*+@|^RPUYUAgR 5-CZ GTA!a0`0KkA9HE]oAe${}vju{^!6lڏ{(lj "it@F: cBR4McH(VFRj&R5byb=tu<= [{ כuO׽1 61#;:`i[Zj!gYP6n~SLUOO^Iji# CƝz/}Lkr#\!lCE#,Z-df3dP~~餤AN O<]QQ1|ڴiGSSS-,b(5}eg\oWlF_v)_؉0Fٌ't6uoJXwo;4ib.U(++C #lƄ ו֯M8p rsGÇmƙ3g y!,}>|v\H0uW^SB**;Ko@鲲ie[Zk̵o_Z}R ,"\v"o] E7HR ?jF-ݳ] @Tt% ў:u' %8sth4+{E}}}GQ @Dq$ IW_СC$)/11wqGEQ5jfN%wޓ?w|BQ$Tj<^/%u`0 )788"IU*Ah̜y=m<'l39y2hCD$"' H7/gb7=(uX">8 z,Y,9;J!I߷bǘQgbX~T~^ݭ 1| \v g!wC0N++hǪ(JD'4<ǎ gεkI#_r;%F2n EIӿs0LM r̙6L6Up:PzQ(Ր$6k"B" HN6 MGeE#JwaBW.kl3Z كIR)FEhu\Q!c\(._H[H"D!Bp@aQHȊ.HCma47 !e(2(|܇I^זt~ 9 J *\x->♳Υx |n<]\ܶnݺ+#r\PT>ۭWTr_MJ꯿ 4:'@uqL}/7slPVr  AkHa!1 $‘3u?LH̀*v.8#N+FڸOV>ok05Iv?D9p ]  Hv[ESu?^| 6$-;11Vxz뭂#ջ9qӧlJƿzɕNR$gk qZ&Ρ2DaC .Vd @0eK, JWh̹s'v:Z1N=8cE0ax>|4f[K|oﺕdC}WZv}nsk/f"wĈk#\@0` \D~W'=,jEyZ "` S2zln؆=Es`٨BvDr¨=F/aBՉi5>By R.LV<I19yEئ Pjuq8W4oFŷ{cA3~ [guhHA&eg$$m&ZIm7 8\A[ڴaIcm+;GAMfl3fjCUE-T- U<5]) D?Vn)Z"p"ƻ> ɮlI'gD({[6{N@|\ ֍p|&Qґc|1S 7gRvM23'yT׃8lxV  RL>X~5a Z%`Y(ł-ߎ d2=n|h|z捾v_o.(IR0^l6@Q__hX<,ˉLKWN,UUUUO޽[ 8 _Dc> FoR]_s͟H &}Ï!"w7ըzKS1uuXbe BENM0[nEss'|  ڊlL4>ۗN}Q~TUWZ}%c@@ĂY?F^^5o[[[>w-H Ce꿽cPcV˜1̈AX 9{C531x..W8,()ڡmƕ<˯P]`.ZV*COJz\br}TOhw4CSG?q:q \QQтtr{ġY%JG@]F~ "BÐ0@(C 3@'<5q+HFrc@*V'@+W,U&XܧUWMvZPPrv _xl|L&M]r,]1P^7LOJL*eDB$ @B4aAި x>eKz`0TβDь@ER`YO7 > x~^ "Wen{| 0p;yB8NR?:##Cz |uXTaN?&LU`H6Er2(b.mҳv[ +?Siڊ PCP:sFb͗[ , c! f R RԌkI.]?zd <>  Ə\΢=|I0#HIA :^sZ;~48]U*r1j)5Y%흥#>('f RݼQηI&.ERsh^ lxb>pF 0r-谜C(ΐvk+R3s3V.Pt=|p~o \"Ͱ IP P*(,Z@@B)vZ]<ǁ7J=kA d$Iu:to֦;~p8,7L6Μ9~̙ɓ'7L~mܽ{䤤$!CZjkk#H*EQ(&|ת6+>}*j lƚoMEZZ^gJcV0aܸ~}]F>ᄏ @trIN]>$lt~t\8pK.## àgĻByy9rsG*|r2L}=Υ{| UUе{ߥM.T*PWWHϵo0w-)?̋Шhp5B92~?cwQ_U+ބw$:] pq W8OI9u1•^z->^fCNZu@~?n4 3A\t+c74ketHJ6n[Ms3,5#GR3f^ jPƿr'pcGH4  5<:nux \\"0"~/C/ b>3G/Mr"վ'   q"::`ǐ]H z{ćڄ刹o˺b0am$$_4cիM(PGAA>9t/@DQDžAQ4M3j>0A AӃk$k?maJJ*L!<(Y' A'"A@Rb"an`OwڈW 33!N<(| !`.GEsT_;>~Oݾ;ZUdK8.XCB8 w]~r%.!rIp.qp8&KeJ^ff>l+K6륗3wfy;\w,(`P袱eŹNZш;ݐ?5@P"8 IDAT]A^3U?FAtSF|ť\31c11T ht]Vw č#HU4m߭ R_=YtUpI )e% uG166zwTFP-HAt yve/:;8wBG8οR*D0砶[yP9x+U*A ih;P4P !ީ@(>zۛxhfX- <߭6lG Ё¢"~4Y37I\xi]X (`X]]=244V_PPill<;<<\`2ĆGmLѨ;;;k7n>88X&IRqx~^s'br|ho;EYuu\ĚY#㻓ص]^4 /Ixq=p8쭷~O=4zRoM_?MM@ubCC"Ȭtns|$]]ݩZ <Ǚiu;k^cNjرWLQ/0ᅨ?KJbO!m4YL#~8>u_~ˏ"&hj4:o63 ^sK'~qEjb`Q. Z+pDJ^SZVlh'IR_@?5Ysȑ@I|%Μ>]z/]||<}"D9,歨)4NP);Jڌ4 3qSw`Dxo048 w}(eu|TV- 1M'DéhFȝ3eq st;9 ,(-+F#FP˚ Ж$h筷޺5Yx|b\_dhcr;8wnWCCYA---;22R說J]-ADEiعs]r N:Re` gcm"-FE5"]8|(! +c`S)_3A{nY5zh~-ڵqG!I\͛pQx[::br.: ezuSQJ.I 4|.043yƍS<$ ft (,,L'~ر+OQo7+RO8!&9k\J]wgghFIA5*7o; +{h4P^yLNN(>o[|6g>s洫 Qrc&"=?8th8]mÅVPET/ZQ3:pb$޴s8]i~R i` 3)p:Վ/^pyX*m;d<ζY\yG?Nڧ +sߵjz4]Pċה4`yZbe.`Џp"]fᰡg73fքhX oZCyt$7,[@~0::  ``(Eccc,^eYbqχ,` à9;J\] agEQ 2( fb(/j0(j_X,d1j5g/l>dY$+HdB,&XcOۭ0 $9E LuӈF4QbpTq Ӂ xDDah4sR쏃%PYb|DRsï| .YORlh,!& .KH)]HPgaq8`(,C))ۍYEi ᑿ# 4t-/kq=ۃSr͗z QhKJ`X`` \ƹv&D#AظhfE@4TEٌ,)X{;Ϋ6 |JS׬$Ylي{vCeG /`0>;׾4Mx@񺠂tfh``bDѨuɒ% |>nG FQ`0Tb4mzP[54ݸyH 3gzU31I B.*Y:l׮JuO4LX<,(Ovʦڊ:y\]Jk| n&rr@=a\zz^q >lv8/4ݯ3{Y}X󠡭BK$ kV7wu OB3 i+q/`oK+,*8E.1<0:8f-+ߪjü6qHnu ۇP: :Mi:|\ߨE۵XZ\k!f4%v*2?B |4QX灡(B! )ܶіQB-P{} i^+iɴT% @4Uwݕr HHI^Qq:4ߋ)b :p$A,&!E9@$,f3‘HNB$q@$IZ9YSE ɔU83opp{J(#z "h4l2# MS\ 2z2s<#PIXM^}qGU[[G% chI!S9!Up  @4JjToYFt<'i(4sp민(_XbX,,pD!E9xbeY%yddzѨh4l6q| $#p- > //Ȗ. +;bhx$ i7e&D)x&<BgWvwqаv<6. ^?eڵ;ÈZmpON ]شqcN^K! "+㣢bO{ ,&f b K$uXYEUe%NRǣ?q|^zI\yuMM_%=]jkjݝ%˪3jS AjLhe 8Cia52 !A @.&BS9[i-l5lGQMQU&kE@F48y&}^U ٭Vki} lECdbIהm{")VeHjF6ADUUFţ'HV$IYSfUU%9aXIλo,&f5g(Cuq9pj) `Ŀ`M8^!1MHkzU0FaKisE`23P}Ֆ(\T[Ex< X3?xv$ +~.k A){GQX(0.A[@{ @2pB4 5fd(f?J]Ȋ5tw@?Tką,_gf@0ko0؜:Xd):| UN\ʱ`8Q$2%?JvX,g A1YTtB$US浜[>~/Y}eeػg7.y6[,hr}*?j~b՚¿uuu5,"%fEA0JD |R@e TVTx=i`0diIC; a`xQrvgdʑ&~ O]|}FuUCs7i5~䤡K⩧j9˪o%kMJw@HRJwߟK"is8wqL(")86s?2\-׻[/<|F,^zԩS;24߁M:QfSڬ%*u]%U&$n63HPFX[>ѫ[xV8lLLx/)nb5.e7wy8AP ?<&<^#*@p8L4q` 3kARBU-ѺR@ Og>YTiZNAQT*iVk<톢(Y%H'?'Swy?qoyzvۅޝ&#‘<\~F\CR3I26Dy7pDQ4±W kPy + S:xl>WuJxzHAh9^\ [oEO)>"js b^]U]GΟ=uc՗@"]Ao(1Nv"$W,X`xqඒTͷ|,c8,ILOM}hj5TUML&iTrAQf~FVϟ?O 9@,3Z,H$)~5Qrn{p0|_(n-,_ =::EM'\ŷ C|(~>JKK?åԢ䚿5~9wߟ!-FkIYyMg_wN=r@yk] u[wر|YU3J10:xny}hwggy,#^YB,$ڂ'}j4|4=^k;#eeeIѠ4y5H34EGC=ZJ c,4 &K$$E߹CPej,/ Ua6 2h,K?<7w3e!F36(( iF, "]S`!Iipرc 199Xe~הȲ ɔI-"&A$6/ teStXJ/-~IWjaT4$ puwIRRgFh$!~9L(@TWbd 6e͛&^Ļ]P_,@ylq|XVqzFNuCC|:86pȖIA>/˝}j& K㰼j-v% 4!Q3-aHQTGwcX`'h (c<ƉIh&28oFFv}>0!.tɐjb0 0fLX$!Q4l\"x  e+`vK(O QQXXn!,4?|0FGGgЪbhhéToGKKKv!i@!CQ|(" yY4ٌd (X #~Q4Ma+f1eƤ( IDATR9P酺eSI(erdtFED( zlF-藚 V҅sJ^“z EV0_)Bq,K@tTղ(_+ř7A N3^JTWUl6!~ ;/Zb43S ?!,h$zwѕb@ ~v7w.pya0.ɀS 9Aߥ+yx}TTTPWWr\I?=ߕ>=(Cs"z KI(d 0b]]]_2ͨv~ rnVUazN'!}dg?e嵸*hA#X ݠy `7cQ򌨉1pLb2~N0^ G Ͷv_V;]ߢEE>Ҥj* &3E}2GÎn6(b aB(C!gL6(@c "tAFT'2PA0hoodDF0 S$xĸT%15Yq^qँtDp4h9RA!IҬtcRTY2k8!zQaN/RDG3iK EO$0hA$AL`Xt9 (2a L3"5*j4^m_ 7(V-kM;^ sڪqnw(Q1V0t^AxZ((PXLA#)#~f;/EjjΨNP(tu UU:A+o6<~c^lcgl[51W4ۣ?oX(h  GPXTtmdٍeM6/nl'^P7c=*eM7i2yM(.< { Xvǩt|P>|E)(tUfPK{>O>t/^,O&ZxB;zOk ɢ F &3s\ގk׮mx< b Ng$("uɥ@knnloo_ ڃ gi/x4dl d f NLG'6m0аs>;f{}~b1VرpឡڵkֆNlݺeNgMC s,#2_˕hO`q9w)cص+ƭرyT.m}2e~G^+)/nhhdp{ QÕIJFVb $jz|{?El1"1^ ,K*dI0,#>'lvG)ى3`2"EeM:wY8xC`XV$ "rȇޫRM뺏c', D9=Z3B4TU7gVv€Na#(1 "Db2fOoz}>XlmI& ]RLY t5!TgľI,*0 ِfiM.1&^1]SԈ>]~h> l%I%arMZ%ӇEIjdds>ɨG$Mөz(H$#۬Sф8$IlcDQ(p$MePU%U>/b0 cŊe1$J M&( :ѩh }nu%hjIw(y a[HeYv'Kܵk7*U^Q.6>0i=b͐11RW=d-no 6 @8wqvܱ D2FHD XWj C!>r:a`LvbQ"w^ZIm,rPv]Zތ,݄|w/Z( xgiA8bqOBt( 5@m/i4Pk7N -; ȕ?D|%ߓq{{@O&[Kh 8qյy8,F pDD5;QQaFɘ6|m[6}"=- I 6lʨH`$SSx$\%LrIpiILNMɋ*? @<ZIy< Im9Sa6~7pPi .c:!ĘQ v ("&`L1gp$ @4HLǶg}l2%,J |0 ИHJC{aV.oob!1>"ꨬax)εx' e-B,HPP2?/wd.1"4E``HFVxus1l0((+&,fY_E4(}C>eI*?= Yab|le R@z;OT @NjԵ8j2~Rac1I439V'YH"kJudv+.fA1&F;>y}"Yg~ 0@3HI_C  ZB_T6X mF x BWdjnx8wS p۰aCzZGӤ_t@ewwwfnݺν{mhh8;::Zѱcbb1(4MJEEŘሴ/bF(--)4#B#c6Φg:IƤٗA(h6=^xU;wٝ0PX^KeYĤ_ IW/ti{]_C$Iw|oH|Sطo?f)*l?yBQ+1F\$R$6<~VDav'87:6^86>N@UY-  @U ~liND%Hr$LQA4 zzBb~Dy>BaX <A0ٍ #911@ ` 3g|*~La||eEzP7醙Ȩ)(W@=`?{anc2GdPZ VF@Eu;sC;sR$&/nD$&fjgn2ēo/Vf$h 00tFj$xmg*ȇ@c@=9Mo\Ǿűϊ|),^c#⶗YkdӞ' rBGڭ ASyTUDrAG9U$hY"&]$&sis 8garzԠiM=FS^wm\Q\ljnlkmZVՌƺ&hC {Z_DD)kYQ\Td+>睷L /?~?HX5]0"}xG]%61&' 'TV 3mm 6L{D \.=v▆yϡojΫILIRRR@HԬhnOZ麞KF$A4Ϫ/*&&ܸa׮ݨ5E(**H7ú. i2)$AHȅ|7Ņ/ "2$$YWImAlW/&{)Wu-[&rѪV( Cy̦kG/uӧ۹$a9N5Ij @k`4^OCc`u7=wl RME+Qb2PXTf8ɨHviU,6 @fa6p؉XtI?G`ҥ)(8qdU]]/^ Y3!¬ڏ$Sy(Bٳx$< #{qofD;%OD9b|uME8/I)z@?"/hfHKq1*gg関(6TeC$xR (NWnpYFױ7݄kAH4жmx;S? Eᆏ"bqqE׵s *P5,@EsDğM)b x1:nxCgǣ( Eeu9'4n1Ο$Xb ,2AQy467oUUN:7tT,@yyso7_y啻QM<===˖-=p@c6kBjkk'=%aH^^^h4e gnwtEEE:M71HF6y&Ș&\q#>8p? \]%0yݸvF)l 򱶶{W3QU$Ibƍ۱yLشq#xǁ2d{MUu֩]0JJL0ch93j;а==gcXj%`?Z-_I?l>9z/ ЉŊz4=toa۰Ojgvtjk7`$~4 qM.\eqoգhd^"TUijzk׮uww>S>:up{O;G\o{hhZ`BiiǙspXvVy8wsQ(v,őQBw<M֩|HT W/~InjD$JքhrM)JcfUw3->z<ϧHyB!~~bYPP@@P,g&MQqIp 8.eBmV (D J՛#`( 9`K}tCozgVd@~BDXBxݠijb6}ӓ{z0b%QZ?ַ_ke,>( e@2=jA9LE(R|_J,Cno|( `/`W!U9'&kcmw_ovpb&8 GF4p/ >5^o(+e+FݲUػg7Muu\$ڗ67^ de:0W0a|%׈ ,Y,@ ==LG IDAT#[jX/P4 Nj?8rz_v0MGӼmg 800PŌ{]311ȵAAAһjժ˗%;h֮]2nOΝxWg%~/u gc;n^ `Y;v>3o˕/}qÙa `o˜I(g'$&܎љaЙq(kRUk h9 ey_P8YWaMV\>E7XPDeA g/1Ŭ/_l? YvWzX4C 7^5ލG4PP}xWE6 ބ59!ITl ]㦧d3*zhXԥn(59 Æh4B5 {^U%'OD0q8&MB* 픷ћnBV $e)))'0:d)3@RJC phO7=bcAe7$I&r4ZÃ5-^VP-Nklu w˲k@:}wO[wf|wu/;+FRZEK]{Ay}3 wф {u]߻PK"nH.B} L"Ѳ\0+H.̙:|ju wߍgX>sks>+frf}ˇ#Gi ,f_5 ]AUUUζ;-A^^(\حUVD+_FyQ}e2 _}~P`ϱ( *U:y^lhnn5)%o0>_Zm3WSl*?D BBhHYØ6 m"(gM'c1b\.u:nm_BǕ(<]Nӭ ШUhN(/hiI_eEY<,37HYO;A/A/$hӧa]hk4 FJAeo $)K4x]vȲ֠ғA;٣od"R6:DPyA@:@02-P$!ԅՄjMU*{;#UY?>z Yǡ4~=pBX,`b0~7~=l@hhuqh.=?T56C{Ĩ}ODH굟_ LxAw T,[p³fͬٵs(Qa[ձxLRw͵XrƍiԪta,O6kVP!)z=^w >IScB9>77 .5Jf0a)*d*P( Bwi7N{ @ϼUܢm=d^I~ XMmUÿ~2F>s}5 `0f , 3t(s݇;J75%>$ѨѨ#ztFtz8'?kZjllzo Czzz7"(A$mkku6x^%))鑻Zy3sʿN Y C19s0{>3|\.^h $!!k!BЎ/>9A lCj! ܎q4E >ˇe^$Hw9 Ns1̞{ښS|F@Q4² FMͰgfB}Z%Q!s㝐#s!11 ``<.UlIHu;;<`{aq4\gE&sB*XFV踠sno| PeFFCm5hFnx[PW/a~g3c2W丏w{2H%㦛nD}}},g߈={biعkW/#rub.FŌӰc.[ uQKٰdɝf;Cү쥟 _Y6qF,‘ޅ9\zގ= , :&#a 7G)eL}^ޏ_ b)p`Xyu[Es];wW݌c{=_}s̬,G~XTM(O9c:u&"=*zջRK,qꗿh.#'ֈnE: (@_ۅ⩶ͨm<>,/R@5IǒY4+P!Da u*41M@& pw8Qm-n51Z sQ6Oʫ]E3ê#-Rw@ pgm_7Gxg_x>}1nXx22y;QPP @z=8l·gؾZذaOu.{ut0ŝ;-Lg" ؽ `΃E0Ltl$I@!"NzϏ/A08y͙5Z=(HΑ!)4 u8yD||ڶUUh~m1 f!A,>,KpC! d@ueV3K {pVEQ,(#NZE4; T*5X% {m=fϹ,8gk1xRƖ̜V8kp>CF؛qí> )bd:} 3flݺUt9Ç^_TTdoiiImllLu:$b`L@,Gxz4]a0^+3Bha0>9TT#''gW})Tll62ZG ;b\ACeE#ϱ뺅/o9s\w(-݃ݥՠ( c zβezwy=ؿ&~Hq,zPQq|<=TZi/ow!6ɓ5Az5+z\~DS6,۵zuwW^e.BBE ꐛ:?Q8{5gBV7j*!I |AI +E %?$tJ"JJ+~(Ȥy7=/` BVo/sXZ{(5jNצ8~<mbLd5f>{ 'ʐdmLneI u %u?v2Ve݉8oFNR`رf-rq*QA מľ$FY ;CAvRmNGjž~+-k$>VV BɺlRCxGzoYnfϜ>zW-Qlw 5yh4`0ox#/6sNB&Q8wg,<w|Rj٘?r7X  |y:~#|u믇lk55EeUаc&5;P~5. Ɍh0%;κwm|{/X S- r޼y[n}, !؈F.==̴ipgjoo7\.S(FFo0Z[[[5 *ꃁ^E<t?S$۬5k:v3:})bM?v] RWϻj[=Tvxۗ$Q?.^Y'X;J` sg ~Eh]O?_8Dze$IlkWnWbŊm ]@ut@r]AύV/uveh|ö/;>k(6K<:xo5Ad$!zgEӔ7m76pl>$TXWsbAX~(Bmm:&$$&~O=i0e&ӯo!)1f#b"6iez!۸= ڵ??Z]U=ԩ8VhVP`0 :no||mOYdNb C}{wrVVraž]=M|8SB:rL`DAVoyB~A/*">)u}Wyιk8 [zj*bՆPߥ!@@v5֮ƨVg[3}Mv[ʳr].GbR~DFh$ P.dZRA,<9UiG5M#>) -Xt9 JEPkC`U[^g0w[6Og,>!) r|RM5Ej&r>cǎ|EQ̏~ "0 'zƎG wUa, @uݻ귄mWٻo[[=h:;~?'{| ]!_ ] '|t]? >z|hSUUޟ`YQFh~1\1<|Of`*OcG v3t~:cbEC5/w;,]__ KHIC܉X@0 MUEc}eL2G=pwte" ɄM`Z|&Go*?òHHB5Bf5ֆKvC{kL;yd_Z1Q[sǑ1|FOC{QUy9#bD$8#vh:rLQq^|k#&Ϛu IDATAUH6 tt8PUy)ÆÒ g[3TzϻIghc7n[eY%|>ܹHIIףky233jhAg}ݎӧ Wa]m9+/qm۶`Gw㍿ E9wE~CD3mp<^e9~?=x!Y a T4ׁaYhzx:\HjӤQ^偊mz+V\xuG^‹+MP%$&4qS@uNI 73,ч8r)=t}vRwsܼ ΪnzPW^G3"H5pmb$$?b7̨=K>7PH|$]^!3folmt9 EA :Mr ó`6Ѩ2,R@DA> ө$ѦͦՏ>UҏxVY͹γA aH{BbM=2r#ۛQs 'F͗?~+]?y=2_,8AGWQkn޺`SG!Un{o@qh?Qy@g1&{Jwa] MLp|pòIdp’O%(&A(IN5:u9{O5 >ܿ=>2olq#IZgJ0GX-}MfP¡l4hGue & R(2k*a0Y`4C̩5Z=,L8V9&K"|v]ƕFs<kOBE'&hGS]BA[\%G:'I +۸q㕂 LEqʐnͫ^{}AXT3ܣUgĬYu{@v-[`Y{A!% 0BNNweOP>9jjj(Bnv7tc/ݲ'|{5~xR:tt,vރ' A7Ľs={>}L(*W) 8.tӍ(-݃ӧ$I|-2^yNaW?XX̙ӱsg >?:\N(J$G@7!_?Pm7fMUXȀnw jb埡bY X|BĠwǎsj<_#醼:h!BsbOTP fsHd:؀`9``eN-u` Dw-(|vͳ/![BYm$އh"/13ER8L{!*Ngyr*u9I3캘R*+$_{"pZI(Cb$_Dǟ庹 IjaXVCt:t C qE8jXׯ{׿je6A Khʹ%"%ÂxqqPki,"慽ɍ;N܈$jyoIoHkzU"m@RkͬFsX}wZ?Q/,{8YgRt-z=K,L >m'VQLզt5JСiJK2Y^/tE?@ch=XQ&`M]۵HT6oޜVK(tΛ7Bg_Slnkt9bdef :1, s8-qh{܌f}H}щQ\g X^d[2LFRSSPy-~%-X>J51;nK9ګg <u1=l6y䍁Fݻ2(D ԥK DJJ zÏm*z;喛۫c-Ż3o@7]=CQXTԔn8~mӑRw-lˁd9 ۰k}j,ªwGA斖6W~72ѣ7x߅`<|I?2wa "jCsSZEo\gQE1˂P{aAn@uAV[ʫƉ]xx Yɧ^/x$ N B`YWՙ̆z~J#_0scN@RcO_b ɒWW7\䏋,Z??U6a>&S^8X5o\۴iA($rImA1  {|$*ܸ鑶ֶ& @V!>.ΓdMz;]{ U~y Q)+/G 0X  ի߁pWȁP@`B,X=t?Di,ܵ~[nw7}]/==&!Y{+Rm^ۈ ~߅ܿ] dID.By]2|ߐW\d&ķE!/2qΏty;B/@\(P(Jfl$֒9 wbY NѕW g{>7#QG'IUk ?B/oq,*P2px) >ъDklv QJh}g~Po!l2;bf 5u )XXns(NdWuo! 4mSS5u9%zylݺ5K$IHjDŨa2p͂Hy@$LT1j"9ي}w ZZZxC1:˿|g|.wY~}tM<-V '𱾟m( !B')[ZZ ,[ Itƙ3g.vceeeȲle\$bYyWx{ayBjƜԜHIΨZ;%l9rbI%/6 Ȁ}+@-s*tIiEp\4M0HHo{y@ӌ Uj 4:CJia$K4ZckAmInkixű$MBAo"łOQ|!`O Ȣ "T* H m_޾'ؠ^W$ CH5?.Òf B %!ku'A$a:$ZWzyZku(t&+\ KWwWy B׋8%/YnhDz쎋 ZvY[nm46}AٷOc[o <~,LOKŴ)S1vlu Ʀ?ӏ "e-o>j II:eM0dhQ4#QqQΝ;Ph|FB`ցT hH6RqA J4r]&g{K4E/f^$܂0QVجFghhp@7Bky3V 0,(mI!K">7<N ^_*f.rFEgE3PP4PSc1y|<$1yYQ]yUG0c{v~J^pU 5HZh0śMq )T= eP`;B|;Hu2~/ K@x0 {'NqPhZ|8Q'b7\8t(/c P՗M7c7QX4IIV߷gZ9j狒^` N$O*tWU0ǣf:Thy5ko̹r.qqF2'}T _pW{ߓ$0jF{I'@cYYFfɈ>㕕hhhDrF=zT/ xb,Y|;SOyU-mynQzZ*sEpPOcǮhl: UO&?} ȷy~w:.B&4:X'.DB2i @9EIjHaXm~ `QzuDJ,q4\;|iE٠n^x)E"Ǽ4EdYv`p V#P5Uz0^"˲":YmG~>$ lڲ1/dh&EŲ *B3I pE7~QKv U4TdZE Ir,@*81FQX wZ e#MC0,ZI{6mjZEEEӋ\1`MvsZ- I|Cy@A T,qpl 7{uNcՙoKϛ;`ɛ`NÔR -D[K3e$㻋0hupH' ÉSN|aht6yhB~L|c%TZZVagIB% ͋[.Wͻ#2d76<Yc "*`ňx.qfE^$ǻ/>y<9:鵰$C| mup6"3g mp6A>b4E O_sBb H܂,IB~pA:,UU06>pCFGk;IV?&ӧ Ǻho-;`&]Ӌk*-}O,2қ`"rsCTe jq|(!9. f̚ /dƍsw}nPhDbbb3 ׋P\,I ~iM(j#I`USc3T#<DIBr c9}n7L8'Nĉ*$ZA14i365گ'3^7ZؼayW]ٳcFP o|,zrsQ˽'֪)A]~߂w9E(py!XgIj#_9A/Z_4niEّNDcuWFQupu~Q@@{0^Bt9˨7?P8| /x+<<$B 9OG2l90~[~}NkԚ}aAr<^r_7s3}ڜ`~]W-s߶?r^*I043` NӪդZ2 , ^W@Ŷ,_nɬ(J1J'"))w<ڡSVVƴJ4s& ZPg2kr EQvm֭ͻR+8ȉdd ܝhmNr 'l;Y:gͪnBʚ5X]^1R.GmݿNlꫯtOWbj"33Ap8GzcWZ-X {^NeA0]~Ab"]!/?`m]}RMRd2%ˤf758e|hG@Q8Ҋ X " i`5Gl SZpjg(Si>Iסpy3u* 8~ sKZ۾ؐtPe0 a0O-j4k~/<͡p(SŪ֋8UJZ(YI&Y"lP %v SN05£|zTk!f"l+VΝs@ ؖNRDAkkMJʵ٬j~J҂Z6+n03:7oݾmN\.],;pRz$%%!555ڑybX`XxЀp80i˖-gϟ_y/=x͈caP̀,9/)ps,!bВ$xc]VEC:HaPdLj-z|uy' 9]_L̪.F߁σ$nEP)=|,f^6 -2q#>> y! $>E <9NрL  gz|U{%2"+w4Tj :mhnM3P5hnJ-7՞55+\_s )roO gN 4ȒZ#w!4 pip}Y^e225j5Z$P$Cbq iIbu*7 F03Z!Ȓ@Wx0y99I8v H aPyx/FO`U c%kq;77{ `:`U5`ڜ9Zc'N (?,5h|{/lg#iZ1pq`aZa66kMM;' &h&z** EQZEiB$IAp8ahu:8 4 9\:x}^|z > ::"]_߄9HM?bWV4AA@V a0AQG֪DGGa a4aoF5mvcÛom]ߡ_gU$)b659$Tg1X0p.:Bp8a.ȃa)EOD$PQ!̂QP%. wmKte%qZ^#(Q'R&/ hq|x\_=ȊZí((fDa(sh:̅|6&yW H9bXpQlnҔ9O Yo_\P5Jm@|l8+,Gp7 w$ i4uFffje$IF$hN;SNW 2j%%1>>uE_l&A]um5g$Itj\L&mmm$iMkfm3gNY7z)lA4[Zw~|nx3**i9g5:yA)2_P߭XSYY86 @f2}B<.@?hdD:(<+>Is~ 848Gg 0WiBSĭW=,8,PvDhD_No-3G֗G=<(2uH's5:@n$!O@x\J!# #m&MG y-ByRK?73V?xy)9thtL&&`6);n;>WQHJ茶 ىEBH@Q ۽{K/Z/q8}tkil6[СCKcA&)!"MMMǏ梢" g… u֡b'ߌ0b|˗.A8AaA>z=X0]ط{"h0O:Zva8ɓ}fܾy| z--^ƽ``͚&0 S0guwͿOɿ'YD<IzKTU51 ˖\]M& @9;w ^,'3.X`9iό\c#>Bͧ`/STa MA(*%|9!Eel2Ď_e7ԣl<(B6'OoWM?X=n"˨&Vk'scqڎlIrsMȈ2>p9Z:6wz&{M'/A(@phMPX`כͦWG*1w}*̱[9YB.-G;g = `]`vŚ]-_V@,&X,.-PHE|xrT`!DeEꮻ { tA3n 8sgS,/k~K/ <2 ɄBPX,ىH8 U%t, F#٥RngfDQ~_82̔RDnnBkIcyrTjt9ٛcy;w?uJ^mwͿk}EdYtR؉چpsq|Ac"MȹtE,u&%_~)wc)<-Dfef _R>;3YKX96:lWWg˚O8ɠrժoeqWԯX8}{oivNt2~88P 4E5)R"IR~?zy}!7wD- | E8;ʣ$·l?{ܝp[Cy IA&{] xfC 9̼K$A om}fCӕTƺ`dɈyJy^DVNFJ&ST2i%IBRU C%dҥCo ePTfY&m4Hd7Ft?l?N>΄]M I_AH*(u/T_^}oU:wAP](Bծ'sbŚ-_ǯ; 𙉅/ҮBn0) z{?9.sP20Z'޾۞DIge zܚi"tcNS/C[)1;LxADd2{`9^RnfY.21B:tP5τ޾6 ϷT YEu( (-1/#Zca2;.gV.㹟q&wm^wյ%s.42!\YEB!$Y6^%q6a^}_+E{[pyg߱[CRԪ\ۆF f1,@$SiG4ET j3B$oRM1mH㸨he5?S7TyyiIgg-{/~r: (撊=V(.A:$e1UQI20{ 8HچO}oUd) QD%Aox h_ jQ( -"Iuͩ Vhd@wo-s ,AFHBfR3@QIcA@L o,@"XK=);/2hY{_CLLRHpQj|4:p'aIA@U(RpA5Jʲ%d5n=3pAIBt@ ~_7r|v1IҖd2aH`:H:A w2 4:yAWoOu STb:[>$ hXD1q/A?xG0ݧ'V+:::򧃏.V 9rB&-H UVp}flFB!oXx1lm >фT ? Gp损ܹexϦR$)h "WoX#766l_zXmwͿOӿ6h_5v"ϑa J`6Q9A) !+gaʔ>8@X ~)"c~͂Kn~nwM')Ominڢ** (^@0h1M¢BZiK{Fhk;]xɒ Ij_$Ij>N#B%wԅrH]1xI@R09 Aé@u4D YCAh -=($hecG۟zޫ&> ZkT\dq2ضtF>r@ȬDVJtc^^1%IcX~*Q3t  u ISI8.n6FHL0L{v;82M5_e ?̙3PUg&>$QZbd ,t,ʥh $49Yݟ*%|d˥N(T d2$ Eɞzӄ??[>ELvji}r. kV'{[ x@ l~g* LV;ߋxo\?C0S]ӍQw5jxލ(4Jp(1Qs]|]zHs͉q-Q0<&h=X@n'Sy*JbR `4`4ZQZ Z*PjM3<}(,[8~ IEQdgpח~4u6g$(4ؾMj㭺:ԩDok\wizOQp$?4,,]رcŅ#@ݻw֯_m IqǦ-ػo?F3^xQ|)6t#|xp?~2F cmI18f#_ A`~5n-ۛW/P8ysbxx˗`=LbM%O5MA/ܹe(,ȇgXmwͿ/(®VTBðD >ܹ~ p8H2PRidSQqZ2I/-r"̣g|ccr {{rժsGk[;Z[N9s\UZ0<8vVTUtUn\q:~b(ޏ1-UáĞ[CR%8H6!8mmo|`,(fl,FmOJ08Cfٱկ5x/Z3׊6R)E4d-AĄ08NQ30Ú֧=tُ]9J鴆$HIQ2 ` &HlA@Ȍ$II|aA٠ooG>6Ql6`d29@ .\Ȁ i$^дČEV@$(+OdBRxط39xP N7n5l͂9 n݈u4:N Ea.Z2ḷ_3덖UeFmnCq^9 ՋV`ي5Xӭ]\Wn1<9|]yc/w|n9aT+r+Ц8`/uq_s*|^UpXT iDwG3},fUV4~؆p0Gss& ϭv om˾ʆ8,ף8W/۬/r% B0={궚>[ֻ+[lT/ZsN3 >,IƠ*2FK3~ _ߒe2|NvmȂXaAYg:(ɇ0M=8ÀȎ'~^޽{Fb$.7o^p8555] pth4|*tS3LQchZ p7= R)}4h8O|x -_&/ ;/~(bކ?˽pԳ?equ+`$ݿX,ip^ߟpmr:d$3rn0Z[NtuvVUѕ%Q.G>x`eoM6y(Ƃ}&dѿ=^B>XY %c5Hk>k-]`7nldSAHGAk6C3d| IDAT'Hu|<^144UG{>˝ n/k{;ŷg_6}, H)}fTjpamm(,…5xwN6]wͿk]%׃<g1lF "l0@!^g(?'22Bf3 /yKpDiuu8`3|GwwYYY(ɠTRR+tc߾oXD"D9n* 76S-΍`\1D=qBgbD $f e= 4 ȁ? 3䲸-/ 3biD%?KHs H1ߣ-,Y_dk>FR*|l E,ɪ.=#=[[Z,jub- T`4 aӗnwvghw|*AC%SQ2$a^.N93qQE SuKJ@ZBI:u j{|N8X$ǁxX_>ܥEzH!(8"D̒NƧ،`=Ű샞!K%0r " `P2`?$(\FOƋd2|x%Aڮc@@ZF-z>u:D"X,omm,*..~555{uHDk4I(СC@RDKK;nqt:z=[obC:~l}%̛{vn}:7o4~X06 = hکe7~ IY;x>5ޓ 144jk]* @ݲbA NC*Cذ|%N>U!Pi,Xذ!e鲷U&AlǥY*fX!J&o@|>?z{ 6S:qWT^^b'FY螞CAaadwi:WQ \ta h%M\4g '͕_b R40c P:6垼HJ:MN8Zg1gNBlMÞ}0٭(,Fx쾛c1ЁOX{R|p|8p/# vL!L^s7t[$.v$4UQqnvJDdFd.IS  ҨTEU`b|j@hА;g.TU_}#(_r=B#IŢqlۄU4HCg ADoWݸFOb|"}bGxG H' LXtt*XL; 1#Gq$>ow㭱1 Y_z5ft&P!+\b}VK=ʱ/< R0~Ă} 0߅7Y|ppv4o|Hokx> Ͼr|ó•VZUW!&P3}^ =MϞ0}7oɓ`x;謍9GOA~ 7Epbo-^[ `P8~GO|譋0$;\.W`ddm6#IqرZI躺|o(2?~㵣na˗7[,HSSSӧ/ fs$8Vk zrx<~^2ł5;lx7em}mسwAŵhio3wZ0c[Q^-/\UUW^y d u  =Gɒ277},)s5ME.3qMq1 A7*s$}m>O.:͝D!K`:^kcbg@ 9<0 a^x Ra@2FId\FL |35 >?NH9XMTou7`m[TyK͜Rn;@%R4P?6̆Z%ޫd yKagF͠jQ%T)>O}!)( f#)8&tJ|BպK@mUot)]'Ml("rNwrGzmP׆u-S)t0 ILd4z5,M i{TU5M:hN ʙ|A׳-GqH&2ިc,@o8 yad}a_a$"! K`ߎqONȹXP4LJl<'AMI6R4 I@Ō6Bi'7ô: .yw:ѺYե؟™ 1mL0vr?AaV^.c3]h>ո{V8w{<Ȝ f,FksLGAףdQgEQ-hZÌiȒv6 c/߱w]:4QjY Wx,7` "<#X<h8.t:}4`I&\nnnzΜ9bx'{8eYVFz.(-- Vz~FIuB O.V;wW^mN kPP7ގ3` S O=35^_?:l";[T*o{G~n"0 ήJW]W?]W`_^J1/7~}d: Czh (A|)N>(@"TO/\xOA*GIS\tHUGauf`xb+A(%G^~ו@0aݒ5h8N :)J.@[Q,Zh'a#d[ Q1J KԀ00S:|>JQb$@x8A001 1ɒH9 ,H UQp9T3KiIB4#$ I jX$ ٞ={L@~~FCQSV!"Xs A)$?@bt74{/;Bf|0 :47e'&#ňN ~X`$NOP\"TAQ2QȀ F"J3iLMI*dI @Hf"{}r Z!t 6HY%5$)73Ww(oh@SID#+>w ƍ7CEd]bRnfְe%|&3\ y3kkQ3M`Iff :Ȓ47<mu_:XJJk_P )# #RKܶov{S_;s]Jlj j$$I'U'Nh4|NNNz `kZ~ܹhT_\XX8,-'b$@+3E]X qSn \#Gٟ?7oܹel}5i9lƬ损Gp dc3瞩IMVZDK:5>ŵ{F4OU2m+Bf 'dEs;+Pw;  1P,g,1g 򡘇`Mŕz =zq_ܱsg1ї ͧPW804͑};DMu쏖ܠJb]LbTG %P2 S(^ AУ@[V2zb1CB[恐3!P9˱IR$඙0 àՀib) z0 QUjdTYAYHmkyrC Ԭ$H+MM(P(T,I"= |LeQ 0T f$RtAV,%NiI3f0 d(΢BM 4T X٠F(|@i:=Bkdr֘{$̯0\EL"bgQB}$ AHffF:0UX.fqQYAxnCC= h" $Eéo̹߳zNeV4\ѹ:u1w^[[6~I޸a삀Q[ r}> e؇칪y.?;Ʋ**w|WhXaA)\KyA44-HO0ӧOO4766V;U{{{ݭ7t:͵LpA]]][ p眛>)bxyosqll޻{ Ōa"\޻=:E:Fn}͸A!J ;vز6+1/x }Wӻ?_wͿk}c'ϠhD7` kq|| H$CCc64dU,}q+_ol5cFI@0dsF}N^GeU70D1C@ 9Lkt_>sXRYmGQV^!)eFs&5^x 0?ZfVUNA6:# 'b$'A aJ 6 fV/Y$A^Iv (I0 ) hA!y V#^ "1ަ"IfsQI4bBQHD*i4(LbF}:JS)Jh41d30 5Čhμ5uVdQp҈d Y)=fLFk*ua $t *rbkL8i$AULIe /xA/2B3>0 `bY@ VlW(FHK:2\.7.yIף섓X_{w_v M6IA2mַ .(BnkCaYh>j\fD<* |>/>'rnzd^?ؘ;''344%Kt[[[+rrrc%>xJtP9@6C{ښ.䮮bq8Ǐ$Ipŋێ?^k6#tlp8|]*EQ0)bY`Jz^$ T-G4X| e5Q|t#c(,<[݅rylI* BAuR Dd+d-b(Hyqh|0K)Yg64(V>?!˳(a K16<EP2q QBQA%}qتLi G^.RBA3$#ӥQL"??yT@:8$eH^U4 +L˝붦c)K: IDATBF4jIJ({ w/y0h% P.k1/>nYI $lDmNNߙ ;(m3δSѪ}Q[A!;7ޛ/g?w!! ['䜜9sR& g{>zn{9Dk, uƆs=;WEOiV+ @cY6YZ\ҚL&ݱx!+$ qd- Hj.\,$ϧM)>mhRX6JH J>Z$zM,i (@6$jr,$A`94Cc _ò;tg5 =Oȉ`Bќ@n~$Z +@hl$I*˨ v]i MQAt_Z:a 9P$m_$rǗz@O)>xN:9ݻu% ^<^0BD-):8(gݠ𜶣]% HEDe Ʀ)Y/}?}g|aϮcriͶ#JXY=A$ׇ :Аh4&Ѩh4&8S^5eY) :^oQP^˲LdxC< 3%Dy>_'WɌFo>Hb:q ~_ D2l7.Y:2mǛшdミ9醪ǎڦAsSS5k\VZD*4ͬ!ƓNOv)jM̞3'pѢ,HHMmЙ,y٧ѴaBNo^|]&* {RJEukk|Ձ@< Ɵ,JHPv8i/u# ټWvLۗ+zr"A2+̹oמC߬S+PU=XbXz4<6s4P-DDЌ_!>@iZ0i^`2RY5$,ZiFJ!jP$hB@tM&D2q>b!"i#L~d$ (XVM䓻CT}yr:NIٔ;4 ,nyṟg )xsn(ZOCjFۡhkQ1-Skk4`S}E )0YpB2&b!zƻD, ?#*|:ʧ2F@i@chI|EfsT!^wA:&eA[,|C=7Oر&ғ$ koEw.ꖮƎ7򁻖z>.rAEme|4 Z[k5 ʑ $[t-dY g6"B"}WHt6/`*DDs\!i c:=.c2g9NXփt惛NNYPHt:~di F A.Ih՚LL2eq }a+HD˲ :3a#IB$oh@MM(dL0op}} WQN ܂a4Î:Gee&{QSSA J}d;7KASG߆/5*ՅU @.BZO!U㕗^1;r4<vL,ykb[PVUIy4б,$Y4u1CG6̮Y1=%x| 昀7탸ÁA)FˠK @T@I$( 2^Jdy7_`n fuׯ}M7~zI=-O-[Fgu$>uے8~ .+lWӴ bV)YvJj-9P2iz mowQX2YV hNZYsa(^y,hQMh zc$H$ eMeH j^k4h8B'MS}GB䐢(p8EJCEdqPetGgКj(px~^j;6cdI2iD87QE~DL$?4BHh+F8A4g@J0 = \=4[ A"h@{K@?Rd|MU5Ka2-n!4^`h^)YGnpk|T Rw YP4gA84|I?w(|fvm-l%\`Y$E JOe6:O4|'bXp`xVq[dfiAȲ̜>US3ٶЛ Qu 3%L`d(7^$T*eCGTEiZsehb9h<ϏZ琡\$ƷpB 5H0¡ u|yYxyyB@ XUl<@,JM$<}|$e{+91 TLLX>SC65@>XO|tk9}۵"A2h:.@`,I#3Ƣ14(-J};>i+`S1Ȓ VPLȳ]v9}m-oIwT 6[~?kf}1_ez=˝r 0۬#U4 R >: E)`֟;8αO(0ʱhåCہ5kei4Bc s**ptQ{-*QbfcE<,;aVVN8].ٵdz1EA|U˖-;_L&MSNtwwW`ZG)r˲L;ẃt;ahmkMk `޼Z@k[9}Xh!|!:u tm'OVaֆ?3l*^Eo0H675eػ?~ؙ&0MM-$D2r^Jz|W/)U#62I9@&[w<8p8f!xj Y'ЖUUu'O(rڹk&\W;g6 # m7~* i4Eu~kU$68%+K>*mٷV6hc 1]j&bTuh45/j.~ė"rXpB^ZWĘnZ3wc@]?^Ⱥooqzni: (h4^"ˊ$HLp:}ZEjT6% 4Iz~0s:OL|A4/g(2fuOr|Lem۶5Msx<TUU-2̋ϲlb;wiӖVn'6/g @ bȀEw*+,Oa4y#anB1 {{7= o`OxU.*CelYHx"~_p $>EHBU$h1bΒq,! ő_Vy"lc$T*Өa$Ȅݻ*(gIMɒo˰*JK`+t`^J H$ŀpf4ߏrMf A )=]m9<75:2q6ݽbh\noTP6]3 Cq,\<}1L-UxT9 pY "aM"#(vPQFsɪU^lJ㸊AGmm'OV,+4-͛7j( [.YdlUEEE >+bIuttTFEMӽ@Q9Qgf}ڰtbl{::|77y}m p(((D" hmkMQN(*v,+-=#*g@&#yc\dͯoj|5|[}.M9}7L6 h}_6SE7pO~\$r EA |b},Ioy*IuM01 R U[8!lX}B_ 7ZLzۂs/_ϰuL,BcK7Lf{v6㔽ޘ/:>Kd9^ճ<a iÞ ?77Fy0,6A1cCGb;Aox%&C#U\qat"53tҌd2pD 2^[kH$}Yl{MG٘;meYƛd4 yT*CPdvLALAsfԅsp"ΔmmVojbDQQ+K"FibЛFiY|~?I3PMU7PπZ458|8bႮċꝹtzK/_~tҥ]]]3g:ydUMMqҥKO8<}t+ՈȲL4-O:w޼yc䍍U p-UUyQ@6 zށ^Te;#QhCEEXC lFgg;2Y`.53G$(*vaE8ub`4>?y U$a<.'`pQ$XX1D@}Q\0ف;nw_Hv]xq?ɓ$I$%{z7]kv.rt|ovU+{͛X!KH,:=mP ?fz/֬Ywpp(Խkǃ҅dr$^/|4T Av=mC>UOI$ۏ?BJ@i\R&KN?4ø!ºn۰kOnWd i鵷)hfjhywx+dRUdP-gs|\4Yw v7pL5QQ-TʅL+TMhVDZAccfF‘Xlp,̞Gʥe :/rӚΏ;Yzm|uuuaܹsFQ ,ˎ za'^^_[Wt)>Ei9> =R*gVxD&KAd<'̞eKzmMEE(dPˡ}^;g z;蹰r:CS DcwՏM9CC a418yW! iP{$0s&TSyZjjr8Ph4̜|*ݻvOGC4M}.y$iqL]")ce>9=yXd0r /-+dX,3Jq#Y5HrB ̂Йt*Paƌ [#ZiV 7EO4MȲ\ a(Çp x$IFcs`֬YYfy^5$INg$r~455U|" BkwUJTWWa;v;sb  `kya~99kmƿ遗}컏ܱ> }^"S_."I^"ѶoGoً= )!F'U ]} }߁-*]?DmƳoAR'=f?t:IDt:ݫ(X޽;˖#m/ww7o磌v {)@4А?hbQ*I! yI{ CCu=F+ܑ80ՅoZ?|*áLd%g$2;0PA `d;ǿiS08baG^/ְ usL!7̀Q[ u5lġ8(njjEuk_4-Eɘ0 1t4c8 fxEt\gSg8n8n]$ER]a0Q9m&.[ WTHo- V|cqĥ ;Ӎym;/y|VEQ拢zBAA\>@IIYQRl?aQsg>zÉY8@܂"OF{HI $( ~&G/_Q(j #0sOYdI}KgGl=,ve۵s}Qd2iTsmp/Hq:5o?X\/!; 愨riM؀j4 wI# *#JCIEӨ& (cŲWxA\N!f0$ ͭ>iӫf|hF޺Tv@}D[~~C* =JfPEmBoAGԓG5*(޲N U eQGyLc$IY1Zy@foQW"˗/O3 Ӑ{$e+y^ػ'z2кM30}G\(Z1!ɜ6;V~758=Hbj5UH `?l}腽TMSNvb70#LZ # C1뽁ay$!L#Z!n{|MRY/7j'pBbP4 hz ZY *|ϲe9"I* #DSʋa`$_| PLא7'u $! ^(Ic')Fq4E]={|{?UoXUE#ٵ͇^P3ك;_9g~.#+4ݙ?V"#Z㩧w1<]no@8vx7ڙ`;޾\7n=t:`0=j4Y .{.l;^C]z,+k~n*_M AI]xz ]%N4<3!8mztDx(MSi4MCdQd/|3kVw|w" _VYUQZ 9.j"8w.۝FήX$%4lq0d͚5C;vh$.\HH*B{{;GDrs#=]-z|x5 aEסbηpj@yAHRû}: '0YճtɠnR>VH"6|kYL @(H0KLF=dYA<10c֋ $~HƦ) # @DU hxCgTUFT<4AtBA"@*Yt*Yh(Z<ZQp.$Q =f,&'QQ dI-mR!!yqj3@[_VYC_whFoZks- h24*ߎQt5uq@Dމ]pJM&uժU7x Q? X`Pmm-ZZZf;9stG/_~ɓ---3:::*\.WnGY{ۓɤIY0cρQs A$ @(@<IxWtc_f L&<JpQx<o~4mI'bڶ?~5PvuwER{ZE]Aԭ-]qL+5`΂  m*bp+U`VH 8 1}N)fݰP (0n+0ǗoXjMϛN~{? ȈNq\$J̨o'cvG@`B$ez藓)<\dͣ,CJ4`JE$u5/,"pP7\Fh)%KK_ |\~Wk.M-'{62;S1Hߗc`^0iYVVh JDOCua)(DdDwSB|f7 C?iI4#LGS},aN~U7|tvvR$ xá08r=ox$ޖD4VGcÓdIEr2mK޿'WlTCOjI)!({_0kVv`pp9/)YgYld"fF:PN'X,EX$9K&ˢr薛|,/H$<ϴxrQtG' >FƟܵ>BZ^ 1B%PY;`y$ bFBg= xuh Ɉv!%>.ha D(#IX4JFy# P.B:ȟE!ڶ lA~W0dt::޷<+tz"x]c:[2΃j(!n8]@ދh$W]??|̩F݅)}4L& Jʫ岩(r~bzC~)0m/ :N!i_RrDւB y'Glٲ;~ǿiߟpTӴt:]zȑ---3Vkv;aI8NzT*Eۏ9R( Md.MӒg~iX446Zd*ϣ F=yo;ݙ?3f񠡱1qޱ/}1Oï'/F3]ܬV3.7/MM-`Y94]~~#@H%)^_먹qZdYC+V@ͣNsdYe-rO˱ 4 :e ]QT2 ?LEQ?{hhhST$dEKi0:-V[7~hߟĖtړS_4_6a@T\^nTOK6Te=O]czm#Df"hii4PMVUJRT2SU[nԇU8J1#!+EÚ5k^<iZQ(B(jEAAFQh4H$p8$o dk<\fBwT4J0(2{zk,kz Չ|VG9\ԥ M0 t">CKѯ]ݷhvN@:@2hBgK+҄%Lg&s* LϹs'F:|:|EQyEoDr#ܷ7*m6[V[w8zS!H҉Kh0*E "uIawi]ef}Xl0,a4M4X]53m6x [[*p*C88_,K8=>={߾}_gE!aEQApGQHBUU!IrUd,zrDEuƧ׬Yshnn% G(A1 z"(ܹ1sfu~LbQ ES`ڐJH j0mZe~Çᥗ^g?{A_~ l;`h~,˗ogM:RCF闛 HP|\wE+]oD<gkV SsX 鍌ZW>'`-(^GӦt'|YކMD.41°ED!_́o= I> ÖG.gdiEuM\wbviݚ%YjDD"II: TE5MK)At ݷzj(JcjHFEUU |4#;wXi#"=qlE*EQNB!u[}բjf5t H!Hi4![61@404x4g ox腽h3p F F%) ) $BH)=EэY5u |n̩HBf\n$ 8)Ib̭$II0G9&H<H8 D3LV+:[`X {]CL|aY8n LY=hTb咽 Фov%='Vr5sBw twbL.Fho;3桦v1NG1wᵨ U3~&\w# %H&RHQ2erhokDɔi(tc?'rפ=ntoo߾VOʲt$(ZD"ayν $F̑ $0uMJ]OӴ#VI"❕+W.{'"UUݚYFtDiYfn0A7 V][ET"'Jc#kŘ@ y'rzaS=lʍrU\21R8"RN5A~ꍜJP쒝VT̀4JgfF#$<S;}mu}xWT%HHBX4AHs TʜVUae+4&NE%*/Kƺ ˍ3AC%뽧8=x/8r'W0 syƍ$Ii+d Gc53l{|OL6͎c0[ aw@Tvl-f1z bV`fЉx$H(C\i},,f@O;ҩDDW=wCHv1UQ#(0.ewMlo?ɛo>293Y`sϣ mc7?}3DEUf⚥W#ǚ>YZx@)d>c<~pE+}T}lU+E0 }- ׫<]^1߯cǘaHt\ٲsNQ0BHXi÷fJw%M(pӟ4U#7A_av> Od~[nUnWzHG 7n{~`§Aqe>=Nt/v|\n]ȐBV84.U0U6& Iezեzf ȴ͝g{嵧iz3ؽ7ݯ?;(_-8[Ӵā@D.}n$o][oIu:Vud ' :˥2`F1O "dAI1KQ\3@;vp@WixC@x0s`4>1YwEJ #@*9[~9\+@ȟFg'Dғ\LJ1 7Ǔ5 !Hr'!+,RO-s/.؏oGa z.wC߮]\Qy"Wgں|ᯎtoI f36x[SIINf66ɴ}ҙMs;;of]'m3I^ımlv̎Іvz6us|/߾S9Z  FiyƵI8)l) Z}DxWQT4,C'7צ]>K4|B7kWQ^[^8p(]V!`%_,jƠ! ZRy*È+7:y:T*X\9t_> V5l637$:ZNt-xdrS7Dz^1D<OG6HZ`4"#^"‡ק ( su| "'zݳ?cbbb'M;#H&_[Lt˯D>" H1\Զ۶BR'Oq鮝;5$gl@sq{")I~z7E"h.BBVi>ghڌ)T#^ʕLmaA x>t@v*LYMIa`ޏf8%TUVskN䘲q %0t:,+Nr:AGصdG?9?KNfkSY?y~wvbu 6{ 9ߔ> OaF?uRۛPP8ctkh|ߗiٌi-tV^uQd}(=[W4gZSQ?ŵEeio5'aus. Vb1z[iMŐoBU+Vœ (Z/^xv澎XS5'cx(Q7΃ix|{h_|7oQ0L7N5+\X ?裏ݱcǻzmch\jpb+ JiT*l)@n`p_xIasb1y2˯,ujr wm߆9EEyuo< z[/BK/#RGB!m< IbE:;t`^FYYm<֥f9/@&@j$vVwt@BJeDzY-Ҕ]C|{cŖKP*(ZzjIxO9P({OmĆ͛7]7BSF>|YBWи}I#onZΟyu׮AyyG|onSnSF)V)BF@$@*NX*btqEyx씻eroFntom)XZcr<zcs/92JP ?z Z􃛎KkYP8nבm.@@,ZH(hg7dgb: 3oH,Ah*RMQt5E3EB>߽W~?bTVlA΀O y7,e=xPk(.]pȏ}フIJ7?]v r;h‘B,U`_A΀ގfDAlۙB҆CglM<"!߳EBV"BUC,C$9t m~lW8gb w$KGB5A8-[ N{e7CEw?4|f7 rY1)0p Š0f2rrsQR8VRZoB;{>LHVLVi:ʪWŹ140z'DG@^^F#Hv;3*طoQT{aYbRӃBIi N><(> }P*orZDYPﭻq^/~P(>t9߼1t:tXf.\BSSs] :ݷUa' a߁O`6 X|zitv_9l0704W)$)QoF JU&.\hņ롔HAz_|nǕ>Yr\'^-{KW^}WJMlc8s<60<:%X/#,MS_̶*.yf}k44~!@-q>+0Z0('V4Z,t>F m~t |,QPq10 Q).PW @ ^V˂.+hLX)NF# GbVBjбp-H0 Nw]͆'&hn-7<$>/(=պ<D CU]7/ |DcVIBXy&skvt6!6$s9Se"kJ8>nP(B'<8>? $@E֬Z(Xy Mz3p'4LMqdOD-,4uexmhQ}E5ג]HR쐈3~b&Y8: qGV|PرjkzZC^KWoxj)&z}=C=p >"!04iO@XyL<!DFV6|;xT{7~pSsNjPDq4Xq16!n8Fpp "78DH,DPI z cH@qIE 3nC)(x>>7:*DzECECJe8E8Kn@T*CZ9 M'vNCb3-ɛc Y9Zc"22* b!PJ+8~D"!rPZ% YsƝ{}9pơMEc)B^aġ?|w>|x<^m0!W2_+T7ҍ'sak,L/X,ΊbfS4M(##'8Fә900`DFq!ߟiekXٻwY^Bz ?}t>s,d’b XۿƲePv5Νko[BYYIm\23AŢ[7?x#+ 6IHIȊC ee8~$I+6mzp͛ M/GyAR)Riɗ HQ/=͇D"|K4ZLk O@&W$Lz*&e@$@IjUlߍovh Ð+3p\zjm&rqJtPD9vRAh4=f-JY~dllL?44d(*[,OȔBl̼kdfGWWW80IE|]:܀P$`Rėފd^􉓧~ZoT% XWxpQP4׋ʊ2|z0b:EezopLznޔTsATT H)yMctd):^@`^%*2_yTЀ1;+Q ɤ\]oD4Ϩfl:iT= !!Jo/  L T oč'.BN<e8bd ːnxƼ ЪAqCKXv?|7 !EKjEʖaDz8y#.Dz8xK*Ɠǟ?~?\ B¾w]T, a߻!˄H($/3yHe2Xj8>- h< CA]X1bP3/-QQ2>xɇ p#p)^;"+瀍t:_ŘmxbXLȑB AZC!HXͦDQJ z}xhh(+@PĪ}>BnC8\H__C i}t˻ىnǻߐ*1RO塽k|"wD(ry|LyQf3Ar?Cyfvߍ={?ʍE" MnAGitZ{.d(*ď>ǥ03}~wR) Ik Ka"a0ǿZC*9gceZ?_061|IQe]7@ND% =ϘY&<ր,I$ 0L%~,oq/ ^]_P[?>}o>yx]NJM v4Z=BX4! UXZ,U +16҇?) eШsm$:[j`ц[C`>I_SZOp(GR/7J^xeyqړ\8lH*L\I$XNNθbq X@jjjZ[ZZJjjjZ@ŋIyGR= ofǷlYTCI8,r[ ֬E{[ k m5-aPVVG~[ )⧱U uq{8}**ʓyS׋c>GްfkلwlÞ{^/.1=+ˀ u'^kN Fõ%QĤ⎮jVPӯ$x05"*LaQ;.\Jr5bzIY KH$4\sN5{oH8yMWn~!X@"䊦L,Z+ >>-(XLky Gw͂b)p{9/![E"gI14Z%%.{Y?*=rQg brLJ LEB_unn8>' zae0MmTHK ^7P}c4t:PT F(JN%b BCT`c͸sN  K~XS+Ɔ?%2G~3֤ҷ︸oWjEQxnX{p7hP1 zۦDB )! @ ,$lL|H3+|7 wmFJ1lp{^xN{t@s?s~_|aշk=!tĖ3 bIi9c#ri IDATGvN.4Z2's"!"0"a?F02P +'Ă(s DbX Xpt8XR"<ρbd-J `7Q~TaTjH ~ mwl!곁gN >&?MbFc&&r1}oUf&N_y Iy͂ wkrtl,׉cŰfmgw*E0@NN.@Vl)r "'k<%J-Eo9r0PTR~~^H9uڎSphN ڌLX2 /J@{Da4=1-g@$ [#WVQ12:\Z֢8?:ax8.;??ߑ?Pj}[n=;_·T*劊Ƌ/\PVZYY S … K@HSSҵk6pS^#GgRףvyEHEb`ۡ%KNL׏!'TQUb ɳ*ǍT&2uO1ĢsRTj-&L?p;͎_FR'*si^{<=J)z.|xmTgb| 8N+*`r3eeefpVmVTfUbd|B;tZ/"7g S6H՚翀dsjMDᓊt:pB~Xe(1D ]O?a1PV+˅N7 @xXZty#r;nى<%MK@C*@ C.JK0tua! !K &uDa^.b9\BxtF 4+x#' [l nyʇgT'O; Qfd>W^S qt V~ý  !"E 8œ?Dgı\'@ }ɄIJGXʀi7s_?􃛞L*80:W"ecE$/>쮄+dLQ8 3M$jjfr!Iht()  9&1VCCecmhP-˳"&Fv@ w" gL< u3V_ 3Z.+**22  GE bhLd50X4jgf~.H\ThD|^ ޅrx A ՗8Cǃ{9Ͱƕ.S'(Tڂ8Dz4" 1 Al82gM3[GϼqT8LE:ٲ.0aCW#s|p4#1)˳K#EBqC '֤˾w_~7qhf#o,Z̀L/"%IұēHL۱jE5j#<(|'~l>lx\q\vEEАE"jjjzfÑ7j2<4MDū1}OOOQ4\tܹsUCvUUUS$IYL bITb]@oÐ@(m[nvbjb|Y9کI :Z*l zgƸc RR "R T\@cՓZaAj]6V׀10x`^[$I68,ɐTWWXGveeeW;w.ۓ()))7L~H|>BaiQQѸFuww[,@.+?j7o]d"џ ÀFFKAiʸFN[w!*J1fw`ǝۯ 4?}k-PU,TIDdT"<h5{}#?STNX4@h,{MfQ.΍ׯ?wmmS7AGk F*>a!X1cjոǜSaj ӡp}#M0gU>P1eEy)"t1&΂\cڛх|wcÂ<2y~#f* 9Rs3җwU)b pySْey4R,),+##"D"Va èY1Rɔ] y4vl ;8'E(| !Nͭ!0Iej 8d,5sp “c B<+M9HH% 1x .M<^ %\bӟ?X0@<>U.vKu $R%>AHJųr9Oh<B$ģle>+s!W|> 0Gc6lQ೏D# !X\|@ rE"pp*')^ T,ңy-XtЪWha2傥( =8Ғ ao"Q{A 4O(&<ǀw-7 u= ĵJV$J)r-%0nG!"q(ls,  I/< Zt5,9I Y i V@Сُ|H$"IDQ}9 12 ƄΞ?3-g^ R|P@ @`ޗZۡ]R^+V+0d$$J"p)FǮ$R M_THx"Rqw{3<؇`A 4i 9bbXk4#S",K dgg;~bdd$w t$Ɏ:l^-HbYz_PTj,IZa< ]7\\ՅK(fl2v&^d ,Msu8p* CPR(+ŖK5W\b6}N.#P(-^؂{_K[ 2 9#$kEXpMݴ NMՠ(jpu?ppC\Uy-^7Z[/Z`]tOK q4*MS$yBӅdh㟎&o"a:F>`jF!',1;s }byۜVď5WWZw++!'bu%?v*;2@WDOij/ZO$x0<&78b ?L=eSAfBې(G1o=gWH׬{bd"GS߃a0K⅝k^ooP U+ZX"!eǮAv wUrP( (DH fMy^HD fYUu8ЬL!i?0pZW1-3vØoAIThAdۋuhƠRϿ !9Z0( (* ׃*({dy8 (*UkjLTxBCn>D{oRPP$T$طS׉~lJ4x(;Q܏@^ j$c) Y{1lҴ> *Z ӖA)  {REb~;V˲BөH$1Jr8Ff`0PTh4*ikk{83mUnv,Z,[lj!0 '0,I2dr~Ʉ| & m e $[zUjuK-o!3n[UnvI ,ˮ?pM6 ] A]M BvMEQA֭GO. q7 :dE~AhhGΝ{ IZʹ  LNhk?7o؀#.W^ +r !ɥhk?wM2 "$0wZ={Sή=vEw?u`hnB9⵹{d!X'y/xdMXna¤y'[LJ;n橨}a]mubu"-6Iѹ P"V0B,2[ǰc|G3M!i'д&?.:ao־ndq߶ﭫEŠܢbgpH(:S#qr)L<,#oapP Z0e߸ɂ 5~ %1j( B"4wz<2_xY"2DCj_ XcSwM$ H'$IӌB.Je2ɨf!Qgj݈AzճtR^ =y Q61kaϢj8kp1ϋIvKQ,)_CHPq jO4Ɯ,/?>+X沏kn *z^}!|rp1s *nVYbAl 2E?4z#tc&e@4xk!X~^|zg5Rx:1DA?;MS&@G{v:@v<^"xÏ?JRT~H$8Zf)eg=/M&ɓ Fѣh`P:SI$&TT@ 2 @ Ehb'z=p)ex*|QP.J @j5y(gB݅Ձo_GIɡ1pO̓8 x.Q+)/V[9o ۉҟhAB$+Sv˗7.YP_{F\&Z3Mx\JߧeT@C/‰־ʙ? )Y(iEI,Iy"L92]b1o@402mPS3M_ZOK6an^ZQڸJՇ"nE&G1 qvtcToPplл} /F!Tƪ 8@89fJD0E}JXD/Oz`+@ . C+Uz]g/ @A0IdAXBajS:Io%T&z9R9HL<W Tĥ4˽d7"7E@0 DB@_b2p2"A{<*jMP܉><sykq YO(䗀 "?BȖ( I2"O޾8je(lxG}=̉rhu7PJ X*:G]0,@`c~9BQu=FRtKy X& @D\9 VdO7Kۛ$zۺ!Jr9v/S^X~#>سk|`Ӛ˥dM2.+?qt:.H$"KhTx=}}}e999X,F~}IIs||\XX:`0^NP9W\֩۷ZrZ%fyXrpߖ-XRWkk+}ƹEE8}$ .77<϶n6;X f ~A&]aǜ/uD+9-=1 y\!`h9 17ޞ+S.b`p:2P=4o[^3?֗ 9M$bDz:pcdQPq,癦/A;cLR 25qhZ+nw|.؂ $APRZ:JJk,- lD*nB$-"Pb"$+.H$ACQA-.@@AXJPq)"N |)|P },8[)Q"ŸimzK?J+,"-@@ㆻލ>n@ (GhX@_w|*unn'Z!couZkD<Ƃ H$RK4 5h^$S Dy>''e%2ŗWvg~d(҄2Y YL2OUcZ^ݿ{?])AKd(,YUjS`c Yz[R֡A u?+~5E͝T*g566^*bY^xOjO:.k^8Vf`a$bB:ey`^P18gSirQeJBu53 nܖ[:}X2G1i>ӱu^Ir 5m0@:,3hPPZ9jjq).ZfC.q!!zQ)|;<~)]׽R{tж 4 'nTu _=eD^ ZeLvFKY!yEJD<+Lq4-Y*ssr\$I $yrA_b+aQ+` >B(-++˱#BEN$z zCxOE p*{'Oj"GQ4< &ma|LYqdoRE@[p;9T +y  _Gv h@B9 `P wP4\o]AP{c4Rѥs!)/@_ad0~}tdˉh/lNJni)K_NNh"bx\xhT^TTә=s4rPXX '2=|(bF/`0)aJR++BvDBYR a4@&DQ#J#Ly4ϋY 3ؼ?R28;!lNL 3='l%mN3Ebwݥ[ɼP˪w[br b_㸇k&A JiR,U)!@@$ԓ*tp 9*fćA CRW݁.DX Xkg,U[~gtK08È$QX];M?ݰaT~v(Jk' kQ$~%(JAH$`0nD*WJny`kʆ$ڈ&|m,ovB{!Amn1doZQ&"-`|tj*XM,؂Q@,[ Q$II~5JQyu,-d5$BX חL5S vtv~|vٝI&m62Z,l㷈[n}L_1< Kb|b+%9:$*UWϐ22{%C~[fgȐ%cqdw|zN}A>4 Kl, "c8j,!w b%):]vV┃ƌP>> ϞB Z[g7?pwYToU;ԅ 0kt4`[!X\ 瑯asGui!(8ѓ_ipXITcr(?\۽-g Ы4EkuO*OCh~̹@]rL}%:;AZⱛ,ޡ/>|!m $ /IT0d"0") D4OtL>IB|$IUjUTS$E1&d͆gA`;FP+ZsqvpȡsQTP b1:1 Vр8}^>76 Ay&+XَL (|g8,v$hԩ3~4YOcD30it#J\H C7a` CԅIH40#7?9 \d<ǃTIVCIĽ@KO͹jngXbxFH4S6,C^̻.u=&}L_k/6\S`FիI~_ȣPg$Qh_x=zyr{ v|uޮ͖]: Vk.]{2 ~z4mކ>g@ KU8Ml8st?8dBAQ)E4C_aJN?5>gi^6,/f!#ȏ\u JuG?س;kDՔ1n+(֕,JFsIJ ~},iT555hTbŊ n[zuS%v<n[޾h4zV\p8/))+AzxT3 4paSvH$M /*CYi1|@.ۯͿM{?EE(-.JM;W߈n:lXs)oHH={%d'%SI]0| =dܥؽg/QQYcD"r(s\f_)N7>Fm- 0&)Z67:^~; yPJAق!n Jfp߱͝o) ֯0c6Sԉ.?a,嵏.dRTu]gwlQPB@eG)X(җaQ#7-տbwulT`GDd HEy=ă{*5>6<R)E 0"Tj|> yT1>dRUxe$er0qցJJNY\I0H8|j`(gh5942t(>QIRuWDoWj9~Q|FpֿBX㶣jko#au!ɱ(>tl$4 3KA@UgE "&zڦh.NZސ7QZ^c톻tj:V7@e~Y{J!:$IO + ϶TV8oƎX,&?ydC0T _4`m݂5dPdU\z^imM9&sGL i6P u",SL e+Wp /ay&ۏ'}!Djk9F9Ӈ?~C/=8xWS\f﷼&^m ex"-bׅX4`R &5N@!!!SQ'o`qi>NưqY.8Jܼd r#.s0w~Ԇz Ez [¯/v^)^?y=Q.KR"Wc$|# PWDQ c,Wik6.?ppdhZV;z80AJc"BadP(Tg\^d@V"Je_<1ܼH(JZ&Eqi1!10^)u"XfYW rrQ?U$li)yk|hGi7?\ /CTo3ߡP a5gw}Ҥ.{!(|Txu nK&3Q6 BR+8LJM5J`%%Q8Lh?} }Z]kn^ќT(}l2snٶ3().+1s <σ0(1¼eoCaq1QYUlL`Z*m`.@;دO"ɜ:K1OlnTQ0<մ'p(QW_S^ޥ_.v">8ۏ󨪮yzMn }==5Yd͚5={df EQ,J;fAAɁzp8VT!D-^x yŨ)ét>yd N; ܪKZ{zqǦxq|Ӎy ixW p8b1q&0H^B_nn>/>`VトB?EtttcQoXJJ:/lZH514oIM 8V0?<ChFc H$ _uq34C)x TTZ4-(߾j67+zCG{ߏ޾ޤB&[ $v}CO9ݍ7vJn0%u(jqv?sA5<ByR-풀mZb^-8UO!(J6POI/b~vsȢSmmE]h^k/&J ^x=N2.m~K$~ktIR4Ոc-qkiIL!1q pE1EIXY=t=*N|$hQ Fu h/p^Z1 aJT$禅S9ᤵG!ͬD Oَ/@abLSP7Io42xƏ \}p$2iEtuxMhh\)FU<vXuz8o\ȅȻ 2z~ @e E˜<@{ X[2&34mBO9@uؔw:՟]"ee3Q:r:`/D,@,2ŢFB՚E>QaCC2x\T嬒|B ܰf-?<r>wp[?ȼ.OZdg߹<[]QG^g} Î+a)_tEry㥎ݲe;w\O@x<lŊYXEsfnZWWWL1={6U r[k֬ +eDZ`@*݇ 1{zaL'`f ﮋqoc AzdcI]btҲ`F@ugZy^PCrzt;6~J%`5^/: HR58$lJ q3¯~ K%uF={ذ'NFcC;f#0i`w8qaFLU2`ٯ!'%;[F _le'Kqc E#vr^-ͭ?j{E% 41LE8"ȃQl\Z{^y* 끟60'b2@Koui ewZϤ֍چ~N>e &~'HIyW;oc }P'Ja>sFDEU2 6ޫ'J&I!{($Éw>[pt|AEDaa7F_Ekq;R@_7㳓 QQU;/VLG;^H!HcÐO,a+Ѩ\&FGGu:]jF6<<;::Zx⁞2Lsgޓ񌡨v irM݆W^-$GPXr Iq&v@"dő#PS];6`M@8 p+JUWS.g϶aP/GQ9rZx׷MYVrsׇI|q($Z-[Q\RϟCQaќy§ n۱jJ ]EvBv_|Is*d̅ZLhXo͎  06 }ם8ySd4`tl,R\ +yx.B|?}~=$-JdƖʺ]#!Te6.Wk РD1 Fm5Bq($u!C`k[<嵨] hg77*eQC TՈbȋs[Yn:{F`,$ B>p?Dst:(9IuJ`t$yqdi8rbki87)eӗIuz9a3>;ښ;,kѦ?Yo=&yp׃UPèkeY(Cg[ JFQ$6!Nl• H7P`G1>`ql+pCA,RHE i9&lc?^CZ{76ԋoZ}n憕HpL")*7D*EK5! ̱ 0=L"CF ɐg630T*,勐gƸ~ :CJ¦;J(PI"VYQO~QD&SBq;aʛCP#ുX ΎӸq/i](P"$_iɐZ4%0TFfh@HDk^p,\: ,^B:g\M*dYv=EQ6a`P)ǵn:;;::: ,h4>?B\ rx7VX˰~ .vwoi/b0ԨpboF)0k@ (rS`e(+.`3EJ3dE,R3Z#"!U|+MY> նnO,P3~ N?c3AWy?08%uuf]躈hu:]KP([Cb`0cq㈳q**,3Elް![R>9v2׭-~IO? ߟm-8q n2⏭x[u "X\ G, {uɞ׮v}|5g$vFO%^*@BUYO?: ɽq}HlA﹎EZМo д$ ,Ob swlt/Px>`I 0L"leM`Eumv$AQT CEBAյ0` ANx&HRVa<` B8& Dqch@g-)mg P o@ԛ/Z,P 9i{r_ PITǻ>(h:A8p1Z@Pi}8{ mRƘ5&ACEU-*jA$"P4 LJLL,$8@$hF ">|!㭷 }Nn2J U}Z"GО(kl@WN;ƒ4yFGGS}P^(6{X$x A WPXe5ȓr xmg<&3&\6 ^1Eam}'oWfpWŠho=|E]I;;wq\D" Ǩ|~_Y˖-mwwwQoooNipoooEIIN3Mz_ęFc.wvAV#c8~r败<\Egg'"e5addu55طN 4I|2)VwǓ4t23Y.E.<瞟Sǩ6}LM1`g&vҿ9I8x%uC-3,_3@c1A}&#\e6wf˜8}E&f)D;qH-׋/g(9}eYqز/˞ Q̶=H#vDZ|Ob ۛ GH q8(Q{M98S M~nZ*Oa|Z[z]JJىʥ $I^ ˈ0ӐA4z߼䦤%)Uk.QV`b!LLBIH1 3-?~rKB1')lHCk '/sa((V\ R/wQ{vA}}%; ,@J,a%Jplgζ6X*k.['ݍsb;;I lRnSrfb TTfx|r,^eGarM+3=@)yk:Y۔cow.2-~LDxrk-Qo ~-^FDžqXm,(R^}ͫf  Br"/O 6oZ;q,Mm.8WX#ýI s`"#(R3r:`<&<|v}5H'^m}gW?mvT>mlyg_\\o,.:֘ʕ&#ٚ!ratu I  Ay5R,S,hCB.DnDhŠ.x;o;cbsf4 TI4H~a1J<s=,uz=nxʫW("0B~786p8!N+Re5 r֭O˕Zu&R&\[/a6{/lV劌lS`sr>o>XivG~Ք_򭹀H rAI<|C2'H8c8,%F8<92.H/HR"90<,dEvr]C^^/+ZU6o s'Nc@XcA}ɾ W~乎"* )p5Ɲ 0] pi~I( Pr?ϡ5cr0_[%;Ow|%6O|رL-OOO [h45kVTv47'{;]7ޡ}/z˶EGd2sDGERU]ŴiWJji&JϤG^fLrh0ٲX{+Oшds_V~TRÉ?pǡ#>D2f\ssQgw$Wx.t'/w49X *^^ #i'U0MLۉP)|z̓b<&_*8_:ӉʢJz:t vN2aYn w{@G](Er IA, ]abxD 1@xۯ:Ri GKz+/K̢59}g;.;^\ Џ2 LǞ~G&`~_Gg&m~$'Aݱ8:ؖi3:b!;;KEO}Zn8BDٕT7PHJz6U=6DMx\o8:m7 RTDFT[60Wc@uSmYx_, D*"XTF#LT3rdV # H~x5_>;NH0\3D39^ /.XX,nA&S hbʬMLX.ꪘ8}. )qS&9}(U.'tX Kˉ{!&&: SLܴi/l6ozbBSb/**-==PgGޮR-**|(̙S|<ZQo?uf?yISy*>í .3,=ixNVVi7 YeTVV@jJYFcC~T*;?G}C#ssNʞ $11 n/ >BfNmEs @Tu.1vС\1ymG*wiJƭ\$Ǟ9&E[e]~cͿ;trsJʈ{")38N/⊜;ܮF t8G,u:$Q{,Ffsz$C ׉kB,K]{&6R谆u9C!X& m7wGR~S{m#숸,IܭV3OP}n;!SITm5D5TW6PIBԌieë2hU!Pؕ@$CXbdڃ6Upzޢ2O8=|\B:](1nbFAJ:ףtXڑT=w9y{ut(U*V>bUJ_skȇRrCBJ6&.'jl\N{8)}(~/|_JcI "1nQg +Hx=.tz9sT! AJ$Ȧ~w6@G8cHTR>=gnvz23ҩ'1>)"7,/ee$'e0e0Pn&GR}!~0c79x0[mC*ny>' Xm<(ݟhu*.O8aS51Q=ف5l-ڎL.b>!Ji {+ZYS)nĤs{A{8nPod{#S̜9[3sęeXoM [V~d,R=Q֕pl*L9VA9__y[IE]B91{qݽsK[r9ԦP<>PsKͽ j q~x!4uf,MS; jOܷ{O'fT765h^/q)ċ/JcU+($-! _+\H!klfk9hpk9I˔ř,H/, s !U%!Uš+صDOUQO.9?֖NaORR[-d E\Jhf`sgJ_yI$>#!vg@ tt: AT*-W}A6^αіmEr9Kn9\TH3$%$PW[ON]ﺓ~kb v;6nD@ԍfM,G]8 ͥ gACpM!jzsusl-A=PR}M--@N$Roe464`lreP1lش#FۻpafvAxfa"Rذq}y2/HJr=6 {\fuL==YۯH0JJAa`2Wr>[2^"T N/eBTXk5ra v$ 0ϱU42CA:[z]~jcBQ}>s~,mwЋC ]Nqr [l~"jF|vwϤ]. v'ִ7sp2sS:8&<,(c(8mfJrBL}gGâE~{͍KI%%+ޯ\GziʄN;ΩYjTH>{`$X,sj~x|uy4\AΰNQR3r>vSQv!#>#)#'=lG g採nl[%"*N b1PQVBBJx[9Uq X ;gΜ;w>l6x<ސGb4)((j48gHtD"?O48x9y{NwV'WkT,n~F#)\!m8!?@>rR*ї5imi嚫gSn{#/dcFkfϤyqV2Ҩ>E~(ٸy32t+BZLpY ~g̿Rɪ%'3xvY3`0PV^!C0gsx*+oG?qDp~vzi".+ G7{ n/ˏoT$rK,/WJ)¡{{-ڨ{/sc.)Gֺ&o@ykL`y=yZŀk-7wXGufݢѫŨBdR!n?H3Q4C)WTxỊ]3c]wx8Z=<̼$1|.>;aP"D+6rd}gKxa}ef5[:X-&BQ0^zg?X7 >$vo-H^LJnO|r##YZdJooiࣷLdtwv۶3Om^%Viuǖ߳lq:n7LdƝh sTVW3,7xny9 =;WhOzĊ}Idefdbl۶EFFǍp݆0A7L6b5[dLMbnIO6I።zÏ.?ܺ{ϴ>I08{+E^|A^q ]𒳶Aoi~?[}lT#Cռ5yQxo=5ևln]V4-6)Tj"+zu puhoB&,nCEŁ$K2e_ZD"[ -&>֦'ll4B6'CFFL Ŕ y"яJ}NRoZ[.@ xO3kKu7ڿ{WoR1/UTnlknXbӷ;,;,].^.c]Yg=O`Oy|\ I77kJ*VE4`޽o>;ZvG$r $Džwkkذq3 ZV 5zP\ժn=@DT73fHrsgH>o?XBdTZt446()/o(w|5gc^fNֿGF qFYmmzV{VXۇ3`0i?#T`#(/"8,0C%a=xn7Ç u%=2TM`˰v#Nr\ @pPk/_N/P$҅d7 2t 9`CCqpwOwL'TL" AH._;xE-@pS3~{ՄB.# Sǰ;G=`0TKe_xGyܮμF( gz\G6l0t> FyypGp{ODqB9s3}&1YofY " 1-|>_ 7Z]DjV(tDrX\,t3_lڗib`W bdQclڽx=>=NB\y&D_޽^g_Ճ]<_?vzY鋕?CK_>O.k釗/4zUo]Db ~m~~g+rI3 7Yǚ>w%kO>^OS5~׻ @0&Hڔ%"QX$:,J_ɣ7F~ZL&bηWu ,Nb鰐">.uHNJēOe2s?~`iK~ߞgs?eaI}ɓ8P\9;нQC])>XFf3HMNh*Nq͜ /I|mPơ(c{_aắ}ͫ5*h>=v`l~~iWH %_.k_vxPNZxxXm^T"Jx}/Y6⌘tV>xK]0jP,{|ʴ?UTߧ!X;bt`C]Swdo}u+%;Hk~ܕ9:`Yw܋n*}ܗ;PY^OXҭǦ[ٴy7N?DJ~~A_u:fN_Dʍ7,D&S\@#CW. =#rߋ0?>~iu/>z*"h.)RG FAMm#^_fEu: QQ(rTbt8q8\Zmڨ3'%9:#oy2}}j? B~u,?H&N5@͘i0(߽rX> PU Hzfvj)I:eRLtR(D^D<gpNW9RQ~uVd SK\Fr74B1Lj }>oE ̙s5bjo1l׿0b)I}uo4%ҎuOON> Ȇ??>J& |Kr-s^vpIԩujj)>xMCLF*-[TR*RYYGeem&s9L0;v ̐@U1A* \HgRNmk:W]~#+' $".K8qd v5 bD@r,Z&|SWg$?y xR"ZЪ򓢣ϰH *h$9^RkMqk8~rL^2g4y "!.ݨ~``@ b0 u7EnU$6;/BǑTeWa vRZzңОhR]Nv-4pd%[o#;+_#L1yg6;]Yvd ,V+?[A~>( *NQSSw}&v3U09q'+ yQYz'ܴ쩧IygOmEiikG}@D.3,/ayysߜS JӑY o~Æ_d1{<ۃ DpoA'dK׿u%'|c)-;fL{D.|xY=ٿ?z7]yG{.-m}_W$'%"HOarɾ/Y'&pÂlVĉz͗ B1? &vHbcb;f4o,^{e fp"S}; P*_r[ Jqr9\oY|w-R.RgO-C6Ro{ym٤{h9VM[.&K>t!XtcuKMm#Fc+Ʀ~W*DEELJ޽á\:SCE@HYEk#$p[E841}|b2A-5Z8DE^Qikċ]֝{VwGfgrtb~]j!DR>;Y&- A:C. cVTrcre sZ$|  #F!b{ػP:xY V }M$݌ԘPhqxgv:ۼ+* 읋ΈzRY9b 9oPQV:176F;8uIBm>86(4spw3 ߪ/Ov?p'[?IwܛAd^f؋AUw7ʟҮ_=yf_EOO䟕 """6sN)I4D ͣnQ"e0 Gw3߭pI$RYz'>ZbqB\.[m 'J+* %1!jb#1g,r97mfqBӼy^jjo*ztk~O,EhIett:vHˉ+]SC_UKDVVVk^NUzP*UDGFҨ%Zv;NZ[:**F1{0yoatp Wޢ|ku(U*:4Gg'k_5 gȟ o_  WrS*U'DvkiinhQ)((@bi}Ao@VwuN;-m>dI DFjﺌzk$DNhekxmo)|[JIuG6!q22S@O'L1@v%7C jz@iy}nP p8]oZrU ʫ3.3ň9ЬnagǎbN'77_ķfƌeuUZ:EEGz4ᴹqu}}^"QXrzZ^!4ߚ/6+׋_ cGfe$?D%:Е<"QsR`LWADܽr[o,_lsFaIz}H$\ ܞEjo^;_v}RVNx^l^/u j:nހ8a9FޑZKD{L6Hy wj/!S: ڴgAҨ$2ROSc3'xfKbVv;~lڼvyfĈHdRZ0̔6$&7';NE GUU7޸جs_\lt5a@T1`I[0Mx6CqzNpiEw+_c+V:+D t^d?6HF Bz!k#RL `ASx,&4 *DD$-aZy"j54U4 RߚLO+ |#ddL**:t @a8L$DE{O"W\X"ccF07dD21" E)< >>xcP8d^yix}~7^ؽ>H&RiJkGVv417sb'pQv9{@ :4Z:7amlCDG}=_>\ ki.@t,!:#NvU:8X]:QM#=?i\'{{E~?ՏI(G^)' ,DGurIs{ @Y[6srȠf{ݫR*HLLd|*Onؘp{ w`ŠXDFE)n3H? ETd4-l?EՑSp:w̙E_i3ر{v_Šm%z#;S3u:w{JYYY%%% JX8p/~>ϿG 7S|XBjr ~#gya ԭX,!)) F|m3+'+IJ;hw> ׭C,@bb"-A?XBb|<9Y7bXºM0n@y#--mүp^$R1Gˎ`5>2W8XKs;vC%%dfdm0h46˼yzThv{~qHYYJdptvk^Z۾Jy$Ƥwq#-(&cauC듪' ֦$gsl*+W# $Ӯ[O$㗫Y<${F@ww^T| Ywõy+^8f;xHLOf}OfMN>|`K H_~S47s/"!IJffqD[p:~#bq%' DZ;V,=s t:cn} ?NOE$<:.3ƪ AG%CֺDo7! {O0|U.K]GA6`sta㹥VZ T(u Ffz:u /.r 6[. 3Xm$JJ}{jVFZVg߫eʤ!%%tFN휪%#=&c ~^G%9)^X6d9nC%̞1 >3]hik%9)Ìرk7IId3,ӦNa443iDm''+(OT*C0k'gH]7&gH6555|yo-[Q"BʟoيFe7QX18NvCA~>b-!oDTȋu6/ʨZJCzj KJٰq9Y%a&ni!k~J!Ʀ0<3$b۷h}mlٶos7k2|f36nB3th.ǎcþ 2vh ׭c~m #B0.>LmXC?Mbcb:4IuuhۣxӢ#!>毽\7E_Xf~өvq03Cȍ5J\JiGc+# JR[B́>-YiZvVXIf sEy[J8>]rꁂ3gUkڹ 3#jBD2C|SqRgR CsqYl&V#`lD,rbSAFM$+ao9)"1a.ϰY$uq\8\NN'N3ZR:¿Ԏ:ҭuĻD§^VGTt^/ssnX)%$"dNO#!QQO}pAρ"`IԌH⥲>Ck!J-Cw /okcb9@n(bcZ,~>fjz@ &B!iQ0|>Íiwcow`7; j7Sy`,a @ƈTjp=ԌZӇas׹7@'@m '{]۱c?m?\S~GKL /4=+{|<ׯTT Wi;S&ɘѣ;ZFO}Dbcb=rzyG?$>.EQdfdRZvիlyNkI|l99Y45P|D̞IK[+nqs,&OHcc#Ə%#=\J|\ǎ^C.Sle$''w}I6-9gb6iik%>6ӵ/hv_rR"}$%R.g]nCcX^1-&wWP@tL4ݻ,^v 7]ZVJ!9)D %JHNJ$gH6L0ң̘> -[{pBqAF^ghj QhE bG€ƅ7ɜ98veKtf޵k7z om9US'ky:.Lvk$594ziNdJcwRǰh; o`{2}4k D"![]i 9)1"t+(`׮ulܴ DZx-;V 棋бoP;R&@`l 52?mY4he܈Ln82-(%{H bSvVql,6 q`NaiJd: 7St~>2W|N|7 @L?1d9<й?c3|΍MͰɛL Ǜh-?XҐJb9ͯy\uSG߹y3zn}9]MK2J}O$B gmB!-_;qܹFKLT(jIfzr Ʊkn3իgQ,Z@hg~Ql߱[o/`P ש'Iʼnp~l>1v{P6de9|+HNJ7e fSU̟;BJ7651lh:JKb鰄KO hM6DJaQncϢ۩oP\Gp\%.>aC󰚭X:,TV99UUKiQ.7GT2udnfvuF=z=̚1Tl&-=- c嘭vé*ǰ}Nf":֬-$;;#X}Rq89n˅'99S&clnIr IDATnJk?S&PLJcc#eY 9\. ̧ vF.SP\|BB`wRϿWqiX>KD&p8EX}+_?L.ĉJvMΐlV~ry^k d"55ހ钌n>m$f}33(,\.BGa1b5t0_0R LN'^˸+>:xQE'?Yy2A+Kja6㇕K*uOO~BH4O+]TQSRPYJ݃ DC'ᴘ&Zjڏ;p´,5Z10+@Loff2m햞y?.xTKl ) L$$j "?(u:O$nhbR1ZA΀Z&mGrLJvnT-q(w)j󋇥3wDz rBN)EKԒȰX04.8QPL#D"@D)ŢG/}uVXgp]Լe  NB)J)Z@q/=8\D3-! w Hc;A"dYܵim'=Bܟ?9!N."V. UW%nX,q:?{oGu~z7־X,c˖cHHL$3ɐYL2$d@KV!v x˲d-TwWW?ZH0yزzϩ{}ݣ)1+9֢y5wk1;zT$J_+ G; Ƞd Z'ڈ؊f0FK˃XދU:'锌dЈd MZC:ן_vMsh.ozN;='z Bq1AL: p7P?B:B,gݻ֠VXƚիHR,\^rfX3<[~سg/  YzW(TcX9uDm1g;/!Y Gtu&p }f*>cm<ѣ'9jgIJo2O!Ƶ`0 ]O6[PHR7$ٹs/VI0uW39ѣ'8y'>͍MܵI{N9K`"PU!bXҋoi~TҌ,{^/4hNVR]{2<<̻o;6voLFOeelm_fvXI(kEѳߥ;۶\Wn{N3<L(a݄ G:|ø\bݗ {'Xى;w]c?{/mY Ȉ45qM\-[IJ m;۷5r5׮@a{mk475 E?869lv*=lJ$sdž۰9l|m7i)͒8lΓOqffcohmw$=߷Z2W/^MyCC^Mso]g}{t_о_^gms/hwղS:fT](3,p2cM~JmO|_?ݗ~ٿmOw?v@M׭WЗu`sbMcq+le'ހ5xT^ +Φ.ۉD ͅ~orҮ.?Gbsi_e#e`q9I0"#X4*H N\e'zRhU 6T -3afbqFNG s >nʹo]yDˊAP Đ t .:@(ŀ//$!Pf4Z Ux_xŊ5R;Qm\u+Y'YOEk\T:w2d3N2O:AkO.]MKir6Sfm.jv5j,hsP^cE LejBe4]DVǻWAIwn] O{lfIP$i9 JdP Vȡ(Y2N Id4Qijj[yO8[|7=ʹ,rJ՟nVO˕Qz@H^++W^MZʰoj?޿$Qűd.W)KB1ք׉ pksh>r>^mS$vlt`P\+! ҒDYTɾmP>..qK";?u俟?n|{+UϹ}ـ%g/3`u1y2r==)k:[UjUa'{*JP=N ~:j4x*ӗ"5/_./G ƒ7`H:Fz4bdAQjVQEL}H<DA@,#0^+?>ӭ1~EsS(O&P*DUWJRd PSSWonjfzػu>8v{WҌsC0D'01󛷠7Rz^‰zL&Ǐ dq[nE+=.hω@!s7gϞtt\EScsəO&9Sx~>|@i쳏]|O p̙(%<W/ɟ 3}}syE|Uݛ:Dd߽BG۟#!DlF+uFO3lo[{ʡCo袄03W-f'i)kjq5CCVBϽwo᾿kC牄_yhz!.*4 ecU*9vȥb?t.jx߾B]8>T$E ;ox}"MߴPav<2@ vWC_jRo/~d*;d*HrU1OtL&Ž\Mi\qArd(3eo+(8LQkCWZP2 6DGQ@vA[uT4Ę1KRQgA*LmkEW78}9sku?XV.(|l`۸ޓ3 X1%w0g!EeѢy;6_n/EvP|BZ*<-^|ySzb֗J֖9=NQs { ZYY*Y>GE9[|:'i)C:+Γ?*PS*)_zD$!)DB0HC]gDo\;͏z:# CcZЈ.o|hnjaR alPRn=hR?v OU%g9~$+W^Ngt܋b+EVgH$hO uJe>_/N-pD>9 zzNs^Z!QwfM Ύm#ZڒzOQWWK`"@}}=>_c)*4RJ -J-4t%I4zT\l ǚUK~7jQ֖B*K۶6o "t& #RDa7̼fFC%2[RohdQQ5@PhXhjO=61FV;S$ 4$JGJVh+7o^ t-L^QeJP5Ai Fkx_mԺ4W>ްl:'I$Ne/fȚf^-kVup;w|c!~c>tE҇N2>Z7y]Xv5/ _}lU૎o/>{\؝uQ%(o)/N;O}ls;/k3U_e3WSS%p<+˄#16KӃ?iuoBDSy h T;ș‡Յ(qW JG $NT^fJq6zJ%'j`y$(Wɹ7#nEu}ZDCd0EɃNBr (3TBB9IiiĪ eryZ,T9 蒴tk=dnO.y|G_ny(eh4@ CPL2b `+!֔<ַ R ިf:EARFrխj/CF$'Į3b2I!c OȩbWO›pWce3D2bT g=hREß2MT.P܆-G7#!7BED P !y 2 0Z4Ե9( Ln21!ܽM?[q[c\FxJ7c6ކհGhs J:sSt/"i{?ܖO gyg۟ )/sc4;Cˍſ䧴4FKݜ:øG$THX 8 )I<<Ȉ֭xI׾ )\1)?[FPWW`  Y}OoRg瞻yi͍Mn h4RLKK3en|9LLNVzzNu'N;w?ċ/ʴv͵F^ڶ7Vm۹7duyYnVF#O%57T*=sƷ~l~Uڻf<8N\.RJbYg''Oufԩ,loGoгpA{/sޒ־ZlV;y_JJkvCm] vP(D%jv܉D7 : +W^;`!}h 9y@*F>v݃HmMPs}L#=M894!UE G3&ORYLSAiՕ"Gtx#=*UI|k.t1_=nH~;~ew\bɊ֯j4cs1%Q[<]X9Zg76!#Q*j*ɆxʰOsLCs0dwU-C}c;G7n>_Y Ƈ~E9( 6WtG9i2Z >fGǯnSX]$89B"Bԉh 3Pqn1%.V7$@6[}S ~ ,4UF#L&LW!A.%Dkr yR( yAA(t ڄh\3{I7 +Oh;< ܷe*9@ѪH Q0K22:AF yHj% DLœT&2jJW&/yA\r:Vg6H|d6V٫m$zgALF$(rDIPR E8Jfӈj 9'"b+ IDAT!$NEW)_&MIDS֨~T#;9e'm7^{%IW,p6)% BAZ Xv`ɁTq8Nv5ײ%9¸op=S}onl¨ qȘ@|V['I$n1S^qJQs^oЗv$.K)l6vKieZU ))ͪckcmBo|U8n=>_P LL!Horl6 fs 8E:+iJScRᄒ~B(U:ΥA^6P:n+ϝm$W___K۶cTcY0Z-ns$ҵ 1|mwdfbb֖fRRC]]<Ս:LR*ЋמGHIKkחRXH\~m󩪪b`eKHxG8uX,Z!/G֬^Ʈ Rn|{6+Σ`}aZJř3BScW/_Ι3Ysjvá̛W1M vT30_SCo_~>κLͬ6{8BtC]f G_Kj*&01sT$yH .RaVXѐa cTV5\.F#|nqKd4G[U٠~|s W%aF9j]?cm#3ˉȆk% t94^!u @ncfj{$c_'FFB7mRԈ9w^妡fy|&;`=Ħ?\deo-%bN7x hΏ^Jכи%KQk&SItdYTd2١ۨ$f^%Lb2vTf@wG>i#H wԷF&+Kܴ#{.pzV[((>eZ}ြB:drZr(C2Rc9JFb$ܪ6e*B)P DQ s!|֦s (z+Z4BDvG:opAr Fgp=+,%/%WNr'e:3jm(0;Ћb2NLE\'Xp<@V%N6FX0itfm%r9^:qH<6>:'5רQ9@{R'uzϠ6`߄鞧.  CrvDj]#"D%dYJ֨k`:0hj<0Oըٵ$UDANi\~P{讃,|h="d'oK}s/ X\ZM7r8WV﭂+^N'06;=}n]u!KAOEURTɱ*:/U K]P<~$Cå<38俟}1(55dY&&&Js$U>vwQV^fG~HX2  V^wQ:0n'Hg%=?D BZٕ>S)DRߋ;y_Ι}#`K`sמYg?^ycLLMRtg"0]_qL~: ?Ҍ\dtt'Y|nUM5R:CÌ#_ڵ)y1\Ь NO6;tᕲkR!{Du;vm~h,Jz2Rk]E Q˗k13NGctufλg?Oe 5wm_bPQ^Aww7nZ?9O.lXZQgԧE~uXG6o:5^Jܾ?X^U#^*jjʚp:Oivt3QUx4'sLNj:?Cmί3yeɠ?};/e7ݗxfaK>]WO#b`+a~V5ָ'r~plKШ5HycGwbʘtjd! 147ybDUߍ~yoI~{q)ٰ0@c'8gշ >< AmA0MFXJ _XVx;jf$o8Z1Rlvp"8ѫT>!\N1>TI+Q&YAlB_B#ug^uNdXo?< ('\0(*UtX} F|%Q8LMىBDEQ b1kTH*.9ΕFlAȑɦT jd:BFUg¨֢&!¬1` >dQr3"C#RR`&I:$d>O>A탈ZQΦ҈P*"S]Lz8 iH3L2)SҨ*4W][ېߨGSƇO]8|h*4]Glo42 ^ϸo7艄"[(!x]Aʫ*9bMH^=ͱc',svmΝ=NÆ |Wd2J薛C"bkov,fv"sHmjlpw{2T:>iT K2EZ;A__?}}%BsZZLc2J?qXZReU.]U  %E`0HMMUə9l>v]]yi/@jfg*qP$SIjj Ukkh5ԗet1DRYY$fV[[MZJ)UIǗ9M@w8"1EL=ݬ]s-WqAђ$EW]5bF#"UyZJLZJVk(p?@k˼Ҙ7\_ƭdwqdgWoУخ'{8CxG欿 W8B4{~BV[X}sw3ʫW}A, z{N9AD ^)}˗QQ^X̶_Zt:ijl<sqXnsZJr<奾40aϧSj#T=ܪXL5}(u"Ǩ#0_jm+cX]ety&)bb!&B I/(,b*~>xk#gn#~uͬ*38]ɠeoCtakY.G=ꮁTKW%Gr=vX5b訵kNǂ&n_׎8) #vG^`T5Vy j)ʆ* %Je:L|$vwJn¡Oo\VM8`NY2(^=co|# P(*$0 9/y?esC@@&l2l P-:9޼x22vt7UW\/B^M:LSLy "2|0ٌCx'6WD9KP x\.D)E% ) JZfsYIJE$! &I2LXLZb4Y9WP4x6OT4TIĦ[&.erRK&ְ\8>Pmem feJ΁TF$>A('B12UJO$sjFIPds ȲBEäJ&VCZq@r/_SʭjW1W>,}kP;Q)dbìTZCqyH2D#Y 5J "E4:zAͤ`xZRy;eU'K'_]NK|pnwSxv+'իߪ9q5[ 0(ɾA+twwL&`4 K8_G0$p8HLĬjcR cSh+\ĢqNESo.m;~_f5I&%p4LIpzim;wxIt=ku SxhJ׳9lMz׏$ILNNb4KN餥ǻ9Յ;6sqXD"fttpAun$1bIFc Lp8p;vd=%$g`0hܥm0,Yh4]rx7۶{{.EʎwDѲl *+c;BL /EȇmtͷglȈ2x@utWBo_Ǐw;6V(vk7v)(ǛH&.M&QS}^޳_L:Sxtu.psr|c}h-U0a=O1bGiUT_6p^GvGOni*o٩ ]T~6C8:dt^Vp)~%x桭#W^ݛ:ZMíMކUNZVhCCz28kn Ci3xr٦ůT8Ɖo`s5x W԰;#b\FGaHêٺh^0h'(oLf(|e?boo؉?P\ʨiB> le?vE}:঍wCSS!e!MޣOx>܋*o7S:U^;J26yAM\`QY %4L&Et*G(kj==t%"7ڈ$HG2UM?\ʍ?ݻ[;jQuȑd"+2jHED*)rrrR 2 hT f٦zŽo+i>wq3mnQP""9ge.'}36en'XIww7Ǐ,9^X)ORt^@uu}ye%}g.qElVYK1^~Vu3gg=&j =KiB`hJ%*OYb@-Koۜk,Ŕ2?@Mo_ߥbqX%L (ۖ[KRU(p >u([u`4>dSf8fҗr^LOLb57C쾔wV\hAq49HY~^c? 3krnw9]ȡ?'bbjyͥv/3>F˚UKp0>:U ߳h|K[|~kjk.*uv5VkW\|LO<,WGNG(SUe&[OM%=%itu}ux}ƃ O5a0߼ u:alǕx)+ɃdRTjL2:NE=:sW|@ҏlQ гru/Ţލ?ͫ7mtkrBvlX0sE-RyQE7NZ0}D4\*Z>'MdgQ#ښ4xLF5ujdYa:"1hU"h3jWV=:X=|ޟmȶHk %rb1IW*IMMN'կV.d9HYz:1 64!RT &D8S5 fB+hIlY"_Ǘ Wcc%i/&n%YLfqUI6ddu5q<,B~4Me/EO*ep IDAT/MWyb]1R#Mża@o$C ێf{clt5 vq7{p DaV6#-ՈZ dpo_  'GXlIU**h~/FYl̖gf?VZROgDjߔo9C#h<Ν(//- 5gt=VIV\ₛ6ojp̙5;vaچH+ MΚ)SX)).1ڭS1-jWb҂I63axvL9^y4hl60,hѶe21flaQt;R[rZ;ܼSZd]ȶ]f"x0ӝɘtze7fĈ[o_1j%}(**Yn}ƾ+$H`#Gf>%9l|?&Yjbg۹slJqBS7`1$dۭ/*JvXl>elnNk^ʱD"Op" w`/+bg핳c&bV 'Y@0҅fPJtD֬>l07%(ɿ <4}\\$\'}>~yc04z# ke wEH(1| Mk"WmCMZdG1N{\wB[1Y5 -NjjwDC*Nc=tLi_ )C].YVDC9؜&|}q<-겢*>D4MD4QamnD ]D4I4 HHR)b ZvGX? \ M'_#j9~SsdJ>Fd lݶ%,;v2-[<2'`iSaO*ZL9S& mmrn5d۳x̧-S:0eS.J;f`5Bnz\&Kpm_ʗo;^~5jpj62mz;>0[oxY9O0ǜX48P26;$ӧu3N梫:;}hҌ6 * W|,ʃ?9;ΚM}}P~K |p0qv7dHe,;㛓CrQ |?S&O9ajv7aFECCByu?wLt5:8-  Z}bP("a`O੽!Z"I .u"JFPX%m]ds3f߸cq[kÞ btUg!B؋ ٣tnpLjG 4 J-b2(n!AU4f DG@հS6< eq~|nY>Qaw|@{LVYi m\T=6|dpCZ3 |l6PVZqǏ>bw/~'6kjQYQIk{6ma%sym*ah kӦ-<  g3lݚXp7f*:::]g^2ں:6nČy2 )9\=AGf ƛd۳I>Qذi6ld Y;MDcwxWA걬_$1a BiVVEEr,PS=M&zzwLqŒ ܜqgfNhz55㩯߅,vP\ 擟(>u|{lGFtȪ#񧮾W%ZC$3<_~wb,俵/0YZ}}|>_ZRe}]# vCcvOK5GgbGXo3Zv]=#DQ:CI:Bdmz v:~M`?܁Yg̦Wo&oQ1tY!FydžNTL›F߉?Џ]gjQM}lӰLl-I+:ijjaA2HjreOܲ|Z FǥVwж&lME ">4 EQM&kRb&LeuLZ"_l?'ZHˠq> R#!i̚9MCj7ofr`_}C1kK]]}c92FqCk{OM8jkkYn=Wٴy 7tw }e>/h4#7}y)))>BdxY9PNw'SLɨCL`4O8!'''#3i!b1UWSRRLG\}}^6gG:bfN֭uK>}p0M)͔,f ۶og ;,t=[o! Uth4`ƌilڴ@0K/;i{.\ƦhΜUylk2l8ŅE444pUWwt3it;𸻇lc\w*~zRYArZ]2lܸ뗾>N>kf4lY7Qد;}^#_~sfaֈ&F 2Eռ0uu5#X{(7?n>r#G#lcWrygW۷VqgaL+-&-nřH{;V_};*wN,IR"dKq/,_}k&PT{S)S"@{痯< ُ+gˊ6P~wAUjP; ʂ$XM٨½3gAb_O'yb>ljdύDRG9jBQtZݘ4YKVRpݚg]W.]=EO#J;tf5HţhvN7^4A5'H Z"~:tS%r D"ql603WcЀd5$FhmFQmfTU! ؉")tb @:c (AR8*ZSp;KRGlH8)O )03eb0'fz~avg'JhPk%(,03,|`܏DP43K6,濰vObh49j:E+s G~7iz4n}C{;h Ok΃>DYh6[E2945ȲWK^m* Þ#դ~`0\2 n9r/|)~#? װ2a>u>8=Bpf"[ +1dȂˎ]`X `3g`^-A$֯[Ϙѣ;1wfDj:z*[jPϕ /)8>Ħ+R;tAj;Sue>k 9:2I'WbjN =ye4dxm{!ِ{a17Xt9^ZZ0lV"k׭nQS3mʅ Y9ҨۖYm˜Ê3i{D,;IY6y\r%G>I^ÊK2uu5p{]p\2y }=C_|Hz53/_lGהavulFk@!7 "WL(蒳m5)ݳY{hbd/awG珯۳͍Ov߮hb-N#HL b/+B5bvP7GZ`^M(v?.+.CeS?M瓟bƌ __G${s>/j9@lOIEzz45~4l 5bnM2tiOr-]XV&Ƒ@%u$M$!ȝACDKn +B=g>tkx~DIXMqQtcD@وU6RuڣQ0 W.]-XA\R:y ŗD=E(wv0Pu ,U"}!A Lhf#l,"R8F`DX52@"q*֯)x~q~,H'}/qBAk"B,fB]V~qR2N!HaO #&dڀΠ(^ɮd25=m.fk,*&Khl k,3ɤ(9ELPRfAU(hJwk7.omi'Ѐ?ǂ0ez GN>Ҙv$RVZ3I}nز?U~hmmMX 1s9l߹M8#oӝj[tU< ȲFw.?ng"SrI͵ (,(I&f`CX6֮[O F/rj0ɩ(,.[`V\B,h^p>}qudw>:ݝd3@^VzUlhii!EFX45w„AHק oٙ3%sgְuYŨQUCYU\!YaE~xpX4F]ݶ߅ 8Gsg"x jΞEcc5r83K?Cc *Fs`Q#:u*g(r \ć1ҌMCt#$Wv^Ӆ{=eyҿ-gbC[}L.K{\k9== R&!6d)8vΝ¦M;DcZ_{Nf:ֲT_^^VLMMfٴig}ܹSO$zjcR5j^hZ0WE՛G[پ]0b˲ aD\ZTђWa\8Ziw=خ[ r98$QIj$@@d_Xů*du d!it@\M,qϺK7Ҷc;( b3'ݨ(A^4Mbd%APO=!t:VQ)$Q"UJl:QȂP~oN(QTDZ|yvI|IfM&O$1Aɀ Eo`--D"m5hmo3ہ,ߏ,%]u51y$‘0H$39Zkf1ab 6o C>Rx_~w"@Â?F"9V>,1/cn!70b X2"H?dc+;'ضfZn̓o8c-!!~}]̟?ܞޯ__%MF-E$H|1_ ƌ`dUy|__ȐՌ,:ț^C[rS5lduOy8ԟH%K 씦q˃r+^$Io9X.D@RCu ayr1,P4@gZ%Ɠ,)vb7Juz IDAT#HBKB-urF 5 Q@0N_DD9~$rK2lY{r+桅w~)GXTUEK1k$b~# [fcI B]oDw?6)[# OlVRSOr>LZ-LyFdj /+g%sS΋C0 &Y=FAQJqLș>v$6rFɾ0ȶ1wֺL&D61cBF0KSS[zBq! SUUFՒ!uxnf/=hut|_3\Cwn_IӴk#gjm^k?'jE0tbɉ('uU8?d=eYr˰'˺Ko ! nw]ɀ%υP$z|(ш_I"Zdf> UUmڅApQRӰY#ddD 1UOfxJ-\QbjS-MaIpYE봆N@I@j2V8NI=| ٸOքMOUG|FIX#P^h#DŒ(ɖՑ 0fc͛h@ ]m[wg< f3n=xi[-~b dWO8QǙfH6| 2p DJKdp?0Ӿ&8yϽ|f*brPJ/d6fVkdmd h#aPHG΋ %xޣFToH9K?!{ߓԒc pwy^VNǃ$;g6W_w)JG l?݋/|]xտfl[S({@?6GQsM;i"rGXc\‹d)3uӦ-]>f~UUtE(" Co_O<(dJ}q|~>OQJ>lXOQaH^[q |}I>TU$6} Ν3sү$a((ɨ1|tuwy#sN l+?jmnng_|>"-.D(H̬XLs3oa7w^5"q}'d}oGKk. RϡeKo=x y2ƌ ?E~p$Jo?4XDY6pq8FsHMڻ`83! Ā5 _;_ʥⷯx@7QRĜ,"Xea.9t%9f%@"pGwQ4$ Qu "eDQ@&"cF߶<4L$P$J\CUuP4uaI=sROЕ(UG?U?6A{*c/3)FHE"ѓ*[pJ*h@~bYD5 ^EQ8WawY^'38Ϻv돂K5|`/ QD$(C45Gqx %I{Pqlm!lzA8n!O(d?zδ| &ibGyͿކdESXp|:ݷ#척\̚daĕv9sdq7Nn]j]"\{ xW_[7s.]2w.c]ٳ#F#xJhll4ح6\{3vx nmpM7.~yeذalׯfx.ZQ?b<̘1q*ԐEQx<ً5̌53gdTfס>xjO5<'emF$r8NEW]ͬ~^twaېld)W4t;nF|~?[@MGEr\wҊ˃IW_4YhzwOd.sFcN^~d텕;A2l^МK^F gnЊg\EB ՘榪,*?q4 =f=8l-9rDJ1]3x%i JrX8lP%qI]xTΏ!$Ip̮t!D@4 >( !IIjMO "Ra lHذ$ څhUG7~rw̻ʏ?n%\ssU=aVffL t{D%3Ȓ4 8(n5yy~L/4kPi[sg3)M-:h: ԋ@Etdjb$5j[[>l -Px{?ϝTΒk͛jYֿ|F_4Y3fbX2=*3n6f&]-;>dHȿgY졩iR[[ԩSMmm-Zu=jASVZ2$A&^zLF"mg} vئw=dac=ѣFUţ=>D.m|Ug (?# 3*G1qAMOV.]s$C2 щrh x&  y[XMt YEQw_஧gw6oŢsY,MTU 0D|I]DՍ$5IdIm3_?dP&=5j`40$b '$,YVAJq{ꅻѱK| FjpaӦҎN7W_u55㨩G}nקdVtO(HY#19c0g#dcaE;7x{.Z[[),(te 7r%sΛl1{!R_98}0>t!q,O#W=|?7k>7cÌONM-%|”:V]mj HFF@'!obV3L% (ӛ"EL||iG|l UJ4Ϡ/*5 ItʥXq]N v3;s>fp2K"fG2(q -!d![M1Da6k^:;[<9#|Nmm0R9e@#!->>ix"_ಁ}XQIRC+]q=O|ux]-6Mr Q[bu룈& U`II܍(YTm$ '??4, /K OIHZD}~OG#{ՍߵѣF1nl5EE8L#Qk=nV(Jfw>wpdltwvRzI,(^XӃkr=0Yg _xXh[.(:Ǘ|!K˖޲4𞗏Bq,J'߾i񱃌|<@QȲ O{;`La;e㐈 )ӯcon=fwnVE   J{{'OgWf—$J{3yO;M;&L,'J< ):q6etwr8:+N~(I+23rT Lkmo=kpYrbDQ:=nΙuPlX0X,F;5ݮz ZmH~Iؒ$+AROqY.[z≇V q̂|drA'&j=9DD"QN$=e<߯|Jp]5|\닕Knl‘??p9 }0Mv^;?}:i$3YéI#IRf[w~[=wRrYEQNXZէD@~o2LˬtI&wꢯD\!l}gٷN:O)\}}_GPV߿M&K~T3ݰڞ}f`0xl4_?7w򑆮iFrr]]""AB@U$TQHYAUK'Oh@  #:*yyר_Va0pcΙ?{7Y,{\NB\tE:$e#FVr:ٻotO{}'KD`À;x %iWKkaHxӌ^ &%mhn_oV.],'OhFrQ#vS}ͅ ?{/,GO>nzJJO鳱X" !$qV+VҒK3 '~}E"?:*;ﮡ>wKHOϑ #R6|;Ozsbxy >_ ?\n[j Nʾ]Lx /Goovu/ul0~_Wz};߮3D@$yyD>;wal;#uҟyOOKK+'ԤFFlY3)..deNjnЁoნI&2rd%ml&2x"yƄ 5̿l4}B'"!]}{Ϣi=ձ>ۧ p5C)"ϺCr*ѓo0rJ)$/] xKESEUKj I>'YLjQD=DU avB, ^b2]Owm4M+Vb-)I- @ 53"i`x$dhӿ|Fd~0绛W〨V"={~_ckiIɣ?~s Nnwop/!ٍxIe:n ׏0=S\ !X EM@6[gӯf #w &Ge窜)i㑥$/)xqqW7/L&$넸Ѩcj56oy M?uVJQF=` Z2&I=)%utQMD !R5DMѥxP$ xtmuۖkn8i ̧g'͟5~5';Sw9/-w_m([YϻƦܵ3gd^eyH0] ={&o2i҄!p~9ׇhO. lRᚮ'NvD#Qlc7},?M>̿ ۫Web޼K9ۉfY7:󿢪s6#.Q_gH{a_K?αCx& TCey`Q^ Ǻÿ4~{>H,P勄֦pöGWK$kFˌac7~~IrtM}O\(Qq% ?{Gyߴ]ڕV%Y-[ %`!>%99i@ @ $$'% !`0n]eY]ݩEr?5vG{;3TIl CZ ? z*=Wé ZvD"IMd}RCfQF7;QUp "W7979y;K|||>;^<@ie|"aSȪ( U g1 ]V=g:K]}O sŭhƝ׬YPWrͬ[+>uq,wy^r}}}lڸt:s}7ݺ[q\c=< qB**"TWGy2hGK6**x<}FUW1}4xov;/x >Ԣ4;jU]M%4m7 븱c?t2^~}*0®NsI` L(%bI|;vW|G}K [ {Roa_e IDATr< )"{oPPL9 ESUa.0 ރ\x(V84ŷ\\^"y!}z->ϢCNq]]n/W$qAsC:ﺠ3>_'*+} ,[zXS~ǧݟiSpa -ZtӒi1C-kfmhE),zLFNFɦ?[Hy! 쎧]|傏,4Ƃ-:BmM"9p,IˀWQPϢgD+ao,n1&44QƱ\4aMGdIK2kex6L?FU0k!Q#*b/CvL4Dz,8|vߗ߰|ŭ/o:qW;n|<ϧq]\pwrgϠ?AL`0CQd Iu.o }1m hFo!WҲtu]W\q:m2\/m*6饘aV^HX[~+}qPy9݇6T; يɅ^KJO3rt:kŘ߭j>P'E'\v׈K\<#zgwAM(FëKep y3-FZ2jkh;VL^LGb rYfnIL4°` Y+GLtˌֳl $E^I M&B8JktA324 v j,$I⛥z'6H|[EK&kXX$u,Ԗ׳iAWw2 ݚL2š^G7:)X;Yĺ,P_ V(h3e8&m;ٸ3JZ э@ D\JF*[Bǔ%AŊn᭷>O`Rs3{Aӧi:Ͻ"}}1ox]@P`eqBeKtn " WSP_[?^DQDKv $sy*wu O=+S__˦>mg#Jޏ &|`S_p|Gۋ L.*&K1OR1\1 Lg(iSF/!? fˀ3M@-:~OGm|VrfCdk"=3#aJtK'aj Hȴ I\$ialdb?VC0 d(mt;ZdD}$ew<5R61=)uW*`̙q<. e*.;mT` (K7_vS+p]5K+t,YbRôl^Ղ2L6 vޓʅ%dž=0#5,D,2@psC++$ KdBn*Ӫi3[7 M2%qL<,4ܿD 4-}?hC=i[}GgsWqOݎ/mgt:{eysbj~?eC~ÜsCi* g,a+hʙ;:Fm姓^rVQR&!fϯ$H,fhފcVSXK;ۜ4/?C$M:LL5A 0BQUs:}B0M Pnctl%)FX6.)/p+x=7skBrq0x n0K_Ɖ?g)~]#Y10@>,A"rT`G|;QθѼ ֦y5cbX⡖v"Vb<+;be5 ̹ei_mK =q$˸eLo]6=Ӆ+BtIuev:7qD٘$ExOcTZ+')vݫdҩv|a̙o\عL7?ee!w,]OΛo/ci818ȌŨLMi<}h(d wAwW rAn7ˆ,>-/ã4s_H4Zja,8LsϿ@yYP[;_~u7dgYdrYb>4SP5zvS`nNz}s75 5[8ojgN 'z>;FPݻnҖ c$N=cWՌb\= yo3)Wx/e \> d-c7q$dBݾTB<-<{_n-emw{:3qJ^;jZ1F$mdJi"( XY+i[Ьkyss;rVl(_r h:ȩH$ )B>p:HKXXHeAWq9Lv =6,U 7I]vSɎKBP"i3g,2f&X@A8kOϞxȓ fv\k-H+X@LEy:.ʧ0.XMX۽ H#I"|'ʿMh3_ 3ȶ<9Gڛw‡~DP&+2!:f2=;iF6!ְTzoEE P*^f $s{?+ s8Wt+oSKqT*>9gr=0̞1G'?$ēOǟ4Bۈ $imk/>BPpձ1v-V^^-7ġjUUf ogs(I{IIDA$˲eVfϞY䱚kݚl6qw<Ǐ?9=n MUj**"D"aN';~Ï*@ڡ1ՂPia+DNF/|m` F:㓾~GI7B=l7~ (&D=/sQ:({eؾ?w߽ r.=W%q%*>_dq"ԯު+ʂ [G>tK'LO'.Y[CL >8(R~K*/TPw2S&kr h!J8BA #> F$$:ohl$:kB3,cɧMø)+;:+kxS1lMEA,@I,0 H $*霆-#;l MH%b/ߏT\6j 6T>5Y@ 0FEAdPSvӞN2_@{8ij65rF@5sH&oLD'4xn2o r3êw||6`Xb Y;ŰoՒ> =aq`}>*)<;[G|b<yH}A P /=y_0o}s77|>HZHbԹYYGNκ!oIO-vڌ&Pf]r-' \uCg-jbKgM5Ntm#$:[4D ΟovYM4)*&!-䨕 DO$Qkf(rd0nʎyh5 ҆XE!n&&(2.ǣ&]4 霊 f sET(W˫ kL˗Pg2zQtT8\7(<\_6&*3AUd܊O<9ʏ>rU= Cm 8 jIg\6?~Yp;8=on`vTƖ"p┠e`'j/OG`Tm)Ĉ1S09:b0ji4&gXl\H!#HfǦH6҉6P7`Vco d5Sn(0LR)SJP=n Z6wj' " 3fL''ͤY|=EEa\u8N;{Y }Zf=Mck;IAdD>\۶mmϘ]w (]]8Ϻhg9Or:xb?y`w8eXJeY% ID ??\sL:^^jD>^x3wS[;w7la+KTb H$S&ǪZ4_c7H$ (m'};cw=Ŧ q<@DK_￧ZPL@^s.[uad` R,fCc? &/ZE1in=V~a:(]e.M@ u:N$lL4^x]L\h (>B2\c xKcuQ5zjoف`\^ (;YfNa& 5= U2B$nAR$2ɜg^Vݱ80nIɎ9H SFJ7,*lۮup;\NMg" )\ lSFOfp-$O6ےe^zOteY1 ;Y1u!!zN;ea*]Q%T،ZP຿I6.>d[RC]DR%5?aXIiCx'c]pb۲|͘-f|?(b-^Gpmw?Nr=C/a`Z%pRrz]L}XxgJ^{fikAtrV{ Phi Srlof\z)='.d9%<0Τ-FPҒo%($ [\(+4];qY3HDL`哗 IDATWE̤8=!t4Dْ%if`upQJ;DMӸ-%9G1 7"ikg֙f {H䉧rX(a$uhdv v3R׊]vSZ|jhY޲xÙB1ⵧ >=B v#{&SŮ:ϥRL:01 ^nW`Cjq0_Xļ:1EaW6A7A,A{|]vf\h LQ03fcK =||څjۯc$N ]kzA2rOg-'H(NvƑd@I;D>\֍;ԍoFt4y[oqԎ 1j7IZ-x *7;['ie75V=R Q $If|+W3/݅DuAGW'} Ol޴B>GӸlڼpy>޶,k_jя_N6eرt)$4v> "J+6 ӧNc0Ν;aM<,4MnUUU47'/ĒP5É(T:kx7n܁5@ڇ$Iヂ pW~CD3eo/qv$H4Za F׽_:aܸ:^ 5Ȋ;k"aNHE%Z#-XaOR83d@8Xyb. F )Ql"YC #Sqt}fCK~YiC rbU/ҧw)^ {>Sᨠ#sw};'dK%ߊ"QHҩ*%\RyCmB4!E( ஭f_,xLKDMڕݽ8k+q XX,Y" -@>\L,7I>U*Q4:,ڮ8v0%CA!t9=)\aLe (.ehQ~A'3z\覀'ɔUVdl[`#Ar>^1n\Ldb D-zN;c@__/:x"Ũ(,*L\. ,jfweݣZ֭[ǚ5kXj+V`ʕ$C~*e9<4^wna'1@SP x=ޢagl=Eyxy+|>TU}?W^};R̞c9ŤGao/n)z݇(t}ͻD<-C>dt^'E`;qVCO,@( Ȳ:y 6cٴ. ꝵ@>$} o8ɓ ]d\}ow׾h. Jy%5{lZ/]q9o]wdYte| XI6Wkt^U{^ch\.Db-(*JRΎ[ZZ.2, YkUw}[{rU,$l%)cK'3 i""_/3u$n_ӹ} O;+];u뇬""NgxQ7j! gzn~H{TAc'_"G# KV`yp:ņ}bSp~xf^X빃Kϕxb@0v/v9V}lOyY{מ2:Q( Qm"g*c |ɮ{?+JNRc̤7{8rU"W,ôpDLlj,z$ƠZ2*$I;ݸku2ܤuG8ejէkpM!9Q.Nsrͤ ߟYť**좶K]Z?͍A&69]Ux EF|˯nC\?0!yys_ޠ~t1b'Kdxd{ӳ#Cq$| .hKj)lQ:.|{rer5 $H)B2?St09] r* 9CǍY@FԜJnmy$UȣLxfNg̑޸%e1-We9f '8V,rA x̩Wo;'3v̄1 >n]~٩z[*ÔSY!+vbp%$EbGD ѐBKd[W.ݟuU"M5TݐWٰlJ<Nٞ$4ǁ>4MFћc n" +tӜy(tF=\*xPWAL1@W JQ F-o5;bk&=ۑ 8e$3mL%芙Tcf( &TżImŭYI^wt RV姐kr5U:i]Jw#)岢g*Ӄ{= L1f?9041rxEM/ҷqYZƛoI&jFAN*y/ VX͎akժ pM70y$op J:riii3`3Miݺ̓>n: ?$I$SY=L Y4087Xw||SEay/`c'|(gal ,5"n v\'6 pTɳbeֽYk)8^)&/n,nsIwSe,:w"e@ۇ ڴ,q-x=qchc]b __aY!9qc .åJq4*k:]jbG" $"V:!;[&&l'zW=D,~Ė~I|רJl[:2n{rg rݱ1U3e]x&ʽbɲ{$] bh] Ӵ2D"&LNY 5uSQ"_,r~b =M\ye$ESYRiB>͠HD| GďGjYx 9 "^;x6ԫ E0+QYݶ!̎-X٣x\ leJ q^jEQB<~"QTMl?YN40dj;tsg[]ʙU@!;7mks:GՄ0MhM˻ o9ۍicNt:?@t>HzS#BJtu暁=CxwuyGnr4mt]:-2*ZdPv -hg87mZ6m6#{9f_XLޛo~n黛6n~ͷh*˱-+ koӆp-7Hff&^n5xT^qO6RVQv'{@h 8,6q3g[o磏Wp֙_%-- Ӷ;yw /cҤ ,_> n J:غ}55def3@eLFp?.R[;GN{=N<=0a 0 }k(9bqQ= mN@(o0 zn'RV`]/tYg_=5^{S9؏7<@] f/{não{)Yj Sĥ9+OR:Ƕo\41n^|aU )rQ",33N#z% Ce_šǖ-:*=W74+ rtTGhG-LGiBT@]ۈj'iUazObZ%E$qBdBG^F*Eg"8έT5Uj 1i2V8eXn(@ţHDfu7+Kd'-L1*D2D?x}$eNe7"ӴHs3#J~&$ yYI,骈<"CmZɯf8S6Q7:]9FkB3jU*dvçd2`yS)ɛȘ!3d6_>M]ۑY_ZJS,DDyg$JkǸ-ܹ5!sH&Y~bal!#qG#ڕ`7b!l1 9x3Ĵ76vBSyGvHcS#i-)1F'nOJȧ>~F#~nρJ F;TMŽ?7oA|tEk''nǭp՛͔ﳻ/ɯػ~0\XXKȓoQgy&<󔕕q&LܹsY`z KEu͸aEEl۶3&t@[A aw)n\[acSޤ(oᅽׅ+u5<7W)/'Gpzzeo;?]MgcOU" wVmJWqO)Խ(nA#N@Ri?D3vŬ ^gf֫w@ @šn>TAhm>wCV˶MKXQ`BjZ%"2DDoB1 1Fz xr6XVϣR;  .8a/ <%W쨿)ʤQ="a!,"XWDD"qHqRY8ȒHσTitxNUWdR;poTJfFɨ[vL(zp,Iܔ=ʶ؁DQ‘WcʘN_L4B [huS9hIS2sG(OZcir0h+ rqDuuu h?q("S8 ]S6'b6ya{D/ΜéJ76ؖUIz-y&/1\RS#C_h - =+m;DtA(#2E%ԴȾlV:e`l (  Csb] œ"]~/m(k;n5o Wy~7^.f:n,2uG>& ?'#Yv=I ?7wyY4% PUYm(XA<' 2kLDYF4(I]㭷eȑ#;o?q[>HO3Yλˈ'+_ԠY8A=MQ oMavKM2bOO{y.^Uím6vROO;^?H=]$5w?PI>Q! )/U3O|ogGl;f#Y+]snY7HA`? U=\cJ2 ӗ-XPi$iHF-&D42QFӎb#UBƴx8κF+];6b1\ء+W_DA]6Ӵx\1#eLqTYD ^cc]Q AU U [%ggg i)A>,e`-J*;d4 JD5lrNA0%6mA-H`%pD%ÏIir<"C$a˒\L翣G]Vg'jWrt;0]e9ƌfrfIP2DVk|RrIsؑlEQDY1!'lihQ|^ɣ+ڎk >ҳAELæҠyGrb1;CR3wHKfDY 9WjnKHаH=17mko;n%G%N8% 7ߖo__|۶CӦN;曮@Z}5j$xEQ̠С~$IGܞO Q^?0wFBӐU,"a7$Ӵx5x&LLз~;/u)Ͻ Mkll^Δ)齥^ZzP-[^ hkkMoPA>+6'nBak~()=nܔ""[a8ף7q-=Qs H<ғg.Y*3NJo} r0hʹh-%'ȔKq;3ketf>+`FL:?!#Ebxx(Shڈm K`xN,"TVFa\]W6)CϜ:Rǰlt TIBIMhY zTJ4'ԡYHFz_.^tAy5g sV=*hU{Ei('!oNWN:׬ğ;[7Qۣ;6j xA:ny^G d"9-az5;~ /7.gO8kʶ*}Cޤ$ ˪ٯ%X5+,B Z2i9t.!c'pWN ylDA#2,}D:#;QOprsquG)z!7T6.<=_B~bpkm+ב܂mZ4e"9j ܡ+)sE!~"иLCz>ҳ=w:qCنۯw)33QG~} ;gi'|f$i-SLw3aD4M#ax P^ANNEGb6^ALä Q2mMHȨQuît86oei|ZP }}@>ƏϨQ4ƍyyᇏ5;|k+ola9 fq+_|ϏXV^~I|e$_?+oPς|%RaL c̽;X[I,[qCn68>w=JлXEA}' )pq2%c dZdFyG,&'0/$+[}Kz$3YQjacOK* &=nhM H%B/,)*R(e1D%b:X[DbVxm;>KM(kͣK*@%(: טdQB@u 77ɯ!!` uM} ɰmTŋ8fa! \iy!#=a HmY:cvg͈@摗);X2Ax8kuYyHa2sϝ j֮AQg}ZŢsIDu5#dePE(# &O#O&ԉ_PD|ȢDaG,+VҲNzƛ}գQ7*sOζG"x8M$cX(]v`2 Q2*NntY!z\+Mm{LvTV! K. MDj7n4~&R2- Z 3g>P;;|>qqǑKnn.لB!gݺuGQ\8t`–-ca49%:h+E rbNuGUhhPQ: Ͳi6%PfhCԲDdGgۈ,^t!uR9^:kȺM\3^ԢË誕-571ZnC;9~:B/"h?"k 8@L"լ¸a.ɯxA^#3x{oLEb|s5S )'/U +:ayiYlvsEBA}"I E>@D%u{G<B}$Ũg1H23V2i[%.]ҥKɓm3u"iF< -Y_?ί@|XoP*!)F`xz@9VS$O}wS^Cŵ-t2ܲ {W@kNH2tqOf\jjZcXSnlጌj݃ !: &Tg6d9+8%d0Sk$J<MS ٜh)VN1K㑐N.yW 5 #=Q4]k86 ڨX)Jkt%mApERewӆCe-1 !{}؊yx f4]߀ rsz4F>~ޢ-m]*$=7H:kZВ:]@"D0|T \ #BM6N%݌n-%9#98JCxj+'ӆrVH.lDLۢ00lUPDQD/?f-(݃tdy'gCUSz2~yJ^Dm@nI>,aF[S_Y2pSyG\z,Rўyzo;p=!W[ondcy5ᦕO"tv fb]p8Lskee嘆5 9L$qWOÍD$ ‘06{5MòL2769Oq|wslU闱GI0X(y43M]V7(ߠ|MÀkh A͸ppz`nAw#N`{" nR1nIO~o n&#~1FKyd`t+]`šǺւK*>`Bs_ =Խ~}ZbS] GZ'-|WTEZW Λ=Ҽ t6@tDdldFXpŋN?d}u,3F3==9=ؽ8؂\RUѷoE@u|il9#@ִx!*Դ ITLiȣi{#mum4 &03C54pwAhϖ͗Ge1=S!xE"N+C]ܢE/* *Mq"ETQ"SbpŻa&MBV?g5 +Oז8-`#P:j8HFr}]I23dsGe=%抧ADlE}R$D,++ko׷HnrɅ :7i>d5ձ\Ue9YY@Y ~!a"[!Gއ(ؖ mضEŦ\pд669YYt2(ch"xח =< a턹F^/qc|e\qϪ q=p}*Jc9P.AnO8r'^?`(zvCƽ|e8nh' =H[l@\XuЬ=y[pIQ_]^ӵqi[_9&`K~[ghm!Uyx93D2?ߙU%k$U5%S1"$V"!(! DW@mLtPdtGBIy#gӴdK о~쮎+VrwDb?}5++ 0%tH ~ +Hg2f6xDB# ,u]V[˿mUMAVWKٛ#>c_&QA Gn/ ǡ=F"cAKX$Í$Q‘wtZ]S'+EQ:}Cنo& Z ˲y}2e: ^-gԩ$1FN+BV0HQQ!.r(cR0"7ܷ+ @Gkk+C bhNNv--RTTi꘶E|m$ÇPWWG0+HMM y쬩]78oPA׏Hzs-nF7~\~:9,Ы,{w/kZw@3{v`m|L<܃#"[mXpvƞ7{ Qk')4%->&@GNSQ=XlXN"nfjYMDQD6Wr{iض *# W|tx )q Ap5pۑF$Zfz)ʈ f2}H^]:I(3x#jn"KnWn[^V+73Φ,imٻ˲ D@+[fwv$R6Qu½ڝ^Q_kZP mC_0-|2x|lݶCK"YMD/\Uk3767" Cswm immg̨R*6oe c>Olܸ a-;x"q Ȁ =6FGSc32aF+BV0xcc]-QA1#a϶ ~8983Z[Rϴ®}n;;-yO5Z~]mf òsj-։#x7:myߍVZT͢c;n{82ol{TVVO(ISK3Ν) WSW^ "lcƦfdI ubҤL64?S~nn#?&+{_fRK|\aƏǬ35s]]a8=;J666λhll&%7%[@ߠ| aP|7H_iO38Rn^>x1؉n IDAT=W6~|Sp~VP";_9Oܖo1p<@:ٿg0 XpT qDA)IX y>+ޏX,6EE-K4[2-[49iYc[m;(¡3A bx=7qWл_[c EQ"BlС]~o޼y]iO#%af8e[@hz o^ \'D8ޓ"ͅ .XO?$QXosϋrb距=+@_=V F P^4%Pw LQ= u=0Vێ}z'} `PA|?6Gڀ?!?uZ~ A2H@>8۶ʎwg9܇[TUqjuHmQ+EY7r4M{7kEJ8yѢE]=+F,܄?GFF&"!aֆ(;rrrNp=?gNomm}5z?qK$:Cxޏ>$mDY@3 X,vU<8jcFzdYD⫦ec;$KL HJ3,Pc]ӧMei[vk׭狢x"+ 1G3brrvɶwtilm'} `PA|䨄Cv6桒#b"lLs dnOOI[[͠o񷖖q tQ8ASƖ$i89'E,OAtq$Q7{YEA!8N8H,X,6wƌ9/ j:X*i>N?dff1%Yw^6*.D"[ }RڶkAƍs\0p y%Y bY@E#lokÁEQ FNvjﶻi,yX>SÏ<EQ=>m}#''lOFcck׭y{`~ -]:8 bIÀ[_^T~q*~>Wo8AnĶo ]mauvvQ_xms6~%%غ{_Eq]AﺤDJKKm,۶H t;Ah())IuuRDDqLKoܜltI2_:#ӧSq3ͭ'>̒!.`Wli99 EECP^i_2,R]ӷ}H1cG3c覎%//[o*oGF;|aCI>dYfhaM- Ȋ+i86es3gvG {+$hcEhOޞ[.vsT)L۽|lOB1NpƲnQhM|q.))z8RcMFUUUU %%%/))q<ߛwXwÏyeL?s/__`w. ##T^^jjh絴~/_ r{dǶYvӧOclݺC YRʻ˗iY$ vX'رc;Ǎ˗I$\]v}*fU!?*Y,ߣ#p}"RYם:*qԆ%5mǽ=pv t 7(߱aANEэRZ{p)<,cE{R` 9H~Oz.|wɇFcMC>k#ajf[VsHd=%?M=^-U'!z|m_%[VǮ|pJ5M8ҧpsPj q땕4AQwTWW:암t[lqsg:PZ]]c9S8N8n.w20~8DQė,hI]蝝b t]ǶmDQDUU|} */߯ԚY,;g ?שotIf  5kɊeY 2̚1pH$NF w_=k׳zZ֮+z<᪪u6 C9QUQ @ʐxrk4 ov~ V"fZz{'N`ܸ1R6oBSSmͯKnL&IMttt 2( "meń))Ğ2M&M©~r|llL6MdYfWcx&`F)Hapy}I[YEj?B[N@_:JwsDf/Oj k;* ҡyU`f'gL%O=t4Ty.#FIhi'dhגk)Gf&dht'q4L-ZihxV$}*5@D *™I_{x<~s0^ q~v|ǟxX4S;,+Mi+.Z vUW]]rg8< | :tXEVNǏgJV`07~.9q;{S:.h5CWC6ss/} 7@ +OKt?/]|Ӂ4^HKާqoQc;D"i F"xgOnmk{LeIV' lY |h\RRVTUUǙ ի#,@KS ˗OZO*S\<=H0#*튢GUŒ$bqt˶g~}rLC UElF똖lئ ,]twz8y6G:>u2--ʹ( :::oh$== Kd93=/ ٶM20Lmi躎$r-&2^{~w)EKjz=?/%zow p^mqI@vؑz=7h:o6>;LX#\>p݂}S} KbIA%[8 M avƈSc8wq.y/|hqqOዚ=rQHױm 'MD]n%ţag-ʎ/!0 'Cw~`wX$L)n|$iFƩc&`D$ 05s>5,#$K /|\qetz-yY Ph6߱m>ĉB}nvV 1X^ZZJHDuuuY_=! "s&>EOYWGͩ Y2(&/Z2df8dX H"i8-@ d3hh\^EFW/1:VJ>(oP(_?Ï[^>B?qK~k ?۹K:\ d v0 <Ͼ!ŗ^iOlT˚K<^XdR,GӐt~mףZIw_zrмb%#d]VKzí]X&2T|$amcX"gãάsW6$$ZEl xCcƉ'c8'f<7$Ixb&11 DjzU! I-уT]֭[rRle:w8Qi?gy"!FŽ*VXdl&v_v#rD\P_^ݽu}d@VНZQUo9-/xQ4Rs""! 8ݒu4蘢 ]g%JeI02Ӌ< PgDnme[l .jf`1f' I"55uПJVv$$cE0ĝG^;vl:| c -- Dn;pؿ%Zx6om##*c(yEwUx *NUq5}n[qM[0YSӧNChiiFFfSkVziEQ 79u N8 b1㐗y..ۏӃndҥh޻e_W@i` #aFo$w0\(?zU~ #ի+"v^^s틀X/y9"t+tXƣv-JA^D'ˊu2TWŮnc<6<~nC8»W]3uPN3\6gz݊LjEGʼn)Ll<[ Rڤ6(R n; ) U!wژ ]xpH$[NJծ~Rmp3'@|7mԼ!}:kAթ1aR f ͽ]xUYCA/3/^[=^e^0VL:~}k\F]nZ'c~!M۠( }ClQHTTNC!Xvu:$tdee]|']׵blD"ԟƁ>ҖOy55ft;njطZrŽJJJʓTj8۶cg{rp[r̞=we(F1/!*z8)?ږ3LTYI~I"9wX{FȠ'CFu/ǽׇ/R):6 n(qA4'p('B5Xv6qԛq(:NtP{mg _Pb1yuU5ka!g ,qkD!ِ + $jK\:=uݨIь/w,uWg2.WQ@n rM!kYxVK+a(he`^zdBXcXeZbA>G,G$@恥e,YD*,T/;Ͼ d5%m"+08pL@SĊAՇ\}C~p8qg R116 }BΈnz~~>ny>x rcpᦥmKS|j%8µ/aaSnq;¨ǸqRҩ:6m*SSw_N{?WFu7V5uc)a^wAW|W 45}2ct.ى:MF=?bu:;6E/cft ӿ1ZQb <8)z~ Kx_yaɗᜓS`>$!0RERFy]tu |,'_^'7r~T7iXDOL3M/`:L PV59ьD3$Άe)KP\xdC$EOD5/Pk[ZB9 'yP%+fPK T0X9/A=iK &iP >%ێ@Mt3^yK~,Ѫ7 P%䖻uh"3:Xm+0{Caަ"@uE69^ܧ:k IDATc?.X]ΗbJ8̓3%$; ޒbmBcl!6{X";q\$?SP[Ҡ.9K겁^ӧ[kjjj,?BbՓ`{ `?Raadldp&R=NDPcg)rlo|$Cqo/C.~#z"_r~:T̀LںA$ ͜9THB"sEѮ0Vw pR8Dɂv'~LťM "o'Rj:L e5B"̹P?(ZXwAHjPU;vW$FſH(u%葰^,-ܸv+ׯulv+^^aIgg}c2 $IW߰{g7tA;:}ޒ)Ǐlm$ߨ}}3$Q_IzL @6eVI Zr Ŵ`YGJG~C8QJ`TTh%(& 5% {d##7΅@FA׷\("Q X;R DklhN4Ac pUlo_( ճw+VO3峸E$hBY;@:^/:XPqʾ1V)g+<`4JkAt]Xĸي,k*j>otI"Kc0Ʈ| yfjtUzYaXa3(&઴;`8eK).nu/ޢ%1h鴥!;p]U'o(p LsB{,7 $  EFAMA3,G!d :U5 /ؖw,r))H,™>ؼr6c}_My*ѓH,lp2gCk)2"a?"و_jiN]]!jl}0*f/2u"t8}[[`gkS'_Gz1ؾYH~v.v.XN^X1wIڬh% \J۽mN1;R .70P.q^X%B~U'æUJUh~_b!tB>K&~?lozQBH(c='|ٛxPJD &ENy%K%js9ԁjwoٶj>N)Ǎ$<_ 7aNޕZV!ɼI>ma|)}Yk3) <4! 8%F'7fhE(Ő܈RO 9b hkO`M}b6.$ 1nޅ;M),<:t:TG$rMTBvWWfg9m<"I _v0qh9`H6\vA&No]lZa##c@|;Gj{ٶwwN|ĢTC5D줩^C4J WVC3c߂7cنAq?}t=_.W~1V@izId:c,r턐}1163;ee f+gaϾ2޻8暫QYyWΚ$AUŗ^AE:0hF7jߗl_Vs&CSWq~l$0R>Q7Q# T)z .ӞaaX.J,ކǫoG*w,r6ΆC* A鄝SKxġAl"HT႐F,@$ D"@C)̉`o\ ; &KANYH[/ecj1m|9`~~Hx'U2{~w)Zɬ6xUH~=֙]<(O o@z!n)0}~~d&np7}+ELvD|*U~}m eF|q$mJUU``1(3]\>O4.sbG 20'XikB4pl0H4C>3=No+B{{.E`15-EϜz47JASS3N(dA׵Kyefd 3#c~;FoԾ/ž`tAp+|E~~foGQ71\|ъa5NSIKpPnO8v10b>niB*юAi4"!f8ri9Xhpm Y hWEi< '1b1@L2AKP(q2dP(6E`#Vt"+"4YC@0oNl_n#d~I% 4v*ub0wv*jB(!L@[8;p v+q{dN{9TN(`] W~n ŧOEegbU&v}1920Ī* ٙr`lCHCըI@a0ƬtBH.t{kuIi)ߩsHND@4Q2 ]ӯa3 R׃#T3^=A@ӵ,0hcpRJuUsBHQxr"oA>`%τC0QC9Dy 7j@RRQPEkkR.Eq\ F1Q> `v)V~`˕|1 )6˰q8 `>] ȇFMNWNN8l'A8r̳6NB|ЩuB \7Z;ֳL ;i{+Oh$ @n8; :x&SU@y.Q+Z#hhDFj1R'b21h!70z9&ң *evĩ_rƌ~6 p9zX(ǝ@:`81n)2ruv8ٱd4[Nz6(سzKQXVzn4{W[HikG)?ݥxg#9G\Zm|>>ZTBHccL'bc! s3K@5 $!げP*X*e4,.,« 5M[Du:UմUM# |&]S5.Wʀ]8xA?~crL(o܉[nrLuVQ<8Xu`mPUGPq -*Ç`ґ~Oj^48&h^7:kbf]Q MkȰCPݯvŹ?>|z"/<$ <0 Mq*= ՛Xo^nPkS`]TbT8l :OVx?v?x, љ|{"̳(r,! 6^91 !C$ !t8eeַCL .cPrg. j.*!pux µ9lZa eY!`{wΎ!}Lf1Zl7@H5`3Aj!m6u ۽5EudT-P6(VE2p,JdHV#?;}V 8M"g'Ȭlo{6}JN*nuficE;\2:_>^|2}0T0zwkR!~?R:҈S0Ҵ: BI fM4rmٶ,#G3eXxmKΠb9\|sB^[혧iZ@T](Mj}M/_[ZZyqnƴ"8pU "yfb/Uaӗq+rC4Emm=,~aX:uC6cT?kk Y r<Ƕ<~#WoI/zσqe\.!jJ$G9 Z"F7VL[9d=]EI&\&Y]4.H@&YM@X»11;bs!$D6M89:NHvTF1kXԳ GT0U>5z8=~M*ֆx #`N8l SyxfI$hA uZ"IZ.4B`q۠*T;)uWY֘]&|t2;˭ '{ jhi)̃E@M1Z*@La->j(?VnYj`W/~)VU1UbW a7 }N^/p ҆}w ^D4w7hq>w}B1?^W|'cG9 CBE0ǽ^y#qz׫:^j~MMi:CO,g1nSM$Y KuGi_۲mǵ7.a7,Y\Q/n9IUϝI$D' /8(.-/?)tt#3L=?>.>rEK/u0{(,0j?lَO#1u g)enԜcH~}G'0"1aD<zC?Z)0t-$Tɿap |yI棫9q@@$`Hp@ꫝP<23+GwpD6Z["jgUG K%Yը }$;p쀓q`|!X}׺jo1:C2})B _BHdaiwm,((|cSS̋ IDATBZ!G+4,FkF#]Fg0g)dwt7(-[w<mٶXU{83(ZZZwof yTץɓ&#@y1KCzZڏrt*1rss;G3wLe%fϞ5";SYym#yF޾궫] #F-H=ǞA8z\s0S_sۺ5o4 Ccd #O">XV1N_xܭ0RَZ.m˰5 s|"ۗ>-.;1+l-M5iPsܕv'}XYtp#}ܗq764'L΂iۿH2hѢIxTq-❈r.[#hQX;x8; v080Job@"@vLq7*+%f.bS٧["fpvW,LF\1c|̈́;FĒ `۷I-Wu'{@DE),\} [+@ώZ\#ϗ >+Y{LΔW$ ٠ZOn$] _{`}&|>_-c^og 9kc9\4]o~A)Hiz~Rײ늀DUUQ]]X,F8Bߺm7,<}Ǯ {UM]t;BHgj2BUUy;B F#эHVтqrt<7Mjzsq1(-2Ҟ9V-Vwɋ\^BW|ōK`ƌihnmѣ@Ds/:E1H$ UU<Ǐ7F1ѻ#j)a9@$fao=I"aDY>/:줨#}>< # ƙO*b aR-P sFM0F*H+jAČ<1מXi:qs,KY aWx7N WAҀ\1W9ُxX7*{*p㐑}ἲLQ ]=#/d"ځ]5 B8$Z#PtN 1f:8|5d4+ȲqY^wt 3wTxD,W`Q2c6)`7X7wX;q`/oܽŧo[W쐟/^ 52IpAVLbߧJ,}Z5g]:}d'-M$:XˣOC0wrL^E0nox| (5R`q_}LӶԇtL70qaOo;T<;9uh|QB과/?s42}v5O?BOU:GLDDH j?9U,w_ۜ/O>.oL_ -z#M+57eQ+>wYu2Y.&iD"Xry16M+(((MAëc^c,/H<=f̘7.L$"+ f!;; Z ;yS%K>m;g^KeH*ATh,39. n\i# yw{#~ëmD"7^76Zܵ^Ywf\6l|u:Q:O8R+I, ăvl|5 JRt}:GO>4ME vb_0P5GO>1N0_7jHb3mb_INVQd= (}t~Fߘ$6C.ɶbџa0Q'9%sbd%wsߛ@$je8W J@L{xo>!z`s!''& ԯF=ict%  fDLlSL Jg>o? V/SlZ e%jKzf5}e' Df h_[H@N牱sSC,>1b2}t&H*@)>$B1׫|dRJ&(((סfl< >g6MӺл'AS:jjk!%}ʥKu m^t},?u}|GGE-nFAA>BΜ̙q-76`>cد(jmբU7`nC߆;#lc/z‡Bo:u„\ND#17#?pD62.U^N):ÝENspܟH_}&2(oԾh%B#~lړA>`*iO$)P d,,9Ej5ԩr AQQOrJ#RFaϽs5a~C}X+CR\S/?|k/a_CD&;1o?ߠ`u;Lx``JuL:M"2Wγo#PuE Inۨ1JE(T]!wQV5I>?tmdyABBA*cl2 'yXgFxJi.8qz G"Rgqst‰4@.3_I~ |˻TM0ƜH xh oj|ˡr3y}{LC" 7p ܍?ϢN'֮{D]3Hl~i{׬^dżq͵WR b'~_hZt^Zې~ Qjf?z7O-ZqYFl_\PTe`#iFow COSMA.[><`'mK&4Q<x=]_5|jɏѣ Ûcse' & )PRëI'ZĬ-@5XA`E`7E, x}<_=,ʤB1HP؉dpRy[<ŒؕmkzKSwˀ.X}lZa!Z%( W!eYx sXf%p! \;qP<-3~B,crBﯫCv߭8- qSf` ;8BzDL*l[CW{E+=6e-ͭp8#veA-[^~R)l(\CcCl,v/K|AY>FhX3N)MvM}J9384 ]7LygqA>TMCn:}B[[+(f X-sP^aXtp M@]]YacQ[k[s1nѺW4:u;JwAQ=ܺO\ݭ}O8?H* ;QM7l%a4Ө־p~`es5/t|#`yRȮ9:YBθ4 Z8="Rd3]e'/` $U ƫeVP2A)PS%w~)4̂x莬M@7Ax;-B,_,_` B+uEydw`I6.uteCl~:RkVz_|yjG(|{C9A)))O%uõh] kj:M*LeapWţ:Gxq>Mɓ #@8 ]yNg*r48powv;nǤI<N@UYᦛ5#$M x1-۰8n{4M:.97,*qw>u]iESqģqO4 _k{Y)ScH*% jbP9/}91I|wy{aHT%dݾ.A6>F7jH2gs :BCSnZI0RðmiO8@ KM%l 0FN ӽN@HH13r>Dg=cap*S.A9Jy7&֍t,(?~[ΑjTٺjgVn`tDiPzE s{){ aR٩Nޭp*= )##'{.E~b`ߥN^~)r ÏWUP8~G|$y6 g#4 $yS3nj.!TUPT47|#(ՠѤPdA!$d@U 鰟X~ZqrmNW.8y4$j $Ɇ ^/[[Hz!,jF$yq)5C$PDvMS ",e}KUQa-5 eO,28Gn_?} 9!.nkG4d$ߨ}}]FB1D0U#+z¨ 1|ҕvrYR&è C&#uWY8t PA\CIॷȅ<`qT/5,xۖ_'%ri6k8LR2v8K7S5?lj􏌌| ,r1ѥt) ɥxRuq6x'OMhhG$&W0G!IkⓔBKc;w߇Q4y2ni)(@5G c:,ǂQ*%Ugvvv>nƿ wv.LK@E;>LιuF3b[#[ ۸!H!&Y$BM MgXWSB)!ږ).HXndd2En=ɒq%s;{}ۢQ|HiDd "2UDQ2O>̺t:d2uYud=``a3 ʠw_d';xxR*Mk:dYB)}8Xv9^Q|Yӈ>PX&<8T{t4Hfd['Sv}!~(CBiga^'_O@nh;ee!T 2fczsݴ1#.RG;/>FGr zp>> ooL{ h}\'s\ 8yDvܹrLs"!dc,yݵWw?ꙚD2x"qR8k ,]z,e[Dcx=n\套ѸsfLŋepQLE%o~K.\8n=ޢd2EQdoaa!b(rr %pݘ6e 6l؈"y^v۶`._̍=9XawD2[Y/& gBiiI݃#0oQ|Y>`Ktzs>|?r8.'8֔9U9"o8\]?vҟ)K@N%g dX#{} /}]n1|JHR,놑%QvAD⡇ҿoo6RJ[QҢ(Wwܓ)xJ.x1,8$5C s 4B3/AkkO:0` G@ l9%-x,Y J)IF,38~TEذa#JK:±.]7х@1q^x՝w}Rz[OO*<L„ S0۱̽H,}pc 9Z֪epVNg|Fx^fp*?LYr:#bZ0N|qTo+$}SnY.S[Z,sjmmNOtB`𞕩^|G1圫tzL u+yG?44-[9!X 8H0Xq٢#20w0 |PmiAWW\F2ʒTzEx,㪫c >|~?.`ppmEݽ’ /_Doo1m8^wOq_! ՝w}D"9w{};[XIazzzٶ-=QQ|Y>Nڙ8q?t8.dO\p\ԾhIdÁs.dgAprUqmݭQ (E8~@GL)r#3+s<Bx㍽7tӘɧ)|4͉ee(((9T&p m%#?FGbzA ,,+/EaQSMm B)ƍ+g d CtMmP5i"IBk~C t:]˲6&WM@ (L$в^!]ӾQ^濜]geYQJj &p4mwpfc׉-f㉎u=3;EY7TX2| E8 o# W16:dsqϝ; t P$Iz sBqXBAكuI˜c&l*I`&a !{!M?wtLHww9]>#!96 wѓٱguOO]*ژܮN@F!-KRe'ePE/sBH6gyeY،6/gPB<^ IDATg믽Q' '$Ibg D EQsR_>Qd?W3/Éxc8"Y8nd?JbSA?!kphhh 3gEs[ٜIy; 0UWzR{zB;3Jەp8?g$N$5}q삓'Hݮz{ _ǟB<&u$vתV\0­zYA׍o$sO"<(ʯW\sUd.,_'\NAd7/,ˢs>s<.00dY[ HqY S#eY?=׿/(ȇ@ ADPB?DIű``D"0t((,ׯxh?8"EN̙:F,YeEy]-׭cOz0/hZ۶K8H)Utz?$Hϴm"~]Yd?*ᜓlaܹW3MӺ b (<kPƳ$K@cp8,F dBtιbYq΋0筒$"C&<4_pνTR$/ \,GBDQ}ӦMh]ϠzEC~{J 1{S:'V13/?֊k:bJŻQ笸#V%fo{ ;wA$8k(@ *-{n8v77, pWb8&0<ۿ{UEY} ȝ53OEmjdM+v [m?11 Y|.I&b:Y=TUvWlSDKu]Rک(,J ^zCl.I,*qR'Bv 8@׎?|"̂@Gg_MIiFqVL Vo`mݎysf9χ`8R9~X^D!`(++Ϣ Y` avN,˲T >#E(WvD(=}Jv",J>.鎬,/O_4sDDž |lFwW]w.cݭdQ QQ]Vdtp;wQ-6H׏kk1W c(~m=>5A ,z4vwdCg'<402qJj`eHp @׆B-y9NZIWVV6n{(䜃sF6Fq{2 *+QeM;n֭124ahNR,­N ܣ@4ϫ? !CG9a;va:L eۍ3ßLiS%݋-[ L#n&51/Mä3"ŋ1{\h4 ]M(u X艀9mCe|>(.lM:**mt^ 0͵zhim&† ^x+m  x 2 @=1ؖ4aYlۆiڈ'cC[{v* {^8q.UmʫPY8VZ;pSTs\]7~ZbETVt]u}mÍ)r}NN_wޗ6~8_,C>Fcl6:K@>*]4_"l6{ dF "v :NψQu!Z@`lI%˪>*&u֢BĬp\(-鬑ϒ/?^~q~/>ۺa\\ppӡiTU\S>ENʥ2C&""Ph/<4٭ !Q?Gh|TM C*MRh?C~Gַ%ypGADC϶,)LFBȪ|?‰N&G+VV\cط7V4' p`)!QDu$2?۵Tƭ?GSQԋoCm͸WScT?R ̘O@$&M'p[7!; n#zՑL\~h;_ _Nf #8U9nEY8d q✟ں?`/KKK_hx'(%HRظy+MX[OFWW8c8kxױsnWdYD%_$KN7o*lٶ]={0DEaeAE455ŗ Qr6_E-(($a6lƕdM7AӲP[iL> ` {nm"> ;pE"?Sb aYdYƈU&cbĉp\߾6 bXh ^/(²C*?Qa+8@ )4]G2&lx Ec(//njYQ>m;B8 7-П{Ū,Y b\Փ` sC#B3< a J (0tZڽgyHs{3쓜E'G HUպǘF"RT>XqM7;ϪU|$ρir(J cR2r ØN?eYVaG~ӟޜ"ḿ$HGFAx0"?CixD("WqJ qϟ!DEZOo1 ȣ+g`lAls녢G+V</=H|@qpMn]!ӌy5w%pQx/+݁NwA^7m&a7+b8.Ն{EQC7`l`v}_x7{.g%kƫ| ;S@`2l&qj奧Yʟz8=/j./%6_ \ f8xOyc`2(ba-~9- =PXZB;=HDBL3Z[[BȶhdcR8`!?(1}*lَBaS"[ƏR]gEQl(m%+6 3lh(^P]][j;@ J>|u^=`3MKY ,"ߠ\QB;ܶg+`py˶'Λ7'Naش=l^Q* T+i'W=31v6Dpiyf !Acböm QVVS7Dۇ["AdnsԢG92Qշ@) HRhniF_&M3f3s@V@ mfBgJ$=G@qq ^lB8AF 0 X1t A--8aZ4Cq$Izr1|Fîs|> >3ׯ7[0,Nz? N|w}3{zzve9~o~y_Jj4Mٹl sf",* u;JǾ濾`Y֬\SJУ)$>/1DITO,h,~n !33u=樷:r$c/ߧe1+$-[XyNHf+%L44A舾 p{eԔR̀^zO27|f&Q9&5RA]u-+׭S6z14QZ:z NSɥׂ b$0t TD& Ϗbp6H`~hp;Iqߴ"Z/f^;MDQkAU\T7zXta^ob!jάmDtԛ9q)TV`0 `SkkLb(zo8~~~,lyy~LRw7n§ΝB\xCx~8Tt(*OPG 3$R*nZ?M3e~G$=3v{k%4ܦXD0(o]5;ߊkvz=0tn܄QXX3fzL-gEB9=!"**0GKqG#v7l" EF㑑>ݰ(n×PT:EQPPUPTR|B=]mG,sI%/P |8cƙEoG}{vJ)8G{ c9s.aE>}hhG_on$#.",>{d໰_oO~,{=d۶DEsC;$XILoK?;)2]=4UHHwQPmb(`t, ~0][_(hgmHsm3Sh3S=LWr/b_j{"5F6g#܌rJ `̸̒Vjj*<7Gj |r~N?&0Y=blYZq14&_5bT+Bəs1}6:0zhy3VKFgRLr 8c0 ӝ Rboؿ´k C!%|(ȅ@{ӟaUx"E^BXȧsݭ$CBҡPhDZ,!xێ?X:M˲TDǢ haMzk֮hapГi\QZ\t؄5kO\fa}}UYV%k{bղn;nUsyjhv,ۚn74 N{9Lۄ &ig2&p2SAHŐQ@rH8Ji z1z  JA)(PPJ\`ZyfYŁiS`ju##"KQ0~ơ:4|>Ara@*@׍e HY|rq}& DǍ_'׿V^]k׮5MI$!w,U`c/=ee#9f-PS{4ࠫ;90{&DIILځfpB@SS't wwߗNzb vH߿V>TAhxۉodHNq脣""}(-}PCƔ/Zg~zf %/~'Wδ^o\*^:_whWu81Ջ\:O&O"leK8堔G)E)migOq}utlܴ۶գu~?ibYeYE Y^xsM]1c:-nջ\L-D2k֭XhA!yUU QT1*kl4w^(E~ 77wP\X}A7%gYEUۏ@ Ӳ,G;;'t]]e9L"BI \*dU/@MM-f=iC3Z! +KW 2$IݻaFX Y3o$'N$caT4"1(’̟4ĄC[=qLFQ"LՕ㐓!gA89 4{ G+V|xE/D"e{q+~~bD]ߟ!!NE\Hti7kgk<42(WP,C0ȣR#_a: @-$`"{ OIvxyYJ!DQBIQgpr;`=g?ItSEzR5`;;.Y=i6,Wn[klFud,5}3onL8rzj|:ZCW=R~i l=pF-n[!Mm#ST !xdɚ `D?o6JǝdYE :\[+Ht&|gfE j"׭zk\׍4uo]Ǟ!tr&WqgYIe-[ᔰ@]{q,*'ľxW2/{_uk$o-lۉD?D$A$PJPU rcyX|9q'>"gFa3??F ؿH,CET@)%s0"\O 3g&ΞPk+,ۆm[z9{&_q GUSݷFgW'۶(l/0:::j۶g/Xp~ 7\ "O:;;8UPd۶ONcn~SbYVNP.] J)MK`ſ'a;{l( Ρd25B*z}9q7maƴJ y#c(bΒY#r;rLhJ&ǐ2U*thID̖F[*E\4g,0[3ryb) TEk:i^f;Ps(fD}̐0[oCZW&R3y`'A_:"7^$ 䋜 ⹅{{5Sf `f@&%%e*栻S[`Y Wv|!u4t\2r4_ё]9kʛඵ!l^q#Ub^7 3i/ ֹ{ zSC[vB$( f9YdQ | GYFRHIX] A R A(͘4>_*/-'E(7D đo8^U\.$ iAKa^?JJPPP@ѨǶs le6@d'{opJ1}u0wym*0?cps++++/ 5g@{WOOϚX,Vt}ć[via=Ed (P`[ZD|-Zc LRς1dd"TB I1n\ [|[viCwD"bltZm(ː'x^{ co6c?YO_ ъ7|.Yc5՛JC ➀6q.CJ"b 2'c  h;-D$LsvCˑ?:!W,']n~[=ֽ)h8z<$Z 0{"!D(wcT|y{@,74hMSկnh'?xdEeoi0Bn]fsp[Q`؇o}UoXcI FZrozI;dӂḈB(rq x2d!EcNye(j\W`WĆ/ x O/pAkU#@&.ZX 76f8¶Yk e,H&V%Z(m 1{,ݳDUO?s?cX+h8юƝ 'TY"4 h> !V&Hq16R]w,Y TEAAR PҖU*IFE੒ϩTd`&Һ W@AA!ƍx,>KgZ$I;2"Ⓛx<~s+n喟qկ_L$%|hl29,i޸ hj@w6hs6Ry8 !NHBs>1V @E^(nmm' G %Oh>Yo C(| &A־.9#t]vLLpwssf3tE k55^SUu^~~ 䖗 GNkhhH >}>VXl]ӦU~g=$$N/x& EQl8Ⱥ:P4I7d,8}Xj/,'D~ݩh~(|aG 8nzj_WWehII1D"qa{o~/~H̹naB*---I5a=UUUs?[o˖- %M;Lmo܅\DA|zTG}H Ņyxif}GtPk݁s.֦7Y4zRu\zb*"X#ې'aw*r\4z^\Wp5~s/n,jt[C(it!@+gL@j*nmS3vG=߃JZ|;E" HiT0N@ۋN)tFiK<|`,XƄߺf,G\""@֟=q$f"'h!k n=Qp P\ 1'ɯ`_H<^G{ˍW]Zv==p{REݔx㯭Q'ThMr&%7VpEQ|,KHkkx؜ QhOrp8畜 Z[[VVV :P@ R)ݽ\!t:!eBH16CǛkrge8暺 /ZXc9D ((}@]nH$VT^^.H QJUD5Ź^tuu_֜{Ī+Ϙ>P$BbCCF,D82t2T*_vPwUcN#(EQ 2DIC7H$!uSI0B(W$EAqqWPXbHa$)0O|R$B4PޮhG,"Ӄof,-H,iػw/n|>ߏNuv*Z@&Z^^~L2H$./xʕGuOMf^>o+WO)%vJ~p\>)}S!p-W66ӥ>AYq k{ο`%4upE{{oʇ)QUsy,k2(5ݩObB>9 !`0x)P@w( qrBt0;B=ɡPH rss9TV05̀J RSJ[8A+ iv1\[.\X;HI|d7k˖SOPzhXۋb\xtvw7~$RihZwB(@~VՑb~%1۶C$I.HJ(ze#8@8 ۶A !&2@$Evtu4,`e'2$˅d:Jٰz<(++Gaa!dI䌳aYYdqXOSL ^tEp$/晫Vs*!:cվp8%KK/]o߾V^=X伨iO²뮺 Qiccc{Y~(ɼ˲P(KӴ]q%Z[[oںue˖N rs~pAqaǙa՟`oK6?6K_Ө9g:|j6^^6c{>>/[;l2 wDu#\nsu^w\`lpG=ZyOs)mFWp. a;񜏖tLY'q/m@75 פmXh;aAvnԥa+({6 4F0`FP&ᆂ4lDv(wE@*$@bL6ϥܓۚz:֖ Τ8MY"a}zr|vka!4'- ix>P5=FΘ{ޟEΜ0_h,\0MJ)\+#۶H PYdq^~&߿sW_?DSxX3E9ussC~?|wW vvv> Grό_\ć˯!HእQ^V[ٗȑ!Zp(/-DM#,19'̑ h;SN6'bgΈ$mK׎|3{@ d$Bk5FKC{d *֦b.BP,DA1۬iUQAԊCn>q8'='%r|u\ڣQV )g/[4oșsڈח@|\*yg2WlVu |ƃdfI2Ul˛w3f|_QpYheqMQ0}VH%ܕC+L Kϝ˞j߾q _Kdd<}HcS\Ȅ# c80./ B`0&;s=dR0WQqbE UQ!$%4!1MCLp<85S0 @:"[\!B}]G믻fw~Abu{0+kxsCU][]-HBD40a|~xlqc00$`+d$9R:wuWuW7խ$=~zԪasʫy5NBñwl?Wbo/ CM!G Pʨ B$PE Jm,Bl]UUڊm۶aǎؾ};vڅCa``eUxK}Ht=c1uh ݎo} d̘: chQ]($so :zq v@:c˿2 ZLFB ;E( A1'EĮAQ^tB4pX4:@k7 I`1DD+ą :zb¦tԏeUSgGq\>I4I򖽥aq-- KPM/׍q߸ڃ@~d?@ypY7 3͟ȬOۿm|!'4a,tOw=bf]WؾQĭo[{6"bvRzt<1!*=+'ò35N2ũ;n/mmm2c É#Dy=!!Ho;me<(f^cH缔sӄie,谵=HQxfr0| Ћ@8$[ "1I#ЅoMr8B)v χ /K.T*Y}|뾻\8?Ȱ ۹6X4M{E0DUURE0oϲiC߿~HӧmݖںuYCE "ڵ+Kfo9xZ|>].}F//- v٘F mqv$SIM=؂S¥z6ooMfAu $PCA+n#}Oi/i#xW>[0|. p_]ؗ:zB@<@<9WvD@7KH[9P, YAERjSYx?A2%PBYԑjqoEr%Ģ̘S,m|Ǧ\+C>wIJH0x``# >M`Y T2/F,/WJEPrap'*sΧB˩ͫ'5xUˤF__ 1:A;DeNcI@گj6_1JAG*wY1iLӄ(cLQS UUf:0.5\H-|'vW4mp`Ҥ||Xj5|uuf(/;n+*@;0s0PQ(K #LCUmA!sdY CTW$.cU}*!O /@REDb@B,P5 [E}tr@2D&rBEp Ilm؆f'NĖ-[ H$uV|>B!R?۹9TEYE\,.}p|1)Dl|ο(> Vd=}P5|.G_4aM9s9d98JD !J>tDz23ɜ R)DAQ- 1cעFƮwZ(ej M5}j4K1n *J@ iRp8J `FC q0NVbֲ&\h1{Ae\P"mM +R;0:9WmFްz$u`bGMh ? IDATwko+g0 .ɀ LjG24y(_F) Ϻǹ=L7N&xH]2R8)\n+8\qzrM_B!.32$xvs(Y>vbރ9gT+hRI -NpL~!G"8)!D4J `&3tJ 2!d4GgWr4/E ]}luF缚d !cq*ӰUoHH\y%߽{YM[( p:ݧ8soXvtWaqؽ{\.vQ?)䕂sJ %mꭠ²̅eYC=sYe B RRAH0`.'**+*i  *"f +@"2%?Mסj*|R Cc1Ȱ ۹7UUrpuaɒ%4~\;Ji?MӆktR\tE+AN{?[_!iY49TUU)7t9YC9)DufYV)۬eYW&{3N?\f~˧ށx}^<4,ßq3ƍR1<̋Dg$A5+ĄnwiӧF13[P vwa܀پ+Qr}-!|PNBGiD88JپYhϷLt3"NB2CnD88!jQl33: }Jц>ԓ*d@%YP"N* Fտ潽 8tp:/ّ&h#*=a pT[S22EQ|ˀ^>Q^yp6!5'!S.-Eah"?ǃ|HN\.w?Q| 0tA8-$•(eN65 laI&&ZYY|{A.kmm9O iyyq`rt㦃M,J`s&e1 O*z !Z:>ק>ocw}n&s>jƌ Hx|?΀jN6q#QQB2AGW/ HVKĄQ!>ƍի맟~2{<$N,VQBUi 4U' .b%bqD&7)5ٮ-P]Ӄ3n}]|7TV@<QcK,x1C4 ʰHG*C_I= 瀟 p6l?emx^l1oXUI;T^k7vG:a÷Ae Pvbմ3%{q0-L0Ac # ծ6Z ifm@Ii%tHՈ>} s'[} L@8Z[[r/0r@)6+f7v%tc3/B1"v-,LM]#/Y9NDp5WIdUs9I]s @$ιOU k܄ s&(W8dMDjy9IADD$ J?E$T-P#ρ[@D1lv;L=?^[[{K8F(–-[0000jDs{cSB6 V_7$BP]$ p0j$\%k5eo<%roWZT1Ud 3͸|.}.r%|T q֠\P"qzlJlvx!Sઍ;r%kЯ*LA%\E8(tĞ\;FjRZnlrA-*q-.|fD A)" KiilPhШP{)_ *H&:Dz@7>Θzq5BzR`f  c/?ok<ӥ[q|뛧UPHzJeDTTK{>Ȅɻ;c+:E4޴mlѹe71ox>Of i}# Ԇm9{#Ǝ[QsM۠8x eBlvH!}0pF< 1CB80 s[$P-H`FJ9L@&y~(tPBq9p::r,f0!9$T@E ]7`1Ӊ ,L,1ac\pO?9Eyv\aJrx<P5R[` -1J+TL LMn 14y-p_`WX>_+?%< s f+k #@Ny5/H{}[[16{@utt^>." YTӴp,K3ΪW|ȞS+KM˚EM~К0iXv QEI\q]wo_~{@I흱e6r騩ݲs]n5oa3QAR.w:4iP9> @Wuԏ{, QA ᔐbjޒ w8<3҃\.Bn7<Mwn( )IDlФiJ~tkD"$Ijy>E8lv޳!>8y59D,8ŧ{h4bw{V׷xbnjZz?QJq}M ҴiӦM`ƱdYs6lJŋ1J.B*@}U%b$ MאSYP9G:؉];Q!C0N"20o $חaӾ0tˎ\ͧa" ]yduy;GF*`nvD~J\蚈\36ė z_ઍ{z 26]c)#.d*I`2;?E$XD=]N>m2Y7#z#2eR5cjaX ]lȅS@րo`E)xNA>n&_Yhw? ^ §+!5roa4m`0-YՄɧvsAjDs$g󙚦Rp8 ы 9NǡM_ @ HOuP&tPBAڵ@UZAAUݧBh,,JB7M󝁁DQ1rdn3gdRwwH/N&e}Hw3n-3UO1@mZ,P Qr@d(Á`(:X:Qb1 Tekq@8ee3_ـ;d9/ } CsSxH&s3tww4ߏ4яݰ8jkk!;!|.@Aii)2 bdt(+od؆ b~'|~᧞zy=yf'ɻ=}.xM7ݴaŊ"ȃ\sW%yaÆ?6JiLu:X$ .2aiM[cP%lуl; @P:BdD=~ b{]0 yVt:o E+_9gsfLqEP*lw Jd5m13q-:92{+fhØk )W]4@ED_|hT` L1\AD>Tlp3BH%A nǧoo?Sʹg}s/ @D9йVȼW t̹D [#6ҤzD°6"룝לB0#]H AO=<]wRÉJ\kkk|rkk넆ɜ8祄pdv? , X~U(q& #TF4/ #)QdUDZXڊOVɌQeM&-\f;z=Kؼy+6mنKO=B%ٻ2)W__x=wwwFx}#Sɔ'7_q1PJ He $Q,%S5551qw`(?c PUUUh.4Tv-p! sǝ;v0iݹh4 ,u?"=l6 dɱ41aؼy/f ַvs{h4`7??9W.{}|߾}o-^P(4) VSJI"Du]E).YD;s*nX~t"b}↪{. "mW>#Bgwth,C,i(/x?=~B} " I}kfWmg^VuPT}u0,@``Q| QKZ& 7F[9fOD2W]dϫ92hdq+*'( 6i" zpjjzֽn;'˷4E0MIQ^U(\ YnΡrĺ59b8w|]k7Dgvن$Qz@u544ommq/jmmU!q࣌1v !dsCCC9ܩ(۲UX?<? pUsdUbU9GbVղ+(QȊOVɜs'Ҵ,  \WEYbp) .d2֭ۄ0a+>&2fA?tMCgWD<ւ778e9sDaө/|m!LeZƅxytt#b e.'e  MH&hoDYE(6`E_wmmmH ip2DYSqAdIҒ,of25;w)=ZnB@?2 % v 4px Z"X [ Bn7ڱw$&J +? O6l_<Ų@WWן~^w@{ojjaBk/^l馛78N{d(3i8?=v>UV J>w9\H8AE(&׏@cF~e,ROfpAH(JQHx OK ?~7^mR6=7DNd."`CXvpϽ,67]Vj#1A[C8=O( *%ӉkU{"oVlF}@}io hNe>s/H^a7g IDAT;WMM}vdDg[1j!ł0 /Ts|LI3ZbK3$V$6|;e9zǧ@UPj}XYՎHd8`- mp8?8c5 Op_/^g/X,r-,Hg2vU,{|]jY"g&V4.2< a7FcOѣ/0~4ceO:Q_[;Č }AAAEÖ-[+cl>haސ'yY4}bLx<,x㭯 x{ |Ϻ 1Ȓ՟E[k _Pdxtj>ݻvAUX12tO ͪڎv3PQBvCv @4]c%$F\nr0ʚ/rBpd2hjj)tQ)mrC3~4jƾL  `Yvځ={ x%Br>lŴ;3se$Y~.A l۠"VhemvpfP>3*o,C>?~rXˍllK{%# ѕBz#Qxz ȦC;gGNB6]<7t E#(ʏK^ 8 89[[[lŵy57/<B~}s&{fG"w, {{_1+{O6 J5ZtO*ŁCݨ( C!"b@ cS4è1 NQLjjg+ ŗf]Y 00m;0axT48%KiEc /|3SJv Ӝ.."tw[l7o~#qk}} f1/\)(`YQ@x-e Hv8H(Br8#L}O0&TMC``Q ,jEtMR4Ifcv ƎÈR4t*nG:II,Kk8><5 ۰}{=\{4eYX,s;%֫^xav<a>)//>"?*.<7>yݯ_& mj u#fћrA7M 0Q`:rjnnb._Tx)Q|g{!Œv n1'1{ApOKdTL d2;NRLӆnwwԗ& #w &ǚ yuFّw;+HJJsiawx9qۋEqjv-d?T4>ZaMv* :/@\CP|)l 3Hrn-Xk߄ Ax \>}=Y8΁OCy 'VT+|[PUUҬ+.tZ#SJvj44cP|`̂ieD[nØqQS[UסP 63եDeMqͻ{^YC7o  GW\Ir t(؅ |{M UeGz"2)i "¥~ːDV?4ͤюn6 H,8.yM/3?Y/ŲRQa,Z_V P(`&L$j ҏ?^oZG^;0EJՍ@IiTUGggc4 i1f+t˄aL*3A I.*Q_W`({:COZmܞ|,O\gy_z饩/9ND">m.kX%IR{yyn- /̶,˯il6{`meeeY7=zٿOnEY5!#$ O0 Y57@ gd3=Eઍ? FP8E'>WUp귐~nʒ7qh{$c@U!G|E"LASKG-m|Pɕ]mDZu'e[cQ<$ûnMA6 PWA4 >82g`GQؘ RRRڊP& 1x,+$$J)Poi_&K/3L0šu0f(޳cƍEMMTUcl(=b 퀻xpf^610 -e2,X]O3 S"K.%.|fOg1_D 98oSAqp:z_iYVv\uՕnط+V4²,_F(T[J=ݑiiiZCi3M<ǭty kZ[;P8DADZUT4t]/,Y' CE~0R (@ dED_W7@$@ yœRvӬYjW*455,bpA  bӴ# ".'AzAplو;wb. ,--/,Y'Ibv4lvfV[[?9nS[[=NQ,~R.K'EQ+p8Vdv{O_<$^l=?IPHv!`I909_v88q/J~N$ݝ}%1$D@"A1 H sA? WPQA * KBIK鵪G/$OzԩSsPWt~k\5H;uu~P(´RQ_MW(gdrK4k%o6ƧPJMͦMX:,Ǟ8 =dO$%%"&&2n,2^M%#"0 \,=LRHJ6ʁ imyBBeoCb);MM0`l<(er"JXr~b1GkRvZ_VvJЯbV FJ"rf;abdBkk jjtAUu5s\.pL"2&n&. >qjժkBBD"g3\^lvmܨjii µ췆Ww=ޔ#w 7 hmq)@j5cqM\bbࠔ+**&vӮkz]#Դ[#8Ji4MJ_,0 ]BvX,>SB8@*g Kp0B!^Wv TB,5|mtMDx?@eY G*  C S1Q Ell,Xuoto JL ]k2r9 0YE|G EO)D@p:@la AN$8 e_Jgg?xl2-FUgLz}PHxxFա BB4P*6 & ͜bvmVSkr/J*oM=fD n>ן%cf/V $8nVlPȂd9WJ>un2A)+Rp`Y>r>)/Hf@ ˵D"y )rUi#=P O7i0DBq6JU#@<&L/pp΅*n uup8 #(chGD\x\ "< <;`8BBCޗH$k+--GJ%d2%"啍8N(Ճ2ʲ'f+U1<̪PͩTQp\p:@"fZz`: ↗O*@ p8r9uTN  0aA%!xv/RJm)Bo%cߝqy,TO$~UJM Mo455H$^J)7PD\nڗN(D"xu׿ |K~|uBZ[Z)/ =r7W,7.cΓk7~h4䆆uz):OEeRi 0lSAv\vF.Ǔ38k속a=9·NgyVX,v"s0y8ljw=| @(SaYVD)fI} 3o7WJ0?.C)UGXP2 ((yuי|=oiZXlPTy5LX,7r Qդ/?Zd| [n]nZ@.m[@R2YӜNu*&T ݋7ثΜ>}z.gh`ow>qdZ$ MII)X9t,.xY}T:LoH7cqw\ZX\L=:foIB~CxV,;b urQJ9N!5;T;``P}AM(.M6-|{3$D3ad0`Hvchii R RiSA}ixNO{}=g2331jԨ5j.]g6'''feƨQ0j(|駟F &,|kkPPHMMUUصk3ϝ;7&MʓJj:綾^df~:l6iii t҆ͅ_Q_ EŽ"!%%%>s8]^>˲}M*ޓx\4:n%pjnND)R!"48 j=AeWx{跄̚5 f͂bǏg766.[pۻ?R Tr:Cj5y<P/6(vm(++˾;wźƯ'ƍkֻ+]kbrL&:a„SQQҴ;{Uǎ[r% BT޺( ~&nⷀeK=9]N% H{1|P$&@H y`"(0Q<9Ǐ22F"::P]]g$/^Evn MMŮݻw K_RSn0HKMYW2 BR#$ߦ+G)HdEbbNHKWVVq,BxnG]}=#"P[_nv?r'Ot0Y$S( J$e-=jJj78wV0W:~^=N :26b--6()99BV%(5Z,#-}bc!a0`040 K^ϗ rYhhٳ/ ؈իWwȑ#1tPvl6cΝ YYY O_x^{G{466BBRaҤIPTصk7|G6nܨ>G}:re\N]ryX,.T(~ 87r&IdobE߹g?Z/FGA!9Xm05,|k*| _,XyϿT$b1v.ep\himEzPU4hIH_+!!}T*]Hq7ngaZjʍ¦E%RSd40} ;LemZnteB(RJoO)j =,^09rhX#`4⛼`2t@P( ;!$㸻;;"EͰX,ŐH$Z߿?233RyݚfV+ J1b۩bҙψ#~d2!66ʧV V`0#Q^^Rܹ0`FN\n#""S?WmDDb1/_ͪ3>@QQB!L&n7z}[M֬YBDGGcΝ8"h*ׯ ķ\8 ^8p5kVfPPP}wGMX,ڊ+WB,vC,b63hѢn[_Wg nO.bP8ޕ{SL||~K[ ײWSS5|E/VʴZ zrv=ngZ,|MZ~3,oi`F`N1Fe-l5ͽ34c*bN8Z9Y cjMe-k'C$b].ΝbJrXtq_L(*mpr A!_+&!%fńLekMBz+ߵB!_v\œ ơowIҙEQqכA)sЧl&x4t:Ji*Ӊ%$E0`@JKq9aڜQ/';ێwS#66mf'&T*={ǂuWLx`y|8\.~gƢ0 *2dRSS1qD#55>|?q#GĩS#G~KhĀ`6qAjLs*Q8{,d2YAVGaa!piC ?ɓ嗔hސJפp4 v{G}p9U7nܨfe1 cd?K$"@!Q ۝p8bY6vk>y焆>{,oiѲom;ւB3ysۈ[28"VCb=bqMOtDaOǨQ#VwhSPIJ EhCMS1l(Ɵu8HX>*u <[Zˑ*( &h\ }[ as_uv}9+yu$!d/@)#GfU̔JmB1Rpׁl1 ;GrfNׅ'ٷ?$aUrh 9X'k^+CݸAP鴃gyB8\.7# o6&pJT&O'׮lYҢ [9La6~>)  8nYq`|[7J%p /b @|Cvv6֭[_',>,}Q=eee_)S`Ϟ=]`CC?c_2331y˒o֬Y0L0(//ѣGa0 HP[[ ZY;wDUU믿!o2TVV";;s|7ezx1uT+A]]1ddddtI> TUUutK)Çܷ\.ǡCCgŦMdɒ˚VB\\~W䠢?bq`61bfl61 E /r_C>rssvݬbNѼ?iCO_zh4nv:Cꎮ\kձ5sƖ >C) ~rvfL`?llyN <(wKt:O@UWHHHEp{صk}Qdff"333@l… t\{.pСC0 7o`۶m9s&T*W\\7x#cZZp8ŋ_-IOOÇb h4wuVZ'7gΜ|Xv-Ν^xr|r۷ٽ&pđ#Gz;$''㫯Œ3yf<ƢEh;Aaĉ`-{bȐ!Xre?|(ĵʕ+ljj dg ;gΜg`Upnjjdʕw&![f7cnH(@@P[ՀP B48[USr6GPhK^H$<PsRS7hxX l-*.rMDR)iq1 ƀ>]*`%*OUVV qt]YB(76?t:qx!dRiTo7/ <@RVJ as*xSrqc3m.Bpq, RQ.gL{]3=nhcwOA)x8\ Dz@; ~u@YYl6~UUU8y$[oFBJJ fϞUVr?;d2-(uv4ir9, n݊>/ND"Պ*u7éS ̞=O/?m5k[o!77+KX,BT@.hp8qv;oB.#55>h)..ƞ={PRR/33/!Jqa.$!EEEǩ W\%!y>DTF,'Xq_oϑJ rRJQBaщ7tU BG qJAE;^t8J,0LJ in2a*D"Ѿ='Z-SJGSJ/ !{ob&; {Gs 4dnܽ,!I\@p)<,,*!Q"EOqk1͙9=蘄/:Y=t~DEEa Aii)VX~ุ8 <8QSSZ Á$7o͛1uTY&)99>nwz=f͚p$'' ;v츪򕗗cͰZصk<'Obݦ刍g}&_ii)~deeUVajټΝyARʲpdF֬Y*HCkkk]OsvZ"##v^GRRrrr:G9pVZ^sW^ApppcW|K,%e+|!!!2 ---)6 IDAT"\w3FZ*ӟ*44YfYn;MVgrXVK[[[R駟59+=y=YYY|_]@gjժ ؛l7k݀&bC#9)RUz>qE-pqQ=PQAbs7,"Df`&PcīC]h^tl|#o˲/BDS1UpohWqW\;8K^,Vkk%"#?RSZ|l00>.S# y|;v@yy9Fdl۶ 'N@ll H88q"}QL:֭95.wk9QDEE^oEtte?]VʔdggeiccIqk駯/^P(֫ꂾh~!>CV'|[,YR4**j }f=v|}IiVVVh,ooݺu-q UiB\SS 0d <Je goy((<OaC7 N#˦ǽ3&I ` KGLL8wE%AWH>vB&$#shh0a^ߘ7z? Mq8D"N英y~ 4RCa] d!4T= |7B";YFpBs P&;!Ru!)EsBDA5?yaԨQXf ^{5`ڵ4hv{ @Uեk[ԩSUN3`k\SZ-sN,Z۶mCXX؊ | rO.Ts WFNNVZ)A#%%SN͛#==7EZƄ c[K{4~*⋀RY;v "›Kax뭷m?{lX,dgg_- !!a)S+aؿ?E"קOn^xWi}-nӧO|_|8B¦%K|_p֬YR.]~~>Ϸo߾X,vܹW>GE_^()Sddd588Nu",=wլ73I1͘1ꐡCɩJS˗͘8fsI% .I@DHKM9{a.0-5z-Koد_r,`)&zodD8BPW0̎⒇RS̽飨$RMdzMBnX2mCӆ8xaD8Ueee,BRj/|:NG)N)Z+׶J@N'jvsart#8XZt[0 2nl!)qDqDسw! /{h(h̞k]q``G/BL `6[RO)@!SR*X[, .^Q}6F;CzUx xw0k,̟??Vϼ>699qTo 醔黖{Arr2 ??eFYԴ/k'HC ^.Y@*yg}âE0jԨtTUU]Drrrc(ߐ!Cp L6 vBnn.YQVVPnj:֢ 'OFRR477p ..<~z7|{t:Q__?Z-Nfۑ}ٴ7Kk~A,_$/HHH)S:ȗ3gRnzǥ! [ә ++KRdwYڑ}VVVn/]fM)!dɓ}јg=z2++K[+^x0QPE ,xY~㤦J%a-ࠇjGMM_OyXE_^y=ε6knnvIU* ,f3B"a`ǧS]]GyyyyxG9r$.4##'N dp_#''III୴w0l0(ʀSTTT ;;|>V+4 + =ҾܪI&ڵ+{ʔ)ל #m]]uwMLwm9˲cbb~C M=Ю/NIIykѣGu̙!6={-ʹ58P ݉j $VpAM]qܓEQ]ozpbs@B1ai%8:;ί p ]v[00f D5풱|eϫ;% g{4{X-e* V+""25 N3% 6(/<߾ϙ}J62I l! ŀKqEAAOk?RZ|HQPT V,bR@%B6 @LHB9,N|+dfμ9y9l72Ӯ& MrG2x,L䛭6;cEw9ÁT*FNGkuz G,V!f}gΖ G902,jՍ(joqI٬.G!$$uwQqi<= J{9EQFiei!$Cr !#XU^NSej?jKeeeB4Bd[upxY^ HNNb Lz%ef ` # R^^"V$'f6.˹'N -zع4E-VC6"<|@(x;fSܺ=j6L@+ɖ<1o%KlCCf,\AЉ'NtY@@  >>0l}^~!UWWt:lqd[5MNUUmpgƮ]ظbq#GqqqHKKC~~~#{nH6lʕ+pB18qjjj&D"ݻ7hwr8SO='o 8p@@ xpٲeU~МhPTTz8N۷?0Rr6lؐx^ oe2n>(="""cڴi-s\o0Fu|0g=>kjjG2c t=p1f!|=p͋r4, yKXP)bm Ɛ)2x8r-/}VՌOJz>syvA)ܟb@: <ƃwJ9 .$mFSyE5ߠJqMpx&X z|pWaty`' C/zbw/d>=oxDmIs Vta?)p3 3M'@$22M.B⒲2Nt>x$H$i~/))qò2Kb\YztQNi(JG`&$gY6FZm0BH"EQ(JB2ܩjh&>l# ,в9@s0.ez,v;N'8X3$\W.ʐ=%r( B m 祖9 4MlϥR9rH\\A;w y[ʭOg]9= NHH6Oǫ% [o0cbbb0 59&&&s ~/D-oѮ>۷ojڴi۷o'{Gq'͛^ eC >uԏ&I@rĉP*mXוJ%֯_/ ?H^b:#FL7W_}Uԯ_T*e^ .\JBLL L&SFRt򊓓 MbFr]x l.f͚e:s̍:gŜR4}7:}W{"˹r<t˪eJiP `9 SdDphǗ!bFayrZS;Gfb萡lXw 4,0YH Ok:#fܐ$hnvRJK/`R8ȤX.ߑ+jGЀ84 hl E |Vz SFԙ,91w1[,"ߍR Xku nձ^m~f*.)wKDGEz;Nq.rRRRmz=3`ޒ%s8C`\.7Npq; 0E>~`)pq7vx>ł<ƆDR D5"! YGYF `KGi Ab("2">:;w|]9=e-Sdd$4 ࡇVŤI:ܾZSNErr2_ IDATi&̛7 V A㺾MMM`OX,FFFlnnFuuh!V(J,KZ pÊ+֮]?HGW F~~~,XL7V7nH$ېZ޽8p -]4g5uv}jnVJee%fK/v;b1۷/p)Sڵkix[:wvs\A7:|4i]ө~{ grټ^/;3f̠((WTA4MSneƊn@"rj 08\2 >%DT&c*D!2'b ?Ф#cHFGC M͈ ]|fp( 2$LB].-zTի>Ȉ4tbTRR8,H yop12J˅aar\1C40|xx JK1|n˥w^ArZT"nYHqI'iOafoX,xmMSe~l]]S SOd]0wqIS5?¡iT\R0|.a&߯'b{o޸c_ 2>~Eիjseee5vlre9RkwGnJ3>J{2eDP~M<і?.(O<0 NSN}zkn Fn{{=Gy睯=z@s;w.t:N>?)Szccc\./ae6/744R)w/bf;_B1cawyh0 ^u-_Q/XP9(kpsX[NA R"07㡩˂G1jX,@,#1^1w"2B Ɍ ۿBdLkAHI `/Db!bU`X :Ūl@|ZxФLc"J(`K]-Xυ+&_Azw)ɨk8@ؘnv &*Ӂ&DGGo1 /kZ|/*ō޾_Ǔ*r^qIّ 9@uo>>LW#0%eq8OCc\eۭtV:h~7.64.. ZP믵*ԉnuSSVζ0`S7hdt8Z Μ:uʐ$NJJ}۷3˳>111~_G,BN;EӴzw.Sf+T2ەtmu­ vN!u6 QaHXbZ0mMѲHJzM (B?)4Օ,ˊXVR؜k'Kʜ:]3%?z"ne7y<!&oLgpI瞪T6Mӕ<ﻎ/j5SYYy2E]`"2(kV,@QTZH;F3~V+ b!d L ,!X/Pe"b +(ʘ=9+5a I9~P7GDcʔI`Yg|>k_ܬ5c.Iw>5~]Fz{l{/&Le˖aϞ=m ,V4P;0w^(JTWW- @I{J_үc@֭[M0Ǐ"^ ?LMٷo z1k֬t2 ;v,B7 nS^^WgὁǾ__JN̙3Ǵq˕ 9jܼZhQZ՚S[[m;k,G}޽{W$$$ܟp9s:+ovvfwOcފSN}1eʔтE%l9ӧ(Jwʽ^~=?aaa<\ EN}w~Kc>5[9x6?đhh#:fJ<<#D# iCPvFm8lvXB|)k"!`Y`ty,n.\DCNIIj< hD-.)4O't B|eB>7MM7)*BS_veS !AhJ<mäʳA,j(8>l@5QUYa%Qu i > {JÕ,8_P=%q>z9 MQqAɡ(ehui7h8@ .C>>; JA5BJ.bL`\'d0#Y0cd3[!5)uWl4C(DkHDv=TqչRa FBX݊H>` ˁP(H$Q7546DEEf!ڊP!D#8ΆiK\!Y:0p/QaXD"h37MhZ&hZZZ @oNJX@Q5Za% z7aQ k5eD/G9EQ [Cre)PZ>aY M5s:aRą>֜qnٶwMM9xHԓs0iNs4 ;ӗ? C*Fyy9;"-!T!1un/>><.]SN=YUU\vm`xr>}:.]N^K Uzqaա_~U%%%Tg緬 8sL=A=PFǏ#..ǏiT?0}[_ {_|njW7[gyj͚5v=h4 Ȼ566yg̘qMo?J7j(ŨQpo[G3ޭ=1-vFfRLL՚aZjj*~m>jD\ vڥ+),,Ğ={`ۃ] Vs aaaOU *~v׭[ڒ%K޺ٴiD1f^^}ƌ'-ξo„ abp, ɜfXvx<$ETr͖N8_r;<ر0aL2bD&zؾ=7H%}h<;=^ʼn -_ɰĂyӦ(̙5/o x7_S)PedLqF ÇtdoҥK4hPE^֯RtH$ߏf蜑2Z7>H83cE&yH`ilfp[{t7Vm !C_iZ>!.BHEQ'jSAtθٓeXf2S?rk #?|6aa84D,S9s9*(S?D544aM:Mܺ-wғO<~V\g4MkBO '&iEQsy˗rӦM z}&&&_;#ڵ | ‚^qR ݎ~3:3JWrL7?oE|>_+ ϟ?6- oF:n\f ];,X'q\h4x뭷}+KbZe477vncÆ Gm(OP9qrrr[_ff&Ν; 7Pl}%Ёj477ؼyW ,(}ٳGa>K/ꭱ … +?˛Rbi C]cccQ}}wn}zk/|+(P T MM-b0yCl0?u;[{ ũ8)(dbȤbVGEQ\ @.́@,(yqkgdwBbuk2~ ф3MF\xɑ$@نf}ⅈ00-!^0Bq[dKz[ fɊ@qQ  Tk/, Ja@A #S*Kч3Ыa4pHO{f*BqI[7IJ,'KN5"sx%^0^tRN^YY)(TVwˁVdYr vmix˯^m`CX0xBo .ӾT6_ F'CPr6Io޵=sx3ˎ8Fi ItŲ~]vk ;}ZNi-ӧOG||<֯_^:1)))( 3f@fffcYkk(//N); 9"Ǹlٲ5k֬ZxrÆ A^{ M/&&<?Ht% J/-- DdBh4vHt̓k̛7gZ{B0͛-gn5m<jg̘PUUuJ'ӥ(4mIywBIԡ,F4Z XV0XHNP X(RT7átA,p!b #tB ګưCe|pl.5x][<@aÆe 77{@T]AyyE(aW@6Q\RɤKB<|RdIqIٺQzZ]*#=,KѴ$ ŎJQԏ> .͛{C5663g 40yO/_ HT jڵkGVWWx?A· &r8p ϟ\.\.ԩS#̙3Xb`Xwǽ3{Tk֬xrcf|p8h4xiӦÇowu%JW3HKKdš5kj[En̙3ǴaÆ& @yTTӋ/.YǑ煯I-B/  P*PݠC?[5;MF+x-3s8NBp()7t tBbb^ŝwBŠA8y* >,\.ǰC10u pJ=tp٢RovXT( ˀi|xŴ IDAT^p94 B$j(H0U]lYsGY^\RƚLW*WsMop9 @"y)P-X.X@ˇ@EQ޽{9K.j<MYfu.))W_};|**^=b ǤI(۷/Hֶ`yX~}[r%rss1iҤAŏAaƍUK..))q~;B}QѣxW{P(p]wA$a̙y0a_@Zн>p!#FK~ߗ_~q9t:j;v fƃ>\rGh4bɒ%Xb$ [ 6Cr_ŋ ?q__|=oӦM>gF r|kGDl6gHV㚹^EBt| 5}raGHlT8 P4# !|5%FŅm6sVҥH5@ wߍ4B P !!Wmx< > >n> t V X Lڧ mmX%#=%eǃhR/o Z@ %!$`q~ftuB9= HRS&O$;wMt\wH$C޺=wT^r 0.$&&|9҆nB@hP,-2,mN Bt͜ nTI {bco4xbcmRؙ2B!X.|4һ?9bc} _|E;v $$$y$_muu5FPB k{brbccos=l07ocP]]PT(//G||| FA|||w}4f̘*\^|ycʂP(ā3ի?ߐd]7}t$&&bڴi-h4BݰNVcm̷'ӧv1tPL0OFvv6*++qn_{/::ϟ^2 [l@ bAbb"RSSxb\r:Νg6b ?u) @n 6lP0ʦwW^=WRxnnڴi^_a'>z >3u JyD ˢB%(e(*b|)?B@lX,<e*! {U@!'OB!åW}r7#`YD,Ɛ?Fǎf$Pi},|D(p  Pert DAhFCcX! %eñ>z; `(۩O~k?h[:V{' rod]썃2y"ٲu8;?dk-()vB%Ǽں'>w1Kج`^444!&&G^Y Brrxp9ݨ("m۱ss+߶}P}s^?ſo͘eێfc㭫<j~Rwn*K r|P\bxkǥv~Z&>ï~+T*џ8&LL9vjkkjQVV#Gb2dH#xXǏ1zh8p mp8Fb8hpr߿aaa-~EEEسg"?#Ν;*,Yj <;R(P(xZ68T93f Dll,d2 sk׮zV]vFB>Ñ:cݞt:3vZX|T xUQQQųf2mڴi"0 5j|瑑M~" M鎘,8jgx45[• kI&HLǗԌFåKY^W:tfk BL& vRR-"#1l ܍ qwoQSR(tzzN:@?f Je,.)Xs=Qn _ $Swdfr?d ǹn)KU!"/H#{$Xv0h4 wyYr`$uNS\e1g˶Uz4E @Sn1Msj6߬hT]SohIa=H~JJOt:T*pnwNN݋{B&ĉp88qDS!**jիnWU0 0c@ z1bfΜ-.]ǣ?0jjjZD?.\E7nXuҥvꫯbŊXhQx7$x,bԨQ8}4fϞ.())_!''̓Rɓ'd ""fիW}II <1rHDFFѯ_?\p%%%]Ϯncm6ɮVz)lܸ{X,FYYn7ʂ*jG}T|{o"{eHKLLرc\(J8q|>5p8/X\`۳ J2Uoy*&itj?xjjjp̙vJr9Z^:i6fYtbK<2VOG 1 [Rɒlj[3ҕy.+'ibY?]E> AFmP(r6l0҇X,iF"!}|5HOP_z#=731_=EQ/+eY~q8ȱz{lٶcIY"q~tTTw#xU|l|a@J?KC"q܅ s94d0, ibR{'(?qjl"p׸oO7ޝNK^/=vl:j`޽;Hמtgu]:w&gn3%0[ەi7l0al޼{ot38vX) znp{_, TWWngj' jƍ6 ۝ѱ"PX  ndfy\R"MZWz$]!MPTTӧB,!&& 11шGF˽>n dޢn_YTE%%ŔV f{{\BxdzƔ}p%ne]بT"sg/v)FRR"  /6 仌NEBh꒰ w]c1z0[FS._?cǓ( LJM%jjg Pt$~ b^R|=tfffJ׭[-[zt.|V"$%%L&۫VΚ5K9rHq[v,\/^Ď;Cdd$Ǝ|t:h9j -X 'Ph*H ea6o7:&DP*m(}aZr:HcƌPd!222#moaaa;)0"(gʕiӦuTmm-;n\ ;c3ga˅? lذa-!<O`S<;vPLE}v.-Pp-u:VyyEhT^큐_EbBBƩ ^Ocay?81k3yMMM9rdra܅r Ȋ4}T4EQg)2ҔBakIӄEQB'p !wy<^!Hx\~N}.`YxYd, ])X4ay^L&P ˳v;dJ p%xJi)Ks p9p8E456vyzZ8va0O$?99yg}7߲e˪֮];`0<?СwyÇGzz:6ۍ 4۷w8s/s\.K.hh%0˽[g7UUUx7hR=w}GM{cIIIF17wܽ?bɓ{<7ݑr~ XrV]x Ӿvg E|PT[a.]/ iV.++r\WH ?TK*rGlaFT* =|uE-ZX__jfd2%0BBBP__CaРA)5 Qx*ϸrʏ111ׯ-[]l:jBբ. @V7n-osII % Io_o+Wɴ_Gъ:v!!;T+/CbXǙ7_iG D>0/B!$mbG>8eY4M`YvZ'4M,p8NzL8o~Z[nToi?V,ɤO4]i;ZY ~ D2_h N’xe\wsaI|jNOQ4Ey$RrDqPVX:mBBBez-o|~z,vȲ?} ɔp8nwzʈUVZ]z*Wr8Y4M M:U7tPerr2\ނ%] hy<^X,.rZWuf_o?*Jگc  @~oaa!%JiL'X,x#]P\!@,i,a\./.K>[;>2{!r J%Bpծ &hduIcc[b\ƥXa^ Bw͟$jPx!yϸ$MB']Ȋ*pUo $_l_򁣽iH먚Cρ$NU_  T*y=Wuۭ---(px;q"/9oOK۝QQ x=6]F{= 4Mj@,iX6G.&Hvr-_P(+6t̵V]5N\?M^F4<+ A'- ȸUL>$yv 9{8B$R$g <55=h6<| <{M&S Az}]{_3555w(I @4,ECc#Mz7J>"\ygÅ"([qұ|H!oCU- -:6޹N֣AͶΥ%!#N1^"dK_!a,͡M u@.9yݸvYj-SB@sSsƵ cл]\L ^` u~L.ڸv7[,@T0}[d۶moHx7n@ *k-D"\.;7d\zkU^-2 oVnB&ť/ %d˷Rn ᒱb<䟳gy{iY. ˞(еBpfRɳfky7Л2^oÉ+,d24j 8Y3`X7L>`0&2gB&#dP{wKM&D j#{\\̀MI:PɅ?ZW*x3 IDATWWl RC&`Yzػ6ɕ]nKQ  1w rnpi`j)gr7}YshAW|Pl Ƶ6D"v._2g2\q2XxܞUZ"![sfXRa҂EzÚ9n{sŒ sES`%(l\,m in_>|REcK!LļYz:y'֭r8nR67~>9v7nO&4S__1"M*Z|b0@tM9O=YG}?Izq i~ڿbV# bJ~nIPKu jlP45C2)h' ck4[J%x \P(T`kj^i,-Ð5f CiY9 -e >.&s-n3eYE*P OE!& <`2*yAѡr4DiY9>rՐᦆÀ(TVVaGnPXԤϽwXrw``ڧ74> ;g6nZ @$?̔)@E?oq%&g)hb6N0U_$J4 wIJE9HH 4׬Jn/a{ru\*9hn1VjDN,dTU7Ab)Y|AaaKD,D idDGPZbrly^ DR!e$@8HR`J*:rg/(2C_4,e o>0`PO?Xtt<"/,y>^MKAB[Koij?C&ZuCR$T%NpE޽;e| E.[l<>;*w8.y}R A5ɤHHGa+؄ /6>>nx3Y[E#)1O\ ǻϞ0`0#>d2 8 D A`y`$I")ݿ$I^%<1(_ @aR v}w9 N< )c5eeYvc\l ##D G Ҳrb>,hz +y~l6\Abxbȕ|ĻPUcƁ Iҩ鮊+ A0,1 (}vǼ`?ߧpF({z D JڇBL y@Qto+777~^c *k,PȤy^E=Ce_ ,~'ϝ;gI˲8]lp$XEjr<KQ+<::DqqJ\osWA>HX.\B!C"$ C~PsKr+Dy>ÑI҂jY&2mG `7@k{ _<_xn&p(չBuf&"鋝ck~ie!&NH HN:@yu.\ ##q1Q4wJdÚ9,~74黮о!kjs#39s%H AMU+dJ 0.8[ !Ppk$Q8& FXdDF|#Se۶mjͶG^ `iW믗vNH^^^g9{|qqvYgA%! WB)Ahnr\ {n\.CLx=a/EQ q1g|tP"œŎ,;$+Vعs\.׋pM7ĉhkkqqq&//{˷|<ԩ^k=MӠKd2dKbZ9sаcEBb8N$T ̲&>.vbFs=z$Ƃ|ZmRR@eKX>HN?Ę1H#H)̧e0mz&L&| Iҡ&JrS{3g$QQQOȽw,ܺ:y2 I4EEiKQ'HRt"\:vٵK˟Acc[@ (ɠGp{[@7v`ZKAJtp9B[ǃwj\n^ۋ?Xw S؆}+3@^leHNZ]tۋ"?>Ǹܿ|۳rvAHBd&kT*Cۮ;d|g.9u0Xa!8Zaߋom!J)~< ~TC$ ?­ &*-No@RTMddtbّ1R' )--dYVQ d4 "ayP˗/p$+..q݅QFʍ Ej۝Hl q8=4BlB`8E%AV"Ć`bF0PKAID`~\!E\Z%H+V\\\X}}>%%Ǚ3gаaΝI%I1~uʁ,cڴiG(BMM TRfҤIHI/>c 04440{ O8` ;uژ0EcoaY( RS$V! zԘjAeLW㽢9|Eܓ^/~S _JҨ6w &\rl&Am%(޻]U]^60K8K& FQgݻG*fHc 5m˃1ƻJ<ƥ[׬BZ40փ=_G2& ޏu|߫qkr|Uw.PŶZCHׁaY$'Fc5:#`( 4~NEb̟Grb4EJݐ%eWHOcPI.WB"Y?7SދPC~aK~^U H,^\ҥO@es`y` Yw= CX%/ fk4Lz b+&'Wv677а/ _|'F:1_PH̙s@ XRr E\Ys6<|$IzF+BClUik8e9ev ݝrRxn"Rc/x",àRc IKТ1= #B@ݛ@ֹ,++ mmm|o,aY<,r\/^Ŵ4CWt:q |A)//oGvyh|F?gΜNȌ3r OANHO }ǿX[ZV4q? 55W:l6WGջ+{w}o}o %lţeZxˣPˑoFFVn{g̸lLa@ S6KB< <l ʾ7C?-Ь.<  o}vSp ppyh| 4r &fơx5. pZs,>;\}* KPY]K}el[]|An/PHd5Q"(ΜħI!QܙfZU(K S 4V(3f9%t zv۳`@GC#'C6@ İjߕܐm۶iNm=M.\x_73 #<2&PXp'#nٳ·܅ ffYJy衇=;<J{?e</d)))$&&Λ73Fa}eeeΝ;}/k+..c*I{Y 6Z!Ȟ7mojHDaZZ &NHD,FmV:x6zD Sp;Q+v{! @>`(>"$ @ݪ+ԩSqɎo˃g5%^ ٵkWX,u:8vX}>P$j@~ W_}u}sWq\X,~ 7ܵxT)S?>{a^^}$P(Ą =kLx3Ҭ 7L)͊Z-AHV&Tzzzm?^f 2.$$fgkvW7CH*B3ۊӟ/?ݎ Ƴ(zX}3u:`L&ïYhsit (މx;v|#jjy >-h8}fۋh 2j*`Pa&)FSI*|& ~?>vZϢi:p{u}Uȑ#0\WFTUUjO =ӥ~?c=;{^^9l?t+VXy-Ĭ[.1 z߾} n{?aڭiAdFs`z$$^;~bfU)h?Ja-V!I6;t 9ʬ6@({}φs{Myd-RDjk'¬T(6]x5 ]s8jjj|t%!.˩p IDATX__߹,##6egʦ7Hr{;pȹm?|!Q`O`Ϻ0"$]N X@0?M6H{={fA"b3Pq"x_}xҩǍKRԽ XS  E`K#/<{'*r4Tp\Ƃ;f ·͎Qwkq `w<ze;oIs\/xk0[쭍lki)@m]ߢ)m u),^4*|믱k.hZW† CWRSS[ZZ>ڶmzD}~B$ oϞ=j/~_+V뇟|ɀrcݻwWܾ}{EQĚ5k333q\|bְť/Y%A7hL&ӳ& x,?^΋qr|y|AlvX..Q ^D+j8aajkR[mM9V[S֔!FEEV[}mscYmMŢ]F.i794Mh4n}>jjj  UTTtH!J5* pDRR8cbb‹NLL8#CϷ-qhTHJAŸ&3RDeڎ(3EQO /w<,y~AN zgu&)l6Ǜf^qfrp\FNBJ6%'qtTx7ޞsxx7H4y1V?4#ȥ~H8t r33ƌx'7X0):y %ᰳ?Lw@qrO~VKcB& 5I yȏO7y2<׋2!j#VHd 6Ïx x<)>h<ÌɉzKxK6 DkšZGéUmjKv{XnL;Ĕck ,2xt`FwPTTm۶BGT*ŪU PYY{i_7GW0^v؁ HR·n:-ˀeRbf׮]Vew/\xѫP(-Ra9|ߖ8M±OgM Jχ͸]wNϚ\r5up8hjiCم5򢾚YkڵkWNk<jk`P@$@jkzr~R (MnFӧbj5ED!¡^/}S!6 #=^XVX9Ng7qHZ]u,x>@x,GH,&񐖖'bbt:>hz?@,Z 1IwKʗq )8\ DAL&ny~q y_l6zGEh!tʾ+}5 Gq\cps%wJ?W +>y&^]B,<7U_$2)b7g/292gމ $%#AC ?}ssheHN clm/ 936/H[D3NO.c[%ᡃǣ T4݌x Vp ~%XYͨ㫬 . M60,^0Nu|ffbkA{=jްfߒ(uA 壎; Fܹ .<H$HRvmaш~ڵ 4M#-- sFARRR۵knt÷lٲn9srcvC#y.0i޿{ndggfq7Um0ZjuОpJx-RAV]LODs01#j.@rR( j7Eaԩ8tP' =vT*"$9!%`YnH(,BV[}$ˋD"x7[mM qB\W(lڥ=A`֔ @}#k/YnP(yU*l6 |%u)-+E?>xe AT1Zu,7_ 0,jLfD:ET*^ճX& @T_ \lqND^oBJCRn"AB2|K60pZ"v)A mU l:2|| ףպSEv'7ƩPjd \\M0 WT*8ϟGTTt:; QQQw⫨ZF||<\.[z#9//OyeT@A |I3RڥG8Ea-`4V[SnOb3ʢJ= z-/o e# r/WpՃy,*<>I]?xdC}pWu99`@<F k% DA<@EgABХ0dujxd"}݅H#bzzzn2D< B Qp?xQ,?Jd8cqk}P?Mvx$ @ bx}R.2\z'}2hmv( %߿k+:L"AU*^ڏҳUjHIF) uD09cǎaҤI BHHH@JJJ7$::BJCتj;{z<] x$jX}$$%  5 Qk=i!+nY<PYUӭoDz$`bfFCNʡQ+Q+MHOIyzltڸE`0 ++ 6 YYY蚜|HB|O&c\v=%]☿ښ BXVz$mښr#VmpQJ;p) ?L.M(C==LiYy>Az E|~?|6Xܙ==pg,=J$קj@_ R 10L9c,w$CxS#/%2Dfy~}@ zd43 O{ޑqV% ocnepm%hr&HpԘ!0a^cЮڔ+)wb|| 5 Bgkۗ[ZZ:\~DkNʯ/ZQˑ+{Iiaxư!S w};p$T"B}N_񎄄Mo_CƵԭͅbJ7L]GG[gow׳]n\t:NV6>Z JU2Rv7KB\2 [*gA#۝f|< X|y7徹^w>g}vC-[N 62ްaZ[[q>3HdZnvm4~qСN|wZ[[qĉw9F^ШTr>T7ՠbJ!gGy<~H%’\%LBlQ}+셯\dȊ,z@Vr.ԤX) a9ql݀^HQAx~ܺ`2&NHDfH$@ii驩S;'NU0GEE=0˜JM/|*dff>x۳g9)) >ߢ3L&Spt… k޽e˗/?k.OOq\J[n8'Olomm=N8s(hG &kAȉrLCRPXuVk]\L4,M|.zh|Pi4MC(vp5ZQ<-f#Oٌp#«J(:h  ! 4Mr!//C˲g,-+_rܧzUx(iԘj\IgGhJ#9==믧ϔ5mDs My2YtQ 4"n^.b,8. ^gzLBJ0|Ƹ٠גDus)QLX8Q8^\L@!!Q7GHɾh}*:TDPlb fB:ŠnAF0~o$ 8+ʌ'H犄T9uڱcu&.7\ǾV<^h%ymyℬ6Y 1 [- G-4~w#>m7 rْdǻ%yd[:|Hv&c'!}?G3tf{~9SgΣ+9)qQYe)\,Ѫ&XMʪ6(ʝyvKZ^ѹ^P84k'DYӃ}ܻl:N_hdEP;?Rscc٢[D1!eg -ROVgdE@z j>S裏xvܹ!55uJBtt4Ξ=]~g!*NNL< v'?I+ 뭷ڵk׋#::ΝCoo~;.W?`Y/~СC\(A&$e@ S.~TTTn?۳gOzp=`AG<> d|%}~G>ߥwY UJ@sk7&g 7GJZJL ݖWXvH$x<dddŋCѿC(I RGFaŊ`0 $4i /=3n(Z cUWU׬dYvVTA*>zq #|ORSTZ~z&Mv4R0(=##Cӝ8nqEf !zp˾_&1A]|q\2qqa0Qv34LJ"p H)dҬ e OPFn!RJ"{ o(64x<ik  x;MW3DL&F,V,O8y+L)ȆBJ,X Cʠw$!7&e`Y(?r jaq!7(?R)1wT4j;'DS`DG*P8=mVKNR)jwO|^̠`Z? A,z.Pg O]cup6 iAb U:`튣GqONKD"`S `b=C̮JرCqĉ,*>|^-X|YJY[ % ,**zO?=TNQ?22r… V^(x4M۶mk+EQ=׵|DD!>:> :{! @0d^lہIz}hliDz;ج5ؑ)kBd T&Ȃ109l^njժ54i?DӧO#!!a!6}߅oD9N;644%$$C" //ٳѐݻw8W;c)s IDATV $]|ݯӵ*33!# zh "!Ap<9n֎ѫCR|:㸬P Ҥ9K J;D,fѥRK[̄-&OM⣪&/~/BNݞ́G|[ ,~!B#JN?$%pdB)Ùgv~x0j]//7uc4DDyh/6ъh7@$)\2z\.cZl1#B,EnZ˰&IG7ivb*ia-%WSTypĿŁȤM ^Z}#_ ɉ2sH|kayСm@zx7%E {rh0$!̫^}|t^p8K%Bz"si0 nt:  G w :R6!'v9GmR!GR 4 +c|ۭȼy nI +nıcǰ` 7\lZ\.m߬NѸeV,ʶm?=t#dڶlնpX #H.l{u~Ѵ! ڃSZ)-h|pȌ8wl[)T}S@og'D>LXaӘy $$' &RIYhh!gRj3 "arX! @rAI~ )-1:bd`M&hzHλfB ^%0rWB99>kh "HT*+YQVe5ܻt:v3&6ӠS<(#Dpy QQQkn999U<3v9ϟGff&ǵ;v(L&V | /2^mHHe]]݆h4%I$Id2U #4M_ IҴgx˳78]jBYrVXѺ{'*++?' HPXXۍ"=yLL '/^xqyǪkV2 VWdef  N$IE>0,qE; #0G?$I½ddd4t:9qu: *jTz},˲3,x&##jj~ #r].vJIIB;:-f?{Nh|ȳZm9tDdpTGG m+5¢\!4pJCk_󲅈nUɏÐb[!B&ZowS*?脬HgŦqO2Ar+s0ii0i`79+`yh?hs %(RXiaءh@&DDvt,F=7nψ,BpekG\^) <e7h Ux˯h:KJJZ[[ljA8Ht]ostTD1rѮE Ry煶CZrZ0 x<=%7mH|GRv Ss3`q[  g yT+'5M`x`0()B 0dFt AȢueen[9iҤ$U.~?jjjaxKW\9!E WU>LՈb4$C7nD ˲ӷ$7,1>q)qo+}1"s F PTaHxi,&$yTRu_%".bpL.םJ Z9Ξ=ϲl63)q2ۭJOO,|>=Nu>%P(AcH`m4~X\,,oED^2S>9ҳ1'-'!(Cj&_(1tN?ώIiZ (8kE񭁀_>@$cW\/ 20QۉFms=x磽XU`49pb|>oX<y*xBaƵXՂN+e$ԇn3|tp@KGH SJ1)-r^@d^;gN_`+@D,۟K(.>M>ѱе*.z7L=VDɕ ev'Ho:B@ t~ !Crt*++Q@.#:TynnU$x_ _U]hnJ23 U1>wŢ/$}|2yiD*9ALh QoUgddv"(9KDzc#Pet5" ׷6*nw.Xp/?dq$H$"( <~pZdX6c8$;#懻mx,FpǣH",EA $wT )s3)x$)y F,}ve" `n&1jD9!+~ VOAss;bcdws7HTWIU \<bJ#Z.T$@]K7jZ~>v?6"s,Jʻz)I0 v =Vn|Ee1%b#>&lxUV[7ͥQ,ZΎ`x8tNry9xuѬl5Mrw/hnʁVJ<LU<^;n{2Gjj*N>V}m[li5L4ۖ-[3<3u7\l6_t[qqqOc"r&kk_6.[ Pū` >&B>׿BTl\70V`޽{ӍFj+ 7dA~U5ieVOdS>hi ]in<3ӭUޱXϦ&OgYn՜,ˡFk㸹4M$&P!Fi Pz}tVR]?i|ɇ)TGlL XI] XHDABQP<>|^dRPPxt9^r h  @>E!hOKqoDb6ӵ}EV+PrxO/^+ӈkV>*! "U1DR7g0քc|c#&E)l_z}Rrgj[ *o'(ݿ 31|k$x`=f7 ,H?XQ ÉYɨN|`x#"Q9P|~90`eY\j90onRJ8ݞakۛoa[t:籱|AQT`&c"B}M3A"kT"χDZJzyq 0!rڭ*_ MӟhA4MC-`s+kzzyAPW xK]0]? )1!0pha7qsQx!P]S0$IP N41o8Z[vle1x=\{sss ˱("A$ b cG`(:SLu)\ɑ]ǫ\f/?ꗾo߬Ùg`:! cccVDEE>)L%iqp"R"1&C" -}hyb+;~Nty!*3chH^>tZ݅ u:(ʝõ1(~cBe*)ѫ;`:!+y|튍nscmkwiC Y199 F%H@ۗH$ ]TUUupՋ/zm(&e_{m6׫iZ"Νz@W*|_f%B0))f~DJ섔 0fCP*LIK}8s H&%%ݒcՅpAjǻq*VWU]sq Xy~oKKzLdP(2ڬV N0Y,ㅅyS8p&-ą uFf=_ex3!>>G?z[۬8ߜ'$M[ƤoC^|rR[ݷ* ̍sٵ^$#%5ᆍg_<iMJGhq\CZq%#+ tXkiAG^_qVE;eR汦+JZ^Y#džVI=4p~rBIJL$lXxuKfe} W&&&n7c>x|tCww%PcWK;QL&F[c7d {|t˹l6 !\l߾]7*h8D?8}@x˵iHE$UD PX1"쵸<Wzel%G{o;lΡEw:%g*um+a=y;k~ }!!C V !YJR1J@]Pc^a! AX(I6B s `Q ꉡTC4'ϯm۽9 hgLz-!Qȝ G3I֭/RAR)kp>(x_գ-Yo06Q\HLN*"rۣ,6_MWˏ]Qt7(Λ5\57|@(*R $7-"fTTW!lrCH׏wV կ+ݮ\^y9 cblno7nT )* ~n_0֌aYtf,[@n{|_, Wt>K|>M 6\Jp n; hpq\w~q^~,;a~|Gnx(5 4Mc(8} +r(I?,gI=#X Y@'$]Qd'Z S~= 1ͥ](}hyA7Sycp,1׋ cb^X@G"Nwϊ=oc~$L@;VsϷPwD|}nP$w9RP(, s_۽^j1?Ymn{D*E* !@@V޾-)ɉ2 }~467AU(#V>GƼl;V9YdW'Ӊ' ?᷄0>G$~& ߗ>o.\R.7[|h@@WW-Gx# Jo>x饗bHeY٩cWq \>[ZZDZ~BPI^z<H$sll;oX>`Ba^^o=qR@(x#2Rk0aD,nK"hc+Oln.bE$/o /J$_[|#0oM? q' p];{ӫKieC`9.t|̓5 _$ X`n"~cc[|-VN7 - w}aYE" 12R%DZR0B IDATryTŀD tA& t:b oλy=k8]eA PzRqcYe P`U*nсaF7p8ZCD-rfY 0 "HLF%byӦQHOOӍٳը$1Κ5$ۍ3g*`cR؉HOMGɉ8t) Š|l"D8`$\i$#HGp ං ? CyD}?G+= ߱FF }emM`~Gyu7K01iZI:\$rq7P tnd|Q0F @$Ο$z;PLL< P]]ʚL> Hؘ?4> x<8sHMM˲8}<:$'5) 4 77ߜ: xk?󑔔cwB!&Oͅ Y9E###8DG)0u+d X\P Hq1ѐ%j>} (J,* #=q67ݿ;#oj:MW#K/VG,0¸Ağ6Wxll-ʈ(F,ۦ$)`"]sB}KQT8L@nt/ɤRU߉ /G%рaPoHHCNɹDz3q(zzz!Pߌ Tg!H`X8N|&֩JO`Db ,ǂ~x֊bDGFa\\n47ac\(rdeᛓgQWߌ Ѣӡ yywyD`zA,."--yySolP(@*E99hk#Gwww9S75 _?Fm.FrJ5^{?4'q ({Uϟoo$,͑wzs ynBc֭[c>0 O@P)J|0}J li-Cw>FEog.JWD `Yv= <^&<n,1!5<:a\ "A  @`\ߏٳ TjjjQS[u~ސ6ϟDnvᨩEWwsXdCG. w/D"u`4UFD2 N@&eSz\[R*ىbX?qӐ4( (ZZDpyaׅ3xpήdROFMm bwq@o6w]N,TG<n]BENJ-[l nvY_+W}m]1+9˳zXQprJfBݧt+UKχa7ǡg87<~ZNNY;]\89H2H5:&WV ȭ2\> 9k;CƷcYHDb8N(")i)8 p:݈8/-- ƞ!}3 R>fCRKX,4DEEo. II ChGo.aπe5軲E`&" ex,v?(0wrCdZ,}hy`*L栦V#>!axa?;69Sp\swߡR(c=:߸Y>.?V[BF{Ǎ@dd+"Ģz"Ųvmݺ5},Uѷo߮|t($I:bqPXC6XVJthVL?h2naQ&M el:"c2`spl5foh[FQ}>D ǍF WAjOϨ>,=m}n": .'.t*fdtBA]j@PPm0NLue/ X-8NuI$$IV\2& HD(o:D@hbx<n"2dA2'|t $`;ݍ| 9Nx IfB$ FU< y<^^" NFVF#t,}2xAB L"`{>O6|?$ y/L(%EW-t`Gӯ-'d ~ K\| Hes`7u*۾u| x+63lkWW / _c!oF`8f%/~h7nb׫C$+ät;B@HR9  % r)ruĄhݻ7oZ,+ e6 F`wŊa 59GCmm="##ׇFLзu 1!a464pW+*ihZ!AoEnvhFKN55DWG(LeuIPʕDي(% 72olBA~ސ8 476'E[-HHHDm]w~8X!s]_EёțB׃Nh-|ղ5#`yfqqqPB"fw@oK3mI8Xb"w=y| EɴS.)KV΃ǂ]cˤ;MꝏiiwwwWOesdl6?vŚw>;yr, oN[\0:v~^6~oٲd2adz_DB2V_ƪc Zt:MLarsQ&*BD$dRtn ˵/SRR ۫jooFy䕛=8.s;?n .]Rg"gYE AoN :;;a`9sgɣBpG~T9rfQQ>NEmM- ߇T_bbb>u~#ҿaފV`oCLL bbbܠhJK,Yr3] 8پ/_v&1q/`D%#)IA\\ l[;DTN̛7gضHDvnj㡣+Mͨm0ce4hq:;; G& À I\FCC#~?VX>|RR!D"nx\.TVW$C(رo `FZj2(wwcXJEs.X@NNSߜ:M|Ltdel)Ʊ,227~?fk;WB\V ueVΆ~K}U]v:e_8F$c&-j'w>h0ՋEt`*kd_2 >ekjbYnUKCrK` p`G?>IoQ51!%%%Ġgh4Za~؜Y )Ej(e1\; """q zv` nTv,6++W,D8 GR/"ي0;/#%7D>(g̸֖}wO" !( EEE8o aYV4nw}R͐cS(81!aZGgݟl?qV V|V\U(D" _2 ٙY#.Z0GDZc'<#]7W$̞9$@`Vh:ֶ6ut X`&"@֬^̻qHt?E`Y@]bW8{<@Y-=)0kFv;uϟf)Z0sFS uC7,s V۳JrrzX߄$l6dfpb$ L ][;<ϯ)RX3o.D6[$AGC>{̓3^EU~}rhl޹}% ˠWp0:;;/q9 jdF) ?L^NGF7;}o!<]Ql6wiW,@AA{a]|\~eWW-! ?z_r/Mꨨ"X nu8Ud׍e˖lWѿOZ׿RY$H`٬.J&}O^39l&顎}4M6mڴa###3 X-Xtww 6{i"I9Ve=1v㈋ n&(M {-;OAD 9o9DНj%S8p8̰9ܰ:\p80A2Z?%g;["6WP`DbB r6%$$͆ӧOC"`ڴiHLLRn466Bբp"2c vFpbB(̞5j.n)%端R(($`XVNQtpq5^#tͦg*^oYѴfVA]sRUAc}- ݋_VVl^2sjH$*9$`eskk-jF7۷oWL_>7o\iӆ|vWox7@_so3{p[[_7=0~MO??;{].:X,FgΜ8wܬ,ig@@X{ڋ/n;XRRҧhƴ}H|>jۺUE?ˋM8@SkG@ CS<_Cl9$&'= ?W`_)$O FӃI0Z@QQ Q8|{X!R|aV/[zeվTifggbߏoNDll4rsj/ցad2Hb(>^.ԙsHJL+B|lQ8d,XxΟf~)d2d 4M +!1wN!B3Cd$y$2T8q1c6hƞ/BvfYbx^T/~hTcTu"Xôipoix)ѓ B5jGLENv6(B. rJX(l6QN 󧣡JyyS҂!uOav xcYF htܵleʨDz1hNo\Cevy<: Z>֎6|+ Zq[L5YlR$Z]RJL&)\I$9s&fΜ:vgvIwJexU4[nM~(J=??dm CnVWEttoN4M;$+P__TWW[Μ=|ϯW (#.5QݱYHFނL_B  wX]ETyxa9#9)i w R= Y4u(R`y35mt;bq>Me 8{#J@n@00˲B!?N8gZB B'N0TT"==ݯi?xEJK&Um\Y??d/\\վj10/J$bq)h)3v)H(_Wx|~fg󐑖k,n7z*bzb)t:4?8Zf̚ OTXŋm8u U !>b=I5棳"#=Ԁo`0pWZMH_c,[6|ۖV=z 3MF}k TWY&'zΠsKss Lf (PPlE]_)#K&D#7wZ)lmoĴz=~(=ُaD.fwt׬v^|CCc+fgLm Ex:*j"55kV=_ 69 fFZl<:D{{;rss~م _rR|cͳ^oYO'It8t:::Hŋ;~:ywgu~?4 75kִ655llluVMFFk>$[nJ(C0 IDAT?. omB5oW]^,'Lg0_Eo \Gp|d5KƁ&/Y߼j >3Z"=B h] 6(9Y\Ǿ}hkkL&Cvv69Ţ?$B>y~͚5邂hZtuudgg{@@ 9) S{+./-=VTMs2y髭@1 E `0P7dF @Djc!v#1>?؀$ B%Kc;0ǔr r!d;7s桱 k0,8`ͱ,$?;6<\АrF]]ORL]y,AVZX,6,?|lQEl,EȉC@ vP?T*p<7@D"?D`i EC#x!0?B}}D~?(Rt3 (H(|oG]M v^ٜ ;'9O q%"^ f.t·a{ȿ# 绿D*TK>c&uV1QLC=yѻwnT=<-[@Xzadff'~zؾ}{ŋl22!~N8XGB`ݺu+//emIGھ(//00YN;{~S{)/:uܚ5k:ƫq\9== jo _ (|a8CAD~>B{ȃ.#-Ao$;"ĄaW^cT Rӧܹs}DTB*dL[Q$ISNIޫ8.qC?RܽP|׻Tr6>ܳsda{OE=YEE{+ _``0/>,-)2#bH+%^W8 0uj:A?ۇzcMHJL{>d!V9{%a!XdXPEWxAh4Z v b֬p=hhhD&PҒbbx}+䣃4 _Վy sŒ3!zPW׀P*XКhZfVTfW﫮 p8oRIiڡ))^ڰ{of˻9yP}ڲvmh@(İ*‰:2Mf@ׂ,Lo0d\PʓB&u8k -Yp(\RSu qR2& ).'^{lFNN222P]] Tk@? SO>ȴlxt x|0BFF8T+[n>LNJ|ۙףWիWiӦ,YdQKK 4(ze2"SL Bb Wha֝F[G7ғSSfrsxhp}$)-/\uA-x$;Za6Ǻ.㸂~fyyyj(([ED.\ThZ8YJFp˲̈Iِzsm*$KA>3%%ӧC, (Ԕd7q,̞]gfy 0236nbzY112bϞ8CS HYDz#GID +ᾮ9x ÀcYPկ.~@FjΛ= As8×ebYY(,\$9r' P\ 8x 8yLXNyg /Jim  A34 HW(-pX^ފ}zC$ P`b:NxٱI" k]還X'.GBFJnHH9D1tɆ*@ *$bʔ{oUC?\  W_)M0X3OO\Ukw S5WA :tPR+W j0FvڅjlӦM7n$ }2 >|EEEWȷbŊ|7xGZЇ~䥗^:p6꺻}c&ZFΝ;m>`նm^ Z=t afכz e2YbljtLιIIӶ{P2J.EՉAV$B& ES'/REs~Q@@ x# D CBjԔجDb >>odZmEQE,YzXhрJgCP`0I͙sRn|SNɭ?6. @E徙ryc6 bcc$ILAL̅Y~QZRu>/OхPT²>Ғ"X^|࡮${*JHB@ӅG$ !#- oX˅@ Bv+B11R*8|+W @Vvx\., 8rA BH$RAHNJ?6LfB@ `h4@cct|E8[طZ0aB+QIZjkIRhY^ZeվC!~iE]#=+(Z;I"O&S]V-cG\4rt&@lI^/( \lR%`ˋB6oX}Eq󡲲?0Riߤn#Y;?jp8X,G|CYY>.\R81;N>}C(]ccc BP(HZo~!#evZ#_HT+caJ,D &h>H'FX<~. N&Xcu䏉\&3 ddd֬Y aXu0dř3/hjjQZR۽s_P**IJK͝iiSr1`0̹cN:c8Ƃ Yr bHN)S(0yKR)zzz0LAԿѯj4SW[ԔY>S8JK#C$NLf@44 aT&EQB&4MY,:֕,tvv!&&ibHN;,p4HJJBRRt}Jۡh[D뉢eK;vOEFij䏜G!A3bn fN!A\+1hgpI$Tzvdr!"WvR>u ">9n0PQQqŻ;ST*ve#嫬RӧOCP >>xg=eiXV$$$$I4;.~?R1HRՎ~cq 4Pר0LfJ=GkώX; \f/밀PAňX| \w߁EaL*'ŷHKKX,`U]]LŢRڵ |PTT$iV򥦦^!߁ '_qq1̙3_bҥEQʷm6卺, E6ID0dqc)C?3x_ᗈ ԅrEՔnC~0ot 0*X\FtMӑ9R H$n7 HEva)Ɏ|ڋc99V1? z(^-8PڎP(th4]̟+ ݽEĄ(D0EFVwSXIXe,.Zn;fϺ"^IJKCCeug~)g3 Iޱ 1Jp\}NR!$IAHRF$ HT`p]B"tAV$Ix+ GLqqqp_b/#cb L|ЀUV ܛLasUVa֭8pVX_l6_yIiD`0. +WR+W⫯ 3<'3<ٌ'NxGX7G^s͚5MӹEEEf Y c@ 0ӕ===^(AZGi}.vv!F&ڇV!=giA|A+~l-'www;m4 D"[z:¡n x6vۂ ٷ'OC OHH`OBd2jƌp8B̯N'HS?$s㝲rd[QN{G;wߵ`b=$!JQWwM4̊u0-%hxVTU{oILfH5k6bW0qqqO?I,ɓ6|$q1B$IPeZk_^x;0d}w\F8,0Z-E}& u<o 7>)y@Pc0  ! 6>3gΨ(*&yŲ9tb͚5cg>!_#rRAQzx-&&&jy6{u\ZRٳrFCùy%['owO[gϞ8 qJZD0H!##㊨W$I A$Hr ,B3BVB FӺ Hf˲ 66III#!^Mz=@h22  nL4I-Zݩ9 XSԢ"iN}>ނ Nյ"%9wi1.y''.?Nфq#W'˲|P(?ꫯ 322233SNblBo|{ߛT+DRvt:fΜy|V})n߾}IFFC8}4f?MFtPɼeU]re7I& ,ƆBi ?_'t:#G w5&~zzREL;Aqrr<.Ǜ Hpx`jhX,gץxA`$`0x $r>$WV7Qo+:k Cad`ƌR@ (,//(J3.\ś\x,T*EWWf3 lP'(L&SZRd76g!'[Ғ՝1k̻Ҧ{N7@.j"#{abCZ@ymz8sF _y@@SSbbb b\A`Xpm6Bb$<(r$$$C瞻-Z ~\# zeT"++3gN%пU/@sNcVYٷϙn2A8&kYgۈ:!EK@T|5R(ŋ#p:HII º7eC 9S/51odI4 P⺗^zm۶)=eYՔ)SvV?OߟRtR%M>_-[k׮ <EP-/++KT0d7o|`&ټa@."ILNKOۛ+<뚑 p\+ (8ۆ$7hz-xCjJrgt… ))) dCCC J3Jѱ͛lU(R|>hZ{}B@k%{iɲ uv^B#A-/-2_CyU;wG}ٳn=mllBcS$b1 f3H$,X=V @2 IXz-8|RRR7@X")"ׂN@nnNǑG!A )H2B4@ ^ٍx/Czz#$q&'N2 C$`h!CsK ΞE9={f􁿱$<;ߎ'moE|ӅO?777 Idöm58S߆ |dXmj4݉|OZɹ/ߐ{0TB߈A,ln̛&_|E-lmm?*xMGX3LO/^ql)++S.X.w .v?$y<86ccc5nmEu~ *Wn߮tM`i ] dzCa IDATΦJ [vqaw}Wp`<|KvP(޹sd:vsd2 2gaY~޽{wkk~ I ,q9&&yՙjŦnzt 装Zwx ;V$BbxRTEGFFq9޽)))I[,X,p@cbbC|^9^+z˰[e<}RSSqm]@XDTp Z0" I: sfgw{>^Z,7'NA&qqq9x ՞;fC$R@II I'`'$vqIX栽 If4db7{Vbۗ[!HAv,8=XPC!#!.@٨;,tcjz:(J}oJ 9LF 9x.$&a{]+^as,o/2=~߆y5纑a8vxj͒Bv֪FiR>[9,Ic IUMӦM¿be!Voٲt 7n/v9sHNNR>Jmk4m6d_8~5 C`04+{j$ ͦ7LZp0 %IҴk׮Dۋq\@&9|Qs7c3жB4%](ǽvOOON<& zQd:~[dXsΝkڭ2 .bR7++ .4 ΝSU\TTtCSEtt^rKvި~}`y+*58]If^Ppbf⼼y8t"I;αro}#rs2r ɌT:uAZg'7r mC^SRR"T*{{v'28Ndfk W0Y6wph258}vnI"r'!q9)s||g)ܦ4a/@ٚPTdnxt6L(jJ {t +\m#n? RY(iqjq;T۷5o\OqҞxb+0rYII$_AA5X 3 >>kq 5k4S \$Izp>Oymț16lCXZ<0# 6R'Ö_> _`h|Xχތ!޲$5%So0jc\Uy)x<^EAիWعs#Z׫2SB!444NQTʕ+nx}yIݯ%EMUfcY\hi3a5޻Cz I8@ zhG(>04|D"/X텀$ʲ,04^?^?RsG#j"qV|\.z{{aiODtP( B D Neay֟4avk[>x`rAգeѲFzKG"!cf46,[<Tx[7&5 c_\wPh0 VԔۿ]wO?شiӣz* |NYr R~xGK>"IIIoܸ񚙘3[iii93tvvvmɧ۟K:@T<|`0X,~tp.>"t=PDex^IEQ5(V#.TVV&&&&-))^ү%T\t5LH~@p8Z{'Npĩ38qdvhimAo‰'qi8v6&_f@vol2m=4@ <>_  Noú*S:~-STnGOV[>Rh0n]7;Wt[kր9ؒBpW_O6nXo-&!dKuݺOga~L44HMM0 ?OLpt'{Txךsr5],ռ?222PSSǗ/_ڴiӣRc0M6uL/hkk V|ᇏK#׻$r,))[|羗Mj^MQ+-?uJzmN+Ww-ijoy'Ԕz: .$K hXWի7ؼ{nh,3 G%N(֬X"B,!11:N*p d_hȶH"A}}@_7 bX@o4RH  p8_~n#NP(4F_Mc޼|쩨@f*/@~-̱ÿY\?Mf|6@B^[QqcFqs_v<ĊVz{Z@h*6L0Lӳ@]ڍGQP=zCF WۉD"jkk}$/o'"ƍk>f[PYYcǎ!)) iiiTgϞx뭷 m4MrE|=HLL|zݸy8_&*Qv]`mp806Dw=q 1w}u9#$ x!"~=fΘ:@˰`lV9otz=L&3@d_}tGJ3Z-V\q wX_hk %5/q0`>~^l6dF0  a2t`v مY3!!!.CIk[;%-mx)XXrS\*?^h=7qGRĨ1y42'Fݯu:kfd2Y- C?G?sD{97o6rӟ@uT7nUPuߵ4>V$i_B̙!yBBnDzu:0,z<[4@.cѽȑ>}Z ! a9`ڑ1%Oӱp!mimű#9s75AףCKK+HX(D}Y̾c@9 WС`YbGkK$Q[{ϡGohmWx eQJ G {5 ߏSѲpz0&H>"##㑮^z+j222h=|~y6 \Z$V"ԈN2mEJ /49Pڃ8¤#besȐ#>VLQ2 `َբՐ<k ssp:v޻ꛔi99PcǂY9UaX$f5Rbr?cѢ{kˠ7c  轃9׏-9V+/-t:\.wi\ "A (,\@&LyC PW߹E1Z< AJD F?2\AhہHH,jJ{nkE$q7&_7Jm{b&o0(md$)uH8Et^LQ% #!66V?rƖ(6y s7YQτ! QD1^}$IH(&?^2_9(( ot"o/> s @QERaY6 H4QJ><6q 2 BK?o'3 ˲l A IRϟ7[_*0PuQ X(Q裏u';!}(~eb2W~:`?a4LJ$^}=} ovS2 F -}o'(QVV X=Omq@$#E h'yxq3At,$I@3cA[7e N@ 8:KÔ|hDp+M!js  q=߾tݪřѨWQDŭbfOqs$I>˲G HQ|!$V #"ȯq,Aq,?.ww^OEwY@̗ಶ`"X;Y2yr؟DM Xqg~VÖK}5 V-5&!O>4M@?@ߘo|'(ndmwwX} @$DF(BXq\f?2*˲cFŷ=`am0+yUyyvV5( ~伂߷ =e';̥ٓFk~  Ñ'0+m#O;chX.,[<q^~1O! +1BaM%dߨ ָqK`Q˲MZ*2ߡI3_-vHB쩏o3wt*D HQ^d>O\f#9>y1 n~B=}d8)|}=ɗhBZ|5H1Mc!U@5KrkbQGX$Ғ$i4iZ7'!"ZThXc_+\WyǐIwҸ\@03 MH - A?NKK{ۑtiii9ݎ9 =V; hql] %qH$z'اQ(ڿaX E/sr xٟ&ZO,z g1] xiӦB\-zv*W^yezoW̟+||vZx]<33Sb!+ pa'Uph0= ;e7j[-Y jc*fg.~ Iol=(n#] nj_O7/XPzkqR$w.4Ĥ:o;C?l2D$^'G CHhIha$( 7=#FY>ID$EQV}6u~s`B_l.XXix,H'߮ >!צ]V!HKf_h~z ?#xoٲE>q}l$RX,(ؿ<˲1`0-i:% fLO~84"7=z7*3*QuBlvxf~U5ȅfxE^4۞ƑŬxPDBͿmD()^B0me&fUhF HvA̙%t 瞪_VR$䞽9ujƓXԟmI:@,~J#[u$!b2GXTZ (DDK a EFX ;Z#N!lf 'IPTq$(H$$a{qxiA*ׇu/ XZbhZI(m~ulG?я`<7 U3+HԡV_|j.:Ի yGo:Tŀa 6[LQp>r;XTp۷% 94l3ȟwWPJ+*>}%== 9Se{Jo\JJrs'vY@?MBYq9A6X~O᷽NJ͂fe7/2N;¦]sPI/Obx36@2 l$B|>p;Xq*eѰ0L Dhڍ''L PP>hZܦCjj?~{Fru!}>A4ian]}gM&'<tӦMkL&QLO}]J$$k\jFs]ո~,ov1n$ juH8mP.-):{*Ή_djkntVT#{{}Dzxzyi 6s9F ar @R#1] LߟPǟgYh /4mow,dhHH1ıO<֎F(!{bƠccL -;!2,(JAQ===nx۸qcmۦ766V[lV+?y@"_ (cA/Ϸ<\g˖%y_0f l1,,YI/}|IS~hNs&^ IDATФ&qXm͖@Xl0l ",kٲ,Y-/$s_\;όF3>[}v LmN3@mZ#v|S Zr\.Cppw-|nwyx?oJ5s }r HqɉH$Ξ-}Z'A`-*>0';@&#;!h t^Ghv1 ġWBD.=oG pXF C ^, cV'dDŽȱ{nJ* p`͚59$d#N n OIIRp"m֔xDGMELJ냡bѠ'`vm4 4݀E%a-8"B, :RՌ:~c8W.,a1--C{Pd2)|ɞa?zfMxұE}>{X4`9s+*>1?'{iP'6@[6.X@u(]:&C -ju tib1諔-!F40Lޥaڼ)Jc? w ^HW4wLl}QQ)SZ͸y{'訉_Dpwx{3Z!\~T+ z=&أÝWxnmGgMD?"5ֶr ЍAAcE@̱O-x0cy- ޢn;+TPΞ5CJe j|cK!QW_MQo=VY8)">}ڂk׮0@XGNб ЮWбQ:p=A[)<(N U0vficF jik[o0!), r 3K9^I qy2} q!OB3J Q kDTtk$>יظ859Uq_$Z \D͍jcf/X8?ɭ[(h4NNhѢ0$ .nZSS7T]v흎yyyC*LkXH\X}ʔ䄲fwtq5jq4q/zP*1_A`ijTUô8ȥ $oh2S _= ]{05)]&PU(x% ,L Ί+H5sE3CBBϘ1 z*]Ggg_dgxxT*y799cbcQ7+*,'뿇8PMPKp!uCU-VF8H 3A&BLmmpn5Y]],2)c(42TR 2Bpy bJB$6MP e/AZ`o"1d1Zx );-hݜཡɸYyEXXz*٬VdϞ={̙3aْ/\0?55U6aь3ٳϧN}cc㞼ΡZBvͷ[:^!L.XD>],}9wNHҿ֌c%9l4 ^ڽeA mj I@Z~+ApaF=+-#S3KehFIwB\c yZH<6M틃7Hv~TZ<?qIDGGx}[nݻ}@e0੧ E/OFtt*.UyyyoO>mg}P(UćB5T-{]e˖glٲí\.Xn]… ]FCC-HVV[Kͅb|+JO@*-_1Hy^yGFӠ-hW% :&C;fh5tI",]Ai_o kex @wׇн<h$砭 YOYJ 򆦎 _MsWϙ5Q4)IpO!<| ڡoN#,kVnX Aԙ T^ox C =#)2M/=!@2u&Z? ^'/Knc4~ݜ9s ?O $nJݽ{}t0a|]oup͛7g߿7kHPPј{$PXXh#//R<}SFk֬~c럻x⵼cN΅%r҇$\oj"? 5le$eie U*CFW{m!>7 ɑpkE%*pŌn:KpVlAZjlZ"QӾke:6b-\,%\{cǎ&MBBBJKK!z5uuu7o|I|GO<(fs*DDD 8q"pID"oݺuرclLHt[1׾G9k׮YfvAK,y͛)zկrIe$8*.kU(:[㟠.M;$OAC%) yh:kXGΣKTH,X¢$gܺUG9m6!a1[0iDƍW*dΞ+ ( X,ߐ$YE䅬̌QS"ܽK!fV@,%efITKʗÔ[[$2Qε~ʇL@T*N>,t&D"\P^^Jш'@bb"rym_z饲$$$ʨRpdffoŊ3L8|0{1$$$@.㏗??iȊtlLd2?tЋ7o"j'! q6+KoQ?i V?w6"By5+ O>9,XN-(CCXdBEe1f5e\.WUbB.v ]$(8H Ph߅K4k%%e =Utu7?Ylr1RT#X,\.XVfps| edHt14: 0⃶A+ m 0d eh@j>((˛"Ű:`k™sU|o<.<.:uѬ閙,}\.MMMΤ3 v.p;$a  ۀnL&S)\ꅌmvS˯D3Sf ~[s3LgLq5w QD>JF16DRȠqc At$ႎ!?6fL+@P^H5|>yпf ` 6z=\.zT|@ k j˃X(DP:m;U,i2޺P_8k[;Jq͡vJ"HfΜ/B*",, ]]]#zjv%%%Yb]t !!! F3 LznS$IgׄiKeZӭV+HEBalM ch A$Kݼ4\TO)drm(A@ӳp8W~`  wtBmL`4`1[rv)/ nv{?jL&?t: F j+6*Aeef9$^{{{U{{{H$Z6{BE-F-ҁLW- <(T1ʯtB:V2OXm jJݗj"PZ]ܺpxV:N.o:Υ tfk`JB*'[Gftv.b  kpZ1xNg_?qzA s*--B@ss3 b1rrrpA҉كL455qX#$_LLN< BJ+_VV>޽{&p8g/߀`\D$a66Mϼ_ԔODlV8^KRRdI;sZ!kOE_5Le\.mbxWӗtzO'$l P޾ o k&m)J(ꅸة26~ GDuV$Iz}G-njh +3(#G`}dE%9ٙ!vprx *nsw< }1 qā'bG$o߈rWfKTD B) )JqDJ=.Y >#=<AD& p*0Qio@Gm].BEgD_7m9 A\.덵a^IsPd1{@7YKON-mXh(BCݶUVVQvoDNkJQ ~t t,Fh:XAg  "эaAǑE΂5!;6ЙŠ B )*8 et&O^w6=@عR_=v`^rdG3Pt*d0L5ރpf +Pm¬Pv\>W.V*:"Ÿ4Jӧӡo<݋3gZL2wC)rl6+ J7uT… o>>|X1{zz8HXtC>˗Gv\p@cs^,{LDZ~%pS$%pyW$t zt$v0hKEQWD!!(P.6 ֿ8>`@ʱǐC޽XQ#"< Y=:^;7%̈Lk(HhjŊZer틃ݺ|dQr+{)f2xC$_zknk='h;-W ~GG̙ݎw}(--D"B@XX.^Ų^. z}~cc#M6@N7w\A" 11aaat/ѻW9%lbCCCyZrc&rrNIIeЭ㥟oM.3xH:z5FLvdp8- _AQԈdZ,XQsW+H5ӯco߾ƦZ,E,.9!la &Lktvu}4 +@:sDH=tGLOmqN1Tb]%]#~.D72-g= tq?o5M0mE` b׌bKQ2QLɸyque[A-@{c+Z} :4M#+s >h7&MƂpr q@偲g1q-$%% خjݫGDD`޼y0L8r aaa=3#b)ޱZPT,;z(zzz~W>Dј "`fMX,?ᐐlڵC.61Xo Gd IDAT٩!/PjTTYrz}-AmihhаOH=?E|1e9Y=zx\&{>>>ΧcԸy,I#r8LN)l2nCSavO!;G#^f8wܟ mPp9bmCD2B ْ;2 tR3㶇U,<{LUcV'O652lj ?9Ѓޟva2\RH4lP,]<- ٴv>l {%~$"`].!;ǘ7ͨT*pBsA2Q>t|7tSzn,3 鵵x衇|oɒ%8|8_>07n,_W_}zO>qܹ_$ypHId$I^ - TI^dUcWڇ$jpVfp01(H$5% ?vT\@ x!|zTdr/^Q==9?NǕ+WZkl_<)RWTZAϲtb\3C8fHEd{5NX88dM-t2֔c2ǧ0tvr%DAD\۽)5"E_#h7o9H7 Ɓ2hQʥbٳcGq_0 (ߝ|2<,ݢﯾ.w l{p ٴvT,)Mz ^u-P(DFFٳ0aCɅBxW+FJ6T`0z9s>G~%&&߷_|m>hZ^!!!kNe&L;wN}ȑ#$I7V$W,;:,CBCey1*u[@ xd2Up YQQ ^pAȿ~|Dn&l>,'}/InܨADie(!b,E ЮZCvmJE2':4ЁFqY1'|Acz^H3S~͔YF| e?S0mH3}CmZ,V8$ 1A_ KV-ZowyGoe>`?'K/mݺ@_|IIIIΝ{wy{c| 򗿼r$IӟivN{b@XX3uIlmhhyZ 8@j6?!/v}ײ o`6{)Ţ̚O?NAՠ5447EQkvqS EQH$-zMWhii7,dqs3+ZyPZw˲=|bbBիUQLEQThw+#ܵ - ̬@grpЖG]+ { Aޤ⼏< 1)(??RA1O{| Wp|HBP^q~G;&; ?I 68Ḣ_cqHТRUUP":>! w?9zJm۶ǚKf3 y<U_>|:k4qX,@dd/Ҩ +,,9j4ϱ~Zͪsi]M;5ta&ǿ8V$zݿܒ8*#GmɓMͨW._ C'O^XQI,AdgV("@70=c!Se 5y!qAm%1/D }s6C,HY ꅀ8 _IxoSQF¥wnXAזw :΅8+U#HȊ PWZ>XspG""j/ϱ`?K/T?L4 /YCa޼yw]lC"CBB>X#3bqlpG@^ws0!6g.E4[NuA(_=C3:V,wMMq{xbxݸl (.9q_:Ю>gAg t23du.XOנԂAڅkx9^̴2de) hIеH?`u }8Kd(sJ>IHPdg3Pqk( xZ^߃W3hw!۳Q^^wn ʮ,6͸~:N:[n/33W\q+ݻw_ý#22_WPosDHQT~)^ EN G[a`랐U@#HUMјQW70;w\ R&m\ wCĸQۄibqw{Xh$% ,~{xQVef F)vG tFpi01vAgm31G1F٠+k0ú7+Eh%߬Vc/h6]Y !Kp._yCOjM؈ظ edCABB£wg0Gs\X\paؾ}{jwwzٜ\BaP(,e#]d^H1"ō&ܺӂ M:W]Z#I…xh v{End>UQv2D膁 @\u2@M@ǁiwpA}81sA}yÝNxz.:ē0aטklJ9jDA6.Y8 L։z a!H$bH%GGhDXk5{\іw:!(m۶ xJƂ1b(obRV!!!nfW'^QS˥̘?Q}/g;2ap$yjCMaQ1[N^% ,Xp nR=oB$?UXSҹ&xt\@~yLtF'0ǝfƱ m@[Gۇg1'pnD>8Wi MD@*| Avw_K@ƎDEpp^P:YQ! " #%R|A;p"> :ԚD" jU"l$X^pUY,,mpbw?;s-ב fIvsg2JXi_\;[=(/X Q((/۽)WK[pҴ9+::HB ~ sHrc N&>j4:YmCZ5,aކ#М|C!`Lc^DLܵ AT9utŌ:03, P*ޔ17dK=}|%C*$0 05v!6.uY`BCCtˀ% ,XkA GI+۝8>Hб4$ܻy ~71S.cwM½ ? GYؚ/,~`  6l]nS@_] tpЁ} I1fk7F'};`b!Z礴k.ݯٍ mO3b5)]fZU!IuPp[ ,X‚ŏV{u" LU@_v,apsBϝˑWnfݥ hw.G{z^AgepPϒqun(#DCxX}nK0g E|N3|=n=`1& IUzWa2*@ :? @; ]K+@}&/ /tG\Yx3q5|Q iO'% ܼq٘5c4'$Dp9|^1,XA'E=3'MEX𫋧XYS/ LD"Id* &1t ;TпᷠRXςNkgJ/DxiӾt@6@ \bȎ ?{w}u xy=9DDXb2c c֌I8Z|5u(޴vE? O= XuQM;@>OX;{ -!we!ر#Qm0L&)f܍˃v ?zJf9 2*$I78 . MvPa-Rfa  ?DpQ echL=1#i74fqwĬ0}8UCK"'|wAt)+r_&*%A>onl9%)MCeU-jӯo_ir˾8xz{Yw~}H ۶mKh4or!`0Ϳ2l+ۮo|O퉡AW8y"+P6)lH]<-$9"(i% ow% ,Xp΢dwY(fv7ʲɩSNۀ vgY|%cy R7#cl|"'EպsJRg/@eU-NQɼ%SkX0/ TI;K/7s?4ˇ~U%ġ-Bl44]]]o ;v$z>v-mllT*$IE"Y@PpAf9m6x5,,E''c괹E$B>]ѭm^ĭ[߉50 z g0rЀB@);~Rԍ;0 n}':[.sM`qoC@&2#>#yAoAo0$"}h"rjCnn0AgzrTT0($g,> @9@"Tl b֯Cօ3}(7}yG6677rmۖW&kmmLŝ(ڠ鿭S,K@~xr̫f v,Ωx׸DAAYGf`E<Eq(}'3j*@[88\fI}1hJ3 @$Os~PoފU(7ߏ0E+`*A[N'3Hʦn m8w8Ay$dc ٵgܳTr|b)JS57o|"''‚б}Tp8g}P{饗 ?h4HHkWg+}?M?9e[693@mZ#v|Ss?Zry,V3Ws\(Pn/sE?f =**r\nNju+ٴ|YVXQT||:=Fh(=D` +t*C 6C ڕ=K } vy~Le V7h7%Gm3_,V۠N~)corKHF X| ;wpntd͝pΗBx:;;/kQxLֱ5 ~SGGȇ+ l諥H"h*Cnnn35I=@c9ӣ$25 \.RiBC J Kwgӿ7j۠Z0!ܾ25ط&Uxc ^X,s9.tvJ&br<,'믣)ñ9")2 ܽ;R DxgH## @%C4c@_&, IDATqnKȄȢ y8:=}ԉ& 2fCT"mU^;!t!,*.ϲ76N!>&0{2,hUc^rR.y BxnoZ"LZ~ރHM 3 XUˇ.G{5-!Ԩ>z~fsZhhhH$VUt X\0mۖvg}ʇ~g6Se2YX,FQwwwWxg&'k֬Ѵ>Pd6Λ̏,Zh:G| @=U*F)ͽI>V7zt~+F }b"Q0Bc)Ur9>ASǷgN N:Z-V4t!>!UAg ~Je*EYNl6\.7W+8zx}1+3cg+,Jޝ;' \.wѢA[ 2$Q1-Az:܃Au01&3;) CX*AsAIEBL}UzXJ 2k&2oT(.9k:rsE℧@hk; _׃tZY>ƃl2]0Dĕxdq$8 JdwPO: +}y=qԇ Bº\3hu\>V?e @ߊ/CEG̀^ٲlf~9R}2tZhYf|e#FD=}ضm[H$$?/O2qP,ܹs1w\ř3gmݺ ((3LVرcG!Ĺ?}o}q򊰰UfY $*,,/_|… ,XȬYB&L 1cFprr={ԩSollܓ9\KHĤn͆7buiqav>fBqBcq) IH[@QP &T |qd|ٌYqrbeHK@X+BNLe'ӥ~|Qs3j6..9IQɓ)+9^*lωDDžA\h4?p8_def؆2:Qd&tVdT.o&ΐ%s"! :h]3 t\CeAbәş-QsAgRj"YAd_> kșSY8y;TVbFB, ==hþx ]ELL4rƟhu̓clc/2qĒKzݯNB}}=Fc~uu5nZ J=`0Dz*\(zP*HNN^e4W֭[BCC=g?h45//;w*4a„sssY|yĺub-˯t:] 3)7_* ƃ&bt|anw@f+3p,86M F0׊7 x |ru4tL\^ I"88igK@X,W*# ޚHh'4*2!IK^u$Aٳg%lCS$gf%է77b#'݃X;< :& r@[ !*LɠݹHb%6f nZ*[Eb܏}.bC5tW:>s̈́5Nե}-uV"&C1i)_GU;tշie a4h:S H@DBai[:#))&5R8q׎y.{ЮX`ҥzF455dϜ9B'[n޽@ZCFc:L0|>}HLLĺuWXX͛߿5$((hLu=`U*ʳ۷o?e4f͚</^S BQ3$;_3oԣ.~o󏈲 W׍?)$uh Z̽?b=z>x>uw[05)qKn |M&nh%`5XQ|OHH۩쬥mӹD",jCGm]<߇#cśΞ-EN-*Y41YmޗGU{2kfd_@B$MdI("koX ^^ZqzBET$`d~,L!|?$3<;ϙ96-\0|)?/HP(e4-SzҌLåD8Bp)|4PB\Lhqinhk7_8=p& 2P!d^ͼb<:Da] 2JT;Nρ8Q^k^1]PdoXi Mt4*@gg'T*vmj\p .wߍ_|lvcb&"##:u*qaT*lذ .s1U*aild={Zn_uӜ9s>}zʕ+orFӷd ܺj齅툌4u9:擸P߄uY[+r8n]+BKvw,池5$D@Bz%J"#>>ue8J≚ EŇ ݭ7@$8C}}w [Ud{y)엦iϛK^ I|0/wՈ~ČT(!4E ߼fu.@ўƦSQQλO qwM5MV .K7@A*J/݀``5>cyHJJhܰm۶-[1@bbbmmm8rrrroڵw^qHLLh^Z@cFEE755ccZ\<0L'|[&FC#% EV_TfiR]6 d΃ZG}1|Uv_` + S4*tXYaELT,*?+pSoW^h \.?p  >VePc0AR%sEvŦ$'Wz-s hޝ=; Vo$1=%aj=kf|:?/g02M)ú Tzpfu^O?k4“I)H@/5"{NsՇ TG$!R!H]1ծwѭ#߹sɷqFɓ''}#[s:t z68GqP&eqx4MgB$A5-:fBv{7q+OʂUT|83R}>_('y9} 1~AcaAe~^OڱɌCMy[[{ܹ&H1VA .X s~JBKK 8+! $%MY@чE,jNɯ} K~^N $C8c2BTY&ݦFHMzeX K mG k D zb2G`?2` &01!=wskkkk>d2XNM։'@([8] 2L[ZnR0v'd% > P٥ƚ}z;c<>F /߀={6N8^62+ɓ'`2p8A~cy^ I(J `Tޓvð{ȂAd*X }8wT VG$&&r{v1|~ `q Da=$Q00qXU^QjƂp2 nJ>^Kc Ryj A'>DyXwsLtf/P E-Sp:]U$IiimEUU ܝS;\rW,>XϊS;̛M 0~v!EQSt]])))'IEEEeAĉc2(R!d!Z'c5w.(`i^䛶|q $8sLKc< 3S)w2pUw".z09./Xd67.w-?,%Of>o2BqKVII f3Z[[xV?w}999hiiILڹs~^!Ça6#_nn.݋s}dggE *ߛox!A$$ ax\[s0\,A k9k3m!d;^7Emt."ҕ;X aȴW^QYx0'%bkbwH(*BmW粽vysRd2=(@HH0 1A |-PUHevkY7&|~,$YдZ]~J"8?0H|vu~nD7`` bD1}U.ŀ-,t.cWB~|&W12:w/u Yxᬮ.gJJ \AyWkVXe]& KnSJ?B$Grѵ*ŵ0T~ [W@!g5HJh?0‡t$).2UAZTWz|(<"#LXn`}k.4`5w*݈AoDKKN"&:1 ;eZt3^xghٸF8A ~WWϟz`@l6d2ĉp8@ u۶mXC.'Ƭ3fSSSP#XT\ ͘9sYVdddȗRhZ$%%d2ɓAV^z0xޕ2,h4LNNﭷ{%KR- C4:?*dBBe `irYƇwvQ:T{Mո}fTr=66&Gpȷ |ϛS^^QE"(-,:M;?/:X͎SMLcu~)?/¢CO}8kq5A bT\q%Q 1V$gDF4W~1'g$AL1&$wr\ C-Q]] F(> ` Kz  tߛtc L!_znͷy5xe~1:-hnjG̒rܜ;> z!|pyL6ϻӣGFFb…طo` mmbPջ<ò,.h %̠~?}0VQPTi?^yy!Gd EQe;Y"?@zt'`먅6cPhkI|7$"R" !CD 7U9^-b46\D ذ:R вӧϾ fM4NaK@ MX0|Ћd}dzD [.sҹɊ^ڷGz_?W\1FSO#h4{؛`M|^oA߅/tZMAaŲy0E\  @{%mP٦"9MF6F7r~k|ob}}=n~3[Ae]rdeeѣ)rSLL |~dbŊÖoʕ8v؈I(C=d}CT7FI J!pv{X6! A[jsEAlH$R})5x'yj^ 9[&I7y=_͝ &ru@!7Rc?fCt tIQHmOd?D I0D.VY4J IDAT$2ҳ4At;[m^ĥ&lƜImWC{ Q cg!bqj<|ق;oѠ ^}g_>ݟ|~`c[+*/>sI B΢ \Qa 6dzҥKTo*QQQ{xV V{Dlz)Srp,[l@+ۿ?V^=|/^ /˽>tZB\ Sܛ}Q{;}dWAkt@ť]BHZ6uゥT*0eJBLS=\xծ x=^TV[[vu'[@qɓ_-66FOsNX`Lߋ4,VIf͊+1]z1#V: @DlX O"wt%q2 i^i`űF<XؽmL-oH cxn f`vӒP!4!9\0X@;ܽ~d7v> RzuvǟD ߵM#1qVOӧO$<\axzҥKqQ{ͽGѥmٲn˵믿ƴi=,,YcǎGNN΀|>pryc=,jILILOb|ܼ8QWƋ4g$y/o 5l yҕ(".:yAy]-9֬}`e I &X쏃hAX$1D`кM"t<M>ϟ8ΰgDGEGs믱dɒϖ,Z8X\ B>IcXEUUR3tr%" wuZ<%Sw?Yu0~8]h؀&q}Gn(;7%Bs" r~46oe꼜 y9UEŇ~-@t₷P`DHq:9KJ AU;j\a W@?ԦtB`;˚,%pdžc Ss{HH9[ V-B_xܞlVKv-!.Ѳ0Τw V6DGE##qY,>D$$&tm۶Z0 |r 4;{v|>|=#**[l)޾ bNSw-;}["v_=Ǧ$Fb DRCP8ACPtN|1wNu˚]!L'yޜ-+]fB! T ·2E@ j C & Qѽ,,,fU/X&L EH=T6W[X^pg~v{RiBsٽ &5l{{go\< sҒq ` 7>!|E0EFYY裏x+ :##[l)}`XvIHrr2}[r%>,\pPQ\\ t~7{p8 rEsg7>ցDѥ9(TjLbNj- }C$A0bL&!fDW`v(DR.S$D<*\|\\CL(J"5+uև~-`8 BR#0,DB۴lZKx0ceZ zA6&ܙZx,Ș3YƎ)t'1XY(Abb"JKKryyy8|0f̘1*~c۶m }a gϞŅ  H%cNN>3L> qĉ*h^p0勳:wJ\:l05Wo-IW7mZX%(@F~X:3pNWIf*DҋhY ^zֲJy`$>oWolZ{ϑ Q5Z]x6KIx[M8Y_/J!L4=~3a+ryyy8v.\yxeꫯ$-[J_~;<OGQQ DEE!>>7x#N:ӧO#..p\>22]VנC$bpeU^{y3AI/j;"A9e8V{?j{")LB\:l6p26'N4dHG{ K?>Q:MێÞWbRdˌZ.xyD>>ҹ)y.䐽^BB*x1[a^ зځ7C٫ro~SBYxxx8.k7]^yɈa*۶m"% ƕC 僧sN}wwwtcMA\/ܖt8`,XM{:X訧x*D@B% [dJS!ZAH٨l^ 1(-+ b%sbaYJAo)Ĭ[Ot~11!pɭ,H@_a1{ЇAo6Mjkm-Si&쒷si珦eXr-` nt۽a<% ^UC.X! <σeYAz$IIKByIk<>~$#I2xqY/% IR%T0 TE"}1؋WpߦWЛv1g& *8H m&~!tC>>|U Bfrĉj!޳k.6 ؤ IV < J+wA*BҮFX `\.U;EQhҥK^$h91 A_;еF1-qߤ!B $! D!B!#ѭ/&v $VoFXQC+EG߽weǙ{cY`Y3ʒvL&)]);-%~G\b|lO>;.3}yAA;_ۄei'UԮI9(gP_uE/qU  t>+ &!i}vpVY3!BF &Myb~:AX6 9xNjlwkj ڝX|"#ñ{ϑ&!!" !" K>;yüUs_g7FEf#GݱlYqd8v} ,HofM&IHl/o]\]NB~qKȔuXKswuAϱv_?07xsc~SQY l54C> .)2{[{Fh 2* V- a#nLX0 ˒/LuNN*"dwUsN,D89/r~:qƔeaaao?.G6Vi:ސ|EIh䌁cx.D@BVEy ˹ UoN̜G^ @pWk8= ^ [%hNEO x y/CW`a]9\ H ALȎ@0iЅ)F "r:LJMA&zMHP889/iSkrIO.C ӝ8^}IbCJv)Ds4z0}AhNWahLOjZNaPHLס6 $_{"x3nW3`#\&{ZUTpdo$+(]ů raex%{cYK>u ws/ έeA\yץ%$ƧJedzo[=O/4PUsN}ssSP$IJ\PS~ٳIz7,0bGL&f @NYGF J\<"8r V3}@d=IQeA+rC$o:44MϜd/OUІU%!(͔)i8U]`\y+`C,TJ>A|A;nV .*F$ O_g f:jߓ){ Y')3ApɌHTp_cUPj内)Rb4v@4IhFO Y ppGIB{$ G'ORa*3?D) .w[=mZZ Z. e5DՇ!|c=5l۶-KRevhڊnVrh4/j|'\֐g2f%1>2<^YEn2"jz[JDtXDdֵ/`B7wxVcT ӈR0MiE"Վ4c39VsR2 i-X_c3_~'xwgcު6jmg*3?R( w߹ σj-kWǁ|p~ƆPV^ ͈-2C~]w0c(}/|u0`ɕ:s=ȴiӊ 2F?oss _W3K>G?6m*bbb=PXaŲz`U=(?Ey 2Esv,ݮ ސxGD?-pz0锢[ `K3 _4AFv5(YJW%{$#[gaM+4e.SC!( 2 5|՜ hR$:'u01`r#A(PD{`ʮlT@IIAi.N.ȭl=q`H> =nX4-PB-2X&E?I~L+yB@@_kѺ~ hh0 6 sD0S x,Q*tr뿝'ԍǘFf7} sVgU4xu46kh"bU/믾 +m@:x9g} n}G0x"8V@c_}N$ (Q]ӄ ay8YE]c$XD>+c0"$Ą .<&d"6|jsN}[[[q|$$$?ciƍgΜ)|e':&dDgϞ u[E*`NC5=,Z >:w& Oź6Cʶ D)a r',:y, W92Ǿ} IDAT)8X\UOC$9Eǥd2ՖG7͛V8F2ϧ?ТU0SF&A&D) )7:SajG*G ia\8 Ri]8 \ B tHxA L*LDGREBn3k@I0? *8'56hYV^v$M"dntň\{ 2p^$|l<_w*S1<cI&-$ AI*ZmZxF4 #:K:a0*dAp?'@R-u鶒$X_HIYi Jm Ij HA<`h41,ˆIʳnݺVv${8g2fͩbFb|Q: k۰<'wGDd20 z5ٷ͔iMRY>,*>,/w՘47Wޛ[+VPQakTk84r£#Q=֍hcr`b8+XR6 ^{"O*{XƳ/8^]&ш** 5lU\*JYhE 8O)ИU&8}!UE':̅iPeq ۏU$߲e#GyE !x }FMj٤!JF?O;Ph1aE\m{!lh -HcV>ҊjVRi^$ȷ-0wSnӪ@@~jq x7V#x]:nsuVjuJJNokk뙶tݺu5$IjX6 aDtlԡ.c,:N?;"RSt8j&6@u ) J/MPG? )y0SK&025@ $ٹmr,h5PPW7WK|lNȈ̚5sg_0l<7Wp0wGco5 A4<^'TJ &">b*8^H $Gj@1 L._(~{W/jXs˓r_KE&)fIx0L7u;Y$MR`= Spr,瓒/<;\-rLhTajB<iJdNDE!||< tؽթAfj`2 Pq >쳣'^Ldـ ,A2~M”h& X MixgSO2)+$M6Rɚ3/g#on1c# |yXz127G40~_WݟUc9Buu RM.|b5i4ל / [:3_~ٍ[עd>{ӅWdxސ25JhoLۛ./Xn1/HOƭF\gTV,_n-_:LGC'ܹSoXFFF>tٳ/;x6Y}졇pGtJE [o/^?n=SU^zO~g$DEE\.v{+l|}}mh[bX5WWWgGgN>LWWwٳgYyA0D),Wȧ&`F x0tiN<σ(hjP4&@ O$(r$pyT^t#ì$(Twy{ڄ~f! F>V… |'wQ5Һ9z?@&[¢9:ii3rZϯƜ(J ӂ7,4 c$N{Ěrwm:<\*hHU/ Q83gyA߆\!<lߞ FQWߎld|LlƦwn1! ZFd9㾲azsl,TL#Gv`(NEsݞ9x嗓^wM|OPѼsXrmmm+,Ya /pHI>}y>쳂%Kd%&&LJKKӤ,|w駟[Gk ! `Ħ(~DiM?a2yCvhiD]c &KUNv!?/ e.0F n %-Z_^&#D@B|X,h155 I àm]CCú0A&!4Mo3{+NٻS;?/UB/,:8KR9?K3͂a5s-2LF `Y Xj {,&DZP Gw'hEP4P谪G+) (^LEq`, H)kS| XoAB`y$7aq-#~hj(PZ`Z4qDX!=q ?#I`؛JT^ݯ|@z!S;N2gz޵JDV@ ;66c&vT;&N;qmL~61DHUV]mߝǬUEw׼g9syouEAFt:Q$N3M*E, nrL/ј1*~Ybai6$䧿xM5KW^g߁vfUw(}Tz3XMc{䦵kַUWιoÛ{7{L]6-[+)S u`kg RUuISSy@r:I'>Qz ZlݺNLrsP'KJJlY.+عs'u%# D"ttMۻgϞZYkjjV|뮿Znذ'Nos>I7N[!8^J!+P]! qp(SQKa_f8gcdHtA1MwH:@<{r 2!5<<\u֟6_y8N,^^^N]]vTU¨ZcYaNgW=~NM/eY~y,_c5wv _ܷjC֐eYB&S( P$:vcPd)<|YVP{Rv[s.Q"H"K&c(\2m!:D,!@əp^IUH;owʢ W.+&@Ǚ æa$ɪ+iBU:LJ =HbhY2]G]^D x:ύ 6\?[9-C;龧vd%VV cp/ +`}ae'w: d7elPpd=d_ˠ0xT6 iA~X%՛'3bb]3{ Wg6g@\uy9=Cv1|0n#~"E<ĴmFi^jfPYSGV1(-qc<*]mX4Z<@@gu8sqH w+ O.kzuf>h.h򬍦vy~#W}9 DJLw!$dyڸzqOyCkm_Ҫkf٫5ѼnB~-(\~.۶mvs-xhmm#}x<я~P_[ۈex@4Mk(++; ߓO>#<2^vnݺu]TTT4xliIJp܍ܯ_xEQ|ꡇ֑#G>OZx@`;qx/Hz(C._v?n\_K?_vt "" N1%О4 Ѥd؆Ŏ!N"N6md2ݗ8Nt]gxxVf̘AII tttܙNl.t&S/ūS(E˗yA}Xw}lNs9o( 7;&K+,mJ+q|dsI 0эF0tN*|$_{l]sm^zmR)*ngb(x}Itmcj&(K!Vыŷfwkitsぁ4 O2l16GL]]'Ep@^v&w[?L Eг/\^Hs\Xq+ 9P)+etc0^Dy RHx-< Aq۷lO C4|"J_z/ih{xS7a IYu]-,Xz `44O@uPgöC?dV׿5GL?cjM5=D׾8ܙ6@SUdAuK;]k~C#3v]6 c^iO4mٌj=Ar\ \.PRl=DJCF}tlL$\<(m#.#2?8 ;\(s{.O% w;΋N]GD200֭[Ybp1,͍7@KK  ~i|%{lϿ:N0 m6/_~n$||:?s;)w,x5TWW}?޵zEBy晁orsss /HR/Ōyˡ|`0Hee%Tx^zq|Evj{ڵ} Lr$>v;lO4c/f#pm$1sLE;iBՉvPq\Ͽ7H)uM)y>i\-'b> IDAT 25vKBۍ墽I&rEx$/ĹrŲM/nҲ狊|vϞs?a\r2nhoX3krCHs.5m?v( D t&I6SSD@%I($x=kL$> ܼmܻ-cv QyTP22YнUA*Vaܸo{{/(Ti+Q|A7%~'TxF0,?TnqztUB3S>Xo=~wGxv\߰a86l <ٳٱc`H$B<??ppddk֬Y/Ͳ,6m4F>Nķqqܹ@ @$!<9w]ǫWR"b6,ˎb[ ;7gOLFS Ib-{h@4]vWWVϛ7on{%& mUO!dsI?xE˲db l"k^Op jF4]XnhٶmEqٶE M-6-rb9],v5Ϩo58qld)Ry0i͖m?De Ӧ7A\ G!r1A8^;(8"DFO]}1nZ??M7<*_yYFR*@biq.x ܏OMbyyA\nt~ lyuH]5l}mw_ 'o_;gI#Ȏ}&ˋԴFc؝1ɫ`Iڒj6N? l9'ESZ0LtttPSS3Vl޼Frx<VZO?Mss3>(˗/B'z뭡p8|xGh|UUU{illd``` ߊ+xg3goYt)}}}Z ?Fh2)Pt_"BɏcI@ɴtuuٿPlNx(@sDWd׈֝~5A@&d\ofeea6555p8cU(m /5!jm55C i8JJ8jE|.Ogױ4{F@V,_jϏ~7W.j(ZaKY>Q}g#(`Rt{ C%rHyYQNg☦((,jCSL?%2~{}m=,:!a(rF? M.%_Q$5R `(>ҽ>'mQ|AAn0En ;!;ۆ3)BUC`z$۶Gs)B~5[`S`7`rj 8( 6,0M$7ZV*h``$+i\B"O!+,ˌ#J r?V(I6a">B!,+%igB>CdƺWII\-$A%ڹ=G)-jKlxAjD8Q KKS\4,09O%#p;vW-J#caW9vQ>g埼O/Ǝ]kٯqǩtj8=B8K<w^..7gu;N^l_ ]sy .v}/zo_b1ϟeYy,X͛466Dرcfy7Ɣn|#97lrd2u̘14|###̛7o _Ζ-[444Dعs:IQ­ފWع?J덓KxAD`ψ}n՗ɍ5N8U:}BjGLZ7$$dρKI6ӂ:as% 2!g{IJ twtt|fΝz'' Ƭ"dh4,˯Ϝ9~ +ֿag9;vu_nXǜn4/+HIޓL$_vpNI4-M[d1z_/z:G:_$q%IJ n2At=G8ֻ0-#G_4 B>YvzyHI1ri% 9d{ #-fA'Mdy6-̂AAbɶ(zV%},mZXIuS7%21U=rq)2nE&/V3*Ρ8N`[S $ A vʘE^5tf{tN?iZhžn!K"u2NDA3"ނ d%A(j^;uAO뤺;H QռAKg0* 1c Sk*G@ wOp' e8+hΙW2KIo+;~0.IA :fU[&2kl#i2?f4NA_6<\9M" O\gÛ{wݜiK޲XF23xBC Ryb>¥Xχ< g=ܵ:DBSv`[Vn3!xةT1+UUy稩acBUU7oS<<`'y4΅矧/%IFFu=|a2DX:sP9Dڳ:E##saA?'F)q4]JQIR:jbZОљRȘ9S`4qB]]]=x<6L6Ͽao8^p̻M>U+~ B\[[s^ikUſ{ȇ"KSSL^zT^$}RKp[mYHDEi QSy9oRijDG*M.B7>O)Fy5IU:{^t&r>9eCsV-ѰG ԋH$ׅHvPfq0 ~TK,9ʏQ03* ZZE(¶sWE31ND`IZ{D|@֗i.Uxq@,II]"gp r.r ȿ P>z@W8N?%:<ˡ8>TQ~xt&Þ={{AXrŲ1i}aeYٷ0AxdG/nͮ4.Eܮr0L I[q9T,jضCtQtt=B.);Eӈȴ:4 aDLwe!-2 x ZID7_G$;V5 m=?ϳcw;o'cǎ% 7=eAid)~dzks0o'W&;%VyhKZ4sHL L,ʜe>xLO ؂ =˗7~5{۷_t#W-_s(uNC\|w<4M>?eFRVNf$>i'-* IF4[ÖN[$6Gs?Ѳ6@v̬E{4;Z_|gCzM f4Eđ,NETmP"0ޔ,Ţ(% hޚ1l";?~~_(kC?h^<,3CGoC@i˶ K.Ucۈ-aXN a@t]{Ja3Q@ be0 }*3#* m0r 8l:k눖F2cIdS.#s>Clye7e<==it$ p맷~1 g꼏ܾ-h/UUU7uj7Wy,Ny/x#b܏zjN] @|;SN=+I, EQ4\.7FV^{5+V֋c<9r]޻Lfݮ]hjj]uUegW(ؼy3Pu탬ǹQ%H4T8IC@㑏$ma> qݴLNȄsXrJfv5\35W]űn6m؀rDUKMMéöv4Cׯr"3gw⪫+Xw7/nڄtRZZz؆ap!TQD>A_?}x˷/zϞw=FHDSOΙy" )c姫ѯB`dF@#+'+o'Be?dB>j/lt}i;GO;|^l(lPh|ʏ3Q !;S+VQ$JKJ.cgz9=P&Ƙ8۲'R+!q?$45#SL"/t KuHQȁ5mB g4DH' K8K3fqեhL)ضZ{޵^G/5ݗa&3)B4@ ӲN 3cgwT8Q' h*-4iECE:S@eKYM,8A&a:ù>vutYYQVz;A\nB6F~L%|TΞMv!x"WıԂM&cF ?4|I ,K@P0k~]-†@ԙUI-1H˙r9!2Zߋq=$\$q~8\QVpں:jGK]DH&MXSNwW(x'Gyy{[obߑ?0o|Ӊ= #"1 Tqb:kmF])!MLtNע0aȚv")T8񦙐^⹡oׯ^ׯZLww>oaw7l|qu$pDjUKt6hft!EZK3"vGVpۘJcmYI8 $r1jmK#|ɤ'1s:5߬!]b{qll# z;uꏿ1,URe̼ѭSNDOiMl5%ݙ7k?؁ұMΞXmچ#(3_S] v`$Q@&HUJ2!d50FRGyDdn!XOعw] W3_EEwfApYCb-6{|)ͱjnO]^ ?:hxe=0Pm NmXe[Džހ(vF:Օ>; YvíiSYU;>bW^ 312z,GYX|E3]ϔ5e"YF".pڤlҔwp)lj$?m(.G{&<kOT*uw,a aYy}.{!qLOwż[#<2V*K_/oZ[v}pק˪+Be%Ka;irmDH)6lOỈ-$i~]@7H*!Ga2Ng Fcm_9נe mea/a;vaf.n@CPD$c=.EDrxm3-'t9󎓪9mz.,EbFPAM1$ϨQ\sM1Qh14(&jl bA^יrcv.X3k^0g<{|?:{qB> UUU,]#GO_d̘1 (o746l`H`2tIK5m544jժ.||^D䍍].m;k6{ݦ® 9?#UMIt$Ln spŒS'\iBRϟGISN>iϽ0)..>OuUJ<̇QH5dhI-PL4G b=oC =UB{#Gَq-EwQ|}CdӊL+nAY/Qc9 v|1E3NA*#wupw~t(YJɉX]&NEQ=Ds@}JAy_$ə#uX΢'獐1c,S5uݔٳIPW6i^b3۶vAW[[ O 'lz>pU7?½?,  `0ϛo[oEEE]]]ՑJrƱ! Ie-Aj?mp6r8)H(ޅŎd}p36vW'IJM4)z7a剙*ԃ/Ô1RΤoAuƸZwtm5^i_[~>7wV7'{̙?q+mU֘'sw'?ϣk^3rDҰ-EqL㉟n' x{4>YhP3밅a# qe^8K=9 vYϜ70/gy+Sf*yj̡*2+'DV_Ϸ]f10y9~qPK5kְfͻ?կ;ΦMt^ċ.h'k~WWulvr*"J}۫ڵk_UFIz@]Y74U06ӖsȹM~_@|EMH@|ۅVS;mlk6'H)V}5pD|8)!gߑ-_>DJi/4%nO&IhB;cUM,keBhx>ɩ@dx#f6w6Ahԋlxwxߛ;LOzvf9uHix8a6|;la*!06?~_P#<_prgΛA[['/P8d2d۶FXQY9w?A%am(ϻ+| ;߃% :(}|H]]#tzy3~Ҫ/}a)=+s=zzz.4Ms򻝋]zz<h2txx[ӊ5Z-.ۺ'D@@ (>r\JYAߊSk6q}Ɠ+b)A^(?^|JWK)?pE}pƌ0Dyɜk?Wu)_Y9Vz&]w\$].zږ>qHݩ=G2-qڻfk`h* g^=eT~;͔ #O=Ғ#_N@>s9!A@ޓ|{^xwx d_IM./aZ6w?/yWfx^H쏈X9˵j]Vor",$) ٱq@"P G{$/)` Xqw%v6nv[ϼ7|۟.αΏ$tt1;P?#xo}'rOoN߇x[;>+k{/`틯T\$#)2xĵ~@C>&xWC@!0)@<@GA' {(|)U!H<tvEѸO6-ODzID"D qx$ny_Z:<0X*IߓR.4wur5Br>onf7"Y(ӓ/Rk˗OT ]%"!;gX{|%P1cm|ʄ㌰rlv㾱3:CS0`܉ǝ%}wNT;ٿY\}^zUd纗;ޡ=vw/E\v-91("%%G  (m,s^:0 t_~_Ú&f4OU61 O|^H '/߻ m$.&Rd&Ύ4MK@~D|ïd/pqWFiOר9뿦Mdk߸w  RRѕS,)i1 mqj{nnTlF~MwN!X0weB>/W$$ $&yԧQPP aKwCXH,q.U<oXȇ^<('! :^/Dyw"l\l\i"xkp}%pgߗQJ#~atM6K,.G p:A !9PƂFHEaWgE%Ph\ϐ _+=VڒinpG9pt%HBBLi{b' 6%_-l]47\ |] 58w#ÀKmuǺi\W^TE UYb_% ;w$H B`Y&;vt|e5dIi{Η]wV˚{ƗI5c;LrQXliMΝp1²홮KuԯRvIXDgaTCG֔G񏧗o] Bg鲗̜9&Ei:RJL+K[aԏHSTڻ2# Z@Hgoj@Gک@>F#;ȑȯ0;CGC(.]A 8]MZ=!Y] Fɰ4zYQROhkϰ[YØDH J'(B5t&Sz7+C{`HñA F[Uן/qJ6EO3W^fX|>n 5䉷VJleDemu$U;6B- !9) fۛqMyY kzh ;H"0S59La 3ebBX,#׻Pdz,kҠAn:u /P__O:y} {Ã>ihh?J?*Jx֨ڲ\4'YYzO~ˋ2ǖ|[ۗL8"Tm7%QKںE7q5}|Q;b(]rG3Ѩ9 {>4!\dSߦE^\UY&Wa>iS+k e46u L6o])e#Gt\~O.]0UlC9ʜD椵H=- IDATL$;2BD1Hi"؈ WH<*!zO]''HT(x1w@@,aHI ji@Ӂ, r&lao+F l߫~5oS/^״/WrLĖT vw3ձT\|*k)%*SEeiTg+%MongQ9dNs? .XjPaPTCW(P!El x1+TJl$RPB+=B@Cȸ79v% {6V%_]ͥ2^zi#G IC/3XtFfJ`9&mZn1ŐBs:\~ԩNN;] <{RTF|c ONx>R /|D1XQExb#< 9 ͦvT7%NxT ׶7?9it^>WVVXW'kSPۜ`LU r.N+'4.a+k"GǑţ}u]q[UE4Iqavmg&'*A#0u4@6aש{Ὲ~s@72ܙBܼZ;;kY3H m0Ugʆ4tu?Ev^d|^~%ۇ9*],Bv"lCTUy-`TUzGL CHy˪ʈ(Xl7yk fb {dT#x)%zr*Ͽ|?[<\!=z/ft)L.oq@cy/2W_?5kV?N.;3O2 mrͤDsˬiJ Ŧ .zbomgUg^7h>_^M6%AuiN2<H]fϻ6㋽e/wl;@n 帢B̓w$A /ctIZR[ ll9hP>>h5Ho/_]t(-LE#ٝ(FWDOYWP@35^cH GCzȃb(4&мNIdm2)ME(v0YJzGn@eCm?B9i [!-&" G`!Zj0 \v5~{=+IC9as~Fy[Q5t9=FqsGi²zyQx1@kS;A&y`O/q7/Tj}CF(#ﳮE9iY|x) <  =~zFٿmȑ_~@=x|Æ 9/${Y~̛7o/~+lRF՜aX$@UҰAg}C3I ҂r/,{!pB@>찦~b#0Gά72n/1z}7+GS=ڎvM -[.T]CsΜ*V#env#zeT#&Fɹ T Mh;[NϮy&ػg@tnrMmW*D=@nsTfmG d֮u{zJ)P'(>DP7Z5 Jp-ueiM D㠟=hfGج0ze'+x˟~}BusiuamQU#V =1u+3+dƌ.KҦJmi#~4~Ko|[28^ lf4@ܣqdGiΎ|$1vL0(k=^WD E 2􀁝6qL_i0_mvP<|t]ܜ(@z0f4ܜjO`v$$(S2PB%RuN 3p\Itt&B*e8C' B(IW u5\{n-“6S1 0F+@p ;yvn-G%FCkMʚw^dQUx#h(,N~*NKt- $x4 3dZ )'KW:ـkMjy Z7.e-ٯ:{g 'v2}-LC߻{gxLfa4HM4~B!dU:묮~EDϗenvrmmmFCmz UOod/^lD54mn'mx61opBUGEH1Tn7iB8CC۰xWvuva 28'aB²o7"V+#][gZ}M ADefY.mF%jNB٪FIX;iZSkQe!Rz{=Hr^2Zdm9j̺ӜRFIXud̩Zՠp1h5 =Ɍ%n^(3֕V=e N#Փ\K4gw9vcO+}Y*4E(h*Gsh9'_pp5LI'GRϟy!`?T1UAr. ue}X!دn~~G஻o䢢>d2^;X@2LK6}3]__LӜFg~===k_Wjn~z4ocb~}gTYUU|C3MMM뛛ZzoQ%u"-HW mۼ_7=Y nr+н`z.,ը C>=DcCg)}G_y͏v:7d.[zBI49f텑?jNRz^"Te4+^W SqFFVfL3w4BS6P,/{XPusBSVK(^Q-d+\-EJ[wotyOxqey_WT]/hF(NmfVkEIQ4H*~kU#^*|Ϋ{úd˨}t2B,@PPv}g|wEވi-E$4A*JɹҗuD@28b@*u?Tj&̟WÏx ܉P~y4Ձ] Ų+䆆#R7.SH *tB^1bpo])yɘ* u\0=k8lVl;bp~,W|wGmzͳxomϛ7cŇ͈qk*mK;'uVwEhFw:8J4$jT*Kw*iYXY2e^X>Jrìnoi[tSko<Ul̮ N7e utf2hyGsqEɭA%*(}~p3lTNZ?‹7f:v\k }DEȜ JzbYf7%JDjq6jiT@(^2Z玲tH^ۻV' s(P WO7FrT  =9x`h!ZPXƬVK6EQV'h˝ïZ`_Э LJcFpϽ+\sHuQ§ գ.8.(^oyrfvK>? !葸gXe7Aɇy !6/x>nOTPϧz멷F:krϒ\ȊδxKa/,Θ%~fvv%~Hvwx[Ӧ,\I[G#^o/eP8P'HH `($MtķҔ9~R HomKUD.pDH$fw'g 4Az6N2T]+mbg]J&5"-܋iRz 1ޏ%TX߃UE;s:ANdsCae!+w?QeM[h _z#2(BIլYrYLiixWI9XU7Ws$oQRsCAiEMU'0;= AXLTx?sGOqxC<>'@ie|9s޼ymy}~?SLaʔ)˗/o~,..ݷ9@8ޫ-[~O's} ~DQs~ {[ny< ų:mE"wOcf]w5@$`yoSLϱc7vЕ IDATC}Gydpȑ׿޺lٲ vdr _s7Fɬ tS_m]ݩc*KDƖvv5rDU-G!mÄ"uJXdgҥ.IBQ2k/%kӯw*qɊ.lNږcc "C0WZW8OvH(;jTXVDf**':;VIj!'4JYhBW|D,Y%Cn"8+hժeVH<AAvF,4LJW>u8<4{v7TI0Y5!4]۱ s5w]n7Zd7gg>uUhAS=3z&’̾dMhU ^U͑κT!}Zgψo̟7vcp]=Gz^v^ D节J*;i̘}͉oYŰcθɘ%Txm}(V{*#x9vEhcXDl 98ۛoƴH/Mމ^Q,e/Cb2Gz8;;-g(࣎aÆ=7{eرc#G<3͞i&n"ȏ³|aΝviNPU .@x饗eȑիWuNj~裏Ft]?qOY3g:mmmd23uhΛ7﹵k׮^zu(C̟?SO=Ϋ4E6vd9d[f#s!ۥҪed>`% iq,2W{&{jQ'L`^ T[veq=qA]oAa.pwMWeHMpv]4\ȓ^%fO`x + #p`C4\ymn8s)o&2ѳju^yw׏[tbh tSA!vXJUKPuMXEtaEt" 5Rw\~dq:ڐMkd}k?n}|8{e MMqLDBC*tů&B̀&0ӭ}ZUyѮeOqk]vXqq" \Prck~-„ #* OpxLc[A&|X y!*aN#W|h?S󺨭O8TR -_F-'i"5ݧ(P tJtMPLe=QX*/3?i?=!]q$sr]YI30^7}K̙s#ꫴr7GvϞ=gW:n߿tMT*0|^~> CG;8??P(馛fJ\6-׿>)9 ٹ/==N4p'r ibX4cF-ibpd|̇$f^$un5%A3u^H?T" BZ!u[ 9hcVjӑ--U)nQHiASſ^=eO@36:s D;"zPG[<ϰZU+S(7aglFsZɆcNrW6ZW0g5R``h fFu锆 M-@;#1(UիJ$AefkhQ#Uԍi8g U^I@& bt$ NZe#^]O!D!RBw)F *BL:i@*bf]v# {sfd`mݙ-^Xf6?L`Euf +{e?pxճO MyY<:2{e͍bA~̞ÒYg ~yf& a}|d1mWw=yV-oԧ.rAa?.wi9.W{! J}̞ 7^?C@6jX ۷QJ Jr{H@>ّ}X7 ccc̟?ٳgn:B__ ؽ{7===\O~{m{ kMULw|rH;r{gcܹ̞=_|P(u]6|7|3w_^0o9_}m-HV6l؀8mz5t5B{LD&4 y7ޏjXSI*oܿIfURI"HxA B",XHK^~ _o3-(T5S;dƿϪFT0$ Q87pcG)O9dʓF"g[PW]!]M[ ƃGu C" uId0:4SWm̜Ji{ﱂ'M.@־ydgߺMKG;0QuiK/å|;iJ5Cs>_¹y׋\̦Q?TfJ微 4}󧕙w !Oڷ}&zϽ;u_}c6eCP65J aZB9.2t\PtwOmu#u gwӔdOVoDMq,SLe§(NSx 5j+0J"DWP2*(_#r uJ ]`ڌ:IJuS ەtv$Gp*7EZ+p'?gJUye|&}em>bfE3>ug2N7Kˑn/ɢ1!j|4v?gdOm[-ֈ{#=;R4Ԅ14_0W +WGmM ]K>M<[bʋe V*)sr9NknvnW`^KyMqF2%Qas[-W2 Ӈ~QSeR{'~j5נnj;_Wυvh* XH_xg+EZ?t"exg'9{9^ED9 IR\~TUUV B\uUtvvJ(<|뺻Wd#c$ mgϞJX~=]v]y啇m'xoٳgSUUumOOϵ_~avub!ɼF]K#g_4z sAb?K/:3McUr?{ǟ~;>۝oї 5EJFSX0:# өWA+1UV-_X:`k_HwYmژS:|~͚S]]jUHV|Y K`q~l1Z2`PZx5>d:Dfm>y?,};@ 5j^KՏZHAba3^\Qj-1|+x?wx,&7'k:e/E6D|Vh5ߩ6F}wbjޕ(i/V@G>͖OyK|71ٖi/z?!s]/r#vݵލ\ypX%ޓM&xwBBfOZy-ϯዕJ^F.(B4kB*AZhZe 45T:(/ p@$RʻCQl[`ʽSdq* @yk}Ի| 0B&^EaTfFQ9/TE1 YF8`WAu,ā܌"'o[_+_.(߰OF듴w6W Sc%|$F}wx??=nՑThR"=&ěh&l{͐ѵGKwGzլ_snܥu8+h(B !`W~6}~răL=tS A9säsRIu.wqetIU|Jp%_GrϞqTinlƗ>RI~?va,,vM=?Ki 1=x.^(8r_QJa&c4c~T*3p 7 ft:m̞=;wRUUŬYd2Wr83K_f ^x!pRJ%{9+3vE"l6{e˖cڵ\p3~ԐщY=ljɕ?! dԆ Q'͹QeHAmP@/Cʛr.t])UXVxz!hA$ӂ~P1O5ҶB׺H*G$#<,BCmʼn\,LF2,gS4}jeJa &IHW`qJ *Fo;}bf[D-{mQyUS+P,tDpt#%^^!nEW%U4!شmx"XT䴁W@ʔLƧ>'c:\M1R vƀX i.6U<@u3!fyP$tb vSK9YdlL۴#OϐSO?4D,Y͛7H$arrקø8 ͛wJ0>3P|]!h 2n+29OaF.?%C¯%d0jFF j/4E+OzBS.H>x$L*WA?#I}C3A3a] ds0._Y*N"N{LqeӨGU^Ous{a|i tfoMeA.'Ty9z&RiFxk*ov}:vQHIG𴮩|DZ>ՖI{dshJ)bO/9ǫ5SITSYa`\"]/_:<(!5l+jw/mO.79b^]q{m`ˉ w_M饗{+!١c5{n! oGw28#ij4+ƺgbQ0W)B0+b B(ڱ Uq=?ޝ|L,RnT'PT^Tw(*b;~NQ<1xB*N=@hф@{ΟIN9Sa ``0˝wPn&4쫷=^Y#V_[)WAO+FIG8Ϻ-t2!Ý@e;FB)PY :iEA MH?0FDC'[!ҷ4;M8yUD 6@l^ K'|7|ۤ 6ARi5r <0D{&Қ^ҫۗIj$Lq+T"I pKN #5i5I @tvad'|\_`-rv΋o`Ѿsj??؋_h~g0 HMvͫ\\_ W$ʮ2r ^%ya[7ah5qlgKk@yd`8 YqڸAjh7&?.¾3gC^S&0bK\ |Mع[lmd@g/WJqNs|@@~ *ﵽ:]8*['[K}vÜj~_/rWR[[g>vgK8SP{ٻw1OeYVwUW]Ś5kOzߧ?iaɒ%oΝ3x){[mn%-y>4'&(TB/Ut4R,tvuS(o&X`mgFMʰ+XDC&aSC1)" [ʓzUҴT1,PT7Kn5UiFڟFUJItUV&jWl脳VVF.WXN0 QOʓT%ٯ$gfI$V cRF<``0`8߻j>_/Wo{\/]4k R)[*QD].G)VJ: ߞj8Cc/ )Y=Qa1RNN(Dh4M}M;=}/P_BKL.."-E14I0$D/$ɃRMU)SCuQbs$X&7 GaO=c[wĎV涷ŋ+>?0K,ɵXp̶O?4W\qӽ:Wgg'[lO|s=NJi8m$[hQE\_g/G|2oq˿M\{M.g~bNdel CVȑD r߫?VvEc{{}K/#x;uٴyܣ]tuNzQ2R)|e eI]Q2YVxe|[w!R P ;]2 ˰@X$IX32OscB(&=Biѝ(!OPH;X"R.ĝ< d薎ܼ Vq nF, 4ȽՈ+S[p2d*jKĒ5sC}ؑG&6ACMl44L]cHlACXLg p_tt';[7t+XzuSy@H5m]jf|D`4K.P/"a -)|;0D הhgY4oCBx-Ͻyr!^(|_g" Ϙ4. ASkvP[c`SUpMKI֋W!&L;RQHH#j'90pJrA`u.1K@ )`r֪Jrлma?|0(Toz,x}~^G/UpN'N͇:3DJITbŊ[X,F[[555l޼u) lܸq?pr)%xǗ _ 6|ttt;묳xbRSSÖ-[mWrª<3c:wѾt ;V|h2ݽok0ޙ""_,:i($ɀY:/ ]x "ؚP4G8NJB땯ڔa2r7eNђNNs̈́t\TeJȗZ\8cNm+Ϗ f"z:d;tMEE@lwi7d9Ί{T]V4Fom)gz#Rz2Z ,,tytG *Je|DQR$]RBC{?ðÃf*eǀ}O._:E)d`ޡ:k` wޣ&bgYg:V\m<477bŊba6T% Ǒw{G*:Lx/|O=MMMuYnj/01Q .SÙY2M|3o! oevu隣D"vLgq]ΎC,]NgOSX0XTXD4'M@fΈ5 =pW[œti{_MߓJ.x_4j@ax~!*1#ZXCzz[ ]x2xZ P-)Ȭ^! -*&/K~-E[NƆ?VkdIu IwZu!/HJhsx_Lz!5N~WВV7ix<$B<\rфK6p~H!M,2j]Ot磩)9{e _9~ y2rpx eoֻcFّ?k)W?'y1vl6ƒzp5CnfsS?Oeϸ$1v~M7} v g[&=/8ְC@{[OAHAMoԬlzXXGn;Pu&4j&a{6 t#zf=Bk^mrUNQ+jժMκR ˲KxWs-bΜ9,\`^(twwsE3/7W^y2I 'ikf7h4T! kX``&iqGƱL]Jdz@Ӹ&@ bh4%C(!!]НSܑ0yT,|UA'tnlX7!{F! '7\Tզ%UIԑTA]T[yhR3 zq*a=|>|~MWаab@ϒIU<\O]r\o3jaRb6*!RZT*~;F.M*f!Urq.7^gE j(Ȳpc޶`R1R\EޖlDFjSxr7TIN( q0mI Got,=|\yK辏q٥on#JU]:ڊPJ"R P"2\L.oTmt^?$ʅ{H i_5f|v%vA*ǑBH)|.RwSPCJ֓O (sI&=;s*x ]3>hX0A>o*OW Q4<#Tɖ""B.K[pMNUKTabo5~BN OBف:6daIvP _vyob&%Wr;A )%Iq J٭.wޯ7.^Ed~rn[^ƞI ;?Bibh&@h G}f uV)pUbHU+?XZch̡f|;a`?/R, AfJO=fh,log+G$3KL"fH!E)We ?LH3.Ur&j3[XQ0/cΞs6I}W9[j ݒC1!J`rR6(`%B4ph/_*%>w;9܈$N+3|,#O4|';$;|s# 6 SO=Ň?ķx<8{ڕF|qWe}U:ᗋfegg[-UD,^L z<ɻLuli0QvVHc]}ԓ" SڝSgg*02_vLubc_ zVJk&,z]gEc k_[)LGA[PzSjSeģA;LO~ فRA4qJ1f,T% &]UYygZ`aZsUY t(x#"2fu7NߝNQpXl0 _V yNMUjjm\Ap?դE(wO_\6t@%$"w Wփk_#v1­2TTv^RuFa9hShehJ226iZDq&#iZds$5ug0ݽ{߁U`O]7O ӷ(%PybJ D=P)R^C1[Aq6fB,fMmIT^%p!pb<+B \y$ Jr`QҰwyEi]td8Pvʠb/Sc * Cc=o6_ ,CN"-&)er9lÒ'@@JJ,JK)(HRAMB<ǹ*;;&;6N(3 w[9(E$ Ig KM:CwOBY[777T[z&{8KN_sDݐlyd1"EJYAogz :H>]Mr?iQsA~WuJN{W IJ,ǡX,ΐ;W_}_\~oq4۳gqaҗw|7xypL=\6n?e]2֭VIzo;o9n*+KC>>d|/\W@e`m.SmiڒE ]NуQik:7є:,ښw3]uFצ|٦xF=@rVHvG(~5Pk'0?7ݛZX%Ψ'5Ϩ~O]fߩlJ/y%JZZfywl-VOQق#%g*}}Znk2dH dbAQDʹ{A<E0jP:$ @z&}&n*cI $ لY{S{l[Wuj IDATՄM; }&O'_6ԎcÒL|a%oBL역D>pE(/?n;|35<:H(/!aai:«>@X"#t#/0+uXKkW_]š'v扺~"#LE-E:, t4hӪ^'8 (.$"%#/OkA8*L3M[NtvFӜYJ˳e+>Y ' !"$ zq0ǐ-ρjWM\cC bC5;HdFPfRǖgLjB.KSl,(yU 2;؎ҒjMs](-sI% x`G/x]vzM l#v۪f;qI 7De-nRI ,tS5EE?l )}RFJH.t`Yy)TGCNS)s ՝5'R&*^B"PZhA v7f9#*,ilcAxMڌOPuќE(RJ i?7AÁfnOvPH!$I*9YaX2z0 -x~M5:>[Hg杍9ԓ9 =餠~***޷9Wݻwi'x /b wI'w?~F^|CA]]tvU{}C# BTtU |:n M(OKP.] * QCkSMLKq" aP$HaJm%{Fk1FTA'h- nm0T=!6ꟊ.¥>ܗ!TQ_gmtS"Ueʼ|mF©4\qFA6RC[SeJ5(2Խ ՠ2}Q_ؖ4eikonR #DȠ+*}mZZb_W}OW9Dx/y#I, <J#M%] e?DyU:_||!6ynߏg·\vLx6TW %#q ϫ#'[`$2Y ci38n1cHf{v #%X у<΀}[&ai bDEЛ)h1<;O6J()*butP[PYUEeUջ*(ǃ+2r}]B&' . //vyR)֬YO>}n2ӱ HC+RVөl24mL(s t\:iwQk?< "? )(8gHBu®ssD`yf?F#Nz.Owl|վr6i*ڼ?ZfXJPڊ׺ۢ ^hjX撢{ꢳ>)KTqIbu(%lQEr!#+]bYﶩ) zx }`RҦ?>{$9Bo/ʆM|35!ې?nb޼ y!!YyŮ]Uo? X2E )HZμ+JA VB`<_;lkwT1LUUQ pa oo}X-{vJk&ROpj #i 2} 3cTOبh"B"l;SPpv"li/4v#Iղ֋_Z /"(ѱ4h*+ 8tv/ŗ?n%F,f.yv^UP^uhNy4GK&ssxcH=[9S?݈g "u7^{mA)OlQ466hl'6M%L%ikt ;F?Ǿa&id׾|}UPPF|Q"e% _jb(@^"~M}u8j|o>s#f|?snV"3泫4Yb#t9xeAfU_A+_oyZ66Ӹ{eyIvLcz+Xn&Ns_fʔ)Ruw}5ttt%vA6~W_eҤIƍCVM%`WZM/ ±px*35v\I$[}ۦ rBUmΦŮLW#%AաdD ,$HIa͒6f+$E'w*շ,H=1u)%T=IB7 [,D' 2T>VY49?ͳֆ&6ll -Y2ѷ Li^h4%/9 ,iyV=i1Ldîdn BdU޼=<3|3kͺ--WHi:p-EZ?jZ`dvT]qW44Tg|am]ÿi ^pWxBuU/ Dg/ qTW% ۇ|,C^uXo޽ٓKiJ}L ''A}C-`c]3PVҠڴҽK]=i*.Um՜k6x+㵗~֣yGG~x1|o1rmxN&m=`+CSBʎN: !wnÁ_ٳgV:>D{߿Yf'x±aÆnXwz0H,L<_b***Og֭l߾r">Kk kw"kR ~lT*%A7g`Ui~Z| ؗ͹NI# MdP"n8-?}YT:~UvÍeY2qthԘJOh($)E};̈́-M9$LHSn^p_,\6T`$ ^p؋cXFV\Px2nd4@Żڷx=3^]vj8lRJ)DD' S5Ϥ<̤jYE=Gs٬id3ZJ ܮ-6su"ƌsf~w‚sYp;5$ôh׆kq҅^<}.)`^y^FY:^~iM2cRp6$9s_k{IdCS3Cr a[CQn{]"Xyf6o>_]k׮c}6?(ܑJjz{{eC# <8@|U흺ȲvGc[$)K B umEC7_Njlv{^.v^GO0ȍ_l@`Gv';/P>G!t/ǒ2s, bҬ6BfwQAFo6$V2һ $m'ٓO5U;Bd0 DnJEo޽⽶k 뤔H) PEFt$\lczb nHE,޼D[(|Fuis<ې +ebn}me >#dΑYJ; d*N$-=-ێZ'%㑤*v8?a~/LY1K4.3Xú:iBnM.xT:ݶ&7!|{Ro߷ =$7riQX6xVH+Pw0Į}aY]P.#_ͦރP"vM߳)8 UH>L6}HE W woyW\oll\H$OUU+22R ާ2|xLHt:79uc14rdzZ_b隄zX_w(]H@{[sr} P_ `zl[/K@$ !08F:j}]\.仔~w#Rr%e[!\yP6cr--!mw7~~ϭ@/KɘaQѐw]T7[R9l(bC|~{ KZ_Rb9aVX7[Y9xЭ(32=~6?+̤Mt,w pm5YO}r?μ3n(*F= h+:_n#E@Ba.H]0"Qp"BBl6[}N83|,d8V\F5>ops @FQ{ȅ_nP !aX:/ cUHeA q|@$acbQ HtQb6?H>nÜk6Hq^,Ӫ4ujzO/(_e)I֭3 FUDm=Q2J@F1J@F ((F1Q8V-CJ,'[R0$ Ѽ,b_9l}GJ)G)Ӌ?G$Q2J@F1J@F ȿ.w|0 3ƒ7+FoQί?'X oȿٹuhnlWS `臽fSOaۯww4sqX#HCuf[q)ԁtFgKF<}2?(P7hCW)j_}W_<9R'+/(KΙc/kY\yV*HAc~Z7:0baYٱpdE&*tcSUB.͜tlcq9n:Ix=F'ʘb8 A#+P1r?<Cl^&~}z5zO \9(;$[X'F#DһBd@brɱٕsWfEshUԽ{.#J1t?HYET؜x(jv"Fc4şֱ字dI&E6n~/b=is SXJWuYOBe\=N)iRtYLX_|? O[c}? 7 #NeVVAdƜ"Tua!jɇx@ KBϹ=&)H< 4aW2ʠչlC:%G_ίV|R}F8Husnl"TTO5(,*y}xWM#$t:9w'`)W˼| Щ߻PW 0eF>_!OCsc=Rҩ$x]v*+%TOhػ}uosEW1fl5.'_DGNbnή[ϷS3!wrp>Cי1{.d&p`w~P1'=!hgwIƣZFE!$⼲ϧ;lH7o=7=o|[ [^e}ݶ!.۷ZxU g͘O \6Edks[E wFQb8~ɻ+<ԳgYjcNi7x%r7' HXȴDWm)4Tf"j"SV >~xKcTl>Oq IDAT[ 0e0zwOdpO;44rncrl^0YzpE( v-_#=):k%7-*~e8!근sS1ڧ~}Bdm4g*5XGu Xp"Z귣lD#!| vl>6?fpşcƮ[(\xQ9e ODBZCmH)0_ְuaF#E>4++'+/x:M{ioi་>K_QTZɾͼ9 ]G0t} p LZf:հ字i޿SkDBv"]MDPGE@vBAQ _9Cwm|`BRXTBy G}4EF~4n]R@AzBг!X:nC H:> 5d_k^ ])IN9N};M^' .i>0aƓCaQ @0`t譠(݉e-QUېo<_>H׏i8>C[KS5'} FBtu;/ F;?;oXvjFӾ8\^,ix18.fT]G2u~!΍6/NAA!O>t/Rn4o!Os.bi\豩q7vUog)SX^6cn*{70euЭRwtiLyMg7y\;k,s@'6~WK ( H$6669w} #Gs Dba"Xow[s7~ȖLJ&JKL <ض͜@;`fwSg'i0)vA<ikIRҲ1T`SJKagSQV:8=P>?*KB_צY5-U:NGioYxfV\)ߏSqf A*o~FKY1J > %V X֎)F5ȟ:3aeȨ-LX_GE8K^i 8.cFM"N>tv=J3fdvl~)gQg)z:Ȥx(È9h j)^, :-lYx622X&V,FUm1[HCg%L̿h$DpYSmc=؝n*y?a"Ʉz9?$.UU9?鴅cӆq`YՓqX*g,|z;Tζ&)_G9#7¬1wGlj gԟIOg늡C/ !{9&Şt`l1BIؠ 4{iЍlXevJqBb%4oypIgo#n:ʵ\!L&>[0قPſ=`0ӹniF7unΝ{}K455H$cݰrJss󃽽I ^r***Nioot:M&xM|̚|qst*WH*qz_Woj]-lB<9BY1|2/JSٰX,M7ÔɅx˽];=]a9lu i, Mj֗g'֛ h4,ogf&w8l RJ}θhFJ=%SB34BfK( -Cw!!E|x~~F y 3K$N7p7SN,bO}#UՔ 5!I,#S?J*J&ӿ=S^5}ԟ3cY 1l"=DFVt5ij*[g`™|n~)|5'?x4!f?L&kS\RFc>ʫ&RTXL*cR@¾ݓ_;oHqЋFWO[v_fWݎkpP5{4ųÍ/X@<ȣζ?! Hs?K7 ϳTe)eO/Wrh޻'[Wo0m)|*E#XsKiHZ-f~",8_<l4-lxޢ֍9(܃dvN>ߕe1$3YAfmnT*gwuunhh㓟d=Tм!LbivΆUKsfo`gsan 9H)-ˮLxcs!r/du(qpNpwFB̙P֕:.`zvZJ K*7R3 Cm߃'>]Js!t%_Ǫ?]OTJ8|xK9s\e5l#XRhX_*ٛm]089ofNAa \~=/$s+I5B F5ϣqS0 ^)غ:G;gvֿeq=C`Fw#9<@8ڋ&0|b::8x`7y' Yzo~s(O&AQoqݹ)*ȥr \.ٸQ6niT^uQHc. b0Q|qWFK{챍W\q! ƍcCHHYY8Vhȇ/m9ܺ\rIV^_~}cǎtrm_4 1 zoИcҝh2ɴ,EH"QBqZ-&UAƄtva+]3֧Ds,y+~2krpJȑEɤq}k6)PE'P:zmz+NmhŞv"lڣmn8E_&'{s'׼+ue'a߸utU'LDoY(t+:]p_.NEoS6[/D5S>)@@(ݫJ|˞tynENG?~GUpiFy|N.hlוDvt*ai0sjd_vW oΎ(S'(~ef0iw>A^qo 0]f9 ْëc,\^{~+uȖ{YxRLO>,#`K{CsjL zhv3Þ6';'؊ܬ tp/.S]Ri]5H6"i0gҩ$mKХuO?:D,,*o"ڲl%ކCAQ~ *[퓊2slR^_*@~c=! NIX.k{tw\:`NOWŗz_v=O=%E}Ƕ? /6- ^nٖkfΠ:-kK ${Ք+?[7ʫPQ5AwH'8sGʬwO3aX!f{?1fq]JIG[BPT\$Ĝsu/ʗmD,_+?D)!90r\{ swݻl!-9s&?5{ۻwg /ĉyI7蜐 /P0PS'x>O()t~>TɎCP[-б>VqM!Κm<܎Ö="- E4_գ雒ozLRVJ65^ "K ,x-*a r^2)ש3:wLC};U[)*iҶ~PDPDhK%5VKf-TJӜ)Z-O>[ ]RGL'}Qm![tCO=R:'$z[ A?<):c˽D"*ӦfՐ2m"V+.3 XXtQ0.~VA*_6QS䕴r%Jߙ E>.r &~p; EpU߸pkj_k:^YCGݮN~Wy*_g>t*.hX)l-Wa++2UgRhKK/]ϯ_:Ė64g?S3 9r{\ѵ[hg8l.&޹Wg7Sgbe7UieY"UiU+s*FF-JUv0rRLW)K4SH37$pzQ(j>pjd8S+cd]=qm@G~WYLg>z:F8"#tD5``9ra%9X I1M]{ -ݼ#=ߧ3~6[;oNw XwM-1Όb*Z&k㹭 IDAT1 l(Tp+8},Q^ /]iG^Y^z ٺ>/3_chbbCxm\|l F]knoN0̮O~pPmʷ6jHR6bD`4M~o˂:(OED*j&MI/| G*)3N:{FѮ[QJ{ O¦:;vK'^'Is]ͺ5딟?u*j?{nMMds5../0ڂ\whb7q{o(5t}]w1_pmWM |̠Zz.m#${rKkN(ޫ^PŷB.<7vrSO'[,V-e9^̈́/~ܠzCII"E,n{@<YWW7L8ɜyqɣ>h`U0?^"M4$^wEd럮9N>OOzhҥ9Ec{Rs[N>LQs޽ϼ?{ƏT6 /AqmaVO?5gs|BVi'XT̸=#L*./a#M} ScLC˂ ]8eRʻ0`V.:L4z`[ZjF ne]95cȵ+h֑wQ!)AH띕%K %{[KT1UL5(^&t@?|? fy`4YF%&Z:Z@VD"3X\ũ=y2w߿Gzc Au6:c=pDmm7Bk5,~ !s$~.l4xgd-Wd{>K4;6u({4S巙8EBZqcaVv|;RW{̄|="D^/ "_~ELw]eRbeS!+Vֶ̥m{Nx Tu"p,qYus^}E#O֭m<.dܿ+WvbeS*߽׽4q !'XB6$=i)))v˂{=Ug84yV2Ѭ3;q9|6օ0)cO'g̦WJq=̙15E[}oZD l3@a:ٱIZ&irܴ#6ϟr_*mvO @z"]{F{ׇfdٯ4/ ͥo3ڻXNܝ<_rLR(W^<6daTpȚvJ}UoҸ\yD-%߉e֕UGϬV[{ۺKw*#Q~o 턺b;?`Ŵ\a^˵bi6>ow8_A)>paQ_}mܹSGIR7njc=6 㾯|++ ,ï}٥uuuə~8d283f@x~ !x;/={4n?¦i/}i%z~x* D"gXn^[_QQxן "DD|K4n6OqiSyh*ۍ  D =#ѩPzDbN(H_2ærOZCѳl[)}e2c58RlU*6qTiel&*"z5 vuɂQAHL\ 4#vߠԔy N@w3.-;I+c%N++hhAҩp䝊, sf|878VGli˞6ce.SbAVU7`Uf'I.EXzgPZRB47[9>Zcwo?c\n<cu:fsI9V=H2byhs9T '8~5TG372qtR\\Fu@SP>wݺ>7;{ZI?NOo︔LAD7Xxl-TUV1.d/h߹&UGNd.>r 7ޡD>1'~N%AtWCYŪ%/`TY)}koL֤O1V +&BS"O| .6"_~nU ;(ǂ/)}(#{x R^1Ç,G`=c tľ_;fwS^[1k)A >^ Yt^P2 K9]~"lnE*5.[W%фo_ջ⡗+V6Y _c5p9leח2)Y֩ Tc 1,Y[*dLrn/ OA{{lH1mM_V%)RQҞBiӭCh_[NDbqw{~#'g<9Gk ѥtL=uVīreWvƭUp+@շ}mgi<|LHiw5di9AQJOaJh}ظq^SWsA&Nxc&nkkcLA0JfG0 k9#$JݘO|3)=6x 0'N!؈f;ο\.7—V*oNww7tF`\+WfD"Ѷf͚?J)&G?{_COh{z訋=1B Mu(ȩw T˩0rV׫tÂMKOϟ7\c}y TC!U!Qm`@ [8`7\m1}+[Ӧt !ҔžJYUKY؜[- E E^%=/6j@)4s u~ySBdnQ\I<3Ӵ3Yә 9V|@AD2}KW.. hϑA%w/FYdqUA܅u,4 OaMUYw(VfD'0#b@0e\1qG2Ԭ`%Uhj=ӦټHFڇ)x(9vS7JExƢ܃MUs/B3A$7 䞽%񖙭ܭ~>%F7G!o, dLciS(sC AFȟ 9[ 3``>"?!q}(K.d2f 6 '?ɀF*b{8n6mܹs;'2EcǎX6mĸqGr{>{]͙3gd'/0a€Hb ǟĖ63=!u̜V?vM(g[R| ^ KY25%).s?yd,,}Lٰr%鄭hcȝ/=60eʻĢ+zЋD|Ӌ"+vuYގD+9To($h$IumtZeZcPbRǤt>:qaMLXvZi<;XIu-VJݼDJYBA邾b a;mmQ4,ڊT{CӾHY$߃/iZKf)^A:g{"$wn}A;l=R0'QPBS]!Pծ9PDSK$:+c=s'tq q lzxBgݿ:ea;']qnةP4ۅH:uZM@U4 ,ͱB<@:ONa4)%PYD{Q[{/kշ}mǪgY,yWQ4;6W3&iSjh6WUcG.Ξ ?^ogJ82 SsgfCo, 7f/]Ą4%$Xn'u|n9Wϭ≟=KNwLg3NF!t`&ͼ f#w;gyTt\S`f貉cU17Xo -susU8w >}?"y@>ٱ}*_ &P[[ڵkq\,Y{ٳԧ>?΋/<p~*?]u<[f ===?Z֯_o<οo'xVf٣W^Z qؼy3Ro:Q Ý!L/U%}`c4^d[XBʰx_-M$v >E2dtY:[H)Saw:*) Ǒ).\{[`NEw-# ݥi& 8ܚNá#0&ߔ>bA6Y'>1$Fz+FCY[q081rP?/>2J(1rf$8+4崨NiX3-ݜfgf1Qu*J4DR4CǦv(Q4ڄ&Plզ:/ [ cߣt ZJB- 10Ď(ykmX/^e1Y>w=(/P?u~_Orxcҹ>);|MȴhgbcҰ%! V䢔N!8^᯾kˁ嫞y9_&i 4L2{ob\j A+ 59Wy;G(:Qjؼ_L5߆O޽;xu0oD1mn^ x{w#=ffys?nі2[i:d|j]4ױKpgթkcОu|D@`W*R ;Otɳr " \ ,L0& + O@N 9^/8Y_#2tttopeQ\(ooorq5HGGL^x[oqQ\\[o2,m5jkk}`Æ \zwUW/Ͳj*njkk)..f֭T)?[o7أ>oo vw,9lzU Ev~SP4_x3\P̤'>;|c7Cq)23`JEW7)S/)k5 Z ,3k ǔA,5bJozS3I 9@藼MiBM)k'>A&d6Y/Frf2yw.4 w.+E|AR]LI|ہ00XoԦB^0 γ8&Sæ<4p􌘇B?Ʈwr[0},TarUl{?"" T H<NPB  ˖}m>OQ}PXk+0 1ʖgHX%U[ ^k3ԗ?+VaxL&sW).>?xW ֩EUEA(BHehYN @ u>|Csz?㛹4TC9=Ċ`k`';U߹oh9E5\zZq}q;Xġ Н0 DAI$fP y`kw YIGW]Y9_-,Cv'PqbΕ.O~-lݷ^'}9z`f*%覎L=̄/A /_^WP9ܕe0md2=d,;pƺG.SNfn&\.`DfEQCqq1UUUDQz /̘1cDe˸袋pXgW_}o82̠~*++b#>}?/_΂ G7`VyD7:Ls9v7´,t%* i"D^QݭA'QľKSE m#J*lptrہv _E;>F J k yC btu5 2lT-B\$5&RX]ѥ7+[i۬(o7A~hUm{dN̏'~HGykm{(Л0Z&(f;VLbw |=%.,k տk OqO[߻;[M`F- }YjXł dv![_ɼzyǍiwPUrN"ԩYm7p )Q:]9s p2}JL9E֔r'+;hMȀ"l 9ӉK`>1 SH2TXϗ_5X ՈOB-t^X uk1p !4ZiVԔS p L?8@Ӿ,XHnaiՉ2Bc7L ~]VȈ^8 J9*{pO"nbV{ι=3-s֜ސ =.}_0 w3dD Ky%Boo荝f/ B"$C |DmA%qYതt/&[y7?MZ dCgܑjWl<c&9x8ֻcnIEEf{"h8x-<2 H#'>޻h|ǰ_O =4~:[hX#%CLοGnLx2QTvd񝠇g{_kWny5͙51wKTbq"qrf*wK%[?EA8Aΰp%4`w"N__ !NvDt |ޅ̣kxvl`6g5*7TB0f <9> H RP q^c(3f cDIڵk B=zT*+^gK/.q:,\kiiyUUU Bttt wej*Os=ŋ{wp:\tEsM6L9/Șwj,m 93S܂2T&@&3JTd' í:o*\box]3 IJ̄::%NU~4/ߟ^w `T"VVBړjh,VQh9kr tƴH>=?nF`_&4B:{L@+0ڥ+GW>c5rQDؔKۥaMYsa^-5Hcoi2{j0adio?Fo7cJow^P< Mv@DZRCї@PWw ~[I`)T(82)+T::ٹ#G~tT3vT5$QWؾ !D VA9 p^M *[#y"\P}qm=EW?mvaΝ\{#.Zy֯_UW]Eii)wy'{Î;38iӨB5^{5~CǏ;5\òeF׃_5===0uԓgϞkH b6#99^XU%`  sFLh>OvSd8Ha^% 93Wo5Fm"jb&+!ʊ| _]uAvHd"V+) B Z|.ӘxљH6%l>(`JR3ۙz@8QD-4ciXzAVf;;Oqk2y4240^mT}"J Lb6d Ya!)2{PaH Х |'EkNب-wR3fLh2]AEǒ!oi$ĺ%6ן/Y7Źku3M4Dbp~N;'H.%GEn"4οk檁64Զ|̬+&ƄuLi"?(<b BJKjJ%W?|7׳beu]򿯈zTe7_P!f_TWXYK&ӦeLs#x<[Y?9y5wU:l5$FIW??FQze#O= $)&xLJL,N#Rr:=@QIp.^W?',[X VQ( کvWæˬ{b9l|eLUxGD<9ZlMI,cX~=~zM?Hn!iIdBy}KW뀋%Uҿc= RJ%O>26ژp89 /{SZLar .b`iyH'v;Ph&4&})ln&F:ڋmxSj!nIjͫ:]]Vh0eX$TRو\Y RK-q"^7xǏc/ cYD/{Dqh=٘`H0]Op]}N,f1~]>(n>e{-3vHӃHeVݵ.u+pYʾ]*1UҰ$t8KSL_]wWfWl6B4<\Nb"(4a@2#X)559G2gv ܿ~@b{ʔnU^y׼&` Y21ɦL%E_kE ̌ҩ{㦌$St!vFZ_r:S?=;6gADD*ݐHU)c?SנXNU^qj zVS5e]2mӒ$1C4G*e"DBUдu'-,/?'m:^2";MΰqzGޖ:`߽r?]9 K\|^GkѦ {\Uw@, QK 5Xʌ!83l3F'33!WXE:f֬Y]"B`m۶H&lٲe0omm%`Yr-gٵԉ%+89Rz~̚^Py9w[|=*Ha'GQEW\Bh9x˟#:7ZvUg6Q={x7~,,iQR1Yeg0}ȇ!(lHccZJ{)qˈ}lۿرXٳgfy3f flwq{{90 :::F0綾^3gh|ZQB(W$NM򨄓&}zM֣1"jx3MTdžGbtr)k1n$+əw08 `Op Y |ȈubA"&V22F2ۛk2^$HFm&=H5JiZ}?YľoYspt )>daFLQ{w4WcRh$33<::V6adbF6|fEDas!8q*6!{q{9$ ")P=̑VxdW!F7P'wظA?7 knBqRG sOWɅ~h?W4={ =&m=[R[댗߿|w ]Npܔ)E$4eo_/ˮX4J[#o.y?@ CXr02T~-eȬ!I )XD5$IyO:v@0q,۔d.iX4[7 Cyd4%t41sT*,\ٲeq^U#_WV|?~3kWdGS}C0eciڻzin*t6q( v8ۺLrĮ vAC MP0}$v̘G\~Y*!"fZfX$iF:P25Jgvh8!HE\*dT6 TjZyD+!/t^X‰@,Uvmm(GZԞjr>賭s"'g !g1˚9sdy("qSidRlX)L1 䴮sfQŒSHiG [mW܄ێ Nߧ? Oᵵ-+&; s d-:3-RZ ~Ɵu5%'/|#bJ=iI=#Ibɲ83 ַzU\N]fGzx"gYrΆ@̲ n<|,+zQn,#; 6C3 <J*ƓdRF vO *ފIlzq5\@,fmܷg癁d͝XlT:-pRy4veD˫>>oOc)\,f!n+DnS 2=6>?͟?7Q~*//gޛGYk׳3LfdL2d-  XQ֪׾.ygy+ӷS-jkcJQPEUaOd!d2 ,|If,kWڀ70Xn]`s#fXlS$Ν;1k֬>ٳ/zy9s& o2^R`XzV rugæU j`iT+2<*Xc nr`U`[%TkY0j~cM\ zwܝПXH\laIS5@t׉Z6/qPSL>Q\$̀IW)n$.4.6hGvQ n]{A]zβJXTRHiՠ鷁EQqnZEk9E8"4̊4B`s@1g?"E@ԤI#MEG~>thfUA-Yg^`X F*'T޷:?ǫ971P4Pc- ʯMLja$A^ϰtAxM麓8!& A?Ԅ‚"ӵh4АAz8ƌc-@!*6Hu=d!HTDt IDATisc{`32e؏}_ߢ(>:$k=!ZBhO WB")gaꪫ)TUqEX,-VfΜݻwo͛ףGo'|r#=ȑ#QPP/~ӧO޽{G[n_"-[R^g}+ڷ_p='* u,ryM`T]7&wR};R0`8Qi]nJ$@<BxPTbj0tU+6ƥ8(~ڠI3d֣YP!a TJGuX(&`<< E 2Bx"(8g)N/Iz9}cEK9 =-!# P(h959ѝJ[@emINQ ZG%n,V^ 7Y/[R$:75)l1ٵ:_~z/D%BZ*QLL%ǂ*~EUpT)@\?~AX 2X㓷@ ~B0F"PzVa)A(FHH4o‘=y⑰gPABTR AMyi >y81q6f9GB czHX#-9|. u=@B@mCVӁa5K}\$sAOT:0t:^ N"tH4 ƭ37C" kg5#>n=O_D0 M4uK =f4Maْ aqw0Ci0kcթzrDu$sb=Sx8T7}.iF{c*hPP  Ōo?!]WMīT3?~|hCJ// M`/9 _+o!$):R!$>/MqFa٠er@#cʔ)8XY3gL3MMشa8fOxt8uiEQ,k֬]wމ|غ4i<ӧߛ~u8Ԅ/7m"[RYQ]] AH~'l.j `˩Pb*a: G| 44q;d 1>p)Ԅfh)xD& (3AqU BE=."O4O$CmTv["Ż tZ"5w@Z/$1`8u~x/5jQ:,BPe! QSzzb((\ y`Fgka5NҨhX^^РhֈgOlEؗXtrh9 (@X4ˡ隥ݹ?qvhӁ3ؠD~._(H uh1f}Cr-5p'm yhui鸪@wexwm1 5W:A6фJ=X|y긹|飡Ҧ^Lƛi)(͡P)PjZLhiZP cgk'E9_oҗ : vf.&mVV[YpH0emKiV y)QHlY6N: uTIҚ Ap$yl=\ M!㠎3 <72PhOi8 :.ima09y T|4~"1=Gkе yYy~! Ba+Gi+@Cs$3h#Tpϲ lwĄ@$7~@[tkkꜦ^!9}VU{q9*6C%qdY$'DjoR2N9o #Bq!bHQE YtdJ;TpEWBT#@0MQB B$ OQ,GZ3CD:"hk>YS}?yC2lW9 .Kd4$oz RC|&}eΑ((1B_`nwjMIss^9i:,f@" Ght !dс۱/DkSrUhT_ף`/! d!u.'hhs!k6PR)$j472)tN}ۖEvgȞuf_:BlGvV\8<1_uMۧi(4aڷ1yB܍u;bQ46zDX+_ݷ1ʡCɓP_\jEAYm _ FW)] ` >$+ TOx ecPf@5H/vB!ػ7͙kMy'kOR"dԨQ0vwM7>õ^{N~MMMشiD1iLzw[H"3S  sRQfbRp* 4QAB!0JRg3 ֖+kx~ >L=1(*A_zz)(*c%+?H{ +oȭCT27 0[w{BיK( (Ulųy6SV OprSx)JpK9K$u.$u.")iM+SMVE4ŪAS h-jic7q=BH!C~ 1ԙDV 'ô 15}cKPp shqǰm~sy ̖\٠_isac=dEBC%mۆc*jxꩧynG(ZN8:p[c\uU=2E=G/BG'Z]( %0rj nwڙQ& ar C#OVZc2y޳HPHzՒҫsop]gqQ `z=c^MCݷ=_) "(jPQ%gr R:D,Oy@fG{'XfgJЖJuh Tw&į=g pߘgFDZRC 姊8:Sk|c4?2*>=Vlf=aB6-Dtk :=f\ ?:y_قk-F걺&/@CaJva8 )BuDE&PDHP%~ 牴!${**%%!MVC*e)Ȫ8 4H1t u?{?_>QdL_ْN ;+!@Ĩ&sVQy#`TH17X k7,>jӎ<{*5Mgph= >ͥV7ăP8,z3PDPjzy#( Q F2VRAO=͂%cA9 s(pء}2{3|!' Fa2[+^ABojoGI.E&ɳF(b3رa<Z6YwM+aKf4e"yϣNP rS 8l_,L޽SL =aػw/0yt< O>7|sy+7nĞ={b p 8r;Á`0&D"n/~p~ a7+(W À ,\ZAGh-G{!)Ctu*ObdhU)S5qC:2ZAi݅LV^J<EJTHvkƘ_$&? l.}Tֲ@- $#{|Bׄ.F"4ZCq1t9^`#`~7Bhzβ; !гԱ;Wbjcu/06 Bq!BU0"E1*!PI B:+HuVJ|P)BXF &V(:N,dg2vrVrxX~`e))_:4=+@}-JFӚ z$^h^|.H׃;~ - OTNOi,{WhH >x|A  δizE(Imhcvim~ Ȓ3_YA ؿ ;ǥy9ϱsDAHWJA$(>$e4'\ 篘-C#d)YJ c`A)/)G ! V9 hDZCՆa{+$e&gǍn tsu~>{8pj3]gomz-Ǿ]>e- uYk!,.555bs.)--B,+VLFXgyZvdpܡ/DX,Z 7x̅@K{:zҫ0Ɵ=c^ K3-K> 5H;=& ]I읿j:Qb>~0fIpT%j=*i4Gc9] nŴ_2phDyK66,m\%D(YaU @lD2BS,-7RNΗ.`6b4ŁA!BeN Qt`A6qSn\f<3 zOZ#wAϮ9veY>B=(J'=Ϧ Ţ^p{@|-&v\Oy3ZۏmJ{,2c9&krmC7 ǜ/Hȳ@qC>NhhB̚>yw(r""dᜀ3gdE;k`+?kn=5$V\=tcWgO Ma0iw3,8BĞfp:k!,r<#A_("D4tz0 !Tϥ w5B 0LU3󀷘M3(Q iDw_  ߅VkAT^k98'ނ]rWAYesǀN=I!gχQC{7a#pC$4:$ x:-y}s_܂@GSdQD0}ْ{QƳ q[+OΝY}藾?(Mcgξ.ǯv"C#&L|YdE•T~Spl^Ձ; ΢E*Fi1K4T4D,-c=ԕ>ie@@Ɗ]YK@8T M/?rDQ]ȝSw?0^FHɌG$tD!&e fR yZhd;A{ :P"BI $:̀ol]:}rxtxfcYow[䊹ekk5ʱƅź^݌怲$1H U $bqѬ8Zs :6(a/aݮqq0$,.|nBa_׼vw(YWꭒT m\g7o.*X߅<E)!5:PSI?EHl. - ["(ܳΒY\bN٫E~{>Ydeb3Yr ӭ Wg/uVd,)0Vf:mpCQ;7`a?L IDAT/:Y:ooV\POkkjjF_ ǎ{7:r]px@w3tjĉ.<}7Ը",kXH(//Q?/\m)27a|;>dEY\ 2njA 555O\;#zًܼ{Ϟv3XTeee/r@]eEMk0u,:US6.K(wvX4<Tx<;*YdE,@RŲ/g 8Tux@FѣGv+.A5'O8PqKu4 :4}Q/,8Z=8ExQ~H$h,>!Euzc~P{oI˵I# I8ض{oz_˲",I _,{~F Tɗ͠UL 6 xF r:: m"!f]+Οgb˵hˁH<ہKή:LiinY^g߈MFr-_z-+?ܐ͝k?ǛoY0G)Xz;'qU999t r C->.Ĉ:b 㧪*Z\vN/å",.-(JS2hE Cqp$H8z#ʇ!H\ 7/y{?jkk5Ggߟw8z.XdqRbsV ` ?gbsb؜@ _ ŧz]p2kljle5~EY\:D[>Я9A"$:,f\n{P(@5E|Cyw~]/>o,K}w.lVs׍ç;Z|>Sw\WRY0r>۽{7 v;zݮ 6mZڼy3e[ZZފD"C4Mh4p8s @E~뗿m6?d="P E@O$kG4e1~EY|Ӑo"dY IΪ4@@e, b,f`^‚|4iC-~|~+˲* T۰;n竸oduZ<݊.xL90贘1xOw<EUT(NY4M6 ^c?C455*f*++{uV~G?_{ZZZ*ScOӧ=Xp!>^=(((V pokeg{)GWr%xBbE-z gxҢ GAz:#H&O!EZ|, )'d@F|H4l?7X6)p=}pc*kO՚6d@]] ~Y!> ,Db:#J`0{UUj@"!,CEEQ0 t:YBG`4[p h*8hɩsL; o1f:=Q̟= o#0qTEy8~$l!̕,c_Ky,x|<;7nD,ĉq=~P}]]|w܁/W~'Nx'`'+}VX1% ضs//} N~@ϲŅ3 H$`ǏÜ5됍Ȋ,(( GHvh4,$Y h&&Fx<IVqDQO{ː,h_ T:<Ï섬yuI=p8{N[7ǓK΂xN,f#rtZhX637rXx1֯_]qyMohiiy+v裏^lܸԂ^O<({G XHu(m^4kz¥vUmߗ?3jjjFV| 'pK]{B4gZ`1F5P y!/+>zdHW:>/$I`@,FA=r:>)`UaڎBt(17iV7 *i2J + J6*NH*`(kay̸ %dEAian5o9Ͼ؋9>uW'^mFw^?pasyq! BՂj<<<za]L$=@"0_}N̙3p1ahZp DIq}8?QxǷm{E/g}1;N#?ƽ^+--M,bރӧBsn.#'On~}q>+./ AQqQ PV9tC:~_V|dEH,!<#=RfPgC"'^ǣ %%?J>o\0j9Qod"1| ,9<]U-Nc30{ !*ظ(6ACu hy676N3#$#TUűcǰaaʤIe܌mbWWc͘1cFFީSѣ={vx]Nގ'o˖->}9X,Ddp _yzC`ރZ14 B2|;4_ A@S|L{&]=n^nF[Xe6\ǖ^: ^rrbDI?ՙi ئ,o."8$)JFQ\R4%Z^ájwrxaϳel3`XhE#}dزLeq܅qcMP%!1‘|zlجf"dYiL&?|M}Ͷ(ÛϿ2N 긃3~[ ]۷E2q5kg}ǏZ}H 7|,t;?Guu5`ε>}: ~w~O% 7͚ԄY3cr`vf͸;|` W?q%ópըQ0vh4?*ݞt0#Ja5h~cs*y7v؍Vr/ sǗݡyfTנ @!B)RV"s z; :MPT)!FX EEhnMH Z>\e>ou,H,>Z{,PP[ۈړHDB+qٯU}ߚQa6[e!Y|]H$cB҂۷Gzjd2~, cc#ny@b=@ޒ%K[A;v@CCFO>l'IR&,\@GG=RF>>]|f_b84H.w:{$BAH/?EPЀ6^! sV;=׿xO2~O.z=Tض;Xߟ~/g8Z{&k=XqEN<'AFK7>:x\+(b%A0L; ǐXpطjk[)˒呻ojPI#Ss ˽XplLo,Fkw/'p I Faݎ깒 V-nE:.K 20y:ǣڋy7* Z[[!IoΝ;t:Cb1|ǨC,c޽]5a4Fk{w~wFYY| ~k֬8VGQ}$u$\U6j=|&* ܏,WܬZhϝͣuaֳT{zeB^ duw"|RPV80  hNsud0 A r:DQd9|Ϸ.x;$*ABB3c Apx݄cJ-ɿ'؆wVs4T=v߼vrFw>ax<5jJKKet:,ZpIk??|aoZߏ=Eq tܮ6nǃd>mt{z{o p/?/PUaϞ=Eљ3.e96XnwF9BIIa?cԋ.1?UUܫaBa\uZ+w͚)OxRf?Qk8VfjV 4 >(=wXm8| Dcj4$ Vkυ BH$0/)MP 녫&6kOgTNN"bLF@aAV ͑ph^4Ć|tt:'O`iH78y εNqQT8[-pӎu0 PRv7sM<܏UY,.Aua@="q! u . ;vyUZ[[prH$駟GYYV++)RRXf +%JKK].v܉[n f֭ŋQZZ ՊNڵkq)s|ɭy B=P1i2 = e{6{ČS%p _(B<."}\ϟG7aTI{:`}\ឦ\*JtPo?Y% ]ak+BOGn,P4);\r d\1|qcmmj8 } !HRR0*D!2K_0vN xk!pN4k~xk0vTa-/G.F82K]JԜva(lV3~شfkVlsWߕ E<ƍqBӥ@ A'NjEQQ ^/jb Wƍ7^:Ks==%4f" e4iR?fJ٩=a Y TYܿ4͸|:SwìxSF#WW.!YASlj%zz}P >pp K:^v"$vו8\JhgW8B͖o]PU6 QB[[;JK0 |E 6Ӡ:mX,ǡYy鷍힧k"d@݄S@uS+F`( h:>CrM:u5l9uNzk8k9x/v?cQ__bhڌ-[t X z ,~)S>Cr-hmmFUUxٳaZ3WWW7h~EEE=m۶ N.+o޼yXn&M裏0w4Çyx=doE俩pX/v8s,JJ 3 EIB4(qHD2Bsk9 $y_bqDPD2y[G׫uM,dYv 9h -i4dEؐ`+I!''! ,t:t:Y@A:( Dr@mPtM8d"zJs[SSn 0k,TTTl?l[w}7233;[yK,Mþm݆#Gj1w^{ Bt9˲5K.%1[Ȁ< C_WDkmN;@F}J7dXG):HRP(FKs7P"MKf4dXqr)+{3sͨksueߵIfF๦ab4RTug^ `T& d,m/DD@q<O.C z}bc IDATW,)J%N_lZu|ȃȥ@fT~ALcʧPʥ?sA@5DAutTjA-D^^JF ]G]m:_ul6L: cڴi8pj5233a0pQax^ x衇UG \^x644`ĉ͍w뭷 j0 o{/ BEL&Ûo7ʏS[o}. v{P(v1Br0 }یEi 9ڬdfLZsjh=tsUmZ7JɆ/t×!Πؼa<0QG?@UG# < (PH%pyEl >`pi\&bN ,+Cjr7p7;)6#ݳ#`iu5fXv%v]lFp0em]ٙCd]E,>|8fϲ,ƍw`īm\g-|ϟwoQ^^> 9$|ꩧ>ahHy;*w^d6c(W˖o6<]}U&fgCрa1˝zOR4==Nm_O9d2/yðy%5]ᨸ8 oJ=ҐJF : Znh5GTr\LDQ(JM\v#TSRL RƆM8q_F@} i)mE=EV '\$0&9s&Կ蘤F|W ZZ'|-WS2@n|=:ٳgj_;O?ӾhFy! 999gϞg_|&]վ'~BNNN!Ce_O>lI> #E:O҂Aᴯ?x{69@v4w!r$&{{!X.ߗ?4Àq ̀i,\0mn/Nlw`LC~uW r]p7^V$P(+3gÇbܹjqĹsdۓO>Ysx< ;#))_͘1xp]wj_ D׮] ?'-B:_QП_Gmwx %%qPy>4%tj.?-R&#L Å|pz{f )Q`$3 \C.52LcGb̙fΘ:+XO,T]'55u椦>Q]]}yݞ={d4žɓ'c1cFyy3`e2$$$l8| gd 2PQ!>Ҿ!@iiPT`Y6]t|ߞ+ңKKƸd<ߏVV$+鿡YGd,Ϸ@PTHAɄ&K3x^1BT`0 b #iC᫊(:¨s[vEN:ߌSLHB$KGzJ<hG]Uq:HY&Ca5X!k[.rʆ:$hk0RcGW4j5-$#̤D9} -=iK{޼pU-]Եe˖B!C,~Tn=s|Qa4x'I !`9'( un)m:}1 @RL쯶>p<*A0Tq 9R؄0 :er̀にT*EQ!iF0FZ˴$+ <{SH@u=Fdt&N.C3ьW'\!rFOۍN|͛?seb',ۼyV2aw{~>>cL>f߿P("4VAF>iS}~~^+j/-%_T]}@ NQJ1k kK+ t54j5EQ,( `(AZߏF$iMJjԴ}OS|q\Ϳ /91wd,k I&Ӛ}OSit)sRRSFqha%&ßpT Rw}7*++a6c jXjՎ 8CΜ9_|ѭ]w݅'NhlƮ]'DŇh|׿5Yz5HzD'ZWR4ˠ}PG 'xyP4AĴ) i)&y  >_ шTT*̚5 'Ow}\.fxW.g^Ѿ+WK/=r\ǃ .tk_WWU@t d( C)Buq%G4TG[4TSJ#A.A@4M2%g®/Ə Q`k5 *v ~RI?t+$R@*a0R\N"$~evkys*X<>{zvy׃@&HOOl~ IOOnX/׻, v,rR.d2RdpdZoϝ={)?jr%Gro[_}-z05RArR#ԫ ?G|a[,JDM{K$8\ V?/"@Fo{m6 4% r<~bD"(]VN;E#BPO(>xfecqhzQlCrjʢ~1f%kԖ-[EHҚvF(^E =+nO\t>8(hHItvv62.^rԚ"yyrF*O@KK Mv`Ioxp x4XzmG͝DP3oc?qvr0},r- Q1A$22$jvxˆo:u  hfZdgy%gWKzZuvDK v+ԼW!a 6"@S;VB֍i>'YKC.Bh+ ׳} 1~O`Fx @ p RjXV)4 JԶĶMIW\26 P۠?!dp @(( 73 D{>[0h3¨VsִrF D 0$/޸y `K qDA@oG&a5n._bu5Gt:-]0 rp(4:.@  R0&())ђc%h0:d9p: Oӌe|2N碟.r6aaDd˖-6oz~SO=/`0'WF"!WB{}hd( @ $jj두Jգy=< H}e?klh80>̀?>g[h"%Q whhu %5uN._J^ ^q*lhf&h*:nBCnG[&$!{|ƥ#=%;QhGՅf: 9iF$4P(IF@ B(Jb裏VWWWmڴiի_KDZiӦǺ,]QQ%YQD}CxCJ rYP( Q0OQ'Q"aX`M^+4Tʸ^/8pBLMǿo&Z2 wκ ?r)' {B Ƨ%C&9 ĩhy7#)Q'!c%0J2:F%#LBBPUU+---~gHHˢj3{1dggI39Q =#WE͎0AƲ0 gPY/i@. `qj Mf$foΛy3B0[ؽ(#;)6+BbB.R'mm~}]{ i)T~W=pl\bޯH^@ 0q\|P*/=Fvv62<vŇlݺ5nB(((rAs@-0*174zmSde!cYĩT0] B.pV-RlEr[<$zeF[ p<&ޘW: BR!aËB-[3bH7%ٷ`r Q}|xD,@vXa>I .7o^3׮]ATz/BQ^^ c //{]xхF㦑)))Zcݴi0Aii)*** ˷k4J(..^'JkVZ\Qһh@Ѿ$+”dM^"a`J2+eadLRhNHelő ?=>1x 9ywކ;!j(SYNo Ν|Z!@ zaXmXV,_!]"S<F=oO,p\uc˲5˫lRr1 S0|v^kk+{=4559 ڑo޼yf+NNN=C=yTVVb޽yLn8FP(7]vC?і/v>\16ҏ.ڡ_H4ˏC446 q*U쵳4M# #dA8N0 VbmSS!\ sjqwiL{,r\XPP֔MdBph4GA/m*Ⱦ"]75=F5w1c~_!''ga]]uz~wVV4׻W^]b76mZfm֭Ce֭[3lӦMo~M||>ڵ ^iz~wqq񺺺999 _aƌcŸ"~c($wݐde#lP*B0%]>B\QJA14T?P6V,)ں IFsV(( loD>TtL0Et8<ߒEsV4e -w+jc4nopY_W7 f];]Nu~/}uB._hjX.<ٳTʯv^7ߌu/^\6]v֭[={ɓ=x"??w.:{3>#v?[paqeee8x X=nܸ+Wݼy2ӹ@7 ^-~L]PT cnmg0 E9K=@݁0@Ai2cSu!pi%1&(Xp\X'b-8uS8>) Xr&@qckFJl^___mٲ/|oYq@cm qOt?}'j_{{yW_S& g| 'z&MBaa!J%QPPEaƌ:ujAKKowtBΝ;_t :_~y@j~k ,/~M|+vT(Owh*:uj3h">ZhqҤI?lǀgqFE7I1.j ÀiHR$0th4#m[VCEC%V@R0T x_ojjږScslԣ͏gKLß9Lx`R.?c &/tAd z<%q׏2z̨w*>rT*tZ&Otf|ÇQTTӧOcѢEUыvTE/))ܼnӦMgϞ-monn.q?}-*))655v9 $ībC6:1w~r߭HOGɞhxqhBlmJIF}|a#2 ,mrB סH$k|%:NSS3u>FV>ۊm|wczz3g!>^7$ #d}233 YBBPWW BSJJJn;7 jL=H|N\^֟K6o\zz0LPBn;2 MaFMq ZcMOO~6p[ a#˟AK\}2 ))Fԙ1>3 =.Cc;( `ba?4益Wim*;IfB@فS5F8ee||< B[t\#2xAb<D8tkR\ϯjB۞imsk=K7qb5}®;#'z-r@KSJ%Mgâ) akD]T*QTT*9%ɋYYYNg3rŲ=Դ ,xȥ⟾@fT~=AAcʧPʥ?sA@5hq!99y8VjfZeowۿ8n.lR;p *hPi bێ7UvBqm! 쮨\.ߞf}">#\xѩ7q(lk47lڴ;wwlgݻ'jvӹGՄDncix6mQOJ˅ IA4,f:d Db# 9-JP*S*!e;\p=!u D.nmAD/ۗ/WlะZߚϿ9Iz~F{۸FD ,V~WμLmd٘DL2l{gq2*a˲}-_2Sw̸VN=y477s:=_<: 7ܰv ^ \ۛ)kƌ V"JE%<#Y2#$ک(x] S*ۮ <ϗ/Gd/Oq8 Cz;WG۰v )'0_}Dں:KOMh"̇|I(7B!gs-I%=?kniMQHMNI(FCS2ǥtO!7f1{|*-vPQ)Pp^Գ_m7h J?f갩 ѲkOԏD!^lڴiuFqY,Z[EUUU׿Z>Sc|饗p8F1;3Fd2U(Nպaի_$0s01.4MCE\3Cԇ!7hL*N}NAHR${mb>)7`4s xOPof4.3䙋wPcGğG2#B ̖-[ 8Owa8{SѼx9HR\\v?[paC^|EH$ '0HW}~4Y0%%Bycb"TWD6Xiuv-[撓JFn*4@T^ea  o@2㳔pyjK(LǏ0wKL "@cٌ?V5>]0E g{<8%~?ZM8%)h42^ZDp8^NxG8Vy,( >^/;Y|[JjkY xx&| ΞEJEt ӐhX+j[l\QuCͣuVd@ @Իb@l6P(^h4nAIIjv8X` 1 GQŋHOKzY,8Nx~4 CGQQA4 0} `(F )q}_޵bX0}y 3U8W<\Eǒ+x@cewL9&:!a֭v{19ӝ>Д,'F 4E#)) 6O٪(BAx<D=~"R ˒*)xAHOKT*|͚SvdfNoĹf$$$l!A cԁ0B|-{@8R@Q@sV7ƶMIW`a査>$Hx$#yyE< aA< a ,>: +' .$@>!&xtq#"U(2P4 Æ/D?b\ݭ*CW{|]Zxf_M;Z"r p BSN|}"'ވ#a0#Eŋ{ 'x=eh,=6sWVi ^r~ZZJ1n{ge߽qyR9@@` qvNqNao] ڲ~Rie׌Y@ 4p%,XQߠ5j598MJ0LgqgonA$)"DH()UTtxl;Gc>"3B DD˵XaC(Hh:~i* ju> ə "@'kF-GJ<b#xҮ d9 MӐ,d, FuiEQ 8 .0(ꐡ:K 3Kk0 "@&3E铌8a^D8#Q6lF-mqM!rr I ˭( H6!"<^XH1A3p{=]&YʫI"T>qR߈PRRm|>,(‹;G&FV5=a HOHѹίGΕ =Å|Pjs94FJfk+.둞j+ee>gɥA'c7XAF@ '95>ƛoz'X͛7ZjxD a@ \l2f\߈4H$C{[]-ypq,!+_/x6왷zrI 7/@ PdيKJJG+o@2 !O - V,3LɠGŲqySș +l^0ޠ8}̚oVc͛7/ ÙW]aW~q$v8yyy577+2*(x8~b{i(HX2Vb@34h.SR"jak`0%V,)Zvs'coh"g\"Zn4[V,)$ @HgΊssIp8p8͞=; L<ryϱ0Ra||>lڴi֭[_\r%ɨCf#mhu8QTBaD"ash !DQ(䈋S@*v'%aX`H0@!Sǀ-zx^ TRUW,)̰8.Wq^gXR#3֊%gu(w QWwh(v_*'vސΘW~&D W_'LȌEKNN ymE$zڵk7<3z}3X|9{VYY 5FqmhN @TBTb8vkQF`kK+LIFX!!" y.AP@V_6ە\BHH|by3oD"u֛tp˄$dO¸x}1uR:ЌSs}^O͂9zs]t)sȨ P(ٙL>gϞ׷HGghnwnOi4J{ ==f} T*{Nu[lqO>}:|>>sdffBwAQQJKK|٪Uv<3Z6S&u`Yv7A [npO/^K)1|ݻon y2/LO1IBRe?y CAHOζ6(rd,0(R!Z"" raCIoI8%'!M3hCLe~Ioa_YrV?lk*sMHN ر4Y.-W@heێ7 fĉٽ H:'^(ڲeˎG]x7#//Drr2=' 0 6mV|駣0xW`2E?:u999͘1噛6mzzEУWd&Qx@F&T˥Zmv<J\0=,ϒ,ꈠq8]r f=?.u͛y3j`h tS8GZoLoBXR qۭHK1yp[ [󴌖XqQv^B~ mc޴[qc|'*I@(쿧zg}"<;vlo۹UTTBybYZZ \]TVWWc?^0[l)E .Maa!vܹd`(E1:w d_ "܈ qjCHRx> 0  9PhhjFZl\VƩ*}^O¹'Ǡc&/NaWg'Ws8$X8ww8U%1p %;3BЮSO}X(ٙlc$#(뿄':t~HHHNO8QyeFqŋg&''@ij[o9SSS7477eg_TVVjdee I`xsJ 2LFVVϮz2ɛ "Dzr=|}tZYC`rxA)?VeH1& Lfk iŒŒzs]nNFfND@`as7`bN&.3p0Rſ?~ z-8wU8[ۜbIaFGv,|Qghޱ+W}6}G;̟?{YwԄӧOC.#`b_ IDAT@.C"N3hm6[q^t:ݦP([ZZ]VбW QwQ k< Ǒ\m QMQ0 4j |~.7L@#/{m4JkbqPʥ6SLr̻L)\چ~~w|0N\BQ W|EEu?F8C B ҥK]6mPZZZy սދW^ye֭[G;jux7Ngq& >_40}(Zc{UUUy 7lpݹ;/+lj' ^zz|~GGThX' Tds*PpD !0J{ljυP!yU?U,-;DBXd .( &r*~zQ 1 . FY@ K lgߧqN3==|:u{n<޾GW0iqNq\zwh/=wwq;I$3Ċ;ϾϩB/根E4GF)E\c|#Og՚D#ݷ?lOS cM@Zni"Xp8V[?վݾk7|7n8SNDݏ }7pzG}tieeeK,xxjkq;^-"1-I`-Ec: 97" w{Ϟ}SãryS;̨)eFM;=eXG^_u:k떝{1 JKK.DAAA \sdq'k9n^,_TTs91z)~>^iwcعK,I شieee_]~}q[[ۍa:;;1=TSO{w޹f$m$#eYSc ll \A6LBTT:ZZ1 J vځ딗z(ѐu?dP80kvD##V#G̤X,p|䐚9w>{QL)e#P[͖  XEKAAp+8yw}EO<ĔSNa n+ڟ_nKyfw~GKKO>^^6lr=|5l[?{@eee7|͛S^sr{##Ik[B-= 4IHzm*d C#0mEXdtu24E>'l*H70mj5BͭDc1.Wal4$˃mgɩ,=^A]ӊgC̝.ooo# f0wN -mv _oViO,9*_Yie2ͷk(4vP^^G6}E$1$ R";վ}W]uծ+W~ _B;{w\DqC7nd\*'') j+̘1_#ҳ>T6lyRsMU{N%|2XVzd6,$d1E f"-UO$,Be\rFhk爐M, 0&(/sb8tA{dW8c[Wm~cGw0{vp=y݄ ({xMA@6M۫WLBuiW >{BKAa .PlwI7w\ 7vttܸhѢ^:M6adЪлz[[6-YFñqӦM=ƌq @2*`s {GF%mTȶx@XӉffhי~$LI4ISp8=pfa]A\]׉EC*'TVU,6 TUVS֛x6!jk۩m'}i5eTUx&mjtX2`)(((Ҁ(L:\ve~u=]_} .nB2 KL2e\UYۯ0 C=*X\\<Vm;`Y&HLFy@505D%Nr챋^pjc Yj?*藉 Ճ0@U֓E ;0-Z;ìYW^Iiggڒ%-oςmY!BD`?3Ftim]V z=ttuH L3k\م]F;BMeE}H$gE~/{k[VS>!com w1-p(@q K/dow-[^[`YywvwUQu@ ݳgO`>ۼy3;o|<ֶvnݺ{*r .P(Ĵix8Cٺu+K.eѢEiy|c\.Z[[W nIzQ힐%g|g6=kpZx;v\e˖Y , ñqu4 o/Yϗҧٳӧ驁ٳ^uU#j-< 9.g[Ci=5CL0dckH#2[&Sx=Lnq XضM( ӁKPY5eȇ,w>'p{}-o߰=s*{@%3jJ^S*~ǵmx \$0FAa#2 @yGZ[[~*Ū2-6lpܹs B/UUU457wo.f͜A0۶q8ʹ& tO$aXb÷ 隩S뺱3]43g> $#C¢]3Nuc5 D@@z-\|=/ϊ/X T|K_ZpMNٵk@ඡNsgIIm>~WPPaQ/ KqkIurD艘ysb[`|^/m)"fZTjkht(*_vS~-@KĉM>SCL OB]_~ᙋcD" ii릶^߁_X'?Ci á@HTgϾ>^DIIu/+ixߛv p8vf|["4'UPjT$1te %ktHƴ*:; h@riLkchExܮG¤0l{L?>ޱ3g,޷wߖ>._tVϣlEw%%Ū·DT|ހWicUW_}[ou8iwe$DlS$z%2TL!=%bEw! I(, DD*]0  O]˲$ **+p{D1+ز47izj2%0WPPPT'W.BݘUM0}M݄-iMD~ M3%eЫX$H"T7aɓ&HJqQm-465S1<랺S/_mD1,"acQ,]H͞`a8pN5{ k|bEgw/ѩi< /TPضm^XӒҶiL)Nh{T0Q#_ hܺ0J1Ou/M[[WxΜK.c/֧]N?_RS@AAAatp.PP/ʶhK@RT|@p9]TL)Ajj?>ޱ3WPPPPDAA_[2)|/i: ͭ!*1t}R^+(((t 5{ol4U3DaBaPPP_4 ‘(]]ڽpt:z}x=.4]Ƕm'F*-" #qcFH-"n!0X`[X:^q:@E@?~*Q֣D"˲ІWu >BqQZ!eH$H&`7{0 +64tC2`)? Y+;&;1Lëk0{Z1.ath[hd4RixmmFGG4׭e좥 jj'ValM_Cp)!/ە,qIθ+j$ /" A\SލC-r~uRPDA!xaIHB4^j`0 'åfb#=*EB8lۦ,vx0 MC׉'L ea[rt:Dh++˩md,+_ j6!26Cqp7bE<ڀQZ|`-0/ ہ=#mh$D!L]δ%@{)("yABr]4 ]w&!C TIT֣ʸ݉ᢼ/1btliD4M::n}]rho렬d,. x4b5VBl-G "ߦ6sbϒaH0!O O11&-@hP~ lWw*E@pZNE0TC uw$꒡Wmö,J(*gϲ-ZZڈ&nCCl)u>LӤB@q.ށXѿ7!)І|͖p!VO`H@G᳡«+ IоO?\Ϻ$m=ȇ" | ɩ=ijZJ>)H#|!z!Xmk>\iUz,n;;zfCXq~GSK NP(DYY%IYY ~(>}u+-ь;2^1?iqq;)立(z4"k3Tt!.?DOJr)B05m镻oǝU?܂Д ,C |\Do}hpO1p10攍~(Gȉ$-_WXXbk5 WboҒtx]a,Mc|OVVo!줬,U3ar9#Te` ׋ECcS^.X>KCޖq& ГMEDG>V: kIUmyGW@7}'5`7_If1Ʌ'4u!x7w~.5_w}p&Xm@#$$gƽ@iJB--Ku< mAaQ!PWu)S܌D"<π)li פW8g9Θ=vBgUǀKCos,Xw"9&ksSDx~#4' i-0 }^+m^EE~g3ݵz\6&+w^s XHv۶ } 5 ɹ]twR,cm|]ky Ôm۶{*gaPTP@(Z<eA@aLSa[h?[0-F1,`&P_܍Idf)7"Yxz$w,qwƵ dˀ*`ƋЯ,Ezxi_oWay $ yxmw^eCr!s6={ӯ~e^gŲ=<&ÅT/>k֮Zw}R~'rGz=tǯ~_KpOI+Ǽ}W,I Z DH[A>~< ىEw0$Sm쫫'S^ZpMWWu RVV绅EtuD(v/0F!{@s"/wہ}xO8wt"]-? ;h߀J"0VN6g^j<(﹙1ؾ`<-LhOsd{Fd ۭV vk0Mk |~X JK|ଏ/Yl-?|r5~碅G4G۾\@߇|1|% bKOS،m*+v? 1dJlaZ{贩q躎aPZ]>-`&,LSζL6{qP(9lO ]}!4N{Uƾ>o2iK±G~FdoX~(Ҡ/WgK8+>?|}W.2ٷiic[SPȋȎBp2ؾDb S͡w!E&3Fywܵz݊׬%R|+B}9{~nSjN]f;Y'|☵/P7f$&O(֘ԊB.= ZJ+0)H#%@,0t4]c 2SP –eqܸ]nmTVƢY&vJF)..ʼ&|QdН?5^cmw9o/!%UÓ(B ?o §>kP3!$SF>3Zr0c % W.|ͺ{{hǮ MӺek< >oGEIfzwww[q  rQo"CEBƍ|90Zʂ =B=.±(N۶13bQ\ng*gn4qbqR *X #!]ǝeQ ::Ey<-}2LޛT"”㞗$1q8Ո}gfSo2NuR+ ?_xPxUqqMci~e]՛}Wes8`hPq%HA4⣐E.b 5ֶ@i|h޺z.'ee%tmp{k9 h4FVڴLjV6"-쑈T@vM$pI2ZT <0I,cjXCU4oGhrS)(2-# *de޳W^]zR7ImBH[ittmI`f!MDb$fʣv ImA(Dž&}D5be,-F7e8^d Ƞ>:ǶNƿwT^StEickBBITPPd \cU{0,ҍG֮w2H&= w"!I7R>$j(XrtEIY,~ЁTULV\N'M60-jd jt V]Ic1h|ȥ3"h*18;]VIB4D ?K^Ӣ1:!jA@ I0 B:o'= Zw-r{h)(sFu$=9|$Dv |c.{fu!~/w7Hٮ#p ,CN'9H) V=ַ̱޻Ҳ|^/`vfLIyP[bLH$qb8U)J:b85cacG=)'^C.H_o@GRt88 Qr^}9"E@ϕGH~+(R?Qy>޶<%B6Cр蒴~ZihlJԀ+//e=4P^Snp @ CatUCImLj5 i^B:]uM<* QA~$jAD2tOC9‹Uy,# <`" ((|8HHɇX L4 l8qKV?}jU544*YY٠mii#f&l2D) N?؀LyLKb]3\!` 3vH%SƓ$-Waa p]MA|frr^{Y> 5rz8^~G#KQPؿIȄ|aQ"롪&vQY^bituvbȌeY$/h%lۦ"ɯn|pXgo8]}K^TL~Ϗx"ֻ#8is-@S20U:]IA(GzKKIg^kIB_/H+ɇe \.`=qTƭ1Di@ C</!Vϕiǁ|y:yX*IHQK䰴c>Aoq`Ksq70C^.I" yDBPP].l:ѡkjhim'IppXi"^2w -ӧo.MOΛy&TA" 5Xy#YО,6 ,i" cXqp^B^!PI4etuuʼn$2:A,JXI4l" ƈExT<ߌnF𝈔.D(ֽޤ#, z^E4e"j!-CxB (((|hr"R4Xnk;ݧ%p}+.txk*ѡBΰi&?ez/Dio \.'N ظu }cdqMhO⛂^M7-{zgX{zMog6ǝ병,}@$#j߻۶<óqDiu /k~pBuuD"p8|73w"<~iڋWȸײWH" aY1okY> p㊇Ofy'&J{X ۋf]~*3/I@ _>ŠGS"rxpʉۈ7 ڎ+&sw>$[$$XEvb;^ȷ/[hӶm'0*D|גĶ V]^ӴDK4M( 455 1}j ñR|70sUtuLrd0Ϟ@TzoUwC7 Z|ɜpqp8rǝcOE>|{gA_lEA8DZJ@z_K22˟ѽ47g<4eWm; |X5xU0P m>۶!Vh$ QP L)񰧶~C6;̆@Iۤrx$5J a96_^ҲųgŢmobͺ{W/j O?$n~?b8 8%8%FnڍmY)>k[$]orbI6JnO e$"}yrGOh_Dj2m5X\ XɼWM8UP \!WB*1#i6EI;L8ŖẦau<>Á o1]”qȞ[!_-BzG͗ ·OmAd4sd6i~OH^ P5M Hd 4ŋ 8UM-/`$-q:OiaO[ Ĥq`ٶmiɰJI.V <&|4 j'C, i!<,vFŠ^dm4י[$moVcֿ6J;D"˅i) 40-aYe:S/Z݊r(+-A[~ (WRDjy9$ g%$tDH^r;2x0."𚼿֐y-s= ܃Ȅu E>kw3gViiOLuu%9`]-Uǝ89ݫo8݃z7pϳQ]cDv>{FOSUăqt mS4[Ӵ mJpǀ{5Mkm@IP)3Ei7ݖ?E^k~}}ʱR9Z3dp  }H$m۽MӤv IIi12ǃᢽҲqYXy_[{|/RwBI(r4B!0r: lM#$UrЧm&w6L K$9X;kIrw)Da~-B_ޙHt˥6. E{Z%HKogy[8&b0 ^J>s۷t#}ӃNe W.ׁH{DO>h6!NnM?m:" ,G D~-x0|Qn0XrcX>^H[|Ȇ&匭6I(=^c$. 218>Scs|n$=g<,Ɏo:>?.+$6 'qN?5 fN$E$9q8 ڻR{.7]A) 9wS9uƬ}c'wt:mvj``HЄ/^%@; y Iimv5B[pXw iڌa%p B^5ѿbv PcZ |O庝Er;P% ( ;qͶm?|iZxx]{uNg]Aڻz5%IIs'`J|: *? cHϳ3Տ-"ї̗cy ^8 t8O)+Ea2c ]S9 ]fݽT/K8}yJYS+8z̙UfJfLฅ1sZ%S9,8@0'w$̢Bp裩fаo7nxdH68GCP7,`;“p3PiZ7{K/#D?Bf#ߒ7$4Hۂڞy#PX_( I>:ZLDIE(N9KߔeXWW'Ԛ~GsK 0>ib唗(._/4PLŔ2J1M3EDeev sBx0FgFl%DG;;`cېI~кdPp;+%19&-[HWWתE bǎs8WE 7|ᜏb[&OM~j*8}iYW%MGSr\H%'.ĠC#2lAa}٠iz6wt(p( +ZBS$ixKӴ^{BF){}LD]҈}ɗR !G?c3i:diUg۶[ߊrw`wDdKbҌm;rJ9Ns2B0^1/ ul{؎d %Jߐ+B8M·f^*1Ϥc$>/~Dhy~oApͤxF;>;g}z%" p̋r2ο߁C|摋SOY, d{gbeZ}e(qW϶m~.=Đ#bJ%^$ٛpH]$."㧒Ay|i`}_ӴW,k|ЧY+t GZS5eY74r91Mʊގ{kuo0Mv8y_D!w޾$;z4/}yJ2~9b?w/A\opy(Nz &Qoh(4ed߭H0>2B7t$1$6E#[E@>mxB֚2j) y;\;Xh3ۇ,0( .h#aZFE@l!V}@iuY9 5CLOӠaHB q"bWK#j7B#MӚDR/BĈгb#(yMӞ ilX74>WUY`hx [uB<π./+lDxь{ i(!륑;Z.G\|LEz!Zyt#2!м I6Fm=ב~B3^!sDػPPDuWlз[f)վm5߾%e໊): ~3Ub}bigK/}jY@_@$+؋}l`0QO2J#Wrnv#_J;CyP1|V. dInY@8K#,rd^bn"K]?)Ⱦ}'k%FAa`LDw^s3=s;Zni\j_~jL_~ fx~[{ט_[>`LSȺ"Op۶=ar/ٶ}mۧض JƒG)|ߖNFp2҇#XMOFitOm0l^hvԗv,5yHw!be=M^49Mi&i7ɾH>5#Gض}]Y9؝V[O# cZ\5$ ҐbC9.kX-l}8Q9MZMӞobuFX=es׷G,b\NWWW0),SXP atvt> +(PhOvͬ3zE8DWW]UY1":?N b}$wGF}T F:t˹ZiD/N{/*98SY@A#SMo¤= i-wajE|~X 3P{;RK/G~!<ش]oGAaD wqu<2$iӤ)m^X VVeg)AtEza+UPTEB R,m"Md.?~$L2if&I}ey}nE+uH%\mٌ;S @> ;rji.(QJQ)^)RTpG_WA $O]z,< !kІm '̻O|6L: 5hcT$H\U$:&@{:ΛLC}ӁR Ncc#M1"Ȩzҩ t2;G42dhJ[qw"7L@%`d;Tnɷ#!MYBsQ*D*WU˓D*}2.$\҆=VO9utSoցbeZɰ[*0~C\>F},̌ sZsߺEU3<b򕈷"U.Ԇ$ ￁$}~ |K!;$Izm߭ L9Iz_4}~Y0R"@vv4eN5b]jOSqǗ3j@5$$&5Xw5i)/Lr"==( Z[L_(D4l44uij  2i!j\ǤRi拍G@RHz!߇Um66Fv,G* S{uQ*ծE?ěԡu=sk,JϵIȓ`a˜f3`,k;6mh73ꆛŚ^Cټh~/ r(&VhsXM0HovTJqDt~OX/ꅼ#xX/szXzu$sr/=uH ۷ 64E$o)MHXN9B997"u80qC2p0l/j$BC 0D>c0ñc=$ >/dD2Y`Jo1\ 香A] ($i_É41CAbA}N4pH5,W\ǜ5ZG#02$l=z"f2b~ZvkkkW^ -|fNNΚV܍ٍԍ+b?8:G-lv){[6ϳyyM$ď ySJ @zAb8isRJ"aHA'TJ=] 48eHߍ6MTJz?rCw,9$)^Id~,˽j8[> 4 HuA¡Uk49zdU~6ߗ]8x?7k mǛ+Jv/5$)}eZ(K5+y|߁3iUF֒o7ejT͍c$ Cl߲qɕ$NB KRɗi64OEr!ήCJ.qd:xڈjdAQԛyt0D]ipS1Me=p`9+锠?eG W%!կ빣1졲er9B\9=+dk:Xͽ]LO:D)LQr)zz7 r6tOm-apP'5ND"LH T*M"7z"IcS%EyJ?'% Y6}pc<6\*gH^YvWs6ҫtnMa|Ľ =};{+P J5r`aj |xA"X185W^rKm'G8eܲ"_[ Oj#%NAIfkc0594E9 {O!ߏve$Geiic _rryȾ! fC)\NPE,IgP(a68uu|^6F8Boo/sF?c 4Ig2%d2&6%z>$$W =shûZI/"UK0SH㇫$[şf<܄@hٟ'#bI I]I{&$YR˲,8r{ϙgT`a4=֗^v5+nmlyH2[ _ErѺؾe#ׯ|8 -m<\TL*$.$6`,&^zn@vJW! O ;!#ND:gcܒelNaB;㭕aM:r>6;tTʤ`hU? 1ons!&K*nzG'"&INMm8Gm쬲.vjᐧ|$4a{l d0#JY9$a_; f^ O@c|X|`" ^w垽{-^1{~|>JKՖ’ }D7MW"*tǞ_͝;FWdV=\TL*OGJ i$*#H)ەRSJ 3i1m@:!9RC}9:{0 <`p4ϙM&&΀6 HtsΙdcTYF_%5,N<3\612ċyO/ʹ&qx% s%(I,XbUW, ޶mGcvzH4fŕRplIW GbCǚ ·K<~})$_&R!HXG-ҡg%wNߚE&L@ %eW!=a9tT:Kz^ =6t̬Y $I Q|D"$iNjmn/L0B0W W2jŽS 5~g yQ$8B@BKүꗑ_j$ nwͭ2GD.6ntݷZj7-[@"t1*?q^2lDáܜQ!^y@|ՀjRe_НԟCY" ل=H1 tg3\A#RR*ڡڬڨzE))H{Z[Lң BD8Xwi\|E2Uհ.M@ '*?D ȏ}'8HXYbUF"5\fH(ȱnMkhmia >CDof2Ca:`bLhn=  G UzTk;pc{ / 83Oˑ\g@m 58r"H?#Pk{!R7HνI6 WM ^AW5`7)\}+絴7]{Ֆ-%,_~<'Hi(S2z_O7šE)xuH dj T47wK{}ݻH$̙ͼ3dr.nmQwPOMM #E B6L 0M2 6N"iV!I_o/~EB?q sWNlEv!gЭa"a3I]Hrnqlz\󜟄4̾" RjyjⱃE|zr#MHb4AYvټ^g7l{qԬN3,i=I.wnVyrUq~x/xCe%ɇxAň6Ǘyn'J<,mC&̒;AIHv܁'t(RӸ_ia([A L_G84G^"I8 >#Q뮡Mr@l66T"n0yLم>PÞ,zry2k^k8j]ӺG_ կrzs&7%sp +D`l(K«Xlm;V~p]K&C4njf"GoNDwOۙ2y WXX|RY=IDATS$é Wp3\s=>HWG!!+7:1Vt"[jr3Ew=ͳ#yJAn=ihVNn8T B6s'iS˿4!" F l65kjd"ɡN6Z9Ի^[UlRv9Pw;Pi$<䵼2ݎx88&Ia5:3kl" c,5nz~ˊZwZew-M=wlxOg,2GIzaz{tǶ-5̢a4Yg K[y#o_ś`7H?8|¯'c 1p\^ٯ`C.!Y|J[ONG:VI0u"]@c>U`8P#LI ^ða(Pn<>HLgb$I446Pﯫ0"^=c *b:^ܬI⥔^Ü&2Zy9O5\Jθګ?o_Ii>]a#.d %3GjP.b]{I m'wk#=lTE}`xϗߥGhH/.0wZC$,֐rU|g/*R4zd2Mfpivd'wSud!jnf7tdd:C&&Jd0MT:E6bdpm6vuu=*̼+HB:~?BRH܂x4LKM,L1`xu9=w%?`ۖ>ʰaf|a)-l߲/l,x%/3_y ¥8nN|[oݰb! gE@T2dpplB@$;iL3dAFzD3Hqz*Z$ț/Gr+,X` 3%,cFhH߬_PnX~)xw)CC$nyp57w?5`g˷E@,LYT*D#1vWGccE@oC*`|8պ] ' ,X$50p,PfG9Ɨ+zڟmv?:7ns|w6-Xs0M<43=hܷypL*"s݋T2?BZrkK[`aR< XZ, SfCD Lҙ }}A$0yqPJ|H)'W!!A_Ī&$NK,:zIENDB`xye-0.12.2+dfsg/res/detailed.xml000066400000000000000000000111271225403634500164140ustar00rootroot00000000000000 Ancestral Xye Miguel Angel Soliz Kuncar A very detailed skin with a temple/tribal theme. Use the 20x20 or 30x30 versions for smaller resolutions. WIP. xye-0.12.2+dfsg/res/detailed20.png000066400000000000000000006003341225403634500165460ustar00rootroot00000000000000PNG  IHDR6 MiCCPPhotoshop ICC profilexڝSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/%ҟ3bKGD pHYs  tIME  6f0% IDATxܼwtUUۧޒ{Sn*%B j +bAgl32kQAE I-!FzosOIT[k$&xrJV$% @ % adJ^~+zDeƫhjgN^R^!DyI9Z- S`TfY[>Ova0H_G4hz^hu>hο:>z#~/8^ I `/_tKksi,F%@CT*:s# !Dza/ʢ`  xxضm'(U`Zv{`Ǡf YYSN#ں: Fttth4b|JX#3g&jkpipׅg2QTTn(Yp뭳O:~]?.K ϙ;(t:ÐuT~Oje}(ʘFIjQ(-{k¼/)B}݌TB gXSԛ7XoeNWv^q8%K?ӧwqcQ#j3gg~9S'{Հ^.kDкa(BiɌ記6MR._eKX36=~I)PC$gy=' qfߑg{W֜(:`XW}F_6O59`_"nll hm\5?y\42Gh{"?$IY*BA5:nLp3HIC7aa~w$ ț{/QJk0qjGAy*F |ql ķZC5#6􌌅glqhhn% W{!N@iЊ\ȥgvvTѐ pyp6dU^y.`ЋZ^;œ⭩^ϿJscqYFrz` M ʢCW$R̠&ykz{ͅdVxm"..FĨ#Ԕy_7^be295lP+($BШKrZ6fsZ6uD|tيY^(I}xܻWgϚG_ Ny~*z@F}jHp02]"YkOw14zoQqI'CޤGrtZ_J;2$Kj0Z _V}h|h&tݹk2aC/ụo{{/}w= CGMFeiL %$Ӻ[UU%P4фGk=d˭iô)}PTU;2-c}A"?2;kQyfHǜ;`md@?Z -UmD4fA8z0IM ^2p֭IB⋽Bsθk׾"b(Q<5 <"I .|y-좔,V0iXa3rǍCG1fLL&#/={#%JK1aB1c:6mNG?>h>cj5̙3 m(/޽{adXa?>pM>Ԑn`PnǬY37<o ?'CVCVcaغuƍ}`b ؾ}'Ly\LFB`0 T*Z&<,Z 4Z58!6 } >>mmkŋ?{﹋W,Hp8oݱcm}tO(1\>kj`ԚP'ely7tl! pd',+8HcցֶÈ0ܵ867BFz&eh**n>BQ0N1rC;ם-)G$P*"kĸ^P0q"R !G 8[ʍn_{i},zJJ#=mu^ovky/U"uh^1oOaqV-M^Xh`%Av%5f\{7X:Jzi_P,ϒ~aa!~?`ȑ]LjqԴ5NI3):**K?<?ZB-+.S67? zrreVI~ie˹KbS g6DJ.™#pm2JCq%'g`]wZyCۮ5 .d;z@ :j!s=xux47=2 ʬ,xiЀeaھ7"%w|4Y Y$2a"j.ae3d"5=Cеg a}' .$%Gӓ1< (py0TPB>!ARxx|#Z :6E'ɨs"#iMs}&Yl 8zafm>0y`ZZ Cs1#J":6Ƅv/<- .d׭[PI,Z,\\\\ckv{G0)X%b; 8p2s¦&훊h4C CiYF q@a۱}.B"nW>a1 zy8y2yQQQ³g ؈'ON d2oq fÆ{_{ՅD]]=Z-Nh4 )),APQQvh4'ND8x>h \.Nc{^b󡡡B(Ip&))!IXŅJdee"B%lVǣWׅwi9~("99 BOcmuZ(ښ:HÇBEu}Q/ O|Zmi!J<|NjXEΣ8 BRx xHvַ^,cNos>Q3)}RJ%Q:)JR^o@|cYUCiF;v,!=}3ʳ$q-vzR㬆P~ʽHnG>X#t ]?Pghtz6y|Z;j_).)[֢7Á2T*xNMò(,,V02dHcx'<B z CZ}̚u[[ۿۻ~se̞3~Vݰ93Joڭ{iř|rrO>ny`"(kV`$h'ȝDp.AT '~)ӴsDB/?x*-Qkp|e! As7`B^qC( b6KJ!+  PJYB}ԁSfj5 A9upRRgb2f%la~<vYv ;=Ϋu&6vn^}D hY݈1CQ^Ne~--|*NSӅ>g̈́T\6c%&B.*FiS}툋3Px&o%ǫ=<%ׯ$IY"""DJ_ p8K.?B(k0HNNo/1b0TUh4`YXx?(~m&Aڊ( cƌ8GkK! AB)F{vGd=z931skWBEHBdT*B:Vku}K}>L&3D AQ(L0w9^0(n +J. G <pAAM0DD@MzZ;Ȁ h?C+`ӆo,|-^9YUҍS5;6%{3o~#y9D8PY0XwM53f9yan%p}/J?`4ʙWύ˯#Ghnjj͛q!aϞ=")θL@I@ܥyF }dWx`+(JB/tYo_},xAH!$bU_`H`28u4)*$$PV-CLr$ss^Z}h5:.H=;HO:5Gj/X֩Crl)V3q$6ćT$>sb)/ikdd$FF%Qݎ,nMP! w鎧ׄ?Z'-NG[_i[UG(Rq3Q!!%5?s$guWݳPbln.V@ħFφFۑ0@Nz<'3v r94 F|wXWq9v옩f6[DD( ΍?~>eex٧O>{2%7h5$++6mO=qM{+V|h̘qSWh)[GJtoJKˠ( z=T*U֔3|@I>2ܱlrt:444.](WB@@6hjjdnAiiuܥIIp:]^ttt8z=/!!b}GeyJ'Z*PTTD0gub@`Xbzcc@x5 f- .^˵~5In "sbH\_PX(NOO1vh僶57ޚZ2X_/Qm$9o@ f'YH\=@[ZXg࿝aQPq$S>* _~E;;Cҩ/.Q ydCX<σpe,`ǁR1ul۾c  *5CrJ= $_A{B}`ީQQ+jtiV~/mSajR<4_؞T H]YM&lY{GfG95!5K( A;bqt#w>5/{ZէPB)\Fum>SJ/ :N`C=QQy̡q4(.󸘞},ܽ}h{lro C G6CO`D˳eSmI߾F1QC_)PbdDCJE|O6BVGk+u4匟-,z \Bϻc ߺx02B8E a2Gd-]4_~ҀNEƍ;);wV__C)%ͻw?~fۀ;Gyٯvaصg/^ +V|~BQ(/NÂwЬ,ٳ70R#廉 <J)۱򋯐T xNaX ޴ZhkkCTTZZZeMM(*:~ֆP(0ǽ 5,#DEEaذ]~ ;b~f }*dY(0"'bHDeU5""u…dIJRSSo<l6{bcc]%[n ۶˜19F|\z]WKguY55ر7̚9 `PTHǁq)E"׉tn Sjxm0(.,;;!`gZTUh4;v:6-z"I}~a.A6gdNMѢ >w 8!PcPl$|ЧEF[le]V &u21=oaAF83z]`9kvlՠiYJΜlk-QȌA/.V|hiiAw!,#** ,@EEΤ7f(I0 FUW (l2Bex>h4j Fx~80P+[8nwѨ7 ,f%x&zx,fd D]Qw=+O %X{:Ĺ}?kN6Ѫ@-A6;ZsId v\U]H[U7C(>oQ6 ˂ȍO>.aʠ&=c$$ l1YK_x#wO 0ǫ@@,"ҫϰ_ v\Yi XX;v0qGYUT*0Lw&@Fg{R(g5fL}Nr11`} (uӥBAƚމy}>/u5Qm]uzmKKSN#""x߯IIJJj B@ 1 C~vرyGI7hJ)V)Beeux8ΰwv93Dtt\.7,&~m/.ߏ޽r4vznX{xn~glظ GU5DQccUf׭\Mp<#GI;vÇ8{Tk*+hkkCIIl6QU] 0Ymp\7!HT*446)xV-u#g1\7C 5 oG#"#eFҙ< SokN'},+* !$>'GZoEmp@Y$2)^rՈֶSR9;_~0q\SFXU)CC44juZD5DuhirA;<J/:Ss"///opa$ ,Ce(HVnϣ-]i(2h3Gqq򑕙ܹ" uGըzAA;/v",TVV937?=Ϊ,_E RtX'dO[8e'\;Ռ?@( .`z(f8c*B~d){K=m伓ueZ@˩q]UxTGJ?BU8#WSqRe9ys.N7E'Hzy:0% $u ] > w_oo}wCݖ#۶m{#]>&&&$"q(..NZ[BBBc P:t(=22YQQ+11I)wmm}qFco{?V݃y=MF0 ]mQPQvL<v( r@ hj58q< x~=LF䌸nCAG첔O9 QWWӉiS\ydt!$0yDlݺ jv`#)1񪂰cqܹ{b]֦eaKE!~=S|1 sWDpdln wwB+n BH`ݗ8 2 ,CC v[ E]VVbq6:#؅OO:-)!LK_L|)QЇPV5e+sD'',"ʒg8X[mVpC7 ֌p 0hYfOG+x`E 5?tȐ>ithWF]ԝ%,aU2T<!ZAwՍj/hȜl߻^9b1Z!ZpuC֠-@{co {2'7 B`aګOw2.QPp,#qw_5dDBAbk+= ˱ataAՀ9ȒξZu`02ֶ6D"cO#ש2Shij@ZZ*ɽ3fs,T]eYgMOktˁU[~p^JCkK&@@WC@$BhNJ@}=0`X_[Y,TؙRYvn[ qGf:,;RHs NуRtmACr??/1cѵk׶ITV80h)lnnnT*Ut[(b|a!={il @v|=r$V^ߋ򋨨"\tPPxQ6bbBW_<$+?ETT^~xEEŸ[A)E󴽣YVb )9f=q=ww, JnؘpASt;f󫪪FttU‹;΋$H Qq]srz']]gt,4 <Q(e :/Tdjs:`.}WLReRb**UZkQ !:Z0h@QQ=(&O?~5rzAl8L"bUq0~ZHA xl{sCɺ o^]$F$ =Q'2ӃT3^:5/o---, a41k,̞=Q1aL6 SL t s\mZB(tɕ u }d҉'xAVCmH+.=1ܙ zeM@r =R8χu; ?`NP_ϼIR?RQ|ng{W܎\)k0IC4F5,ZPB}ׯ4`ZkA`!GדطnhII>\baϲ,2in_~8ۋ}c.BAsqHM탏?Y sU,_(*l>ܾ}'yA@BB j.$HDFF "2"\9vN!M֭лw/DEEOJ >hIx~=z$C^P=S$c,\|> &.z}7D~ʘ׷;oi8 xmɿz=?xǍ]  qx~?0}$T ;Cwg J]Z?}.n{x PW#.|u1;@7A)/ðp{$! 0@eHao׈?ȄNPhI=%-^OHe 8WQԾ0&LįW##k8|Ϭd ! " e: DQ! E/P  ׃]]:s)=)V<^zh|V,;POj%9q,蒮h0s̝k֬yeәa2w0L@ 8NRբZԴr6lGg2XpMS:$''aHf&>Z z=bcb:ߏ`P Fٳf\rbt-[~`4 C߯?6n܌6DDF  cYwt 2"r܊*jF~i(,<}EE%DQDRRًϗevڱ,l6 QRZ;vaTTTBeL6_@ UWx sgG\Jţv{ !ð׍r*? 55X 0@NA a؈ҒRMF< ^]]wqaeRڠVAmвm?6o8hgÀSLjT5>xͷ[s\f~cC$Bn]xKݏ]@( 2R~N忯aY>uy'zL9̙qgl(|gBc) ~E8)Y6Λ%/{:\,nl6F(@a׮8{իE vVtWBE8=WVNѫIJ~?Z ŗ_7{-bFs^G]g~򱏯}h;n'+{8~;]q^dB@d*mZhmݵVQDP #ENNqȐXK9up>y뽞#yY=PC24LAn|B,},$`7gmYaBR фTpt?H2-hki#—̀<XVZ%IME2! ACx8ZZٓd0 j͢\Aa!B#AA{W;q=ćz0p:l$q N >9AIp;mO.:eG(ɯnj+PR*G2SOJ0~Sy$'c333x<8.h4FB(!e@T--- ~qP(o+Ӎ.)-CDx8&N?PC*9ǎaH1>Qz}((,BwW7V\107 3sBBa61 :N %%+ L9cǑ>( /%T*5nN@VP(x>CzW_߀ 棧ǎtw`0/c8EPTli>kV кi8%;t/bǁ\ȃBPp*g~Aιq}?~y rvd'G>z_S%٥T)OTR¬UXkY즥wݾꂒ`eh͕VQ^d<OAԈ 9Cl"m_FhUj.y@䉏?ERi * Ikm=k'(OwK^_VvJj6Gtt@")7yHD7nTep} ^ IDAT8uG^$J?ǟ|bPNԠHxx׬?9'ܜ>z¬zm` r)dO:;`cs\ׅ=1'{',ءL,ߓaX4Ht6;;i uXUe'sN~FرTq Ԕ|^112rۍ$ ew?48,.5,q.Z( 7e>s`Z6o%$mTc):c'ƙHO`ܔ6 NCM)L - uW,Xl۶mOZcccCBBR#])'R ˅[!,c㿍~?6ٻ?bႹ6w`ٍK96655?2ķv+2wys6oފG58>455dysyVz*P[c.X/9c.c< ">n1j(de}*^ƬٳPw=OFBց:Gw2q-+PRR?725n˒_ J)M(-njg"'Q :A=P- *.%w^h{nK[9yxnք/ F %w R=u{ͯ /:cl҂ne"$~`†YZll.Ԑ.txlݘ0aoj/v(JW5tzgUvįHWsI{}acw7649>na4縁ʫE()- W_zl zxrb=w^3w*+:оo̝e vhl'd^)`x+\.؞|w.6*"}/#/[29ҚJ>7ʊO2ЪF~6$e xN`J)+ ;&O|̀W8OZVV(--[y(rh4hjj$ixhٲe>z{{kVØ:e@%C٠HO8;.Fjj -VGx{y~.k9騑#ܵsҝ^~y `֌ܼjƐ! z6oނ˗aǎᆅz,1' ŧ1n\`40a> ހV`Ϟ}HOc-xWD{GNjԩںX,f~L8o``.Z-:::{a䉨ǔ`2VT߬w`^. ҃ c(Ǫ}FU[K:[`0QRE H'8=ǒUtynReYX: ~~b?*IrtIIR* (D*!JG2j#~qߢ' ݥ S8DwhceW:_[;}vG1J}+eJjƩ'fs++҃%<1(l5*AAq8\\Qu^$ӟ{pĀߟП$"(}<)]>ػ/'ex#ҧ}}~d,!KUjK w/_Ȗ-[ey*!FR}p3CB'j6!I2`2q9 lyn`Nr!((l6!E%PU0((,Ƥ>i| NW1m2DIFOC&ii'N#..%KT*a2{.( |Piz6}+_fz)Z;t5 QݣkO,ѓ%' 2aY'ԙ&/,阴^O ^Kbǿ1k8ڴ?!__~Ϲ.}jf\9$&kddd"N$2m>q}Z>d Iƣ`W4>jz.rJrLt&,"jBwuWy}_ֿ;L^'RS*~Q08Ķ#݄Ъ'..BCY<eYq ~ɧqtTIh.ɽ2KRzvAAdd$:Tj%\=ߡWS?'#ҔңJD*S|r  ,㓲֔߄ȷo7DPP@ dwSp2*| :ߣ$I8N޳g) $L)U.= t)SxdYf@gsTP^/Ltb Aah³Lt=vk"1Lf.1G*pLt3#R^heFT{:0bX]jքu2~s%&ZBgȲ|,f/a0eS}=bĈqqq={ ]{hEyRچJWTBE :11 t'Dtt$͝M($XVXBCݸt j5JJKq(bHJH$ؼe+Z7lxgDI^,p-[$PZR~2"ȒܚRSRŽ%nч:nRK|Mɩ>NIҩYWDu԰.<߀WT{~sl[~ qxNW2aT?SN1w0D?ټm9`u|dK^v}[ZZj}jsASN}<`=Dz9,,L4 DAv}m!1##`٧ճLt#\mD/@g@ 3z06rr9LtJ)qU[-ݿH(q@ee @JXC#Vhh%͍ o5KR>~wjI4tT$6UoxkcszxNI>n eֳwsOzMi f Z:lcGcmR2uhI m6y.9*h6:߼w7Hstǎ1^yYDQ􇅅@ `z].3 SYTXpa9!DܵΛ3h4p;] NNBB  d>X)G hمvރsQx{{?̺%ёfDEE^TK,FWg6m&7,q,+\0k~ޮ{0ow%|B{o'EyRj(w 3]ycLeDɓ'ƔdrOI[Mxqëw3  ,˃ vl8sѦ%T*eؘABmHb{59s`dFñɧ|jlfOCmL+X),kU\FG*Â_6vؚM&Co \GWAo:;m/,[PHX,]o_v)J/0/7w|bccHߘ&4''gdڛ8?D7\$mښ a@ S3c,ɴ7h5(&^1Jj"{Ocowg~ swx/$IB:&Zsa5?Q8.$^pc>t—(1R>&!g%.D$ x<,+90&rX, ZV  F1f z n  77&:۾ozBSS#''#"<gʠR~kq,+<ñ1Qgq#j5Ȋ!"‘ǷzuËּY D5d< xPUZH I`'aA**7v2OnתatDu8@e>Ug*$@ !={vcYmQoAg=Q C !72 ra=˰-?s Oټ2[IN ˕12e/ګ`6!}sɨsn*D+{ Ā2D*@;13ſhm(Ft;t!30c (oQ$c&ُbp/KXykw~tj5T<TgoA 3z GWuMx=g` Ʊ[ɔ+bR/) ,! >N!D uk+T*bmr܌)(wz0Mz=q\C)-[&lpR|JV돎n7LNFolla1- [~DA@$hUj MNFcC|>0 hoG Ǩ#h=suϭi qD鯨7fTBCN"3=뵿~gGۂ3\R"CBR>t"<yE"T`!β͵gY  Fhu!O$ Z=IF_NAGvvr)8b3N-1jSv;X0=3gb5Ӈ1ѹޱ#"""pԩ$㤮.˄  A؃fGNN萐v='#HǬ3Id"de58Bp8} Ms.s#,4dݔ)089jjk>\뱿~ޝu},sr("333JRCCCjR8B):tӏ?"Lt*<-JJ Q#XP*Œv`iPx82z&}Lt7֜Xh.]}k2l&Ј/&?S4ck[aFϼͺϹ,\WväeQ^zGkS3 z Cۿ;N𠫭ZL9wYw3 W=[+)7Ј/NOIF oMÂEs)9! D 0-e^DOJLILètXpH9cR)TSNѻN9yJMce9aQYgϞ}.E !"Rq{oo"ZM'.D>)bT(_~ՆFΰˎʚ03n&20ѕJ0stlx5;|=~ݚicgLgܷ}i 5~&54 agWm۶-%8)--aĉ 3,++ktvvPü(f„ @@!b׮];*8,_T23b<ϡegʱ||-!2"ʾI @Rʪ8Ϋ֋@Yy9ARdz-wNg0 Cy}-l.7j[qFAmI3 ( }L0Td=+cl ߜг.VCÉ{O_ `38Qg D=~1B5>qFАBFe0Z07)R'+YcnEȲdXvY^VH>7mPYS*O˝DG?g<&~b6AC) @LI5;Ax{~詿IVFme[vD[;`5@`{iiU׊߿IVm=un1; @lMD c|_E{ L&d2YC-:fWȨ% N/X1S.>N~H56̬7Zq_ 7j3aƠaSgƦ4_3\yY po2m#4(ں{Pj/c9t&z4܏S,x MhN_(E$&p<[,K`kR'02) ?j4Àii[ su4xܬf'~c?oК0ZЖ{>ķ2s,p 1ёD7r63AqرDTJ%SlG\SSqlu&ɞL}YYof(ʆX *m65_rgȴ=a;I]# ? `a E+QcJڋD?2bR45"PxXp ó<bw}O?eg 9n0) '.!gG& "C$ֆ߸/&vQ[!EHX0nb1@3!`!~g Q禧<8.g0 ! !`z2/E@u aH~l\mEpEHm"j{2 .<Va@{` 5Q,h4oۆٳ@ڵh9"ԡI@fz~O2[[~McY M4Z-{"%ȹkD8ik7y^\\(IdX(rGVVRRRȲL\.oD)xDQ}AbV$%% j>Vk;:;Gs,f͜S`s'Dz7]@'Wn_nل7Mu嘿6ٕؾNh5拆DeԩS[>_Cf^ɟϖ%Ue;㋋t:?l1kMKR@V)l4CyVnu )(l[]%X]SCc0RI{I[[05FpP:{P6WC;*=JM):C GJ jdI9,\]CxOoJ9QB# z8 &n݊zp&׸8]= Iq7 ėg0{͋("t:@L8SdKBOIeRHOVau8JHDEAm4Bal_~Nܚa#SJA??^DFW2>bLtRa%An $ag@TW 0KOOt`4`{%%O[0B2`5v]o4f^QQRNS+"gZۃ59GקD l2aPl,aQW_#G+hjnsp8ho py0D'1!#33ʪjLtR?Ypv6l6+zVΜ)Ưa'uw{a98 7}?aq`T#O`0x\sWNdTtaUYmΝÆ{<̜73gϮmC͚DHw۬yslW7b:W}M[h#-X1b|Eߏ ^VTtjNiX>FP$x\DyUlڴHT*BEaP(DQR""88)"&&Gߗ,$af9sC 6 =%k|^~?,à7wEBC{ U}cz5FF_HY}4| iðyf8zz&#XS3%$ |+` p5;$ eMe͢#ɓ&MP*{-i!aY8YnX4Q/>ቫ٨.8Հ8"uxXN%Z)<ܐ]~b6SIO+ =vNOLjGU5W8{lKG R hCa&}jYA}Q#"} wvvϴZ-ceg 2!P$q*sVpoXP΃RJ2332W;ar 72߿͘˓fݙh9nV XY,^GsNt{)F)cJ G2b |U0YHIJ? 5:PɈ& ?.D_)wS؈Px7oVDW7!8݊ (,AjTjU1їt4da;6xFPmhw$ xL%1sRf֭"6ri-&M:gϞ$111---!ӦM;E)e Efq/;>tC! Ny^ȐrA1HI'N!'7Ln_ѣFb߁,zUzGssrQSS ,jUOdPPȐ?]>-ZLH2 ;7oŤӠjQ[^sg^GcXfk>s믽>=m=c @'1^'O?mgkyarYLpYT@<0'Խ칻/҄H"ʒb1:.@peP҇s~C Eh/*TE_xld>vj W*\ё'ۇ|~Amq_PYXx:W~wC\.4UUc1$l ,衔2֛MJM~gXFvc(@L4Ջ `zXYT2[@kI¾@{[ re2uj%Ԭ aP.W/=kP$SB#K8e FOAEe óF=5f/w!]ژhokCKS_3|8,A30hYc+1_!BkWqȐა:/Ryt|jj e\.ZWW爢8g)]bOM7f-4~uU0 PYg!uIU`X8m2jK\^ZM:{,<F5̘58[: :ʌNՐ %D}EP*XxL$VǡX&PUB0%{Ax &z@B ;uf BuLރy1jJ[1c Eɀ=_;DD[+sQ&(C>Q]]{N6lXRU(QJk4nwJT0LҥKy9Сl_ݎѣa Y9ɀ(ٻ,A8lË?2A~P69[֍ic` žphf〞Leq{^~g~)>YѫKk%:*<= P4x[5> vtudMɩ{/һfPp]dinjIȻ Yf湧;KU+Eݷ.:%(YPL(Q@(28N|~by>)}#'O,x-WD߲WujS'YXtbǷmߙrGDXHF{mFcCzҨZ:EeYfs !fΝfYIMtӧOw_tl&CZ^ъ֦_fP*PYRЅח2K ~{.>.Q1& Te"},eD )Lte1}m۶z/3 uJqU(~áhllT)Ba~?T*%ᛶnL&n7kP(yF˲v@let sg9 AT(0olr`p2 M؞@kk꿦YcYzgLV>)i;N5/Վ)0(dw a0k4l1`Hdz[rT5SRG*$Iz٧B{\p`X ?f[V8-hA }NJ|"Wnj:0j]W<_$^ϳ f}S C q=$I^oiӶ_3)(b,&BY!I0Lqo L? &8肷׸^&R z0At˖-(q, T*e;!sWRΝ[{6Pmvw<1N z}o9rMm4h%N?BjMqK֠uS&MBjjJwua 5sRrPUhlhY?~/3;1]6w4 6>{lvۓ|ڲ}?O5o$aYV޽{Jm¼yl(e/>ڢyZ+"8z\NLt R@_ lK0ѹ끌 >^LtVz\Z5:q9^Zv:P@ ]EjNx]xFl lœlJJۿ} ܜbAKYo5|qW=9o{vI8h8UZm_+N>"q£o܄Qu+JeX(I |N/rcO"H<;devKL%Ή~w,VT6DZ#6mݓ_n=$IH({sp(@x RJ,*%I/hI8!|B,ƃTEee(Ƥ>޳+>4Ή~%f*՚i Ø.lUbn$dZnEqu<73H(cw^v> 1=+ zazer}=9²lDBiIN{^)aYeǟ?(B)#x!;CR&M|o_{ Zetw|sf3@3%uR8]. ^x߽xϧyfJqZ:1#=$ eNҽw1e\_~M !CKbLL!?Ñ0THNJV 9%~p,r!;;1> V 0q'ry(t$Y,Ш"-5 $xqB47&`e2x^<Jx=$rx! f! 4j5Q$HJJ\a*0 @).@i|^щE1}p:q"o٫ S5Q>?J?7dc?̰'R?awd(&$qܓlݳq P;Jf?B%~@iˠDž'"GB*7pNt< P)~'׭-%-ߠܻ͢TןWJjEFN>"DI"3'ržNw!xDy"4Ԣr!ܰ e "-#. ~齚%c2z_Xr10'(j DQtJ[/˯.lm$s/?sdtx'^DNtKț6\"srԈYsB)Hhܿsa;\APNXsmgtFeoV`$IRT*1-- .neِdNy|uy󫪺54 7;h_5 NΡ{=7rrźWP$Bm6r+ǿߴe$[n/o}Zm6ttvcɢ+h64B@Ah|hn2m۱j4r!%͚Q~5 ,Z8 IDAT(-.ĖqŠemFFG 󫦔DԌrAT"''I£vV 99 zӦmͮ9]jwN1$?7 E!;ndowI~o c<[^rVv z3?-,4ߨ,TTC9*`P$60Q-Ǡ1"A ! FA7O[ԧ= λ$ί^#ϊȖEqme9(˪}S5s.װw*c9Ɖ?@ỈzqXR܅Q^4',,͏$NtǕ?xE̪9M{a/ҸPIBN^6~aKSR I'l7p/4*5ڊl (89+Bաl:=͂dFaLd sl6"!?J+A(z)_u_ff~LVh$%'Ǟ_@+a wʕg^BRJ֝76{]UQ9Fr94z 8NTP(2,r9Z-B~sP>yX[s(RgY6)d,7@ (J5:::js\Om޼SO=ux:L+-(JhkkGelց⣆SPb,FZZg_vaBU>aEnϺ}{mDq1c) :̌ b"|>;PZR*QT* Zd N |QG"J  ![}EwO4[ PR\4M-5PN(/CocJ7UT.W\e Ց(([.I?\W$d,N??yWz*5FMd}9'_p,+OD0-,,UFأHҤ>YKh)FeZy!bqpuu8|xFizU>=S 8`^=)zzwoNΉn >_'^K[h{sxƴL~N|988k6~ca<^_{vR 2%a +e_hrdڌ9h޿3*afW-CKC *@kc-4-Zh ހaM[Vnݻc?$!QQ&a67C1 "Gݛh'؋6PkMRDX4 rT`NɂvYKj)PLӍIԤg}v$ItNN!f0Z6:44dzZ?_.wR_}Ӊ'8 p h 0\|!x.N+>E@Q60/R׎}^veVVF}Dp : j.LF7Hݘ[91G}w?%s8nؼC83101BDY CmZ;! ơl6 O-ݝp )=)(yjwOG$dJY+x&p[x13 [0T߂ t:0,yhn< 9T8m}>7!NMœVVKr* F d ~/;a4Y8 jNBE $R ã# k4Co?y %5ގH1݄dtވTA~A!{[뱿v ~k䤳IKI9a%'!^lGV~1:h^Nj!Nt+/ M^~f2r9,Z,]y*;Z ZG4Lmhj.+:ۛջ~Hv\WQJg̟?}hh(ihhb2|NrfӓgX$Λ7Ϻw^W8OT ^|r5`Hm<ԓknl;Mq='jÜ9#QwϽ&TɄ]p<ߋܒ(!AƲP('b> 7}U徭DcS3$I @ (ӡ:88zz`?0wՎw8CuMd@& 饗tZlA,FRb2>躏hc[w&f#)U{e]}ԃcO AC0bpJ8,ވDc`% \^DElf1ߙtגEg#4u6q\~0Ɖn;w:B_@z*''k D#8}5]RlZ D |p @%h:|Id `aUH"euǕ+.,*2+;=VĢAHEK梥 +CqI {! Q(:L^o,b3CqF5@HHN I{hb--Mt chze}#8^/`=߱'8}alCve,MGŞmHIIFUUVwqy&FGG .lۭ3LYfuٳ,??jTpwwwNnnnưh"V9Ï?EŌv  $q8]``2@T0 ~&PQ(I*u_Z6W=T+b@E|g 3S^gX൶NU*\.PJ˖9.y1\n'(,fר5mpJǡR8. A瑜 !qu:〹dF0@Zj$*A(h,vX,f@T*>tZ-ZZېgdča+E)Ib6t uCLhr"b@02:p85>b^(j cr:A)7rTJ%ğqL]DGOjfRRX_vv:An=\Hj:ěA>̪ctDy"vG /H1 G~¼<^ ,fk5ڕ7)HP'Ѹ/@m(-Nh5uL Df NVXKRA-`-wCa@)eп$dyKKο措gKݸߡӧC2pAf.5a0Ef(U8!>ܹ>™y6 !=+އ"Qt (_"K$LY;Se^~o|rVR0ɭ`e, G1!6.cLX(4$143!`E%P'v. 8ހ9ij[4kglp2T* 5ӪCVn)쩫+d2A֠|Vݴñ2&JRy,//zu˖-; U;we2,ˊ+=m6h4vixxx"bْG[Djj R^Ɏ./Vήnb6`0P1sJd&Ûn#',_~B$Y,9Q4 9YhGͮI D <^03{rH  Oo~T*9ɀNA!aޜJtvNv3gaRS@8ۻ,+CiIJqX8F$pʉW^|Ϛ?q /c94JT=8ẉ#ZHՆ3l >=< FNm3oICsɞ>_}GM.95MgMC[:##DTY GIٺzZEŬTPZ|>_!$yb,3 `T]2υ`86"|!9K@A10Cd xm5=1 W^ 1*=h`AV3ު t:]bHG"P(Ř(h?9\<Wם9}i3i7y d#ˍowadS yd, >?vry/S42(P.P"j+{bk_ BLęބo}J1;Ēa2\p ɉ·<.ycN=dN,_p@ot筹mo@A X.7((P*8̳}B5wc,h3n1=99]&S'8B ޸gŚ.)U5D"5zC<7 !`yd}ua;5F$Ih4!L,eYBZmvVk*q1b2ϧQuuu[;~GmN$*h$)ðUH45@DT" XE chh@3fL_Tƕf@Pp y0 2[G[6tN(ZÁ$C& joG 47J XJQMH(AU1Џ7;r9a0=`կt àY;@b^w1@0B3  d2>0`!5}H YA@x|)084MMC.C~rx풨%ok㧝*O9b?b0JIۍ}rI![@r\Ļ|na.,'țg e_ ?|Uڔ j`Lvm@.!js  u4DCߡ5߃a\xD阜䰭W8X&9YbB T IIi "b Z# |?& 4'  p$ Մ衉}ĉ^wZ)io Q>XʃGr* jy~$I,B~_g4]Z65YYYvtf788d2)''pOŵ _1{LH QG<&VM‚tFCnɧ&ed(EC8] Л(URq74<&>G$QAo(Jhm r3vC 5A),DF=4j-p<`Y~2 pJ%(Ngd8}U(8u:H`(Ԕ8qx@)nJÕ/.'!z@jJ2*u<2鞔0##q(0?ā@0ܜqMF:'NAGR'e/.{P4!P>))}-U7e)JXJѡ=C2b>KN *%Rt,O"|c/^y^-\s @'̔s[^xGSЄ_Vv 5lց8hdPdӅ}>Hک}quOgt;_s{h'jzGL}@z>>߼{gYsHbsnnD@ P"QJKbIz}Qs8݌(JS[%O`-ˮFBĻ-Jň<ԜhDыN y (ź(됇y!d xWg}Z\+2a4|؉3q> ]`XJDy#? 'LJBE  n<':A(A i! K0t%|=68#$o@$^yI=|'JfC4lo\`4c J)l IDAT%#`}wz/O盯X!Bh8 aĢ|FgE&7E`0$I؂͖"J)DQ|>u(Rϟ?;::j @ׇ<!QxҦM @<g":Unxs+*ӳ3OG8<=5m7JqemY} P1{&rcAwA̛[` SޮݻA#-۶˰~/ G @RCRLt M`ۏ3gLnW  boC:zǾqfH i- Ѷ Ő@Y=vvvXW# !l?vGet=m-Q]=znz꙾c>nh!kf,Yw?>p__7\>akfd@J#E_;au/9@~[wɳ<^fѕWxh,ڈ.e}vWSGQ!9_4W2rGk^*:`u~Ni!F$Id ! mիNMC 8oPVGA V_,d9'Gu`2`J!u?Wly_+O"c\þ}܈|5ګ7Sm!̚~(&+z@L K8ZS [kʘ8'4]T:t7aaߡa.t@g~tG{S:ZՂ-n`_>oǘoH---~ 8܋`4hQ9 r 1kRpHKOǂ%'@ p(((}OmB_w+v- >Gg~t@]nouP*ՇqONyךL@>C4C*E(Aszh.wUHeY^z70U*у #EEEp8b2ah8V.]QGpXa6 lZm{{'MRJXīoŅ“<'.[iGcցA&m(,s80{V9/jjwS?TjJJgoB0z{1YT,-5I3|~q>SJ!f,xCa_BO} Hl&؄Kj8hk@(:>8:6 ;~8&3V~+œ4}W-;zgq/Ď U:jzd!@#a7^Gϧ'>؟~='S\\=m4 &/ߎտb,)?ggM;x#rkQ+YV뿷FCPBb'Ea5omhie4fh25 # \"iWww L008@%§<@ưx|!!089d}=4y4V%fBf aSnp  [̠L C,*}G-˔p:dHq6gM(vTNtVAlj'6a?TQ"]ϼc8KÿnHNI1h$P'lNB V&Cvv6|.*tuwCKoxi]_t{{:DY9PyeQW9xq+&/OKyG(禦FUJUΆ$ca,ze후s0d,[(B^sssqnn¤yN 666$'';A²gPpJ^ȲKPS[fO!fvN;˯Aiqn(}v8Ԃ`048e$ \bFG{RzRR@QaCaAQY9Z8<9NMMASs+FF> G}^QH6oEa~> ~Z47XfNaX,&؆F O={Ӌ?ɀpU}ks8e0)!`jG]=W]y)#1h9)$Xw=q$11-*hbi}MY'։42/''H9*\Q]uA/O's?S~(Rh%Pkt RQ*!'/z{`2Ac,;hYfv훾(JÈECHO@_a!r‚|5|K247!%|!AJ`ce2xI8 Å"0loV!Cɐl}`Y+< XQK& m8VԋȩT***B^{}T$ V \.7kP 92+ceh8j4]w_JZwQ>[020v}qPÎM䙧sVO2Eزu{a`90`e,<LalBx@ B0z=o!":1:j #69$s:kjt!qp{pp CFFJr2lݎ@0V`ppڎ}^ls 95 J)y("*sKu3G`#eEwIVF Ο~/b÷,dTg:`5}yL6 EFrFaPq, " Q|] }(%68b ~Ɵ+&K. ʴTq"'sT@W )wN|wj%' %cKPTم)9YO{/C-+ Ģ 2)h87L| Q2{ #8 ˮÎ"x.r?|WC5bBͶ/&U㷝gJ3 qO5rQTRXld â =hSX߄? ZSf6B!xTRk N(npޫp }ar9vB}݂a觔ʬV-b#p}}=V^xuY4 SDBtP2_~ "|bLBoM*y}?#-n%Xl)̞Y4m؏9'Ry'($' @V_,ϸ$ A0Mq>q$p:%l}rs'Ql|`I+UJ J ! Q %zb$%t3̍f :j7?$"`xtst;䐑@b@H<~jKD1P(JDH.6 9&CJdмPg?vJ'* 5l 'GVj1#bw7oV;$G(M\WdEWB ͵Mw=!GkaQ?Wڞʿ KŀD[Ť^K1)n+!݆݈=r K~uubsdu{w̉q#Q:1s{%)()Q:Ӊ8]>9їXDATYV ˢhLI8݅X,nzh$ģ EgTl |e "a?,o\A B, $!59 r~9@]ܸNZz9K0,)(>z=]m>N&*½C7@kp{,'/$Cr` ѷL( 81DWP}nw.1ja+a;8E&}'6!3C,e:Cs1 7maZLbn'rYڇ[DSD̚LN[7B-2tФ<&'I/ygN4WW B8*!#A#$**Qd " 0 \V'/)Jl+ P4ˀfPJ{9 8i(7&g+8̚ Ze 3Z0b$Z<ͪBAl~B,"v2crׯ1 tgee\.S8V~>1p8T({(;^x,>E^DAAnٺf8vsxucyvqW(`syG4& ɖ$#hv3^jn‘0,&$y>={1oc̈́a@ ?0(I;}zRr7,=^P5̤?+_|c=VvWKV%Wmp6-c B$RГPb0`:66M.rQッ:q/\^<{Δ _?^_xaXA~ GgV'{p /\_jq IrRqEj((rsi<|,aϾ rr2q~cAظbض}'II4Ybcb7gv`1M4PT\@:4Q㡫XƥLO yRDoo7pvpY:Y%gl_P+UﺳAʜ#Kx}BV, _|It='͋{ܮbPRkyyÎ#\N;ܱ"q*5?d26Rm(Cxx2VT(:d)(*bg$x㇥ul j[|V9#+?˧#˲"&RuƸQB` ]c'}֯_o$)_R_EhށǷ˩)jgWQ1o*wv']e3W|Ki5P)cxdY|<)ޗcccX$&& 7{=94>HNJDT( ?IA0Hrr!Tzr&1)$Y0͈ V4Z 9YYGLdYĤИƨ`]n7* GJJ22$ 8NT{E{{'&s8nԤR\cP)Ȓ$K[@w*SN0Gpu #4&M>v]\7 1)8=9 g?;Ugxׯ/ xU˫U/?ҞyO'f/aR,{u<߻wl2Qէ|=c"~{#T>zDPtq@@}=~N{=_?I6u30}4$)HWw/ yXWVRW׀F!!>=1{ J8t05$%%ܽ.dY:ÕUa4SYU͔O ٷ[n _uu a̢{ZQTM&).,"3+DF Dnۀxr\~XRd3G5w'/YdtUʲ<"@ xwF#Y?"B,j5.ɓKSe9/{ߘ#k -/iްyDQe2e$qX戱I+&Dď:7w]o 1B9Ȃ8eWPy%{^$(V&@/_N;OPP(8\Y A5?~ D|zl?P[R\"GDZF#L_(I\xEkjfcϟ6e %%'BQ(޻ˠs`'uԲ@1쒁@}0ljj!w HaA 0d<9c;';tStvu|Ry!׋?|wbάttvR[WOqWsS3\gSn5/dٝNX>vӽ/O k.3kRdj (*̢v "zRRˠ¢3bZH:_v_~7g !6i0oˮɶ{˄X@\7pE%i<~cvD[s/ 9>8=!uQ.N^r͏NMƫ Fz\.dAr~4fOrǯ<ɟ}Gܙ7ڔI`=,͇A =N'W^?z9sfS^ǜY3ejjk().bddYEVf:Y9l޲9Ty1#=9fҫsgf)aݎCՒ?_Eغ}[hQHD=1{L"## ׈kHsZڽ3f lcw]4+&:suk<3?~Vछ]kW,.(u8][ٓ͜HKM?rM{n'yA 7[n۴e=+3E5^ 7Yi_A+_]YK_ _xY>5AI^2Dtn͏\򻳝j6˙xȂRcv流י{t qq7pR6lHs[ (TDQ.I'Rq &~B‚<o>&= QAF Z$KDG3.70j=="~6?j %+3}+x' jj ~?>8$??oDQW^}FK|\/z熥gX_fWGoNY1}9mg]>//fʽn ɌH5ﲻ |^Pϣ{y<4c?_?ˁ_?"k/%r|Bi܃BM78gⓄE_3Mݧ=4(O}פd$:k"zaڳtb-ӧFv)HsK.XF{goiSp:UnbYqn{?`9r0dgف^'-5&;p-ԵZGعyn0p ӢTp!y)) ZXk&NUڟ ď;wSo ΝB% zظy3A)I d:ٱk']PJrAnv>S.mmylظ%AYJf@O  LFb|ͭlڼٳfQ) |aELsS|sT\ N1[#g늚^2h8dcOk|ާ p˥nrݯ.Ö Z-rn6'`' m(s81IIOeGi"'ժħl?c߳TS)iH1yn27&s]fӌhԚ,sx?1tz\Lf<$p5.빳@=yɪNMe=23 />K'&sAI":Ӟ]=._-:SLs㮑倓o쇟RzSL &]t!%|a gM=l}L[VJ=" ' XGc7qcJcn>[idگ֑GUU K/fbIO@7A^nQrE*߃a&t| a;w ͛Ǡek׃EPbw:7DRb"K,"++uD [x ϿȭRE]C=&.'AIbhh6M]]',j[pelGW`?0ᠳYZ,&IbBB(5[1Qve ;:pCʤa.nہ4h2}n0<|A aaa\.u$%$S]^ZTQ4VĜI}MSvy9Kˮ2-Y(SW"e[^.t@Pgbp+#OʬT:q<_:hoݠě =1+t][T~Tf5Jщ1)|PJS3nU|r f<0JZ +) YQ(/g(+~/c4D⬹S*DdN<)oi?9I.\ .=Ww9f\N^t*Ksg1+-&Ec k-20c~wENJݓ9ĠN)DTȈb<ȶRR Fzatᆧo<͓&fV`i!߸l^||gk9?Q"r#99ϡwEKk+1$$$PS]K9q̚>Ieر RO8I>tiV"")))$6&KNG{{'3OcʔɴW_}ͥ\Í>LŁۿO?.Xƞ}HsfϤֶЮ])**j-8T8@eU v&OȞ=e|ѧdSPO4~?Q""̌K3ػw?Jٸy3K_T**8pxgջ|9[m#7;" $:=Edfdp.XʿVf*SS[Kuu _oȂɧ1n\)L0F{Gf~9YQ[[GCc#X[Yp_]Idda4QȨH(8_ofغm(""M'^|Cӯ_jn'ýS&'vrLm޽Wn^UpOy{fGGfT `@X}>c7q)&jnɣ7+_}鞺G)]뇲zf*Nf0Ήw?0,?p+#l u ΍!݇AS*ۯ_9_h;{xϜѪ_ik&.6Jfa*u {%&P!B>=O ]=ֵ y@! Qz-u0jU(C]W6;Zի_0bT4~Kd ?w(#[wUEz?('B^\ĹsJٲ:HNB1?v/3b|آ&?A.#~.~\츢 eAZQ2AR ( AUB9 h':(U*VrP`fTD|=4pJ"2dʊ  a}tVv7f[H}cg`w^,af<Fijjf]L0R3QSSd U Rf0?U8|$&/7.:;v> :-z%M)۶kBa ף֨ɦEjJ2*(:::Z/;dAV/֡T) VvO|\0-;vfhx,22ӱڨS'ο#::@ 2Ffއhj-ìp %EEx|BՒRd6ٍ&3# 6ۏZk&jrW( Z[@VBϛKOO/$??|^K]C=/%4 ?l-ؾ IiƥroKXz-Ch4^y ._N ^.i]I.Tբ0K;@>%`%aKA4]5|<>s޼%2RVu~Z\Nu/iV=z7&'b..Ea^^wvȌJu?-CO.rW*(tN㣯>zvBbRj&PxB9_c%I;L#Flw1{y=l]w{F$ﰣTk ATkvJApؐ|^:~AFqQ!, 7(/ߋEWVV$I( RS| dH#**?@tt4ܹ ˅RH_2$Zm(x-F"CLrrǗp8HLL :* R`0zgt:ꢲsDֱ`ӧFZj*j"e H\lc>TRSSE1QJp*TT*IT)px)[%7_~[TmTps%@@F@.1 C~،R*s$ˮr`0V}骰Fcz+7aCnbbra'Wh4n FG}HC}̋5mg:bfF 20tREbI V4 ZLy8' }3c[Uu|g vPA'F+!$̀c4_S-2(O$rU*k;6i;@zGtV7ꡭ?ȒF F-*5 Oᝐv9K#Չ8vYzh4ڱVO}U*ڇ0a<&Z FCSS3F`P"8DDA{ƃdɬZJIeDo_o\jx4Z` (˲h)(! ?&LP(( "c1~TD$.^O  %%Dž8؄]e</` f#(J[Zِ$H,#&@` 0QBE~?Ʊafe)XGM+NzOZZ1%h QlڼN㡬4l8tA"fNGHNJje6z266m;vjbbYVF ҒSp:hu% ..h3TN=__dIW޼%mqSUaMJ^jIIEuk;S}z`939qͤEYB{d Zc|*o7av;ax]2 jĠK5r?6)?J|4qvHv3LJzKv Nɇ.H'+ңeUu2(m5C`8ywoOZ9uaXv^T*8?&]*}h޵ZI˚% Һy*5+[1d !`ˆ 24"%H#2 n $ dNzߞ//{o;^S*ҀlubV0*o NH&ΨIRdqhXl6R$3n`Um^I~W55.a@9W)&ʊV76[FW -<:PVɛy,&a_I]P'%pYGHr,&B`w@}YZܜt:-+0seb;P(twT*Ȓ``}"L `:u2mxG<}EEUU cb9peKGT~'$%$ 2BeoKBb ϻF.πe[_IJ H.LGGG''@ڌYjRocۉAV@zz*{%7/V.!nw 27^¾QЈV%A  2:&VX@|>w+ZZl_ e%1,2sk>7ܻ㯆O2񃩉VydRPN6< IDAT}PjnjlmMUIE[ n͵]N8HWd 85aDIA vǶ3ew="s.>6+yU?bTiU(bBRb,^g^} n8,h*tqTumthCZcZa 3@wcXyxɦo΋,pu3U>dDF*S='!X}nâ?8$m8vfU8l0Zs۽ .QAZ#\b9~4POPX7LXxCZn{k˳N~z^ʢ6hu]zSܩ{Kj\hn4ίZ<d$ F}e+"#g>,) ]#@\$~P#ÓMnZ~śG(1N׬C9鱉ZTS$ƪ+:30͝CŇ3VuˏQGihh'--YSsY2!=BZnbx9fϴYMW^~SPN;\}J1a /;h 0j (ebVrk7.k=̀xa/"{}$Ca1.tJvzKP'w:lTl3?I0F],|STh*-m};rfmdDm8bcQ*TDEE3GNvQ89fӃ @B\<21(*"##3gP0$#)[??Yq_Tɲ|`Zowۙ GkG;_x߾<7#4xAǠVr^aIdK\^ g sӝl>4`ᤧp0ZFq 2r-??@IYT t:LIRN RkE ,qy╍@;{F`To/ggpBK(1j|ˋ#B&DƚnOI%FIPMf&AJ cKkƂ^sq]24d`[y@肥Kظy+@"j=P \n7ӦL9 k.Ν?_^ǜ;oC!/!z=DD300@WWήnlQ"@hko㵗ֱ,suR[W6GRR !K$Ǒ~$IPMQJvZÁjȈH޸AE*jj=nhJ  "xH7ZZ[ۑ$OJdd)GAy݄iz `ۅ&02bIJLddĊAoo]_сqi)DFF~/\,ր,ˊ/֮kb?GeYVLyq~s^Ā"BA T+f9'+ӟ\|_SYw**kٝ?ϵg]|{hx]#}N18%~ьW/?ޅ%#geb98p9& fMLٺm׮;_7Ȳs #Vppft*Ԟ K5gҟ^zƐ8G_W+?uS)8d@{@%]n\| qO*MAz_:l2|uX쌈 Ą)!b^7M4U去r˯VKq! G.8ݍ"6%*Q}ԇM9Y.}l|Ov"$F-v&-M|X4'K#̓|C'6Y_mc5! T VG^gޜ~[x{*rs200H[{FIU^Z"--H~x_?hC.޼\z{A$ˆш5kHJJ"(w쯨8B`|Qn ? U5DDDְʹiSطs B,̞9&O,J>r2u맦CKgg7NeKk|G}oϙ6ZW62.%0MDEF qfϜNqQqeqiq{xPZ:ޞzz0dZWO(q|io/rsappLf@=+HOKeܹjw[=Go)sPn`=HɌ.JXJT ^c}>pӻg]>Fw}Ae{R\JM[NG})ȳpYFزm?X^[Ci݅ &BMm a6=svB!>e [Č-,ϙ6ma!y-"d!Ph݌W]ʫW0. 9Q+d!,O|Ɠ[c V}ZSkąn|!b~<x$ Ip"c HJ!{FG opb]^Ξ_\:>A>/>\gݘ$v 0诙p so?)9=y+5޾#wBѻKpZ(â \J{FQzze" $&\w#lygX;fΤܞ9x":Nì3 +#Y `X0Ca+0-H2nH6nDrRF7ig47^~|y3]A7֪AFj4,?v,C8k>OTԑ|Nz2Jd0P][KP,"LFRRعk7]]qT)S7g_g_f$)* e_ ` URRYYCbB 0⼹_RkGN tvt/np>l| JĄ %&uHLY45:::2e2.[rZq 0o ٺ}!Y`DFFה`Ȅ󯨺lۛEN.HUTՇsߓ(+AxLyYUޭV14P 1}c;溚 :ܠ7hv;WgN:o /ZZNUw f2oozPT\y8ϿUn~9=ń;zHi,N;΁R =M:̞OIZ|}kFܿ9S&OBUU5+``aA7~Z$0'X$''bرhh0#!>CHS_Jk]WYY7hQYYុh+x*6|-45tzJp]3; C:=c.@TS>u5?h2TJ贞'?_,ħ!Z=Q>gwc<ru!(_X#[Wyw/f0 =zVugO)|>?nH=kx p1٦T6St ˨P(AAkD}iy!D6G^dy.<" H zyKKQ|?!!~óokL.p A&ssD}@ETUUA.!*++Dž :uu(,.FLtߗr{;;* 11Ѡ/;"FZv˗/#))Cҩjb!BuM5| >ky fGDZuut2 2TW 44Ժ=}cnjs2ƅi-fUgm:B؍K ]fٮ)Rvd\~KF2[)(4IeROX0vۓȋDJgC4o$l"ŠJ!JVJi}ڰT39b86*Dfތx. 6*.f+5W=#9,OTjj }q^ϙɔ!f!iZ2ty:(:Do-۶޳g ?z{D.Qf_}H_xv3r55i#%9,[zW#GQ;B[Tˑ B< x,+\.o-toz <рKc?vhIAA!1`@JP?pV9>?_ rCߵ<^;<8k -8 Oщ0 | 4/6CG;HW;"bn+}64KפGPuSjwJ2zk^(TB<5Lo _|wl[_׀d̙??쓅=5T&M)_vAaMcq<.zPVsr.6ciɤ- aU! , j@H%He2PP$̓RX&oIHǎ!^T*,VDTt+oM%# v{3?CxZ1d#F]ʷh(hwN ǒ*8+ "lDL֖@R}]V^ Y?-T͟!%5DƹzXDXt@gчVm~kD-$J[V_b_)5e%=R-s`:r@ Q8Y%`dz:k1LK%v~;Z~b}xF^{a#`LGuʛbۍS;Ouȉlr -}7F^Fl4_-[PZR]hǤIT(1sm񧭸eFkȬ6-zfجv rFg8GCTlYhuZ(8[lnҥ1:aV"ƘLo}Ç mGRq\'? 7@>)I_ \聎uU} QwvswӰ{;$&ñ٧]#v䬳~ˏ 8eFg}Lw5w߷1ۚP#CT0I-*h~Sԟ_^% {SfĄL #( 8,8_|rT)Fռ잼r,%Q `܎)1#> NW`no2c^k'u,&?'HC \V 5M ڰ5> m3F@2__-#/g3UUظd zhOXOׅ&Hނ{^ҧ?=݋aÆ`8~dNnetN( RyĬ(h8J?g H#""H>W;΂e ⹦Xw/} RQ%*=  x SsW.Cg\BRFN u\&hϾXy./N:g8X@*A Ś1qY.؞ZcVW+N'.!ZZD)P $u# 'rrn&d.n@y`;;'9%nJI=Bxh*-1~g.Kp1OB%o'e3T)yH*< gir]Dʂv#} rC'88հQs8?ZiPNNv) IDAT!eYXNTaHIIlŎ;0FWiZg2̴̂{ۏPdggc@@~Bǫ+ Պ^Y3yxi側1 j}E@@EԴ9zZ,V zȤHu"L444 P䈊E#)mUVVuKJ€Jz0ߪ2kmIđ*VT UZQ@ Y=8 S:lc:ȦD$ELwe6;D,J}v'χ"+ՠYfRT8y6DPd-r wPV F('9vOc `+.lf>sU) J4hxk>!?gFGg?[ KV#8( 5x/=ر7!p?n+{БܻYzQC;˗Mعk7|| 8wjkk!W2l ((;F+ϝ?1k,cǰ~aذaM /`QQ8v8|PYY g8]NrQ0sy)X!!-%''"$$oe%mU-dHHHx06FzC1ۼƐ='p?nEYݘePW 5ޱ Dlv޴bo@ eZWѼ"Ύ0e8LC&8 `X'45vl?Q:"o^` #"|b Zj>q \a%h.No灯a;Slp l"HX>j9 xB`@s"x*BSB6:ZÌ 񠇦]UhU`XulBqI<+\Oǫ攡ȭHHu9!FTei8qٌxI!RnoD":&bqJ]Ws]Jm#l@Q()Q} *rMYΡڀ{&Ngqp9{/U*^_/\f 2x@JEkAZmm> 4aa߯2T* dr9RR)220u'7+ZE,+yɧn;v]&eaq O Aio0ed`njEhH0> B-o a߿TpBvZvi$&!j x1&NAAñFzLV5"/**.8> L / /Ws:9-,PT5G+1ytP%;`nM{sysvgf:7u)J&^oc7Ҙ4NZa@NdJ~!DZ[70 %U8섂RF/5O}2J SRǃR⢲ vhr 3 NӶ]wO pNhJǽ3 jxuẌȱ+Zp9*! u_] f ,y\@ *H5`܍RSYymuL^^-m N>>!MI"55nÙ3gZ'|{ROТ?ee廣"#iyY59ᴬ|j{=/׷W{4W.z'l6ys'M(RMH h\o -nJ[̫h/N;N8w5$Wq#>JpI`y0gσ@DN蓧ΉDңur.ĸx}S60uI:ynߧlʤC: nNR *e5VT!" UbR-$D+LᆛR܍iE 0 )Tt:nʗV3=Z@ [;Q}cpۮ|?\كGaFGzƄ6ϔQ@\6*r~AX-!Y3A @He~pa̻:D_䃟,~ :K Þ|<,x {~XTTL?$! s75SRR$&c!ط J%JDV9lݺIH뛆Xc,r/A.>>>Xp!Ξ= N)͆͛O윋m kjjq:LG;+*OJ^F_]]Ν;3JJbwש]D"x }oGi8d!zmGeO=|euQ$)1ξxG;a͚e;.Źa4 **9 z*23gXlƾ}!k?Tƻo>k1b jQ\\}᭷ނBP(p-7tbߚ  *2ii}bf i8 zG^h6 èO^l||q[ꁒzLHU# UΟaZq[`.W35<ID#@00u&F, ׺nWƥ ڸȊ_-} r8Ć"PNiF$lG7A1ڷ)Eb $`=t$]W[ReZݨ.LB{yg`蚉uMJQ N?UTW3FA>Rmv"L"ݻw!RO)zKiDd L0@oZ" TW>Hui/@O7O~'zpْgƛo |YGkVhQh!lV/(/jEaQ16+TjU :݁yy;l(+jfECCeeex7덨ә~!B{Ӂ#G7y5;F&}NX{!w0 C=%^4§4?ޓ'xi].)Tf٪9E'b7*ti?wc8c<~jw|iư~- C@v~?4uSF%xx? rҰ0hxl0 9,u= e>)hmiN[W nO!N$hY Q*D yi6v*Y!S߁5Õ*St?)Na b`);BM.)vUk?_u]Y}C=/ \jZJ!QR" LPr #sn er-ʤ񃔔䦯h4MyC. MP}vm*x<}%bH9O4QcY B@F@>#ΠBRwޛt -i?t2 gz NCe4Vtкp9{& ''D@@`F 0R (!G",\zV+%釷4Դp/6$29$r*/qpmgDe@DP0Dή뽦_lܨRY@eK>8/sg?=E`P P\R>)I(,* #Emm QZ/K&f t ]C׻| GQۍXeee1jhJBF@B)e._9rPM/BDx*%j !Ny XSnupd,Ή4}忛:s\)*6Y"aYsuu8a ٌ{o}>8 ɏn"WaHH燰Dcيx =v$' = J SRjpx:J% .\FaQ;n3 z7W\\!H:ov;Oes a{LԁOF74^4Ve'(mϋoow*d2hu:, e0u ݁?\>K<.D|i2λ-!:▚].ק/_lxixza<90"UdXfμR|g8AP''%.)-gbeRI @ ,C^R 'Nœٳ\~+W ߤ"}6hDhhdrʰFiiL&|ڜ[S[;y`'07xA+(m !e)!IQ-2N _Jv@n9!{!o DAXipLH$ŐHjr,[N[Myw*SVR -o#] IDATm,׭LXABHi<@!0 34R j !fܔR.5O[wlzG 9Y||p/6~h) EꙧlQI켥WKC3zx#8(cnjݿ'Zb׭ZRx\tpm+U +A||\~aCDAo0ēR)bш©ӧ-R`~K;ޓkWB6xȶòUm<=)w6 `H@C (7N ~L#qBK|gt~ClIzٳCxPPb"7A9RoRM!v)! B({7N[hhhmnn<gv+WDQSV<EEE~} q>X\Qnr,+X.A"ߟq8쨨fގ7@/_7fSQF!2L<0W2]TQԢ.^|!аP ss;UhhC,'V=^W\mgxAIYt;$xyIstW9ѧH˫otwEF^/a(: VB\zM,%E1OwMd$E~,rm] &mޫp G#ݹs3smFK*~4- Kvbwf5!>D'vRJx%̼ڦi嚙N[NJ'ћa&]0)2'[Y!\h;3Y<Ϗ2LfјsS FPU=w߉5`r:K,+RSE9$*2FT*әyv ĉ>Xle-뫫kbŚ<\vGaђee:>f BQhɲgnw}ܝniQʩT(,\. C@}}=J%DeTrF?:rH^G~Z|E"_5DxB>SO^x(iЀ< =x JzÀ)蜛$Wъ]7[ɖ]I%:f-G\cNt>qEA|p!2 `N5p)3JfHvm0uNᎬ-p~wmQ^7nFB,l8 ![V !1RI'"8֤iBsƨ9*1ef,6YQ:ǏsL+=BccĸqMd׬h07ĴߤTRRWzb~ic{ztpPa)px{z)bKu)>ɔj2ƓqCXZ̛7׻:3$~`riQQtd L4H37X`٩B%ko)*,{P[[VKmv?\#}oBӑn6!"i~z=jkkt8 uΆt!"|}}Qے.YQS___r Vgx{}|7]ki, O%նnHw5ߓfQWza͌|ɶҀ\ғ"g$O= A`88m@Zw8ѹSg|e*: J \1 Kr贆b6@AKq1-UWWɤ?~9\Ԥh(0'i`c|smFRx<"UxW7bGQ+D`ldbڃ2PDz~1쟰vm6V^6=t 8k"7Ç +^^^3YYFu5PWb4ϙLa&)h4y=AR@Ӱy󏈉V-!Q-ғ&t ~pA4iBH 筷GjM.g<Ȣ7|idLT$vSҧEɢO#pyjYϫժ&E @.a +++X?X4(<<JE ?X4$ 㻡 FM d'>yGb MꇟN7ݞ=}[~iK=yQ_)y/<&cv7ufQQfж7dQ]] {F)PߴMx:o*=|(V}<#c@ZTTt{kk_rCDS4qw<|>ptGfz=M QW2jGoPhz0[T3GS5ܗ(!̹q@Ū"|}dh`lI#'zއS#Xi-0j~2rBv#PBPE*ScƵ<bCS(l!हFG+3e$FT g)Bȸ0pt0b⣤eKT,͟F *`Dql> ^qs$ҳ'heeuőaΜ9 tȣBN !2LβEeK[oc2"L&tJi24d2M3Lѭ6+obdzn#ZAٱ;YtG(z)fTiPSS. ~~~o٥WzwyGx|v}{/D"afra_gDV,NM!׫/&&p7tO_+yԛ x OWzUx4ʼۧpvz$x  e$Ha0),;55j%< BJAt^BODvۭ $XSH = uP-u9 G@ħpd{Cڵw{vP,a:M6㸉ǥ2FxaFq+|fRvs,bSTEy%2CN/'4[L*)(g>=(So0̊ɓ h]P $$aaa CHH0N~O2׭et\߬^x_g|㫚^} t,o=3>S~sg}^dh:KØYO"`_X!<8 @1Vg|P,U3<$B)mrO%6Fr)r$@o> REXFYzɁt5޵ " K@(!NJdJiknhܟ0L3DQL7LcX=D)lg.d|v'D:{ؽgoA1A|tXi ~&+;#O?m%ӦLyK`Z?28F??? 1\|;p`}8 `%!.K4:LJ^>V}&oXhw"@ ʉ\?':U)vΉZJsT߼Α{/cI3]i XSC7e޾ج !FJ) -ӥN7[V6ۜ 6M߮>`Ӽh QEOf܌y#P*U]h7s(^З7&&b2K$Qy P EA9$ 9{qe ?eℛNj59T`@ף 6+\nwFQ|Ro'r<;u-*cǎn8}EIW:6FiWFשU:zJ?x-yh6xh:L5ͼd=јO:V5C'tC "U \AA!!$+ ԌK wɉf,$  gf׃4 x qQhX a 82>D ʣʁK#bD`\.zd&ACaϼ!'zha2;Ehf#ʊ](T FK]%]h\?RFXsEx/C*@n bIסHT [H蹏"yv S7 /Lg>)&+u ͦ A\agb$nsI?%\AvW}E JbuayuMT36qǥ{I(Or *ՆȆjpWW'@.mڲ׽w:w=?sݳ$JK']RV-Ǎ6==Y9c(*. }Kޭc˿BfV3 uWmڴlQ?/==z[ߍ䶾Fxl*ZʙqՈ  w<5*u9k#l,`VZƉn½JG7z ܅W˾Xj~SX]פ4>)~P,*T(T^ogAh$D7:t]e2+tQUsT@ &(btPӆwgL ⛦g#` jjP >TzueQ7cTNΡ˅< >0FJ|]᳏!i )Ÿǃ=k5'b`8.RT9,,92226lh>==e60 ! YEdr!"~Y}nq6n"#!'AeaAᰞ 4 6ƙ紀#?q3رc'&ՑoGApT2!aֿ(ݔ>FтcS ~ges뜻݆"J;i/PWK'z"p;@n;'NU)=d@XrAoOw0446si6d2Yh" ^>6Y`Ƌ)u 9Vc(` `H=On}wL!)$0` _B1{QwI\nx}t#\XRÅňǥR-oAO2s@㲾:P>ߎ8t BzJBB(jFT: )1… =/iF5rRzzz樨(WTTTڴ@<ϯ(ESDx3W2:wܼmgcf0z_~A.:һ7_}g~CiY Oj{)z?`Dg]{Rn |) ꖚp2vwJe,%8_x~Of}vLJ}vģ+Vm}_MY]Tƻ< `Ok!Sqa!OF_n;NSIiN~DqXg'0֤Ί;̈6ЏH@Iqlb'AH|ƿ,k0E<-;r V7>} O^PECH\O1Y0%U#c˿e7W$b~4$}r0ece`_c!IRYn^.RΟ&`G@ ӕ\ZEE0 Rڗ"Zldd1f!Íkl6WZhȲ 2ȑ#ԱL&cӧPQVVQez=N|6wڷmހRA DIy)[շ,=zxlނEnj~yK_ZRr=FD`媟[WV88 F.***)%L)--eǑ[WZZ'%Fm}\-HSiVji Vq9WnbpWnƫeǀnܪ|X_[g5 K59@csQ D.]IO ". 0!6 G׮Mjo۶m -@9==ݛ18BY+?c4-pffdDt}zrGFyEE  ,c 07/k4.~;Bf6)ͪfX[v=C-Xjj7V.ؼNA3/NeV@u:e֚qi͙@eEڠAp"N ƍ6~2nZɸ LG\~7{{CX+ٷºZY%܅*ܴm> Vaq d4mt?1:q=pIea啨8C2*€<|+}8n$~@&.BrJ?Њ_>Qdg1Cڊ@\f¸1(cGX} \ +**@MTUU}(c}6ozPv ۷}zC0im׫0NCmw 63C4 IDATD ' <a3?]h{ : JFN2|4""< pD4tE\%Əw^] gs`!qTTTRA;38x?#ƈn($LjKm(a;/ZfA@pMY0߇ݾ30ߧF$T\n%><$Ç7ѣ$@Y PhIO˩SRm@РAfXa8BXjj\eyyyEQ̉N+v:D1Y="IR"(UU/g.W^|$dz>+O(]MdJ)uPP?0=$F# Uq :*`t<Y…T(&V eߠ>:o;Ѱaxm74MG~~L&wP%IqYm߱ZFBYFnfMF^=z(Ս*znS©*UCB,9 Wx8nF k'vwpF\Mi9V+m//WMXJaÆ-ZPUuK8 Ϫv| [TU}Rzosrrٳg,bqn빱WytX̓ cL_ub* S)^ESR^Qn7>.Y*kqAP^QIt|f38,9-D鬙)m/?5[2<~ٝE8aaa_x~ WfBIϿ$Z74+grWG=F@M䟺0---br\~Tg?X{_o@AePWq`EE<#~@81E8QQGO|xiڑ$c/%%eqDu,?T͝"tu1^Qic*:z{B#ؽfݦOo@;//6Gɬ&xf6a+%KU8.Y3?9Vm۴n;v]É=r=-ޖ[_4M hWUyseѫ( $Io8NSj^gTdZAЉ88/S~_cc#&d|@c>! qbzD̓ԏ}%%5ix33A"#5֩O0w"ʸCYMIW 1j[R"z.ûoPdy۶mUVSv/r@FͶlvoytƌ _@ӦMAxCqQ UpQܹ蛑6ޞy"t8 *Af8g}yʔ)/SJW9 Ν;_\_!$80`M;# +:ӆY]\)5s?8 }ϦvNJT9VOzU>uOLOlXH bb r3e"bxiG;^[6a"h[*FqX:";; Wt6lHp'NNtJ  Vֿ{5Ch$5u&@.Gk^KN/p1/~/n8iEFFpNtNy !PNJuedܹBCC̢$ (8txhbL=|wl]o҄o^+cDTDqİg`уyIo0Cpk^D6b49ΉN%` M6E0|l~)A n(C@'V#~'L #й0P5 R1!4Yp؜_~^=?;\o!v{xM6រ[YIǏ5b[:u%IW.p8KJJTTT2eJbRR]N\S4Uc({4U`B 17^t\K􂹁Wu]%f,_"Kgň̉zD{+V\ <ڠ_cV#?VHtƀOп[ݧ;QV?lѕ/uYPlns:OEǟI6@XCB@@8~q9wߌlg"=W_#a{@ vo<ИekODBBKX,xp)mljcQj{BE׻Z9n=w:RuoGرe .;o`ݱh4ޯj*}k>TpXQ# `uNtF)apC[ķlbL}{ F8z.Un~Xl}}xU;;6 !X ^~EOG! xbe0x'OVTZw[0`@έ\ !ov[oUiZA|[haŵ;wԩ֬YFhWDh3qm,iڱ ʊ+gվ]:oi%K#)$,ب=2/Mm;~Nr^^H.6H\Չ![ 9ٸf^hs@EiC#RrB?x.oIhBj/*eGF5'~߽\ã_cӷv_|`5fXExV% Wh9k{3mH~;ʋ-33'kKI9|1xףMjDЮM+|Dӽo>Omݾ+|ێMfX-۬];l:G9s篡YnÃJ-0v ̛maGۆ߉TR2s:]͝Ôj3~nݷw!nS4`ԩUUQ;;G)eSL1eʔ֭;ءC`ȸJq&uj\ h<*"K)F0K@pGQ`o N?2;o7XD_"H: p@fE1*O_|nN_p-_XܰK t`*rH0+f$rH߸GeUO@ZJN8FBҲHtӛ)_BCR`R$iif&*"#燁*ҸLZCA4 "Q1RÒ.貎k-@n˦y_PҿȀ'9NtB @_5I Ϸn¶ w[ܶcػgM[zyKܳO1W9@5Y/ `1VX}[?=nں}/]L F#tQҡaD8D\ b x^ޠU)( wƷnժekr}}ziJmviӁED{OܖTWo$`޼yrssիWb'ǩ8A4oG 7,4hPg}vZDDD+ҥK'.]+{ v3:A8:kn#y)p4(c{PW !<85{O:| Dx/4^~D \Vz]Ntbsmx\z'43vÉ`=US>lmŐF6X*Z1 ZRq+N#=֒4nleBl0uMVlsVҬmsڎGL±Ѳ ?mšWZY<2TU(J*':Lħy? ژӽ{&طmmw#17$½wZ#I dU.c 1Yyo.OX̝O/f^%77$8R q< 7=?^^^000 0{{h4A3@'Ia;%e$--p h4p`0N: ,$i_#tyozsm~3+|IWt:ݢjHt޼y?M… /Ըp:nd25|s]l߾}޽+ooy;vk0MCl(Hߕ*%@o y> },kJ@H?peʬPjJ[90K!i`J ;FpP @QSl=uu:9:3![G_0̾ |PAp*d=Tn@N$?︓$-o9Yvq,KO DvZW7|7N0CJR%wC`jCesJ(#pF~Z3}c88 c@i?XU9ceWM%%F2эm۱(00۶&@|gӑ#\]l&v݇ݠM& &pї6b1(+$:x$ z>>>󃯯& p8}N&'B4chh89t0J!IM3zYA8͛!s7]q[ra̙1QQQ'|!/3aaa'f͚p8n뻚R{r;wnLXXر^{'>tl޼y^ ?(rt7hgĈ[yN#FxbuԩYRRRڈ#> I&eUVeLp1pJT賑gEZs|ӗUr%*N] P+ZO\S UFYC"PjC i-'L!38phq3N`m"*r4&\A3PawA&k^ K7EY/l^Mz=%tjۓAAҪq_xsFk4Zw*U|䎖+*!/uh^nvⷶ*mb̚@913'.j]ǹ8YxYYYFh@RCiF XnR7$IeF60Ŷ>Ң44M7CxbFeh21X=*?FL4xz}ӧݻ.gdmwtyͷ+h.fyĜkTYVV61Mgz}1a\8r`}().Zh&M<8!$YXaDp-(/wˡD_o"ˠ ݖzmƌS~t:ѲeKhύbbccWU *?~Wt:Ѽys(O<7x?Sjݹsڵ5kւ3gTO)^hѧ˖-SN]W^vn)a!,ogÇsY%<\)Ag$&GX@_\J>\c@ " 3B.(i,5@jA-q:H+*iB<bEŢj;B$p¢JK-- of=5ϋfvd;S8Xsyh {*)׹G6G v}yuIV:˸&^๧9}7nx]$]6G|}}ViӪ,02|#.مܼ|̝k)^Nt7{.I`CI 2܌w[j֧g3njVը2;t'5-K~~!DbM1H_D  ̃hݏuč|́UuB/|)` PIJx=R.|JEۓyf ur K:8ьI`vr6"ȑD?q5عv9X*+ٽ bTM/Ш`0t9a[``waQYY Kl#LF= #f24AA7ݻ u]}& ^F#4Fa2QT\hP ivj믿.=vطK,i=cƌ7SAYWVVuSN81֬Y,11q7|nԩYzz(3g\\n{nv=S]vxÆ v5g:^o8~*GqE!Z]B8jOEX y8O%")= >&\p  H!qFw-/  9Hcu9s%&rPTr^+S$CAZr:M&oAͅŀyZ2.pqنz4ldU~àՐɢT΂47A\lnهuJaB@}.z.E]w=)xb/'ie:I|#>Yڵ>t!  IDATv,ݳG.PckuP^LعMW?[i iii&;vWڳGw˧ss5>zb`ݎ$4J!"w0A' # 7&/08N p6ByY/մ{^b2 t4ps0ZCq0yQ 4GD0I!_N9XK9N{Sv_$<2"(0a¡S߹s瞄U :Uc<ӦMBI}V }ϟ߼K.y'ۑxz*b1^/1**W? ( <åB&p" YAKe|~Ff/ѣ׻9ѝqDtkCc/c;iE2[A7'",L;Wο@(t~13/Bp.Y>}k}0(QuwĮSSԓ8\De(Wž"(V(I`ǖbxFmдP>p5LʏkDOQcI: Ec,Éq%H)}tukI|1o@=}hIc0;{]!!:v[rcbb2B`ATʼn(Z?QV^K /2pPdO"+tXk`0|ܥ'Sto]0eʔ޾}{k-;q2eNEQFixWn`ĤĤ[;'Y<̝%َ8O`̣"EBme夤VdXc.PţlNabMiS(ȧZyo]%We Y^%(?ۆU$5? @NWJE+*9(OEeYI1 <([9ŋ%KԺsX,dԩAӦM믿mڴ㠠{"$$Dꫯ ee㒞y$I`˯/l8 dґӄ170NԱ2uG禿sxɇo1HgGq1x0 #,h 'Д+Rs?@c +oAi8gܹ `0Pxyf84/)x+J?}{Q{l)Y$U+ a*%ϝpHXh&`̓<[0dff -- ,q…!5GbX:~ŰgbF !YSrj*'DP U;v/Yx6n+**8={>Hvv9EQ5 ?9ѿaUc{ѷRR#$2 T+IABh>fo̔4m}5i洜^C>)!\̄/L&#NHBAA>K@)Ezj-Zt`ٮ-[L jj֬ٷw|Ux@f͚գUUbT$@&_|qp 2d``4дa."Dirv _uCoM8"vGC;ofV}#J7ƍxFGB|1EDet:ȲP tEN$TOZGkϘ)DQKΨQ79(FA8j4B8|1eu.[-zꁰe6r1_'5]F(cW>ГrMG!!K7tWRM_]c! Y6 tj A31G~NY 镏?O_2 a NgWT؊>[3P(A~QSm/: ~빯v 7w]\Z!}ھ~O:{_Y?Oy~?!ht'D!>H)YE)MM0<=+.Z 9ƕWA/nj9z}_O7uƘAF̝?1buNt͞0~Mq׷]:w~NjJOM}d5?W?~wiҤI/~:˥/Dž6Pxׄc)z=vl-GUMں?;8iҥb]}ꫯN:fտTr}zcL] c-/JdDFFwd`+/&MQQQ ӕ4sŖvk%o0lx/(lǟm6~S7v~3? . qRiNɌOGJJҾ$=q\(cU 4=hN]Ǖ(Ҟ1kq\u6x~xr!5 a!0(*.FIi}}Q~=v6o"ɓ[uU'W˖{pʃ&UsK^^DETVT`U XQN͛Z&hyՊܶm?bj^kߵkCcǎŲe˰{ndddwŔT*gŊC޽l߾Ǐ?M6-Ν;6͢f{{3dDGG4iҗ{-}||`٠*x QkG}4kĈ~~~=4i:TIQz?YfQZ0pرczQQA;tlb] (}yyy8YH\g6v_ans-(es E/my)6oқՋEIq1(a_`3.♧[ԏ$[\mDc.̛  U FUsg1&\`Fܹs^3ڴiMzWK`/ "7tkӺUҟ NJUOIUoy[BȒ*k322R !y&*ug222^E^^>DQDQI15n/DKQ gmش<,$ {-64jnؒX{xDvgWv`ART\| '$]<ڴi3(44~~~߿?xGAAۇBwAǎaX Mp%tiHGsF@$\{Eu]zD`îHQ#WS4$klb7ƞ&QcbC4ER,tXXAyQAE|~ps93gyg[ތw=|gϞDR5[T˗WWW1_]}_,F+k%iԍnnGK-dI{}U[%fcBXEtt i1V ތEUrCHHNHkȪxa #CC!ٷ绗HW<{yCI[ć^E&&+ dMM&ćn^)!LOxXߥwċ`\.?؎+㍚ 999mi D fHHxHz>rV<~Arrrln]pg[նu5MtSY\Z]}񇩝Xl3[j=njj SSS,^شiBuvvVўCMu^ 4:3I&@ PJ@)0$) ƥ+lUu@?y5uM@ @ff&n޼ \C!88>>>ðaðk.?X7|??f &8 ߇9:J+~W8;;cҤIr jjjl!}%쌯vvv8|0iܸq 9BX|9 @deea͚5ضm… op|ؾ};^79"((tFGEaɈ@TT=%e1|.\Ѯ9n޸UUEe%@iS~#Z.^^ $xWtيFn=ŵSl~Jm\ڳg= |N@ŒM07!q L'!yX[5|>tx=K;8;l1`okDoUUPsFŰll~>JEa r Аp1'o{ !>1)H$ݻwGbb"$ Ǝ8::? O?!00-̠Glaa|@W\Iѭ[7ùs#|k.UYYiZ凄񂃃777t̘16mdٳgP(Gzz::t耘ĀeY?~]vB!(Xr%d2VZjرlH\]]yAVC("229Sbb"LSN2ew̙3o7m4hiiaŘ??B { bJ*ȑsӧ+ګhlb2+0fWRYo711Y;dŻj~=<'''M4ћ}Qc߅2Մ_渗sn5%0ׁR͙I +t Zڭhd,>22$#._ /G0z`bizDuՈ밲hiNyl0 x, laok ӐhĠmGV9^{JFfr l{3 #oDee+Vv~kf ssμyjIM;01(M IDATJQ>ό>KHohT;{9۩a4(}}$a-"@2PM$G:pvrV׷w]J5BDDD6l@nn.fΜ qFXYYٳg >[{ bbbHtt4 OGG'OD޽QVVh"F?=z.&9t~WRUUΝ;>ӧO7]d ݻݻ#99˲?>\\\>} ??/^3dlݺbc-ϣ@DGG-#r9<<.];twԩҴuMdɒÆ 8pZZZFo7kV'~糭FZ-GaM1}0= A#ގZhE43&:u7;%#;# ᢯?+0% km1Xu)R)QYY݊I 5ǁFKݽe'2PU]| mm-kZ+cnj+JCejl-:8( b[3!eȿ%^kdqΦ+ UUUt ~񚂂B?_JgPKM(,,##c`fff}E#gSJ;(aD)0w,Ã΀ҒaF@j(:,Y""#o*>2&ؿmg"(RVǤ'Aq 磴 HSNLL 3gk׮Ŕ)S JrJlذzСC#)) eee-kPZZv޽ <<|Zdd7rww+W0p@L4 yyy8vo]]]oTVV"22}yF~۷1h ; |[o͛7Mܹs[!Jg[QyiQ{Q sSG>Ӝ2SM"9r$9H::;돼g٫;.^ MMXutŗ2g]MSS@BX`˙H TZ ᡹9+ Nj s J)PU]\PPBtrskjJuvNAxr33S_s0}1(0">EBȿ:{uR6F}sw֦nQeKqIJ $q o&Zv,!@um5:wI)Oq#P"&N9cAP]i'&N}+BT~y`]흩C  w7cb p/lh61&:UTVN85ʫhԍ5^^߇_dHétC@!)~;>l{VVVee'ߥY ڵk㬭?Znݱ ~~~@ @yy9b1(D"U?"//Xz5z=iaa]yt͚5ƻw^y,u֡wƋ>aYqOܾ}  -- vvv(**B^PXXdDze˰|rjJ[[ۣ~iU0zhX/^?PL<ŸsǏȑ#Xz5emm666HW^[j]| 6$lܸk+Jrڵ+WLXr%ټysxonnnnjjbi+ RmMtW^PX z,LP,KFFvTJ9jP$# j 2V-ʫj!W*cy`L% yy03La))@iz(C)G5G "$ՃFNpvtX,FQM(X?dmd;k6;ky }ͼghݛu#GiBvFj&?J3 k!szqqɏym'c˝t~T,uQvj2UjZO& g?Zh󄣜Y 7H1 X~5z7ב)Ǯ=w~Gܷ]Uڽ ,{{{xzz%%%x!␘ ::"055EMM ^j5rqM|k7o^pwkc$"R1.\_~󃡡!8UUUB!bccѹsgna2eee󃿿?nܸHŋܹs[n!''cƌ.R)Lb q.x _94dR`Y]CH 9si ªE@ZhI;t@\NwxJy&zb&: &L}&;Eݮ+@`%tWEN"MBWH$sfH:b*b-rjdh@w0<~ÄW'GWW Mt-}dOJ @+*!׃~m_Z 522{8 |,j !"zR JESR<ݵ5n]f>OTPε|=jqJ]Y 24Ě4 E&Z EѢIϛ=JFJ"ӆ􉪰 Xu-, O̝w,8pX,W+W}}>H"DZnқ zBNNq_̝;}Y&SN5/JZhU޵k`aaQ*27n4200ޞRJI{N|yVYYqA*wޅm6888;v,JJJ J1`ܸqgϞE~~>|\ܽ{cƌAHHq1xxM6aYVϜ?](",,Bfem9%,/Mi" I&AGGWƩScĉҥ ǏիWqM>}޽sDΞ=xL0!ӳg233Ʉ ڍW]]駟0l0wAdd$̰vZQp) V>`0zh?~HHHb1:w --ۄL6 >ē'OPVVaÆ4wǎ{+ӧ;li=o&NDiпU=::,v.\5ST :(,6EHp,؛`dZ+B^0[| Iy[Χ^2y~hhTAVsXrm؄;tXuAex`dk%(EW&m yvtæ-[ڻgs ރx075e ] nݾ 87ƶfyS?P*!~ЎS.Ns[r>J U&&P*4%5xV n׮^9Jb[&Ƚ |&$D2tիloK(/+ L1a;K|Tףn ;Np#y\l^^R֜A u;,jTwg{L <~," 1̻2oM>ÇcGMM F?ڰa.\AA(B `РAprz>Ǣf>Oȟv*B$EEEɓ{D"{=|,Zznkk>O?fffE|||xBޘ0a"""ܴtҺ/2dՁh(J|/B"k׮/qI$'zPWWÇ#88{E=w^hii5A3gD>}wi)TUVaܹXr%矣CPT @.ĉͅZĉP(퍔v.]p1߿Ř>}:\\\;y$;Yf())yP5ћ'/B1!UU0Ƴ0׵Z-\Z "*gHSujVipyքd |<}x<<{ u22,**c䭗vVM ˖.z*0hyiCr}gHJmX1 ;~8(U*?n*7C.^+y<޺7M"x^Mt@@&4~Ϗ;x< ?fֹW7R,mj>{wfjj `S# f={ܕb̘1055E^^FӧO#!! b ȑ pa``L 4hп>CHRAPرcqܹsM,_yg_X?? T( 8z( suuŌ3jx{{15| O;֬YL!.1$Q v[((,t߾J ,?Hk y Vs 035IX?gmش%ӳgRR;z^V+bhh_]U=iDoJ:*((@UU`ddӧO_~x.\Nj TTTׯ-[422PUU5iʔ)_tt4bcc! ?ݼy066iY4zɓ'nɈSNӆl[nń зo_ѣGqmٳ޸qhsdBjl 66nnnppp@tt4a``| ˲K|---Uzz:V\;vG}ظq#^L 8i$BSS~ӧ{Lb2)) K.FFFСCzjYkx"MwMX;'SHt˕%F|U9x D"љHXT &M܅k-Ztyٲeh: qS6W\N]E Gv=+{ͰgE^V'Vz}OV[zpN"Fs4JAA45ŰDqq ڤR ._!(U^^M0=="\$Ba"D!jQ2!B%˿www7ݶ3ZX[?W`y<\&~AtO?!֤O!A|=+QYQkt㧟c tD\\mغN8q{9 g2#G~ׯ<+=55 ;-Yd ǣk׮޿522RLm ZhΝ;ܳgϐ"O}9/!5]8%!k[[[ wrʕ[))) RP{*+u+.* 999.^菿UPYm QTlW.zڒϧVC(z[$_Ι0--MGN5kjPXX]UUuRSJ͔Jn/j_@)V*[[|_QJ͕JzΝx!Pc"z IDAT3eTn9 F'L>: .HCMZ]@`뗳_]W[WgRZZn:ZBE9#uuϛ3kD"a?I]v=oLRܹsgBCCI$WEjjj`mmMsN .Q(:u`ii7nLٿ9??&&&><-??ʕ+Wedd=SB7dȐridd䴂AzzzֆP(|i͞=3DVVV]^^L͛ ^ؒrhkkؘ{d]TTľZq:t`)UhLLLrK'5IxH8kB$ urrw0#T o\CHoiH4:f\.~/!0gx,8UHRA L=kO[̝=sk[-5 9gmo' 3:WvY|euΏ ikkmmmWݼkćɖ^o`ڪV#jY`!h!NB"!DD(ҽ BOf 8|>˙~=k ^DKSS<\ۺN(n6usK~ ` ?BVieT"kJmqDGK#6?cHkez)6"@[ǜ_>K3ޝXlѪjg㊩lB|jSo|v]Ș=·~ǏPS],7Tȭr,mDQu :5x8M=-(e!2u+1wy` SW'E~~(NyaY=bRs@@p%}vvvB!J@haa>|B겥/|;42*R)D2 tOs_ޠ)(@9e$#i&m +`ꦨ0on40{`n^xrTЉ7ظ!FIIn_;ָb>폰v;~C#c&|Xަ]'I땛@O B+=Lxr7h79 ]Gp=Œ6 )Bn|#~-돺 xRԕj/kű4c]C>gl=NCG CfU^/_  **EQTj8~xWJHSS3kȑR&>L7BxRJ 0~>z`!MIMJIMqsuk,>&RήDoؚCqfqbS-].ކ&k+Xvj`f*,?w>rf{bCp@M5Bo?F?3|.Gx@|E f.^xT?@k[Ar}=E&׵i?b#0:8r>+Чo{Y< .ή\8󱖕JeK7_^YU5q#h^^ɧrch~4ԋ犘LҜj\}E>­wtL9אո<ğ OPQz>=p2Y\RTR3CMqVA鉙QG R_šDWOSԭ^ oW{J޽ji`/}r_Dl,hFv>X3IYE9x<̃A_V\.a^T@ +?~! fELOyCU*DV...cY6M_0J1[0B,ci~l5.>qFhĥA'ٍ;KqC^u;##@P +rDFH]+) 5Y][i'D܅^j:duWB}z - 1 L(0#JD$ުي/2=fwK;У}Lwazv('/\ZN(-)ǴH{ _Ii%.^O-gAҤ:~X2`eٹZ|@Zûp)hL T*M##-gIP((^In>T+w0ʷS[K%Y }֧氆Pn{v|&C%6V/kEKg 8zH n-La5a?j\͝2hD9cjVw7wvsk BwH*jp/܃\ X{Pޟia_rI*X#/= )^L,BR._OG7OڭhV@kuߵDqAan$b`W'J(GY aan;"*:}Kikk:9Znſ:/:2 >ޮ-04L^nϿZZ~VPR{ifzGTT㸜q otDRW?/Qr `_ݺX/'FMЄ9,!D~$M "pOa bcS W^e4ipשQ6@X}ĉ&Lכ>Q6tua j )B?"݁pTD Ң dB&Tԛ@@Q_paRp{488x /PT7y_XTWTfX[w9y|>S(Žtؑ7n|od!\|y}UUUf~4ܦ?~3݉eyj<XƺS"qdi6N-tUMt2\FF+Lc{{J)R*j_͟ ?L{ "FPdA][?/(C pl7pS@w$R$Om]*j\1= Xc-P)0,Byҵg4l1Ч뱚Z8!3 9 #0D@@X#x18"vܘRr;~v)H%}7qW说ij6+INR4#Q*bϿy4k;88a&2LM)} [vyᨻI5`Ur G"#% i7 As'` CҫK|$_`ނxH޲u{gNQζ(| y"!**[-/sG0pL!_:`7ݷ[߾nQxK\Y5B#Eh@oTۀnMZRIqqiu`x?<}O,to^?I 䟰F 8PXXH_[n!66 ,,X ++;w:If(**"7n[p}̛7?o޼ɦд@G&RӎsxѢE z閔1mڴ햖=Q_jU8 @Ń͊(I)F}J z*YP(T133((hȡUSSJiw¢)!E a>Ѐʪ€TUUKLLVjhh8oe&(*++{TVVnW(/uttG)ظok't&k&>L6NJN1NJN1Oc #BPjXT,chb08av+x[XY0 rr99y(++'bFR la^LfffFFF222|Xznnf!!,@+)R )Flqv >K2=WRHBS"RQOEѫ"6V B/@HH!OGf$u=(9g>sY^ew="rrG@kPZlM&;9 @ .ݧ1҉t D2U"($ H3qĄԤ?/\jn|󕠖 D=0͛#m1X/6Wu!v^g/_UW+Q];̚0la%(H̙~ Þ׹PG/U UMJmsSt7no۶ w&QQQtȑJ.())VEJJ mmmŜ9s}vZ #ȢE)شi.qݺuGѣ~Z4UE 26FUS .VBl}?>g qL>f(Bo2aU { 6 'NBCMa[(B4 豑} )BJ}P(dέ":P*ɱ~ KzHSJg VDl^`61%>_%څQJGhU*7iwjZvgKkV2IѾk6Ϸ* za!dJ(l6G.//JSkD>vi|V';Z-b>*Bn|\2aRCDЫ`Y3_ 0hZ!)zէQ/v˲#V 6+>.:q(va@J)eo V:P x8P`Af)CM(;qc0eXֽ8wl{!&/F BQށҢB;`SѼi3?uZB>m4<[uSt6',I1@BX AMc+v;7m4{Oo<:I)Cŕ-}֧֘1{BlZr׻#̗,t{ USU<} P, ݞq { Y`JjUǧZ2*y؄Ĵ|2@)W\J*{#DddMFn': >t؜pE=qի rJq 3F`mP8H Py@$!8,Rc@!FB8883Lʳ|<=xɇ[A^v\^F 0$nhIIVe\Q* ť CeժtzW4e9D"zgP%9)QJ^xpppD2 SfQ ࡢ `L \mfq0߀P'3<>иa L9>2)oNfD phfD{e==.ܖWѸYjC&cĨِda !_0 EEM* rj=vaKWlϛvpwnN}ʾfV 髾F8*۸%㺶>at4<<>'7G 5/^8sПsx< L&PJIUUɗ_~Co߾ٳ߬_~țoYҗ=|>^6}'y晊Ǐ'رs}qƤ+V>q&NsάcIJJ?#ܵs9@j:5İp-;ORr(R Л &B}-L>=g֭!Bĉ7ZUsȥIII{'Ϛ5]M6UXLO:ELP(V_Rb|ssCC;::vyZťICb9eR6?t=}=O)mD q[|n}hS֙lɰ!i}Dۆk !hX8RB*$0Z `T n6r[}$vнӋݺrdޙF`Ӝ3,u$b;2<]# D,pX R J0|<rlj;ٔvc~u} <_wj[Tْ磃qX)}\PXnYq&7w8t΁uy<89kZd2pMD_d <Ν;g雭ё>sE[Z[O;;\pdf| `$iC ByUyC&;z{™3gXDxxxн{P8պJ)oΜ9/9r'EFFV>~u7z"͛I gϝ/  4Z--*.-wrr.D"Q'&vyzB^X<ƁpB,V/ͷM1b+W\x|46Ӂp776NX0-GfSKC& h ]pӮ9_S|l{[?]<=%z}"B9 x}>\:Rf˜JeL*g΃8(u!H;v@ `4[榦@ݲQ9|~CYL\(ƔQ~4QUDܙv(gO-Ð_#gra05hPB:~^"2<1(;Yr]7оvGQ1_o7\.ԱA)ŎgW]@9~\]P, fv睱|o?盺x~5NU9bLfY!qzvg# 3Tjd`-b-57@qƵx<~ژ@,#,,2x;6o)4M^uu ;!!d /,,, J*\Cq,gWҞ'55 NJ=L V99k1L;牢Ompȉޓ_|QSS;Nt"ܕVZz|(z- .spZ[2?ztagց#f:j+Up O/Ǜ݆Mx 㰐WM}3= k1<2+#k/>ȥ> Jel33' zLRNbpvJmu &u- +|}3!!!7 ***[Pʾ#=uju)F* #2|4!7 1bλ|aBȖwowz*Ḹ zԤiA`)őGSO8q+xHە'?| 3gLwD_a#~~2XHdlҺ a7 #>.ݶs7#đ''OA!mQLۈǏy=XFâV>7-̙H?؅Ց2<06<5mԱ ><Z۹cYrG?2=&>GVm f{%'ikXyOyɷ^or΅\7$>.ᗾނf//'J%O$d2ZlD(6F"b%߷3͉&hc{LFEe%||{^њy#'ƯCxD|6\#?5N)Iy N wٴp}a5/ 9X8^ 1Q^o}]Z'eY'fθnx[gƘ zCضY[4;e2Ȝ5~c<>_eɯoDwOrZLOI|Apά%W+IF >%??iuuu\XX؟3frx|n??A]}?*'u f͚%b3, #W 6K.r;dߢm'ӟa 8X,kk`g?Dkm΁;.^)'d4 R)Bdr9֭[?N& ǎPDMruuχR0'zg8pPB)Mz#׼?#SF'=f oOO ETVUlfq0̐I$j뵘s&:cP*U ı' xzx>^(,*\.U@v}-J475ʕ D}}|QP\͍%M?m]0o]ei{F4778>b^rS3s~Wo9;vgmN?Zo$'d1]8s ;2Ngj81`@QSsCFͣX| }pv%˂e- Gu,j@) Y=0ߒƦEUյ5hlj^$ [nS9mڴ;T`9{„ xhDPM,ϲlJWHNgcb˅Erȱcź.N+Reش@O')djMO8aao.vLќ;,vYf7ٺ<5_!𰯶շsفDzG$?:TY'CR4b}Wی[nk&UUUMuxıc2Yl۸qv&M2qca ?,VN-}Q|3cƌy[(r96lXt.mjT͖9W,*r!n4gGB;Ǐ?EVb +--Fn5u a^$,/ŭH$b%W6hii hɓ'!aD8 !,"#<ƍKߺmm}=7L35>.68B}<5-=(An%bBoЁ! ąꌡC1lX"}oN>>R[^NA @CHPZZY3c)()-hRTiBfK5 .A,BŢ)-+Ç&".v08 2<+x3/$wWߓF@Fxc֜QHҐ `$w:¦.L6Z -\gTig0~9t)ֱi.<ֳހ/ΉԓO~;$!a|xDsLlldJrZV|u~aL_<P644,  4>kƅ;;v˗/+W\'|Ү N>y!/‡<{~vO=c=c0l.~e^jUȉqWr8syU>B%tѳC<tR%Ao~طo_;'zyy9\]]Ν;_'9;Ǝ`MM $V݂ ӹ{̩g4֥Gr2s[N_𽧧Gl Kl E|~܁Cƥ>h|Ή8t:c""a/GEE W\iL:..СI8y4!@ 3̛;r 9u10];0xp4Z[Z?ah?" <﶑é^'EETթ=}]颒 B "PTX\2ޜo/+lj=fb_ߗ |鯏/ĕg@|?4pk_4Կ$uPQ}R*5kLrFgЖf?n4r"*y m]&\ u ZWuHNNPSSC  ڊ{NT*޿#k֬ }'{WՙJ>@T>ڵk#}r+* E1>}ӧۑ#GN?coo۶4b J;:KCTDokNAQIp: \X3a^N'/`t- ^W !'onJoooxyyђy3twwΉ)bb?m3ٗ2dݤ#.tQkNJT*UOOsS(H*_}Q.uxBX0(zyy.={{!/sX'{2 GG8ȯ1Jd?Z !XX<2_}Gl OO/Ng~G]۸*sK899!':/fN?m8fKC?ӿرcWSYCyoe]N\'ݕԢþʎaCQN ǰAP(+(Fަ n_R8 .V!̤cM):N1z4ƍvNt@⨏ϿR<)))HKKkD7 $&& 6NW_}6m7o^Z{oڴ#Fڲeu]#^ZSJiXiMϪg$Je~>L938HEsBxOsG."|A)߯ 5u{| }>^ T/HV D>O"##={V O|նں}=51G.g?A=ZXXtmwRJ|>|AiWvr% XRBMJxj%T\:R^ܼYӦNjg#c9^1}*k`6[8j O^]Pӧ.N(+@?SM&}" FBh4Z _lMz zSwKI٪z1[TֲA ̅2B!Q;yyR jfȜ żGzv9i2v`y6i'dY-m@STy^;p%>#G{/h4" EEEw '''pf~s.]œ9sYsDNʁ9|8X7Sdh\C4!dEMMͤ=111zpN~**38zgaa;TY@u:9})cvoqMŤĄ7(b4ȩ̟?bюryr΅]U^oχdRT*nv Blf!a2 #!-1#1[V9a=Nt䨮EÅ,˪SpHc3x& r{0i„/_fϊj 39t~{!vFXڃiZ>Ke&ÕC:~Q/_;{Dohhjk5ͷQJi{N"o0nFNB# FԵQFrL[RTC IDATuDD/0L @ïeϟ OOOt:L&-!dȑ#pvvƾ}VUWWxGDDȉ>e*s}g꾌w\0'Ν_8uʤ{ ܾc穄C~D$폹{|=r 2F5477hlol4,AR!X"Fw^8q4\\\`gK 0b,pֲ>Pku !?׬o˓2(С /=]\v'T]%ʮ4%MslDWulIz{ucp4][ . \Jȉ0 b1, ٻwD֛oY>Z9L&0 $ f39pDpwVXaϜV㏟nܸqIII /C=4sÆ =qBq\.߮sl^8ռP5r prdfAL5,QQ8x{]{Rjj-}Ȑ!8ytʔ)O$O><77}D`Ǐ`iKCIi̻ Y3goF O>'OfPTCsq8|`w=l {)...`Y#TT|E Cv@*ApF4Do !9 xm~;M @{\I2c\KA0P3ݷ}R\VeU۪|leiVO!Gu]iOhѱE~TQ^;|0̘1{Nta@X,`={ q;888j̙7̉n;v ':H!D$_nkx;F"/_ln+X \nD4L^媳99O<򐪿?x_|'uR*gσ"0 CcQRZ//4x{CѠ|()-((*qiy<- F7Zͭ#GO '7ӧ Ca6PQYА ?y  /6ֲEWM:|Ng˪ݿhk328nۃ#L4; ".G5.0^V!^oan=ZQQQ0`A" 11Ug}Ŋ~)?K$~R*̉rʽ6N_~/g|駇'$$LxѣΝ;۝TRVolH,g:.ry ZQ__ c`m2R[dIyXX/2ͥnGb-149###;ʉ~}LTXT6ϚgdNp$ Àp0[LT566BRl8([U0ju,f !`2`aึg qqEKK+ .`x Ny tXX].J5|b *+*W9'>d灳fM^5z"'<-'=-pjNuCzqѼ~8p[<ߎt<ޚ>x6Ntzk`Ȑ!VZ!dW}{Nom,=hkkr#8~x'?pQ"$q.(%^EeK \\梀@kB ^vG}p7A~55D(Rz}n2~\m&хLҟ̚R_o^VePEdDx<Ge2(U*k9"4VIV իDX-`)?oo-fT\ ?TUUuNg7m=.xF766Puxl۶_sݴeGk“Dڪ COd7/d^m}A:sbtܹi!ot>32[Z[iPP&M/qz܌sw8JAP(@c(k < }沿PTB_9myti(..D*PPTHRD"8Z`h:8:8@֢ >8q4Xi|xDD7rrr g'gh0 (&3(%Bh#$8a{{?l;jnnII=xZ佮21=LX$<1 $8t"W8|M@۹nBS}7]|nov=o讑j?8_2, 9FacC$^gęNNI`9E<sꑑҜWQjW)hs4Ͽ e- X,BIi9Ha\\\??ա MpuuExX(|A,yr & TJUaV<رpss9?|% @Y 'CQ̟5&baz#mqeqSߍ.;'oTgOdjW0X,<+ qw@ g4LkN^x;R&!"tGE ĜkEM]({-{NWZO" PH"h mLf#mH qa- NN>Gng]}} GPگe"@87Sea٭>}z;x7z8׼ۧg+*oPh Tbxp˦N[9rOJ[p]]nRng>\ 8Iv @0 #H^RI$ zJ9N"cBuZO R-<|\kXfbo`;2(``CPBw+߯Iwn .B!_D"%u-:|śrgZ 5fnms3loFH78RJJrRTE>=N J?{2$3$,[/4}F?ض l,qo:C[yN@0zv]mxQ49eTT5`4A3"4k)(:tlІ&xV@uKnq#E运@r7!d\!%U `+!d8˲w_daOT{tȔRJ%v'f"{V6hka}oc[j$ևeU`afu5B{Yn |IS V0? xšo?|T* Dl>2:f GAGsfط#9j3k7d> ümLXq j] 4k3$BF=eå DNY])1O״@iwʼn~3H$PJwz;fT*ָ_WWR24)T<o/ ʼnƽ)sR[/mxeiֿg[?dTSH:=ppvv-ۿ,x,y=8 @h[<{9Iw;U}MZ}WΛ>f0B1ֶ>Xq^{o!O:\&R;O͚9\}#>8\'00vX @l/s'Ъ+雀{;c`o5dc\R1f8Wa7^y^{(ߕx O.gfJiw |X/5@7j !!NÓ.?g}XIW9YK^֕-?ڝUfE[uZ; m9:%<[(-}]Ճ.ůPyD&QBrv~@$-WO~A T.`ñcqyy6&+QJ¶ ߅'ҵuAM=Ke=ElR6NÇgx< 0 ͛_|W~><PȮXbY@`/ e]G֭[?uWk/^|'̧{<#FvΏGv3Y!dRo=*6pnh4D '!ЛXl9V i]4}k3υ*UV봶-%W9:x}17/.6&z6}gCVl':2X}tTd_C ln F9^Ye5<Q6YL{i;:תlUZf.\80щoEZZvNOII\﹎-E]u+ϯz JRSW?iڑ}_AtϏF=u~Bץnl 'm'k^=SAa$hJݪ<^=rHVO葑N ͵e݃&CAku׀Ο;ZϽst:7w&QQQtȑJmskZ@TsZ {-ʧbӦM^M}ٻqqq#FtI,cљ,&CBXX߶Q-bDkGT4BXMzꩧ<d" A6 ZW`tKۗO}Đ%f9ZRs:uvq?r\B)\.gD"aKo2~\r+:%:!/̦ԋ/̹kVi*mWwfj,߬? +Xй ^-({>LUYn̚7:& mB7ͺ i/aY $2g0"1DҮ`0:9;nn3Hr([OFۏ1ڷ^QQQ tωPvh4jF(Nپ IH(^c\poq{Ǹq*:0EB J[ݕV]5c:#ٝ93;symzFBAɉ.S̝: FMM-dIl^}yoVUU͸/d2YSw2pDzO?CR8q¸tQ0Jhkp,SeMC:z}oxd'.yz и 8yA#,t=ZBIiݟ6\xͼ=90 'zῳ=I' &hwƏռ!"[]{kwZ~/u{?}=HRKyDGNN&O:z8ёI&ڜ7|q<ԩS7T*+HsљRj((ڌ2,Z0 {!J(AqP>[|d옑NphANZjck}Sd6>䋣ʆ Nq5x>>>@KΝo-3!|ʀ%ZfKeKݙy1\s \qK$qS9'y*ƣs|Uc#> {e$4{\rpXZKlہ?-bsť8EQIinmoehl1gYð}?Ğ;Hmo4mF^=9p'r0rd 'y_/<'Ntgxvv6XW~~[W‰."!qsktq5B\._@$n_0B( Zoie3X $?_2y9~p DZ\N"Ih`!C㓴ZmuTv~Uu59dlo/;zdMΜ-9Iwyw]묳P9V8D asqL9jcs v|au9Pp\2Lϯ P[^zKHOOx0f@CƜ#VmߨJ;aFةBཅMs]o \hyOě>BH8ѕJ%z=SO=u;l8ѝc=?AU8.))iLw8 D-~I<3G6ljl7i6ZDTכ aŁ~5ay _/,t2]WM\;o~ͺq:J)%&iמh'YV:lA.y0;3Dx'!MɈ-SN䳯^<#lE o瞈cȩr59)H<x+y7NSЁֶxh4ϟG%<뮻FL{x\nJ0P(xTv5 j}?45~5_Y`޾ .: A3vg2nFAT"<@ ¸1B=x!q._qB^B-竷qꤔ)7uL8QIHH`>ho6cW_={"yWu5Օb{G+pvOׯq[syfWy Aȋ/bŊ̢'=:CE²3/O ${e> ,KolJkVH2T ~ZlVc$_JiwH8#0;wݟJ&`$t=z *8 93a_xaO2c|)f*(<||u]{^A`ȓ1Ob}(eWʉV*J>_dYBB_pBD뮗xN"js 8帮+2Unwl6|Q m("$Uښ+ SL];W!9eUtǓaYiXEz|蜫T*]u:u*Bw{N^gU@KW?2O\$/!(WntCxI O3qwi'(H ~| CO/uFfΙ3s2Gbmi>4eR/Rxc 4a@ ⨑='wB+Zn?{EH~MU0AlP ǦXtC|l]`4lj&ŧϮR*V- "SYlԒޜg]jJr+mwj !KowĽ}.۳|cf?ex"sa':ލ_OVz!e""$Uoc~ֈ7SE'tz>P5s7{ ]{a['z;}J}ڨvAĉo`jnY-VҎ=70*8ѽJ`"?j2ۑӸn(ʪz >䋣/VJd2}rNdѾ*u: QJn%ͣ'Gj/=f/d펼?hQ)TWV:PSQƤ'n:pu;>5|ѲuJwt>w5Tύ~/ȯ%tv]x-,*ĔyL_+J)F!ȄaXRŋS33.^l04'K+24>;oD3~CmؘauDwnKqӀ\.z ]in^\s>W 8>߆qoB7s_}nNv hSѲqg\S~AHK_U66] Xy;nn΄Lx8ۣwճ>B) zj.Fz "yN_}fVV:uɉ "OO /fA3 dGWE },6MQ9{+CC [ZZn늫+M!BZmk֍f9ƍ1(..Z _|տ--sՅ7mP`bq *uP Cܽ; {oJG,/o8FN{qjZg:] Ν;NBJ$OIb"N8{5>~k3|ao3t:U@LНZrRp_dǼvʉr xQF]':hƂ?11ngYq_0c`]N4J~a/NN /LHpCy͎'αK|5?ko\jS7?tliSL׆MًV>( #GoT(<%ع֬I_oX7O<cqtvZbe$/:(/p Nf<R_}U:sOh*͈\#Jq=@̍&yUSb9XUU lKfեQ8σ=ttʉ^UUX}Be;7XS;rrw2LNa3̛B}G#y<? zZ5յPk݊滄QOY,VJ|jMu.<}ۢqyH?͘8~Ł751}jmwjT*K))IOvܤV룣R~ٰ?r-D|SUk;=g'9kq6;tr{ w'ЉHXqif9%*ehY4cbg"Uu (0 ߒPvM2Mz5]\1)ԌDKuy-#~]}pUۯo˧k2ҚqDQ/ĕ8deea$''W5r,"336lhDX,$11/y~cb[ogŷ~믯U駟ѣG_z:$_xq.q[I?-Vي9cFZiDW(X`?Z J.+Պ@\&SL1,U`X$bM}  -=YX3>>nEEEsAS3 PJ q9>nrs<*8F veK*>sfpe#D*,xEqx 4ñ}/ j\0/-w^7=-З_Rrm,-&? @ 2 eM HkgꜺvq7ӂųxmD"kn?W^8`:sz'-.OUٳz!=DZ]Bz‰.bgnɥKa*?Sf9\$}CI5'?Q!B^gfll}ڎ<%9qɱE##Zxx`qdℱs&#@i饿%3Mlj2dkqX\2N#.x PEpq_=~}!,Bظ=o@+5^^t99A;áĠtvBo4%ޤS*@_m,-,*2*p8R˺sڔ5P4eQr|#c{Bk`~UQ{ȰZC{(sñD[ˎW_99ϡ:v('4 <&a>^p0L)ꮽ/[{ mn:29O/3zԐHåq@%䏿ܩPLdfv;dw:ut<=-#xϓMJÉ>d ++K+@eD߻w/233 qշ~h)':\~ʕKگt/]I5' ?c2.nh1iRhP/~>J[t1dHҶ(qI(ȑcaOXt:SXxcC_zDZoz#f?Ѩ{-rf V;;^wilulφ}o#_i^vx<Ĺ`笛CƎ݁FgV*Dﯨ;izgnڒ{qѴ1Vo=7pHfjR?xv..a "%Gq%Yҵz y]NԔlټq\kҝhw8Sey,\0Lqo8{uDVgJ 4t8.F@DjTWWbŤijw|Q:pu/ST{{RQd0\prn;S=lnţrϑ`uTb~^!@ Jo!3qe߱nϝd/4"&([nȈ؇.ນc}UA}.#nnvW&ɥv̅nr78322Z]VVVw_Zo8{:fBM ɣ,#(&_FjZ$q)Y[fd̆셵 mƱ͢mm͓mgE?;G:\WX wjt#qFDJ۷;eˏ'f1Cf\^cO93[<ǡ饍9GVuۨa_5k%.w4MMMJ'~FNtFJC)Kd0 ϳ4 "4%$q q"g]W?m|ꌃ]f̼}8\6kv= @`BeL)8qFzBsHؘplޞƜ#/wۨoKb,Lz<&8](tIцjȬ oDo4Fq*'kAKhm k8"m=T$@/u"8 S큽P2씦6m\YV<& c%69É;P_dKt/}.9)ɒ2"e[s2P0(aQ:b'oH$IKJJ a6BaO]ʎL#CZA^cDZ)eY)!!A&}h7<[2GEro&lĒАbuMZƺiϱ4$:L?7+^op'z'Y~qjBw>O~rM|SoL\g!ҍ<5 ZC9/~ ܀ k{++2W1!iW(0DөTV5|1w`< P^˹8<{Fܛ[]T(xd_^sgy ٔ2(Z)=Se:v]M˦%I@;e~n[:=9zd>M(ߊo)!Däg$>VdyBs .w_>k..uE yb')TyWIhɚ Fa=GĘR*DI+W|s8{%ODe%pۇONBaΓx)&bKӕ'?lٺ=fsfT^-۶PJՎv' 9EAAU &8jv\S}5HH B綗=>Z1,$8f= 4j32 KXzx“ޕA#G'S%BfY:}<_ )o><@RD M"9U GJ1О *H,H~; Wr6e/NIIzBغmӦf2PJA Z<c#m(6I){vo* A IDATEML*EHfJP'Hط 4 |8Vں+)8L0 k̨q*DP.=ٮ)b=4a:R,,bHP|H" l~1H~39s$h?nxDuO9%4Hyt`q 2'/7x ]?7cGBK ~m0=g}QVσҪϵ,g퉨 ω/G.Y~cXʉOޕYZZ M|.L) z3j]F/ Ϗ# #8/ʟ=o^FFFzqii+uZ-iXr:;eU fh<PVۂ _ DlPVo2 \ ǖP0JF .k 8e  %6$p| Rme"4 :,WS_&R@LdD.+ #qꅓ7S4Kb^L}|H]}%8=1(o!ISS$,YM>78]EG =u:" BlL8.gfk 0Ii)h1P5&nGA,ǣ gK liT]kgNM_? "˟aæ," QtJk\#^yz;o'kFW9w/z"=D饗.z:Y9ccc}t4gãq܌@7Y"١ RPfQA4|+VYA``ZYBxcbbը,s~o?ь1LHMKKϿ ;ͩ/#GD-'? K9 ( շW(# nWݸlj@S/tmPr$'Tma!/<<-#T߸vRFFQUή ͷIk'!:ANcP@?`ܸPX(.;M.hn%m-Pj=񁡲lMdJb'jէ_jj~.yR*~b}T} q!0.[@1zTs? KLĀ j>G h^llGph?zq`ߡm?TR|7sbC2 2m4*. V ]GPytgh{9sK<~NN{ÇuɃG*an1CBY?V#0Gd$>$ Hť+((btHV}jX_((Z^N,j[å31B +4 ƪSxF"ц3*['ʂ KP;%?7ҙg1C-8QpYӧ|@=h.9 50v|OctHd[~l5 ZIe" 0`lsaB%>4n\S+n! ط~{49NwCM_{roHкn{"ޗ(k;v9 zÉ裏0C޳w?|ʸq㐛Hw9|O322Nr-w'J4ͅ@KEJP{GbA]}ΜZ%N3`o`4FWW- Hk֬yoҤI7`&222cƌA*]FQߢkum۾SwuC ZjB)VO`KcJJ~eSeX`7}s6 -6r*{IHe85V7}3O7,X5Kqk+B2c2+f `XN,%ץ/y=}佛4;h헂ԛ!@.!v-3=6 !$Ϡf"p4 Yz n^8 q?*/~v&H&c R+ˆ#Cq}7)z|;\ذ|֙- &fIq$KB:Q|v{7sݛ<Ӌ]#C$X@kGKuu k#6Nt ڵ {Enn.}Qţ>$22+bf3дy ͹s޽{E^^yG;44+ЄA楥l6srrw}KG=%{"""V?vR+2z*$4G1DiPpxJ%s)>=i8&**jimm =<܂ӕ`\jXBpuT@]l8L;}$<}-jm,uf.|2 [ Jlu "ݣxU1:FD;¦7֢DE?,Η&\a/>t lЩx'% DB$CsRĄuБ4݄0ߐ=ƹEecvemdJ)\xGowTODu ?'ҭypɲJ(EvNsw}88Z9M&ʉi&2d:f̘W5tw -ʉn4VNl@y'NMK{188(o sQG?~v||-eBq,af(HjlMXSu_̱(3ɐ%e.՘J]pм$>}:@i#%HWBvH^ ]Iy /J?oDZ|j K:gΖWD\o:&̼gĹ-ѿw1Nx>B3|"! r?4)``Qu,ZBd {KϦքzS5,Vf F B* !2Q|CcP]gil2Be*Kk@lPk(Uh޺ ŠMMFh[zb!LjHOr(^W*ߤ\kx/+λNDQ/_~̙3?fBnpQ+V~䦯W?dUUޣGxo-uPD?gh)*ja288wmExKf"ޟũ(EE*vUa4}`@DD.\y~[T?8a\蜝P FC]3cY*k2ы'M|ۧϜ]u?-;9CEE&(JePblp&3 ɗ 5Z(ΑM(z=xo\Pb_CX5ga,k^$YDh+! 7>(~}uwϸǫC⛌6Ds JQ`@aIH W JDC!y'ζ7y%>8;PA,x?&PHAUŢ Y4Ne߾tvxeV=^Y m!Ń;0()NOwjg;OLx~a!ͅۓ o* c`m"A?4Ǝ#'[=-m< pX,]';Axz.Z"RE?"B-(( TMNtTUU-zBIaa! Eo9\NVcNNIa8|z>>@KΝo-3!|ʀ%ZfKeK! JZA@h!(XMeJ^Z a9 πU, -Z.7&TsM)z%a9cVhl& SBU!CU 6AL)|J`Ľ9G}CXLM@Qs-a🹂i46TZA<3faE#()CuuM,!cQ{e0 @B.QXdBȏ'xO˅/qƷpu00Ae̞V&:_xU8 k.I nILI8BDWRy5t!z@0.3rpm$/ED8z(DQ$MNtpGB$`z…{ke=Z#HF~&!*?)a u h>Z`2fba` ϟ'=_Pҗq}WXXUii (IR /Y:x07ewgVUWG<>Gsﳲ&}-dh3~h5!PV) GJ|g Q VN̓)!D:%xYWNQ@!TحHЩ*U*a$ h0ZU+Qqԫs`41Cߍ[%sDcRA-AzӱbWMDqhD^0hCBFX pJ8 A)cU,\-8o ,8N;-|#0b\|Ell,Rٺ[(_qb4;>|80lذV}P*ؿ?Q(ƟSoIb1@A1 xЇx'NYܤhFA@a)TY(x灸=RRZ3Κwy[k֍?SJ)1L$?Mdo/G;baC 1 }%7< x, *SPل砨Ik6J)F5ԙCp뙾R(J!4[a7Cd(`3h`1aXPIT7eKs`/Y L)V6mM-Jp ,STA ;}8ڭ[BNmYQ#2x 5!8CF r̵h{,w T\:wRVcTkXQ0tԀUBF@xẤPtOX0oƨmyÆ%&<ٳgX aԿ-(b]0%#fϞy]bb2[={"=xlt19 /}Zﷃ'  :[Di ORӌe&@-b|X(9LLY$NUi`?u0[!gG@)eqE5 ?|ȣVȲܼ͞5cfZlݾ#34+-?V tZJYĮag~/}2(TVT.eo9B`֤34TU d^F@]nD?wDE3H6B3 .F`fllr`&&ܛiamlE} F~2#׌5H\(mDeS</M$IH0:wFagO05~_zpRH'j!թ3}V+=M#&\.2 (bt$FTl8FϿ1 `!i1(m;x$̛9:qo)j_V?g{|uv5E-|]{ n=b2[qxDfMp<W{Od2ږOyx ''$uDWȘ4  BLL  x <أ"" /3 _~%D*8p O+++{'d2G%3 6 5 þj 2L|Tr/'N 0$ׇ?mӦu42'g<~}9&$'%`1JU~0`"ʞoSWsHz3q-4MW KGPXDܚKy I-^ iF30 جvp TMY|$!445fg5!Jn&{}vgb]9Vg@?DcC3hM0[j)\ 6e@'n9PSv|gK[˕hcnl22H'Mj(E%E}ID#qrG8tGvlx[_ _e[|3t0 /? ){[.N2ﳯ^<#lE o瞈:(H<ꉸw iq?u O WGL(ea(T,V7j_A^i=j.jy6_ӧV\-6fGs͘>}7 JT+1az{_wLcj0X3g? nZ65s`}CnibzoQ 99|+BR`֋BB쾡dw*Q]W6xSŮ{~0da .8GoGWP ܊O^32}GFo6.Ij1Ы|0Ŀ N!i`iۛ 8_\/۪";CܫgO0uRE6ʔkjh%-f\ o>u(mi[螧~{n޵{sss;Nt;'(G{mYbE`xjsjv/D^͘l|,RZ &~Q睼gAmқcS2L7.ˊE܋aXrf;θ+gH(pg&O>u7,RZ}dkWJ?8E2摒^Nxt_uznFMRDق8+/"!n4Ql,w?)LLӪT&Jvkvz_9{DϪW^8ѻe/jd%d (5)uIi@OOk=vbD'M(п, 4@>11jxUmC!%Jl9h reVm7YSԕ%gp,cyn]c eU P%X+dXpxEzW3 y lj*BXzr@8qCOؘo^Ú IDAT}aniF-W8?<Bjc ׺9~u=I+e?l*b   󎯪oz{MޤP7m,`Cѱ`Gł:3cAEDAk@!v~HhBPǙ}\|$s9kUb/J1%> P O;XQ3*v>2|hQgvAYU-ViݢiZ)r圳KNkYdM*@yRr7_jZڰXG3mS}+913[-˂YVAB0q - ~@ΟD",{_'Hk,F]@NQؒl/<-@ lН ѡQ TFúK 8b1JUb`K;pWڳ/r@7\QǟjUV6Vҫ K\l.w&:1Ռ>1EQoN%a}ߨ,-3xx3JJAPBc9]PlcZ7ݓ]Rkn^;e7ijr.{D'!t9U]lWakS\S8fk f"W/wޓ3G`(JAP/m%ȩ0)b_D8V~b%*yjUí6Cnm V45t:έ|3& e`5TZl%T#g0!J6e7W';`Θ\f `,|ҠI :(EvK|".qQ>,,19IԸNR .K/̰ Dv 0)Iu[oQ%%{Bee֤N[lI^i=)]`D:^d8Rz̆ґf:.Wd繐}|Ak@wb&zζe :8wGUҁiS QH,Lt7HՆew.߲n=LQ*M/7]7}c⃖%)ƯO`y94y46hYr[S={H߂aF]_3;{F&B2FD?@5(vAFrN"Eh_,[⊧yqXr%6mԣ ~^{#'ptIvn^񂜛F㶂)#IJ!̇mn?@w^ mN0h 5Rd!j9Ӗcm24M6^}B-ym?xi{sg[hLW_~mr 5 lsº's8l/;FclEՎhqƷH!;n}ઁZ>뒑 x&~]Jf a7boq/K9Hn*G|74 .3 T'mi2-Q5JR{b1!I[FHͬBDA|[1jr##nM46 Y}v#@M=_}ߔ*B(99>ZtA6YGj:B9vna;T7 _S*ؔdj:!8-"eĮ@/TY!o\y[fOnYZ/w{;ZPnu "70E&mH ̠LɘǷKX3 ]S@a2~HbhoxӾƷ^\63e[,"eS3+Ju,N$3BQBh묄ːfF]"hh]< FX2lhMRA@+4EoJ7rUE{ě!}Ȁ;2:.k` ):m+Za$` ՐӯC*s¯c_p`6Pdf7_Rʼ7KC>3,Fq jf 8 ;R\AqCO{㲢 7CF4rKڞ)7 9W\pc؍9Y #m?@w9K?!}oVNNK"BC;}J)wp@ܹs 2$p}_1cLZlC}.//ϝ>U{Sܚ+-ʃ Љ:/x ESMM3نU˞,8%R,:ę|CюzOu:Q(OZr5"Hgjm]౵uTe4<<ٜ+~$i]J'm2X5Oa< Y"$/WEMl(w:Uף8pǔ̩~W} F,cP'TUYbN(X`2&jNLDPBTQ쏁3 < CDdFW j Ґ<؁` Vga9"B;1'|h`I{PGJtJtر@9?CDR^?ij͵ =2K>\ ő`Lj6)lO14`"5N,#20>Po+nr% *힇(Q9 {%R'OSs mI_uh0*A vmOζCfi~RC44VM|k.Hd$U}ԙ#N QZh ihjji3i7ޛ.6TӅ yV *HbZ8Q,L&ƴlc{3.|-i5fBidRgg4?<; "v3 W'yxչ ЖY_wn8 K@?vWX=.d%rC"odd/ )@<#2cƂÇO-,*r<_ii ̝;7xc=)))Rb{fs={={UVfk=7? ,}z7 ܞ!=on(Li P5 pb Ƣ{nnnڽ@\|{8 lC?]@P,&+'̼_ǯcxu:M\#4H Zg|d7MXwmOuB5 AU%l2`Bx#!-]퓆 NF^rx *MFm\]cI>}6lGn!"X"$M"$Ğ^59mg6 #\ T9敫66|C(Z;H D0Tp̞ՠ#{L,u*#.R x5FPCh a(8:0XAHz?ETjеQ)bAsgn 41蕡 6YE=+΂T b&wBZ0IDcicBZ|۸m;7}I0vmن4h-cv[ =+޿  $%9GC c8P, r2$mVqCG뀧L(7jqU Q埩>9&#rTԻ3@ㄅCLh4RYY A1{l!ꫯnysM;E=gWVVys=| 믿‹/N"B1|8YfM .-++[ w+W\<'* ]4Pz_E\S`6Yfc1X"l3J8 <kȦҼ=:hsА6a6"QMy LAth-ÜkXɼÚ - !6BLg| h-Ew?10ω4+Y;MbmN&k(4,D 1 ")@ h;DdРA499DOuv3악詗76㭠 \Q{֣w\w1{*'N:4EV#oסCC+{/1eF+y71S"EY3k,\eFTa8]NR0a("J:1duƈ @'13"qZH AyAuck2mJpebɦ!0lW*!uMo.'4R>M;cWA:z#̤X8[B]h65_*nCbKkJ)r(noyFSnMNJjEqq"2U6 "ࣀtE!=B Bhһ^,AT+J裉:L A2QHRetcBveXC[G7<{mfކh! C7AStm ta[y%aHU䳻{۱jC38#-Q&-UajUFvv`sTN98B ݿ+LRS#zȚA Y?f=zMMSf'v}Ky2! $ 釙p8KA-[E}bfAe֞[?x#r (ro¾Á]^vF]cd (:I yqlRڨV۝ mU]ȓ+f;T\JӔVYV@=5di?B0l2- 4ڵӠ,x`GQ%Y&NIC3cn#$u|@L=Y=0xlnS~`@1 4<LB 6^=m3w4E_*8E:5nYtжTkW O=K>ރaCSĵWSl0 @^qSTk 8 RHM1fL&{|%vM-ιnT/pQ NuY֑F:([QB!v8ش ]WABbq k*(ա8( *; 6vTJaPhQM֠P:`-ROXҍ^=lFX!@DR!1j#y\TW ?'C6ޘ&zԗuN™OLoQmck_43Uwv/xj09EVQ`D΢PPqRtMQ8&p͛.{u5*_:Ҫ_FVXt2Wځ: 3ΝA荅P@6\4@N;;$yRfGI !veL9].MHYbCZ `2cPYGXcxuXXIN s: mi$ъ}?I`&yMJ:V|YJkՖfPٞNLTMwiK6/P`~wt<V&׍PkzTvدT5e{)XuBbwGRDq P| uF<|h-paHATavy'XoKH;)>)Рް%'ǁ{ڑa/"Nl &NRЯӨԻG*(k"$hOo hh>1Ѹ6؝i _r0:V fj Cj\kj w_58~?'R̶=!mq$;LEc˥1)@K:mFy^܆=i7m;[SB B 2CDMD]pngo )70FaCUm !nN\?aJE; Ug3g`´3pp_| Pf8D?GwoGꄛJ 2rD4` wDt'o؃m{ͤVQPO*S+bL0\. 4}O:IZ-[5V|a,Dȳxr0CL$8(`SDvvݚ.j}A`smwZ@ETqK 4XKm6eDЮHx/T1Vvid5F7.Mf -\#ɕuTI_أ*Pa25uG_WYgTTkkn ^߈\b XO zhHtX46No W^1K>ރ f>+{6}OYw4ED 4ꅆ(tc ,CkVs#nD=TEm `| R'ۦ+k?N_Ww6T@_GI Z_@AtˀWg_瞻'&pDвO)OQffA2vl# lKL|3o#Dlë?SB~j-uҔE&:{1 bVe`|I"]A*LsAIh1sT,L TYaj#R>TXbz)5 alC/qd[.b q}.pޓ*hOG%i(JPkTcOvlTڞS^CD>bkpL;K:>8sq,N&˚iLuk!Zma㋤AR"hǎ5&DbXpA[k,CpT|"yU-"X%Κ= !8.L|VeEtܾZXetpJ [=07:!u~C$u|@krgh2(Nv 5&C";B)'[҆"p2R9$U IDKFi.D|>w>wD9$g=s"_J)bRg8Amv Tf=2S.B2D.ƶ#ݽXg>7D!=9SkLtR]؞\+OE%@ agFϘgsS> !IBd3gö},kP1o9_ PX0V00!b7kNh`b, |!_yQn jn[vH$?%$! ju Q9`܏9NA ![~ G$9: gQBrVFt _ ׇgL~CPB_Yk$b.Kh?ZoLtttN{XPLsSJ#™bG-o둉ޓy>gnz:yv| #/# w%Ʊ+#7Z ʫ0 dɗ8ȞM_|vy^B1яa0EhS,5?x8N8~9E`dLerD祖7PgZʇWT$#FtH7PR:i]}sJ"Xk7P;lZt":.ṕs#TE}z&:U||]t%` a&OU_ٮr< =ɎkuegakI1HC([xxZ-gw#L'h5 Z] F>5"pرcq 'w 0p9YOQڅ>,5t;@Nb̩r&<;Ms꧍bӡ8þuZf =#g_uք{Ӓ\n1]rrcH۟o6%8ndhǕ)%n.CG *(p;E#e>9wL5I h XlǢqa9tU0D1mT6xf壷NEqQ4pdut xLI}?l@ZVk7+c0Ku sd@f'Hc0ðs__3;E萱N%1atS.kTE;{t:*#;WSU5yt5EmHH+ϋ!XgQ"c_UQ.?4+%3ͰZ-PX' FX}c9b@"6O׉eKɛsǴ!,n$Ůa]'Gu,TD$$áuWQuieu8~5>sNO j%_lKӒka, 9 q=2)1?_\?D8"O⺝t;*ɲY%|:MyXXJ`uݙ`t&;wA)S,yXde9aǤqʐ᯼)gH^"s3MKM*l;:x>^s`txl$<(9݉.GAA!"1مZp&p,1XNݙ9ġ1P^U#m6giPےnU ƐoW,dI`"K7x MB `F8ge 19jz4}/iA T䤔j']TǸc'hhECMedSlŧ1f;oii7SMhTFCH4DZpsiUIgC)*>{G=a:\`V+e?8 r4azNsBBBBIIIΝ;1`pwLthԨQW'''h4JlrvEE9 &cig>Ϣ&ƣ)]j{BH &&z }G)3⌒.ܣ9#:q.TFɘ= c*ca}l/? ̴<FHnH¯\k)BBs&pTWϤQm:˔@=6Ǫִ;瑂bwʈ%x<]Kg]dY%#:i3Q{ ˼wVl*Q|ο':OjZ8&:-oOغ/|! ]_[ʼnHL4#P*c>#Qu@b mn Z?:B݊MJ^] _0fyȢsN\_ Y@lHN9](N;"qb?n߹VnCFZ* 5Ef(ڸa"NN$EG4WQCՎ2pYR#Cp89''ŁZ (>7aTEoZ#0ۓVW8aIӢhդt|fddVk%,΄` !#0e ~% MphEׁK d tVJ{Lt +b<\p&;xqZݞiec`< LkI6 c=̙3&%%aĉشiFDן~g̘9??dٙvV{l! A(_#^f0;˧&bϟ465Lx)-js|&13cXx ]!0:Fh6RIX&9hn$vڄajlg\hVegңJEpAOX ŀU y9ͬ,䤖0 "u_9k4*r!}w I=#ƻ Ȝij y: &HgYۼv,qCT2aI7%5s,(x0y̚9 ^߈'`'>zpK"@g1("e$QXp G/#.Pg4#hD94̔~ 9:ӯ @( d۞}PM !Œ<"ydPJ6,"n"hvбnݚ/V1ꁗ3.¼ܳ;P?qcCp'ٹf^4`l4P]Gg{xw,mUj Ңdb2PcMiPQg,EJbLYwjkgx-$+}sϙ\ۻ|bo⫝l,lj0d<=97@ TAHgM"f0 =GD!8e'rD`Xn mC y.]4B茌 TUU0-3MΝ;pܹq<֏>K/6M`20c ?9iٲeG5 \~~# IS9&Y ;ڱ!Ddd¬uqÂF쌤|,k6i!VLf>¹uTK!Tĸ`Be_ ͛#:'eijjN# vƬcŊ*8:vnA)xUcӄ?^@gHnvԊ}Q\~Cc!؄$'X]aYhgW @B/MG?e>=<σXhq?lɅX,{Us>I&=z U (.kC,Ե/(ׂTP5'dz3)BAE=ԬQޢٱPRӯGT`Գ7ӲaK(7k8jsJEPYQB5AUPfpC$aWMb`(r;_|7t~Ϲaعoz0pXx wry77G&^ٍ0VrFAj ̒ǽr=D o 995zRÉ~N(I>o%33vcQ#i.ao ,-- 1)uk$Qt͟?뤤7mtw~nk%?k9ѿlx{k&MNeee٘1crD[]Jթɝ~Kp`bht0 dEdKQl/KV,K![g }AKU`w1\FTg |V8 8JGMTPYָvEɛމτ9:vs+H1k̽&&PACqRpg *n\ dTA`+)*l"Z}M2vu1 ))3G *89ff`品XU6 Q&e~Ӗ+_3zcaK/\u4<m"GCb\4 ztҁ/,5l;vq!{D>AYi G4P@{lyK7 IDAT¯v#a'1l,t'j_ },))N0!Ψ*; !W:$&˦\t BEi0,briz0`돱gZg5@@%|9;eFfxB Ģ&,ǑX۳W =P%uwݾdCT`Cm};xôD5'] + b {C'9#Ӡs['7.,xFknzM<:stec!!eo\CӿHz;yhÐ$⤽15 DN >h+?}YgŰ,@&&%=_3bĈN+=-Q @NNN]*J~)vio0 S/!)… to;Ί$ZD߼yz֌g=zC-mkE#.蝆1A@^.k:G+ Qr\ksWQQLm6;chD3.v3ٝ( d;ݾgQp9Jݡ 5o3s2.v `:g&fkz919ȬVEq. %oV~KL1e ռ]dѰ UfDq#X+ow[;_pŌjصk$ek+N9# `]K%Yb9>B=_te"=IO nx5X@_ KqOL$7َ3ٻ@bBcPpi\A/ė 87 ::j[8_1&]cAw'pRr ,jAuh@<ȯD?,!. ,8o]t)q\k ,lw]L6$34 sA@LsZ \ E%k_<E;͙[ tl9=\TŘ.V Ce/#.Π%g4g)5kB!qՖ&BQd$M1pvP,h&^ƕ_]9z:/%&nP@hf fi7cocΆVbS= Sf&SMgP!$UˀqD978F(vXNLj\vio=af_MY..d*wWv@f?#85/Zb߽xP!__p,QKPec:jV6jFE.᪨a?j*=ޫmV&[]6L< neYp Y)'TQ P/2I%d꼧ʀpTFV}&Tzb0jy$I5?qϭ铒YR*xtKB uR@(kPЭ- U iTͽm󦨖=`ܸq|u=ӻ7KJjNp8cqgϞMD?)RP C0Aˍ*WF'8¡c@a颲HNS"@ڈi!jp@0T΅T@ ȡܳ.|Hہl!f?ê1 J8(*oz#kI}oD@,^oI9(!{w\$%RHhqE~V^ ͽU;$^ļ%[ݒQ'Eэ8^!>b#FQgrvԲÇӻTtʪ{.~} [7¡8F M/fɲ#7KF4ȰO/SYL  z}E<!PrU@/S"KGCx(Tݗ|ZQ$I2p\#s֕/z /@F".+ j*+7 =Dy+KS Cb]k@j݀qJE0(d8[&d:*p 9':j56mތvDZ-[kq׊Q O V ^ըb AqBw:Aj @]-E.ՎJIfSJLݨJrnƕ+XkȚID}~.qjJ@b ԚHҲ*HφOJWgrCC'TWRQ9Rd}W @ 2zkaFMJ4"LS򔀼pۺS(@!$ @uKTDUDR䩷-}ѿEwrOZ+<?4>D\TCcR QW8|T]U<6:ɉ{]q8_濓 I8Rj]P4#(8"_qDS4 8h5v,5]Q!w Ch(( & üݯGΕh\rYZT( ݫeOi~ǪN xV@N ?[gBPF-TM}}՜_u? C| D'zq4s5 iOa^4=&gD,#\bRBEA$yx<~j 5*Il%PZGջF9Z xEZ1. U|5ñγױnu8UY e0TY՜P9;&FccMݺ ^ @s=c< J TZz oPZ$ !qxjMZʲ<PM>"atˆ~ { א8C*}M#$VN$Yz_ؽxˣiF(-ryθD%取*&?~њwlU#1z$RZ2^ $ ;=Q!nŌpIR߳B|/?\QuJ7v L9LE)($~=v#R5>4Ffn># BA/.&9PT^ Jtd&Y :-#9p kW.NΠ]_^%=b}5D1JQYHYT*;t8<%PTV !N-MՔdydi⿺QӯPLAA#Y2'`$"lMPg?[׊$UiմV&s8**Zypo b!@%eẌ́H瀞6GӍCT@Gz׋?4GYbƯ*U'z)KҘ5OԆTRIN&h+$r1$z (\#[8+ԽęJq&tWuAIm[WPJʁ)VPPX1`Zu?ojh|9Piʲ\\X,n1UO20>+wzر͉qҶ}&璀xMhb.߇ c2"@)j(e#9I+ }$+GxL Zd~rl+/Q2@Atc/W\_Z&~RU+@<$IZP%P ]HoUx]0T+U9< 0Hpe5u3Jf CPá`KLŒo>F.pp=l]#F^D[.^蓒! $eo': ?BC=sM[oL^zrzisRFY/ 't.ݞH>J֕70;H-':0 8{聕+WbܸqEnw(JoWajAgرM[t70O[3E`<%ݠ@6/za7W@`'S) AO+ X R’ 4(ViiY}4?Re+*K}3G-sf(-6 \{@7R [I>ӅPdΪ(DR*DEVYRLwX퉖ZC6,8xiNHd,(eAD9n^Q5o(^!-pYozl?fegALphJ5 H]li*z'/=_Í|=%ݿ?[ܣ5}-P^-A !!KzֶaѨ1X>~|Bn#L+4"a `wiɔͥ?xɢRo4@eh1:_|ÇMԛ˱^_7{!PwU%ϵD(OUr0 78'L~0CH7?HTrDB~q'/ϐd Rpj+Y=PY)Aޯ{vGxWVbغ6*@uO+ц[ƠҙQ\ >vm]SaϞ]0ZRi{"*0`v8b{vƶ[0iD$u@wb˲` :Q뱷Ї g_~ 695o3Ʊs#rU4H]W.La`IӧY%Z&.Q,2b<7t3M/<'\m =(yKbȁX8d/,O7:X<փE%;tJ`cXX0)*L#qqhmXb' HጲTXnNQA]\ݲxqgf)uE{v޽qWՃ*2/xa~T IUAP D">|zꆋEGAa9؎ny q.z7| pq,B q0^?#%zdKuG$1l[%p* XG, 1=P#r8a9n?XSq_7cV;;C~2ŭX"Iĸ)cF K_=끧Z[ .iNN 1_ 8{aɒ%hEB]k˧fPJ(a2% l+SS Dt4  &hބ$IsERF8mTJaÚ|~ @9;7mPwBcѣs$9B޹,`}20[?a}(,^#t sZHS%moֻi_$8%NfVxR6h4ˁ9gΜϑ ;{9~IEnHmۓ fߤ|; p5=5–X)=Y}{ZK(̎-$O34cUD~YO*WgHs%ǥ˃P x^792HqzHd 8oSU ιr`*ÉW8p<~La C4$[?pèGߓe[͐ aP?0 @)6Y^`0O  Do @‰~&qޒsCJo>g_h`gxt24h|Rx|aZjO߻28ch4ȿK|]EQ*iCp/{2 }"==p?ߕ?|pIFF222SNd9ْg_9]?>W2JWEE]}"ApUTBQ2(-+;rWvmHx dͫC~E0$I(-sJeY@Ep&1ϫ4wERpi$kcɪ=qJ Gv9(JdIY$KꅠN-2pCdES:NIV& Fzyyy8L&x4^^A$??O?ӻjf-etZA"KKA!ťE\A O0>Vj}ˣy=aOB +2RZj4b1!PJ9pU$nX-Vx=>h5M zs2u- 5SFˇC0fx?d%k삓2+j~S A[O|7c~3]ԭXYYYPT(//GcNP(bX'n.h%++ jdRI-ZhΘ<(bŊyO(-@iy/P̼XbjKZ}8ZF޽Q^QQe,R  v }IqQBdB,-F4wWxϏuEQ(eUn7n") GR"j5*^E;[SL*sbU>F"%Ɋ .UHM\z+x'qvvBr.EQh"lߺ[6oƍ!"QRRRqbYr%oۆzP\\@ߵ^KAD?#G ô OZwh5:NZ&۫'JJ,w"+3s%(wU^ݻz|'9v!K"xvV_묌){+C A?]WmO7)O'A v[GZnMFU*x<^$;jXya\s]+Zp$s΁$p:XbV^7b̙0a~?KK[͉>d"2/`شi.?@M8ѣ!_a4V 9%U,'<},-yM)]bR` à N'SS!5x(q!OV_VFF177tsG&|a2[n}ib 3GwXXlB.hZ8 IJʐ l4UQ 0u&󆜻oyRfBlQ#,f,N.x|X:X뙁9}\A=ڼwIzٝ{KҼGyx4b$\ -s#jecaܸqXhQ' ۷/JJJ0lP\Vs,cbu w z}}9/r遜)Ǜx,5m$%- o%ܰh%x) g@|`g`Nm<+}=^?E:-tn/Qkr!`f:Ur#=5U5gj; V[GĪ2Ic[Kwo%zwMCح:$M5 +U]RЯG:n-öN m6Wp"qxmMloS{ (j6aXXl;+aȩcY6v aJJлGc3S(s:AHuB,#- $PJQR\@jfk E#azEmZ0,}zM՗wռ~S `yNǁөY!$@bHJLVqFzIUD֨ ūC ]1k%U3;F݄#88 o'8xcس](6-c-+ۚh @\Ak8kCT&8u4z[loS?'i(uF0p]n5jQޑWEڅD@Ee%$Y#1 vt5}[hZخtzlsmo,=SϺk vo%$YB+Ra=t"a8DaF!h5:[DPz}KjA<c_{֨^ w)BJdwJD4&!Xl LJ@T//]㞥kvx?pPK!IK%RގsO l6(DQRwXQ_E7 Qq܇}t7ߎ]ѣ[W@eU%+*#1 IIؾk ?NV_s2(˚}3cE!o,=ˠfSAՍm|L|隀Sw? ATU*1 @*^WP 76sAwa/ƍ膔$\UAj+衂٨$)Xv/&=^Vhoz_Wq6>l6ƌ/DnZ2 0 M~_ūn/1c|܇&FD CؠEQ(2RgAU wRjdSpiTlYڌ9cEQ05E**a6QY醬(LMt@0(‘p܃^sqԔ|CV(A dm 0 >/Z mWh>W^Nvs:N}Pj9eE܈]:N}СC8rH]%NtVNYF'zEq߿GAQQ.\H~K{yv6}FiΨ}qm RkNOV gAR!#-|2#-  V9z}FqzRRJnz#[w| +WT!Ij5:]HOC$E0BeQ!GbBp'i֊n^l} 6#~\w?ڍb%.݋բ}ݝi|lm퍽RXlj.M85Z-F]sԩrrrн{fI@G}DeIB}NtVQF!77YYYϧM74 1nC6-Z7I(s8?Dzww|ǝP!FÚ El6T6%N ,"*Z<@ pWR5F ,Cg vu6/i 13;;2O?[kuB4Zuƿ}vty!mjXˉΩT`X'ݎD۷,םDlV^MC0j9KKKj*:w\8]_D?UϾ{i"xT \04>J)RR>wmGS_*>op+B $Y"qi3{%9m޲U j ]B D( !lj˜j%H$:쉻'uGctd5;_`v&Do.*3`i&{ocV'qf³4$1^CشUMwyc[SH\Y4$S p zx5/]>1qMOC~/t܂Ju… ẅ́g~B U*%wYBTAaHLDT!]SۺBeP`VV8](eʹh {߭؅G N9oPKFPj1hNg!ǒ)S{yc޼yeHBܖ.ƍEEBW_}uy7LqOBPZVGJf<#  WGPUUdx,3`-M澷H`Шn:O=KG⦩ávYa5ї?9@1ht@>xv*מ {wϟFmܸ[nI4iҊ~zn;(B۞~e&MZq-$'''Ӎ7"?~;31O$&ءh@)(Ip{|(HHl2f‘ǣ$IBR![< ~ٌ}@.~^A n^8G: `pǟos/Թ<ˎ~ :_E" ֬YwܹG1k֬Vb֬Y/aqPt֬Y/;p@s]fM`0EeMe^L3wuOs>eǾr0 T*˲l`ijX0x@xz9 Cr8'N3@b=NtG# .>gA 3 $!@tIݧ\rw}:ϻL8|tr| `رëAyܹW-X@L8fͺ??CB`0x<0!D~衇ófͺgĉ,X@;wU WxϏ; 6:T6/ozx]{\ ٫V,"nsD*n p{6^zV(E9)zt;ct]:[>x*'NҪ2oP'ML'w.qӖ̼~7.ÇwP__{|4 n݊#Go7?B'xbѣ1azW믿>Z .8N={^{.(;33K,!ݻwp88q"$ WnWq[[iUPQreT^W%XH!"JJ^h! AUiY_pv]_6đhBVs[MZ\6qzwsM4`45'!X^gɯp݉66'EMQoS ;@HO=xHbM:U]ٯ-A@qF FNN9s۵k׺|yw ##ӧO+ϙ3g˲?;Xs/ӧV^{ xҔ+9s&=t֮]Kسgi؆ `g=j$U*UM(ˇD;EAEeEAZJ >?3T*dYF8Fo|2ɞX'#N$ME/+BSPbK~)\!=zs7"|nq1<`YC~m5ݻbnxknƗWG)uO<(X,t˖-<ob77nڰa(l۶,]tvחql3f,~2~Q wq֭[?Z0o޼m6[jz6N0CE%= 1_:B,VI@<jNP{Lh DC}&/Y3eH9w-@QeVw˜oٳhҥl61--6nlV?6dȐӦMFkTRRr(xMME}ܒ;!E} tWVOa6!m!t!uU}C#UEv%w n.|7?ٙ0-vv0u[$EzVWTT,9sqFuֵ{Mt.]<1jԨ9'Np#~ IDAT!/>Ν[ ].|^q}Zx4lP} YOI!am~u:>đ ?e,܊O3&ͻ;HLW0΂`$8d؏> .~;7%%U!ʚ5kNv/M:ӕ+Wnۮj?ɻ90 L٠dfZPS[VY**\7w<ʫPP27̺tPue~No@nhtpr,R+-#dpjdTcacX đBV45G+/g5/']BSpv@I,qkn{ f^va^xT}[HrS@w$U/\pT8sL !ʕ+',XSDW 桬13Mp`Ť|1s"?D@jud6Ų$#h!(E἖e|੧<\_ 8n/(=g'$aƌ QD/ @ !С(. W. `UXL*%VH0r8H\TW6n榙c~g~5:-R $(#C]ѕ1%ψ>') /+VU|}#\bժE.[lFNcƌyd̘1رcf3;<8p`IJJʒG}Ԩjժ,Xy,mųM֟R/|3no(*(U@UTUc^D94|Sۣ֞jYl*«d*66;|>dY,<n4dU1L7w>humKv3}bhvg ]ߖ@#kQ]0{Xis.B:sH(9a祏u:A* "Ii +(*ꇾ&#wuכ+]vv؁/_~Or inn=W3gμg_{b9ӟť9Cfsd~ Ud ѪQHJl) @ax2`|)' zaK~O<nL{l۶>ر N7>xذaعs'ihhhmIiiG4mӦM/iӦxWF*@bTU*\_Q+"^/Rx!U5PdeZf‘ʐє g>e sf蛪׆jVևjSC5ѿ0TEE^93ܺu; pL X$Б&Yz/@W(-- K,\M{ӧ< ^ɓ'a֭k,YsGYzv;q&Mo2hРm6[V̼K0jԨ9k֬YveY4UPnk"HĎ\@(Wa)>w/Ra@,Pls6M%V+TEI7 +3@)AJ(KM@8kt# N &uyq5!Tq495{c{>O|Wj'Oqo0aLA[o{{P0Ox 222_{ٳgNzwV)T;- R@UP8;$𴈙.iiF8MH@x` A@R %u煀{(X|'׍/J:N7n~[Ihhj^_2RSҫYW^zW_s|>_1?̚yxOn߰aͳfΟ?\UtGzXvbǎOx<_Lw+#A%>O/@-xQ:nQ@"dZL}h;YfLhTOƯM0zM&pAQ@@/!eCgw;*$J:j H*Ҳ)%%O?}0(P +/){tȑuسgibRkʕpN9sm`0kF|LII1*\rX}FZUP ^@ z"DTU@Xz|Kz:juDYY`N37 ^YW)sol#J H$ai hMi$ˊ (-$u[@\&O|'! ˻g޼yE}w(~~,_+2lJR^^ޯ(J޵^[Y(5 SPU@Z*15] =*; EGuF+3\n쬰jxP̌C8tM}-CGpƹ1-#5I#+YbuAȲ&>9oی{lWNNLSĹ(-j]VlAa߾}cyrF9Z4:P2ۅW ! ʔK "U%('J"<-#J@:Rt:i()5(OsV۶x8?̳@.wMU?ۣ9^΀z(%TNlu1NQō? e} gMBEHbgߐ"&YTNxIR׋M_a^/"IDW9"z <-}PY] ^V"sc@H$%Jғ(U%^q7 @ӺSiQUYLF#d4&FQ$tGI#QhdIPQkaEa6H9qn{:^@B(TJ`w)UяZ=vR.(]h42rZI^5E1T]UTˊUݱhɧӽfcnԻ)-+M>eLQ JcbJ[3Dp-uߔ4 @ж% 1CɐF6W)7 D IlmT֢0OK( 38tF I\ ?iݒ 7?H$%/uҏ5ƶ;tքȩ Γ>$%^G[L VEQ <m*U bҥXP!˲K V(-DFUu-H^^LT olsHӳ/ @Z6}{#{㿿a+ @A.NP dIBK!F'r1P D e(FGF+$40Q$"R ΦftЧJe)&:-\įl CH@.F1Kл&,Y' Sp;" 0|ܿ\IR@zxܗys@ rJ|"i!HZ@@u % i@%TTT -͈5m%GS^njgaّޞX(3u^ SEuqx: @.{vїiz 0'^@:S~xK<: " д`~C% +i+ Rt:X,Ypц ^](vdl ]i\ @GNØ v%7UY߽g%V%V.b 㐘~${t:mxOW_kީ+V-,xf=-r@=AD I'1D!@ Rz@D SN$h4h^MtSA/j6$Vc`!Xlt;WM|-DT4%;$h8}Dz?ˑ7zа32f֠C y칗\>%O?#,*5i:;3޿.@R@ KB= iA% k׳VR453;l%#& . "#JN ^&Ɛn덪O7}GD#> ̰} ;x$zEQ,tm77O`6/Vd g_sMs/REprw|7Y~_WQũ`A)U#psgGܻcB8%1W B^%p%Pjhd>,N }1ՀLKUEyy!&S*jj`4!S>T n$z.y|g߽[A9#J{ Q07] f$̃+jq)WX:k}h[㾍:N:ʔG}M4NW5qO߽5Y .0/,IRbRCYAgS&$YDu-^k[ J^Z i>0+ @ Lv3ODۑ\y5cSU`5v0tދk;jnLn;NwXkOh4ػw?n߾w_wW[ͽa^{gs}^n.!Bd{@O)>XX)1 AAjCHO$rȈNnhMtBxk蠑eܞIK~ =@ęr2%B? X%4ݽ]0$e`6V}N@${w3p@HS~ݥeS\]W=n{/+V 4Il0U]-1A iZу9%ul2pȾ+dmQ=PZc:F9&a `_A3jo=Ϣ[N2;_ 5 /izp DcArBDgB8)@%HPPMtVVBՄj7P)EV9Xi{<:`6x,=bT<kuD?[qਛq e>고qst܉FYKq ϖT huQ硪thjOu? R^* uSNQN 4SCkRJ@ @#fwQUJm'u4{3;70Oq4 $΄߈KRF>{$-ψT+OsƏģ䓔"qD`8$8%PfH(obL%6SQScENKMIDAT1ZUHM5@D (RRRj0 |b*_[RG<&g,#?@n7, ( Y~MGT G]htc.} 0b1?"|~K7.zX)E+B6 Ĵ&mUa8*a#GmU4P*`=8cnjiQ=Xt m۾of({IJlJRR_ YVb\MtQhVp$ ]=%EPh",oWxJ)Au KqbN3ue=K{=_IJR:m#r57u+u5Uh{`YTcMHG7LКZ+5V+Z6o_q~w=IId(7{^zF}{Zj'MGdΝ:;=қ'd`` !R,wАJ2rssGY, tBH" MjEA~K]Bȱ^sOgNĖ0VK!&t@Bk ,5=&$QJ鮭+.p[@k΁Ɣ P?~ ]Ft|HZ=\ueaP͵w zP,^2=.\ o``nЦ E;qX44CX{BH++Xџ 5`(XԮ ` !HE,RDBU`)k]rF,o"@i9b,%pMGc>J<N'q7WۭOMl2g찻(y=gDZS&4ƌ@]d ֡)עpCy{ngP=מPd @Toyyx&n(釢`{_ gJ`)/vB %J3=4+lQGQ`Wku6!5h/PJAPhjj NRh*DQVAj!њAeimҵEM`~ v'!Ωƥ_le?3o͓<~=ɢ{6W_V,5Q#G޹|ŪV iu:X* i4,&H5[Ȳ!K" d@<TWa񪵠BKuM%͛m懷4Ji_죹4OMRl|Xn@^@ҙ b6ֶN**AA~^f˃rf Inc2p8oflK %O9pG%"|0( H`Cƀ厚7G>`u7m,no1$J(II)/x l6e%NOk1` Zhd g>i0ꡨ*(F]ѷ uNš{[7ki 64K'IumOol0bs& j9$μnsXh*Q ԖPǯ5q"ڠ f_69F |N]}23 EACCc,-.bo&J%pX ,-i`7`Kw>Xqhjs9hF[%<ٻ7b6Xrėy?7W1X*/\+Z_| `i)W$X ^8av#@)UNH3dѸYWs"ߏw\K8둒:sDAQgtmER'W#/^av2hWTd?ZM\ʓgGtl0U6gEOD1Fo9ظj*Hp@Kb%li߷^(86qI((y~H95O(ӳ!rMcڈ 5L7iڥgjfSIaB|:RwN0c/`&̛hBH]r0'T'6ʡ*5 0h.ɘP@]K W2dSS32Cr@ ii!(0SaoD%i&SeMn[1܎Z*Z_X$K ܢ[KR+V%+\7()v5y|>}Hoֱa1~|!lRTV㌁ nj&db{L=^d !S=Vș0/alCjnr1SJkq4DQg:8v;gD H̠dnsh%| þ{e&Nf4(YZV>04PU]KzJ{Jf\7*npؘqNX:@a1c( TkL&CQLH7Cp!7ykQJaw6!K VŇ-`hYo)`8LE{}%[Og/,Vk]عM1;-ٺ}"ŖXtko fM]c:|}Q u9?޾L(2VA7 Bhj(Snd LxUg f7d_Ϥ]&zC 6;]hnnBY8txw>\&sq:Y`uˏ]cSYc Z2c), J07܇᪭HR_,mrS5F=m?UU)!s&GEeROjB^Ihu-(1 UQBeQqq+qưb=b,x{^TT\8z+Y#-;"4x]v;W.Gl55V0QmѠ$J4ТjdeZ XESF9^gp)΄ 1OnU,e}+A12ٹklNw sԞ8ֈM2LpוYuyC΅ѡU%? ـ0ളPYrGʑ'~$aao_FM  E?y=]u=wywr57g͗eC0ǹ3r'$ᣁn0·~^_ E($ }xCnOM.ws$'Հ٣1`6 CD`L>(>Zh5у-cRJ2.KoCY k٠-5t蒛fs@=<@Kih :Q9֞:,#J{n,$ȂQe4Ph<^T8ir;x߷KNRZUi4j⿚VЁߺ=J%yjjjUéUexJ+\xNI:DGKmIENDB`xye-0.12.2+dfsg/res/detailed20.xml000066400000000000000000000112021225403634500165500ustar00rootroot00000000000000 Ancestral Xye (20x20) Miguel Angel Soliz Kuncar A very detailed skin with a temple/tribal theme. Scaled down version for smaller screens. The graphics may miss some level of detail. WIP. xye-0.12.2+dfsg/res/detailed30.png000066400000000000000000014574261225403634500165640ustar00rootroot00000000000000PNG  IHDRXXf MiCCPPhotoshop ICC profilexڝSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/%ҟ3bKGD pHYs  tIME  IDATxwt]6̜vtիe57mƕPLo !@($fmpƽ["v|`Z^}Ϝsf==bB\C>zPn0YuHq|tɏӫjo!lt@)e~r7w$E41@aXCC___/֐!C*#e>y_( (PU \{jxa !Y(P<_Q?OaZ>~?xp:w]w߾k=5Me@mDy( ϏaѸ>gXڇ~ѦhԼWYlV5"A :P G{':[ݭuM>0zg} *8Bg~qm3?ӧ@ PTIDFŀR:$e0Y[AqI,aW\{1F5M%rL:&Pr%͘UK_rkjjc (ܹ2\. }bڴ,r'N Nj'OaDw\tØ:u2N*ȑ#qSXvMBؿ .M!99CRS={*eX1cFp"<< uhlldWLƍ0kL~CܲfYa0˝žcz eSLCGG'n_<0W5휿BAL.g][AHEXA\n;}Iǿ&&i욪20*6sJU]>DѺgsˆM(͔h00&߈ݥMӁZgVn)Q<]4&_;/O/+*X$M<&&&!66;1zzzHScԙSv9a}}:'%9·TU5_:|vӺp1&:kX6$vuvME8xo {a] k/&e9:;1=Fg2a~z" E˂\xj玞7N2 x^Pѻ3F!"(Ɂ!ygfOo1MU"Uorz|]΍!^ _,[Uc̱FD=(=NG'Ƽ,±;p͒ptV\N~rfq E]0} Mđ}[1h&bS˵|J !? (4BዯAծNLͲ-8UO`/!>tDŇ $bHo>zO!w2OA*ϕ"N>b}8i2+;{~vꟜˏt=IvH-+U3oE+~x**&*rNoG.UHZf=r00_FLt=u];Hڷ-Z=xqm meehnn/ 4 `Fv|K(,,Ν;n  ^u6`ᨫiZXx!Vx#F c qqxB (.!&޽fZ,X0I_e}:jcnVvP!FXՊWOMҦݞZѕĞFhlO${ٺ꿳&G+*οgɡPJ-IJNqL0AKLJx܆O?>?Ϲ~_a%N.fasG):DC{aj.5)#6%vPܓ/MЫ^Ǣ )pV||jGOW;g~tB5|T,8;J)xnnGB2qXq׻} /%9G~Pץ:fto'R`PU0寥@(>lM lntEe1a"+wxSfe7ohH^gyfiRm(;^oG_7 e irNF۪_:~rai SܶrZ ǏՅW0 'c:tu"dG°l1(qX=:vO>Ǻ7F\9.oMVȎD1 Ex< I&M!)5QqIؽSf":.g :.C2rP} iYhi=:nG7 WlǺ7b7Ѷhh4U%r(oΞ_ 6I^lllWAAAaCBpa,\pY#1kxo(Xz"l=jĀ3eJV^={cp8xwq˲aZm݌+GBB\8nAm-Ê߃,+ E N4{{1e$0]kp۹oۼY#i{-i "El(S$F 2ڣ5rvzǢϷsyˊ -[DAzp7D&@ @ȋnwvci5Æ蘨+xN>cC`x/DSV{aH83>Gz[~C@ /D0a%ԀLHP^K+PO{nX `&X竺[љW|Oj!Dǎɓ'!cHNNԩS5iiixXnNs){;J||.Yľ+4qqe!YN'ij7\t:S[[[7 ӆ$|#/" ljں555|7޻߾xMx%`|DIt&8:8 H̀1f,<\D'EHBf&_}\7*b}b?pSuMu\=YC%B!dDNaƀ|?2hq</!0M=yL xso=R2(^6F"I"a2XVF:uxݛ߅ۮ} dH6(!l+F-ԗ7 6ABv $BWѝؿ8Gֈ #Ȱ S1[o[wV|Bq3!I566_MbW"XҊS$@ PxuGa5`<+J C|hkc^;jaZpQ:t`@ t|y;w!%% H: 1M 䮇c05ġmGaqH '`ڒk>x&?,ڣwN},o4($"*L<Gwٲ6<$֭;Gg#&d#uA3_^v@c};+Þ~e}/nxguEK`,Z$#G,Q!Y%PqOqpf6k䑒V͇&5*0hT)uSJ?#0h_{︤\ɐ `L54Uti捃EwqVN`#"*' g-fyc!&l:Wz FO *#Q21 ( `D C`e}ﰷB`lCGڋVRR"YYEQc&YL&j4.*B(!!)))RB򖖖NB@ UUgD#KR܂Ą80!*2zIBEeo+N TUAO4H]ƹA9]~jseUUc dʔ"[ J 4MÛo@vVre`ݺ }@C IDAT'O?]?'+9) n5 fohd微 himȻRU풕cXv\.7:@-܆H8N9+Vn[7шѣG" bhnis38qVu#GBVddgfV^ûoXh6 XhܐBΰa߰ЛW17nbbΜ=PJq{ xᅿo\@z}ej33j N/4<(p)^ʐ,mfp;f.Hx/? WA9 c(j<0M;=psZ> U#@׋aaͦ篻nAy>X2xˆi\ݩF&Mnxg~'˿CnEm{xR;5w ɿb>N!{$4#P!㭫fb wq3\IKKcӦlg2 &hn'n)b#c_:=A]Pn34R%l3_;w/ g&fƢ‡Vz*b?;iZ&cLjryyyee}_X^ܟ[;_]LusR$ߟma N#r#wYQCd$3Ǟ\3O~H)AJ}34p;LdY6M8-$PzP% 8>~xL^/r1lg{ok>,]<(,xq;wbGGGǀTqrʁjżyɌYYYy¹򥯽{SÁ0 p4;5xmmOO0^Ͼ"[qM\n7)cϿٷ.q'= AaLad+}<1qf\CQZdx=bydףQAJ0iŢ߼W ^Xe񱸚*u0sʄ+Բ*2*0b8,Eu)4^B9XZQP8M34]=͢F6lXZKԛdB4M(*ĥD7 J: $d^䐞 I0nBN@]Y b~r՛=NFNސi6%,NUńL T_X a!wWq8U| >w7 ľhoecm6t?{3%=ݎR>DĘ#0~B\.X6 a7ވ+5 *@XG'Z^ahb@gXLX-n#g F-(d<‡Η?%Xz^]~OE@ RJf %4i)QϺ}6\((**:S\\<85..=Rz< 19f7xuذa3DQ #hp:]xG{Xdbcc!{tt0,; X TUU9zQHpjΝ3`̙ǟ|/;111DrR6l|.]#GaȐ!9sfbeU;w~łž}QWifLEl o߁A҆C"22s;؈x8Nc~,Yp !hniEEy̘>e/h,rpd) сVQ_[VVx--\/1:E9WB̸,x{q==HZZ]@B 0u:`2$B8`%M:p|¢Q5=Z'l˭tKO>xwƦ)"bOjTL[z{GsiCrFݝxǘԘa2q:bGfc)iA_B; *Ph\# P Tg8MQB|W||3Ty  9ۊ$~PR|j)S GFy[[Ο??OɅEe_@Q}@TT4:e WUSKZ]j2V4$|̦<*4~1e~ #.+I.78q<+y<'fHV$&%!8^W_/_ w"6"3G?d"AX80 F>LF}F I`@͙"8vzDT1ʊo!C39ɹitIOrbrU]l?B[f^/QC8T %ό IB:|>?",>460(dr$Ł7Q&C/8P_9IC Q Lq@2nBHT2=0&v 0-8[vvE&/@xl] 'GPZQ(D8g3MɐQ:52~8kXG^w=(NB4DDD(g0BQpV+1>SI%قoXoJ)Ysb[piJB؋>*++o$5M4 1^1cqo3EQhuuu\KKKchFZz_{رÇ?cǎq`0 @-c,HJ)ν ]6D#qq>t.T5MC(H@VV2חm۾c GдAq/,ewL6m`3k֕O Qp^ڵ=?3i$կ !t FAg}OδX\GdYd_WW7{VǏŦM=4S?xǤ߸nί`0PQQшL?~y?rO:6 ӧ }F]!X'QZz@R 0[MHL3aM 4`%hi}=sUzף0Ij7g}cO<^6H#$?@A^ /,?_U0thZv˭IO?ɻeUx1Z䭑v:5~H9 ő:4(F}@ %h>xsg> _>~{a˄ٜd:m/MY 4? }&0?tAG_? W=}I֞¦0; IqjЅ\xXޅo63eHZ>!8EU|d U.~.d4|%?;$}WQ{CJ}$ ~RKO@^_!¢b UP N!JN wng <3<$qhtI.a"|^gR m&o ݽL"-nW~/\H{4H]K7 E%똶U: (B!cR"奃X4:d^|P8ysȘd܁ԡ)̠בSA   .> :f}dH"O/'.͂*oir ry~ceDY }C*rJd؛,#}"XunW[깔|bK/9M(739|bK0UD=DQhA[k Zˆ34Mrza y6զh,PNOH4`Bٟؾ~}jRm6n2vNSIIIht qv5j9w>}:577СC ԫe˖ٳg7NhjjBsk+p߽w ژ:uuujJJ22:0N7!+ xH4!++>G~v ^܆>dde~ 

peWcڷ2!Y֭;0km`vCQկ~q/g? WU({9܋kω<CS(xy߳'O ~(ܾnEQHͺ aXcAtWՁj2xNy,q,UUeeH-١/k;1F,3ޤ= 0"|F]`!pL 2!JG&ѡlerXu^[_{^:"ɡ,KI(i *VH4ĆF*b07 ')9^zCӢ쑶ԔK&*|q(8WOۋHd,::(.99V Bx0 Ed8.>tL.n^P_[N=(`0 A7./Mñr|>yu` J9#^݇"ܩ t8u<4 sGFfgI{}~w K όFЁ<!KT <.+l8\e'i{MְE !۹sg|wwt248L*{j+YѣGs[[[AMÝ'NȘ:ujq|||WEEŐpvcvw'.̠\z҇rlY9&h4 ̏k֢<232dqoqTi)3y9'Pt2y26mق7pNVWAa9$ |-p/^ƀ͛R\=gr~=ʹiSiAGӑܜay $ ䷺{pႁ&TUl(;&"о23zRc)z(+/Ǥo_zr1DG#66f|~>vh|+̾j&xcqճnߔPٟ1c:(طYW^.@SB@(AaqŴ)<EDL GAsC\ 7(D(CIQþ^R;S]fuX{XJAZjm7+ IcǍH{\mmmCBB<&MW?vl-.6n:s߇`~Y4?> `o0#{콟lc'q./-てihllD{{{Fg"n#uw.f'x73 fF,"?/{5~,+p:`vF# 0,g̜sxD+,wӞܜ v#vG2h]?+%>: !IT4dj[]y`XoDEhjW*#^j"v6ܘ"J*o0swp05[yW;rz!'׸DѤEJȜ94Húu$`@|Fzvr:A`L˞ͽ}m RD{~B͏~~ua<j!4gZ.EӉ}ۦSDUQ.'}$_s~k_phbuoPG2`/ч( IDAT)MS=WwnnΜY%%'Hyyy47/=Ԛ)Oy?T ;ҁ'n$b|DL I4nw1AQp@G$J-G85c >ko|Et92װ묎\DQ p(RMq 'D=koP]fm5bn1X]b,ÑiҒONٳgضm[+˲H$8zh`n̚5 @+Mp8p' c!"L)8:&4+.)*rNGp3*CUUP h(DZ,cH4eb[_fkS=֊ G6eWAM\@iy #^R^:? CORċ)<&8EA};WoBi߰a3ܛn#,|>r]S!KLlɐG`80&1YC y')* CiY1vfYP%bSLQ2p+23QP C;SL4\cVDbSP;INmJLkPd4iI DB ʒkRp@, X|GOݽ(Z=nc@ЩP U\nV葃Ȟw@G⥱mq|?[\{#7O?? :0)=n^]R% {\tI_vvHQq!4 03ܗqxSy⿶ؔJqG߽#!']G D\T0@`BAܤ}O\e5 ~v椄a hg)RZ=J À  ! ,/-E7I9D٨qT¾ŦT+jvO.2M lbڮAN 2oB˩W7ɾQѨ@ Z Gai)QpJQTHv{2>~9KBR"FJm !ᱯ˱k֌@%Egeס55,\~}+nZ7ID)ie=*l6a]A4yyH",K4 <9EQ)!Z,D,3jƔ㪢()YWsgMLsl&488[?Z2䨪 `60NDfwe9ّy7WXѣljªVB4qb Y1?578rƮwSFu:0XrdY믿MH $[~/e|ْL۝||̛7tuwe;Wk_e2m}v1ЫƥQ;g`fF.k?A,99/Tfmܨ` (۷$5u'w[Nb!ZZN/]+F&U9ܘ*T׌g~t NE4]g@=Tw|}M 10yB5. \iF 5Gf>a)dU('0e^4fp0:z``Hx6KĜ pQ (Xg{ށmRTSi(YO^Kq //^~RVOz`'=h4Þi# PU /0cw2q5Gٍp:0h4BUu| k7od~_J%HN B%+5 iQsݍ犈;ˉhD>$ש4oBr*2vKiӴaYum-V] "յkI#FA,J)re+>ŵo j.z(dyr,AqI)N;Kly}917`|n} ~@`JO)Jr_rQ;թ2!ė)H"trkkdxlBWgʫj~e{{;iv@TZh4ҴSd#ixqd<Ab\.(>8:XJ3I@7 7!F!+Bv*1hӇC4fQ 0I"z8FA Aa`0Tc~= 0QA` A _tkqA?3!]ױg>}`$ed UUUZ]בH$@)x\P/% H )U1~4 Ut8RR {wY=lD!] mvA^.- *(@n>sgP ܙ< ; p@YU.lE (($PU]u f0FhqDPɄuW0#xtBJU,덚B6>ڵc;B(DHeS\hw[+lD=8~v祔d _T~)3EqAvwZ̫O'_>8?iuwE62%Vʲ@$Bc qT[p`$,UUU~ FrE~=A?k;[y &h%Rt鰙)ѣGaT`rDI8 iL `Ɇ pLX hƔv{999Cv=z]-+YAu~ ne4 w&ZNNvv܊ܙHH |{zƒ5d$4^E0P__?mTOGT&KT Cگ`gfaN Ls[$`RU`P4~HŧC %.㍎sq oۉ-cx⸳q&DgJ]QUUQ}v |e}}}*F\PRBUU0X\EOQBшP( R@$ŗ# `x_fh4q,Ep <_QJD3|vp&xfnT]Q@0#a?HGŚ[pLʏz1?Gc(ϫ{+\hl uGqp<ÞQlզ#ֻ !P]o?xnős0|oeome؜:obn.e@ 1^7ڷkKtᅿlZa/Nzan:\ʼ&.[G3/aF) {J1Y좮Q0'((C&|͡d`LI![H,}oNDA, V^=iӦUU˲qedFR.SVV\3<88^paCkkkq"0X].W5(JH$bzveC݄,[]]x>njda4PW[-ni;oqu grph¡0}C Ɇ‚@ @`ɒŐe g2<ښlٲ5sO;c:ZDqQ(H8,˒cǎ@ @.R"LpT\c<[SDpuAS|+}6lŋpsƋ/n%Y ~#>u8pU5mv`Æg?;2glLdT s*TUCHU 4 BVs`t]%?2~b:1$I \jV I^VR>lY=\)cPdp>{`|z,(Q B@)yc8)Ұ&~Q&jV'II f~3[>[G` YeDt%ȍ]}wYS 0 A{ ;&wQEx`9GG=z^\.H6ezcS`o5>DuJI0Il"8(tb@hH$ڬcDOӇ*|^nwR?eXȒ>se2P* D x< vfXلX ,xhn0/QZ!X-R*DqI‚%&lۯb!oWਸJlG^m96Xm vme DFl#JlЉ#CPU4*&{ǁ"2\X^ӴD>xU߿]K(2pzpH 8bQğ贙KŞ*1 k FjՂx̘9'!T@fA{65sq[6 !U2^Hk<[UTli)4$K0\e?r p,wJ+[n00a^iM$߁HpT&3X?ҭ__T*m`hYi(*Rx( fd)XO/;?OU,M֮]^(J`` +'''_+'ӓ'OΘ9sfkVVVDQq Lx___naH!acq_균TK@)m;~TU& K,FwW~_`ycRPteRoNGA8NM|nadğtzLh4 ESSz{{QY*-Y===~+%1i~X>6 `,]Zoy㍷/y;hkkbj:"??bٲ%شisfM6cɒz=v R|aÆM8})i^SR:t˖-A{{8ÑǰdI=: B֬ ByYUjv/7 CG&D{9Gϰ  a2`tbc`602yZX27 & $ ac,Sw3e^8u~*Wu)8)˲Ӎ.{a|Ji_[x?]M{h_h =aUaȲ]WuU e g=9пul3a~cﮐG ATV)w%r7wQS_anXft$L"miNj9նY"M{ģMo/[̦1=ぢ((}RUuxR_:DUzu b{+M  7JaY!2T=͍Oďb0.;NO tw d2eƴYe9U)Ip:ƀ},qmmk#uwqRGodٌTWD_Ph.A)f Νpd$ 0YDOU,5ОdIGAnADUzr" #!FH& ) TQ5%02QFĩtVbG qT#,Ab8JfL%oxݢUwLf+}zJ4G(0 9 Y$ 97-I7e=PƂp_YpfGa4:5SpdTwb0m.OU$'1q[[:$t ,h€A$ˀrXpϾ)h߭5'wo7ȌVG4$b}hm>p(D4═5a=;(/ft{Oh k=>Z~Wn`$THbHRB)/^|СEw=zzF5ڬ0ūa۶홶dpՊ'O~Ѥkٮj7*'˖-ˣEOO/Dق`0χEbÆ/;brdggh1^npGVrb4&dQ eEjl*x<7IVAȭ S'v_Lb)i`9r@"YU5vء7WgW'*B $iF9!#%L8&+G( tId9 bLj@i#ca3Uٚ_pV,8иlƌcQ$r"^/BPLr݃,)<]86^-%dBp: c x<R 5M ߤ IDAT9x5y0 F{{ 0s84Un,ˤaY2m, (x84]%%¢))AaI%IФ(@U\Fiq) @Ww/ @dj'sD"=,# h4 GKq r0u a@w;<"]aa2F'd vE.O::PQ  tGAA!A4)L) Ur< Id0%JB=w>UU3/lվ%f̘Id|nHL[Q_)t$Vt%[I Fճf^ن?_榦|2A2iӦ7eYYv92cժU'! -]ܶ]YQcEFc[Ql6A @nHU rjg/RJ/=mv<q,/^lXo3u6)Ec h`^lsrt㚏{7hysRɪD"RL6-1`׮]hhh u. VD"cB! 'OPIiڂ4LP(,bH$$8k.8n?xfsS,jh fxvp`?~n1iwdWPE cn~0tvŔ*s``@Ö׃H$(g3БSh m}3/Q[ą[x^};O(Oos770,DHScˁAXꃮIb#`&7% $^߁`wSЬʭE5uCph((H(Dz4͘dc^ҿzflLB"٦3o޷2R 0PIuDOFe*UP)J,CՆ]K;* NG~pWIxL&}AD BQ(*UmSnEVen1uj6 2tŽLH& v+ax<(@;.]`ުgzvA\hT;Vi0@ `eFZ@!W\94zTUſ_x7-Dkk~'q? HI#W,oEE 3a-֛3{B?<܋7}knFM Yhi9ǟ~6+q,x3T?15Mx{4 p۷Ӑ$bFSԑx<ڴ*…熇8qDSΛ;gϞ_1{-)ٌ{cULܹ /r*=pWJܹplwwهoPԧʼn'?tWKT(EQYV?ڋbl3ؿup\ǦO<9سz6{zB $c  -]]ݹK{{=rsjCENn7'/;;{ŅesrrrST0 a49n/Pt9T=| I $he  Ic0wתY̢p߸lU]O g~q]0 |2-8m~b.?_?|}oaD3$e+~|>htywCC#ih83RTT~BהRX-fD1a F?A BdȊ 0Jk~y >?]lVL$`ZF G`0$f4 $'iH kƞ5?1MP~9 o:UM36y&ľ^1xvL@NP@S: 32Jg^jH ͻ^ETSgV"G^`Ko6Vz /l,Wadd0f'RPM" H\*5L>SwIө)$q8h=߂3ahp~_w ;BV+1tP lF$Pn`66bdn.ٺ`9yz`0uܞ/=bLcT>0LOS| IzS j<`l1 2$pгxRpIm IFq1YJ L@ W ($IJgc L.v:vؑsDQXE !:Tu7 JbeY\<aXwYEEEF="OO3Oڏ}׿M1W_G]mu;V9W[[Mb8*SV݀['.Y,'\.v;v#O(/+ڵ8< Xmmmt`p@-))+˲/RJCG``0003gyOG&LW., M0}zF7+c;@u6|{ЀfϪ˕60aL]:t:jJl6n1%MU'֡cݺ;3q@:5n~{5/I@( )@^a!8P4BbxsQ\T3R'#=+ P#m2z |;(?Ob9n !~Y3Jg}cw6DFq8lj) ;n6h&Zwn7'!#ʄ.bT3?Z?V,.e,XƆ9s7 xZzɏ89eYXiK29ELK,ZxĨFZ \]G?k9ǝvsoXP(4A&ͯJVihh2ioo/}c~J-f4MC"!!IIL*g63є+__~w~ JiU,f34MC4C~lJs{xgVvx{2[?x̖'O=2gA9'o/DF@) b.P9X@5lN`a`Gj gY&}oץo߷#,&&Ͷuvh@7Hr%03* aHEQ%lя}fh|/ Fc L2]gq5 +*Fyy)%&C @-*"^<^TVIf@Vd ȢE a:a[_q|ӽ.O'kR$d^dX8CJ+܅^DChmHa/5oa !QJ'O z,˜jmb5XL,++r |>;Vkdʔ)mmm(&GӉ'TUUYe{nַRH]Q?{Hۏ"Mj`t!W sD76(tU=35.eO"{wӳܮ~~s%[~`0tz-ˁ1&qv7hyOBo #ITʸ Fk? J00Zpl2ԟZ 6r`u: djcKJERgoFeg}yK!@! ш lvzXVyAF#(0ysx$Z: ~d72FeYqF#QP)Āui}:#_գ(Wq C&-u"9S1'W7;PRx//`7ssPYd9l_W—-!|[oƍ)rC{{^]]}J/n_~~~[ ;SߝlH~~666Vbm ˲ !$*c)P!.^4;ޕd$+󡸰i A lduMQR\VcϾ_A޳??UL>OxA{G7&L^SS38n۶Q~̳٬h* յyI$)9]ݍ#b6g7ch(g> ial۶ @jhK ?sVhxCc3f`ժv㎏7޼}?4]!K (n{oj{f8 OQH. 9?y]qUd1=Ks<|A?D=kIAlȇ׶̨0& tc?w~>/-Eknޚ9r[Y83w={f/iҚqbF4U뚫X[~ {${I;ⶇcG+$pVh:(!%% jbN! zzȾP'͔~a3=9ԥ؏e-&ϜS^@[0ɹhFQ/I X4>eY6B ?jK $r7I :<}zՃg, jtkLe?_ʲBXj[܏_w3MU`JEvk S` ֶ6t= |v=2hd&7̮-Es6RRG,\ff~%Ƣ5H N*1eì>6w0a(C"nccјK0"2:0iL/{1E@TL>_<<0Yg{kzkTU1ؒh!*3ﻄ,g X_2Фvo::,G#i>D8x A( 1f,Ơ􋃣рo8ڟD!b˖v̵"YmʲfEGRFXtBiX@7PE Wn՘{:[0`o!+2"xAdkvaԀUd9ͻr5)*=#q p? ;7Qqk.` E~VGj+c3gB)ek.rNeeep4tSJ(2s&N1 zTU @qU6w2'۳lݶ&q˔DK+*3L6Uk0otwb T Y3HjׯQWw/8^Vhnn> ezͧ=kDQĉeXpwtv~4܎475CK.|ƍ_`ذaDBPU7 ȑ Ka y=0^VԛB C Dwt.>PLGKm\:N1 I#!|w‘6, A"7˂(q gΪK# Gbx~܌Y:?F>-+W\ A#11yOne+H$vUy'wN0q# v/>`PIˉ> Fay郔OU}5Oo/E 6{ңGlCgB^P X d,t4;#Tu$Co0hAobufn IDAT[,qI`Nor- x-t3xA5a% XXj 7a2$933Ŷnnxި v;v,0 XnٲEk??ߝ% '1bx>^_gc`Y[^{v{j>т>XoV#GWaHHp k8t0Λ?ל.sάMٷw}`Bd-Tb굈D"})AFFlVOVC$y1sfϚQ{ & &O7|7.Y|J$x1u$dddU N됗7|)DQ˜1{_;Hb 2Nlb0 ظi3.ڵF/}rQ4lZ[QRRO>Y?~|0b`= 3f4nݎ-R6n_;p7 FQ0ctI1VZcJp8T++>AfF:Wʃ7J&xbQ%1sh"-_F86j ž[ ƺa0VP\gB/#u ^Љy=G~No0X6ar]OwwKkKSMPeuP8 hs{f޳OY<: +aj^`2ZL,51taЈ"+(L):41H >mv\&48;t /p܅/D\Q̘ 1s,`{zwY^uճpӽ?Pֶ ق٬>AsY҆#Gik[;5%Ӓoo .Y|yҖEaH\oUW^Vssm c绪Xx CK=|o;gn3 x=j17)1t0Pa11*TK:[QRyՍ@ݷtwZFQ2ɩGBZ$1 1D4dDsC (Ɵ=?ή¡b$IlBG[y=0gX+B@@4AA1LhB(䘎uTw|>㡉ID"$# PWWBf=w(h5HIˀ`1iH{̪ԧ8]e`Tv;lV#ރbڳɩYV;7!+wr Jod)Dv~1vm^̜L؅ƺJ$% 5HNߦ[@F-aÆ}`VJiJ,ӶQ%NߏJDB8~{ם Cihֻ iX$%&bMtur:<"+;۶mVA(>%zD| \x"ƛ}۴)X*lViS'K$pvp~a#Qdgg`>`T+>=Άcj;V:aCmN`80$"6?-Yz^/LA:MGVCj(l$|ߗ*=/ J;ZE} chBѳY ( )&U9 !> +(j:޷WvN)߽Ƀ*t#yvNgOSÿqE$IJL$VA_ .a`/?x,;3gd%lP#o׬RD"0jBGsڛC?ɤUms.NLN}FӛY"UQR&Ak 7`6[Q !fO"sGb>Hǜ1I`,D0zȵ]7.yXhBwWWͪ$2U4' H{Xl9ӡja2 0qR*Tb޼sԌ, _ ^/n hmkUUC`فOp $'@"d2" ,ՊcG# yᣳ)T Ly)\NYGb2tF|'ڡS9Jd!Uo<!֧V9$%(# Y ?C4u!R 0̘JU0TQ:!P( ̈́*cwoX++|3 ht?o_3xϯ vJ( / c%I>W* cѤ_2ʤ~ _t.oIVs3ϳ3,Ʋ7D)*+eCeL_8;B!h?y[j,Ko(ò2CXPUQ^i4[#wM( aJ`hbZ],_T~ƦfPW˕ AqިBeյ~fJY}9)Pp$!dkj "9EW^:Ej_o_-^7]/1 *UXUQq<~BW+QJ)KQgYl|!v C!ȒeAE,8gre Tx"aXE!Ky*SHUU!,)FN'NpQWUPUDaXc06Μ93x6B>C9$ے(;3`9_ =W^Ģ1|v=0t\t"(6}` YY0 OpǏ~X{{2pW\|RR9w܃]"'+_$8&cqՕ;ܴ4l|7`ޜ(5Oщe W\r Y<3PUyg(aXc[SW#^۔HI) ? G}I>r6׺|ghidՙX+cYRu\,'htw44ч?'6-.!;/&^C%KHu"Zr'!{4gVQePX ?a|TU9O\3l?>mRg=5 -eq#[[š_Nq13 g>tH({,BF>HF&(qJ@7Fm*Ϳ} -kuHYr$d\E=aEUM=ӦN߷gcspyϳNU!b_IUUI{<!"Hϛү !@s ry2Si?*TJ!}c%y*?O>qd{d !7 DQi/!7T孢q !GFQJYRuQ w޴i]QbY6:{l"EQq}U;wԆB!(ړ 0@VVB)%os=%c%e_jKkY6hB"^?=N8;]'7FáόV;?{\=[(2X7w/̖eiUclI#/`uY,qA|B^N-<7F;7[^xsRʨB-eF)eUUðnZ!bPJ4$%"a3*ptAW !/c9HRJUѬ8~c/nK$ $}wƔpN{z.glr <DU1J"5 ODݚ˳JJ72%MJQ`ƍPR ? Tr8R &%$!wH&OX4 |C0eEQ_bUlM8t-m-xGN!X틘O=ϻ8wQ~^&;+I -t-bƌ4 ^4776t?Zo?)@dccU(]gA 9Nˢ+0PyP|sxI.JaXʃkS TU@oao[W B}7ll  '9^3zty9#?wZ7PT\/}= ׼-ck?d)su2 f<uU{цCkc:N`sڀz4VS M$уyqDBUE!C$A408vdj]e $wn! * BklS^k$5GvY?vXU°};.Z^AMnjCŮ.cϮ#L0[^/(!@8DIï7rxYfj Rr=8VY+\-[@`$I&BAjI\\+*N'eu9BaY˲!u tfdd >\'c3=O _bǟXgƐTTWWxpQsTBǣ: ~/>p/F~?~50oxmkˉ Cbj2 HE%2RY ~L{gdNqb$H?x}O翸 zdA/\:}9UCO #@!~CYos+rLhҒf?{5o } fj,vvoR/:tJ9 6n/ϱH4r:Moޞ Ƣ3YI pC*<ȓO=c.yCEQ(q|,^ѾPk:LN\_#{d` 0gbl-] l7)Hum o{7|!f䤤2hVPTBU,JE^/U_pwi0yyy 8S)pX,6i'G֭[/rVGz`OƁFv{_%NSϫ̙FFWQX6/Cs>r,dzP !QI`h.H1=)[LɗV  ʯz^5>qqb$H$|ʭp9{` ";ÊDB!hh݂F8 )]]0 PAM͵fYFlE8@0!{zswp__pЇX$Y"!!<8;*"||n(gZ:xAM\=!&@IIa3: 14F`NAEfGyQgFwo 1QYӣHֿtҜK{\] fϪd/DV1c1%n$l۪5(ˋL>q1?NZ/tk.VU9ò0L9D"`Yvպu#/UUMeYjUYEQhp8 A$Han7(a7%IR(!,0J}}#FFO4vN׋@ 9z9xC(F0p;:Q%5r$ۏ F Ĥx@ӂ[kkhlg6ND8Hhą,<+{GtCo]|ݵ?2c(M2"Qb IDAT}M3 ֪.{#l(fQLUH4iv."PI!gpXD##8ۥ*S$QE[\___3ctUVQQފ`ڬ C.O}aQEJSzA4&xYOPrh8LNtj- 6Ttw祇WaD_] ԛ2VlIwVxIͺ _k7IOIyv9h 0L0$,\._̵YmF9$w<keYV!`>쳉 Z\aaBZ)F'& YYYdĈ zQK׭[j{2|p%&LKAi6X D`D{SVwa=XVOFc }_ؓ0둖@$Yu7 r2lCE=_}1CnAT`2 Ehkx$tHha #ف80lګ|έWEVPuh"㨨 LEEwoEC8K>Wƞ=hСC+ gO֮x^ u40k L&aBvz HFE% D;f$tkxh4zĢ~*" 7KvZZj_ch|AX* lABPJ ,Aok 㴺x^{-JLOEF#6Iv~>^I p8ɨ@JvJiIFرCF樂 !R̟?_ζ8qb\WWWF||+--h4"/"cZCGn6lh IKK CTQIQ6l6`p!2n7GQ}ؾc\N! FXf3D3*FР@ A)3PN&M@7nLcسu`˱ؾ}LiiYM;~u} Udaem%v(.tʼn`)?$B(W)% T ˜*VtMòLҋXBۺ  4JgA !.IQU%tM1~>,VA1gnEQkˉID"!$!/go.(vĆeQI2} ]<; &Us-i^Rzj:4C 3k aМGk ]e)\Ov$1RUf UނayhX/\نϵg_ͯRJIEEPJn#?? | kتðaàj(6nܘ3䚠˃1$$x\pv3ƈΗZmW %9Tt\1RPYpRx9zA.V }ae% 32ee=ZK_[\rjMƍeY΋СC#VߗQJhPPP@;FDQ,ڷo{̘1lWBJgK\T%s-Fs#'|㇄(*"D=ATl;c21,_]-G1jHcƔ Sa9DKH(!'yk5(^4M8s}?x; N*})+L!J ғ`b(>/߆yZ;cNQP,rQEZO҆Þnobt06Ԓdl[rQ^ 6>ʴSfsN( C4//'+;۹߾=gw{ e,TU-}ܖyG AC#DT L2p `~{_BVab^JuBŨFc$ ]0Ntä#^bZz}VJRI i(#ј'h8.(*һ{*eYi9Y4|F{QG dff\ DTU cooo!0<ʉ7{^N'QUU k DqxA}͈)_8dPT/0 jW yGx{=X`xb43/9|$66r kOg3hi@An= qn-`j,M\m^YN,G{W|!V =Uu8RS#58ZhR`5'4N` +2ba QBq?Ru|FJD[gdc e#GkpUTUEckϧ'o6,Lj,'ګWbҷh9CjǖA@8FAt4?P+?쥢bhqpDQbx=`P n\p!.6hˤIxuzpL.,(2鳏`qwƺC-#ÑHvFN,9yGj2ǎKFZkiiI+**j3fL}BB?%ϡrdff:NZҒ_\ߟ_3 G q5WbYQ]]xA{Ñؽ{/nX|-.h{y%E`X^h͹>Y3g V% IIId̙]c޸N|E-*zU h` DM,P *TAáSAZOÍn|y2s2 7dܟ~b6dE~`XѶʣG# /= BWwjOH6V'PIiPz"K10 <`dn\C _H@EQ uzaps$>x٥hE q1#==%mQ+r&ccfgg;Y٪($I9}A>@Eo@gW.bxhJ#=--mݘ9V/Dpuk1F+t5vuQQBHHp@CqBxQZZ]w_o]^2s/n%Ȋ&%#u@LZpLH!^ MF:Q 'BJk!iNU)*N=?]$ނeꋋ}(2$={BUŰֲcͰ,ȃ{UUչggz&hQNHB0 6^6a0뀍sX{wa`D(ghrNs~̌,?C#{o~>7%[&?=?vͮ4\^ $( 1XNxIJ c$yDO1n:ImDLt/ivp-/|Z~e2iDB^ !gpA[tW7'~vOoW)XԔ]kza"͘#&Ɇ\.W)L'WB!PʊfsLB$UU3eYY^EQw\Ο2"dfBC'*.P**HFSxA:a-pDԆcs]Oѵ4Ƀ&iR}fiYlo7w1CROʜ9\^w1]IXz~wqa3s.Ly&M]b!'cAusHx4ncP}P%#J&ЋiC+(lGG8sLRR^5ȞXm;NXrp\p{5p8CT?=՛G~0˞~nz߯>Oa d0X,  qF'#/}s= E8qbVyyy,,X< E/|ij:~xphOjB0o޼ۭR((e3\O?L7p"P ",Z߃u.ahm;ӱU сǞxMM( }$J/_=EvݼCøu%p*"Ư&ox_iny nÐQL$U9Y!2|B.c)(p2ɬ0 Kys*I'ں|'O,/K֯1 BxGgyq[ Kb?}4,Y,>m略 4N~ڿIC\㉮( X Izy67@ݞ?N p4lq3&_ J.EV}v ~ˁ~g vNrrD)E%X'sMr%%4H8)aVL 1i" uH4:gdxdA6tBsˊj3}$å1 w7}kH9eTJ_;^Z1~a\T17ƙ[ _ k0.l{6hhYu/V1:dal¢*",>rlP %rr%SU"Nؾ@(NXCVGx6G~c齻>~˷t  tX9ҽ?2ҳ?2ڳ?2ܽ7, FzGGL*JEw%*p ׁ3' _q!A4Ҵ(VUUUܲe˲jEQ̲c6=+ɤwdMY|ɒ%'Wa ,e`;E2† 1y8~$9<$2 {v*ؖ*",\D2^Ċ+022x88,DQ*VX>q,ի7=l쒛ݪC\&W8#)5QaA%Wζmq BT IDATp4eryD0[q~O}.›&r΅2rfMţGQJı uta!yGcaq8]V`kqď}+vc />- h!CV20}K`aqAI ޞwUwZԵbWMsiKy `[6><)ߏa7݄Zι1%H /oVad2gUbZ}ow'\m v4jڂ68`2Tu〮6⡃o"mKU}ż$;%/^ LzrAPS3AaӦ8oaUYYOgCp)Ȃ37ngo*|㡥/KT.g¥1= sIpB`)ĹР@6Ǟm[kınD2xb[~͠{;kc`p~Ѹf|l|,X=.67VE6BF94 !1L*C•MJO,EZ1չGPr/SlnTU咸$KpYY{e lMB`uUp(lƒz0*VVq*I|>Aj,Ƙzz5'&*_?\ H"$zODndNn y&9F,,Z/萎v#h̚1n5F-d38Q m̱aIgP=KҥXwkAp~F!(` FuD\xNl^yƦ鼱MͨV MM2[0^CS3V`(tǯ_sN^kއH_ms.LU _ʩkAwKzTd~F"M2nm4FU)=JfZۚ<EqoGIY@VBqѺ Nvbų_`QBdlt,mmIdI` .yGde0dk4 ҉,8덪 p H(o6sw_C\.&AT#HvCDRsUuf̑9C N &\|1= E*aN RӸ\\'T89 =Y 21pa^r oڄ:ՆX{7J9\E7^ɽV#_ |潫f=eZ_x|nM~hN,[}G6B5ĸLxI$wPD_NU ٽ-#:7A)<7. n69cl:3g/r\{KyyƆFfpɶG위t 1g|2<<+|ff2쬆孭.|ι("UUUqRJibggg[ښWZu4Z[[[~ֶmA4w0LtOOOܹs'7_*W3:tMa놁_1TD"D"x'.TWWX,`&Gq4 d oy֭EixG!L' T'qt]'ðcNzoV(486y x 8{6\'Uʱl$  ܣ O<:+j%3p BT0\nCVQQ~u !b4/pI.AwMxpg4\MwI|lLMf8T(c.@G<"ݽX 9Eg6i1I=n՗1 3 ! V /G rP^ase3\8L" [Aád pN !PL'i %N  Z/@YPB(2IeR*\[ #(ҨaXeiz)&qp"]!Th`&Xg4m~c͜Y"]`<ÉC:*$0ǁm䩂"3e~tF  aMB2aRV"D2)@@E/T "c9_*N!\AbB"+ԓH_P% uppp >p}?R+4d-" .[WAbwZq 9B(,SX(撢/s<7'K*د4ez&LL(@q،Pn2B{{DG#0pRz^Ԗ/Sih b1TA!x%֘f#jBJ(㌑x"1]+KۭfJc2o6aS;"ӝ5PX J<> WBX/{gpP_=^60}8Y&bQ N\NZ;&X \ 88!LX'[7GP e[L>F`? Rد8眑o@Um#,C9l8'Lm~)#Օ~'UЊ87`y&8t]Ǥ~hL}2ײY.BC҉/84M B( $A`,kgD"iJE֐>Sed 5 >`dxccpl?=0QW_={"`pxPdsY$Ih ׮E6hw48lƢu;k6z_wT2--h,J͢\D0޳UppϜHo/LD݅+ˤa&[-WϡT'8ޅ\ x2w6^DUx0ڎ'܊H`6)Rh3f9qDGǢ =LVʫGߗnkPK!8hAƙV>k(yާGx|>49n#.SCd626S2b/5a)3y+JxA'3|!oo I}c]>y^VsHZd\设/5H' AIB*$huw 8zF1O}2ɟ.ݲu "r"\vs\.[> j2ppN91N(ܑE1418A(8dY w%!!tBWC7 ,K81ʇ;+Ps Ѓ?|J/Bh{q/OzA$(BwbFy,'3[ey}ӡ3JΓφϋ.-Gf_C{w۶n vlSr+ٿ>]F|߽_CTFy!!g8b3(/~WH8YRE8jJ" \'2P_^Wə!|& +sʿ]53]2IrP<@IQ8 -H`txw31I(6zöe{h Xjݲe7Bf2 dY֋Ţ' f%IA0)cjjjò,rկ+!l||sN,ˢ,|{?#0:2 9NarR4$y;07*8p%e\f͞'[ADTEIi 6?,Ep4jk܈chxp%InGKCHorο,J$}mPA@c¶-. NBdP v6zOu@U\j9NpNS׎;;@|8ZYY|o?4k9 90sN)!d;UWWw>/tdʬX.K.#]LZ{8i$??N1?@&RQYd$5]Hlb3g^~ 7\b_wnh͟7<"G^f T( 00`4xrQe/ HtqK}7kq7{ULL&wy(!Pu̴ O.8dXrpPBn1&yd%lfvHyyؘW+_K%ɤFiYYyCbBH~ҥzٻNd̸įpJ-2}^|$YF2eUȃ/3ohP/\L=}zlż`U >̘YS<6l F:Ϸ5\cYN3bu,ؘoll$2 Cp8X&\4%~"B1 H$0-Uf!\~۲۱!2,֜ ӛ184_؊08ܪr֎PrІ sUUH0@@4 |>0! ox߬ˁuDz0m|4R}-\.-p?խb;~o}^u`s[pݿoI N'^Ik֮]c뎙f(nWFOG!Jsjt]W!vv_k*W^ⶢ5k*^܎o8I,jos Y' żQ Q%"D&r)/||(0QxՅe#BKC)e{s _G‚O;~L,*/Am^ $p,?`966vb(A_"|Al0a\p™FC@oBض-G-܁ןzdXd2$m[T|a csjk Dߊ+0r2!8OXueDɛ%lvb l ٌ= Wz!IZ6IG9`B2Mu?C Bf"a`j*paGkL- IDATXBM,1ĴiUlK@"/s?w-2beja4Q,d T~ӧNqXO=Mo gt# p=HS2BΎ/s)_T]m](M  "2;P]]*Hp~ v1rsf[0 9K]#*a۶Q=m/s>UKfϞIkhW2W\> ULHgaʦCjjø] ӓoF~kzv 8q=^I0KF{챍a4clUjedhѢE=[lYH$ .<1 ծYfu)"IeD)`~%VETT3_t " .XQUAEEb=}=(拈D"E. ϋj,?wF(ϊDwt˪񠢼uB}}-i0"lFͺo ED@}Da, PeP,")XKv4LvKĭuk'w={L.+D^|diIcEٖI'n, Wf,UQ0wydH&Hf8X[rѶa?ټ{7fF{(Ô$'{1} 躆`gQ* 9@ 1 &H$P87`fY0B`Yyի< s/ܷxktf(а-+/Òv{PVа*  1 *2*{Pvr̘5 ϊ⬤~94MTUC=t8iڵN:U7sKv]tEGrR9(smohh ]N}}}r\.qD"eػo?͝ !457 "ҩ4r,x0o\PPǎaxt|~+W,ÁGr-}CO|w<|БWZ ΁x놻wA$I$Iɇ& }[o8.$Wpl^)ɼLB-E=[v]mul<L#zUAyjU9w}nZҲd||KXM%w̛w6ni*^ p8lЏ?+W~qhphE_<{AQkdx}/͖5K#-޴{$6CH p B@వıvE<$yOww*o{hgE9a:P"qp+J(bć[ Q~쯪| FA??{Ùkҩ]8%yx*R(J'o_SOu^Q,qȚ5k 6mjK$s~D z{{929>yNe3e:B|~]Cq򈁡~s,2@C2 s>j7Pd F wvi܅ , pM',E_4nTX(▍^t-|cV(`Sɤk[K(j't0Pru#ŝ޵|ȊB2tvc%!R~8D.x#vd,A`gRĖW\'n0,**kxc˜.Y9NcԶ_B9ssc&;3O76wlUe2W^|M?w*ߌ:/jnؖ D@0Bk( ݀["…rPTȑqTa[i`ʦqΩcۧTeMm5Ç,]P(֚9s-_0 9ͪ(:P(?I(!nooo*++KVBz .xj 8 e!Icplb8'+W,Ǵz bE""#Ar8'#[ezD)%uƕC f-~\Bp"5U_%CH.DZF_;?IM}ԼB+B-)Hiq~\o~{mQUAM×_yֵo TV<;v#UҲB@FGl:3= w;v+aY*Я=me|D ]brˤː*fa8 aF5 !X8,a5~RrA6ub+[y,g̱v* Mg9$o @Zl('ޛݺw뮻ozf=}_jkr~H,? QBmιKd pNDJɲֶguW_?H9;22R_8.5U3 DQ9s/hcG-kZG&U*4,u`pG9"(d5ЪаBރ{!+fss.Ÿ1MK>c}UuN`CW B0ƐHax**I"F ӂe.CUjEQ>w? Yr!ËM1:І]UQ?!Pਭ;EbB]DyaZ& br}!Jÿ]qpA-EM!s覅x lg9 D44c3a9 h9cޝ}Wgԍ_nYuXq p~Y?\Ty샢?4݇t5z0kv5'0׉ ۊVuKҍѝsN|̈́cccֲe˺;|p[,Yrjǎxpٲepxڇ`m F#X4P%j cLr\*++Wy<6_w1vZ  $I(IHhnjƑǰh?g6\. A`[//HK;П}wuu% '6"Ưox%ܔ/:h 38y$OP팣: ᒐLHst͍ADG="3mыC`8xMtB@Q7+ h||l{֬Yܾm[yg{gDʽ٘MrsJnb(r 7̚=}^Y(z1s F) $R̝քڀ q"6H.z6%J, NVPtV;E9&]_!}};|p.wf>\qʄ irdzBu+6d <ֶSTu5UGMv˒=9|BrEc1sn? )cdiSʡ! <e~53߳mD"BH.;5^oP/ .G9$:w+U,*wl0660 !^#$$$BBBH !^,vǮd&|)_y̜;wwyvx" =to !esZͿ"~'eaXt PؾfLuk>qgz8sCPm膉P8z0ƏJ)Z;yZ~lǵz0⒟]2rT05@ B(DQ$shj<JE1\.XtIJ*kр3P $c(xq.}Oܻ#/.;f{Z艛͂h,JaQi_9o_gW.EF7Mh< @tu4aƸb;):9Zζ&7i7:[[PPŔa!9 P9<_8v47}WBm'a0x|턐ܞx4M89.)t#҆5ud@*huvbjyvuueԅThPa8eP"R 'rCBLӓ`Vb!vOǩ@Ÿ>0zpp 0!w_ ^x=⹩ZCP‚J۩I`~4i<x\utiW=sܓi`M6-y-`p\sss~$1^/nw 0 ~wwwx<QGUW,tIcaqWzx"@ CŴ w%">ĠNh, EsC.7]BuȾ]{@dHd"C_븀;U3Yu'qxWOS¡b0u• CSaІJ8K1{/YY y 4L!2`OvQJY4;W8kbuR2bTTD,1%9=܎Y?e6}@'cΛhC]c1yr)|\LbqnR) |Gmb%<.pImԩS+Vx)J=hV-((*V^= c4JIDQ$I5MS+#P!LO fEwg7\.Q>0 A)Ŗ5XU5d`2݊w@"c3 *r2#xZckPyYbd]]7RSvcW' Eh i%p@ xj4a??b;,bqDx7rY>)hm@X;Jrh`80!+ ɄƮ`T7@.;lB:Fŵ&3{cLz<ޱsWv;zϻx~~WwUӴm`H~~?[?[_Wɖ `IhC^ u ('f <4':EоI//ݏ0?'csx*;K7ֆñIEr8J].S)-hX"mTrfhTՈ.bO7(br*@cBRuuu}>_E f^\.X,Jb1~i\Ue{l6?^푫[yk=5fLjvx $ʨa"#k pi764ᄇ+VѣđHƹjjsN]~j #o opMஶ,YMs Hť8mSiU?@;(- $rþ]oV5VUSeTLAe}?jXVYEhnJVWUnY׼J+Nd i7_cuGg?=O+>wj0_wO@ (3X4Yt%/94YWWWp8BgSιN c#6lhF#Ѩ'sA(җLJN)mY`cFT" ^4ɑSqC I6!J'c% AvCqq[HgK+6gCl$׍Ƨ#ZBMD _ [R]KAScH8xcw~^ιpǗ9#LBUUˉf !Xq$U%sK3l:-fﰘv4}],; /@2$hj2bő#G@π1lQPTR=$[vϹό1|dMàv{_ODZp:{zJQQ=֡x?Ġ1fo\!PQ=[>Z5;sձMGޝH7ϔ!;o޼B ˖-b6Q5G%IRLJ$cPJ$I= (ϟsNOikooM8> CA_qO0bO9gw>r ]PCUG+T+`EQ2 韃q7n>q&ٳOdWk.+v0tc]`;;Io`r Ԉh8AP:vlB;owCrN`ǒ%'Y}'>$x,v՛TH˵iaVTkr %HBE}Μ9 g4!'͛7[Ѩ4M; iMBF)Bbƍzӎ eO/ݝ²9E+t•E&B3G2 I1:v9!?~Mُ6oq~a/VVB=]Ͳ>Gڣimsvgq*;B:"Zg=2:xR4%F5f)5)VQuiNkh&Acv}_|('?jaѥ `Yڇ7Kuc;+HDcs#zl2!es|˖-@ 016>IT[PP;v: 3|;e~pEV`Z>GJ2LTGL*~ \:$gn&]D| 24O,%,Əu$TRw(Yg=IEO;)'2o_vy'g ]^%l!\"W8xuq/:y,(rg68x #qݖ̚49A(qQT̲G} #w-. ciա.$MT5J*qƘ)nWIْ$@ rRSI-!+a4tH4a:Y ]$[2z&@F@8gDTȊW"$.}?JbL)31ÐvtAT2&k*圣 >9Ǯ79|pdjpY>O1!dYn~oW۝ER9Op5J 3P5+ǻ߽k$Icr`5dÆ p8\A !AV{<)S2džSmm_yGi!D}AeUX]Q:d$cdMfN98ϫˇh׿ 2:ԿH`ac@dDMl;>x&3IL&aZA(25htS7cr$IX-VJ`i>qNY9o LA$IiEݜA @֌yhB"n(`C i%IXX~&I5f'LJpC/Z Te1훾4'/gIljeOJ2J1P@qlV0fz-?%x_9l+i_F}?P dvdژq-1&Bw؇O#fb1A_M Zex~n~$67SJMJ+B؎EWMi^8 tJi |d2dĥOf;`=rTT>;?gsH_-! 퇿J%+YMliBZ<4q_l] 3,BȩG{Lj tdښD$)rik]o팋s)c&T__<[$][ ڸX+[c%|tP oa;s [MzD,d"o1I%z2{ޕc&(8!m{$=.K%ctMkBU2xXؿs.\vaw~lh\ݝ}9iA$z5o¤QJͷ  @T,pegrN ,}֒Y#`JtZx"0a"@7m/FA:#&>4WOӘ164jιҫ (M_{Eyy…;Owշ, K\Y_uw:uy9?Ƣ כGP'.' hRCGÞͯ߶^%OqL"V[ls1hkmGUP^R\n K*ph4J<9oܺtDu={JPXۍnF89>fGQ=tTM9lp:uDi̩,AŦR)ދJ0t8>~k׭G,jwaԨeMMM'M=C9c`&n~vT# JK`2YD;0YD9n;+_k^GZ'}ݓzWH?WΟ̸7{XQLa[ߦf$=l,A&N5NXF:J.,g! 8dx 80X9")*nb=ƴ @&|O}.z5! 䦐ʭGLY}vHKB K|ܱ }7\c;NxW 5Q3+p#=R:Z[ oQA:WT.#nZWOlyiBD헌DaU͘9cGKhmi&D[6|D8O=}u;@@׊`O+@^PP*z*HΞV5_7֯|]|7lT1/uVc/4t]@t ? QDkA\&C X0*jPX2{F(*@Z=Z!or/|c.͞-F3р{kѸoIx/fh|JDA@uǎ` (~iAcINfD55uaGYyL 8ZADx`: d\.rl r4ϣ 0ǎGiQ ރd21@uEQ;s_$ !cL1M3t&ȲG***c!Rx/H͛7='gfaoo/qu_!۶כ ol1Orֱ ,K#ػ+t [MDu)u6#(|凫IgG'aȩ3U, ^t7vKƊovs&MCQZ\/{b3/֔R`(..Le/\.^ 5J>pՕhDJ#B* iࡃȑ5l)U@>:&nimE7[m(8t0Jr:`ZO=& ǓG- 0v(|ZP!}j v'u7|>Ρgl vk7ljM[0J,DOAS+WFc#-*Xe̸ɢ?i:wK [yϖEié6rŸ1\g#[RsE8jtnlb!CizM9blkoLbАjl? |.3PMtj/z1 Ӏ$JϯZRY euG~6^m8+"F qPpl𑇡|pwBO$1w`qA[}u[]0 "Apϗ1lʴ%cC$܈GIfb.Y8zp7r =C8TۀC0fH^R3i 䓵CWLry\߻TOpDVnϛ%c`h(t]àUScP;63 4Es~b!PA7M S׬x儷;JYO8 = S 26^ B EpgyNPYN&8G@US/*'C]K/V?ec vg{ +V$baXmv̼rdh `,]~#S9q2옹s8Lf);;"[|ETj184RZL)uz,˟h}C!lڼ$FTV=ӵPMľ` X? \r6BkX |GOgֿ=xQ#KhA$a._aBmoT b*?C&ߌ\MˑH̏sX,jjqOHT7D9aXM5* ȃcJKF?X^Vë:K1vhlֳsE@&B!=:9]BdLƐbAqqO @U1ix Bkk(0Mƌ={Յ5cɧظi+fL 0`[mO/BPZZ 02>^B̾8bS,$b5grm=%on2lM$P!E+vG]~=g냏f\{$LE7g{G[!xs!"QAxT5wv6C5 PŊAI4*D֎:?VKaWx'^WOynmX,XVA-0ڭk +$ql^i`!I ':5sÉPTR!&/xyOL'gȒ4t 4rf&W @waب4ًD,C|Hο|y8dCw71kޕ(Td,5xzQ1zD$D4BaA%zZ}Ae=M0t [c^93 cTF]Ga[l\.W1F7ooٰyP?+ac699='Ǽkz,$P]R`7 w]ssKF`ysa,P=GKG! .XeD2iu%@DQ0ΑrBM  B0b@TXsx΁?A&PR6ͳ.ȲOmpٯps/PH-߿b |@,j%;=vuv@WA\A )2@V,}tM$Y1WE7f $E`8AAGQ"E8-P; Se$G(ǐ!C@ћyWcK:c()(쯾jAa9`p܋G~X]YhUhÁ}{0o%X,xWp8L&!K;r o*5LƘX,;*HDUՉCζlAueeezߟ}С24`SSSaREEEK(rvvDQd/9R߀j@| T^ÆC_;-un7i 8.I٧bp ׿u:[w?ȣ\u( UM҄F(JU$XicdyA X?B2( $`cDvu--o %H*Yehwءjw*md g)L7yxN4Xt7c0 00ILi $ 7!2REa0MY1]]r PP~Fdl`zIte2EyEQJ'9}(8˴} "EN NRL$I{cRzkr)FGg3#l{ eɚdZ5ӽO1M&z*]\Z:Q]aԅyC펢FZ#!isguw `: !Z6 _Co8 B2SoPdI;g Z2 Ȱ8 (cӿGM*E[4# et;(dv6( SWIppXKZ7s˰7jDK%028:!Z V&Oih9ngDYq  fT;ѓ/zg!FO'oԩ3a0fx%v9C YwVnۍC&6}&B rrrI̾bJxēhjw\Y,sժU"ȃZjii)8qA_⢫+r%%%3f۽{wEkkkQ^^_4[XXQ`XE0 örQߓ/TUh,N7 d ۫E6 NqcfDIugCZG},i3hR3kںo#][TP9}M1|rrrPR\ 00aL2%cc3a ` 4j8~tD8`옱˝Ɯè<ݜ5T$ݰ$_c:ۋlx̏(Jmdilz */",-w$&֮[`Y04 #! a|F͢f hsZ1cӇ‚|2(X!]q0Xv طJJ)sêkX<rt!ߛ ݆;@P=t($I(X~8=k6 =At L!aڔɰ;EO"X~CY0T8(BNȎJYvzgsDfL?zko_e*7{ONubޟnwFR=O<8zhMw5&U|-ylش_!w#O?U№w85דk#PwM/GKw ^㪮׹uz̨W[n-@{FH$R_BB`ӌ ]V/Vfɒd>lϹs=g^[7p/ wO=K/[]=8r UXP B*l:b޽`~ȊB֭]ή/w񨭮 T @S7RJ)l6 \{@Okip>aS}޽pJۡCԉ Kfh?Ӷ*04<*uv⒋6{O?fUS#M().UKaff߁4PW#GˁTWbמ=m5{ 1 +.G__/jӥׅ={̰7ΏB/E`Oմk{c޻o?u5vϾ3R4sRl{3Clx;]ꛩd~MJL `z-2>2:p5WTΣ!cOezUѰ#{fV8|mGҟ_ckD,GZʰ1g޻OFƙRohuJZF;iMuq'8LZ\ B<`mٲDbX@e/HS$I6mf;ȲE%o=qzuo}+>@08`2"w#ţ> v(0V.倢HQ_-' )d/ J]\3f!]9"̟DܯT/>{,Y%%"$:5\:D#jtH!O( , Kx91EVJ*4qz=|Y 6"E#R^m;JM3D-vJĸq ©axlzhg TUA4PP"K@$‘@f2/yc_od*YDMp WyZQZ^>3[B ^-j&iN(emTx^_F>0'@)3 HBӶ0 q R]3ĖV-"Yo !oVolιh2tuu  ,BXaBA>is<4J18eKu9Q\J%٩9;x.H|+???>44TZVV6z<[{{{y^^ޘ,˼,˜j0 CʍFcXd yp'''sZ?UCl)oВōhniCyY)oƥl@>:dr9CC3 fPU V`6N#@} ),.4 4Hst,{CxPtřŀc *OKgh:vh4"?7.CçfٹB'hniEuu% 6i ߧ˺qaTVV,˞2nmwl'&>_<Ϙ+z瑟ܴ" LDd4bY3NFOxw -[`keJN;ZM-@l$pkvl][-7?"(}C7-1NNि:k{s]FܵAD0+Ap=e%yw(e-#ٟ!g)* ߒc??!B4[_6.-˯ρn5zvh=:!!B,a%Au WI.JTrCeg7p48oRYߞ^,**]PVB@HcQEd"Q0 Bx,V%ɲ#L :A-++}&oaslOJ{Tl(؋ OQ]@p)i ꃦpa$>*b؋Dx?F!h%pB(nNh3'|KW_>bՂ}.Ax_XJ攖e9:<&pz5V,g85 [d*>1edX,_m@FR "q&++"ckի[7ţaD>l͊}x, l{UU&іUДd"DBi}dVf7p$>wd[W_391q?aH^o(yazWF6NÂ:ppY,KZ"S?t͹`2pDD!>8i;AyÉ |:!Y2:'3>(>V{80כLc#MXwMw_} ]| [ ՞ QodD4nBuVx4"G8,IpbO3܃@0q{ 5M[D)频HillP+NR)3::󼒕8qDEPz;v\lٲV[H0oݺ@3=GVZBFw~*,//gl v DD"+PU+/ظE'Σr3q{NqQVi6w`xԃ,FA"zRMMͰxp%ΜsXEQQ!Gٍ,,[cO)@`nbi:wSsRJj#ʹ <#H@QLfPRRx>L?r!TÖGis訮Rk82Y>dj%) C)E٩>z}_h~]l @mՍk*M!-mw\ww%YDS \ 6s&`@oT=ϻg.=KV6EVy"86Ǭnû}}֢s;x ~NEFFq2X;^lէW!QJ|tKk؟ibIb~7vL4L@*1A>XB(xT 7.@;MK59RYvVn%5DVn mb+yaIi]."~}'pɿG4|g1o Д( =Y7l{y mǓִ[-9Eб"q;w!'~M. 2B4-5$0!a (aOz!P(Q/xǦyJ C@$ 1`uԻI,_y}g)6LQ± 2*3]l]QUM_F^'$PIђ`MWc(8* p ,6g~le a0Z LDB8Ug 4'TsMM⋯p-Ynm-(./UU3y}-pftFwWDlUihDßJ (hdUU5R)fסP(I@)%DP[[=>>tI#H$bbJ$P,әLNK|>lf(i1J]l@R wkBgOj*+1#L<ߎD`ޠGG[ga0aZk[1a4Q4I[P5m0>EaAYGq!\k3W{v.YtY$(OQ!K1 gj'w:Ϧ(8tXv:޳jYQaf:-ų<'?LG~ᇃ=}ܴ*i/S(%//ӱ$\lՙMi/=*swwo]`6L88OOv#2uIx%5$:J Cc":!ͅdZbK~3=/5 ǫ֮o[ k-זr4h-!boNp'{Ŀ},tw@@R 3IRP@/.ܘe>?AJʒEhkeD*o|_wG|j`Q.g(ij,(Kɲ &SaB*|h2β۳Gb s /2[ۃbA8ԄUBˤo3 qXYP5: d%N" IDAT J&i_Uyn1`6P _"[RUVufKU%ڍgLFD1W. nί~Pc ,V0"ą (~f %\jo*-,4~<MU R!d<Fh) ] ^dNn6[A)%޶~=5UUŦx9)hLAa0 wo͟?>FvCl "dPk,<>k#BNr(hB4!̸JkWԂX$0G* s˗owmfp.(`Ob0xA@}B3U¡ r|CX6,(ihkAJѠ(,aSJH)(8UUq8)Y<O>Jl6[zv=H0<`lX &٬:NӣB;r蹃Mg`M]˖,FҒ"h d4ǜsd/N+Js,XC /O x;C蒜;S@4l'jN; =dCnN.rYqNoZ[q5Wv:ry>jtW‡o.+A~--P8QLcd3#x[Bo-U)n#Qb #W@;kk18:G`Ya$7j2}|7~y/(qt*kІ !c ]Ixk|2dsL5˩Zz]-277ud}"*]: < muXe*M RR,;GHv%5FIM<zB>_ʝe҉eY²d5&%iSFz'&TJU5X,VEQ#r<0;KԪȍE[~pLP5hTCBg= -Fy8(0f:vJ W(-xr'ɐ&ˬ=J 7"L*1jV; [F^E-D1@Vоm؜ "W*k.Ȏ.'L7ވ,;% +/ߩT :JiI:d$@U4 ![WSTTLDQG=c$LkC4R*zfSEEŴH !frʢKUyZf,TJK5d<"6qȜ676f~RU]AԃaiX0L)M[cX @44?_lJh(2L?g%:e*PdBEh*MK-0LzsתZZO?2 /3TSpͶ7^)zR`1mFWaH{2L\PO=?r)|)_<ħϞ歆=E.)6VTE\@z01> })=DQeZΉJ~kVww4;En2$?(|krΖ{f^|{kM)S-#4X;MNRSDF-iƐQkY5b( ШIy6=rkϲh0fp2/M/.C;x `8i$ٓd1몦x,V (ja,xhdY:P$!3' l#WӾaZ%xPe '~GK>Ï0^.>pAҡxA zTbXb`Wo*%c;Lp-HCnRBjU9}{?y葻/('4?jhB]wZza h{{"G~z$Ck+10)!A VPž4Dc aP̩C֭^ӈUFu ]+`_Գ{+X~m4J 3pd/>z_om߲+ڠKN0 ^ǖ-y{.$+(`d*'L[% ]0hBHJ4#$J)31nrXS ʠAJa4D5xcQ[|Y۠PTvz"= 1XY,1*~r~Kp792RXyAOgeKE?Y@ ,ɷ! {?ȯ(X|&?X  0,^L/.U@v">B*nvB^!'`2F?x"5Ed boO$!2JDT۳Š絿wMv4NJ"a0p8BfDDp:iRI7oV2 ꩵۣcz@*bR4 QU ``3JI&Sp:l`1 9;#f7Dm}-*)!V <{( bgDS$@J)̶m: ! 4( QUxhIIP0MLL8")JV5i{QZhQOB!#i 0lFSrȣ/C Hࢍ GSqNj[5jPxs =~?` H,flYqua1gl䬄qGE(Ak[;76Bz$)rם_2K A;Q ㉧n&q 9FؓOᶛodtK,1`a1dsΖG}5^?4`N7?ʹl:J&XK"AM8Y2Dw>Va1O&P8(;Q<ilZ6^7de-B߉q(@A20hO?z#OcA^<{x!Վz[waeIi\ d- 0c22U('EJǣi rqFq!Elxo=+(qd8 x:K¾ 9*7s d1u`ԓIń?^()/ Y! @LӋh*у-h>=ă YbMPalmT.FIbj8~p'Z[r=Ջ0ÆK6Оw0::P W\}=;w O>Ʋ܉Rʼ϶n[zMϱYM93ȯ N@5:}Rey: 3s( dQG~l{cϘ)$HA H$:/ppRJV?LvH&dwLdj={X]hQp,\<gggfs| 77w*|<統1Ba Q(h0NsKEOCtGsnRW]}{b1};㏿}=fGJJfq(00/mR mvdxlܰEhk$Dhu">ܵ9.X6 AS5X-f R F3 .3T__-olEAa>4UM=_{5 4LFD&xgp;߈4|t[ 4 X&X&wkW $۞yNwMmh#~y(+ /wz`Fn@/iF gQ1~nŢ_g18/1rlAz2n˃6StYD;lqV/~fU+?S~}*]R 4|0l x3\}jnxj57e;ηfs(TMY  ±l`Px:6>`,R\·}q\p8;2=t~fk)scik[)ghG)֣:.ܰǛ Gʼ? axxX y'=#GX3gNnFeE.nD*:Yig5C1v6so/m5+1,hd2 #TO u+H!Vvg%!!l^#Iy9 !LBǺe|h(wt걗֢DXLJCoFrBs:?~zlUHG&S",t)Bd #@K2qѰD%z*2?``*.!L,V^y)BAl @}cA(eetJR2>D(H%$dhDf9I1f~FiF2^g\;]_!"+.'B/R<Ģ1t bBN{";'CZ7>~Zm}~oLkC?RkNn7ٹ`vFO*hA<E4F#BB[ Djw^%%+: K A^"ua~,J0 (n˯Kߘ!YYYOLL\˲h,kZޒ`)yu>DBR999=z@KKKO8QZVVw*òW׿F/^Y,6X<.gaO.IG_ax@&LŢDOqsX-7<7b>a| a/[`~*vv۶صJJAmW*^6N&|U^˃cDh.ۦmtdӘy`c]Cϡ:G `l IDATN~~0T VI+{/kPAgD02!a{?6+.T;vDR}7!,j6-ۻGgic9@`Ύh*o2Eܼ@!`Ex 2Dņ\:tAU)&'P4P (Bvm`ա&ج+p"š NROƻO닊Ty99L-X{;ch>D3|*XX1Yzo7ބνocU\| k)a?wG#u%c@w]ze9BH :-Z6Õ7 ( ZF,&bg棪f!D,2t:G7ʬj.YΞ>'= j5CUPjs@Jag!#;'"!%Eh9ބj8Í>aSJ~c_ƫ3}=ks h tw;!Mf,\b01{d5hn:v2JaX.EUNG^~?]ָdI . 4wC_tv,'eN֙ Ӊ:,Z==![f)dƍW_}u?4W5\rʮpDGt|E/GQ>PY'|>0q_7mL{t#މT2%]Z\ZGiI zY=sAP2ױaUWӚJ^T׿YPo۳o&]Tz9x]:HFх.yoj # 08<ȲPЇK.(MSHp!n^ -m(-)Ñu: OmےЏw_ė`u]DSuNcЃoWdS3 ^&Y|ԥ3ٌXdp:yh Jd MgAR|>7z{z@H;}H+w~(_SOTq]}hŒ5Qn.wdl v]U< ce1$ /ZwKI$A`3d2t>_9N|yGP$ POYܲM1!,:: ɔ ߤD;eTLUӫWWlP7(JLL&P%{6 c&V+Y&+ʫi G`.plV;+oQXP)wL%7 Uzۺ^-|w~2!6wo{= dCTPyX&o*PYaeco ˙=ZMs7O6t;CAӤD%0-8rdEB2#JpɥCQtJ7p8p!Ģ! !>ǽh6] ~r5 !p z()G֖gBRAUdT.(TE4^hݹy;cA#Svh29eNqlXE88T2n"DHT*'g66zeӜᅥa`0X?zx~e5r:q$̪aG{{{eqqPqcc㱦&&DZ6o6cO"+I{;Gł2KGGt1$b @Y$tFF&&&r9 ˱`ݎX"BPW[1yX_/XNGBA}B4K{$x \h$: iUBVOb_HiSD2-dqBoP:W$K H&yچ ŗ_˲gl{~yGP_p8E  qXq&'&Š*"2d[!"! A9!J˰`96 NFGPd,4ME DSs -l ؽw֭_YA͂h4c-hl^;1=&H ފoͺwzafd+,?P罡ݛ՛jذ:8smj%mYrU- L@ z  08セ-Yn"KVVٙ%W8oB>53̝{s2^k=>Nee/[#1V`zqv`sـ+4hQM5>}4 F ,=Vuu5ۊ`s}N%.d8c.Q[Я~IvEŃɰ{2`@R0X0z,0fpw#@kG;M&-*2@W? ٺGY-}AAX8 HOޖbhXc `u9鮭/0>|`>w^gj[?bd\ GŨB",TYU(T  ie[R(Z UEouڪ`vBІp#8A@)3B:Á ET%0EyF[⃏`CL|ꤾW>q8,R24No@7i&@M 'p;2$ɏȁLљܿ>ʒQJ!>huaJUrND]pđR4 C(E MU`Ds,DI!L@a$A@L I+Bʕ+WQJ+`ZGEEZ[[].aȑ wb/JQ].*nG&''uttihhp|>8bb?7X be Eپrڻ;h2)J'|`\Fj[OZ؄dU//x/yiiSS BFc87-G]C"""k6CVtΣ0euu5GjjaЇCaF{0A|]Ȋ[bِK94jA$e5-J Gת5 ˃(GkA=% {_kp~2NnDnQA"V6+-z\7(9ʘ{o/hqQ,J}21rج?>O66:jZ}!qi,Kmko yXц %s սX㜂=Ϣ w0E$0ByzSD BU~QBU vּMf\N?DPq͚a~TҕEl<@g5/B:$iU?N'Y0[Ƈ &dR_hն5qAa((tCU҇ h 0:'Pd4^HY ǏudTlmLLNF_Eu U4AuՆs OJ[ hgk:К#h[ޫ_VjNO?4z|n;D ^.d.ĘZ[aÑ1X%n+ln$f˯ 0Ńxo巷7Sw-h2uuWe A a!}Pנ  㑕3(P_s32*6p|@V}ħ ؼa=TUBU(r*Ce^]=(Av!`BVsq7,2/h7<σRʬ[KEQTU 8F%%%ɝ8T=NPtt9ƌƦFd ۶j0-o|h0EExp-[{W 99a0n1P2l==y}١̜9$ҿP}t48[g؜>z& 8Ŧ[^zѶ^%DZpz%wN*hi8C/fƴpֆ.ĒJC51]> _7|u:1`,'թ8܄P+#sogmt գӍp`<^֫BQh @"pmոݎ?@)|,3ou=#?aBY>3eoľϊ~]e_ ?QOӮ1X̎(RtHYt s#,Rh"1$c7_{Pdž(әs>2eFS++P äٗBz䩻BN zu2.ػꃔ@L&(an < } EM4Z'\~TQdB)]p0TN)i$ҐaQtaz|@}NR̛ػ;ňPu`7@y8 C9),B0?;,r 碲(">%zՇ!53:>^/wBN{d֕+W~F) @(p: Ф6v5QF377\[[yfYa']tNEQ>+suQDRR`w  ;yͷg۷hS*sWXJ)ɓƁa(ݍɑZ!p؄Ʀf,`n?$Iذy Ҫc:Ffa:=ƌ5.E ee -dY}SPz"E(cL`Y,RC'kI]vدB` {U˿-$%$@eDcoyNܱsz"bƷWe1<_nظ7|_KRq w#+؏3rL:fsL%IM[1fhܘw 2kg(]aqF dg!{ĈAq{}Hq`?=`vz>CQŇlNu7oӋAc5{)HH}nJsl1lO(aT|sۢ>gSisK9/6p$vVor*_ݳ37鉚R amXd $VDwZ`SG x>EI)(3O:\iEOX A}c#ƌuv20c0-[q. |ؾc'fM/lROZ; _PH l.֭߈E;#V9>!W9B(2w Mh9!u3z 6x <i~\k[$"V*d]v2xE)%,ldYf cH@[Hh#:hb&<㟰lXfAQ=6(2&h8;ϡs" _Zw\ DU9Q݋$fyGͩ7+JS.t_N[GXMliWd/~}>wl JP̂`ᒨP&<*TK:ZPUOg^: eyHFsb$=v{q  h;$0 IIJPEQ@bREA)Exd, ~TAkN6u|{^xO=% IDAT uF/B-"ĥd;5Xڌ܂"$g`׶u_4}Crz6-QV!.1 lZ UU !|g)ŋ[n]KUլNeӦMJQQQb%%%p 0!fYRׯ[`t'sT~f|Ww|aϾ hS|$A@3k~؀BM?v }Wsfd-(2ۊw`䉃RQ\R3RQ446ԂEw"dBvpY,(߿X Kf@W , qq3lf,A~[p4N'%(_X`=ioB[Cz>ECOݵ`{EYcDofҞĴA{7S~U+-)~lձ NC`4F-!,,lׂ ~?n(#i\y;]*}ǟ,>!1>+1>DFFh4!,v8رDFE?L?k:L9HGsKRO NƌpۆS&ti4 ) A8VdD$t:QYU̴A.ܾ ^ ^(w@~  #8W,YF-۱qFska}n&OBQT厅 A@]}2C|K ^׋hqq>SOųTEafVՄ獚_M7㿡ȪBv_^/X.qפP "!+L  } C]~#""hoooYEEъ$|7 ah\n~ﬧ(RUe @݋.:)~ETU5NRI)fOئo>wiAhx0JInyR% #*TE,+IY;,Ƕ?v@ՠ) \Ss\_Jlڷs#ף=TPJ TUU!ߚ_-SJ/flJ!Ǖ?) N3,Y~[&O1/okU􅇮5 U"C4AK|着Bk4B HAq!D"h|1ӽ{B`vؑU%aYQ>:jԨ>U_2"BoQ8>;IB|].7pc}>~ܾLУ(sUwމ D\ŰeYa!l%KB}L|oQ1R ȇƱB?mV=B h跔r@z4w`@b" +!c*@Q ~h4Z|^: UUY%$!Z9N 2:P0 ׇ sq{< PUzCIK) aa`٠qP"ȡ@@UHRZ~~1!?qpC\~<F Ȋ o_XJU(|G?o@]. A*fs's`XJ ($Oԓ96($/ kHU/pJ#~i (LB?93فmŒqG9߉g8w7xqs Ia?SHH7q~')@_gsJ ž %#m`$  =sq~dYN$\)+"DR0@Dz;T.yw?b?3)zm/:{ 1.0 Z0,# \}ՠh)ۋTaXig⚫/P[߈8KϏv0Ab|z%QDCS#|qtƱx_G;qUW`zWY$\~ْyTo[ݓh<\^E k'p]g +zѤ$@/Ba˃(JgtqۊEӦS[F@}8TY rV_{=fAg%'' S ͭY70foooryd>xg'ţhZ|f\v.R8dyP֣(6ɉg~ (' V*!I\`WW-3'X$T$%$ _ bKġCc PdTU ZP/Ȋ˿(IC'Rx^v`֌iEu z}A@,EQ0lX&*#1wlBpN |Cz'>ǫߌynNђV]h?Y 2:^C L20 ;tŝ\=ȿ 0x$M)LU%`!!n0܎±HL^;ڕw?Ix{Ep 1d a񈎎@Ɏ}PU%Ch\ll6QD a\nZ{w,([x,\8\[>w\เ,Z?AwV4cI^Y_5Џ} ,tj͠7ޱ~~IEQ Ӷڦ.!PD Zi&/d= 4ypzTr\㗬I-sZIJ>JTDM_̠S !"LU%_<'Ҫ zZu,((HgO҆SmBIi)cF4f(ׁC_ӫFfz&2qYe()-ŔIںgë>cY3%++t:7nUU{^$I$p _G0>Ͻ0OS%UUp:b?jjkR?N!cx: `0N-F]yC Pk9oC}N2;wL0%%T=/uC)EfzrssQQ0w8p`5͛tTV9gLI^K5Q#_;Dѿyf;Ҳވ&uKS%^ ]'Rͧ^{2_ܓY8CJ,21s zS%.ff]P PXIcX4nE)`عc77. ϣl'?qa1 s8*aс 5ZƴSqh-kniFo)0dɒ8{bq{^=?s;T}7\mIWS:2",΄Ȟwggp`AUԴt˶= 5%yxto!z44yh @ !Yi4{D:IMG*ttXt/ rȬY Ei?8KGF;DM0kA_ %44617v/T;?6=mk+qa7LH[Z= zx=`H%-7+^wGw,rvMNOd{hr~**fӅSܔ+gD RJ=JaX8%; +$z'Ʒl'yڛ01j۴tS1{{-Up"vZ80 lDsōҒȚ*;nxs9[B(.7nk@ dD^0Y_j3h;Ndg?Ї`"s`Q lݾ u p˲HKIƍ[{zk ! 0444  xGk[+MØQCn[^ϵW]~F#p=҄v@#bAdTJwf@%/F 埃g9pYڧ{;Вށ^qR7BUttvbc`Btt +&0 ""DSC, 0 ::mzlشMthDBBB?'C8747FXhA05BZ0 Zڑ<+-"`- 2{a뱁y|j5.p \k[ oio?-9~߯Yt:HR12</[ZG0qCsqm~jzz` G\|x8{/>̉!̡ {umu6uĹ{Wp^>2w/e'%%9ƄIr**>D*W)cٗ^[eCq'jjn*,g&mm=0@Ɏ} w_[{ ["lh1@GFjpxmN@ @g/-Eounǒ48gK2*T1%Q_` Pp4MUտ]vB|^7]h.Ȼf6@;se>ݒrc}rb%*$BLJaxdN@(@Kp]|!;'K>J n{]T ٬.B굡n\V?̅.2Ew`ɽ<@|h{\M^O١h!R"zVÁbOGG_Bip5lE8~"x*؞>õV^ˏ9ݏ7#=#Ѧ(444 )1Y 4ՊƦ Q%#=-: HJLBBTǗ_|%:ULQt!'':`uCUUc;f4}o`ԩ;ǟ+T[}1Y)tBwv"%) ǁ*;;( 1a8tut`e%<^ p$''24,# Wڅ$a&cԩ`ym-9RRtZ$cʔ ص{/Kwr3B܌}3R)e kԔT@}}#e8cFAJJ": Q4m k^ ]goH;i҆+V@a`kԠhѸ`|TW-Pu /9'!P̛;N mmv u7z;wć>I1~KQpjE乵t'idnm_?^.Cܶl[n!Y8/R׫ z~QޝZdHI{J^f()هΣHMIIݹiH#ϼ '{[~ oO۶=9lX-c鴢Rs?Z:u^J0:& ALˑrlGN*B<+@Q$M-T0C-?#dv^{@y9#30qSЫ~h = 3,mYpo=,UWޯ{>^zKBn/s$FQ$jYI񂞣Wn!YZ"``J^*8R q6P[3{` gbeU,.tc .H p}"U)[wgESq#x~1p.p XSgY-Yݶn{HH.'}1nGea.eYóp:U+W_j8 z`yҺ{WPH ǒ? 3#oWhZnǡCmCRRRSo_zvȢ1QЈ=eep:HJJ@CS#,bҊzJ~뮹z᲏됑qHrZÇeo \ ^HOOFpeS&MqpXhO)n>m*#Lڵ^x$c@TDQKW^ya Gjksh4{zzo;~E>U=wyc*$%!+k8%:e RSpՕ!>>iif:^㘦&ۆ&$'%t|ƌiS">.ӊ`=k:RRtpu J"1!Q $dd~DQtk[yy\ .B+CL ƈ,L/0:yc1~\!͙ Ōair7o8MONv݃Ԕ,"cFQdżsمo6~~MHINN]ϋoڐPs^Rz̛;Ɉn02, X`"+T\xBTW={B gwoAxeŠ C?=9WiKN&h@95m!DϝR~X'q6p^ YcHQ/˄#iW~MbMʦp9]NNA?nU|KZ긨JxP*/e4eMk֟A$Q5Nl>{Ñҳ>UWx&%./8Wur3pa -` rήc H&|>?w3n݋(۷l͑|ZҺz3I$\{=7|jLaVXA:4 PM>ns篥A?\S֬5qBcSְSx2ɱc,X0l:LtJ袻L&C8ګbk>^ SWxYd ĢQ.JJJp8q`CnR O> 1 |S8%9{f4~^ iyqn BEH)ƢqDu pX;mm-̫ p{ҙ{MY<㜵tF#=,{#L;hhO<žO\D}}}l6.oefvoo[۶?'߹pŕջ~:4eKo\=' ooR߿t5?X_]\ǟ}n_IEL}KvwF c!퍐SWOy>Yp}߆  x]kx]  R{b80].ֶP瓬h yb߶e,YR>Ye娯b6=C vwX{ u ˲d}}%TFBL׫aɔw=\LrOx.T¥) */'PVJY|  r%BN86t\7xE6_\?>?(VU-v4ia(ʠ ՒD6}E,?g?̑H! bOZb~pyY\\AS)N\QJmY z?jov!+z_Uyf_k>a"(6'G,l06sl3vZUexejwq6λ\'KhDvW_ H&i*J֏r.%p{ 0gI\C-' >\$K^2VRUYɆgKĘezfm\.{.YDII "-#LjŢĢqҙHj dd T|y5k…hm=HUUSFٶm;S3SiFFxY|"OIgēIo }XABE!JttuQ*n-xHhEQd2O$4ٽg/`+^>/S3 Q|fff|%$<0̲tbR$˗/cvfI RW[K,m۹s9͌ >391ş4y9-${޴iZI.\.'ٵ{/^USIRZH&Xl>;ft:9|0E!/6o I]m ijgg6Z=?lK/4IΉUB%yOr?,/x>"T\8sO2#>ơ#GH&lZ<xEnte<́-m}_/>˜rK-E5\\nd5 !p6}}/tF43_>Soռ>ƿ.XR1~z6Suz2:!&g'HOMٷ]}ﶋW^ytl?]?r^K4aӐyR <.m򜞻v'o?1Mȕjds "m޽+5pͲM=U M7E8T'qfڹtq;yS)?UM!Vs|ɞ?y99L1]6vq>=QwIw_/?:Nx :8YBD"Q gW̋^KUei󌏏|BaVlv;E TIXl9_z mšUؿsFsٿrɣ:_eKz*,Y`rr^x}^p,[J,b]gƏg<ē\,^-)v72<`iO`ٿ{B\AUi(*ÃATUaxdU<i*˖.{炙| 3r#Cɣ?yS kY O$4_}ql۾?~C78s|&m@0ѣ259IqI BzzhoypzM-~Jz.!;0t /4EgD݆|e3?=. 5Wnذ|,RN~㶛.|.5IpRbѭȤo( tC'͈搛|6de&ʞ5x-Φo\4G:o2V[ߔ"U5EyA*_z[ͥcL !,TSUCڕ5!s69G'LI: ve,9̸ iȄ=))pH)% !bLB_>jMU%-!?0rW~~WY"JD䰈RpIT\G2@*ftp=@^"nR J&GgS7~X&=/R RiH)I(;y2JV7EyٖJk_o Cu+kÛGPAa.H!ZVFb?8ս=]W&S 5=D C'*~/ru갩 #q`tF3e9L㋃3$i1b6A3MzGmMrv4q!E_Bu!la$xFJ2!z 'T5JuC) 3IՂFY^ %zl*KL,#Z Gn'q=zd cSBlEa'"P܂)_\}_?|\*S Nd.|BUU>``lghŋTU]w?Nfq /Y} *&͡)v,l"Rװp9Eٱs'hP\N'hʊ2vv Ӂa}"4540;G^ooƴtEA4P)rU5w/[ʾLOϐH$ c&-M!fߊ頿Ceu%!KPWWKGW7GSS(BGg7\UXHGKz 9~\6GqI1 ff"ՐH%صg/TM'6M(.ﯪhF.CQTIҤN[s*x,\v311ejz`Q.Gٵg/\,iR[S4###V32<8X4N/Yg35=Egt|#ȶ/13=8K.&QSS=dk[A$! y'()-t1:>NFk[4N<[v09; ʋ*-6>أܵkt˨4nj{&8I-%BhW+z\۳_0-l7,MIԌ̏rgרp}Ou(j=?k rI3Z:8,.LoTl>zuJ.iY,De}QX;EvFt80T4uEYEl?=dfK8%eubtG,k??iO<}[^'u5)^3-hBXo2Qֿ恣kH3!! K)|[!챌p21b8 *V`i|0y4M QfOfDH4p P텔nIp3={7fLG,4K &-\6`Zoɂ*TA*di#c :hH4+IU{Ċ_۟{n<}q/+'T{%iL8FHE #:ѶaJ&;Li7BZRUl%TϟFo.8ҦHaIx>^(GF_aEZ`5R/s1dڊj'+lb3?]e66I#%TBL39px!jZ,ŋ+ۉ> PiX\,+vg&߈9GŻFE`_~E%`esOxۇW3{q:YoMsu(XٌL$B8\}[Yr9efj޾~6mZO>s ב۷cã#J!QTT022B(%Dp:8vv^C`0+8tevi<6&X* R_WG}]. kVvKZ64ME kki'(%Hb&]x>GukOщq,fH&ƒrβKxqK ffNʪ N**Yh!5:tښN=e5l~::Xr0øKiintr:p8\=./55U8؜= y<yXx>(嘺ΒK馢͛&! IDATCk#PYUE̢ ّ@"Ό82?ʛ[7(Kl>&4TE̅5E-&fӨJA./84ҒEO,ˉ$y^%xe۟/L=QN˩vᲑMp8AIM0Ց/zg\IŃN?_>_IFWĒpv!x˘j\v(`qxәaqΣw00A٤IO#yfc 3FT tvwc/?M\O:cO0yN?KCV~ ^Ly,0U%]m+kѼ 957)֭!^{ u?6 C@0YjK ]ɇV;1a}g' '9jLNMb==kno`SV)n'-󚘚ߏaBE\.'')- φg̳CGk8׍+k%ϓd+afffDp^3RjjAJ äo] ަ xܴ47aY233 3۩&O6'JcYf8vfE].h*hin!LWwDiZ\]d^KqX"FmU%;5V._}H)ymyɤ)-+#L011Kile44xRЁ3L^yuSL^ƹyLddx5W2>1ƫ;wb;9vsrhjl$|J)).ƹͪ@,p}kd``βexa6V,_NSCCCC>tFxx<D]}maގq `9N3> a:;;i;Іa5k+Vx"9vM8fdx\˖P^^NSccɜ_EQ|>?o^-;ȀDJ zTH ǃ7>0^oPX9<<}}|ù-0h8Ħj+ҫEBF*HgݹeynؔϏ| b;.!G-1SݶzXTM޶JlP#cmGP[lPɭnh@G:ô9z3ZTEnC$3EoGbXnH-iӼS +Ĩh$J ^RDr|#:o7@l)Q9T1 \mENo>OԀ=Y[3񻜸6b }YtF/y$yfi =4ׇ1ž60<*KS0rEB Ch^TB`es¯iJZ./hX,W꾷ndzZ`4vU%fG:#i}4E.?? !Ht]2:#I,oN`cSfZqDZ5ԇ1,}TP)2f Zp8,2ISX-Cfs㗝Fx q|"̽!UNL39=0Nt2v2bLM\B1KgWT:MM] ###Hr~!d lI֬YE&塇fӰ, Îڨ+T2={FcFuIe?YBJ)NP˒ >| xp8躎 QQQQdٺY\nW!RrbUU Lep8=ηP穀U+W`Y:;J455xiNx4 TD(u 'qn--s.2$Xz==tuPeQ[SM&A "(O>4x-Ӣ(X@;dRXMa9( L$) _! K"`lbƆ„fx穩!f ]NftQTCv`6L 00 X,SOo A?LUU z[jrQ  s˚lً,X,xkw%OEnyOyru|㒉c<Ŧgp{"#Ʊ FFjsRi]Q/5p^#rW6syre{߸Q7:9!F ꙴfi8T; A2Q"76/$XVpc=bdVG7Wݺq3;ve\)QON[73ԭ;<+`B{rY}y.+d4)˄xY_g$>&˲O DJ8v-WQ<d KJ-p2N>2gM:cY~FS}h6RF;w4&.iQV3$"qY9E4*Dm;tA}klvvc_giE!9ɉi4T$r OHetN2ԏ7tL) $åEfzkwtZ)- T %\ѱ〢UQ n)uFFFuׅaګ7_t\vf^ssGH24l6x˱cG q:X.l6B8֬Yq☄ё1ɂ@SOYÝ4w]dyYzXv*kF,_HZ̹k4 uaZ8TUFG1M$>k; ӂAN=e !Ls3bbr A"BUV,_f/hgIiKRR ^G0L--46sލeI֯;9J:fҥ d`OOO7W~<N'\IMu]ǫ׬YE<$-Tס̝w&v|r mL:pX<ƍ't:uA?ꜞli&эPuu'p U:::q:]x$Oȭ>UVVV~ķ+}oߒ+>+蚚-/.JEQg|x=nz ӼSvӜlݖd?zRDži)XFް3|x?Vh؈79ͣ DV`cXReNͬ_1Ļ]_<7qoN&Mtv};Z+Ȟnhl*BHzhB8d&5TS1"A p5:RҁXR|.{?t{Zx ?>.T w<!I(aerX6 N@4myu~T9gQֲܱ?i ac=}\ZUc+_Dh!%#4 0щd34F  7Ocλ1I/PO&'wb3ziNigaDUMN9s%ɔN>ePéK븃N鱙(`ev$'Sa->Ni|DgKջsv\dn#ޝ. >ttur8ȂE "TNadd 4P@@4 5!*xVTA_uۻl2bRH1br,eO)--;P_%*+x5v9\oD$8]N EBdpJTEᇋ$yD"Q4xKqQHP<{ \18A/l}l躎atlr''8}Z^yy33456P__{_|Ng޽TW126Jqq1S4ףin xEhx5&&&,_^JK8u4l^lϝX{;==54grcc zf+$IEL|>G.333[(4XzoMYzfgbrÇ#s/<,b+.X,hnlP(ĩ@X{}5Գ>jhlgŲ<<]3H7!giq4HtMM=bmRJPiBQ?Z\`e|դ;%:O0;]'*. :,ːRI ARTf6]2><+J]!6 4x'(RD˽'e퓜q"bij6#;GVk  qL:50JBJCet#Mr$bb(2Pc-]QB~PC!fiivՏt1L/@TUJZĊ|}PAJjFp*N }!XENbd1 _QVųnu?}[2K\MI)NxH]%rh]bl ]Fbz-yBnzێ}g9SBtT[C.`h4Z$jb䲥ɼ Mp9 L(]?x 7|ttuq38zugαc*5MH u55M'48] }W‹dw;ҩ4iP@gg7]1>, u2 Gv`Yr v-(yCF޹wm7j]KKiinc|ssֺӉE)",ˢM2 `ή.\Cx<<\kd }]tn.Z=nN']]ChC/lm:o".:M r 6W!hjh8 شa# I$L4%.q8d2~s"|#(6l$384Jum}(˴8{4~rwgWŠugj\C{wJ^#I_zgZ_[jk<Ͳ#1OD@V咕ȏMW_>tu}bw׮!EySqf} T$#fu0++U&B:^PAaL:quMXH.I@urn*?D6GDtMJg?^}ڛo~!6`77d2-G&?cAR|{^(~RyiS 5hE̦$G2q48D-˂*Լ}[1zpES̑cT*LN6!>hR!1-)ASU%qmTyUٛϊ*-J̓TrMW[~l&-](6Cdh=ILyggv,KM9TYb:K*v_8=vkgH%}$ˋJPdᤷ{y R*9&Svn4EAdmI&{'+w ťr*#ENW[ηUmjv]D&XXC"q,#I.>У\:#BPTPJT6V}ínO~ rT~&N?iNg: ́wK7'ܯ[E(? z״Ecc=6 2d144" ͧT*]`͑E(f!Q*bf&ª5G'_O`YFXp!p|*ϣz8b&a I(2 F,cy<D6[/;o+N={pxY0swP4M-plv::;Lj:;|מ ww e2|=TUTAssɼ̟KGa0LTE EtveQYYIwO/ݷW{}TTeo"w]7N(*\xMTi|9|0 uu\}LMISUvKʒŋ su8NJyY"nkL2=9)->ɏֶiXsf5UUػLɤI&HЛ ,^UV]꺮U{=!H#uf{L"H kS IDAT$Û{޽{9gn͙hii!&MĐ|X3ZF0(8ap?̌IHLJ,ˠ"7'?!$Yh4ow뻧L9הOYox!1sLSzo~4,ץ:k#&&Ǝu(fK::Ǔd[ FEM]\~[X1 ZG~yeW}[[ɳ:b"?H'|wc}ӫFf$)*Ri` on+GI'o}5qS41jsۻoPӉ:%Jr0 1FX1yQ:]:1/otBjKS ƨ52bQVYs? mU'W-!ܻvdiOJH*zd><؄^ /z$BIVؚ7By;[uz`JS@P oxZj-aK| dyx q'Z"3 ˃g JZQyO711}:6lfA 7Bu>͙Esk+e6#h4j 6x>XVozܥQ75=(cZ@Ee'{1Taw{'~h óev40$$:kC /jn_R9;w*Fa6lAb@,BA1r- "Z)ᴹjߎ,ڏpH!oz/)"uQW X5Dfx@b?<++3wPWBzCeh5ZN}>ɁV]e6}YX񠶮jӦ {g>t5w̟3d>.XWxG" CfABsQ"~7(< ۃںZ$'`Ygw!Chi@_aRZPJ1gC!$A[`s86TUVΆ$I5r{nL0yG %Lm%j0cË I"zNP_~5:- +W}p* ^%9EJ)p9g#;;b8 V ӉP(-["6>Z]]]hii3ARW(rg^̝sZ퀃GdYy睇+VSN$P*eI)Z 4Y,زe+.|F\Ȓnz4yDI:*OS$Li0~*+"ӜJUp‹/Eg%ؼy+.%c_>L8qqExe'%cOA:(%v$bvdBwWh0 55TbaXXl'vBa-oGQ0?~O!R:34Fx$E0 j2TRcT’W>.樤,| !v$,>`mS^}biBwEs 1HpvV'-p?IgDzrus%Iy,bæHLôc t˖]p{8}sKPcSJ,I99&C(0d2XmH㊐oI _iw:Luq[w(e*YBθ`V'mQfnF!+O8WKV*EY[P>6"?iq + 0H0k}22ŕo.eHq!|Qw\Z}uDC`X1fa/I yiL8l4:W)x0gA%lxӺ74xo9gL&A@;&rak݃6 â+e0 A0,zGHJyh}6w.#!SY@2 EfA +;-O?@wt/#=@'\ sҒdמrɓ&aÐCBxGbB" =*ֆ!8a,>RB)]]﾿M؇PN7:ڡT*,tvuAg#%%aPw/l6; /7DmeQY")N_CPTXtBRxHp --۝V!=5 FGG; Z=, 6bJL?S&MO>EÆCa4cISkn,_bc14?ƸX"2L&NTas`0zt16mނ惌 Jk᫕+I&ڬ̈́AJZ rrP]S N>11LBi6lٺ))7n,eѨR2Zm2i"ƏwX}R$z)d7}]sSGb*4°c)C0l*bs޻Wվux=F P^lh <-gό#Yqc_N;m2 abDe}mX[ۇ{v#55  $ . qs/! D1M{CkjjAzZj?Ogtt8uu`FPZRP8$deeu4e0 ,QNrrR22͐)ȑáQ|ذit:=RQX1.4YZm ?/'Rq_!o =2 ӟ|IS0zt1 ()!ߧAP|~ZȲaM7@)[ Sz757e,J) !55_VnB^^N;u&F[{;JJJ =j N8`ա3MEѰazJ|z5 z=RRS ڋ=z+/-k@o*kĄ ~|ʝYZj;[f^Zt_,Ł.e^PktN4vpl1=P% ?"BkrڴtʤQdhmE99&LJ(P*뵈%5,hljFGvnظZ[y}ˎɵR+5r\k~h `nuJAH:6Dɟ^~v@˜|'nv8+$0 }8H(*x5F_ ) /%H'J'K}1u^}/Ķm5:bP`TcRa.hXL%ZX% ꘏8nXvum1T^򤳳IEEA rX H,CQAI Cг"Ic W4 ]џ#3QEX^_^{6Bʰa&L: ǎEWwJwBSc323MHKML# ldgCR pPi8a,Cՠ6m0vxd:Ε*)'щƓɧ)q̙3/B1ƌA̸1 `kO>|:Lzl5g+=-_t!!&PSSҝex]\ I%%0^T%3x|(ݹIɉcI^k}N # >,`4`?'vx:&.~?xWsƝrDzdRHY8$&Ozztu K2!n&@fF ݰq';\[9=B~3W->!$,-d%NTa%J)!m*FPV|AEH dPhI<@8dbp0L9x'y>;ybb0PvBͳ!J ~Ԇנw.>.Ѹt(`m6BAx~' ,QcW$c`~/`q#Xr ȑ{]yg9].[w3yCm؈[BR!EaNAfs̛IW} سV,Gت90щ6rA"cy*/ ".63@f)R0V[g8&N@}CbbPa@K茛5߰QG^N,&~n҇H'e'%s_|s|aRP9fYW_,++i5}^dfi(ɔ CeJ#u< 0LRcK/03Z km'Ng3˲3[WY^`Ht S+I&W[qXÈ#^UJ\'L {BBL C|2 @kV|U; K )mp%~A/@ yUx IDATuu2iƎP(?n `cISpi|p\Xa#@38H,&;z Bwfw2r?ߗ}g)fL ?!ށN6H`PС`ia6gQI 56Nh4?C#'R( dgg v(-) #՜A\pH֚czp+6AwC&sع9!55DzxwWe~GO㘷iz/Ap`]/"~vJz3O+ cgȹcg~ 5s{ZTHi fcs\$uo?S?5)B||w&?}z !nhl-d³,?L!8u]7W`05J% B%EK/ۮk`暆skk-,˲8]k\X^{ՏB0gID[JhU}m_n! D$`.-l{$. `0=^X) "i&P(xbHy~8Σlɔ< {**!k#ޣ}f&|)12QFJSNA{{nUHk[ Gza5~?,XE9UHKMŘQ`;t9`w؏Zq8}~PJl?g#`(|3 mm(+/?tdmBH_ b_ 2M1}\n'۰b@z@G̀?z?(b03!Smm(Uͱ ˲EIY)FËyځ]Ђ#m"K9ZB5J"猔Ik1S's>ۯ^ `8M[L5Z%˼jJ5\8˕c"4[i_Y*EqbF+R@dB87,Ȳ}y۶Ɖ Dz t:AA0 x>,xaaG;ai׏e"$E]8H-7%S σ~X@Vwpc E/B<Fs^'GP8 Dx4AA@ʲNI: P $IP`H|I !p, J5 ]3aʨ7 *Sx^R1`,K~-pBYfN2RVycc#? T}1Ǖ<"{(~c-RB_m6fbڬ?3SD98~6_󶟥z:="Gf;d:BLG8U}QB( =666Uӂa$&%R*G.aYm7]._Ox!RJ~|?Z'o"=Oz)=gߟZ~u~Kc#= [NN#C$O$?͐4En[Wuoug8~~<=U3oY {e$%%xXӊaB` @R"1!h)V U舆0Co ðEnPJ?V{XW`,\BE/jJ}ECrѨ隵С$%)))Hx$&S^ZWFSSӽŧo-G-Y@~_&Rw]##W ON|$ L+TP R `G|x D>D$"Hu ?P$ֲB|-쇒 $Dkג^o!sOڵ"z.Z=o,?C+eYvL=mSՃyբD?[K(u'3$ A@@ixzݎxUPހ)ܟW#+ ([Qa"55p8R*`JO)= ~ᄏ #0v~OJgT9 )2|~?v(Æ E0)~(aR)!A?T%+2LN:i mhlDee5 QX8 a2 d]Y9fL&6/x7஗^~垛tv eQDjHA7FU_-U 5X?!Tx2}Q1qwj]RXER==O9>=9fM7K@4&XȋB_t:n߲3szIHe y.P]X8WƄqVZBf]y9>TMu}7orBe8J\hc`a1Ԭe[;&ܾ?*]n[z 3r]݋[ӳT $ ^Ƀר9* C2l׼X=ϽD-qICCӋGJ?\r%4 cM)5UU/ yKyA ֮^~&\x }0fPY7߮ƙgvP0.N1 o۶:Yp,jٳXLEv)>\F30>5:'Wl7 T&K6_%KX=ƹ̊W9ʓatkuىmi߫LΛؔOK[:ӡy!䓮\o.=葅Snͱzu,~Gŗ0!CΰLZCqS2#ak@xw 7Pg%jW^@ %mv͒ڨՉ0M cv#24 ؆yT_ vt{'^|D`_VgW_y%syhCMy䖛o'EN>HLNf=;#t޽hԘ4i`^A}}- 0uTd3q**+sg&Ln @  sĘ tRE^CBBA.d۽{FB7+xTUW7 Y.B/ǰ%oߴA%7jCsT @s^D?@]/։9 my+UDenA"5Z#NX"8OVU`EAf$+=>0?݄W߃;^?j-k&KuÂ@d*!(0f eXv Vp@[y̠/8aS//WZ43 /'UbgVjcDRb2v៖幃A9cFgX% B"tʊX~K!$!eӣ~@yE#:]itIDŃ+G^Uzw~ޟ8eUD$!TDcGAJ m/:D8eɈ x < =8`GVܛUn)ޠFKKՌfuH7 9,Op=暠gY"wkx䆎7+q{Y-ΤZHPXz6l$gmfmu8ޤ7槟[2Y;@qJaM@aof)]tzSc-i9ɉʐHCᅰpʄߒ[ {:l]/AOXB1 Mlrba dr('{XƬt%fJ&rZUѨN*FJ҆`; $J2%B p O\i4A;?ʴnf_ ,9 'OSuϝ޻Ͽ",q9g FqcB&OgI'8,xٗrR܌S&".6xe~B'Z!/> t:da?+ɓQTT,( tuu[nE{{!j~$J!/eSOV[[^IQZZ{+!S9sP*U!C ")>XǏ+ft$aԓPRsVO?8{rܨcP<5L!nJfuXxS.pXKp$"Kb/ok|ǡ"yMH!B" 3q WGvF A:u3>2[ XSCR(jl&IIM3. ^U>3 (d=a;XYREH#ER@9~H@Yœv5wh>%J lSτb9iz-K(ɠ`![ep, ݃5RX5 D^x_Ο9U =^vZ1TC! :%Kcr7$\YlR#Rj~FP&(e n:.432 aTš *KzpŐ1p]Ҟ0DJp^_%KzΤO,;(c[矉6QJlݍ' cDa@SsfHvs*V$Q .(uORے4D ӦMȚq\h5sY߳P_r|U 1qqP'}P_S&T2yrV9/OwclT"S$V`' @Q3~A7CTc>e$}se?Sm--'⤒u5{^>s0t9YkyM2 IDAT4EuOՅ/h9Ýk>gѢ_2zU=7~u mnyvs}hmky?òbD'xeI=Ɓvl /\;q44Ahmm-?5jNL;CYY)Z)+-*++:d&l¢BVխ3v-JMM&x=<7m֎ nUoccYYYTUU2d-H&Օ[u":t^wo{dB2#2 ؚ1`A/ ^X_ܜs:`F& *R>i1 eܒ̌ٛY|Tҁ9]-ӧ{3]~F<ь# fAd"]{=Mf3 ǖRܸqѐj"[F iL ;);hNzԴ u|MPI^U)G@o+$ׯ"©cp#+1< afћ}Ď=fB]Zط> iKz USjzYTMQ1MXCka{si3fvMr㠃GUV6+G$Ml줙cA{)D]vnS \ZE_D0ㆎͣ$Dhc( IfgOI$B0$w)+!܇M~~ؠx$yARѮٺå1.rdd籣PT?8$?UrS:8HBIn), dĥ a>|X0()//6Fʹi9jt GiE)O<׭Ƌ]VbM7 `vΎ<t4>x:L4?H4J~^jW5mLLvz L/G}$o&uuu[ڑL4i ;8^|E-ZĬY=z4%%%|;燔,rQRZeTVbJjkgR7ϠzcnjfEz1tB}!jG gq B"B+2d0!ܦޑ#k쳅[fҤIi˃nH3gm^{@agOȀ-60rfKf៞@pNX~qmĀYMiݐW%D 2֭8#9Æ\ŸK؋ \ʌy$^˜ke,[`mkrXZ9,-fXҦW4{ n_xfDhBeIPczܡK$fqe(7袏IQSO_ KhmlA.xc`Zz'm8柟(%'{`uLYh;t)x*-鋚k |]Yn* i X$"qU(FR1)GAoQoOIijh҉fh>|A:Wu_vvv7dwHJ.8cAk$ ~X;lw;T2tbtG1@Ycu#L),WeEKÖ [ڠH$wRR>+{miţ"HW[_:)*&FCo PD|%BQ=%t)E%—cz/n_yufg~uR(믾MvpjG2W  2]UO`)چuF|XQQ>O^#u]?=x;6xPf]x7D1;IwwaP^ZʈZ;I&q)ɬP]]I__] P8BIi Gu$; ! ?~B0k,fϞM]]Vby,ufD"g]|ս=^7>UQbږWK/JBDB'4m^#wҤݳN+7-(,ܼ\'m^{@o<>93_>'  3V#3){I/JƥmL @i*]-vW'L.F߱u.  1T;4_״LF2׽x4Vfeܲ衰io1;1|PpmW~ҭŲd|Y[BG@ac.(>p*LP B=+i[|PA| 7wʀ> qCItDøND'pXͭ9>|nD B'/xT5}k;Tz%-HdUHxH,*>ںcFSӴUII*v#F3=g>rmX40xy̘W) IUEQQ4AOwŴޞ(ɗA:kN^wn?4vA,a)R/~f5D *~]VŤNJt/?Vȃx>~}_⤒p{)S"?HAz#+1|A]sP<0JQ0H%{Q] CӲrx.b=aR'xcG{s~~gf*90?_.(//͔IY܈e|Y:;:9#ϸ_Qnfix쉧xc#Gzp7 7;ϮhJRtw9ׯ%0|P Y 9yg(aӧOg )S&K{{'2mtvvp8*ܴy]w1a}!p!I$ɂ KX|N͖i~GuK5>lIIqJ<`_2lP堷,4nC)i~S7M$|˴Oo{XX (&]"!5 *<" zۓYr(%0tX誃-ƥu#=B#Z}Zhy`B{}&o5TzY5qnM7 rI}H4*N<8^zu9y,[αG3gUWcjCwwߴe喔~f暪j}յe~>9/~y%^.(8C,GQ$b(eK.x93_n'`4]e  - E;Z7k!nx:4̸ 2jKشqP;# `[bvZ)kc/?L{'k_[@kƭ'23mδ8)c|t =Z-yZfgd\ﰓ[XYFC rkԂ(B5FB& .)_liEtв `Hu\ބǭHO̱Pe:$D$f:k'VF*//E"֋n}[>k53Q|>KǔQ%\&.}/Uৼ&ʪD(*fՇOaƚ2BC*zRf{ BƶQMi amb)4Uㆽ6uJYKgwCjjdii Cjj~70q 7F;aW^y\#4ؓO v)\ke]gnSOK-ʫ9ߨED#}2  GXl} TVT4QuM1&.wZ^\RL2y,Xd"NsS3}H$BNvC }u1yd.b^^}U7ׅ^H K!>P6dwDUU.ZD$Z-+rDOw/)+Uevz{q\¶2@qޫw#Y|Nd⬮΀e Xt',6mu iz?W+Oޚ8 3;ʹ,d@اx"laLPq~jtrm&ӗ}Lۆ$X,3>smMoRةpX>YM2=S*F h71BBMώGy%J]e+t$l6|(gv%z~MrPD;0 !1 ZnBcї'1oVWdoy1mq[壚qa\qξzs', ~]pYw5].]%'`P ]H(.EX^K}.hg=rpq+\4:<.0]xub%LX sIX衘^t%ߴW/{Aqpe׮UdW4$$?P*4VgYӇt.KEXzB+Y&ҥp8-@q6y{l\ ZƑq'mY$]w;Vh҉"fÎ7h~a[ ]0=mR[^V5g˖|ͷĜٯ<&ZZe~Al{oqM7 G&.Oa='/}'T~rذbHI6eq衇0M4Me9ɓ'R\\D&l&ϡ z)0t~m$HNt]gʤ)ɡC9v 8˖- /gҤIトB zw@YAggN/`[25vX<8JiiiCQo@ IRVN荑&<46ƌft& /,"4矶*n':Nfns3 nF'O͔UBfbo:a?iW7m:)ZU2_ņ(VNl?ؽzhq-+[u=2AmvAhfYx)%_yEgqLpݬڐl ӵ۩L>="kYe~)fJ bדD+HX0mQ wT:PUκ&.j=uq-w=xSW[Vƽh$`9I3r\Dɤ ᨌ(vi y^su9tǚ)I )ڇS5/Xձ 3fHd [)4e=k @@NZl"!7KD;XmH-{6'*1г5ةF4= i+aUmҀ~qíWdgeL&,/>#fy?¶mY[;B^u(SNƲ,,5\[!sr?>bg>SO> ?^/o/r8#ׯvi:nr{d?dqI'ɼOyXRfo.C*bgqGu999x<TU% ꢫke7lGw4aCF"m3d`I4qX5{~+zCsyaKXX<:-ϐ&t&F:V76@̀`=M\f"}O$3HH=M!'\]6f37;x$3nVtHq7)vdVI NJ &&> liPw zev)LQՋvtg˫-јQ)xPKIT]V@}XgZ7Nq ؗ;6Z|NkOHxtUJ !aEB GSipeh*EY^%C}=bLdy˖z#}5X%b(RbUJ۲H#:c*/Auנ/pVBSS6@ x_/)٪Sn d/%,Ի\\IQx߼Kzɒ`vB8IbuuͥaezR^Elc 9\0c-%?lk_Zϧ 06 _~ℑ6TWF!L.FqUƱZP ;Av-9j\;xH/ڿ?K 富=懳2in ?dBxcotX IYwqgy஠>EVZtlF%H܂]PB3t) CDZL3*42fH Ģ1&MHUUniӦK/_0sLf̘ʌ3xg"\l'K҄lRBt6Mq!\)1t[-7"zu!tJUEXCמFqޫȯ4 ؞3Vky^eӢuw>n莼)c%q XP{c3mQA-9xv5~ ugtt lϸlwI\#c;E֐k0/ 7y%26G1^إTMbڻ5 Vg-I)[bQ^/kD/R?^BJr`P^ᢷ-ÌL//*)=J$OZ) )s۞JEco<סO* ұbzlAҟG$6.m8!W/J$e<*#akDO,z%|e@Kj?z  '5 "4ilh'^Icٰa"Pcz]Ѽxl+M*~]56w layļў`W(jhG&?$P2 +PD1B/q E/DF>}SU['qMs.ʟ͜K}!^, Rܬ9MMӬ|Pض=sqgo{DTUWcA<4-:::yb IDATwzȪ/d|\[ȑ#,zE>p0)// ~Iln  !XrͭɄ}BS⟞9 )%۵H _s kܸ1[Z~Z1S&;azI%TTmWJInn6h7/5O<5{ѻ:&<-b+46٘'j>ku܉og\yd\W%;%mbk\vf>m{tlTn夳-֬~jιlXgEVIJ}A=:t%;ӐTZX%AP^he53]|?H¼GM뵺.Z4] ^#K.bxOsD,)=1)멮_h]_iWYʿ>\W* d"(rX$0rR vްH9m(bDCqmHcY =u!,/"?(C[ߧp(Y.U<&¥_߅~ZEK1ZDi`VGc"UA~qVA㾔K5um;V4Y9Bz͢2H,bO,qX+ E$)*27բHPTMLڏ-JoT~M]-?~7O=d(4Zfg/O>|PlkVO# SQYI<aH8;Q kxbܸiBܝmH9sl(r4mnx".vWI?;qzmqWwSNHtӴZs̀4[+3_F:)[|2 防_dEpR4\t{N%@cJ]Xo=7}zDQ>%[LNuAuitO~3_ u <:q͌i Rl=.םXr &5&&qh/=MIYQOx{>խUxL-x6 T/G&mڤdARD<"JeCsl)xw*oʶN*[>h[7ET{Z5;{0 ,]Fd27:C_K-.!K >KR+xR`˱~KYvKZC<:Vt19I|dpƘ)hZQK꧱M+(;\RJC$&@SU"ϖ^8_liyMq{}uܒǏ\!1<Ҳ&r]ZN)mnjYر(H;,cU+}9w=F]}/^r|DŽPO;dN"~<*?oO_O=n$aCRUYACcs:*@ I==8X}E4eYض !CbJƊqd̙̜9СC&;;˲ꢥk~]~:v)HR:U4 |ɼ-,Etttb;v* ۞{loϿ:zduBݢomw]'I&]8;y*GMmJ1s Y9(VPS2 t}3}zqYsuNp첣cx A= m4PKѯ-ܟSUz(hgjwhzLc.|n rrV˪ݯf{}&d䋏op_!EY4taJHlMCSbه|AȹG)enmԩThvܔA( tZH=xٵĺ#pU"JK{"tKEfhINwv3?|c "Gim‚ } D^tp*sxyR)Ǧ*1ˡ+誂T]_ϟß"ܴl;Z e&(*8\2VҦ57 (9DxsGy+ة?~W.슟?j_|2u֛]ye}̤ս]wOeee45!ۛ$JYQ,YFUY(l :-X1&!Hj.]xOi3WLG=4wcՐäzDs/&H+L꧉[z*J[o~O9?O;rA7uXgX.XCV0@(&#H&.Mc(,BBSs3K $ inmű ؞2V&4+&5tٗmE^te;?LUJqe9X~/l_nuړݫw7PD7c2iyp,5+HgN\kgTҴ +7u3fڭgQ?͸ kWϲ[ #ת C j AO%=ݱoBCg89׭SxkEMgeIW&DM{<*bvK:CT[Ҿ%6-˰rKPT86x A3RQPn:W4 'm Dp4ik Xb)g^þ- /{;VXe&ñlqp(%ֺeX˾$kYM>s\Y^v{'NVEy9\xbbej0MKQQH&)/)O ?UU ?U 2VJdԯYCAA KH& l`5,1[MݪU>X) ˚qcR֕+dkKPTU Cj*b8e*o­( D±m4M`YLmDZD"zo{~7~E9N1 `Sv{*vM| MZb oĂE}=g;uW6F]|I3Xd8B=s^vu~:/2@IlX+E F!`!H3 (UxT]vM#yDnv&ocU0>"Cvx 5]k:tHu P$ÑζmfvmEYwbGGg_II1n7aqT"`9B ș _p@r 0 N*Si$6}eeŬ~||4H*H}}/^zcXڈwP~8VF bkӟƸZlۏ&|#,lg6#?`p eev_9+Vbذb!3`EbR(;8@b*w` [`A]NNX4ܔS4 'd29k](]a$t !܉4;S!޻~7iD'H&M~] 勞́O$?:sn=6lH/V,m3luK$gxJ)_v})G n,\47YƦ9~ԑSTXi_8)e˯睳`+!u_: ~A(//" dF EQ´fH$RK.?@%Hw#z_w5ks?iimFv.+Iw3}ݺ4Rk!T8 tu{Ŧ f4GYs8{hjjr>ҭcuIE53PR'G )s%›}wK +D\c?-><^ ~Ymyyy%RJ3EQIWxhL=BEJ)E)SeT?;_^~rx^Ə' bb aY|4w.HدI~?SL-wG !`0@$njnՎ¶mDb(!q72<^z$]SHn~Zi&̓OackkuhIXBU}~Pl[N 1DD xOopL-8(j9RUԿW믿*][Qѻ4h[2y3_PZZR2 !DBi @'hа.RUYoRB(2Xy8zUBD/WNڕ?/&bƤ ܙOC!|XU_vͰ֯;"2bO =ܯƑaZeISeEB9ߣWr$JwYtⱙvJ )v7gHd*ҙ.D^|p8t#@GRffEv۹Ӧ'R IDATylM@` 30WTT鈜? D&ع_v .ޚRSp!##;wMPU[Hu_S[G[nG^@>ljWo9MMHOK&?F_,_3I]3d_)577=:R|+[g}* \ ?eHIIAZj UUR3 { ohߏ;Bd ))H:jj; ":jkvFП(~b>.~y"uw|=q_?٨0s%9lp`q8֙0f:43f.U禒7=ZSl .GXoޭ ^٧E* $yl@gGw&>6{:|7=1}~nβoQ%X%jMjYiaq恄β3j>b}LvIX[d/N2M#О=jNLYѨ[w]XJAk[S`C`]/>v D&؆Ȫ7quH}/*t$By7Дk?#rOK:# , w@^tT˽{ hzhhlϾΝWƔںW: P0_XqBp ,f晥jQQQ}RJ .ʇfç[oe^"-5?l!j)33nz4:_Z I$7W|9s:/Zꛚv:1+7'ID#QS^LBQ>=wҽ CװCx:-\]s 7^N/?ONQSZ'h@@g]m|>, D>c)HvN'G!`}wI>~gMybEbķ݃[#7Z7awvWSToU@½kAΪdv݊4%bDFL S#SSC{u\VVp/n,{cy%ԹhDn& H@«"Bi0D,RC'lc-lHҡ+ )D0X7AըzT `M=S ܴjr1h%snJwEU hXRw`Bx܍6߸ȋV#N[=EW֮nH(w[0ˑ6XѦV3CԒAtxM73O$5k3E]֖Vznpt\x"x^445|na򤉰LXn=lv{a[.tvO KxFoV'n'[6vl dmZ}B~o^5U-+5hZZ͉@$\u b)=r2mfɲw0bJ)?Fd~H>q?5ֈqu_}JyIǃR݋]^ܗf|B\LRri|%ǥEaaa8`饥UEEE0E4":$,9s wG~AZZ2++'Hӟ9yR/ ^seAx\?ݹs;v"DvnwuO=|k4}aŎ/Xt8/|߅:LKK ,bUf%/gi4)9v ާsiv;B1K.smذ{ti/3f1ch,]ݻD]h kfN0_[!*S0 3. u{ u~zt+I VBɚ$?.[pK/;B[u6rpK2UZ5N}(OFX-wo)>Q'^=gU;@Nr)}TC> QJb2D ɂ* g.dœ9 lڇrJ"-}0j* tIʱqMHug.KrzU/ﯾHd{ČPǥ{$ ?˜̜ "ln,P%E2*B<*Y[U:~ŗ775=o^IJ8IאPGcű'uk޵G'{OoHcJJJT!犢L"^U.,,V3LQ6]+NaAt>ܬ !fnqW^{RNnx'$Pakqg {OϋWVV#ЄajߏNK))qGlx]}릯oٱ2)ej/9W]^s֛_\+<s) {sH)->"VUBsD[y<좢B޹k.I/Yg;{n9=_o/-fSK͗<r͞'[aYX0ÄY0}c$',oYv|_M@r#-Hc;%Б@B@`LDT-Vץ!-.j[}ߥOʃ@ H YzZu}'Mޔ~\UF\P&]ɿ_m DI(fcwK)_ic} U@Q%*({6MEqA77_Plp Nj?7(>nEiLіֆ\[+I@6|[[PfTiN;҆k 0nYq'RBX!C !~Tf O/--m"CʠA8R iha^RB<0c9I(^xRn1WDOۖ,sϝ<o^ϕo2fTHRJfS1niF*''6BcӒAO?X)?!u vQFtt qpHKMB2@0W"6)4ЅdQmKޕ@ߺafqPGia=v %"[PS/QFPHLHIa( RGZۗɵUSc{8c~֍C[M8xw+hiScb[yƁF|`yYF u8FUpȝ_ysiwPjzܷA> D h` :d`0J=젴4OJ9Q[Vʻ JKK뭇D !Cuu5JKMrYk`%yn$̞u/Xw&u}6lu޺u;Ə{ebjFbꫝض}DbDii`yl׀̽cO>ܣ7nA eoظlȝ?[|wÉDn SL+ի Hʔ4*@Bk8ߓ~{<+\վPK@,u,%!<1fr u ,_cL)p$03k6EfAka&d?1Di~` |{G{B;5(bXHK"q[p"-eh UBR+7XR5Aã+ .@@L Kz_yuǣ?j,7%%5M_,aEp8?Ԯt8 Ҹ7N}|KÊnfRLfW:ݚXqw<]u #= 39 0uYnB7X7vz7NϚ|`^ìU&% a# r8`F9HF2[#G@`#uz0VV0{e0֌WRG8VjhRUH $!~QW҈ ш647BF9/҇ )$ v/sR Il1|9tرy< ɇ?`'i(@Rny ?*y*W`˓K~Æ%QGD1#q׌Wch س<Po7"m]@=9ېo-Dq[2DQXd FCt"R+u](Z++++s1Q 1sa* KKK[]eeeab<fWmmmBn_/%ݱrx4~ n\G<:%)Ҩ ˯\u.B~F~w746+fzeHtN<1''Æ d2fLv6ltSCYGs!̖3A5F@1^`-E0)d&˭xSC F~&a{{ .Xq^:xа ; EM)QXـݱ=Ȳeak(d3l8r9!835֫m~ 6  TBpfBU*Da?nD4 aⳣlp6)4lܘ8Z(xVz+q& h:E PY"MQH=.3ϕrKjJZK$8i=^ 3hUxͲӑf:߈55DC)7ܔ{ n;AY  zCJJJ=[D+,,,U3'Ygq@ R!@ BS5 l^~ @2/X@@7$@J MDUΘ^hDWQm-h,ةa fhtB|׃5tqMSN>[0KqE˩&Gee52QQY}^X,@)>>oXcW5ޓ~,`W"B/~oʱ?4 l{oQ^qaW@:æ8(E>y)WdL>Pr$ۀ$@~/_wt uvsr{xfF"z]F#2\9چ{@(*ᐫW0j 5tnu1R= ?K`APsK2Rf@}}=B1B-퀫TU= M.ۡC `%؀P,IC `zu 5L곴DDeBqoĞBGZFPZZyy$ )0/\`y^C>z$mAIà~PQQ9,3:n;6oo>[ig~ߎéwu: 3zҕ[ g1a_xmuq̖}SU[@Ȱe !`0zQDxp0F+Bpw2v_!UqG&t2TH,@Hh`EA,aGB(7hAk`9@Pup@MENR|'+v]1cGӴq,Wnj+%ۅa,]~;(LBB6ee&x,u|5F$X2(?SPEcO9;k\Q \9(~c{T4a?\[4ddpΉEϧ=Ehv MR˪Dj)̜ 0Tf&!D>0:aV ip{H)%xHT00i/HP !0.B||֔Z'%sMK|^Bf|'N25Ґ n c/;]n7k^1tNb`k't=]K]"stCF99>~ ZB#ݐE'pV8KȌR~8+lw4[S7*CO;ǟ̒8T&"K}/H; `fD/m ua(g |&52y<8 ;6ܒyR cU( Yc?Pꮞ[̺^ݸ w6w.6( 2Nr#ӁT/ jU$S1:A*נ6qF#9s <_c10tRECG 9$y/ABAHkĩXKTc{<69۹8ϝF]wYI{VV.h}\+Q\J-:`!'K,4ڧ;ӱ !EDq%`3gvl3gUhv6(;oRBw X8z@.Ҵ$|^;'≢ŋ6}Ԉ(K/\4e8/^0k[:|i /N&Qu<I :g4TUYsNڽUEESSZZt)yRK>K3֮Ӊ+V߁"TՊ0dNFU%>C2d2uu]VX-v++&-'UX@a{ =W x˭}= \x;>|rMYfUȜS `|-; -.5/b\x̫v$Oڜ$0؀1>b[06e2$dŁ WJR9h חb+sKm!zu (#Fhvi`@.D5F+if@iM"K}6n8BLChC/T\e*v5F"O7 4ջMCرWjHDGs9RB:ewmL}Hkt6~^^qh5,%m&&+bBB'Z ~B!.bzlX^b(,,l ˘y(L N&??RX,GD6!DsؑD"!aRe_6[-^V|Vn|`&ޑj{0>MOm6uc8Q,Jj tՕw+6%E? rjW.+O?)gNs)e]ۿ{~`U˕>l(0Z޼uޅSncƌ_0PSSC3^#D`0H z=wx{:ѯZy 3}6;mElGT͌WXa?lۛ<P=(,߮uVQ[l )X&X>;~[ O-L)'sL`GQHY "B}xAƥ[:CoX۩ ˆXM-qZtcXmv zۢO=<(Bj욷w2x5rr# }~"u0 RP{-;N?}#;ԼN+]ڎE,֯Blo"#-29Y22Ot!y(VۏT߅8EbPc]%Vc((9>++LژTU`f7daaa%Dh{AA!2@4"x18A ua %OOŨ#V WY> {I/xk?+^tWkk`Lw8"؏9qmX.ɳXk22ܬ{ t~)gN>f!$Fqy-tr:@'HDQDCGksW)%k׭?Llxe^u`ɼ{*0'#Lףv+N:íPܭ0+YN|,ÜoNY Ss^0$fڵZ ՝b,vֱaz\,|,VG50z7lA||'Y`6Q5M@"|{W>犁,g"YTk1Wek y~pD!%* mm ʩs]7mšZ #;h”$\ uzoѳ>Ȁ-嫉K&}:p58P{R /@DA%IfM>6ohal$HsHoDo)xZ< Tb"s ԼќI)]S1cuiطo]\y]y>aa7 yسw/Aa~^f?pe -lH9݂DdT8O$yS+/~ܜ > `34CQoEQH$#_2F/P@x~cݾp8V~g!iYRfFsk+V|-vsk|>!aB/WTTt: :~8OB6{￟c`[ 0I84fL0,>p[7LYj`]e1Zםb^>}< G0uAY `57WttP'<8\+@4`4 WبP4?>p,#-!aݨ!!]>9|N ]@OV互 izI9Y64'^L,.5t܂ g9 0.Jm3+Dd@QavU%4 -$@!U`)b}ʁ׌mȠ!2 +gƧ6n䍫wvnO|t[ P Ļe+ uNĢ^.l۷oUZQ7[ \ BF/CQQkZ6nzC$}j}NǂE^Pׇ6hX<~t]uֶtʔIzAɾwEHD0  po8[14]7&3aA6m͍_( L¬;0s.>i5ƞX$̶1`VZ@-fRmY:Q507pT`// ,}l~wH:ҙH?@24W>bEi#;_έ>i|9vF>~IlHOXm8+N{0)@TRilGLwu{WVeJ(46.DO:zeDxwF;54PV*۶A]Ş DCh^1Ζ @8 Ҁ֖ݴSq6&֪Ty3!*M@}4-iP' } ,nFhviim?A螴& TWvWwX؈O?'MUxMg|)sr3s3g !*R7h >(AaX<_~P(ׇ^C+rjS'\.C!4-jT\4{]32;㒋/aHJ74 YGnv6\RaIvT/X}ݵs9 x"*((Q' 4|((ȇ*(Bdu]GC}:Vbn!5ӻ']~y'ВU--:q˪RR\y2{xO{l %VmfL̻oժa& zY>`_ŬgfR0m1vZ‰ `YLVƩݝ9‘2LD ~zX|"5=;G%=ldlH;i8V&)0@DBns6QF _PȽi9 w6 p۬rr3 FpۻyH3zo,2/F;yC{(I#{rxE@t8 ɴ\Q:T6y_ o9~v:di!(oS<(-+{U7}G?|gwT-Hl* 95Xb~l#$5SXXX׻0HjŢnHڵ p80+]zх5)ً%O( ++ ÆߟD+bai|Z\!C Gބq˓A!D훷SjD'/ŇcOC$ᶖIO>u^+p(<`%uXr@>̌Ɔ~x^Hk}Hd]Jλ;O;k9ޓ~=G{J\GϽz.ՈNs8G.5Z' sʳ7f;?W+L|f $Hz]nW>Ո^t>^Z 9)(I>S_\^.^KDoIfvdr~mD鯋Iٰ}(:oLlPn BU%귡qׯ;bkk.iD^{SR>\y D>ػ}o፧ {6{gQNn$DoW ]s{O`w JO<|aaa=LmcZ ]]JK^T#/WϹ9RYa)8181A$јWSN ڽ6n"LD!/}ɰy<őHx`}i0/mg_7?xYz$oQ1iHkUM:`̘~6 LJ|g?Znݵsp<h4 ӁL.t"s,=<= 1c1 l69$tX(es4sO0p'OucSOn X^XtCߑw5slB5ޓ~g']|t#U%qp+__GԷz_ a='tlu~½? :^̐mmHM-G6WIMp\v1Oh8RDgn@u\)~D߷vL8 x;vm{,=w+<| EV$\eΰ" A`@"Ɔʧ$؊$`v@ʥ$ w_-jkOL ٳg'?g)BhEEP;BGn뚦Id ͦ'@\`w>x駏HMIㄦ :4MBeY`ጉ_F& D"a޿$@ܺff挦3K1j!3=E^b%>wC23BMik?{fWU>햹{I2=B: M A_}ylPԯ E @BH!=$sg2޹;B `wLg&u>٫|ց3;|6<)08۶3UPfնS-J . ~owug+.//SƍA٣iRJž{ Erw_;+!zo|?Z&/c CDIop~{W",< 1A|M;쳹5qa!dM7c *,<xD2);'0bfq|b ,iGf阝lnj_LfH)qn;+0bfEJY8΍'.Ba<̺2qO2Nyq޽G.£ȿ[\YgMCAaQ/ cTaxe~X3K@5ؖ b bǮ.NvI xMGy\vplwDcSNAuU$:;;q@T*-)bU7cƌ ㌿ @mMɆjgk;6#-KS|S/~a^`E)c*h#huvEQvXhӷ}̬&ܜF"99Czf5 ͏(>: }2į"@```( C`4=aYGt9p!? `} _ B\%~g3TUnf\-4p> TUTtq׿~w[SW@}OOۥΆLIGmۅTufUU]`ڪڝi}u m}|_*K?D| ][f5&}J4AѧLYw\=7,q,?v]w;dhutC dHɡCkȎ!pfI%̌²>xXn8YJY IDATuJu=EQSUEl RKOض/EY ם~'mͩӦ@t ?P\u&q]ڵh[?w˵';Wy׎{G ގSv1ñ,tݭeeeM>u>GtCQ]Y᭭ f ؈֍9!h`I)Nʙr!eOiyx 9*^z XOP~gn=ͥv;XU8wG13R2J f=%]A⯓|ÏFI]FѫWz>uu_1gy.NBQsTU=LDE)&~"@R3 )^)ec'+u̔)S*V{f/)'3 PX~Zd*zN2/7v,&L8aekW~$u`.;7o:S/RLմ;W ky_'O 7''MG -C2$UEQauct1Aﻅ؏=_Yz9~V2mN.33 AGsU^__}CWT;z4.r Nö +28$. D \XBVv6b(s5P7hnll-_+|gn^v*++ &>@AQeׅmp+K܄={vR42isf@^n뮻Zo-?ωF˪:ًEyUJ ;@3CQ^W?Mqla a|wyyy5\k=15<;oNu]gNgnIx:G~4+o?k{don,wwy xyJP=oYp{ vti` $eV,>O"^L^Y% q([vŋ\ ʹti.`>3xp? wt,OWUjQyY9ƌ z~HӍ;o^z}[D[sKk 㥮em+,um~QQQ~Űrڶ}k AWci_{mg3#//Ϟ;f0|4 뢡= /^Zn51C"󒲔`H@f&3g%7ƺ܌`m-&=h/|EEE8g<|×qV tLp q hE@7<- MM!͡ol֛=x!Cx\BC2$Kjfu} z p8'"ݢDBm۶8·4M׎+cRKĆDry8mO˥d6-t 2@75ۿ=FK[9_ұ/'\?GŹn~fw6w_T]\IHe59rr +*<1Y4nym "}{Sz#܈޹a7kWؿFB^—˞@[2pYN/[u՘س}ر}hog׽ ϳ,\=|"hP*}crnHwby._KF#PCHb,_ Vf"(@@O aP(Kv EBfqinŢ`Y^{ NӲe+^*((l+*.^j(QĕқLj7o)Tͻlr wr~۵ dL犪n&p8''gç>q]'t_WWW #k̝nl^٦m';:*\sהɓ!T˱!(n6**pyUz)ܱ^=PT :<&h@P4pwž={ bɹAUX bʏ_c#=Y`-tUC2ž={qly6X$`F2mQVZv m۷]2kdH8(ʃ_~7{zz*DɅOw߼o\SQ\/"חH$Ǘڶ=eO=ߙ56D6\~7}%77kpbi+FH7@@3eӄڋRisa26;uwߟ w='Qb}X#hnv9̯&zJ댬~Qq~^u6}Л;+{Wgykfgx%BM&UVGMc/z^[\e_0@ض5}ԍ~{sb^ Cu:<[ԑ\'.x{)|,t95l9 ջJX(hT^Mf>1ig?B)ߢs]M1G]G)gxϣ~ڻLm+4D!f;-x x.`Ӽ7qygT|\|!uU`0C*f^Рn>>" Mpִ)Xkwl,Y7^]zw0XsW^^W]7wQ;{"g555"6kc3a[~g٦d" `nYi엯>|x^{G/_ ̙3sǎiݽ[?ws \xJ&PV:Cvx"={\ŲWg}QN{CO PG` :\yܨcwuw,v\w(ynjFee]_|˖-;ʡrrih;w.a۶EdS33(ֵk_!/s„ I׍$rom:k%뮟bۈ(ZSSs?hQNfO3>8B:C/O.G ?<~qU6|  7F<@YY!=qπ*Ǔp$fã$-'ߛ}U |h:#[=-v⧻ћ$Z&2*c&Aa+-vNl|w\x/U9殔\)ǂ` GxaF "15#dS:߳fr z((G?ý֜Ë{KԒ'喖iUj. š-$!{89=K<~ˣ&iYslݣY)ư}q]ͽEyh{Ѣ UV*3+̓!Dkxւ`" f cjkkҕ(,,Quعg HZvCxȑ??Κqb՚앫A0cXl?GꋋG_x/?8~s=Ϛy_zۖMxJUeekkۃ_KQ2fܱ#GQ{{^iFVV{{4CR(#FdB{k"++ &MڠACȁ<6FG[A{A$bB*HPT27\lcNș:m:{aܸqtU/ :f2ǶQ;UHD}7HnZA!cm5j\sMS*:]D2MSu}׮]>Ob|o|73 ӱoFNQ;ʹE餉-pUi&E%{:q$r@5T!ԆTWAi,eoM7`]u_[Dކx] ,١l-B2I ,yp'~6 l z4x\0K. (jGgQƊ:4Y]RbIQgUo'Ru03`  06MpK).Mr.gc"E5%3YY7)(dQa&؆ Noݨ n3l(|hN5Z?Nh._PZSlY^Le8vѣTR H\> }9LrO6B5M _%w& CЫ̼=*+!bINnh"[UkW\[@632QRmUVY׺xO._feY///ysUNKy@ ڽ{=o>uh{T+.uڶu@7uۖ<Prrswx[׽z8,懊?UUa4MP>^Me!JB % &iwƍ E.(*Y[S#9E/9W Vt3p'f:}Z%`$ LgnlE茑/?#\Ͼ% =(ZnBU`,U"Kr1)#܍^4)kN>U4 "T7EKp]@!PgڜmP/ ځlot;E9Mkz@u-5VIJ2$"H5x|LeG.7^Bl7g #SXxaR%O韖lh^mٲsRJaîkW; &B7|q</J)#g@9sI&MrhooliiKCCß>^Kq] >raZ6>4 ru e޷흰(M`6 D {r< ]]}P!'/@`ee߇[ҹCjɝ7D$UbO $&JxT/nwRy. CbhњDKH8J3jD1]nޜ!%EGG8Cw~NRenj MIJroo7\ Y7iצ~[7yF'SkШiFaiNU QazMcp^rrcC{^}/O{W|ydDDXP(01"f0) Vb":eP(e !60f:PضMM\T\ eY8B-8 ֬}U Iaҕf٢(j(OݻwkiKK,EQ3gŁ@f:0 )ttu!DuM&XLQ&x2Xh,0э g!ͺTN8FaY4=Bς0- 鴉#_kK9C#e=wH {・D$eY^*ǹ-g?d2|rgЮ{oG)&D۶K.$~`p8iw~o֏m G TzPHiD8@?`:6ZNx\ʌ?+.ȴ#<߲,tvw#K}=`0  ]E9.5l(04m6IDg(5]=zx`\&Vف;D#Պ chH)a_zJss/E׾UUUx"3XG?ǘ~ ߡWUUz\J9׽;/xoI)4 ̬7Hm۟%u̙3Fkk޼y{I|/)w~^2B~_jx ts/Js?^@))lAIn{[zW4a>Vl8D IDATH<`"z#Es~Yo~KvΛ5dLSL\(G@Fb>?;}荄K`Y68 A0{ dPatutl(5<|Y>x=^1Ҷ\#//{?֐ӅEqޢx|SOU}#fcReee{C:dp3s&8NĉH$jim=ႦϘeV4c-[]0^ǯMIÏUwwc@ք2ضCH ozĶDq#qX) BU5"[o;v`Ϟ=ho| ;;ONNTUE ;#GkkZ::uH exTU? #mhokCK{;4XnTZ"DLxYfռez(//Ǎfgg~W?c4iB]cX̙3A?<رc5UU{'O;{$3mxTU=#SYY c&}Ƕo~ ;v[Ow䲲UqCS[g(HBUBE}z3q‘n眳߹xsKH> _aQvw:h/$Ҧp_JEw{9@7.|`Yf`Md lOmG} j=AY^ED^ĜX_B0":3Fc+ȧl$H$@A/A@뇞遢LhIAv yr졋d`4iFܵSJ2r`P0l =7QTˇ1۠g 8Ul#ʽL}B#I>#]H̠ [q`{+S!j27g{z?/=ϨW|M7SwqWQ* 6 fJDa)P%RP(' F".Yp]WR~ȶ)Ǖl a﵉(`&3h֮ Q@3s q* ),D"$DvOw/* ;rs::{W\~ /Z{^IG}⾏_{U<|(;yDWWP<+֤(DAڶ!eJU ,%w^444xPVZT* Q!pm!t$! Y²H$0N4MqHC v\Hh'>`뺵g={Pkk+ o>z\^^\zu:PU5\PPp',t'8k,޻w/'õk)((RWW'띞WN74̝;,O ׍^($\|xe:xu+ss X0w6Fq/~@h8ҊTLv*.sS,1Q A z0nsgX3 FPtGVcqBߓY|Luir_A.ЏD6(:#z3(0E-U3*{س}Gf[?9,>EB9!7M%ehp{ ܿ4ޥ6@Y M ͟Kټae?[ڃF{ajfiՊVY +HtշS~vz*9&UEl"e[ם/{Os-ͭ K{$aWVT~LOZ8^qI#g䖝\;ČK~{o^zm8I) bx![TUm8xP~wl#`3TfkCP\T=x -WZ+_%X+W`PE \KH6-sf,4lJ,\?˗p___)`SɤR?~ **+ ga8arDx6BS:LBww/m}y|QYS 0`X24MC{{" CLz LP p۱a; C3x`U.3cԨQطoFyt3!+RҠ޺:߿#F@cc㠗%M<4M8)+STuAഛ.JXqcŅ鋠)Ձd 68<^/FI+z Ha6r9(*CMU)ڨ/ )0pK֣@1B*&170;P!~ ayJ.F7T+EG iie3sgaEt-{'<g,QnB@6g!(@e )YN\YldC* 5yΫiסiC@['p". w͛oek J9嵙7e+M,_QBa'{L'4W0'RB#-~wtP\WqQ['* Aڻ)O/F"H]RZk/!Ps C2?|bP( 4$H7yga*.*;:0]KdDQUkGDG# ]a'-ӞσǞx֬^ f(~_{ߢΟY矷D[p^LSee?FR2HP)(0-fڄ8PtalD  UH)d a6 E3c P:X犪Bz-²LDz`i *&C䬳 ?3;t>lZjUC2 h2۫ ̙3<jjj*7nܹF 4yΜ9jժ\p޾>UQYYYgx)D8u3TU|*4Z\@'ry^b&Q[{J?{~ &5UMW"I` ho=6s)zx#ͯq(V DJbDe "Xh7BX)B(E"A07[oJ@Ԋq=uFSk-]XB*~C2hs(K!\ vb# "UxUB&¯喐W|aoXM.L~(FAwO SWˁd'qK7Svg'MlQI64+L^XYSUݽH&Ms0 CAgT1lcيظ:ىE3PQiWC)3H7UWNY9VI=XXO=N#siS| FG)وHBE^$z&7hZ{7oanof8 1hT/)%X*{b E.z12Ca`VGNT3^.bL>{^ȇ,1uOʅ=Iȣb[{Y7Mɽ'j 8گ"-2mty4|D́M8xbT^Mš:UOR0߲<g@f }|ҥ]׵@߶1b"D&3e(ʆcoood29BqkĵGKخ(^7H$TUM8JdիE$ -K-|GuŠk<4iN=vmTEEkG"OwڡCL8Amnnp٥GohVmHQU#~5@T 3``(+39WLu]ǀ e Xr}O•=`4qjTU߳^]T/f Uסb(ҩ$CYC}*tWbܸq k/Lկ~u]gã{-'I@(WDqA[;(*XY$BRI#m&-L0 Uuw|d{%Ů(~z_hiiBLsUnMŋq%tvq85a$<+>_U;2:0%%x8b3 @)ݝr&BJiE;&QJ72RBp*U@ min?!!@mW#1b)IKm( L&ԏLUtBVU=z{ߜ[ZZ~;G#Ҳ2m #۽+Ka (GA9>d)xANG);l6Q8}d`6x^{qt:>z1@UM9'PS<r;v"MQ0vaY-Z08FEXx<\/ʿK(F'|2QQ+R~9B)}VB^p\Bx,ܴiBϚ5+fΜY#, %I(?[BWm޽ބ7W\yɸq? ?mnn.%xEQL۷o,Xl;w?'/}OR$c<[vhA8mB}a󡮾cG_^aT-H B0f٤GhD\~+,0p{]4eve9ւ#)f>(uATD'e 2GiK$n|o\j8/  %@"H: sH|0#MEmh%i]ܠrɪ8yOY A=m"37Д5@;R@nulc@bI8 (vOiǗZl#j@!!甙8.'ˢXсjpTRTI^OeeJiwD4QIUTTtX,B b@c=!/EQ(96GE,) GEFRJ[v~C?]r6t8Vl$ZRNVV>Uaȑ#~Ѵ{`:5::] NvcbcyF1M' RQ^p'C H!r;aڼ^qhFSȊ &+RQm^oPSSSV4778[3Q۬㠪m\ p\p=EqQ0L\k~6Q"[p!1;w.5rcsGw뗩z͝y0ƄP1xicA^reھ}fX*dJ/_~ѣGW{~~jժ(sQ]Cs(f0{18 = avSB$ cX90>A[ f"s*:HXjg 8L{2|%%;geq82.FDj"A64y+@t(S\I$yMpXk~ Od%gavE8M/J(2B)Tҳ~<7DP(BoPXsVO5z.Ma\vVN"Do%zg ۀtPN@DbGez6PFu^#XEYb z94f.MG 㖉.w+`k85ywdP 0U0<Q#8'?] BOԬ Le0MiDPHe`x`4: yuˮz<(E~~>dIBqeBP ?Xǽ\2jhjl@nݐZHѣe4|θ <\_.I 忖wў^{mfYWW~Rwr3֫0''G_PP5USLN<=o߾(ijjz`dgg999+=zÇzyyyynfN_o>PjkA8ZA:D3 >&>W@ ?ؘHbV;㢡29g?z`-Zn{rs$9ob'MIf&Icz/W-v_[&nnDN SFd4o/(sތ uOMZeƫ޽4\LF(DdNwDGjzs 8|6]AgM~Ihj~[yvie HBRjF.,W*4׫Tcv ;ow,Q}e4B)-ut&7b9VQQ1ַReX\ZcɌLBH tjjy]$\U'K )<|Zf=zڶuWUnA6lb!qLefte历ccc蘚TE&ݳb߾ݧGVy=W-)HKKcxn޼MsQBӯm[>)+J.~};e:lx`4QW[ں,RNsx8xP( ݁Oy(LIUvTW!Xdd a` *x%[]nו6mЫץbnݰsj%(BEJq5A@KK rrroonHO(~.͚553xՒ%K0aBZ$A@?,ݴZzjSO=osss]vٳgg;Y:z&揪){F$H :$tDӉsȠ 1UUPz)vw|XS'DMvS7W,8rM_5AeK^xB &#IԑpN\%\]>_5NAbYR7t_'n\=jd}+0ST$&[wPycQt^^mi!QL(*qHO~3RUwb>jky5Vd x<#"Sՙf;JnСC]kwbسg.2nV'#1.(#Gʈ:꧟~?p`RnXѦ 1ٚ%S&h2!55}!2naP gio(m)8,aSĄ73Fx.{GR,6*Kӿ^xu&uJ#Ofz?}Sf{C=ݧ^]';_S-hTV.d0hކrk> `2;ML^!0cx-EZ"L4,Ƙkn%8]+ B1BslplX4:Ypkcc'CAx9hȾ}zFv"K4Z-I! M p8bpaHYe&n >^{=L}7U\jIqcs"oJơejǎ||>]UDEE3DxR<؛%`6AeHzHAؾ~[#j`4 ?k;p9\ڳoe]ɍڱs[,iXUUj HAQNل(!=ZZ-q hIsAwNsig̘zϪ ӧxWr=}n{gZ^n]cq\:tIz۷PU-$u<0&J #} D0*Ռ@jǽF6ldT6#1l *ћs)|y'p(>Nܾj' V+%qW:i˛( C n7Yrz`*_qZIǭ!Blg~E?5r$קO/&cDQcb 52n$:6*SyvdvNGbR"`NU4(!z Ç ͷkk9|ݵעkV|( AX%ǭGh),]f1χ Tdj^dÂ:HQvjXCxMZv{iNNθd^cΙB}}=<n^ct3vueߏ?ZAU[R|SRwF[>}knp# քVaph8f#J (p̊qq}nw9m\plbGT"Pϔ%kG[Awg]-x0 տ. z6>!Xl$p0ȡZL*I^N>y*Bi_Oӧ|A( TTa` *cĠ!>_p. BbDDc*dv6r0f0YsK ׿VFR:v`:ep4dHII)"#"F!'Nphli $&v@@@e), v%m…re 0 >~IBuU%$ ^` ?Yƚ/\H7|/ݷoe}333tK:!iii$&&ED{:XKKclRXmZ#N^W\o̻{uQ~ %o ,^(/L4*A1NUU/!8;E`ҤI'_5-O~ҠY9lIOB2ZNc줱vksnWuQSy91WmB}Ђ['GN~7uRZjܻR!Dr:$Tߣ ! d@#>!FVN]]ݽ ޠ;`u X( 夆`tya3ҲDv&NQZVJ[pdI^j2;~HTd$Z !"55(<|j x&y<hd ePTP ! ?Qbf{{oCEرll'H-յ*x3t1zh31rdNvj-%'@+h۲;B\L^/מ4i g=mmBkahTM|zڬ/~)y]#J%ˤ En  7&C^W_I^~f)ǽN)mȲO> Ji3rǟB8ŋ{N; qF#1'A,TAX7'z+eE;-)Wy8;^!nEV1tT0HY6*8 Xqq\Y( 6~)R'\%pP q0EDYtWUan 7W։Gk]-I#|~$`{(8AEa^0q~H]g4.l}^7#0M0L ˉvF-V z_x^Q2b@r9Aw^01l6Vz^rj`TFAQUdYdϷk[WUU)~K:y74ۨ*/%oE9 o߲*rAՖ=+|K5QÂ'#WߨQ`7g}>6''G{>ӯ_?ߋ3~ք_ٺcGL}]c QQQl?xXIn8`~0bE."!⧔օ,EQж6eE+28kRp').k$VJ?Pf0ϫjmᢏ#<^\UQ{3BqomtOtG\sGK"nUQ2N&#"/ߴiSLrנƆsgMHii\eL 7 9o!e㥩MMMJNLQ9pEǎ- VkVTVv׃;(;[qvm3Caw}ܹ3qڵ HEE bQ-[裏qFQYYYt: >ӧѝ[o׬Ys`ɒ%,#77%%%8x ***\}Ι3~\=~Q<1;v9==ڡC8Kxfee%s:$))ܼ$&&F;vncaaat#L&%_{Ӳsr_2}vc^/HªMjvv6f\*8ڈù\dV ^F029mn &Sd%F ;3||Cfx.f ,+4<ϱآfM}OٵkW?^DBBRJEщi4vCDQ9kV췤DVXTuxJAyEnZ0F_|3]sSёQNJJlqiϞbIٷ՗W{nǜe222soDEEtHҖMl/i&ե:to~t8-M#GL \s jrv!۷oeyر6m4uk׮ܻwSiii0L |ܹs{.]Ri45P k"<ض DDD忨yw}} y ?߹(gv e/Rb.]3`ErO@\\(}}pĜl69Nq"Bj5~/!䡶gx[=EQΫ!t+,ǑPeE5PJxQw\9/T=*2ެs4f途8R^ {y@\~ Faa!2qpa'؜> yΊg͞iEALt12ޛi5{n@VKK IOKCBB<39{o9!!EGF_  `~Wځ:Blޭ3A /46Ν;/8exjͪfpיBHb9}:Vhss;3PBT ruHYYRcjssȡCX IDAT.>^NkkRbUD7@%c$du͂0reeCڵ@~AUK{K20Ajk=( ~]!^s5Q|155uB""" q,`aXr%۲e AF!??MVGPxԼ^9\ ƃ>>V7tPx<Ȳ Yr`<^<( t `0d2;ĝwީۼy3 {m1l1a~BիzYff 7|q@e0@)ǒ%K *Ły,\1yCkZ^fmZα0L!7xlMeY!W^^V8p^ZZ}&L$IuN9aիW#55#F`z OepŽ---dY !6oW_}uHIqfsXu hn*ĸh19|>h4"o Ö7L8qZ}~Tcdtjjꉢ?q}fU%/.\xRXp( ¬g2QXRV(O _!(Y/dO?PRRR9 :9\Gwn{ r@Rx(Ro!t35kB2c*,kVߴd=ABB 1ts='%%EP "1֙1vuyyᴴ#;p@|%p@ehϞ=f$$" Ž1jj 6 f?mvnL]T?d&;Zd@ `0ܹ{ܑ#e1p6`48wV{EEE_" jb„ 6l^/V\`ɳV0L&(B QF!##9(hmmd2dȰgu\xUW J)JJJ`Xc(r|cǎAE8N`̙$99Fii)rss#~ rxoI&aܸq@$IBYYPSSPJaXHLL Qaِ/-NCzz:.]~}AѩSa'qyy'[qE:١CHkk+|>^/RRRr.?!("V\  fHNNVGuKbb└fk[hnnƂ a9r5ؾ};oѥKHII97n7)//ܹsOv40** vBMM """v!2:t耞={' EQ|r <<';wСC6zñ1fEqΑ(\(f gBT}F۷~YWU ԉ?zd9 4۽}Μ9oBmCy-q&&Bx4U6^RYRsSݧ_!MLx"H.oa5M*ms>#j 8D^Ex!@Ee`bBv:0Qa5=l N#:$s3 ۇ:E -̌ Ym;&:{u9[\l^ ݻ}&Fۍ9s%ngc{0={dV cI& 1^(*~/V.P/]eXZ***v3-//7;p SUaaa$|Shy5W_)O<~ Ue:e}>_RT,hM ?2lؐs[# GJˉ9=:* 6wn?=S?{?\Suu='uVt:rRss^={YGb0{[Le~zaqco1|L0w}7F#A(PU^ǜ9s? CEAA\.Z-E1*{,2&&iӦ+@ѣ駟ƍ6(z8px \y啸뮻 UU;h4yݻwDZc[lAAAJKKqL6 >, )SO=׋իW 'xz+NdY|#!!g+@XDGGѣzݻw =v;"""N;p>̙3ғ].zM7ׯGzz:bbbsaɧ;k,a1b/_BN'o{qo6SU[6 zѭ[#,, ]vn6XVTWWcݘl<#)) Z0ЩS'\@Ej4H1x`O?4֬Y{ p8XlY[.={*G~bԨQ8ȶmpwR'|7n<㸲,.C߾}1}t 3gDvv6n7N'֬Ysq۞wƌx衇K/o߾/0ex<X7}zGe̛7%%%xѷo~;v,`ҤI̙3e >) TA@)EǎԄoSN(X`"""jxX-׫W/xfdggCuu5Ν{t/ {QQQ;v`5D466B$$$ ^pD1vvv gǕ3fNNŒF:gΜ7N烄Gjj5SN]sfnVBK.}x盼d`P·{><-+QJIyy z*HB(pbL&nfF V z\nˁ> Oa͘+SՉ,.Httf]aŊ/aw9!ƃ#c0E"^J9tHMESm%$b$bo_FvKZZ' 5\…4#LIN+r(o 0-7/e=سGUtZ˫ۿXNT8hei`̒x'|!j⮨^^^~IZZǒ$/sLU%B󲃇f74Fu7+ҋ% 01Y"S7{EI`Ln#^uN-VSdI\.rdp>,:N VpΝ( DQĊ+pWcȑQWWV qcРAwAn#66ǏǾ}c̘18'NV0ckrA",, >:v숡C׸~;0sL GjE]]ݞ.]@cȑ7n/_UU1u[oE^^~i̝;111Xh^uDDDnniii v4{999Kl2TVVb׮]D>pVGAll,}Z wy'{9dee0f|hjjBkTFrr2cXt)zGw|3.**qB''y.̳guq/'덂$G m󠩌A)=w[x!ʯʊNNo?!De,ʭH4UL HR4~EG`2@xμNU@rhP⪨V^^^l7Vw1۬Z֔Ԏ;`݆:UU/BA`Nx7s"UUM3*S{۰?jc?FXQQGEZ fsn_qфB)ELl 7ێ)((@~~>jkkQRRٌ GEcc#/^Jlܸ ,QUsS3ITHHBB ""(VPtņ4 6\@!If{&L|HCQ^Ws)y@$Fbb"/_ӉA!::u@TT@1|޽GVEQQ ?Z9rnXjh4z\plذ'O~ޠ ,Z˖-?,Y~}'xѪĆ ЀzٳgP(CUUUBFF/_={bΜ90L ** R\x. ؿ?n7.]ԮW_Evv6 ~nff& SbF n7v;˲U&466JCn،z>|1hjO82ah8pu=gk4r|eX:FXk:dxh[Kbt p5}ɹd\zђd2PJ }o\;aFKT麜dpZyEEE҂Bsrpw_bBߕ+sᢏ~>wH4 'N/ \⮻§~| PT@dd$֯_^zƞ={w}FV9.]LII` lܸ* [^^#??};Vqܹf3ѣ/_n_0apSRQ5_GL6mḳEكP|(((͛Q__7bXr%qUs=6l֮]w}Xbo|.;;.]?'N.33˗/֭[ ̝;fͺwǏիq1,_oJMqw͚5Xn(('~jӦ Lxy0j?y晦~G3gK}Q֯_$Ii@͛jǩ*++2;ddd~sh,Y ë$ w(ҟ8yadtz=R)+7Txs+!B 1,ˠ(bdİЩUos@A^@Í K }U*dV6 @`TWȐ2!(HNN@fT"ӡnם!,ô{\pS#L f^|w޶|iw9pX,o'N4f,˺xB(}|tnϠ'ZsH^j2t^̛ɕ^o4M\uT4J2Nպ/iRt<&I/MRړR@@0 Rp A &H &`04u Q% Bv X=:xqcG0~\Zc#ʃIT(#`zPJTvcs~/x</NtGq7l: t >T*P^^5kW_p0gػw3yyysytwʕ+ꫯ"%%_~@ Λ?ӉƭC???sjW  #Bhh(x?HIIbjEHH Ʉ_~999G߾}q1ݻwy'Ο?+u544ekHN۸6l6oތ^{ yyy4iүH#F@}}=>8qFiN5k`XprŭZɾ Q8+*zwZOO>dZzʕ L8~||vW^QhMMՏ>}^w֬YR"ߐr{{fؘ0/3LHW^};jذa4**ΡC N81u WMUVݵ*`K4ָdX Dj'Dz|1|(tިÙ U!cN@k0K A455,|K/ !p(--kϥx)1~7V4H 0Wf3B H*RH`@pEU $͍"B+=9S$UjmE˄' .mÇ v92lt6^!দ(C}Y*餥\JrV ^ IDATv~R( e@4p j"#ђsumh5͛ t$Ǚ\R)5hIlkb.h $)R b[**ZqC)WGYp1o@lL,! \;r8Ë|0EK(CGlǦ,Ҁ ƙ>xG8$I;0 ?{"n %[FGːοx<(((!gϞExx8^Aaܹٳ'}Q3xgrJ_MMMذa233Brss!I5cXr_pa 0mn7rrrZm1nCE|7$77רhB8V7`av$%%a˖-aXPQQg}xw0`r;Nk׮E۶m`, y,[jE=^u kӧaZq=QFaǎڵk1e>|W߷9q>>|=WM1L6Md|ʋ"a,ǁXRb,^JxxBqi].Ã{̙XRimm^nݺg>/IR;L&T矯< !*6ܬ 3fҤI/M2Jzp2 mzz-m(tIŐ@Vف+2$l3'OB<A#$ bԠ߾ }àQlK !jkb*g$Z3@:0eʾӧ!QW3 ܒ(D)8@%R$4<:$8 :DQf`ؾ''%Rqb Zdڲމ~Uma˓܈xwpo)@qxi$uEhݕ|}tɔR! oby܀l(2D"i8|Naa&MJpD J3DS<-JZHletT]//a7= f`(i]0(1LaҡŎȺN_*IR9"e \B nZ~I~3];r8$!D `0u;1Sr/ I)hc%䳵o\.GPP(k9a.c(,,{n)E>}}}}!"E\.\]]mEɓS`0EQ|Y6m eYqC׳θ͢(겲TSLi-** صk׉;wO6}5w\JMMX,u7o%%%߷oqB{ohnn999trymOM<'UV Ө )CCǃ0 Bdk>:o}qA:fZ3,a!J",uڭ8 :GKG/>c^/]A|\ ~ڛ"୐rnPdé $΋R+Pns@1V@R{cQTzxyAAQ_oau(ob !$s!'.\(-+Cs0CooM(;Xm5^tn+( UyEUe]}ݽyq,gh4A\!'1i8pl?`JrRfksrAQGFSak *={.[p8&^7ɴ-X!b*0U4BEb2J Ch$)ϝ.a#("##$Qe nbX pH4rAVsE PeA #(:vҢKTra|SԾ?x<#QZVCSJ%aiu뺫x{kk <_P(>h#}l=z wun BO>/_FAA}LhΝRj|Xp!\t }Err2j5N^zҥK())Abbb|g"22YR ֭#Iv4!;;{^ߟ60""gΜAii)1bMHHA[oj-N~#fHۆŋLwpȈ#h>}d<ھ}{ӯ:tٳ<Ϗ|9и8I&=k׮l۷oo߾㎔~i87˼fCNi|QQ\"hF-5"+ Q_(x+=i:oP QPb Ǣٌ^!1Ъ,l5Aw// BB% L |hX".P*PKcKT8d6)Hz}jw@c&8NJe{9pۧ444ILLd駟PUUJC&!!!f/^くv;$IBdd$<PZZ A p9իQ\v${V\pSqϞ= ǃSb|'֯_?( | |I|عs'T*6mڄ 6QBn݊Jaaa0HHH7ꐜɓ'ݺu N߼y6m4@bŊh+j4668|sEQQVZJjTTT@j'wMF9XsΝq,jX?ʕ+=6l2dti{|RhhhСC(0X,ػw#G|롇رC_ZZ6x`G*++qeT*iTTa֭>ӧO $5}D%5p)?rޕf9ҨQCBBR|s#QR}tqJ"/cFpםS Wqx _7OJDyE%:K!J*jV(lw@!n:jQ,eqr!tHz<3&' $^)00ZVså:9 f#$ej1Zl n4IRovA &׭QtE$eI7Mk%Yׇ80S|w(ǝ.猶zpbY.j{a7UǃCdR=]~e,[Ji^IL-_Kl6["0hTQJ{pW%Nߜ(,KAl[/pCǬV7w' ^AQ0,DI0T\䟛\Hcǎ}m~b?X,#992 6 :x<z >>>ݻ7[aʔ)x0 :IggϞ#GR;..n_G} Xnmui^fFF hqSlٲi}֫{4d̛7(nFCCt:A@ss3|}}V>2G tZ/2HC d VCqIC,ma+~ eNXm %?c-KƢyOG30 Z6s(%b9G)=}q̍ȼ<&xlƂB(U7U((#Ɋx^8 xQj@KtqCij q!r6 @K) P&RJqtm+#ILl60LqEEEŋ9ڣGt0p MA-2c,1&msa \8֭RU՟Z`1D:b))+ܫ4[ԓ>JF٨(´VETTN> F FZh4 b˖-4hL&{,aÆj"77tx7޺u(nŽp9zw!˥#Gp 00[qߏSv9.l6P(paaÆ!""$ i(hllDPPq(4i>$%%믿Rh cƌ۷oE2 aaaPPRST7@ii).]2< Ř1cx xPWW̝;7`ӦM{gjQY#p<pʕ)Ų,9s wȃ~$011X\.:brA8Dz,x'gΜj}Rʶ&ccbUAH˂ޱAlhh47½y27d#sRb/\| O˹Թܧ_d|\Gzc7В2>tSk<-"#;f[&W@I OKs>CHi˵b&"m_DDR' 4@\./$)RY6GFF:;$ñ `C}aȡ@ΘaEg L@D ?6 BI-eqуBIТQ@P'vt:]ߝ#8t:R NSv{ \eSX¥Ŭ쇷~Z_*114y߾} $99SN FO6l紞B8؈-ZTٖ(O)%{ @KiɩS)C'Ԅ$L1cFխޗh<~IWhh( ο4h. ੔gϺY+ GZhȭFz<~:/Ι}=kDQi98aBj@0 >C!@DsĒ/k[(P*p\ `r1T{B+AY{AmU|D{3$((604>>X<ٝ1bmN"AGvTRA\u!:4?_ |wQ^ qWW;W Ѣ8k[-uFRV^AY]7S86Rhσr#`A)e5a=-֞J-raRڀa*RPlJ8BD9M)<H*ewnUUq8)j^|~lר#=ƏOh;r$H?x$UQ:*jABHո1şQRJ{8`|7/r'{s`ewAն=>>V9tzBli_o5Z^3&M’%KPYY U-[`„ 9r$$IBII P[[Z={qx u7.555`YiKk6k7jb#ru(,֭Yf?JHHg222ǂEՉҨP(v566#j ;fͪ[vЍ7~ػwX6###,|g:4}rAFnn!Ly9##c!C;wp|wfE!((h[o5R#GZn9_lېt55C9e 8XRx{{l6wx?__U^ UZWԀW~F$ ӍD/$$Y.ou-U"斯q;친@R(I}>'}sM盝N`m IDATJFb2a帎.mʕWT87qo䤧 FEFP///$K !RT*=(now\L6i'u-B׸EDDVD`04L#h)S0ɈkvN3"ctZZH烇/H7Бc-!>|\MAq"FF 'Jlaȋ|۳"Ie)_\.JnGTv[Ȃc5'ˈ )-qz˖-5jTk> Ny!88gTWWc۶mxꩧ0x`?~丶]ٹ^FAdddAwQB~V__3g䪫ITw>oBBnd٦GDD'~$Ht#33po+^ٳԴ9""bu[Ç((--{(Jo*RBk÷QN@8@xGQWWw*!bDZzVל#vw`ם8M-d?s/!$)}||?qCw~͈Cs9y2jWA[UEmmy,%9i﹏?KGGER//ߦbf<2h0?xyY|[RcRM&S`JL&uA ï&IN)M&\DVE $BQ$Quhѣ 0fH zQ2n=y"4eCm&R&F*ʰQu1L.ft?WTT\N}*&&>kZL<},X9s洄xb`dF 6}f7)))Xdcj3g &&6\___hZ[P(_|1.##c(~aŸq DElذ[wĈ7ܸj׿0n8$''c(((lFff&|}}1cƌ"MMM8wѣ7p())ATT.^Xs')Laaa{~)v܉;(((h[QQ477h4B#-- ۶mØ1cړ322p( ߷myݎ[YY?I?;vlyWkemf[jx)C)%ٻǟ>jz$IkhKǩ7xCF)%U'o^&|}}s$IbBرc^ii'JMMt{ّv_ѣOAcE݅ BRa09"TƪER(,kDFtZ//D@O}OH^aIel5玙 j+y^X 6U*aaa>|0V1 *1чx :;h,) UcA˳ςP=z*+U2q3npf^-//}v b7AEUUhb޿*VڱsBL]Q( rݬvG^Zo￱ǁc~>>8y;/೛BxJ%Z_@**DfMJy;\b4,m>ILL̓U압$n䈡E]H M&iJUJh1"'@E) @I'3 sNmܘѣ'ܼ{wOS0ǎngmD$oޗRs#cƌt@#Lɬ=:@R MjkGmظy- V7ZS RxXƉs<x8qyyyxWJp8+׌V7x-Baa!F 477C j =͜9sl}}] ʕ+-xb7taàR 8˺|q1cN8+Wlh4b„Eƴio'O? ݎB,X?> &oAEEn݊hXV|7عs'|}}1sLL6 ֭ҥKDVZ| lW_}^\ ft_Rٳ2 6m¶m`<4 ryhұv -AV#)) $>$$D^dҮjtOt&OXj՚q_nٲ!s7@dϞ=OǏSW駟toXXX0R~~Nٳgmy|5=o =CPR^ ݁jKTj8Ha]}I%[˃& AqPjg qk4do<9\23ϐaReIłцaxW7XDh8xe (y C`oܨt%uvuX?|+/q5[p">E2QFENg'zTVT[sߤ#%9s9΂Bp%6$^aիb0M&Jih,$ .T+/Ji4R0H)ߋ*˹Sjuχ)(DǁB,P7hDAo=AX)cScƌl'}"cON&:lk"cmdd8 Qq1gsu8oh6GtChheEK:8p())@YY|cǎfҶj+rJ8qqqq(--Ŕ)Sj޽{jkk 0@u=@$#++ z| ~^Gjj*pw/PرٳgSJEVXoGBB-fggj&Lh۱`-;v,W_aٲeXnV1g̜9}>a,]WFNNx hZ"$$3f9y=/ߏ,8pW'\.h˗p :* 111BUMٳg8~8vbP(ǐ!C`Xb[~^t*W\_G)v:y2LU߿IT*/^ŋ#Onqԩ)|k*o RK$8YlpZ 8U*qj`,\.ðn tyRxEW[/$ivn#8(sƱ'y"(r,"#0oȹvL&{]׽A`+/.]~dyyyklGPLFnJp4D.~E?ЎgL-Jr9x<`, ooM3?5YCeU5m NEqq(C$enֵ.j=j0Fc3!$I"5h)|-X2 seٚJ&;&| P @40A TK=qglڨkv7>:]^Oܒ(A ""Xm͚>Gx{#22aPPPucL6 sACC*++q9۷111 iܚlذ/^ĢE0l0|7n\;iKn HMMŀԄ:L<Çȑ#bŊ[]x1N8EZu܌P_~YbŊ;wu477w~ooo,Y[lwމo)  ̚5 aaa… 1o޼~3f;d^ZH ;# 6`ӦM6lѿtPo|ZMN@&ŋs=ձaʕ+DBB2220|v SNEcc#qov+ĉ|2bccP(p 8`{ァl ]vJz2] gϞ=*bZ>ꫯn]aJŵ^ݴ3:pz?RTc+RTo(;-/m$,r@ N o2V?~UMs9ɻ.{Oq.d~\=QP)N^WaaCMmjkkAyj@dww]^r43Jsk_v,]իW~vA@W0Xw >" b]d!/nw}IP`rOAPJvRѓv;nCLZã wsO&mB.TADQ +ŋ^Z {S@@HIO&m2>s)$0xu=<$^߽ݒlzR'?i5G/pRz.$$$To2B0Bc2BR `0\yx*5f_N|~=Szx{` jt:n7ee].0l(r(4*JQJZɧ}YVq}'%o#}jE&Hh LJQgS^ڵ+DQDuu5g}ׯs=״QJݎaÆ5iZd|ID-Z:w܀l={7x#v;BCU틵kbxxеkWA Y555Ob DEE!//;0.h$A@vv6֮]ڦ1L݀tR|>vmm݆T̝;j:tF[  88iii瑒uI qHKKk 0=rrr @kjÇLJ~3f@T $$'OD~_hp͉mX^p8ȳ>믿^rp믿f寄DEE  JKK%%%K,y:55u&QTxAAAI* xg2_e#BCc^CU1Aet.xq) MV Jp7^#ky46Dyck?󪷼8N'(R.ص{/ƎP=nwSBC>FN(5K߁ ВQMk@(JzJBCC4A@d g8r-ػ׎ʐ 5rtKzK鞼d)$I!?To/`Pq-$I| "GR>Rz{ xs1> 4x"aƤch I !p8_p=p:}v5>o sx ,1n[IbK/V}(˕Jar zт(xH\1T*QRR]"88Buu5ƌ &4;tnw}MG111xѩS'X,|>K*++::`aaaعs'Ο?DGG;`@ZZJ=z<ϣðaÚR>|gym4iE?>ۇ_|GTTu7xO<^~ŋ# Æ JS|rx^̟?>PJVl`!44o&nݻ[ln p4%4hnR%9nC"99ϟG>}ql6p {ソgh׮֭[ٌXرcG!G+,lʴEr9bcc1sL4wSo< ݻǎx̛7ZJٜ61m!<  .T.X Ճ<_1}V /,x7SN\1tN9}~(`9k _Ko,N,JW-u>Q V)*Fذ'.V`Ղ/Kʠd.$!0ɝaV]tMy.{Bn8-xMJz{|ֺkJz/?Q׹9zn?z|G%b}\$A e I)ݻ3&$0ak̙3=<** QQQx1c vy^d 99s`ȑ'|aaa{~z4R84JÁ#F ((ZFll,z=_ ??IIIURRBd2K/7|3⚻ѡC Z0͗_QWW@CXUU?>)((_]ZUUE_W_}BLP(HK@d2A_R ݎF J)3矇$I{JNn 1pt[ޖu+((h'3Ll|NJV9qҦLRאڇU-WKPx+jpncIDPgsJ`ytMk'}xk[VB h2]6)Sasw!gjoAΝ?b= G|| 8GjIx߹[ m&"i$ؼǟ[0"2UԠDD3ƮOP!!`ee\YV- tO6\|[w*xꏔ!I<^mExg$k5 8'"3RB$IRW\}ɫ^w؁t>8!B)Gn]!n7y!24@ď3:[.s8X>;>vfȐQ ClL ~x<bP({/MԠ1Jfԩ3Fp޽ѻw ڜy橨] IDATٖ.]ZM){G8:&O믿uIM7$:t(d2Z-j$>>յx7k{=[Kk(,::Z裏jN'A`rgϺCBB1ƈhlj$Ir t:1o<̚5wk]dd$t: xeee6͜9 4sch4||W{J:͛74\őݻwC7kjjpB1::󂂂 W8ܹnL $9$Iػw/;p@o-b`|PF2 ~F>cRTWW>mh<ڽ!/(6`ӧO"H(rx N$!){ʕ+`Y.+g7|.K`/"K ].$sFP8f5VJ%\d5 xhVh~ !ZBh-آ[A*O9ճ/t_XH^ !11߶k׮or cn;R ƅ7Q8Ji&'wѻ X{16X>wvtt4|Hc`hJ0N&zW I#/h<\~|^Vf&YJPXX0s!eV}n:~Ƽ<Z $;;3!@N9P6&&1:rȗ*++g8k1ŭ:xSaaaۗ;w]O<=++#GOKJJ":t@Nо}{AoOMMr2͛7A]ǡ7l%t?APKR\\L~<<jg+:-$/r~xiBNZrrmD@PBJr$9BY51K($/,B\&7=Y(_2 ZJu30Q.]P\\|DT\(Juڵkw]7! iz1BTVV-^jBq!d J%NgqDDD{õL&CEE-[t:d2Y7Bȭ r\jׯ_vq1`\́L11Q)S${އDQ4GFF8pVUUA`04Z8!;crQ?ZA)8n  EQ4gf{ϾGvؘhB)t~~ \^Ο; ttObǎh(--yc^jq{<_l`@Eߣ$geԱQEAYS P:ѡ+Uq=ʞ~XvO()cB>vG߳o~r>@ IP]2ɻ BH!;vBQc$I@ @L&;e0. B ECJ)P嬨|Q,qmx$ r9 creUHtDQlHNAi3][\֘޴X׾},|(4Ї)c@ee5KktT̗J[S`J EXr\YWU]Wݴ4OQ[[JqQѽr7G ;Jy[O sQZl]2y̠W)˾s-L?Dת*˻aԎok5 S: ޝ}~M)ejo EUU?)\L.柜p7e%%#1|_ķz6ݗyt:rPƀvĭ[sssc.]:Nx<F QP[o}i:uM˹#W)1 ѕ3 Ikz-Cս޾{'{E+Q69}1]zkm%?r=jY q'ݻu}z4vR @mzF椔 PjnX L&Sc,16h4MHH8wY(B1x(H0P^Yl߹Zf}N0HR=hZIV\RJXT*z-WRQ>|sc lpf UU{n}#[t"U巀5b#X"S1|h Hp< lJ6%yWn~#j^O֭OxLJrHzI!)ƹ}LFF~/ak2I Vgl=72?2 9٤[֭yMS]9]hRq@$spAIYĻzUWU?S#RڱӥX/-xiAo|:l ?6yNW5ͫ L{otࡪ I4>#SB\Nv8XJollmNu&K>G{$vciYN)V]UwlȾeꪪEA]dGgZqRWW1V#>M(CZ, !D8<*J˖-qĉy &Id2Y\.?\@6Lqpɒ%B4 {>6gXP4O:gq^ɢoz$F)!eE\ cPkT\`BO?۲edJi:RrqWJ\FyIv}%IJ?pvLvT.4ܶā}> ~@uDXX{G{Ѷl{zF=`\.g ,b3c%w*PZ t1藐pSz XP@F93'xt:ùFRSSE k.{Yyy(QUUUKz^ڬkcސ`-> G)ɚՖ@tqh.Zl$rOa QA(cR]p:8l|ȍCF1Z=7& *_㍏ְGz eekiʸJ^RT(<׹N⏧큰`?;x6Dc@~w<*٣OgǓn/4Wd%\*BcOlЪ(.%:@"*sEyg4f|(7Dk5ZZ;G/e!8 #r9C.O\  tV,Y:$ȝcoݰq׉>Oz8:'ƨn2J+l߰ srĉ/WUUMKk׮]$³ˁ+V+-^$IZG<TiLj8vLW_URR2+ 50e|q}lXMёQTZ^m4Njrn$8v=ނCe͔\b'NƄ>N_+nz c}Q[l7o޼oׯFնo<*--qvZT* Dpp0(EEEvU"«vp-TDž0Pk{KRݦ2I "N3ot+wl pz0QUjwz9 'HXX2칹7[ֶ dQJUUi5*bk`㏙X;r=>PJ%¢2p<R8.DDD>rsG%{ؾWb4A&T>=UG(t⯮v5KTV=>ʬ[Jl.=Wʲ+c2sK22B&s8wt2kp#a/{UT^U}Mm]%` g@.*d.Of*(G!Ao~2Ц9>d/cM.B /8hZiɒ%l!uc~᝗IPCz999[nUV٧MF W/.%>&U0DUH^TK$Qz˝(nױ=["3s޸?z1Fsss%Iqp^Lii#[8~euuuhTLKKS>5?&&Fwܹ3s:QG7l q%דDKMJaIgyNlڪ'NfM)T*U+!QRN^^n>=#sBJ+n$.‹}G]a21Ɔ g/;@ Rsyy(-)JZs^3!]eޘMDR=̕jFBy&ewyoV ?; A4!ְn~#?f;ٽqdlL62)_C"c0ufV5 #XH|=vûUarEˑ\v^VƢO?# 5n B ;pcDdaS: Ǩ}V*r.Pʍ; 5]kӎrLVۣ: 9>ԻaO:䖡Khī+G{1qq8vW!PmúK%[Bz%1f KA)j4Vs}k䛯N2!+ C:e'C6+mY sgPs$-^󙉉NZrWZ<\.gfff&mڴif{lʕ (葪m7)OoJIwl9<,I w*n]_ݖu4 v clh,NHH]Ę9gi7TJռsyߛ&"(ij:tu6?E;R e!=0>mZN 7 /[A~e5/\)٫\ 's%000cpXYL~]ʿVb>Sk/ Q$Xc*lv̟5 ROcpy2CdXJ|!#1]ekٟ,QMeX=9Q9dsi\N{`4*U_ZGԪ+`+@t{_}jso[uP-jrPNA9dJO=8zL PB:|>Ar lS/.u!D҇_m UxƼm!lj˖-aX^ ui)SXކC\Ƙ,99 `Һuz</^|յZ&NHΞ= 5Kb.RhX:)HeiQku"!J )L.!!&$Xϓp x'!cT;s;UW'"oڴKst_}p˖-?Bǎ;اO/VDd2=29NrYwqqYccLP(RC<0`СCoߞ1vس0g-sCJJJd23 =#s!IC|,\5s pH(ޛ9${r'M&װ3 YA(p[8t>B)ըT3̚9cͺC(Ǜ6e_[Ӝ&>/APrʃ(Qxv^H2 _9yn1@*˺^GL`QB %0IiH _}jZI@t o3ߔnݒʊMS||w`5sQZsDOJju #!zxH(=->$k=G!">YEި.?iTH_=BrR,u;a^*2w+O A>h47 W~bo'WU eq^PZw.Ws[4y}`<;]h?x^(rvZI!kXحӜ)|(j-[8_͠?/La8F3Rꪫ˔_g'̙Sr!7Ǐ+I&<<|%$믿~ZV(ulk֬Y%ɩS^RoC2 IDATZ'2L7AxfŊ$I^ C~~l֬Yt:ݜPZZj...a4?tZ,z|uB^).Ќ8[HVg+o.apˋ0uDiUFq:HKKSfZ)rss&b Zd(RSS{<O2qpڮ]=z5{bf={ 7 KNNHId IkoRJ)![UJCj4W !Tiܘ9>{ҘL&c,1zN,h4VB d2I4d2 ZW1S͝c7nGEZd٣3495v)-">WU0[|z[я)+s25[Fnעڟzvr{($|UXڵZ&IHdD8XDEEվSgtKy E0h4c$IRbf7[%$$\* qj]!o H>8<;Qe)awc+ocը1bS+s5zZ3NӆGtq}Rba0RK6q2  ;~>/u p]E@ь̌HRPNH2޺Vh׸}K~\ۇ9|6t@Vi-Mc:V ڇGN'^ne2Ec.+NWC䥗wMoX=oK{ƒ[Mc';=ˈ\:r=w)$$I&)eǁ1|H(qرcJGV>P(N^-h*曓n7}a-=~xGRAEE_%Ij+}G8g}>Bȁxի=ޡ#A׳g#FQU*kNR* 'Hu=rd2~AJلط; !@Dh0z$'"7;~)PZ~y<VPQId$vnh4$wؑ{R!I|>_ ̗7vQJT(f+B"ymJH]8&+YzFsZnPW2o7wFFF(3Nx|] * @_JiZBB#*JiaBBQBH*!G$IQ^/:,xj:L'}KĸJ2*(4!7 s6]B 'ӂʴuA &`)ZgL[f>;> 8-i <&UefH>{zg3N>qTWl/fLB` >;p'>lI༨;IiSց.N >Nش? $!\ qY7OgƳs-sPnCPkֻۀ_&ٹO/)-DPj}|ʪW{cHJJ 1 ")--EFF?-[`ĉ;wV/2.!]x<\Kzmۆogϖ?o`MM֭ͯ ^Xx?v׿Cxml6ԩS5_|={O޹yvַeg !x|KOAA)הm<)ɝ;CpdA+Qp4'9()2ȿ`V+ 0ƘN0Ϙec_.=V~ը(.)qpVO>882$Q4-e~ףf6o HAAAI\p ~~~Q(?xƍRzv*2"~??O!n j$Q8SizFD3?~$(Ș!xRJ+c7BN SR cl(L&S`(?}4eB >㛬PjE @p9JjEl?Ż^7g†ih;7@b S8%# &bwDDŽY*Dexk l|.z^*Wȕ'GPT,D:ὡGm[ԃX0vnޘ;ǢToq| !4"`?y'^bxj ={hrHSW>rЋ۬g|ç΃목E^U5$-T??5¢ ݣ#' 9*jHB\8/ܟzY3uO'HW g&AR###GFF8?~7o&K.Nꫯʛ];88딟SNĀnٲ$׬Y;w22}>b۶m<ϷI>3gHgϞi/cȑ)gY̠viFa)]:OZ)B!ZZsP)j%}i $UT6k\)_q.ݻwg"R!<<QQQp\y1^gp5R1,QIcAj(NkSiYa5 O֨Դ*8Sk)FIL1vGоAt8G}ڠ:}tq"LȂ tڼ #Q[mP#Q_Y*ѱpyѹQߔq|LQ+2詈r|atPX˫Pm.AE@b]ظ'.(ίAbg ̀ ᪟ M{kbj5v'Ҫ!%?<v6~w+ 7?}a!qR-1U!>& B6o=4oM#2Ͽqٰ^3m^  owxc ߿?d2ZDEgΜAII z=Ξ=KT*4۷/UR(bk+틬,B#;;(J`o&O|AHPP IR58נA/ vb"""nޛ ӯz%b!|8s*V?rCy04z6 $H "4(%8QTR J/j/\5:ԩSڵk0 PT0(++L&JN :![$p+!d,BckAR˩a j1`;!$dI6nG{Zݸ1V%v6 R\M1vKs  (Lr)n}IG‚ߘΥ i> akf!$Il(4r8ec]!?]d"$lFe4U(ˤc좲is(P(!a܊8 u2ćw]iA`-\=Gڐ{PXZz?;Nl?;`)[U(Q5j4 I>c!X%ƂQĆ U,mwa:3˽|,.}C~v}9syy_pa<(zyڛCz(!5,u޸#EDQі78j- "l&aÒ,!hnZD6ڐWZ3Zv4QOgc"$YBxGj8gҥZ]n>_pdԤR* w``0aoḛrIݵwލo(TT J)ꌴԳN-u;DI}rP*:?omk_@o`TՅ$$$@ /6g( H_u4˲)* `<ןE%| MM23)˲'އɲLMuU2 sk~^N}_ھ| Z}[0,s:])U,iq1ׯ߸ Qua۩XUja ---PSSc'$hfh*\MiIOOrRJOO~Ol#! 0kwDP GP+5 rը޽5N\;~0XZ0lԪ(45#XR^WUAX+WYk,װ8eXWhY;z8y#r dt=Rd*CR"3-Vq >DN'PWW ˲$RJԩSDQdT ' 0KM-` ahQɔRgϞ˲0`@Š+nFer#nGKa,zk6r{RSFe444qܸܜa _P^^,v=_ 6&7i糵a*IRR -ÔiRH)UT,˞T$x< n,FE Zm"@(/9EEyKL14YlJX>)B8ݳ C3@uu.;ZdhY)VN"0YzSڊkZ>#r"73  s0؈Ukv}8F=f_5[8TY{߲nnvdks/G珠b$yq˹ WbdDh=Gp`w}f8{(ňawWQ5DQ"ƨ>_뜹V|8_X{wĀ( ow}7|6\NLpkk+ `0YA!K. ,]sQQQݻ<ς'|D]ھBXcXFeggSQ$I Ҵ`/4;>tЬ(ve@=gnSdEqZ^c՚.bsWWy ߿f߾}mii9D) &&&f.\۷o_p8ޠ(~XLi԰W9,^:ohLUAJr" >[ w,BF)$>ƈ> WIIABχh99h IDATr<σyaԨQp';`Ws!=?ԻL8ѳaÆ[[[%$$!C-k֬)+dYf'^*Bt[rr2R²;InnvWQq$;䦥$SazRJf?r쬋W2,ޚ{5aXۥFyr k{mmvJ 0̾)>B0L;k_"n`R8QxqnAEDC€1,Ң8d 8e~p3#+I cݗ@ˤ˾i=2=O[HS!oxJ{}{I}vڼlJkG Ϟ{ GN Yx̜1ѐdA &Z w_Ug5]v(AP{| z F \^Ǐ8-0&? "+p, *Pc ǁѨq8nm4`YWzh']Nwnc7,EH_ Z;ht/i1̳n xAő nop?W{_2FQT܊h]]^Dj HDJcTTҕ8/7XWB5‰i7 +0S*'po:zhOU|RH)' WZyE FFFɲ0=Zr5R$''SOp+zŧ{fٞ^{ퟢ(N۱c:>>D }8p@]RR+>;kΝ@lņ ͝0 ihh8^VV:tű/F A@IaEC>Lg Q Dm] LǑ㰹 2dYF њ f5k֬oIIIFFLvT3fh2dȐ-//O?#(~:dj[GF [$X:;kYя 1/*:z2(Le˱Ie}XՄ?gtrh=H)m2 !3VJi t0!at $I?`{{].ׇ $Cff&.`Gst9(ƌV=)EMUV#9#XHȨ*!b% ,RxA'[5{?~\! sġv#Of`vaG+ %ͥiEV7Ŝ<_}S !.* UAsƾ|.yy#ܦ wCmS NջmQDG@%krZ1ԣj-sX Z8fj@\F=/=,?q '>0b79y(Zu:xU-mj= &j ZO#J/w[ 2@iwI JF[ZkFAXe,\5MgCV`0Œ_E Q*Kz꩏z ^ ]v߿n:;P(EsO^Tt=O2ʰںժ9ZL45] *T 5x˳R$IVI}X@(qg8p}٦M544L'L:Y]U:ydmNNNPP,(//kRRBBqdIsss(W~ B%??hQնW3k$6Ʋpʅe !$F_yБUj5P r~^ v{XřgddԙL&!$W!"F(1a,۞J j}IA%YGb\$JiUU q8]>@@tHOǰ`UUܙ=A$S9ƑJ8pLȡ(Q RDTBϒU/"c#xgwм^!⚟c4֛D֏[;S?" ϯ/n3*x~Y &JeB2Eiu;=p  $IaBy @b08m?T~b~1z5ӉCP^oUu'X0Է[;DY?r{kÆj $i!), 0QR2cRV:eZFX!ΨEj1:" BiJv9M^|]/L1#ՆF(̠?AR0"{_Onx˾f(2QLg}6!̢P_~Yٹ`ʕt%Kt`QAk֬8tIRj~}464Wyvs< 6{2 預c͹ȸT7)(Á8[ A7He%NG^322䬬7nzСW%$$bccx$klls[np1hlaA~nEqQ]Gacc1))@sK+&f[y|T/@ O$(XWT! <^{QJU񄐝.33X1XJ)O B*222ϳ۔T*uuu<ߝbr|8fHI|5  RB(?r0 ie{W|nj,Q9F BeT*Sy" zzK),0q y4DX\2d hQTFwZJ²^o[2{ ~<^]I?.R *!LF{X%4`&J& zOBmBb1TjUK}rjLu5<*gpi%M.GEVr`q呻gdYREQs*hcqK['wh%ƨ(<^ʦv/('jM^zCsݶ#}c2A* u]Zϲl@qDPTtZ,Od#4J Vg~?:SLRJ$;w:c,=:㺱 歇P$Yq19P buӠEc#0uR6v瘟39.%&&Z`.G#=NRR Sn42,뫮k{zaH[%.DRةhnd&S:{[+߸cr1**jk;avnY-diJ_мEGUcհ9< M?i6fHA/6[2L 15r<`0HJ0 Q$=s壏.0zpL5y駟{W =|>Vl˖-R˲ #;93<>tGJ Q ?Х"Xji)?ntrUUU$,˦gee_ϴ8jGƥWηXl?F;x jﲓ@Psͷv6uJrnn(T$466b 6\?}zWou7k&N=l(((Bjku_*aU+!وІ\2ji1c@FTʇ{7kA'Iҝ%D`AHLN45 f3>MgdB>MU_dB ws&vg꾕.O=i2I^JA}&&X0I|cn`fwG՚R O(~R̉LۻDQ s<&CwT-!̀;AVo.O"pl Y ݼ#""=;), Ha9S:!D^b~(~ JW,~t;pPJv{˟GHGdgZk5cO[[-WP+ĴAi?pFlj BpRӮEEƌG |4Q,$`0(eF$u xDV `).ѣFGFiEQ*e zR!<ϑG3@,1F I䔱 PhMEiR)I\Bb64gۦn(hԊ2Vy!l?W䔔L5Gv"ر#ܴ_D_ܞ1i)-^46,\?R1R+xU[~+VNx<?16!SENw՝ n#~]wmSSbѸr_ދ>`$I~%_J񩽲=RVe/0ńGdɒapgX*mScR@L>7 %vXKgnf/՜NIFFj477+ ֥kv@$RTKeYfeY =Ljz,˂,ˑ@8 ФV??':? SN@4554n8{[nEӟ7m4~2gڛ5 ꥴ !H^X4-":x=d F8\NDD0(3$P;7Lj> *ʈ*%>~?ZZZ|E_q ŋ f!œf񠡗@ B0y"EPT￷'"#WBR%r1O|_] ZLHd;=L0%SNK8=7` 2 6LXY d6_݄6, Ǐ9&8PxJ0 00= 22THLKBncT0rtLk&_BvR_j$%%G2cxAvF1FÆ EC}cK"^}nys{:sJtݔ؁nf{=iG>\M_UwúA vos_.n;Hzӟp2 =80;ֵL˲iدv81""b*˲;*0ekת+++S^~\?[LP 7_JLL4y睎 ~Aqݡ>R\p,kFU8^l@)IisBq>TuX]uV%\mHhhΛ|q=NrFWyQP*O5*5(oܑԃL?ș > àCEpQ֨0q|(-NJal6#k@bg N;V@T$ !h7[pU@xQ_p"4HJJFiex=X:Q B@Jr"\Oxu; P :AC/߷p8s !rplԨMAElIJ4I8s[N7\7j[褉_;`SJ+fZ_ u̟3pb0-V|~BgkGCO @:qI j}pi߻IXoHʺ8mR ߞ7/_I4pllBxrv0k]{់x,yEOJi|n{K/:!dywoM鱋Ru3 yh)Vd:2Tr+7O4xPUZB ~gQ318f*^oo àD_N6E$=[UR)ܬR*1R)%f/y%z걒$PJYa\<"|e9/4Ԍ\>΋p{Q49XVŀR K iiZ*8aNjnmErB<(e(!r z h8z\nATW B@T--1# @VImuwSIZmڭv<I,;{s{~ ȡ=/Uw183g}r۝iUD)+f"=sSH3V+Kw: !z衍R,y7+!䑏?>e˖5| gAձ`9E7/=(" u],PEeM Fd0z!Et>_Xa`9v{hx8 OW H dLLRSSՉg9:Ijiiyd2bժUϳ,RY۾ݡE5_{}M7_ʾb*, niS(*ƌlٲ . eX;mhllRD\|,K0h hiaCJr2:hjjÂֶ6wtau"*ڈe CjEyYA`2x pFj۶IPQQ}VB AJJʉȗtZ-ÃAO&CttZZDz8a45֓Gm۶|'8tP[S6555j8X:"))IHKM;wjybc`N E! RucGk!njFӯ~&ϲlYwY|/xӬiU-ۏ3}74s# HO9gwϑ^!;^S{qivR$a$/\iӹ㸒Ͼ;^ r/PRRR2l+N%Kh{/7OK羌OjrLVgfA5B( K.ZF BG27Z#n^ vt9<[nԴ]+~KR6xIU!:hqq댌I @. FCj58p IKK޷o߇+VubD_jrnKϫ׬ZhZ}`07B F a ":Xn#dYFAA(p8Z _FeT F cq,$InUkiu缓c= jԈEA!Iׇv8 (D1h#bcb`@8.44c}e1OdÌ hIl\,?KIA~mhh&6n<74߮T*SǍE$z=$111dQرcx@ $z) p_xz;'na&JkbZX-NLce< V0b, ^7ջ1?\qﲵ+f蹱{zyras܅k=q [,+kl !!C̺;@RE! 򹹹X߷p͝;+###1fYJKKǔR~o/-"Fw?5 BHLy7c´#[`# qxjJ`5-x-Y^/2{`C?B2SS(,0d2=quAAAhSvJfzBz1x` 0aݻ_h֬Ye=ZC N9rxכyuSg9m#446V^4p9+W2cޭ @ Q0qjvF?@GXLz qbcbpw`۶@Nz:t0~qصk/aqHJJF((Nhnn%e >zLC#ji!vl8 tr܁( @CcA]X$k EYFMXaϷgMWbM5M1HIN}Ǹ!K 3q1ƿ-fIVϝ1/VxomE%5 ݂n ?xϋO?} t)v̉7 `ɺ0Jzpi#7|S (0[\0p{wwź֯_>xdY?G=Vcp:K/_L#wy?Jrss M(_'ryR8QʘG}tN{<..n755m0L_ܽ{wCJ{1)}cSVsO\Zj1z[k'L۟큚݋!Mb/݌0psZ܁JZ>2,_qFZZq,B('&_tl0F&$$u2J&W~-&HpP3V7}׌&1udd`¸ NBp 8. -8PDEM[&V a!04d4#9< nF 0 {+Eans'jÈ ~54niZ6ǍeU5$ZNE/^?ۥC& +AS_/oԒ@Bul^ey_ (qNg[vySr[Rl.II 6xpZ/CBC&$cY^QYDmmw}wǵ"мApW;|ذ'Ƶ)wXEe㵵?GA^-ZToa6_0 9~+{nnX\\?z̠PS%Iz̙3ܹs9r;y觟~k60 |vƈE7 ~J# Հ88.LHu;tVRg2-+1Q 1cPwNacǬ[5 h̿WJt<c .`o߾WBj%%%%>|8' @PPxr@ь b٨N#ΝĉI`` N޶mO!i{Ah5o͸7jzn9h箽}ij*IRsA[PhڗVbxbܱ 6ƏED(JHz9 FhH O>Ett,??PeeecǮ= B@IiNnƏ-["#<&N ,y<}.\3FHgw਑?^Ԕ?~~4(2/|)/j~3vHz.?9W"J"Ja;WQ#C$^CDT.{TW %0 ЅmM3)91pqg#fU@k1f`MǮ_/ wtJ)ps|SK{ݦ#yϷAۭ҃ѕ>ಽ2_nxzPdhhsK.U+XE0 @AFFFJzh4׬YB=X[op0O>dH\\\xG?>YRߍ7/?+W$IRs RW!$RzK7}Gk&O)f9s={vZ~f`fCȳ>[W_d\ՍߗUzx.ۖADd(3qѸq FCLIؕQ}.YPZYُ,7%::z#p/Ƚc6(gEN8lS$//|28FL0!HVŋiBȱ"͆2ő>ɠeN5+4n\xM |T) znKY~{b= ~߳wZސthH7Sn;" OUp '?ppg9r4}ðU2sV^Qa6[/ ˲r t'k^kX1a;(z|@Qb̘ؼe;vDA$QJĂys[ꐚ:ǁRLÉBص{ 9rxWfCvUXJ;\7]*3q6zd 7s=F\W؊p"4cҰ8쬼?L#D ;N]axHSpO:Q\j_$< . <<UU5xPWW%HtaؐOcpj\pX,;`;v?q|!pݰ쨪)h5ƍ]<#IFDZRZZޞ2c=J2%A s-G[$6>66֟$DLFL.iN:Ok k""45Qj1G[<5x^8 wc MБH|_S;HWK2]P^)#R`II jjj@'Ñ#G0a(++#'N ^}Ʉ^792<<|z%%% IDAT!QQQ8vƏ\nyy98q"MIIQ_˗*wܸq+n{ݻ93XsQ ɯj?5kн{N>sl #)I<ϧZ4-ş"}1h@ x Ny^QJ| ._?`4d6Ϸ'Muvc0gY¯CV@e^]S:^ #M'P^`2-j󔺾`>ڦ-T<|Ai_ %́$ܔR `ܸqP(0EcǎENN*++\ViTTT‘#GE*2 C JKK1vrA1cpUTUU!$$׮]#*7/X|y5I6^S幓&MJ`KgOƍ}A ,,,b>A ԣAMA6y>۲z5uMF:bt[xz˲eĻ`UrQcu'K,!o1g_X,:.qƒ`X<$]μ۶8|ؐƦK }SG366fEHHp$CDDhb߾ 1Wǚ=W.uBkĎru:$EƢnw\&cSHpȩGOq™\Q;Z-`@ӳPBӢQWd7B8q,Dtl4 ZoEՈAdd$bccPUUJ`yFLL BCQZZx@s|.S w=9g?` yD_) h;β r%v;Gx^kQg.AµbIKåF'f EQֿP7ϷiZ hKSzi8ύ⚯mw%2Rn/|R"Z|A@zzzR#77III(**0(8}4̙Qp8pV&''ڵkHLLDII dI|h40BT*VBSJgTUU5OjhfB("#<[ DC]σJgzfZY 8st:E)MbfNTd9o6R)k1RzeR__RT&755M8nMvvf^hD'e:=ZPonm~~=ȃ@T/Tqy?BBk5@ql\@KHN4\hN'ߴy&II ZRƍo8U |s7Q$q:++fӺ:389aXt:P(<\.W3׫vC$LflvvtZtPjڠѨ`r A-WBS~~~yV :COKO]>CX&2m`_V-R+0 \2CR⩋gH3h8TlyD ur,B[oF[B5B9I[ڱ_hz9?C6|ޝ{O҃kB\/I=Etn=XYv`/E!:Vm/ t_6{x}7&, 5 nR466yhZ!-- /_Frr28q"9|pf5˲pٳ1bAhUNCYYRSS$8N:~xr9sTncc#0LvHuLLL瓝N'fsEg RSSE Bq* ZXXh4ܮG;ya(-G%< aXlNl-DQ AEUXu* IC,OfsEMMM[oX5c)3)OTUـe4(dgg#55|VARTTb:E.KWRh?CUho]gZv b}mkuך j٩jzuɶuFuu59g6ljkk|Ǔ)))ɓ'sm6sWnKSy~G}}T*E2yCCCsn7>1p`ɓ.?|e-aFӿ{eggWVVFKLLLBHHȪu֭رcM&SYR6r&00pDA)uvX EEU0,ff$ A7(~j]b(ya^OHHO ˲@tApܭ ̄ l{HL.\@SX-bd:F"p644RW^%,˾]݊-^4c۶(/xvO>xyZ}t`сo&_ߩ~Q׀ T*)恋`@aa1 zH?~J$ caA%@遼[دo󻲲 J H$&&"#,+@ 1e(-+Gmm-$p]y%kj>Fb HڵG_M ,(nG;Ě]Sb ;yRWZhA8Vz_wz[vZ͗ly٧hp<F]סhs=[F[<^@tЉ'WZބԕjR t(//<ǫWEQ[ozw2SJ 6l8ռ<2nܸfIV]Yj^{-t_o+4 xBUJ~PEpj`L&͝;7*!ĤP(F&3NZw.U@65J{ܹ, " )T1n$TW]ō\]vpō+ \.g:I'bƍ{w _ ndm$fϞ=/ Ӫj 8?0 m j5MII!.]n7>|8@HmmmΒ%Kk D΅{-O(\iZfLټo {aϞ`9 BÛ/eXv*铀kyȹ JP<#T*tӫa9 Ձ\|?Z&OJ#YW!bP\RXz~0v(TTT;f4 P^^`CQCף zIun HT9mHRүȢw;o/_ d9_j(G.iUozw/fwz̞Er|wjn a֡'^w Y x$:Oʃ)^{] v]Fm šw #pp}ݺu5o2*RJ.\vK7Gxx8V}r׮][RJl~Bn… J˒$1-eY\WWwu…y_|Yܵkצ .s:zx/B;%uao>JFqkG(ݴ(EQu6P h|%<v>AFF$rWPQ$NJiE%ӷ]d̘1O?g>3aRVVngfffh-_nll@)Eyi* 6:P& F'*+0C@J)$э3f BFI "";tV8A܂{wڵ>N& =8NX,taذa]@rss555,_\$r`Gjkv-tڿd;w֨o+ۚ!Ni)y2$I(Jp\`Y(@p $ [pvrAcDQ( KW7>ׯ[JΞ=~Jtl4 oR"::J%TJ B$h4jm6HTb aYaw!I!!EV% {)ep oȼW|=Ƨ9;s'˳ʋ^J9e=p &*p),?uv9]K߹3za[+#2*RPQDHP6XcF*BȲ,{^`Z_޳g]` C.wȑZy p6\4Jq͚5Y'?\pرc/eϦV Vihh2efyX Ŋ93ga̸Z`Y7ؼ < N1L^lXVF2 $\~!IIRJ]++{ls퉸zi[/RHz%$ A0 $\JJʻ%v֫x;Ro-[hdbZ@ /?쳧\.RfRtر#!333]XFsvڵ+> k,a& @j-KCppquZXQhj5"Q@ Bo> \bL5l4g!1Q<|$!!AJNNd߾}333ʺ/22RBf 㸷,YRNx|m}lU_̸o+Jv;"#1jp:F!j/(BP` V  Mj4mPrHрBBb~8{ƌp^9I3>ѧO<y"1bP!**0(-@`?oԃy`Bpv!$$E:8 (-+Mk틝_:+#/L48f҄dӎo'455i{: ]{"(@#HUW<fEffB[+3Z- rݢ葮GC1(++C`P(tȐ!*voۼǏ]1AV Znf=y:L4<j=q?!"WUU~ϝ; QRcڵ?nlld~;vp%ffeUy @+a7/l\jUP&pmXqJ5l6qñ_e8몭5%%%C ` !a -c IDAT[vŻ2nD#}F]@q,ˀeYVv% @< aYD gCr p8QH^BINKq=& b@<p\ Z;$E)ݰ/@aQ O~^F`}WoΛ4ę" j?jωƮcYVO M@|gIlWyO\=uMOc=O!Eu[+ sGom-bCD蝶wEZtpTRo 0hjjf<Ͷ̙3_~6J$e Yvo9󲲲Y} @`` &fyWYYY&!rp}/~K/1AAA?hQk (Y8D nTp]`Dz$ώal-Pk{zS]Ǻ**`ٷCB|_iݰriB)/mF)^GP`22ÑɄ&845PZV% }08-UPiiy9.f^B~ȹ ˅B( _R_yv nL<PXPVc' I8Qw=_qK XPҲ{ TUV@cƌ`Q =}=f?8oY<ԝsjkj߬=4އ+9Ť._b”|݃*OcR7꒢L=ްֻ="8xnQ? 6#+>tʕ+)..~7'i7o>RZZOp83{T*t:݇,~94R^!8!8q ŎFXN T&Gd:>B#pB%ju&Q>%77@gϞAi3gI@XF c C!1}=+ϹgSRAR2lڲ [W_B3fNR@cSr`YIۣό? BJH%F€Qq\t9#88hO>q+O[83$%I@m]#άG|;v6}|_ qF4~ RtY$IG,ˊG EW@)!D|ꩧB$5 È$1a$_7SO=u `JB=`&4FmH5 pHΕXe9eJ)(e !n5܂CYu, Zwʵj=uoؾg (FFqcƠ .(! t $%8TTVuM7f4* H&0 a֨0&iXCIi)ΟЬYدOX#,@Tąܢ“# u8ZWWFr,#P&r4j_o\7 G<[[{S^&֦z\%:^vh4k9O=r=ƛB !WerWx:3p# f\|=aK 1eMUS'6X)@<?rފ2_ƒuTwޣ^CIoDAz@(`&r_OFQ#JނH)r;Hz uΕOWݱ~see T;[9 N=]<J191Yzqݟ_= G)uo ,?d 7AK^ߢED5t, ĺE y+Vo`y9q6L3Zg3g_&{Kٮ]QœgRHIFH1`&VQFR*E0f! a$@$Ð*0(h- 4RaL0+JyJI}$_ByB8JJRBhry53J"(!DD`y7زc4$*Iɔ0Osr Uq+sgXj!m~O:r}FDNc;u/{=XT8Nb>ǃQ._C) h(Bnǃ.7& lnyb*j |RmPx;]0BJD.u!>B !emdķiV1 !ABcנ>+L_#g{,]t|ZZG"==hkPfX~=ۇV׭[ .ߴikwd5۔)S0m49996mߡr_G{OgIqLC>l,u&OB7vܸ]vu ٿ942RjS- z!V~ǃq8yܝ VHխf ϖ P|P"_'}Ϻ6Z}\.'DADumpAWcQ[ws둌,n#zj T `y}@zz:^xx?^+S7m4Xs /tw5]IO=YAwʺXեRJ|w>B$JU^>-oM C؀`js/eΝ @X0M=uZ7It˜3sCG8x s/PJ |,t!d-P>&RJBBQJ7BNB)]KPC) "!$R:aKrgG I%{m%o֛E}C|Nvʂ'K..QJdK[v2Y+WV;zZ&!WXWrX41|~4{-OEZt͚5d͚57)(u֑kvϳu1PZz5V^}'}]W-e)bYV|w&L# q7eo%IbUR,+ڵKs7xiLx/y;󗨨Gy.@_XbUvA]j03e;s ۪#fzէC~>eeŰu߱m oTXeVL2ZJ>zƽӔ6\Y+S(͖ |&-AVBe/U e1R+SbFH8<6eFHB|Ji"!8d kPJ%_ #Zz^&x~Iryhnk1e@ڀ9׫Q_n+2D+ѹ<2wsVn{ i㧳ժAkCOFC420L  N%{7p>^ [`A_RhJg"GXjs?RZtRڨT*Kr(N3L "t+J H6ly…_P$(*Rywƚg" 8R@hXM7HѠ`}}hdĽ0,2?^4OI-+]h1/>t#66iT )ڼTjŃ+]?s`ݳ>.5e'{_#3Du:ݦ۶-[[xR!T2@D^8  (R?xl$IRe6a|V^d"ɫ<r7# &ΊȀJA R:WMyh2l7 ߮G&ZhަZ*`9]}{(AzKև"ˎvLBN֯_G!ԧOV'l+FBO>p8O-+Vx^J?4p@3;Ps,SūRa7[G# 0aB O`rK7((Cq l4""|%DZh޴Vm6*yfLtxvݶ-?'^$ɏ_k-?p'AVoHJ7λU6))1b~gg=Ҟ)Ʉbe &(Ji !$R/Si^:DL%YY/<H)U%) ~|/OHF,\1\^-J)ߖ!TQJC s' io8rԡiD[$ f%/~txtdS48(H`Ů.-؛$M`+{-х-EnwGK, kkfs]߿Gyn+yөT*W\}f7^~?4창[,sa BlDbQQ^}@VjUXP`p, .R &44Y[l΋$,(g8Z  o=v໢BӁy8N0u}'_Qt5N]{ץ<-Z:dji! E!VJi)!Q~rέ ;2AL nPJ%I)}!U(L=^+xX^ lT <F/o FTAK>}hMM-Uk4x w?GM g\pÀe2}!" NCOf+QWlU/&!f:\ c'_l;4)_'_l{LM1B"$@uW[fY1ZH6_<ݦk,IP'߱Èw4bb?90e0ث\^2+ۊ1P {.xw[K`!2hƥU<($IX UgA0 fvz_[+ 8?Fe~ɳ0::F_svXSv<nH;߲,g1 &oN5k_lG7{ܮ¢fqkYG_%v޽D&wvF}~˯:cڮV0X\FDQD 0s VJg5 v.5=@3PHD]^uJT"vf.Wz,R?" זɃʃW&ZbTIDFf `3_V TਭVljbv T.j~(#C|8)Ͽ<7wFb}܂rneĔ p*$ht(2"xUkANȂ/q@̖emFk\̳eB7ZUV\0)!Ȩ>qqЉ"@3"ҥGξ˃-\ZX-"$tE#,$4t߸/]z7"##?L$}y͞=+VԼTQQ(Jyyv8((9zʔ)A<qꚚ6ma'Z]U`2C!D4H U\& >ّT"^y^SS X2@e,y?;m!nTfWM2JCU TjxQhEf5c( "#Q[cmPmo>u CL ʒ{I9"GMk̜_Xي& ZciYq ^0lJpQ ĸ@ŭ`9fEҚP*Δ3fLzv(`f2 Q!%%edzjѢEcm5U{7߼t =XdlllMMM`2V\\\+}w[`A(z0wn^x3O}սKxR%t—kO4=*vd@{!p[@`sj>Z w W< VkG׳ռtH߉ڡ&S2g%IZP . "twƄ ЫW/"77&NC I믿>I-Ri rnҥ DQDnݺa޽?~|yyy4qD{}ضm&Suֹmot\.To}ϞD _#qP,pnjz,$IV$-ԩk]}>5qhIf3UZ 3dgc8y= ٻ@:TTT… 7nz= 2ƎSNҥKę3gl6snv-MBeL&***pE;~\I0f>}DFFL&ӧOܧ~z=j.)REEEp$L0O׮]Gͤ#3ƪ򽓫z>DSKl "#2,e=/`ra3VS' ǟo3`Љ\RUŢu:s$ 2zX?<dY zQ(",<+,?oˮQٽgtND8{\hEE2oL&zVrWenzMS-۾8{{H篙gǭ3]j}UT7IoQėQwf#͑×T|ySZ&K{:`(@Q4mOv?H% BQXh4s 4L2P$&8XA)o߾5o( pz'ipUT}Ѫo z39s&$Io][[[q999PS-qAvmeNo0~… t^pʲ\ED0 A=٤yС.]l<:=@uOE~OEft 9l]QVW3=cr)<9KeNgݳ ,HIId~Y[^. EQ˪(voÒs_W޹kQW"'Y,fj( rDpJ#eܵ[nhk1k홟8pXtTԼ!I?yoh~VeDbEbB L06;x[Dk'k|_1MoiʅN ͵Ql~X :o4S}I r n@e_'@&,uA . Ӏ[I \\Q9f1VGhݩVVT))L_cku]UM8\̆^|9op\QQFQ^^Պ\$$$0`N'O8vڕp8JCȑ#}Ql6bȐ!8qǏ]v[^^!l6[Q{ߏ=fsBMMM~sinEq $3 `h#;7sCi (,! `2ryг{4|-$$ p@odeet`y=}ooaSP۠9 sZm:QQvLFln5c}px1r#p,aIju"vw Cg ܵ1M+{CIIKoµo_V-Z8͌\;QYNZ/mhP&5\H Y^gCTVV"22$A >>Xv-y :,(}v)''UV+U77t:7FBB֭[{IIIq=%%%snV2yA %z׽[`q1ekxxÆ MMMueggm=s5ѣ555b}@ w0!Y 0 + 2ꟻ$1z]B⤞=ʗ/_-IRW~رN8v>bxҫz6;gmظe# ɗ{LF}fJ~&KpppoZ" SڤBכ`-KD |L?MDGx(~ 1<+˪94J7>`g[4S( @7fo?RϕކR"m @s>޸Dž[&?#ğTdo܏ {jM[] THxBԜAΫ0[PT4[MDᵋ(ff7 zOBCD4@R~7[c @"hiK8&t֫ZOHw#uN@Bnc))Cߌg>ixݶ˷#+0 p Wˍ\Lx}M "~^7 @g?oĒ_?)w6:̩   I ٓFve0uSsw/wwg˃OΙ>^qؼ Uy#)-g>VVimZ( Q0O\sr-߽}=GΛ>|I/%} m Zڣe 1f;hE՞F~T :7+K6Fl0nPPPG, l6taCaʔ)}=?節-Ђɤ3͆O?4v{6k,ʕ+GgpYQ`2;iҤعzE)Eo^3226Pz ,('khҔ={~O^.((w8G9RӖ}L<yyy%#F^pa93 yM~wtz _}* +aZvr !IP|*bٲevgX?pȲlԊ@U z },B{Kqq}N4f1'KKo~{;G\|12*r»}G_.ÛxDle"R+'WK*mdbT+AjT5̬Q8%xbfbqp 9<(EeHl HiYbŕw5 Yqu:U^ID!~T/s$G&ՀKGl`'"u}븪ɧ1mH;vFeu=xSe]/յJ.~N\{M=5Dʅ 4m,؀jRwÁes8 "!'N0bnIGAh1(N83HE%Kٺu+9kEGF©g"~`ǍwQA܂ (ɴjѢE/ZHh/(5}ENIA{Y KH0 /TTo-4y.ù\H;Adfyxiii|;`PUU@Kk)YYam;=MRbB"BVVVeyy{WّaY;wdĈM5oΞbT)@@N2jyujrzE>Wo`K*PQee"ɚfɤiÚv8얦 mc(>6 ~=Z5qLݴf,8>a{;2u1"w=磍{[u;8|{M$x]sO_&X%h_?#. [D˅-We6) 6;1Ca,BhXBBCt֍H8..bja9}mŊ!eeeϮs8`v؂ݛt(++þ}r`X-^x:oӜ¢ER/_(&]T۞!,K0u؛ WXFkFZ*b?ڞ~ Cz ljh TK.?-nA1Gڑԧ"l1yA8pޔܖ}qp~v׫6ewr ɅMm ~WeV_Fra돯zd{[ X[=zDnn.6lx<Đ(.ޜs1n^ze˖U;KJp7hx$'' ::Eⴴ4:s DQM&ŋ/,//ï-[LJNN6ݻqI |;( ٨G5VXAϘC+Çpzth2?/^IDC̞wά2[x.,,_n)WͣRs1z1D$ch=CTʃW|vix zT]yK'AΆԿ˅~yS7>7v.?iLԿY거QjcKQ'qsEe-̳IjS*<;nj$iktlj˅{тDuM5=ա~`c\'5sdA_zϙ3gM&S=-IPYYYo[,:tfM.|dYgϒ^oj-^7oa1",,#""(%%0Qii)13L&7:W^yek!<J |lӉw2: 8}PUF'ꌀ1}.g_{ƌdWuN[ӓ73XJDYo%DTP}LPj>*,e2u?Q\6ݗ@6bi YiUwX ~ek`8O *``<ޭ|75Fl+ XQ`0pEU%4hF.LA;r\oU&;\,x׹1lӸj7 Y㏟&"Eez(u ^_jU<<}s03M!ąjj3Uu8S'/9SrXܒX"L+\1ȢgQ&kP*O'PADD:f z$ogV BkFU^=?f7b=OGG&:$5.^DII%<2]3d j#$b Qjn,eUYbh *~5LI_`5%t M?ΎYZAYKCξ׵^>|_B͓Zv_cM VgŸm2J>' =~cW  " 0ShϛjE?5c#?RAMX׫LB(H tSK2/b(sa8gU,yYe҉a6xΔ VK1.x ө/AӎZ<_m`E__oy_ j1Y_B@G$ ͆y};?n!rVO('"DdV+୮PI*QG|+T"*ebu>(PM֮AGQD4@ 46 >p&1ifVԿ Z֭Stw1=e O gT&w[xuێ깾/v踾ދbg\p8|EIpg-%$d2$z^!@q8ZKd:? #"=3ۘYPAZF*]TQ"2[- W`"nS oAKրBD4-MA &J&d"Wbn_ DM%#5Ƈ[J|z7:]F=*jcv o.g}ø%}Xrh:rE(rG!rBk#{11123N7pwn:Q=#2m}ܿ䥲.]D]|%`uZ gDTv"З%Dx|6 kP}~DT̟›:W~ 4i_.H;iA&@M}]yJ?(bf h]y MʠNX:6nZ٫{& ߃Ke$B&KEiv}`Anv|* {+-Uo/Ѹ7MƪW= @}~ Ҥ(n-IR>u:|(("(_|ٳ=WXris@Fch?ݺuyw~-NZFq+X& [{kkAnjۡQ]] 訓eyjuu 43 ʕ+=z$ݩ( z}`8+ fYSS?._/Dש:|6(#zG#)6+Q)v(SF gUUWzt܂00f|;mĪ?AI%U%O>ti;VgG3(V8i3DD<|BQXxeDEAV ̜ADWV/⢶LYR |k>@omd^>FӾ9p1eb/7 w|s>u*/) E;8b{ܩա'2Ne׊Ch( 02H ۔tvSpYq=WZVAnjۡ!INU{]Heڵ$饰0Osnf)K,Y\QQXQbj^EP^^jY[[3_qҥBCCYu?,<\ rϦcuú÷2lYi }po/>N@We8ӸXm+UV  !\i`'#Gz'7ɲ\x !i;w1rpt=[nݤ1axDkP/NQwx%ÉqdEY㉨1sE j,@$fሏ~,P@jA4?~UU"aP+Ȋ2> o?p,$μc'rNFDM}%%$u۾uxдom_{ͣRl6lS{X98Tw-Qhl 4y %>wq;rJLLt7c+Ścxl6ey{}O>]D[</N}QC=jU7pP8OZ&d:QgdP2Dx$u{˸P%fgcDGitE `\W;ml4WUrDnHEyʕ***QAl6չB$ICf'&&_n%KW͝;233M(ץmƒ$(~8 ;{G[N;$j":7BCafBU1>R`Gqmi(k;NťL0YyHI=)"EQ:.濮(Dj 7|ghhEQw19NX,fy4ҥetvM0YW7ns-R,SGkΑ[Wc`j!B]uuu`_gyWOiѳuVKjjE<%_X,EApVԤY#I=-*Ο??9$ۢ(JX8?~-Z4h4222r**(((ߖ6;;;N)EDĢ@M?уa 0+2`HT 7|,d Tָ[Pf&W,XZX-Awox U ̼rYIʜÉɐlj~٭w2131eX|\þ{LлN# 50upJrZۓff_|_zO*-$zJ/-/]Ye':`yVL !ɑm_.l@IEQt+W\\dTTB8D ңEEEg~.\Xt-qfffIftÇ?:o.=RTTt|f&I>VfϞ}~Ŋ+jjj^HaL999'|6s}qÔ)SEy699y͛v]ۚd%:˽GMtXң8l&BƧţg#\uw7c:q!a CVe IʪMvd_::NuA]s6#GZ-Fɲr='".۷b}W㊋{/->>(,,LUdQUU I1o<dYʊڸqcիXr5ͣ].숈DFFpܔ̙3~M6\n]K׭gϞ%%%: WoR_XX(^pqĈ[m۶eŊϞ={zzǏ7k[QQ!ܣ²*{гwNÖ:pIt%٤PVmGXp6VÑvmR*C">-d_>f̘ɓ's'6x),ɾ$a%# RкڪVVvۯBE@Ye_eG= !{f_;a2LB`|>@;>d45z}113O,bO hp\`u=|WI֮[ѣ_Bkp, ejl6޽z~tօ?rϔw uWVr82ە_XX4;##?z.*/>..z=e"‚c)ь1*.Fe1$D"LD,PVr\*B)8&0,@ke<- | @Vf6nq.n<mg`rnۆbk7땖_m57:c؉³Њ9v .V $өGP]׸A/#o>D < #W0tD:@.V>kY%&+tePCT - &_ Mt:Cl ЗJJJpEҰqF <۷޽{q92d$IZoܦy^ՊnIJJBqII ***@DHMM͛1hРϟ!CݻkDQ\`a{o#}EqȊ+bAkgl2- .uϞ=?3fL+WF ߶9{ IDAT<`WkiN`3}.dُVC^u A0eg?YF*=[YqEݾ>jСRUru_GG[_Z-f,jKNNAk,[=^piRS>ZlE;'yo|TimϞ=Asa <ʘC*ʻ!0uѲ 0!$zuF6 9 4 l6dYq1!>>'N RSS;nܸ1_We,C3㨮gϞJpqISN?{キf[ll(J TTTW9V3۽xRRR!Ǝk_vxC%Q,[;΄`F'7 `m=1˕` <+QZksNHHVUUU( (mU7#ջWzHcն 29Ycce BB{;dS-cl*0($tJ7Uf!<*=+/ ɷ=,E"|^6 v8 ~;: s8AFA#v` z04#Lf5P1 -ܺx'a`WLvBq)Xi W%5 (UAK^Lna(ԗbiL2ư}vL0$b˖-p: ҥ N8,2Icعs'ƍYz74򛝝'Os())AXAM+?|{S)*6ئHrWrU=Ve,>q\%cݪF$(EB*l3!}yX:$6""m#P֨l=b6펅K6)f.- /Ɇ=2Xo .Bb='(s}ɉ[0yK7hlf] 5F9'I4c$8$LŽ/LeMݧ PCfkI`3#4/JZo`tVufNسgQU1Zt:L&;w8tzِ!ChÆ n);3v|MF<Qi۷/$Ijl6ܹsÇ D6l83nܸMqa$I0ͭ.Rh4f|>8++_*..1@{:`2#l0u+]c&a(LA.- 9tZM-/ngٷ~`|SٷO>ZPW_V)XQ$IUnҭigϝ?q¸m6۱Jn_wh1bS@E:xںIwMXg[^f׻W K9ᄈ>scƌھtF++k=pS|:c9DNkTVr@ъ{:gEM a.B.ә(T=ƊE9FjyM: D9vЗb?8s(I(PSӾcmuuu5@yvOڑw ˑY-c y%8-ꟷpqҷ'ȈIߋcĆ^h5!u u K՚πMojI 7]QqIqѽ{wa…xгgOȲ iՎΝΝߎ5kֳ]tyI{6yt:[A@~~~#ݺuCnn.-Z=zhfG]]85*;??III/I-I+];SNS{gQQQKv"4c ҥKZt鿣ڻ\Y>Q) f:d@hq,kmf߷{dE/W?k" +2d{ 0jX[b@Q"zK׋={aB_cXǒ+x<޿[e; ǻkا1"z8vL11yq_sbRbbȢM!b`҄-~{P~Uի:`6@}C60HC@t:^N@J/HQR>TMՊDR/.}f5dVe%.klM&kc16AbY$@%99/Ն管%gew|8] Gv3t>9r3Rf>w%`*#7;5ORsDqD|k"gslVX5|A]](//Gff&DQD{FEErrr_"998vGeRRү?'_􌍍 ̶outKoa$,kjjv_}ǏpT_|Ǔ/BF(0C؃VXC0~~U7nnqW^!<+:;>קHwp y}AA>$/X5Ӱ(>{fIݚQk҄leMt O~\+?zZ}= 5k׿9:ukS)Gys" q*8+70?$EN1mgHbJDG@,\jŪQ"##ɓ'1j(&IRpj_CcE |xXMٮ]NO @o6NgKi`H3 +<,^]ڧ,8싯.pɾĚ4Ң?Z,m6۷UUU|ls댁"űS0F$E޽z8[{LZ8Y /p9?}ZE1zͺ}vcU=4:vcNE@ȜROW"t2l#} *KQ"9jD-c̃@诉`1&@H gc,*&VbeD@˂@Sv!P8DJ]*{u!ɐkb5 }iU@ֆG 2xϞsoT||i.*)y`ZGoXt->o^4nd|QP^F.=0ƒerXev gӉj/S*ؒTQVDp,$=b~T0V0Ɩ9U؏ ?%V@LUV3jFz[qa=y=,\#.OwUw=!ɉ=> w?,o"Wl=Dhpa|mPlnye c6|1A)dvp9,HsVmߨF{zz:4Mq8(0 zp\Æ úk!HNI4w@Mlĉ9sU[l1&''Sll,8(vmX~=~?/rJqh8mڴa?E%$m2>kEc0 0:,AVd~j_ШN0yꩧ>3gΉmXaEuu#/J X&Q9~>yă7=i%V7 h]cjNtaC *(]@ y=@v~쌱DXx1&N+BDzSD2#0gXx$r" DīIe -ŽŅSja*b/{~fzqV1f#'e]/l0w]-BUE1}?yOS[Sb*c&3{0Åӵ{n]Ex׹%ª7 Xpw&ˈ著tGɓ'Q\\ ҭTyfYDYy׽s\.k_5sDJWBt F9sF1؇۶mcF'ӧO7}tfzn7zsOK˟J0A׍ߠ3Խ~æ'M;'߰ PPC|n"ODf&8*!"c,S7@Bjz(GD]G0u=+cOz?#.Qd%"~@ʾ}6 ԹSզg3,RÅA=RB++#{3+u_H"011 6.6 11FG(p`vvVWW_amiؔ߶Wѯ԰E"Ԇ/Q"c0:EM`]e{0aREHSC$B (p5|VmSy^!k8|_ggtEKP%Ol XCT'k|rȶa΍e9@xs*$͐ޮΝ;X0ЫW/lݺ("99<7|[~JE/ fͲݻPYU[ot:޽;vQEQĉy^Ϙ1Z.66܌)BN:Fx(M !c 8I _9QE]p>V Ыꫯ*m;v1V*Sey݈JAq*tNm<@,E IC yD@gX1q( K~A( %^""JMU棇Mhp@ZiHR5""me2?;L-[Nz@K>q\[7n~cFQ#naKWl:Y!Dc=n1wUKs<{! :5>ш'NЈz}.Il6/F޽KeVXXH>& E?[s̛7hϞ=PUWWc z~ ͜9W_}io@1Mf &KBU;#P9`Hӡf)*2(""U@ ߊlSr `/c,*զ$>"JF @"Bbp> נT-D4d5 1UBwF j gRm|z{AD f";!8~ƘXFjB҈ՒoW}Ta~QD!k\A 5: 6 kXF G+y̙7Gh4~2 ae-xLI~zG9s&̙3 VZxwZZھxZRx3-##jŪzXX FN:%NXLM&Mm2: ~r8D#EqFWq:Ag1q2C^/R@ (`sW*bj*IReHe,^Th0dJ|e&d*Aʋ䶻e6{S_ܖ#(Pd S`! .^ہsۇz?@U~k[.@*ohn|l4Z OM~E>y^*rc'"EeSCɊphF;8r'jxܹ;Ɣl>;S۔օH H'_uU7$|yr; " ^qE` `>Л|6c,@G"*p,0B^V:idei EDա=CÃa= ϓPVM!!A\ V ("TIcQAf*ґ^GTC'pa|5w\r–d"@<E4;&:"\t3!+) mhKW)h4l͋cqA wcB@&quoc.3m{R.% IDATƍε\AYU^IL X|z[oڋs X@A><#V*Ѳӵ}eiWtGbCo>^s ;^|n'(yԁi)yJǹuc<~sDg1q~ݕbYFVs"zZ5$]~dIFyE=8eRZm'ӯ6ίhF߾}+0+l^~ezزe ^~e~W믿>l…þ 5n8fϞ^ MrQւD˞75JH7X7UiXyŬ#=l Cbn6dkm EQ̌sQyͺQ# PFк$3} p{#p( f'[58 d){vQ۶o1=:C%?5Ռ) 9Rz-<'HoBѯa8S^$/!5==aZ:}מ;7G3=lɲB#:YC-&ˀrݵ}pN\6nd/ҵSŒnd4A""jJn3;cպ^?;]#4ͅ Hn &16k,1ccxcl1`3>a~+mժ`9v}$IJ| Y,/VU*`N'ˍ$IzO|C=u:]N[SSSNڜLIS(k'te"7sqacssXRGtE6FIᜃwh$=7_^qco鵂oV#JCPgGPa4VmO];3kTn90_9<07N?N٩}c`V,8p:e~[j>{5#}9%}k|rƠp8s4OǺgX}{ǎk Qё$EnrԺv|k$ M{mUټ05PMڴgEϿÇ/VnM}>q3O=tpᛝG佱為W  g}8H&4‚~mlڴI Zpa B\@VX5PcZvZ/$Ii7ՙTٕ&wD8S̙3z?$NEQh.hmcs8Oxrm={_hz:#'Oܕl!L /^-RuD퍈XWګ3"1I ϯloXmRKKNN퓯WGM5rwyłE]RgG態/g[`jG$+H0A k> J84 T_Ex/GƴuZSH[7!DHсE"꣮ѢG> Q kXM#^Y̑Oo3LV| zYfba2y(')5 6ɌY@%g[(<[W*dXI"I#?tM5:ih5^Oa3-{ec֗U#+3~?iuY|H{ S\Ș tW^y ZKc` p9o J$g7CSk^5n z17,FdAkp15 15~;n߇w>[`>䬮;-ȩwgmp.Lz|d[j-/~;}LsX~EN_?iiNZCXp4}oUpht\/ $ ?lwi+h3S^k///R D$sYnݺ&`lVfϞx:tORG]jy`}>s>C/L&fCnVf[տOZ.ݒC~6/B1x}Gej&5/ñ0kZwʦfJփuRCqΙ9~;lyiMlj3_~gS)IO._'`0ꜙ/.׼yy)5L0>ILϖd[;/\)"HeZXt%Bp_G@\q[xX`p @%DESnEV@q dǑd*"AT'E0IGy}:Sq/]koWH'%2ܢ$y&bu9g\ -H !J >GjTo} CaexɊ|Mww

a05^9s挮AD]W7`E$^. Z1M^^E|[ke&OL'N0<^Ǐ_5UdXWd*(scgY,,#^av)ɱb4t+#$%`S{E.T0AR׭v:6*!:OGH["0hr^uêPzKx^`X;DbbsDt;܈zwenǎUiJ:tnj0YCe/52gxL'vpAl虽ЛJ8/^>8n .َpʷfw$5* L~zU><csc!:|x/B`L)+ K #We36Dlmk^ X1K6Gn"fwo=vV@qy56/r#Gzήǫ`~]3Ÿ§Cb ֈ.FeN)usc|0(d (EvjvkjKzF" v*xV^1wy~m3pD:܋ nͿ^VEz8#ot?{JQt F;%H{?%xD$O;p_^}.TXS={ ? .$ZLe+MG/9WBU }2QrCg0] jYaA0Z V ^_ v.~o lS~ ?9h{*™3g2^7~%6bŀfv۩cG<A>eeTTT{-'x"ED~v %I(BE޽FG]ZVpEEE?ǯz/0H$M өwuuuy}s-dFQNmҥKFJJJãEyn׮]-[6K}qFg t:WNdDD+=a9'`A#xpܨ3 ZM?f=l Cj4dSn2#dƘ/L!} &:uʽvڷ-˟eY[ ei4]d,(< /WԜy7\-Y1;s\(ԩpZt-wOpեw$Xf(r)) ^AhK_UW ^'xټ` h4dHƗ0%hw6r4~zdgscMaL< &KˌAsl#pQD#lJ~HZ95&+gN1xNK` KQ8}<+KP}$8q<###){TVVfΜYG=?mڴ4%"_O?"S"TEnsvQv9[j;cǦ nw%q__EdRmc IfH|8s(!C:tZ-urja2l)]n3r(`eG|"GOղۢ;;t/^xqVV֭yyy~Q d;v4oڴw˖-y~(|hhuӧ_|Sܨ\+jܧw"( 8?xnzUKםʮAkwU ^Qdf4DQY5*Uf2AA-^&tŎyBV2I^bwx1j8_k# 4]~PEE8e@"c =@5^ ՊJT-h ,E|^[!:u4Zz8b+] ފ 2dnA|f.\NGi GG l+/Z$j"Ȩ5s\Qr$*)V_#+6rWՠ'a/= S }y/xi8{سc?))x5gjPdw8vӫBspA,dO1,忘[~$i~+صe >V$u[cq7)8ӧOGj} L&߹i 6wd"T]Ϙ~B,WI IDAT!€mԤIF\30a%_lhCݣbbb 2dY!͆H]vaرVӧO',Yd|rdH9SQ>ߤ8󌱈~كoQQQҥKw.Z(cʔ)U /f3RRRPQQ1F\ /]t&MJ;rȌCmТjv*9uEwxDZ4S1ux DAzcQRU;Ӣg*i^bIe˶n܍+S:KBIKp @- B` .+ɶ$v+ II O}ﹳ=gf^{Feu ~.Us-9յ^у%K\u^aavap8:c'SLlrך5k {9^y7\;\z1H9lc`uhbet(bPU~Y3˘@OH\A-EnuVbLDcQd۽v[gN_#;bu5kc87A {v=C ƈӂ <[l]6b_5(کy4Ww_bpx(h 6Њ]$Ӄ]|᧶<=Xsٮ]9ATr97YoCJ ?Z4z \K;ɟ_ZĚidvgVm[OiiFEEHgr]/kQ8n(|GB BƍS 4#UUȀ ~@Avv6֭[)St!ӦMEEE[3ZO:bх!<3#֏>#99e`[oQ^7o˗O:[keۭښH87!S<ÄQE렜7.8+Vo u1E ~,H([.?{_X_'kkkׯ:h ѣ nnhʅ^rs ̊^aXCCcbQzD,Dh$Ae/J6oec7""9)uN BQqdܮTm.>C^P*TpZR`?)1EGTISa7 =AJ0UFLV&Poo=DapwSa/pr PbE ӭp87D DR[|oH]Ӿ?,j`oD,hdd \!0ǎɓ!ILĤI~!55eeejk֬hկ~e6lK N+kl&, χ*L4ӯa8q"8zX,>pkm}7,'N|a@A[hSSS>s*FTG c޶~6nee8?YmzX6dM+/f&:l"^/ &?-+)G~AK#KUUXVD"ddd !nb#5k[AA<hG7a8x`߅֝m7n1dzYRҲ@)@+ +#M8AM=پD"xpړm4MqӦ:gNc!7͂"8roPbG#p両z#P1H~no3Ui?NY{|B47[d1GTM64"D8B/( f'_t^Lӛy\uZZ -nS B$!A`C>c!Y5k0# "pωljmIw}[O"F&0)A)Z|N\6=Y6b A  LE IlMQcG?b#%㶫}w3(j<i2.Pp0cxJfw!(D*Cߺ&'0ʏ0dA\a;]_C3+C(:DidZl.ʭWF8{ً8\{&sM6K/ap5C AYYJҞja{W >1cF,鈈-[pE4Mq|g'-,,Dyy9 cǎB4o1>>}=KEc555UUU-"Z$ Qp8HՌ"36;$ v (NHU`ݳ`}(ÇkGbE555eN1D0/I)a"--uf )Gy[]NaBtMmmV9j .w[2atzZ⢡?(w9l4Lo)Yii)<} hn= J%0!*:4- f(p9#-#myxSk}Fo79mjidY^9RiiK0aMu ֚u8 Bܝq0Ä%@4FL#)<N_5k 5*履dyustdQ$Et*ۛCMd 9&q hJ/s/.9إ+-ܰKhNHJ zxh 5Laq%$%88 MOAln>Ϻ5+/\|݅MD߽pRPMTT1jX2QafJB~"qBqĀ 3 `%"" DIy+OOs%C͹|wu#ߡUB,yZU5OmSl(,!2* /Ka.eRh w:l5<Jgjzmz_N-[N}oa>Ϣ瞏q zcIÖرk?hGw#ٝ MC>xA AA5<ȄX,<2[ ڤ\GZ&RDnVAq[ΡT E3f@t(HRA*:Ռ #p8 Vql7ʪP#ɦ aEW{& E"*P$1̀&XS צƂ#Aٮqc<|fWp8yJDYSep*­e#T4HV+bAѨ'krï:ea5~I868 WC[M09ѺGaxD|%Z;Pk Fő&tM4qd9ySCg? .1DyŢV{ߚ4d-Uj۠ yw%R< aQl K?ƎSh bks#%!p}RTi.*L=xq^?XQ~sҝ]HzZg?YgTd#55aRJaĈxFi+VԩS-Vu8[ZZL塥.*'"&O|aÆaxwp=`ȑ~?cL2/J>Sx<@$I]wu ڎjxW8}aN{pũz`WLPN m ^kS k懟ȗu:dSe h!qR 5D}Xo^i m67MTWW={<;qpHق+.%۽dQRpґYYyyرE lW1ry!v[jC}SzÖp H<ӌ1Ta1$A d!]H 0 n upؒGo`ydbaXR`.tpz`DF@ *9`4dT{d" y-`^ˊF_n+LC7L0ơ a + @":ב =wEU8<V=.nO[tlcƌASS"33ؿ?bك 466"EQpncӦM=(W\\ iRNEEExt8pxh(y4M{np8>l W.|ǟ=rrEA@kWx::ݶ˖~t!yyOY ZZ9DQ3j3T5pU  AsA-6`5t= MC4# UR 6+  kO\,Bh\M3̈́iToEv,C050D%H4]8>e$ 7 o(U3nIDV Q@ !0(P M7I&z5C0TY7_DޔY"G(Zf,'#P*ORJKk?qEtPo Deo 7 9g r {' cC[uZ*+ӑ6a͞C{OiC]<<.rzYo8HXOڹy+s#vTT5`P޾`8o/;nxvц.9, U'x,3{1 EQp4c}YhCB$sf-7zul>Gb*^7Icq߬>v)ڛq-OwwTUUMs,鲳1i$|(++ܹs;d0rHthّ39}ꩧE񑊊 2yNIX,UU<|(//\Хؼy3u(l4 3bIAS$ˀ"$pш 8^GՆ$( h d?ߎ,PqP 48%k8cLΙ3灒vPBiZk (={h+?6wY5@>tP$Ww_jMzzJ)y9e4`FYVX-.ج).z WCHO U BTp@ nr,Z!K6Db-ZY5@c*X=~`! c`M'V0PTTT ўC՛ڵsRXXXk׮MMMٳB`&{n`Xz5#l#? ջ*juC1H)PS[AIj,67 -9PyB~ Ԯ1*88gy$@lO'j: σ@9!2^b_+Iaݦdf:V6yyztkyE"3R~ G>] M^9b/ )SA˹8vzUtD̞'^;jDWg!OeV+ IDAT“IGh:~A(R0`ZD "fΜO?!3+ 'buhZug]vYaY~-33$''X,'>}:VZMӐy˗sJ)$鷷v[o޶pdT [PƐ* $\c!09`p@Z;(I&8dTG M83 {6hXNꀯHwssƌ9ppBW5ٳw_kwέ7_}U CWN}~_) mK9uG! ^_ t!ç"BRjJ@Ea4X)$:AHBQ8ts"wag8X=A j[퓈k/hK0vjMDӇAI d=>/lCch0[mp:VI" wu3<8-a&ѦԐ)MA/ Xc8j*0%MwbfxqTgv}SFp>ΞMH (1$X=v4ݰ)Jܩ$g r.1jp :x '(r`‚䬁HIuP!(D4&(˒̀ ?1*YuBwPװb¸LÆuKR%[{? '6m=Y]{]ׯ?V0oXzwT])s0k-ND _ώ7 3JRsͺeWt #G LÇ^kY*+. Zcǎ2jԈuᄋ.X{qS$b9*QQ\$K2TBbP Mo qZG5ȢE 䃻D€.rX x;3JEW΁%Etp"V Hiads)psvsKP0 t4gq2/;@$Ώ=橲hA4>i@J (Xe# kLO"D1({G0M(C5Q}ȇy@1i 5K=?ː'dKQbn;'P(6jd||䎞ē"FL>h 96fg^>o6inmAAR/D(F+?D[1#Q}*)6ߘɈFbHxNhhe>vwNW)W߭/ǒ[{󌾳r+W_8O [#pUW9;t9-D.ũh7 s )Ɛ@ ǃ$55Gvv68Æ6f |'~wBDp:vCMQD[[>#Dضx:XsͶ|Ɲ>ƪWa֭u`AUUgRVVAbyeŷ{^~D"ϳOFM,N^=R!1pNW/{@?߶0Փ>g5W_eǟ>E)^pe.R˖ Np' N )T*%N-dؐYjK\csPJf0BȩA 3M!A^ DI{\!IpO7 hi %&rƢ A@1I4NKS̈́@`F pF '67JE{mp*aFLT&3O;U63c-F6 cn)[>]-Y k͍ה6nlT2 MwudG]~<-GP}A[}+cG Ff4FiY%zxKW`kk& (< " 1A^^1+ [!a20?PMO9V[o}<σ.[kӅ&NO}S т/“+Z$I$]׹b=Qچ,^;kv}v08!9,Q_/~O;߿ R~(, " 8'HP Bx$,;z>>t@7wN_O>S fURQŜc!ê8GAhC[z=vA2$ O77.=G&SJx2eI"u~whii#MWwʗG-XlK$YZO^Vxn4; ]e[il99):hGg}ddmI|OjLFN&Dkظp b_q~$Hf3'>pT^0('O75/ŞU[a5-=r"4)5-m\rG,払®GB(4Ei(<uϱG,:pdZ8q$sqxbp㡇I~; !j]ץ޽K/$Is\{:jRJͮNw'wyQUUU`UU ɲlX Ϝ-Zl;'0|Ma7i-ܯ 伣v t.$5)?lg`y[>pݜs\KL7OW_9YwrdpY9?~ `iww͡3i-zi׏ z4v IÊýXѠd|PV,s1ul֘tWqӞIJq~aڶ(o(JT{ 91MvM:n!_xmZp(,HM8PVo,QW5}9 ta7?䡇 &CMT\E[n!)v;uҽRʎW`Vrˁ"eBB:,x0/5z""cqڑ|K*ZtCg}g}n"XL]zhӧ`H;k;o-4Sg66wBM'%wH^8:-{}Ab:H,?:ʭӿy/h_q|DZk׮uovvbl4/RoVWm6 ~=(B鷉cUyLgO3EX}g}NX>[׬FM/7M f5t]'Y2tMxDDrޤBY!&3U;i@EUP j4=`+lֹpMXJ4rpe5>`58$>g_ػ>8wsξzcuP:st-ItR8HO7/}Wш/Wvc׍sj@UWg(kw@ԚtR7 `}7 }?NW@OL87JSK@$? &L\~oa\g\&z5t b5d{gƏ<%sA9¦CdW7q[7mrqGRx$ӓd5hmG i_=˫SkvA{2Vk2ఁDv.4獂f\rщ%>)2A 888LtSq'6r̳/%w/ 8rSتE!_3 8iǵE{E^@gw#}u>U3s/^)Pb@BAgMw~׭DQ|n^16py$)J2E-5 Ii|;".5jAP54֔A#Y44U[}~璩wBԸwg}jM?'TM+@(t.BȽ>;'ܿ*E"IÉyW=\G GFN DݺKO>b'Y]Oz1NJ& ࡑz0L 8vCaN{xh^D h; pKbX fV9 ЋK\eR,&^|䈪@0T߼ylZ!r"~,dEDG:]\rp $(* - iQo,^UߕYɊr)8I5+}%K@vƼxU j((D 2FMVڥߏGJɋ p)!kw<d<ю?93mZimo~-O1IbƷ$}R'qwf<'Q*59C7_:x?fxxnDM.H<ʽFImr˚fAirINX "Z9Έ" `dPxi-`wQu}{OiXcY>m$Iw\s ziC?D Di4<ah3L2GayZ2*W]g%vAdh`@ELЄq:Ǥɽ*A Lg _,c,x ,b2pQ$B0ckj6B7&mt9=CB0Md~) btIqSI87;0'%̈́`>{p%(t ep7IBWAʙf*u0M@ !2blr`,IJwYd o8,Ec:Wu%Y! ;_hB !=oG D'Ek%6FSJ vySܯJnrĈCV]=hp LYtt W;xW10+M%F dF  K> ^.68X@kIBQhrLpScFBaóGOun[==*u1u gK"N,) c.Ǟ;ک߯Ն g\$۰ }R*(C$i203:c}Z8R'*`oMUb*SFް3W&6H/vuɡImTDž^PIe }bp;_To{ko'a[)[Hi IDATGoFI[UU;xˢE/x%KvIje}3'54ׅmHdiSsM P@Br:)#gZ9%Dr~TIw}Sś0iDR(˼SYga X&%.49k}&;.^'TbH]2gx6y} ,|rqhkՓܰwO4͔9~6lȓ Jp0ym7}"o\X߿u5W6,zq1pphXUy˖wWN{ž5nY4< Q 9 Bi3Š8U > ^\8MwقmODz(x8{vX nbҍE2J *Qӣ SvtwLU|́1{\Lʚ}*z*RIF p~AWlW QP*!˪EtΞ( L6MNG S@8\Rds2lkCc0<1pٙpp5de\4Sf(q@\^H==1e Wl= Cȴ}_,dNd2!onE#zTQ*3D9<N̚8~L1IN 6 pp[@,Lmb@twAuF Nw]S,($=&2vheZVD-TTlԡg2ٱ"r?i)'3vW>~?@ذaDY0mvS*Fmcƌ9.۟厷Immm?#b޽2=a]fD! Bc KgD Š:x666'!H"GCv= YbD K"8 AF¸M=FIbe/,`kéծ]$h[q?z4PVLa#XK9o}u)eyw; mHK~FSK~w%Ie]{WRovm+OZ{Skkx’$Fe(Ew)ݤ+B`v(]0$<426)o9;xIcvӖ֧n?9̸a$5};=p̵d)U4&bGŐ$(,5 g aBՍ 4,ßԶ?/esul>nEەRҏBȆ1  "U̓a:c( r=LdN/̘Z !?s@v(9  = !I!?Cs'庲(*p2A* ^H=&.M.1Ȣ 3Ft(IN"d ۂLKaH _= 3xcBvv%d'}YRTjGHn; BDKcXl0haO^isÏ""b ?К+K/?}1+|݇k{)( P][h]߹hڗPbG WAns?p 0 kEIHNܪ;֪*c+u~_ Gq@tQ#p)_'^Í~Q7Gg?^?:LROy,X.LnSTѿ/a2;ᆆmD]q$0vˮ_9w|<7\3%TjۓO>IJM]vF~!dY7M%EQ~9O| '|[npt~Vұ4o.UU*/T/,66)13P6ARV:qyPԭS)}NqɎޓXx闅܇J㙕%X{OOkO,4D*$T(404SR9 CH2VR!FD>ocRK LK@dkkQz[s~a;&c)3WRz`,UC'VNPҘjfisʦ3NAJ]*Wt9W0a={"Cū#%AB"aLPaÎgM˶_;W3n9+"JB!y.\ij "ʅ\0wӍ Du%)g S" 27Pyq2_ܦk@?/2DBpr݈J8bcapa &4mX4V9aeMBHa3@v${ddtRK@- uUF&g¶9l[ 3g!!1J|{㉃LNeyP\.0#Uмml8R&/Y}$Rsg U 5T\wC-6tn/-3O=@i-F<_oa_=w`,nͯnEeq16[W`#R% /-nYR Fv p`=ʁʳU()8cx^&HSGlB\BÎ(OGtT?VL|Xë>w$#v_ @ۙRƈdcGOt?בK7wuו[Z B$iH${+@>@4uEEEHNJt]vUXu,ˑSL?1S{zDvw}_W+ ˲H9ߍhkkkbc|B`+z衝_W_ojj Ɲvi^5k֬^r-Y|II5yB"nȫ\w f& Qp<"! Ԡ2ryL<\TBΐ48/Hؓ} ~u疓XR+S@~˂H?`ng[OhWɆO:H@[{ϺB V+9&2晥[C/IY|SEZdٙKKV }"p7@J]`uK$Qe}ɉ%3;:n j~#|'t鉒N aS511`:6DU JWPiigJ{`f) !TK`I(RxFunvԇ~y̘HRvJ]ĎveDB{*.rɝtPOf `As:8,.kv|p啥^ɧ6$Y*xѥW/yֺgVO뼷-ڹujlW.Yo^#79 $nO4gIHib29y"STICZܮ+żnfjcl$61M8G+y%P8B!rxژl~OmQE^b'$!m u9'VNe56m&2!졎f6U35YŠ8SF%F6-O$_2?]1b8D.4|/ "yōo~/?_E  DP=&4FS?zu޿V$Uf#"L/|nW9el,əI) P<"LQ~=7C#JpyaY /!pn7C[ kD2B@X$IpSe8 =6G=:dB%!)6u(<gcӲ lv@`aASeܰm1X,&3 SO P>w:KtwS(ۀGT̟MB f> a@B_ [2HGUz}#J(]߱[f(*ä0mM 鷐hۖ@־kBš ]yDQA@p־>eeÏ}Cصa=,4eLXt~&ۻq),M0!~&X (ЀR\ˁ0 mU9&l]FӜxŽ a.Sr೪(<@!WFߗwquxЋ8b`mömr9J$eYXf .B֪m[sϭ{GJ'ϟ?Բ,Ȳl6;:Z [\pAmmm?KV~Ν[ro&RD"?yvOOt=̛7Ż{ICCdN8M{) ,z"h00ƒr:R#u2c`\w_,H 2T1%[:`%Rz&왫Jawm5r9œt } U|pXҎ9jcuB(#y;7(:ɫ (F+}IVdW1~ϊE|sOw(M!TC Ԃ`%sbХ6BZh݉?~TųbJn *=YtI"\ $6dҀ 2AJrʶdk5ZCV"qoSagL"0TR+V+yɖqK7TyeΚU+uCwr&햟.Ќxᥝ,ɴ/8 61"* 3<]) ~^(dYr?yk]̬ۧ>:EzUg-KT͚h8ae-a۵G6UPWVZ34v:4Bvχ~1 USP4,O!PUPÄ5Mg?xX%C ]ݹ|pϭ);x6nm!2 }:!߅tw1,^8bA|oؽ? 7{ß|.>2i.%(U @4vо#=p[@r*Vg?=\۾u}MQl dP ?dO; Gs/Ǩ:^<ux ciіe:::"Byy9|M̝;X~=:;;i޼yba+ϛ*=$EC]lyЏ 6@$ o6̙soWW͛7O477+5kmmDb|饗,>Vu]gO2p'TZ}[K[Nn8FSWi@@( t!͡$B}eRoJ]hϙmw!%pK! q@b64Ɛ(pm?T&{JQB"Iq9up9IkÍR <>`'Y1 IDATٕ[S9ܫTPH"ʦEaDEv{& H$H𱡓S ^-\b.% `ZFHsO7i, 5\r,^3K1*(P%@. TU J ^g6}%8$]`NX82Y LD@ic]w3 ʗ73]S$WFZ|Vx]sj7-8=g,.㨫  HhɃ$|ӅitD]=qb oUO+dBLbD2 L i@@#ڣb$Q;d+?UIt&l6D# dd ^x*=pT$3̤g =9ME!,')&G$j}( `ڇ%pJG웇VǖΚrb`GiB}`2Z@ 5kM3|) g'200 U0 +G*Ѝǎ =v]3 ,OĎM/tTicX,̞= Hm̚5 ۷oGOO0vINS4444;N0Iyà{`8?e6`Q,1k֬~-̙3c"q̓ &D"b4YrΕ+Wwjʊ\gu6о/!FŁ/d̋X g3 \Ry&cgW^ha|BI3,=b@=5֑quNwG CXG:gTp~g^9 9^~?VH'@/UVsυeYXbdu!ƌ;wDD, DV\O?`؉^z5/^ ۶;|oSSZ[[Ѐ}w`_aFP6CS& a͆:io"e ܎mwKB} Վ;jw&HV/4h4HOϵ7m0Dʊ{/As26&,vRegs5aS~?tu ؘOB`ȘüO ryA.'b)s,C/oQ<|adfps؞g4lm;grgEMxM$2*wȃH$Sߟkvcǎ\8: f 9fXVT&!.6g$3M_ :a)bu]ib0A[6%`[\Җ A#=񰆀$ڀxn^m!KAS_O#Q}%o@Ci],Ǧ 3)dK7n8?y)Rve9F~aUv(hEd<4AML,~" b;2[x!g! #Ơ0cYtuv@ whh<Nw3J+oxѼf={3wHMIHgrH&3ЙPWE>oC$L,J]E>Zl{o֏7g5+ 3>pF)+J0ynVȮv4iPIUёqSGJ0 xUw4èыSSG5u0.aݺu>}:Lӄ4 nhii-[Ԅ|>ywށĢE 2E-[k׮c*%IivZL:e}įAgg'Ə[cΜ9xwrpYg}okk@'={}r`ujDeD-`042ft%p BpC^ch NMA[E[#c(T8GSFP6%.pNhp4 "deQKNv!ך#æh~H}AH^l_V^{7\@عxrK3 c$)I慉k|+NwAn8"IP#z_q,$ ]gt̲2rCӠ-@@=A܈(0Z3ʿ>fHǼ_[LDэ=#` K@qHGph(b(C0@۝1S DHd0(;Vp{VTO@XFTGF{xB@2CпY$yrI9νouc~F(.-"˯b\iX>:# &6e,<ʫ0+n݄d G :2Y,% 1w=NIUG~7C}7}:2%Ƭe0-| y*g/ `m9P\yS[xg>}!FDFDn::<;Qv ǏҚ48Av477c„ xꩧpuaҤIm$W_ٳt:!V bٲe())AUUSӴdYٳ?wܸqhiiO?k'N6lR@ZuVKYge9 SьVN ؀ "AH0Lx\|Heًjd9pBWF U_H% A)r(XPZ#Cv0 - dR&&rzX aN&#1-%Z\#UR4~a݂ǡ'F^ed$p+&?8S*^^Y9>I ΍6j*P)6"]*#٩#Aq0X9.?ma_/SaS 梁6>8k\`^㆓6 f`K !Ihۺx?@uzA"Fm}#QiGC4jcB +r<:zAH=8=~x!F$o lU ufbu9;CyK2Oa?,@+L#nt ;x(uq/ҚGH"is(LH$cҥ())AQQoߎ\.͛7d24 -ƪU&4M{>N?~,lc CCC677gAqq1cf4 gy&l6m"!oN-9 +P߽{VO%i$'"o{5<BUx.(҇Z9vty]S"x Bf86 0D0֎䦬R:|fʊʊkw&M2{]N`&fDv8%ۓN7hlY7 #jvqnǘz]%[b'-1@ CUvZ#L`  ȎNhg]v<ޥ*9aktdIUƸ 8wEÊ\)EW%}jQW6$'#E&a')!GFқW֯Ê3n" a˶y( D0Xt&)PGc}( #t6ps'G Oo$T jE +gLTUpH{@Adzbȴ  QmqT )  \0e~\*Lp*ue~O! .tQqMjs;v/?Rz=/H }1TYTP7Xg ١<8|2͇ºr}:M <*': /^?*jޫ1W1a[aqTՠR31Թ)$q0م[117o^}GE`%\ӏ_wYU]ksi03 X5ƘX_4j؍$b4F#jӣD1bBd 0 NAg=k}Yݫ+F*- nFpb{d=:+Ga/0@'2}LJ1;y ǽÚ6L4 bʿb8Ĝ9s~z444`ѢEC HӘ:u*TULwaY?lɒ%OȲ|[SSxÔ bX~=pk+WieGʁaȥϽ0G5eK)oߞq ?ۻz{\Pd a"Ρq$u1/_@ւ#˟-{>JsD$;cZ)8ZoXg|&?;* t$QES ),.9CAlũu'9TFP4wRAMHle+%Y:ɚeTEJ=(JJAG[~=/G4}3vX(|Mj]kR(6՗"y<"<3fQ ߟٽOJ hpmv85eS y{:v83N Q1|*Zv'/,B:8ۛ F bP% P%d8˽< %%<|x0X]h=/NrA"ry%W:3(?COas*KXKUedË909(kaѪ8:~+퇹Ym`}PfJ@ L#La3'[ӊleQ#TjNMMvDq\ "~+oh׌i:;e0`J:/jJ)w5 D)aݖaw?kS'aivFBnG5V\jI gVgzV|4prZlmuKy_S=߿u)TUe|ַ_UWq%0M_:L"ܟࢀO1L`mhnqG H')q֙uxoAU%=qBq՛Mu/OFOL?:v!*3Z֐H Pڑ*AƓ8T(%sL- `́>"Ԑ ΈjnГ{"ZaƋ1rK4lc05$s:"~'BnDNXG,]DE #-t(>35?jLv75<~\8X W@D*mI^8|i۶͝|7bW>;޺S}p($ q8Ԋ]T L`Aim0bM4*l \ۆ8q$DQWI)2x M?=ÖJ`g@TIn-5հ7 IDATXx4gJL(˻w@Ga"s~xD&GM^{6ÙgϷ7#(ʰ18p\4 |,SNK/0P^QhmsZ|,,Ye믻)1s8}|xas W/}K/\(=[~E# ԅdlOHEQd8 X(a,YOf(r=9npJvwSWA4=+0Mf/s$2v;.É=*ʅƜ/KTO)׭;*HU.en?Κ @$z][.cj=7Ӹ.Iv*E\RCFga!9?,TrlCH~»ttm5Q7x6oF ߯"r܇>a^|i'Nӻ΄!#Ӆۭ?csIAgB vb̉7w}*No~u~_{FY/r/W[§fo=}F% [BPdÉXcB:(#H!_̢$R.26B6 !l'0lJAq:}Hʉ5$diXOE@hH +EPA4@\24xa6uJؒ2d =(7~)+s?Qi$K o^,,NWdO=jG2g)w^œE8K-"rbB ܛ\8鈕I"N<(z2[ܧ6+VKTl "Tza:/dd = 7>3A +ѣ()&I&Q?1J-0^J#G|ws/! vO[\_W So<^8gN|*MhO{:27uu%L7,; .4pt6$pWvw$x 4~%KruڑciG mA{b7j[=8\M!%l` d6ŗ3Eު y+`Q[@|Oŧ*F/7f9݌tˆe̊2?zETz!K ^=iTyWZUloCe$Q@BQ%+LP~-0Mm!? ҿχ@0=?an˲xYgK'A&8=N(^ {َR6@]cQ0\{vF񆸂盫Nn٪ #9 'dsc4.Np<::(-SFcٲ<&}O e]ĉ.zq~8AC2 JUoJ8޶=+VL F!L'Y(A"b43vv߄-AgQ~kw@ _[s͆SOe*13oHJ`_Bn!0]i8+ n( ?+%~*{:O`udžՅrL:Eg,(6&TѴ+4?.htkr,wTST j!;bV~~ oI+ :E,S/n_ XRξSME[o#jD1jC S*d<+,13z|)dEx/*!UȈJ&J_Z,\M4[fwEG1tx<+=[#FD{{;B0>}:|Mt@dYAPun>o~7? ׮[0|*c0Mhs.6mD $;?-^D"0> i[j*֜ҮgHBB`kSKy &$׮9G%NS9]&6qOV`be= ݁_fߨf9k"vJFܗ\S熊x:)(ve "O6nD @L,fLXNؐ` wm,gC4徔ae #coQF|7IQ`"563 Y$+KCHzӘ7si-8.zaSAnD$dy-gD6I~rӺ<N:isb)zc,s# ^@_(ƽ$A F°8 B (DL⅕-ށ .[uu85יG9#n I(=3[ H>p|eI)$aM"+|hځ=cssNm)S4FE.H0mleWLs*b`#6S/]XqҽŒ)yq${%*9w\ªJDz8^^B*,vNor+bfcsͦ7br3 6?|ؕ%fE)QlhhPLNeYHHR v㭷ނB4}OmۢEyø,^|w߽P(\~>J`PHD"Zf 8炈p:oʲ|;wˆ?r[[UTj-؄f "|dM=4ŵU|b^$]0lNKz >ߊ~&,SI\ 8!jy0<0D*)la@b:ibmꌟ !N68XjRmŸOna܌+l܂2 !! > EA~X?Η'DLx[nc$O&T08@p 7OZ:!CG@ #e/`7W@@ \CuM;z!cлdˌ=sˎgԎ/+B ww@iWB9t$y/p^_ΌӐ"W>\>¶+zeIydmwUԈf\+P%.)q/Zz~wсlۂ$|)k J:qZ첀 e SF[j6Š.yR0e$+D586Cz`9$I6`Q6}em'"n۶C560 =P=\ve);hG`}r `w4rXbb‚O΋4 sAsfB@|:{PҼtok* 5qj~k5*ӳ9cg3fւ[xZO.]m)ܿ 6)>֐EU:Tk {tCE%[Y-z+.Y&HAW؋g%ZG>q<9n [nA p.w/ޠ7w=￱_&>[;%=<߾LC:GI\.G}]~dhc&X#='YAmɥ^4P6{<}#}3_Ƞa3@hy$rOKVP0ф0t}C @G{F "&͜7M6~whA |!`Y $o !RUW-?Vw<54voXҼea[Vz I cGҵT{_9 ,uGt D69@ oQ njzOCոB+fˤܶO|[44(pbu]wE wA@@WjNn ICrۖB1SAcO5w9//aHe+,_{IE=ukRüJ_: vΜUXzgÿ$_T@@b  $CfL }?< pPH?yCvv٤is-ru:}©؉bQC$:uIRb0~< .o¶ : ɪZVY3s 8 b3v&Ns/s=l3G?*wQeT]z[1/N=)ZOYUu]~x9?"a?c `'lqVHY+x#y#a=K+TI"W5lyjb`oNI97V'߳x'j}ً;J#J8/8Kp!ܵ8AwE{ZNܾ^7ѬG"v&%MTDuA2-˶m;) ˖N9V%g >6 _weꌟq.NvV 2pCB 1`\BX4s  bͫ$)TRZ(sи'TBӊhi܈\&808˶!1 кc ƌ7eLA X< lCV*GێM;75` 7Gdp(itahڍMpI#/1gͤap  @3H&P*Z7B/ǸпY6ۉl¦uP;՜LvDTعmlBݣt~ IDATSݲ.! m % Nذ۷>zv^nU;AS[_y0PݤJgGwidP4l,r=* 0 m z NFO2W ñ  U,( n7JJJJ&P^w?Tccd^N&^"q(c|ɒ%6lpeYpv1rH w "T~Dv7hG\j)̛ž>iV-1]J ZuTr>!CX3*X  Y2l~:y^4en:#ؑ7+M_;IX影C^OBt\ӾNcJk[r@ =W#e+tYug F o%w[Pԉ ^$ FNȶ0zHM: WĚz@a(sS~#`" s՝IJ9 #WWY-nbyTď'V}a&D W:J|{Tt,lgE`gI.]is, #oeҹd9mtdM O' 4}h9vCBY/v7oGoW;.2B> 2ӏǟla@ tl.ost5vpn7ENئ>Su p%e `(O!A 2V#qɘ˂a)+b˺7ehՈظE^]LPD 4n߄ SꯀcǶոF,CzpA{[zyVOc&"ֳDl9 /,X&#YZZXHch޶V[NʛN>K>1կ:[{^~@]#S ~Ng'jLԥⵗ_|\lغ ǟ0{0k! 240h"F("i;eEc>˒%IzϿ ى.G6 naBs=@ h6Ŗ-[0gHҀJeuV ̃|>odr1v_x<7)21vٹ{f smLF<349v;;;  3GVv4Z:g/`I´!Y%ž8)%! C CC;:d*Ҵ PѪkXߕv^J0;>cV;O[')#Ek69!TCBD֤I27}&c)u[FF3]2#a\o\3;'>Fܶ0{zpM}3_sys{_K/5J@<)umJ$v Y0 L< no˙D8dMG(;cw9+r/޹Vt<(<5({6)-[3 c[pN) FqMDYKVt`0|Aqj-[ 46`67TJcwK3,=~7AzU3+:Ҳ"St4o6o?(ژ6w!tuBSFB7C'37"s?e,?n$^֬'"[b\aC8 &&CoI,AYm y}m'c&v(Ń?W|l'wA ~ !O)Swa@UvKӟ>xW\ @(B @XD0^=P#h"z~&Hx^~wޟf'LmmYW^yB@#=f˿8… gSb ˏT2β4mU mm̘?ܵoZ}Sߣ'z 1B$ O2  m_=9c-{ҿ"ZR<&,8DԖ>LATQy"]܍?T<_WeCMoq+$ / .^Hǝ1~g1[DΘh?L4{,3۶mWUzΝ;衇r˗>t0rj9,)F.Fn H"n zOUF?P$!ĬE}0J*L7hyokȽ'/I%i_3F6}1\9vVNfy?f^M":N>;_ȽnN^,48ﭧ|Uu{^Hfv_!U# PETۨJfklכֿ ^sУ Ƿb6躍k>ST+O7`RlL8ߵ}f_*tuzreQQ>@ټ_$~|QQC8F84cBSQ1_u@m  ""s@ێh۱ V$(' 8 xqȲE@O*GmEt:$Ym[pT b2 )$s?kZv|?D$b :zJ_? MM=-0 Zvc%вkdZy\~ ;+1 ' !iHXZǍƔYѲmjK = ϻx'wmeCAi8)ZWsoQ\.Pz,F&6Rp@,. EtwZT׍9Ί3vL0EFɘ8qXjr%x}#l'i0*^V}7K<׀p+97,>vz\Q"(+Ɛ LL?־?vc۴Ha#;3]w z`;YM< 5M~qIH`0MӆT_u$I%K%D0a]tp\Ơ,˒>z:?M+-ɲ .zB(%7􄄄$7Ʌr/MH#!c0`l6[,j{ٙ9JH.GZiwޙ9g7$ItwyJ"zf^~uV+a9y;d? &)ʌOMՈ?!HrŲJX/OyQ !06uṼy>ZQc|$3TX|<,1T>ȠsѷH>}rd8RNVMTòJs /y!fkTڏx52}u5]r15K+-3NY2ZT_1%@u!(&wooP^ `˭QRS7x9b¾ ˉyIP q.ꆛJ Am : JIc9.L*IJydi0DsX߳>c̤ݹ}#坛'n&։$7{ D*`t3$r>rty+jM]y?PSھm ۷O@__/mDMu]ɒɴn,I R|LEI_ 4J},ඥ Lj(,L6uu%xkq@Ue?Ϸ蹗wg_;q̺tn9I=.N2z0QmN3 l6cC*֍|.D"֯Yv{+;F AQKoz GK:i$`8 B6 o(m"\5,j_gσ" aW`+ςBe7cK/Lg }^ a * < 0r4+ T@RqJeՍ ƩHY0bˏ\*~I70'3hĂӱ齯~I[ş+)2[R3ey]=s{ـ]uO7T[O [%v4p"J<0o_MyCy(7qE2W쒁6$/n8R1L$Ϟ!L lD]:q2 | o}W>S' Ki<'2A{G' `:1OR&8-]( cbHULlG5d 9w_Ljj[NcZ*>a/ʼnM{3ĉR aZ? GXU<ਆ 94JUi%HI.BBJ-IU0$ikEMB#6Z/Hv*6$^OiDyХIFƗנ<0dA4p9؞qF^f -X9nĨAr)Oy'K|N-Iڳc,+A~"dzɫ d[0.GY4{BBY`Yhή:!l/WE{VGSkPXx|?x]/qGZh_)ۿ5֞+E^}>#rR" Y:vAUI }~ ΠRAaᯌ2zm[^ wqXz?SۑݝA`4NBfzClDv+9}l.xa7nKݝJWzRY꿖ko6NW F'{Z!A*$!İG#`BK.rgeRm Pr&K !$@e<,$qEg<$ w$ r&֯]() n$dqM2g_z+%i^'1FAus8_ZnYȥ,"l Zl3&qXvē9CkLLW| qcRًؿk?vwڕLw{o2T k`G80@ ȓ{c_m 9򬅳hk{n/$\ /`8(#{~P_LF±J{5qC ,I Ø͞ŋo߾%3f̸PVIYyqDYY2̑g"04E,L2*?vwt\SVVZ$y} ؕ$ Aػwx<>1ghZj\|(kmmNe>s֜m4$Ny}.Œ9T}p*Dt$9h9ʜ*J\Hd H<̬`/UV82yx d^-鮉PՕHJh+pީ5)Xg'lժεC@-[DsC7Of$ga?D($(BIP 44cF@JgH[,N6Dex̍?d?M~>#FpN[b0sTg{6#܊.#@C-$nc |S' S5za?T5j!q:Ve'fVH"+ d) N!FYDZ@FWPW֧ͨj-1RKK]ɿOJذ>;vn~dEЁ# sJ)L^ZyӍ'C[.;z! Er|h\WNŴBW"Eؙc(3ѫ1rPD #b$z(E>G2!5޶$<76՞dYVyWܺsό918h+M0IOq?c 8adSO 7aCkK:勮4^dY6Z츮l2DdG(CdshJw,TrU:+Xt< .ys=.#i@.0U,W%2gBس9&n2m5l5hiރXo3yy_O ߸"7oׁTHʽnt~] =1e\iG }p-{gTT88g[Ù|^7b$wv$QQ#h#{TU^DTLbP* N5a}#YRt Mt ;[eb%I"025+K$H ^(X\wHV߃iS4Uq:c L 70Kd)TeGT {mޓN|ۏ²,;Orni$pS!*ho\xɍ:owxICVJ! P#6xT dMST u;wQy)BuXGWP}pP=AITwVŔ ·m]#o}[LέȘ2ݻvchF`İvr%22}2MY":uw,iwy˜Gr(0 2dZ.m=扰}pĦCD |na4TBc33 @ɠA@88?՗1sP 'I cz,˂eYL&Fa&>C\x6lͲҽ{=sF[GN 4!2r\ inI]?PHBupmnn.{kA[G&Os谒} $!HٰB''25#)pW7~">NjrcS'Z%cGbRVvBZ%;LePEq*I^Yc7 Y GnzAkZږį:14A IyV ;R!l Sq5x}iƍ-??xCƵߛӻ}uspC &7K#/7!.&:T*9<1c](vj$:I:* A;}_Um;,Oe5HPhؾܲ ?8; K#/Lz5H$xNX x<~|'YܮA$y$'sZ`ϥb0V/{c1n̥ȵ=h! VmBEםVè 1A }[7cF$8|ʆc[K7%J)1Te#ܥ0! 'vyT pȠf6*TQ|dT TBJpؾ`:l 6c6$ʇЂ`ى_&*ྻ?XSeNQil--- ˗/lj'lذ4w\L4 k֮E(B( MMQW4itOÃن---+V9sܹs1aYm޻Ç DpX;^{,/6;[mDKC+M.9?l|TB16 aS@S,%:`%o T`MFR-%;T!x' 8]UժI$ShrRNfXq\`6i $]LTwfӤNc'y<·& B>"hP&!|ޢ=YKb fS]x~DKvѩD.Vl 63/a^PAGD!$2FHwqޥ9fGUu#o!"FJ E! ]!{_}!x]tڙ= lԡf zՁ -sr2dnO2*dɒ.uaf_4w`HʋX<'T>b*_x-7~ZoN^+5]&HH>yt"HPdHktz‹oλ=}q,Pd HCu'#G.S(js s@- qp!»+?qu3xjtHpIϢ2sSi8\xҐu`DB zm4a,J-TaͦV̸bYo?^}ɗퟸ (vX"ua?vclWNGup.`oaՇE6pT_( 1]'Bx8#Pbp\oF~cAsOҩ?=sx---={6EA2eY5kv؁B!ڵ UUUp8`P@=7oL?mYv`Q<1k֬Aib̙عs':;; {nڝ;w..@OOO / @D5y`6"H!>M2@xB6rBlSx*WWʣ]e.DW V9]F tt[%EercԫʴŮqfҗ]oW\e˂O.>ؤ5. ΋V޷\ ʝIMlC.gP(|8֞z{~jP1Hl^Fp/,cRkִߜ*6mc}}Zdܳ.1bLÂYvw N%)`0EME'߯)",~sJ\{tk[{>Soֵ 8֜߳@A A$?SM/U3bD h3٭F !۽(R$ٳ ,<LqBvx Ҹ زbӎsWa7bDE; z QA2;rm7~7`%!]mt=WC) v~  yhЌ,<0X wt0/*@y-Zpc .3)I,Q{ (--҄U$@_9' =* Pn퓩dNIݞ)I|ϳvdR70ň\cr. s,`Ld3R G@$B\.Dg*5?;b{f_I~swg-"9fB7 e|.=NjQEi[, -Q09>21ɤusƦ(]xײ1-q@N[W_ޏf_Z"K'%q٣@꿖o+jCMs(k!Ok㪒|ߺbRpF¶cc6Z(*A\P(Li퇁D()L0,V:ϣ'ѽ[%?F~/}1j{HLiAR0aZ$imq۟_XK{4{>wck1iLy `ZnbN'N砑 O@&oa! ,ʍ1QV極5 {::q9wrn X֧w])O%j;gPY5ĭ:d%!rpГ>28sh?I(/C Ƣx $] @1N9€$IXnf̘0 @,p\hmme9aܹxp8pgBe(-[$I0 ֮]iӦ4̓nbܸqغu+:̙{~NgqAvw-2,1ѧIbuSfU6 YBUEBtJv c{Z aBOHt# 3abk%I+v̛T1*#%ȲU[d"[4`v@!9Qc!7:,,S*D|(s9(! x܀,=e^/PW ^L' 9f(6S/D@1%OR\\RTVuz[RLbSDLZ !KN)EӶ*tV 4ũ7mE `kkGiqck#v *tPpy]D +q3ЧJneS߼=O8Oϗ;ṊqV#?}$ӴӐLjL-V[C`B @X9w޾1~ͫŽ?lҮΪ'Z1*m*r$e"1q'\ziQ1%ArݕkA!ϡ7U@&By-FW21ʥYds9Xed #C!Î@q * %&wk7?U?:"=$6)/ 9 : , S"s@doj$Ax}1X'q3o/ǂ˿}>ޭѰlނf8Kvu>^xh嶟J*Dgj"9qr]riL~*h,ސ9frH:]/&MFTJP^f;d.J;4XBmc"a)3d`-q -3j۞zD'tz#pfjؼCÊj Z fkG=۾&77#8; Hꤐm>7RT A bLG+IyO]iˬOhB)IWmŅpU n5+//IY?ZWW09c }}}2e zzz0n8 (//GYYv؁|>>pfPUgy&\.VZuT7}ܸq4M, 1DAcǎŋ/p82ܹd7AUU~,Kl޼n/*Xˆꀪ@JTd WV^ 8سcm s` LTek >f,MSIMh,QlWJz=T|TȶʙbvuYXD^$ڒ}n~ tnT G9&CTlq,3MClHtΆI5 S ّOL&gJ/+bb{YwI*,P,d7 ?.8 >op(^D{fK>kT{ uL4ݳ$M%-3T@}b]aqΧn~[8<ՀK1:d)4D}xsޘ#F#9 9_::8"8tt8;G~҉%Ձ^f33n*V}cv&K !P@֠b8Lpar+ӛ3(5dI,5|S!!#["ĦfA5G===ϟxhfS"i(8l9Bt(N-yѯ,C4لψ`9p nY:Y[eY>2t#@zs؞7ИQU7V_9`0v&P^Xzb?F۰{FD"+-e( >甅IT6(%W}DQR=CcŁ'h[+w~D;wnoR_:#2:s8hыu 86nxf,7e^yR 7?L$HOVː@Ed\A:]U{9d0s+VXڗUJ?LXሴcocǞ|X ɦٿ?ƍw%iJ̚5 7nĮ]pi * LbĉPY4?CeYUCC͞={PR!rAuTVV7nݻqꩧn]C^ À,}_|Kd d岠jT .n NX #`Br|qW_ evq‘YZF8BT IDATyXB'rs)_T+DC`94$,.6 $'ϝm5"0+sqYwsf'ŶeXSk 8 D+SBI"$@pE]3YϞ{nu=36&y#hYGY % #'Lr:\klaxz$8"zg^dIr7~n}ep[6 e),= =)OuBVl7 7|DUأ.<,mBӮQRV ۃHwV̞*Z[±Ne`Q  L}ؤ@u {`m=@<҉|p=;ꂯt'SHoKP>r ZQ^Ac{c#Lrn&Luz7LڟK3ap{0#鿜,hD,͉TbGއK֩}gٸ$%A~!5=ux_~!tBMe&***i&TUUa„ XlP[[ I `0X#4rM6sG}4e7oFUUƏwy9.D"YNsG 9g1e,?K%Nev vp[:d lap^ ~A䀶DŽ" # T"O(`%oE޺iܤ\mO۪T+ulيLʛ^2>9!B9ud"(7NOwO␛W.TޛhI. 8lZ^0 I` -9ȕl-wI^ GW&n,v</ަ;*;{aҋ'H7uc:mcBMsoZsg-LsQlzҰ7N6+o<84Q] /S eu3(r6%LR-2#As'lR4[c@N}(+-$,hAQ0 :. Zx!BJ]2wxG>ڊ6G[gϸ;K$1@J~Gi,t1fJuX Ӵ bCUڙ]\ 1rq%4aq_,!@VTxLr@u x䂢(}g^t |Œ-S<) :S: Ë|]0u^$t}$Rz;ai)dY큻n:7ɝ=;Fy\RR;PRFWg7jJ4Tn 7M 6XbXo<.H po)O8& nc'rѺk+dE2 P>ᅧR~ە+OG ᫙O^8gSITP1rEôF@LM@63ضf_duH؄׎_s9 cW?u zo ҅?*!C(ʠ18p84 l,㤓N[˖(P^QqHЀk@HmѢE{A4OYr c8n?oP(`qEQ~{Ʈ4`nژU]RYmz\. %dFd 0G{13V=%8^QV&_DFRPn*KP'^fCh-exH MA VM`Y1-K>[+ QЬQc.NtO SclVɤ:%hJ< yͽȣ`RaMv)0e(617U3' fjޛ~{F*BYzN vWxh)7TX 6 ΋*B+ dYP*ƌ{HCJ;E%R-N짻>RyPO.=j@yOv3={c[kTOxW=Fzz+BN^UqO/vCw߭ ?mUݭq-d.) ;\f}d樷tN$,E r wAo,_YشF쌩[RY)g Tdv{ fX B!bato C{ @*Ȟ&$PEqD'\rN>MD fs]P]3/,hjQ9ٵM$Q$ ʎ$Yawn\Ha3GuXٹ%!ǐӇJP Z7Fw?2!;X׍0',?᭟l@䐨gJ9 [ZDC!%R;Sk ܜGE1O9 Ouu1:Fq^ F޲  I&N;vvލf8 (K}Tqb˲$I޺;f?]d8w"* ۝aRg{ʜ}g+"bb,-_Q1Ш1!آ_LK])`{);}f(}k.vssriPUU)'!w*++Q[[ YM6H$BF˗/a8X~YoƖ Q$J4 4(:ϯ#I1б<Hp ,@AcF"_'F !MZics<-":U.Zcj (Ff$kiC@]xu%.%|3| 17 5zH7V&Cd+QdxSȧ ioLY$urbl94AW IuHz.ݸ#ϩ`$ Fio@,(E6mO[ ʞ='ř3@2ގ0tDC4؎Ma6PS;il *~}G&B(˂@5PR PB5Tߓ`Ј Xt-8[ސ6 LC]D(Fľ˅P(ݎF4ɓX'|92衇l~٫F'N@b lv;8iRǚ5kh,#fy+nʡOrou?7u-|| DJɻ8oN= MPd` UQ0B`x PJ*,Oe{"[f/>V {4a7eUXDzm#?kz2/?-gpN}dnSm; G(+)!&3h}7IBUM4$ ? >^f=`ATs !NvjReXA A:֗5}V'59>g>$%9Žؙ`hIFHLSFdf NHPh"P-QxU *CE *D/sFzK:2 tFcL0CLQP)JJҹϿۣn~Vޓ_{g74.)? _p:@ &#ITN@w@4D231AjgvD}1ϛWg@RA! %fD% a.>D>X/h`&`K\G%VǠ rĂ-vn?n `7qkS[ZH8U#Z.1z iuu\P=CW~m:]ZCwBcFDj= ~tt@w's.QZ'Ə$;had# .Ƴҥ(ݲgo+nrSI Tp "ϤjTUU EQ 4Hh*hqA|Phа,5J 0G)lBUqE{^]ޡ aX'"Oe9}_ Kb6@1 @UhR^hqޥɘ~!X]8}xĪ7#9{&V!PgR&D81gxѵ?|݅Ƕ3^aKƞa ʑAGB}҃'"Q8jeMQ\^^˲Lz=&EQ   h4b0 xg 28%gx_{ ڧ=$d(l" A;֗kCTIWw@'Jle NIDvaA%4w7~br.(YPׂT+J8Q)O8RYCri6Lbz%#Ԧ-P'aY&޸ac;.Lu2ɠCbKE$ *눼 AeQ vPR*3F-)S HDlOCj.b_ȹ~ڱ[XB%SM0X4k($wjR#zWATeb`HB%^>vLuhƒ#؜3W?YWYUЩ L8@iI+rAE/J: ]kIP#XR `riP@DlJMOY} R5]hhN[h UU訇,&@ج欿QC``a5n"*߳YB,kc|*U%bzoyC(eV(*:v:YΛ_R*47~7]=˲TRJ* r = a91v4瞛X!7XFTUep=R j`f!g7X*7NL_Մ"@$Pe+r fiٮ2(e{*V`PD8"γ#zӢg|.i{C:a{\s4|,+z wv6! iEhP͵QzYPg@:Nr{,&&-ʗ /mU Eh&JQϰʏ M<!hk(``|zi%"J2g|vPhF ,CUbbдlx, oGk;b"n0ߖWƶ'H,a/B(5h6V -&~}ҍUm$E*  ٚmjE IDATk# ~[{gjg1LgJ)FG OcY%Nd=VҾR /+>k~kN qsI먑~p~OCIQcc26ɴ ٔð )DMXQa0*o45IC099(!,ΗR՗nZlˋ~X,,Z%3J_/8K<6w=`K9|g9_uXu.fe4F#\] bP( qMJ2%*,&p <::u3^$%ݘth\椃XEoX5h0F# = _~XqSZM/8^P-;+kڒڦAoqRN@Cu9D1Y[@ĥ nɤд8D, HUU4 a|~g>ۜ>>}=}Η_2 tx0H?VӾ8;D! V>AD%T9 I)]?lmZNPȟ{4(ׯtP)>{gǎ4:woy9MZ[ZD­AYڽ6&*a]_mj `E/\.`߲oM|{*jh'a9nH`u!e==|俱Wܙ`U: N/䖎>zy'  >oaF4IM(ѡz_6ӂGUTTlv:͆B رGZ~Ov9_?v̘> "PN EuuO? G. ')0B(, ! R5*!嚥u o\t\|ՉCt͗E|ޖ U7VTTla96oO=ME(8~]-+W?ܺu[oPXX@)=1U mmm#+~yՁλKKph7 @n-|XHĐ@#XW^~edOICv*7|{sۍjkSl/MU447?qۍ]ԳxyejWU=*L?@,wsI~X+Wx~<،H)%Z$}ُ򚚚+Wd1(,,fDBxRXX@N'!o)0Mu!Sv OH3:ZR uPpuɰ|2:-JIR"G9P2aAS/iu aЭ tvF6_Xtn:cw|w1ݾ^xfxT QeG}tQ8He3 _uez˲GIfYUz-cUUՈz{$]&"zZ}?\s5vXilN+ tzRt:7{[# g'ruФ2]/!$͛:N:7ݛrr9]keX>W!|%z`XCbl'фewgHg0?>'vsg] kQIO sgOo+~ͯ a.p#A'`p8˹`Bccc͆D"m۶,Y HO l6b+y7^馛vɬYp7cƍhii^hDaa!9qujrD{? $P)NQ,M\LQ }6nVc۟_PV=p=E CDd> ¨Łr,/0/=NeMQ!#< Ko=y5r t8ttey< ‘(TUKAdR;MFn~)b1 ` 4qųxW³&]o]t:l&=(tƫ+΁lޠ'H< T8TWXA'w`A =f#U9W~~_(J)4M~TU0+zQUU{2eh;}V\"/ϧv ʸ0 bzkf̘@ x<M`ۑL&X.H{c-I&+ IXsOzO.zcX5\Cl6E+W^*vءEѳǏ3f˶]?~myǩ(& Io%@ѰZ-k01u2x^bDzPo-TӲ&OI7pEAְyZ A4E(AoQٌ| =P5 àFAȑ69{Yү^%n V=x~+jhb0 ^K= @~)TU=CX2C4 X y* !dڡYZU=^sbdYG˅i'"UxJ}iΙ1&v,(Ox{PvVlY6h 5}t[iUW'ˤSp'&쑘Pryp_mq/Exo :Z¯uj!IQB,Hێb{.Ihr㸜ydYA]w6(%hlcrXX¨Ӡ; xu.]{Fh,\{p]?'k`"RAَ6~9ƞaBם)P0)@5:2HU2?łcWzW@N'Wpi|k`,p.YƤIpgg-{lFQQ&Lw}GeAPKK <h_sVVV(T(b,?(lFaa!&L{/e, ǏGuu l)UeOse.;558s,(;OpΜ3 އcƠ 9jAx20qxX"Q ?[܌/Ɣj9=5c>\zy /J&ؾms77 9ofO]B/0I[)+'z,)k|JPE܋/mJ噅yŊ/P +U+ө}~6zAeak4,|~b8K`Ƈ+.qnpFCJ3jf{5AUSfFG0uW]r/At+9D1WW׬`m %>-fi!,P+5xt\WX455K/òP5 a0, a}vL4MiP(f݋?ׯK+Lr7p---% l6gMә$e޽\r ]z5e S`1^fСC8c _w,ˀXػg̚Ca0yͽVe76(;f lV+r 3AA6B(@}cS6ʯ?`E}?$ ݻwVw\i;nõk5c?{lmU-͝M3M9ѡ=т}-r$ &8>+niqwúgd)Mr` <3>prtQJ0[,¾Э^yG}ﲹeTz /OөWI0ilFΦJ\h"Nyyx=TpKO uvK~`׵A"kg/ kp:OB1Ӛpق"\ 䅝Tt3j$﯄Ahy :t CRI51hgBb8¡0˂cY$Yfĥ,шX4320 G56b`/MQI@4$g1sfBc[RLBXQ`JR `y6LW@@k3GӢB'ym޳+3'lWЃK# 3T`ϴyoá(w!ܼi+Ej u8ɥ9/uu5#t i]Wx)ke3 B㬳¨QsN444`…6mn B)Ƹ1c* ЏA9Yg:"_ ,mll… 1uTlݾy9zk1vh ?655֬Y8s]`e6qQq<0X^4sk^_q}ǻou,ҙvr8(O.,~w!i --nz, ,/pƲ,BPZ8J\QJ!DQAz|v>6Bޠ#a6{4\}6554ؙӷ΢f@6nb@"!bHXo|T}g4TM@3(JSz} vխdi]O=ݕ- [0cG[p$ryy7s45C/S72~]F,f.P07mCP hF^4 ./uuu?>xG(7ok! z1E$޺R /-­Ћ b.Kv#T.oa7o9aL&aÆ:'NB,FC!{?~h[nŢEz7nE p8H$}1o޼A=-XR@!5d v ( `ڔaHʶX& fNG.B$ B !#e lQ NBE1hp9'Lo$һoz;OM|L-ްtM u(;~Z)|Cq8(P,G xp*e煔C:`.kR:^IYAx% ~ $YK0_zsC]puo}Gv7p♨kɨGˆe)L`ƅމX<W"0IdEg/{u-Rܹ;Ri=\k00'+u;ixlB=u[CKY*n~3PPDqeޱc8 Ȳ J)@6{CCM{b„ H&Xp!6n.(w^TVV/, Y1{l^ٌL:!",X7nh4 /좷 f}`eMm߉3(*.s0$IFKsfN-wbႹyM%t(*,Fk[;>ovQo3O§e~f"g<.:Ǩ%po,b}(1& T 5;x^1`D'^a[tX;+o./oo%`"zog> 4VF~56#Q&BBĩ`b , 0:-ǸzY,A@K[;\"XZ !TE$%Q(&Г#OxKҶ9M ĺU}(kp;A 0$$zmDbI̛>f6?DI| xcXqS@%#u1( Dȍjb`2EL u%tuTA$*,N[MAeh9 4Or=I07BZ[[1vXȲ -&a֬YhooԩSkD"={6b1.& 7oS |sNJE!r<~?wʔ)xבǃ2$.z8A\UUݻl~+YMK1c}. ?M\ρZZ@ `hlji=N0 JrÇ@g' j{ =z{o.Glzdto|8-P `+獰t 溶ks'd}%<<"(M~RX2%P ~# T3j,?W/\PN1)ep$aلH4 YQɱRH Q`52OxcwtłV6cjn:{ʚ6Ι6y.+N(SoJQ LϾ^=ǰ)#!7zK{ ƪs4֝: Ř>}:}TVV,"S?0C5wJ)0aBg}f{{ٓxB޽Ř6m>#TUUaԨQG׋[h4t8{5Mc9%>3sM qwYifMS,bܶdYycܹ~^qMz믦iHkb154`t鈣"2= @':i*PUԁUiyӦ6!M&DL&I}Hz!Ӧ7ŵ^~S2,'h c@ym6+‘0$IDz0MhkoO,]: )v~H4G4ˑW Uʲ lz׶'}~a=yy.g^ބ_Xz u`p,[dqZsh[;X4 p5jNd"c{CTR<- 5M`@2D<(8sq`~B,C<I$D"ٜV%\X,9mذE3z}V8q:t(X o6eFyn)p"ҿzϽUQ&M:k?ࢥ#{7ޤʊ1)"`2`2ClԯQ FEŐe hHy.נD!b6Per'x9Ava9N, E2,t<8l6PEESs+.' 1$"O"nh4 :0Gř ! :pmܛX̷љKHq =MmcK2 YChVHBU9s{PIQ{uiر Md:nd(UUN$q,ӧSLC,Y h< h,l6ypPUeY+W>~vZK.!ɴӦ S&OC?JA8^/=&a9EQz#L&XCKK..'̒p$`(N TA$Jc${T Fo"[?ju`dX |a OBCt`X lewür\uEn'T>L)MB(nGCc#ZZPTT `=-[/ =/{ H,bnGcSS'u8ǚ5kh,#fy+nJCȩ+E,y.IۗE h[o_F$IYv_EQhOi t<tfS"7]M|%dCkH0a|rjR :PЬzAQ#GE`1`1S ÀpdEF^>xuEEE?p7j̘1o5j:y {v;'E#f:]yKnUF>6D-99z$,]cy«vLa3KC&rh1?oYU)4hdx}qi}w|TUsnL$$$PHQA]"ˮua,( + *RQP4)$!!!}2}{ $!𹟄ss=.Yytr?7L\.Ͼ?_EUUx<ҥK^ ˅JqF,_t%J rmD$ߚsS] Zgo:_RoTd$J˃_FEF$QW*>XG 6G}`^rq2'u QhU&*hsZB2(&V+'`|>XU(++$)yalv˚3_[ԑwCXB1d`"vÎJ\\w>>bal.DEߑ#GDt:*dYFUUVkP0 ػw/z=UEaD?ͥe4+wr9q˗/'aaagBHYYaAӧꫯr Eqe.<_|̂|MJs ?Y [Ԩ۷ jVcHr? OQwYq}A l;e1QZʪVy#ĉU_XY@DL3 pJJ@@tW ePp< @LtĂmՆ+%+w}жھV>~7?h@?V'OE]J>(r>ZΒ *#z{_(o]{!w[BPڂz!VUL\Kyb\l3<GWbsw_VVZZ~4UT CB& 1a,`-aOx [Ogm6P>`V|O_x~r -6S'! XoPB%X*.77فǀ&4iJީbwaά]&̦bXh߀o߮4h\'UR4dvJՙ&BquGٛ-3Irk}e3BE`](((9sM&SJ ՕFdK,VPPnAA8]문:1=x\n<nv AADd$b[.3˨94yyHu.>7a]7=[}*Ək~=ڲViJғvV<;񁄂Sd_[QUhFP!ի`}QNJy&O\\N3\ %[`A~^ŗE)mѢEױcǖAUIPJ?( 'lUUx:@]n#hVNA( ;U +aE8褏?2lX^^VZɔK%'8B8VG H N_E)TqéR+ZO! uoSqBUa\.hZ:ydܹC=c߾;n^]6U_B6nd6m0`  R'Z*$vVziFD-0 F|>>xVhG`1CPRZJiɔՊw؍aoQ^Ye 7pHhgA\Ll؏A:"X|UNW9Ԅ!o`10 ^np9 |Z1TKĀXRR훳e˖)͛7_Rժ^s%sO>}^*U\=f b!ޫ*<^/$ybhwFBDEH*9 ErDNqsHwU8Uo~Hĕ|u:ʚ-gc0"ꞧ&X~Lo;p>AŢMOO.; 5%DB(,3;nSް(ArU\Q` h FS_}O&08.\nLAɣ&lB>1jXe3p)p'#? 5A^{1BA)Eل:'vWh!)@F΄"PS0 xZjzJjjeWEs X^IBhy_Bӏ/;ZQ='kדmt:ݧzt9)'v$]q9P2`6qjl  =p.۶m{!++륑#GFadƌ˗/oΜ9#|gnEl0]vv6gΜbbbn3fL$I"XjK7ovu߆ r-2d۾}OCs0dWq/S;<^FC]OŲa}09߰:tQRZNFZ7(ro{^'9Y\e6:n~Rtx)]5O7C '@\\~_A ,KNV=NM̟C*9sc ޣ{%vd ,`5h}65c)HMM%111u֯m۶C7"""z,ZhjnݞӧСCB0vXyӁoݺu<cw*p" @͛jNԩӸ$.!!!x SRR>jӦSN߶mO(둚J(A 7!1ibɹVfh$ORJ낪Vp9!p8P(TATD84"K IDATCDX8KP%xQ$c.] .Zxu=еCdHbn~OU1ѮM,BcbcUV7ZZ>y'+BpCh(bt~l؟~;[{諏ދmqCc FdF2/[٬:]@o|g[h6fAkzU4UXX85~ THF#c_ҵk}G,yɉUޢ?}""<|֐[o͡8Ng6[Z-1aL&ǓAk~ٳ'Nx`iTT3QIBBk۶-wĉ W~p̙K( &ɢy1&̜9s$IǍgjݺ5A`cK.%eee !{NKK211qbv^ÁM6A̹sDPf@9HـR78{z^?B BӄUvZDU+wu׵nM8@@E.W"%۴-#َLj9D[BY!zjӍ6c⸶P(D+!ĠvK0p)2XXao=#0zՆF\ 8'*kછ`}UC1z.d46yNjvW V$mf"+BHr:*c=CBL&^kՂ${tXbIqq1^/F1bbN7쥗^3f <ϣ]v6mSN͜93k…D8pv3gԩsӦM3k׮z$9991c|^Y ,1bQFi^/MVXNݻC=Pd pY">2n^1(I nBdYF݁y.'O&a()- ~A@D!|QF8|pJ*B:}nU 3Y%1Oj} ʑW Txi}܊DZ  PshI47e6DIcpj;DTɆ`'>(*TVZIZQGJJN}jq}=gߘSS_c=w%u;zͭ1"t6 @EVRRB jWQJOL>%8oFLLLl6H~~NA'%%e&͛7Oϟ~Dhh(@bbb0|pOJ!V`d||<E @EAPTTA.?7ha/*M{In4UM1d48x<XlBqIb-ɵxXQ?~z`7ڱ@m[G}GrH^~%0tDq(=VxNFaq%.ڴƑEpy$Zб$9HD?غ]u{(iSijaqզ@5S~S `@ ~? 8xm*w4i>~'3+>{ҥHmj42Ю];hݺ5;v),,$ɹ }p&):adǎ^J-[4~x+RgЯ_?o\tҟ>|[jjꗃ ߟ ҧOֹs}e˖㑑3g;vl`hp8Î?N+Ad9]vp󷇻|hsjE.!! FDeEx>'N8|ouaĆ ~T(s<ޛ _v܁{?8c)kC>h2 <F!R^ q1Qia |>k%N{Ou疤Njխ}<3 C^Å*'; ][q`ө 2NV+qnw5p n~mŜў8Qmz#gJlDNMYԫ*TD18pWs5 v t*++W?1;vF >qUNݻ޻ /~McdY~r իKLL4%%%/6l֮](\nU0Ÿ9ҍӢ!(;1pDEB|tz4!(-O!2":6Hc%.PEnMALT(C-AY)!Ј4M{B bcg0?M PKMi  zpeqT5c=}Wj&T\sPef_g)S.9sfZ<jAs#GO?\^{cD$$Ih4f̘1`0<3lذΝ;s#z^fdee_J;wx,,Xxqn=ztprAOzzg111 MR)T@cB^{W}Ow寽zuܙiZ=͝;7z1O>꾨3z>:cy*-CLT"#PZVS%z=pp ;\BJx^o"OAXeȲ-bٱb̈ PX\)(^A:ҲJ"+N%8v%]fO,ദ)P5P ֵ\jE1p8Xr%)//Ay~ȑ)={'MtH | m޼yqaa={ z衇`2B)epZH?⓫KC  NEhDGfB)4J7DB9\@iY9,Q*`.M2F&!vAN+#W(d p1~nڸ(4Օ}1q)PJTA(L֭[wh4kڴi3 ZݻӞ={$ ~w'̝;wiߗB8%iE@DDE#447@((m F&Q00D Oc mRJۖXv>nE'U]o?'RV^`/֔'E᮶w*Tnztz`ܸq%vL8ݎϗ-[aFDFF655(\l_0NJZRuEHun$I!Fx8]nx8 u[o$a! rOZb}%-;c'KVfơ9a#4#ܹ뷟N?(mi꓃j>QBJT4 l6ېӧرc(yd2!`,;vk~ႄU?w}2ə!^%p#UfpH~|XVWimlڼx@a 1*3JJ)cz:U)A z 4'F9wflڱXXRSN8ݏ.VgQ `hb@߾}}ʖm4iR]PhUlX[:@K px< lk>c,:99ɾ^" z"[_jΥ( <^Oϓ V~Vmع[{g[gd cՆ]TB%X*Th*S@j Nԁ:^ji[x[nE.mBJTPєgz;|D5^ `ZB `PqYv@: ;4"f F`'<Gs/yG^>ŴRB%X*T4LAU4 u'Pp8|Ӊ_ TǴ ::(I>x$ ^IP&Q J(jDCyΟ0P$e \q;G0BJT|FRz11hѢ2PfwPa4j[]B@xiYl2,ӿH!A DJV8n8h LFc0t/, :A>*TuEKKI'ZkR<,\]RRRA~d4ĠvhVʪMc-&ߩ2g?]5UTwB\0F|P_ܪ ``a ?YJ)BCB5`nM7w.WgT `]xc;=\zp5g}j)s uʛFmq1&̜9s͛x+LV}5DpմdWje &}xGXQ9;bHS?P17ʚ?vĭ;vk:*T&Zqʍ7+/))qKߕ+Wϟ?vk}Z-$쀌 }ӘGQ@gΜ9sOYtϲ,;/eW'YQNOx_ZxnybԹee.VҊ=Z4ht|߾}fPJ>}@ "`8nB Q~жA.[NjWW0$p6/P/ + j:`n}j^*:_ &v!BإXFƧni%;vኢ0-22ҧhn{5d„ t(**Bveff:uŋ,Zq^/$$$۷A'dYƮ]D:yܸq&8p RSS<~xqH %mj0.[n#/Z@Z[ FdkHcjD |QsvRɨG%I}we ,$.& k6Ǡ~I"vӡ>N'1@SH^ D,*9p`A񒬊Y\vU\*d >xO=BCCOEaգÉmR:u*z{ VoٲB`2zj믿{nN{t̙iv=v\)߿?,_]ti\֭Chh(4hvɒ% !LQ.1Q*ۨ׹=}QER^sE/&=(,.+p'50 08,UVs^ Ͻ^)M# p; 'nSb6A ө?oݧh.`,j(X=jH!c T;Mq.0 N/AU3lC"#r{PҲrDFP BBͼSOcۮ#jBvUZm)X~\sO ڳ&Ӥb޽yyh[+FًB]jkSy㹹+#1u'hh5 iF0Ƹ ;tCIIIzַo_l]m۶#55u(322n}cZ"+Wqƕ;7 =:m̘1@|>OѧOGG_ʨ*IRU9=*!jECBjj)[Axr#4T+Y;R߰aߘ:N=8#{[o%h߾u3f̘AyрPJR=.X`T9d1EU.fi^/=YZ.yd2M¿?3x,W^w% nZvK(+#Dg.mNqmP \ WBβr;n FtzvorCgo{ڍO&'z^6|wRUf_tƀwg*T4>RqsСCуǓnݺ=uĉwf('H~򘘘={q'Qcʼy󆊢x=RPPzV]9sݺuK'N5Æ 믟NNN~{ψE|ɔ$ h;ZQP TQ`wTeXp׃ҲJp :: q-bq ׵ < /cQWvxn%N#w߀]HH2B Z{sA^A9*n4 : 9^*mTD=D:IU2uoZeS۠8U4+..󀢂/Ucz:1ߞ[thX>}SLy/ :bavZr>6mZʤI McCaKΝ;L<(lժU6mMKKrĈ(((=dիܹ3ҥ_7o޼gϞN)=2 |sTȪT:bĿUmZqeV'P^^19,C=8oe: =;vOuϠ{sdž{2˯"w :X"8J@t"7 +tyЦU4-WYQU BSVcM8mbOwզߚ@[6քT/ЂKXcꒌI5wyh4Nӧ{^c5mܸ{UdddɲS'&&LJJbرcFÇߑhh4W^yv& 4R*_p Qp8XT p1 V}N1y Di@(Ј"+*\mtA(ض_c(rJ#E'k((vIp8<GQGO!HeXQQ/[9)Vw%.XYO]~Ghe=?P15m,3T֧/;N+Iu>k5FVK[nsWX1zƌ?͘1c7 E!{tB!7S`6m<ݧOpf,E$ZDp.oam}7`[eykEx}Q 8fv7v&޸yokw@QUBކ wd&N*.`9Gڵm!+VE|00RE!cƌ)5k;˗/oرLE#&&Haa!Ҿݻ^I OL&[o=?`z=Sy~ܮ]EqP׮]Q\\ A@JJs:tw!F⡇ܹsg.[lsEQ,VS/`>(?ǠV + VC͎?:W81GeFC-BP\RpDFF@PUeA@CIy|1T+r"VA)ZuXHVM)Z>3 GYLd7D ')Uv.:PթՁW [0*Fb[MII_bNYY4( 9s撕+W>e˖|>_U!IDQeizzV}ߤhq>BU0)%B4|T>! e53 zh[ƣTv" E+*eOek6pbweٹU;nTgjTw̝eBBL_lS\kvx̙3 0q]C="\)LzNUs#΁ &sWqno"$p9h4(@+cx-baw9as:lI !1@FuIv8K/-xOn[< [byPQ*TuNS}+=/$M%XL(Br˰VU!lx`㕠( |RBQa=y|ٚ-y5~9B#"#-yꌪP?=@]K8\Jx*ƻoʶ;UtLϖ$a'VQeQ>A}UT^EdpAKMQQQE%"( Yu2z?鞚d' ITW9Suzֵ=a\UVݽYs?Y*P?L>o!z_įR eYD#Uj,>HۇpYy= } n\DxffC6v$[''VYq! 3\F_'X>e|)؞d;:hN0$2u)9[B筲|Ç`1BDfEas?o"4&¼TnjW$G"BU8ɓs2)t+@0 -y(QX_N|lE'X>v2Vh:c[q,^~}Lyp/qM\;iK|OO ,jR8c;LNhnQ]]S:6Iɤf\{ O"/:P_>`0 E'X>wjBQ'O!rvODyW(},;_2MIJ؁uygJ}R@0DSc`6k+8uuu԰j:\jkk8A⽙H4Z1(!OmX MMo˴7l{y-5Zq8^߀)ovb>:ȫ Fsl9}Ow$DzeNEU*p v Hgqj?$"akRmi'j:!V[ '| F;MH6*x";_lK4 x $gD~[h: \m!y? h~5B6}K=GBbk,.S̓[з>Ձ]Q>Jx; UeDy]%ޛ %XQkV4)ڶiSXr`p8\jc~k55>*,cD&g X\h = دc~:8UI1gO@z5*t}odl9|gq`X K*C-@$Si::::% "mY . ."B(PSSm[ض ISJDOP(TNTa4`6Upk* 0"osZ?F+t,AXc1wv=\ Z7F[xrEky~< kVhVwO| +$R*jUemȉG9ǩ#<~ôy. 2wGb社̇O|@*h@??˼f4X&,=8]=Lڂm4Mt.lqzqIgs9Ѷ (e綕"tp]˶a&wyF{SC}ac'?E3CF&xInc΋;ׇO|\ 5FxK,kX'wMcfʲ=Z\.GGgӦMR%HR"3'W ]=8͚u<ۓmK8Gf*ZhG9*#Y y>vwq#Xwުxd˶=/Vj2Rr\4ͩ|.- nxeI^(+l"4ɲ`UmQʽs5Xоn]=454rwә d u1#E˶il'JB[[ '/:|m 5hۑ訾r4\pμՃzt1!tEy7u(ǕDiSUIjS CTDu癧,l|i uoH$? <[ZfՌp8|{āO?G&Bƻ4W*j*4 #tۮ(,%fd<ɽ>jo T"`;Q*Fy\WLAJb5DQbd# :{8|?֐:l@DeO]2h5Zv֘͐>ЎG NJo \R9>h9DNW~6:EQ|Kё>?*N8e)i -^5 yfړӧ%[w_y57\~ŋ;|}K_o}="C;ޤcGV$WEMVHָ:om A{OI&HD l&\W*7 ޛRejF%H4B<$P]h2ɯ5B_U>aݏ6[y#,CD|2y9pέuр}O>tz~HGHl<|?D,lG'gۮs!*SڋyD8X eo]vٹiZ.;|ʕy,ѨzȻ>:i v̝sĄX˲-\0yAp#V;xplixͅePJ{E I*BR,[Q"0hՐLpP(j(:wv1yb )]l&˺ XMUUU(L*:Li4 5Ok< 7¥GQop}%[f7 !]h3ީh.D @;1˸[In7Ӈ_YeHyF;wt~ߡ6NңPYUE 8ܧ>&X#]܊ģ/*_SS]m;vc)Nx9aMh"EcafH,j؄ + *qaIXE*˲hi&Z6Ӵkf@ 1Έ7m!_ ,|>OGgSN"-f| mk%nD(hhyhg/#. \UBU{Rth'[ev.1KO|! 񸹌sM&mgWшMy_6#F&W "JTX؁_9uލ6檒nQ/d:>uҔi+|‡7ҋq=g.\5o}t~flwנI\JK k"3Obx9Ku,Bˤ3ia]&_(t3n^5x.ӗcS n>LC4-[vW_rYmc=y}ͷήjjۚvn)MV4WNH`) Ykʔf|\Ld t Rm;(&Vӛ$1ybKsd925Q'WPP E.SJ*~!:52HF=$=_M.㿌^zWLZ хI'Xd3wIָ+qt `N ,!qj1(j!V[M7A}] DZfs"JX_G6T-KM*h]DJ) F; t$OO1I%KF'PN* ~Rna8o-dLrz; :~GR ,:44Ѕ{'X>|l 5nO50k{{nZeZF#7RWWOcc\zq]CR)D\,&PWG\4Oh*Z*.23/BT1 ǣ2(ӏf~Y6XeGG-fOyNt05LǠ s Ò, Б7IdYؖE!/i*BSn}+DX uu$i q]MB~̧4[e2b4tdf_.Aihrbˌlh_3ߠk:WcwV#hwqT>ZƯS,;,挑0ΩS.FGG|ljRa;dEǶL2"ћǍpl,TQQ(geY2 jjlf}י|V$w9RӗbK,ЁC5XŇas3 ~dٯ;'X>v\SY~[1}"He j)٤?@|d9sh蠫Xm'qljkFҙ,l|@ww.\oͷ؎C0`6_~o++̽Y ټRKb1,>E "ߘoba+h%W|[ߘpоXZٸl6K}]d+7ؠ&VC4|[߼|/_#ƫhG)г>cGGG',_<:sD6'Rݧ LB[F^NG^֯]g\2:}/ \c>EdiYzdfRl;W}-2}v߽s Jke۫eV蒞x{{%NK6\.'BafL_VqZ'bǸau*%dmKo,[d)Yz,sgUDD[|OwR#-UU{E^Hg6w{.D"!=q씎.ٸ]Z6ʺn}tvvI.+<乶qSl|*M?*9>߲ˬ|Oz[(ܕyïh[`8m;\Y}>28w>oꛚio]ӏ-x9SFӮ[ض,`xױ, u8u:˖.%\ US:]HC:Cv*EWBm}.${9|yQ>p'itveo-[mkM:e]J((8N {XT@.NM#jKٯ X+~ .zRjOPD.NVJ}\)[n9`ĉ*u]<{wg%N--,D|K@P`7t?˲g,tŜS޵3Jy8# w` +fwtxo[˗Ͼnr|cGƒW6D}5.N4F ZOr2r gWm"XD'H2"p,Ï9Sx7g^'@vEm LBs< vR֯_ȟRO%B(k~4qJkR\NZnJӁ#Ed-peYDd t+q]w7"rR"reY WT*5k%fiy5X ,@thf \oU1]&0-_w; B9U|jÆ _I'|x4TrN 1'}^zI3!ZB TU,e;א P@i*Nz1SYW xl6K<D",RbY{VF;0nwx =]@eYTM7 k):4)O!u 75%ZSk Ň nsgFP(P4_ QLD"rRpcJCoiSJe"r5Lx!:pRAoǔR.+hGR+Ѣ:X*"`JJ))nKLg̢)~tfJME*Ą s& .6-]]X"Dp *p8bۛ (ͦE|k 1oH /:i3ކxdN`!)` b[YD0 M>lh3*1rB{WG}ϧ>{qM/? u8' R;G~D,t^4̘6ݝ{vgS8}m)L9hs;#˲fx\vA6\1(H%; 2"r pxL)q$pRx"DVJ} 5$BppM~Eiw`4PJMTJN)uedY|C0lHTDh̭Du݀ur9:;;6m cRP(4751X 5jb<qvkͺ"}ZYmyf~e<$$)lnϡh֠#[ˁc2k&͡ӯ` ovl_;؆.6]ԾvvgH솕ݸV/@ј!p + 32ڛZl>`4 yutot[(P_O?'2̭P444}ppAcm2uq .u8h6L Dv1qV  \>*({>9e¤Ěm1}=}i"isќGH>Z!Q-ow; !s=hpwt5 1dE T1x 9nW:f?E)uCDځ,kɖN"2RjCL~g>J|}R' b۶Jt:M2B@CeY455Jp]6Yz>߾a4E *M?~GYn7C>iA  ">F6|#h^hΦD 3:} ÜehҞ\`H J?6FC)~!r,>|uPSSe+V&͂\l" h4LJ7>Q~ABfp,6 xMų؄֚Ϛ+7=sz7̗/خC!e4A/VJNO,O=wf7ޞo|ɩ|C}CDBJ㠾qyTJD^TJ-UJ5"o)",kDFj$1 : xp![ı^)ɂ 9L)uE :UA"H)TWG);qkc~j"m$IbjzzzߐYX;Ͷ~F 9}Q7GHp#Ua֌= b3mVi#m>#}}ŒG rk%|5:̻q~KKK:+g[>SO\ɓHxk8jBe&JՌ&Fҋ=a8+^%#V/nu͂ɯz-(UL)u RMuk]e*Y#&" &0$"7=JsБ\#VdNj "5@^D.PJŌ P4rL|/"{<]`wRZDT Y'"1^gv1ګBU!C(Y.R(hu,kI&V8vf6*.>/αvpϥ9~ՀhF\LyG;n^MN1a 6rU.>jƀӧ adBVY/՜op#L9oV,&Xn2uʔo4wǛ ;?w7ݝ44XelZZfQnEkC{to_,X|2zbyB̈zT:nϣbGSٔ'h>iXXrBV&<ǽ{#\|͞.Em0rhov֭&()Dd$R"GLT\7Imx[4ϢbHJE͙(nNr!ȧR&c"ry@W)8W)u8 QKQDG)vw]weYiqDd'ttYJ)B)5`W)DBTADzMjf)hޗRЉe!"RPJMv3cqS'$S)-%U.4%k&a6&[6piPT:MuTtJg2؎= VqN=/w0`}h4B(܇JӟoXAiQCz~m=_[2(\J8١/H~l~:m9CȪ:&3~`(`xaϒa@[y0w"p.7b6Qr>0N9~&{J)''VUX;^}{.igw)6R\HXDV+"2\VJ3aIDATڛa|ebp^kJ,AG EzϢ*+m;3UJ>O,Ö\jY!/Yx͠K)eKR5u2RjRu_ȽVfUJlLUDB؀6w#tYh3\PJ=yk2ï7!f"R]6!nR8J)B+NKK lN&4cq\;Pp],3ny.^ |T;Љ7[ qڜLBvl0ڢ!WЗ h;Ў0>kER6}~>gy0cwm J!wv~ܧ>D٭n1Wm1gs۵GPVK>!'Q(LMd6_cǑURͮ+=sfD~f~qq'RBj2+;HުEeHufazȉH`;WJDgt*#"T)3zu5hJ\})^WJCǔBDcyw]),BODLpXc yǦ MqtQ5p6pSpst4ڙ<9! 8s$CP2uy3GuM1zmmhGñ"^3hE;}\n::Ųȼѹ..DV `C; qJ$L6+B>rʇ@vލ5`h4F`}"RɄ.5pJ_{9ZW^xHM]=>hv`Erm%e3gFD]]wy2  Lγ樂]/[dt330ڊ/I^DR)F@ё[nWJ%M׷KL&iP[YIiR Xf=Ʊ*Ppf46#qgdj#@GpesDM=HXo6*h6wJ`+hm.SgݻNC C,^>LIP~Z ;J$̙_e==e爐jᭆi/~ToPTD\"MKRΜ}#>uW2gFϻGn DGypR h#"G(jE{\IBZ1EdR*&"!t2FhWUpd2¡ ==Tcʲj&LjiGԲLj@_AB+/qxd5cW7rsFGVP X˦7[|XFl(&V] :t ob/ЗǎL\Qc*_:nۋ`L݉@8LH4\NSZ>壡epgs0t1 ңckة+gu/.۶qW_]J{Gŕۋ`2X)dӽ% .@)Xq|1kPG]lWz>:w` x0ӧ^uE/B:9s{;}E/]dz6"|rU+mcYY6)^z5?Z$eh3>104 L[xWmͷ޼zq{;}E"p_wD9E R ѨdY=Dd@UkJ"!*S,֜f  Yqgeq5ضC>ck?Do3;5+T*ů^ʆCscLX=5ˮfN;]8ܹ_ R}1so%Yǿt|*tRӮt|.K]-]]`˲|u=M.+VfBSHIUܯ:^ Jj?O1]>]̢s}`(.?8{A&+.Rk ɇ௿9cRj}땗1'̾>yzO,]G~$>ӱO(ڕj*DzW+]}RRd6Pۄ,!lʓiT3i2|TtQDo\ҩ >{A:Zmٌ߲!s%|>﷭Un늫'@S?ϻmn7ϻ`[ِ?KJ%N:_١IENDB`xye-0.12.2+dfsg/res/detailed30.xml000066400000000000000000000112701225403634500165560ustar00rootroot00000000000000 Ancestral Xye (30x30) Miguel Angel Soliz Kuncar A very detailed skin with a temple/tribal theme. Slightly scaled down version for smaller screens, looks better than the 20x20 version, but may still miss details present only in the 40x40 version. WIP. xye-0.12.2+dfsg/res/detailed_COPYING000066400000000000000000000031341225403634500170040ustar00rootroot00000000000000Ancestral Xye Skin Copyright (c) 2011 Miguel Angel Soliz Kuncar This resource is provided as-is, without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of them. Permission is granted to anyone to use this resource for any purpose, and to alter it and redistribute it freely, subject to the following restrictions: 1. When publicly distributing the original resource or an altered version of the resource as part of a software product, the source code of the software must be made available and the software product must be in the public domain or be released under a license that follows the Free Software definition and the Open Source software definition as of September, 2011. The software product may be used commercially. 2. The origin of this resource must not be misrepresented; you must not claim that you are the original creator of the resource. If you use this resource in a product, an acknowledgment in the product documentation would be appreciated but is not required. 3. When publically distributing the original resource or an altered version of it for third party use, this notice must be included unaltered in the resource itself or as a separate file distributed with it. 4. Altered versions must be plainly marked as such, and must not be misrepresented as being the original resource. The resource consists of the following files: - detailed.xml - detailed20.xml - detailed30.xml - detailed.png - detailed_L.png - detailed20.png - detailed_L20.png - detailed30.png - detailed_L30.png - detailed_icon.png xye-0.12.2+dfsg/res/detailed_L.png000066400000000000000000002256111225403634500166600ustar00rootroot00000000000000PNG  IHDR  ph MiCCPPhotoshop ICC profilexڝSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/%ҟ3bKGD pHYs  tIME  3;.y IDATxyTՙ>4K 5 pC01.!8:q&:3dL&Io2K̬f2$fDbPEH *()4[7r~X/nUWw|^[wy?lB8Ja-/e1zr1főv.k0vV〭Ƙ^֒N(4t #UyiysC!}yZk?o}z{W mjlׄ p^.6(fm<54O{?WcP%( E(ϲ @!Kp0J*f#}HBSDM TZkd9Sw@ ؍6;Ňl=9\T^`x'~&Z;69o\ ~s~K;R;BH! =i2K(Jo26q:۬|~Nߖ;WÀ'E|0=n1,nkl79 [&nU4cȰ]yWcPF@P!_D@!#Km~T[q3x!6 i&KD[)} `1c78f2wDH4 Nb>U `vl}>B޳C)؍ao/$mK;Qo3J*ev$WcPQ(GX *p'#)o y7 heqiCDBc~ WIgu%G_mcY]{0-2c< 8@ I1X uJ:xO%̶9LމbUoWJFƘK>c̆R;PP('@j7r:~CmjqopxhVK:bII Q7(q Es'㐫ͥ(< BBPO"x.᳆ q0c0QU Ⱥ:>xxbE]+9:h,tBP(T( E_ @t_s/bKN9p. _98gpD‚%AcGc[%5߆++$M=]>`a0--g9%f6\yC|EtyȻS{̆>y  BQ,>-/C˙GRtfrXu|ٸ OO5}0TƮ(ģ%?D\ S^ oBcQ{k he_&Jپ,v(*@ R y\}/>f%3Έi[ eg#o&GHc0{Z ۬1 Nc̯caTZEXOBƊ4~cb {˾L6}l/(} mDP(rUopp%\zP|Hp}( p>D>ƘJD|ŶU 7}o/ڱ\H#ޞ>TDT1dC)ۗͶxBQ BH ~΍_\L^6{pկy 8TG޿f1G޾J}(>n[\艐|ֈ:o ya_&Jپd|b@C QH@RaWT.++2 jcp9~?j |W㽲B|wec` 8Mr 9l\=^*\(aGFxS(JQ( [=޳ T5pSof;@%@"0IȬG^|cTPk"CT8\l>\d{JW|¤gqg=!֛/HԞ?BBP◳d+@~!r5n8oZ\(be<'6;e]Y!ju"А&'ܾc zq:[B|$tC㗏}D̒nXPQ(ȀܿJ|ߠp8ap%yG U k2Јi ոАxuB @ʳV$$HChwPV$"D;F*NmR7.[pͼ@| mm{|j"$[R$?BBPQ~#;Lupݾoo&:D{m1׾Ӹ } iW^ArogPOS(T( Q_`̺&pVor?y%g|;B" %t σn! oo|^;~H-ӽJ3>1fvO}y\OIۧPQ( ѿvӭ6%\>ǧeR?֬tb#ú\H#iP?P(T( E) /2v˫u> u&٦VDR B/cWt BDP(tӱ~58׷#"RV3.ĕ] <ҁ0n FkrAªGz;%]3ʩ|KپR;XN h&Vm?\.૲wA~Rm~K@Ҏ|^+zpE>u)"| W_*0#ʑX(`B+S( ( Ez9312>i~^| 5R![uP pu'a* &Z^u1f׍1KپR;hPB8i/_J 7'4&Y_: cÉ~R 9 =Sib1#t䵖KپR;BBPO㺟 :g\_灟Fć x,I%oy=VB.nXІ (@5 olj`:p`mAr[ X5k*&آM BC £T(V Vsqխ/>b5x~iag#Æ#(ZJ꡸?S+hٿx?eb2~a^EdW(}2BxA\>Hy">,m"49w[R!oјT ~b<.ƞ\>PV8ΥP(AC QHG.T~XAw8F8{^ kIXK@?`c,/D;y0eL{BD, 8Bٳȁkz?}?;Wha'pzB B(Av~r. /ʫnabI>a7q!\!:e? gK<)틜k0 6\o_ϢHLƫQ(*@ R F^ \ūEHC)W7A$VH!IWH8MMdg~xʶOR|*iB\ EW.s!m">>< !㚪p!{= r"D!NOr]j_BDP(JS@&p9 #e,ģve@;R#75\Jm6w7]Zeդ7cV >>ZܛPM6S,N͸p&ׄ׈5(51Z;/5K6LyWE=BBP'@ nzb^+\|8=w$znu[ԞVc ebo@O=Te3"BV$pޛ$+q^=9xB_' 6%p޼=91"Ózv"Jپw@QLh,BȌv\A_*WHUU:҈.ף1:m\]eLzө2>nvd:c M| #;3IB> \tMٮi`_1f!pk+S(( = !IU0I"z.!IVNtu'0|2[ e`DžH#>vL fq*"3A\z;ɼ7 WLty>ǃ4/(5%n_ڦ 1 B(Ri֦Yjd~#5\Xbc{633y9d =M™ټ2b $|d̫>m5Pk{5HNP( ő#@z}IH,^~lP'k± 2 tc(Ws&RNKhB8HI@瘄P( ő~: BSI. lƘ.K BQzPB8 t!= qcJH U(_%OI^^ <~2jW4  Bqd ~鷴KHyTsq5uS_/D}l9UiޱliCL18`-  %;~rLO+} E!X B*qexMILrm9 {AC c̾|`y0QtLҿٰYd2!qSԾR**@ / #qaӣTƘ=_$in\tv4:;G*yCN'}U(T( EQC/T`$= qCkMsBʀZ!*6-0Ƭ}Ƙ{8CI. P* J}>H**@ GnM<%":%oƅ`,٧&܃h( x96B|9ݙ"0B6=T B("38 e) ȱ@=P .qD TF1K%Tcs蚔HOŅ91 XWg͟$hå|Y6*SIT&~L^}U,_H?O+BDP(qE\Ȕfޟ0=^ b$\%b-+BVk$!D ć# xj}9 -و*Wfp p L1[*c!BR}%U(DPHj 0+XNGdկNLD%.mUj. 4ܗuM*1L=<'PHIC`!1*%qe_!OC""Ǘ=]DǸ jW,bB= B'QW7lFEHTW/wBnmD d/1fOx^ l+)Ҙ9$v$"|B.UjjU9>@dez}~#h>_ϡBq"?"@ .Bh)^/,WuP7'<,-z,0!IMmZ>(ʫp3"cs7d6U< U",{6Eܐ:gET%sa:\q%>~>X)*@ 4p1q7MR GP8!ć[MT>[ |%mz@HU\ Ok43Sc1aly1f d\Ư,BC܌I Ǹo ^骎Tbz!p"@Jy&}j_S(2BR ZR3 ¬ǣV,\uQ8/_B◵"f 089/gO}Vɘ՞&F6Br1XkA+ƅܙlXM2˃ Uy2f,}ŶOPP(EDr#b#`$3O\ˀKp97GHdFp|A') 9H垨HEw?Ln:rݝD}"fyO&PL+SԾb٧PQ(=%BgJ8 l O>DŇ1wd^9_cLC\JB0~ k͗O$$U4C.t !ߓΧg9V]Zm6@ڧWPP(}hUuU ,&<5B_~4=.gFG/ 9\(VXƷ_s@pZC"O;RG3AuKq<$^ԑj4t_7*>"L)gH<~jWL  BQ$VA z.a|(1 /d:^d<H59m-xN3ѹ >'Zk:"M;\o9솥rʘ/H+ދOʶaI艒#r> Bg젼 "o\*!.y.p+2^ &&& YC71*U9BW6< 4Ҕ+<Sqr\Gh3@yT\ >~jW_W ";j pB K_ A8WNFa%Y.c*Ad9_.cZffGgb}"`F)/z\SJ=Iy4mC 0^/nHpr쥲]G"Bg0~jW)*@ a3s%.X n~,.Oa0p.Hu:1KQ X* &\cmx$e}'8WZ~9nEͤ:˂㪎-%5[|ݥ>~jWBDP(,dK0gd p /2|3Έ!ئ+"J[BBPT[ɲ ‹J|/. \Uz 5Bd0 Gk6Ғ9~# 4Mt/D pTU"VHk%R?O+} B(2:YcptWr`X] ofvY:1rZ t6X(yI\xƹ""rZN:ξ>C^Ip"b!y #)OSU(T( EM|kp2P<&ۮUȪ}I-Ҽ1 !1"6V8C^U]]T Ȃ8/"""Wj DTR  172"%y-SԾb(am~# IDATGIƄayw mR/@ ElHp OyQVaiNY7)M3O$)i- DF:r3.ICE֬" D{Hޫe*K}j_S(z Q(  {dYHWVyE_#8q3o" =݇eu6 >MH1DN4wUL\kP'Iu>oPvMi"׮ϥ0~jW)(WqtI(@RލV 8OE?YE yLq "[cą%1-sabLL RMuIb_f:BBP ,ݻo] YYV…n}ט~/T &@B8'Nɕ|bOh7&L0kOUjW4  BwTbyHE(]"d,)R=E$AR ۄ7;RN7)/ǯϲڧ)*@  px>\3kPMJWຢ ! "DKw} %@zk x>OPP(."fGd* wJ=InTHH/_&2(>2W9k.^Bz@ BDP(JL{5G g)"c=V ~":eR ^x>OPP(U%i!+ ! ӃU.Yw:0'z ^ u"(dMF4 )KC0>()} 턮P(ЅK/DždUqh\1Ю &Cy𕭲!nf}j_   BQd此:4+_xGi)S>*6hB8jcV@I0~P(%( ő%qƘvYWefcL{|k8`(pư W) \#99Y]Y&L1Z{ovcfq1Poy e9FcLsĆシPɆ-ХdVBB}S]nَ`i_T B8`pQ\!p%/lMZܽ`mNrv c{?x+aBqշ;C~\!=Cqe=Di=k(Fr}Zq{)9ց`{C[ߕk ;;dmdwSpB|/ DN\wΓX-@c} <8OE(Fc6pBkSe\ 5@m5)WnY&5R& ND@\QoBQ Bq"mT]BHV:ιV`nFh3Ƭ(Xf+ܶ )$%yy=cN /\-{@2?BH~3iB>ni^)bd9a/64>'Ks b_8=Zd94]DyV&/c&'ˀwؐWk )y2dBQDP(21,0m'lmB^̒6 !1Sq!+s9Ļ z xcӀceǶCΟqǓh{DB_0{NYRĆh D๸r)Y (ŏԏmcȱDq:"dൄx)2Y|?۞t p-Pg}T} m">L4\8>! #I`k3p 9/XߺW|s!]]o_֮C-UVT/Cai㡁VU*ϗ>0߿sgy>M5DΎ:\Xܖi Ωm$嗬Ӿj#WT;y@!`vGO*sI,"Age-w\xۯO;ii+ߧ\g3D6gie?7ưv6C7v\0rtԍî=._C̟u5~ g}zTUu嚝]rv.Ya;UUDUa2سכ:qj&<Z3t_oSw4N+f xpkH: EPB8jD] W-pI5!\(,Bf_pzC U':ꉜyЦm> w=?2i5Vj cۘ2Z;x&+R.ܬx.DW׊#xw$pǿxq0c3_Ĉ?o$4$Ю:Ut-7k=W9~uAsG]쩠Tr e_}ӹe,> ة̋E:àwqb$(18*ܛ2PxI ]QLDP( kHy=MHl4 X*dOpދ "(JxYk4 iǕ/m_'z*xBT/d c/4>ê;AU-|]\4~?^{VsoǷ Yr H26pA3qp\D>sZ? n=z@j$}{wϽ{"x1/e}NܸxLmuʨ-Eǖ1B|}_>+~)wv;7['dhu_\*3sC1}# A=m2!Es?DDP(</Dž]gć =VHB\8VOpwF{(Veu;q3o"%@ZWZ;)[%ZaYCv,fjPǫOnaPyj+ zs/ϴXcG;yiX$WjeS`q{uY]#hІ9ΟcFa:?2{fcϼ{;uܟѸ>CE4.-fqӡZGu6|?ysx㼐*yJ<@o9卦}}.՘e"哃cRLBV$.oUT!:+WP(J C~""%!0h=,ߵ¸ ?!^͗|lWDFc!q!Du8d%'WF[WrǓӘ?bK_$WrmƘ ~|-1qǓ 9Hun.S +;%%?k1.a{ǓqJ5<^.Dxcܒ` [:&by{1uܰ㇬喧kA<BPBqecY< %U%!w' l.#b\To!.و=xʌt`Uґ͝_vl۶` d8V!Ov`r'?Qa8 טiS!wPxD5 9G}4sċօ=C+GL흯`ޓ=]]+o?zlU;*>  BQ թ^myD2HH\EL5l'U·qE<ABs 8Ww]@7gAm[u9Wb*\r|-.IF0s$โp8o>%Ϊy{Ƌ/r8b]P=#I{1pSu?boE-g}xKy>R BBP䃲THUd\ &v0.ƽEiIyNu/*G6Ʀ\bk 8D\Vv8<$,'#h=+\, һ 54eV#߈ 4V+О+7 z϶־[y 6LP{.N? BșGH.q.#UWb# q!X}Nʄ \HL/&Uh]n亴f9rvAW 'QD6CWq9o.M2XW/gCoyYWPb|**@ b$$X0": ;aΓWdpՑʂe!Th؄P|HR)>wYkEžn3VQbzz(WOPP(?@M Sq1 xD;W%"Figu.=Sz LmYHs.ѽk78^+݋ …}/JV{,6P3?.@ 1rz9g.L=8^+%yv<=%0jCB%yo0!j1kg_DP(/@y6=MYrąYB^lqx9:͓C8o4IT\hpP kUz%Q"!a=JRCځ+T@pW,m,J+pNjHx,r޽8u;HrnBQz2[VSĶce2.mHφ!.h7n湓,Zτ!:C1JHcƘn1Y:QarN!/8>'qW RR.GtmnFTs*'hC#c1Yَl%uîbc<'5g4q^j_:8XW!@ܬq^}H3"X U|f;hZy=8^S(T( E 9n[bj'VsA~"DcH&ktf !k4 . ׃iK#>Δm7UԊ*=SXgE  Z*,̋3d|YV\bRBw#Pezs# rm%Er=zc̳=i WYIيcM4C 7vvynjӉ ߇ pC"XVl;ZWߏ5z4PQ( &{-!| IDATPXxwqO%krD\z.FHr&4Ƭ(ݹ l־!/2$Tg@o.ħ5Wr$3ہj]%]-0djN8]PF|)cCzJYFHu9>;^*1/{[+Eb| qmCQ0: Uɇ=VsBF˺&`dd%-] J'-`El ?``20 kkO0o m௣=uӐYu]yMΣ9U":p޶qk#ߧfsGu R(T( EVWD\~!B;cH .qydjf=W9?p٣wƮ~4uLS?r>2s\ǢYVkBqeođp$5{/͉DE&zoF`T{\HPߚ G+^ۛvm[1DbR-fr6W ̇yAJ_ն"~G[pEI]1{Hi=[.?D<&kTskdq"q4pϷ^! E8BqBr@㘌DH5Y<`e}.P7 *ĵ xPq,z\;s tv=ì;ɟ?_zN~>z/ /q*#?+{Y+ߑ\m` ƅBNϋBPP(T*hGDmiĕ}]ҽ ðsNYQ H`T\~fc: cP5Qxz&Tv@9;hŘɆ -Ks?{vf䣸{m3ab  BQ\xT?#a"Bx @TBN{=_Œ* Alc}{65\^оu? -+r̤_mnLyHuƎ aBz>4k;b!\HR]_`1]B58^.ݾqSM1ݪe}\5I{`a,w#'zX4LaupPeBAs@ ;1W\OuM F5196xn!$Gf e_yЊ?C{. xsyMJfe2%Wr>|/O\S'=.w&_4gH{H4s4HIW(T( Ei %<"@ʂ%.+lj pJ C|_n^¯^FY?}ŗu?Wi">͢$.,) 2nˏ>)< ֞-!I.4\@g35ayF_•-DN57xXXXk/cg=J>ꭵx|#BDP( %@QޏhL7!W6t$LO4ۘ! *8dEYƘy|5=!z"h&C` <.q!pk6q^.clhy9S-bj1f9"4^ K_KPPmkcr~5\F-.\EBPP(}%@B!_^Mv$= %6qz2Clٓwp5=aHY! = /c a{pE ⒠"o@}1. LŅGmqcZW/s{.էb? Q&Ny_ABBP 7B (\) R^МƘ.1[zqzBֆ׍5%8$c~i˥ ,5·Z;ˤW`x/$g. =rokwk޶J>BBPG1栵v\)TOjY!鎱+|Ȩ޳:Fpk{q lwpk]ḵXU[?"oby""7Ƽ BP(}Gka})w u?oڳ,.%+E:\'3WS t Q+ƘZk鬴paHwg{;& c̲^CbQHų. XXn _PP(!s34 q9 I'ZpqIßr"ڛDsHŶrgП9b*\b/P(T( "ḛ.3dLfQoG/ڻX׬ BP(()3֞i>I3Dd,<Mk-_sNb\) BP($qn̺y!d/58"Rf}>] #un (!P(a9AL\^.cqXkβiP2cI]\#&Z;>'ضGNWgg_"뜾%i+U(zCP(%MKXWc slwMrcyA }s\.Ȳ lw;._eU[-oعRe_%UhYk'chx`K"bt8ʟk^# \a?@ %V4=M:w \/z'x'\%xt~?>2~3EDP(='vF;`  圀̴4!k"8eH`2;Nfsk]"l~*Wvc Z&$ `ر% ~qvxd t_CyHUZ4O@R"T]bTl^E˚.}"vr?q^>ϑ *7ح)9]Y#Fs+mqM9H;o``|=V?ž)bHBP(_Q27" ޷{BB=Z{SL# 3.#.$Z`=s}و$/xI?$G hu sD|ver(Tmx`n?I~]Rwnp&jL᳢P( BQ(2UcZH`B'!XSTz:7MC ijߔnOFx[>Q' "lDmȝuDq9<3s{R@H~%B,<l8 ދCns K]9AN\v3.}lwxZ[26e}$.OeeL°b*bI gF\$>YZ8v7$sܯa\y${)ߦ\﯌g52N(PlCfo]go.~l4Z BP(zSϒ r-F_9Y7#B. Śz_d!kƅΔ t)6Cñ YMgNY$ 񙓇'nn6\W7wr;"Mgg7El') BPPL!0S"Yl ɝ.$#awDŽP"&F[cFQ6"@=P8#bBrn{SI3z8ET(%F0~{VFDYfKʿ=Q_{Ar]} a (IIASIY1!ycVlkkeIJJ%vj_ZNlˎ[vD[ȑ6Dm%")I(Ā0 @pf3s{CwO=OUWz?λu{\cͶD!XB;\J[l#L+:\JM{<2G^aLceEbMYB(%_!0Ե{컟IRΙ-ϦB`i5ИkXH(%$@dwRB݋]V5ݧ-;S:H?N|CxM){ɚuwyߖ8`v`Vq.rBs clZIvMN7iιGX̘øl^7fHt5g6u\ǩ?g",8_9bNߍ-=Vnߠ&O! (WO2SVc{F;{vum-'3Vi(q{ImnuuƷ] GÿmV)~Bt UBBl sxVazL c^zaplCYι+okueܹp}0qx Hu+%Q-sU/~!Fδ>!B"3OZ) OiBx<`hιߨ`ӯ^4l8{I8LMs |˅/cJ1;2Z(R{!#Sc_Z|dm;ac5^~+{!"~:j%| aiNZYכIL]ka[y_e>֮ ֎S,jXkV[~ʜB!6V;ш0ՉK =G :L9wJ4*9}p]:-vۼ'B)@mv+tG;S{)!B7f[)>lnEőH:]#mI Bѳ땾191ֻ0s_%ַٶ6i. kdV)=sӉna ,OZA ]l`"$U|3A{\wf]~BH!h~G m =R&.[f9-͞o{ Ӛ5G@="Yq-,_" % IDATrTnB+:L7! xLQ 31m8'jv/o#_$*k6!Mr%BN;K&C?jocY ;PȺ8J!'| WϔS/7}V9T!DiV|6%$gc㑬EBqo/FgI|\a_eIY{~B!ba9,?%6~hQBdQjzY'b[ }+9V/+$@B />>ESz/}=< \NpW3 p >m'iX}]VLֱ߬}]ODt!Dow2祒S%0Ip_D uQ`;jp $;ge YU!su }Y !"x E\JQ`%K b=! w[׮'bbbnpabL_~wxN}/_!ڂBY C_yl!(?߯Ǟi´?k_.cmsT9;{s_2Q>B( F$T1=GO/fw|_ d%T)BW\[~Ou>`n!6#3m6z(/ gY}n]os0?])bԾ;C /c9ö`0bϣ,!nT-]c9ܐ%Y}/k_!$@--JCЪ9%vsי(B/IusdR8Ɛ9wY%J3Q5'9/F&~lF)ѶVr\h}!"s=~Oe+!> l+|33~ Ա 칟xPnȜٜ8AY8g_9>S?lM aR_=f ^ *>!Roﱇþ5r±@my3K'd_~BH!y!͑9̑KDo}xJ_N8栜 fԜxUsNFM>Gȭ"TFԺN85y'aDrɐ/Y;povsfP}Y !"[|4E{8(_,0d'S}9gb'!ٗ߯%&o(.;4=/@bGO)pW{aV!sf.IHVsG=w}ڶ%|73f61!$kSz^?^}'k/vEa}ۿ_!:F@(`R(LBV`SL^0^_븷sRqB#_uq=฽cHjwg7\S~|op9Qw7`0|u0=~Ou+)lBxrͨy`P(!$@Ms7pV"df1J0&$y>l/c/)Mdg=cr^w# (WF36rU}ݴO !Dӎ6vJ5)B(*R^I℧{R`N1jmw$EDx0Nܓ`_'IJ/cӄxєP"̬B@}3BSt`kc C"$B>mB9L.vjćmEQ޷ E> ɞ{qes M0Gayw`lԃzRؗ @~Ou>!$@mq|W$$1^W(!>nFQsP(_(HQ Gs 9stRb滔͐90q/비n} %]B8;+ >2}!cݧ|W$e|1B 9عr)',}ݶO !D牢/ i{׹~LYa7nN2$qQJH9'dqF֎gd}BH!_*G9OE2iU1Jq,DW 9%GOQyzN[{d}Bt!brB[(j_kb* t !w_'> w/wzdW!DRvrBoaۀ(z!?R=liFr anwׄ{dWB.}}şg઴[+M;\(G(J;yǁ[C-Swu=W~0Cw`&#^}]9Bt()orOkE )%Yt=e> ݰS=~Oe+Bswqz< O.Pu!Oɾ,~B7B:EQeFEX*ӧ%DZ yRnK'd_~BH! d82^jEzۃizdW !DEJӵ 8,Q}䴝7-!Vޑz;C4ϔq`jW̖(Ukn>&_`_/}Y !"0 šB8ग#uj?'BD!6?9{ Tx.Sj4K+ %9om/a>+_!ZBd8rSA  !T!$@C!XBA bF~(_ozT-9Bk3b˱`?Yn?'z+GGQt`W}gYo0gzx5+,& SaX O,E +l$p*mWL~WYNT<"L-ڈAD|8נr>+_!$@}J_ ds+ u V火Bxx&k֏2D3PaEQ”ߩ iߓ f;:z>ٗ߯ BާP(GQbs7kdUןn8\Q M&Jgkؿ+|usڏvy윍`GYV=ddW !D_p=RsǏc9Ϛ |7KBpo-daEGY?=cs 2M0Fmi0D;!Yo?'BD_DQB`((?ncmko\9#)=ˁd|0J8ǩþaK=~Oe+DQ5L!DcI7BZ4JBXk/W)AJ|x8Tyiö/~=b'mvw}/K_!$@c Bc*]mjb&r> H-`BjlYS{{dW,!D'D/GQd )GgZ$z#L 8KH_1GQ-TԘ ,!K-ad*aGQkj'}/_!$@=)' #!VyP('uL} =v9kQ\>;Y5eRllXa۝/=~Oe+XwP(H ȼ9ȕ!&Oɾ޴O !HB(8!}++OLJ2Ã͒,v6\@*ر9}BD׸NP(^!Gk=+ǻQ?׆5ihem}݄\3_fx:}O}Bt%" !:E7F5bb:FHx8'GH5}j?'.Bt MdGF/ö(gQ7 Ɯ=&*,!P> !"8mY#L8,7B>&d̾c=~Om$Bt `'D/5PP\El\%ÔG2sLʹ] ٷ֌tdEB(BU(ou:X:1Gpv͐}=~O}BH!2*姘m9Bq|ԹG:eg9,\U!ct\3d|}f BlE"dNt#Q/p3OreF#h$|i1!dBD!Z)<"&<(?cQ&Ȕړ-d]BPY p2%uk7ۢqjo"6;1.}oc'D!lj&k\gq8šюYe^.#a$P!83r&>'6}BH! #8o 6XP(G(_Բ\ B:FR&u^FsY ?}O}BH!B{yc7(CxQP(1֤vGN5}&ޞa~O !"mMjΗm{ )\J6WZT눯MUfd63~neض}BH!D+)9B%\;H/xkP<E5R\g[ #Zµ& a2G 4j67c4s}/k_!$@} <'-Xh 0cطJ';Q~7D$ČJ k%'d B&Vo!bdm0eEnbL68!}d߯ B$/jfYrfXw2 0AyOɾ^ @!~@ h܊ZAH!Be\ ,/ BdB8M@B!Bl`1P#G2jcX BRroN|(ʿƀ(ϥ>M}Hr&'u!BYfh}DL8ΞW kQ!;X<,o3LPNP׈ |KLBl"BGQ1lě?l uN !Fx]:F@ps@('C.(=)_E!:&վZXOBDD!z|~ nfBY^^BDD!z4  IDATƈ%@FL|$V!+uls(:NyoܗGP"+ F@*WU'j]{{O7r_ҥ WGn}K!Dgp>kpee]8Eܒ.!Џ{% UY5qNs{{qe !F""!j$!BV%nF8^d73<I]BFz:}Bnc ё4 m(E܅1]B"Η;Q羥i6֢!DD*c[i- |8Gا"e+>側!&B< ]_O(Xx޿dH!ĕ, BQ-YHU| snYgC#^}%Y8뜻إ_GHB^[>~H!zf0spfL[l$D!zth8 )]Dc8sn:潁Pp<|~DWG8*BePC#isfu:mBQA( ]џw)K8KY9w\gN!?z־uZF@8}/ !S%{0BJĒBZys]PS!Dd Bw$~;! N.]!D#>/b.Ȣݫun'8윛o`sX{3S贮!IP" :rR B,NLBl@{ oƪG|3Bdrb#)J$Fz^H|H!6 |}VT*n灧FyقBEHWEMܦZVDx97k+=ʱdU[) ΚEE7D$@D7,XBQ(ʤmBbsYԩSr`깝s>˿5ٳB(z*7sU'O^{m͘vq^1ʭtI"QQC]vswPɲEQ'XZZbhhwɆ׍BAsJjz\"Ca3;+i=oF X{p8$Hغ lvbM؟rFavftP[@&;a6GhҒB P|95sǼ/Fg !ہoT;~}dmqڔ'Np3>b lnJ(>|AS}ob}>&g0i= OamtƏa2!x#p~8 !"1d#ӕMPVâ灷{JHp;*;p3,kq7w֜ 2'anGiMw Z0z0g6'~A!myH/㶏of݉뻦v T(DX_m)"S66yk 7q &\N~se?dlGR4C}RϘyЄT'xm3zZCo!-" YWxW IH!Q¨A_`7;[ɻ=>QnJ= =\3AڣGHA3 |6s=#=p8K4dN+X&<I̓&Jy3vބBdkGo#J"De"ՄH//!""C6Ѿ~9;8x>O $ ¢ju`Qʯ% f:bmL3CBbaG.3_|.q̮Ǚۃ 3B#Zl #~ҤLHG5k !4"Niceq㰣Oոt ˴$\.HXPځ>k ĕ#jg2KVa_#!!п!m! B~9Zako ;>kSb'slwӾNxA) }0RόIz'2 0ˈIs?j r"~ֿgɍouΝ;}w uddd'ֳoaaݹ\}(J^ tb B!Yy6gC;g{'~F=dvEwrAPm0 r Gs'7oW[lΑrLLL6::̔777:rҥl޼yXE핕esB\}B+H"dؖxRG(BlDfq+'E {?yJ3l5[סl8A:6r>nff.\.~r}KKK7R:.\att|"i2?/^A]tsn088󏌍 rҥ!:ujjΝz!ppNs04 ,uP\(B}s]& *NWp'=p|'(%jR뷣^m8ZLE%>J>ḧx+;ӧwr[VVV%iO4\?^^^J-..޿t.۷r~0Q gI&#?Eљ¾;v)/9Ν;O^,B^OwȹϺ}BD!;Al8zl9DN#4~1Mw3) Ԏ{ 3Xl߱wU|ld˔)34 :IKSB4ro!c[@\/b'#Pፘ;#u! EGmtDNJ92v/*JGEn_&D@"$y*# Oy  Box O9fIW⎫Aǡ8sG/nq4_:Õ3-uJڹ:BY蠃u"D!<='"8׭<6p9PSm7YG}y2i7F#@mȺ},BNfPn߆&&BU[r9\ 'Bm~B{Lгlc,T\O-Iض;i_ xNFXsy=`N>ܐ(jۗi'W[?Vڧ+ !hpQvoLØvw}t6G,6ߦ|QPj8l˺}Ah1k- :>Dm_ﵗezF#DN3|-O -B? =˝66y\fY[&.ziXam|9V5xfEzb8:d1nNor/7iZ}qH:|ؖw y)RmPq4kGsիn_O *d͸G BanՎ;sn{?]ӗtccR@)J5%^3;_G*858ݶ!!^ʰkx>ax}:g>Y%b"MAHVOOb0\@ǻл=K&zIG)Lqֆ̬c_QJI_>IN ј8kR]fP){Ĺ(3-pQcNw HH7FA4!" 69.U@9wk6cu䇨{=y#]1BNwQ[9#s+miڮR{}n1p7tf> e&Tϐ r6G5 ,Rn!\ /{+w-΅X&t6@z9\]mV9nMLqUx !"뉏ۀM)uG+hK6 ?fB&}c},3ιWp .ОEJ\TdDR Gq,]*?\6uDcÄg˅cMZ3 mҴ ;cuFMvS ɛX7o[O! RWZOH!D%ိ#:obg0BQt-J7.܌~K6j"DG1#G%<ۭb9 `$N89t.PсV;mv4ි]h )sHB4uc@{sO԰67ns' ON;g Ua:q8!jm0ںwBڕ]i:/^dVT$BD!DNì큞G<[U{ii +Hb_sfK78hՂO!"'tY6;E+p NXPmvq4!Fb:>Z/mOmM\x>D({']>EQԊNUcl;ٽӹB!:tCە'2"J(kͤYB9/s"Bt8P1]d\!D\YBz[GÄ٫.sr 7\Cv9E6B"DH!B|\JUOmsU&:"QaMBiz+f(,B Bn6gsOg8y. !F!z5rj!B JGz=ѩ&Bts@Q "I#!)Pp̈́hD3hDvs v$BO[p qeh׹Wuv}9B!.!BDH# )*6 &&>b՗%>BRQ!`j֞fJ|v 8b!BFC,>$BzPgρg&$шB!: B $ ڍ#l a&FNy{X| 9,//w'j'ׂm^\Lt>Qfs@N^? a ͩGAυBdw)?Էd_^^vܐVڧ>a72Qrrjn!B̳8O)')_krCZj \|Ei6!#iˆoSB!fRrfpyQ},̾uYdK@i$ yF?B!z!FBrw^ct5 x$N!"a B!D0E=j)9疽~@!yooQk!0 J1K#eˡ} r=2s.q+ 83"Od@q&J0a4۾$BڄF@IhlOTno]67stI( !h{s3e.uNBtUH|H!Dk[U} Nٖ/L !D"X IDATե%ćBB~9ZeY`xV~\u]BEHB凇WW S% !Y|wbލj*Uba¨Q-!hN+&Īz1QBEQ^#! BQp3sl7WioNeeU܊ΖBV$kI-!V_U[B(>;c /;^B bᡐ, ! ̢BHаNu|RB!$@mĜkgR_hi֊ݑTUι#ι׷s;5z~UXw$zjlr[z7jBzj1 !Dlι˩7lZڸ [l:79 oֳ Vιg}9X Nsd5k8*w3V4{?,:.L !D}uUJ3&9ڑOj{?L):羛m1H\T[ؔT=Y9^!"5)<ů%Z 8&-rB5kd7bш.ڶDЌ_m!z]qVϝib? ~1 !` `$@%:xu={r X , 6,fs 8b7snLR(|s0j"d: .gc[l݀kp, A&v(ܥ7fz9xιSjlh3Wo ]ױ!Vd6Bd?%yV$ʟoBe?f{_j,52EFT.)fa0tmO  7q|}0e0*rXTekba[ιR!})EN9ab X M<7$sB hvN:hFA$@D7rR0JI մ2KXv} e{.=LxńE \)& EL]))Km (ihf75r;p9Z[8L[FiFO!? /^G9YG[±=&@t>wL|PA1s8*X&iہSJ|6 ʏ'9kN N_ Q#u#w5 }D('Dh>< gbqv'}i9ϧ;g>Q#95g7!#f;!ϣ1"\ Bķj;C*HqSv/+j}a_DhD:qGc𠚰ק B!*F_4M!"XHV5-BѿUJI߷߲_}BD4BzVA1ڙB š.BȭX4' b¯ZE=l' W!}>  !DG[f^[f:[;]&`ob;?c=01r{m #yl+ C9 B[B!}1|+u R6b %n4rDɰ x&VBxbҽ˗!O(K ~{^;C+O7s@r-;8. !DW;zuBI|H!C8fn{}MEwWM~^ax~{bzwa߰~_.fw7u?Avx&>^]B^͂"BOC(K2>"JhMs"EBmwSc9]O)x K܏YBBT/bɾ; KlFB|#qtU$±ϗ6NM( ]!eLGTJBr<V£KhD!B4HB!a!$ B!BtLlYB! B!BC!X}f{?T㢫y3۬=!4=M@a$+ 0o}W7cQ/Wgrs9prk2ΑF28v2 /Z<6.^sccx%Yg`{<5އJk~C?wW( BQѯf([y0I .Xϙx kIO2::28::iddd7l޺]k7uG.<:/xa g^8ryҴ0f9s?_\]ZZg/\F k:EQ.UWV{AR;z '<' sK ܩ WOzS)ⅅ;V.]Z|²~BB!"$o#𯁷m?Fpa\jhKT^PA`JU2˺8{q2 tyExOdžP  @Ds `;v`yu+` x@vRb.[::BDK5m;dY<}۶-U۷J5GG:mW+eH,4-WQdl685䭏=6Hh Y] ȷtw겹P@Vkena07ph܍;=#Z$!3_ű) |j]Βx2AϏ#`EUD_W@ ސI<~y@o @U6hImرn%OejD%iTӴЈgȦK["<ٞ9?d|.ozv>z7RݩcNs-DJg{OPבH@!@/:ʜcϞa릐߯s=_ύeV1aWd퇱@ V.Z_v2\lXB& t:x|J|]zDȊBFQ,Ivfss"֊Mn#/0}F\O:xŵk͖wқLח ;cyX!A&Ny#y"Ny;۾f_Qڙ@ XM⃬C|,yWы rCqiR.5y^i^~zᯱԏխT^Y\XW֢ZJHwOW졡a>W Z2UEcH=, nT>ujSB|v:몒J跿hg.C(}d.]( lHok~f p:;Ŝٴ8u:$C5%.&!j DXC76*X\_.Le+X.+CXo_A4 `?X:wUx}#۶ mkϬV;/Hh(ۡ7r<'b9UUT^:p1޵%jF2mV;VfFO *{}B#>yE@%;$@ h\"@  Pbd%>lJe-7ei\g38ZhM=l~;v πf-AblCIo-I*'&ODZc'#j-X*Դ,Se0tM ]5 =["`͐./j^88y븮nA>_Tb׽K[Ĕ8@@UU$A c#"D@pk`)h?D(h4*W$̅ikUEv,T"I.qe7,iQ)-+` N \[^܃/ʚa*/t'MAp3a4v.X`q͂!@ -`օ20Phvzou|fA->|.x _lch}a> Ͱd3!Yv~RZO50 Q"ZB:}zxýD!" JeJu$I,#m^D, TUU79%/]{߉޽Hh%d5kXԎXj3O^4, gft )5B/\,| V2[`M"|U,(`Ugb1d> `֏wU2?+K@p &l.~0wWEv6+e24/\V[ϼmsϭ"DCF d21yLeYn)M4ꀬVCRPJ"X,Z'E ξMTju*% »6oRB-DڶIRCZ؄Z#\}4SE#ꪵOXA790F8b+bc` ?1q>.XV->rJy0 0WոTfNcn[=+OYL΁YxlX,M7*I->uT2A$JBkJh%ik4Q@ZkYE  4K?ُPJ3>nF(OO-ݽ4Sʥ ?N@$111b[rNoD5l"n@")0| sȽqBq'EO0f99 .\~ ,'XE8ǀ,g?b,Tc K7d 3s4USja0/++%SeP(23={m;ϕ˕7mwӦҹ!tn%{Vۯ-t]|vO;zH6I;,C834,*@p` @~??,jת} "@ x/X_ Xț XPjS'1LZ2b4,Ɣ\ vLȯp>R"b ,;@vw` >{^J&BI"\gz~!+ȚIX1"Dd, wqD]K0s( +nH8! @M@lPe&RD-AyaV0Iw>N?-=3W$V*lI+>Fc9#`.;V5h"n0> oho#wpE;_@Wf\\,Gg6`EѸȃYd ն8X?1$LЁm[,=yT*e>m{xj5G[4YKݐzssY<@k8%x\^۶,SO&$:b*VȆUMfͻ 3HZ֞`cE^yޗ; :> :V L6"`'PXcIF,#*V*?| R`m"cprX&^0Kskyv#GP$RQz@^a 5ҝ2pm1wEz*ҿ RLs4,*m|LØYCEȪ.mn%_W߯R *hkk\jrMؼ|s* S8F-ZBQSYjmMA@ .tm}T+UFL J>Hk9,T~~,EﻸXc`1" 0T? f︈b?Q=܈>i/0HuKRVk5 HJ2 V&Os(2ZZpxJӣC ]$QhY\kݨ[QwA)Ջҝ~=xemPEYRH&R[[ Cze~e#'di*[YգauOu >ED F, ky"I2`V!0w]X ,r= a_`/E(`c` ̅V^p[Kg?{,Z ̵3&B~$MRϱE˶5kwW0 teD5ܽwg`T#>8r(Ja<q[jsIEM$/B~ 7Omۙ<++ Atzd@{'q|˺7uV9MiȊ"ć@p&`5=y+g< LW T'9ciK`?> R!>:p)Rp B`m`.X[Vݺߗ)ڊq+ e'ݞI@iH|O嶶F<ϫcvvAPhiI=Z\Dwu9:25@HJmX 8'NRx>7puf&xi뗴8RZ PJ)E{FlKekF@h`.MK%~?u(XvE!@ ă|u0',op,E_/8X0kI Xq0} Asp_Yl= cI`uN<7~_/Mǿjf*&Sr_Yby甧?!r^Wwl4::0(jѣ A]rOàNTm9\Xz\m'jϦ-GɳGe@mazI}\./TE|E ſ@pU fZ~_F{}"]@p^,Yx~`\=O (?Oŀ<V|5 lx"Ql0+Eg=.\G`i,K Z`-.B,fZ7cYeDQP^]Mhp Rڷm;%Y)77g #=`q,&5ş֖A>_ؐ?]Yr#Qk"|,wo߲ }_ꦁAsK|NG_hz=/l\$^1{x$"+Bi0wM|h!fkfC ς`+_.?~?c1^Col t'3`>__CۥeӼM_A|_`.`֞/Y^1F%UM!X}-j`߃悵ǿ|vqvEX,Vs"4 }ECUQd$N/tLmʹzVHĢY"@taт}Y(_й} p,߃0 %`>S`1!u>YW6l29~|# fh7/ebvcN}ހK,:`(? RD **:$.l'g&!#e%={vy2~~brlۖGΏkh=ZbMVy|m"|)o6iv\ۓLL@Ld^ݓzzlv^=/\!Rc Wy_|?K]6Bע}J@pcs0`٬`V?[ͪ7M(.EL#S/Ł5 :Қ~J׵RzqUpX܌ix܅x"V3L8j5C1Mc bPjnt'ڵOjr"utc&$Eh"JE`ca>#ϮE)#ר}Bx"nP⁥`b EXjap, e:EXr7)8.֛gVZ6z$J`1;yzx^U[l8xtT:frkokEtuw~Y-) ?DWF?~ 'Ou匪i 6׬EFq@v-^?lQ,\Q%өTgf\-dut}O~Z6xe\F^.l,7v- $`qknB|Jl~"n<Y.6,-5 p =|ݮVQ>e i. ŽVttucR*n鉃_JG*^3[;v*F)5ɔyVוMuZP|?o9usxV|$BT5ܲo70vufEQBEcGOuaJT,c%r"AdvgLؽwWp˃C/WGF}0ް%-&ƢME\iu0۫.B.Wu#'!@ ,@Fcj'ǧܡo/JothtʆӑljS}*viѳ_g\OVufJ):(sCswo/p !m;uq}q!211eBHuX0c{{0 e#`1|^W-&[AeDF!@ʤ~=_A?f}g : ?;\~%&Rb%M[ZA'# 0\zUCa-?U)7ߡ([%`ZJvMU˴%3zxezݗ*Q*T>J q}߭T~*V^ ɡ$k$?K xmh1jbx)pȷ_| @W!2"d#'ć @F]!Bt0kK`5Hv́!975oYB;>gc񡧟0S. ,ӝ>wpa$bJuԺ(JBR\.׭S2Uݾ}Z(RUu#+fBnAtK:lkψ @puɁe#leld yC@ nj3Ķ|S~I\|ԅlc;s=HK*ύSY*r4I*hp@؜PnH9zb9T^·0|4tCoy{6HY _'?Ћ/wĒjG@u{^}> 6xJɉ)]{Xf9Ⳓh4"ZG#~b3Xr$3`;g1G F;kT`j hR? @Z g,3`U`Y f? Ach`UчZYvCPkSI#A}[RizA}׉Y/s#x˻~zL;w޽cྻӇwߝۙ9>?{ǽKQ /gj$Zڐz4֮~扈@ xF>Vb\ i%B }vPBHVB@AkC` ,X5$ER:JD IkdY^ЊXtrb N%ć@p}0 JBdy_@qef6'D 5Kˆ~U ,`nZ /=Wh~@zoE5I"տ)_?Sw(Z͎a6=[ɍג$#PT`B6xojn@~6(X,h@,)v8wB~ z^wvvD/ Dtt3S3eB~% Dw@ \-( .>$ _3`AQc0׃)ieys[WJK^ӚѠ.KJQI"$IiahbGCtRKD),P ՚ `dYuPmBR3txҐR.h@)a{koYfRꅔeK\} )$oKj̉Bt=" ~#, @6 ."`Y~2$̅c\V +0?Ǧi(i KJkČ$-]R$Pӝ4E3GD(nR@5?SҐD֭>Y!lR.lv!%IJLёQ4M'xT"ב%) `.W<XX&umW S g D!DZiK$bVk5PJa&u7j5??v1ax, mJ6g3hH)(}A)x\|@pc#\Uw fx3Ң%`*`wm.6<,㕮$@Vr?6vq0!u7wscA!W 5CX@`e|0Ki.8 ⃂YIT&.X> $VtX"y:.ڴ)@@ q#>]`nX}:tp0"XG _?nLXIj5]Egi%)JMIPef D:}^>-T,X{^Ah4JFǥ\n@֞Fa,E V[( BԾ˸uи!dYYr@ zzHGX@":@[N Xa-pK6Y966m,?|E8ydblRfZiõ :/e;bFQJ`ZΎVFpfhX j5tٜekxat\jiI_4UDD%r.K:3nHG~x1wߝhIbSxFF/j { 8!<ۖcsc#͛|K)#%!>^!@ .<seW V^M̯$V鵏1l , oK~,VٵJkߠ<~%,rd/+ |9ҶmG30D |v? ԘN;sɹc`584?` ?e> 1ԺuB!ofޖ9X֧ @ hcBm^5IQ=eu9 CUO:MMR{.}3+^uO=7T ӓ#XjaaD k 9CסJ.;3ELCmys!I$JbO?F{M^"MٍX,@̖2}| jeB6@] FC@p(%RF+C+t-`ǟ|l+,_I* 7 zkLE).Lpsq}EaBD95wZP$VaD xn $XE|Ņ 4y>?7%0Wf,x@? >f Yf. @f+5VV }% ?BAjBѓ)U3#(OA,FRK1x`'JqNS{ Ԕֳ=}ܙRKvi4 d41h0`V$I*x,K10nK&z"κ_l\Y`18z%G[Zh:JD xxo/g/bkV!@ `X C`ej7Ą'f\vϏ_w?aQ'uBP2Xmlsq,Vt"E[|:/pWxsrvx"!<<f'dHsQ ?~>X x?,L)XY(\XAQ?_L`n[Fpf5H$PiPg_c{9uG<̦JkGB!TGvL?V Jv;0tfؔV&,퐁&a$tB5"u-jPJRt:aZyIMXz "ݷKRS.WZ{4`BLBpq{o/$IHP|y;~#`;V5h"n04g`;XlC`A͓뻹 g.6` cfs޿rďraE1szo׹IpACε~?G۵&wB ;7iґTҚ~jfzM;^`IuBD+cWn5uwPOt'`I$(`V+1acHrB`Oi'$/ L?bm[؎9;[qf ,)[- 9p7d^~ gȂYGd ?LDrةVو_gu$pݻu] L|l!ԯ>gRu7pdz_*UP;_#K 7b{)04YT=Gt0e>JO G"\~-3|A,d)0/?,F-Z,ZZKdr8 2RVՒDb58Yyx"IR5V @~Wk`.M#|r6k4'D \ܓ= +!oYA|4s%S`ٯ(2or˶]., L|&>"%R(4j٠'ϟ&&,JL'`"ݲ#JS#'1 M#)妝./йSЌHRPDRJuJRJh4Rw,EQYf+j:, T;4m7]ޡ[ "dZ\q%..bѝe(eZ۴OAKKSSsRf+T›#)-}s#wyD6bz㼒+[Yvo؋|q58!@)D>wx xXܰ\1Y>"kf^9#UDy0G/EBII"*!p~[^SZ;̞b[* h"8gNBIed21 (KeDQ]Ud573.eRViO_=_ mhG]W-jqv$dZ\Xk jqUpl|N~ kX` u<40?5 Q |E&AX- l9 ꍸDs#v\\>_|C{{_.|$-^H˕X~z@L&|t>y^majrѷ-oJo}_7"qZT}BMB_**QETB]{a0wwyopyWwjkk}bOՙ! ˋ'!ĥ4qe:@:[~,4|?_9 ]{}bAC@pq/Xq`.R`)z`iw?f Ǖ<T3o? W5ƅO}}U~\aTf9,<[¯FV (aFҼӔݪPݭ-쨥"2m-'oTjD"rsӇ%)jo%3Df C˥62:4LKw=~WOg"fB2Ww$=.?gU]T:ҝ[UUiǣR]wpo;eY5IZ4E}4$OCbc?޷u]޽ n=.)|"^0ѡeOa ߕBb, r|Ri,<7vUX| , Yޗ}NXi+ss1WhLX}_\40k͏,X Q~;5eR CYYLMj smkG?Qm0d\.k`W:yTfRwnPFLPGgTg޷`%wJqD I"rPw C)^o_w=WiJ6D"|K4IfJ*2. !K4vU9sQJ3tuw~j{a}aG=`1imھG3]6 !` `wez=XDcBLTP"Xݐ?d.\sQ\\s>M,#Ň v0Lf6cDz?V} R5?0 Uv߿+IJ UQ0zR I)"QkP(NJYqƎT JeYgy^U[j:}?U*I}~ISΣ 6p5fl6k4pc_5I-LbN=sD"btN 6j@=R%?*S/; F4fDZ`yW~Ӓ~K~HIZBxQջ'?N moz'uC>yMFFwɽ !OF#-D]=!ozA6+TWoKg0TIKgֲNί+Ν/ߞjvWPLtt%lT2ls,+߾:;;["ydzne8赃O|-ye}ۉ[W/$Zۊ?r(WX{0`˵s87d"NeSaOX.l6{ynZ96hDҙ*n qPѦZy|T3s9ی~E/ U2OО;%xKߒA, -.Nh8_yݯE~p.5_* %!!?,Cz[~x7Kj )ᜬWɤ:~OZZ'^R7=}g㩩#l6׿fewWKKKQRE|ua~?,..,l{@D"I^>?Z}pZzZ_\I&-}e_TO-3?nDrfv.qpIRĩఛL ``֯-|0qێ c! G ằ fK+%?aplkR}=~廿|WA>ZvI~įOھ$?)+ZN f:D|P&ܔߕI c;* (NC97j[׭KVA$kmKY&ֽ3-,O^|ps3^g~sn@&_##] R֖=[Z+B>_*,;,Җ8ɖLJt7n&;:;s=nޚL/@@7_z&ys)tO\z͎<9kZ]}t ے겶Όs `CFBfZF‡1QCI*M$ʞ\" wX\r-ZZd[ap'n$߯}''n%;L_pL$rTٙx9۷e:ZD)>),N{MckZ4%=6[BMd ?{1ߎщ$._r}'9IVҫo0:k~aAfWSҥ+tEuwws?4w'}ijj*5rq)Hhq1sy-/XgW/|8p]L&6u' w/{WcOZZZdE777p:Z]֭ۉ|^3]kkYKIr~|ƩP~-""Qo‰icuW!ԣ>G$x 4Џc# ʯ=X˖$"cUBf}3'd'"esNB^)977|rzaaQ ˋMMY8\엋WbQ3rέӲ[7'ss'oݜ(zPqnnΒɤɤ{Å={ٙ9ox)͛$+ DKKR=4P=elX? ćU7ܨBbձ>G`Z-0"oGIeVߒ'S=NJ̪n9bYUϵgcB~z\KKKoѣ cqq1X@cI*G17v]oZWՄI A䢤l^lD=>,Ȁ)sx[]~I!֤fo^K_^X0u-/\Q_8]v]>(}/׷e7_.6GZtUk)=D$|"|1܊[*|1rDߓ_??pYܣD|Ȕ%{:@4;;[gϿ;‹f9a,vhI ) $sT)#KSһ ?,)I_sC?zhKu$:Vyqnܘ(;ĩK{!|R$+5CH>&&Jkí:!t˯윖f$<ޖxQ5I@xZ~R$)iQ;!aUN/; 57gm'oo$l/asnK73$tXs.)o*hWmf w^fLBvA]^:?pHMs _Kf,CI=RE3IzI>~LrjN V': }NWtʯöK7Kl9bGMB/ նo٠'% l!|X#54;F嗓 B|! )먫K~yOlf4U޾5*7JcfYޥ  =9YQds_ȫ XW{BI*WǣJ+ |Rq;[[N~Q!xqsn_Ҥe66-`58|xPñexq_җWJ{f6Y}mfpB)hy{_Vf6^#2ImIAIw$]4-iA~8T5c84oHzA5&W'ܭ4KJzN~ۼq~~FnIOιfv@qw$2s-0+iRf0@I~mgsF/=%3^.LRLKʎIB!%z =QޓafS%5$e IDAT~ݒ.53!T]_~n$,Q=U uK~'AIܟBls=J:~.QśŚX t̖h=l,4į[r;r="s.+tJ~Tڨ7 I'_~u[TO Ag"-_BˇzιyYs5iW]T BNk0GP0y|*|K{?n^$][G`8̫IN.))cfxЈ+s1I>5s8V&G/V /uRofv-~sCZ\V%I} a\])hiդ{_E.$,8nL0:sJs5wmCB&'z}す{bGw9QIߓs1+?PR= .<+4γsYqEW|V#ߓ/ 媡qV1`E$}$zF~ cUv^Ôj`3Ę|!Kz)VNz6̀ =@v]Ho-bfVifQIT: +,k u<1 /PWR{{H:`7qIokyQIgx=3N@v]0Ó&jߌOs풞5ɯM$uΩ2UI%`7htR+H ϭȄF3n3;G2ۤ>_@TG~NǬV>4o$|Jz2sn2y\7s.KV[8Wq>IT [[RyAwT:?#o6{Vi䲌|ĘjX܄`m4~*? +Β>7Ϝs/JCI?e 2a᫒>7钓ł7 \O/?3[r4U0}ESQ*K~ h?@v3^hP$)=O_2? ߯{}}?R}'? i4pnfgWyN3Rky< FL5>z> 6F`Mw';4%cf6_aMg#AIf n;&|NBRTON*F$vt.4jn]8.7>_@a`WӬ rI:(6'ҡWup'Ii*_w^ M~Bd! 7c6 լ4'{B08uc!̖IW$MD52Fx^IE3 ` '6l򶒟oKG6RM/rZ#|@pb1.H/=&?*?5NIOZunNDFP8dN8]@}'ޖ '(0 ϩHzEN V@MNN4)l$H~ݍb"93ûLKqEAnR8&$ ;W8p҉PC`Ț:~!声0T_~hooi\R!XEu83]ANp`C( "]Wy&RK ck`,H)K h:v(\n3ڂ%%= #\(i|+-;归fVw=,;z^w,KPS?3[ctI')[#ߓ:M.iiITf ߐv ;~-hW'su($%E44*xXw#4;;3|H:.)3{'%HtSnИ7Pk'%07xYqP3 Av#{ )<%}jfG$$Jߊ=QvbG섾qĞ Bʟt6p6I%]7Ox|NRީ>{$ K: i.v0a]H|/Hɯ|Yk;@7@b^Y'i.i,`;)-*=XJ`f3%7tY҅fkfE{H8 ιg/KII9y]C7~_x4oELjQao>:K9?`buRÒ\dmRN9Ò ι ]z_QM's]f6_*Lt%4(|D4e8V0 z+}lff6k=% ιQ033ϭjsHO,seI Q}% *ld^Hهf6Vޚ s!护sn%~M~b'ejJYTtM7SE#|@hNRsn9v)>3 +p׸1LԱI"mb_WhX}4s@]r9')/i93:/?e-: H:*?'iֳ`ƺ? nu1?47qb74&x<+Z? th돇ﯬK'9 k_we7{w7a7!$ˡ?*i,|tN~zV݄!1ls=XÒtI~u>,L[D*4OXth jԸ`}|5p0o߭KRNIfvazJҞ0_%tK+'b ef f$=fHHo! oGh?3@1$i_8P[BBxi3j3wKVk咈UwuHSɦ0 kݡIʅ6Jc[qT~HN@% ?*vy %鶤p ?4fWrwWJUa\lOД_El; qIv$Kz#jI:~?8 c@ xc>955) sAIJ̘`+REF!_;kF*̻O`qIokyQIg,lJooDZsF~N`1!:&?V[#U_mSZJyM D8 OKjw}U~b@P_84j]R^uMvq} nJzD~ЅOʯι7'IO")U.j>df_lB}_8kfgx[aTy/Tǵԋ"VcpêY=5JHӒ~{| 8-'fY6&yfS`T͇+t.4x|Yۚ D5>_@l=#'\(?Ll%mV=FD`'&eWXh*;A_? `Rƫ4ꖏG}=|.a?fP#! T:UFkF=pTxܑ^ 5cp9w6%ĸ\VޔyM񚖇;.m+p&k84.aczI~ҫZ]yCuV*cU 5B$K*Ds=ke %pUD,G `,8$}W~gfZ#|4 Cv S@>,9܁<Нa?Xo`}oIZ3;; Z$\ʥnk UY_T3qlR{uB)m2pM2JE$AH5 @@X;B+b^PkGi.`$=߬ Ve{Ȭc\B=:GA0|l2F[u#= $pOH2*)%x71|U߳zErNaDR->֪o@6p*|&ǵ&Gh jڴZ s>Ƶ9 H4>眱D/#騤Riy#+)"&g48x<+?7Bq>@_XˆK B@ˡQ>*?Di'qp6-1kH:z7>zA hTh_!j5`A~ըqIoƮ!\?{?C.ij! oGNߟUķ[}`-G%}O~Ŭ7 $*?{XұpmK} R_~IoDKHO>~?8 cM/Z9;iHqN?l܏Kz[J:.q^ 8~hyNTM~XI"5,?"U^@8GT<{7 k~XFz0R%?|K1mB}|@@#TqtmWF4li0Я>!PMW4F4){F9O< ~Q~!uԗ4$ۢUuSE{lD{i&nZ~S4*wsV[s7Xi3[mA@cVγ8-nJ~HkCޥm%rդVp-7eXcU/0.Ie7T22*[vlsBH0Ȅ׵Gm*" \#|@ELig{c:Ue>G0 `!9I Òդ Ϯ0U I93û@/moW AĪ/Ù8 gR!w]a&`^"G M$X   @|, FL/5xXw#4CPNտ HzI9+3[G}wo`@9CF$ \>.)-iLҵ2t,\7Vr ެSt@҉t"Ees/i8TIcШ{)w%ec_ҫrլFVҖW}Jfx4CCLAI/!Z!/X5Qp,lh迢^|BOv#%z7X\ `%^5_(ͩ}(v5I}5>5>$@|?Xr}4=~ٸVѨ*= ^`,tTaIϣ ۍhyyVR&|ER5eM$? φB|44ӡ>?"uyLˆ#QXODs@ИrhQ+s1ImZMHK--gjXD ׻ B@B7T:4_[5_׏+j@:.m=cphߥdpY 6Ub,娤Ϲ~Bb.V}Jz{%!s].#1+?D}4v6y 4AQ_E*>;iHqN?l܏Kz[J:.q^ 8~hyNTM~XI"5,?"U^@8GT<{7 k~XFz0R%?|KZm&G 4"LKF{eDÖc ~E@cDǪmtă`嗺9m!]G}IISMO-9 |YU:UFk>EáRqGJ{1]5.ι I~ҫZ]yC/+3+RUh֫>j 4s@PL9x]+{4N/֨"b5>[d~V!?&黪*XUZ#|4 Cv S@>,9\M*Нa?Xo`}oIZ3;; ZK\_k|UmD: `{ Hi{וy[mP(B q@U@ OQIDAT`8eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/%ҟ3bKGD pHYs  tIME  6U@ IDATxw\gu>3}fw+zfYr -@B!}H#J=BdžЫ;,ْեZݙ9׺#iw|^y->G/'B{9yOSietUm܏ϳMU;)򄪞n<5١+U9϶Cq^h6U?Tu^Ū*몇Q H͡O"y&{T5YFFU>< xUe ުss2൪sm4`zCBہ pmf99%{,ཪڠ1@l )"r_@%8Hg' [s,"cB'D"2/v]p3"hrn,a/jDW@p<]DGPT "ri>gȽOH< HWtZ]!"Uw UP^]?DAz1uH̘dXfN!&jA`4xMLckdy̘R쌚DdGE_c v-9ư6f95 ȶ*ߏP6=UWU6ED[ b`@p ~6LoU}HU?zfgS :q%-0j4DI%yiK͇5DvQx+p8Nt - "gSmC4h|ȹ$"ϕ2 oP`]dJ|F9 GRȯr*W8UqtMXE(.7UBwOVUi܏qUgkC۸]gE2U<ϵIȳO^6fW9)Hd]mףJY~~<áÑuI>cB)M#ʹ Ŷ=$WDzs0nNUo |VOED ]ƸrD{Wu"UM%/Wl\-)n߫+H0@JU?Z%zW՝"%lrMLmDža]%ԿvSC w"')F[+֑跩%ٴX2` -80o%A^dKю{[h"zMa|v-fKr&zU]WW[QF)(@60X֐qM#3Hy*#ctߖ#@BZdU> "&s]k(0m5oZ{)Z1tU=HqAW=qcj Q ѕ󪸤QBC8WY\\}T\=^"<1;`9Ά?$"EE .1r4Bwe7ӫ^gŠ>3z9̶HDZ[8H "LV̱-_aV7zSGibNT#zRUTϪ  :sákX ;^46+j2zP]Ͷ?9Bӫx=&,M> .ɰXkcW$!!Fd8+؍ Sn󙜊]g&eFl&pv5pzJUAjSu@jmެ?Ngyb ’.ToZUb.П$ lbAHmhD1 0/W-VTi% z71H, L[~Ĺ&0 /7յM U7^挐c3<_)jsmU&ľ;l}jMh9 [/Ma7z_Ԅ34U}b[UbU}>m\q ўoEKo'Y4}d.X,dc`B*=SWv$mWs_f` H  ܦy C?E۶0BۧMPKEV`0|#lqkÎ $.8m7x3񸶱hZsLT :\7 P,4^fz1U+qN'BtV/JUuj˂,5+"?"#0iw?. t0""{@p D3FSt{̄f"&"1fa8MAmcTճ S<϶=/ 8͗C@5EsCUM*5ɏNѝf^ q5> զ´tElU=GU[,yLN;l0 l9;ky[\L i"C$6{yzk f~3AqUm x?Qk kGq>9ڿD_`flP8ʶgEd5,0c>k&<ځ "29^P@riTs|9鍃3aɄ-V"fZn&\x[UTAXiVUO f%@C/jx` ˹U@<&~6?nv9?4OJlA7?Ts̕8GꞠk)Zɬp |=Dri _c l`T) 8_:A3waY.EqkKi:Ӏ"<"U1P#jyx1в3;f#~7CsFsB> @Zqam[ /+$@58yxxLRRz7:F9{|=CǝUbE>Rvpު((ނb=+ߴjk SKɥq[H3C@ 1Kv2ùfEL[ M8QD~^e㚍v˞pq!"2kmlmVU5ք1W+a˞(tfep=:~Kp=FYrGw mΈcn~hA>m B/@<Q{k9z1\ϯ12"uK{6siO`zz:d.0sBc\*__˱M^d6j2faIlcEwC 'q=!ګAyVUDd0Ey4uq.뜎lw."?SՓm/BSLlC^D,v*'zL(ys'I㢰ʛJ9hυcUu.gGة*""r@D6ȃ"Om˯YFo5_0|a> /Yؾ<pm&jl>˄| ˀ{De" sv[ssl^$TZGoX)CuG3`s[?|b͂jLX1u 5a6Pfƨ3u"̌7WTr_a6hY￝3 Wyxߓlk?h= +pv}fɆzW;W+$^\w~[jqbID\OyuB>l^k\x}>yO˺)o^ƾY4jYg?CO'FVjޞrokdC}:rf~%knhپN`[ۃ/΍s9/@j8?3(p ZߘV=:O8<%"CfNuOO\~h0;W&~[|uky레.5Zb:=bN$|doTx]eV;.e,cv"ζV~F#WtarwnU >pdsuîIڎ;j` mu/j}fFv}&R}?z_ꐍMOC_D uӭ7}=1z+ co~\3paصzFDvv$;֠;`Nc>vσ<$f,} [csL;LZoo>INQs/0f͘NczIWK7~k/=7sі;~U}=pP'"ur:곋}ݽ3"&"UT3Ge\c` gKӿڟ22}ꩯbI{jv||CL|Sk9B8ϻaޙ?t߿J,ѱmj"ejz^Ӿwo}@U=!!e1yh A)Y^e=oPߩU#@UoVZFwySK[G/#_?w:0qf fW\'׼!9RmjiͰ2[Xkcy_Tchl#_9sˣТ2yA{5|5<<<#@C@~g/R[T~_vUYas>GѿRUf䚯ٷFUXU68ηH\vSırV{\R> ($U[z1쯫Uu~^U6z/u&$bRե&^Z]Rdj\-F˿!  <&I rl\Zm=h ,_^9uDaxu8'~ v=*yr/jl\uC4Fݡk4+>nww-h,epwٺi8s-g7]،;u8b3'BwOϳm8g";4#9 EuZ]C1pf'.]4ϗ$VޘZ\+p58'c,>W $n)\.ÕXlePS0Dž w⢣-t0ܠ|\4 S!v.RDvc?(`tQDy "?5D.Ε("X6x]ۖhm !(!` t`!Al\#9[sÔ#&Vbv 297[Gf~GQ˲n |4{.w~1}Pއ[ݮdN\]ADH8qOUJqN3ͩ.dNK߈HδJ_m< \9M9܋p^5uHp 36&$2fjaj&`.BPw%p<]qUHӏ~08Y U=׎{L|7`SՍ&ׅՉ.~~r2"Qװlv3㌄fuf)F |QMju+Dy/ BƎkZ~_.@<= $`^M|ǧ9h5BI'umRMwucl8n U]aA`Qo0xH+>݁lh XT~MytO{Pc<yBTV͖`Ӄ"6 P}^xs\.p ̔u1?62`EgZаt7~ 'X8if3]L,%+v.;`mLp'TftuӞ|;95_XuيsO`{lvA}O6]٫ݶɆsEl3رX8-`]ѐF:AR'IDvA9;jY^xL,d7e, =_E c(syw-sjͬ/<_zG;WDDTիmc{Ɍr7a[kqo̳c9jjSbhCs1&";pfO9 ]-a}s2(yo.+[(ZMU/_Yw^i6J -[c);&'zI`>_,y15H$i:ٶp02+75jLv0| 4U]m߱[v5{o>ﵿ ʢiB WӬ^wKU/^pQcu&qe\&/fqqc2٧ئAUgnl3x[̜˹]gKT\TZU}U HXf{LSG f2/oGH󼶜~;2OgWY[EQ2/F oBi> isb? &k549|[p!\g%#vx\umf&V 61""Ow- 9o"3 U-Rv,a<#\+ڊ??U7!0DUWiyJϷŽ뮱NAߺ*}^a渖iPJyj<<<^f׮8&<[~3!L=͡2"kwGȸӟdQWR!Tz\aS DNcJpj\ ^ <`(сso0%<e֖Zʯ6:`-Ռ\h^ r5Bqw }so76RV2=v28G]m9S]*-BLod7=%#dB8'ԙ27fcLW `#r\[vz)vmY`/,7fu֮odf~";?7}T[WxMр'T+r,;5Fl&Vxxx"yyƖho i8X¹?^c9'mZVj5a]ekF.G>4eXRW՗XDV<6sϳsL媪uɯ,s/&' [²kwYDSfa֝N 4zkH}c2U!a_/ n k 5B( ϣyt4Sl\_Jy! /;_b zsXFY?#0ej N~ih5%~Oi/D]j$LQ iԾ2h1>/2TF4(&'fo/|W0#V`|f (WQ.^BU1lJWS^#_ c V9 Dd-KMǶj^m_WBfJuVq\^3<U:m.6,{D\moL{;q! ff(Nk2෸\sg,}mp6܄k_/" hO734Gq毠?`~GK1fD"{khYZDzD䳸|}8B ^#"5wBDfk?ޖ l7F>-tc@+͘aƦEK0}&0c `\aϮm&tq͞jpX8״Ni{爼ZPiq"$T/<<</@fR0*Smlk+SjtL|M=NZU u|džhP6zm}j 4g_(hZK#w#-SlU&4ÎW]lw'a Sh5sٯyxxxyג.Q>cy"-B5A2\h[TF˓2s>fQYg7mٙA 4U}/܊FdNN(,(j*}ģ|&ߘJ%tb+JSK?S6+}NUw A\r6(K{ ~Pa ?5zʢ}{.빚g}-TiޔJ%{龓i>pLsȾ7󶙐eU_oqm4J oG7 ζ^gH:>Q{z蹂 1!JL;:O%ǧJ%;D|ޘ&c0ILKgpFƘ;`0p l[76/d=pW?-6 `)nLDYʰ?1Us|YOrz*${xqy'Sd_6uTrf#TD 3iFmd g6"c5k3[q,>3o1fl.4@Ǘ*'"?ܡr(c0sVMt8-J~My~fpFe5mq%יYCpZ.EL=i9]m0Ighӫ8ǖRccY#L{BmRDdf8Gq[1Fh3i=^z۶G /@<@hI*@CD,@*}$AM*s[ xhE\Qi֐iiU_7MX%j t/85s0q.y荖p!zmla {_Ȧh"U;U.cOKw q8uƷJ㫳wӫ^ ^x'DϦ}}rDQmN*{8C@~RLUj3u}Rfl웁w)."EcxxЛNեR"N_T}6-0ZUЋqf^(!ַbqvBK9W1& {q0F 9\h r^n 9ج)ȉ7SG .yf0cHt.cFЛak*@8kdl.3'zxgOLDr:Fy V/㲠,w).s} p|؜1ZB5Ǘs=ʇ1g ۤ#s^6\X/A\Z7,8"338[mFUxEIx f gopu'vg a&#T܄ȝF;VЇ{c*o}{zU^xYF>W#eB&Jnʳ߱T*DdR{VRЪy!AD18_ň1ㅎ!`S>*?U=7Lo5AѓC_U^PhR%l>J%G-Qq@s>jd-0si B[\c΁^DPB*8 GGtO"\4-vNS"6b˸]E4_mO! =kTZoN:w9>Orz^xqff` ,N'sM=TBgb63*F͜1ba)f^ _&ݾ* G 5.p1{1ǀi9K*J4`> XhCvށ>pPt&\-JU_x&Xfx`IS*Y-0a9X{p}5::aLc.As IzUs}P6XERV_p}l3ԵhzF_r U0ӫ^ƿބ1I`ah124T*y.F\~GHo`zL%B`7S^5LJwyx1R wV*=ڥDo XYtkCg@oW 3JUNϗrH#J/SHdVN(3qqq`]A Xcy KD:slΖTބbr5vԚW8\h*|h.!wI٦|Edk*d&-PՠWyz㿿e=ƣ} SUՊslS<[f\TWw*ec.bW:}8w%B6W/l EKϯM_ x]#."nDy&[) @Eiy #c j [oqYU[H0MmB'[Wn\NH(=+"#H$"5qpB$T'9KCgR ji-"O^RkUu%!"vuNxL`M$g *8IDrHp$j{娪Z>K3;zȑ7ayk@ o6@5ƴk׮xccc744"f ݝ7o^lttT[ZZ%DkhhHgΜsa֭ٺ.]4 3ϔƜu0U1lܸ1fsmˌ3*Goo/555444Tg%kc>9ЬJg_c8qyD p0E֭[q֬Y*Dd:|t:M*Wm;W^4777ftě\r;l)s:L|8x\D~罹FSTɖ ɘ/&{Qjkkˢgl[Al?/"{FaXfZU 6Mh81Sс"L5Loטp Bj]LJgs9 ,"wЎV0bwI N42)K,g" vM L(tÝK43Fec1cj]f.\2hF7&}3Z3>v>#z{{98G.zX DEEd9m "r;3=&"eUu誺l6Ll6{nbj?p<^j|wԲ%{Bs_YBk=+7z{ c"h48xx~&=<嵡6=/@<}z&ǽj4d'0*"w8οa3,/r5yzvO69$z Xx=lL5fzjSUV18NT5ˀ9@ʴ&U==dZ\CNvO[v+"ž."6||.W}py&bW`!p-3vU=c8YzW .iG3VVUJ74]"xnU0c4}iX8t9M%&\bJ&x<'@<&jx+AC8,"C@}n\$Ha~0.c2BX2ä4HD[{4!S+ ҉Y<antCEAӲJs3Wx<^A\Y\Dd&"zΟƑ5akGYGmԤUiDTn%y h(TlyVDVU/:D!ﳗ;b谬i1LK42 h#Xiiiɨ{qɋ3:{l}W%VwjmKqNhiZ:T5 ׸ْB3p^᎓ me\G}ޤժ 7  \~қbFa%}@U,0a~QU}.M׆/,|ja} 2֘6;iNjtm-az+/ڵ _IpY;#B+Zx]:vo9Mj: ŀs_T񸎍I,{^C)G 1|;MބqDavU~yL8Gy xQ(g:p%;C3G0f+Ukb{Y"_ks"})TYш9QS&&$wp`Y43uGV-i-2eQ' ᗧ?ȕeRicROh9|0YȞs_ly} .e Qb[f#z[Bp5ͤ o{vbpx!\ˤ2@㛖it%",Q\(P6V%{Ԅ"@DTh7ayxDcėlHSh6;,&m\p6;FD0ެ1Igv 6#߄l6w```TZᖶhmmܹS 2dgϞݠHlpppPUt$,dXKvܘN0u|]]]RNKB -m 9z˺ub͓\=E,3dɒ +i=)xqiX{q= v 9,D0QSSSrYؿ*K7g[ǫnR^Dk}ZKǑx'  Ǭ%@<*A%UKX~8B$)E9.:+H,T?{[a|? A9.Zqa=E )=VʨqSYx x pq^xxx{PeA$i"G&U7’4KTUcU?8va^3]?:CU{#i" ГdJ0; JD1Cz6F= _ĪDob"VD$7s$ϙ]rTjQ2X*kp=rjhUMJ,Ό%ꦧOU㘄qE$m*n4H,.RrM~T4ہy&pp>M5h =џdbS='䅇 O*dҮE`B/144\&|J ]a83ψw?ƇzxxL!QOqG{"Uŷ⵹4IX=." %"3v 9}t>? GP>=~l.FB$U|a'Yx^~h [pUIs(acLjQï^p}+E3Y[8HA2Q‹:Ȫz"԰IUm鯬nD}'yq$l\M9^O!<<& JHNFFFUeza818 ==<<~PU?;яGjjg+ `k /@<&GsD1'78_6z*@SՕ6ZjOlTbU=cp"'> ('d3a|٦ Dd-%"ΰU (ZF_U)\LvcvVXd|O ':PrO^DDoRzK'ǚmcb{?d"^pHO,g$:@,] L0v2N3 1nV ^*I%D<=ʼ?<^\)Umf7r\>T`q`&0 @qTuk+,/'zz'10 D=3="p78Jx.0m+xO;l˛5M{ξenƔ~,>%'3tU]cC>Szp=M}jT=mTUߨB莇ޤy0ޠ'z5њ&\)vgiT'iդ]aaku~MX{j;*>NzFQX&iaAъsNzxLj~~E> ?xLD60lrX!I3 X4`IHxxxL}#|J#Io—s!2&8PBUlN`YfBZ]j̇zLY %Q &S=24(8qa܈Z+a2 We..<*"М3󉪶vFEOUgA4?fD$g}yqfXC ? 9uwu"ۦ3?KB;Y IW ck5> Sa\&%72AeדN}](!-3nǵ{7&8?xZB|1IR!@r% N#xxxx##|%0^8&ֆe ΔWJ.NuO_ڀ}>*~o/jc"RS[S:sa#Lj1zlagYTHعgvL'J24i7^yxy~ڮ'j3at[-:+/uwF,5[;:ίoh9ccl670=QSW3gV{}{ $4nZ`v!ҕ!6ccDl8ɦlm:z53cƌa|_/@<<^QA'TmE1Gq_aX|oΣʯ:{J%Y7yvtIwICX09sf300,Äe&k'!,ݓ;m˶d־T*޻Wv,Y~Ω#,6/AȕLfymHų+bX,sBPG s լ{xo&ҕo۟OuZ~CLf ˇad@]ٛ V^+SU5>:Ny F' Sk~p$K e%:0ߗ;74P<:4|/[Lh(R.N'u3 EX|IIѓ~%'٢(d8pyTUfs]zx ^B91Gc>V?zupzElV%;pD#{|GTgDMy3 ;ڐ8޿PJNM9{9RqB5]ɧ' Azq ɖl<\J;khug.Y\vG/:qYFSvaѝKLYilHb7BX u^c_߾P/^4AE.?# ؕUCD_'xlFB[03C* h__0bWlo2:cUwha3."Xs3X+/<]3)~A ]L&}hDJ$PIɌMb3ə|&pw.WK4|}1L b#wvI;k3ml0ciJg3=i|[anD|jj0kەua~ 5&!ss^tWJ]? n(..eڴ_!3[r\7_YѡK{Dqt+{G^x琌>:dʞ>Gm6&:nZA) $x <܊j/0[}'oFdcL)BEK<@!;}-#G_8&"k_#UA}"uW9ɇc# FG0}D=X5p-Bnf{ ~~ [+C{ۑ8N[U'ższcc~*PT<ko1kU*%|Z;}ubfijlNx]p%#\1eL˗NNM??X(¡PbOwO G &g3.Q 2&x~qf/h~ fG%``U<3~?^gnVbQ8VI55TvC%չ/L.tҋɉ)qLZ/ @;:;"auϑxSCi8 WvVEz1#AZ.~H7X]Xt[>G}m0lOGqmlVUu[U2 C/s}]!ζiiYBy%gz|){^."I $PXx"o _zI`A!P w)R<5ͯYyDӱxU LOM-r8 4rmm YXt6(|fPwaf_-8쬯4>Ox8(L=gpm`YZ]̴_a*l: nKK*t{E]woP(QPkA @r. +FbuuR\^ ?x^<3rozz˱]._8щI;`cu =l1;떵.,S7{`#z|flH )O&{ֻ7):ov㥋_z`ᐖؐ+>wZZS3X,>|pС: |_c mMI^ {w`߿||l8 B.I 52jSeDŽ޵Qu,mJB[6 U$V`v/k f̚Yzu@ FǮB =3 S\D}nXM4 _ (u kfr2 *P˥K dC w'/ =,"m@c莽azF9wc<fu.He?Чp~`{aV/,wGm0=`rȡ`|^v<[r8ol?\L`SiF PYL:8~tfP8+K^Pp浵`y~̯L }SywvfMtWAP/ȳ]VM ګ@hnV0O O- qл78GI3*ݡ̜?x|*YɵTS#x3_'z辑tWP晹LIvׇ"ܢ'5P;2:۹ dX"w0uW)7w,A{?wednFv= 3#JfV](e=}&46ƒ͢|QuhHPHFA\߅1WZtqsP)|oxCٳ 1UP@IQ.~ԖyȗDa¬0lDDTDړ>`VDrDwDf++3}2Bëq1>:W 52陖x4Ի8,B}:{.H."Dɺ>y>&\,YD‹;v0/73>Zhikin.rwRU8'WxVv}k@hf|?ٹ0S{E}~*@>+qD¡V3a'htBvNFDD P*(,ff &  8%fmسqܐ.g\z_ JR9T =G0}eE r$0+ﶯ`։<%"%UZWrK#]Zz됺3rYoPYԑ E|?|fh#b#^}K z ӧNEpԖD˥DcQUc?ZZ.PbL0vi&QD D lYRqg9opf_ (IDAT7~ϝ?-V* Nf[#3n}c3.<:z-(/ ZfEH),+H!7X@r#_wwg;w\MtyFְ[:?WWgKC0 lşr̠Ŵ\har6j}yimoSqPerMGUw |8Z#( dKE"T`B<5r:rϮr̷& m_D0^+"kJ(Y2U/k.ouqR@\p8q1!Ҳ2RJab|ҩO&⅋ΑC#bQ 񺰈W.N#GDL((8gO:"ԈH4"Zʹ齴낇lBep`6GN=aH0;掭Px f@ mx:~ !<)#p(>:zzLOMI \rԷa GuJB6=׹G^>s\OO6w&':q/:t`zhJxD×_Q/S}Dg#`xwkY%`Uk`o\&\0UK00[}a6g\v]7i9" HsFLF=&O%5 g"uxH'JA q"p:gdF"9^(,uѾDȟU E$eܳhmkCC)WԚ5@;n39bQC~f\ "}f ڍ`6clx}ox.; 60 t׉7J,nKd}{ʵ‘ qC_L \=;8(:ZX"b],:ײ?*~9h>r#Gr{K/> ;D&Q(zxcpw[ͯvfok30 }{`6;LeʗafR}=ovo3I/flYc.:sO'/ #ҔRn7FC{{B!76|z蕶pCWu1cvYhXϔ1-OG"T3/yޞٙD}"?1>OӋށJ-u3Sw`.rbf ;ZȚ[Q=ڪÌO|vA5W_|La݆~މ= glqVua=xUux@?~Dpazޗ:7{×`gQ_oh'"{K]7r.6Y =$T\.Ţ_lVl}<v\B/6Kx1r@LGkaJߦ`jTfc`wDrdzbO~e.]PAX,٩a46 cO+h4М ~Y7z R9u0S,xؕzz#KX <Ήəb˶'^̧-{~-斘n,&:Vۏìhމu`V]>`qDI6ڀr݉e}˳#bі'/}_ xыKvyAsaFR/xkizDh{j%[% } qsN(?pߛƽ$x#No_߾񱉙s_\=եѮ07B߉kkel WO #0[ff0cM0ϋzBn?~vy= af9 ZɎ}lk~iOʅB1 }shcT*xrث4ĤR\^mKO77EZejbdg{/9%gbߍ$RBdd2}ܨk fpߠ&c;`ꛏ.+=fl $K2`j Y rf|4?35"޸_.5󤘙Ƣ1tt.]p1Tyu%{vpp(8# rXW* 8K~K{pL&$ޝ| O?c%׍\7ؐ^<-v$f2|-d>;jFu 0DUME)jɮ6ڋ- ;a3~v_U.4Pkǿ`u%$6AUYFWA"ɒ:ۚ/;&u9/R=mDs[(Z\*Zd!m.A4R\.E%']oZ?مe%uBK,/\93{= ˀ.egGR k7f>noNx@LD?"R3ڪ{=\{u{Vݔ, UǚػɷS_x  s Mi E.rR I,WVSgOOtꤩ1|gO-x5#AA9˞h,1 ٬tuw#'$ԠbX]O!ָq3ȑs_{&\*<>;6٨&;|QD>Utf݆N7~]{¢7;j_w6+ We n{fn`V kHWUH$Kvq4}=bBI5@jdJ.Rn}ga12r`nfVzzuhl'5'p838|p8h] As3A%5U5SIxn0Sem@hܪq7~>l s]eO¬L`4AwɺG~3dϔ+-k)XD =׶vsTo7C`OǞEB"‘py>; _mx?S3D7|̀x-D^iU%abMtwj"ae ~20+ڿ*chٯOkgމq'uDm]h_?}:P,%l|cMylW+}nf|#0kKffW7mmS~jrS\f~}QFo o;i02N%"ma7!.2ڊ]$1`BDuL "2NIպ{!U7?YY_jܻj kwu0[{UÁYl ٯ<)V@1&"5wҙWA\uN.jWnj10vODMdeqւ@vM5D8N1ӕ"Um} Ti3ADUtMjSyS#&tl pr"2jZv7͚ A=ab]SWSK"2b6<>]Uf40[<\ y00+r73{J-8NbMt9FLڭ7^suS=+m:jKqUT5UޫUm8UL{HH5ŽɬJ95jHQD7B՗߈VNMtUվuz7^d _U*7sVTmD{:*,/G/遍k 1j^v]0LUov; S!Pa(lۺW~ ```A뜨*8 "rfa "ys`uKiO9B;diUդ&B&!盨 4`a0R.U'U5 !zQTaU}оèzm̍=ga"mr@`QoI f+M5Șaöc0ݭ mBtj,Dǵk5Q֖]XTIS[k}G ']\_D7VAv~/ ]j`e{Whpfj.`h;96;UKc~ dnaL0%"[hk@D˞ig7xYTnmDnVk= e{r뱉 㠗;FM o=UZمU=| Pêzl˾bTnsšYX<̀]f/Uw^SV]T\䟊^wwj@짬 v]ʱzyUE{Dd\UBUW@ko/!"_bMt"]PY@h',,"ͩ o{ ;af DDUWZ WvWW/Vk"MrEo׵WU$Qm["GS7U}XF3 kەoLLMU&:Q-fnMkǒDD5*<ªRy~l5n~LUSw*oTՇVQ]f!DD5@X}8NDdx=jT8L KD'"D>"]5ѷ{CD9&:3"me BDtSHko&!"_bMt"]PY@h',,"k^2xk^?x!]-q_0Z3bI}OuPVp7j/lۚ.,"k`YD>aWշH"s^XZND3jTޥQշۯoYƪe~@p}U}@8"rf&jo=D'"dd!MvLjokF`Mt""š1""{ko S%"H՗NDD }EDkoCvsb?eMtf DD@X2 DLCD ׿Ě DD ۻ&:O9y3IENDB`xye-0.12.2+dfsg/res/detailed_L30.png000066400000000000000000002543731225403634500170320ustar00rootroot00000000000000PNG  IHDRXXf MiCCPPhotoshop ICC profilexڝSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/%ҟ3bKGD pHYs  tIME  5) IDATxy]e.ߩyHeI eIPZliۭ-~n^ۡEG[nh@$ a dPJMǷa*!zzR^{o{ DrŠ>#>w$^|ERr,{_q视JRPoْ|")S5{_⦅Sz=wޣc$wv-T_^ILP^WH:]+k+$͕Tw%qD9Ʌ ZIu$k0' tu)$i?2rI||pK \LCI;J'II~ 47Ij*>H:4P"}lt#)vq$`:#Οqy{=$(H(ig7J^KʐR=3JR5X i&͒ M((Q"u@:{mSh RpZ,pu::nk A$]M a| ,&yS!eѭ(Yb =FJZ x&IG)\`*0Ints.. $p2.@Uio@C@Kr| 4=CbZv96~VFx6/\Nrb@>Cr WyωLEQbO ;D@26D2HIx͎.Y[`$%#"HF4\1c(lHzV$J.7Xb$ L#9 @^Q^Ia{snu+J('JH[Q$y&6j$}-|彟Drι giIΑT[U7Ls睋$yAl䧓|j\JUzfXOro I cIkIn;nK$L9w0Ol$66cpg-Z`snQ6؇IX]iIsέ9:InLD%J<%dȶ!Dui>z%uZV#_4J$+z 2ι}%l KR$JlH?shj76X{ORw)5v \:_\uoYR1EdKR:\18,(QUI$kbѐCvKzd CrIYKNQmM5a k\&+^2pU Cґ(hy$'Jz9hH6uZ7oYD,*Ij'tu{RqTg)^IW V(QN,%&u֥5g, Kүjvڱ2gOj~ z PtIhX6EVo5~CaZxfL2C,h@L>yk$LoH'EEm򒮕tEWkjoa$Oڴ[֑&)Ɲ7V+%W!SIwb+eI\popM{*{-z$o3gG!o]Qb+J(_KiZx;X3PPg):Z+bwdDBXyWguIsJ;,[ΟQ"%XTh$$-u5!^eLFIp7Bz6,mYWg~sI}.p_7YNgɩVWU&6͒'y/Ƀ#5'ݛug&9o$x+I2]W@<XXI7#4CܛtAϒx)} ׷{K4)4e֠CVIXjQjgC\kst=Ia$;$ :N3z"c7JDmEV)wC>,݄PK0ZI%=@m$ya b&-,<tVx};* ֠q;I_o|3Q"%QC~PtXRɱV잵&I,2&Hze &IIz$wLOߎ{k$mpl⦅1Fp FK*[:{(QeoD%J Q2~ =bA1ɛ$}wm1$I.o-/^SoX"Q؄'X@qXbw_i}GQ?)(QNJxzÒ~I|XwXfu!!G2kdJ=~B)Qr|-࿐j̖Pm LRM{{Ǔ#FVkp]g=/ZO@ q kiι"ףlGDp'=J\Hjzn!rg\ H@:`F`UO]೒!s_NDWކFp:a%9 u6ktt+i#GTf >΁t9\7T%J*?_Qb)Z ^ck&^~CeQ9#%aj,BַHQ7H'{dسՕ\ 7PjH&01IKH.L@{{#ZUqomm?׹Xpέ&?_-i1ɽ$?QQD%JS.s;Jg%ifW7)+J)>>6@+$$yp'ɇ@&N`ļKqY[~zy'"[ R̴֑watw l$1>$iF|jHSҢ"\_\ѢHXKI@yd1>(^ټ _/`K=m$/)rZg}JD\"]Ic%{am$Xb>wcI>0gI4~%ʉJLɯ$3t/oso)lR8_ܥ"XCZIη]I:a^`@rETxߛr;(琜'ιMua@3O!d 4ڋ-}ՂPw ټ źQ4E%o j[{H^I$WJa Mb0:+bgHV(Q_@ DRAWQe5I$$IF[JιmBrv|>"F[j6 -QIt(i>369q,klsQ8"WvLJol}3d=u+(Q+)LWs-VJRV2oBv0UbeKA92W([RBCAzURw7֖"5NcWR]ǃD%J`%{G:rK *e 0KBN!ٛ؂@ ڈՂ@"a]+-i6IoG,b_7k8AZo (.kѵ뛯7` 9j&zXd%/JQ+d,Eȼ[q{^qئPLX`/4!&M8AI%M'.i3sh np*X'@N dW.!Y^T^\]wx}ks{hw$7mo;X5O2++JL,4uRjm|\jC5z5з@sǔDNʁ=(3 6_ZeIU$2In:ܵZts)p!i:M"ytVc^K!Y\JrseN~0(?KMR닐$+֛{%aE3 `R#XQD9+Y ]$F4X!u&܉j݀rJ:-8Y[Smsέ,6Kzu$w&i @{t+A)9_bљ&4*{In#k&p]U?Z{E7_/1 u; ~V(QN|efFPKr?\;B*!jO|ƕCR^+TΤiEyVx"K^u=:(̦>BAs@s.HVGvHh^;`~ ,%Ӎ0(G4Y|;I!tΑRk $GZomK֦$"'ڞ:^9sYI}uj)Es+i|fk%^ɥ"t2W.HlQhZ~.d/Bx^v$H% ,h,wm@1;%5F1oie.%SWH>#&߃5m[#'R@?ښILr~B^95`FIRtz\]9E In 9N8` y{?7I>jϓ{"{>%[m m ;@!+aJPh=0 "sz-WOV  Y+./jo%~N+Is|?[_#עַ(`E8X)ЖT C%D'H( jRB(BmG$e_YYk4r"mB#{\0Gn~gXSK2[;l!j((&|'< `ιN_$M9jiζ›Z8MRsnQK96zF8^5~iװ9W^gVRĜz{>עak^&b 힨U!{-I@~ox-[_HV(QNZk:I@Q$EH֤8g"I!)C$O{5u-5ID(KZO疮I]f9wPRmdIg׻ 0#Y$W#E MDHL2^$Hri$ϒt+J$Ԟwِ`OVgg[oBIs⽯R!idGI@{O_w\Q{ {q V\1jюXbz+]DN.M+z{?{_~#XQD9CX WUktxR]->jQ:uV5%Պk! ٢mNZTZ{?n'y~tf&VLR>zMʎ2{3SE&8p+4pe/|d$!E09Rltnu韄 OWL\^IG؛&JFb{sR~TlYZ<tf[*Uc\S;$.ծ/#쵨ι"C*h/B~N+|{D%JX3+c-Yz{-_7H:lf mO#4/3Z?[d2%`n+-ԘlP_Gtf:gz~N&U%ٛ~NٮV(Q3pejѝv2ICI~ wHZ;i+8P#V9w9%p&Fx6k!~*#Hst /iNI1In07ItmϱzH>圓sN$ uIzkɜV|;~}=n`S`#&]A1F `,zIKrsn%y$sЭY&1Cr}e3s~&y^$J[I>bѽs7X_g[6~kE% f" wJ=q%{bR%ioK VS{_,S$?L5XD*w7JZ*i Z''5(VRk\I#mƊ{_oÙὟ-cs%Ӭ샒>m -Lmq&;[͏{/ޏβbZ=Z^{{o#gޢz:js+mnv.>go{_d}j M-g{_*z?o7mF(Q =|'/Bv/#[oWIl܍-5$&/{~ k,@쫕!RkS]ӎy}'9{4ĺz?ɅVO" FCdё"$&a6.)bn3${ 4%J`m9{I\EIdQ{~ k$-$ Tsz-j7 a$[p/i5 Lt l䵒fR^M5(ho^9{IOp "kŽιV5 F @Z87mo7Ϳ& &&~('Q9Q< 0CyP{$im&kLCh6Pk LIsI-}R,4Dنv PLLꝞG5v[%EH%I޻tՈK+ŖV{{䫒h݄tCi?`mM$Kk>gs8$7޿; MHTkrmLz%@gPι毯5L @J-j7k 47z ?JXQD9jxŞXT]o7#ZH,=#oPs/]GW볨In$~ ɋ$=KX{6>mcEj%?[0ۍKZV69wZ{-;šd`'բ$/Tb)rJ"OLX{Ε/R!}7%tsl3èιsJ#"UksUz[No {Qb5 B(Hobx dF$ `;$9_l8^.n#B>IHMs&K٥ns \gck3ak1[A<Os"g 'J 1k.#-2B87tvsEZFA؇0XxM~N*i$+^ᶷvΒl4׷+sQ,{"%p|L0:]$`} ItX( xwwZnQ&8?E-;HBZިv;wm58mG' @O*켘lo.t\ͷl.rۛ_U$s~Nr!+?ϒЛUN/B}Ӏ܊Ar^Yv}Kz\ؒ}Un}-94 kh#XQD9#X,B7iDHͰ(Vm͸ {lH"aYĮ4V ҹHƮRp=qkVv9\>ME&m䨯X/Ee;f-ʖk [{-bH>rιN#Ƭ~8v?m$ˮopP1H:W{P+rrHyXXHzw|/tOn5syw!%Ԉ7[+}Iը`'ޏ5FFeɕιn|nCASZ\4~0V]"{ UmUgn0~kQ9z[tb쳹ZX|ks~.f= (1%J'@HjLH8l]!*֖_^ݼbV;"Elro)oCHGRd"XA͹BG!7!tZ*W;Dd>:|MRdeHo9?x5ы!8-׀?Ww(~6axzIC](`EX YTΛ c iK5XHrE֓{bGHyنA4 ޛH,QI /(ȄJ#7~ڨA;bÒ69玙^I+$ z}b/^{(`E'VBJ#KI0ZL {' }"FU,HrSp VX@uIIHZ=y8u06:{uKrH;H3jz%s?G+J(J,XD87$ f㵺{U0Tzi=TeZJʒ|"7|sJ]Ie3jXҠ1h?xKb.X }V(Q1J,B5J'%uZGb &ˀE~r2%VлxJ]$/0@-WRS+@$iC# \nkۙۑ:HkW5,.se6\SR ڜD"?֥3*FP^KQW"Weod~9K0QN>]QONEPу=Nq2oѵ$7xl9l?Q3mkFWgj |2IdaWs%0 K$hzu HPӀjڞzuyOY2ݶ𼁩:z63dg1^FmTz-rE8d?VV];YIN(Xmd=o(gzvjp&!j7fyC܉mA6 \&i=voga^+*FDrETT4Y:-hK%`MѪKE8ӛ>l6MgsLVodg!PM|wno8h$9')S m/Fm !씤9o5b_%-%9(2ًOsˌq|s&Kڝ`gNLsn]LK\{ιW?k,17%Mpm{{ `s-2N/&ij l/>=հl1%J2\5s0 R)@o$ ȲUwZ"@عDK,Xz+#Ɇ`w__={Ml`Rl[I۶j~{Fe|Jm턮~u~l?#lgskS@PVxg|2֍ -W;Mx#$ݕq,>1Ϳ? I_86IXs T&p;,9YDW,wXlz+H_fnj--v8|A<@-J̛, {u /gE%JcY"!q\!!-E76#?oN18.a7_xMGNūH,}#- s%$bk̸/Ml;_>k7mͲ[cHn099kd]ONRt[.6@ss=_ji(TI @W01Y#򭎮!vD{?4¢kO惫JqHJJ IUby_/Q"LI H6҅zZ^uh`$ɳqp-kk ˗w6jkljv̸̡2/MIM.乒IR`GW=c~KczӶq-ToL^w;~Pb64UU-: `>p$dI{w>8idׇ#h=0L'ϾW[IZjRlԙˬo kZw=O>.{۟i8ll!m1$-zÔ zdWZc9n#y:q$9D%J+3 X5YKo.V4l0nm Gx겘ހk9=$b#_>¿3'wgo<7%bЁ6%=@rS%R((iޛ?o—耵F'gzGFn&y`j7:~w=gJ:deѕ_JolD{jm_Y}=Y|+J: QՉ]=X{?8kV]͂=mY#%Ϩ떋~ wLn|nm@z|rU`vkQiQ|(C"D~Bzm<+.!Y-VxT:`U4+H^00^]\߱zKx"IJJ$ygl.\7z}]g9w!u5knܐn[j̭~u_CJ"t-pHR+>ˑl')$h7Wg_륽C5SVtnQ)}͖I}o&c!ۓXs$=Yz眻E/noNj8oVf:>z/X?zE}h glM2)ܘzm~?޺js]f_K7mizۧ{l 쫭Αvӕ4T|8{U2`%ce>s 8׵e',ƾ+ f sqfQRj$ٔ@]2 !٣u$$4%%c`̤w}?+FDrT ,Iߴ˗$GuI6 ojmcڪx }uf{! i'Bt a;InaēFx{nF ڶ]7o^/'䏶1_mx MfW=B!ꄇ(;ڗ^}-WOx38se|WaD4;wEl3p6v'uU:U[#e]h i`H=mxO7vjF_oqպ}~y9xM%2 Iv@V19amZZkݲloMMvW~y˟./ՓO?{#wۀ(McѨ Vl iuNN{Oxʅu/~} #vmw>ۉkwֳ 6f/F҆@iNy)ɳ=)*gNFK%V؎רIyb+J(wVR?`ĿZ=U}[IP qn6z?9goX IDATu׵[.[{]ؘh8!üuy/p_}~EAP9LfjnQ(`ErDjƑ\k`t0MvIa>YZJp _Yt6x$H @f*)+1~+.EMQSo_'\fK[+Py#aO'{s,p}{_/|䂏}{HWS9$HZoo/tlρtg{do\ڐ^hGc~oݿ,49ffQ~ ~ D9qeMi)!oDIfZel-Bk}{,t-+R+7[=R`Y9W 8IW Mƌps@.~yѨ^xO^Zd>@o꽍),* 9sN%>oK:$ԠE `:We}[g4Oh]sUՂQdԖ}{ ιK\o7s}'˖6ۇk:9X-~ D(Q RH79ۨ,3Ɗ2>IL}$7You#Ψ!(siKI$ZH*q:Ch|rO<[` EHGrQcX4c+|#* vB%QO,Tju#S>~2x$Vޝ `]Fw{EjTl}KҀB؟mI{l-_6|۪ri(Q"%J8gS<>5&YE#sQgNnza  ҟMzHNG3  |˙ `RҖU~g  eyl(Tj!9-Ki Gr+n(_ p|1|;}XiN%(QT%ۯjjHX&|LV"x7kQ:L\guCcpe(E6q*ف0,B(mz4l7uM&1` \u^rP8;JD9%MJ' و Bqg#tu#vJ:~P9tP6!{SgѓB3mn^WTn\_;죽ב쳔`Z^޳TT{@rG]Skus s iƯI 9/4]@%@E$[a4%nNұvu!P.dG{_o{$w[ $v$۱g L!D@kmOɏ#ĽwPS2V]LgjP:S~ `=xH~soDrG0BZW~5"F@AvצHk(Iҕuv.&DιFk͵@JZ%IZ`vem@(GH3njX#t3UYbFx;NARƁ{L{m6! yWu&Spіe 666I @fȰ^$ M4I'3  16ƃ (:, >;z dr+/}`#ɓMMٷ,p=סH͓2gٖ"XhJtNfd N"y=U jLш%RĠNWAnĢRy/ ,?w^po6{R*4ّ"a⺨3z# jIQae"%y@ k "{Q7jEU@e-iL&LhQ?5k/5Kn+E4oT~on&&V23;In=.5" W.q"AQM>0Q]%+W&Jc\*$?`fW/)-M[i&`Rp=H=`k&31ט3{PQE9)!9)f]YNJQE}zNZ3; #f J[fV5E>$_ƵB.n"dݛ1\_ItfɒV,?"ԃXef fg5;=U֋RܡhՈ8z7DIJ"t*ל'6:F}l>|p`,ĝ%r!]fv҆OB?vʏg$J6$"vV>3I6ǫf^Պ=TN\ @0-^G&¬F)]x2qof~"٧=p6 da,t(]~?[s5M^Crat0$oPj:x] /f$/1*skw~Og|߆'?6ЯӲ :3HH>Agme7Maw_"baDr;H.6#eJ_X?y5Kf9ƛƫ `;ɞ~?Li,I `JuhUxotQ<jf t!ERc^?kKڅ߯h_o‡ь.7?x#Hn7otv+3D\z=!G3~=.B9zl\Okzl7t^nhFiya +^GrhW g}Pt_qtm!'%*$5,w4;!_zn#˝$KXYdiXgҀ![x̾ i=u!ExyOet$ f]k~vMo;a*㫫݁/C߽mlmsܓPsyEX1AqEQvlX_gͺ%'X mf[ʠ10 ̌ݟ⋸C3v {6 t瞮}=Oxy \Q~E)Qw{RV:"hJ}w!Ry m=ԩ#9%pc jN[t x_%"d{CELGvˀI4TzHן˗BW {N #;"tl:Q}y1{2F dr`PCLv=6YNmm3{$ }|PCm=[fW@ߝl=uѻe?jM%DJDO7 BlbHh f"r7]*_I܏4{aj[O|pɫv(<=:) W/k'b#{T?*j=4 dWBfZ!d:o)JDCN~ߢ+QEMscmcSr V,oI ~{|oJ+̆_~B:r,}A3I>cHW,hK?t[:k3 MS˾H>]ƈ@L@U5A }A#h5w|,|֕;J}5ʋ>3M>.b)5{e ^6S,_DY#jϘfKy:H!N0Cbea":D12 _A/Ƽaf+K,0}) SJ%bYbp^lGtZ+G}IQy y-~fۺaGjϳko/G,YeX-|م튬\5E4zq$uX]hai)Rj\Wp*I.Bg/lrgɏ׆vw=qhef/zInƖZ'[Ow*bm$߻ .}9P#VI[ BaWlfG>ef 'y+J/5'!;|%u7fɒV,ǘX%6CP vݎXR$0R9#Yt kk:ӿuöQ? Nd‚ymvNʓ~35ĺIGM} +־BAr@^:|C'D3[1َ|CEcC:G1~eGPTm"UM[a3[5|zB#g;" ~9 _'*̞:"܆ u!<`T{v?5Iʩց.b5K/YrK.3ЁCC˕aꄆןLk/_]vfa}:bjҚDJQIErik =4Np1/SŢ}JHEohzhy] O&RT NUSX(;8\Yd%KX.oCv}/ F8ڸ|vNeI8 ~'#@o@xE<x`D3;C{ph\J-FßО$|Uefg|DXzf& d+K,G`]dXeq4׬Hv<Xd ry6OS4)KΒV,YYэ< 12P=.D3PDњqN5U>UCdkc ja=6@uK|B mKJ1ߒǂ&J'Brk#8i 'ݎXK 164UЩJ!$g F?{_s 3;"z$gɒe z̞4 3xˏRN["v -ĨlHQ(.FfC:/!mmÈ,}qݠ4vguh$߬\ўGJ3AIJ3u%s2ffO 5^'0dt & ׅx/KqNEfqVv~/)K,YdiI(NVj'ɊTVD w$g|?ɟMݻ #9OZm$VĮcΒKNfɒe:3%hC q=C3<`>{z#=ӪWՒ^N!F3=G2#R -Bf)00u~b6Tuepn,Ydɒ%wMJr)Bmݫ Y$ohx"ybTKr~_vay"s92;|]Ydɒ%z4J%I~> ߬n<#y yQ`&.ۦr-K':W|I;5^J -*9K"̒%tdt`3E֥.]!] U.0J-ҰβAhII~E]hO,OU] 1@TaL3 %[B1]:?̮D y$٥zt{쇺v mf<'K,YLp]@\Ps@I_$fu=${JרSkǢN8)"Թ[$q:)%ՙ>^5^7 eFEr~-|~~/|6\oI^מ*~fgiFbzHVS:Jfon$rWMCwU]joo'y\Ȓ%K,ӊf_RsH^7ë5Npjuq,wv2t. ܒH0Vd;Y l)3Tߪ:c ~: ,5<_!irw/,P;tsW$NsD )nkܽxNKM L{Ȓ%K,S"'OuSdH䜋K3vw^?ݻDX=$cg[)JMw%ob\zKI>޴nW>u nc\ra,YV!yUEǟցs*" fv#*`l6°vX{4<mf[H)7Gs kUlBZ!i3SgfA/(`%/Q!U$pRӽ`$1SH0Z IDATu@Y Me$f|g+z ?ef݊n2>SޛUܟĢ'.`luX'8^E!:Kr+5oP;lu.]x@BO_ g!Mk3){d%K,IVyfv""oa)jBدhslYW !&9#O%uT\XIى$`Bu^rPGވYDVԽ?uFlzkw[C_l;$O!w&/8YOryOa:v<^@x1?(jNZ !W<(RFrjwq3lO&̞G=BryaDkn$B{}^җP33ۯF0:kXArUȒ%K,MuEk~ICwJwgf!_zm# !/wF80hZdϛfKTlp8mfk :_-C!)$SToqlSS{\BSlhuٻHw+mZ͚,`eɒIT,3X0^7H5Nf6q&ׯ yX]q$CEv:cfV=".]f6 `I7`#=̶PyA \N3Fr|&$_xESTܓHTl ;ʹxldV Vj}%>w2FFEZcukVzB 5F F."j)~wzr%eɒe!0R!!i^2!]KJPϓܤnFy;eBu% `Dc\ B. Y;ێЊtv_$sq)o.6Eev͜bDs=/Qm;n5c4W \`eɁ}-Sgf*spY!\)$;1+ԎCDؒU,YdndkW<ޡ&lqKL[0_JE~x$KT 4NAYNgcW8]W۲#A߫hO&WZ^=sTw&3Jct*aoO,Ydr0$_?ݶy t-o>p`s=+wֹf]v:&l> [̫̀$lhb~{"f)^m'K{dɒ%OhM4{+p0E@sa;4oTfvLgvQ7ns_mt~z_/{0Q3[T\O&MQ4FF̬D]4r ޗt *w$׆  Iz|.b=\-k4A¯> f3v$` 6SfvGd.Ȓ%!8XfarumaƘ,Q¨6ګf3{@ fIn3n"!U VIA36TO"{H> "γBT/xEJv|5$lf{3*Ecf\id/VyRSe#ݖGo"-]q,K,YcF34w;dam$a:MS0>I$wwDiAww*\?HdlUS֕qlwG`?Bڡa؇>oѺw,GV,Y#yE[Sd}fvNTB*fv>%!OO}Ǜ dM߈H7&!ÇٯJAo_Y drlMFL%$OG$']*-w̞&9bfD#u#xߟ |,Ydr,$-.hԵo>)[N W#2$Gd2bf7"΁3Ii|QuUylRW9uwb9GT3WAQ"+ck<];Q54SAMf6GG7뎒q>]S{˟z}% ~Nzu/lWjuM+k[~plc# k`Wlo[W ~ޮBosqMax `ZSޖַt͖aHDd%KWZ `'=^@ ܎82d;v3۩Y:x\-`k I3 ʛ[ҡ~._$y \- -: @:䶑| q.5?qi/!k׌>gɞfZJ?uυ$CgfbH7!~/]sH%,uz .N(&{7qήW醞 `&܉85 !*ӛ][gIϺvu9odoؔ̃%$`?}jejfJVsc;7htO>4qshM :ɽJ߻&ɻf6!ę$Zs "t /:hi(f$!,Ei#ݧKlSį z>3Woa]}:I7YeYW@zw <Ӛ:~3ZZ3+WF{el,mW+5Z:ma6EH< 8,YA`v4}ne` B *^ pc;ZwGÍ7xTuFTd_ (o"0q6xf4SM$93ޏ8|HO~~̾ifII׻{M$`5׺=С=Z,8[$7W~(Lf("w*ϕhI~6f!ѫ\PX߲fAr=Gr5o"VW%C^fY)Io2-mgWhYsب"uszͬe{u߅IdF3+KcJjs40P{ZܓMj2<0P{k^jeQe0OO(jJt Y'̪$*E>/ޥ.3;.t9Q%ޜE6X++\jfc{I&^"uffɭ"5-# ]鳴]qMl<5K]fW5F/*3GY EI:2^E ?&?ˎ9Gfvkf0TJkaf Jzͬ&YR &kfun=xZWdϓ܄gD".E" ?|QvY2ʒNZb_p50Pp9V+jZVկPS?/(jdfHެ(.ޭz'7-+@XU֘m n?#?+G2ʒ+O BZq18]zfj+Sg=F+̷A_0W='y 1YZ[qgB6.jfX+pS=Vh{@"&ϛ _(HpEfu17 bjz$"v"Rֻ{a/KաvFuW 1VUYb{B?YZc uz&f^Boy}tIoZ_E $jfsK{(շֻfKͬX_3fVg' `^"֓w.E|,7٫=}^%,Y^QbUJ3btlj21ĺ%_יٽ$7$1[q s%$瓼̖Hz55kTU#O کe EwaU[skJiY^.[l)DFwS(DGLK]^33U p Y-۫(9wSRNޯu$Yj&݂ x >z/%ꌱhsb}$4fVzUwv^E1}hf^f@^3E""7Yѵv3{?b:~N~FERM7ٛ69G2ʒ+~20P;z+O14SGTMGZ Ժʮ)H}Cߨϓu:`f F@ l.:l8(Mх3;W)7^4DEkfl5gPf@a7X6+q .ugxv~S0 p+͢[("vpUddWDcWiBo ?#vT-*Q~&y UKSuz_@+pWg3+6+| Mzjβd%+OhXjOW n| HAL5xj9Wa$NQ"vꍱPoV;bf"~^@#y;bە!Rkv(Y}}uIoa5Wѫ$AZ+ָ^A ^ ޤWѳ7٫/:޲ڋMlj/ɮ\#XYe`6@{p2`l6KP Fj2x@aGҿ()աBn"+~ۈNVt(E-jffWD ]|p\E"}^1n$jI~\1zq`n_a/b^5o#>>Yم {^}MC)Ħ+~:{֒zS]:8Эُl$Td) >Nr@i&`lfu}U֛ W#8dfu6W``|[s'ԋX _+KW|j$jmM҆+u-ZY?2Ag} <6lJ֣ѧ: {U HC(53{nQ( ЉGc.Rdtvc^U^Nnz5c mIERGÕ\"vmVWS{벽{D$VK,q=N^H!EV fVABgN$k[ثT]/HM$?Y~F<+n1f}UDda/B[Wi}KUMzv3 rIFYyQn"u#ef'x dǕjgѯ}:dvjfVUf̾hfE H~̬_䖝 􏺻ux 6h}!Bq/+Uƴ#:T IDAT3۝ ܀^D}Y Dv~tT=vܫZп4g+bf_ !⓽|@gTc"-XٝF?&I_hwmԫTrRd)ŁTl79,ɦ~N4Xd/{ $}A/kM {SܝS]`erLHZV+RfZmbf^V^8]e`wa6xQ@[#3ph *s|UvEQ4 1=WUjի5ʌ Θ5uBsTܦCrniLXTFVn&h_al*]=9B͜#]x]X'T+ƷG,0F$ "2\_E| [ljoJ4MzEZg/bt~N6[_6Ezrؗ"=efjL&CjeG3 >.,Swn ȗr3{52WJGR$h"}:ƛ:h)tϫc:oR!~=8P3zs@-́Yb1 H z_<(ڑU*B5){Cc&?'pK@g"z&:?k^goR~z:{F 36Whu*YϪ[`wW {7;f?<0,Y~[j}lb#/{I(&F0W̶-E57"/ATgVbE5RmY6I2tB,eMI/$BKr}֠ SsW\5~6:]_b}4sҫ T7:SY_5,Pg3"U4Pi17@n,YR j Ԏ/2#v"RR.puKK0ip?7+'&Kw5F^Bgo=>ݧmodod4d^ϓqIOWImF{mgw*y2z'co=%(dQ"V=uNu,NYsj jG`K?XB%yc:C2o !;2E\: 1mvMf6uzu85} z>3dƵ{өuz) (ۃkfefPhƇdoYo@5o72%{9P֫TaKkff~NzKk=j70f}IҹWUrRWiB3}i?g+K,SV3j*}J:3K#W&%fv|6ح_t:&vi*:tv!2//El7x{p!-Xa]ϱY0̬ЛslD= 2ı&i(f+%{5e[z&~>Pt@,sX޴$ {[ *޴fVӴs{INz?'6Q9K,Y4@ # ;\Br$sH)U3}aRkH8TzK)Jl\L&)C7#aw|L2y摴#|6gOc[r{,Ah6V MknF `u5OM'5xHcCLFDd^Kr Q[횙7 `"5c]-"0cտ:{!va3[Ar JѰ~tvLdo3$蔲3~NxZdoy_%?UW?&?M~ZZJ`?g+K,S!3a==6]uJxXjGaň@:][Ba$uեK ,"<\K#Σۢ[FPĔz" E|7D<:!^%)D* -Uh XxzYZy"{K)BK~nkfcUjoþDkg /UϓΒV,Y*fRWk`֩b1`^Gc!0g*18DDNJ?F !mo𐙭N<af'YyICIhN`F`ucZ)G8٫Hfz.BdW/5SI`(Sz~H_, +0u#*WEC!^o rg")j7Io_%U79ٛssi-XZY_V,Y)jeWP h(=NvD#tm) ]Gs-0G+c#_!0['1ޣNr3}#QC4BVaѹX(4$zڛR%_$o7HN^;i?{7ַٛv3ݧ+S/)+BݾYUL/{')ϔ-ַ粽~Nzv7:wٸFe9dgdɒeB 7\C&(ADFeE :UҦ1&ڍ]p .boQtMz5]n#)o7tqɛͬWPLݐk z_a/0f:iv5E~.60Kr^E )t/iweW@tBfV-P`j$E^]ShUWSڟCj}'kf6KXYd{lG])XZA1͈.`?Ri>Ҡe3{z{ " 3SgF~v=Wv٫C} ~Rkʔ_IU a6[^}P^2g}h;M離1=\mWl\ !d6 d$5pxErV6Sm2% !w+Qe$J&&$읆ͦY7VԫR?'rV[+ݓқXE{vr?Og{[oމt7kxY^kd9`TtK-E80P4WVVR͞f7Y-}_X*`F)`" G, ލ87E"皚6~oiĎq3%CS]n*F>3{j*eŁTER:i$.EP"v;6gS-7=fiU8cff^e L]069 R:^ո廊/޲޲Ki=9me?k9ba|\^߃``+K,Hq"#бXNeٌ&5KyM`6PVlпvt>ef!9HrsT*Li)ʍvBN ΟfK5"\p^]lH>!¿mf Xԏvq15<|0t0w0 ?'e&^8>-u%|~ Viߎm\Vz;|Z;K (EX\MF?o7:f%K)J6 `UҿéR_9h y$Պj NV+OUQ33ա3<+SFI8f"vV,jqjI˲!yfBCOhw?ꠞX흌!Xhgf5Fm>4եof^?&y;T@&$-mvPkJ1#vu;҉<;U#S-E[ZU[Z-gU$ B;OFJqlo .ĝJYtJW;$ߋr[ߩZ `} .-nЛlfwkrr~'Jž2Ҿ[߲ͬWTzג\ #$dV,Y& ~ c}3e$7RnSK[7Mg3[&Me{|]+԰>EF {'Zf e+K7 fTe"(%Ŧ,Y[1?㘘"h,o$˭$kHII $ XTPKfo~s/22 "2ywy~srچ,/kD0CFdJKўlD^y~H:l5(q*$7)6BXɲ48/cҪj<]UIG ͒ӈ!'X#YAdJebJZB򙹮[.$B~V&Q)ЧLZ4k(fuF$`mdI鸟bI69䋹`~5!OR ~njm7Fs_Sl uyQX,1?X̎x-0h"T* *ͿVLlt`y[ۄj&=DqI_ !l's^wKzg,Di ~U9y,!9X_1e0g#i_$rn\gڼ A` !WԧhHKîyBڛJ1!o\|a7аBmW)c9sŸ*)4٩ M^MMMv[NG$ W*iC"K=9j-v\.1 -㕃sm\m$+o˥f+nlWCی(!DJ) I| ,i,G8J6B=Ƙ<& m횷bmU|-Iڒ G Jlk͏y<2A -}cf+JUH̲+&oаkI#S%Y&9j7?\$3295OϬ0{IDY*o]?lskI&)$m$ڛƗlL,iG.p842W)i0 ;*+Ng||R\.\aZ{_ sZyhD )I !qy3C5WM$$DId?gJdc.vpɏ,WI,L6/\id7%[ӼAͲVI'Yhȝr Sۻ67m^I 1BaɏK,F?7-/*3]M;_?g#č~Nv&F?] 5oaF{]^S{̚mw&MTd'A!=XKr5g̛sn|LĴIAXf\.U+m#ZspjgL;jkAchN!+{mH@V%`%Ls!gi7w ȼ hN^ҽRoI 1d)3؜ BV@\iM5";ݦڛJjg+3ˮD5:ڛvlcv|v%=cJkonfgyeZy%zd5HmWb:r8+l8;߭t|A i/`>ȓc,"˹Ӥ%du_XHxEBZR*T{}e_m \VPs?ۛ&V}_hsD, Wk9U"H@,x?YR4>eyxyj^* isYEsp4zb1Jѱu9Ea!RdR  ~97VPWBvG%@/-Q)˙j%uILFӂ*_@Nk깽F#]F\/&BMLa7&y#0hWckzk7";^\ .ɮy@c|Nvs޳Uϩ$TR㛟ɣpp8[X1>^~k->0̟gC2yWދaLtP{y`M$5욤ȾV IDATe!n2^MMpt*O @;ґ%lۨ%ыuB#GlneAV1yΛWj2i/'X u.˥mRYm$*F0JΑ| lJZ[O5 :1ts-nX@V][lBȆ,9dI ڵ{]'gV?# lvkdL ݩlW'jN$y+k~QXDv$jar|6ruW5'XciI4].ޜ7 ROI0KуsظY2>^W.f rsm$G|YK*r@EQ;#;Bۆ?ࠤ R%g,mxjNȊlY~Q*hݖ0vA0%^\))sdS{;Es_+UtPRJ d6{jr뼒dIP9ۻ~Ώ=+dPS{2_ `9>NX Pr+1^Kѧir`)8Q*^pn|rKslrSr=mIgIXL\1trBw.$gMM^ෑ@]()6{\{69vv;moulku8r8=N!B9T{ʕh4)[ۉ`U*#nBVۭe'!mGA[c(A !\^ݜ\5$kZBciBhNv-|+.nW+{>;`90>^*i\.)k`V^qKѩJe V*eI{ҥrW09!NoFVm6vIgi+جK^ǭ.?tќvs^ﶚ3ImM jo%۫]%/'IwK _m+gkU +Ns?׮ɮ un,K?]NtXk/Jm=?r鵹³KpHE_۴MȽ"KB$$9E> qO{[)n=X4ɋbIqtϹzCȒ,y *$)vcwT:ϝvvMjV?':ZB*r8r8H>oT\w-Z~ @>7 iSm AR4ϸ1Uڋ,LT$9QZp4H6y> t(9R{g}#kS'ws,M?w%s0xVXTaaē(nK9):2%n Zxg8^I_X&,/Og,]#T .EaβM9P XT*|Q*H8`9+00`1W0kEaxe T`\.MuI$QZ,FK >ǵM$HG9XGQd'.XRt%L`f,ht>ª>V..*m ֎hK񪺏p&{8C2r+$@:hb87 ӥhGX1vpky~/ +\@N&*:==Vo?BÑS^7chD ño w8|e)F,='X5cG$r8snrC _Ē[Gbn[MƙWn{]M1ݾ푼E҄ޓ>.(w{=\+JѹaI`e[HV%]poPueorTB5%Ưv!Bc FHhtSmc{0Ƹn >v[xTNG_{ޘ ݼ1Jtyυ2w2M>U%A"ӟ>8HQv#O"BrMNñ*[ kF[bטӒ֠c >WbK>ItE$k=DsX%I\&YPGVRI; B^ḊkI>*HRڵ*:r8a aΓB-Q;V|ݒxu1Э>jWm_"2&mW͒nlᨤ}+4;+LbWj`9Ea J*I>lmهxRdgy4w<W]%I7Iu8ܼMF^2{]c#HDmsK6 9dD5/Kzhi$ɓXhEs!JnRr_9XX:ڽA"IVxe&qHO 25^̓I α>wA0SdB4e$ϵY`` !t8V}&r^+'XUEqiI]0Ad-%y I3bp0>^a\2<+`9`9-e:=p,s p8'Xn%Vv{1MZ8P(J.Z(P*I/Z{jΝ*JaÆ0<< I(8}_IV)ƈbtr$;}落{r1S}y5g/333\n1"ϳX,\./]m'dNN`N[w "K?gc.HZ4-j!n06<~xM Amg pbb6l(owΝ;jm$ud7X{Oڎ6|rظq#bm7Jnݪj:R(vH>| 7ܰ>2ذaC[kV+@3jzrzz>SN\.Ǎ7l,ɖ1iӦe,s8r8 _V#uSY$(ڄB߉ܴE\эSH͚Wv.#wl$x8W-R2e`9ArsBc|Y-^fB8crD}$"n+BQ.I7C946;IJT,BVvM^9%_t7 K:7HxOSx.G!I#3SRa\y}%Bq#c;np$OaX`S$q; Iqu뢤{|<5)$HYok4n$5؞1~C{Qd^~ ,2-<cc|>Ig ,*n(y9tN`9}_2f_M !4ov}BbZmM,/27ST03FY,y7hƯ '\ȓ.i5)xX8e1f>w/wn&9CRn%xw+&޲wM,$$'IT҇OXi| }qHj~9GIFvme%$_AA:~[-c+=`}tƼe޶~世U,J[/pp,tn,.1)鈅Ȧo"o1z<bmý`M7/`$jxڼ|͓!O:Aa?޼yHPn̄8yw5k|M.ڟ}kʒa" 鷦^[na]I !qŏjc=K _}A+'  7q%Jenj'YN)2Cu?BIjuZ {$٩3g%:Ƀ1ƟDbCͷ bxor?+hJz˴ 2)$B߰aJjL"F򬑺I,vw?4`֙0ԝ$˒Jz.5lî1Ba7x^ۤZϙ3g)P,jڿv2h\Vx50օv(a"MMM]?55z}{a[Z}He1nZ\qg'No~&%ɲ$m5B|y_LJzF}t]ҘypDwXݬ1)=X_'t\,yo˗룣yGF6猼+ۦW࿏1~;pB $Y8c7{$ @q=[H^t1NI_P !\ն}t9B9  8@Wc$%5IKa6|i*{мp`9yQ  K&аTl\$ɓBSzPZ7"tĎىC[HV$\* !Bl>E!cV՗BGvcJ}hkb:`AI &Fv"P6ICӹ1ZM[MIԍ,IېiM\/< XN,zіFˢ] (? 5 !I^qccȋj;@xnC} wB$= F ȒfZ>ɣ=z͈Lf$i[n=eD~_?t?ߕC֯3Fr9AjK @j+,vaWIדD{7ͥpn>qƿNp]]toT]*hY6߼ ywkS]IO4ݰaÈRh``L0/ʊӿ jC*r`)oCz$uLaw";3'XcŁ佘[sّ-l7l"&i2<|4ٕT6! /7BAzz=yR%`"\xHVO~5D/cc_b7ZwM6$w +$Y62ƎY]5~-+ͫ]f܁Lgw!Kl,.I,=JcK8Ix5`"i4cI gvlM_аce!;b%f욦U$Bl{  m<eIH1R(eא$icA{HRQF4-o#9%is" ֮&wV0"ɇͳl7HV! Fn^v.}YQ/qՇ `9:-Z1ƇI`xNJZc~<H >#+|/2y׌$_ z{b6ka%3ȈdotB,%=!i0͑ÝlX,"͗DfoS1ƏYR!d£/)L?S1ƇM[x?{~#3&ctNRICVQ1a#?bg-^t`nfvc &{#ɯHb !eRG?X/adygLadnFdb_ !v YH%2ف] ۦ\Z'->)0еݔk:טBR*ɓ)c 8 B_҄❱EyU=XbYϙNO&i/޲S_0/1{$k_T1EGm,B1>Ky8Gs·Lobכ鬅Jkd#n,T]J7cݺIT4쒜eHkvm0=bIެegjoYt5QxLjaj`ZS1U'y72/Yv 9maI<Ӷi6Y`K1,6LjwJ1ߘYیYS')|>ICvK kH9IML(iy~n&^09ƀž 6Lx4Hzy.Xn9d9YE#S0B`'PI[dHeBnJҖy63>n'>Ss6w6ֳm\*$rVKWzK%oj'Vr8M rJ5A!Ժ\\#0λ$cKB?ȉ#BuIteM05VW6\AB&IIqYi9[lJ`JD?$N6$1׼s_t0/k?0%i,VJNa[$R&,:cf6;,f޼'B.r;Iڊ,1ƳN^n0|QR];1IOZ0_ d 5Ej5 Ko)>'…/K{vp\37pΑ3x["֛09>se[ FB4[t 2;Hʓ8I +~=`IH4٥iof-9mDht-f*?9ư:cyԃ +#c7[$S֔ FR9Y.#%υ^32"N$9K&,N%i΃c8fٝ#qT&wVdyZ r vH 6Dw`9r85<u0~5ˉ0<:H $+Cc\40Eӊtz&E?'9eߝ;63`I"K`yz]G<<k9rs^pZ{{HzZGxvp\jFI/ϵ.R)WYwZI )BF]yJ\=@rqI/j%/Mnl~Saybksqi)\?kxar:KAmVRlevc9rztXqEPj00cG^h{1NKzüRJb^'+ybyh[PR:y8W1FG-iz@@q XYIM󧓍m{NW\2ZIIhr A|cjjj*穈>࿱r8!0/,Q=Z?o3IַӺ{J6˜Y&#1GfoQIz~&M5&IJi*b/ e?0/-IJz?ɛIs׭1##V|ߧٓBq0QҾ:RHjQJ,cyF=wLsh_s0%}Y*Gv`0d2CM6uQR;\JNkqpכA&ٛ>BF&޺]ozV ֯_e5\VWuwjY0g- 6 ͻ=h0^4lRȬXOR|OBx,[LDwc4T."X%~$oL ֺY vqiqmEU`^,p$/\g!1df*$p81% 1_ dSNeAMҸwḪ +W^P(|;'D\h͋wCRuS@ɻF:U'Ym^|Zdת2Rb,نD`1>Lrk_j{9zVqHނ8ItX6]:؊$5Z10إZLI0 |tCñ U` < ༕;V!b˩yqfff$=Br&l-@9IJ:.X{,$8 $KjM#oBQGUo}-:e# scQҀIz}nu8YR$]'!=s`^(|HK!ZaWROvsXN`QvS'$mp#w1]Gs^p8>nHV2r2~ۍ1ݒJ!ICj5۫lOrpd{  J !\] eXVgffN=tEzyfKz݄,xIrd8;b'9.u$/'Zj"zB(3^ڋ>wMr=un;%r8wXHVI[H0=3lBXH2N)w(4*@ϓڸ+?c=WB{O8K!IucX\9L8hŢ:cLցŞ{i@+ Fp8Λ)O ;KCr$ +$k9r$ IBFkErr@p8:*ɔK$;]^C,ǒ&L OÃ'Yhxvp\(5$ߐb#K'9f3Ҁ߻ Y/"Ѫix p\#4*ηYN)鬤ja. ఏñ:`' +R ZK22b)8'XǵzI|d dE $oPpñzNV$2\&y[H4/^T9m0B.;"9,RamҟVTuCh9&ydyCn"yX^ !1zNbŒJ\N IFI3!zχ{ai'XI#HJusV&d)I8˒.s !W,g'Jb$#y{.\GI$/w(" і%UI^4勴ß))gKh-}k`s`g"Kd+I0`MKNz"H#6xiM>Xgbk<'Xݡ8M&\L {:Y˒fyx۱9C%miT.ɮNi{a0]EAuX 1Ƈ% Rᨤݒ>h<%y{krE8:-,5<{I#y{;X?OJ3bU![;ԱUAJrpHNJz䈝.~ž~=1np[94IAI#KzdK!:|oɳ/#Xr<,id7yך4F @e9LhH>"i?g)"ӭ&rdwR'];n/>dOvS;U*tuu t7'͋ O~'V_8y2`X y+*$Xp!)IuCIEU=طp8VDr@GlU'wr#u1Ə.髒N=ki!«r$Rk's+8N$ORvp8r.d&]d9??*IzYxWIk=XWctE,,x>-A0(g'v8 ې3r@)#Uk$da*Z$K![~I%I{-MW¸ӧUfXR2`C0גG cB D9Zr/E!E;e¾-]1ГTmWꓖq5!/+x"Ƹq-' KOD?+4J7Ȍ*kJ*ɒ(ٖ3G_7<{4k5,X4km gK5˒JRUʬ1̘{~PF+%]wKወ893g5NU_P2n݀$Zk?"Qs6.iu!O46ػ\II󣄯2"X? g;<{\$mv˄=IGZ^)Xkwuȋvsuw:mnѮz^I. dƬx훜Bj* IDAT\ ɦvdbK#Dv,dZR|s;/N"I"Mr:j#`EUj.zQ=:[$tEJGje"D"\:G̰nKОl$.\FڟE'Dmn+Z]<&OjImlp׽Znr-ϋw{aor-h:z-I[%yq\p<'%!ɂ[!@/Vꬮ*\I:)RQDžp1uק 89b$gޗ"YGW&$ٰmW'p--ƘCڜ18#D¥9(i#I ^B-͝;1'm ]Z(BD"!B XXti^șݫnbuQ4X"D!/"# `E!B"D+¥"!B^D-—'Eh]93}%i.Fx߸v!~7InJ$W|}~CC9tgʤq13gXc<nj! Z0%@C41J HRNҵZzL&J&`BZ L&! q zrf ʆ Z$vf7moeo}d!B`E2sj#tw.w ^~E}.$;BrQ*!_'87mtc:LOH&>ͤT*'1bD*3;'xl_:Aɫ3an@/+)kQBTZ_1L3l0ZL~&}Ao`! UoT aШaإӍjil"i*AP\3Lkj4zG!"X"8\o_ؐi(8@-fIMFv K:Dr|ıC<1*]}a~O64T҃RA.?~r0dv\ʜbxKf˥J_V[k{@Zl׼3ę3Sسͺez]{[rU[zrſٸ0 m]@` 851QTNcưal 1-{kS3lڄ zF!"X"xB]did]]8w->Ip={zaIE@"OJfUc N1hA8qlR3 &#g94Kjt&]YcWƷaO. -ǟݵLP>{fmlk^7o(4Sjnxk% O>p`'lAqǖZUi n{ wф#DXJU4u*u\˯됨"N;{ bJu’>FR@@ЮFI>aEExI>96 ;8э"*h)̑@ۗ&&ueتmCO2uo. ZO&W62X#(>R\8P)ZAKdbɌU"DUy~/^!‹%:8d\].:bC$s{H󙵝X`_nxC7r%.cG|K6ח:tZ[6'ؠʤꑁ~xRX3Ͼ\OuY¹ayfْ0 p\,ݷ^qí{+R]֖Ggl|_I$[ٵB#r!²%֋ՋV+ I$伤 :ud;LZGp$u!K;N6i*"f6pG$ (,v==o[ciheZ 5A Wך&Uu)%,͚u ͫb2LHuZԫ]3ٔK^o^['?^Uu:A &ycZ#\ĪO.3йԮ${D"DXY#5A!JI'b9"-ʒ˻|(;Ǯ@*=F%IWlXuP G/Iw\XcTTT{L_l|?,}w#mPOLMf iЀ<1Hxcɬߨ A2=6K:`3ɣN/%&?- AI1#n+lt|;vO豪$s>USOJ8 Z$RRG3lLෟ|[Խ|ydxZNIֆZ+I'OVU92'J&,aaD*ĉgr?g 3F Mw9q`,BeϞnnc}oUϫ՛`'Z,fg82:}IDxYZ{vaK=T"{$ra2Fznc$g|N&Џ.*OrIc>DrW6%`hHu7.+?$i/^G]S $铧M?3gN02:AFL;Vl"SdNZTxWj^4ˆ P<`[oۦd-h0L$T*''R, w ziAFTբUW$]~Ou+M$ɼ*IWKJṓY@$|*X"2N~#B[Ht#<0F$#YwS8Ox*6^Xen vU_Xx=k$M]N,Tej~~ ?MOݾt\`{[٘-fk>bg j:F)J&fff~X!ӓ/6ߟ_ꇟ* ɱwf% 1?Rrv`D`絃MOa؞Gͦ_k֗Ucr5 \}[*K 6| ̈́Xv>w/ *M7AI_0 tIqI]p/sҹ' #!d}`k ]7^~;W9%kHא$#Zby CQI&0u9ɹЪZ˞lڼ!mMck.J!$& {^(1yVsΕ cK%uWzV0 ueSzHJJyzH!)Hv=Bw͒2DG}I v9svMp1 >I*g@[,i]յ9R^\s>hb.TUG27TOxg=ms{zQ;~^,n.4-. 6 ,"HN95J.m6ۇTJd2) 6_Jػil3⵲262ŠRsgǒth i/֦tiZ{$s.tDS"zvo%͸|;]$_$=ܐ|#WP'&HNuF|yIz ߺ z/[;-N`Ii{ 4H$y]$T~U,Ɩ׬Q(d{3jePSVғs !bZ'zB'Cxhu$wȖxLL7x-iШ7ǓXn BQѷC+dZfI$%H*$4q7E7}&;RJ$V+zB%&"/kgH'![ I'%;:'v `FC.O2ΣM/Hr А SЎǽ#r-BzZK'=`/3WO<K/ai$TTphUXVf&zyтD&yҙ4 _{xaXdD!WN~;>u@&k׮+w*0F$oTi nFd2b"t/E!^``7HzGp$?%iZEnZ':wI$餺\.qcU9-h$쐸ξ%e>.3U2٬K5WyIBՒ#:0o--M\==8T*Y޼e\܏e:O#4>uϭF%T@fOK'yWV1IMy|_HgP*WyX zB%%]Բu;^6./wٿ[ú#w;222UYk=^"@6ݻ[JWr\S@0yp_hX,=q~@hֲ==hZ_gY u|⫎9vpL2u[ӐrlN9_qS ƷG6o$Fx9ˆ BK] nq1`е_:j󃜛hs;~{W֜`E2hzv&[ |.7)zx@[cA[m[ YJWi"<ncTN^ iCI$Z$!vI1=^66!xioz[3@ R͹_W_[_XLړN$_WWŒ=bIP6pf ҡAGC yQX\*(jVhKY=UטC&̜hZ)Qpdqs8Z KF%2<\WɎsϑ+B n?6?Uّn%qtT!YT$yBWG!$Uhf p'-]A=yע fZV@R$'&OaϞzݷZ˅X*xGzNAu,Ta mϬuh)R)Mf*7ĥ L0󔝝3غh}f+-z[e+iw`P(f0GGs1C} kPcj-F3xK7uuk߆1yXjD mr$i ѵӯsM+Kb-r:-: JZ"km3u%Ag'"X"DX:6˗ò)?W InT#W, S'9u?v[?] wIBuU$km$gpfCÃ86ٓ TRxg3 9tx/8uLFtkvroLضpCL]2.۠i0@ pնMVC۪VjAHxV?Zx`7u~d6mfU+ˁUހmwhHGFIkE~U.}:Oҍ$-^"c-"rVEgIt฼d]cJUrDvUest-΂U~K4>?e-z1ZaZ͖0T_j4&6l?#k6#dirTjUcavR9ObzwvDgO,漏Zr0dL%C? cLknvWDIV5r҈ぷzY;Xq!MLn(\IVV8\TA? ` jwXkH H+!+k1~We-CV/J!\gŻyΕa29݄%'!pO9q{-H~CEKhA"h!Ƴ '[aYzfzzZA|vL2c\O M6+ >Iœ8vxvPZhLn <`׍7J4~flSWm[_&0h 1y츩&I۵cʜ/U8OpڋA*yk@{鍒8M圻Ӿk\{#JwdZ8sKzι `JG+B"bY$iHI6?e6_p|wrQ.87Lm4 OrpvUTZ$ ř %[Oٗ Vt7_\op: (-&NO۸y~hl}%MԡJe{zξnk͐7pSOzRIٞh/aD$$Zc`]/i>JI*9 ?jIz䠵6 $[kף=p[uY:?YD"DIȢO5P 㮛+%=I.]arzjCCy[;nO1 7ߒSDZNLH1= (kr)\`g]oys3%0Vfج+F55|SjťE3lֱ'T9ui禐2?cu4- bW5< IDATeNpaIg% I֘=FT'Xk68{Hvm!nw OI_?=ax1RE0e=/(jهzk9V/}oX3db$qJT\zOGۈ`Epc>?W9'"71Aon'98yf}iƍϧ{}ë_cDKs1Y^ﯗ!Dߏ! D̽ B2t!8x(xVj*3V6VJOg<2:R<׺"DVW`G|m^H#UvŸD^IINxv(JFVUOHsn^KZF<Ͼ A)vnh"zP*s?4a _ 'N TT~>C7 W︶y9HS ct|1SB> =1D<'9^پ$h3*I4i Hdvx]&=d2ZMX\G+Z^Xt 8/;zD!>=F˒Rh2˸s1F[?jl Zٙ9j5& N[rabPdXCC0MHV *7SG >T6ꍻx<[=œYq󜗙@,XH|Kf}bIϋ'=?xҋ%{@^hkWˡiߣwv+UQsx9G+B-z~wvCn!rIF &svNu*9h]t;$w>KҜ˞Uf3dıIc,;nGX)T6{xK%k-VYm{zҩ}oz̾|_8V\Vx&6iB9y]<|Aw_":dju!zwGRU]-9wduD/A/$;ILwt=9-vI4<^މ(%w|?_B0dSBd*79DSgfdp0&X,^H:z)˔kpn޲1)J험0a")ٲSx\P(mխmmت۰UAjŰQ)Ar7aتBa=W a60lTC۪qMGIt䊸RuH_LTae9]%uCwS#[$H*JM"Iܢհ+kP=v]gtc\L}_)I'}U#f{!scjՐfzMkzL9Y;f=Ca[6hXٞІ!rZ)3y$Il&_ xZ:Dӵƽ{م#=k׬*'L|b!v\&m$xp%%9a$pOI8lPh {;؃g%>J4qyKJx4s!pP!+2a#yUƺ=GFA}-t*ʶX}4Lw`SCؠf̈́b#C\*"l+ h0jzƳlzKTTXd'ZAJ qA0'A<Od 2 d] MŽXm)̝612ڤ]\Z1睯~GX#"ev'y=tO_6͚ BH 퇭}dv #qO& 0ZXнtVW]Jlޑ=,e{2K̍\invA׬YUIS-=>9ycy2qh\\l4A\T={ '=#L[t2JT2<"X^YV&#Y#qI ɟE%$Kz#Ek`]>Nx hE[o2dzf$%v^o"9(I J4 ;-?W'Lفm!۞wsww?3yho5M3zyVτT8c,xOb%a7.[8Y{w3XcXRưx6L 3K۶nY<~T2pXKUDzQXo&cZy;<20u+GRW\;{\ p9 @/GxI}SpRJH IK^c#/tL|dKkj% yЮ_܎Õ^Ŋl"DX]NQ\u<ܯx+4xgNI p6 I>biW@ ~'Hw[HnS'7$$%I6Xh<7ǎN  ɑb O Yk|eoNOm3{>zC}՜:Lؾ'SAɹXꁑn{fښx~tl]b葁d*IfҞxB뷗r jШWǧD @SXYՊ7 ^_oJB)ͤ97 RN:(cL(k˒遱V" ,t^DXc^cLycI&y387xGV\uR"{3]ˠWYRsI>bs_DM~T bJ#Į [h^!)rc7~QwHVI`esa̔tƉo&+k}B}$AR؅y1~"lus=ZsGkZR><=88Չ02Ѭ`dN[PZ/Vd`&UY7Sfzb yy6;,.M֮zKDzԤS341cL|o`_._mfO2 d"_s}`DV/x4L }da a:"-I|w=61jFiW\AVsI~dZ $_j[ry|V~Q_-鿠˹Se6LSή,nIf5W 7n wYFtW ޴o NJI@^8H<0hx K~j(Oٱc[%L=⛒D\&sư4L LV6dͤS&F5|{$"w23jՊe@l;j>nM2L*f-fX~Q% U֭+4_D@ب0 V*IŬ%-nYҤ1&\)tgu &I^ +9AZ">f[ 7<{W>ׄ,ըk|i^m}5B q۪+746Ph3nF===OZ  MEπcl`ft#h5%!-y;:Knj,iAg[\,|'hJs<>;wi"DHmS^.P mkUނy' $}lF#R]$KR{|))H{\ZV{ i*S&ӗWK鸗n}K~,VfE2$dƓٹ]#GosVǒx084P U39Iب.כi& VX%{nCht ?T` UO<082yãS*"S:{z:6wuwpX"55559 F׎훦Wa``虳:yVU^w_+աqmpcr:{;Oulܰ&:{wenmv7eVpg,i|wHEUsAD2w`xq|;SA_ mTGl:Y7+wWefwbrD'o (|'P.|?W{]EU=oQ]"KO1.IySj<.$cauP8BwIe@Yݚ {WOOuo-[6uۿqӆ)ݝ]oٴg{:0ΞшiiziݪVww7^uuvl_htbգO~qVgGag5+B &F6]_՚nΞ(zz{PH\8sصCC(ѹz[ Vy%pݓEZKqTV͋+u͞_t64|靑RHP$*F].x_bkrr R~S>c-o}p`UېUHj-"R v|ڿ_a##ppT[|Yzoy{7[44֒ ֌ۅ$wa U{R_qeΝJҿ0"P֮Y.;|2'7~N]7ξ=,?$""F"ZS߼Ko2gZC37;:'>y] wْꝨfkcg^cegiGlMH ͞Fe] OүH<[ȍagz<299+W@txDWZ%492"W$?(P^oQ` d1ܵ+o #f;{U9z3ۚ;%033[QY1*ˊffff̖5`يu ب%,mPwWs<cZH/"zոZ=gݫEIwl!]V:k%uy @ֶy_aTI,L;leYqaQX$`XWPPuie`՝LE՟VfII7&vقF:{ H*'-ikY+u c Tֹq+05[sV@YἮLJvZ[j5Xn*Wu]^"aoZ¿7ozrf 12ɽn$[x>= :y̚zjVGP@Ucɻp'~\fa}UrpՌRVH`%:RʅyVs_JyW\+|[jтz5hnuDFjĿsUuE[7?o92uHT{'\,"vxEK0yG(c$"bI|)H>I$Ւ޸€v!iiR{1[V;ݓd^[vEv-V^[sG" I.qc8' >"}DIN{!yBVT;Yo_W$+rR$ Ev̀nHއ໒ I9[$H>,i_49_wEU)EvIzs-S)X `6nghlEݪ7fX""p/Ir $p $G#t&׏wf@9WIv6^ϩRRb2YDtg$ T7@/$'mqHj+ `ռQV |M3~An@'ɷsI%1 /:0/i~R`=!7^ٲ(iJ)CɎ Nx\8F[;F)nܩV)es%Tu=`ݫ%hM޼qK)flfK6OD)XBhyt+$?+ gK)qs=PF9 rǾeW|UgI[V[JY祐̪CV@{A\-/UHNE|Rʨ$_#|ǃD>[PIwJ>R FI 7ne>u`}TEĚ8$D0nnDt2LcUё]KX7#S)̖̀^B%(=|>d;$[3/Qb_wD%u "Vq|_R{\IR7nI{%}=r+j$Jz2=cr;In:Mf[[`DXO1f-cu#Tl"OK:'Iu+`gmvڵZRʙ$n ~:"Iz%/o܈ i3;2 s䆈.5';=CZY&3"zrIgn ZJP]Y6w$FD7ɒ$M6o. "5$;}[ůfy )%M8AedkH ?d{\[PYak&9!I^_,[ V~GrouDH}FDV&rhPYJyz%p\J[Yr|VҔߜWGaIO):x!?emֲ@̫ ~u@{\Iks~PJ,CWl(Lmjd9q%&x2xrqKdeLrL(+oY]f"b+ɒ͖N.I:SJ0Q/A[_H:7 KzR 4gI͝x8Fxŗ,[Y=nT[p^]j)ɿߍ?e"\)e\R @7?BUM~E_ûZfK&7pl楘:ؑtW%]<D>.ߓ@υ|~yj"r;#kܑ !Hm\5E;wؔ+j,Ӆ|s?4B *'-+=umj ,i|[wH)x$"Յg7`q香Nќ$wWW˼rDq0LbDH~Lh qa/3i:ã$OG{-sy$Th)efK/KGuø 1T&.0/KzӒ#ke.0z[aę7xyc!xӸ>NI9,;{rEUTǃ뉎gsո"b͸u7쎈uA_G ^V:!c̴̖jVEVb_ _" NOJLE$̗h`QI3O륬*2p>rS$Gy܁;= 'w0ɫٛ9$<} 돗\ 2iqEIujIj|c*,{\B fc3[%ucWPT2o N U{]ӬWҟI H%hZ` vLW꜆i{qFuչY6 UDb$"nG$pfv lw{;{%O>"sn'1`Vu9f>UtV.]+Ԛp֌y_8-9,;233XwzL =92333sefff`-niyy51WzXRݗP3o!%wXWOުHl"s1uez>I/-kV4]J"=6 4 ;XE҃Cժ?"}NoD@U`@Dl[*IS*":?b!]Eף*085HEl|S)'"XWCq>K`WK)Or| e$`Uk;X=ZuUy' < `,ב-|6m~ L͵ %E)|VPQ.<%yNZ m\- 1$V=T$&NƟtr.n=u ºIIgJ)gg=Hct.0'}x,`)ŴiD6.ʖ>$/}W*wܜǾ}.$틈}R&IrVҾY>Ւfsp%fyoUQu߄*%` әDŽH/#S^/䚈1g<8)iI>Œ-3[2i!]hNUHHZx*θKw/VjL)UJu@CB: g1Ec8lU'5&$4 vZ")H=%]0FGlm/$b17"/8SJ\:ѽ#R^`?_ѩ9IBWR7nI}vnDoFkg345E`O6ǎIHKUy,ѮyaP?iHkK^,Ƀ%yr)"V!"CRo.PQ)}a{\T7%y,Wk`(ouH-7+ B4|U$YVl9`TEK %W:I>M͊u>糶3$G%7f IeT]+2{mX7n*qkfQ[tl%';7U?]]qˤ;(ZJƂϪ?cYT=A_QSJit CpKYHI?Z\7"7n͚u\IP=KWғ$K`-߉6zwxUvRN]0?k3Uun}9;$p>j-oFup H4#OkfV9^6;pI/R^Ze+JDUc$,O51]Yfgٽ֔R~G}p$EHK)3_˧&9!\o1n1?Ƞcnx5fIR{ܼ=xue1V&i]Dw5!3":ll!y=],\.$s{yDc;.w4Ư o2s׿l)iIIq%;n} 1WV9VQ|cثHAX]!|+"e:2D)E$| QIDDn3߂)ٙ6OI:4Fp%Z"e+k(]'r`֜9v.ɨQ耿̖k5uQUIW$=Or;%A攤ߗR.U^IGuxjy1#:qJS$O[Ie,%A,_ $]xnVf_Oݢf^'eI@(Mx$"FI  $Uo\ߖGl" ࠤGT!wWWl y_KR̓lV^TO䯓{ֵfVrcyh7}OU/BeZ[ϕR Rn:233[.QuO ")Kvʩ|2"6y~n;|!, =.3wk ^d{RJ{ V|W ̖Vɽ_؝AL]g3:߈ztJJ"o׉Ւ4uwݭÒyX]Ⱦ_O Y ܟE`>jKZ7/$yCx)ݙc,4:U{_aop?S$O8#irlYX9y<ج1?IvӨvWk֌`^aG=R_refff Xɥ%`92333sefff`-nff!UžKcpq]Pּeff!؞m+oWDUjኈ5v,33,"'2RDC. ID՟#,33 ~F% x}>^j-TD$Xر2 `M$7qeffGu"Oܘ4Jr<_W<^ }~g`-[o0r'JsEpAI/IZ2Pv|<;`߹o-}0I=${#b+]&4n pFҾU]~.WE$%E;9ߔ3$Ǯ~22aQ%_0&&SSIC~ "}pjIoh۸@F9233[b$$}qH BcUF_5Q2i5$=QՏeTWf;VEnƕcfwb9233[1֘ojD @GYI> X) d)}l$fծ0׸|P>|AJi\q/PO{Jתw{㪏H 8Y"~IݙTJ%)Ivꢡ(Dc\%uH%i/WH4n$mM򪤧r4EJ~}lQiW>Ne^FFe"i-_R y "=nֻ: =n%_&9 +$q} ̖Iꊈ~?aIRZ[<$iݧgK+"#$ &yӸu !iߓtR^I_4|f/-I$Uf r$s&ImtmKm$Q% $_qyaUJ I0),iTC IDATU;4IFuqJ)/5W"'-\)i3ɟo5vPJ̣Q7KrVtiW ̖C5뭿l RwIEt8"!i^]%`9^Ǖ*|7kaÒ{r:!Uޛl!$7Ii~{8lY1fKOr3W$tY`-KUQ Z^-4%k~b6RZ~G`}(0,=2333sefff92333[6\lRhWle'uA[2%, F$Ino^q AU]]Mw"ba+w̖ٿ$? aIi$F ?3je?.!3$g7"Bx6^…F̖\F%&T}8p v"⟣j|)%$c$_r68L~Iq%"Y.|>_~å~w}Dhffav4$_|@?t΃""OؘAhfT RFMl+E17,33eIM.K;Ĭʇ%ɇ2`ba0벤KӒGMx(_yUeff*Id^I[PE$S=*!L8#i_>U] ދ#7" "=.ӒWRWo:233[1VS"0ɯ#yHx[ߑ,$JzH4C\&:p)EvIz~-8`B dv[:233$0 FIFD$'&g3! 4wI 㒞!9],vKKz$l@|HDd}XfffToR$#k[?t䋨%Α(q?\Jvu1"9:2:-cIJ)/f%Α=n#k御633%"P)>2+p$?"US7%ܬ^Iu5LC3W*_O]Xt^!Y%=[J9V?N$x*¿0EJ~}lե(Py_p2J@ֶz#.g9\ Y>W(3KSQI$:(`2I_/J)$7`i슈>)G~'u4<{|Uх-I]7.1ipR^I_'9fK-I@5sIL^1ߧ3i$~gn"b~/|iQMGuL, :A򼤳Qcs\v/i J)/9̖\M^eF02xFUꄤ\_1]J< iM)`ߗ7i\3Ѝ /̖:ɧ3l< (ڈ'y7g>Y}8IO)i]B%:nV9XfffK]U-j8CÎnOdT7Jz^W)4O.l)}%= Hzшx "f T';XfffK,w :9.髒x^v`\)^ʖ7 S s'v8N򫒮dxD"[\-XfffvI!Yƹd/H2AI_mߑt&TyPI>͚oH:7v8$^9Q$ug渿+SXfffK%8f#)PUZ I<,+<Q%#RpEŀRʍ9VX>%eϑ|ZzTFY`- ӳՎ#QIs%HdDl.`^x/k1/2(k_"KNOFfq^_33lM-ICZ$ lA%}#Pc-_)E$Q-Cvk G7(i2!U=ޛlaDWX"b/:% Ar3ǘYht.يg?h)Or)'Q~$9wrVdtke1 Z,kfWoBmtٲ˜8-B33%ɘÍ!jUIENDB`xye-0.12.2+dfsg/res/detailed_icon.png000066400000000000000000000046421225403634500174140ustar00rootroot00000000000000PNG  IHDR szzsRGBbKGD pHYs  tIME "J "IDATXÍW{pTc7!nb IXVBڇ5AE*c}q(!<)cm8"D@E*R^$}s뮄o{w}߹Uqfxn?NndYAЍʤ0 =@R=KYތS,^;to(]׈+}b]Z_[_gƽms$#0,><<ćp_sGGFz3nzV^^p8bhB8CCFgW7N;lܹ'{mF ^,~vU Qf=1L$93Ռ1)̶mwz/Z\xW^}+Hʺ/IvѢcݵ49c ---$I\TWWC4p/;'Ob׮W1UZ:-m/"2b-OϜ}3VC;nuh6 UU9Gqq1x|>7T }}}Ovi6P.5n܌xoέ֓z|h MӠiTU(Ww_YYyPu[ZaæJ8{/\x۾|<$}!M㜻LL,H,)8yWyoY{^ ֬va7ξ)g #5r98t]am@ux<qX ίQ(67{kdG,غK=H͹iسg"dY!1\1EQpBB46!/%eOH9qc梪*1^ p렔iu\ ìY!d\KAӦQ)Y%$I, sIxE ]\o)nTe˶qm.̷8mC)Iaa!BIH&?T ݨ ;\C! 9dYb1B#5 f0]# ЩCeݍht4*'F7ϞiSJH$~Μ9`׎9Ȳ 9rss1w\(FiLLK,H$8aYQNI,}]]p!0v$MӄimKDJH ڒUUEgg'ZM}[nKe ''NY?74MsED)uJ`4Memqc ^A|-`iɥր§<ڱmpX-eU$;6޾/&B|n3 5Gws߹y: y0 aQ$# ??v,c io#gδMz-*>JV=+&uwG ˲i+ EQD?@GKJKVM[ !A54bXQWsg{KmUVΪTn}= 9m} =TK0Hgg>:rb_F&kzm;@úo7m&L'Ie x@䲁sp(, ccq_=g}d ᴡqVXضǎߠD"QK$+eCUS/O$t'u]2eʁg=3x) ԭYkĸl&16/w/dh3{v|= xO{rd :H+ IENDB`xye-0.12.2+dfsg/res/fon.bmp000066400000000000000000001034661225403634500154110ustar00rootroot00000000000000BM66(  Q.L].$kFli%%~s~ }`Ohh*(BNss7u:0~ U%B YXYEF l'FK}GCJ/#HH^^.`~{ z?Y knF chqq.^rOS(kn.n#^ d #'jL;[/l[ZGo V_=2~?>uA C?E?=B:`^y/2w$?X .HG ;C G^F_KGG2{wJdeU::LBy,A5*+./6ei %0 c h]Y]Y lZLN #c *.jv#.0O9 >* [O?US3E{f ~ $?P!i'$!,*LLE$$$$h:SQ60d#Y7~;[$$53HKoCCo Pvsssbq ~q.F+ip0h[Y7 3 y!7$6or6EV~inh~  0~ hZXCGC>'P]LO PS{;*+. h#*!27} Y[]h 6N_b#/$i  %'#%' H !(%U+ 2.~zo% Er J0:hi0 # GkL ; 9[]]2.!,lls.56 >s} /X~l3u! vP GFvz! . EC u ~E ~kh~E pBC:#=6fcsxQUSqs v}~`_^.d 'p *;l HL`> ;'2_*H29>~>.>~> Z~AV6 0#~+2+*/ppOOe%(q~L*:>,6 =epuQb+97GFGFO$ =L75_~[[czz..HSOxye-0.12.2+dfsg/res/fon_bold.bmp000066400000000000000000000256261225403634500164120ustar00rootroot00000000000000BM+6(`'  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~`O&T&Il<UU' !r(BsH7$FImjO}tuJw@>?KI8RB[RJws-,1;w]Ra sh.*ESY<''7;;|.BEI?c&9@=EjV44&Cyi&#nk:"l)QJU`*+xCCz9{M5)Eut{Sp60 MaD2- eR11Nc11b(Wy')\zvlaFI_7~gon zbA.=V'f##ff Z| U?YZ<BCK- FEDC.3/.lh8+,+-AK3Z>  [?B L YYm`\)ZaX=aR1mOSE)5^iEMl 519TU!$@5YI`nzg}XB-^]XBnmDbw$Gwu!#cui e[ S)+] U@r=J14-ˠ-/-/<[STRT8vs^F3&<aW\dgR:b%L^lapWއ).+*DCj=qp($)IA[`rG('aP&&LCCxye-0.12.2+dfsg/res/xye.png000066400000000000000000002412161225403634500154360ustar00rootroot00000000000000PNG  IHDR6sRGBbKGD pHYs  tIME 5 _qé IDATx]y\uϱ,r ᅊIK˴ǴL'C<|RԬJD$LS 6[VYg.#k^,3;oE`((E X+ni,kH%I28; @=pKypx4 -H$)Hz!:QrY#-~kO$ +ד;@NI"""1ccƌ;vȒ$):stId:!wd:tg?T:/S.kr/S*Я>K)%B\ ͶX,yh-*c4,aw/^wG35HQqNk"Z :Y{?y^x_j[0elܸZϛ7/vdCdʕ|[yyC}Jeرc=>3BpxNÌ3L֭j2= 3g(? ,ヒ;l6#99߱c`JrUbbSJ?ZS2ާWPb{\*j֬Yi$ r T+ɖ-[a0 Jooj?~Jɤx~|_z˗/7jQ&Fc+;!~2h?yP.8M*~ސ1X'MKdd ;,Hb ` స'b5-oWÜuY| M ~GIgkt#G ȑ#INmoy(ʴM6XVB+VH7mT*ػܹs IYYY;#r8q!^x۷/k"I_~R=h2K5)`io 8{R˗qjxzzB"To&Kzͫ&SG5:<'!I[pСx~ >;| DX>FfС\SR2ZD"$#w[* >VaU/Z Wĉ #61uMO Um/[ɲ ,F0FY#i֬Fc ߙךѣG{$$$8=NBBƎaÆ5ψ%$InxGpDFFbݨ?5k_رcAڴi{bh׮qpq= Ʉu֡F àYf@`` ڵkTŋ $&u;yn'@T}5(B"8*y2eΫW3#Kdʕ?~g}&}455~2 8s۶m1uT̞=Ǜo6m'Đ!CЯ_? $$z ___r8dBPP Rرc(((Aغu]qgfr9͛Vk.޽7oD@@U9() ́fqjfeqe;&,z^}R[JYlfzȽ~t8GL۶)&cAlaWw[- Eװ;z\o> $ BȒ]V9Z/Hu02UD 48uEP <|111P( %%Et6}M@X'}YT*rtyyy /xK||b\A{xx &&ƓO>^za޽0`YVɓsJxb h0P*5sLӡ!C`jp[ i'=|ҿ?r 3F=ڬܿvE}qshЮ8TSx[FTTߏ+VaHRܾ} hIr ƏJ_|z/^lgRA$IH$fX,H$HjT @QH&gD֭[C&KV) P*D;RQQKRX,,^91x`xyyA&˘>}:HիѦMlݺD^^q\0S-[",, 0AVVB_ {!bA9A@'$r9;g?s..|ރ,ƽaٹstВ$͸SViYYY08tЪU+$ l6mƍPTP(˲iFqS㎺pn ߞ,9{]}#8{]}B==ưh`BC(Sh J_؍1 Y}'ٺDc8$@v^^^Oչ둟O@rh4;k r;vh4!PT;v,.\㭷Bff&233Ѷm[~7L<$)\Ν;t!(#MJaЩS'߿ju_ptfr bGOaaN3жmB"}!_g ѣ+;oKHRL&nrjAAAFqq1XEN+)26@=Çb &&ooo79MQr]5[j9&+f ݢ7ZZ۸ϱa/o_@t]F<%R2` Ag/sx\1q{wóow Z&h1L[NW^to&i+d2CUU(Rę3g0dh4:k׮ʼn'йsg9rVbV!Ihm3B T=z(1>u@iDVcԨ'UV/9~ FLUJYYs4YYF6}$U<5PV^Xm# àK. 4A@.8$Y+XĊ'| v5$E!@r]5n !_cv|x@Ⱥ*p :C-s{jcCCQ'F 0 'Nd):˲@2~1cư+Vԫdƌ!Ԁ$Oڵۉ(̜94iߏ,lܸ]t HjvA,[#Iqi".( rJ^^^P*(**BTTzJfe~hܽ BC1:-GhN" 1DAM&_kOZZBԩo%[]]EoU1])kvA=77$IqYE1"tP^[=?8N<͛#GeeeNY#G7oLj EMߴiP()Z6qȑIIIY:III#Gx(##Xz5rrr`2/#-- | |}}0Lu,dff##qՂT*<|qku-QRbǟEJHgCiKqa ܔu@(mmV.@jl(m)aV8(˲G95{T*ҶiX 9ҙmm)!,? pU,EZ[?\yy^ PqbᖇK1ڢEDr˲Pi:nxXX%x@~ ۨ.sG*DI7޸h"ZT;@t:{=$''[}οC'.]0 />YYY?ϙ3Ǿ$?ɓq?| 0Sz=nݺ)\=DƂ ?~!^|E$&&Vعs'233;q/.V^ 8ѽ́D& 7' ƍۂJkٲSnH)Z̹M"p  mh*8٬&Zh 4ϕ+WW*m  ¸l2n: @(f.a?{ ^μ?xj"$&&&FDDt;v6aɓ'ܱc[PӅ Æ _uaƍHJJhlFRRv^8L8 |9,zv,tNtfsȏG1W|36  q$h"'^|9VazO8J<.xC@H5VlŅ}}9ehtZTPo sXnPZ J&$$\HJJ*KNNdV*Jr$ƍ!!!|D*pv aԁ!!!W^~$7RSL!k"''Wƴi7`ƌؾ};ӱda8qu֭ Eޜ蟛 Moyy%SN6+a/\q~Gy8<|( i!IIEujiiӘ‰/ʡ緹ϭW44 k x02 1DxAHom8+W;vAhum yHH-ZTxdqyZ pBΝ;K.WLU \`~ :b߾}]˓Y7V%\4'D޽VZaŊsA4J~7D?n6(B/ V!Dw@)mWnn999Fp3GG&Ӷ=@@L_hDł;*tD\~ ˚7L&{~s}I IDATgDTzM$!Lb-.B/kGq0 !TۂH q_8d?~{EX`/utcdht"m `ԨQP*YgEBh? B`9B|g)O>CchPPP }P(~zL4 HJJbC ш`TUUaĈؼy3hFΝAt8ѷ:uz>h`8%g˖mݺ8N>}貺}#1_U`~ۻOiY>Ol55NtTUcI$~n]"H͖$y(T[Ijie!`>4DH@5A|m8sstUj|^V>gʏPͱ9Epd@tt5 yA xܳgV"I 7X,Yr~`ENoߖz^?GDat׮]:- ARׯ>; ܹC۶m={"+++zpO=5"'$LZąRME4D_SiNNtmyy;/ naɓʚ*'\.wXݪIM "z0X#aQ3۪HtFJwoz%*y-o3N/EK {~8ѫyaS\HC ::Q9wjPL6Ϙ+1cZM8__ߖڵ5tIVVkIi޼9ɲ,D召, >(++/P\\4l" \͝T9Ժu:̸Hh ;s[Wl6% 06Ȧ}{V@8/1zhPPPXC4k֬:Xm4Sv|M|gx7жm[hZEQ?[b Eee%~rK$PHNFi۶-hFhh(d2Y5:EQ"g`7-ą ͉pyV@Rh!!'AvvvP;9;ϵWTTT5HT"Q1|dgg#,,  ++ ( 09kNwUcpC)6 IQ#* 19ν(!j.F ,J@R̶}uq I|Me,RP@n1Fɒ%KT;$LݳgO'N({1?n:{;v,nݺ;y?gΜ1}tai.Y~~~qrʉ.V #88AAA~:d2:v 'Nm4$qN𖖖ff`h?!aُK׿7bϷmt7d]Qף֭;ÉV̉޻wo ##AM@ C rs4 -K@y#8Gy<7YO\*xRD1A|{W# SN1xsx':vۣK.Eyy9J%.]P|XlhF۶m3d2!%%wܩ怷r[V>q@Doٲȉ(=Co Nѣ_6 !1:*?t*> )ٜXXG_|nÆt2$<_qccɓʬZ7l6a# >iL_$l6g2xn2 sD=hpmC(泦ZlQ4ރx?>6r kkUX9kU̙3;\R)x*bЛyyOO+NHzp} @IllFN_Pԫ+''8{H<}СG'L@޼y={6rssQQQ_k׮ŪU0~x,$'O"--#IRNntVS#Ɠ!9MR~[oeRrP>$QE(%bx_6MuţbyܖJٍvs-FqAee?[ jL&ӂZ~nߊ#r@޶y9BtO]aβQ'5WRvݖR.r^B)!  /aÆiE!]-<>;vqyo5̝;7d唗W[?ǭ0zhM\\~(0`Sׯy嫶 -"۷oٳ0 {9f qqq3f lق[BRa۶mPլ-<ʼn>MzK/_m'z~?w9Q͉A[t㨝ݴm۠rӧPݪ͉X:t`(((xAPhh5:˲())y!,,ng#n5d8ζ*Yxn}W-E}VmtBK3dumeɓ'jں{;XMaɒn<ϯz۬wryK/ttΝks}W|饗$A8G9G;v@NN;wFTT}Qٳ/0㑓˗ 9ωn>0P''f@+q 2b@b'@u]}876|/ss;'aaa;z~QQQ}[wJTE`wc"mcב׺PԹ`g -LB85jԨAv)))z* d%deԕO=П~ɬT6/،p\8H5vR322nv:u۶mK <G\\Zn Tr۷voݺe͉Doh;:tpsΝuk៟}B'&u[4jm*!!!AFFF^4hzɒ%,/>}'V*AO<lR5k֬۷+())OϬjB͛hѢaXPQQ0LI9mky@#Jf<JYAWUzRUj07@ aXo* B6B3-&RCp=k[JSDϗdRi\nVt Cdh4.СA߯[ %6NtB BGYJl`!Bk[e#$IVT[4WcQTGRRR袢"K.\xѧ-Zm6M6-ZO- ~o^rm(BsHl94[N*RǜN$I4ۗѣwԉ$I@dRZcSTVT3*RP(Jd2Y%M 2RP(ʛ*J:T*WAH~U:/T(y6;k_үZq8P>L8q#44/vdm=l2Bx"EwUyHH5jԨ^7 TA63vFG<((H6LJlF߻1UZp3L6^|,FE7A7T\AsY¬2T!It1e˖СCΝ;Ww0CJJ 81}ݜrIUC Aann.,X˗#(H 2L8y$mۆ_~fX`!SLRz̿'''{99PIII?qr<3hѢ)))}@h{3B<iqa;8֭X!ٕ+WjJe8'L) e۷ P`s;LJlUBh%Pb2PW>{l-[8 T9s̙3iNVa*P7 B菚DS5&BB(N4ʕ+>tGy.y/III!+ۑYzҀ]|EI_%x9}}兙ekMLTBB V1i$fnAgE>}_~Xv-@hq=PON>Lg4M&p^RMh*'%%-֮]W^ye֮]u_BvCH&RT\9EET ;L]U!T!d'k*OHHhѢ>.`p |I dcY9Ki%0tjњQ"T좠zbK>^h 㸮fͪfaѷo_L8'Nʕ+Ѷm[h4̚5 o&(BϞ=o#%%XfMgAD ]̉0 gggQ4=99_~$IjUe2d)q}ܦMc=1wP?<7>>ޭ~3L=Bhߖ3"P]!@$QEzBUz+]XQF89D`!"P(,vك|}Q۪.wV>0PI4o[MӧOk׮xWP( J{SNj`YǏGpٳC9m8Fq/ZHHMM]pYD. =*' zqzO>$ح{J  rmty~@05TtO{9qlgdx5kD~~}>ktwhf@l9ڙQAw)Om:=nj$É\oYf8,^[ƭ[PQQ}W^?Ye2E$q\=8KNw.DVe Nx 2Ė]9je˖'((AdBZ@"QN 8xB78υՐ=)MTB/C!t݈!l, kFؽcp 5r Iqcذuvjx+IZyǁPQQ z=ڶm "%%+V@aa!O~ ӦMCnn.Ν;۷oC.cX~= d ׋=""r~QZ3gf̘QzZ,OYTT4͘1t̙:g:lWDDD]n>|:tڵ5|X7c_4V\WN\ھ@Hk|(^s8| hE+-H1c)))7+++!;HmjG6mڤ1HI)NW3ա0.qT*XVŕ+WSOA" )) UUUo>ܾ}NtkcРAQѣ(=iGxGI@-A:Y?rȑ_|QVh |$ ]tT7=>>6Il8Сnb44u {L6{8!ha⼮ ⵾=Bg GCh{Uz̙+WT4$ach=== UB<ꔌ"˖3oONnEg`6IPsytԩd~jh߿!TնX=v ,Yӧ8CǎqyoD_~=8aTɉP璘? IDATOI ~z͉,\pNN1^eeexce-\S%ԯcS-`kgZl,'[~s!!!QFEFGG_1bDxwhdG84o^K͂5s݁d*^]w¼@F]dGEn uSW84(,L^5̓Qw;Am֬5dO>СXA8<֭[;СC\AAD9d;ӧO|0`@PDCȒY/![ u Bg9Vc,֝n-xbL1B\!Ch&Y'4bkYhu$j2WBM;R*=3d3-0%Ja/z_on4zB`n-y#d2c`9 01荀Tk78f[+掰ISTO=G .W\(BxDb&!-(F7GP*ǝwf,,Zo?Wnl}վ]tu0?DfLıJ`C$ttKsKR)yh G ZYtx75I۠/wN83388A)#ojj#dsq1("I,0.orr|JN( H ?Cr Wg|icQvX]HhD,i >Q>5D-WU4XYwBbP'@'\D;عc]W[~C'FX{=@ڣrQ(9PyP /~xJ#jbȐ}>_e˦v;p}_ys_'&|٢)flZ6Ξڶ#ObӉl]ֲt3^׵&nxe/m]`A; [;J}\uUa9YK,uZfR"TXDAPXH8QKnH}>wh붟Ή(T~eFV"D7&RSHj+/-i4ڣ)o⟽Ts29DF}34e\@HMƍuc ytJE1Z{,?j+iZa2ynK-# u3@zQ0Jȑ/ ʢ"@6o$!nÆM%IJgvj{=~-dhrO"b:+k[b'r+ѸrUWF9E߃^7'ԛBj+kC %,GcNt δl<5 x_CQ%%<Qr.үTu'Z~Nj?c6os|?-~2be<6$ k$BQ%4`iy<>,kA M uiϺ~}k/9 :9(z~Tjzh(4l;5QB DZl4ޘ]>[PzuFMb+rvu3+1_\ߓxGz=A0)A,[v6-DI bF@^R!meHnT(.8]!sLU~,( U7CӸoTK4wC$k TI 9ur&(D SՠHtFFY0{(ݔٲ WEոC!N+&Rǂ̚5d'/Ѝo8vUrG#i/l< xEICJ5pE} p0_ D&U-=xixysÖ-܀FB=A<Ƀܒ\y׫D)>@jζ21x<< U(*98GvGrԺF\2R1Ri M㨣w~"<v;{`O0Kƺ@[~zE]r(VxяM,bODl+ٹZscmy{k{ e)E[8OBpv; $=⚆$(A< Ty[,ՒE~AO xXp)}x G8Jw%XE;j0%iZGx$p:7ppei"nĈDH"SJ@c 6\'@gDZ=[#D`Uu'ib.q~'#h,([p# QRSeB+ ?6/=P׿].;.jtNi, DظnVDhlw:ǎ=UN޽]IV6|vm!5j_ T2C|6->͌8?x>&J(?4=:T@ӻKAމ4>Ŷ+IԶm7^@ٍ7f*lʣǁq.ml+G[y$RPj״F+U"!!s-"zm%[͈YKj }DfM2"I w0BleY΂.[`]R6I !dlmV=P*끄5\@*~9:i(~J%:]M2эpx} kD]zQ@9q$ P xՐ4'q@&o}@nu8bj7o]5k;j v QVsyJ5JWRjۨVjV;jQpx~%6z2t:MWhӟIEisP {v}85ȣ ҨQKBh1k4h䦛nʲo֓mنd|#],8Ν@Hhw< %pb<>A8]g@h~1@#BKwWէGnjHOpe?q\k4]3ᇿ͚))y r d}CKJ; N*(e1)WK-?BSE4򤫵꿦j>=Yd3 d3y[NgsTe0(֯2wZ8{v@zexe-wBߣ>X!}/n2 Kyر#dYo!Ϙ1#p4Bd>7noBze˖iӦ3W-/pT@),Q j@&En;pgņѠ%xʽcu.9VGK -7,AKY.i@ Ή|z?lBҢ'FrFF'FJP( Ѕ: ٸNApކsfrknCjYTj1D"Z@*ڽwy?Eo܄tk Uƞd8ǎhanVVhii^zd#=\f{|df n'dp y+ pAPlr`m2:1ch`СaBzػwxY?@n7ZnsAb,  =z&Z j#=Y4[ղ?2I% ŀ>hOoUTzL1ufrKGM$<8Ha ZSUP貲.P=љh/4k߿QP@ wfa&wIr ^ e \nC[ y@^>r(9+_R ndmVIxpcCV|%Ȝ Bč翨YaZ?o&ӧGOrez jiHznA%my裏j|MzAW_ХK̚58lذl6ۇף<@$cݺu{~J%4ht ''^Rq<)swhZOF7* =`,`E (eP`stZU5J^8]cbj0ruAyRxt&GQҦZ7E&wFJC+2.@H_\o6G;~<G&#`߀GN2Ww[Wܑrd8 4z͊޸OM mjL8[ҩfetͰUki&&5V"M IDATJ^ op_;k={e/%n {^׵NYRI[B|Ѩa4*ȡV-BdT>Op@_(ERh4=v233ӧw;_޸ql6cǎAPWѶm[ (r`@b*C~aHKKÉ'~zڵ n۷Ts D"V  ԡ๒19VyV'L(kK@v-{صb $ToiQӔߨ4V; 2F ɧH +tQ >A]ET* yWiZ4 +F eH*֬9[QV6eTtl['mQ|q.IhUq@3m3㢓qwcٍxwpk/X@G@peeq<#%L|PE8$&t޼yNV'|G {h1``0 %%)))Sn~ۭZr-ѳgOԮ]#FT.RCm%hT`6n{-bJsCi xvԎ3(/ T'Bxm)9:s5e״ fvhTi0`m ``9NA\heRN5Gq_%Z,u[UoP!!_rb*fR߾O̼z=M4j>@:@V@Ӧ@Æ@}jX[BX`;$0E.Ԧuu@ @aw{0rOS(GeI@ %MRJ9MlG6VZ8rJ+gTFq%kh4*b2HM%$-MF#8 _vJPJlR)%6by&i@_LP*Xz5<t:t:|>V^ )3Vڸqcwa޼y8p ٓt~ITva!l0 :N0t@~ Xs8.62Y]Ykxntas].0Fd%\*KF^\?;3,Ddst2zڵa0)ɓ7tt4kԫGIO4CB68ģ99FYR O[wݒ}-y u6 f0Ċc+{+NU*y jb4*#- jyopՌ< @ Y t8֮]cǎ7lo׮-55U0a7|S;xfy ڵ+7n JJ+:<4Yfh4oĤIvZر#HQ N`НH$R7[G"u}I{N?c$ҒRߍ; 0ꏡL$6%JZo>XUF}Pp<߃/,?GR|аu}M>_ºM|QT"y5߫ר1@M90eKX@UMg{&MPrVWQN7<\. S u݂` ,q[iJ oN7QE橛]Z%7;Z#t 7GMڧGvAik4Jh&zЊy0-`[V=tEVW^JK/$Iol6Aaԯ_HOOGaÆXХyn0j(fܹK,g Dj+āNlOC> C+[ҺA$"5?|0.lvJi [%)D`4:cDZv~^Va C@a4?kӦ̀Ç?Íg̘$ >k֭?lk ۍͩ'juH+>| I`9IC8w\9հphf+D$ȣ_H8FC Qc> LT\Tcs3(Y'L{4 #n :{41E 39;g 6Ry#ԸE쿞2ѸD)-g,5O׃"@Ft"p74%819.(pY\#~䶑m**]Z;tH퀫k]cV .55  ƺq@=(" ArEVr8C# ~$2YvauE||aܙz'w=>o#(Q'ik4:ws4uE%0\PeMbvS*L&ӼM6iyo~~>n:3ƍ!-Dlڴ {ȍʡCy砒(e9^S+7ﰎX7[Z*$bz|]`-A^?NNIEǀZya;&bV\ae/]PHMM_a_z {nk/\̨2:397Odo}b0)N^T]\mbb߉V-k4yK6Mʓ1hs1~}19ע CBR5L7oެOYI^w,k+ Y߆^D ǏG֭cNa%)&QM),YN&P+ xAB  +S*NrH3cG|ylN]~_z:3gfmT>f߆խyAZ"v1rߑ^*Ѩf{Vn-&zFF'iԨ}%/X9jo4i믿^駟r8=AK.\W~?rIT#ԃF>D͐<̆as>c5VA-]X81{^-d5+Bz0 ^eھ$."aQlh5v46h/#YjaTZ?+AA5$j JJJX,>`wO89S/ wIdk^oePhTXI/b^.Ť,,. ;e @c/wV],O|qJr^oR#Jҧ뿰ly^]Oeo-].WP, 8afdyfc^B2)̀q;{<χrT=:vzU=;ddر#TDՉe?I#(Q-<x "E \z3f #`8?c oRD !"!JHuD nl6bوjyP|t::h,Itsc.GCY~l9^KLQČ;xDۤ DQ8ٳwnpeۗW~ҸՁҗ:n .$/8_p(\$&y6 Yp=ks1zM"PB҉2 ⊈W] ^\HC(7-ӏb/XxAQJ$iŋ mZel6[(G"ьmD;V"IR9'UGWtNzun2j{\%Ua 8:~ ^įOeZ]?6*c Fu3wiU+O'<Z+4U(պP U DUDO z*cԩlgj0N8^:%>MtS⾿CZBRsY'-Ԋ1D:}&M?|L`7Є][+P)p^)kWi65V@<~@U͂ d.8 *~?x"2DCJ9%xҤIm۶q\Jө.׬m۶5iҤW4ټyq_I" Y5ބŸ.+Býd={ndovݾ*_8^q p{U"0*L'0H6TK<m3PMpy.+vQdo^6yUL7.bL fj!La<]yX`Or*uM8h% s-[,pA9hnlٲuԩ?eeM"^zK"!W'2PC4*nY}ȑ|;vX!wq\^UW, s]=#vrY @]؜BW`XB1ζ(LTu7+/J͢k6Jt;_Vʮ5^a(1SVz@8RYDLȘ 1U^"@-[&Ϝ9D^! G3gfXj=:.Iy͓eٻlٲ~UK"G\4=TFdgvv[˗/>h[NNΒh_^o 8 ػPBp> mD@|%ȾBynqWcQK`K? ػE0= J+ZΚ۳^3k0"zDТ !(pC9sf1#3av=#B'|2jN2%ձ$H$&5&P9hLAt>mo0{.\Yfʼn_A夽o,L? ^=׷-~YRgBvƱWE~+x~7Y^_i/o jBW;_/>2tV+/9y xPUBxRG,SN/^|(NwT.f*,,?gΜkCT*}>ڿ(HVAK SO=zٽk׮]?{y] \]KKJhU"`I3sfu/` ioOLTFU)k3=0ꯋأoL$fG4Dz~ٳg+Bٳg;嗓_ gGKnߚF$~Zb Z?jzċ;=c KJ)p#JzϏ3f̴!Cpw go͚5;˭ 7n_6~ IDAT`9}*WG`uC(|s#jKTAR BTT3nl) %ZiQK4((Uo ?Vν4f/_ȣ:ʹ>|G 8u6۷Gǎ=;=7nxFFF;p3=;;;̙3A>L>RAb4ѫ`6n>Z5'QW36mXqzO}ֲeˡT}Oׇ+333fomۧP([=pyBPN2y8Xp/ Mþtѓ3heIMg4iDD"~p:*j(G"Dw*M>I$qyOrUM3]m)7B)*N,˓ ]A&#L xu"#P'O,](]g*Fxl̘1M͛ QDDuIJoIĀCAhx*bhD^ DLV2-G}ۼ`َ{c U{h ?b6W:4 z(?#M&ӏ}ml2ZƸq㜛7ou8='!DbεJ f$mȣ;*xe4w#h6>\DoIDM:nyTÇҢ:V"'O].!HDgX1 333U]t:w طoK/_.:ΣVU/'d (UpFK $AMju^&z8kإh=zt݊M^|EqyNGd j\iP$y%$$Q:v֬YƏ׳h"sϝ,..^RᣦF1sȑs* `ʔ)Ҋ+c9S2!^ # ɾ HmfH6;ѧc@VC,Ck2ARA(*j'j Mί^Ϛ>}zJ&oڴiEDNpU*nٲdY(#$$ $FʹsTF" h4gժUAEegӦM>|p|"Z|uåIsgyݲwV*Zj2f!zy?y<~$Zz+.hһ7&< }z:y9 _~(MUˈFz>kÚ8qW_M7 ;Lf 0Lq9K.==ydO$2 nHI㉛< -- M,=#GTGK0h 9RmXg6o5@>ѽxzF$G^(9V+>3zy8g>}VpjlW_ &z$Bd/Kј5}h`=}jذaD;@e8ɣ$LDVPca36z=233UjUD_E>!$Gbްqˈjm_)uY=hZBNxY.zBWI7dZh͊( h\uM7ظu؎Z{7nZ*>S9Z8y#H3lTM7"EWZ\sMh^UIJe4k|UׯHRZEU0Wp8T(7Lc%Qa6[t%K.lnQPQEP]ɒDr>'qb^ 2Xکb.%_vntICF ܗc$A2DÍg#5-4]%H30hSNhG3r95+Em8ߏKy|.жH$lq!h:,D Q?U7t"ps28_OiO!r­-S^  ‚&c j^0l +^C ,~F,v^~#޻zŔBϞ=w{~wY$BKW]u^.SN"4bPB1Fs-|ә<AAu gqGhtRBvβ*bqUF|eF-'qh׆.y5DWT3~gYC9eYZOX\QZV m<%Dh4^طo_FFFF\۷F펴kh, yRQGY9(@x +my<{뢇I&"PVfzJou}),/ ;C%K1pvNsF7sQ:`D*F0n{/rrԩb7oўSN|a:u괊uy͙3%QWF{+6mΦMb /+x9MzzhKPDQN yp<my($jiS %BJ WϚ5¤I*IiӦ:kPnLc=k3G?oΜ9/U; 6DMI$qϬZ*ɪU^Xp8>5a)\:KL0AbuVzꩦ:@Y>*5wuם(,Dr,Ww*$KA 14=f( T d̘1ʹǫHJ=<DM"J)e 5CW0&@+/i;p?>ϟ_X5I'$ zaxК$qA@z'˓D@<ϏKIIz;;yrXV|-b,~2jjcJr` F(rmQId,⼄x#媓Y({"f*cܹ,!^g4W7wM6 Sjݻ|}۶m;aXpBPĖʗ$ 7nlO,x#?*jgϞsνmۭANi5 o5lѝ;wjժMDmD?Q3Wq7BWjBAhc Tqq'.DؽZng6[;|fzOmtjOʲ_#=$T**ª0E"I !2#a:x>CJA`/HMM}j֬Y-Wqq>ja43MteMtD_%tj4s9KȄL!F5Tn`xQFW-Zp*SSS)#hp\/{r+  )q}M5İaзo49m ( !)DQ&Й !.7)C`۟SO[os-&~?2>oJJJ ,0#ZX`j'6<~-ߴ98, =i=Ƕ{o V@2z&*]v믿믿wuj8UV⋗ 6,ZbUUUe8'0ҿA) Gbd 58<@y>}r$W~555839]_nݒhΝ;mH#Me_툼nD@) QIWUUp8>5_E1>pt8@>} jkk\s<}(x.nժխ<@!$⥔:b#1[z;wާx8}t:+m2TNkԨQ=,XtĉҥKu7z`=~ԇG>iB ? >R.''!Cn<#>OvRps!?a=a1dU c@>iXaa!A|,٫0!Vr,R,TEqܦtC㉀㸉idg%q PRQy^QQ'@`$I=oǼ6$ak׮ݍG @ qvn!)tz2y{^^·@ b|rс$I:`0|L:utW]umڴLiD"[=\?Iy-_lsf͚tb֬Y+Wv &e@w q1.@֏>hZ1J.!,,# dݻw>}neFEhh n<Պ W\aey$Vzbe[%#]tA4EL3-(u<`̚MdYnxhAD6IR g;QE ݨB)%Ɍ@o~11??! zrWE[l}p:t9V@B焐ϭV@СÍpzTEOj^Fy"??^#jvBy'c-/4~Ə? MktΘ1cLipL&9:RJ,ܾ?5ä?w ~(ZXܓ7!ĺ**GGV 8`[;p`0L*++{0;wB)?pKl!5 oG?C (7n ^! x^YpXJiyv8k( GRAIt RO)vwV#pzL1{;v믿?AD ;w;P^^Ν;ۍF Rz$QL!,d &BRJ?q@$cqT>hF&d%ҭ[}m{  ޒ)((<.0Z#}իLd>4g;]bۿkJϟ?E?q݊c"-N^o pq_&d3~ wl=Ge a9XR$Iu"noq0 '٥'Lӵٳg˲, iɔ. !X<$ikCzr+qa.̖9Ckz6G1l saP*A~arp*_$ =z{wv\,B&<5vykٹb^(itV$9NđȓeEqTލ}$\meLG2~}T]$W\qE_$I2~O>@c}>ݻwÇ3g-DO|>_ŪU9}}95^||WĀg֤I^?~?آE|^q4)86AWϰ{CMWA46 x2FoǶ-}G8붨!,YsJp2`?z*nQ}{w A9r?#''H#LnĿ!/?EښZ\Elx[tm,!$b Ν;3֭ZG_AA㵵۴i#|xn:tX=GSN"GafctfNEgby<2y4uI.q~NO:﷈??D>Av%upQ8nٺuDѣ:t;=S7P95*k7*rzWH`0-[-SGvj_ ^WB>}4L8x:zW]ʮ t.B7??t>iӦ S(rرc-Ji?}ұcZFZDSM6>@)]/((@Bghl_~ Zdǿ2ϟE^AǍŋ ip >V"mlS?B]ĉ|aC@a!T@ shaSn$ >f͚#FJKKAb71aPPyZ'\w ر#>H۷A3(&tSy`2\Ꮆ~f;Bd/Lӻ=rdQׁȲ}w},^Qw}w [E2|>OBӧ>OWqE MkI89 Pʜ C[%Dmf(e3f .9眃]b´1/`mw`о}{A\pXz5(IwYkŅ^=QfbUL[}&e !/ z3}wha M%[<) 7@;w3 IDAT?~J Wxwyy_ vȐ!m,xhdY>ׯ߼d6|BF<75}iV{=2!ĉzM2PK}Ϫ^wsF?F2'=U!9|F^u d 999رc0:vJl߾]#Ȳ c-x܊vklSlt}beTNbZ絝b# ػ-.<ӷ-!D Y(eMs$idn.]޽#, r'1r'l9˹AÄP\ILr+g>/`_qaJ !ÍE(2kߕR7eP so߾}pJlH0w/Խz$r#YB x?$J4ey  Rнv[v-[Ciƾ}0zLQڞT.a18mM:q|;w4FRDTOP,^FHr(J*$ɉK]''zvIJ ]]~ꩧ\וu:?x< )ܟog/Âci}?Đ=YODB:ܼy3J㙙=Lwڵ#瘜F \rwHThNN`I(K\l4/Z^RLoFQ?iNs5B :Z` /[mz>C }^^F(2l6 Vf2z:^x< -"HV+$IHJ[{Osx"s]qu^_5%Ue1fk^nJjx9EJ(7ż)2\Et~&xN%Ip8\GW/ ꫯ67|O #l- qGCHnXP*2e!,@)BW(l6[T9m6[/.I7ioe6n3.3t*08-@¸iffICo2qtP䗙ۈ.%mUQ Bq\=e@nxСC-,# / /8~cH9#֙)"5Ny顆zy| 2 dlbST1/5UЁĩ1a6jl^tI̚LD6,(ҏ(r/Q%}W?KVӎp)lQ(2cs\{P^ ]5r8k{(ɂG<Nj'3T5ޖH a0q\nǁ8Pg|/=38_ZGq\9χ֭[s&@ B$(jp:W;tDZIvˈ0BQYP_9qtlp۴?C/WpG o l \U5{ X=+**@YZ(lJV]|ѿr .x F ,ě9?bB}$:C_QA$^^:uB0hӧթNkCv;DQv(Lp\Gy-i+Oǡ$(R9x,bxkEjXUVSS-%T-^a@2Z@0٦-@^o pwahl#9rOܼy}Ns/j(~9;`"CD|>Ƀ}! b^K>ɰﲒ"b] aiCusݑ9Ae><"֥6A)w#1~:u̅<ƌz5ަX#rj4'Ec;wwt\; J_ܔĮn? 򇑡{G&S cd'pDg7ASќ5]|-RZMRZRn0rlTqeW+]ZLo[ ppD;x F7LKx xjw0w0-2QMX[u)|(4BIešCUڣ埡~J^1@aܨzPCeAI+BF+èlJz;+12~@'x gN=Lp\{# ,ɼdQyʃP*Zކ5g=aimpeaaDF^< 9 (E(ZN7emU25wuSyP.̤f\7 amܷo߅"HC >, Qf(B Ioƭ>loўzA3Ӡ-#Cʜn!(pNEecRMh#87B8%aO,w3 X?]YYYסCd''w:c6(L)LIH&' 4 @+Fl A(<2AJdP<*clkBWq#'r !d-u4NY:`Ւ s Tpu[MMMݚmy> zAv׽;w ȲqDñ?oA:%3E\PJf2?w2P!P v'yn3@vJ 1`JN2A?%S~(D#50;F Zm8ѿ| 3/D7'zgC검7B&>Ƈ.@9_}s}~94Ju|ʉ[ hL YAx$BKht:??3]u!4bfEݪx u+ʵ5iEEź+W`O Q?⊗hޏ> PRu}WX9Jw:GHo5{. DQӘ};r*|L>]LvGƉ tWL'cz7d/7Ln`ݎ#aOOV*5AYJtN)=5$Qz$v7i+f=蛉R&H!, ~T]_kP -@hD_.(/??FV>ǃ~x[yB"3CIוYXh)R+pG[j KȬJdDfPYYV), {qɒ% <ؐL)V&0 PU/nߞsI[PSRjeo3Z4 QDd| = D6e<>IO﯑ٳg?Sk)z"uuJI8rF#|>_gzUUUuZD[FՁ@o;ٳo~ Ǟ={cر#iӦjQAruk>/GņDc@3 >Xߢ^4tSIII6Z֟"y9ž'Y~'NY9h:X{4xΦW8k*n^͡//h9<9ֽM=d-~1|pkV&nwP]]]$IèāB(#F9wr6mlX8J)jjjT/D޿Pu 4W9hҜ#x+7rѐs7mx_j$(]䬉=9$]F~@$ "Cc@8טLRJyhzFpXqLKEQE)hFl<RST,iN&WiJ<$IFN>! s 'HΥX,3#8Na{<: uNt- aUz#׀đOeYTke=yA\NJvSsSVhkR`>$'NAvj˓d9ѳfړFq߬d$+>ʁІ(&(g%G !B4dX_c&ҥWOǼ~$CX?VWW/fq] a2u:^og<7 p+;39D-o@2 b05d]JU+ZR*3 $rr-ȍ7t:JPJҖxRsz ϴ""}:9sf49ѿ,Mtnx9:9у^wf,cr>;sBY ( EP*?$?q "o<@Y! jF,] ĽU; !+Z<ԏ7DWKF$l6'0a_*))'ɉz7' Y95Z\jqJy RFO1 eq'G) TgCY.4з)Ú})eFz5i}:"%H#qO=ztN 9.kRKy^[,BS~x cORJǦ`XB)Uq&> "$|AB|8Ss._ {: hˎD"m E Bjz`GJF_b23f9 Ntd:W]M)=D))Ք3uJ.o($BǠnܥPf'!+`1RB7I7(ԞIp^Ԑ܈s jL/pp0(fRf2u;ʎI#=p5*ѳOuQ*wiwɴɠ8^DUQQ=v@!/! ׹sg"=J7,%UC73d)FI[ByD(܂P,m!R:2 +<e#xJZx9OM7eSkCtyҥIn `<x)++&'7:<{PV&8k}z $>b4އ,aP:ƠmD k;$TA{ ҿBS&ߔQ?4y()qD#JtKݒ12Wdg~}AxP!V+\%;frCCt^`@!nB-lNG8I< `*!$ico8R`[_Ji)@ e5Y fA-BY_"uH @dm)cx }4x0D/⊄] !m! !MpMhf/fILre(='0[g# !4k_@'`m*)Ay$~}=宪n%K׬_qYQ!\H9YBBȺ YG)l1u0` =ofya] !+OCXX_ r<K~W>c8#gY\\Mˊ)6GP&c ؎؜SC Y,̒-~^z#=&T9t+f!(kRʹtr[j+J4K(R@$;mM*-B)IP Z<~@$ݠKVZֵ''Ii3޳]d gw?9'u`h:2[Z& 0#> s O2xK$ιd2=8a݃2.`J~&AkۘT-epCO6HVN8OsN2u[ ZAhE xpņI[S׌7}N˻w Bf]n6VOмd:tznxA-y&焗l/-C5HS} Vjx<3^wDSӗZNX,/̜9͔R}ڵ{r= ex'\|PBVÇjzӼszk7,AУU֛ aZ9f E `8x<ܯy'=%, IDAT_jzKz")Is˻w٦ &p0n&LfϞm˻7JvQF]k׮3grCEΝѹsg :3gvڕ3jԨ vz6cR0߁(gPJ/nлR1C}F)RRz]Ta4Ng۹lK9%z *2$YE9+f;IJ.<|D]$Ȳk'˱qUNKX0>@"y=o`y"IV\\-,..~Hn?^RRX`1jł %%%x3y"g3E gH',(<'Tҕ衔^\^#XA IF,v9]m]((qi@6bdKEB!D hIA"۵ ",+P Zj@ t2!_1vU8۹W'"'f7}oLw=fQ!"L&F--yks 'OEXTPp8(8m;Q!Ba58Qq+|,2]͉[L#SN'db6q<XOzl?̚5˘쎳f2\nw?k5 vJĉR3+x?Fp4D)d>iK8R@rK VA^E)fJ SJoo`[o)I$IB (dx|żs #\I " pv)l_ /I0($ވ_NEN0<xRj z} GbNty"/UOxD?̘148M&$R/.'pŏfBsij(1iɢlt%E}F* #;5E+4'vڦD(W25G[ry(}'kߔXIRYaXo/+6oA(uFOCmxIH 3ڴysG4uŃe`rpi0c?8t@F!KtzEIUUҸ`RoSXX@aa!t:Dqh@O9 ~ _:2j4:ۄB:T&N,!dfJC_j%͒!̅3U(7yF46i~@jke%JTNQnXGIZO h4~.@4 fl*!l(#.ug;H~WUS`L}OyQbwJy3~x@9ZUtDD GqDKgiQu7 4% ܸ5bGK${GMk|`3DV˄c{; SW}ӀRcqxb! NtJ,>nPA J'qG4OeR mTnBPj3|oM%QIHMex]/pЕ+.=@k@!9uePhŶR6@ٕ呈m).I!dkV#L&ڴwVT|Lծm۶X}>_Uﬨh۶-L&S9wVTi3H8x(Cv2D<\z"Ǐ<@QĦ0͡ p+vg>(5B1 DYYQOeHo/yby}bݴ())M 7zf]8fsaa!Z,//GYYxviI%N&OыJ-,ūcmrKK݇<8Q>}{"Tg?S)y fLk[YYۇBP?JJJzim׬Yb뽶<3*CI==YD\AGӕNRJJà 4SRDv5(]VRm6(f2@.-)9PSSsnr~1hd^0$^ZȲ,ys$ːA3英;Cz"ĉѣ-)p[\.C -\8}w]oA)dẄ2g ?t<.)W,uNH3t]R{n>lDQ#^W ]@$wW}j`UQתզaGnw]f,auK&Od=wrII_Q*̀g¯:X_&YvB%O-l׮ݳv$Kkѵk4Rvn?uJ] ANs7մKCRt'4H)=J))IP< Pһdb͢N86#\&Dz·X,b //~O|[ ㏭?6| eq:g|=iӜ maEmP*Ux•R+778v\ d_֚xޮDڈ ޠ U$RqwF" DD "=H[\ `")Č(@)G<9<n>SDostup8Jt̀qgGI4O9nIwȕܛ`%ʼ%JQ4fjY=2+Q^P BdH"Qm ?4VFhF0w4@"fz&\C5Ji(%1tGcC"'Prz0z'A2Ņ(Tpqufu}GPSPqz=(BW ㌺ŁBXzMºAKX̘BXt BzoXr鿱FBvirJT++ {*A924<; ~ZL@)/W!^ùBN!)YH)=v)̂u9Q×~& ?$D0R: cX* '+\8U+_7lU#FN}'IRR+v;wWY͝%z a0v#2UW[ @ꃇz_ #lPD/x:^GmR n `<x,++&'zBJ4 PAee PJ,KJ#kF "(s &RJ%BNk} fV@g2{q̙N0!… ~wDtnzіYfc~?O^dIދ4ӐPҩ5D(8PJz Y9Y=e%zù.u88Sq;+_M8:4qFjYrgϢA.C_uuӦM ~ z]tg]v D,]3VDt=~> [Z%1i}ⓟQ=- rr,ۮڎUҿ7nнƛn9_[qQ֛AYD!0եtyo,ƿL5$FBNtxߟ$2fdDϛ;o~H)R_ cFmlo$ףooTK'z e''zVrJNn'17E 3G}T/e[f.4q@;!=8 ZeWp(9M( /;YJ&Q =!!>P nTBFQL@q$h-SG($+3s>qL+^y 4_BZ1Œ*f>‰7 3ʥe ;ݚ6'yyy3~P( jzZdt:z&i%;r緶v8rz${̝vs> _~~O)UB|>,sNN$MmFۍV `Fd P3L$eyi1V`(f]pE$NqRmC9m{$cGRr$($5l$^2IX6{sh\\0 KF~ĈήΝv>^t:_x<z bYBK`^6 fzCZD>0" PY<} pe1ךAwN{vVCFrϙ3ـ]Cl@=C"c8,hCTq-&e`:߁'- ˒Gj~]ԳqIBGvݿ3IkRvwڴIx{NT0@ T2G/8lWO@\V=RCGa2X' 72ckx~UiXw [>VDDTքH4h6 !bx:GME!` `/Xڀ. 6WGIPCQ[5g!ea '\p/_[mZۓ^R w,0,U(vRK'@q  P qg!*biax ϣN̅s}p9y WI6/" |3F̓$!@)\PRtVKO%S7 R n3<C⌕v! H+9pb >BN8 M'_!,λ>CXKh MA(μ;EX =)}g#q atwxb-!!)ފ 8-u_͚߰09BiMCV>w> 81 wZ¿Hs D72(PT<_Qޠ@$5"Pنb @Z={dɉ~4ZY"PJiwA ,.q˔lL[@gs nV dD[¢[B st'ұWH!K^'̼@һZfKzG:$k%zIWDo`%zIZ+3F/KjP ,{뭿{xvӏ!r n!5`xSIzSzkK< `6o"Ok/ zC@$tu \ a'={vH\_|EaΜ9\7p >0bN UkB8l 9S3 g[.y8#8`(vD+@*!8Lz DJoĩ:*!}}Ki><ę;؜ʕ:vܹYm~{]8bJf٣2!\̮~92O@z(8 xV}`[><A#ѰQ8^N}z+W'%%}&'4PR`uh85;s0?y?MDŽB]HUBC" _ !sJ欩 !5uHL4{G7*:&>[x11:sYf6&;k'C5x@:N"~sp@|&Y8Cj#|L %GP \z`rO\Ϸ : FvZ-YYYˉZ[@qEBH"iq_łEgKN^D=r$:IеgFSnajz f?iNG)ryRɕd$jur8j53(9uAe4r ~B1K zF '}f2"Xq3mNDvy# y8}T(B^^VV֭[;NV]l2}G;lXUliTDB'  8TVWU9X.5#9_lçN_(/w2p(P\mW(Pm͑y]z)«@E(ŲI_$R ^+[4LLnn*mF26M_<[Ոb9_+Ϯ|4~֙ jaJ*JHB*x :H(xTEO>wcZ)c ٽ51/E^6D4mWϋwϾ=EQ~ǏWϞ=3f RRR1c`ǏjCdmJfP8 ,2S@fyf%ؗM| c+1-7vsS樗)HqN1'Ieq2ˑIPejMcH5Ws%nV<1w4clύHF~뙵˧b[GbTitO$cj ]3iB!ҽx @ϯо0e6BƘ9. lrO>vUmV]l2CC 9o&رcX,&DLQb;rn;*B|+cW1 46ypwG8tBA;rӄD=X I3&Y<ǩc-wPgq0vlrxxvہkhi=WQhL6K!VmАD=&ٺ%#˂mzxN-v CF Cns%'i=z$(d'ڳmC}yZ{gϞн{{wޱfmvZ2 |k^M E0{ #8͕,h\J-qpz LE\6}I#q?~:Nt_~9d2MnA[>x81DZؓ]l=h ǘ^_fOW~]&0WB6(>eA z|=37PG>6+2υyZW_P`JNm<@hZ{6o]b?@ qHv|l^@,n'E+JmAXz`A,;ðw0=6f#ؽe=7&vUI%S }ʕCM&S&DvFAQ*(Pb1(&cEU0wkzΈ'_qT }:1Oi.nl|ޞMK'qȀ+[&iڥj i}ʍ6O`2r3@t= J W5w n,c.ٶ=J 2ihR l}hSn'0 BH;^Ȓ9ܶx%}D m @͘3'P~(? s椒nOpA! j-v.A? u%G իkӘHh׮]bNb"YGGjiinÆunD=U߳,ò7X+3- q" kj"2P_IwAw( P F|hW,.K6,ne H/1O]-2^.8/ pe }yA!#ӓ1Nme}끤룑>ڇx&vB+h;%@iw/sdIG,F(*xy1}0RӶFѮ DD"+Fz-8:5!FGef߅fZ5qVE+S gGw}fA*O"Hj[ nz{x" < /w1|Ì!,7|t>=bh9ˏ\vS/s`ƫ >3aqpwbrU9 [# *Rġ8 xPSv2`2(2<} sHV4@دX͜-H{9 8 k)@derPAtPmx.@COA r#F5X -~":MJQ J[N wH)īm@$自}pR8mug#yrHu @4>dS.|V\ 1hAc:]BJ;8]T;1&nM/=d]tr@DHm[ȉQ/\s88v-v?;S:w u&ߎ| N0 玺:R` $hP? 4d1X,iSuCtX,l./:g9bq#kLu;p: 7#n Fa6@1(@,1$4|SKA׶4;$#QLm)6YG[ u NV[J~m ;Q f'`Iq@kWtI}dgw QNʗz1A@9NTTœ1/"> T <45`FC$d@L>Nq_RyeYJz`\rU;%"+Z$"&Y^+B$4:FP]B)zBo[@]| nA 킍joo1?ll tA2V )i悘w0$T(bbIQdgh$mȆ]Nk~An88)[w?;3`]V?`w!GKܠk2Jra諏k'Hg4r@CA|NȑwamK^Iyv<!V/z~T"y"OS+VTԭ/GǑr!)GP(+ /;ߟ}?=}Ȏv"`Ш "sϩYx <Κ `J29mKTkʀg&1R"ZTt2A B~0p?}T'bj'zv6xCKA⿷'x(q#bqg"mLLG^u{<?c "9)uU+p ĸF1_'dad+S:?-#&*{.)Wcg5.'{ E=lٸ`7yȀr,a׭@y|HK0 i 5d. qrpkՊ䔺R+*<ɈwJպuٯ_w &3~uiYևQ &/{Y\&uD)D jSzwhShIl}Pئ@E m JS)Cy$<Z =@8. j?h1[w2ݻټ5q!'9N ϟj^kOTn 8\D<s:@e`HUgv[)l Ek1:ߧS:A[K0AGys 9F[+ hOBiwf9;c1Ȫ]ISf-sj:DCO#aL<_g2=ʡL?Nc e偰 cB_&}63F>n̒#rwMM}gΞGO2 IDAT|^Wa봸ݞn{ްfםx UJr@%RoՓO>g}jk@zHr%5=uOnꨟ[E݃bn)POr8ްoCwҀ$a؜@qFޟ89F\͋-z^P‰h"m̖FA 9*R il 1S*& ,Ax "mL>VY*AbKA)WÖo5Nb,C.Cfꓔr=9rgIu6\jꧼjO]k+6Q댐?G<:b x "2_afK)!faBi+XQ[`x&(1اBp^aPV#ְ㶔qn*< }iñ%;{_w ^<٤I2ݓᑧii=:ڛLCJI Z _Q+}:͈c,biZ`7*1GN%,t' rnP`4pxvպ1++kdB@Zl&(CBŭarѶi;h YאJ 46x"P+RHm>J-v@K+*>BSn ?H"<_6pw~k͆-WN.v)\@(M0,#H"Z=.WH[~q%G2 gI!=}2`0 BT CP8DW(BDd2M_dn '%Klez y?Zq#k Cr]pE_U?-LE\?MM*^r ZG|]2U(BHRSU?*^c/dLEAA?h^ӞֈDh D[x@EH}$yd5R7w\e>J>k+^͉܇px-,T3H OE+ʟ'):eS?bz|xdm;^ؖĻv*Ɛ()kْk4x QF @$B)eY@rYJ5\ըs挌=%m3ѥW99 #V^IzE1Ҩȼk V+^$4-eQosӣß/>m8C?83={ݫgqkl-}\GT 2RY ܔJeL&{KU_`ȕD%Խ:('6=qvFӁ2Js_ஹNFn:fܶBu_lՐ+S &XmzE=wqwC鮰A8P[_TBLJgL>]̛7qp dLo^Gg"]ɲctEHgJyTRfϞ_RmX̗ III+]`Afvv6;;[`̬gV b.Yّwdk9| EQܪl 4ٳ;-rɓ֒aݓHH' ,3X*/d}EUx˧[Z $JcØcǎaÆ >[jj*rWl } <+B7bYJA\SH}o\1FbkZ'Z.Ә]âPbڄ֙qGV }3=4v9a0Ifo%_GMԓM\8to KPLd2tP- w!RvCcM j_B+r  2]L#<<9ksS`$O`◿0V7>01_3pY$gC)wDnȘ"?KFTx$ XD 8knRIǘx{ "7v57NC)՚k׮wS>pXZw[/0bź 6'9>B]My)/7'+.?ɏoMcݗ.쳿䁂HMNh$hF̙3Gs̑\rdFN8$C%ٽk*N>8z{=b]053m_H*TΞDы' 7oѭ.P9tF;\F'h_q]1w-Δ]C;" 'L; ]z.QZI!;;\Y'Br>NݕW rx56g֑[au▛:C;6g{m}4Nw51+( _7x\j'D!T_[ L>v=믿޽;S>  Uv@ե O\[X<5#Od|]ιטSЃd`Á򴽘r a v!w8r7aD HL)5KZJiS<3tkpQ'*V+9 pgY)Q1/j1scr)ԧtș8r(%dPT P"0Ocn5\̰7[HG,+gx|SW&Oe!gn|kXjn .Iy7Ih'Nn*- +g" >FgtH U0VmdŖ.mTorcɍZ=}.\hu!:=-[a>. p\ZƵe3 "0- u5D@ӷgzi07(жm[4W"8d 'Lj0#E#kpN[-S>k$zS 0TH'I.j&ma䎼?ɬ(BfNP#DW(u-n;Rp=?ɔ]ys=9|Ep 'ҢE 9rFRpCzo΋xސP~)UQOΗAOg%s= -J~By'<@6 -{ OеС$} K9&96bN4=(Gj&}X?y<@9CKPȫm C OD<ђ aYrrldJzqS)wRj^ mu e]bͽ`f1i$N bB[e }~V0<R>o)Ȝ8Hl hRKQsQ^n VS4<# < gX uZk |}aI쇿5@}IR߭dXT9L G@qI@s-bƹ { qj,09L } sxHH !N؛ {*=9pJ)l1b]Z7b0AZVOZBZQZ!J{d_E=TBDNiO#gZn07>sڷ8[LS~<9 'qJ l[b6o)#LVJW 1)=sA7 Okq'4]!{>O͹ ,P>5'R߾`@``8Oد >;}CwZ*>Ha[-X]ݐ(-[7{ ~CY-'۠%2@~+`vRURüvqNEDZpIqo i&ci5Nb,5B(q rxZ c}`rX{/@[`WggC<1 _2M?,˰e]%]OL98(I4o,aJN ␤ˡFx;f-썡g\-;moxxAow=:fzHٷo_… ?B°GH `:z KRNgk%BL4& tbQ(?;>ƖZ#")o9\qdCypߚ(%J>I6 NTA;$BZ-U8k5o5tLK4(,iNW)gq˟GOG2,0NR]o-e,`#U]iP=>ˎo⢗ZKW3ؐi@Sm!cms*=@ ޅIjs6x*e`,nCg$$iavFQBr 367Q߾Q]7JSY.? [3JFmŸ=&$W 翘y?}5Jo+ck!g5g{k$}& ^wǖBFO/ă0G{Nѥ=CVݾigܵD73<GpEMVCKV˾i"Zg6*}Q ^P*&_"ݿp]RWX=bp_rYJ4t4Or; r3wߘ' =rW 9#\^w(cb A7INbP+G\Q,X5*f)5QdV=ztw}R[nn.wGjyW˄UxWVSRR̒T*reBb%-)n IDAT2iFqB( h6b0Ģ(44,gT*J\. jڲlٲ exZm6US{[jUHR_X.prrGQ'T*@iii)?>R,pT)]@< III3g+V'O'O+V3g䓒,{K)Zm^(HK#}%FFRȨ/*b47Ο?!yiڐ@nHJ#߁Z|ڴiNwJMjF] 0ό=*\:z*)q o޼yN:Λ7OEm/I[T!)(n((zs HU @ߍazc ZW#_V-_fMz֬YC%t<_w}ii:\h TE^rls>F$RQK-Id GW`~ڴi`L6). rR[dddrGͽ-HW_\>{̙!TfΜKz(RJ7PJ-3(Mb48+&zop5#_f)!mϣ4'"xDˢrF~r8˭VOybQ$@ȄH읈11qv/N72S|CkRwxmr@kn[?T^. ti@\VFS|}zٷO,ޫW/f%եS_I0[^0Pcqi#Hx/9^S@㣑O&tX< sED^ِJf`_$/J9;;[R\z]"Ei('ztTrYJ:aÆN@ f#R&Qnw MG ƅU Ow0*QJT.ІBlFX畖DJJTUi %ͥذ@\ӓ~\C9J_ cߙ+xIIeqLhhVb{ j4BfkR&OxG"H9tV͢^A)ѼCA~KPJu4҇tǐ}@>2!VR# $Wa]zf,i1MY6Ts> 3r2~h}v}ZFSffg<@X7BLW_Z_p\ ;P.‹p]"q_RBYIeݯ.s5}ܫs)pQcPGJj})sgf!pX!FCHcQƳyj8%jb#y'ՐĄ5%hVqtw?zuwuӧ_U~UB`ƺ"3^U8?/ z]Zz>Ȝ-;Zbf~334faD&`;k񕴶o4D~0.9ai?w(6U,*I Bab먤MBu,?C$/_P~jġQ.|@&, _ab~G^O^dC<1}U"]հ@n>.xEwciܡ/td -]m++,'*(UxcflS5"_/`WrR6A.&BUfPj#y'OJT끁镫R1=}ln_l DC^X*GdӨk\,nW$A_("V-[n*MJTԨrkpl7X:c\[ ]IW}u4M< {O ?AIQ( ' ZϦ ;Z>O%.-햇F\i"~@r9r)|4l]{Wuї*d#22k23Dnk]' Du%ٌT:YaXn82L( NH~‚5FE!V,m=4Eި=GDqѨ}XB&!NHtZ_`o~yެ ^rqk9^·f@>Lnv} <&M IPG aBf!oٿ"n]DGB +{t< `t4է5 " COcDQQ W)knTϾ#,_DLA+Kf\bHӡZ @BL- Eh#"@"vDB9G].,:.F/pC ts "z "L&АnihT@4UΑ/ f +{mDal Tp.k 2F,H$f2n(H$e2Vr9=Ab1/n(QᖶQ y֨_,Y3444j Tp"0aԩS;::[%mTWu477gH-bmNгqd29y&NH[[ds=7}k ӌ3HRi8 #Ώ.#Z.G-! XNdoAV~:c%Fka붮&I'H$hhh!"344ϷB Hh{Mˣ.k(i N꟨bީ^/^x#KXQ!/9F@ M XD*:*Q KL$;MD,`z6Oy&& tخY"83uhQ> xɪшnm'D"aHZ U"mgnPVOb\q`- ~Sn "KcX$r2\Pqu.kb>0[Y2Q!/' 8>G`.,wD[q=}y\d%޷!;5H\baϭޅR䯲Ԁ>dK8p3ݶSX[d~J8wD*M^W!o1 7q$z@0Gd˱f+wQ}o=gA]Í rdInSA w-Ȁ/kUJ"հ<"(_XD +m>߄\H.D.Nra`O>%Tp0n^toP$4WYN)sfLdmf+a`V$b-vQLIs#Hs븥Ug1M$ $dV俑 R*ź}jbn+wZ XH;1UmU=b1E_R] =d\lGyM|wh51 DG[3rUiH._T.ہjƞBF3qǸ)w@UjVp6܏zr"/tj"+nC%xȭ%/n-j-G@>{~F!+8Ը%@R3<9N K߿8uw3R)bBڠ򉄧gtoY^?q:ejݳKt`c\ )49r r=gr+u)%yB'Kd(kQ@( [& TbNjH$0 *FgtC)>ہ@ށ >\.e! B^xua9GIVcc`ga1k֬Q.zl"eT_mjS|C' @f̘1 "&#˰Am xXΡ^ LA tq0ȣmo(Q7r dF薶Œ+WzYMi~[.,eQ>TCJv C l͟?_$IŊ>ɤ?eY'埾{^ɮ… ٳgf*2SnΞ=\pՕ^z;web1 Rd;C*,B 4əgĉk* !3yB;ݻihh`۶m9[^ǭ[G&J=, Wzx=s]v@0xBdAJ=  ȶ/_:d26G!Yd'<d)Vd3zB7hs=ƒ%2uɴ (Pظq#ꪫe^]:'t˖-˗wH9(N@`2*CM*^c2&'P{С"Mz9Hyc\N*M 3@y<,c d/D=䀕w]lftld{M;Yn/r&K=웟h@ ;QZRFgBT*Ckk+ӦM&)S0c dRtO?7L! ,N$bwky¶ZXe&UJ)?t o%J̽psOS y"FTdLYR+6tAo$3vX7|fihh`ҤIßz꩜r)455lRL&fGyj߆RhViVr#_P3J߅l2YzŘ1 %Y,q+֢ū&ϫJW.d-$jS}\ne|IRʠ"RoX |n*N6m(Ze%VbHᗑk_F.h2YJyO?fxŶY~>"qR:Q5RV#b8RTAgU/S@+ռa+r;a(Tj |LN"s!sk5 '[BH <ޫdhU2 %9|χ ie]{D, 3bSG{V~RVW&M:/Trd~ï O)R Y,|Hc2WlCmrulvTJ6<`#uh5_e D5Yʋeu" 'eU/-!D LNGXeʏQ.sz~?QFȞPߙȅj?Dv&:6J.%Q%CG|Yk [ %^y`Y ڿŁPqZE)V'X X^(zFW!,+YdXpd L'+!\0ߪaqSޡdBߊlG0pÎ~eY[ EzLTZqaU$0X_pXt\àqGGxH6a!%o~5uL7vq K%bnz'%|A; lË(S ~UuWFfV^bսǧ ]N/!Oh.7c]]3\7?^Ej@ HXRpdlӔ?tm!~-"_C)J6lD.6 <PkJY-Cpz0rdh_f)DtEEs/޽̝;w}ggH?_~̙OT7`+!☆\#>V+Ӏ$cxrie[-6 6dː.6DHKY#qE.p9IDATO!Kh@AglQo͚5bϞ=W7nd͚5~ RϦMGˁ/8LBD.~<;~6`1LDM zIu. lw%?,w sS)dY.|V!{, .`ٲeY酐Nٻw/7n$s+V]w,>ʹ/_|-[Ná{=~ȑ\"P7HARxrLW3\-T =YV!?>ndt-ܐ҈֭[Xx㭭C&L0D"ab10cD"a&ɡo߾!!DoC)Rc &+;WpA2b7k $N-JH-?+uKD oGFzP@4N4W4FQOMLIHF3[3c4 44488844;3 W5U9875;<<===t 3 3 3&3)3 3 3 3 3 3 3 3 3 303=3 3 3= 3>@4N4W4FQOMLIHF3[3c4 44488844;3 W5U9875;<<===t 3 3 3&3)3 3 3 3 3 3 3 3 3 303=3 3 3= 3>@4N4W4FQOMLIHF3[3c4 44488844;3 W5U9:IN;7+T$ 6-+:+;>V<L$<N <9< <  :"9<4dth\P3d;3P98N9K79==s=g=[3O 3C 36 '3*?P (136R!)233M<"+334!)005 ,8DP\htr 3_MIFCA><972jy^SOLIEB?2mw~zxvtqo2}2rljhhf2wtts3\3}_y2}Qh2% }P7, $}["72 )}g'78 -}tG,,3@2}}}3G.?zz3PLv2-v,2t*-+,-./0//2       3333 ttt7 &&& ) ) )                C0C0C0C=== ' $ ( $ 6E   Y* .RK& 6@ Y@$) W@N $N 7&W7WDA@<: FQOMLIHFDA@<=FQOMLIHFDA@<FQOMLIHFDA@V>V>V L$L$L$+N +N +N  C9 C9 C9 "F "F "F "T: T: T: T++++),),),),L)  L)  L)  L)3 "9<3 "9<3 "9<3D8, Ith\PD8, dth\PD8, dth\PD8, d d P#I3PP#3PP#3PP3N8N3N8N3N8N3 GJ+K7 GJ+K7 GJ+K7 G 7  7  7  C  C  C   !Os  !Os  !Os !**[g!**[g!**[g!#,3+g[#,3+g[#,3+g[#,$-33+sO $-33+sO $-33+sO $-3%.33,C %.33,C %.33,C %.3303363,6 '03363,6 '03363,6 '033635}iB-*?P (135}iB-*?P (135}iB-*?P (135}i3>XUa-6R!)233>XUaF6R!)233>XUa-6R!)233>XU33Mk@BM<"+33Mk@IM<"+33Mk@BM<"+33Mk00Cd!)00H!)00Cd!)00d ,8DP\htI ,8DP\htd ,8DP\ht>T빆P 430.*+z1بVSz4_MIFCA><97430.*+z_MIFCA><97430.<86JQ4OLIEB?<8jy^SOLIEB?<86JQ4jy^SOLIEB?<86JljhiE1~zxvtqoljhxmw~zxvtqoljhiE1mw~zxvtqoljhiWHE5i6}WHE}fei`[Zຎrljhhfei`rljhhfei`[Zrljhhfeistzuooowttstzuo`wttstzuoowttstz݂]Ʀ\\sI0h}_ysJv}_ysI0}_yĸz =}Qd~z 9}Qhz }QhzNz!B }PNz?% }PNz!% }PNz"Yz&r &}[""Yzo, $}[""Yz&, $}[""Yz'ez$- *}g''ez$2 )}g''ez$-2 )}g''ez,Gqz(3P /}tG,,Gqz(T8 -}tG,,Gqz(38 -}tG,,Gqz}}z+9l5}}}z+q@2}}}z+9@2}}}z@2A6SzzT6G.?zz@2AG.?zztNO71ߌPLvtNOPLv)u:ef-v,)u:-v,//./r1ӠuLKv2t*-+,-./0//./rt*-+,-./0//.N궂M      @ 33$ ttU &&&) ) )             0C0C0C===   $ $ $ $Y@ Y@ Y@ Y$N $N $N $7W7W7W7FQOMLIHFDA@<FQOMLIHFDA@<FQOMLIHFDA@<[J[J[JcTcTcT ] ] ]```  W  W  W UU UU UU U     @ 33$ ttU &&&) ) )             0C0C0C===   $ $ $ $Y@ Y@ Y@ Y$N $N $N $7W7W7W7FQOMLIHFDA@<FQOMLIHFDA@<FQOMLIHFDA@<[J[J[JcTcTcT ] ] ]```  W  W  W UU UU UU U     @ 33$ ttU &&&) ) )             0C0C0C===   $ $ $ $Y@ Y@ Y@ Y$N $N $N $7W7W7W7FQOMLIHFDA@<FQOMLIHFDA@<FQOMLIHFDA@<[J[J[JcTcTcT ] ] ]```  W  W  W UU UU UU U :IN; :IN; "+T$  +T$  -+-+++'>V>V!L$L$+N +N +C9 C9 CF "F "F: T: T:++&),)," L)  L)#"9<3 "9<3dth\PD8, dth\PD8, dth\PD8, d d d #3PP#3PP#3PP#N8N3N8N3N8N3NJ+K7 GJ+K7 GJ+K7 GJ+ 7  7  7  7C  C  C  C !Os  !Os  !Os  !O**[g!**[g!**[g!**[3+g[#,3+g[#,3+g[#,3+g3+sO $-33+sO $-33+sO $-33+s3,C %.33,C %.33,C %.33,3,6 '03363,6 '03363,6 '03363,B-*?P (135}iB-*?P (135}iB-*?P (135}iB-a-6R!)233>XUa-6R!)233>XUa-6R!)233>XUa-@BM<"+33Mk@BM<"+33Mk@BM<"+33Mk@BCd!)00Cd!)00Cd!)00Cdd ,8DP\htd ,8DP\htd ,8DP\htd?*+z_MIFCA><97430.*+z_MIFCA><97430.*+z_MIFCA><97430.*+zQ4jy^SOLIEB?<86JQ4jy^SOLIEB?<86JQ4jy^SOLIEB?<86JQ4E1mw~zxvtqoljhiE1mw~zxvtqoljhiE1mw~zxvtqoljhiE1WHE}WHE}WHE}WHE`[Zrljhhfei`[Zrljhhfei`[Zrljhhfei`[Zuoowttstzuoowttstzuoowttstzuoo\\\sI0}_ysI0}_ysI0}_ysI0 }Qhz }Qhz }Qhz !% }PNz!% }PNz!% }PNz!&, $}[""Yz&, $}[""Yz&, $}[""Yz&$-2 )}g''ez$-2 )}g''ez$-2 )}g''ez$-(38 -}tG,,Gqz(38 -}tG,,Gqz(38 -}tG,,Gqz(3+9@2}}}z+9@2}}}z+9@2}}}z+9@2AG.?zz@2AG.?zz@2AG.?zz@2AtNOPLvtNOPLvtNOPLvtNO)u:-v,)u:-v,)u:-v,)u:/rt*-+,-./0//./rt*-+,-./0//./rt*-+,-./0//./r 888888g7g&7j&P7{U 888888g7g&7j&P7{U 888888g7g&7j&P7{U xqjc\UN7qjc\UNG7jc\UNG@7c\UNG@97\UNG@927UNG@92+7NG@92+(7G@92+(.7@92+'.-792+$%-. 3%"!"V#gwV#g!NV#"NyV"P|^!^ ^  3%"!"V#gwV#g!NV#"NyV"P|^!^ ^  3%"!"V#gwV#g!NV#"NyV"P|^!^ ^  G@92+$ } } @92+$}ۋh`XPH0+0)!7}92+$ h`XPH0! 22+$ h`XPH/ +(& `XPH.(.. XPH.$,-.. PH-$,3=-/01!H+%,1=FO$ ./2:B."* %+2:COX`+.02:CK3"&# %,2:CLXbi.877:;<=E877:;<=E877:;<=E82+$.7*#7#7 7 7 7 7  e!"$ 23;he!"$ 23;he!"$ 23;h02;CK3"&*0&,2;CLYbi.3;CL3"&*/(  &,3;CMYbj-"DL3"&*.3 -5>EMYcj,.4"&*.37?HPZcj,"&*.37;PZcj+"&*.37;?6"aj+B"&*.37;?C}2 (*B}"&*.37;?CG } }  dd22wall_recolorer?     uv~~~vvwzz{{{({8{H|8|L|`|p||||||||}}} }0}@}P}`}p}}}}}}}}~~~ ~0~@~P~`~p~~~+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 dd22sprites     @@@pbJ.y5AuEdPT^h|s:ar+4KOk ;lԆgu7J v+29j>>@p 9*^^)   |߮| WZ  kk W \   = k k-e  P | |** ,R^_ D]^] @*) 1 | |  d k kW W   >WW  kk   |߮| *^^**>@@z@@z@@==,xy" >` jnh ϠB > NLjmDE "@ iZxva[ @, x4 DE> =I @ PB a[,'x w@ .5DEg _^j @ !%^ ALjj* @= xxO >>J@tC@tC@t6 Sy,xy" KE*$}B3% jnK*3fKH 9*^^)   |߮| WZ  kk W \   = k k-e  P | |** ,R^_ D]^] @*) 1 | |  d k kW W   >WW  kk   |߮| *^^**>@@z@@z@@==,xy" >` jnh ϠB > NLjmDE "@ iZxva[ @, x4 DE> =I @ PB a[,'x w@ .5DEg _^j @ !%^ ALjj* @= xxO >>J@tC@tC@t6 Sy,xy".22a",tS jn22a 022H  9*^^)   |߮| WZ  kk W \   = k k-e  P | |** ,R^_ D]^] @*) 1 | |  d k kW W   >WW  kk   |߮| *^^**>@@z@@z@@==,xy" >` jnh ϠB > NLjmDE "@ iZxva[ @, x4 DE> =I @ PB a[,'x w@ .5DEg _^j @ !%^ ALjj* @= xxO >>J@tC@tC@t6 Sy,xy".22.",," jn2 2 0220MR3.-))>ă> y{) )yy w <<y. , .  MI> >M~  MM> >M  . . .yy <<yyy) *y..)) >ă> M︂M"9NddO9#3 HhnnX Cbkk7Gkk7Gkk2 ``E /) Rnnk66fTP P\b :mOPWW`TW:y5maHLhnn4 QP Pa%fRPPRkYyknniRHgld^NcTP P%NQPPR.Ynng6 Kd?- ,iPPh9lP Pa:"nng1-gd?(3-PPkMRP PRh M9nnk=$^nl^4 I7TPPWXP PNOnn]#@amnnmaQhOkPP+E`P PR dnmjjmnkYYknneiPPh_VP PW`dnhOOhnnlb^knnd-PPk,P PSPOnY!-_nnd9"KknnNTPPWUP P7O#?knnd/5enn9kPP+*jP PZ annl^* an"iPPhhP PRnMBmmbQhnnd.2Y-PPkMP P[6Lgnb- Rnni6 BLSP P:Z`PPW.7nd/ +bnngN2CfP PX[OPPi\y=<Rmnnk5 TORP Peb Ej\PUaZ8!y ;knnYYkK5kkK5kkK"9 ++ ;E'굀>  B&YYW-) )w=TK55KXXY+ KH{9,BI4     %^5ZO Z~pt~Z OLƠ'L Z 4mu~}~Ȣ resȣ<4\^] g9-ȊiXQZm@\GninkV@NC, ǜ f][ =N Ȑ n|A2nr`\^#c+{x @)i^Ut|^_z]9I+ס2g /M}\`wxȠ\J/4zqN~^\} {_ M,hVȥ&n_`|A@a;o.c+ȕ kzA<~@ 1Sv{^;Ad&r:7͐X_Ȓ ݓxȲc L2d 8ȇAq Wbmruz||vn a@k Ȥ< O ODȭK Z   ewcO   O,=3<  ;9)MN&     /qO Z~pt~Z O<Ȣ z< Z 4mu~}~Ȣ ȣnu4|ȤK4\^e0;<iXQZm@}Hninkd@Wg9c ]e k2짡. qȐ n|A9r`\f&- (<i^g|^_zd>d"9"gw3}\` Ƞb U Uť=~^\eXL0{Ȫ,n_oAAh A9sȾ kzABA 9dk@Al(G6Bu -e ݓȲ n YԠ7 jgȓA ~ m@rOX2LtLD"O O=eӅ]> Z   -PRdO   O,D@1  <8<3=,     cweO Z~pt~Z OKȔ“D Z 4mu~}~Ȣ 9,BI4     %^5ZO Z~pt~Z OLƠ'L Z 4mu~}~Ȣ resȣ<4\^] g9-ȊiXQZm@\GninkV@NC, ǜ f][ =N Ȑ n|A2nr`\^#c+{x @)i^Ut|^_z]9I+ס2g /M}\`wxȠ\J/4zqN~^\} {_ M,hVȥ&n_`|A@a;o.c+ȕ kzA<~@ 1Sv{^;Ad&r:7͐X_Ȓ ݓxȲc L2d 8ȇAq Wbmruz||vn a@k Ȥ< O ODȭK Z   ewcO   O,=3<  ;9)MN&     /qO Z~pt~Z O<Ȣ z< Z 4mu~}~Ȣ ȣnu4|ȤK4\^e0;<iXQZm@}Hninkd@Wg9c ]e k2짡. qȐ n|A9r`\f&- (<i^g|^_zd>d"9"gw3}\` Ƞb U Uť=~^\eXL0{Ȫ,n_oAAh A9sȾ kzABA 9dk@Al(G6Bu -e ݓȲ n YԠ7 jgȓA ~ m@rOX2LtLD"O O=eӅ]> Z   -PRdO   O,D@1  <8<3=,     cweO Z~pt~Z OKȔ“D Z 4mu~}~Ȣ 9,BI4     %^5ZO Z~pt~Z OLƠ'L Z" 4mu~}~Ȣ "resȣ<G4\^I] g9-ȊiXQZmCDGninkECNC, ǜ ]=N Ȑ n|Fvr`\tc+{x @)i^ |^_zI+ס2g /M}\`Ƞ/4zqN~^\,hVȥ&n_!F !Go.c+ȕ kzGzCuyDur:7͐X_Ȓ ݓȲEIL2d 8ȇDH"HJ"JCk Ȥ<HO OIDȭK Z"   "ewcO   O,=3<  ;9)MN&     /qO Z~pt~Z O<Ȣ z< Z! 4mu~}~Ȣ !ȣnu4|ȤK84\^@e0;<iXQZmB,Hnink0CWg9c ]k2짡. qȐ n|Dgr`\k- (<i^|^_zd"9"gw3}\`Ƞ Uť=~^\L0{Ȫ,n_DDᳫ9sȾ kzEmCejClG6Bu -e ݓȲ.0YԠ7 jgȓC.!59!5CrOX2LtLD<O OB=eӅ]> Z!   "-PRdO   O,D@1  <8<3=,     cweO Z~pt~Z OKȔ“D Z 4mu~}~Ȣ M︂M3..V Ԗy =V V= y  .  j%!p M}3, ˕A8 æPC ķ_N ȺYI ɩJ= ј;1 R,& njqn - $2@P^YI;, {  w = =.,V = =M~I4MR3.-V Ԗ{ =V V=w  ,  L_ IL](uY ~Vs7f fG!y wW' yR$ hC V3l MOl$PXfwxhYQw` XIYp~gRb .  .>O`[K:+ y  y = =..V = =M︂M4I~︂M3,.V Ԗy =V V=y      Z  O OȮiXQZm RVZYYZ]`^[  Ȳ Ac|n @ "6HL9# @|^iAA`\\^4mZz}_n4|^_zA}zk H`\ ]rnink\^Z ȝȢZʼZ         Z  O OȮiXQZm dedbadhjlm  Ȳ Ac|n A &>UXB( A|^iAA`\\^4mZz}_n4|^_zA}zk H`\ ]rnink\^Z ȝȢZʼZ       Z        Z  O OȮiXQZm RVZYYZ]`^[  Ȳ Ac|n @ "6HL9# @|^iAA`\\^4mZz}_n4|^_zA}zk H`\ ]rnink\^Z ȝȢZʼZ         Z  O OȮiXQZm dedbadhjlm  Ȳ Ac|n A &>UXB( A|^iAA`\\^4mZz}_n4|^_zA}zk H`\ ]rnink\^Z ȝȢZʼZ       Z        Z  O OȮiXQZm"JI" ȲFJFc|n CttC |^iF !G`\\^4mZz}!_n4|^_zG}zk H`\ ]rnink\^Z ȝȢZʼZ         Z  O OȮiXQZm">?" Ȳ38Dc|n CjjC|^iDE`\\^4mZz}_n4|^_zE}zk H`\ ]rnink\^Z ȝȢZʼZ       Z    'V= =' ' ( ,7CNI=2&(pp(Ƶǽ(((''V V&VԖ'V= =' ' ($*(" (\rt^(]jyod(((''V V&VԖDV= = ' ++* * *********** * **++++* * *********** * **+#hF# #Fh)hDלC g*Q'%R)XDAY"++* * *********** * **++++* * *********** * **+#hF# #Fh)hDלC g*Q'%R)XDAY"++* * *********** * **++++* * *********** * **+#hF# #Fh)hDלC g*Q'%R)XDAY"L泀L+))+rr*r r*) )**LL*******LL**) )*r r*rr*))+L泀L++KK+ * *KK***********KK* * *KK+)C ߎ )+ * "    I6/ J 33 :33:33: 33 ! /66/  00 :00:00   00 6I6/ J$$:$$:$$:$$! /66/  "":"":""   "" 6R= I6/ J:::! /66/  ::    64'mZ1̚1  22  l&2w77      22 H  11~._ v* 77    W Tq 77u`  _ "* 11R" _ 22T   lK T77 22C~71̚1$++4 mm 1;||;  BB n U'mZ+BB+Pm|ee|mb " l&2wtb  ee Mq eeUJ S  m|ee|mxB}7+BB+.   E BB ";||; # mm %++ ;;D ,,``    _*  *_   ``,, :w 0=f_`**    **__``,, J@H KEK5<jmK lK  K$KKH x K} K%  K K3&  K KBNqz  K KBM/  K K3)xw K} K% K$KH jK lK KEK5<jjK&0fKH  xxKE&$}B3%    5~  ?| Iz  Rſx ]ſu fſs  mſo O uſl ii     }  q  M   ;# -%1 $   '  )  -~ + GLkZ~ . w 0 EĥÉ :7  29  kLnn +< ՚ $>  A  D  G 7I 9 D ;v*     Д E1-k  L~  .22#22x <jm222I 2K022Kx2K22KS 2K"22Kt& 2K,22KNqz 2K2KBM/ 2K2K3)xw2K}2K%2K$22KH jK lK KEK5<jjK&0fKH  xxKE&$}B3%    5~  ?|  Iz+^ Rſx28Ju; ]ſu P= fſs8u mſoM uſliil: /JVk`v L n*eeV      }  q  M   ;# -% $ ]' ;J k/) Xw/+vkδ.OMM0 Eĥ:7 /29 v܀k+< <$> A D  G 7I 9 D ;'t:8eW-2 u@ >    .2 2.#22#<jm22 22202220x22222 22"222"& 22,222,Nqz  2,2 2M/  2"2 2)xw 22 2} 2022$j222n.22#22<jj22 022m; xx.22",߮}$   D  L   U }  ` -  k    v 4       *  %             o   ; 9 - < , @ T+ E 7C* I Pl) Om( V H'[ &x &H I+= K-3O/*R 1"U 3X 5\ 7` 9Y ;  XXTB:SWPL? -IO/XXS+ >R/YXXV1LXWL AYXXK3NXXS* RYXUUXXVHHVXXKSYT@@TXXWOBYH$LXXP!"?8.A3VXX(QXX.NXX>NX>>M6XXOA<(H @TYO$ ! >T+5  .0\R&#0)XXS?( ֳJNy53C&0XXV+) )y1N DYH))>굀> !('./0 -+^  (@  &  $  "0        6  7  9   <   >  @  C  EHJ M 8:=l ?%  B  D   G  { I  x LE  t  r  p   k   h  e  a  ^ 6\ 8Y V;            ȵ kȬ>4\^Ȳ8 d2ȱLiXQZm?Hnink?_X7:rd ] Ȗ+״c.oȩ n|Br`\ Vh,ĺ1i^|^_z 4/ȴ@}\`Ƞ g2+I]D~^\ @ x{+cR,n_BB ȴ ŝN= kzB?  ?ȴ ,CNP ݓ Ȳ ȳ-9g ]e-??seȚr=O OL'L Z   Z5^%O   O4IB,  p    :: @  º ::  մtV6'W} ::) ]ԘsM)\!D ::# c@oc  ::5 X  ֻu(Ce::'  ?־M\G]|'::!ԬY!Ki}::(  Ը0zC::7 T  lY>)S|>ĸ::( G NL="LeŹ::05,.=bITƹ䷼:: ] iXgvyAA@fBŹ宴:: w ! B28ƻ夫::  [n*.159=U!:: h6 miihjiji@ ɾ :: i ̾ :: ::7::?   & º (mk }W'6Vtտ   D!\)Ms] a 8  co@cװ\ eC(u ְ  ] '|]G\M? հR }iK!YԱ NuCz0 Ը \ b >|S)>Yl  = 6 eL"=LN TIb=.,5 mCf@AAyvgXi  f 82B !  !U=951.*n[  ({ @ijijhiim ɾ e  ̾  ggggb0 0bggd dgg  g  g     ȵ kȬ>4\^Ȳ8 d2ȱLiXQZm?Hnink?_X7:rd ] Ȗ+״c.oȩ n|Br`\ Vh,ĺ1i^|^_z 4/ȴ@}\`Ƞ g2+I]D~^\ @ x{+cR,n_BB ȴ ŝN= kzB?  ?ȴ ,CNP ݓ Ȳ ȳ-9g ]e-??seȚr=O OL'L Z   Z5^%O   O4IB,  p 񙵸xt! º ;p`Qj ˿º ﴭygWLN^Ȼ_  3J&.6>GMn¶  M\i ) Т A\lz1@e Bϻ> l3`rX!"q Ὺ1Xpw')*+G 诞} m}?018y  z ĸIw^78Tu}#Źho<=bdW JĩÞ9ƹ䷼&pGA[a  Ѩ Ź宴KUIG0Ϲ ƻ夫VLA |ШQ "G ٢  ɾ  ̾ & 7@ ns  º (mkQ`o­   TfvüG _ԥ^ a 8HJE<4,S;# Ӥװ\  sfVE ְ  G/zk >թB հRzt!"![sE몿 Ա N6*+*)k }ٟ Ը \i~<21>~* zҾª  = uqY88]Z»𽦞 I`b==rv 9ħçĵJ  [YAFw0 ѿ  &EKTT  4\^Ȳ8 d2ȱLiXQZm?Hnink?_X7:rd ] Ȗ+״c.oȩ n|Br`\ Vh,ĺ1i^|^_z 4/ȴ@}\`Ƞ g2+I]D~^\ @ x{+cR,n_BB ȴ ŝN= kzB?  ?ȴ ,CNP ݓ Ȳ ȳ-9g ]e-??seȚr=O OL'L Z   Z5^%O   O4IB,  px x񌤨xmi4,xǻtfXI` մtV6'W}1C   $x}n_NEG]ԘsM)\!D#KHJMU_l~k5 x0D#*18AF~dc@oc !N`n}݋,. x JXb ~% ֻu(CeTm|{"#& x9Wfr.<\ ?־M\G]|'\{o! xu^/WhP hԬY!Ki}gb x+Pfl%'()@ Ը0zCsY  xcq;./5}p lY>)S|>S  xClV45Not NL="LeR  x_e:;\_O5,.=bITS  x"fC?UZ  iXgvyAA@fBU" " xCPFC, ! B28I+% & xOF< [n*.159=U!50)#!6 xB miihjiji@$/ H7x%5x& x7x@ dht 4,(mkIWes}W'6Vtտ 1C   $ L[l{AD!\)Ms]#C63/-++*,/25  a 8~AC?70(L8"  co@c!" (,M \   kaRAeC(u  "   }B+sf'|]G\M?  q Rpk Tyi?}iK!Y λa  N1|()('twbCz0   ͸T  \`w~8//:r'>|S)>Yl  ̷I  = mkS65VxReL"=LN̷}A C\\;;il TIb=.,5"#θ|k< US?Bl,Cf@AAyvgXi '$0ѻ|k]9  #AGNL82B ! .;ӿn]O:  8FP !U=951.*n[ 7~iYKA:9;>  @$ @ijijhiim$/ H7 %5/ ggggb0 0bggd dgg  g  g     . }}  M  mm 44   44 mm44mm M    }} . } } y  y = =..V = =M︂M3 *( (U\( (0 $?C  M./ |/.=>  C?Di  \U( (L1( (F/ 1( (Ctu o\U( (( L  '  C?y = o  /.Dq./U3L7 ?C S `   U\( ( +\( ( Ip99k k99 9999 ## 99  99   ľ O O ȮiXQZm Ȳ Bc|n ?  ? |^iBB `\ \^4mZz} _n4|^_z B}zk H`\ ] rnink \^ Z ȝȢ ZʼZ      ' :' :76::' )::' #::' 995::' :&::' :::' :7 (::' 97 6::' :73::' ::3::' ::::' :' :' :' :' :' :' :' 3  %  J E 4   2" w Bܱ " &h#; ]  P `Y%!!% V  >>  ;j4 uS"RR"8dp_ 4 lOG?bb?GZ  lrrl *ݧ0 q\ EE n mwwm 'e    3 gg   gg  g   g   g   g        O O ȮiXQZm Ȳ Bc|n ?  ? |^iBB `\ \^4mZz} _n4|^_z B}zk H`\ ] rnink \^ Z ȝȢ ZʼZ      '' ' (*' ' '@'l' +' X6#' ' ' '' '' '''' 3  %  J E 4   2" w Bܱ " &h#; ]  P `Y%!!% V  >>  ;j4 uS"RR"8dp_ 4 lOG?bb?GZ  lrrl *ݧ0 q\ EE n mwwm 'e    3 gg   gg  g   g   g   g        O O ȮiXQZm Ȳ Bc|n ?  ? |^iBB `\ \^4mZz} _n4|^_z B}zk H`\ ] rnink \^ Z ȝȢ ZʼZ      x ' ' #%' ' tv ' 8' ^u' oo&' M0' ' ' ' ' ' ' ' ' ' ' 3  %  J E 4   2" w Bܱ " &h#; ]  P `Y%!!% V  >>  ;j4 uS"RR"8dp_ 4 lOG?bb?GZ  lrrl *ݧ0 q\ EE n mwwm 'e    3 gg   gg  g   g   g   g         (}}(  m44m(((''V V&VԖD''JbfDnoڝoZ]m][Dfb JJZ:!n]ۛos{DfbJC ''  @ '   ^           <      AjA  dW  iQ      99 99<<& 9<<% 9<<$ 9<<# 9<<" ľ<< < <z. -w)+ -)qMMo)GH)"#)  )  )"#)FH)pMMo), -)x- +x)YB@Z)R%%R(g B֚B f#jE$ $Ej+ + +++*++ + + ++*+**+ 2*,\Z,#! z u & ! P J z. -w)+ -)qMMo)GH)"#)  )  )"#)FH)pMMo), -)x- +x)YB@Z)R%%R(g B֚B f#jE$ $Ej+ + +++*++ + + ++*+**+ 2*,\Z,#! z u & ! P J z. -w)+ -)qMMo)GH)"#)  )  )"#)FH)pMMo), -)x- +x)YB@Z)R%%R(g B֚B f#jE$ $Ej+ + +++*++ + + ++*+**+ 2*,\Z,#! z u & ! P J ~***********{* * ()C ݌ +VئV+TS+ * *TP**WU*******VT**RN* * *PM+UפU+::+* **::***+***::** **::*6ii6:ʽ:+ă+* *: :**"@         @         @         B33#=$1 1f (       N;;     X  X  XXX   X     )  , -  &    ) 9 = -         $    (                                     )9 = -                !  ! B L gLW cWBgc/H H/cgBa Z_Z a霮a _k@@k_ h hR"RZL!Rk"h/W"(58@H;,K  Kmf  fm>P\P>[8g[r[g8[܅!a1[ٍ1a\r!?dad?!r\   C` L 1m`C LdBC>KdL B8 B (d?gf5`P7 d[:=XT(  ( Y, (% ¨% # H q H  q AP q A  A T,P{V{P,T>XqqXA KA AY V>QH(>V Y qq{qKi qKiiQQ##%#    (8TX:,s% ,Y %s  Ƨ t Op O PA  I 9?~~?9 oVo   <   1    X Xl            D 1      i               h/Wk"RZL!  a _  c g B     d[`Pd?gf8 BC>K L 1m a [ ! r  \    *  %i qq{QH(KA > V  AP q ¨ Y,  XTFO ~e?%|2sN P P  P  L  k   1    ++- }~ dmy K񁄨桃nwnn ujp~z| ՚ }ktox||xrxm#-񁀁k|snp~  >k{j͙ m-kyؿoꨤ񁀀y{yxq  C(W      LެL  7gd8  XzX  A A (q* LALA I99L X-7X  7991 gvQAAAA A dqsXAAAA A794*oyX82l?   W83mAi -ynxLALA Uojt= A A -NN(   LެL     z    26"{! #̨~ "Z~ $0(a;P< 1 0PC0P~P0LwLk #E !С  E%? !~L 0}  #~WG0M00       LެL  7gd8  XzX  A A (q* LALA I/ /L X+ -==- 4X   B[ӿFB 7/-F`FF-/1 g =F^FF= vQAAAA A d =FUFF= qsXAAAA A7/-FHtsFF-** BOFB oyX5 /ie- .l?   W. )mAi -ynxLALA Uojt= A A -NN(   LެL     z    0<:; 1 0PC0P~P0LwLk0E #С ! !E%? #~L 0} 0~WG0M00       LެL  7gd8  XzX  A A (q* LALA I, ,L X*  3X     7,,1 g  vQAAAA A d   qsXAAAA A7,'*  oyX4  .l?   W+ &mAi -ynxLALA Uojt= A A -NN(   LެL     z                        7;                          C(Vrr] ] lm77]],,7 711 rr, ,  &m l&    m l& & , , rr11,,7 7 lm77]]rr] ] z   V V   gM M g  s  s g   g    v vbC Cbgg6g6g   gb b MV   s   g  g    g  v dggC 0  C 0v dg   g  g  g s   MV b b   gg6gg6g6g6<       g  g  g   g           g   g=g=g=gg7gg7ggg6ggg6gg        g g g  gV V   g M M g  s  s g  g    v vbC Cbgg6g6g   gb b MV   s   g  g  g  v dggC 0   C 0  v dg  g  g  g s   MV b b   gg6gg6g6g6<       g  g  g   g           g   g=g=g=gg7gg7ggg6ggg6gg        g g g  g V V    g  M M g s  s g  g    v vbC Cbgg6g6g   gb b MV   s   g  g  gv dgg  C 0    C 0v dg  g  g  g s   MV b b   gg6gg6g6g6<       g  g  g   g           g   g=g=g=gg7gg7ggg6ggg6gg        g g g  g9999 99   99  ľ ''  { {9969+9  9 '#99   99 99{ kľ{ k 99  9999'#99ľ    999969696ľ<K K  h g cc 9 II 9 op(( 9 KK 9 && ľ&&  DD  cc d d 9 H H 9=9=9=997997999699969('9 FDľ `]  he  KH  9 9 9   9      gg   g  g       ޽  ܸ  ٳggg ׯggg  gggg  ggggt  tgt  tgt  tt  tt t t t    g(g=g=g(   t t t t t  tgt  tgt  t ggggt  t gggg  ggg  ggg(  ( (  ( (  (( ( ( ( g   g(g(g('((   g( ( g( ( g(  (g(  (gg(  ( gg  ggg   ggg    ¾g  g g)g)())'ӿ      gg   g  g       ޽  ܸ  ٳggg ׯggg  gggg  ggggt  tgt  tgt  tt  tt t t t    g(g=g=g(   t t t t t  tgt  tgt  t ggggt  t gggg  ggg  ggg(  ( (  ( (  (( ( ( ( g   g(g(g('((   g( ( g( ( g(  (g(  (gg(  ( gg  ggg   ggg    ¾g  g g)g)())'ӿ      gg   g  g       ޽  ܸ  ٳggg ׯggg  gggg  ggggt  tgt  tgt  tt  tt t t t    g(g=g=g(   t t t t t  tgt  tgt  t ggggt  t gggg  ggg  ggg(  ( (  ( (  (( ( ( ( g   g(g(g('((   g( ( g( ( g(  (g(  (gg(  ( gg  ggg   ggg    ¾g  g g)g)())'ӿ < < Ĺ<< 9<< 9< < 9< < 9<< ľ<<" <<# <<$ <<%999<<&999 9999^^ 9999 9 9 ľ    9^^9=9=9^^ľ    9 9  9999  9999^^ 999999  ľ          9  9  9' 9' ľ& '     9   9  9   9 99 99999ľ 999<< P <<P < < 9< <  9<<  9  9( ľ' ( ( '    ԼϷϑ{HB ӼdӼ_Ӽ˷޽ ˣ ޽˷޽˴ܸܸܸٳ \Z ٳٳׯ>kk>ׯׯӀ?    GG  ((GG    ((     ?< )Ϯ'ä"'u |&ŗ ׯ%ʻda$®$ƸrhǹS#ʽd˾f"VrµGöexB ĸyJ#   ԼϷϑ{HB ӼdӼ_Ӽ˷޽ ˣ ޽˷޽˴ܸܸܸٳ \Z ٳٳׯ>kk>ׯׯӀ?    GG  ((GG    ((     ?< )Ϯ'ä"'u |&ŗ ׯ%ʻda$®$ƸrhǹSʽd˾f Vr µGöe  xB ĸyJ    ԼϷϑ{HB ӼdӼ_Ӽ˷޽ ˣ ޽˷޽˴ܸܸܸٳ \Z ٳٳׯ>kk>ׯׯӀ?    GG  ((GG    ((     ?< )Ϯ'ä"'u |&ŗ ׯ%ʻda$®$ƸrhǹSʽd˾f Vr µGöe  xB ĸyJ 66*ii*ii*66***: :* **ă+:ʽ:*6ii6  s9zz9sֱq33q3y;;y3q::::q:ysz::zsy:9;;99;;9sy:z::z:ys:q::q:y3;;3y3qq39sֱzzs9 $e P>ă> gg 4P ii y<<HH t HH !!  Po> > 0 P iHHi65؄gH8UU*Hgee1<:eeturgH2UU5Hg4   Ϲ߼ӼӼӼݷ޽˷޽˷޽˷ڲܸܸܸخٳٳٳթׯׯׯ  SSSS  e iihhi i  SSSS  `=p   Ϲ߼ӼӼӼݷ޽˷޽˷޽˷ڲܸܸܸخٳٳٳթׯׯׯ  SSSS  e iihhi i  SSSS  3 ' ' :    Ϲ߼ӼӼӼݷ޽˷޽˷޽˷ڲܸܸܸخٳٳٳթׯׯׯ  SSSS  e iihhi i  SSSS  3 ' ' : ;jjjjv;;::瀀::;;vv;;vv::::瀀;;vjjjj` ;49y t!!y0yrvP  Pj]!W44ttY^b" Vh`tv 4C  |߮|  kk %    iצ k k051Gf0 *$@O2*| |k6 &A X L? `5P?| |N  4 k k6VM       kk   |߮|  |߮|  kk  8    ̽n k k3   | |8`e  zm  m  Ҕ  ~| |ά Ѵk k CЃ    v  kk /xS(  |߮| KW   |߮|  kk    q'*7m k k`@r5Mp  YsV1| |I:7 q|#  n  6?{ ϻ    X  X  XXX  X   $ "  ) 6  9 a  |߮|  kk     sh k k/ 5-/  | |         | |   k k       kk   |߮|  |߮|  kk      k k#  AlO( | |o4.  #P|_  :A;'4   #)  ,| |-#  c* k k) ,   %  kk   |߮|    |߮|  kk     k k    | |      "  4                         )  69a  |߮|  kk     b k k10*>Z1 +7s¥F,+| |_0x z"9 O A; R/E;| |D  0 k k4OD       kk   |߮|  |߮|  kk   3    ^ k k+{  ؾ | |6RVZ  z[  k l  ֖[| |ŗ  ŝk k B蹛h     p|  kk +qg>  |߮|  cU  Y V>>>V YA  AXpGopX9T,PG22GP,T eeI|2s|F e?%F|tt~tI FO  I+8_ii"HllH"  __ i i!! _ _" "H H llZ[  Ҙ ll H H[\ " " _ _ i i!!  __ ii"HllH".lss%OvvO%  hh s s$$ h h% %O O :vvuX =  vv #O O33 % % h h ,s s$$  hh ss%OvvO%.l}}(UU(  qq } }'' q q( (U U1l>F (* Tw WH/i%׬%5;  ,{^  Ш L `+{&`м4 kF  x 8)y O  x     bO }S~ک ܴD  TuD  KWX \` ӻH (&X{ ь ]2  *X Xn   =  !%# "d=' JoT)  /oo8' d^ (*"+,$ !$',, %$&,,( '   cq@rrV/rr; >X#nhD^       !##!    X $'()(dq/&*&?Or_!!&+ crrT"', 'WG%)  #&  #)) k  =C7#b04NJ   iҦG  IJ}AÿR!^G0 P5  x 3#ɬk wH m   x ZʹB nǾAiþ5{|D^6   V  PA p Ƨ ,Y  TX*cn`P  t7}r0A^a#EP + y i[M " - = j(O9 Cva Y MG$ 1 f5BL<:8::8:<h       T              <:8::8:<h       T              <:8::8:<h       T              <979Z[Ҙ[\:79;h1 $uXl>F K>)[ Xr(* N,T$33 433 p;(K  1S+ i ] 33 i31H ꡓP jh ~  Ȫ w c2+i E,  )     g=g=ggg6gggw88                    888w777            77777777                           g=g=ggg6gggw88                    888w777            77777777                           g=g=ggg6gggw88                    888w777            77777777                       JH ľ  ge  ^]  ED('9=9=99969996777KKh gc c II (( && DD c c d dHH77777//7//7/^7/^#@@('^/&oED^/oj%H ^]//#%H  ge//@H  JH^@  ^@ //|\JH //$|\JDge ^$XJ ^^ ^L ED//D ((//7^^7^^7//7//7//7//7^^7^^@#KK//o&h g//H%jo c c ^H%# II ^@ (( //@//@^\|$ && ^DJ\|$ DD //JX$ c c //Ld d^/DHH^/ g(ѽ¸g(Ѿg  Żg   ȿ ¹w 4qdVEBgggg  ggg  ^ !                     a      锑֓ߔ똏    榏             ԓ     g(ѽ¸g(Ѿg  Żg   ȿ ¹w 4qdVEBgggg  ggg  ^ !                     a      钏Ցޒ响떍    楍             ӑ     g(ѽ¸g(Ѿg  Żg   ȿ ¹w 4qdVEBgggg  ggg  ^ !                     a      鑎Ԑޑ和때    椌             Ӑ     9( 9  9<<  9< <  ľ< < <<P999<< P999 3 Z Z   ZZtt TS T6 7S { uԱt 78     78 ur { S8 :R RQ ZZts   Z Z 3///^>>//////^8^^^^^^//2^^^^^^//,//////^&//////^!^//^//////////////^//^^^^^^^^^^^^//^//////////////^//^ ////^^//////^^//^^/^$^^/^0////////>////////MM////////////////> ^^/^8 ^^/^2//^// ,//^// &//^ !//////^ ^/////// ^^^^^^//͙//^^^^^^//////^>^///////8^//2///^ ,///^ &|q?bø}q2#}tl=th $}ung:gƼ~un+${tnhb5 |nOC%qlgb[! _kZB#&?=:5"IRQA5( +86 5 5   5 68{"  "" 폜" "锔֓ߔ 敏"똏폘 " "  2"*ؕ)ᖏ(虏'훏&웏%昏$#鑏* 풏ؕ)ᖏ(虏'훏&뚏%|q?bø}q2}tl=th $}ung:gƼ~un+${tnhb5 |nOC%qlgb[! _kZB#&?=:5"IRQA5( +"<$ #767) $ 179## :<"    HT , 荚J- T  钒 Ց ޒ T响 떍퍖 -J, T H *"ה ᔍ  痍  홍왍喍菍 퐍הᔍ痍홍꘍|q?bø}q2}tl=th $}ung:gƼ~un+${tnhb5 |nOC%qlgb[! _kZB#&?=:5"IRQA5( +z"  "" 팙" "鑑 Ԑ"ޑ 和"ꕌ팕 " "  2"*ד)(疌'혌&옌%啌$#莌*"*폌ד)(疌'혌&ꗌ% iH - Hi$> > P( +yă> gg4$e 7<9!  PN  OM         MK  LJ   68;>>  8 88 2 2 22z,,,v &&&!# !!!z8R R ! 2u88u2 !   R R8z #! $$$v 0 00z > >>2MM͙pM kk > ll 0! II $& II ,$  2 0   8 >mIIm>MkIYYIkpp͙ppMkIYYIk> mIIm0!  $&  ,$ II ===$7 3  / *4 1- ' 1 '5' 9===%              )$ '             # 9z=               L$7 3  / *P}- ' 1 '5' 9F  n \P %Pbcy!!t9y94; *$           (%            ( $            ((('%            %             +++'       | |(@ d'Ӿ @k kPF,    `0OUE`  kk .6>< .  |߮|   |߮|  kk    k k | |          | |   k k     kk   |߮|  |߮|  kk    k k | |         | |    k k     kk   |߮|  |߮|  kk    k k | |          | |   k k   | |.W'( XiR.'k krWJ(     ?RS  kk    |߮|   |߮|  kk    k k | |       | |   k k     kk   |߮|  |߮|  kk    k k | |        | |    k k     kk   |߮|  |߮|  kk    k k | |         | |   k k   | |$@~ `'΢@ ok kKE»*   `.IP@`  kk .4=8 .  |߮|   |߮|  kk    k k | |       | |   k k     kk   |߮|  |߮|  kk    k k | |       | |    k k     kk   |߮|  |߮|  kk    k k | |        | |   k k   U U433( (q q- "} }''  qq }}(UU(.l,\\,  yy  ** y y, ,\ \$K>)[XrN, \ \p;(K , ,1 y y  **  yy ,\\,.l/cc/    --  / /c c+~ Ȫc cw / /     --   /cc/.l!Ś!2ii2! !Ê ʚ0Ǿ0  NJ2 2i ii 33ꡓP i ic2+i2 2  NJ Ӣ ג@ޱδ_  CI   0    #*"(;5%    #0˽yŸn@nĚJ7> 'v   #0 / J5 r" W;*4ޏd       l{uc : "'R٥!Ti Cj "'R٥Ti! ʪ          /:/     014#           ֯/g񔃺/$Q؃k#sÆ̬彻µD~M̄W̴jrD,_ʞESr7{ǩaP|b\Ȧ a黢㻞 adչ awᐰieΗZ NǨug秘ҢvԮxXݚ˹ }ڝ֊0R钛1+{4޴#jst{cdxscbb[bcdxudbb^behrhjh^hrhjhswd|ɖ|nxs|ɖ|nx彻ҫtҫtggbmݢybbmݢygesÇgg_訉ʂez__ʂezg|}gv_ǥxbv_ǥxbVfrVi~êqbi~êqboftoҮmbҮmbgjg~y~yniczmxiczmxasmݰaZgƿpZgƿpnkfdqŧhfbfdqŧhfbkqٺٔg~l꽴eb~l꽴ebvj׳ggݐsʿʹݐsʿʹtgkkl huǐ֓huǐ֓^fh|qwrbb^fh|qwrbbacdfbjbbacdfbjbbbhcbld          j|/JȍR/ .O[vD#mjl `3,o|q6/aZef[,>HY+[zZlW!SZF{6X:cTO|E8p&& 91@kdJľyyso-6m*Rk,Xf^ɮ;T$`9bzZ*w'֯j3.;=;bB"8=u"@>3.l*90FA6,DX=4-`dߵyL>X${mpWf&Z5&Fɮ?VH[-|Q=O+,>?J_dlЫ-:Mi0b]c4%7P))6Ы-:Mi0b]c4%7P))6"֛ q08J=$5%*:q08J=$5%*: y59A[K//|S<3??59A[K//|S<3??>?Aw81f?G??>?Aw81k?G???ʱC@?ʱE@ $$ *3d 88 81 [[ B ++ #  ejT-. 12k64 ]Ձ/ 0K $/D))xxR>L^ keq뷘NM- FI 'X5{d[B] 7dlʙkO30N0&d(c0 5;" /WQ I% 5F  E "%  $_S):. 5[lE;PMn¤8/3U1綺& `uҦ*0"J((;֑\KJ~D1  AE!4 !#x # He =v#De EvU>M  >M  Q4  F( {^() M-`zBaj M{y ̌u3;#!}u3"4뾠5?4嫀d4A!vV5P) H!V !ܬ! [ʫC @F+ @OB+J"w Bv"7vE !wFW˶iR o ![媻SI/?ö߂ y/3 y-ZC A/%&HiWZ<%Hr) ̀ĺsL1Hds;yKds;jFɜAB]iɜEF]i%R %R 7777z7$s8  $sE       $sE   98$s9$$ssE &    & E     ss8$$8w;17߷  ȹv   b    3 ߷ ȹv 3  b  ߷v7187777z7 #8* ***         * * *9*8 #9****D~M̄**̴jr**ESr **|b\Ȧ#**a&**a)**awᐰ)** &**秘Ң #**vԮxX  ** ** **  **8**8w;17߷  ȹvgg gi̧gg kg b ~r  Ǻ 3jƷ ߷ nȹv 3  kb vjŔ{t ߷v7187777z7 #8* ***   % B B  %    * * *9*8 #9mj**Zef**!SZF{6X**&& 9**-6m*Rk,X **`9bzZ*#** Fg!&**nTbN )**.!]*7)**:Ayy, &**<#;F #** Js 1U  **VP֙ **y **  **8**8w;17߷  ȹvZef 8IKNPO :IKKM b Da#  3IJB 3L? ߷ MBȹv FD3 ?E  a^GB-Cb JDQUi[+%!J"8DHH\y ߷v7187/^7/^7//7//x=78('ED^] ge JH=    JH  =ge  ^^  ED (( 888==M-'X5{d[0N0(c0 /I%  E    $_ .  PMn¤8 U1      7=7v77  (?%  D  Y   0 [h  g   ([  `XkG!8$*: 77    ӓ =     °s$$s°s$   $   ( dX  & &Es$$sE& &Es$ ююk !  ! юю {& &Es$$sE& &Es$  #حTP   )   (°s$$s°s$ %     = 9 $$$$$$  ssssss.# X'EEE 7&  &&  H   Y  [&  && HEEE 7 vH)ssssss ( $$$$$$%   ;   11 11 11߷߷߷߷߷߷߷߷߷ȹvvȹvvvȹvvvȹv 3 3 3 3b  b b   333߷  ߷ ߷߷ȹvȹv ȹvȹv  33     bb 3   33 3   ߷߷߷߷߷߷߷߷߷ȹvvvȹvvvvvv1111 11      ґ =       &))&#  WwwW $rr$ **   $**  (**dX *   Ww|--|wW $r;;r$ ύ -44- "(("k 7 *  7 * ύ -44- "((" { Ww|--|wW $r;;r$ *    *#حTP *  )**   (&))&#  WwwW $rr$ %       = 9     **$$$$  **WWWWrrrr.# ** ww ww X'**** ||**# -77- ;**; 7**&-77- "**"  H**)4774(**( Y**)4774(**([**&-77- "**" H**# -77- ;**; 7** || **v** ww ww H)**WWWWrrrr ( **$$$$%       ;   11 11 11߷߷߷߷߷߷߷߷߷ȹvvȹvvvȹvvvȹv 3 3 3 3b  b b   333߷  ߷ ߷߷ȹvȹv ȹvȹv  33     bb 3   33 3   ߷߷߷߷߷߷߷߷߷ȹvvvȹvvvvvv1111 11      Ґ > &))&#  ).27;@@<72.)  **AB BA /**B1FV**BG]m~**AB BA 1BRcs    ).+  +.) CXiz6>>6%ю"(("/BB  * BB  * ˻6>>6%ю"((" oŴ    ).+  +.) Ͽ}l**AB BA ɸwfUE**BcB%J?.**B**AB BA &))&#  ).27;@@<72.)  ** ABBA  ABBA **BBBB. **)BB))BB) 5Pc**.BB..BB.To** 2BB++BB2:s%BB% **# 7BB**BB7n6BB6**&BB>**)@BB(**(BB@BB>**)@BB(**(BB@Vپ6BB6**&33  132=mwga932@߷1322325v61;7䔌$#莌*= 2#=I/ x <0 + 58x+' yX6sN) U:!. q  UsG?Q 0r[^~&̱M~Bȭb`Ū1[S{d >9ymK7.l iN3 rT/_fJ/Dj8LG,VUG"  DL4:045:752!8 :19߷9ȹv:9Q_G*8'.t0  w}+&9߷Hy" ȹvDj$3%w!\! ZX #N bUP( (A- 3CB?<:5#߷7v61;72 0II  8 >ll >Mkk  p2z <v b 3D#!  (R8z  R l&hq, !}ou 2u8u~u8{r2t +xo! zpR  9+xz8R ] G3!# 4"v  "z$2 & :9 2[rA A3, B/ hp Ax]X Dur3 ,(+s~g qoϦ  j " } hx 89e 3o{G h T'\z?; *&&+ ^ v 99---walⴈC {@5ti `y` 6C& ! E g  Zw dC?yyn"#t5;zllap}SyH666L$7 3  / *4 1- ' 1 '5' 9 F  =e               $====<=<&#!      #$&=>=======<=<<;4  20 . ,+*)))L$7 3  / *P}- ' 1 '5' 9 F                    +'             9998% "        !#99999998870     )( ' & % % %   kk   |߮|  |߮|  kk    k k y| |      | |   k k     kk   |߮|  |߮|  kk    k k | |          | |   k k      kk   |߮|  |߮|  kk    k k  | |         | |  k k      kk   |߮|]  kk   |߮|  |߮|  kk    k k | |      | |   k k     kk   |߮|  |߮|  kk    k k | |          | |   k k     kk   |߮|  |߮|  kk    k k | |        | |& "k k     kk   |߮|]  kk   |߮|  |߮|  kk    k k | |      | |   k k     kk   |߮|  |߮|  kk    k k | |          | | k k     kk   |߮|  |߮|  kk    k k | |         | |   k k     kk   |߮|] ʚ0Ǿ0! "Ê!Ś!2ii2.l#ѣ#5oΧo5# #Г ף33  ԓ5 5o o] i31 jh   o oE, 5 5)  ԓ  ף33# $Г#ѣ#5oΧo5.l%ޭ%8vڱv8% %ܜ 66  8 8v v :3d= 1 B # #v vT 8 8   , 66% &ܜ%ޭ%8vڱv8.l'';}};' ' 99  ; ;} }$$88[[++ w} }-.; ;64 - " 99' ('' ;}};.*s TF-$ҧ$:  +z\  ʣ ׻ *w%]ʷ hD ,  w "J)w N % v   2   bN { Q{֥ دB  RrB C (yW Y^ εF '%Vw ̈ \1  *ν͞ WҎ,Wۯ˰]<" BH  ^ 0 's  876+ ;?eH.3>ZlZ5  Hgb952(:<==:744*39:970.44 676 44/ .  x 0:1nwX-&xxg=HxxZ>Xe%IvsG@^l:!KIB@@B9>@@?>=6=>?>=<;5;<==<;:872:;;:976 99::9876*(887,&&X )564. _h>540=;:861+@@>=:861 .AA?=;86409CGE?><:864(AQQA==;975$ <<;;8,4--99 $ '2 $:&:: 4/ $  }=H#II5II#$6FC );   x*33(*33# %     'CHcn`P  t7}r0A^a#EP + y i[M " - = j(O9 Cva Y MG$ 1 f5BL / J5 r" W(      LެL   LެL     LLL L                          LLL L    LެL   LެL        . /       / <:8& 4   !#%      LެL   LެL     LLL L                          LLL L    LެL   LެL        . /       / <:8& 4   !#%      LެL   LެL     LLL L                          LLL L    LެL   LެL        . /       / <:8& 4   !#%rr] ]rr]77]]77]7 77 7rrrr2    6 rrrr7 77 777]]77]rr] ]rr] } |. .RQss   ss WS .~ }<97% rs3}RT} SUtu  "% 0 / . / 0 0 0 0 0 0 0 0 0 0 0 0 / . <   #  1$0$# $" $  $  # # # # # # """ƾ8"8ʺ8Of88 0 / . / 0 0 0 0 0 0 0 0 0 0 0 0 / . <   #  1$0$# $" $  $  # # # # # # """ƾ8"8ʺ8Of88 0 / . / 0 0 0 0 0 0 0 0 0 0 0 0 / . <   #  1$0$# $" $  $  # # # # # # """ƾ8"8ʺ8Of88 ]. ]. "/ YW YWWW WWWW WW WW'WWWW&WWWW WW //. ]. ]   #1/" !           888Of88C<}< !CC%)%CC!*5v5CC\ 99C<N  %CC#%'''&#CC%  o6CC66  c  0 ;;1 - - - - - - - - - - ˾- Ʒ- -   0118J;F88F8  FFJJFF !###" FFJJFF *4FF44FF4JJ\ 99J;F8   !EIIE"""""""EIIE!  *4EE5II66  c  0 ;;1 - - - - - - - - - - ˾- Ʒ- -   0118L; e88 e8       eeLLee !###" eeLLee     *  4 ee 44 ee 4LL\ 99L; d8   !dLLd"""""""dLLd!  *4 dd 5LL66  c  0 ;;1 - - - - - - - - - - ˾- Ʒ- -   01188888 !!!!!!!!*4 5 5 5\888 !!!!!!!! * 5 5 5c :;;;;;;;;;;;;;;;1 0 :;1C</  % % -/////////. , -  /e ;=C$++++++++++++++ )  $%%%%%%%%%%%%%%%+ - ,  )  "##J4F  F              . , -  /e ;=J#F%+++         ==         %%%%+ - ,  )  "##L;e %  $e  #  -// "     "/. , -  /e ;=L#d %+++  ++++ )  $%%%%%    %%%%+ - ,  )  "## e))gg ) )ii  HH HH      iHHi gH8UU*Hgeeee gH2UU5Hg iH - Hi  + HH HH) )ii))gg;e eggiiHH HHҗiHw+Hi g]6UUQKg eeeegNXUUSLg iHDIHi _H   HQRR  HH  ii  gg 'e  egg ii HH ͖ iH{ɝHi gUUĽg e e e e gUUg iHHi |HHiigg e!+!!"# <KI 0 ===>=>       ''))));=!   +&&=>=======<=<&%)   ==;U0 999:            % % % % ':8       # "#99999998% # #         68:Q 3V <,0c?  B  |߮|  kk    k k | |         | |   k k     kk   |߮|%999999z      B  |߮|  kk    k k | |         | |   k k     kk   |߮|%999999z      B  |߮|  kk    k k | |         | |   k k     kk   |߮|%999999z      A))>ă>) ) <<  > > * 8    ej  12k > >]Ձ    <<) *)) >ă>. + , . 0       . -<:'  4    !#% , . 0       . -<:'  4    !#% , . 0       . -<:'  4    !#% , . 0       . -<:'  4    !#%88846--64888888 O'n..X@1##1@X@=s~~q<@M >{{@.q{.             .q .= E@BөE@S Q..: '88846--64888888 O'U..X@1##1@X@=s~~q<@M >{{@.q{.             .q .= E@BөE@S Q..: '88846--64888888 O'U..X@1##1@X@=s~~q<@M >{{@.q{.             .q .= E@BөE@S Q..: '          88O' β99 9 9      9 9ɲ ϲ99 '11111111111 ;;1  :555      &=;W<11111111111 ;;1  :555      &=;W<11111111111 ;;1  :555      &=;W< ;;;;;;;;;;;;;1 0B=:555       &=::#####  ######)  +  +++++##%++++++++++######  ######)  +  +++++##%++++++++++##############)  +  +++++##%++++++++++++#ce x7UYayy?Q Nh4 ϕzqN G,dD c0= V ,V+!!*1g\j ``F ]w*V!.{ ob '5d;\oYX+6NaMp~w3QBIW9.B\U; |K 1Q  V },d #e Y -xJ W=M==W=M= W=M==W=M=  V< 7 .Q:=Gha7 :a ;af f? KoY Y4h5HHqz 94׼G 'dz'Dd N8 8cJ3* Dq =0xdUww  ,] :V|\ 8f,YQ\'j 'YV-  Hg1<\ H -   'Y YQ\'j j8f |\ *w] :,]  xdUww5' Dq J3*o\ N aN dz Q3w 49 .9 5 ;U Ko K| ;a Q=Gha7 .QV<$d,%Y ,0c? %-V &x 'J             R                       R                       R           @@@@di24@ Capa nueva#2     XAM@Am]D]P]\@BBB%CQCCCCHK~MNiNyNRV\\$\4\D\T\d\t\\\\\\\\]]]$]4M >1 1M >1 1M >1 1+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++X0 2 2F 799F 799F 799@788 1 - - - - - - - - - - ˾- Ʒ- - - -; - -S8- --Z -4 - ! -8 ?-3DA -POO,=-?ZZV - NNMM'-pjea]XT--` 1 - - - - - - - - - - ˾- Ʒ- - - -; - -S8- --Z -4 - ! -8 ?-3DA -POO,=-?ZZV - NNMM'-pjea]XT--` 1 - - - - - - - - - - ˾- Ʒ- - - -; - -S8- --Z -4 - ! -8 ?-3DA -POO,=-?ZZV - NNMM'-pjea]XT--` 2 2 2 2 2 2 2 2 2 2 2 2 2 2 0K+++++++++++++++++++ 9999999999999? n' # ! 9999999999999? na|E' wbS#vaa\D D~M͕̄r!̴jrԘע9999999999999? n.n`-'mj T96#ZefJ΢m! !SZF{6XV<:!bFb*&S!&& 9sA]R&88888888888888 nE(' Ic0#M-$N' 'X5{d[PŴX!M55 & " 5Ԝ &XxԈv "熢Ȏݰ з򋏛rɡĴwa󿄏᷆Xy8֊PV ƽ&U1 sJ "F;#<*7 򤔄,yyA:jfX9XZ! 7*]!.6,zgN*,51U  &8nMP 0 ".0/% _$ [_.8 ΃E:9991:9991:9991:9991  ## ESrﮎj~|b\ȦxMaԗƺaawᐰXȵАɦr秘Ң vԮxX ## -6m*Rk,Xƒ#yk Z`9bzZ*yP ;ZFg!1FFemnTbN Uyׇ{.!]*7,*Ngz,6:Ayy,򳂴 !ZX9Xfj<#;F 7*Js 1U $VP֙&y 0N0n{(c0 UM/1-I%dE  $_8._[. %/0PMn¤8  0#U1 #    8 ݡąaϹҗ΢\b|MxrSE~jrj ۢ M~ۖD rğƕD̏\aavSbҎw8E|a  NbTn{ޚyU!gFmeFF1*Zzb9`Z; PyơX,kR*m6-Z ky#9 && &Rи]As X6{FZS! S&*bFb!:<VfeZ!mJjm69T8-`n. %Id/-1 0c(MU0N0{n 5M [d{5X' XP-M'N$0cI 8(E :}   V       S    :}   V       S    :}   V       S    :}   V       S    Pd(2 Capa nueva     ^^/JJJ^k;wwAWޓeO!-?:HJW7cso{GSʏeS C&46:='@?CWFJ                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    dd22xye-0.12.2+dfsg/res/xye_luminosity.png000066400000000000000000000156151225403634500177340ustar00rootroot00000000000000PNG  IHDR6sRGBbKGD pHYs  tIME)S0 IDATxtw~OHB~W!@_"pQ[,7gٮݮ=Pt{<^^AZjcRYXPIB B00?f&N„$$9C&΋Of&ZUVjnn֙3g:\7H^U?x<[pKѣ:v.\Ặm|t:[kȐ!}EssΞ=kNPEE.] P@g>.N/_˗B.g>kʕ:zSEw]>v:9r~^3eI$%kڲ 0CK ׸rJn566&_,eYo&n U( 8Ư~+ :mȑ#ZpaK:,zV#/Feffl#l;,zV@:yNH(0!=p]]r%$$/: Jf7}UQQΞQraÆ |>1h!If7u.,\WVCCCA) ttY7a  ]477ID^paxI]( @ȑ#x:$w-˺()W!y%(+EGs[uy%wy 豌 6ti:w1***ҫW_}U&c߿?/(@A_QXX9sՔ&zTnn./(@A_QYY IꌫDEڷo/(@A_ iӦS'*:ŋyA  ׫bYNe|>v`d&͟?U`e`0ǹo~ z=@q@ M=ص }i)ș&]P@nTWW͛7… j{mђ%KU@6 ́g$ْ~xLT/… 3g,YlI$7o֭[y;Gr:z5b)//O#FЃ> /|-_c4oE,eaY OHL3L޽s ?s7m[k׮Çu9;wNڵkR=E,ONN*++} KNNٔSUZdI^C*@ϸټI/tCXb_UIڣĦ2=?;@jjllLz28Ryevt1ys%zZl:uJk׮s;{;\)Sh](--~yZ:ɝNISx~»^;2JUmr\E~f⬤jő@Rt[c}WҖ[~8>t 8*S˲.yU򺐇sj?#I$ /_> + O7ljY1rR>-[OvyNcL1>FW@\\%/y6sLd?favyw0oLvXe:xg 1')#fו-^6@:c5xbV$tcm:hGY--^zE:]X.ӹ8҈pKٳgl׻@B'~ٳC"gdYnm/|%w]X@f̙o_$M#n K>U>9sguXdzjhD:NGFc;ӧO,鲤a>زeKAy֭Wҫ=}\㲤]1Wvt_fIz#˲u&oݺuW~,hhhȑT]#y-~$eY],FIz1NnY!ID]#/5/6x F1)W󛚚4) N$ӹrU;?ەYD^_P@GYfm|0gΜs ,v51 .mvŋHii#Glq\C/}vΜ9m[n飏>}ɡP7n?vsD^_$@W^=TTT;ʕ+ڎ:ƌ󳺺{ܹs۷/˖-;_^^~~֭o8p`åKN2w>x>G^J_0d1R]]O~G9u9vz''yƋި@R1cLAAf͚YYY.+dvHBG( r3gθ̈́ fκWX^z)˗7ڵ^{mnhy]h1@R@| nR볢b;tz2222Swu?߿?'8)i@glgO<{}}h( @~H:cǎsn 9Nc$y^gtN$>|xŒ3.Hю;v&o>v٩ny)h?0]]9V_$tFrtWCI'$=R[[;g%'vyMMM KuKI:*c%gY??~AeY VOP___{Ŷ퍒>߲|O?|˲h'.I+<Ӆ敗߰aëƘ)nR} #OcpKR04#eY%,2 xP(4.C1?ׯ;%n^vvG^I\Hl%S[x 1tN":m`LO>3y#FXd ;;w}}h( @ ۷oϒ4hP 7nXtRoΝ;3g|kVZlފ+;viӦݹsg0#/%y )|v}7IïYǀ9}W2ܭe45ѼIp э#//Hy{c1vWdqG{l?>M|;n{Yy.ϷpXӹ}E'p z]o|^xSy[qs{/wRJܲ,GQQQ#>;wnm(2UUUc:Tzԩ2Ƅny{AAvQRv.HmYfv5϶]$msKnhԾҐKc/)Еe?B,IIZ.iH9*i%\}B*SR<4jԨk֬X`_$5.۷o?i2{lw$g7xcɡC<[0AS [g#-g>&)>_:eM􊤡;@r0IxĎV+UUU'C~˻wnnS<,I5J~ zZ)//;:(mww*oq=f̘8c/@A/( vUUַi&5GܹsOH[oy .(((:~x~LsP@޾}{;v222{^;SwiZ@VX|=f„ ĉI&iرI* ~#^x[nqx),,y$<$oٱc qH, ք Lii5~x9Fr5wabg֬Y#Gz.,,fffzye1~۶31f'o c&)"M[l=:Z<߷gϞӦM;|ywׯN>5zhwQQ)~I>۶ϟjnncߜ;wn| z~)U ycƌ!Z8$sᖴ/T[[z"ͳm;᫩5o޼uz@A/ 7-e5KrNX% }jpI? #include #include #include #include /* class Folder { private: dir* D; public: Folder(const char* dirname); bool Open(); void Reset(); //go back to first const char* NextSubFolder(); const char* NextFile(); const char* NextFileOfType(const char* ext); void Close(); }*/ Folder::Folder(const char* dirname) { strcpy(Folder::dirname,dirname); D=NULL; } bool Folder::Open() { return (D=opendir(dirname)); } void Folder::Close() { closedir(D); D=NULL; } bool Folder::Reset() { closedir(D); return (D=opendir(dirname)); } Folder::~Folder() { if(D) closedir(D); } bool AlwaysTrue(const char* c) {return true;} const char* Folder::NextFile() { return NextFileMatching(AlwaysTrue); } bool HasExtension(const char* n, const char* ext ) { int l1=strlen(n) ,l2=strlen(ext); int i=l1-1,j=l2-1; while ((i>=0) && (j>=0) && (n[i]==ext[j])) { i--; j--; } return ((i>=0) && (j<0) && (n[i]=='.')); } void ToLowerCase(char* n) { for (int i=0;n[i]!='0';i++) if ((n[i]>=65) && (n[i]<=90)) n[i]+=32; } const char* Folder::NextFileOfType(const char* ext) { dirent *ent; DIR* tm; const char * r; int L=strlen(dirname),L2; char realpath[FILENAME_MAX]; while (ent=readdir(D)) { r=ent->d_name; errno=0; L2=strlen(r); strcpy(realpath,dirname); strcat(realpath,r); tm=opendir(realpath); if (tm) closedir(tm); else if (HasExtension(r,ext)) return(r); } return NULL; } const char* Folder::NextFileMatching( bool (*cond)(const char*) ) { dirent *ent; DIR* tm; const char * r; int L=strlen(dirname),L2; char realpath[FILENAME_MAX]; while (ent=readdir(D)) { r=ent->d_name; errno=0; L2=strlen(r); strcpy(realpath,dirname); strcat(realpath,r); tm=opendir(realpath); if (tm) closedir(tm); else if (cond(r) ) return(r); } return NULL; } const char* Folder::NextSubFolder() { dirent *ent; DIR* tm; const char * r; int L=strlen(dirname),L2; char realpath[FILENAME_MAX]; while (ent=readdir(D)) { r=ent->d_name; if ((! strcmp(r,".")) || (! strcmp(r,".."))) continue; errno=0; L2=strlen(r); strcpy(realpath,dirname); strcat(realpath,r); tm=opendir(realpath); if (tm) { closedir(tm); return(r); } } return NULL; } bool TryToOpenFolder(const char* path) { Folder F(path); if (F.Open()) { F.Close(); return true; } return false; } xye-0.12.2+dfsg/src/browser.h000066400000000000000000000013001225403634500157410ustar00rootroot00000000000000#include #include #include #include class Folder { private: DIR* D; char dirname[FILENAME_MAX]; public: Folder(const char* dirname); ~Folder(); bool Open(); void Close(); bool Reset(); const char* NextSubFolder(); const char* NextFile(); const char* NextFileOfType(const char* ext); const char* NextFileMatching( bool (*cond)(const char*) ); }; bool HasExtension(const char* n, const char* ext ); #ifndef MKDIR #ifdef _WIN32 #define MKDIR(d, p) mkdir(d) #else #define MKDIR mkdir #endif #endif bool TryToOpenFolder(const char* path); xye-0.12.2+dfsg/src/dialogs.cpp000066400000000000000000000244631225403634500162520ustar00rootroot00000000000000#include "dialogs.h" Font* dialogs::FontResource; SDL_Color dialogs::BackgroundColor; SDL_Color dialogs::TextBoxColor; stack dialogs::yesnoCurrent; stack dialogs::inputCurrent; void onDialogClickDoNothing(bool yesclicked) {}; class yesnoButtonData: public buttondata { public: onDialogEnd func; window* target; yesnoButtonData(onDialogEnd afunc,window* atarget) { func=afunc; target=atarget; } }; void dialogs::yesButtonClick(const buttondata* data) { const yesnoButtonData* dt=static_cast(data); onDialogEnd func=dt->func; dt->target->endSub(); dialogs::yesnoCurrent.pop(); func(true); } void dialogs::noButtonClick(const buttondata* data) { const yesnoButtonData* dt=static_cast(data); onDialogEnd func=dt->func; dt->target->endSub(); dialogs::yesnoCurrent.pop(); func(false); } void dialogs::yesnoOnKeyDown(SDLKey keysym, Uint16 unicode) { yesnoData dt= dialogs::yesnoCurrent.top(); switch(keysym) { case SDLK_RETURN : dialogs::yesnoCurrent.pop(); dt.enterdown=true; dialogs::yesnoCurrent.push(dt); break; case (SDLK_ESCAPE): dialogs::yesnoCurrent.pop(); dt.escdown=true; dialogs::yesnoCurrent.push(dt); break; } } void dialogs::yesnoOnKeyUp(SDLKey keysym, Uint16 unicode) { yesnoData dt= dialogs::yesnoCurrent.top(); switch(keysym) { case SDLK_RETURN : if(!dt.enterdown) return; dialogs::yesnoCurrent.pop(); dt.target->endSub(); dt.func(true); break; case (SDLK_ESCAPE): if(!dt.escdown) return; dialogs::yesnoCurrent.pop(); dt.target->endSub(); dt.func(false); break; } } //================================================================================ class inputtextblock: public control { public: int lines; int tic; string oldtext; inputDialog* diag; inputtextblock(int sx, int sy, int sw, int slines); vector textsplit; void draw(SDL_Surface* target); void loop() {} inline void onMouseMove(int px,int py){} inline void onMouseOut() {} inline void onMouseDown(int px,int py) {} inline void onMouseUp(int px,int py) {} inline void onMouseRightUp(int px,int py) {} }; inputtextblock::inputtextblock(int sx, int sy, int sw, int slines) { lines=slines; oldtext=""; textsplit=vector(1,""); x=sx;y=sy;w=sw;h=lines*dialogs::FontResource->Height(); depth=0; tic=0; } void inputtextblock::draw(SDL_Surface* target) { tic++; string text=dialogs::getCurrentInputText(); if(text!=oldtext) { textsplit=dialogs::FontResource->splitByLines(text,w); if(textsplit.size()==0) textsplit.push_back(""); oldtext=text; } int begi=0,endi=lines; if(linestextsplit.size()) { endi=textsplit.size(); } int fh=dialogs::FontResource->Height(); int th=0; for (int i=begi;iWrite(target, x, y+th, textsplit[i]+"|"); else dialogs::FontResource->Write(target, x, y+th, textsplit[i]); th+=fh; } } //================================================================================ string dialogs::getCurrentInputText() { if(inputCurrent.empty()) return "NULL"; else return inputCurrent.top().text; } void dialogs::makeButtonDialog(window* target, string prompt, string yescaption, bool showno, string nocaption, onDialogEnd func) { Sint16 pw = target->Width/2; Sint16 ph = max(target->Height/3, min(target->Height, FontResource->WrappedTextHeight(prompt, pw-2*button::Size) + button::Size*4) ); Sint16 px = target->Width/4; Sint16 py = (target->Height - ph)/2; yesnoData dt; dt.target=target; dt.func=func; dt.enterdown=false; dt.escdown=false; dialogs::yesnoCurrent.push(dt); target->beginSub(); control* tmcntrl; tmcntrl = new rectangle(px-1,py-1,pw+2,ph+2, 0,0,0 ); tmcntrl->depth=1; target->addControl(tmcntrl); tmcntrl = new rectangle(px+3,py+3,pw,ph, 0,0,0 ); tmcntrl->depth=1; target->addControl(tmcntrl); tmcntrl=new rectangle(px,py,pw,ph, BackgroundColor ); tmcntrl->depth=2; target->addControl(tmcntrl); target->onKeyUp=yesnoOnKeyUp; target->onKeyDown=yesnoOnKeyDown; textblock* tx = new textblock(px+button::Size, py+button::Size, pw-2*button::Size, ph - 4*button::Size, dialogs::FontResource); tx->text= prompt; tx->depth=19; target->addControl(tx); int ybuttonw = FontResource->TextWidth(yescaption)+button::Size; if (ybuttonwTextWidth(nocaption)+button::Size; if (buttonwtext=yescaption; tmbut->depth=20; tmbut->onClick=yesButtonClick; tmbut->data=new yesnoButtonData(func,target); target->addControl(tmbut); if(showno) { buttonx=px+pw/2+button::Size/2; tmbut= new button(buttonx,buttony,buttonw,button::Size); tmbut->text=nocaption; tmbut->depth=20; tmbut->onClick=noButtonClick; tmbut->data=new yesnoButtonData(func,target); target->addControl(tmbut); } } void dialogs::makeYesNoDialog(window* target, string prompt, string yescaption, string nocaption, onDialogEnd func) { makeButtonDialog(target,prompt, yescaption, true, nocaption, func); } void dialogs::makeMessageDialog(window* target, string prompt, string buttoncaption, onDialogEnd func) { makeButtonDialog(target,prompt, buttoncaption, false, "", func); } //================================== void dialogs::textDialogClickClear(const buttondata* data) { inputDialog& d= inputCurrent.top(); d.text = ""; } void dialogs::textDialogClick(bool ok) { inputDialog d= inputCurrent.top(); inputCurrent.pop(); d.target->endSub(); d.func(ok,d.text,d.data); } void dialogs::inputOnKeyDown(SDLKey keysym,Uint16 unicode) { inputDialog d= inputCurrent.top(); if( unicode < 0x80) { char c = (char)(unicode); if(c>=' ') { d.text+=c; inputCurrent.pop(); inputCurrent.push(d); } } switch(keysym) { case SDLK_RETURN: textDialogClick(true); break; case SDLK_ESCAPE: textDialogClick(false); break; case SDLK_BACKSPACE: d.text=d.text.substr(0,d.text.length()-1); inputCurrent.pop(); inputCurrent.push(d); break; } } void dialogs::inputOnKeyUp(SDLKey keysym,Uint16 unicode) { } void dialogs::makeTextInputDialog(window* target, string prompt, string defaulttext, int lines, string okcaption, string cancelcaption, onTextDialogEnd func, inputDialogData* data) { SDL_EnableUNICODE(1); Sint16 pw = target->Width/2; Sint16 ph = max(target->Height/3, min(target->Height, FontResource->WrappedTextHeight(prompt, pw-2*button::Size) + button::Size*5) ); Sint16 px = target->Width/4; Sint16 py = (target->Height - ph)/2; Sint16 ith = lines*FontResource->Height(); Sint16 textblockheight=ph - 4*button::Size - 2 - ith; Sint16 itw = pw-2*button::Size; Sint16 itx = px+button::Size, ity=py+button::Size+textblockheight+1; inputDialog cur; cur.data=data; cur.text=defaulttext; cur.lines=lines; cur.target=target; cur.func=func; inputCurrent.push(cur); target->beginSub(); target->onKeyUp=inputOnKeyUp; target->onKeyDown=inputOnKeyDown; control * tmcntrl; tmcntrl = new rectangle(px-1,py-1,pw+2,ph+2, 0,0,0 ); tmcntrl->depth=1; target->addControl(tmcntrl); tmcntrl = new rectangle(px+3,py+3,pw,ph, 0,0,0 ); tmcntrl->depth=1; target->addControl(tmcntrl); tmcntrl=new rectangle(px,py,pw,ph, BackgroundColor ); tmcntrl->depth=2; target->addControl(tmcntrl); tmcntrl=new rectangle(itx-1,ity-1,itw+2,ith+2, 0,0,0); tmcntrl->depth=3; target->addControl(tmcntrl); tmcntrl=new rectangle(itx,ity,itw,ith, dialogs::TextBoxColor); tmcntrl->depth=4; target->addControl(tmcntrl); textblock* tx = new textblock(px+button::Size, py+button::Size, pw-2*button::Size, textblockheight, dialogs::FontResource); tx->text= prompt; tx->depth=19; target->addControl(tx); inputtextblock* input = new inputtextblock(itx+2, ity, itw-4,lines); input->depth=19; target->addControl(input); int ybuttonw = FontResource->TextWidth(okcaption)+button::Size; if (ybuttonwTextWidth(cancelcaption)+button::Size; if (buttonwtext=okcaption; tmbut->depth=20; tmbut->onClick=textDialogClickOk; tmbut->data=NULL; target->addControl(tmbut); buttonx=/*px+pw/2+button::Size/2*/ px + pw/2 - buttonw/2; tmbut= new button(buttonx,buttony,buttonw,button::Size); tmbut->text="Clear"; tmbut->depth=20; tmbut->onClick=textDialogClickClear; tmbut->data=NULL; target->addControl(tmbut); buttonx=/*px+pw/2+button::Size/2*/ px + pw - buttonw - button::Size; tmbut= new button(buttonx,buttony,buttonw,button::Size); tmbut->text=cancelcaption; tmbut->depth=20; tmbut->onClick=textDialogClickCancel; tmbut->data=NULL; target->addControl(tmbut); } xye-0.12.2+dfsg/src/dialogs.h000066400000000000000000000043201225403634500157050ustar00rootroot00000000000000#ifndef DIALOGSINCLUDED #ifndef WINDOWINCLUDED #include "window.h" #endif #ifndef FONTINCLUDED #include "font.h" #endif #define DIALOGSINCLUDED #include #include using std::string; using std::stack; typedef void (*onDialogEnd)(bool yesclicked); void onDialogClickDoNothing(bool yesclicked); struct yesnoData { window* target; onDialogEnd func; bool enterdown; bool escdown; }; class inputDialogData {}; typedef void (*onTextDialogEnd)(bool okclicked, const string resulttext, inputDialogData* data); struct inputDialog { inputDialogData* data; onTextDialogEnd func; string text; vector textsplit; int lines; window* target; inputDialog() {data=NULL; } }; class dialogs { private: static stack yesnoCurrent; static stack inputCurrent; static void yesButtonClick(const buttondata* data); static void noButtonClick(const buttondata* data); static void yesnoOnKeyUp(SDLKey keysym,Uint16 unicode); static void yesnoOnKeyDown(SDLKey keysym,Uint16 unicode); static void makeButtonDialog(window* target, string prompt, string yescaption, bool showno, string nocaption, onDialogEnd func); static void inputOnKeyDown(SDLKey keysym,Uint16 unicode); static void inputOnKeyUp(SDLKey keysym,Uint16 unicode); public: static Font* FontResource; static SDL_Color BackgroundColor; static SDL_Color TextBoxColor; static void makeYesNoDialog(window* target, string prompt, string yescaption, string nocaption, onDialogEnd func); static void makeMessageDialog(window* target, string prompt, string buttoncaption, onDialogEnd func); static void makeTextInputDialog(window* target, string prompt, string defaulttext, int lines, string okcaption, string cancelcaption, onTextDialogEnd func, inputDialogData* data); static void textDialogClick(bool ok); static void textDialogClickOk(const buttondata* data) { textDialogClick(true); } static void textDialogClickClear(const buttondata* data); static void textDialogClickCancel(const buttondata* data) { textDialogClick(false); } static string getCurrentInputText(); }; #endif xye-0.12.2+dfsg/src/editorload.cpp000066400000000000000000001362261225403634500167570ustar00rootroot00000000000000#include "xyedit.h" #include "xye.h" #include "tinyxml/xye_tinyxml.h" #include "kye_script.h" #include "xye_script.h" #include #include #include using std::map; using std::cout; DefaultColorData editorload_colors[TOTAL_EDITOR_COLOR_OPTIONS]; boardelement editorload_objects[XYE_HORZ][XYE_VERT]; int editorload_xyex; int editorload_xyey; int editorload_portal_x[XYE_OBJECT_COLORS+1][2]; int editorload_portal_y[XYE_OBJECT_COLORS+1][2]; int editorload_defaultwall = 0; string editor::loadError; int getElementPosition_lastx = 400; int getElementPosition_lasty = 400; vector< pair > errorPositions; bool isObjectTypeGround(editorobjecttype ed) { if (ed==EDOT_NONE || ed==EDOT_ERROR ) { return false; } switch(ed) { case EDOT_ONEDIRECTION: case EDOT_PORTAL: case EDOT_COLORSYSTEM: case EDOT_FIREPAD: case EDOT_HINT: return true; } return false; } bool isObjectTypeTop(editorobjecttype ed) { return (ed!=EDOT_NONE && ed!=EDOT_ERROR && !isObjectTypeGround(ed) ); } bool getTopElementPosition(TiXmlElement *el, int &x , int &y, bool allowSamePos=false) { x=400; y=400; el->QueryIntAttribute("x",&x); if(x==400) { x = getElementPosition_lastx; } else { getElementPosition_lastx = x; } el->QueryIntAttribute("y",&y); if(y==400) { y = getElementPosition_lasty; } else { getElementPosition_lasty = y; } if((x<0) || (x>=XYE_HORZ) || (y<0) || (y>=XYE_VERT) ) { cout<<"Wrong coordinates "<Value()<<">\n"; return false; } if( (!allowSamePos) && isObjectTypeGround(editorload_objects[x][y].type) ) { errorPositions.push_back( make_pair(x,y) ); cout<<"Unable to load two objects in same position: "<Value()<<">\n"; //return false; } return true; } bool getGroundElementPosition(TiXmlElement *el, int &x , int &y, bool allowSamePos=false) { x=400; y=400; el->QueryIntAttribute("x",&x); if(x==400) { x = getElementPosition_lastx; } else { getElementPosition_lastx = x; } el->QueryIntAttribute("y",&y); if(y==400) { y = getElementPosition_lasty; } else { getElementPosition_lasty = y; } if((x<0) || (x>=XYE_HORZ) || (y<0) || (y>=XYE_VERT) ) { cout<<"Wrong coordinates "<Value()<<">\n"; return false; } if( (!allowSamePos) && isObjectTypeTop(editorload_objects[x][y].type) ) { errorPositions.push_back( make_pair(x,y) ); cout<<"Unable to load two objects in same position: "<Value()<<">\n"; //return false; } return true; } bool editor_LoadWall(TiXmlElement* el, bool round = false) { int x,y; if(!getTopElementPosition(el,x,y)) return false; int t=editorload_defaultwall; el->QueryIntAttribute("type",&t); if( t<0 || t>5 ) { //fix variations... if (t != 6) cout<<"Found a unknown wall type: "<QueryIntAttribute("round1",&test); round=round || test; el->QueryIntAttribute("round3",&test); round=round || test; el->QueryIntAttribute("round7",&test); round=round || test; el->QueryIntAttribute("round9",&test); round=round || test; int x2 = 400; int y2 = 400; el->QueryIntAttribute("x2", &x2); el->QueryIntAttribute("y2", &y2); if (x2 == 400) { x2 = x; } if (y2 == 400) { y2 = y; } for (int i=x; i<=x2; i++) { for (int j=y; j<=y2; j++) { boardelement &o=editorload_objects[i][j]; if ( (o.type != EDOT_NONE) && (o.type != EDOT_WALL) ) { o.type = EDOT_ERROR; } else { o.type = EDOT_WALL; } o.variation = t; o.round = round; } } return true; } editorcolor getElementColor(TiXmlElement* el) { int t=0; el->QueryIntAttribute("nocolor",&t); if (t) return EDCO_WHITE; const char * ptr=el->Attribute("bc"); if(! ptr) { ptr="Y"; cout << "Notice: using default color for a <"<Value()<<"> element\n"; } string v=ptr; if (v.length() >= 1) { switch(v[0]) { case 'R': case 'r': return EDCO_RED; case 'G': case 'g': return EDCO_GREEN; case 'B': case 'b': return EDCO_BLUE; case 'P': case 'p': return EDCO_PURPLE; } } return EDCO_YELLOW; } int getElementDirection(TiXmlElement* el) { const char * ptr=el->Attribute("dir"); if(! ptr) { ptr="D"; cout << "Notice: using default direction for a <"<Value()<<"> element\n"; } string v=ptr; if (v.size() >= 1) { if(v[0]=='U') return EDITORDIRECTION_UP; else if(v[0]=='R') return EDITORDIRECTION_RIGHT; else if(v[0]=='L') return EDITORDIRECTION_LEFT; } return EDITORDIRECTION_DOWN; } bool editor_LoadGem(TiXmlElement* el) { int x,y; if(!getTopElementPosition(el,x,y)) return false; editorcolor col=getElementColor(el); boardelement &o=editorload_objects[x][y]; o.type=EDOT_GEM; o.color = col; return true; } bool editor_LoadStar(TiXmlElement* el) { int x,y; if(!getTopElementPosition(el,x,y)) return false; boardelement &o=editorload_objects[x][y]; o.type=EDOT_GEM; o.color = EDCO_PURPLE; return true; } bool editor_LoadGenRC(TiXmlElement* el,editorobjecttype type, int variation=0, editorcolor* oldcolor=NULL) { int t= errorPositions.size(); int x,y; if (isObjectTypeTop(type)) { if(!getTopElementPosition(el,x,y)) return false; } else{ if(!getGroundElementPosition(el,x,y)) return false; } int round=false; el->QueryIntAttribute("round",&round); editorcolor col=getElementColor(el); boardelement &o=editorload_objects[x][y]; if (oldcolor != NULL) { *oldcolor = o.color; } o.type=type; o.color = col; o.variation=variation; o.round=round; return true; } bool editor_LoadGen(TiXmlElement * el, editorobjecttype type, int variation=0) { int x,y; if (isObjectTypeTop(type)) { if(!getTopElementPosition(el,x,y)) return false; } else{ if(!getGroundElementPosition(el,x,y)) return false; } boardelement &o=editorload_objects[x][y]; o.type=type; o.variation=variation; return true; } bool editor_LoadGenR(TiXmlElement * el, editorobjecttype type, int variation=0, editorcolor color = EDCO_YELLOW) { int x,y; if (isObjectTypeTop(type)) { if(!getTopElementPosition(el,x,y)) return false; } else{ if(!getGroundElementPosition(el,x,y)) return false; } int round=false; el->QueryIntAttribute("round",&round); boardelement &o=editorload_objects[x][y]; o.type=type; o.color = color; o.variation=variation; o.round=round; return true; } bool editor_LoadGenD(TiXmlElement * el, editorobjecttype type, int variation=0) { int x,y; if (isObjectTypeTop(type)) { if(!getTopElementPosition(el,x,y)) return false; } else{ if(!getGroundElementPosition(el,x,y)) return false; } int direction = getElementDirection(el); boardelement &o=editorload_objects[x][y]; o.type=type; o.direction=direction; o.variation=variation; return true; } bool editor_LoadGenDOpposite(TiXmlElement * el, editorobjecttype type, int variation=0) { int x,y; if (isObjectTypeTop(type)) { if(!getTopElementPosition(el,x,y)) return false; } else{ if(!getGroundElementPosition(el,x,y)) return false; } int direction = getElementDirection(el); boardelement &o=editorload_objects[x][y]; o.type=type; switch(direction) { case EDITORDIRECTION_UP: o.direction=EDITORDIRECTION_DOWN; break; case EDITORDIRECTION_LEFT: o.direction=EDITORDIRECTION_RIGHT; break; case EDITORDIRECTION_RIGHT: o.direction=EDITORDIRECTION_LEFT; break; default: o.direction=EDITORDIRECTION_UP; break; } o.variation=variation; return true; } bool editor_LoadGenCDR(TiXmlElement * el, editorobjecttype type, int variation=0) { int x,y; if (isObjectTypeTop(type)) { if(!getTopElementPosition(el,x,y)) return false; } else{ if(!getGroundElementPosition(el,x,y)) return false; } int round=false; el->QueryIntAttribute("round",&round); int direction = getElementDirection(el); editorcolor col=getElementColor(el); boardelement &o=editorload_objects[x][y]; o.type=type; o.color = col; o.variation=variation; o.round=round; o.direction= direction; return true; } bool editor_LoadGenCD(TiXmlElement * el, editorobjecttype type) { int x,y; if (isObjectTypeTop(type)) { if(!getTopElementPosition(el,x,y)) return false; } else{ if(!getGroundElementPosition(el,x,y)) return false; } int direction = getElementDirection(el); editorcolor col=getElementColor(el); boardelement &o=editorload_objects[x][y]; o.type=type; o.color = col; o.direction= direction; return true; } bool editor_LoadTimer(TiXmlElement * el) { int x,y; if(!getTopElementPosition(el,x,y)) return false; editorcolor col=getElementColor(el); int val=0; el->QueryIntAttribute("val",&val); int round=0; el->QueryIntAttribute("round",&round); boardelement &o=editorload_objects[x][y]; o.type=EDOT_NUMBER; o.color=col; o.round=round; o.variation=val; return true; } bool editor_LoadToggle(TiXmlElement * el) { int x,y; if(!getTopElementPosition(el,x,y)) return false; editorcolor col=getElementColor(el); int off=0; el->QueryIntAttribute("off",&off); int round=0; el->QueryIntAttribute("round",&round); boardelement &o=editorload_objects[x][y]; o.round=round; o.type=EDOT_SPECIALBLOCKS; o.color=col; o.variation=2+!off; return true; } void AssignLargeBLockVarDirFromFlags( Uint8 flags , int &variation, int &direction) { variation = 4; direction = EDITORDIRECTION_UP; //I can't think of something better, sorry. switch(flags) { case 1: variation = 0; direction = EDITORDIRECTION_UP; break; case 2: variation = 0; direction = EDITORDIRECTION_RIGHT; break; case 4: variation = 0; direction = EDITORDIRECTION_DOWN; break; case 8: variation = 0; direction = EDITORDIRECTION_LEFT; break; case 3: variation = 1; direction = EDITORDIRECTION_UP; break; case /*0b0110*/ 6: variation = 1; direction = EDITORDIRECTION_RIGHT; break; case /*0b1100*/ 12: variation = 1; direction = EDITORDIRECTION_DOWN; break; case /*0b1001*/ 9: variation = 1; direction = EDITORDIRECTION_LEFT; break; case /*0b0101*/ 5: variation = 2; direction = EDITORDIRECTION_UP; break; case /*0b1010*/ 10: variation = 2; direction = EDITORDIRECTION_RIGHT; break; case /*0b1110*/ 14: variation = 3; direction = EDITORDIRECTION_DOWN; break; case /*0b1101*/ 13: variation = 3; direction = EDITORDIRECTION_LEFT; break; case /*0b1011*/ 11: variation = 3; direction = EDITORDIRECTION_UP; break; case/* 0b0111*/ 7: variation = 3; direction = EDITORDIRECTION_RIGHT; break; case /*0b1111*/ 15: variation = 4; direction = EDITORDIRECTION_UP; break; } } bool editor_LoadLargeBlock(TiXmlElement * el) { int x,y; if(!getTopElementPosition(el,x,y)) return false; editorcolor col=getElementColor(el); const char * ptr=el->Attribute("sharededges"); if(! ptr) { ptr="UDRL"; cout << "Notice: using default edges for a large block part element\n"; } string v=ptr; Uint8 flags = 0; const char * dirs = "URDL"; for (int i=0; iAttribute("ent"); if(! ptr) { ptr="2468"; cout << "Notice: using default entrances for hiddenway element.\n"; } string v=ptr; Uint32 flags = 0; for (int i=0; i='2') && (ch<='8') ) { flags |= ( 1 << ( ch-'0') ); } else { cout << "Invalid/cannot understand entry point attributes for a tag.\n"; return false; } } boardelement &o=editorload_objects[x][y]; o.type=EDOT_ONEDIRECTION; AssignHiddenWayVarDirFromFlags( flags , o.variation, o.direction); return true; } bool loadPortalIssue = false; bool editor_LoadPortal(TiXmlElement * el) { int &x = getElementPosition_lastx; int y=-1,tx=-1,ty=-1; el->QueryIntAttribute("x", &x); el->QueryIntAttribute("y", &y); el->QueryIntAttribute("targetx", &tx); el->QueryIntAttribute("targety", &ty); if( (tx<0) || (tx>=XYE_HORZ) || (ty<0) || (ty>=XYE_VERT) ) { tx=ty=0; loadPortalIssue = true; cout<< "Notice: A tag had strange target point data, ignored"<=XYE_HORZ) || (y<0) || (y>=XYE_VERT) ) { cout <<"Bad position "<QueryIntAttribute("defcolor", &defcolor); if ( (defcolor<0) || (defcolor>=XYE_OBJECT_COLORS+1) ) { defcolor = 0; loadPortalIssue = true; cout<< "Notice: A tag had a strange/missing defcolor value. This could indicate that the level was not made by this version of the editor."<QueryIntAttribute("kind",&kind); boardelement &o=editorload_objects[x][y]; o.type=EDOT_BEAST; o.variation=kind; o.direction= direction; return true; } bool editor_LoadMagnet(TiXmlElement * el) { int x,y; if(!getTopElementPosition(el,x,y)) return false; int variation=0; el->QueryIntAttribute("kind",&variation); int direction; int horz=0; el->QueryIntAttribute("horz",&horz); if (horz) direction = EDITORDIRECTION_LEFT; else direction = EDITORDIRECTION_UP; boardelement &o=editorload_objects[x][y]; o.type=EDOT_MAGNET; o.variation=variation; o.direction= direction; return true; } bool editor_LoadGenC(TiXmlElement * el, editorobjecttype type, int variation=0) { int x,y; if (isObjectTypeTop(type)) { if(!getTopElementPosition(el,x,y)) return false; } else{ if(!getGroundElementPosition(el,x,y)) return false; } editorcolor col=getElementColor(el); boardelement &o=editorload_objects[x][y]; o.type=type; o.variation=variation; o.color = col; return true; } bool editor_LoadRattler(TiXmlElement* el) { if(el->FirstChildElement()!=NULL) { cout << "Editor is unable to edit this file, found with body elements.\n"; return false; } int x,y; if(!getTopElementPosition(el,x,y)) return false; int grow=0; el->QueryIntAttribute("grow",&grow); boardelement &o=editorload_objects[x][y]; o.direction = getElementDirection(el); o.type=EDOT_RATTLERHEAD; o.variation=grow; return true; } bool editor_LoadEarth(TiXmlElement* el) { int x,y; if(!getTopElementPosition(el,x,y)) return false; int round=false; el->QueryIntAttribute("round",&round); boardelement &o=editorload_objects[x][y]; o.type=EDOT_EARTH; o.round = (int)round; return true; } bool editor_LoadColorDoor(TiXmlElement* el, int closedvariation) { int x,y; if(!getGroundElementPosition(el,x,y)) return false; int open=0; el->QueryIntAttribute("open",&open); boardelement &o=editorload_objects[x][y]; o.color=getElementColor(el); o.variation = closedvariation+open; o.type=EDOT_COLORSYSTEM; return true; } bool editor_LoadFactory(TiXmlElement* el) { int x,y,kind=0; if(!getTopElementPosition(el,x,y)) return false; el->QueryIntAttribute("kind",&kind); int round=false; el->QueryIntAttribute("round",&round); boardelement &o=editorload_objects[x][y]; o.direction = getElementDirection(el); o.color = getElementColor(el); o.round = round; switch (kind) { case 0: case 1: case 2: o.variation = kind; o.type = EDOT_COLORFACTORY; break; case 4: o.variation = 3; o.type = EDOT_COLORFACTORY; break; case 8: o.variation = 4; o.type = EDOT_COLORFACTORY; break; case 7: o.variation = 14; o.type = EDOT_DANGERFACTORY; break; case 6: o.variation = 15; o.type = EDOT_DANGERFACTORY; break; case 3: o.variation = 16; o.type = EDOT_DANGERFACTORY; break; default: el->QueryIntAttribute("beastkind", &o.variation); o.type = EDOT_DANGERFACTORY; } return true; } bool editor_LoadBlock(TiXmlElement* el) { int x = errorPositions.size(); editorcolor col; if( ! editor_LoadGenRC(el,EDOT_BLOCK, 0, &col)) { return false; } if (x != errorPositions.size() ){ errorPositions.resize( std::max(0, (int)errorPositions.size()-1) ); //handle special block above marked area case. int x, y; if(! getTopElementPosition(el, x , y, true) ) return false; boardelement &o1=editorload_objects[x][y]; o1.type = EDOT_COLORSYSTEM; if (o1.color != col ) { cout<<"The editor cannot yet load a block on top of a marked area of a different color."; errorPositions.push_back( make_pair(x,y) ); //return false; } o1.variation = 6; } return true; } bool editor_LoadHint(TiXmlElement* el) { int x,y; if(!getGroundElementPosition(el,x,y)) return false; boardelement &o=editorload_objects[x][y]; o.type = EDOT_HINT; const char * ch = el->GetText(); if (ch != NULL) { o.hint = ch; } else { o.hint = ""; } return true; } bool editor_LoadWildCardBlock(TiXmlElement* el) { int x = errorPositions.size(); if( ! editor_LoadGenR(el,EDOT_BLOCK,0, EDCO_WILD ) ) { return false; } if (x != errorPositions.size() ){ errorPositions.resize( std::max(0, (int)errorPositions.size()-1) ); //handle special block above marked aread case. int x, y; if(! getTopElementPosition(el, x , y, true) ) return false; boardelement &o1=editorload_objects[x][y]; /*if((o1.type != EDOT_COLORSYSTEM) || (o1.variation!=4)) return false;*/ o1.type = EDOT_COLORSYSTEM; o1.variation = 7; } return true; } bool editor_LoadObjects(TiXmlElement* el) { TiXmlElement * ch=el->FirstChildElement(); while(ch!=NULL) { string v=ch->Value(); if (v=="wall") { if (! editor_LoadWall(ch)) return false;} else if (v=="roundwall") { if (! editor_LoadWall(ch,true)) return false;} else if (v=="gem") { if (! editor_LoadGem(ch)) return false;} else if (v=="block") { if (! editor_LoadBlock(ch) ) return false;} else if (v=="clocker") { if (! editor_LoadGenRC(ch,EDOT_TURNER)) return false;} else if (v=="aclocker") { if (! editor_LoadGenRC(ch,EDOT_TURNER,1)) return false;} else if (v=="arrow") { if (! editor_LoadGenCDR(ch,EDOT_SPECIALBLOCKS,0)) return false; } else if (v=="scroll") { if (! editor_LoadGenCDR(ch,EDOT_SPECIALBLOCKS,1)) return false; } else if (v=="auto") { if (! editor_LoadGenCDR(ch,EDOT_ARROWMAKER,0)) return false; } else if (v=="sniper") { if (! editor_LoadGenCDR(ch,EDOT_ARROWMAKER,2)) return false; } else if (v=="filler") { if (! editor_LoadGenCDR(ch,EDOT_ARROWMAKER,1)) return false; } else if (v=="pusher") { if (! editor_LoadGenCD(ch,EDOT_PUSHER)) return false; } else if (v=="earth") { if (! editor_LoadEarth(ch)) return false;} else if (v=="gemblock") { if (! editor_LoadGenC(ch,EDOT_GEMBLOCK)) return false; } else if (v=="magnet") { if (! editor_LoadMagnet(ch)) return false; } else if (v=="blacky") { if (! editor_LoadGen(ch,EDOT_HAZARD,0)) return false; } else if (v=="mine") { if (! editor_LoadGen(ch,EDOT_HAZARD,1)) return false; } else if (v=="beast") { if (! editor_LoadBeast(ch)) return false; } else if (v=="teleport") { if (! editor_LoadGenD(ch,EDOT_TELEPORT)) return false; } else if (v=="bot") { if (! editor_LoadGen(ch,EDOT_BOT,0)) return false; } else if (v=="star") { if (! editor_LoadStar(ch)) return false;} else if (v=="rfood") { if (! editor_LoadGen(ch,EDOT_FOOD,0)) return false; } else if (v=="wild") { if (! editor_LoadWildCardBlock(ch) ) return false; } else if (v=="metalblock") { if (! editor_LoadGenR(ch,EDOT_BLOCK,0 , EDCO_METAL )) return false; } else if (v=="window") { if (! editor_LoadGenC(ch,EDOT_COLORSYSTEM,5)) return false; } else if (v=="lock") { if (! editor_LoadGenC(ch,EDOT_KEYSYSTEM,1)) return false; } else if (v=="key") { if (! editor_LoadGenC(ch,EDOT_KEYSYSTEM,0)) return false; } else if (v=="timer") { if (! editor_LoadTimer(ch)) return false; } else if (v=="toggle") { if (! editor_LoadToggle(ch)) return false; } else if (v=="lblock") { if (! editor_LoadGenRC(ch,EDOT_SPECIALBLOCKS,4)) return false;} else if (v=="surprise") { if (! editor_LoadGenRC(ch,EDOT_SPECIALBLOCKS,5)) return false;} else if (v=="rattler") { if (! editor_LoadRattler(ch)) return false; } else if (v=="largeblockpart") { if (! editor_LoadLargeBlock(ch)) return false; } else if (v=="portal") { if (! editor_LoadPortal(ch)) return false; } else if (v=="factory") { if (! editor_LoadFactory(ch)) return false; } else if (v=="pit") { if (! editor_LoadGen(ch,EDOT_HAZARD,2)) return false;} else if (v=="firepad") { if (! editor_LoadGen(ch,EDOT_FIREPAD,0)) return false;} else if (v=="force") { if (! editor_LoadGenD(ch,EDOT_ONEDIRECTION,1)) return false; } else if (v=="oneway") { if (! editor_LoadGenDOpposite(ch,EDOT_ONEDIRECTION,0)) return false; } else if (v=="hiddenway") { if (! editor_LoadHiddenWay(ch)) return false; } else if (v=="blockdoor") { if (! editor_LoadColorDoor(ch, 0)) return false; } else if (v=="blocktrap") { if (! editor_LoadColorDoor(ch, 2)) return false; } else if (v=="marked") { if (! editor_LoadGenC(ch,EDOT_COLORSYSTEM,4)) return false; } else if (v=="hint") { if (! editor_LoadHint(ch)) return false; } else { cout << "Editor-incompatible object: "<NextSiblingElement(); } return true; } bool editor_LoadXye(TiXmlElement* el) { int x,y; int lives=1; el->QueryIntAttribute("lives",&lives); el->QueryIntAttribute("x",&editorload_xyex); el->QueryIntAttribute("y",&editorload_xyey); x = editorload_xyex = max(0, min(XYE_HORZ-1, editorload_xyex) ); y = editorload_xyey = max(0, min(XYE_VERT-1, editorload_xyey) ); boardelement &o=editorload_objects[x][y]; o.type=EDOT_XYE; o.variation= lives-1; return true; } void loadKyeChar( char ch, boardelement & o , int x) { o.type = EDOT_NONE; o.variation = 0; o.color = EDCO_YELLOW; o.direction = 0; o.round = false; int timer = -1; switch(ch) { case 'K': o.type = EDOT_XYE; o.variation = 3; break; case 'e': o.type = EDOT_EARTH; break; case '5': o.type = EDOT_WALL; o.variation = editorload_defaultwall; break; case('1'): case('2'): case('3'): case('4'): case('6'): case('7'): case('8'): case('9'): o.type = EDOT_WALL; o.round = true; o.variation = editorload_defaultwall; break; case 'b': o.type = EDOT_BLOCK; o.color = EDCO_YELLOW; break; case 'B': o.type = EDOT_BLOCK; o.color = EDCO_YELLOW; o.round = true; break; case '*': o.type = EDOT_GEM; o.color = EDCO_BLUE; break; case 'E': o.type = EDOT_BEAST; o.variation = (int)BT_GNASHER; break; case 'C': o.type = EDOT_BEAST; o.variation = (int)BT_BLOB; break; case '~': o.type = EDOT_BEAST; o.variation = (int)BT_VIRUS; break; case '[': o.type = EDOT_BEAST; o.variation = (int)BT_SPIKE; break; case 'T': o.type = EDOT_BEAST; o.variation = (int)BT_TWISTER; break; case '/': o.type = EDOT_BEAST; o.variation = (int)BT_DARD; break; case 's': o.type = EDOT_MAGNET; o.direction = EDITORDIRECTION_UP; break; case 'S': o.type = EDOT_MAGNET; o.direction = EDITORDIRECTION_RIGHT; break; case ('}'): timer = (3); break; case ('|'): timer = (4); break; case ('{'): timer = (5); break; case ('z'): timer = (6); break; case ('y'): timer = (7); break; case ('x'): timer = (8); break; case ('w'): timer = (9); break; case 'H': o.type = EDOT_HAZARD; break; case 'l': case'r': case'u': case'd': o.type = EDOT_SPECIALBLOCKS; o.variation = 0; o.color = EDCO_YELLOW; switch (ch) { case 'r': o.direction=EDITORDIRECTION_RIGHT; break; case 'l': o.direction=EDITORDIRECTION_LEFT; break; case 'u': o.direction=EDITORDIRECTION_UP; break; case 'd': o.direction=EDITORDIRECTION_DOWN; break; } break; case '<': case'>': case'^': case'v': o.type = EDOT_SPECIALBLOCKS; o.variation = 0; o.color = EDCO_YELLOW; o.round = true; switch (ch) { case '<': o.direction=EDITORDIRECTION_LEFT; break; case '>': o.direction=EDITORDIRECTION_RIGHT; break; case '^': o.direction=EDITORDIRECTION_UP; break; case 'v': o.direction=EDITORDIRECTION_DOWN; break; } break; case 'L': case'R': case'U': case'D': o.type = EDOT_PUSHER; o.color = EDCO_YELLOW; switch (ch) { case 'R': o.direction=EDITORDIRECTION_RIGHT; break; case 'L': o.direction=EDITORDIRECTION_LEFT; break; case 'U': o.direction=EDITORDIRECTION_UP; break; case 'D': o.direction=EDITORDIRECTION_DOWN; break; } break; case 'A': case 'F': o.round = ( ch == 'F' ); o.color = EDCO_YELLOW; o.type = EDOT_ARROWMAKER; switch (x%4) { case 0: o.direction = EDITORDIRECTION_RIGHT ; break; case 1: o.direction = EDITORDIRECTION_UP ; break; case 2: o.direction = EDITORDIRECTION_LEFT ; break; case 3: o.direction = EDITORDIRECTION_DOWN ; break; } break; case 'a': case 'c': o.type = EDOT_TURNER; o.color = EDCO_YELLOW; o.variation = (ch == 'c'); break; case 'f': case'g': case'h': case'i': o.type = EDOT_ONEDIRECTION; o.variation = 0; switch (ch) { case 'g': o.direction=EDITORDIRECTION_LEFT; break; case 'f': o.direction=EDITORDIRECTION_RIGHT; break; case 'h': o.direction=EDITORDIRECTION_DOWN; break; case 'i': o.direction=EDITORDIRECTION_UP; break; } break; case 'P': case 'p': //Skye's sticky o.type = EDOT_MAGNET; o.variation = 1; o.direction = ( (ch == 'P') ? EDITORDIRECTION_RIGHT : EDITORDIRECTION_UP ); break; case '!': //Skye's bomb o.type = EDOT_SPECIALBLOCKS; o.variation = 5; o.color = EDCO_RED; break; case 'O': //Skye's pit o.type = EDOT_HAZARD; o.variation = 2; break; case '(': case')': case'_': case'\'': //Kye 3.0's teleport o.type = EDOT_TELEPORT; o.variation = 0; switch (ch) { case ')': o.direction=EDITORDIRECTION_LEFT; break; case '(': o.direction=EDITORDIRECTION_RIGHT; break; case '\'': o.direction=EDITORDIRECTION_DOWN; break; case '_': o.direction=EDITORDIRECTION_UP; break; } break; case 'o': //Xye mine o.type = EDOT_HAZARD; o.variation = 1; break; case '$': //Xye emerald o.type = EDOT_GEM; o.color = EDCO_GREEN; break; case '@': //Xye green gem block o.type = EDOT_GEMBLOCK; o.color = EDCO_GREEN; break; case '#': //Xye yellow marked area o.type = EDOT_COLORSYSTEM; o.color = EDCO_YELLOW; o.variation = 4; break; case '%': //Xye yellow door o.type = EDOT_COLORSYSTEM; o.color = EDCO_YELLOW; o.variation = 0; break; case '=': //Xye yellow door o.type = EDOT_COLORSYSTEM; o.color = EDCO_YELLOW; o.variation = 1; break; case 'Q': case 'q': //Xye's antimagnet o.type = EDOT_MAGNET; o.variation = 2; o.direction = ( (ch == 'Q') ? EDITORDIRECTION_RIGHT : EDITORDIRECTION_UP ); break; case '.': case ',': o.type = EDOT_SPECIALBLOCKS; o.color = EDCO_YELLOW; o.round = (ch == ','); o.variation = 4; break; case ':': case ';': //In hindsight, I am not really sure why I added // so many extensions to Kye's format o.type = EDOT_SPECIALBLOCKS; o.variation = 5; o.color = EDCO_BLUE; o.round = (ch == ';'); break; case '-': case '+': o.type = EDOT_SPECIALBLOCKS; o.variation = ((ch=='-')?2:3); o.color = EDCO_YELLOW; break; case '?': o.type = EDOT_BOT; break; case 'M': o.type = EDOT_WALL; o.variation = 4; break; case '"': //do nothing break; } if (timer != -1) { o.type = EDOT_NUMBER; o.color = EDCO_YELLOW; o.variation = timer; } } map editorload_palette; bool editor_LoadPalette(TiXmlElement* el) { editorload_palette.clear(); TiXmlElement * ch=el->FirstChildElement(); while(ch!=NULL) { string v=ch->Value(); if (v=="color") { int r,g,b; ch->QueryIntAttribute("red", &r); ch->QueryIntAttribute("green", &g); ch->QueryIntAttribute("blue", &b); SDL_Color c; c.r = r; c.b = b; c.g = g; const char* nam = ch->Attribute("id"); if (nam == NULL) { return false; } editorload_palette[nam] = c; } ch=ch->NextSiblingElement(); } return true; } bool editor_LoadDefault(TiXmlElement* el, DefaultColorData& cd) { const char* id = el->Attribute("color"); if (id == NULL) { return true; } string key = id; if (editorload_palette.find(key) == editorload_palette.end() ) { return true; } SDL_Color c = editorload_palette[key]; cd.useDefault =false; cd.color =c; return true; } bool editor_LoadDefaults(TiXmlElement* el) { TiXmlElement * ch=el->FirstChildElement(); while(ch!=NULL) { string v=ch->Value(); if (v=="wall") { if (! editor_LoadDefault(ch, editorload_colors[EDITOR_COLOR_WALLS]) ) { return false; } int x = -1; ch->QueryIntAttribute("type", &x); if (x!=-1) { editorload_defaultwall = x; } } if (v=="earth") { if (! editor_LoadDefault(ch, editorload_colors[EDITOR_COLOR_EARTH]) ) { return false; } } if (v=="oneway" || v=="trick" || v=="hiddenway" ) { if (! editor_LoadDefault(ch, editorload_colors[EDITOR_COLOR_DOORS]) ) { return false; } } if (v=="force") { if (! editor_LoadDefault(ch, editorload_colors[EDITOR_COLOR_FORCE]) ) { return false; } } ch=ch->NextSiblingElement(); } return true; } bool editor_LoadFloor(TiXmlElement* el) { TiXmlElement * ch=el->FirstChildElement(); while(ch!=NULL) { string v=ch->Value(); if (v=="area") { int x1=400,x2=400,y1=400,y2=400; ch->QueryIntAttribute("x1",&x1); ch->QueryIntAttribute("y1",&y1); if (x1==400) { ch->QueryIntAttribute("x",&x1); ch->QueryIntAttribute("y",&y1); } ch->QueryIntAttribute("x2",&x2); ch->QueryIntAttribute("y2",&y2); if (x1 != 0 || x2 != 29 || y1 != 0 || y2 != 19 ) { return true; } if (! editor_LoadDefault(ch, editorload_colors[EDITOR_COLOR_FLOOR]) ) { return false; } } else { return false; } ch=ch->NextSiblingElement(); } return true; } void editorload_loadKyeLevel(const KyeLevel& klv) { editor::board->hint = klv.lhint; editor::board->title = klv.name; editor::board->bye = klv.bye; editor::board->solution = ""; editor::board->xye_x = 0; editor::board->xye_y = 0; for (int i=0; icolors[i]; cd.useDefault = true; } for (int i=0;iobjects[i][XYE_VERT - j - 1], i ); if ( klv.data[i][j] == 'K' ) { editor::board->xye_x = i; editor::board->xye_y = XYE_VERT - j - 1; } } for (int i=0; iportal_x[i][j] = -1, editor::board->portal_y[i][j] = -1; } } } bool editor::load_kye() { vector levels; string s = KyeLevelPack::LoadForEditor(filename.c_str(), levels); if (s != "") { loadError = s; return false; } editorboard::ResetLevels(true); editorboard::filetitle = filename; editorboard::description = ""; editorboard::author = ""; for (int k=0; kobjects[i][XYE_VERT-j-1]; } for (int i=0; iportal_x[i][j], editorload_portal_y[i][j] = XYE_VERT-editor::board->portal_y[i][j]-1; } } editorload_xyex = editor::board->xye_x; editorload_xyey = XYE_VERT - editor::board->xye_y - 1; return true; } bool editor::appendLevels(const string file) { loadPortalIssue = false; loadError = ""; cout<<"Attempt to append file: "<)\n"; loadError="The level file is invalid (missing tag)"; return false; } level=pack->FirstChildElement("level"); bool colorWarn = false; bool errorsWarn = false; bool hiddenSolutionWarn = false; int tn = 0; while(level!=NULL) { string ltitle=filename_name,lhint="",lbye="",lsolution=""; int i,j; editorload_xyex=-1; editorload_defaultwall = 0; for (int i=0; iFirstChildElement(); while (el!=NULL) { string v=el->Value(); if (v=="objects" ||v=="ground" || v=="normal") { if(!editor_LoadObjects(el)) return false; } else if (v=="xye") { if(! editor_LoadXye(el)) { loadError="Invalid tag in the level file."; return false; } } else if (v=="title" || v=="name") { const char* gt=el->GetText(); ltitle= ( (gt!=NULL) ? gt : ""); } else if (v=="hint") { const char* gt=el->GetText(); lhint= ( (gt!=NULL) ? gt : ""); } else if (v=="bye") { const char* gt=el->GetText(); lbye= ( (gt!=NULL) ? gt : ""); } else if ( (v=="solution") ||(v=="hiddensolution") ) { const char* gt=el->GetText(); lsolution= ( (gt!=NULL) ? gt : ""); if (v == "hiddensolution") { hiddenSolutionWarn = true; } } else if (v=="kyeformat") { if ( ! load_KyeFormat(el) ) { loadError = "There were issues while loading a tag."; return false; } } else { if ( v!="palette" && v!="floor" && v!="default") { cout << "Editor-incompatible child: "< that is incompatible with the level editor. Had to stop loading, sorry."; return false; } else { if (v=="palette") { if ( ! editor_LoadPalette(el) ) { return "There were issues while loading a tag"; } } if (v=="default") { if ( ! editor_LoadDefaults(el) ) { return "There were issues while loading a tag"; } } //colorWarn = true; if (v=="floor") { if (! editor_LoadFloor(el) ) { return "There were issues while loading a tag."; } } } } el=el->NextSiblingElement(); } if(editorload_xyex==-1) { cout << "Notice: Unable to find xye in the level file.\n"; } cout << "Level loaded successfully.\n"; for (int i=0; icolors[i] = editorload_colors[i]; } for (i=0;iobjects[i][XYE_VERT-j-1]=editorload_objects[i][j]; } for (int i=0; iportal_x[i][j] = editorload_portal_x[i][j], editor::board->portal_y[i][j] = XYE_VERT-editorload_portal_y[i][j]-1; } } if (errorPositions.size() != 0) { errorsWarn = true; for (int i=0; i p = errorPositions[i]; editor::board->objects[p.first][XYE_VERT-p.second-1].type = EDOT_ERROR; } errorPositions.resize(0); } editor::board->xye_x = editorload_xyex; editor::board->xye_y = XYE_VERT-editorload_xyey-1; editor::board->hint = lhint; editor::board->title = ltitle; editor::board->bye = lbye; editor::board->solution = lsolution; editorboard::SaveAtLevelNumber(editor::board, n); n++; tn++; level=level->NextSiblingElement("level"); } if(tn==0) { cout<<"Not a valid .xye file (missing )\n"; loadError="The level file is invalid (missing tag)"; return false; } cout<= 4) { string ext = filename.substr(len-4); if( (ext==".kye" || ext==".KYE") ) { return editor::load_kye(); } } } editorboard::ResetLevels(true); TiXmlDocument fil(filename.c_str()); if (fil.LoadFile()) { string lauthor="xyedit",ldescription="Generated by xyedit"; string lname=filename_name; cout<<"Correctly loaded XML file.\n"; TiXmlElement* pack, *el, *level; pack=fil.FirstChildElement("pack"); if (pack==NULL) { cout<<"Not a valid .xye file (missing )\n"; loadError="The level file is invalid (missing tag)"; return false; } el=pack->FirstChildElement("author"); if (el!=NULL) { const char* gt=el->GetText(); lauthor= (gt!=NULL ? gt : ""); } el=pack->FirstChildElement("description"); if (el!=NULL) { const char* gt=el->GetText(); ldescription= (gt!=NULL ? gt : ""); } el=pack->FirstChildElement("name"); if (el!=NULL) { const char* gt=el->GetText(); lname = (gt!=NULL ? gt : ""); } editorboard::description = ldescription; editorboard::author = lauthor; editorboard::filetitle = lname; if ( ! appendLevels(filename) ) { return false; } return true; } else { cout<<"Unable to load level file.\n"; cout<<"\t"<makeDefaultLevel(); updateCountRelated(); return true; } loadError="Xyedit was unable to open the level file."; } else loadError="There are errors in the XML structure of the file: "+string(fil.ErrorDesc()); return false; } return true; } xye-0.12.2+dfsg/src/editorsave.cpp000066400000000000000000000452641225403634500167770ustar00rootroot00000000000000#include "xyedit.h" #include #include #include #include "xye.h" using std::pair; using std::max_element; void saveColor(std::ofstream &file,boardelement &o,bool allownocolor=false) { if(allownocolor && (o.color==EDCO_WHITE)) file << "nocolor='1' "; else switch(o.color) { case EDCO_BLUE: file<<"bc='B' "; break; case EDCO_YELLOW: file<<"bc='Y' "; break; case EDCO_RED: file<<"bc='R' "; break; case EDCO_PURPLE: file<<"bc='P' "; break; default: file<<"bc='G' "; break; } } void saveDirection(std::ofstream &file,boardelement &o) { switch(o.direction) { case EDITORDIRECTION_UP: file<<"dir='U' "; break; case EDITORDIRECTION_DOWN: file<<"dir='D' "; break; case EDITORDIRECTION_RIGHT: file<<"dir='R' "; break; default: file<<"dir='L' "; break; } } void saveOppositeDirection(std::ofstream &file,boardelement &o) { switch(o.direction) { case EDITORDIRECTION_UP: file<<"dir='D' "; break; case EDITORDIRECTION_DOWN: file<<"dir='U' "; break; case EDITORDIRECTION_RIGHT: file<<"dir='L' "; break; default: file<<"dir='R' "; break; } } void saveRound(std::ofstream &file,boardelement &o) { if(o.round) file << "round='1' "; } int savePosition_lastx = -1; void resetSavedPosition() { savePosition_lastx = -1; } void savePosition(std::ofstream &file, int x ,int y) { if(x!=savePosition_lastx) { file << "x='"<"; } void saveColorFactory(std::ofstream &file, boardelement &o, int x ,int y) { file <<""; } void saveDangerFactory(std::ofstream &file, boardelement &o, int x ,int y) { file <<""; } int defaultWallVariation = 0; void saveNormalObject(std::ofstream &file, boardelement &o, int x, int y) { switch(o.type) { case EDOT_NONE : return; //nothing to do case EDOT_BLOCK: switch(o.color) { case EDCO_METAL: file<<"\t\t\n"; break; case EDCO_WILD: file<<"\t\t\n"; break; default: file<<"\t\t\n"; } break; case EDOT_GEM: if(o.color == EDCO_PURPLE) { file<<"\t\t\n"; } else { file<<"\t\t\n"; } break; case EDOT_WALL: file<<"\t\tupdateWallMem(x,XYE_VERT-y-1); if(o.r1mem) file << "round1='1' "; if(o.r7mem) file << "round7='1' "; if(o.r3mem) file << "round3='1' "; if(o.r9mem) file << "round9='1' "; } if(o.variation != defaultWallVariation) file << "type='"<\n"; break; case EDOT_TURNER: file<<"\t\t<"; if(o.variation) file<<"aclocker "; else file << "clocker "; savePosition(file,x,y); saveRound(file,o); saveColor(file,o,true); file<<"/>\n"; break; case EDOT_GEMBLOCK: file<<"\t\t\n"; break; case EDOT_EARTH: file << "\t\t\n"; break; case EDOT_MAGNET: file << "\t\t\n"; break; case EDOT_PUSHER: file << "\t\t\n"; break; case EDOT_ARROWMAKER: file<<"\t\t<"; if(o.variation==0) file << "auto "; else if(o.variation==2) file << "sniper "; else if(o.variation==1) file << "filler "; savePosition(file,x,y); saveDirection(file,o); saveColor(file,o); saveRound(file,o); file<<"/>\n"; break; case EDOT_HAZARD: if(o.variation==2) break; file<<"\t\t<"; if(o.variation==0) file << "blacky "; else if(o.variation==1) file << "mine "; savePosition(file,x,y); file<<"/>\n"; break; case EDOT_BEAST: file<<"\t\t\n"; break; case EDOT_TELEPORT: file<<"\t\t\n";break; case EDOT_COLORSYSTEM: if(o.variation==5) //window block: { file<<"\t\t\n"; } else if(o.variation==6) //block on top of area { file<<"\t\t\n"; } else if (o.variation==7) { //wildcard block on top of area file<<"\t\t\n"; } break; case EDOT_BOT: file<<"\t\t\n"; break; case EDOT_KEYSYSTEM: file<<"\t\t<"; if(o.variation) file<<"lock "; else file<<"key "; savePosition(file,x,y); saveColor(file,o); file << "/>\n"; break; case EDOT_NUMBER: file<<"\t\t\n"; break; case EDOT_SPECIALBLOCKS: file<<"\t\t<"; if (o.variation==0) { file<<"arrow "; saveDirection(file,o); } else if (o.variation==1) { file<<"scroll "; saveDirection(file,o); } else if(o.variation<=3) { if( o.variation==2) file << "toggle off='1' "; else file << "toggle "; } else if (o.variation==4) file << "lblock "; else file << "surprise "; savePosition(file,x,y); saveColor(file,o); saveRound(file,o); file << "/>\n"; break; case EDOT_RATTLERHEAD: file<<"\t\t\n"; break; case EDOT_FOOD: file<<"\t\t\n"; break; case EDOT_LARGEBLOCK: file<<"\t\t"; saveLargeBlock(file, o, x,y); file<<"\n"; break; case EDOT_COLORFACTORY: file<<"\t\t"; saveColorFactory(file,o,x,y); file<<"\n"; break; case EDOT_DANGERFACTORY: file<<"\t\t"; saveDangerFactory(file,o,x,y); file<<"\n"; break; case EDOT_PORTAL: // Do nothing. break; } } void savePortals(std::ofstream &file, editorboard *board) { for (int i=0; iportal_x[i][0] != -1) { int x = board->portal_x[i][0]; int y = board->portal_y[i][0]; int tx = board->portal_x[i][1]; int ty = board->portal_y[i][1]; if(tx<0) tx=0; if(ty<0) ty=0; file<<"\t\t\n"; if(board->objects[tx][ty].variation == 1) { file<<"\t\t\n"; } } } void saveGroundObject(std::ofstream &file,boardelement &o, int x, int y) { switch(o.type) { case EDOT_NONE : return; //nothing to do case EDOT_HAZARD: if(o.variation!=2) break; file<<"\t\t\n"; break; case EDOT_FIREPAD: file<<"\t\t\n"; break; case EDOT_ONEDIRECTION: if (o.variation >= 2) { file<<"\t\t\n"; break; case EDOT_COLORSYSTEM: if(o.variation==5) break; file << "\t\t<"; switch(o.variation) { case 0 /*closed door*/: file<<"blockdoor ";break; case 1 /*open door*/: file<<"blockdoor open='1' ";break; case 2 /*closed trap*/: file<<"blocktrap ";break; case 3 /*open trap*/: file<<"blocktrap open='1' ";break; case 4 /*marked area*/: file<<"marked ";break; case 6 /*block above area*/: file<<"marked "; break; case 7 /*wildcard above area*/: file<<"marked "; break; } savePosition(file,x,y); saveColor(file,o); file<<"/>\n"; break; case EDOT_HINT: file << "\t\t"<"; break; } } bool editor::save() { if (save(filename, false)) { SavedFile=true; return true; } dialogs::makeMessageDialog(editorwindow, string("Unable to save the level file, cannot rewrite ")+string(filename)+".","Ok",onDialogClickDoNothing); return false; } void saveDefault( std::ofstream & file, string tag, editorboard*board, int i) { DefaultColorData &cd = board->colors[i]; if (! cd.useDefault) { file<<" <"<" < variationCount[MAX_WALL_VARIATIONS]; for (int i=0; iobjects[i][j].type == EDOT_WALL ) { variationCount[board->objects[i][j].variation].first++; } } } defaultWallVariation = max_element(variationCount, variationCount + MAX_WALL_VARIATIONS)->second; file<<" colors[EDITOR_COLOR_WALLS]; if (! cd.useDefault ) { file<<" color='"<<(EDITOR_COLOR_WALLS+1)<<"' "; } file << " />" <colors[i].useDefault ); } if (doit) { //first save the palette. file<<" "<colors[i]; if ( ! cd.useDefault ) { file << " "<"<"<"<colors[EDITOR_COLOR_FLOOR].useDefault) { file <<" "<\n"; file << "\n"<< StripXML(editorboard::filetitle) <<""<< StripXML(editorboard::author) <<"\n"<< StripXML(editorboard::description) <<"\n"; for (int i=first; i\n"; file << ""<< StripXML(board->title) <<"\n"; if(board->hint!="") { file << ""<< StripXML(board->hint) <<"\n"; } if(board->solution!="") { file << ""<< StripXML(board->solution) <<"\n"; } if(board->bye!="") { file << ""<< StripXML(board->bye) <<"\n"; } saveColorStuff(file, board); int j; file << "\t\n"; resetSavedPosition(); for (i=0;iobjects[i][j],i,XYE_VERT-j-1); file << "\t\n"; file << "\t\n"; resetSavedPosition(); for (i=0;iobjects[i][j],i,XYE_VERT-j-1); } savePortals( file, editor::board); file << "\t\n"; if(editor::board->xye_x>=0) { resetSavedPosition(); file << "\t\n"; } file << "\n"; if (onlyOneLevel) break; } file << "\n"; editorboard::LoadLevelNumber(board, oldcur); file.close(); return true; } xye-0.12.2+dfsg/src/font.cpp000066400000000000000000000340561225403634500155750ustar00rootroot00000000000000/* Xye License (it is a PNG/ZLIB license) Copyright (c) 2006 Victor Hugo Soliz Kuncar This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. 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 appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. */ #include "font.h" #include #include "gen.h" static Uint32 GetPixel(SDL_Surface *Surface, Sint32 X, Sint32 Y) { Uint8 *bits; Uint32 Bpp; X=(X>=0)?X:-X; X=(Xw)?X:Surface->w; Bpp = Surface->format->BytesPerPixel; bits = ((Uint8 *)Surface->pixels)+Y*Surface->pitch+X*Bpp; // Get the pixel switch(Bpp) { case 1: return *((Uint8 *)Surface->pixels + Y * Surface->pitch + X); break; case 2: return *((Uint16 *)Surface->pixels + Y * Surface->pitch/2 + X); break; case 3: { // Format/endian independent Uint8 r, g, b; r = *((bits)+Surface->format->Rshift/8); g = *((bits)+Surface->format->Gshift/8); b = *((bits)+Surface->format->Bshift/8); return SDL_MapRGB(Surface->format, r, g, b); } break; case 4: return *((Uint32 *)Surface->pixels + Y * Surface->pitch/4 + X); break; } return 0xF0000000; } #ifndef NOTRUETYPE void Font::fontinit(const char* truetype,int size, Uint8 R, Uint8 G, Uint8 B) { tex=NULL; ttf=TTF_OpenFont(truetype,size); ttfcol.r=R; ttfcol.g=G; ttfcol.b=B; } Font::Font(const char* truetype,int size, Uint8 R, Uint8 G, Uint8 B) { fontinit(truetype,size,R,G,B); } Font::Font(const char* truetype,int size, SDL_Color& color) { fontinit(truetype,size, color.r, color.g, color.b); } #else Font::Font(const char* truetype,int size, Uint8 R, Uint8 G, Uint8 B) { fprintf(stderr,"Error: No truetype support but truetype font requested by skin file.\n"); throw 1; } Font::Font(const char* truetype,int size, SDL_Color& color) { fprintf(stderr,"Error: No truetype support but truetype font requested by skin file.\n"); throw 1; } #endif //nottf void Font::fontinit(SDL_Surface* surface, Uint8 R, Uint8 G, Uint8 B) { ttf=NULL; int x = 0, i = 0, j; Uint32 pixel; Uint32 pink; if (surface==NULL) { fprintf(stderr,"Couldn't initialize font."); throw ("Couldn't initialize font."); } int w=surface->w,h=surface->h; tex = CreateFixedRGBASurface(0, w,h); SDL_LockSurface(surface); SDL_LockSurface(tex); SDL_PixelFormat* surform=surface->format; pink = SDL_MapRGB(surform, 255, 0, 255); while (x < w) { if (GetPixel(surface, x, 0) == pink) { CharPos[i++]=x; while((x < w) && (GetPixel(surface, x, 0)== pink)) x++; CharPos[i++]=x; } x++; } MaxPos = x-1; Uint8 rd=0,g=0,b=0,a=0; FixedRGBA c; c.r=R; c.g=G; c.b=B; c.a=175; Uint32* c_Uint32 = (Uint32*)(&c); FixedRGBA* X; Uint8* Calpha= &(c.a); Uint32* pixels = (Uint32*)(tex->pixels); for (i=0;ih - 1; Sint16 sw=Surface->w; Sint16 sh=Surface->h; int ox=x; int tw; for(c = text; (*c != '\0') && (x <= sw) && (y<=sh) ; c++) { charoffset = ((int) (*c - 33)) * 2 + 1; // skip spaces and nonprintable characters if (*c == '\n') { x=ox; y+=fh; dstrect.y=y; continue; } if (*c == ' ' || charoffset < 0 || charoffset > MaxPos) { x += CharPos[2]-CharPos[1]; continue; } tw=srcrect.w = dstrect.w = (CharPos[charoffset+2] + CharPos[charoffset+1])/2 - (CharPos[charoffset] + CharPos[charoffset-1])/2; srcrect.x = (CharPos[charoffset]+CharPos[charoffset-1])/2; dstrect.x = int(x - (CharPos[charoffset] - CharPos[charoffset-1]) /2.0); if (x+tw>=0) { if(recolor) SDL_BlitSurface(tex, &srcrect, Surface, &dstrect, r,g,b,alpha); else SDL_BlitSurface(tex, &srcrect, Surface, &dstrect); } x += CharPos[charoffset+1] - CharPos[charoffset]; } } bool IsNormalChar(const char &a) { return (((a>='0') && (a<='9')) || ((a>='a') && (a<='z')) || ((a>='A') && (a<='Z'))); } void Font::WriteWrap(SDL_Surface* Surface, int x, int y, int w, int h,const char* text) const { char word[25]; int wi,autoprint; const char* c; int charoffset; unsigned int fh=Height(); SDL_Rect srcrect, dstrect; if(text == NULL) return; // these values won't change in the loop srcrect.y = 1; dstrect.y = y; dstrect.h = fh - 1; Sint16 sw=Surface->w; Sint16 sh=Surface->h; sw= swsh) break; const char*aux=c; int count=0; int wordwidth=0; char tester[2]; tester[1]='\0'; while(*aux>' ') { int chw; tester[0]=*aux; TTF_SizeUTF8(ttf,tester,&chw,NULL); if(chw+wordwidth>sw) break; wordwidth+=chw; count++; aux++; } string tem; tem.resize(count); count=0; while(c=sw) && (cx!=x)) { cx=x; y+=fh; if(y>sh) break; } SDL_Surface * rendered = TTF_RenderUTF8_Blended(ttf,tem.c_str(),ttfcol); SDL_BlitSurface(rendered, 0,0, sw-x , sh-y , Surface, cx,y); SDL_FreeSurface(rendered); cx+=textwidth; } return; } #endif int ox=x; int tw; srcrect.h = (sh-y0) { if (*c=='\0') break; autoprint--; charoffset = ((int) (*c - 33)) * 2 + 1; if (*c == '\n') { x=ox; y+=fh; dstrect.y=y; srcrect.h = (sh-y MaxPos) { x += CharPos[2]-CharPos[1]; continue; } //if (x <= sw) break; //too big tw=srcrect.w = dstrect.w = (CharPos[charoffset+2] + CharPos[charoffset+1])/2 - (CharPos[charoffset] + CharPos[charoffset-1])/2; srcrect.x = (CharPos[charoffset]+CharPos[charoffset-1])/2; dstrect.x = int(x - (CharPos[charoffset] - CharPos[charoffset-1]) /2.0); if (x+tw>=sw) { dstrect.x=x=ox; y+=fh; dstrect.y=y; srcrect.h = (sh-ysh) continue; } x += CharPos[charoffset+1] - CharPos[charoffset]; if (x+tw>=0) SDL_BlitSurface(tex, &srcrect, Surface, &dstrect); } else if ( (IsNormalChar(*c)) && (wi<20)) { word[wi]=*c; wi++; word[wi]='\0'; } else { if (x+TextWidth(word)+1>=sw) { dstrect.x=x=ox; y+=fh; dstrect.y=y; srcrect.h = (sh-ysh) // continue; } autoprint=wi+1; c=c-wi-1; wi=0; word[0]='\0'; } } } std::vector Font::splitByLines(const char* text, int w) const { std::vector r; char word[25]; int wi,autoprint; int charoffset; if(text == NULL) return r; int cw=0; int tw=0; int lw=0; word[0]='\0'; wi=autoprint=0; const char * c=text; string line=""; int spc=CharWidth(' '); bool lineended=false; bool lastwasspace=false; while(true) { int chw = CharWidth(*c); if((wi>=20) || (lastwasspace&&(*c>' ')) || (*c<=' ') ) { lastwasspace=false; if (wi>0) { tw=TextWidth(word); if(lw+tw>w) { lineended=true; r.push_back(line); strcat(word," "); line=word; lw=tw; } else { line+=word; lw+=tw; } tw=0; word[0]='\0'; wi=0; } if (*c=='\n') { r.push_back(line); lw=0; line=""; } else if((*c!='\0')&&(*c<=' ')) { if(! lineended) { lastwasspace=true; word[0]=' '; word[1]='\0'; wi=1; tw=spc; } else lineended=false; } } if(*c>' ') { word[wi]=*c; tw+=chw; wi++; word[wi]='\0'; } if(*c=='\0') break; c++; } if(line!="") r.push_back(line); return r; } unsigned int Font::TextWidth(const char *text) const { #ifndef NOTRUETYPE if(ttf) { int r; TTF_SizeUTF8(ttf,text,&r,NULL); return (unsigned int)(r); } #endif const char* c; int charoffset=0; unsigned int width = 0; if(text == NULL) return 0; for(c = text; *c != '\0'; c++) { charoffset = ((int) *c - 33) * 2 + 1; // skip spaces and nonprintable characters if (*c == ' ' || charoffset < 0 || charoffset > MaxPos) { width += CharPos[2]-CharPos[1]; continue; } width += CharPos[charoffset+1] - CharPos[charoffset]; } return width; } unsigned int Font::WrappedTextHeight(const string text, int w) const { return Height() * splitByLines(text, w).size(); } unsigned int Font::Height() const { #ifndef NOTRUETYPE if(ttf) { int r; TTF_SizeUTF8(ttf,"A ",NULL,&r); return (unsigned int)(r); } #endif return tex->h - 1; } unsigned int Font::CharWidth(const char c) const { #ifndef NOTRUETYPE if(ttf) { int r; char s[2]; s[0]=c; s[1]='\0'; TTF_SizeUTF8(ttf,s,&r,NULL); return (unsigned int)(r); } #endif int charoffset = ((int)(c) - 33) * 2 + 1; if (c == ' ' || charoffset < 0 || charoffset > MaxPos) return CharPos[2]-CharPos[1]; return CharPos[charoffset+1] - CharPos[charoffset]; } void Font::WriteCenter(SDL_Surface *Surface, int y, const char *text) { Write(Surface, Surface->w/2 - TextWidth(text)/2, y, text,255,255,255,255); } xye-0.12.2+dfsg/src/font.h000066400000000000000000000035131225403634500152340ustar00rootroot00000000000000#define FONTINCLUDED 1 #include "vxsdl.h" #ifndef NOTRUETYPE #include #else struct TTF_Font{int a;}; #endif #include #include #include class Font { public: unsigned int Height() const; unsigned int TextWidth(const char* text) const; unsigned int TextWidth(const std::string text) const { return TextWidth(text.c_str()); }; unsigned int WrappedTextHeight(const std::string text, int w) const; unsigned int CharWidth(const char c) const; void Write(SDL_Surface* surface, int x, int y,const char* text, Uint8 r, Uint8 g, Uint8 b, Uint8 alpha) const; void WriteWrap(SDL_Surface* surface, int x, int y, int w, int h,const char* text) const; void WriteWrap(SDL_Surface* surface, int x, int y, int w, int h,const std::string& text) const; std::vector splitByLines(const char* s, int w) const; inline std::vector splitByLines(const std::string s, int w) const { return splitByLines(s.c_str(),w); } void WriteCenter(SDL_Surface *Surface, int y, const char *text); inline void Write(SDL_Surface* surface, int x, int y,const char* text) const { Font::Write(surface, x, y,text,255,255,255,255); } inline void Write(SDL_Surface *surface, int x, int y, const std::string& text) const { Write(surface,x,y,text.c_str()); } Font(SDL_Surface* surface, SDL_Color& color); Font(SDL_Surface* surface, Uint8 R, Uint8 G, Uint8 B); Font(const char* truetype, int size, SDL_Color& color); Font(const char* truetype, int size, Uint8 R, Uint8 G, Uint8 B); ~Font(); private: SDL_Surface *tex; TTF_Font *ttf; SDL_Color ttfcol; int CharPos[512]; int MaxPos; void fontinit(SDL_Surface* surface, Uint8 R, Uint8 G, Uint8 B); #ifndef NOTRUETYPE void fontinit(const char* truetype, int size, Uint8 R, Uint8 G, Uint8 B); #endif }; xye-0.12.2+dfsg/src/gen.cpp000066400000000000000000000112331225403634500153700ustar00rootroot00000000000000/* Xye License (it is a PNG/ZLIB license) Copyright (c) 2006 Victor Hugo Soliz Kuncar This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. 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 appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. */ #include "gen.h" #include "vxsdl.h" #include #include #include #include const float F_RAND_MAX = (float)(RAND_MAX); //Random stuff: void Randomize() { srand (time (0)); } int GetRandomInt(int min, int max) { return (int)(min+(rand() / F_RAND_MAX)*(max-min)+0.5); } template T GetRandom(T min, T max) { return (T)(min+(rand() / F_RAND_MAX)*(max-min)+0.5); } template bool doublematch(T a,T b,T c) { return((a==b) || (a==c)); } template bool doublematch(char,char,char); template char GetRandom(char,char); template double GetRandom(double,double); //For example Chance(0.5) is a 50% chance of returning true, //A Chance(0.75) has a 75% percent chance to return true. bool Chance(float x) { return ( (rand () / F_RAND_MAX) <= x); } unsigned int RandomRGB(unsigned char a,unsigned char b) { return( ( (255*256+GetRandomInt(a,b))*256 + GetRandomInt(a,b)) * 256 + GetRandomInt(a,b) ); } unsigned int RandomRGB() { return(RandomRGB(0,255)); } struct ColorStruct { unsigned char B; unsigned char G; unsigned char R; unsigned char A; }; unsigned char mixChannel(unsigned char A, unsigned char B) { if (A>B) return ( B + (unsigned char)((A-B) / 2 )); return ( A + (unsigned char)((B-A) / 2 )); } unsigned int MixColors(unsigned int A, unsigned int B) { ColorStruct *sA=(ColorStruct*)(&A); ColorStruct *sB=(ColorStruct*)(&B); ColorStruct R; R.A= ( sA->A < sB->A ? sA->A:sB->A); R.B= mixChannel(sA->B,sB->B); R.G= mixChannel(sA->G,sB->G); R.R= mixChannel(sA->R,sB->R); return *( (unsigned int *)(&R) ) ; } SDL_Color& MixColors(SDL_Color& A, SDL_Color& B) { SDL_Color* R=new SDL_Color; R->r= mixChannel(A.r,B.r); R->g= mixChannel(A.g,B.g); R->b= mixChannel(A.b,B.b); R->unused=255; return (*R); } bool TryS2I(const std::string &str, int& r) { return (sscanf(str.c_str(),"%d", &r)==1); } std::string GetFileNameNoExtension( const char* filename ) { int len= strlen(filename), k=len-1, r=len-1; while ( (k>=0) && (filename[k]!='/') && (filename[k]!='\\') ) k--; while ( (r>=0) && (filename[r]!='.') ) r--; string name; if ( r>k) name = string(filename).substr(k+1, r-k-1); else name = &(filename[k+1]); return name; } std::string StripPath( const std::string in) { int i=in.length()-1; while( i>=0 && (in[i]!='/') && (in[i]!='\\') ) { i--; } return in.substr(i+1); } bool DoesFileExist( const char* filename) { #ifdef _WIN32 std::ifstream st; st.open(filename,std::ios::in); if (st.is_open()) { st.close(); return true; } else { return false; } #else return (access(filename,0)==0); #endif } bool DoesFileExist( const string filename) { return DoesFileExist(filename.c_str()); } string StripXML(const string s) { string r=""; int k=0; for (int i=0;i': r+=s.substr(k,i-k);r+=">";k=i+1;break; case '&': r+=s.substr(k,i-k);r+="&";k=i+1;break; case '"': r+=s.substr(k,i-k);r+=""";k=i+1;break; case '\'': r+=s.substr(k,i-k);r+="'";k=i+1;break; } } if(k #include using std::string; //Sets random seed void Randomize(); template T GetRandom(T min, T max); template bool doublematch(T a,T b,T c); //returns a random integer in range int GetRandomInt(int min, int max); //returns a bool depending of chance (for example Chance(0.25) has a 25% chance //to return true bool Chance(float x); unsigned int RandomRGB(unsigned char a,unsigned char b); unsigned int RandomRGB(); unsigned int MixColors(unsigned int A, unsigned int B); struct SDL_Color; SDL_Color& MixColors(SDL_Color& A, SDL_Color& B); bool TryS2I(const std::string &str, int& r); std::string GetFileNameNoExtension( const char* filename ); std::string StripPath(const string filename); bool DoesFileExist(const char* filename); bool DoesFileExist( const string filename); string StripXML(const string s); xye-0.12.2+dfsg/src/kye_script.cpp000066400000000000000000000372031225403634500170000ustar00rootroot00000000000000/* Xye License (it is a PNG/ZLIB license) Copyright (c) 2006 Victor Hugo Soliz Kuncar This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. 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 appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. */ #include "xye.h" #include "gen.h" #include #include #include "xye_script.h" #include "kye_script.h" /** Class KyeLevelPack start **/ KyeLevel* KyeLevelPack::First; KyeLevel* KyeLevelPack::Final; KyeLevel* KyeLevelPack::CurrentLevel; unsigned int KyeLevelPack::tn; void getline_xplt(std::ifstream &a, std::string &l) { getline(a,l); int L=l.length(); if ((L>1) && (l[L-1]=='\r')) { l = l.substr(0,L-1); } } void KyeLevelPack::Init() { First=Final=NULL; } void KyeLevelPack::Clean() { KyeLevel* q; while (First) { q=First; First=First->Next; delete q; } First=Final=NULL; } void KyeLevelPack::Load(const char* filename, unsigned int ln) { string s = LoadService(filename,ln); if (s!="") { LevelPack::Error(s.c_str()); } //It should now be *easy* to load a Kye level LoadNthLevel(ln); } string KyeLevelPack::LoadService(const char* filename, unsigned int ln) { std::string line; std::ifstream fl ; Clean(); fl.open(filename,std::ios::in); if (! fl.is_open()) { return("Unable to load level file (.kye) (stream error)"); } if (fl.eof()) { return("Level File is empty"); } //read stuff ! getline_xplt (fl,line); int N,i,j,k; if (! TryS2I(line,N)) {return("Not a kye file, first line not a number!");} LevelPack::n=N; if (N<=0) {return("Not really a kye file (Number of levels too low <=0)");} if (fl.eof()) {return("Unexpected end of file");} //now we know the file is *supposed* to have N files; KyeLevel* current,*ql; First=current=new KyeLevel(); current->Prev=NULL; tn=0; while(N>0) { //Try to read N levels. getline_xplt (fl,current->name); if (fl.eof()) {return("Unexpected end of file");} getline_xplt (fl,current->lhint); if (fl.eof()) {return("Unexpected end of file");} getline_xplt (fl,current->bye); if (fl.eof()) {return("Unexpected end of file");} //Now it should get interesting, we will read 20 lines that form the level //and parse them into the 2d array. for (j=19;j>=0;j--) { getline_xplt (fl,line); if ((j>0) && fl.eof()) {return("Unexpected end of file");} k=line.length(); k= (k>30)?30:k; for (i=0;idata[i][j]=line[i]; for (i=k;i<30;i++) current->data[i][j]=' '; //just in case. } Final=current; N--; if (N>0) { if (fl.eof()) {return("Invalid Kye file (missing level?)");} ql=new KyeLevel(); ql->Prev=current; current->Next=ql; current=ql; } else current->Next=NULL; tn++; } fl.close(); //The result is supposed to be a double linked list with all the levels in sequence or a fiasco. //There is always a chance a normal text document could be loaded. return ""; } string KyeLevelPack::LoadForEditor(const char* filename, vector & out) { string s = LoadService(filename,1); if (s != "") { return s; } out.resize(tn); KyeLevel* x = First; for (int i=0; iname; o.lhint = x->lhint; o.bye = x->bye; for (int a=0; adata[a][b]; } } x = x->Next; } return ""; } const char* KyeLevelPack::ReadData(const char* path,unsigned int &n ) { std::ifstream fl ; fl.open(path,std::ios::in); if (! fl.is_open()) return ("Unable to open file"); if (fl.eof()) { fl.close(); return ("The file is empty"); } std::string line; getline_xplt (fl,line); int tm=0; if (! TryS2I(line,tm)) { fl.close(); return ("First line is not a number"); } else if (tm<0) { fl.close(); return ("Negative number on line 1"); } else n=(unsigned int)(tm); //count the lines and verify they match the number of levels. unsigned int c=0; while (! fl.eof()) { getline_xplt (fl,line); c++; } // A level requires 3 lines + other 20 lines = 23 c=(unsigned int)(c / 23); if (cLoad(); else { KyeLevel* tm=First; while (n>1) if (tm=tm->Next) n--; else n=0; if (! tm) { (CurrentLevel=First)->Load(); LevelPack::OpenFileLn=1; } else (CurrentLevel=tm)->Load(); } } void KyeLevelPack::Restart() { CurrentLevel->Load(); } void KyeLevelPack::Next() { LevelPack::OpenFileLn++; KyeLevel* k=CurrentLevel->Next; if (! k) { (CurrentLevel=First)->Load(); LevelPack::OpenFileLn=1; } else (CurrentLevel=k)->Load(); } void KyeLevelPack::Last() { LevelPack::OpenFileLn--; KyeLevel* k=CurrentLevel->Prev; if (! k) { (CurrentLevel=Final)->Load(); LevelPack::OpenFileLn=tn; } else (CurrentLevel=k)->Load(); } bool KyeLevelPack::HasNext() { return (CurrentLevel->Next != NULL); } bool KyeLevelPack::HasLast() { return (CurrentLevel->Prev != NULL); } /** Class KyeLevelPack end **/ void LoadKyeWall(char t, unsigned char i, unsigned char j) { wall* wl=new wall(game::Square(i,j)); wl->SetRoundCorners( (t=='7') || (t=='4') || (t=='8'), (t=='1') || (t=='2') || (t=='4'), (t=='3') || (t=='2') || (t=='6'), (t=='9') || (t=='6') || (t=='8')); } void LoadXyeWall_R(unsigned char i, unsigned char j) { wall* wl=new wall(game::Square(i,j),4); } void LoadKyeTimer(unsigned char x, unsigned char y,unsigned char tm) { number* t=new number(game::Square(x,y),B_YELLOW,tm,false); } void LoadKyeEarth(unsigned char x, unsigned char y) { earth* e=new earth(game::Square(x,y)); } void LoadKyeGem(unsigned char x,unsigned char y) { gem* g=new gem(game::Square(x,y),B_BLUE); } void LoadXyeEmerald(unsigned char x,unsigned char y) { gem* g=new gem(game::Square(x,y),B_GREEN); } void LoadXyeGemBlock(unsigned char x,unsigned char y) { gemblock* g=new gemblock(game::Square(x,y),B_GREEN); } void LoadXyeBlockDoor(unsigned char x,unsigned char y,bool trap) { blockdoor* g=new blockdoor(game::Square(x,y),trap,true,B_YELLOW); } void LoadXyeMarked(unsigned char x,unsigned char y) { marked* g=new marked(game::Square(x,y),B_YELLOW); } void LoadKyeBlock(unsigned char x, unsigned char y,bool round, bool fromxye) { block* b=new block(game::Square(x,y), /*(fromxye?B_YELLOW: B_GREEN)*/ B_YELLOW,round); } void LoadKyeBeast(unsigned char x, unsigned char y, btype B) { beast* b=new beast(game::Square(x,y),B,D_UP); } void LoadKyeSticky(unsigned char x, unsigned char y, bool horz) { magnetic* m=new magnetic(game::Square(x,y),T_MAGNET,horz); } void LoadSKyeSticky(unsigned char x, unsigned char y, bool horz) { magnetic* m=new magnetic(game::Square(x,y),T_STICKY,horz); } void LoadXyeAntiMagnet(unsigned char x, unsigned char y, bool horz) { magnetic* m=new magnetic(game::Square(x,y),T_ANTIMAGNET,horz); } void LoadSKyeBomb(unsigned char x, unsigned char y) { surprise* m=new surprise(game::Square(x,y),B_RED,false); } void LoadSKyePit(unsigned char x, unsigned char y) { pit* m=new pit(game::Square(x,y)); } void LoadKyeBlacky(unsigned char x, unsigned char y) { dangerous* b=new dangerous(game::Square(x,y),OT_BLACKHOLE); } void LoadXyeMine(unsigned char x, unsigned char y) { dangerous* b=new dangerous(game::Square(x,y),OT_MINE); } void LoadKyeArrow(unsigned char x, unsigned char y, bool round, edir d) { arrow *a=new arrow(game::Square(x,y),B_YELLOW,d,round); } void LoadKye3Teleport(unsigned char x, unsigned char y, edir d) { teleport *a=new teleport(game::Square(x,y),d); } void LoadKyeBouncer(unsigned char x, unsigned char y, edir d) { impacter *i=new impacter(game::Square(x,y),B_YELLOW,d); } void LoadKyeClockerAclocker(unsigned char x, unsigned char y,bool clockwise) { turner *t=new turner(game::Square(x,y),B_YELLOW,clockwise,false); } void LoadKyeAuto(unsigned char x, unsigned char y,bool round) { autoarrow* bc=new autoarrow(game::SquareN(x,y),B_YELLOW,autoarrow::GetDefaultEdirByColumn(x),round); } void LoadKyeOneWay(unsigned char x, unsigned char y,edir dr) { bool u=false,r=false,d=false,l=false; switch(dr) { case(D_LEFT): l=true; break; case(D_RIGHT): r=true; break; case(D_DOWN): d=true; break; default: u=true; } tdoor* td= new tdoor(game::SquareN(x,y), (l || r)? td_HORZ:td_VERT ,u,r,d,l); } void LoadXyeDotBlock(unsigned char x, unsigned char y,bool round) { lowdensity* l=new lowdensity(game::SquareN(x,y),B_YELLOW,round); } void LoadXyeSurprise(unsigned char x, unsigned char y,bool round) { surprise* l=new surprise(game::SquareN(x,y),B_BLUE,round); } void LoadXyeToggle(unsigned char x, unsigned char y,bool plus) { toggle* l=new toggle(game::SquareN(x,y),B_YELLOW,false,! plus); } void LoadXyeBot(unsigned char x, unsigned char y) { roboxye* l=new roboxye(game::SquareN(x,y)); } /** Class KyeLevel start **/ void KyeLevel::SetGameCaption() { int L=name.length(); string title = "Xye - "+name; LevelPack::CurrentLevelTitle=title.c_str(); SDL_WM_SetCaption(title.c_str(),0); } void KyeLevel::Load() { if (! FromXyeLevel) { SetGameCaption(); LevelPack::SetLevelBye( bye.c_str() ); LevelPack::Solution=""; } FoundKye=false; //We have a complete 2D array full with characters, let's convert it to a level. unsigned char kx = 30,ky = 30,i,j; for (j=0;j<20;j++) for (i=0;i<30;i++) switch(data[i][j]) { case('1'): case('2'):case('3'):case('4'):case('5'):case('6'):case('7'):case('8'):case('9'): LoadKyeWall(data[i][j],i,j); break; case('e'): LoadKyeEarth(i,j); break; case('b'): LoadKyeBlock(i,j,false, FromXyeLevel); break; case('B'): LoadKyeBlock(i,j,true, FromXyeLevel); break; case('*'): LoadKyeGem(i,j); break; case ('E'): LoadKyeBeast(i,j,BT_GNASHER); break; case ('C'): LoadKyeBeast(i,j,BT_BLOB); break; case ('~'): LoadKyeBeast(i,j,BT_VIRUS); break; case ('['): LoadKyeBeast(i,j,BT_SPIKE); break; case ('T'): LoadKyeBeast(i,j,BT_TWISTER); break; case ('/'): LoadKyeBeast(i,j,BT_DARD); break; case ('s'): LoadKyeSticky(i,j,false); break; case ('S'): LoadKyeSticky(i,j,true); break; case ('}'): LoadKyeTimer(i,j,3); break; case ('|'): LoadKyeTimer(i,j,4); break; case ('{'): LoadKyeTimer(i,j,5); break; case ('z'): LoadKyeTimer(i,j,6); break; case ('y'): LoadKyeTimer(i,j,7); break; case ('x'): LoadKyeTimer(i,j,8); break; case ('w'): LoadKyeTimer(i,j,9); break; case ('H'): LoadKyeBlacky(i,j); break; //Non-round Arrows: case ('l'): LoadKyeArrow(i,j,false,D_LEFT); break; case ('r'): LoadKyeArrow(i,j,false,D_RIGHT); break; case ('u'): LoadKyeArrow(i,j,false,D_UP); break; case ('d'): LoadKyeArrow(i,j,false,D_DOWN); break; //Round Arrows: case ('<'): LoadKyeArrow(i,j,true,D_LEFT); break; case ('>'): LoadKyeArrow(i,j,true,D_RIGHT); break; case ('^'): LoadKyeArrow(i,j,true,D_UP); break; case ('v'): LoadKyeArrow(i,j,true,D_DOWN); break; //Bouncers: case ('L'): LoadKyeBouncer(i,j,D_LEFT); break; case ('R'): LoadKyeBouncer(i,j,D_RIGHT); break; case ('U'): LoadKyeBouncer(i,j,D_UP); break; case ('D'): LoadKyeBouncer(i,j,D_DOWN); break; //Auto slider/rocky: case ('A'): LoadKyeAuto(i,j,false); break; case ('F'): LoadKyeAuto(i,j,true); break; case ('a'): LoadKyeClockerAclocker(i,j,true); break; case ('c'): LoadKyeClockerAclocker(i,j,false); break; case ('h'): LoadKyeOneWay(i,j,D_UP); break; case ('g'): LoadKyeOneWay(i,j,D_RIGHT); break; case ('f'): LoadKyeOneWay(i,j,D_LEFT); break; case ('i'): LoadKyeOneWay(i,j,D_DOWN); break; //SKye Additions: case ('P'): LoadSKyeSticky(i,j,true); break; case ('p'): LoadSKyeSticky(i,j,false); break; case ('!'): LoadSKyeBomb(i,j); break; case ('O'): LoadSKyePit(i,j); break; //Kye 3.0 additions: case ('('): LoadKye3Teleport(i,j,D_RIGHT); break; case (')'): LoadKye3Teleport(i,j,D_LEFT); break; case ('_'): LoadKye3Teleport(i,j,D_UP); break; case ('\''): LoadKye3Teleport(i,j,D_DOWN); break; //Xye additions: case('o'): LoadXyeMine(i,j); break; case('$'): LoadXyeEmerald(i,j); break; case('@'): LoadXyeGemBlock(i,j); break; case('#'): LoadXyeMarked(i,j); break; case('%'): LoadXyeBlockDoor(i,j,false); break; case('='): LoadXyeBlockDoor(i,j,true); break; case ('Q'): LoadXyeAntiMagnet(i,j,true); break; case ('q'): LoadXyeAntiMagnet(i,j,false); break; case ('.'): LoadXyeDotBlock(i,j,false); break; case (','): LoadXyeDotBlock(i,j,true); break; case (':'): LoadXyeSurprise(i,j,false); break; case(';'): LoadXyeSurprise(i,j,true); break; case ('-'): LoadXyeToggle(i,j,false); break; case ('+'): LoadXyeToggle(i,j,true); break; case ('?'): LoadXyeBot(i,j); break; case ('M'): LoadXyeWall_R(i,j); break; case('K'): FoundKye=true; kx=i; ky=j; } char rx,ry; if (FoundKye || ! FromXyeLevel) { if (kx == 30) { kx = ky = 0; } game::XYE= new xye(game::Square(kx,ky)); } if ((! FromXyeLevel) && (lhint!="")) { hint::SetGlobalHint(lhint); } } /** Class KyeLevel end **/ xye-0.12.2+dfsg/src/kye_script.h000066400000000000000000000023371225403634500164450ustar00rootroot00000000000000#include #ifndef KYE_SCRIPT #define KYE_SCRIPT class KyeLevel { public: std::string name; std::string lhint; std::string bye; bool FromXyeLevel; bool FoundKye; char data[XYE_HORZ][XYE_VERT]; KyeLevel* Prev; KyeLevel* Next; KyeLevel() { FromXyeLevel=FoundKye=false; } KyeLevel(bool fx) { FromXyeLevel=fx; FoundKye=false; } void SetGameCaption(); void Load(); }; class KyeLevelPack { private: KyeLevelPack() {} static KyeLevel* First; static KyeLevel* Final; static KyeLevel* CurrentLevel; static unsigned int tn; static string LoadService(const char* filename, unsigned int ln=1); public: static void Init(); static void Clean(); static string LoadForEditor(const char* filename, vector &out); static void Load(const char* filename, unsigned int ln=1); static const char* ReadData(const char* path,unsigned int &n ); static void LoadNthLevel(unsigned int n); static void Restart(); static void Next(); static void Last(); static bool HasNext(); static bool HasLast(); }; #endif xye-0.12.2+dfsg/src/levels.cpp000066400000000000000000000420441225403634500161150ustar00rootroot00000000000000/* Xye License (it is a PNG/ZLIB license) Copyright (c) 2006 Victor Hugo Soliz Kuncar This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. 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 appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. */ #include "xye.h" #include "xyedit.h" #include "xye_script.h" #include "levels.h" #include "skins.h" #include "options.h" #include "vxsdl.h" #include "listbox.h" #include #include #include #include using std::string; using std::sort; #include "browser.h" namespace LevelBrowser { const char* LEVELS_FOLDER = "levels/"; void PlayLevel(); void OpenEditor(); void EditLevel(); window* thewindow; button* PlayButton; button* EditButton; listbox* levellistbox; Font* MenuFont; Font* MenuSelectedFont; Font* InfoFont; Font* InfoBoldFont; string CurrentFileName; int CurrentFileLevelN=1; bool runeditor; bool editfile; string FileDesc; string FileTitle; string FileAuthor; unsigned int FileLevelsN; string* FoundFile=NULL; unsigned int FileN=0; int Active; bool ActiveIsValid; bool ActiveIsEditable; void LoadActiveFileInfo(); #define SPACING_TEXT " " class LevelInfo: public control { public: LevelInfo(int sx, int sy, int sw, int sh) { x=sx, y=sy, w=sw, h=sh; } void loop(){} void draw(SDL_Surface* target) { Uint32 back=SDL_MapRGB(target->format, options::LevelMenu_info); SDL_FillRect(target, x,y,w,h, back); Sint16 sh = h; Sint16 fh=options::GetGridSize();// game::FontRes->Height(); int fof=0; int fohei=InfoFont->Height(); if(fhHeight()+2; fof=1; } else fof=(fh-fohei)/2; Sint16 cy=y+h/8,cx=x+2; cx+=5; Sint16 nw = cx+InfoFont->TextWidth(" ");; InfoBoldFont->Write(target,cx,cy,"Title:"); cy+=fh; InfoFont->Write(target,nw,cy, FileTitle); cy+=fh; if (FileAuthor[0]!='\0') { InfoBoldFont->Write(target,cx,cy,"Author:"); cy+=fh; InfoFont->Write(target,nw,cy, FileAuthor); cy+=fh; } if(FileLevelsN>1) { char tml[6]; snprintf(tml,5,"%d",FileLevelsN); InfoBoldFont->Write(target,cx,cy,"Levels:"); cy+=fh; InfoFont->Write(target,nw,cy,tml); cy+=fh; } InfoBoldFont->Write(target,cx,cy,"Location:"); cy+=fh; InfoFont->Write(target,nw,cy, FoundFile[Active]); //delete pt; cy+=fh; InfoBoldFont->Write(target,cx,cy,"Description:"); cy+=fh; string tm=" "+FileDesc; InfoFont->WriteWrap(target,nw,cy,x+w - nw-5,y+h-cy, tm); /* if(ActiveIsValid) InfoFont->Write(game::screen,cx,sh-3*fh,"[Enter] - Play"); if(ActiveIsEditable) { int temwa=InfoFont->TextWidth("[Enter] - Play"); int temwb=InfoFont->TextWidth("[F1] - Editor"); int temw; InfoFont->Write(game::screen,cx,sh-2*fh,"[F1] - Editor"); if(temwa>temwb) temw=temwa; else temw=temwb; InfoFont->Write(game::screen,cx+temw+10,sh-2*fh,"[F2] - Edit level"); } else { InfoFont->Write(game::screen,cx,sh-2*fh,"[F1] - Editor"); } **/ } void onMouseMove(int px,int py){} void onMouseOut() {} void onMouseDown(int px,int py) {} void onMouseUp(int px,int py) {} void onMouseRightUp(int px,int py) {} }; bool Akyexyelevel(const char* f) { return (HasExtension(f,"slc") || HasExtension(f,"xsb") || HasExtension(f,"kye") || HasExtension(f,"KYE") || HasExtension(f,"xye") || HasExtension(f,"xyr") ); // the standard forces xye extension to be lower case. } unsigned int CountMatchingFiles(const char* nf) { Folder F(nf); unsigned int c=0; const char* N; if (! F.Open()) { printf ("No levels found on %s \n",nf); return 0; } while (N=F.NextFileMatching(Akyexyelevel)) if (strlen(N)<=20) c++; F.Reset(); while (N=F.NextSubFolder()) { char * tm=new char[strlen(nf)+strlen(N)+2]; strcpy(tm,nf); strcat(tm,N); strcat(tm,"/"); c+=CountMatchingFiles(tm); delete[] tm; } return c; } unsigned int CountMatchingFiles() { string nf = options::fixpath(LEVELS_FOLDER); string hm = options::GetLevelsHomeFolder(); unsigned int c; c = CountMatchingFiles(nf.c_str()); if ( hm.length() != 0 ) { c += CountMatchingFiles(hm.c_str()); } return(c); } void FillArrayWithFilenames(const char* nf, const char* lvp, unsigned int &c) { const char* N; unsigned int L; Folder F(nf); if (! F.Open()) return; while ((c lf.length() ) { if( std::equal(lf.begin(), lf.end(), s.begin()) ) { r=1; string x = s.substr(lf.length()); if(x=="tutorials.xye") r=5; if(x=="levels.xye") r=4; if(x=="Phipps.xye") r=3; if(x=="kye.xye") r=2; } } return r; } bool operator()( const string &a, const string &b) { // printf("LF is %s \n",lf); int arank = getRank(a); int brank = getRank(b); int asla = count(a.begin(), a.end(), '/')+count(a.begin(), a.end(), '\\'); int bsla = count(b.begin(), b.end(), '/')+count(b.begin(), b.end(), '\\');; if( arank==brank) { if(asla == bsla) return (abrank); } }; bool onItemSelected(listbox* lb) { Active = lb->getSelectedIndex(); LoadActiveFileInfo(); return ActiveIsValid; } void onItemDoubleClick(listbox* lb) { if (ActiveIsValid) { PlayLevel(); } } void FillArrayWithFilenames() { string nf=options::fixpath(LEVELS_FOLDER); Folder F(nf.c_str() ); if (! F.Open()) { game::Error("cannot find a levels folder"); } unsigned int c=0; int i; const char* N; unsigned int L; string aux; while ((caddItem(StripPath(FoundFile[i]), FoundFile[i]); } levellistbox->selectItem(Active); } void LoadActiveFileInfo() { string &fl=FoundFile[Active]; ActiveIsValid= LevelPack::GetFileData(fl.c_str(),FileAuthor,FileDesc,FileTitle,FileLevelsN); string mylevs = options::GetMyLevelsFolder(); ActiveIsEditable= ActiveIsValid && (fl.substr(0, mylevs.size()) == mylevs); string flext = ""; flext = fl.substr(fl.length()-4); ActiveIsEditable= ActiveIsEditable && (flext==".xye" ||flext==".kye" ||flext==".KYE"); PlayButton->Visible = ActiveIsValid; EditButton->Visible = ActiveIsEditable; } void EditFile() { CurrentFileName = FoundFile[Active]; string mylevs= options::GetMyLevelsFolder(); editor::SetFile(mylevs, CurrentFileName.substr(mylevs.size() ) ); thewindow->SetTransition(editor::StartSection); /* string commandline=options::ExecutablePath; commandline+=" --edit "; commandline+=CurrentFileName.substr(editor::myLevelsPath.size() ); commandline+=" "; commandline+=options::Dir; Command::executeParallel(commandline); CurrentFileName=""; thewindow->stop();*/ } void OpenEditor() { string mylevs = options::GetMyLevelsFolder(); CurrentFileName = mylevs+"editortest.xye"; editor::SetFile(mylevs, "editortest.xye"); thewindow->SetTransition(editor::StartSection); /* string commandline=options::ExecutablePath; commandline+=" --edit editortest.xye "; commandline+=options::Dir; Command::executeParallel(commandline); CurrentFileName = ""; thewindow->stop();*/ } void PlayLevel() { if(!ActiveIsValid) return; CurrentFileName = FoundFile[Active]; CurrentFileLevelN = 1; game::PlayLevel(CurrentFileName.c_str(), CurrentFileLevelN); } void onKeyDown(SDLKey keysim, Uint16 unicode) { } void attemptEditFile() { if(ActiveIsEditable) { EditFile(); } } void OnSkinButtonClick(const buttondata* data) { thewindow->SetTransition(SkinBrowser::StartSection); } void OnWelcomeSkinButtonClick(bool x) { thewindow->SetTransition(SkinBrowser::StartSection); } void OnPlayButtonClick(const buttondata* data) { PlayLevel(); } void OnEditorButtonClick(const buttondata* data) { OpenEditor(); } void OnEditButtonClick(const buttondata* data) { attemptEditFile(); } void OnQuitButtonClick(const buttondata* data) { thewindow->Close(); } void onKeyUp(SDLKey keysim, Uint16 unicode) { levellistbox->onKeyUp(keysim, unicode); switch (keysim) { case(SDLK_F1): OpenEditor(); //return false; break; case(SDLK_ESCAPE): thewindow->Close(); break; case(SDLK_F2): attemptEditFile(); break; case(SDLK_F3): OnSkinButtonClick(NULL); break; case(SDLK_LEFT): break; case(SDLK_RIGHT): break; case(SDLK_RETURN): case(SDLK_KP_ENTER): //Enter PlayLevel(); } } void Show() { runeditor=false; editfile=false; if (FoundFile!=NULL) delete[] FoundFile; FileN = CountMatchingFiles(); if (! FileN) { game::Error("No level files found"); } FoundFile= new string[FileN]; FillArrayWithFilenames(); LoadActiveFileInfo(); bool loop=true; // //CurrentFileName = FoundFile[Active]; //delete[] FoundFile; //FoundFile=NULL; } void onExitAttempt() { thewindow->stop(); } void StartSection(window* wind) { thewindow = wind; wind->SetCaption("Xye - Select a level file"); Sint16 lw = 2+game::FontRes->TextWidth(SPACING_TEXT); listbox* ll = listbox::makeNew(0,0,lw, wind->Height); levellistbox = ll; ll->NormalFont = MenuFont; ll->SelectedFont = MenuSelectedFont; ll->BackgroundColor = options::LevelMenu_menu; ll->SelectedColor = options::LevelMenu_selected; ll->InvalidColor = options::LevelMenu_selectederror; ll->BarColor = options::LevelMenu_info; ll->onSelect = onItemSelected; ll->onItemDoubleClick = onItemDoubleClick; ll->depth= 1; wind->addControl(ll); LevelInfo* li = new LevelInfo(lw, 0, wind->Width-lw, wind->Height); li->depth= 2; Sint16 w,cx; button* but; cx = lw; //== Play button w = button::recommendedWidth("Play"); but = new button( cx, wind->Height - game::GRIDSIZE, w, game::GRIDSIZE); but->onClick = OnPlayButtonClick; but->text = "Play"; but->depth = 3; PlayButton = but; wind->addControl(but); cx+=w+1; //== Run Editor button w = button::recommendedWidth("[F1] Editor"); but = new button( cx, wind->Height - game::GRIDSIZE, w, game::GRIDSIZE); but->text = "[F1] Editor"; but->depth = 3; but->onClick = OnEditorButtonClick; wind->addControl(but); cx+=w+1; //== Edit Level w = button::recommendedWidth("[F2] Edit Level"); but = new button( cx, wind->Height - game::GRIDSIZE, w, game::GRIDSIZE); but->text = "[F2] Edit Level"; but->depth = 3; EditButton = but; but->onClick = OnEditButtonClick; wind->addControl(but); cx+=w+1; //== Pick skin w = button::recommendedWidth("[F3] Theme"); but = new button( cx, wind->Height - game::GRIDSIZE, w, game::GRIDSIZE); but->text = "[F3] Theme"; but->depth = 3; but->onClick = OnSkinButtonClick; wind->addControl(but); cx+=w+1; //== Quit w = button::recommendedWidth("Quit"); but = new button( wind->Width-1-w, wind->Height - game::GRIDSIZE, w, game::GRIDSIZE); but->text = "Quit"; but->depth = 3; but->onClick = OnQuitButtonClick; wind->addControl(but); //... wind->addControl(li); wind->onKeyDown = onKeyDown; wind->onKeyUp = onKeyUp; wind->onExitAttempt = onExitAttempt; if (! options::HasConsciouslyChosenTheme() ) { dialogs::makeMessageDialog(wind, "Welcome to Xye. Let us take you to the theme selector. There you will be able to pick the look and feel for the game that best suits your taste/screen size.","Ok",OnWelcomeSkinButtonClick); } Show(); return; } const char* GetLevelFile() { return CurrentFileName.c_str(); } void SetupNormalFonts(SDL_Surface* SS) { MenuFont=new Font(SS, options::LevelMenu_menutext); MenuSelectedFont=new Font(SS, options::LevelMenu_selectedtext); InfoFont=new Font(SS, options::LevelMenu_infotext); } void SetupNormalFonts(const char* ttf, const int & size) { MenuFont=new Font(ttf, size , options::LevelMenu_menutext); MenuSelectedFont=new Font(ttf, size, options::LevelMenu_selectedtext); InfoFont=new Font(ttf, size, options::LevelMenu_infotext); } void SetupBoldFonts(SDL_Surface* SS) { InfoBoldFont=new Font(SS, options::LevelMenu_infotext); } void SetupBoldFonts(const char* ttf, const int & size) { InfoBoldFont=new Font(ttf, size, options::LevelMenu_infotext); } void DeleteFonts() { delete MenuFont; delete MenuSelectedFont; delete InfoFont; delete InfoBoldFont; } void Clean() { DeleteFonts(); if(FoundFile != NULL) delete[] FoundFile; } void AssignLevelFile( const char * path, int n) { CurrentFileName = path; CurrentFileLevelN = n; } } xye-0.12.2+dfsg/src/levels.h000066400000000000000000000006261225403634500155620ustar00rootroot00000000000000#include "vxsdl.h" #include "window.h" namespace LevelBrowser { void AssignLevelFile( const char * path, int n); void StartSection(window* wind); const char* GetLevelFile(); void SetupNormalFonts(SDL_Surface* SS); void SetupNormalFonts(const char* ttf, const int & size); void SetupBoldFonts(SDL_Surface* SS); void SetupBoldFonts(const char* ttf, const int & size); void Clean(); } xye-0.12.2+dfsg/src/listbox.cpp000066400000000000000000000271321225403634500163100ustar00rootroot00000000000000/* this is a placeholder */ #include "listbox.h" #include #include #include using namespace std; namespace listbox_private { const int PADDING_LEFT = 2; class list: public listbox { public: //not-so-public because no other file sees this class. vector tags; vector values; bool selectedValid; int selectedIndex; int viewIndex; int barWidth; list(int x, int y, int w, int h) { this->x = x; this->y = y; this->w = w; this->h = h; onSelect = NULL; onItemDoubleClick = NULL; NormalFont = NULL; SelectedFont = NULL; viewIndex = 0; selectedIndex = -1; barWidth = 10; clicked = false; barClicked = false; selectedValid = true; maxLines = -1; } void handleSelectEvent(bool centerIt = false) { if (maxLines < 0) { updateMaxLines(); } if (selectedIndex == -1) { return; } if ( centerIt) { int s = tags.size(); if ( s > maxLines ) { viewIndex = selectedIndex - maxLines/2; // {viewIndex == selectedIndex - maxLines/2 } // {viewIndex + maxLines/2 == selectedIndex} viewIndex = std::max( std::min(s - maxLines, viewIndex) , 0); } else { viewIndex = 0; } } else { // update the viewIndex so that the // newly selected item is visible: if ( selectedIndex < viewIndex ) { viewIndex = selectedIndex; } if ( selectedIndex >= viewIndex + maxLines ) { // viewIndex + maxLines - 1 = selectedIndex // viewIndex = selectedIndex - maxLines + 1 viewIndex = selectedIndex - (maxLines - 1); if (viewIndex < 0) { viewIndex = 0; } } } if (onSelect != NULL) { selectedValid = onSelect(this); } else{ selectedValid = true; } } void addItem(const string tag, const string value) { tags.push_back(tag); values.push_back(value); } string getSelectedValue() { if (selectedIndex == -1) { return "NULL"; } else { return values[selectedIndex]; } } int getSelectedIndex() { return selectedIndex; } ~list() { } void selectItem(int index) { int old = selectedIndex; if (index >= tags.size() ) { selectedIndex = -1; } else { selectedIndex = index; } if (old != selectedIndex ) { handleSelectEvent( old == -1 ); } } void selectItem(string value) { int old = selectedIndex; for (selectedIndex = 0; selectedIndex < tags.size(); selectedIndex++) { if (values[selectedIndex]==value) { handleSelectEvent( old == -1 ); return; } } selectedIndex = -1; handleSelectEvent(); } int maxLines; void updateMaxLines() { int cy = y; int fh = NormalFont->Height(); int i = 0; maxLines = 0; while ( cy + fh < y + h) { maxLines++; cy += fh; } } void draw(SDL_Surface* target) { Uint32 back=SDL_MapRGB(target->format, BackgroundColor); SDL_FillRect(target, x,y,w,h, back); int cx = x + PADDING_LEFT; int cy = y; int fh = NormalFont->Height(); int i = 0; int bh = barWidth; if ( tags.size() <= maxLines ) { bh = 0; } maxLines = 0; while ( cy + fh < y + h) { if (viewIndex + i < tags.size() ) { if ( viewIndex + i == selectedIndex) { Uint32 col; if (selectedValid) { col=SDL_MapRGB(target->format, SelectedColor); } else { col=SDL_MapRGB(target->format, InvalidColor); } SDL_FillRect(target, x,cy ,w - bh, fh, col); SelectedFont->Write(target,cx,cy, tags[viewIndex + i]); } else{ NormalFont->Write(target,cx,cy, tags[viewIndex + i]); } i++; } maxLines++; cy += fh; } // the bar! if ( bh > 0 ) { int barheight = (maxLines*h)/tags.size(); int barpos = (viewIndex*h)/tags.size(); Uint8 r = BarColor.r/2 + BackgroundColor.r/2; Uint8 g = BarColor.g/2 + BackgroundColor.g/2; Uint8 b = BarColor.b/2 + BackgroundColor.b/2; Uint32 black = SDL_MapRGB(target->format, 0,0,0); Uint32 barfcol = SDL_MapRGB(target->format, r,g,b); /*SDL_FillRect(target, x +w - barWidth, 0, barWidth, h, black); SDL_FillRect(target, x +w - barWidth + 1, 1, barWidth-2, h-2, barfcol);*/ SDL_FillRect(target, x +w - barWidth, 0, barWidth, h, barfcol); Uint32 barcol = SDL_MapRGB(target->format, BarColor); SDL_FillRect(target, x +w - barWidth, y+barpos, barWidth, barheight, black); SDL_FillRect(target, x +w - barWidth+1, y+barpos+1, barWidth-2, barheight-2, barcol); } } bool barClicked; bool clicked; bool insideBar(int px, int py) { if ( tags.size() > maxLines ) { return px >= w - barWidth; } return false; } void verifyBarClick(int mousex, int mousey) { if ( barClicked && ( tags.size() > maxLines ) ) { int p = (mousey*tags.size()) / h; if (p <= tags.size() - maxLines) { viewIndex = p; } else { //v + maxLines == tags.size() viewIndex = tags.size() - maxLines; } } } void onMouseMove(int mousex, int mousey) { verifyBarClick(mousex, mousey); } void onMouseOut() { clicked = false; } void onMouseDown(int mousex, int mousey) { if (insideBar(mousex, mousey) ) { barClicked = true; verifyBarClick(mousex,mousey); } else { clicked = true; } } void onMouseUp(int mousex, int mousey) { if (barClicked) { barClicked = false; return ; } clicked = false; if ( (tags.size() <= maxLines) || (mousex < w - barWidth) ) { //item click. int old = selectedIndex; int p = mousey/ NormalFont->Height(); if ( (p < maxLines) && (p + viewIndex < tags.size() ) ) { selectedIndex = viewIndex + p; if (old == selectedIndex) { if ( onItemDoubleClick != NULL) { onItemDoubleClick(this); } } else { handleSelectEvent(); } } } } void onMouseRightUp(int x, int y) { } void loop() { } void onKeyUp(SDLKey keysim, Uint16 unicode); void onMouseWheel(int x, int y, Uint8 wheel, bool down) { int s = tags.size(); if ( s > maxLines ) { if (wheel == SDL_BUTTON_WHEELUP) { viewIndex -= max(maxLines/8,1); viewIndex = max(viewIndex,0); } else { viewIndex += max(maxLines/8,1); viewIndex = min(viewIndex, s - maxLines); } } } }; bool IsCharKeyEvent(SDLKey& k,char & a,char &b) { a='\0'; if ((k >= SDLK_a) && (k<=SDLK_z)) { a= 'a'+(k-SDLK_a); b = 'A'+(k-SDLK_a); } else if ((k >= SDLK_0) && (k<=SDLK_9)) a='0'+(k-SDLK_0); return (a!='\0'); } void list::onKeyUp(SDLKey keysim, Uint16 unicode) { char a='\0',b=a; int oldsel = selectedIndex; int s = tags.size(); int rel = -1; if (IsCharKeyEvent(keysim,a,b)) { int l = selectedIndex; int i = l + 1; while (i != selectedIndex) { if (i==s) { i=0; } const string & p = tags[i]; if ( (p.length()>0) && ( (p[0]==a) || (p[0]==b)) ) { selectedIndex=i; } else { i++; } } } else { switch (keysim) { case(SDLK_UP): selectedIndex--; if (selectedIndex<0) selectedIndex=s-1; break; case(SDLK_DOWN): selectedIndex++; if (selectedIndex>=s) selectedIndex=0; break; case(SDLK_PAGEUP): rel = selectedIndex - viewIndex; selectedIndex -= maxLines/4+1; if (selectedIndex<0) selectedIndex=0; break; case(SDLK_PAGEDOWN): rel = selectedIndex - viewIndex; selectedIndex += maxLines/4+1; if (selectedIndex>=s) selectedIndex=s-1; break; } } if (oldsel != selectedIndex) { handleSelectEvent(); if ( rel != -1 ) { viewIndex = selectedIndex - rel; viewIndex = std::max( viewIndex, 0 ); viewIndex = std::min( viewIndex, (int)tags.size() - maxLines ); // { viewIndex = selectedIndex - rel } } } } } listbox* listbox::makeNew(int x, int y, int w, int h) { return new listbox_private::list(x,y,w,h); } xye-0.12.2+dfsg/src/listbox.h000066400000000000000000000016301225403634500157500ustar00rootroot00000000000000#include #include "vxsdl.h" #include "window.h" class listbox: public control { public: SDL_Color BackgroundColor; SDL_Color SelectedColor; SDL_Color InvalidColor; SDL_Color BarColor; Font* NormalFont; Font* SelectedFont; static listbox * makeNew(int x, int y, int w, int h); virtual string getSelectedValue()=0; virtual int getSelectedIndex()=0; virtual ~listbox(){}; virtual void addItem(const string tag, const string value)=0; bool (*onSelect)(listbox* thelist); //returns true or false if selection is invalid void (*onItemDoubleClick)(listbox* thelist); virtual void selectItem(int index)=0; virtual void selectItem(string value)=0; virtual void onKeyUp(SDLKey keysim, Uint16 unicode) = 0; }; xye-0.12.2+dfsg/src/main.cpp000066400000000000000000000061641225403634500155520ustar00rootroot00000000000000/* License (it is a PNG/ZLIB license) Copyright (c) 2006 Victor Hugo Soliz Kuncar This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. 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 appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. */ //PORTABLE changes behaviour of the win32 mode, for compatibility with portableapps.com menu. //#define PORTABLE 1 //DATAPATH determines the place where /levels/ and /res/ folders are located //#define DATAPATH /usr/local/share/xye/ /*todo: * Modularize xye.cpp so we don't have 1000 classes in the same file * Figure out a good excuse for this main.cpp file * Standarize the coding style so that egyptian braces are used in all portions of code * Get rid of messy C string operations, replace with std::string as much as possible. */ #include "xye.h" #include "xyedit.h" #include "xye_script.h" #include "options.h" #include "browser.h" #include #include #include using namespace std; int main ( int argc, char** argv ) { string editmode(""); string playmode(""); options::Dir=""; if (argc>1) { options::Dir = argv[1]; } if(options::Dir=="") { #ifdef DATA_PATH options::Dir=DATA_PATH; #else #ifdef PORTABLE options::Dir=argv[0]; int i=options::Dir.length()-1; while ( (i>=0) && (options::Dir[i]!= '\\') && (options::Dir[i]!= '/') ) { i--; } options::Dir.resize(i+1); while (i>=0) { if (options::Dir[i]=='\\') { options::Dir[i] = '/'; } i--; } #else options::Dir="./"; #endif #endif } int i=options::Dir.length()-1; while ( (i>=0) && (options::Dir[i]!= '\\') && (options::Dir[i]!= '/') ) { i--; } options::Dir.resize(i); while (i>=0) { if (options::Dir[i]=='\\') { options::Dir[i] = '/'; } i--; } cout << "Will look on "< #include #include #include #include using std::string; namespace options { //With respect of ~ const char* XDG_DEFAULT_DATA_HOME = "/.local/share"; const char* XDG_DEFAULT_CONFIG_HOME = "/.config"; struct parsedSkinFile; void LoadColors(parsedSkinFile & ps); void LoadLevelFile(); void LoadSkinFile(const char* file); // Public variables: bool xyeDirectionSprites; string Dir; SDL_Color OneWayDoorColor; SDL_Color ForceArrowColor; SDL_Color EarthColor; SDL_Color FloorColor; SDL_Color WallColor [XYE_WALL_VARIATIONS]; SDL_Color WallSpriteColor[XYE_WALL_VARIATIONS]; SDL_Color HintColor; SDL_Color BFColor[6]; SDL_Color BKColor[6]; SDL_Color LevelMenu_info; SDL_Color LevelMenu_selected; SDL_Color LevelMenu_selectederror; SDL_Color LevelMenu_menu; SDL_Color LevelMenu_menutext; SDL_Color LevelMenu_selectedtext; SDL_Color LevelMenu_infotext; string ExecutablePath; const int MAX_FILENAMES_TO_REMEMBER = 100; string currentSkinFile; bool disableLevelColors = false; bool LevelColorsDisabled() { return disableLevelColors; } //for simplicity's sake I copied it, hopefully we won't ever change this enum enum blockcolor { B_YELLOW=0, B_RED=1, B_BLUE=2, B_GREEN=3, B_PURPLE=4 }; string datahomefolder; string confighomefolder; bool haspickedtheme=false; bool enundo=false; bool bini=false; /*TiXmlDocument* cnf; TiXmlDocument* skin; TiXmlElement* ele; TiXmlElement* skinele; */ string LevelFile; char* Texture; string WindowIcon; char* LuminosityTexture; char* Font; char* FontBold; int FontSize=0; int FontBoldSize=0; unsigned char r,g,b; int GridSize; unsigned int lvnum; // Used for saving level file numbers and recent level files... int MemTime = 0; typedef std::map< std::pair, int> memmap; memmap MemFileLevelNumber; std::map< string, int> MemFileLevelTime; std::map< std::pair , string > MemSavedGame; //-------- // skin parser struct parsedSkinFile { string sprites; string windowicon; string lum; string font; string boldFont; string author; string description; string title; bool directionSprites; int ttfSize; int gridSize; SDL_Color OneWayDoorColor; SDL_Color ForceArrowColor; SDL_Color EarthColor; SDL_Color FloorColor; SDL_Color WallColor [XYE_WALL_VARIATIONS]; SDL_Color WallSpriteColor[XYE_WALL_VARIATIONS]; SDL_Color BFColor[6]; SDL_Color BKColor[6]; SDL_Color HintColor; SDL_Color LevelMenu_info; SDL_Color LevelMenu_selected; SDL_Color LevelMenu_selectederror; SDL_Color LevelMenu_menu; SDL_Color LevelMenu_menutext; SDL_Color LevelMenu_selectedtext; SDL_Color LevelMenu_infotext; }; bool tryParseColorOptions(TiXmlElement* skn, SDL_Color* c,char type,char bc) { if (!skn) return false; TiXmlElement* tem=skn->FirstChildElement("color"); const char* e1,*e2; char alt= bc-'A'+'a'; while (tem) { e1=tem->Attribute("bc"); if (e1 && ((*e1==bc) || (*e1==alt)) ) { e2=tem->Attribute("type"); if (e2 && (*e2==type)) { string quo; int i=0; quo=tem->Attribute("red");TryS2I(quo,i);c->r=i; quo=tem->Attribute("green");TryS2I(quo,i);c->g=i; quo=tem->Attribute("blue");TryS2I(quo,i);c->b=i; return true; } } tem=tem->NextSiblingElement("color"); } return false; } void TryLoadLevelMenuColor(TiXmlElement* levelmenu, const char* name, SDL_Color & c, Uint8 dR, Uint8 dG, Uint8 dB) { if(levelmenu==NULL) { c.r=dR; c.g=dG; c.b=dB; } else { TiXmlElement* el=levelmenu->FirstChildElement(name); if(el!=NULL) { string quo; int i; quo=el->Attribute("red");TryS2I(quo,i);c.r=i; quo=el->Attribute("green");TryS2I(quo,i);c.g=i; quo=el->Attribute("blue");TryS2I(quo,i);c.b=i; } else { c.r=dR; c.g=dG; c.b=dB; } } c.unused=255; } string parseSkinMenuColors(TiXmlElement* ele, parsedSkinFile & ps) { TiXmlElement* el=ele->FirstChildElement("levelmenu"); TryLoadLevelMenuColor(el,"info" ,ps.LevelMenu_info ,239,235,231); TryLoadLevelMenuColor(el,"selected" ,ps.LevelMenu_selected ,250,211,150); TryLoadLevelMenuColor(el,"selectederror",ps.LevelMenu_selectederror,255, 0, 0); TryLoadLevelMenuColor(el,"menu" ,ps.LevelMenu_menu ,255,255,255); TryLoadLevelMenuColor(el,"menutext" ,ps.LevelMenu_menutext , 0, 0, 0); TryLoadLevelMenuColor(el,"selectedtext" ,ps.LevelMenu_selectedtext , 0, 0, 0); TryLoadLevelMenuColor(el,"infotext" ,ps.LevelMenu_infotext , 0, 0, 0); return ""; } string parseMiscColorOptions(TiXmlElement* skn, parsedSkinFile & ps) { TiXmlElement* tem=skn->FirstChildElement("color"); while (tem!=NULL) { int variation = -1; tem->QueryIntAttribute("variation", &variation); const char* e1 = tem->Attribute("type"); SDL_Color * c=NULL; int n = 1; if( (e1!=NULL) && (string(e1)=="WALL") ) { c=ps.WallColor; if(variation==-1) n=XYE_WALL_VARIATIONS; else c+=variation; } else if( (e1!=NULL) && (string(e1)=="WALL_SPRITE") ) { c=ps.WallSpriteColor; if(variation==-1) n=XYE_WALL_VARIATIONS; else c+=variation; } else if ( (e1!=NULL) && (string(e1)=="ONEWAYDOOR" ) ) { c=&ps.OneWayDoorColor; n=1; } else if ( (e1!=NULL) && (string(e1)=="FORCEARROW" ) ) { c=&ps.ForceArrowColor; n=1; } else if ( (e1!=NULL) && (string(e1)=="EARTH" ) ) { c=&ps.EarthColor; n=1; } else if ( (e1!=NULL) && (string(e1)=="FLOOR" ) ) { c=&ps.FloorColor; n=1; } else if ( (e1!=NULL) && (string(e1)=="HINT" ) ) { c=&ps.HintColor; n=1; } if(c!=NULL) { for (int j=0; jAttribute("red");TryS2I(quo,i);c[j].r=i; quo=tem->Attribute("green");TryS2I(quo,i);c[j].g=i; quo=tem->Attribute("blue");TryS2I(quo,i);c[j].b=i; c[j].unused=255; } } tem=tem->NextSiblingElement("color"); } return ""; } void parseSkinInformation(TiXmlElement* ele, parsedSkinFile & ps) { TiXmlElement* tem=ele->FirstChildElement("author"); if (tem!=NULL) { if (tem->GetText() != NULL) { ps.author = tem->GetText(); } } tem=ele->FirstChildElement("description"); if (tem!=NULL) { if (tem->GetText() != NULL) { ps.description = tem->GetText(); } } tem=ele->FirstChildElement("title"); if (tem!=NULL) { if (tem->GetText() != NULL) { ps.title = tem->GetText(); } } } string parseSkinColors(TiXmlElement* ele, parsedSkinFile & ps) { string tm = parseSkinMenuColors(ele, ps); if(tm != "") { return tm; } int i; char cname[6]; cname[B_YELLOW]='Y'; cname[B_BLUE]='B'; cname[B_GREEN]='G'; cname[B_RED]='R'; cname[B_PURPLE]='P'; cname[5]='W'; //defaults: for (int i=0; iToElement(); if ( ele == NULL ) { return "Not a valid Xye skin file."; } string err = parseSkinColors(ele, ps); if ( err != "") { return err; } parseSkinInformation(ele,ps); const char* tm; if (tm=ele->Attribute("sprites")) { ps.sprites = fixpath(string("res/")+string(tm),true); if ( ! DoesFileExist(ps.sprites) ) { return "Missing sprites file: "+ps.sprites; } } else { return "No sprites file specified in skin XML."; } if (tm=ele->Attribute("icon")) { ps.windowicon = fixpath(string("res/")+string(tm),true); if ( ! DoesFileExist(ps.windowicon) ) { cout<< "Missing window icon file: "+ps.windowicon<Attribute("luminosity")) { ps.lum = fixpath(string("res/")+string(tm),true); if ( ! DoesFileExist(ps.lum) ) { return "Missing sprites luminosity file: "+ps.lum; } } ps.directionSprites = false; if (tm=ele->Attribute("xyedirections")) { ps.directionSprites = ( (strlen(tm) >= 1) && ((tm[0]=='y') || (tm[0]=='Y') )); } if (tm=ele->Attribute("fontfile")) { ps.font = fixpath(string("res/")+string(tm),true); if (! DoesFileExist(ps.font) ) { return "Missing font file: "+ps.font; } } else { return "No font file specified in skin XML."; } if (tm=ele->Attribute("boldfontfile")) { ps.boldFont = fixpath(string("res/")+string(tm),true); if (! DoesFileExist(ps.boldFont.c_str()) ) { return "Missing bold font file: "+ps.boldFont; } } else { ps.boldFont = ps.font; } ps.ttfSize = 0; if (tm=ele->Attribute("truetypesize")) { sscanf(tm,"%d",&ps.ttfSize); } if (tm=ele->Attribute("size")) { if(sscanf(tm,"%d",&ps.gridSize)!=1) { return "Invalid grid size."; } } else { return "Unspecified grid size."; } return ""; } //--- bool Error(const char* msg) { fprintf(stderr,"%s",msg); throw msg; } TiXmlElement* GetOptionsElement(TiXmlDocument* cnf) { TiXmlElement* ele; if (cnf->LoadFile()) { ele=cnf->FirstChildElement("options"); return(ele); } return NULL; } string fixpath(const string path, bool dohomecheck) { #ifndef _WIN32 string home = GetDataHomeFolder(); if (dohomecheck && (home.length() != 0) ) { string homeloc = home + "/" + path; if (DoesFileExist(homeloc.c_str()) ) { return homeloc; } } #endif return Dir + "/" + path; } void Default() { LevelFile = "#browse"; } TiXmlDocument* defaultxyeconf(const char* path,TiXmlElement *&options) { std::ofstream file; file.open (path,std::ios::trunc | std::ios::out ); if (!file.is_open()) return NULL; //ouch just halt. file << "\n" "\n" ""; file.close(); TiXmlDocument* r=new TiXmlDocument(path); if (options=GetOptionsElement(r)) return r; delete r; return NULL; } TiXmlDocument* getxyeconf(TiXmlElement *&options ) { printf("Looking for valid xyeconf.xml:\n"); string home = GetConfigHomeFolder(), loc; redo: TiXmlDocument* r; if (home.length() != 0) { loc = home + "/xyeconf.xml"; } else { loc = Dir + "/xyeconf.xml"; } r = new TiXmlDocument(loc.c_str()); if (options = GetOptionsElement(r) ) { cout << "xyeconf.xml location: "<QueryIntAttribute("levelnumber",&i); lvnum=i; i=255; if (tm=ele->Attribute("red")) r=atoi(tm); if (tm=ele->Attribute("green")) g=atoi(tm); if (tm=ele->Attribute("blue")) b=atoi(tm); if (tm=ele->Attribute("undo")) { if( tm[0] == 'N' || tm[0] == 'n' ) { printf("NOTE: Undo is disabled!\n"); enundo=false; } } if (tm=ele->Attribute("pickedtheme")) { if( tm[0] == 'Y' || tm[0] == 'y' ) { haspickedtheme=true; } } if (tm=ele->Attribute("disablelevelcolors")) { if( tm[0] == 'Y' || tm[0] == 'y' ) { disableLevelColors = true; } } tm=ele->Attribute("levelfile"); LevelFile = tm; const char * sknfile = ele->Attribute("skinfile"); string skin; if (! sknfile) { //12345678901234567 //"res/default.xml"; skin = fixpath("res/default.xml",true); printf("No skin file selection found in xyeconf.xml, will use default.xml.\n"); } else { skin = fixpath(string("res/") + sknfile, true); } LoadSkinFile(skin.c_str() ); //fix the paths of all the options that are file locations: if (LevelFile != "#browse#") { LevelFile = fixpath(string("levels/")+LevelFile, true); } LoadLevelFile(); delete cnf; } void LoadMenuColors(parsedSkinFile & ps) { LevelMenu_info = ps.LevelMenu_info; LevelMenu_selected = ps.LevelMenu_selected; LevelMenu_selectederror = ps.LevelMenu_selectederror; LevelMenu_menu = ps.LevelMenu_menu; LevelMenu_menutext = ps.LevelMenu_menutext; LevelMenu_selectedtext = ps.LevelMenu_selectedtext; LevelMenu_infotext = ps.LevelMenu_infotext; } void LoadColors(parsedSkinFile & ps) { LoadMenuColors(ps); for (int i=0; i<6; i++) { BFColor[i] = ps.BFColor[i]; BKColor[i] = ps.BKColor[i]; } for (int i=0; i= MAX_FILENAMES_TO_REMEMBER ) { //remove the one with the lowest time std::pair oldest = MemFileLevelNumber.begin()->first; MemFileLevelTime.erase( MemFileLevelTime.find(oldest.second) ); MemFileLevelNumber.erase(MemFileLevelNumber.begin()); } MemFileLevelTime[s] = MemTime; MemFileLevelNumber[ make_pair(MemTime,s) ] = levelNumber; } LevelFile = filename; lvnum = levelNumber; } void SaveLevelGame(string filename, int levelNumber, string moves) { if ( moves == string(moves.length(), '0') ) { ForgetLevelGame(filename,levelNumber); } else { pair p = make_pair(filename, levelNumber); MemSavedGame[p] = moves; } } string LoadLevelGame(string filename, int levelNumber) { pair p = make_pair(filename, levelNumber); map,string>::iterator q = MemSavedGame.find(p); if ( q == MemSavedGame.end() ) { return ""; } else { return q->second; } } void ForgetLevelGame(string filename, int levelNumber) { pair p = make_pair(filename, levelNumber); map,string>::iterator q = MemSavedGame.find(p); if ( q != MemSavedGame.end() ) { MemSavedGame.erase(q); } } unsigned int GetLevelNumber(const char* filename) { if(filename==NULL) return 1; string s=filename; if( MemFileLevelTime.count(s)) { int t = MemFileLevelTime[s]; return MemFileLevelNumber[ make_pair(t, s) ]; } return 1; } void PerformLevelFileSave() { if(options_saveignored) return; std::ofstream file; string home = GetDataHomeFolder(); string path; if (home.length() > 0) { path = home+"/lastlevel.conf"; } else { path = Dir+"/lastlevel.conf"; } file.open (path.c_str(),std::ios::trunc | std::ios::out ); if (!file.is_open()) return ; //ouch just halt. for ( memmap::iterator q = MemFileLevelNumber.begin(); q!=MemFileLevelNumber.end(); q++) { file<< q->first.second << std::endl<< q->second < 0) { path = home+"/savedgames.conf"; } else { path = Dir+"/savedgames.conf"; } file.open (path.c_str(),std::ios::trunc | std::ios::out ); if (!file.is_open()) return ; //ouch just halt. for ( map< pair, string >::iterator q = MemSavedGame.begin(); q!=MemSavedGame.end(); q++) { file<< q->first.first<< std::endl << q->first.second << " "<second < 0) { path = home+"/xyeconf.xml"; } else { path = Dir+"/xyeconf.xml"; } file.open (path.c_str(),std::ios::trunc | std::ios::out ); if (!file.is_open()) return ; //ouch just halt. file<<""<"<"< 0) { path = home + "/savedgames.conf"; } else { path = Dir + "/savedgames.conf"; } file.open (path.c_str(), std::ios::in ); if ( file.is_open()) { string LevelFile; int lvnum; string savedgame, empty; while( !file.eof() ) { getline(file,LevelFile); if(LevelFile=="") break; file>>lvnum; file>>savedgame; SaveLevelGame(LevelFile.c_str(), lvnum, savedgame); getline(file,LevelFile); } } file.close(); if (home.length() > 0) { path = home + "/lastlevel.conf"; } else { path = Dir + "/lastlevel.conf"; } file2.open (path.c_str(), std::ios::in ); if ( (!file2.is_open()) || (file2.eof() ) ) { printf("Could not open lastlevel.conf\n"); LevelFile = "#browse#"; lvnum = 0; return ; //ouch just halt. } string LevelFile; int lvnum; while( !file2.eof() ) { getline(file2,LevelFile); if(LevelFile=="") break; file2>>lvnum; SaveLevelFile(LevelFile.c_str(), lvnum); getline(file2,LevelFile); } } bool UndoEnabled() { return enundo; } bool HasConsciouslyChosenTheme() { return haspickedtheme; } struct previewMaker { int w,h; int sz; parsedSkinFile* ps; Drawer* D; LuminositySprites ls; SDL_Surface * result; previewMaker(parsedSkinFile& ps, int w, int h) { this->w = w; this->h = h; this->ps = &ps; this->sz = ps.gridSize; ls.sprites = IMG_Load( ps.sprites.c_str() ); if(ps.lum == "") { ls.luminosity = NULL; } else { ls.luminosity = IMG_Load( ps.lum.c_str() ); } D = new Drawer(ls,0,0,sz,sz); result = SDL_CreateRGBSurface(0,w,h,32,SDL_ENDIAN32MASKS); Uint32 col = SDL_MapRGB(result->format, ps.FloorColor ); SDL_FillRect(result, 0, 0, w, h, col ); draw(0,0, 1,0, Red(), Green(), Blue()); //blocks draw(1,0,2,0, ps.BKColor[0]); draw(1,0,3,0, ps.BKColor[1]); draw(1,0,4,0, ps.BKColor[2]); draw(1,0,5,0, ps.BKColor[3]); //arrows draw(1,0,9,0, ps.BKColor[0]); draw(4,9,9,0, ps.BFColor[0]); draw(1,0,9,1, ps.BKColor[1]); draw(4,10,9,1, ps.BFColor[1]); draw(2,0,9,2, ps.BKColor[2]); draw(5,12,9,2, ps.BFColor[2]); draw(2,0,9,3, ps.BKColor[3]); draw(5,11,9,3, ps.BFColor[3]); //magnets draw(6,12,7,1); //wildcard draw(1,2,7,2); //gems draw(2,3+rand()%2,1,1); draw(3,3+rand()%2,4,1); draw(4,3+rand()%2,3,1); draw(5,3+rand()%2,2,1); draw(9,12+rand()%2,5,1); //monsters draw(16, rand()%2, 1,2); draw(19, rand()%2, 2,2); draw(19, 6+rand()%3, 3,2); draw(19, 9+rand()%3, 4,2); draw(10,12+rand()%2, 5,2); //robot draw(3,rand()%3, 1,3); //blackie draw(0,3, 2,3); draw(0,4, 2,3); //portal draw(8,rand()%3, 3,3, ps.BKColor[(int)(rand()%4)] ); { //turner int d = rand()%4; draw(1,0,7,3, ps.BKColor[d]); draw(3,10,7,3, ps.BFColor[d]); } //pusher int d=rand()%2; draw(4+d,5, 6,0, ps.BKColor[0]); draw(4+d,7, 6,0, ps.BFColor[0]); d=rand()%2; draw(4+d,6, 7,0, ps.BKColor[2]); draw(4+d,8, 7,0, ps.BFColor[2]); //wall time ! sz /= 2; draw(18,0, 0,0, ps.WallColor[0]); draw(19,0, 1,0, ps.WallColor[0]); for (int i=0; i<6; i++) { draw(24,i%2==0, 0,1+i, ps.WallColor[0]); draw(25,i%2==0, 1,1+i, ps.WallColor[0]); } draw(18,1, 0,7, ps.WallColor[0]); draw(19,1, 1,7, ps.WallColor[0]); //-- draw(18,4, 12,2, ps.WallColor[2]); draw(19,4, 13,2, ps.WallColor[2]); for (int i=0; i<4; i++) { draw(24,4+(i%2==0), 12,3+i, ps.WallColor[2]); draw(25,4+(i%2==0), 13,3+i, ps.WallColor[2]); } draw(18,5, 12,7, ps.WallColor[2]); draw(19,5, 13,7, ps.WallColor[2]); //-- draw(18,10, 16,0, ps.WallColor[5]); draw(19,10, 17,0, ps.WallColor[5]); for (int i=0; i<6; i++) { draw(24,10+(i%2==0), 16,1+i, ps.WallColor[5]); draw(25,10+(i%2==0), 17,1+i, ps.WallColor[5]); } draw(18,11, 16,7, ps.WallColor[5]); draw(19,11, 17,7, ps.WallColor[5]); } ~previewMaker() { SDL_FreeSurface(ls.sprites); if(ls.luminosity != NULL) { SDL_FreeSurface(ls.luminosity); } delete D; } void draw(int sx, int sy, int tx, int ty, SDL_Color col) { D->ChangeRect(sx*sz, sy*sz, sz, sz); D->SetColors(col,255); D->Draw(result, tx*sz, ty*sz); } void draw(int sx, int sy, int tx, int ty, Uint8 r, Uint8 g, Uint8 b) { SDL_Color col; col.unused = 255; col.r = r, col.g = g, col.b = b; draw(sx,sy,tx,ty, col); } void draw(int sx, int sy, int tx, int ty) { SDL_Color col; col.unused = col.r = col.g = col.b = 255; draw(sx,sy,tx,ty, col); } }; SDL_Surface* makeSkinPreview(parsedSkinFile & ps, int w, int h) { previewMaker pr(ps,w,h); return pr.result; } bool GetSkinInformation(const char* file, SkinInformation & si) { si.title = ""; si.author = ""; si.description = ""; si.title = ""; if(si.preview != NULL) { SDL_FreeSurface(si.preview); } si.preview = NULL; parsedSkinFile ps; string error = parseSkinFile(file, ps); if(error!="") { si.description = error; return false; } //Make preview... haspickedtheme = true; si.preview= makeSkinPreview(ps, si.pw, si.ph); si.dimx = ps.gridSize * 30; si.dimy = ps.gridSize * 22; si.author = ps.author; si.description = ps.description; si.title = ps.title;; return true; } void LoadSkinFile(const char* file) { parsedSkinFile ps; string tms = parseSkinFile(file, ps); if(tms=="") { currentSkinFile = file; LoadColors(ps); WindowIcon = ps.windowicon; Texture = new char[ps.sprites.length()+1]; strcpy(Texture, ps.sprites.c_str()); if(ps.lum == "") { LuminosityTexture = NULL; } else { LuminosityTexture = new char[ps.lum.length()+1]; strcpy(LuminosityTexture, ps.lum.c_str()); } FontBoldSize = FontSize = ps.ttfSize; xyeDirectionSprites = ps.directionSprites; Font = new char[ps.font.length()+1]; strcpy(Font, ps.font.c_str()); FontBold = new char[ps.boldFont.length()+1]; strcpy(FontBold, ps.boldFont.c_str()); GridSize = ps.gridSize; } else { printf("%s",(tms+"\n").c_str()); } } void ChangeSkinFile(const char* file, bool enableLevelColors) { LoadSkinFile(file); disableLevelColors = ! enableLevelColors; game::RefreshGraphics(); haspickedtheme = true; options::SaveConfigFile(); } } xye-0.12.2+dfsg/src/options.h000066400000000000000000000052121225403634500157570ustar00rootroot00000000000000#include "tinyxml/xye_tinyxml.h" #include "vxsdl.h" #ifndef OPTIONS_H #define OPTIONS_H 1 using std::string; const int XYE_WALL_VARIATIONS = 6; namespace options { struct SkinInformation { int pw,ph; int dimx,dimy; string title; string author; string description; SDL_Surface* preview; }; void IgnoreLevelSave(); string GetDir(); const string& GetDataHomeFolder(); const string& GetConfigHomeFolder(); string GetLevelsHomeFolder(); // ~/.local/share/xye/levels or nothing string GetResHomeFolder(); // ~/.local/share/xye/levels or nothing string GetMyLevelsFolder(); //~/.local/share/xye/levels or mylevels string fixpath(const string path, bool dohomecheck=false); void Init(); void Clean(); const char* GetLevelFile(); unsigned int GetLevelNumber( const char* levelfile); const char* GetSpriteFile(); const char* GetLuminositySpriteFile(); const string GetWindowIconFile(); int GetFontSize(); int GetFontBoldSize(); const char* GetFontFile(); const char* GetFontBoldFile(); int GetGridSize(); void SaveLevelFile(string filename, int levelNumber = 0); void SaveLevelGame(string filename, int levelNumber, string moves); string LoadLevelGame(string filename, int levelNumber); void ForgetLevelGame(string filename, int levelNumber); unsigned char Red(); unsigned char Green(); unsigned char Blue(); bool LevelColorsDisabled(); bool UndoEnabled(); bool HasConsciouslyChosenTheme(); extern bool xyeDirectionSprites; extern string Dir; extern SDL_Color OneWayDoorColor; extern SDL_Color ForceArrowColor; extern SDL_Color EarthColor; extern SDL_Color FloorColor; extern SDL_Color WallColor [XYE_WALL_VARIATIONS]; extern SDL_Color WallSpriteColor[XYE_WALL_VARIATIONS]; extern SDL_Color BFColor[6]; extern SDL_Color BKColor[6]; extern SDL_Color HintColor; extern SDL_Color LevelMenu_info; extern SDL_Color LevelMenu_selected; extern SDL_Color LevelMenu_selectederror; extern SDL_Color LevelMenu_menu; extern SDL_Color LevelMenu_menutext; extern SDL_Color LevelMenu_selectedtext; extern SDL_Color LevelMenu_infotext; extern string ExecutablePath; bool GetSkinInformation(const char* file, SkinInformation & si); void ChangeSkinFile(const char* file, bool enableLevelColors); string GetSkinFile(bool stripPath = true); } #endif xye-0.12.2+dfsg/src/record.cpp000066400000000000000000000102271225403634500160770ustar00rootroot00000000000000#include "xye.h" #include "record.h" #include #include #include "gen.h" recentry* recording::first; recentry* recording::last; recentry* recording::undos; unsigned int recording::undos_r=0; void recording::init() { first=last=undos=NULL; undos_r=0; } bool recording::undo() { recentry* r=NULL,*z=NULL,*q=NULL,*p=first; int v; while (p!=NULL) { if (p->val) { z=r; q=p; } r=p; p=p->next; } if (!q) return false; //now z holds the node before last xye step, and q last xye step last=z; if (z==NULL) first=NULL; else z->next=NULL; while (q!=NULL) { z=q; q=q->next; delete z; } undos=first; return true; } void recording::add(unsigned int val) { if (last && (val==last->val) ) { last->count++; return; } recentry* tm=new recentry; tm->next=NULL; tm->val=val; tm->count=1; if (last) { last->next=tm; last=tm; } else first=last=tm; } void recording::add(edir a) { switch(a) { case(D_UP): recording::add(8); break; case(D_DOWN): recording::add(2); break; case(D_LEFT): recording::add(4); break; default: recording::add(6); } } void recording::add_nomove() { recording::add(0); } void recording::clean() { recentry* tm; while (tm=first) { first=tm->next; delete tm; } first=last=undos=NULL; } bool recording::get_undo(edir &r, bool& nomove) { if (undos == NULL) return false; recentry* tm=undos; nomove=false; switch (tm->val) { case(4): r=D_LEFT; break; case(6): r=D_RIGHT; break; case(8): r=D_UP; break; case(2): r=D_DOWN; break; default: nomove=true; } if (undos->count -1 <= undos_r) { undos_r=0;; undos=undos->next; } else { undos_r++; } return true; } bool recording::get(edir &r, bool& nomove) { if (first == NULL) return false; recentry* tm=first; nomove=false; switch (tm->val) { case(4): r=D_LEFT; break; case(6): r=D_RIGHT; break; case(8): r=D_UP; break; case(2): r=D_DOWN; break; default: nomove=true; } first->count--; if ( first->count <= 0) { first=first->next; delete tm; } return true; } bool recording::load(const string st) { unsigned int L = st.length(),i=0; if (L == 0) return false; recording::clean(); while (inext) { L+=tm->count; } char * r=new char[L+1]; tm=first; unsigned int i=0,j; while(icount;j++) { r[i]=(char)('0'+tm->val); i++; } tm=tm->next; } r[i]='\0'; return(r); } bool recording::saveInFile(string target,const char* levelfn,unsigned int ln) { std::ofstream file; file.open (target.c_str(),std::ios::trunc | std::ios::out ); if (!file.is_open()) return false; //ouch just halt. file << "\n\n\n"; char * rep=save(); file << rep; file << "\n\n"; delete [] rep; file.close(); return true; } xye-0.12.2+dfsg/src/record.h000066400000000000000000000013341225403634500155430ustar00rootroot00000000000000 struct recentry { recentry* next; unsigned int val; unsigned int count; }; class recording { private: static recentry* first; static recentry* last; static recentry* undos; static unsigned int undos_r; static void add(unsigned int val); public: static void init(); static bool load(const string st); static char* save(); //use delete[] on returned value. static bool saveInFile(const string target,const char* levelfn,unsigned int ln); static bool undo(); static void add(edir a); static void add_nomove(); static bool get(edir &r, bool& nomove); static bool get_undo(edir &r, bool& nomove); static void clean(); }; xye-0.12.2+dfsg/src/resource.rc000066400000000000000000000000351225403634500162660ustar00rootroot00000000000000IDR_ICO_MAIN ICON "xye.ico" xye-0.12.2+dfsg/src/skins.cpp000066400000000000000000000360161225403634500157540ustar00rootroot00000000000000/* Xye License (it is a PNG/ZLIB license) Copyright (c) 2006 Victor Hugo Soliz Kuncar This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. 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 appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. */ #include "xye.h" #include "xyedit.h" #include "xye_script.h" #include "levels.h" #include "options.h" #include "vxsdl.h" #include "listbox.h" #include #include #include #include using std::string; using std::sort; #include "browser.h" #define themesfolder "res/" //#define levsfolder "levels/kye/charity/" using options::SkinInformation; namespace SkinBrowser { window* thewindow; listbox* skinlistbox; listbox* levelColorsListBox; button* SetButton; Font* MenuFont; Font* MenuSelectedFont; Font* InfoFont; Font* InfoBoldFont; bool runeditor; bool editfile; SkinInformation SkinData; unsigned int FileLevelsN; string* FoundFile=NULL; unsigned int FileN=0; int Active; bool ActiveIsValid; void LoadActiveFileInfo(); const char* SPACING_TEXT = " "; class SkinInfoControl: public control { public: SkinInfoControl(int sx, int sy, int sw, int sh) { x=sx, y=sy, w=sw, h=sh; } void loop(){} void draw(SDL_Surface* target) { Uint32 back=SDL_MapRGB(target->format, options::LevelMenu_info); SDL_FillRect(target, x,y,w,h, back); Sint16 sh = h; Sint16 fh=options::GetGridSize();// game::FontRes->Height(); int fof=0; int fohei=InfoFont->Height(); if(fhHeight()+2; fof=1; } else fof=(fh-fohei)/2; Sint16 cy=y+h/8,cx=x+2; cx+=5; Sint16 nw = cx+InfoFont->TextWidth(" ");; if(SkinData.title != "") { InfoBoldFont->Write(target,cx,cy,"Title:"); cy+=fh; InfoFont->Write(target,nw,cy, SkinData.title); cy+=fh; } if (SkinData.author != "") { InfoBoldFont->Write(target,cx,cy,"Author:"); cy+=fh; InfoFont->Write(target,nw,cy, SkinData.author); cy+=fh; } if(SkinData.description != "") { InfoBoldFont->Write(target,cx,cy,"Description:"); cy+=fh; string tm=" "+SkinData.description; int temh = InfoFont->WrappedTextHeight(tm, x+w - nw-5)+fh/5; temh = min(temh, y+h-cy); InfoFont->WriteWrap(target,nw,cy,x+w - nw-5,temh, tm); cy+= temh; } if(FileLevelsN>1) { char tml[6]; snprintf(tml,5,"%d",FileLevelsN); InfoBoldFont->Write(target,cx,cy,"Levels:"); cy+=fh; InfoFont->Write(target,nw,cy,tml); cy+=fh; } InfoBoldFont->Write(target,cx,cy,"Location:"); cy+=fh; InfoFont->Write(target,nw,cy, FoundFile[Active]); //delete pt; cy+=fh; { char buf[100]; sprintf(buf," %d x %d", SkinData.dimx, SkinData.dimy); InfoBoldFont->Write(target,cx,cy,"Size:"); cy+=fh; InfoFont->WriteWrap(target,nw,cy,x+w - nw-5,y+h-cy, buf); cy+=fh; } if(SkinData.preview != NULL) { InfoBoldFont->Write(target,cx,cy,"Preview:"); cy+=fh; SDL_BlitSurface(SkinData.preview,0,0,SkinData.pw,SkinData.ph, target,cx,cy); cy+=SkinData.ph; } } void onMouseMove(int px,int py){} void onMouseOut() {} void onMouseDown(int px,int py) {} void onMouseUp(int px,int py) {} void onMouseRightUp(int px,int py) {} }; bool Axyeskin(const char* f) { return HasExtension(f,"xml"); } unsigned int CountMatchingFiles(const char* nf) { Folder F(nf); unsigned int c=0; const char* N; if (! F.Open()) { printf ("No skins found on %s \n",nf); return 0; } while (N=F.NextFileMatching(Axyeskin)) if (strlen(N)<=20) c++; F.Reset(); while (N=F.NextSubFolder()) { char * tm=new char[strlen(nf)+strlen(N)+2]; strcpy(tm,nf); strcat(tm,N); strcat(tm,"/"); c+=CountMatchingFiles(tm); delete[] tm; } return c; } unsigned int CountMatchingFiles() { string nf = options::fixpath(themesfolder); string hm = options::GetResHomeFolder(); unsigned int c; c = CountMatchingFiles(nf.c_str() ); if ( hm.length() != 0 ) { c += CountMatchingFiles(hm.c_str() ); } return(c); } void FillArrayWithFilenames(const char* nf, const char* lvp, unsigned int &c) { const char* N; unsigned int L; Folder F(nf); if (! F.Open()) return; while ((c lf.length() ) { if( std::equal(lf.begin(), lf.end(), s.begin()) ) { r=1; string x = s.substr(lf.length()); if(x=="tutorials.xye") r=4; if(x=="levels.xye") r=3; if(x=="kye.xye") r=2; } } return r; } bool operator()( const string &a, const string &b) { // printf("LF is %s \n",lf); int arank = getRank(a); int brank = getRank(b); int asla = count(a.begin(), a.end(), '/')+count(a.begin(), a.end(), '\\'); int bsla = count(b.begin(), b.end(), '/')+count(b.begin(), b.end(), '\\');; if( arank==brank) { if(asla == bsla) return (abrank); } }; bool onItemSelected(listbox* lb) { Active = lb->getSelectedIndex(); LoadActiveFileInfo(); return ActiveIsValid; } void FillArrayWithFilenames() { string nf = options::fixpath(themesfolder); Folder F(nf.c_str()); if (! F.Open()) { game::Error("cannot find a levels folder"); } unsigned int c=0; int i; const char* N; unsigned int L; string aux; while ((caddItem(StripPath(FoundFile[i]), FoundFile[i]); } skinlistbox->selectItem(Active); } void LoadActiveFileInfo() { string &fl=FoundFile[Active]; SkinData.pw = 21*options::GetGridSize(); SkinData.ph = 200; ActiveIsValid= options::GetSkinInformation(fl.c_str(),SkinData); SetButton->Visible = ActiveIsValid; } void onKeyDown(SDLKey keysim, Uint16 unicode) { } void OnSetButtonClick(const buttondata* data) { if(ActiveIsValid) { bool levelColors = ( levelColorsListBox->getSelectedValue() == "YES"); options::ChangeSkinFile(FoundFile[Active].c_str(), levelColors); thewindow->SetTransition(LevelBrowser::StartSection); } } void OnCancelButtonClick(const buttondata* data) { thewindow->SetTransition(LevelBrowser::StartSection); } void onKeyUp(SDLKey keysim, Uint16 unicode) { skinlistbox->onKeyUp(keysim, unicode); switch (keysim) { case(SDLK_ESCAPE): case(SDLK_BACKSPACE): OnCancelButtonClick(NULL); break; case(SDLK_LEFT): break; case(SDLK_RIGHT): break; case(SDLK_RETURN): case(SDLK_KP_ENTER): //Enter OnSetButtonClick(NULL); } } void onItemDoubleClick(listbox* lb) { if (ActiveIsValid) { OnSetButtonClick(NULL); } } void Show() { runeditor=false; editfile=false; if (FoundFile!=NULL) delete[] FoundFile; FileN=CountMatchingFiles(); if (! FileN) game::Error("No level files found"); FoundFile= new string[FileN]; FillArrayWithFilenames(); string sk = options::GetSkinFile(false); for (int i=0; iselectItem(i); } } LoadActiveFileInfo(); bool loop=true; // //delete[] FoundFile; //FoundFile=NULL; } void onExitAttempt() { thewindow->stop(); } void StartSection(window* wind) { thewindow = wind; wind->SetCaption("Xye - Select a theme"); Sint16 lw = 2+game::FontRes->TextWidth(SPACING_TEXT); const char* allow = "Custom level colors:"; Sint16 captionNeed = game::FontRes->splitByLines(allow, lw - game::GRIDSIZE).size() * game::FontRes->Height() + game::GRIDSIZE; Sint16 listNeed = game::FontRes->Height() * 2 + game::GRIDSIZE; Sint16 lh = wind->Height - captionNeed - listNeed; listbox* ll = listbox::makeNew(0,0, lw , lh ); skinlistbox = ll; ll->depth= 1; ll->NormalFont = MenuFont; ll->SelectedFont = MenuSelectedFont; ll->BackgroundColor = options::LevelMenu_menu; ll->SelectedColor = options::LevelMenu_selected; ll->InvalidColor = options::LevelMenu_selectederror; ll->BarColor = options::LevelMenu_info; ll->onSelect = onItemSelected; ll->onItemDoubleClick = onItemDoubleClick; ll->depth= 1; wind->addControl(ll); control* tmcontrol; tmcontrol = new rectangle(0,lh,lw,captionNeed, options::LevelMenu_info ); tmcontrol->depth = 1; wind->addControl(tmcontrol); textblock * tx = new textblock(game::GRIDSIZE/2, lh + game::GRIDSIZE/2, lw - game::GRIDSIZE, captionNeed - game::GRIDSIZE/2, game::FontRes); tx->depth = 2; tx->text= allow; wind->addControl(tx); ll = listbox::makeNew(0, captionNeed + lh, lw, listNeed); levelColorsListBox = ll; ll->NormalFont = MenuFont; ll->SelectedFont = MenuSelectedFont; ll->BackgroundColor = options::LevelMenu_menu; ll->SelectedColor = options::LevelMenu_selected; ll->InvalidColor = options::LevelMenu_selectederror; ll->BarColor = options::LevelMenu_info; ll->addItem("Enabled", "YES"); ll->addItem("Disabled", "NO"); if (options::LevelColorsDisabled()) { ll->selectItem(1); } else { ll->selectItem(0); } ll->depth= 1; wind->addControl(ll); SkinInfoControl* li = new SkinInfoControl(lw, 0, wind->Width-lw, wind->Height); li->depth= 2; Sint16 w,cx; button* but; cx = lw; //== Use button w = button::recommendedWidth("Use theme"); but = new button( cx, wind->Height - game::GRIDSIZE, w, game::GRIDSIZE); but->onClick = OnSetButtonClick; but->text = "Use theme"; but->depth = 3; SetButton = but; wind->addControl(but); cx+=w+1; //== Quit w = button::recommendedWidth("Cancel"); but = new button( wind->Width-1-w, wind->Height - game::GRIDSIZE, w, game::GRIDSIZE); but->text = "Cancel"; but->depth = 3; but->onClick = OnCancelButtonClick; wind->addControl(but); //... wind->addControl(li); wind->onKeyUp = onKeyUp; wind->onKeyDown = onKeyDown; wind->onExitAttempt = onExitAttempt; Show(); return; } void SetupNormalFonts(SDL_Surface* SS) { MenuFont=new Font(SS, options::LevelMenu_menutext); MenuSelectedFont=new Font(SS, options::LevelMenu_selectedtext); InfoFont=new Font(SS, options::LevelMenu_infotext); } void SetupNormalFonts(const char* ttf, const int & size) { MenuFont=new Font(ttf, size , options::LevelMenu_menutext); MenuSelectedFont=new Font(ttf, size, options::LevelMenu_selectedtext); InfoFont=new Font(ttf, size, options::LevelMenu_infotext); } void SetupBoldFonts(SDL_Surface* SS) { InfoBoldFont=new Font(SS, options::LevelMenu_infotext); } void SetupBoldFonts(const char* ttf, const int & size) { InfoBoldFont=new Font(ttf, size, options::LevelMenu_infotext); } void DeleteFonts() { delete MenuFont; delete MenuSelectedFont; delete InfoFont; delete InfoBoldFont; } void Clean() { if(SkinData.preview != NULL) { SDL_FreeSurface(SkinData.preview); } DeleteFonts(); } } xye-0.12.2+dfsg/src/skins.h000066400000000000000000000005071225403634500154150ustar00rootroot00000000000000#include "vxsdl.h" #include "window.h" namespace SkinBrowser { void StartSection(window* wind); void SetupNormalFonts(SDL_Surface* SS); void SetupNormalFonts(const char* ttf, const int & size); void SetupBoldFonts(SDL_Surface* SS); void SetupBoldFonts(const char* ttf, const int & size); void Clean(); } xye-0.12.2+dfsg/src/tinyxml/000077500000000000000000000000001225403634500156175ustar00rootroot00000000000000xye-0.12.2+dfsg/src/tinyxml/xye_tinystr.cpp000077500000000000000000000050341225403634500207310ustar00rootroot00000000000000/* www.sourceforge.net/projects/tinyxml Original file by Yves Berquin. This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. 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 appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. */ /* * THIS FILE WAS ALTERED BY Tyge Lvset, 7. April 2005. */ #ifndef TIXML_USE_STL #include "xye_tinystr.h" // Error value for find primitive const TiXmlString::size_type TiXmlString::npos = static_cast< size_type >(-1); // Null rep. TiXmlString::Rep TiXmlString::nullrep_ = { 0, 0, '\0' }; void TiXmlString::reserve (size_type cap) { if (cap > capacity()) { TiXmlString tmp; tmp.init(length(), cap); memcpy(tmp.start(), data(), length()); swap(tmp); } } TiXmlString& TiXmlString::assign(const char* str, size_type len) { size_type cap = capacity(); if (len > cap || cap > 3*(len + 8)) { TiXmlString tmp; tmp.init(len); memcpy(tmp.start(), str, len); swap(tmp); } else { memmove(start(), str, len); set_size(len); } return *this; } TiXmlString& TiXmlString::append(const char* str, size_type len) { size_type newsize = length() + len; if (newsize > capacity()) { reserve (newsize + capacity()); } memmove(finish(), str, len); set_size(newsize); return *this; } TiXmlString operator + (const TiXmlString & a, const TiXmlString & b) { TiXmlString tmp; tmp.reserve(a.length() + b.length()); tmp += a; tmp += b; return tmp; } TiXmlString operator + (const TiXmlString & a, const char* b) { TiXmlString tmp; TiXmlString::size_type b_len = static_cast( strlen(b) ); tmp.reserve(a.length() + b_len); tmp += a; tmp.append(b, b_len); return tmp; } TiXmlString operator + (const char* a, const TiXmlString & b) { TiXmlString tmp; TiXmlString::size_type a_len = static_cast( strlen(a) ); tmp.reserve(a_len + b.length()); tmp.append(a, a_len); tmp += b; return tmp; } #endif // TIXML_USE_STL xye-0.12.2+dfsg/src/tinyxml/xye_tinystr.h000077500000000000000000000200711225403634500203740ustar00rootroot00000000000000/* www.sourceforge.net/projects/tinyxml Original file by Yves Berquin. This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. 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 appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. */ /* * THIS FILE WAS ALTERED BY Tyge Lovset, 7. April 2005. * * - completely rewritten. compact, clean, and fast implementation. * - sizeof(TiXmlString) = pointer size (4 bytes on 32-bit systems) * - fixed reserve() to work as per specification. * - fixed buggy compares operator==(), operator<(), and operator>() * - fixed operator+=() to take a const ref argument, following spec. * - added "copy" constructor with length, and most compare operators. * - added swap(), clear(), size(), capacity(), operator+(). */ #ifndef TIXML_USE_STL #ifndef TIXML_STRING_INCLUDED #define TIXML_STRING_INCLUDED #include #include /* TiXmlString is an emulation of a subset of the std::string template. Its purpose is to allow compiling TinyXML on compilers with no or poor STL support. Only the member functions relevant to the TinyXML project have been implemented. The buffer allocation is made by a simplistic power of 2 like mechanism : if we increase a string and there's no more room, we allocate a buffer twice as big as we need. */ class TiXmlString { public : // The size type used typedef unsigned int size_type; // Error value for find primitive static const size_type npos; // = -1; // TiXmlString empty constructor TiXmlString () : rep_(&nullrep_) { } // TiXmlString copy constructor TiXmlString (const TiXmlString & copy) { init(copy.length()); memcpy(start(), copy.data(), length()); } // TiXmlString constructor, based on a string TiXmlString (const char * copy) { init( static_cast( strlen(copy) )); memcpy(start(), copy, length()); } // TiXmlString constructor, based on a string TiXmlString (const char * str, size_type len) { init(len); memcpy(start(), str, len); } // TiXmlString destructor ~TiXmlString () { quit(); } // = operator TiXmlString& operator = (const char * copy) { return assign( copy, (size_type)strlen(copy)); } // = operator TiXmlString& operator = (const TiXmlString & copy) { return assign(copy.start(), copy.length()); } // += operator. Maps to append TiXmlString& operator += (const char * suffix) { return append(suffix, static_cast( strlen(suffix) )); } // += operator. Maps to append TiXmlString& operator += (char single) { return append(&single, 1); } // += operator. Maps to append TiXmlString& operator += (const TiXmlString & suffix) { return append(suffix.data(), suffix.length()); } // Convert a TiXmlString into a null-terminated char * const char * c_str () const { return rep_->str; } // Convert a TiXmlString into a char * (need not be null terminated). const char * data () const { return rep_->str; } // Return the length of a TiXmlString size_type length () const { return rep_->size; } // Alias for length() size_type size () const { return rep_->size; } // Checks if a TiXmlString is empty bool empty () const { return rep_->size == 0; } // Return capacity of string size_type capacity () const { return rep_->capacity; } // single char extraction const char& at (size_type index) const { assert( index < length() ); return rep_->str[ index ]; } // [] operator char& operator [] (size_type index) const { assert( index < length() ); return rep_->str[ index ]; } // find a char in a string. Return TiXmlString::npos if not found size_type find (char lookup) const { return find(lookup, 0); } // find a char in a string from an offset. Return TiXmlString::npos if not found size_type find (char tofind, size_type offset) const { if (offset >= length()) return npos; for (const char* p = c_str() + offset; *p != '\0'; ++p) { if (*p == tofind) return static_cast< size_type >( p - c_str() ); } return npos; } void clear () { //Lee: //The original was just too strange, though correct: // TiXmlString().swap(*this); //Instead use the quit & re-init: quit(); init(0,0); } /* Function to reserve a big amount of data when we know we'll need it. Be aware that this function DOES NOT clear the content of the TiXmlString if any exists. */ void reserve (size_type cap); TiXmlString& assign (const char* str, size_type len); TiXmlString& append (const char* str, size_type len); void swap (TiXmlString& other) { Rep* r = rep_; rep_ = other.rep_; other.rep_ = r; } private: void init(size_type sz) { init(sz, sz); } void set_size(size_type sz) { rep_->str[ rep_->size = sz ] = '\0'; } char* start() const { return rep_->str; } char* finish() const { return rep_->str + rep_->size; } struct Rep { size_type size, capacity; char str[1]; }; void init(size_type sz, size_type cap) { if (cap) { // Lee: the original form: // rep_ = static_cast(operator new(sizeof(Rep) + cap)); // doesn't work in some cases of new being overloaded. Switching // to the normal allocation, although use an 'int' for systems // that are overly picky about structure alignment. const size_type bytesNeeded = sizeof(Rep) + cap; const size_type intsNeeded = ( bytesNeeded + sizeof(int) - 1 ) / sizeof( int ); rep_ = reinterpret_cast( new int[ intsNeeded ] ); rep_->str[ rep_->size = sz ] = '\0'; rep_->capacity = cap; } else { rep_ = &nullrep_; } } void quit() { if (rep_ != &nullrep_) { // The rep_ is really an array of ints. (see the allocator, above). // Cast it back before delete, so the compiler won't incorrectly call destructors. delete [] ( reinterpret_cast( rep_ ) ); } } Rep * rep_; static Rep nullrep_; } ; inline bool operator == (const TiXmlString & a, const TiXmlString & b) { return ( a.length() == b.length() ) // optimization on some platforms && ( strcmp(a.c_str(), b.c_str()) == 0 ); // actual compare } inline bool operator < (const TiXmlString & a, const TiXmlString & b) { return strcmp(a.c_str(), b.c_str()) < 0; } inline bool operator != (const TiXmlString & a, const TiXmlString & b) { return !(a == b); } inline bool operator > (const TiXmlString & a, const TiXmlString & b) { return b < a; } inline bool operator <= (const TiXmlString & a, const TiXmlString & b) { return !(b < a); } inline bool operator >= (const TiXmlString & a, const TiXmlString & b) { return !(a < b); } inline bool operator == (const TiXmlString & a, const char* b) { return strcmp(a.c_str(), b) == 0; } inline bool operator == (const char* a, const TiXmlString & b) { return b == a; } inline bool operator != (const TiXmlString & a, const char* b) { return !(a == b); } inline bool operator != (const char* a, const TiXmlString & b) { return !(b == a); } TiXmlString operator + (const TiXmlString & a, const TiXmlString & b); TiXmlString operator + (const TiXmlString & a, const char* b); TiXmlString operator + (const char* a, const TiXmlString & b); /* TiXmlOutStream is an emulation of std::ostream. It is based on TiXmlString. Only the operators that we need for TinyXML have been developped. */ class TiXmlOutStream : public TiXmlString { public : // TiXmlOutStream << operator. TiXmlOutStream & operator << (const TiXmlString & in) { *this += in; return *this; } // TiXmlOutStream << operator. TiXmlOutStream & operator << (const char * in) { *this += in; return *this; } } ; #endif // TIXML_STRING_INCLUDED #endif // TIXML_USE_STL xye-0.12.2+dfsg/src/tinyxml/xye_tinyxml.cpp000077500000000000000000001017601225403634500207240ustar00rootroot00000000000000/* www.sourceforge.net/projects/tinyxml Original code (2.0 and earlier )copyright (c) 2000-2002 Lee Thomason (www.grinninglizard.com) This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. 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 appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. */ #include #include "xye_tinyxml.h" #ifdef TIXML_USE_STL #include #endif bool TiXmlBase::condenseWhiteSpace = true; void TiXmlBase::PutString( const TIXML_STRING& str, TIXML_OSTREAM* stream ) { TIXML_STRING buffer; PutString( str, &buffer ); (*stream) << buffer; } void TiXmlBase::PutString( const TIXML_STRING& str, TIXML_STRING* outString ) { int i=0; while( i<(int)str.length() ) { unsigned char c = (unsigned char) str[i]; if ( c == '&' && i < ( (int)str.length() - 2 ) && str[i+1] == '#' && str[i+2] == 'x' ) { // Hexadecimal character reference. // Pass through unchanged. // © -- copyright symbol, for example. // // The -1 is a bug fix from Rob Laveaux. It keeps // an overflow from happening if there is no ';'. // There are actually 2 ways to exit this loop - // while fails (error case) and break (semicolon found). // However, there is no mechanism (currently) for // this function to return an error. while ( i<(int)str.length()-1 ) { outString->append( str.c_str() + i, 1 ); ++i; if ( str[i] == ';' ) break; } } else if ( c == '&' ) { outString->append( entity[0].str, entity[0].strLength ); ++i; } else if ( c == '<' ) { outString->append( entity[1].str, entity[1].strLength ); ++i; } else if ( c == '>' ) { outString->append( entity[2].str, entity[2].strLength ); ++i; } else if ( c == '\"' ) { outString->append( entity[3].str, entity[3].strLength ); ++i; } else if ( c == '\'' ) { outString->append( entity[4].str, entity[4].strLength ); ++i; } else if ( c < 32 ) { // Easy pass at non-alpha/numeric/symbol // Below 32 is symbolic. char buf[ 32 ]; #if defined(TIXML_SNPRINTF) TIXML_SNPRINTF( buf, sizeof(buf), "&#x%02X;", (unsigned) ( c & 0xff ) ); #else sprintf( buf, "&#x%02X;", (unsigned) ( c & 0xff ) ); #endif //*ME: warning C4267: convert 'size_t' to 'int' //*ME: Int-Cast to make compiler happy ... outString->append( buf, (int)strlen( buf ) ); ++i; } else { //char realc = (char) c; //outString->append( &realc, 1 ); *outString += (char) c; // somewhat more efficient function call. ++i; } } } // <-- Strange class for a bug fix. Search for STL_STRING_BUG TiXmlBase::StringToBuffer::StringToBuffer( const TIXML_STRING& str ) { buffer = new char[ str.length()+1 ]; if ( buffer ) { strcpy( buffer, str.c_str() ); } } TiXmlBase::StringToBuffer::~StringToBuffer() { delete [] buffer; } // End strange bug fix. --> TiXmlNode::TiXmlNode( NodeType _type ) : TiXmlBase() { parent = 0; type = _type; firstChild = 0; lastChild = 0; prev = 0; next = 0; } TiXmlNode::~TiXmlNode() { TiXmlNode* node = firstChild; TiXmlNode* temp = 0; while ( node ) { temp = node; node = node->next; delete temp; } } void TiXmlNode::CopyTo( TiXmlNode* target ) const { target->SetValue (value.c_str() ); target->userData = userData; } void TiXmlNode::Clear() { TiXmlNode* node = firstChild; TiXmlNode* temp = 0; while ( node ) { temp = node; node = node->next; delete temp; } firstChild = 0; lastChild = 0; } TiXmlNode* TiXmlNode::LinkEndChild( TiXmlNode* node ) { node->parent = this; node->prev = lastChild; node->next = 0; if ( lastChild ) lastChild->next = node; else firstChild = node; // it was an empty list. lastChild = node; return node; } TiXmlNode* TiXmlNode::InsertEndChild( const TiXmlNode& addThis ) { TiXmlNode* node = addThis.Clone(); if ( !node ) return 0; return LinkEndChild( node ); } TiXmlNode* TiXmlNode::InsertBeforeChild( TiXmlNode* beforeThis, const TiXmlNode& addThis ) { if ( !beforeThis || beforeThis->parent != this ) return 0; TiXmlNode* node = addThis.Clone(); if ( !node ) return 0; node->parent = this; node->next = beforeThis; node->prev = beforeThis->prev; if ( beforeThis->prev ) { beforeThis->prev->next = node; } else { assert( firstChild == beforeThis ); firstChild = node; } beforeThis->prev = node; return node; } TiXmlNode* TiXmlNode::InsertAfterChild( TiXmlNode* afterThis, const TiXmlNode& addThis ) { if ( !afterThis || afterThis->parent != this ) return 0; TiXmlNode* node = addThis.Clone(); if ( !node ) return 0; node->parent = this; node->prev = afterThis; node->next = afterThis->next; if ( afterThis->next ) { afterThis->next->prev = node; } else { assert( lastChild == afterThis ); lastChild = node; } afterThis->next = node; return node; } TiXmlNode* TiXmlNode::ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis ) { if ( replaceThis->parent != this ) return 0; TiXmlNode* node = withThis.Clone(); if ( !node ) return 0; node->next = replaceThis->next; node->prev = replaceThis->prev; if ( replaceThis->next ) replaceThis->next->prev = node; else lastChild = node; if ( replaceThis->prev ) replaceThis->prev->next = node; else firstChild = node; delete replaceThis; node->parent = this; return node; } bool TiXmlNode::RemoveChild( TiXmlNode* removeThis ) { if ( removeThis->parent != this ) { assert( 0 ); return false; } if ( removeThis->next ) removeThis->next->prev = removeThis->prev; else lastChild = removeThis->prev; if ( removeThis->prev ) removeThis->prev->next = removeThis->next; else firstChild = removeThis->next; delete removeThis; return true; } const TiXmlNode* TiXmlNode::FirstChild( const char * _value ) const { const TiXmlNode* node; for ( node = firstChild; node; node = node->next ) { if ( strcmp( node->Value(), _value ) == 0 ) return node; } return 0; } TiXmlNode* TiXmlNode::FirstChild( const char * _value ) { TiXmlNode* node; for ( node = firstChild; node; node = node->next ) { if ( strcmp( node->Value(), _value ) == 0 ) return node; } return 0; } const TiXmlNode* TiXmlNode::LastChild( const char * _value ) const { const TiXmlNode* node; for ( node = lastChild; node; node = node->prev ) { if ( strcmp( node->Value(), _value ) == 0 ) return node; } return 0; } TiXmlNode* TiXmlNode::LastChild( const char * _value ) { TiXmlNode* node; for ( node = lastChild; node; node = node->prev ) { if ( strcmp( node->Value(), _value ) == 0 ) return node; } return 0; } const TiXmlNode* TiXmlNode::IterateChildren( const TiXmlNode* previous ) const { if ( !previous ) { return FirstChild(); } else { assert( previous->parent == this ); return previous->NextSibling(); } } TiXmlNode* TiXmlNode::IterateChildren( TiXmlNode* previous ) { if ( !previous ) { return FirstChild(); } else { assert( previous->parent == this ); return previous->NextSibling(); } } const TiXmlNode* TiXmlNode::IterateChildren( const char * val, const TiXmlNode* previous ) const { if ( !previous ) { return FirstChild( val ); } else { assert( previous->parent == this ); return previous->NextSibling( val ); } } TiXmlNode* TiXmlNode::IterateChildren( const char * val, TiXmlNode* previous ) { if ( !previous ) { return FirstChild( val ); } else { assert( previous->parent == this ); return previous->NextSibling( val ); } } const TiXmlNode* TiXmlNode::NextSibling( const char * _value ) const { const TiXmlNode* node; for ( node = next; node; node = node->next ) { if ( strcmp( node->Value(), _value ) == 0 ) return node; } return 0; } TiXmlNode* TiXmlNode::NextSibling( const char * _value ) { TiXmlNode* node; for ( node = next; node; node = node->next ) { if ( strcmp( node->Value(), _value ) == 0 ) return node; } return 0; } const TiXmlNode* TiXmlNode::PreviousSibling( const char * _value ) const { const TiXmlNode* node; for ( node = prev; node; node = node->prev ) { if ( strcmp( node->Value(), _value ) == 0 ) return node; } return 0; } TiXmlNode* TiXmlNode::PreviousSibling( const char * _value ) { TiXmlNode* node; for ( node = prev; node; node = node->prev ) { if ( strcmp( node->Value(), _value ) == 0 ) return node; } return 0; } void TiXmlElement::RemoveAttribute( const char * name ) { TiXmlAttribute* node = attributeSet.Find( name ); if ( node ) { attributeSet.Remove( node ); delete node; } } const TiXmlElement* TiXmlNode::FirstChildElement() const { const TiXmlNode* node; for ( node = FirstChild(); node; node = node->NextSibling() ) { if ( node->ToElement() ) return node->ToElement(); } return 0; } TiXmlElement* TiXmlNode::FirstChildElement() { TiXmlNode* node; for ( node = FirstChild(); node; node = node->NextSibling() ) { if ( node->ToElement() ) return node->ToElement(); } return 0; } const TiXmlElement* TiXmlNode::FirstChildElement( const char * _value ) const { const TiXmlNode* node; for ( node = FirstChild( _value ); node; node = node->NextSibling( _value ) ) { if ( node->ToElement() ) return node->ToElement(); } return 0; } TiXmlElement* TiXmlNode::FirstChildElement( const char * _value ) { TiXmlNode* node; for ( node = FirstChild( _value ); node; node = node->NextSibling( _value ) ) { if ( node->ToElement() ) return node->ToElement(); } return 0; } const TiXmlElement* TiXmlNode::NextSiblingElement() const { const TiXmlNode* node; for ( node = NextSibling(); node; node = node->NextSibling() ) { if ( node->ToElement() ) return node->ToElement(); } return 0; } TiXmlElement* TiXmlNode::NextSiblingElement() { TiXmlNode* node; for ( node = NextSibling(); node; node = node->NextSibling() ) { if ( node->ToElement() ) return node->ToElement(); } return 0; } const TiXmlElement* TiXmlNode::NextSiblingElement( const char * _value ) const { const TiXmlNode* node; for ( node = NextSibling( _value ); node; node = node->NextSibling( _value ) ) { if ( node->ToElement() ) return node->ToElement(); } return 0; } TiXmlElement* TiXmlNode::NextSiblingElement( const char * _value ) { TiXmlNode* node; for ( node = NextSibling( _value ); node; node = node->NextSibling( _value ) ) { if ( node->ToElement() ) return node->ToElement(); } return 0; } const TiXmlDocument* TiXmlNode::GetDocument() const { const TiXmlNode* node; for( node = this; node; node = node->parent ) { if ( node->ToDocument() ) return node->ToDocument(); } return 0; } TiXmlDocument* TiXmlNode::GetDocument() { TiXmlNode* node; for( node = this; node; node = node->parent ) { if ( node->ToDocument() ) return node->ToDocument(); } return 0; } TiXmlElement::TiXmlElement (const char * _value) : TiXmlNode( TiXmlNode::ELEMENT ) { firstChild = lastChild = 0; value = _value; } #ifdef TIXML_USE_STL TiXmlElement::TiXmlElement( const std::string& _value ) : TiXmlNode( TiXmlNode::ELEMENT ) { firstChild = lastChild = 0; value = _value; } #endif TiXmlElement::TiXmlElement( const TiXmlElement& copy) : TiXmlNode( TiXmlNode::ELEMENT ) { firstChild = lastChild = 0; copy.CopyTo( this ); } void TiXmlElement::operator=( const TiXmlElement& base ) { ClearThis(); base.CopyTo( this ); } TiXmlElement::~TiXmlElement() { ClearThis(); } void TiXmlElement::ClearThis() { Clear(); while( attributeSet.First() ) { TiXmlAttribute* node = attributeSet.First(); attributeSet.Remove( node ); delete node; } } const char * TiXmlElement::Attribute( const char * name ) const { const TiXmlAttribute* node = attributeSet.Find( name ); if ( node ) return node->Value(); return 0; } const char * TiXmlElement::Attribute( const char * name, int* i ) const { const char * s = Attribute( name ); if ( i ) { if ( s ) *i = atoi( s ); else *i = 0; } return s; } const char * TiXmlElement::Attribute( const char * name, double* d ) const { const char * s = Attribute( name ); if ( d ) { if ( s ) *d = atof( s ); else *d = 0; } return s; } int TiXmlElement::QueryIntAttribute( const char* name, int* ival ) const { const TiXmlAttribute* node = attributeSet.Find( name ); if ( !node ) return TIXML_NO_ATTRIBUTE; return node->QueryIntValue( ival ); } int TiXmlElement::QueryDoubleAttribute( const char* name, double* dval ) const { const TiXmlAttribute* node = attributeSet.Find( name ); if ( !node ) return TIXML_NO_ATTRIBUTE; return node->QueryDoubleValue( dval ); } void TiXmlElement::SetAttribute( const char * name, int val ) { char buf[64]; #if defined(TIXML_SNPRINTF) TIXML_SNPRINTF( buf, sizeof(buf), "%d", val ); #else sprintf( buf, "%d", val ); #endif SetAttribute( name, buf ); } void TiXmlElement::SetDoubleAttribute( const char * name, double val ) { char buf[256]; #if defined(TIXML_SNPRINTF) TIXML_SNPRINTF( buf, sizeof(buf), "%f", val ); #else sprintf( buf, "%f", val ); #endif SetAttribute( name, buf ); } void TiXmlElement::SetAttribute( const char * name, const char * _value ) { TiXmlAttribute* node = attributeSet.Find( name ); if ( node ) { node->SetValue( _value ); return; } TiXmlAttribute* attrib = new TiXmlAttribute( name, _value ); if ( attrib ) { attributeSet.Add( attrib ); } else { TiXmlDocument* document = GetDocument(); if ( document ) document->SetError( TIXML_ERROR_OUT_OF_MEMORY, 0, 0, TIXML_ENCODING_UNKNOWN ); } } void TiXmlElement::Print( FILE* cfile, int depth ) const { int i; for ( i=0; iNext() ) { fprintf( cfile, " " ); attrib->Print( cfile, depth ); } // There are 3 different formatting approaches: // 1) An element without children is printed as a node // 2) An element with only a text child is printed as text // 3) An element with children is printed on multiple lines. TiXmlNode* node; if ( !firstChild ) { fprintf( cfile, " />" ); } else if ( firstChild == lastChild && firstChild->ToText() ) { fprintf( cfile, ">" ); firstChild->Print( cfile, depth + 1 ); fprintf( cfile, "", value.c_str() ); } else { fprintf( cfile, ">" ); for ( node = firstChild; node; node=node->NextSibling() ) { if ( !node->ToText() ) { fprintf( cfile, "\n" ); } node->Print( cfile, depth+1 ); } fprintf( cfile, "\n" ); for( i=0; i", value.c_str() ); } } void TiXmlElement::StreamOut( TIXML_OSTREAM * stream ) const { (*stream) << "<" << value; const TiXmlAttribute* attrib; for ( attrib = attributeSet.First(); attrib; attrib = attrib->Next() ) { (*stream) << " "; attrib->StreamOut( stream ); } // If this node has children, give it a closing tag. Else // make it an empty tag. TiXmlNode* node; if ( firstChild ) { (*stream) << ">"; for ( node = firstChild; node; node=node->NextSibling() ) { node->StreamOut( stream ); } (*stream) << ""; } else { (*stream) << " />"; } } void TiXmlElement::CopyTo( TiXmlElement* target ) const { // superclass: TiXmlNode::CopyTo( target ); // Element class: // Clone the attributes, then clone the children. const TiXmlAttribute* attribute = 0; for( attribute = attributeSet.First(); attribute; attribute = attribute->Next() ) { target->SetAttribute( attribute->Name(), attribute->Value() ); } TiXmlNode* node = 0; for ( node = firstChild; node; node = node->NextSibling() ) { target->LinkEndChild( node->Clone() ); } } TiXmlNode* TiXmlElement::Clone() const { TiXmlElement* clone = new TiXmlElement( Value() ); if ( !clone ) return 0; CopyTo( clone ); return clone; } const char* TiXmlElement::GetText() const { const TiXmlNode* child = this->FirstChild(); if ( child ) { const TiXmlText* childText = child->ToText(); if ( childText ) { return childText->Value(); } } return 0; } TiXmlDocument::TiXmlDocument() : TiXmlNode( TiXmlNode::DOCUMENT ) { tabsize = 4; useMicrosoftBOM = false; ClearError(); } TiXmlDocument::TiXmlDocument( const char * documentName ) : TiXmlNode( TiXmlNode::DOCUMENT ) { tabsize = 4; useMicrosoftBOM = false; value = documentName; ClearError(); } #ifdef TIXML_USE_STL TiXmlDocument::TiXmlDocument( const std::string& documentName ) : TiXmlNode( TiXmlNode::DOCUMENT ) { tabsize = 4; useMicrosoftBOM = false; value = documentName; ClearError(); } #endif TiXmlDocument::TiXmlDocument( const TiXmlDocument& copy ) : TiXmlNode( TiXmlNode::DOCUMENT ) { copy.CopyTo( this ); } void TiXmlDocument::operator=( const TiXmlDocument& copy ) { Clear(); copy.CopyTo( this ); } bool TiXmlDocument::LoadFile( TiXmlEncoding encoding ) { // See STL_STRING_BUG below. StringToBuffer buf( value ); if ( buf.buffer && LoadFile( buf.buffer, encoding ) ) return true; return false; } bool TiXmlDocument::SaveFile() const { // See STL_STRING_BUG below. StringToBuffer buf( value ); if ( buf.buffer && SaveFile( buf.buffer ) ) return true; return false; } bool TiXmlDocument::LoadFile( const char* filename, TiXmlEncoding encoding ) { // Delete the existing data: Clear(); location.Clear(); // There was a really terrifying little bug here. The code: // value = filename // in the STL case, cause the assignment method of the std::string to // be called. What is strange, is that the std::string had the same // address as it's c_str() method, and so bad things happen. Looks // like a bug in the Microsoft STL implementation. // See STL_STRING_BUG above. // Fixed with the StringToBuffer class. value = filename; // reading in binary mode so that tinyxml can normalize the EOL FILE* file = fopen( value.c_str (), "rb" ); if ( file ) { // Get the file size, so we can pre-allocate the string. HUGE speed impact. long length = 0; fseek( file, 0, SEEK_END ); length = ftell( file ); fseek( file, 0, SEEK_SET ); // Strange case, but good to handle up front. if ( length == 0 ) { fclose( file ); return false; } // If we have a file, assume it is all one big XML file, and read it in. // The document parser may decide the document ends sooner than the entire file, however. TIXML_STRING data; data.reserve( length ); // Subtle bug here. TinyXml did use fgets. But from the XML spec: // 2.11 End-of-Line Handling // // // ...the XML processor MUST behave as if it normalized all line breaks in external // parsed entities (including the document entity) on input, before parsing, by translating // both the two-character sequence #xD #xA and any #xD that is not followed by #xA to // a single #xA character. // // // It is not clear fgets does that, and certainly isn't clear it works cross platform. // Generally, you expect fgets to translate from the convention of the OS to the c/unix // convention, and not work generally. /* while( fgets( buf, sizeof(buf), file ) ) { data += buf; } */ char* buf = new char[ length+1 ]; buf[0] = 0; if ( fread( buf, length, 1, file ) != 1 ) { //if ( fread( buf, 1, length, file ) != (size_t)length ) { SetError( TIXML_ERROR_OPENING_FILE, 0, 0, TIXML_ENCODING_UNKNOWN ); fclose( file ); return false; } fclose( file ); const char* lastPos = buf; const char* p = buf; buf[length] = 0; while( *p ) { assert( p < (buf+length) ); if ( *p == 0xa ) { // Newline character. No special rules for this. Append all the characters // since the last string, and include the newline. data.append( lastPos, p-lastPos+1 ); // append, include the newline ++p; // move past the newline lastPos = p; // and point to the new buffer (may be 0) assert( p <= (buf+length) ); } else if ( *p == 0xd ) { // Carriage return. Append what we have so far, then // handle moving forward in the buffer. if ( (p-lastPos) > 0 ) { data.append( lastPos, p-lastPos ); // do not add the CR } data += (char)0xa; // a proper newline if ( *(p+1) == 0xa ) { // Carriage return - new line sequence p += 2; lastPos = p; assert( p <= (buf+length) ); } else { // it was followed by something else...that is presumably characters again. ++p; lastPos = p; assert( p <= (buf+length) ); } } else { ++p; } } // Handle any left over characters. if ( p-lastPos ) { data.append( lastPos, p-lastPos ); } delete [] buf; buf = 0; Parse( data.c_str(), 0, encoding ); if ( Error() ) return false; else return true; } SetError( TIXML_ERROR_OPENING_FILE, 0, 0, TIXML_ENCODING_UNKNOWN ); return false; } bool TiXmlDocument::SaveFile( const char * filename ) const { // The old c stuff lives on... FILE* fp = fopen( filename, "w" ); if ( fp ) { if ( useMicrosoftBOM ) { const unsigned char TIXML_UTF_LEAD_0 = 0xefU; const unsigned char TIXML_UTF_LEAD_1 = 0xbbU; const unsigned char TIXML_UTF_LEAD_2 = 0xbfU; fputc( TIXML_UTF_LEAD_0, fp ); fputc( TIXML_UTF_LEAD_1, fp ); fputc( TIXML_UTF_LEAD_2, fp ); } Print( fp, 0 ); fclose( fp ); return true; } return false; } void TiXmlDocument::CopyTo( TiXmlDocument* target ) const { TiXmlNode::CopyTo( target ); target->error = error; target->errorDesc = errorDesc.c_str (); TiXmlNode* node = 0; for ( node = firstChild; node; node = node->NextSibling() ) { target->LinkEndChild( node->Clone() ); } } TiXmlNode* TiXmlDocument::Clone() const { TiXmlDocument* clone = new TiXmlDocument(); if ( !clone ) return 0; CopyTo( clone ); return clone; } void TiXmlDocument::Print( FILE* cfile, int depth ) const { const TiXmlNode* node; for ( node=FirstChild(); node; node=node->NextSibling() ) { node->Print( cfile, depth ); fprintf( cfile, "\n" ); } } void TiXmlDocument::StreamOut( TIXML_OSTREAM * out ) const { const TiXmlNode* node; for ( node=FirstChild(); node; node=node->NextSibling() ) { node->StreamOut( out ); // Special rule for streams: stop after the root element. // The stream in code will only read one element, so don't // write more than one. if ( node->ToElement() ) break; } } const TiXmlAttribute* TiXmlAttribute::Next() const { // We are using knowledge of the sentinel. The sentinel // have a value or name. if ( next->value.empty() && next->name.empty() ) return 0; return next; } TiXmlAttribute* TiXmlAttribute::Next() { // We are using knowledge of the sentinel. The sentinel // have a value or name. if ( next->value.empty() && next->name.empty() ) return 0; return next; } const TiXmlAttribute* TiXmlAttribute::Previous() const { // We are using knowledge of the sentinel. The sentinel // have a value or name. if ( prev->value.empty() && prev->name.empty() ) return 0; return prev; } TiXmlAttribute* TiXmlAttribute::Previous() { // We are using knowledge of the sentinel. The sentinel // have a value or name. if ( prev->value.empty() && prev->name.empty() ) return 0; return prev; } void TiXmlAttribute::Print( FILE* cfile, int /*depth*/ ) const { TIXML_STRING n, v; PutString( name, &n ); PutString( value, &v ); if (value.find ('\"') == TIXML_STRING::npos) fprintf (cfile, "%s=\"%s\"", n.c_str(), v.c_str() ); else fprintf (cfile, "%s='%s'", n.c_str(), v.c_str() ); } void TiXmlAttribute::StreamOut( TIXML_OSTREAM * stream ) const { if (value.find( '\"' ) != TIXML_STRING::npos) { PutString( name, stream ); (*stream) << "=" << "'"; PutString( value, stream ); (*stream) << "'"; } else { PutString( name, stream ); (*stream) << "=" << "\""; PutString( value, stream ); (*stream) << "\""; } } int TiXmlAttribute::QueryIntValue( int* ival ) const { if ( sscanf( value.c_str(), "%d", ival ) == 1 ) return TIXML_SUCCESS; return TIXML_WRONG_TYPE; } int TiXmlAttribute::QueryDoubleValue( double* dval ) const { if ( sscanf( value.c_str(), "%lf", dval ) == 1 ) return TIXML_SUCCESS; return TIXML_WRONG_TYPE; } void TiXmlAttribute::SetIntValue( int _value ) { char buf [64]; #if defined(TIXML_SNPRINTF) TIXML_SNPRINTF(buf, sizeof(buf), "%d", _value); #else sprintf (buf, "%d", _value); #endif SetValue (buf); } void TiXmlAttribute::SetDoubleValue( double _value ) { char buf [256]; #if defined(TIXML_SNPRINTF) TIXML_SNPRINTF( buf, sizeof(buf), "%lf", _value); #else sprintf (buf, "%lf", _value); #endif SetValue (buf); } int TiXmlAttribute::IntValue() const { return atoi (value.c_str ()); } double TiXmlAttribute::DoubleValue() const { return atof (value.c_str ()); } TiXmlComment::TiXmlComment( const TiXmlComment& copy ) : TiXmlNode( TiXmlNode::COMMENT ) { copy.CopyTo( this ); } void TiXmlComment::operator=( const TiXmlComment& base ) { Clear(); base.CopyTo( this ); } void TiXmlComment::Print( FILE* cfile, int depth ) const { for ( int i=0; i", value.c_str() ); } void TiXmlComment::StreamOut( TIXML_OSTREAM * stream ) const { (*stream) << ""; } void TiXmlComment::CopyTo( TiXmlComment* target ) const { TiXmlNode::CopyTo( target ); } TiXmlNode* TiXmlComment::Clone() const { TiXmlComment* clone = new TiXmlComment(); if ( !clone ) return 0; CopyTo( clone ); return clone; } void TiXmlText::Print( FILE* cfile, int depth ) const { if ( cdata ) { int i; fprintf( cfile, "\n" ); for ( i=0; i\n" ); } else { TIXML_STRING buffer; PutString( value, &buffer ); fprintf( cfile, "%s", buffer.c_str() ); } } void TiXmlText::StreamOut( TIXML_OSTREAM * stream ) const { if ( cdata ) { (*stream) << ""; } else { PutString( value, stream ); } } void TiXmlText::CopyTo( TiXmlText* target ) const { TiXmlNode::CopyTo( target ); target->cdata = cdata; } TiXmlNode* TiXmlText::Clone() const { TiXmlText* clone = 0; clone = new TiXmlText( "" ); if ( !clone ) return 0; CopyTo( clone ); return clone; } TiXmlDeclaration::TiXmlDeclaration( const char * _version, const char * _encoding, const char * _standalone ) : TiXmlNode( TiXmlNode::DECLARATION ) { version = _version; encoding = _encoding; standalone = _standalone; } #ifdef TIXML_USE_STL TiXmlDeclaration::TiXmlDeclaration( const std::string& _version, const std::string& _encoding, const std::string& _standalone ) : TiXmlNode( TiXmlNode::DECLARATION ) { version = _version; encoding = _encoding; standalone = _standalone; } #endif TiXmlDeclaration::TiXmlDeclaration( const TiXmlDeclaration& copy ) : TiXmlNode( TiXmlNode::DECLARATION ) { copy.CopyTo( this ); } void TiXmlDeclaration::operator=( const TiXmlDeclaration& copy ) { Clear(); copy.CopyTo( this ); } void TiXmlDeclaration::Print( FILE* cfile, int /*depth*/ ) const { fprintf (cfile, ""); } void TiXmlDeclaration::StreamOut( TIXML_OSTREAM * stream ) const { (*stream) << ""; } void TiXmlDeclaration::CopyTo( TiXmlDeclaration* target ) const { TiXmlNode::CopyTo( target ); target->version = version; target->encoding = encoding; target->standalone = standalone; } TiXmlNode* TiXmlDeclaration::Clone() const { TiXmlDeclaration* clone = new TiXmlDeclaration(); if ( !clone ) return 0; CopyTo( clone ); return clone; } void TiXmlUnknown::Print( FILE* cfile, int depth ) const { for ( int i=0; i", value.c_str() ); } void TiXmlUnknown::StreamOut( TIXML_OSTREAM * stream ) const { (*stream) << "<" << value << ">"; // Don't use entities here! It is unknown. } void TiXmlUnknown::CopyTo( TiXmlUnknown* target ) const { TiXmlNode::CopyTo( target ); } TiXmlNode* TiXmlUnknown::Clone() const { TiXmlUnknown* clone = new TiXmlUnknown(); if ( !clone ) return 0; CopyTo( clone ); return clone; } TiXmlAttributeSet::TiXmlAttributeSet() { sentinel.next = &sentinel; sentinel.prev = &sentinel; } TiXmlAttributeSet::~TiXmlAttributeSet() { assert( sentinel.next == &sentinel ); assert( sentinel.prev == &sentinel ); } void TiXmlAttributeSet::Add( TiXmlAttribute* addMe ) { assert( !Find( addMe->Name() ) ); // Shouldn't be multiply adding to the set. addMe->next = &sentinel; addMe->prev = sentinel.prev; sentinel.prev->next = addMe; sentinel.prev = addMe; } void TiXmlAttributeSet::Remove( TiXmlAttribute* removeMe ) { TiXmlAttribute* node; for( node = sentinel.next; node != &sentinel; node = node->next ) { if ( node == removeMe ) { node->prev->next = node->next; node->next->prev = node->prev; node->next = 0; node->prev = 0; return; } } assert( 0 ); // we tried to remove a non-linked attribute. } const TiXmlAttribute* TiXmlAttributeSet::Find( const char * name ) const { const TiXmlAttribute* node; for( node = sentinel.next; node != &sentinel; node = node->next ) { if ( node->name == name ) return node; } return 0; } TiXmlAttribute* TiXmlAttributeSet::Find( const char * name ) { TiXmlAttribute* node; for( node = sentinel.next; node != &sentinel; node = node->next ) { if ( node->name == name ) return node; } return 0; } #ifdef TIXML_USE_STL TIXML_ISTREAM & operator >> (TIXML_ISTREAM & in, TiXmlNode & base) { TIXML_STRING tag; tag.reserve( 8 * 1000 ); base.StreamIn( &in, &tag ); base.Parse( tag.c_str(), 0, TIXML_DEFAULT_ENCODING ); return in; } #endif TIXML_OSTREAM & operator<< (TIXML_OSTREAM & out, const TiXmlNode & base) { base.StreamOut (& out); return out; } #ifdef TIXML_USE_STL std::string & operator<< (std::string& out, const TiXmlNode& base ) { std::ostringstream os_stream( std::ostringstream::out ); base.StreamOut( &os_stream ); out.append( os_stream.str() ); return out; } #endif TiXmlHandle TiXmlHandle::FirstChild() const { if ( node ) { TiXmlNode* child = node->FirstChild(); if ( child ) return TiXmlHandle( child ); } return TiXmlHandle( 0 ); } TiXmlHandle TiXmlHandle::FirstChild( const char * value ) const { if ( node ) { TiXmlNode* child = node->FirstChild( value ); if ( child ) return TiXmlHandle( child ); } return TiXmlHandle( 0 ); } TiXmlHandle TiXmlHandle::FirstChildElement() const { if ( node ) { TiXmlElement* child = node->FirstChildElement(); if ( child ) return TiXmlHandle( child ); } return TiXmlHandle( 0 ); } TiXmlHandle TiXmlHandle::FirstChildElement( const char * value ) const { if ( node ) { TiXmlElement* child = node->FirstChildElement( value ); if ( child ) return TiXmlHandle( child ); } return TiXmlHandle( 0 ); } TiXmlHandle TiXmlHandle::Child( int count ) const { if ( node ) { int i; TiXmlNode* child = node->FirstChild(); for ( i=0; child && iNextSibling(), ++i ) { // nothing } if ( child ) return TiXmlHandle( child ); } return TiXmlHandle( 0 ); } TiXmlHandle TiXmlHandle::Child( const char* value, int count ) const { if ( node ) { int i; TiXmlNode* child = node->FirstChild( value ); for ( i=0; child && iNextSibling( value ), ++i ) { // nothing } if ( child ) return TiXmlHandle( child ); } return TiXmlHandle( 0 ); } TiXmlHandle TiXmlHandle::ChildElement( int count ) const { if ( node ) { int i; TiXmlElement* child = node->FirstChildElement(); for ( i=0; child && iNextSiblingElement(), ++i ) { // nothing } if ( child ) return TiXmlHandle( child ); } return TiXmlHandle( 0 ); } TiXmlHandle TiXmlHandle::ChildElement( const char* value, int count ) const { if ( node ) { int i; TiXmlElement* child = node->FirstChildElement( value ); for ( i=0; child && iNextSiblingElement( value ), ++i ) { // nothing } if ( child ) return TiXmlHandle( child ); } return TiXmlHandle( 0 ); } xye-0.12.2+dfsg/src/tinyxml/xye_tinyxml.h000077500000000000000000001470371225403634500204000ustar00rootroot00000000000000/* www.sourceforge.net/projects/tinyxml Original code (2.0 and earlier )copyright (c) 2000-2002 Lee Thomason (www.grinninglizard.com) This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. 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 appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. */ #ifndef TINYXML_INCLUDED #define TINYXML_INCLUDED #ifdef _MSC_VER #pragma warning( push ) #pragma warning( disable : 4530 ) #pragma warning( disable : 4786 ) #endif #include #include #include #include #include // Help out windows: #if defined( _DEBUG ) && !defined( DEBUG ) #define DEBUG #endif #if defined( DEBUG ) && defined( _MSC_VER ) #include #define TIXML_LOG OutputDebugString #else #define TIXML_LOG printf #endif #ifdef TIXML_USE_STL #include #include #define TIXML_STRING std::string #define TIXML_ISTREAM std::istream #define TIXML_OSTREAM std::ostream #else #include "xye_tinystr.h" #define TIXML_STRING TiXmlString #define TIXML_OSTREAM TiXmlOutStream #endif // Deprecated library function hell. Compilers want to use the // new safe versions. This probably doesn't fully address the problem, // but it gets closer. There are too many compilers for me to fully // test. If you get compilation troubles, undefine TIXML_SAFE #define TIXML_SAFE // TinyXml isn't fully buffer overrun protected, safe code. This is work in progress. #ifdef TIXML_SAFE #if defined(_MSC_VER) && (_MSC_VER >= 1200 ) // Microsoft visual studio, version 6 and higher. //#pragma message( "Using _sn* functions." ) #define TIXML_SNPRINTF _snprintf #define TIXML_SNSCANF _snscanf #elif defined(__GNUC__) && (__GNUC__ >= 3 ) // GCC version 3 and higher.s //#warning( "Using sn* functions." ) #define TIXML_SNPRINTF snprintf #define TIXML_SNSCANF snscanf #endif #endif class TiXmlDocument; class TiXmlElement; class TiXmlComment; class TiXmlUnknown; class TiXmlAttribute; class TiXmlText; class TiXmlDeclaration; class TiXmlParsingData; const int TIXML_MAJOR_VERSION = 2; const int TIXML_MINOR_VERSION = 4; const int TIXML_PATCH_VERSION = 2; /* Internal structure for tracking location of items in the XML file. */ struct TiXmlCursor { TiXmlCursor() { Clear(); } void Clear() { row = col = -1; } int row; // 0 based. int col; // 0 based. }; // Only used by Attribute::Query functions enum { TIXML_SUCCESS, TIXML_NO_ATTRIBUTE, TIXML_WRONG_TYPE }; // Used by the parsing routines. enum TiXmlEncoding { TIXML_ENCODING_UNKNOWN, TIXML_ENCODING_UTF8, TIXML_ENCODING_LEGACY }; const TiXmlEncoding TIXML_DEFAULT_ENCODING = TIXML_ENCODING_UNKNOWN; /** TiXmlBase is a base class for every class in TinyXml. It does little except to establish that TinyXml classes can be printed and provide some utility functions. In XML, the document and elements can contain other elements and other types of nodes. @verbatim A Document can contain: Element (container or leaf) Comment (leaf) Unknown (leaf) Declaration( leaf ) An Element can contain: Element (container or leaf) Text (leaf) Attributes (not on tree) Comment (leaf) Unknown (leaf) A Decleration contains: Attributes (not on tree) @endverbatim */ class TiXmlBase { friend class TiXmlNode; friend class TiXmlElement; friend class TiXmlDocument; public: TiXmlBase() : userData(0) {} virtual ~TiXmlBase() {} /** All TinyXml classes can print themselves to a filestream. This is a formatted print, and will insert tabs and newlines. (For an unformatted stream, use the << operator.) */ virtual void Print( FILE* cfile, int depth ) const = 0; /** The world does not agree on whether white space should be kept or not. In order to make everyone happy, these global, static functions are provided to set whether or not TinyXml will condense all white space into a single space or not. The default is to condense. Note changing this values is not thread safe. */ static void SetCondenseWhiteSpace( bool condense ) { condenseWhiteSpace = condense; } /// Return the current white space setting. static bool IsWhiteSpaceCondensed() { return condenseWhiteSpace; } /** Return the position, in the original source file, of this node or attribute. The row and column are 1-based. (That is the first row and first column is 1,1). If the returns values are 0 or less, then the parser does not have a row and column value. Generally, the row and column value will be set when the TiXmlDocument::Load(), TiXmlDocument::LoadFile(), or any TiXmlNode::Parse() is called. It will NOT be set when the DOM was created from operator>>. The values reflect the initial load. Once the DOM is modified programmatically (by adding or changing nodes and attributes) the new values will NOT update to reflect changes in the document. There is a minor performance cost to computing the row and column. Computation can be disabled if TiXmlDocument::SetTabSize() is called with 0 as the value. @sa TiXmlDocument::SetTabSize() */ int Row() const { return location.row + 1; } int Column() const { return location.col + 1; } ///< See Row() void SetUserData( void* user ) { userData = user; } void* GetUserData() { return userData; } // Table that returs, for a given lead byte, the total number of bytes // in the UTF-8 sequence. static const int utf8ByteTable[256]; virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding /*= TIXML_ENCODING_UNKNOWN */ ) = 0; enum { TIXML_NO_ERROR = 0, TIXML_ERROR, TIXML_ERROR_OPENING_FILE, TIXML_ERROR_OUT_OF_MEMORY, TIXML_ERROR_PARSING_ELEMENT, TIXML_ERROR_FAILED_TO_READ_ELEMENT_NAME, TIXML_ERROR_READING_ELEMENT_VALUE, TIXML_ERROR_READING_ATTRIBUTES, TIXML_ERROR_PARSING_EMPTY, TIXML_ERROR_READING_END_TAG, TIXML_ERROR_PARSING_UNKNOWN, TIXML_ERROR_PARSING_COMMENT, TIXML_ERROR_PARSING_DECLARATION, TIXML_ERROR_DOCUMENT_EMPTY, TIXML_ERROR_EMBEDDED_NULL, TIXML_ERROR_PARSING_CDATA, TIXML_ERROR_STRING_COUNT }; protected: // See STL_STRING_BUG // Utility class to overcome a bug. class StringToBuffer { public: StringToBuffer( const TIXML_STRING& str ); ~StringToBuffer(); char* buffer; }; static const char* SkipWhiteSpace( const char*, TiXmlEncoding encoding ); inline static bool IsWhiteSpace( char c ) { return ( isspace( (unsigned char) c ) || c == '\n' || c == '\r' ); } virtual void StreamOut (TIXML_OSTREAM *) const = 0; #ifdef TIXML_USE_STL static bool StreamWhiteSpace( TIXML_ISTREAM * in, TIXML_STRING * tag ); static bool StreamTo( TIXML_ISTREAM * in, int character, TIXML_STRING * tag ); #endif /* Reads an XML name into the string provided. Returns a pointer just past the last character of the name, or 0 if the function has an error. */ static const char* ReadName( const char* p, TIXML_STRING* name, TiXmlEncoding encoding ); /* Reads text. Returns a pointer past the given end tag. Wickedly complex options, but it keeps the (sensitive) code in one place. */ static const char* ReadText( const char* in, // where to start TIXML_STRING* text, // the string read bool ignoreWhiteSpace, // whether to keep the white space const char* endTag, // what ends this text bool ignoreCase, // whether to ignore case in the end tag TiXmlEncoding encoding ); // the current encoding // If an entity has been found, transform it into a character. static const char* GetEntity( const char* in, char* value, int* length, TiXmlEncoding encoding ); // Get a character, while interpreting entities. // The length can be from 0 to 4 bytes. inline static const char* GetChar( const char* p, char* _value, int* length, TiXmlEncoding encoding ) { assert( p ); if ( encoding == TIXML_ENCODING_UTF8 ) { *length = utf8ByteTable[ *((unsigned char*)p) ]; assert( *length >= 0 && *length < 5 ); } else { *length = 1; } if ( *length == 1 ) { if ( *p == '&' ) return GetEntity( p, _value, length, encoding ); *_value = *p; return p+1; } else if ( *length ) { //strncpy( _value, p, *length ); // lots of compilers don't like this function (unsafe), // and the null terminator isn't needed for( int i=0; p[i] && i<*length; ++i ) { _value[i] = p[i]; } return p + (*length); } else { // Not valid text. return 0; } } // Puts a string to a stream, expanding entities as it goes. // Note this should not contian the '<', '>', etc, or they will be transformed into entities! static void PutString( const TIXML_STRING& str, TIXML_OSTREAM* out ); static void PutString( const TIXML_STRING& str, TIXML_STRING* out ); // Return true if the next characters in the stream are any of the endTag sequences. // Ignore case only works for english, and should only be relied on when comparing // to English words: StringEqual( p, "version", true ) is fine. static bool StringEqual( const char* p, const char* endTag, bool ignoreCase, TiXmlEncoding encoding ); static const char* errorString[ TIXML_ERROR_STRING_COUNT ]; TiXmlCursor location; /// Field containing a generic user pointer void* userData; // None of these methods are reliable for any language except English. // Good for approximation, not great for accuracy. static int IsAlpha( unsigned char anyByte, TiXmlEncoding encoding ); static int IsAlphaNum( unsigned char anyByte, TiXmlEncoding encoding ); inline static int ToLower( int v, TiXmlEncoding encoding ) { if ( encoding == TIXML_ENCODING_UTF8 ) { if ( v < 128 ) return tolower( v ); return v; } else { return tolower( v ); } } static void ConvertUTF32ToUTF8( unsigned long input, char* output, int* length ); private: TiXmlBase( const TiXmlBase& ); // not implemented. void operator=( const TiXmlBase& base ); // not allowed. struct Entity { const char* str; unsigned int strLength; char chr; }; enum { NUM_ENTITY = 5, MAX_ENTITY_LENGTH = 6 }; static Entity entity[ NUM_ENTITY ]; static bool condenseWhiteSpace; }; /** The parent class for everything in the Document Object Model. (Except for attributes). Nodes have siblings, a parent, and children. A node can be in a document, or stand on its own. The type of a TiXmlNode can be queried, and it can be cast to its more defined type. */ class TiXmlNode : public TiXmlBase { friend class TiXmlDocument; friend class TiXmlElement; public: #ifdef TIXML_USE_STL /** An input stream operator, for every class. Tolerant of newlines and formatting, but doesn't expect them. */ friend std::istream& operator >> (std::istream& in, TiXmlNode& base); /** An output stream operator, for every class. Note that this outputs without any newlines or formatting, as opposed to Print(), which includes tabs and new lines. The operator<< and operator>> are not completely symmetric. Writing a node to a stream is very well defined. You'll get a nice stream of output, without any extra whitespace or newlines. But reading is not as well defined. (As it always is.) If you create a TiXmlElement (for example) and read that from an input stream, the text needs to define an element or junk will result. This is true of all input streams, but it's worth keeping in mind. A TiXmlDocument will read nodes until it reads a root element, and all the children of that root element. */ friend std::ostream& operator<< (std::ostream& out, const TiXmlNode& base); /// Appends the XML node or attribute to a std::string. friend std::string& operator<< (std::string& out, const TiXmlNode& base ); #else // Used internally, not part of the public API. friend TIXML_OSTREAM& operator<< (TIXML_OSTREAM& out, const TiXmlNode& base); #endif /** The types of XML nodes supported by TinyXml. (All the unsupported types are picked up by UNKNOWN.) */ enum NodeType { DOCUMENT, ELEMENT, COMMENT, UNKNOWN, TEXT, DECLARATION, TYPECOUNT }; virtual ~TiXmlNode(); /** The meaning of 'value' changes for the specific type of TiXmlNode. @verbatim Document: filename of the xml file Element: name of the element Comment: the comment text Unknown: the tag contents Text: the text string @endverbatim The subclasses will wrap this function. */ const char *Value() const { return value.c_str (); } #ifdef TIXML_USE_STL /** Return Value() as a std::string. If you only use STL, this is more efficient than calling Value(). Only available in STL mode. */ const std::string& ValueStr() const { return value; } #endif /** Changes the value of the node. Defined as: @verbatim Document: filename of the xml file Element: name of the element Comment: the comment text Unknown: the tag contents Text: the text string @endverbatim */ void SetValue(const char * _value) { value = _value;} #ifdef TIXML_USE_STL /// STL std::string form. void SetValue( const std::string& _value ) { StringToBuffer buf( _value ); SetValue( buf.buffer ? buf.buffer : "" ); } #endif /// Delete all the children of this node. Does not affect 'this'. void Clear(); /// One step up the DOM. TiXmlNode* Parent() { return parent; } const TiXmlNode* Parent() const { return parent; } const TiXmlNode* FirstChild() const { return firstChild; } ///< The first child of this node. Will be null if there are no children. TiXmlNode* FirstChild() { return firstChild; } const TiXmlNode* FirstChild( const char * value ) const; ///< The first child of this node with the matching 'value'. Will be null if none found. TiXmlNode* FirstChild( const char * value ); ///< The first child of this node with the matching 'value'. Will be null if none found. const TiXmlNode* LastChild() const { return lastChild; } /// The last child of this node. Will be null if there are no children. TiXmlNode* LastChild() { return lastChild; } const TiXmlNode* LastChild( const char * value ) const; /// The last child of this node matching 'value'. Will be null if there are no children. TiXmlNode* LastChild( const char * value ); #ifdef TIXML_USE_STL const TiXmlNode* FirstChild( const std::string& _value ) const { return FirstChild (_value.c_str ()); } ///< STL std::string form. TiXmlNode* FirstChild( const std::string& _value ) { return FirstChild (_value.c_str ()); } ///< STL std::string form. const TiXmlNode* LastChild( const std::string& _value ) const { return LastChild (_value.c_str ()); } ///< STL std::string form. TiXmlNode* LastChild( const std::string& _value ) { return LastChild (_value.c_str ()); } ///< STL std::string form. #endif /** An alternate way to walk the children of a node. One way to iterate over nodes is: @verbatim for( child = parent->FirstChild(); child; child = child->NextSibling() ) @endverbatim IterateChildren does the same thing with the syntax: @verbatim child = 0; while( child = parent->IterateChildren( child ) ) @endverbatim IterateChildren takes the previous child as input and finds the next one. If the previous child is null, it returns the first. IterateChildren will return null when done. */ const TiXmlNode* IterateChildren( const TiXmlNode* previous ) const; TiXmlNode* IterateChildren( TiXmlNode* previous ); /// This flavor of IterateChildren searches for children with a particular 'value' const TiXmlNode* IterateChildren( const char * value, const TiXmlNode* previous ) const; TiXmlNode* IterateChildren( const char * value, TiXmlNode* previous ); #ifdef TIXML_USE_STL const TiXmlNode* IterateChildren( const std::string& _value, const TiXmlNode* previous ) const { return IterateChildren (_value.c_str (), previous); } ///< STL std::string form. TiXmlNode* IterateChildren( const std::string& _value, TiXmlNode* previous ) { return IterateChildren (_value.c_str (), previous); } ///< STL std::string form. #endif /** Add a new node related to this. Adds a child past the LastChild. Returns a pointer to the new object or NULL if an error occured. */ TiXmlNode* InsertEndChild( const TiXmlNode& addThis ); /** Add a new node related to this. Adds a child past the LastChild. NOTE: the node to be added is passed by pointer, and will be henceforth owned (and deleted) by tinyXml. This method is efficient and avoids an extra copy, but should be used with care as it uses a different memory model than the other insert functions. @sa InsertEndChild */ TiXmlNode* LinkEndChild( TiXmlNode* addThis ); /** Add a new node related to this. Adds a child before the specified child. Returns a pointer to the new object or NULL if an error occured. */ TiXmlNode* InsertBeforeChild( TiXmlNode* beforeThis, const TiXmlNode& addThis ); /** Add a new node related to this. Adds a child after the specified child. Returns a pointer to the new object or NULL if an error occured. */ TiXmlNode* InsertAfterChild( TiXmlNode* afterThis, const TiXmlNode& addThis ); /** Replace a child of this node. Returns a pointer to the new object or NULL if an error occured. */ TiXmlNode* ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis ); /// Delete a child of this node. bool RemoveChild( TiXmlNode* removeThis ); /// Navigate to a sibling node. const TiXmlNode* PreviousSibling() const { return prev; } TiXmlNode* PreviousSibling() { return prev; } /// Navigate to a sibling node. const TiXmlNode* PreviousSibling( const char * ) const; TiXmlNode* PreviousSibling( const char * ); #ifdef TIXML_USE_STL const TiXmlNode* PreviousSibling( const std::string& _value ) const { return PreviousSibling (_value.c_str ()); } ///< STL std::string form. TiXmlNode* PreviousSibling( const std::string& _value ) { return PreviousSibling (_value.c_str ()); } ///< STL std::string form. const TiXmlNode* NextSibling( const std::string& _value) const { return NextSibling (_value.c_str ()); } ///< STL std::string form. TiXmlNode* NextSibling( const std::string& _value) { return NextSibling (_value.c_str ()); } ///< STL std::string form. #endif /// Navigate to a sibling node. const TiXmlNode* NextSibling() const { return next; } TiXmlNode* NextSibling() { return next; } /// Navigate to a sibling node with the given 'value'. const TiXmlNode* NextSibling( const char * ) const; TiXmlNode* NextSibling( const char * ); /** Convenience function to get through elements. Calls NextSibling and ToElement. Will skip all non-Element nodes. Returns 0 if there is not another element. */ const TiXmlElement* NextSiblingElement() const; TiXmlElement* NextSiblingElement(); /** Convenience function to get through elements. Calls NextSibling and ToElement. Will skip all non-Element nodes. Returns 0 if there is not another element. */ const TiXmlElement* NextSiblingElement( const char * ) const; TiXmlElement* NextSiblingElement( const char * ); #ifdef TIXML_USE_STL const TiXmlElement* NextSiblingElement( const std::string& _value) const { return NextSiblingElement (_value.c_str ()); } ///< STL std::string form. TiXmlElement* NextSiblingElement( const std::string& _value) { return NextSiblingElement (_value.c_str ()); } ///< STL std::string form. #endif /// Convenience function to get through elements. const TiXmlElement* FirstChildElement() const; TiXmlElement* FirstChildElement(); /// Convenience function to get through elements. const TiXmlElement* FirstChildElement( const char * value ) const; TiXmlElement* FirstChildElement( const char * value ); #ifdef TIXML_USE_STL const TiXmlElement* FirstChildElement( const std::string& _value ) const { return FirstChildElement (_value.c_str ()); } ///< STL std::string form. TiXmlElement* FirstChildElement( const std::string& _value ) { return FirstChildElement (_value.c_str ()); } ///< STL std::string form. #endif /** Query the type (as an enumerated value, above) of this node. The possible types are: DOCUMENT, ELEMENT, COMMENT, UNKNOWN, TEXT, and DECLARATION. */ int Type() const { return type; } /** Return a pointer to the Document this node lives in. Returns null if not in a document. */ const TiXmlDocument* GetDocument() const; TiXmlDocument* GetDocument(); /// Returns true if this node has no children. bool NoChildren() const { return !firstChild; } const TiXmlDocument* ToDocument() const { return ( this && type == DOCUMENT ) ? (const TiXmlDocument*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. const TiXmlElement* ToElement() const { return ( this && type == ELEMENT ) ? (const TiXmlElement*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. const TiXmlComment* ToComment() const { return ( this && type == COMMENT ) ? (const TiXmlComment*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. const TiXmlUnknown* ToUnknown() const { return ( this && type == UNKNOWN ) ? (const TiXmlUnknown*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. const TiXmlText* ToText() const { return ( this && type == TEXT ) ? (const TiXmlText*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. const TiXmlDeclaration* ToDeclaration() const { return ( this && type == DECLARATION ) ? (const TiXmlDeclaration*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. TiXmlDocument* ToDocument() { return ( this && type == DOCUMENT ) ? (TiXmlDocument*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. TiXmlElement* ToElement() { return ( this && type == ELEMENT ) ? (TiXmlElement*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. TiXmlComment* ToComment() { return ( this && type == COMMENT ) ? (TiXmlComment*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. TiXmlUnknown* ToUnknown() { return ( this && type == UNKNOWN ) ? (TiXmlUnknown*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. TiXmlText* ToText() { return ( this && type == TEXT ) ? (TiXmlText*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. TiXmlDeclaration* ToDeclaration() { return ( this && type == DECLARATION ) ? (TiXmlDeclaration*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. /** Create an exact duplicate of this node and return it. The memory must be deleted by the caller. */ virtual TiXmlNode* Clone() const = 0; protected: TiXmlNode( NodeType _type ); // Copy to the allocated object. Shared functionality between Clone, Copy constructor, // and the assignment operator. void CopyTo( TiXmlNode* target ) const; #ifdef TIXML_USE_STL // The real work of the input operator. virtual void StreamIn( TIXML_ISTREAM* in, TIXML_STRING* tag ) = 0; #endif // Figure out what is at *p, and parse it. Returns null if it is not an xml node. TiXmlNode* Identify( const char* start, TiXmlEncoding encoding ); TiXmlNode* parent; NodeType type; TiXmlNode* firstChild; TiXmlNode* lastChild; TIXML_STRING value; TiXmlNode* prev; TiXmlNode* next; private: TiXmlNode( const TiXmlNode& ); // not implemented. void operator=( const TiXmlNode& base ); // not allowed. }; /** An attribute is a name-value pair. Elements have an arbitrary number of attributes, each with a unique name. @note The attributes are not TiXmlNodes, since they are not part of the tinyXML document object model. There are other suggested ways to look at this problem. */ class TiXmlAttribute : public TiXmlBase { friend class TiXmlAttributeSet; public: /// Construct an empty attribute. TiXmlAttribute() : TiXmlBase() { document = 0; prev = next = 0; } #ifdef TIXML_USE_STL /// std::string constructor. TiXmlAttribute( const std::string& _name, const std::string& _value ) { name = _name; value = _value; document = 0; prev = next = 0; } #endif /// Construct an attribute with a name and value. TiXmlAttribute( const char * _name, const char * _value ) { name = _name; value = _value; document = 0; prev = next = 0; } const char* Name() const { return name.c_str (); } ///< Return the name of this attribute. const char* Value() const { return value.c_str (); } ///< Return the value of this attribute. int IntValue() const; ///< Return the value of this attribute, converted to an integer. double DoubleValue() const; ///< Return the value of this attribute, converted to a double. /** QueryIntValue examines the value string. It is an alternative to the IntValue() method with richer error checking. If the value is an integer, it is stored in 'value' and the call returns TIXML_SUCCESS. If it is not an integer, it returns TIXML_WRONG_TYPE. A specialized but useful call. Note that for success it returns 0, which is the opposite of almost all other TinyXml calls. */ int QueryIntValue( int* _value ) const; /// QueryDoubleValue examines the value string. See QueryIntValue(). int QueryDoubleValue( double* _value ) const; void SetName( const char* _name ) { name = _name; } ///< Set the name of this attribute. void SetValue( const char* _value ) { value = _value; } ///< Set the value. void SetIntValue( int _value ); ///< Set the value from an integer. void SetDoubleValue( double _value ); ///< Set the value from a double. #ifdef TIXML_USE_STL /// STL std::string form. void SetName( const std::string& _name ) { StringToBuffer buf( _name ); SetName ( buf.buffer ? buf.buffer : "error" ); } /// STL std::string form. void SetValue( const std::string& _value ) { StringToBuffer buf( _value ); SetValue( buf.buffer ? buf.buffer : "error" ); } #endif /// Get the next sibling attribute in the DOM. Returns null at end. const TiXmlAttribute* Next() const; TiXmlAttribute* Next(); /// Get the previous sibling attribute in the DOM. Returns null at beginning. const TiXmlAttribute* Previous() const; TiXmlAttribute* Previous(); bool operator==( const TiXmlAttribute& rhs ) const { return rhs.name == name; } bool operator<( const TiXmlAttribute& rhs ) const { return name < rhs.name; } bool operator>( const TiXmlAttribute& rhs ) const { return name > rhs.name; } /* Attribute parsing starts: first letter of the name returns: the next char after the value end quote */ virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); // Prints this Attribute to a FILE stream. virtual void Print( FILE* cfile, int depth ) const; virtual void StreamOut( TIXML_OSTREAM * out ) const; // [internal use] // Set the document pointer so the attribute can report errors. void SetDocument( TiXmlDocument* doc ) { document = doc; } private: TiXmlAttribute( const TiXmlAttribute& ); // not implemented. void operator=( const TiXmlAttribute& base ); // not allowed. TiXmlDocument* document; // A pointer back to a document, for error reporting. TIXML_STRING name; TIXML_STRING value; TiXmlAttribute* prev; TiXmlAttribute* next; }; /* A class used to manage a group of attributes. It is only used internally, both by the ELEMENT and the DECLARATION. The set can be changed transparent to the Element and Declaration classes that use it, but NOT transparent to the Attribute which has to implement a next() and previous() method. Which makes it a bit problematic and prevents the use of STL. This version is implemented with circular lists because: - I like circular lists - it demonstrates some independence from the (typical) doubly linked list. */ class TiXmlAttributeSet { public: TiXmlAttributeSet(); ~TiXmlAttributeSet(); void Add( TiXmlAttribute* attribute ); void Remove( TiXmlAttribute* attribute ); const TiXmlAttribute* First() const { return ( sentinel.next == &sentinel ) ? 0 : sentinel.next; } TiXmlAttribute* First() { return ( sentinel.next == &sentinel ) ? 0 : sentinel.next; } const TiXmlAttribute* Last() const { return ( sentinel.prev == &sentinel ) ? 0 : sentinel.prev; } TiXmlAttribute* Last() { return ( sentinel.prev == &sentinel ) ? 0 : sentinel.prev; } const TiXmlAttribute* Find( const char * name ) const; TiXmlAttribute* Find( const char * name ); private: //*ME: Because of hidden/disabled copy-construktor in TiXmlAttribute (sentinel-element), //*ME: this class must be also use a hidden/disabled copy-constructor !!! TiXmlAttributeSet( const TiXmlAttributeSet& ); // not allowed void operator=( const TiXmlAttributeSet& ); // not allowed (as TiXmlAttribute) TiXmlAttribute sentinel; }; /** The element is a container class. It has a value, the element name, and can contain other elements, text, comments, and unknowns. Elements also contain an arbitrary number of attributes. */ class TiXmlElement : public TiXmlNode { public: /// Construct an element. TiXmlElement (const char * in_value); #ifdef TIXML_USE_STL /// std::string constructor. TiXmlElement( const std::string& _value ); #endif TiXmlElement( const TiXmlElement& ); void operator=( const TiXmlElement& base ); virtual ~TiXmlElement(); /** Given an attribute name, Attribute() returns the value for the attribute of that name, or null if none exists. */ const char* Attribute( const char* name ) const; /** Given an attribute name, Attribute() returns the value for the attribute of that name, or null if none exists. If the attribute exists and can be converted to an integer, the integer value will be put in the return 'i', if 'i' is non-null. */ const char* Attribute( const char* name, int* i ) const; /** Given an attribute name, Attribute() returns the value for the attribute of that name, or null if none exists. If the attribute exists and can be converted to an double, the double value will be put in the return 'd', if 'd' is non-null. */ const char* Attribute( const char* name, double* d ) const; /** QueryIntAttribute examines the attribute - it is an alternative to the Attribute() method with richer error checking. If the attribute is an integer, it is stored in 'value' and the call returns TIXML_SUCCESS. If it is not an integer, it returns TIXML_WRONG_TYPE. If the attribute does not exist, then TIXML_NO_ATTRIBUTE is returned. */ int QueryIntAttribute( const char* name, int* _value ) const; /// QueryDoubleAttribute examines the attribute - see QueryIntAttribute(). int QueryDoubleAttribute( const char* name, double* _value ) const; /// QueryFloatAttribute examines the attribute - see QueryIntAttribute(). int QueryFloatAttribute( const char* name, float* _value ) const { double d; int result = QueryDoubleAttribute( name, &d ); if ( result == TIXML_SUCCESS ) { *_value = (float)d; } return result; } /** Sets an attribute of name to a given value. The attribute will be created if it does not exist, or changed if it does. */ void SetAttribute( const char* name, const char * _value ); #ifdef TIXML_USE_STL const char* Attribute( const std::string& name ) const { return Attribute( name.c_str() ); } const char* Attribute( const std::string& name, int* i ) const { return Attribute( name.c_str(), i ); } const char* Attribute( const std::string& name, double* d ) const { return Attribute( name.c_str(), d ); } int QueryIntAttribute( const std::string& name, int* _value ) const { return QueryIntAttribute( name.c_str(), _value ); } int QueryDoubleAttribute( const std::string& name, double* _value ) const { return QueryDoubleAttribute( name.c_str(), _value ); } /// STL std::string form. void SetAttribute( const std::string& name, const std::string& _value ) { StringToBuffer n( name ); StringToBuffer v( _value ); if ( n.buffer && v.buffer ) SetAttribute (n.buffer, v.buffer ); } ///< STL std::string form. void SetAttribute( const std::string& name, int _value ) { StringToBuffer n( name ); if ( n.buffer ) SetAttribute (n.buffer, _value); } #endif /** Sets an attribute of name to a given value. The attribute will be created if it does not exist, or changed if it does. */ void SetAttribute( const char * name, int value ); /** Sets an attribute of name to a given value. The attribute will be created if it does not exist, or changed if it does. */ void SetDoubleAttribute( const char * name, double value ); /** Deletes an attribute with the given name. */ void RemoveAttribute( const char * name ); #ifdef TIXML_USE_STL void RemoveAttribute( const std::string& name ) { RemoveAttribute (name.c_str ()); } ///< STL std::string form. #endif const TiXmlAttribute* FirstAttribute() const { return attributeSet.First(); } ///< Access the first attribute in this element. TiXmlAttribute* FirstAttribute() { return attributeSet.First(); } const TiXmlAttribute* LastAttribute() const { return attributeSet.Last(); } ///< Access the last attribute in this element. TiXmlAttribute* LastAttribute() { return attributeSet.Last(); } /** Convenience function for easy access to the text inside an element. Although easy and concise, GetText() is limited compared to getting the TiXmlText child and accessing it directly. If the first child of 'this' is a TiXmlText, the GetText() returns the character string of the Text node, else null is returned. This is a convenient method for getting the text of simple contained text: @verbatim This is text const char* str = fooElement->GetText(); @endverbatim 'str' will be a pointer to "This is text". Note that this function can be misleading. If the element foo was created from this XML: @verbatim This is text @endverbatim then the value of str would be null. The first child node isn't a text node, it is another element. From this XML: @verbatim This is text @endverbatim GetText() will return "This is ". WARNING: GetText() accesses a child node - don't become confused with the similarly named TiXmlHandle::Text() and TiXmlNode::ToText() which are safe type casts on the referenced node. */ const char* GetText() const; /// Creates a new Element and returns it - the returned element is a copy. virtual TiXmlNode* Clone() const; // Print the Element to a FILE stream. virtual void Print( FILE* cfile, int depth ) const; /* Attribtue parsing starts: next char past '<' returns: next char past '>' */ virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); protected: void CopyTo( TiXmlElement* target ) const; void ClearThis(); // like clear, but initializes 'this' object as well // Used to be public [internal use] #ifdef TIXML_USE_STL virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag ); #endif virtual void StreamOut( TIXML_OSTREAM * out ) const; /* [internal use] Reads the "value" of the element -- another element, or text. This should terminate with the current end tag. */ const char* ReadValue( const char* in, TiXmlParsingData* prevData, TiXmlEncoding encoding ); private: TiXmlAttributeSet attributeSet; }; /** An XML comment. */ class TiXmlComment : public TiXmlNode { public: /// Constructs an empty comment. TiXmlComment() : TiXmlNode( TiXmlNode::COMMENT ) {} TiXmlComment( const TiXmlComment& ); void operator=( const TiXmlComment& base ); virtual ~TiXmlComment() {} /// Returns a copy of this Comment. virtual TiXmlNode* Clone() const; /// Write this Comment to a FILE stream. virtual void Print( FILE* cfile, int depth ) const; /* Attribtue parsing starts: at the ! of the !-- returns: next char past '>' */ virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); protected: void CopyTo( TiXmlComment* target ) const; // used to be public #ifdef TIXML_USE_STL virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag ); #endif virtual void StreamOut( TIXML_OSTREAM * out ) const; private: }; /** XML text. A text node can have 2 ways to output the next. "normal" output and CDATA. It will default to the mode it was parsed from the XML file and you generally want to leave it alone, but you can change the output mode with SetCDATA() and query it with CDATA(). */ class TiXmlText : public TiXmlNode { friend class TiXmlElement; public: /** Constructor for text element. By default, it is treated as normal, encoded text. If you want it be output as a CDATA text element, set the parameter _cdata to 'true' */ TiXmlText (const char * initValue ) : TiXmlNode (TiXmlNode::TEXT) { SetValue( initValue ); cdata = false; } virtual ~TiXmlText() {} #ifdef TIXML_USE_STL /// Constructor. TiXmlText( const std::string& initValue ) : TiXmlNode (TiXmlNode::TEXT) { SetValue( initValue ); cdata = false; } #endif TiXmlText( const TiXmlText& copy ) : TiXmlNode( TiXmlNode::TEXT ) { copy.CopyTo( this ); } void operator=( const TiXmlText& base ) { base.CopyTo( this ); } /// Write this text object to a FILE stream. virtual void Print( FILE* cfile, int depth ) const; /// Queries whether this represents text using a CDATA section. bool CDATA() { return cdata; } /// Turns on or off a CDATA representation of text. void SetCDATA( bool _cdata ) { cdata = _cdata; } virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); protected : /// [internal use] Creates a new Element and returns it. virtual TiXmlNode* Clone() const; void CopyTo( TiXmlText* target ) const; virtual void StreamOut ( TIXML_OSTREAM * out ) const; bool Blank() const; // returns true if all white space and new lines // [internal use] #ifdef TIXML_USE_STL virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag ); #endif private: bool cdata; // true if this should be input and output as a CDATA style text element }; /** In correct XML the declaration is the first entry in the file. @verbatim @endverbatim TinyXml will happily read or write files without a declaration, however. There are 3 possible attributes to the declaration: version, encoding, and standalone. Note: In this version of the code, the attributes are handled as special cases, not generic attributes, simply because there can only be at most 3 and they are always the same. */ class TiXmlDeclaration : public TiXmlNode { public: /// Construct an empty declaration. TiXmlDeclaration() : TiXmlNode( TiXmlNode::DECLARATION ) {} #ifdef TIXML_USE_STL /// Constructor. TiXmlDeclaration( const std::string& _version, const std::string& _encoding, const std::string& _standalone ); #endif /// Construct. TiXmlDeclaration( const char* _version, const char* _encoding, const char* _standalone ); TiXmlDeclaration( const TiXmlDeclaration& copy ); void operator=( const TiXmlDeclaration& copy ); virtual ~TiXmlDeclaration() {} /// Version. Will return an empty string if none was found. const char *Version() const { return version.c_str (); } /// Encoding. Will return an empty string if none was found. const char *Encoding() const { return encoding.c_str (); } /// Is this a standalone document? const char *Standalone() const { return standalone.c_str (); } /// Creates a copy of this Declaration and returns it. virtual TiXmlNode* Clone() const; /// Print this declaration to a FILE stream. virtual void Print( FILE* cfile, int depth ) const; virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); protected: void CopyTo( TiXmlDeclaration* target ) const; // used to be public #ifdef TIXML_USE_STL virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag ); #endif virtual void StreamOut ( TIXML_OSTREAM * out) const; private: TIXML_STRING version; TIXML_STRING encoding; TIXML_STRING standalone; }; /** Any tag that tinyXml doesn't recognize is saved as an unknown. It is a tag of text, but should not be modified. It will be written back to the XML, unchanged, when the file is saved. DTD tags get thrown into TiXmlUnknowns. */ class TiXmlUnknown : public TiXmlNode { public: TiXmlUnknown() : TiXmlNode( TiXmlNode::UNKNOWN ) {} virtual ~TiXmlUnknown() {} TiXmlUnknown( const TiXmlUnknown& copy ) : TiXmlNode( TiXmlNode::UNKNOWN ) { copy.CopyTo( this ); } void operator=( const TiXmlUnknown& copy ) { copy.CopyTo( this ); } /// Creates a copy of this Unknown and returns it. virtual TiXmlNode* Clone() const; /// Print this Unknown to a FILE stream. virtual void Print( FILE* cfile, int depth ) const; virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); protected: void CopyTo( TiXmlUnknown* target ) const; #ifdef TIXML_USE_STL virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag ); #endif virtual void StreamOut ( TIXML_OSTREAM * out ) const; private: }; /** Always the top level node. A document binds together all the XML pieces. It can be saved, loaded, and printed to the screen. The 'value' of a document node is the xml file name. */ class TiXmlDocument : public TiXmlNode { public: /// Create an empty document, that has no name. TiXmlDocument(); /// Create a document with a name. The name of the document is also the filename of the xml. TiXmlDocument( const char * documentName ); #ifdef TIXML_USE_STL /// Constructor. TiXmlDocument( const std::string& documentName ); #endif TiXmlDocument( const TiXmlDocument& copy ); void operator=( const TiXmlDocument& copy ); virtual ~TiXmlDocument() {} /** Load a file using the current document value. Returns true if successful. Will delete any existing document data before loading. */ bool LoadFile( TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); /// Save a file using the current document value. Returns true if successful. bool SaveFile() const; /// Load a file using the given filename. Returns true if successful. bool LoadFile( const char * filename, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); /// Save a file using the given filename. Returns true if successful. bool SaveFile( const char * filename ) const; #ifdef TIXML_USE_STL bool LoadFile( const std::string& filename, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ) ///< STL std::string version. { StringToBuffer f( filename ); return ( f.buffer && LoadFile( f.buffer, encoding )); } bool SaveFile( const std::string& filename ) const ///< STL std::string version. { StringToBuffer f( filename ); return ( f.buffer && SaveFile( f.buffer )); } #endif /** Parse the given null terminated block of xml data. Passing in an encoding to this method (either TIXML_ENCODING_LEGACY or TIXML_ENCODING_UTF8 will force TinyXml to use that encoding, regardless of what TinyXml might otherwise try to detect. */ virtual const char* Parse( const char* p, TiXmlParsingData* data = 0, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); /** Get the root element -- the only top level element -- of the document. In well formed XML, there should only be one. TinyXml is tolerant of multiple elements at the document level. */ const TiXmlElement* RootElement() const { return FirstChildElement(); } TiXmlElement* RootElement() { return FirstChildElement(); } /** If an error occurs, Error will be set to true. Also, - The ErrorId() will contain the integer identifier of the error (not generally useful) - The ErrorDesc() method will return the name of the error. (very useful) - The ErrorRow() and ErrorCol() will return the location of the error (if known) */ bool Error() const { return error; } /// Contains a textual (english) description of the error if one occurs. const char * ErrorDesc() const { return errorDesc.c_str (); } /** Generally, you probably want the error string ( ErrorDesc() ). But if you prefer the ErrorId, this function will fetch it. */ int ErrorId() const { return errorId; } /** Returns the location (if known) of the error. The first column is column 1, and the first row is row 1. A value of 0 means the row and column wasn't applicable (memory errors, for example, have no row/column) or the parser lost the error. (An error in the error reporting, in that case.) @sa SetTabSize, Row, Column */ int ErrorRow() { return errorLocation.row+1; } int ErrorCol() { return errorLocation.col+1; } ///< The column where the error occured. See ErrorRow() /** SetTabSize() allows the error reporting functions (ErrorRow() and ErrorCol()) to report the correct values for row and column. It does not change the output or input in any way. By calling this method, with a tab size greater than 0, the row and column of each node and attribute is stored when the file is loaded. Very useful for tracking the DOM back in to the source file. The tab size is required for calculating the location of nodes. If not set, the default of 4 is used. The tabsize is set per document. Setting the tabsize to 0 disables row/column tracking. Note that row and column tracking is not supported when using operator>>. The tab size needs to be enabled before the parse or load. Correct usage: @verbatim TiXmlDocument doc; doc.SetTabSize( 8 ); doc.Load( "myfile.xml" ); @endverbatim @sa Row, Column */ void SetTabSize( int _tabsize ) { tabsize = _tabsize; } int TabSize() const { return tabsize; } /** If you have handled the error, it can be reset with this call. The error state is automatically cleared if you Parse a new XML block. */ void ClearError() { error = false; errorId = 0; errorDesc = ""; errorLocation.row = errorLocation.col = 0; //errorLocation.last = 0; } /** Dump the document to standard out. */ void Print() const { Print( stdout, 0 ); } /// Print this Document to a FILE stream. virtual void Print( FILE* cfile, int depth = 0 ) const; // [internal use] void SetError( int err, const char* errorLocation, TiXmlParsingData* prevData, TiXmlEncoding encoding ); protected : virtual void StreamOut ( TIXML_OSTREAM * out) const; // [internal use] virtual TiXmlNode* Clone() const; #ifdef TIXML_USE_STL virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag ); #endif private: void CopyTo( TiXmlDocument* target ) const; bool error; int errorId; TIXML_STRING errorDesc; int tabsize; TiXmlCursor errorLocation; bool useMicrosoftBOM; // the UTF-8 BOM were found when read. Note this, and try to write. }; /** A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly useful thing. Note that TiXmlHandle is not part of the TinyXml DOM structure. It is a separate utility class. Take an example: @verbatim @endverbatim Assuming you want the value of "attributeB" in the 2nd "Child" element, it's very easy to write a *lot* of code that looks like: @verbatim TiXmlElement* root = document.FirstChildElement( "Document" ); if ( root ) { TiXmlElement* element = root->FirstChildElement( "Element" ); if ( element ) { TiXmlElement* child = element->FirstChildElement( "Child" ); if ( child ) { TiXmlElement* child2 = child->NextSiblingElement( "Child" ); if ( child2 ) { // Finally do something useful. @endverbatim And that doesn't even cover "else" cases. TiXmlHandle addresses the verbosity of such code. A TiXmlHandle checks for null pointers so it is perfectly safe and correct to use: @verbatim TiXmlHandle docHandle( &document ); TiXmlElement* child2 = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child", 1 ).Element(); if ( child2 ) { // do something useful @endverbatim Which is MUCH more concise and useful. It is also safe to copy handles - internally they are nothing more than node pointers. @verbatim TiXmlHandle handleCopy = handle; @endverbatim What they should not be used for is iteration: @verbatim int i=0; while ( true ) { TiXmlElement* child = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child", i ).Element(); if ( !child ) break; // do something ++i; } @endverbatim It seems reasonable, but it is in fact two embedded while loops. The Child method is a linear walk to find the element, so this code would iterate much more than it needs to. Instead, prefer: @verbatim TiXmlElement* child = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).FirstChild( "Child" ).Element(); for( child; child; child=child->NextSiblingElement() ) { // do something } @endverbatim */ class TiXmlHandle { public: /// Create a handle from any node (at any depth of the tree.) This can be a null pointer. TiXmlHandle( TiXmlNode* _node ) { this->node = _node; } /// Copy constructor TiXmlHandle( const TiXmlHandle& ref ) { this->node = ref.node; } TiXmlHandle operator=( const TiXmlHandle& ref ) { this->node = ref.node; return *this; } /// Return a handle to the first child node. TiXmlHandle FirstChild() const; /// Return a handle to the first child node with the given name. TiXmlHandle FirstChild( const char * value ) const; /// Return a handle to the first child element. TiXmlHandle FirstChildElement() const; /// Return a handle to the first child element with the given name. TiXmlHandle FirstChildElement( const char * value ) const; /** Return a handle to the "index" child with the given name. The first child is 0, the second 1, etc. */ TiXmlHandle Child( const char* value, int index ) const; /** Return a handle to the "index" child. The first child is 0, the second 1, etc. */ TiXmlHandle Child( int index ) const; /** Return a handle to the "index" child element with the given name. The first child element is 0, the second 1, etc. Note that only TiXmlElements are indexed: other types are not counted. */ TiXmlHandle ChildElement( const char* value, int index ) const; /** Return a handle to the "index" child element. The first child element is 0, the second 1, etc. Note that only TiXmlElements are indexed: other types are not counted. */ TiXmlHandle ChildElement( int index ) const; #ifdef TIXML_USE_STL TiXmlHandle FirstChild( const std::string& _value ) const { return FirstChild( _value.c_str() ); } TiXmlHandle FirstChildElement( const std::string& _value ) const { return FirstChildElement( _value.c_str() ); } TiXmlHandle Child( const std::string& _value, int index ) const { return Child( _value.c_str(), index ); } TiXmlHandle ChildElement( const std::string& _value, int index ) const { return ChildElement( _value.c_str(), index ); } #endif /// Return the handle as a TiXmlNode. This may return null. TiXmlNode* Node() const { return node; } /// Return the handle as a TiXmlElement. This may return null. TiXmlElement* Element() const { return ( ( node && node->ToElement() ) ? node->ToElement() : 0 ); } /// Return the handle as a TiXmlText. This may return null. TiXmlText* Text() const { return ( ( node && node->ToText() ) ? node->ToText() : 0 ); } /// Return the handle as a TiXmlUnknown. This may return null; TiXmlUnknown* Unknown() const { return ( ( node && node->ToUnknown() ) ? node->ToUnknown() : 0 ); } private: TiXmlNode* node; }; #ifdef _MSC_VER #pragma warning( pop ) #endif #endif xye-0.12.2+dfsg/src/tinyxml/xye_tinyxmlerror.cpp000077500000000000000000000032671225403634500220010ustar00rootroot00000000000000/* www.sourceforge.net/projects/tinyxml Original code (2.0 and earlier )copyright (c) 2000-2002 Lee Thomason (www.grinninglizard.com) This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. 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 appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. */ #include "xye_tinyxml.h" // The goal of the seperate error file is to make the first // step towards localization. tinyxml (currently) only supports // english error messages, but the could now be translated. // // It also cleans up the code a bit. // const char* TiXmlBase::errorString[ TIXML_ERROR_STRING_COUNT ] = { "No error", "Error", "Failed to open file", "Memory allocation failed.", "Error parsing Element.", "Failed to read Element name", "Error reading Element value.", "Error reading Attributes.", "Error: empty tag.", "Error reading end tag.", "Error parsing Unknown.", "Error parsing Comment.", "Error parsing Declaration.", "Error document empty.", "Error null (0) or unexpected EOF found in input stream.", "Error parsing CDATA.", }; xye-0.12.2+dfsg/src/tinyxml/xye_tinyxmlparser.cpp000077500000000000000000001037021225403634500221370ustar00rootroot00000000000000/* www.sourceforge.net/projects/tinyxml Original code (2.0 and earlier )copyright (c) 2000-2002 Lee Thomason (www.grinninglizard.com) This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. 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 appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. */ #include "xye_tinyxml.h" #include #include //#define DEBUG_PARSER // Note tha "PutString" hardcodes the same list. This // is less flexible than it appears. Changing the entries // or order will break putstring. TiXmlBase::Entity TiXmlBase::entity[ NUM_ENTITY ] = { { "&", 5, '&' }, { "<", 4, '<' }, { ">", 4, '>' }, { """, 6, '\"' }, { "'", 6, '\'' } }; // Bunch of unicode info at: // http://www.unicode.org/faq/utf_bom.html // Including the basic of this table, which determines the #bytes in the // sequence from the lead byte. 1 placed for invalid sequences -- // although the result will be junk, pass it through as much as possible. // Beware of the non-characters in UTF-8: // ef bb bf (Microsoft "lead bytes") // ef bf be // ef bf bf const unsigned char TIXML_UTF_LEAD_0 = 0xefU; const unsigned char TIXML_UTF_LEAD_1 = 0xbbU; const unsigned char TIXML_UTF_LEAD_2 = 0xbfU; const int TiXmlBase::utf8ByteTable[256] = { // 0 1 2 3 4 5 6 7 8 9 a b c d e f 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x00 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x10 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x20 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x30 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x40 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x50 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x60 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x70 End of ASCII range 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x80 0x80 to 0xc1 invalid 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x90 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0xa0 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0xb0 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // 0xc0 0xc2 to 0xdf 2 byte 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // 0xd0 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 0xe0 0xe0 to 0xef 3 byte 4, 4, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // 0xf0 0xf0 to 0xf4 4 byte, 0xf5 and higher invalid }; void TiXmlBase::ConvertUTF32ToUTF8( unsigned long input, char* output, int* length ) { const unsigned long BYTE_MASK = 0xBF; const unsigned long BYTE_MARK = 0x80; const unsigned long FIRST_BYTE_MARK[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC }; if (input < 0x80) *length = 1; else if ( input < 0x800 ) *length = 2; else if ( input < 0x10000 ) *length = 3; else if ( input < 0x200000 ) *length = 4; else { *length = 0; return; } // This code won't covert this correctly anyway. output += *length; // Scary scary fall throughs. switch (*length) { case 4: --output; *output = (char)((input | BYTE_MARK) & BYTE_MASK); input >>= 6; case 3: --output; *output = (char)((input | BYTE_MARK) & BYTE_MASK); input >>= 6; case 2: --output; *output = (char)((input | BYTE_MARK) & BYTE_MASK); input >>= 6; case 1: --output; *output = (char)(input | FIRST_BYTE_MARK[*length]); } } /*static*/ int TiXmlBase::IsAlpha( unsigned char anyByte, TiXmlEncoding /*encoding*/ ) { // This will only work for low-ascii, everything else is assumed to be a valid // letter. I'm not sure this is the best approach, but it is quite tricky trying // to figure out alhabetical vs. not across encoding. So take a very // conservative approach. // if ( encoding == TIXML_ENCODING_UTF8 ) // { if ( anyByte < 127 ) return isalpha( anyByte ); else return 1; // What else to do? The unicode set is huge...get the english ones right. // } // else // { // return isalpha( anyByte ); // } } /*static*/ int TiXmlBase::IsAlphaNum( unsigned char anyByte, TiXmlEncoding /*encoding*/ ) { // This will only work for low-ascii, everything else is assumed to be a valid // letter. I'm not sure this is the best approach, but it is quite tricky trying // to figure out alhabetical vs. not across encoding. So take a very // conservative approach. // if ( encoding == TIXML_ENCODING_UTF8 ) // { if ( anyByte < 127 ) return isalnum( anyByte ); else return 1; // What else to do? The unicode set is huge...get the english ones right. // } // else // { // return isalnum( anyByte ); // } } class TiXmlParsingData { friend class TiXmlDocument; public: void Stamp( const char* now, TiXmlEncoding encoding ); const TiXmlCursor& Cursor() { return cursor; } private: // Only used by the document! TiXmlParsingData( const char* start, int _tabsize, int row, int col ) { assert( start ); stamp = start; tabsize = _tabsize; cursor.row = row; cursor.col = col; } TiXmlCursor cursor; const char* stamp; int tabsize; }; void TiXmlParsingData::Stamp( const char* now, TiXmlEncoding encoding ) { assert( now ); // Do nothing if the tabsize is 0. if ( tabsize < 1 ) { return; } // Get the current row, column. int row = cursor.row; int col = cursor.col; const char* p = stamp; assert( p ); while ( p < now ) { // Treat p as unsigned, so we have a happy compiler. const unsigned char* pU = (const unsigned char*)p; // Code contributed by Fletcher Dunn: (modified by lee) switch (*pU) { case 0: // We *should* never get here, but in case we do, don't // advance past the terminating null character, ever return; case '\r': // bump down to the next line ++row; col = 0; // Eat the character ++p; // Check for \r\n sequence, and treat this as a single character if (*p == '\n') { ++p; } break; case '\n': // bump down to the next line ++row; col = 0; // Eat the character ++p; // Check for \n\r sequence, and treat this as a single // character. (Yes, this bizarre thing does occur still // on some arcane platforms...) if (*p == '\r') { ++p; } break; case '\t': // Eat the character ++p; // Skip to next tab stop col = (col / tabsize + 1) * tabsize; break; case TIXML_UTF_LEAD_0: if ( encoding == TIXML_ENCODING_UTF8 ) { if ( *(p+1) && *(p+2) ) { // In these cases, don't advance the column. These are // 0-width spaces. if ( *(pU+1)==TIXML_UTF_LEAD_1 && *(pU+2)==TIXML_UTF_LEAD_2 ) p += 3; else if ( *(pU+1)==0xbfU && *(pU+2)==0xbeU ) p += 3; else if ( *(pU+1)==0xbfU && *(pU+2)==0xbfU ) p += 3; else { p +=3; ++col; } // A normal character. } } else { ++p; ++col; } break; default: if ( encoding == TIXML_ENCODING_UTF8 ) { // Eat the 1 to 4 byte utf8 character. int step = TiXmlBase::utf8ByteTable[*((unsigned char*)p)]; if ( step == 0 ) step = 1; // Error case from bad encoding, but handle gracefully. p += step; // Just advance one column, of course. ++col; } else { ++p; ++col; } break; } } cursor.row = row; cursor.col = col; assert( cursor.row >= -1 ); assert( cursor.col >= -1 ); stamp = p; assert( stamp ); } const char* TiXmlBase::SkipWhiteSpace( const char* p, TiXmlEncoding encoding ) { if ( !p || !*p ) { return 0; } if ( encoding == TIXML_ENCODING_UTF8 ) { while ( *p ) { const unsigned char* pU = (const unsigned char*)p; // Skip the stupid Microsoft UTF-8 Byte order marks if ( *(pU+0)==TIXML_UTF_LEAD_0 && *(pU+1)==TIXML_UTF_LEAD_1 && *(pU+2)==TIXML_UTF_LEAD_2 ) { p += 3; continue; } else if(*(pU+0)==TIXML_UTF_LEAD_0 && *(pU+1)==0xbfU && *(pU+2)==0xbeU ) { p += 3; continue; } else if(*(pU+0)==TIXML_UTF_LEAD_0 && *(pU+1)==0xbfU && *(pU+2)==0xbfU ) { p += 3; continue; } if ( IsWhiteSpace( *p ) || *p == '\n' || *p =='\r' ) // Still using old rules for white space. ++p; else break; } } else { while ( *p && IsWhiteSpace( *p ) || *p == '\n' || *p =='\r' ) ++p; } return p; } #ifdef TIXML_USE_STL /*static*/ bool TiXmlBase::StreamWhiteSpace( TIXML_ISTREAM * in, TIXML_STRING * tag ) { for( ;; ) { if ( !in->good() ) return false; int c = in->peek(); // At this scope, we can't get to a document. So fail silently. if ( !IsWhiteSpace( c ) || c <= 0 ) return true; *tag += (char) in->get(); } } /*static*/ bool TiXmlBase::StreamTo( TIXML_ISTREAM * in, int character, TIXML_STRING * tag ) { //assert( character > 0 && character < 128 ); // else it won't work in utf-8 while ( in->good() ) { int c = in->peek(); if ( c == character ) return true; if ( c <= 0 ) // Silent failure: can't get document at this scope return false; in->get(); *tag += (char) c; } return false; } #endif const char* TiXmlBase::ReadName( const char* p, TIXML_STRING * name, TiXmlEncoding encoding ) { *name = ""; assert( p ); // Names start with letters or underscores. // Of course, in unicode, tinyxml has no idea what a letter *is*. The // algorithm is generous. // // After that, they can be letters, underscores, numbers, // hyphens, or colons. (Colons are valid ony for namespaces, // but tinyxml can't tell namespaces from names.) if ( p && *p && ( IsAlpha( (unsigned char) *p, encoding ) || *p == '_' ) ) { while( p && *p && ( IsAlphaNum( (unsigned char ) *p, encoding ) || *p == '_' || *p == '-' || *p == '.' || *p == ':' ) ) { (*name) += *p; ++p; } return p; } return 0; } const char* TiXmlBase::GetEntity( const char* p, char* value, int* length, TiXmlEncoding encoding ) { // Presume an entity, and pull it out. TIXML_STRING ent; int i; *length = 0; if ( *(p+1) && *(p+1) == '#' && *(p+2) ) { unsigned long ucs = 0; ptrdiff_t delta = 0; unsigned mult = 1; if ( *(p+2) == 'x' ) { // Hexadecimal. if ( !*(p+3) ) return 0; const char* q = p+3; q = strchr( q, ';' ); if ( !q || !*q ) return 0; delta = q-p; --q; while ( *q != 'x' ) { if ( *q >= '0' && *q <= '9' ) ucs += mult * (*q - '0'); else if ( *q >= 'a' && *q <= 'f' ) ucs += mult * (*q - 'a' + 10); else if ( *q >= 'A' && *q <= 'F' ) ucs += mult * (*q - 'A' + 10 ); else return 0; mult *= 16; --q; } } else { // Decimal. if ( !*(p+2) ) return 0; const char* q = p+2; q = strchr( q, ';' ); if ( !q || !*q ) return 0; delta = q-p; --q; while ( *q != '#' ) { if ( *q >= '0' && *q <= '9' ) ucs += mult * (*q - '0'); else return 0; mult *= 10; --q; } } if ( encoding == TIXML_ENCODING_UTF8 ) { // convert the UCS to UTF-8 ConvertUTF32ToUTF8( ucs, value, length ); } else { *value = (char)ucs; *length = 1; } return p + delta + 1; } // Now try to match it. for( i=0; iappend( cArr, len ); } } else { bool whitespace = false; // Remove leading white space: p = SkipWhiteSpace( p, encoding ); while ( p && *p && !StringEqual( p, endTag, caseInsensitive, encoding ) ) { if ( *p == '\r' || *p == '\n' ) { whitespace = true; ++p; } else if ( IsWhiteSpace( *p ) ) { whitespace = true; ++p; } else { // If we've found whitespace, add it before the // new character. Any whitespace just becomes a space. if ( whitespace ) { (*text) += ' '; whitespace = false; } int len; char cArr[4] = { 0, 0, 0, 0 }; p = GetChar( p, cArr, &len, encoding ); if ( len == 1 ) (*text) += cArr[0]; // more efficient else text->append( cArr, len ); } } } return p + strlen( endTag ); } #ifdef TIXML_USE_STL void TiXmlDocument::StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag ) { // The basic issue with a document is that we don't know what we're // streaming. Read something presumed to be a tag (and hope), then // identify it, and call the appropriate stream method on the tag. // // This "pre-streaming" will never read the closing ">" so the // sub-tag can orient itself. if ( !StreamTo( in, '<', tag ) ) { SetError( TIXML_ERROR_PARSING_EMPTY, 0, 0, TIXML_ENCODING_UNKNOWN ); return; } while ( in->good() ) { int tagIndex = (int) tag->length(); while ( in->good() && in->peek() != '>' ) { int c = in->get(); if ( c <= 0 ) { SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN ); break; } (*tag) += (char) c; } if ( in->good() ) { // We now have something we presume to be a node of // some sort. Identify it, and call the node to // continue streaming. TiXmlNode* node = Identify( tag->c_str() + tagIndex, TIXML_DEFAULT_ENCODING ); if ( node ) { node->StreamIn( in, tag ); bool isElement = node->ToElement() != 0; delete node; node = 0; // If this is the root element, we're done. Parsing will be // done by the >> operator. if ( isElement ) { return; } } else { SetError( TIXML_ERROR, 0, 0, TIXML_ENCODING_UNKNOWN ); return; } } } // We should have returned sooner. SetError( TIXML_ERROR, 0, 0, TIXML_ENCODING_UNKNOWN ); } #endif const char* TiXmlDocument::Parse( const char* p, TiXmlParsingData* prevData, TiXmlEncoding encoding ) { ClearError(); // Parse away, at the document level. Since a document // contains nothing but other tags, most of what happens // here is skipping white space. if ( !p || !*p ) { SetError( TIXML_ERROR_DOCUMENT_EMPTY, 0, 0, TIXML_ENCODING_UNKNOWN ); return 0; } // Note that, for a document, this needs to come // before the while space skip, so that parsing // starts from the pointer we are given. location.Clear(); if ( prevData ) { location.row = prevData->cursor.row; location.col = prevData->cursor.col; } else { location.row = 0; location.col = 0; } TiXmlParsingData data( p, TabSize(), location.row, location.col ); location = data.Cursor(); if ( encoding == TIXML_ENCODING_UNKNOWN ) { // Check for the Microsoft UTF-8 lead bytes. const unsigned char* pU = (const unsigned char*)p; if ( *(pU+0) && *(pU+0) == TIXML_UTF_LEAD_0 && *(pU+1) && *(pU+1) == TIXML_UTF_LEAD_1 && *(pU+2) && *(pU+2) == TIXML_UTF_LEAD_2 ) { encoding = TIXML_ENCODING_UTF8; useMicrosoftBOM = true; } } p = SkipWhiteSpace( p, encoding ); if ( !p ) { SetError( TIXML_ERROR_DOCUMENT_EMPTY, 0, 0, TIXML_ENCODING_UNKNOWN ); return 0; } while ( p && *p ) { TiXmlNode* node = Identify( p, encoding ); if ( node ) { p = node->Parse( p, &data, encoding ); LinkEndChild( node ); } else { break; } // Did we get encoding info? if ( encoding == TIXML_ENCODING_UNKNOWN && node->ToDeclaration() ) { TiXmlDeclaration* dec = node->ToDeclaration(); const char* enc = dec->Encoding(); assert( enc ); if ( *enc == 0 ) encoding = TIXML_ENCODING_UTF8; else if ( StringEqual( enc, "UTF-8", true, TIXML_ENCODING_UNKNOWN ) ) encoding = TIXML_ENCODING_UTF8; else if ( StringEqual( enc, "UTF8", true, TIXML_ENCODING_UNKNOWN ) ) encoding = TIXML_ENCODING_UTF8; // incorrect, but be nice else encoding = TIXML_ENCODING_LEGACY; } p = SkipWhiteSpace( p, encoding ); } // Was this empty? if ( !firstChild ) { SetError( TIXML_ERROR_DOCUMENT_EMPTY, 0, 0, encoding ); return 0; } // All is well. return p; } void TiXmlDocument::SetError( int err, const char* pError, TiXmlParsingData* data, TiXmlEncoding encoding ) { // The first error in a chain is more accurate - don't set again! if ( error ) return; assert( err > 0 && err < TIXML_ERROR_STRING_COUNT ); error = true; errorId = err; errorDesc = errorString[ errorId ]; errorLocation.Clear(); if ( pError && data ) { data->Stamp( pError, encoding ); errorLocation = data->Cursor(); } } TiXmlNode* TiXmlNode::Identify( const char* p, TiXmlEncoding encoding ) { TiXmlNode* returnNode = 0; p = SkipWhiteSpace( p, encoding ); if( !p || !*p || *p != '<' ) { return 0; } TiXmlDocument* doc = GetDocument(); p = SkipWhiteSpace( p, encoding ); if ( !p || !*p ) { return 0; } // What is this thing? // - Elements start with a letter or underscore, but xml is reserved. // - Comments: "; if ( !StringEqual( p, startTag, false, encoding ) ) { document->SetError( TIXML_ERROR_PARSING_COMMENT, p, data, encoding ); return 0; } p += strlen( startTag ); p = ReadText( p, &value, false, endTag, false, encoding ); return p; } const char* TiXmlAttribute::Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ) { p = SkipWhiteSpace( p, encoding ); if ( !p || !*p ) return 0; int tabsize = 4; if ( document ) tabsize = document->TabSize(); if ( data ) { data->Stamp( p, encoding ); location = data->Cursor(); } // Read the name, the '=' and the value. const char* pErr = p; p = ReadName( p, &name, encoding ); if ( !p || !*p ) { if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, pErr, data, encoding ); return 0; } p = SkipWhiteSpace( p, encoding ); if ( !p || !*p || *p != '=' ) { if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, p, data, encoding ); return 0; } ++p; // skip '=' p = SkipWhiteSpace( p, encoding ); if ( !p || !*p ) { if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, p, data, encoding ); return 0; } const char* end; if ( *p == '\'' ) { ++p; end = "\'"; p = ReadText( p, &value, false, end, false, encoding ); } else if ( *p == '"' ) { ++p; end = "\""; p = ReadText( p, &value, false, end, false, encoding ); } else { // All attribute values should be in single or double quotes. // But this is such a common error that the parser will try // its best, even without them. value = ""; while ( p && *p // existence && !IsWhiteSpace( *p ) && *p != '\n' && *p != '\r' // whitespace && *p != '/' && *p != '>' ) // tag end { value += *p; ++p; } } return p; } #ifdef TIXML_USE_STL void TiXmlText::StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag ) { if ( cdata ) { int c = in->get(); if ( c <= 0 ) { TiXmlDocument* document = GetDocument(); if ( document ) document->SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN ); return; } (*tag) += (char) c; if ( c == '>' && tag->at( tag->length() - 2 ) == ']' && tag->at( tag->length() - 3 ) == ']' ) { // All is well. return; } } else { while ( in->good() ) { int c = in->peek(); if ( c == '<' ) return; if ( c <= 0 ) { TiXmlDocument* document = GetDocument(); if ( document ) document->SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN ); return; } (*tag) += (char) c; in->get(); } } } #endif const char* TiXmlText::Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ) { value = ""; TiXmlDocument* document = GetDocument(); if ( data ) { data->Stamp( p, encoding ); location = data->Cursor(); } const char* const startTag = ""; if ( cdata || StringEqual( p, startTag, false, encoding ) ) { cdata = true; if ( !StringEqual( p, startTag, false, encoding ) ) { document->SetError( TIXML_ERROR_PARSING_CDATA, p, data, encoding ); return 0; } p += strlen( startTag ); // Keep all the white space, ignore the encoding, etc. while ( p && *p && !StringEqual( p, endTag, false, encoding ) ) { value += *p; ++p; } TIXML_STRING dummy; p = ReadText( p, &dummy, false, endTag, false, encoding ); return p; } else { bool ignoreWhite = true; const char* end = "<"; p = ReadText( p, &value, ignoreWhite, end, false, encoding ); if ( p ) return p-1; // don't truncate the '<' return 0; } } #ifdef TIXML_USE_STL void TiXmlDeclaration::StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag ) { while ( in->good() ) { int c = in->get(); if ( c <= 0 ) { TiXmlDocument* document = GetDocument(); if ( document ) document->SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN ); return; } (*tag) += (char) c; if ( c == '>' ) { // All is well. return; } } } #endif const char* TiXmlDeclaration::Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding _encoding ) { p = SkipWhiteSpace( p, _encoding ); // Find the beginning, find the end, and look for // the stuff in-between. TiXmlDocument* document = GetDocument(); if ( !p || !*p || !StringEqual( p, "SetError( TIXML_ERROR_PARSING_DECLARATION, 0, 0, _encoding ); return 0; } if ( data ) { data->Stamp( p, _encoding ); location = data->Cursor(); } p += 5; version = ""; encoding = ""; standalone = ""; while ( p && *p ) { if ( *p == '>' ) { ++p; return p; } p = SkipWhiteSpace( p, _encoding ); if ( StringEqual( p, "version", true, _encoding ) ) { TiXmlAttribute attrib; p = attrib.Parse( p, data, _encoding ); version = attrib.Value(); } else if ( StringEqual( p, "encoding", true, _encoding ) ) { TiXmlAttribute attrib; p = attrib.Parse( p, data, _encoding ); encoding = attrib.Value(); } else if ( StringEqual( p, "standalone", true, _encoding ) ) { TiXmlAttribute attrib; p = attrib.Parse( p, data, _encoding ); standalone = attrib.Value(); } else { // Read over whatever it is. while( p && *p && *p != '>' && !IsWhiteSpace( *p ) ) ++p; } } return 0; } bool TiXmlText::Blank() const { for ( unsigned i=0; iw; SDL_Surface* r = CreateFixedRGBASurface(SDL_SRCALPHA, sw, sh); SDL_LockSurface(src); SDL_LockSurface(r); Uint32 tm=0,tm2=0; Uint32* src_pix= (Uint32*)(src->pixels); Uint32* r_pix= (Uint32*)(r->pixels); Uint8 rd=0,g=0,b=0,a=0,aux=0; Uint32 i,j; Uint32 k=0,l=0; for (i=sx;i<(sx+sw);i++) { l=0; for (j=sy;j<(sy+sh);j++) { tm= *(src_pix + (j * siw) + i); SDL_GetRGBA(tm, src->format, &rd, &g, &b, &a); if (a>0) { rd = Look[newR][rd]; g = Look[newG][g]; b = Look[newB][b]; a = Look[newA][a]; } col.a=a; col.b=b; col.g=g; col.r=rd; //if ( (col.b|col.g|col.r) == 0) col.a=255; *(r_pix + ((l) * sw) + (k)) = *colInt32; l++; } k++; } SDL_UnlockSurface(src); SDL_UnlockSurface(r); return(r); } SDL_Surface * RecolorPartOfSurface(SDL_Surface *src, SDL_Rect *srcrect, Uint8 newR, Uint8 newG, Uint8 newB, Uint8 newA) { return(RecolorPartOfSurface(src,srcrect->x, srcrect->y, srcrect->w, srcrect->h, newR, newG, newB, newA)); } int SDL_BlitSurface(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, SDL_Rect *dstrect, Uint8 newR, Uint8 newG, Uint8 newB, Uint8 newA) { SDL_Surface *tm= RecolorCache::loadcolor(src,newR,newG,newB,newA); if (tm) { return SDL_BlitSurface(tm,srcrect,dst,dstrect); } tm= RecolorPartOfSurface(src,srcrect,newR,newG,newB,newA) ; int Result=SDL_BlitSurface(tm,0,dst,dstrect); SDL_FreeSurface(tm); return(Result); } int SDL_BlitSurface(SDL_Surface *src, Sint16 sx, Sint16 sy, Uint16 sw, Uint16 sh, SDL_Surface *dst, Sint16 dx, Sint16 dy, Uint8 newR, Uint8 newG, Uint8 newB, Uint8 newA) { SDL_Surface *tm= RecolorCache::loadcolor(src,newR,newG,newB,newA); SDL_Rect tar; tar.x=dx; tar.y=dy; tar.w=sw; //I think these are ignored tar.h=sh; if (tm) { SDL_Rect srt; srt.y=sy; srt.x=sx; srt.w=sw; srt.h=sh; return SDL_BlitSurface(tm,&srt,dst,&tar); } tm=RecolorPartOfSurface(src,sx,sy,sw,sh,newR,newG,newB,newA) ; int Result=SDL_BlitSurface(tm,0,dst,&tar); SDL_FreeSurface(tm); return(Result); } int SDL_BlitSurface(SDL_Surface *src, Sint16 sx, Sint16 sy, Uint16 sw, Uint16 sh, SDL_Surface *dst, Sint16 dx, Sint16 dy) { SDL_Rect srr; SDL_Rect tar; srr.x=sx; srr.y=sy; srr.w=sw; srr.h=sh; tar.x=dx; tar.y=dy; tar.w=sw; //I think these are ignored tar.h=sh; return(SDL_BlitSurface(src,&srr,dst,&tar) ); } int SDL_FillRect(SDL_Surface *dst, Sint16 x, Sint16 y, Uint16 w, Uint16 h, Uint32 color) { SDL_Rect R; R.x=x; R.y=y; R.w=w; R.h=h; return SDL_FillRect(dst, &R, color); } /*** Class Drawer - Our Artist **/ Drawer::Drawer(SDL_Surface*SourceTexture, SDL_Rect* rect) { R=G=B=A=255;recolor=false; sr.x=rect->x; sr.y=rect->y; sr.w=rect->w; sr.h=rect->h; src=SourceTexture; src_lights = NULL; } Drawer::Drawer(SDL_Surface*SourceTexture, Sint16 x, Sint16 y, Uint16 w, Uint16 h) { R=G=B=A=255;recolor=false; sr.x=x; sr.y=y; sr.w=w; sr.h=h; src=SourceTexture; src_lights = NULL; } Drawer::Drawer( LuminositySprites & source, SDL_Rect* rect) { R=G=B=A=255;recolor=false; sr.x=rect->x; sr.y=rect->y; sr.w=rect->w; sr.h=rect->h; src=source.sprites; src_lights = source.luminosity; } Drawer::Drawer(LuminositySprites & source, Sint16 x, Sint16 y, Uint16 w, Uint16 h) { R=G=B=A=255;recolor=false; sr.x=x; sr.y=y; sr.w=w; sr.h=h; src=source.sprites; src_lights = source.luminosity; } void Drawer::ChangeRect(Sint16 x, Sint16 y, Uint16 w, Uint16 h) { sr.x=x; sr.y=y; sr.w=w; sr.h=h; } void Drawer::ChangeRect(SDL_Rect* rect) { sr.x=rect->x; sr.y=rect->y; sr.w=rect->w; sr.h=rect->h; } void Drawer::SetColors(Uint8 nR, Uint8 nG, Uint8 nB, Uint8 nA) { R=nR;G=nG;B=nB;A=nA; recolor=((R!=255) || (G!=255) || (B!=255) || (A!=255)); } void Drawer::SetColors(SDL_Color* C,Uint8 alpha) { R=C->r;G=C->g;B=C->b;A=alpha; recolor=((R!=255) || (G!=255) || (B!=255) || (A!=255) ); } void Drawer::SetColors(SDL_Color& C,Uint8 alpha) { R=C.r;G=C.g;B=C.b;A=alpha; recolor=((R!=255) || (G!=255) || (B!=255) || (A!=255) ); } int Drawer::Draw(SDL_Surface* target, Sint16 x, Sint16 y) { SDL_Rect T; T.x=x; T.y=y; T.w=sr.w; T.h=sr.h; int r; if (recolor) r=SDL_BlitSurface(src, &sr, target, &T, R, G, B, A); else r=SDL_BlitSurface(src, &sr, target, &T); if( src_lights != NULL) { if(SDL_BlitSurface(src_lights, &sr, target, &T) == -1) r=-1; } return r; } /** endo of class Drawer **/ /** start of recolor cache **/ SDL_Surface* RecolorCache::cacheseed; recolorcache_entry* RecolorCache::first; void RecolorCache::init() { cacheseed=NULL; first=NULL; } void RecolorCache::restart(SDL_Surface* scacheseed) { clean(); cacheseed=scacheseed; } void RecolorCache::clean() { recolorcache_entry* tm; while(first) { tm=first->next; SDL_FreeSurface(first->cached); delete first; first=tm; } cacheseed=NULL; } recolorcache_entry* RecolorCache::entry(Uint8 r,Uint8 g,Uint8 b, Uint8 a,bool createifmissing) { recolorcache_entry* tm=first,*ls=NULL; while (tm) { if ((tm->a==a) && (tm->g==g) && (tm->b==b) && (tm->r==r)) return tm; ls=tm; tm=tm->next; } if (! createifmissing) return NULL; tm=new recolorcache_entry; tm->a=a; tm->b=b; tm->g=g; tm->r=r; tm->next=NULL; tm->cached=NULL; if (ls) ls->next=tm; else first=tm; return tm; } void RecolorCache::savecolor(Uint8 r,Uint8 g, Uint8 b, Uint8 a) { if (!cacheseed) return; recolorcache_entry* tm=entry(r,g,b,a,true); if (! (tm->cached)) tm->cached=RecolorPartOfSurface(cacheseed,0,0,cacheseed->w,cacheseed->h,r,g,b,a); } void RecolorCache::savecolor(SDL_Color *c) { SDL_Color &i=*c; savecolor(i.r,i.g,i.b,i.unused); } SDL_Surface* RecolorCache::loadcolor(SDL_Surface* sf,Uint8 r,Uint8 g,Uint8 b, Uint8 a) { if (sf!=cacheseed) return NULL; recolorcache_entry* tm=entry(r,g,b,a,false); if (tm) return tm->cached; return NULL; } /** Recolor Cache ends**/ xye-0.12.2+dfsg/src/vxsdl.h000066400000000000000000000070521225403634500154300ustar00rootroot00000000000000#define vxsdlh #include #include #include #include void Init_RecolorTable(); #ifndef DEF_FIXEDRGBA #define DEF_FIXEDRGBA struct FixedRGBA { Uint8 r; Uint8 g; Uint8 b; Uint8 a; }; #endif #ifndef SDL_32BYTE1 #if SDL_BYTEORDER == SDL_BIG_ENDIAN #define SDL_32BYTE1 0xff000000 #define SDL_32BYTE2 0x00ff0000 #define SDL_32BYTE3 0x0000ff00 #define SDL_32BYTE4 0x000000ff #else #define SDL_32BYTE1 0x000000ff #define SDL_32BYTE2 0x0000ff00 #define SDL_32BYTE3 0x00ff0000 #define SDL_32BYTE4 0xff000000 #endif #define SDL_ENDIAN32MASKS SDL_32BYTE1,SDL_32BYTE2,SDL_32BYTE3,SDL_32BYTE4 #endif //A surface where it is possible to freely use the FixedRGBA struct as a pixel. SDL_Surface * CreateFixedRGBASurface(Uint32 flags, int width, int height); Uint32 SDL_MapRGB(SDL_PixelFormat *fmt, SDL_Color&S); SDL_Surface * RecolorPartOfSurface(SDL_Surface *src, Sint16 sx, Sint16 sy, Uint16 sw, Uint16 sh, Uint8 newR, Uint8 newG, Uint8 newB, Uint8 newA); SDL_Surface * RecolorPartOfSurface(SDL_Surface *src, SDL_Rect *srcrect, Uint8 newR, Uint8 newG, Uint8 newB, Uint8 newA); SDL_Surface * RecolorPartOfSurface(SDL_Surface *src, SDL_Rect *srcrect, Uint8 newR, Uint8 newG, Uint8 newB, Uint8 newA); int SDL_BlitSurface(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, SDL_Rect *dstrect, Uint8 newR, Uint8 newG, Uint8 newB, Uint8 newA); int SDL_BlitSurface(SDL_Surface *src, Sint16 sx, Sint16 sy, Uint16 sw, Uint16 sh, SDL_Surface *dst, Sint16 dx, Sint16 dy, Uint8 newR, Uint8 newG, Uint8 newB, Uint8 newA); int SDL_BlitSurface(SDL_Surface *src, Sint16 sx, Sint16 sy, Uint16 sw, Uint16 sh, SDL_Surface *dst, Sint16 dx, Sint16 dy); int SDL_FillRect(SDL_Surface *dst, Sint16 x, Sint16 y, Uint16 w, Uint16 h, Uint32 color); #ifndef DEF_DAVINCI #define DEF_DAVINCI 1 struct LuminositySprites { SDL_Surface* sprites; SDL_Surface* luminosity; }; class Drawer { private: SDL_Surface* src; SDL_Surface* src_lights; Uint8 R; Uint8 G; Uint8 B; Uint8 A; SDL_Rect sr; bool recolor; public: Drawer(SDL_Surface*SourceTexture, SDL_Rect* rect); Drawer(SDL_Surface*SourceTexture, Sint16 x, Sint16 y, Uint16 w, Uint16 h); Drawer(LuminositySprites & Source, SDL_Rect* rect); Drawer(LuminositySprites & Source, Sint16 x, Sint16 y, Uint16 w, Uint16 h); void ChangeRect(Sint16 x, Sint16 y, Uint16 w, Uint16 h); void ChangeRect(SDL_Rect* nw); void SetColors(Uint8 nR, Uint8 nG, Uint8 nB, Uint8 nA=255); void SetColors(SDL_Color* C,Uint8 alpha=255); void SetColors(SDL_Color& C,Uint8 alpha=255); int Draw(SDL_Surface* target, Sint16 x, Sint16 y); }; #endif #ifndef DEF_RECOLORCACHE #define DEF_RECOLORCACHE 1 struct recolorcache_entry { Uint8 r,g,b,a; SDL_Surface* cached; recolorcache_entry* next; }; class RecolorCache //we only need to cache for one texture, so it is a static member class , { private: static SDL_Surface* cacheseed; static recolorcache_entry* first; static recolorcache_entry* entry(Uint8 r,Uint8 g,Uint8 b, Uint8 a,bool createifmissing); public: static void init(); static void restart(SDL_Surface* scacheseed); static void clean(); static void savecolor(Uint8 r,Uint8 g,Uint8 b, Uint8 a); static void savecolor(SDL_Color *c); static SDL_Surface* loadcolor(SDL_Surface* sf,Uint8 r,Uint8 g,Uint8 b, Uint8 a); }; #endif xye-0.12.2+dfsg/src/window.cpp000066400000000000000000000413631225403634500161350ustar00rootroot00000000000000/* Xye License (it is a PNG/ZLIB license) Copyright (c) 2006 Victor Hugo Soliz Kuncar This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. 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 appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. */ #include "xyedit.h" #include "xye.h" #include #include "xye_script.h" #include "options.h" #include /* **************************** Window class! ****************/ window* window::CurrentInstance=NULL; bool window::SDLactive=false; window::window() {}; void onExitAttemptDoNothing() {}; void onKeyEventDoNothing(SDLKey keysim, Uint16 unicode) {}; void beforeDrawDoNothing() {} bool window::InitSDL() { if(window::SDLactive) { fprintf(stderr,"Unable to init SDL because it has already been initialized\n"); return false; } if (SDL_Init(SDL_INIT_TIMER)==-1) { fprintf(stderr, "Unable to init SDL: %s\n", SDL_GetError()); return false; } #ifndef NOTRUETYPE TTF_Init(); #endif SDL_QuitSubSystem(SDL_INIT_VIDEO); window::SDLactive=true; return true; } void window::QuitSDL() { if(!window::SDLactive) return; window::SDLactive=false; #ifndef NOTRUETYPE TTF_Quit(); #endif SDL_Quit(); } void window::Close() { if( onExitAttempt != NULL ) onExitAttempt(); } void window::endSub() { if(sub==0) { fprintf(stderr,"Warning: attempt to close sub window when none is open\n"); } else { deleteControls(); sub--; controln=subcontroln[sub]; for (int i=0;iinit(width,height,caption); return CurrentInstance; } void window::reset() { beforeDraw=NULL; deleteControls(); while (sub>0) { endSub(); } } window::~window() { CurrentInstance=NULL; reset(); SDL_QuitSubSystem(SDL_INIT_VIDEO); } SDL_Surface* window::getDrawingSurface() { return surface; } void window::draw() { if(beforeDraw!=NULL) { beforeDraw(); } drawControls(); SDL_Flip(surface); } void window::Error(const char* msg) { fprintf(stderr,"%s", msg); fprintf(stderr,"\n"); throw (msg); } Uint32 window::timer(Uint32 interval, void *param) { if (!CurrentInstance->TriggeredLoop) { SDL_Event event; SDL_UserEvent userevent; userevent.type = SDL_USEREVENT; userevent.code = 0; //game loop userevent.data1 = NULL; userevent.data2 = NULL; event.type = SDL_USEREVENT; event.user = userevent; CurrentInstance->TriggeredLoop=true; SDL_PushEvent(&event); } return(interval); } void window::stop() { halt=true; } void window::SetTransition( voidFunction tra ) { transition = tra; } void window::loop(double fps) { bool &done=halt; bool browse=false; Uint32 per=(Uint32)((1.0 / fps)*1000); //calculates period of time based on FPS; SDL_Event event; Uint8 st; TriggeredLoop=InActive=false; SDL_TimerID tim = SDL_AddTimer( per, window::timer,0); while (!done) { int t=0; // message processing loop while (SDL_PollEvent(&event) && (!done)) { // check for messages switch (event.type) { // exit if the window is closed case SDL_QUIT: onExitAttempt(); break; // check for keypresses case (SDL_KEYDOWN): //Key IS Down! onKeyDown(event.key.keysym.sym,event.key.keysym.unicode ); break; case (SDL_KEYUP): //Key IS Down! onKeyUp(event.key.keysym.sym,event.key.keysym.unicode); break; case (SDL_MOUSEBUTTONDOWN): switch(event.button.button) { case SDL_BUTTON_LEFT: mouse_x=event.button.x;mouse_y=event.button.y; window::handleMouseDown(mouse_x,mouse_y); mouse_pressed=true; break; case SDL_BUTTON_WHEELUP: case SDL_BUTTON_WHEELDOWN: window::handleMouseWheel(mouse_x, mouse_y, event.button.button, true); } break; case (SDL_MOUSEBUTTONUP): switch(event.button.button) { case SDL_BUTTON_LEFT: window::handleMouseUp(mouse_x,mouse_y); break; case SDL_BUTTON_RIGHT: window::handleMouseRightUp(mouse_x,mouse_y); break; case SDL_BUTTON_WHEELUP: case SDL_BUTTON_WHEELDOWN: window::handleMouseWheel(mouse_x, mouse_y, event.button.button, false); } break; case(SDL_MOUSEMOTION) : mouse_x=event.motion.x;mouse_y=event.motion.y; window::handleMouseMove(mouse_x,mouse_y); break; case (SDL_USEREVENT): //the only user event is the normal loop: if(transition==NULL) { st=SDL_GetAppState(); if ( st & (SDL_APPMOUSEFOCUS | SDL_APPINPUTFOCUS) ) { loopControls(); draw(); } } TriggeredLoop=false; //if ( break; } // end switch } if(transition!=NULL) { reset(); transition(this); transition = NULL; } if (!done) SDL_Delay((InActive?1000:10)); //if (!done) SDL_Delay(1); } //assert(save()); SDL_RemoveTimer(tim); return; } void window::deleteControls() { for (int i=0;ionMouseOut(); mouse_pressed = false; } delete controls[i]; } curcontrol = -1; controln=0; } void window::addControl(control *c) { if(curcontrol!=-1) { controls[curcontrol]->onMouseOut(); mouse_pressed = false; curcontrol=-1; } if(controln==MAXCONTROLS) { window::Error("Too many GUI controls!!"); } int i=0; while((idepth) < (c->depth) )) { i++; } int k=controln; while (k>i) { controls[k]=controls[k-1]; k--; } controls[i]=c; controln++; } void window::handleMouseMove(int x, int y) { if (mouse_pressed) { //do not exit. if ( curcontrol != -1 ) { control * c = controls[curcontrol]; c->onMouseMove(x - c->x, y - c->y); return ; } else { mouse_pressed = false; } } for (int i=controln-1;i>=0;i--) { control* c=controls[i]; if (( x>= c->x) && ( x<= c->x+c->w) && ( y>= c->y) && ( y<= c->y + c->h) ) { if((i!=curcontrol) && (curcontrol!=-1)) { controls[curcontrol]->onMouseOut(); } curcontrol=i; c->onMouseMove(x-c->x,y-c->y); return; } } if (curcontrol!=-1) controls[curcontrol]->onMouseOut(); } void window::handleMouseWheel(int x, int y, Uint8 wheel, bool down) { for (int i=controln-1; i>=0; i--) { control* c=controls[i]; if (( x>= c->x) && ( x<= c->x+c->w) && ( y>= c->y) && ( y<= c->y+c->h) ) { c->onMouseWheel(x - c->x, y - c->y, wheel, down); return; } } } void window::handleMouseDown(int x, int y) { for (int i=controln-1;i>=0;i--) { control* c=controls[i]; if (( x>= c->x) && ( x<= c->x+c->w) && ( y>= c->y) && ( y<= c->y+c->h) ) { c->onMouseDown(x-c->x,y-c->y); return; } } } void window::handleMouseUp(int x, int y) { if (mouse_pressed) { mouse_pressed = false; if ( curcontrol != -1 ) { control * c = controls[curcontrol]; c->onMouseUp(x - c->x, y - c->y); } } handleMouseMove(x,y); } void window::handleMouseRightUp(int x, int y) { for (int i=controln-1; i>=0; i--) { control* c=controls[i]; if (( x>= c->x) && ( x<= c->x+c->w) && ( y>= c->y) && ( y<= c->y+c->h) ) { c->onMouseRightUp(x-c->x,y-c->y); return; } } } void window::drawControls() { for (int j=0; jdraw(surface); } } for (int i=0;idraw(surface); } } void window::loopControls() { for (int i=0;iloop(); } } /*** The rectangle control!! **/ rectangle::rectangle(int sx, int sy, int sw, int sh, Uint8 red, Uint8 green, Uint8 blue) { x=sx;y=sy;w=sw;h=sh; r=red; g=green; b=blue; depth=0; } rectangle::rectangle(int sx, int sy, int sw, int sh, const SDL_Color & c) { x=sx;y=sy;w=sw;h=sh; r=c.r; g=c.g; b=c.b; depth=0; } void rectangle::draw(SDL_Surface* target) { SDL_FillRect(target, x,y,w,h, SDL_MapRGB(target->format,r,g,b ) ); } /*** The textblock control!! **/ textblock::textblock(int sx, int sy, int sw, int sh, Font* fontToUse) { x=sx;y=sy;w=sw;h=sh; FontRes=fontToUse; depth=0; text ="textblock"; } void textblock::draw(SDL_Surface* target) { FontRes->WriteWrap(target,x,y,w,h,text.c_str() ); } /*** The button control **/ Font* button:: FontResource=NULL; SDL_Surface* button::SourceSurface; Uint8 button::Size=20; Uint8 button::PressedTextureY=18; //18 Uint8 button::NormalTextureY=17; //17 Uint8 button::ShortTextureX=6; Uint8 button::LongTextureX=7; SDL_Color button::ToolTipColor; button::button(int sx, int sy, int sw, int sh) { Visible=Enabled=true; data=NULL; x=sx;y=sy;w=sw;h=sh; depth=0; text="Button"; onClick=onPress=onRelease=NULL; click=false; flashperiod=0; iconx = icony = -1; ToggleButton = false; mouseInside = 0; toolTipControl = NULL; } void button::Icon(int ix, int iy) { text = ""; iconx=ix, icony=iy; } void button::resetToggle() { click = false; } void button::draw(SDL_Surface* target) { const Uint8 disablealpha = 128;//64; if(!Visible) return; bool pressed = (click || !Enabled); int sz=button::Size; int x=this->x; int y=this->y; if(flashperiod) { switch(flashperiod&3) { case 0: x--;y++; break; case 2: x++;y--; break; } flashperiod--; } if(w>sz) { int ty=NormalTextureY; int tx=LongTextureX; if(pressed) { ty=PressedTextureY; } Drawer A(button::SourceSurface,tx*sz,ty*sz, std::max(std::min(w-sz ,sz),0) ,sz); if(! Enabled) { A.SetColors(255,255,255,disablealpha); } A.Draw(target,x,y); for (int i=x+sz;iWrite(target,o+x+(w-button::FontResource->TextWidth(text.c_str()))/2 ,o+y+(sz-button::FontResource->Height())/2,text.c_str()); if(mouseInside > 0) { mouseInside ++; } if( (mouseInside>=20) && (toolTipControl!=NULL) && (toolTip != "") ) { toolTipControl->enabled = true; toolTipControl->x = toolx + x; toolTipControl->y = tooly + y; toolTipControl->text = toolTip; } } if ( (iconx!=-1) ) { Drawer I(button::SourceSurface, iconx*sz, icony*sz, sz,sz); if(! Enabled) I.SetColors(0,0,0,64); I.Draw(target,x+o +(w-sz)/2,y+o); } } void button::onMouseMove(int px,int py) { if(! mouseInside) { mouseInside = 1; toolx = px, tooly = py; } } void button::onMouseOut() { mouseInside = 0; if( click && ! ToggleButton) { if(onRelease!=NULL) onRelease(data); click=false; } } void button::onMouseDown(int px,int py) { if( ToggleButton && click) { if(onRelease!=NULL) onRelease(data); click = false; } else { if( (!Visible) || (!Enabled) ) return; if (onPress!=NULL) onPress(data); click=true; } } void button::onMouseUp(int px,int py) { if(ToggleButton) { return; } if(onRelease!=NULL) { onRelease(data); } if ( px >= 0 && py >= 0 && px <= w && py <= h) { if( /*(onClick!=NULL)*/ onClick && click && Visible) { onClick(data); } } click = false; } void button::flash() { flashperiod=4; } button::~button() { if(data!=NULL) { delete data; } } Sint16 button::recommendedWidth(const char* s) { Sint16 w=FontResource->TextWidth(s) + Size; if(wHeight()+4; int tw = button::FontResource->TextWidth(text)+4; x = std::min(x, maxx - tw); x = std::max(x, minx); y = std::min(y, maxy - th); y = std::max(y, miny); SDL_FillRect(target, x,y,tw,th, SDL_MapRGB(target->format,0,0,0 ) ); SDL_FillRect(target, x+1,y+1,tw-2,th-2, SDL_MapRGB(target->format, button::ToolTipColor ) ); button::FontResource->Write(target,x+3,y+3,text.c_str()); enabled = false; if(drawnSwitch != NULL) { *drawnSwitch = true; } } } xye-0.12.2+dfsg/src/window.h000066400000000000000000000145161225403634500156020ustar00rootroot00000000000000/* Xye License (it is a PNG/ZLIB license) Copyright (c) 2006 Victor Hugo Soliz Kuncar This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. 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 appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. */ #ifndef WINDOWINCLUDED #include "vxsdl.h" #ifndef FONTINCLUDED #include "font.h" #endif #include #define WINDOWINCLUDED using namespace std; class control { public: int x; int y; int w; int h; int depth; virtual void onMouseMove(int x,int y)=0; virtual void onMouseOut()=0; virtual void onMouseDown(int x,int y)=0; virtual void onMouseUp(int x,int y)=0; virtual void onMouseRightUp(int x,int y)=0; virtual void draw(SDL_Surface* target)=0; virtual void loop()=0; virtual void onMouseWheel(int x, int y, Uint8 wheel, bool down) {}; virtual ~control() {} }; #define MAXCONTROLS 100 #define MAXSUBS 5 typedef void (*keysimFunction)(SDLKey keysim, Uint16 unicode); class window; typedef void (*voidFunction)(window* wind); class window { private: static window * CurrentInstance; static bool SDLactive; SDL_Surface* surface; control* controls [MAXCONTROLS]; int controln; int sub; control* subcontrols[MAXSUBS][MAXCONTROLS]; int subcontroln[MAXSUBS]; keysimFunction subOnKeyDown[MAXSUBS]; keysimFunction subOnKeyUp[MAXSUBS]; int curcontrol; void loop(); bool mouse_pressed; unsigned int mouse_x; unsigned int mouse_y; bool TriggeredLoop,InActive; static Uint32 timer(Uint32 interval, void *param); void draw(); void handleMouseMove(int x, int y); void handleMouseDown(int x, int y); void handleMouseUp(int x, int y); void handleMouseRightUp(int x, int y); void drawControls(); void loopControls(); void handleMouseWheel(int x, int y, Uint8 wheel, bool down); bool halt; window(); void init(int width,int height, const char* caption); voidFunction transition; void reset(); public: static window* create(int width , int height,const char* caption); void Resize(int width, int height); void SetCaption(const char* caption); void SetCaption(const string caption); ~window(); SDL_Surface* getDrawingSurface(); int Width; int Height; void Error(const char* msg); void (*onExitAttempt)(); keysimFunction onKeyDown; keysimFunction onKeyUp; void (*beforeDraw)(); void beginSub(); void endSub(); void stop(); void deleteControls(); void addControl(control *c); void loop(double fps); static bool InitSDL(); static void QuitSDL(); void Close(); void SetTransition( voidFunction tra); }; class rectangle: public control { public: Uint8 r,g,b; rectangle(int sx, int sy, int sw, int sh, Uint8 red, Uint8 green, Uint8 blue); rectangle(int sx, int sy, int sw, int sh, const SDL_Color & c); void draw(SDL_Surface* target); void loop() {} inline void onMouseMove(int px,int py){} inline void onMouseOut() {} inline void onMouseDown(int px,int py) {} inline void onMouseUp(int px,int py) {} inline void onMouseRightUp(int px,int py) {} }; class textblock: public control { public: Font* FontRes; string text; textblock(int sx, int sy, int sw, int sh, Font* fontToUse); void draw(SDL_Surface* target); void loop() {} inline void onMouseMove(int px,int py){} inline void onMouseOut() {} inline void onMouseDown(int px,int py) {} inline void onMouseUp(int px,int py) {} inline void onMouseRightUp(int px,int py) {} }; class buttondata { public: virtual ~buttondata() {}; }; class buttontooltip : public control { public: buttontooltip(); int maxx, maxy, minx, miny; int tx; int ty; string text; bool enabled; void draw(SDL_Surface* target); void onMouseMove(int x,int y) {}; void onMouseOut() {}; void onMouseDown(int x,int y) {}; void onMouseUp(int x,int y) {}; void onMouseRightUp(int x,int y) {}; void loop() {}; bool * drawnSwitch; }; class button : public control { private: int flashperiod; int iconx, icony; int toolx, tooly; int mouseInside; public: buttondata* data; string text; bool click; bool Visible; bool Enabled; bool ToggleButton; button(int sx, int sy, int sw, int sh); ~button(); void draw(SDL_Surface* target); void loop() {} void (*onModeEnd) (); void Icon(int ix, int iy); void (*onClick)(const buttondata* data); void (*onPress)(const buttondata* data); void (*onRelease)(const buttondata* data); void onMouseMove(int px,int py); void onMouseOut(); void onMouseDown(int px,int py); void onMouseUp(int px,int py); void resetToggle(); inline void onMouseRightUp(int px,int py) {} void flash(); static Font* FontResource; static Uint8 Size; static SDL_Surface* SourceSurface; static Uint8 PressedTextureY; static Uint8 NormalTextureY; static Uint8 ShortTextureX; static Uint8 LongTextureX; static Sint16 recommendedWidth(const char* s); static Sint16 recommendedWidth(const string s) { return recommendedWidth(s.c_str()); } static SDL_Color ToolTipColor; string toolTip; buttontooltip* toolTipControl; }; #endif xye-0.12.2+dfsg/src/xsb_level.cpp000066400000000000000000000615271225403634500166150ustar00rootroot00000000000000/* Xye License (it is a PNG/ZLIB license) Copyright (c) 2006 Victor Hugo Soliz Kuncar This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. 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 appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. */ #include "xye.h" #include "gen.h" #include #include #include #include #include "xye_script.h" #include "xsb_level.h" /** Class XsbLevelPack start **/ class XsbLevel { public: char data[XYE_HORZ][XYE_VERT]; char w; char h; string name; XsbLevel* Prev; XsbLevel* Next; XsbLevel() { Prev=Next=NULL; levelnum=1; } void SetGameCaption(); void Load(); unsigned int levelnum; static int gm; static int tx; static int ty; static blockcolor bc; }; vector fileLine; int fileLineN = 0; void addLine(const string s) { if(fileLineN == fileLine.size()) { fileLine.push_back(s); fileLineN++; } else { fileLine[fileLineN++] = s; } } void loadFileToLines(std::ifstream & fl) { fileLineN = 0; string line; char ch; bool ignoren = false; while (! fl.eof() ) { fl.read(&ch,1); if (ch == '\n' && ignoren) { ignoren = false; continue; } bool br = false; if (ch == '\r') { ignoren = true; br = true; } else if (ch == '\n') { br = true; } else { line += ch; } if (br) { addLine(line); line = ""; } } if (line !="") { addLine(line); } } XsbLevel* XsbLevelPack::First=NULL; XsbLevel* XsbLevelPack::Final=NULL; XsbLevel* XsbLevelPack::CurrentLevel; unsigned int XsbLevelPack::tn; /* @ - sokoban + - sokoban on target # - wall $ - box . - target * - box on target */ bool IsValidXsbLine(std::string &s) { int L=s.length(),i; if (! L) return false; char c; for (i=0;i=1) && (s[L-1]==' ') ) { L--; } return L; } bool IsSLC(const char* path) { int L= strlen(path); return ((L>=4) && (strcmp(path+L-4,".slc") ==0 )); } int SLC_CountValidLevels(TiXmlElement* levels) { int n=0; TiXmlElement* el = levels->FirstChildElement("Level"); while (el != NULL) { int w = -1, h = -1; el->QueryIntAttribute("Width", &w); el->QueryIntAttribute("Height", &h); if( h > w) std::swap(w,h); if ( (w>=1) && (w<=XYE_HORZ) && (h<=XYE_VERT) && (h>=1) ) n++; el=el->NextSiblingElement("Level"); } return n; } string GetSokobanLevelName(const char* filename, int ln) { string name = GetFileNameNoExtension(filename); int len = name.length(); char buf[len+10]; sprintf(buf, "%s %d", name.c_str(), ln); return string(buf); } void XsbLevelPack::LoadSLC(const char* filename, unsigned int ln) { TiXmlDocument fil(filename); TiXmlElement* pack, *el; tn=0; fil.SetCondenseWhiteSpace(false); if (fil.LoadFile()) { pack=fil.FirstChildElement("SokobanLevels"); if (pack!=NULL) { el=pack->FirstChildElement("LevelCollection"); if(el == NULL) {LevelPack::Error("Unable to find a tag.");return;} tn = SLC_CountValidLevels(el); int temlevel =0 ; for ( el= el->FirstChildElement("Level"); el != NULL; el = el->NextSiblingElement("Level") ) { int w = -1, h = -1; el->QueryIntAttribute("Width", &w); el->QueryIntAttribute("Height", &h); bool swapped = (h>XYE_VERT); int L= w; if(swapped) { L = h; std::swap(w,h); } if((w<0) || (h<0) || (w>XYE_HORZ) || (h>XYE_VERT) ) continue; XsbLevel* cur; if( First == NULL ) { cur = First = Final = new XsbLevel(); First->Next = First->Prev = NULL; } else { cur = new XsbLevel(); Final->Next = cur; cur->Prev = Final; Final = cur; } cur->w = w, cur->h = h; TiXmlElement* line; int linenum = 0; for(int i=0; idata[i][j]='#'; cur->name = el->Attribute("Id"); if(cur->name=="") cur->name = GetSokobanLevelName( filename, temlevel+1); for (line = el->FirstChildElement("L"); line != NULL; line = line->NextSiblingElement("L") ) { const char* gt =line->GetText(); string row = ( (gt!=NULL) ? gt : ""); for(int i=0; idata[linenum][i]= row[i]; else cur->data[i][linenum]= row[i]; linenum ++; } cur->levelnum = temlevel+1; temlevel++; } } else return LevelPack::Error("Unable to load Sokoban XML file"); } else return LevelPack::Error("Unable to load Sokoban XML file"); LevelPack::n = tn; LoadNthLevel(ln); } const char* XsbLevelPack::ReadDataSLC(const char* path,unsigned int &n, string&author, string &description, string&title) { TiXmlDocument fil(path); TiXmlElement* pack, *el; author = ""; description = "Sokoban levels in SLC format"; string email, url; n=0; if (fil.LoadFile()) { pack=fil.FirstChildElement("SokobanLevels"); if (pack!=NULL) { el= pack->FirstChildElement("Description"); if( (el != NULL) && (el->GetText()!=NULL) ) description = el->GetText(); el= pack->FirstChildElement("Title"); if( (el != NULL) && (el->GetText()!=NULL) ) title = el->GetText(); el= pack->FirstChildElement("Email"); if( (el != NULL) && (el->GetText()!=NULL) ) email = el->GetText(); el= pack->FirstChildElement("Url"); if( (el != NULL) && (el->GetText()!=NULL) ) url = el->GetText(); el=pack->FirstChildElement("LevelCollection"); if(el == NULL) return "Unable to find a tag."; n = SLC_CountValidLevels(el); author = el->Attribute("Copyright"); } else return "Not a sokoban XML file"; } else return "Not a sokoban XML file"; if(email!="") author+=" <"+email+">"; if(url!="") description+="\n\n"+url; return NULL; } const char* XsbLevelPack::ReadData(const char* path,unsigned int &n, string&author, string &description, string & title) { if( IsSLC(path)) { return ReadDataSLC(path, n, author, description, title); } { //Hardcode the description for microban. string spath = path; int len = spath.size(); if ( len >= 19 && spath.substr(len-19)=="levels/microban.xsb" ) { n = 155; author ="David W Skinner"; description = "Microban (155 puzzles, revised April, 2000) This is a good set for" " beginners and children. Most of the puzzles are small and illustrate a" " particular concept. More experienced players should also find them" " interesting, since they are as different from each other as I could" " make them given their size. Sokoholics could perhaps time themselves" " on completing the whole set. This set also contains puzzles which I" " thought were interesting but too easy to include in my regular sets.\n\n" "http://users.bentonrea.com/~sasquatch/sokoban/"; title = "Microban"; return NULL; } } n=0; std::ifstream fl ; fl.open(path,std::ios::in | std::ios::binary); if (! fl.is_open()) { return ("Unable to open file"); } if (fl.eof()) { fl.close(); return ("The file is empty"); } loadFileToLines(fl); std::string line; unsigned int L; unsigned char cw,ch,aux; int lpos = 0; while (lpos < fileLineN) { do { line = fileLine[lpos++]; } while (! IsValidXsbLine(line) && (lpos < fileLineN) ); if (lpos >= fileLineN) break; cw=0; ch=0; while (IsValidXsbLine(line)) { L=RealSokoLineLength(line); ch++; cw=(L>cw)?L:cw; if (lpos < fileLineN) { line = fileLine[lpos++]; } else { break; } } if (cw=1) && (ch>=1) && (ch<=XYE_VERT)) { n++; } } fl.close(); if (n==0) { return "Could not find compatible xsb levels."; } author = ""; description = "This file contains Sokoban levels in standard (text) format."; return NULL; } void XsbLevelPack::Init() { First=Final=NULL; } void XsbLevelPack::Clean() { XsbLevel* q; while (First) { q=First; First=First->Next; delete q; } First=Final=NULL; } void XsbLevelPack::Load(const char* filename, unsigned int ln) { Clean(); if( IsSLC(filename)) { return LoadSLC(filename, ln); } std::string line; std::ifstream fl ; fl.open(filename,std::ios::in | std::ios::binary); if (! fl.is_open()) return LevelPack::Error("Unable to load level file (.Xsb) (stream error)"); if (fl.eof()) return LevelPack::Error("Level File is empty"); loadFileToLines(fl); std::string buf; unsigned char ch,cw,i,j; unsigned int k,L; bool foundsokoban=false; char c; tn=0; XsbLevel* current; int lpos = 0; while (lpos < fileLineN) { //Non-necessary things: do { line = fileLine[lpos++]; } while ( (! IsValidXsbLine(line)) && (lpos < fileLineN) ); if (lpos >= fileLineN) break; buf=""; ch=0; cw=0; while (IsValidXsbLine(line)) { ch++; L=RealSokoLineLength(line); cw=(L= fileLineN) { line=""; break; } else { line = fileLine[lpos++]; } } if (((cw>XYE_HORZ) && (ch>cw)) || ((ch>XYE_VERT) && (cw>ch)) || (ch>XYE_HORZ) || (cw>XYE_VERT) || (ch==0) || (cw==0)) continue; //doh current=new XsbLevel(); tn++; for (i=0;i<30;i++) for (j=0;j<20;j++) current->data[i][j]=' '; i=0;j=0; L=buf.length(); foundsokoban=false; for (k=0;kch) current->data[i][j]=c; else current->data[j][i]=c; i++; } } if (!foundsokoban) //not a valid level, skip. { tn--; delete current; continue; } if (cw>ch) { current->w=cw; current->h=ch; } else { current->w=ch; current->h=cw; } current->name= GetSokobanLevelName(filename,tn); current->levelnum=tn; //our current level is done, add it if (First==NULL) First=Final=current; else { current->Prev=Final; Final->Next=current; Final=current; } //now the line contains a non-valid line } if (! First) return LevelPack::Error("No compatible levels found (XSB file)"); LevelPack::n=tn; fl.close(); //The result is supposed to be a double linked list with all the levels in sequence or a fiasco. //There is always a chance a normal text document could be loaded. //It should now be *easy* to load a Xsb level LoadNthLevel(ln); } void XsbLevelPack::LoadNthLevel(unsigned int n) { LevelPack::OpenFileLn=n; //This is just double linked list iteration. if (n==1) (CurrentLevel=First)->Load(); else { XsbLevel* tm=First; while (n>1) if (tm=tm->Next) n--; else n=0; if (! tm) { (CurrentLevel=First)->Load(); LevelPack::OpenFileLn=1; } else (CurrentLevel=tm)->Load(); } } void XsbLevelPack::Restart() { CurrentLevel->Load(); } void XsbLevelPack::Next() { LevelPack::OpenFileLn++; XsbLevel* k=CurrentLevel->Next; if (! k) { (CurrentLevel=First)->Load(); LevelPack::OpenFileLn=1; } else (CurrentLevel=k)->Load(); } void XsbLevelPack::Last() { LevelPack::OpenFileLn--; XsbLevel* k=CurrentLevel->Prev; if (! k) { (CurrentLevel=Final)->Load(); LevelPack::OpenFileLn=tn; } else (CurrentLevel=k)->Load(); } bool XsbLevelPack::HasNext() { return (CurrentLevel->Next); } bool XsbLevelPack::HasLast() { return (CurrentLevel->Prev); } /** Class XsbLevelPack end **/ void LoadXsbWall(unsigned char i, unsigned char j,bool dark=false) { wall* wl=new wall(game::Square(i,j)); if (dark) wl->ChangeColor(0,0,0); } void LoadXsbMarked(unsigned char x,unsigned char y,blockcolor bc) { marked* g=new marked(game::Square(x,y),bc); } void LoadXsbBlock(unsigned char x, unsigned char y,blockcolor bc) { block* b=new block(game::Square(x,y),bc,false); } bool MarkedPresentAt(unsigned char x, unsigned char y) { gobj* gobject=game::Square(x,y)->gobject; if (!gobject) return false; return (gobject->GetType()==OT_MARKEDAREA); } bool BlockedEntrance(unsigned char x, unsigned char y) { if (game::Square(x,y)->gobject) return true; obj* object; if (object=game::Square(x,y)->object ) return (object->GetType()==OT_WALL); return false; } bool WhiteSpace(unsigned char x,unsigned char y) { square* sq=game::Square(x,y); if (sq->gobject) return false; obj* object; if (object=sq->object) { return object->GetType()!=OT_WALL; } return true; } bool EnsurePath(unsigned char x,unsigned char y,int*mem,bool nowall,blockcolor bc,bool &bywall) { bywall=false; if ((x>=XYE_HORZ) || (y>=XYE_VERT)) return false; //explosion* ex=new explosion(game::Square(x,y)); int tx=XsbLevel::tx; int ty=XsbLevel::ty; if ((x==tx) && (y==ty)) return 1; int memv=mem[y*XYE_HORZ+x]; if (memv<2) return memv; if (memv>1000) //for safety, this should never happen though { return false; } mem[y*XYE_HORZ+x]=false; square* sq=game::Square(x,y); if (MarkedPresentAt(x,y)) return (false); obj* object; bool wallrep=false; if (object=sq->object) { if (object->GetType()==OT_WALL) { if (nowall) { mem[y*XYE_HORZ+x]=memv+1; bywall=true; return false; } wallrep=true; object->Kill(); blockdoor* g=new blockdoor(sq,false,true,bc); } } /*if (EnsurePath(x+1,y,mem,true,bc)) return (mem[y*XYE_HORZ+x]=1); if (EnsurePath(x,y+1,mem,true,bc)) return (mem[y*XYE_HORZ+x]=1); if (EnsurePath(x-1,y,mem,true,bc)) return (mem[y*XYE_HORZ+x]=1); if (EnsurePath(x,y-1,mem,true,bc)) return (mem[y*XYE_HORZ+x]=1); if (EnsurePath(x+1,y,mem,false,bc)) return (mem[y*XYE_HORZ+x]=1); if (EnsurePath(x,y+1,mem,false,bc)) return (mem[y*XYE_HORZ+x]=1); if (EnsurePath(x-1,y,mem,false,bc)) return (mem[y*XYE_HORZ+x]=1); if (EnsurePath(x,y-1,mem,false,bc)) return (mem[y*XYE_HORZ+x]=1);*/ int tx2,ty2,tx3,ty3,tx4,ty4,dx,dy; dx=tx-x; dy=ty-y; dx=(dx<0)?-dx:dx; dy=(dy<0)?-dy:dy; if (dxx)?x+1:x-1; ty2=y; tx3=(tx>x)?x-1:x+1; ty3=y; tx4=x; ty4=(ty>y)?y-1:y+1; tx=x; ty=(ty>y)?y+1:y-1; } else { tx2=x; ty2=(ty>y)?y+1:y-1; tx3=x; ty3=(ty>y)?y-1:y+1; ty4=y; tx4=(tx>x)?x-1:x+1; ty=y; tx=(tx>x)?x+1:x-1; } bool wallcheck; if (EnsurePath(tx,ty,mem,true,bc,bywall)) return (mem[y*XYE_HORZ+x]=1); wallcheck=bywall; if (EnsurePath(tx2,ty2,mem,true,bc,bywall)) return (mem[y*XYE_HORZ+x]=1); wallcheck=wallcheck || bywall; if (EnsurePath(tx3,ty3,mem,true,bc,bywall)) return (mem[y*XYE_HORZ+x]=1); wallcheck=wallcheck || bywall; if (EnsurePath(tx4,ty4,mem,true,bc,bywall)) return (mem[y*XYE_HORZ+x]=1); wallcheck=wallcheck || bywall; bywall=wallcheck; if (!nowall) { if (EnsurePath(tx,ty,mem,false,bc,bywall)) return (mem[y*XYE_HORZ+x]=1); if (EnsurePath(tx2,ty2,mem,false,bc,bywall)) return (mem[y*XYE_HORZ+x]=1); if (EnsurePath(tx3,ty3,mem,false,bc,bywall)) return (mem[y*XYE_HORZ+x]=1); if (EnsurePath(tx4,ty4,mem,false,bc,bywall)) return (mem[y*XYE_HORZ+x]=1); } else if (wallcheck) mem[y*XYE_HORZ+x]=memv+1; //else // printf("??"); /*if (EnsurePath(tx4,ty4,mem,false,bc)) return (mem[y*XYE_HORZ+x]=1);*/ if (wallrep) { wall* wl=new wall(game::Square(x,y),0); } return false; } bool FromXyeDFS(int* mem, unsigned char x, unsigned char y) { static const unsigned char dx[4] = {0,0,-1,1}, dy[4] = {-1,1,0,0}; int &res = mem[y*XYE_HORZ+x]; if( res==0) { res = 1; for (int t=0; t<4; t++) { unsigned char nx = x+dx[t], ny=y+dy[t]; if ( (nxobject == NULL) || ( game::Square(x,y)->object->GetType() == OT_BLOCK)) ) { FromXyeDFS(mem,nx,ny); } } } return ( (res==2) ? true: false); } bool FindAGoodWall(int i, int j,bool rec=true) { if ((i==0) || (j==0) || (i>=XYE_HORZ) || (j>=XYE_VERT)) return false; square* sq=game::SquareN(i,j); obj* object; if (object=sq->object) { if (object->GetType()==OT_WALL) { object->Kill(); XsbLevel::tx=(i<0)?XYE_HORZ-1:(i>=XYE_HORZ)?0:i; XsbLevel::ty=(j<0)?XYE_VERT-1:(j>=XYE_VERT)?0:j; blockdoor *bd= new blockdoor(sq,false,true,XsbLevel::bc); gem* gm=new gem(sq,XsbLevel::bc); return true; } } if (rec) { if (FindAGoodWall(i,j+1,false)) return true; if (FindAGoodWall(i+1,j,false)) return true; if (FindAGoodWall(i,j-1,false)) return true; if (FindAGoodWall(i-1,j,false)) return true; if (FindAGoodWall(i,j+1)) return true; if (FindAGoodWall(i+1,j)) return true; if (FindAGoodWall(i,j-1)) return true; if (FindAGoodWall(i-1,j)) return true; } XsbLevel::tx=0; XsbLevel::ty=0; return false; } /** Class XsbLevel start **/ int XsbLevel::tx; int XsbLevel::ty; blockcolor XsbLevel::bc; void XsbLevel::SetGameCaption() { int L=name.length(); string title = "Xye - "+name; LevelPack::CurrentLevelTitle=title.c_str(); SDL_WM_SetCaption(title.c_str(),0); } void XsbLevel::Load() { SetGameCaption(); hint::SetGlobalHint("To get the gem, place a block above each of the marked areas."); LevelPack::SetLevelBye(""); LevelPack::Solution=""; //We have a complete 2D array full with characters, let's convert it to a level. unsigned int kx=0,ky=0,i,j; unsigned char ox=(unsigned char)((XYE_HORZ-w)/2); unsigned char oy=XYE_VERT-(unsigned char)((XYE_VERT-h)/2)-1; bc=(blockcolor)((levelnum-1)%4); /* for (i=0;iobject; if(object==NULL) { wall* wl = new wall(sq); } } delete[] mem; FindAGoodWall(kx,ky); //This is where the hard part begins, we have to make the level have gems mem=new int[XYE_HORZ*XYE_VERT]; for (j=0;jobject; } game::XYE= new xye(game::Square(kx,ky)); /* ox--; oy++; int q,r; gem* gm=new gem(game::Square(ox,oy),B_BLUE); for (q=-1;q<2;q++) for (r=-1;r<2;r++) if (q || r) { square* sq2=game::SquareN(ox+q,oy+r); blockdoor* bd=new blockdoor(sq2,false,true,bc); } */ } /** Class XsbLevel end **/ xye-0.12.2+dfsg/src/xsb_level.h000066400000000000000000000016331225403634500162520ustar00rootroot00000000000000#include class XsbLevel; class XsbLevelPack { private: XsbLevelPack() {} static XsbLevel* First; static XsbLevel* Final; static XsbLevel* CurrentLevel; static unsigned int tn; static const char* ReadDataSLC(const char* path,unsigned int &n, string&author, string &description, string & title); static void LoadSLC(const char* filename, unsigned int ln=1); public: static void Init(); static void Clean(); static void Load(const char* filename, unsigned int ln=1); static const char* ReadData(const char* path,unsigned int &n, string&author, string &description, string & title); static void LoadNthLevel(unsigned int n); static void Restart(); static void Next(); static void Last(); static bool HasNext(); static bool HasLast(); }; xye-0.12.2+dfsg/src/xye.cbp000066400000000000000000000057301225403634500154130ustar00rootroot00000000000000 xye-0.12.2+dfsg/src/xye.cpp000066400000000000000000006754651225403634500154530ustar00rootroot00000000000000/* Xye License (it is a PNG/ZLIB license) Copyright (c) 2006 Victor Hugo Soliz Kuncar This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. 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 appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. */ #include "xye.h" #include #include #include "xye_script.h" #include "options.h" #include "record.h" #include "dialogs.h" #include "xyedit.h" #include "skins.h" #include #define sz game::GRIDSIZE //typing game::GRIDSIZE is an annoyance /*******class game**********/ // // Is game really a class? or is it just a pack of global functions and variables? */ // I did not use a namespace for this and many other things because namespaces are not // friendly with headers. Edit in 2009: Are they? //======================================================================================================= //class game static variables: // //Color of Xye SDL_Color game::PlayerColor; //Restard signal bool game::GameOver=false; bool xye_fromeditortest = false; bool xye_recordingsolution = false; bool xye_playsolution = false; bool game::FinishedLevel=false; //The gridsize of the current skin, as float and as int Sint16 game::GRIDSIZE; //The path of the current skin: string game::SKIN; //All the 'squares' of the game. square game::grid[XYE_HORZ][XYE_VERT]; //Count of the unique ids unsigned int game::id_count; //Buffer of the sprites file LuminositySprites game::sprites; SDL_Surface* game::screen; //Game tic counter: unsigned int game::counter; //Using different counters instead of repetitive % operations should speed up performance. char game::counter2; char game::counter3; char game::counter4; char game::counter5; char game::counter6; char game::counter7; char game::counter8; char game::counter9; unsigned int game::beastcounter; //Last pressed key (if it is an arrow key) int game::lastKey; //mouse support: bool game::mouse_pressed; bool game::mouse_valid; unsigned int game::mouse_x,game::mouse_y; //recordings: bool game::cameraon; bool game::PlayingRecording; bool game::undo=false; int game::GameWidth; int game::GameHeight; unsigned int game::LastXyeMove; square* game::deathsq2; unsigned char game::FastForward; edir game::LastXyeDir; square* game::deathsq1; float game::NextTic; xye* game::XYE; bool game::started; unsigned char game::FlashPos; bool game::DK_PRESSED; int game::DK_PRESSED_FIRST; bool game::DK_UP_PRESSED; bool game::DK_DOWN_PRESSED; bool game::DK_LEFT_PRESSED; bool game::DK_RIGHT_PRESSED; bool game::DK_GO; edir game::DK_DIR; bool game::UpdateAll; bool game::ShiftPressed; Font* game::FontRes; Font* game::FontRes_Bold; Font* game::FontRes_White; signed int game::HintMarquee; unsigned char game::HintRead; bool game::CoordMode; window* gamewindow = NULL; gameboard* TheGameBoard = NULL; button* Button_NextLevel; button* Button_PrevLevel; button* Button_Hint; button* Button_Solution; button* Button_Undo; button* Button_RecordSolution; bool Button_ToolTipWasDrawn; recordingmode game::RecordingMode; //====================================================================== //gameboard methods: gameboard::gameboard(int sx, int sy, int sw, int sh) { x=sx;y=sy;w=sw;h=sh; depth=0; } void gameboard::loop() { game::loop(); } void gameboard::draw(SDL_Surface* target) { game::draw(x,y); } void gameboard::onMouseMove(int x,int y) { game::onMouseMove(x,y); } void gameboard::onMouseOut() { game::onMouseOut(); } void gameboard::onMouseDown(int x,int y) { game::onMouseDown(x,y); } void gameboard::onMouseUp(int x,int y) { game::onMouseUp(x,y); } gameboard::~gameboard() { TheGameBoard = NULL; } //------------------------------------------------------------------------ class gamepanel : public control { public: gamepanel( int sx, int sy, int sw, int sh) { x=sx, y=sy, w=sw, h=sh; } void loop() {} void draw(SDL_Surface* target) { game::DrawPanel(target, x,y,w,h); } void onMouseMove(int px,int py) {} void onMouseOut(){} void onMouseDown(int px,int py){} void onMouseUp(int px,int py){} void onMouseRightUp(int px,int py) {} }; //======================================================================================================= // Class game methods. // void game::InitGraphics() { xye::useDirectionSprites = options::xyeDirectionSprites; PlayerColor.r=options::Red(); PlayerColor.g=options::Green(); PlayerColor.b=options::Blue(); PlayerColor.unused=255; GRIDSIZE=options::GetGridSize(); SKIN=options::GetSpriteFile(); const char *tm=SKIN.c_str(); printf("Loading %s\n",tm); sprites.sprites=IMG_Load(tm); { sprites.luminosity = NULL; tm = options::GetLuminositySpriteFile(); if(tm!=NULL) { printf("Loading %s\n",tm); sprites.luminosity=IMG_Load(tm); } } if ( sprites.sprites == NULL) game::Error( "Invalid/Missing Sprite File"); //Init cache printf("Initializing Recolor cache...\n"); RecolorCache::restart(sprites.sprites); for (int i=0;iResize(GameWidth, GameHeight); } } //Setups the game, initialize variable and that stuff int game::Init(const char* levelfile) { gamewindow = NULL; printf("loading options...\n"); options::Init(); printf("initializing recorder...\n"); recording::init(); printf("initializing recycler...\n"); recycle::init(); printf("initializing level support...\n"); LevelPack::Init(); char i,j; int ix,iy; FastForward=false; started=false; Randomize(); //Init SDL; printf("Initializing SDL...\n"); if (SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER)<0) { fprintf(stderr, "Unable to init SDL: %s\n", SDL_GetError()); return(0); } #ifndef NOTRUETYPE printf("Initializing SDL_ttf\n"); TTF_Init(); #endif printf("Initializing Recolor Table...\n"); Init_RecolorTable(); game::InitGraphics(); if (!window::InitSDL()) return 0; printf("Setting video mode...\n"); gamewindow=window::create(GameWidth, GameHeight ,"Xye"); screen= gamewindow->getDrawingSurface(); // "Ahh, the horror!" printf("Initializing window icon...\n"); SDL_Surface* icon=SDL_CreateRGBSurface(0,32,32,32,SDL_ENDIAN32MASKS); //D.Draw(sprites,4,4); //sz=48; if (options::GetWindowIconFile() != "") { string s = options::GetWindowIconFile(); SDL_Surface* ic =IMG_Load(s.c_str()); Drawer D(ic, 0,0,32,32); D.SetColors(PlayerColor,255); Uint32 gray=SDL_MapRGB(icon->format,255,255,255); Uint32 colorkey=SDL_MapRGB(icon->format,255,0,255); SDL_FillRect(icon, 0, gray ); SDL_SetColorKey(icon, SDL_SRCCOLORKEY, colorkey); D.Draw(icon, 0,0); SDL_FreeSurface(ic); } else if (sz>32) { SDL_FillRect(icon, 0,0,32,32, SDL_MapRGB(icon->format,0,0,0 ) ); SDL_FillRect(icon, 2,2,28,28, SDL_MapRGB(icon->format,options::Red(),options::Green(),options::Blue()) ); } else { Drawer D(sprites,0,0,sz,sz); D.SetColors(PlayerColor,255); Uint32 gray=SDL_MapRGB(icon->format,255,255,255); Uint32 colorkey=SDL_MapRGB(icon->format,255,0,255); SDL_FillRect(icon, 0, gray ); SDL_SetColorKey(icon, SDL_SRCCOLORKEY, colorkey); D.Draw(icon,(unsigned int)((32-sz)/2),(unsigned int)((32-sz)/2)); } SDL_WM_SetIcon(icon,NULL) ; SDL_FreeSurface(icon); // //SDL_ShowCursor(SDL_DISABLE); DK_PRESSED=DK_UP_PRESSED=DK_DOWN_PRESSED=DK_LEFT_PRESSED=DK_RIGHT_PRESSED=DK_GO=false; DK_PRESSED_FIRST=0; DK_DIR=D_DOWN; const char* r=options::GetLevelFile(); int ln = options::GetLevelNumber(r); if (r!=NULL) { LevelBrowser::AssignLevelFile(r, ln); } if ( levelfile == NULL) { gamewindow->SetTransition( LevelBrowser::StartSection ); } else if (strcmp(levelfile, "/START_EDITOR/") == 0) //bad hack , BAD hack { gamewindow->SetTransition( editor::StartSection ); } else { r = levelfile; game::InitLevelFile = r; game::InitLevelFileN = ln; gamewindow->SetTransition( game::InitGameSection ); } //while (r[0]!='\0') // { //game::start(); ln = 1; if (r!=NULL) ln= options::GetLevelNumber(r); /* if (! AppLoop()) break; if( levelfile != NULL) break; ln = 1; r= LevelBrowser::GetLevelFile();*/ //} gamewindow->loop(XYE_FPS); printf("Cleaning level data...\n"); LevelPack::Clean(); printf("\ncleaning recording data\n"); recording::clean(); printf("cleaning options data\n"); options::Clean(); printf("cleaning fonts\n"); //Delete things that have to be deleted game::CleanGraphics(); LevelBrowser::Clean(); SkinBrowser::Clean(); printf("cleaning remaining objects\n"); recycle::run(); #ifndef NOTRUETYPE printf("Shutting down SDL_ttf\n"); TTF_Quit(); #endif printf("Shutting down SDL\n"); delete gamewindow; window::QuitSDL(); return (0); } void game::PlayLevel( const char *levelfile, int level) { xye_fromeditortest = false; xye_recordingsolution = false; xye_playsolution = false; InitLevelFile = levelfile; InitLevelFileN= level; gamewindow->SetTransition(game::InitGameSection); } void game::TestLevel( const char *levelfile, int level, bool playsolution) { xye_fromeditortest = true; xye_recordingsolution = false; xye_playsolution = playsolution; InitLevelFile = levelfile; InitLevelFileN= level; gamewindow->SetTransition(game::InitGameSection); } void game::Error(const char* msg) { fprintf(stderr,"%s", msg); fprintf(stderr,"\n"); throw (msg); } bool game::EvalDirGrid(Uint16 x1,Uint16 y1,Uint16 x2,Uint16 y2,edir &dir) { Uint8 sz_2=(Uint8)(sz / 2); x1+=sz_2; y1+=sz_2; Sint16 dx=x1-x2; Sint16 dy=y1-y2; dx=dx<0?-dx:dx; dy=dy<0?-dy:dy; if ((dx<=sz_2) && (dy<=sz_2)) return false; if (dx<=sz_2) { if (y2>y1) dir=D_DOWN; else dir=D_UP; return true; } else if (dy<=sz_2) { if (x2>x1) dir=D_RIGHT; else dir=D_LEFT; return true; } return false; } bool game::EvalDirGrid(obj* object,Uint16 x2,Uint16 y2,edir &dir) { square* sq= Square(object->X(),object->Y()); return EvalDirGrid(sq->x - TheGameBoard->x,sq->y - TheGameBoard->y,x2,y2,dir); } bool game::EvalDirKeys() { if (DK_LEFT_PRESSED) { DK_DIR=D_LEFT; return (true); } else if (DK_UP_PRESSED) { DK_DIR=D_UP; return (true); } else if (DK_RIGHT_PRESSED) { DK_DIR=D_RIGHT; return (true); } else if (DK_DOWN_PRESSED) { DK_DIR=D_DOWN; return (true); } return(false); } void game::PlayRecording(const string rc) { recording::load(rc); PlayingRecording=true; RecordingMode = RECORDING_MODE_MOVIE; } void game::AfterLevelLoad() { // load game? loadGame(); if(!xye_fromeditortest) { options::SaveLevelFile( LevelPack::OpenFile, LevelPack::OpenFileLn); } Button_Solution->Enabled = ( (LevelPack::HasSolution()) && !PlayingRecording); Button_Hint->Enabled= (hint::GlobalHintExists()); Button_Hint->resetToggle(); Button_NextLevel->Enabled = Button_PrevLevel->Enabled = (LevelPack::n > 1); Button_Undo->Visible = (game::IsUndoAllowed() || xye_fromeditortest); Button_Undo->Enabled = game::IsUndoAllowed(); Button_RecordSolution->Visible = xye_fromeditortest; Button_RecordSolution->Enabled = !xye_recordingsolution; } void game::RestartCommand( const buttondata*bd) { if (!PlayingRecording) SaveReplay(); options::ForgetLevelGame(LevelPack::OpenFile.c_str(), LevelPack::OpenFileLn); end(); start(); LevelPack::Restart(); AfterLevelLoad(); } void game::ExitCommandYesHandler( bool yesClicked ) { UpdateAll=true; if ( yesClicked ) { saveGame(); gamewindow->Close(); } } void game::ExitCommand( const buttondata*bd) { if(xye_fromeditortest) { gamewindow->SetTransition(editor::ResumeSectionAndQuit); } else { dialogs::makeYesNoDialog(gamewindow, "Are you sure you want to exit the game? Your progress will be saved.","Yes", "No" , game::ExitCommandYesHandler); } } void game::loadGame() { if (! PlayingRecording ) { string s = options::LoadLevelGame(LevelPack::OpenFile.c_str(), LevelPack::OpenFileLn); if (s != "") { recording::load(s.c_str()); //options::ForgetLevelGame(LevelPack::OpenFile.c_str(), LevelPack::OpenFileLn); undo = true; RecordingMode = RECORDING_MODE_BACKGROUND; string oldcap = LevelPack::CurrentLevelTitle; oldcap += " (Your previous game has been loaded.)"; SDL_WM_SetCaption(oldcap.c_str(),0); } } } void game::saveGame() { if (! PlayingRecording ) { char * tm = recording::save(); string s = tm; options::SaveLevelGame(LevelPack::OpenFile.c_str(), LevelPack::OpenFileLn, s); delete[]tm; } } void game::GoPreviousCommand( const buttondata*bd) { saveGame(); end(); start(); LevelPack::Last(); AfterLevelLoad(); } void game::GoNextCommand( const buttondata*bd) { saveGame(); end(); start(); LevelPack::Next(); AfterLevelLoad(); } void game::HintDownCommand( const buttondata*bd) { hint::GlobalHint(true); } void game::HintUpCommand( const buttondata*bd) { hint::GlobalHint(false); } void game::FFDownCommand( const buttondata*bd) { FastForward=true; } void game::FFUpCommand( const buttondata*bd) { FastForward=false; UpdateAll=true; } void game::UndoCommand( const buttondata*bd) { if (! PlayingRecording) Undo(); } void game::RecordSolutionCommand( const buttondata*bd) { xye_recordingsolution = true; game::RestartCommand(bd); } void game::BrowseCommand( const buttondata*bd) { if( xye_fromeditortest) { gamewindow->SetTransition(editor::ResumeSection); } else { saveGame(); gamewindow->SetTransition(LevelBrowser::StartSection); } } void game::SolutionCommand( const buttondata*bd) { if (LevelPack::HasSolution()) { saveGame(); end(); PlayingRecording=true; start(); LevelPack::Restart(); recording::load(LevelPack::Solution.c_str() ); PlayingRecording=true; RecordingMode = RECORDING_MODE_MOVIE; AfterLevelLoad(); } } void game::onKeyDown(SDLKey keysim, Uint16 unicode) { bool done=false; bool browse=false; switch (keysim) { case (SDLK_c) : CoordMode=true; break; case (SDLK_h) : HintDownCommand(); break; break; case (SDLK_ESCAPE): ExitCommand(); break; case (SDLK_DELETE): UndoCommand(); break; case(SDLK_RETURN): case(SDLK_KP_ENTER): //Enter RestartCommand(); break; case(SDLK_s): //s SolutionCommand(); break; case(SDLK_PLUS): case(SDLK_KP_PLUS): case(SDLK_n): //Plus - N GoNextCommand(); break; case(SDLK_MINUS): case(SDLK_KP_MINUS): case(SDLK_b): case(SDLK_p): //Minus - b - p GoPreviousCommand(); break; //Dir arrows handling key press: case(SDLK_UP): DK_UP_PRESSED=DK_PRESSED=DK_GO=true; DK_PRESSED_FIRST=0; DK_DIR=D_UP; break; case(SDLK_DOWN): DK_DOWN_PRESSED=DK_PRESSED=DK_GO=true; DK_PRESSED_FIRST=0; DK_DIR=D_DOWN; break; case(SDLK_LEFT): DK_LEFT_PRESSED=DK_PRESSED=DK_GO=true; DK_PRESSED_FIRST=0; DK_DIR=D_LEFT; break; case(SDLK_RIGHT): DK_RIGHT_PRESSED=DK_PRESSED=DK_GO=true; DK_PRESSED_FIRST=0; DK_DIR=D_RIGHT; break; case(SDLK_RCTRL):case(SDLK_LCTRL): FFDownCommand(); break; case(SDLK_RSHIFT):case(SDLK_LSHIFT): ShiftPressed=true; break; } } void game::onKeyUp(SDLKey keysim, Uint16 unicode) { bool done=false; bool browse=false; switch (keysim) { case (SDLK_c) : CoordMode=false; break; case (SDLK_h) : HintUpCommand(); break; //Dir arrows release: case(SDLK_UP): DK_UP_PRESSED=false; if (DK_PRESSED) DK_PRESSED = ((DK_DIR!=D_UP) || (EvalDirKeys())); break; case(SDLK_DOWN): DK_DOWN_PRESSED=false; if (DK_PRESSED) DK_PRESSED = ((DK_DIR!=D_DOWN) || (EvalDirKeys())); break; case(SDLK_LEFT): DK_LEFT_PRESSED=false; if (DK_PRESSED) DK_PRESSED = ((DK_DIR!=D_LEFT) || (EvalDirKeys())); break; case(SDLK_RIGHT): DK_RIGHT_PRESSED=false; if (DK_PRESSED) DK_PRESSED = ((DK_DIR!=D_RIGHT) || (EvalDirKeys())); break; case(SDLK_RCTRL):case(SDLK_LCTRL): FFUpCommand(); break; case(SDLK_RSHIFT):case(SDLK_LSHIFT): ShiftPressed=false; break; case (SDLK_BACKSPACE): BrowseCommand(); break; } } void game::FlashXyePosition() { FlashPos=70; } void game::onExitAttempt() { gamewindow->stop(); } Sint16 Mouse2GridX(Uint16 mouse) { Sint16 x=mouse; if (x<0) return -1; x= (Sint16)(x / sz); if (x>=XYE_HORZ) return -1; return x; } Sint16 Mouse2GridY(Uint16 mouse) { Sint16 y=mouse; if (y<0) return -1; y= (Sint16)(y / sz); if (y>=XYE_VERT) return -1; return (XYE_VERT-y-1); } void game::onMouseMove(int x,int y) { mouse_x=x, mouse_y=y; if (mouse_pressed) { if (EvalDirGrid(XYE, mouse_x, mouse_y,DK_DIR) && (!mouse_valid) ) { DK_PRESSED_FIRST=0; DK_GO=mouse_valid=true; } else if (mouse_valid) mouse_valid=false; } } void game::onMouseOut() { } void game::onMouseDown(int x,int y) { mouse_x=x, mouse_y=y; if (EvalDirGrid(XYE, mouse_x, mouse_y,DK_DIR)) { DK_PRESSED_FIRST=0; DK_GO=mouse_valid=true; } mouse_pressed=true; } void game::onMouseUp(int x,int y) { mouse_pressed=mouse_valid=false; } string game::InitLevelFile; int game::InitLevelFileN=0; void game::InitGameSection(window* wind) { Sint16 oy = 0; if(! xye_fromeditortest) gamewindow->Resize(GameWidth,GameHeight); /*else { oy = XYE_XTRA_Y; }*/ Sint16 sz32 = (game::GRIDSIZE*3)/2; //button * but = new button(0,0,100,100); //but->depth = 100; //gamewindow->addControl(but); rectangle* rc = new rectangle(0,oy, wind->Width, game::GRIDSIZE, options::LevelMenu_info ); wind->addControl(rc); //fun with buttons const char* cap; Button_ToolTipWasDrawn = false; //*** button tooltip buttontooltip* btt = new buttontooltip(); btt->depth = 2; wind->addControl(btt); btt->minx = 0; btt->maxx = GameWidth; btt->miny = 0; btt->maxy = game::GRIDSIZE*2; btt->drawnSwitch = &Button_ToolTipWasDrawn; //*** Browse button: cap = "Browse"; button* bt = new button(1,oy, sz32, game::GRIDSIZE); //bt->text = cap; bt->Icon(5,15); bt->depth=1; bt->onClick = BrowseCommand; bt->toolTipControl = btt; bt->toolTip = "[Backspace] Level browser"; wind->addControl(bt); //*** Restart button: cap = "Restart"; bt = new button(bt->x + bt->w + 1,oy, sz32, game::GRIDSIZE); //bt->text = cap; bt->Icon(7,3); bt->depth=1; bt->onClick = RestartCommand; bt->toolTipControl = btt; bt->toolTip = "[Enter] Restart"; wind->addControl(bt); //*** Prev button: cap = "-"; bt = new button(bt->x + bt->w + 1,oy, sz32, game::GRIDSIZE); //bt->text = cap; bt->Icon(4,18); bt->depth=1; bt->onClick = GoPreviousCommand; bt->toolTipControl = btt; bt->toolTip = "[P] Previous level"; wind->addControl(bt); Button_PrevLevel = bt; ; //*** Next button: cap = "+"; bt = new button(bt->x + bt->w + 1,oy, sz32, game::GRIDSIZE); //bt->text = cap; bt->Icon(5,18); bt->depth=1; bt->onClick = GoNextCommand; bt->toolTipControl = btt; bt->toolTip = "[N] Next level"; wind->addControl(bt); Button_NextLevel=bt; //*** FF button: cap = ">>"; bt = new button(bt->x + bt->w + 1,oy, sz32, game::GRIDSIZE); //bt->text = cap; bt->Icon(8,3); bt->depth=1; bt->onPress = FFDownCommand; bt->onRelease = FFUpCommand; bt->toolTipControl = btt; bt->toolTip = "[Ctrl] Fast forward"; wind->addControl(bt); //*** Hint button: cap = "?"; bt = new button(bt->x + bt->w + 1,oy, sz32, game::GRIDSIZE); //bt->text = cap; bt->Icon(11,18); bt->depth=1; bt->onPress = HintDownCommand; bt->onRelease = HintUpCommand; bt->ToggleButton = true; bt->toolTipControl = btt; bt->toolTip = "[H] Show hint"; wind->addControl(bt); Button_Hint=bt; //*** Solution button: cap = "S"; bt = new button(bt->x + bt->w + 1,oy, sz32, game::GRIDSIZE); bt->Icon(8,4); //bt->text = cap; bt->depth=1; bt->onClick = SolutionCommand; bt->toolTipControl = btt; bt->toolTip = "[S] Play solution"; wind->addControl(bt); Button_Solution=bt; //*** Undo button: cap = "Undo"; bt = new button(bt->x + bt->w + 1,oy, sz32, game::GRIDSIZE); //bt->text = cap; bt->Icon(11,19); bt->depth=1; bt->onClick = UndoCommand; Button_Undo = bt; bt->toolTipControl = btt; bt->toolTip = "[Del] Undo last movement"; wind->addControl(bt); //*** Record button: cap = "RecordSolution"; bt = new button(bt->x + bt->w + 1,oy, sz32, game::GRIDSIZE); //bt->text = cap; bt->Icon(10,9); bt->depth=1; bt->onClick = RecordSolutionCommand; Button_RecordSolution = bt; bt->toolTip = "Record solution"; bt->toolTipControl = btt; wind->addControl(bt); //*** Quit button: cap = "Quit"; bt = new button( wind->Width - button::recommendedWidth(cap) -1,oy, button::recommendedWidth(cap), game::GRIDSIZE); bt->text = cap; bt->depth=1; bt->onClick = ExitCommand; bt->toolTipControl = btt; wind->addControl(bt); rc = new rectangle(0, game::GRIDSIZE+oy, wind->Width, XYE_XTRA_Y, 0,0,0); wind->addControl(rc); Sint16 cx=0, cy = oy+XYE_XTRA_Y + game::GRIDSIZE; TheGameBoard = new gameboard(XYE_XTRA_X,cy, game::GRIDSIZE*XYE_HORZ, game::GRIDSIZE*XYE_VERT); wind->addControl(TheGameBoard); rc = new rectangle(0, TheGameBoard->y, XYE_XTRA_X, TheGameBoard->h, 0,0,0); wind->addControl(rc); rc = new rectangle(TheGameBoard->x+TheGameBoard->w, TheGameBoard->y, wind->Width-(TheGameBoard->x+TheGameBoard->w), TheGameBoard->h, 0,0,0); wind->addControl(rc); wind->onKeyDown = game::onKeyDown; wind->onKeyUp = game::onKeyUp; wind->onExitAttempt = game::onExitAttempt; rc = new rectangle(0, TheGameBoard->y + TheGameBoard->h, wind->Width, XYE_XTRA_Y, 0,0,0); wind->addControl(rc); gamepanel* gp = new gamepanel(XYE_XTRA_X, rc->y + rc->h, wind->Width- 2*XYE_XTRA_X, wind->Height - (rc->y + rc->h) - XYE_XTRA_Y ); gp->depth = 2; gamewindow->addControl(gp); rc = new rectangle(0, gp->y, wind->Width, gp->h+XYE_XTRA_Y, 0,0,0); rc->depth = 0; wind->addControl(rc); // game::started=true; game::end(); game::start(); if(game::InitLevelFile!="") game::InitLevelFileN = options::GetLevelNumber(game::InitLevelFile.c_str()); LevelPack::FromEditor = xye_fromeditortest; LevelPack::Load( game::InitLevelFile.c_str(), game::InitLevelFileN); AfterLevelLoad(); if(xye_playsolution) { xye_playsolution = false; game::SolutionCommand(NULL); } } //Starts the game. void game::start(bool undotime) { char i,j; int ix,iy; started=true; cameraon=!undotime; PlayingRecording=false; if (undo=undotime) { PlayingRecording = true; RecordingMode = RECORDING_MODE_BACKGROUND; } else { recording::clean(); } deathqueue::reset(); UpdateAll=true; mouse_pressed=false; CoordMode=false; DK_PRESSED=DK_GO=false; ShiftPressed=false; deathsq1=NULL; deathsq2=NULL; lastKey=0; FlashXyePosition(); LastXyeMove=counter=counter2=counter3=counter4=counter5=counter7=counter8=counter9=beastcounter=0; marked::Reset(); //reset counts of marked zones; toggle::Reset(); //Reset state of toggle blocks surprise::Reset(); //Reset state of remaining surprise blocks to morph. gem::ResetCounts(); //reset gem counts star::ResetCounts(); //reset star counts key::ResetCounts(); //reset key counts wall::ResetDefaults(); earth::ResetDefaults(); tdoor::ResetDefaults(); portal::Reset(); windowblock::ResetCounts(); beast::ResetCounts(); hint::Reset(); HintMarquee=HintRead=0; //game::InitControls(); LastXyeDir=D_DOWN; //Default last dir is down id_count=0; NextTic=0; square* sq; iy=TheGameBoard->y; for (j=XYE_VERT-1;j>=0;j--) { ix=TheGameBoard->x; for (i=0;igobject=NULL; sq->object=NULL; sq->ex=NULL; sq->x=ix; sq->y=iy; sq->sqx=i; sq->sqy=j; sq->gs=GROUND_1; sq->R=options::FloorColor.r; sq->G=options::FloorColor.g; sq->B=options::FloorColor.b; sq->Update=true; sq->UpdateLater=false; ix+=GRIDSIZE; } iy+=GRIDSIZE; } started=true; } void game::loop_Sub(char i, char j) { square* sq; obj* object; bool died=false; sq=&grid[i][j]; object=sq->object; gobj* gobject; if (gobject=sq->gobject) gobject->Loop(); if ((object!=NULL) && (object->tic!=counter) && (object->Loop(&died)) && (! died)) { object->tic=counter; } } void game::loop_gameplay() { char i,j; surprise::TransformAll(); //Change every surprise block that needs to be changed. incCounters(); MoveXye(); for (j=XYE_VERT-1;j>=0;j--) { for (i=0;iWrite(screen,cx, cy+fonadd ,tx); cx+=FontRes->TextWidth(tx)+4; } void game::DrawPanelInfo(Drawer& D, Sint16 &cx,Sint16 &cy, Uint8 spx, Uint8 spy , unsigned int num, Uint8 fonadd, SDL_Color col) { DrawPanelInfo(D,cx,cy,spx,spy,num,fonadd, col.r , col.g, col.b, col.unused); } string LastPanelHint=""; #define FADETICS 6 #define MARQUEETICS 24 void game::DrawPanel(SDL_Surface* target, Sint16 x, Sint16 y, Sint16 w, Sint16 h) { Sint16 cx,cy; Sint16 tem1,tem2; Sint16 Aw=w; Sint16 Ah=h; Uint32 black=SDL_MapRGB(target->format, 0, 0, 0); Uint32 white=SDL_MapRGB(target->format, 255, 255, 255); SDL_FillRect(screen, x,y, Aw, Ah, black); SDL_FillRect(screen, x,y, Aw, Ah, white); //Aw-=XYE_GAMEX+XYE_XTRA_X; //Ah-=XYE_XTRA_Y; //x+=XYE_GAMEX; Sint16 dif= (GRIDSIZE+2-FontRes->Height())/2; char tx[30]; string hintx=""; if (PlayingRecording) { if(xye_fromeditortest) { if (GameOver) { hintx="** The movie has ended ** Press [Enter] to play the level - [Backspace] to return to the level editor."; } else { hintx="** Playing Movie ** - Press [Enter] to play the level. [Ctrl] - Fast Forward. [Backspace] - Return to the level editor."; } } else if (GameOver) { hintx="** The movie has ended ** Press [Enter] to play the level - [Backspace] to return to the level file menu"; } else { hintx="** Playing Movie ** - Press [Enter] to play the level. [Ctrl] - Fast Forward"; } } else if (CoordMode) { HintMarquee=HintRead=0; sprintf(tx,"x : %d ; y : %d",Mouse2GridX(mouse_x),Mouse2GridY(mouse_y)); hintx = tx; } else if (FinishedLevel) { hintx = LevelPack::CurrentLevelBye; } else if (GameOver) { hintx="Game over , press [Enter] to restart the level"; } else if (hint::Active()) { hintx = "Hint - "+string(hint::GetActiveText() ); } else if (LevelPack::LevelError != "") { hintx = LevelPack::LevelError; } SDL_FillRect(screen, x,y+1, Aw, Ah-1, white); //Lives int L=XYE->GetLives()-1; Drawer D(game::sprites,0,0,0,0); if (L>0) { XYE->Draw(x+2,y+2); D.ChangeRect(4*GRIDSIZE,15*GRIDSIZE,GRIDSIZE,GRIDSIZE); D.Draw(screen,x+2+GRIDSIZE,y+2); sprintf(tx,"%d",L); FontRes->Write(screen,GRIDSIZE+(GRIDSIZE/2)+x+2, y+2+dif ,tx); } cx=x+2+GRIDSIZE*3; SDL_FillRect(screen,cx,y,2,Ah,black); cx+=5; //Levels char levelmsg[20]; snprintf(levelmsg,20,"Level: %d/%d",LevelPack::OpenFileLn,LevelPack::n); FontRes->Write(screen,cx, y+2+dif ,levelmsg); tem1=FontRes->TextWidth(levelmsg); tem2=FontRes->TextWidth("Level: 99/99"); cx+=(tem1>tem2)?tem1:tem2; cx+=3; SDL_FillRect(screen, cx,y, 2, Ah, black); cx+=5; unsigned int yl,rd,bl,gr,pr; cy=y+2; if(xye_fromeditortest) { const char*tx="Testing a level from Xyedit"; if(xye_recordingsolution) tx="Recording your solution for Xyedit"; FontRes->Write(screen, x+w-GRIDSIZE-FontRes->TextWidth(tx),y+h-XYE_XTRA_Y-FontRes->Height() ,tx); } if (gem::GetRemanents(yl,rd,bl,gr)) { FontRes->Write(screen,cx, y+2+dif ,"Remaining: "); cx+= FontRes->TextWidth("Remaining: "); if (bl) DrawPanelInfo(D, cx,cy, 2, 3, bl,dif); if (gr) DrawPanelInfo(D, cx,cy, 4, 3, gr,dif); if (yl) DrawPanelInfo(D, cx,cy, 5, 3, yl,dif); if (rd) DrawPanelInfo(D, cx,cy, 3, 3, rd,dif); } if (key::GetXyesKeys(yl,rd,bl,gr,pr) || star::GetAcquired() ) { cx+=5; FontRes->Write(screen,cx, y+2+dif ,"Got: "); cx+= FontRes->TextWidth("Got: "); if (bl) DrawPanelInfo(D, cx,cy, 6, 4, bl,dif, options::BKColor[B_BLUE] ); if (gr) DrawPanelInfo(D, cx,cy, 6, 4, gr,dif, options::BKColor[B_GREEN] ); if (yl) DrawPanelInfo(D, cx,cy, 6, 4, yl,dif, options::BKColor[B_YELLOW] ); if (rd) DrawPanelInfo(D, cx,cy, 6, 4, rd,dif, options::BKColor[B_RED] ); if (pr) DrawPanelInfo(D, cx,cy, 6, 4, pr,dif, options::BKColor[B_PURPLE] ); if(star::GetAcquired()) { DrawPanelInfo(D, cx,cy, 9, 12, star::GetAcquired() ,dif); } } /*if (hint::GlobalHintExists()) { cx+=3; SDL_FillRect(screen, cx,y, 2, Ah, black); cx+=3; hint::Draw(cx,cy,false); cx+=20; } if (LevelPack::HasSolution()) { cx+=3; SDL_FillRect(screen, cx,y, 2, Ah, black); cx+=3; D.ChangeRect(8*GRIDSIZE,4*GRIDSIZE,GRIDSIZE,GRIDSIZE); D.Draw(screen,cx,cy); cx+=20; }*/ //--- bool hintactive=(hintx!=""); if (hintactive || (HintRead>0)) { if (!hintactive) { if (HintRead>FADETICS) HintRead=FADETICS; hintx=LastPanelHint; } else LastPanelHint=hintx; SDL_Surface *HintSurf; if(HintRead>FADETICS) HintSurf=NULL; else HintSurf =CreateFixedRGBASurface(SDL_SRCALPHA, Aw, Ah); cx=x; cy=y; if(HintRead<=FADETICS) { SDL_FillRect(HintSurf, 0,0, Aw, Ah, SDL_MapRGB(HintSurf->format, options::HintColor)); } else { SDL_FillRect(screen, cx,cy, Aw, Ah, SDL_MapRGB(screen->format, options::HintColor)); } Uint16 TW=FontRes->TextWidth(hintx.c_str()); static int marqueeloop = 0; marqueeloop ++; int fc = ( FastForward ? ( (marqueeloop%10==0) ? 100 : 0 ) : 1 ); if ((cx+TW>Aw) && (HintRead>=MARQUEETICS)) { HintMarquee -= fc; if (cx+TW+HintMarquee<=0) { HintMarquee=Aw; } } Uint8 alpha; if (HintRead<=FADETICS) { alpha=(Uint8)(int)( (double)(HintRead*HintRead) * 255.0/(FADETICS*FADETICS) ); SDL_BlitSurface(HintSurf,0,0,Aw,Ah, screen, cx,cy,255,255,255,alpha); SDL_FreeSurface(HintSurf); FontRes->Write(screen,3+HintMarquee+x,cy+1+dif,hintx.c_str(), 255,255,255,alpha); } else { alpha=255; FontRes->Write(screen,3+HintMarquee+x,cy+1+dif,hintx.c_str()); } if (hintactive) { if(HintRead<=MARQUEETICS) { HintRead+= fc; } } else { HintRead -= fc; } } else { HintMarquee = HintRead = 0; } } void game::draw(Sint16 px, Sint16 py) { game::screen = gamewindow->getDrawingSurface(); if(undo) return; int i,j; Uint32 black=SDL_MapRGB(screen->format, 0, 0, 0); //Uint32 Aw=XYE_GAMEX+XYE_XTRA_X+XYE_HORZ*GRIDSIZE; //Uint32 Ah=XYE_VERT*GRIDSIZE; //SDL_FillRect(screen, px,py, Aw, XYE_GAMEY, black); //SDL_FillRect(screen, px,py+XYE_GAMEY, XYE_GAMEX, Ah, black); //SDL_FillRect(screen, px,py+XYE_GAMEY+Ah, Aw, XYE_XTRA_Y, black); //SDL_FillRect(screen, px+Aw-XYE_XTRA_X, py+XYE_GAMEY, XYE_XTRA_X, Ah, black); //DrawPanel(0,XYE_GAMEY+XYE_XTRA_Y+Ah-1); square* sq; Drawer D(game::sprites,0,0,0,0); //let's paint the ground unsigned int x,y; obj* object; gobj* gobject; explosion* ex; int xx=XYE->X(),xy=XYE->Y(); bool shadow=false; bool dodraw; bool drawTopRow = false; if(Button_ToolTipWasDrawn) { drawTopRow = true; Button_ToolTipWasDrawn = false; } for (i=0;igobject; ex=sq->ex; // the row 19 objects are always drawn provisionally due to tooltips // being able to draw on top of them... dodraw=( (drawTopRow && (j==19) ) || (UpdateAll) || (sq->Update) || (gobject!=NULL) || (ex!=NULL) || CloseEnough(xx,xy,i,j)) ; sq->Update=false; if(sq->UpdateLater) { sq->Update=true; sq->UpdateLater=false; } if (dodraw) { x=sq->x; y=sq->y; object=sq->object; SDL_FillRect(screen, x,y,GRIDSIZE,GRIDSIZE, SDL_MapRGB(screen->format, sq->R , sq->G, sq->B)); int xo,yo; if(ex!=NULL) { ex->getDrawingXYOffset(xo,yo); int k,l; if(xo||yo) for (k=-1;k<=1;k++) for (l=-1;l<=1;l++) { if(( k+i=0) && ( l+j=0) ) { if( (k<0) || ((k==0) && (l<0) ) ) grid[k+i][l+j].Update=true; else grid[k+i][l+j].UpdateLater=true; } } } else { xo=yo=0; } if ( (gobject!=NULL) && (! gobject->RenderAfterObjects) ) { if (shadow) switch (gobject->GetType()) { case(OT_EXIT): case(OT_MARKEDAREA): case(OT_BLOCKDOOR): //darkspr->Render(x,y); shadow=false; } gobject->Draw(x+xo,y+yo); } if (object!=NULL) { if (shadow) switch(object->GetType()) { case(OT_XYE): case(OT_GEM): case(OT_GEMBLOCK): //darkspr->Render(x,y); shadow=false; } if ( (!undo) || (object->GetType()!=OT_XYE)) { object->Draw(x + xo,y + yo); } } if ( (gobject!=NULL) && ( gobject->RenderAfterObjects) ) { if ((shadow) && (gobject->GetType()==OT_MARKEDAREA)) { //darkspr->Render(x,y); shadow=false; } gobject->Draw(x+xo,y+yo); } if (ex!=NULL) ex->Draw(x,y); } // if (dodraw) } } //delete spr1;delete spr2; bool DoArrowThing=false; if (FlashPos>0) { DoArrowThing=((FlashPos%2==0) && (FlashPos<50)); if (counter5==0) FlashPos--; } DoArrowThing = (!GameOver && (DoArrowThing || (ShiftPressed && (counter9<5)) )); if (DoArrowThing && (!PlayingRecording)) { signed char incx[4]={ 1, 1,-1,-1}; signed char incy[4]={ 1,-1, 1,-1}; signed char atx[4]= { 5, 5, 4,4}; signed char aty[4]= {13,14,13,14 }; signed char xx=XYE->X(),xy=XYE->Y(); signed char nx,ny; for (i=0;i<4;i++) { nx=xx+incx[i]; ny=xy+incy[i]; if ((nx>=0) && (nx=0) && (nyUpdate=true; SDL_BlitSurface(sprites.sprites,atx[i]*GRIDSIZE,aty[i]*GRIDSIZE,GRIDSIZE,GRIDSIZE, screen,sq->x,sq->y); } } } if (deathsq1!=NULL) { D.ChangeRect(0,GRIDSIZE,GRIDSIZE,GRIDSIZE); D.SetColors(&PlayerColor,255); D.Draw(screen,deathsq1->x,deathsq1->y); deathsq1->Update=true; deathsq2=deathsq1; deathsq1=NULL; } else if (deathsq2!=NULL) { D.ChangeRect(0,GRIDSIZE*2,GRIDSIZE,GRIDSIZE); D.SetColors(&PlayerColor,255); D.Draw(screen,deathsq2->x,deathsq2->y); deathsq2->Update=true; deathsq2=NULL; } //SDL_Flip(screen); UpdateAll=false; } bool ScreenCoordsToGameCoords(float inx, float iny, char &rx, char &ry, float scale) { inx=inx-XYE_GAMEX; iny=iny-XYE_GAMEY; scale*=16; rx=(char)(inx / scale); ry=XYE_VERT-1-(char)(iny / scale); return ((rx>=0) && (rx=0) && (ry(dx*dx)) if (dy>0) return D_UP; else return D_DOWN; else if (dx>0) return D_RIGHT; return D_LEFT; } bool game::TryMoveXye(char dx, char dy, edir dir) { char nx,ny,cx,cy; bool go=false; square* sq=Square(dx,dy); obj* object=sq->object; teleport* tele; dangerous* blck; if (object==NULL) go=true; else { switch (object->GetType()) { case(OT_TELEPORT): tele=static_cast(object); go = tele->tryteleport(dir, XYE, nx, ny ,blck, NULL); if (go) { dx=nx; dy=ny;sq=Square(dx,dy); } else if (blck!=NULL) { if (blck->Busy(XYE)) go=false; else { //Kill Xye blck->Eat(); XYE->Kill(); return (true); } } break; case(OT_BLACKHOLE): case(OT_MINE): case(OT_FIREBALL): blck=static_cast(object); if (blck->Busy(XYE)) go=false; else { //Kill Xye blck->Eat(); XYE->Kill(); return (true); } break; } if ((! go) && (object->trypush(dir,XYE))) go=true; } if (go) { XYE->moved=true; gobj* gobject=sq->gobject; if ((gobject==NULL) || (gobject->CanEnter(XYE,dir))) { XYE->move(dx,dy); XYE->lastdir=dir; LastXyeDir=dir; return (true); } } return(false); } bool game::LastMoveWasHorizontal() { switch(LastXyeDir) case(D_LEFT): case(D_RIGHT): return true; return false; } bool game::TryMoveXye(edir dir) { char dx=XYE->X(); char dy=XYE->Y(); switch(dir) { case(D_UP): dy++; break; case(D_DOWN): dy--; break; case(D_RIGHT): dx++; break; default: dx--; } dx= (dx>=XYE_HORZ)?0:(dx<0)?XYE_HORZ-1:dx; dy= (dy>=XYE_VERT)?0:(dy<0)?XYE_VERT-1:dy; return (TryMoveXye(dx,dy,dir)); } void game::MoveXye() { if (GameOver) { return; } if ( (LastXyeMove+1) < counter) { if (PlayingRecording && (RecordingMode != RECORDING_MODE_BACKGROUND) ) { bool nm; if (! recording::get(DK_DIR,nm)) { game::TerminateGame(false); PlayingRecording = false; } if (!nm) { if (TryMoveXye(DK_DIR)) { LastXyeMove = counter; } } return; } if (undo) { bool nm; if (! recording::get_undo(DK_DIR,nm)) { cameraon=true; PlayingRecording = false; undo=false; UpdateAll=true; game::XYE->alpha=200; } else { if (!nm) { if (TryMoveXye(DK_DIR)) { LastXyeMove = counter; } } return; } } //char dx=0,dy=0,nx,ny,cx,cy; //edir dir=D_UP; //int ky=0; if ( ( DK_PRESSED || mouse_valid || DK_GO) && (DK_PRESSED_FIRST!=1)) { DK_GO=false; unsigned char fp=FlashPos; FlashPos=0; if (cameraon) recording::add(DK_DIR); if (TryMoveXye(DK_DIR)) LastXyeMove=counter; else FlashPos=fp; } else { //No more flash after idle time. if ((FlashPos==0) && (LastXyeMove+200=XYE_HORZ) x-=XYE_HORZ; while (x<0) x+=XYE_HORZ; while (y>=XYE_VERT) y-=XYE_VERT; while (y<0) y+=XYE_VERT; return &grid[x][y]; } unsigned int game::NewId() { return id_count++; } void game::incCounters() { counter++; counter2++; if (counter2>=2) counter2=0; counter3++; if (counter3>=3) counter3=0; counter4++; if (counter4>=4) counter4=0; counter5++; if (counter5>=5) counter5=0; counter7++; if (counter7>=7) counter7=0; counter8++; if (counter8>=8) counter8=0; counter9++; if (counter9>=9) counter9=0; if ((! counter2) &&(! counter5)) beastcounter++; } inline bool game::Mod2() { return (counter2==0);} inline bool game::Mod3() { return (counter3==0);} inline bool game::Mod4() { return (counter4==0);} inline bool game::Mod5() { return (counter5==0);} inline bool game::Mod7() { return (counter7==0);} inline bool game::Mod8() { return (counter8==0);} inline bool game::Mod9() { return (counter9==0);} inline bool game::Mod2(unsigned int m) { return (counter2==m);} inline bool game::Mod3(unsigned int m) { return (counter3==m);} inline bool game::Mod4(unsigned int m) { return (counter4==m);} inline bool game::Mod5(unsigned int m) { return (counter5==m);} inline bool game::Mod7(unsigned int m) { return (counter7==m);} inline bool game::Mod8(unsigned int m) { return (counter8==m);} inline bool game::Mod9(unsigned int m) { return (counter9==m);} inline unsigned int game::Counter() { return counter; } void game::end() { char i,j; GameOver=FinishedLevel=false; square* sq; recycle::run(); for (i=0;igobject!=NULL) { delete (sq->gobject); sq->gobject=NULL; } if (sq->object!=NULL) { delete (sq->object); sq->object=NULL; } if (sq->ex!=NULL) { delete (sq->ex); sq->ex=NULL; } } started=false; deathqueue::reset(); } struct FindGoodPoint_List { char x; char y; FindGoodPoint_List* next; }; bool game::FindGoodPoint(char cx, char cy, char &rx, char &ry, obj* togo, bool (*cond)(square* sq,obj* togo)) { if (cond(Square(cx,cy),togo)) { rx=cx; ry=cy; return true; } bool mem[XYE_HORZ][XYE_VERT]; bool found=false; char tx,ty; char ix[8],iy[8]; ix[0]= 1;iy[0]= 0; ix[1]= 1;iy[1]= 1; ix[2]= 0;iy[2]= 1; ix[3]=-1;iy[3]= 1; ix[4]=-1;iy[4]= 0; ix[5]=-1;iy[5]=-1; ix[6]= 0;iy[6]=-1; ix[7]= 1;iy[7]=-1; char i,j; for (i=0;ix=cx; rv->y=cy; rv->next=NULL; aux=NULL; curr=aux; next=rv; mem[cx][cy]=true; do { while ((next!=NULL) && (!found)) { tx=next->x; ty=next->y; next=next->next; i=0; while ((! found) && (i<8)) { rx=tx+ix[i]; ry=ty+iy[i]; if ((rx<0) || (ry<0) || (rx>=XYE_HORZ) || (ry>=XYE_VERT) || (mem[rx][ry])); else if (cond(Square(rx,ry),togo)) found=true; else { mem[rx][ry]=true; if (aux==NULL) { curr=new FindGoodPoint_List; curr->x=rx; curr->y=ry; curr->next=NULL; aux=curr; } else { tmp=new FindGoodPoint_List; tmp->x=rx; tmp->y=ry; tmp->next=NULL; curr->next=tmp; curr=tmp; tmp=NULL; } } i++; } } // Remove Old linked list next=rv; while (next!=NULL) { tmp=next; next=next->next; delete tmp; tmp=NULL; } //save new linked list rv=aux; next=rv; aux=NULL; curr=NULL; } while ((! found) && (next!=NULL)); // Remove linked list next=rv; while (next!=NULL) { tmp=next; next=next->next; delete tmp; } return found; } bool AllowedForRevive(square* sq,obj* togo) { if (sq->object==NULL) return (sq->gobject==NULL); return false; } bool game::GetRevivePoint( char cx, char cy, char &nx, char &ny) { return FindGoodPoint(cx,cy,nx,ny, XYE, AllowedForRevive ); } bool game::AllowRoboXyeMovement() { return (LastXyeMove+1==counter) && (LastXyeMove); } bool ObjectResistsFire(obj * o) { wall* wl; switch(o->GetType()) { case (OT_METALBLOCK): case(OT_GEMBLOCK): case(OT_LOCK): case(OT_FIREBALL): case(OT_GEM): case(OT_WINDOW): return true; case(OT_WALL): //Yep those walls resist fire, thus they resist moving dangerous too wl=static_cast(o); return (wl->ResistsFire()); } return false; } // A small explosion that kills any non fire resistant object in the square void game::SmallBoom(square* sq,bool ConditionalFx, int xo, int yo) { obj *object=sq->object; unsigned char kind = 2; if ( ( (object!=NULL) && !ObjectResistsFire(object) ) || (!ConditionalFx)) { kind = 1; } explosion* ex=new explosion(sq,kind); ex->setDrawingXYOffset(xo,yo); if ((object!=NULL) && ! (ObjectResistsFire(object))) { if(object->GetType()==OT_XYE) { (static_cast(object))->Kill() ; } else { object->Kill(); } } } bool game::Moved(edir d) { return ((LastXyeMove==counter) && (LastXyeDir==d)); } bool game::IsUndoAllowed() { return ( ((options::UndoEnabled() || xye_fromeditortest) /*&& ! xye_recordingsolution*/) || LevelPack::AllowUndo() ); } void game::Undo() { if ( game::IsUndoAllowed() && recording::undo() ) { undo=true; //game::draw(); game::end(); game::start(true); LevelPack::Restart(); AfterLevelLoad(); } } void game::SaveReplay() { //save the replay. const char* home=getenv("HOME"); string lastgame; if (home != NULL) { lastgame = home; lastgame += "/.xye/levels/lastgame.xyr"; } else { lastgame = "./levels/lastgame.xyr"; } recording::saveInFile(lastgame,LevelPack::OpenFile.c_str(),LevelPack::OpenFileLn); } void game::TerminateGame(bool good) { undo = false; if (!PlayingRecording) { SaveReplay(); if (good) { if(xye_recordingsolution) { //SDL_WM_SetCaption("Xye - Your solution has been saved!",0); char * tm = recording::save(); editor::SendSolution(tm); delete[]tm; BrowseCommand(); } else { SDL_WM_SetCaption("Xye - YOU WIN!",0); } } else { SDL_WM_SetCaption("Xye - Game over!",0); } } else { } if (good) { FinishedLevel = true; } //else if(xye_fromeditortest) //{ // BrowseCommand(); //} if(xye_recordingsolution) { xye_recordingsolution=false; } //counter=counter2=counter3=counter4=counter5=counter7=counter8=counter9=1; GameOver=true; } /**end fake class game**/ /**Class ent**/ char ent::X() { return x; } char ent::Y() { return y; } unsigned int ent::GetId() { return id;} otype ent::GetType() { return type;} void ent::UpdateSquare() { game::Square(x,y)->Update=true; } /**Class ent ends**/ /**Class Object**/ void obj::move(char px,char py) { square* sq=game::Square(x,y); sq->Update=true; //Make sure to update it gobj *gobject = sq->gobject; if (gobject!=NULL) gobject->OnLeave(this); sq->object=NULL; x=px; y=py; sq=game::Square(x,y); sq->Update=true; //Make sure to update it obj* object=sq->object; if (object!=NULL) { if (object->GetType()==OT_XYE) ((xye*)(object))->Kill(); else object->Kill(); } gobject = sq->gobject; sq->object=this; if (gobject!=NULL) gobject->OnEnter(this); } void obj::ObjectConstruct(square* sq) { KilledByBlackHole=false; id=game::NewId(); tic=0; x=sq->sqx;y=sq->sqy; if (sq->object!=NULL) sq->object->Kill(); sq->object=this; sq->Update=true; if (sq->gobject!=NULL) sq->gobject->OnEnter(this); } void obj::Kill() { Kill(false); } void obj::Kill(bool byBlackHole) { UpdateSquare(); if (type==OT_XYE) { game::XYE->Kill(); return; } KilledByBlackHole=byBlackHole; OnDeath(); square* sq=game::Square(x,y); gobj *gobject = sq->gobject; if (gobject!=NULL) gobject->OnLeave(this); sq->object=NULL; recycle::add(this); } bool obj::trypush_common(edir dir,obj* pusher,bool AsRoundObject, bool* died) { char dx=0,dy=0; if (died!=NULL) *died=false; if ((pusher!=NULL) && (pusher!=this) && ! CanPush(pusher->GetType())) return false; if (AsRoundObject) { square* sq=RoundAdvance(this,dir,x,y); if (sq!=NULL) { move(sq->sqx,sq->sqy); return true; } } switch(dir) { case(D_UP): dy++; break; case(D_DOWN): dy--; break; case(D_RIGHT): dx++; break; case(D_LEFT): dx--; break; } if ((dx!=0) || (dy!=0)) { dx=x+dx; dy=y+dy; dx=(dx>=XYE_HORZ?0:(dx<0?XYE_HORZ-1:dx) ); dy=(dy>=XYE_VERT?0:(dy<0?XYE_VERT-1:dy) ); square * sq=game::Square(dx,dy); obj* inobj=sq->object; teleport* tele;dangerous* blck; if (inobj!=NULL) { switch (inobj->GetType()) { case(OT_TELEPORT): //It was a teleport! tele=static_cast(inobj); char nx,ny; if (tele->tryteleport(dir, this, nx, ny ,blck,NULL)) { sq=game::Square(nx,ny); dx=nx; dy=ny; inobj=sq->object; } else if (blck!=NULL) { if (blck->Busy(this)) return false; else { //Kill The object if (died!=NULL) *died=true; blck->Eat(); Kill(blck->GetType()==OT_BLACKHOLE); //Died because of a blackhole return true; } } break; case(OT_BLACKHOLE): case(OT_MINE): case(OT_FIREBALL): blck=static_cast(inobj); if (blck->Busy(this)) return false; else if((inobj->GetType()==OT_MINE) && (ObjectResistsFire(this) ) ) { blck->Kill(); game::SmallBoom(game::Square(dx,dy),false,x-dx,dy-y); inobj=NULL; //move(dx,dy); //return true; } else { //Kill The object if (died!=NULL) *died=true; blck->Eat(); Kill(blck->GetType()==OT_BLACKHOLE); //Died because of a blackhole return true; } break; } } if ((inobj==NULL) && ((sq->gobject==NULL) || sq->gobject->CanEnter(this,dir) ) ) { move(dx,dy); return true; } } return false; } bool FindMagnetic(square* sq, bool rSticky, bool rHorz, magnetic* &mg, bool ds=false, edir rd=D_DOWN) { obj *object=sq->object; if (! magnetic::IsInstance(object) ) return false; mg= static_cast(object); if (mg->IsHorizontal()!=rHorz) return false; if (ds && (rSticky) ) return (mg->IsSticky(rd)); return (mg->IsSticky()==rSticky); } bool SpotAffectedByAMagnetic_Sub(obj* forObject,edir dir, char mx, char my, char ox, char oy, bool rSticky, bool rHorz) { magnetic* mg=NULL; if (! FindMagnetic(game::SquareN(mx,my),rSticky,rHorz,mg,true,dir)) return false; square *sq= game::SquareN(ox,oy); if (sq->object!=NULL) return false; gobj* gobject= sq->gobject; return ((gobject==NULL) || (gobject->CanEnter(forObject,dir))); } bool SpotAffectedByAMagnetic(obj* forObject, char x, char y) { char nx, ny; magnetic* mg=NULL; //First the obvious if (FindMagnetic(game::SquareN(x+1,y),true,true,mg)) return true; if (FindMagnetic(game::SquareN(x,y+1),true,false,mg)) return true; if (FindMagnetic(game::SquareN(x-1,y),true,true,mg)) return true; if (FindMagnetic(game::SquareN(x,y-1),true,false,mg)) return true; //Now the non obvious: if (SpotAffectedByAMagnetic_Sub(forObject,D_RIGHT,x+2,y,x+1,y,true,true)) return true; if (SpotAffectedByAMagnetic_Sub(forObject,D_LEFT,x-2,y,x-1,y,true,true)) return true; if (SpotAffectedByAMagnetic_Sub(forObject,D_UP,x,y+2,x,y+1,true,false)) return true; if (SpotAffectedByAMagnetic_Sub(forObject,D_DOWN,x,y-2,x,y-1,true,false)) return true; //Nothing found yet, return false return false; } bool SpotGetAntiStickies(char x, char y,bool &up, bool &dw, bool &lf, bool &rg) { magnetic* mg; up=(FindMagnetic(game::SquareN(x,y+1),false,false,mg)); dw=(FindMagnetic(game::SquareN(x,y-1),false,false,mg)); lf=(FindMagnetic(game::SquareN(x-1,y),false,true,mg)); rg=(FindMagnetic(game::SquareN(x+1,y),false,true,mg)); return (up || dw || lf || rg); } bool SpotDirectionAllowedByMagnetics(obj* forObject, char x, char y, edir dir, bool up, bool dw, bool lf, bool rg) { square* sq; bool r; switch(dir) { case (D_LEFT): case (D_RIGHT): if (dir==D_LEFT) r=(! lf); else r= (! rg); if (dw) { sq=game::SquareN(x,y+1); r=r && (sq->object!=forObject) && (! Allowed(forObject,D_UP,sq)); } if (up) { sq=game::SquareN(x,y-1); r=r && (sq->object!=forObject) && (! Allowed(forObject,D_DOWN,sq)); } return (r); default: //up or down: if (dir==D_UP) r=(! up); else r= (! dw); if (lf) { sq=game::SquareN(x+1,y); r=r && (sq->object!=forObject) && (! Allowed(forObject,D_RIGHT,sq)); } if (rg) { sq=game::SquareN(x-1,y); r=r && (sq->object!=forObject) && (! Allowed(forObject,D_LEFT,sq)); } return (r); } return true; } bool obj::Magnetism(char ox, char oy, char mx, char my, bool rSticky, bool rHorz, edir godir) { magnetic *mg; if (! FindMagnetic(game::SquareN(mx,my),rSticky,rHorz,mg,true,godir) ) return false; //Square didn't have the magnetic we want. //We have found a valid magnetic block, let's see if it is possible to move the object to // the desired point. return trypush(godir,mg); } bool obj::DoMagnetism(bool horz, bool vert, bool *Moved) { *Moved=true; if (horz) { // #->][ if (Magnetism(x+1,y,x+2,y,true,true, D_RIGHT)) return true; // ][<-# if (Magnetism(x-1,y,x-2,y,true,true, D_LEFT)) return true; // <-#][ if (Magnetism(x-1,y,x+1,y,false,true, D_LEFT)) return true; // ][#-> if (Magnetism(x+1,y,x-1,y,false,true, D_RIGHT)) return true; } if (vert) { // ][ // /\ // # if (Magnetism(x,y+1,x,y+2,true,false, D_UP)) return true; // # // \/ // ][ if (Magnetism(x,y-1,x,y-2,true,false, D_DOWN)) return true; // /\ // # // ][ if (Magnetism(x,y+1,x,y-1,false,false, D_UP)) return true; // ][ // # // \/ if (Magnetism(x,y-1,x,y+1,false,false, D_DOWN)) return true; } //Now check if a sticky magnetic is holding our object: magnetic *mg; *Moved=false; if (horz) { if (FindMagnetic(game::SquareN(x+1,y),true,true,mg)) return true; if (FindMagnetic(game::SquareN(x-1,y),true,true,mg)) return true; } if (vert) { if (FindMagnetic(game::SquareN(x,y+1),true,false,mg)) return true; if (FindMagnetic(game::SquareN(x,y-1),true,false,mg)) return true; } return false; } struct AIList { unsigned char x; unsigned char y; signed char firstStep; unsigned int steps; AIList* next; }; bool obj::GoFindXye(edir res[], int &resn, bool &foundpath, bool ignoreloopingedge, bool ignoreSp, bool considerTeleports, bool considerStickies, unsigned int range, bool Randomize ) { return GoFindASquare(IsXyeAt,res,resn,foundpath,ignoreloopingedge,ignoreSp,considerTeleports,considerStickies,range, Randomize ); } bool obj::GoFindASquare(bool (*cond)(square* sq), edir res[], int &resn, bool &foundpath, bool ignoreloopingedge, bool ignoreSp, bool considerTeleports, bool considerStickies, unsigned int range, bool Randomize ) { signed char gox[4]={1,-1,0,0}; signed char goy[4]={0,0,1,-1}; bool allow[4]={false,false,false,false}; edir godir[4]= { D_RIGHT, D_LEFT, D_UP, D_DOWN }; bool go; bool halt=false, ret=false; bool savemem=true; char i,j; char tx,ty,cx,cy,nx,ny; char step; unsigned int stepsNumber; unsigned int place=(x*XYE_VERT+y); sqMem::reset(true); //Used by anti anti-sticky block AI: bool up,dw,lf,rg,AntiStickyRisk=false; if (Randomize) //"Randomize" arrays: for (i=0;i<3;i++) { j=(signed char)(i + (place% (4-i)) ); if (i!=j) { signed char aux=gox[i]; //swap: gox[i]=gox[j]; gox[j]=aux; aux=goy[i]; goy[i]=goy[j]; goy[j]=aux; edir daux=godir[i]; godir[i]=godir[j]; godir[j]=daux; } } AIList *tm= new AIList,*curr, *next, *end; obj *object;gobj *gobject; teleport *tele; otype ot; sqMem::mem[x][y]=false; square* sq; tm->x=x; tm->y=y; tm->firstStep=-1; tm->steps=0; tm->next=NULL; end=next=tm; bool able; do { curr=next; cx=curr->x; cy=curr->y; stepsNumber=curr->steps+1; //explosion * ex= new explosion(GM->SquareN(cx,cy)); step= curr->firstStep; AntiStickyRisk=( (considerStickies) && SpotGetAntiStickies(cx,cy,up,dw,lf,rg) ); for (i=0;((i<4) && (! halt) ) ;i++) if ((! AntiStickyRisk) || (SpotDirectionAllowedByMagnetics(this,cx,cy,godir[i],up,dw,lf,rg)) ) { //Save test x and y tx=cx+gox[i];ty=cy+goy[i]; savemem=true; go=true; if (! ignoreloopingedge) { //Consider looping edges: tx=tx>=XYE_HORZ?0:(tx<0?XYE_HORZ-1:tx); ty=ty>=XYE_VERT?0:(ty<0?XYE_VERT-1:ty); } else if (( tx>=XYE_HORZ) || (tx<0) || (ty>=XYE_VERT) || (ty<0)) { go =false; } if (go) { sq=game::Square(tx,ty); go=sqMem::mem[tx][ty]; } if (go) { object=sq->object; go=(object==NULL); if (! go) { ot=object->GetType(); if (cond(sq)) { go=true; } else switch(ot) { case(OT_BLACKHOLE): case(OT_MINE): case(OT_FIREBALL): go=ignoreSp; break; case(OT_TELEPORT): //Found a teleport if (ignoreSp || considerTeleports) { savemem=false; tele=static_cast(object); if (tele->dir==Opposite(godir[i]) ) { //Possible to go through the teleport! if (ignoreSp) go=true; // Will try to go there else { go=tele->FindCleanExit(this, nx, ny, true); if (go) { go= sqMem::mem[nx][ny]; sq=game::Square(nx,ny); sqMem::mem[tx][ty]=false; //So we don't test the teleport entrance again tx=nx; ty=ny; sqMem::mem[tx][ty]=false; //So we don't test the teleport exit again } } } } } } if (go) { gobject=sq->gobject; go= ((gobject==NULL) || ((gobject->CanEnter(this,godir[i])) && ( (!pit::IsEnabledInstance(gobject)) || (! pit::CanConsume(this) ) ) ) ); //everything dislikes pits } } //begin sticky check: if (go && considerStickies) go= ((cond(sq)) || (! SpotAffectedByAMagnetic(this,tx,ty) )); if (go) { if (cond(sq)) { //We found a correct one! if (step<0) //Xye was just in front of the object, do nothing res[0]=godir[i]; else res[0]=godir[step]; halt=true; ret=true; } else if ((range==0) || (stepsNumber<=range)) { if (savemem) sqMem::mem[tx][ty]=false; //So we don't go here anymore. //Add the point to the list: tm= new AIList; tm->next=NULL; tm->steps=stepsNumber; if (step<0) //First point in that direction { allow[i]=true; //In case there is no path found, this will help the random decision //know which direction is allowed; tm->firstStep=i; } else tm->firstStep= step; tm->x=tx; tm->y=ty; //Make it the new end: end->next=tm; end=tm; } } else if ( ((tx>=0) && (tx=0) && (tynext; delete curr; } while (next!=NULL); if (! ret) { if (considerStickies) { //soon, make it check if those place are actually safe instead of just halting //The only danger are green stickies. for (i=0;i<4;i++) if (allow[i]) { tx=cx+gox[i];ty=cy+goy[i]; tx=tx>=XYE_HORZ?0:(tx<0?XYE_HORZ-1:tx); ty=ty>=XYE_VERT?0:(ty<0?XYE_VERT-1:ty); allow[i] = (! SpotGetAntiStickies(tx,ty,up,dw,lf,rg)); } } //Choose a random, valid direction. ret=allow[0]; i=1; while ((! ret) && (i<4)) { ret=allow[i]; i++; } resn=0; if (ret) for (i=0;i<4;i++) if (allow[i]) { res[resn++]=godir[i]; } foundpath=false; } else { foundpath=true; resn=1; } return(ret); } bool obj::AffectedByMagnetism(bool horz) { switch(type) { case(OT_XYE): case(OT_ROBOXYE): case(OT_WALL): case(OT_EARTH): case(OT_AUTO): case(OT_BLACKHOLE): case(OT_GEM): case(OT_FILLER): case(OT_SNIPER): case(OT_RATTLER): case(OT_RATTLERNODE): return false; case(OT_WINDOW): return windowblock::CanMove(static_cast(this)); case(OT_MAGNETIC): magnetic* mg=static_cast(this); return (mg->IsHorizontal()!=horz); } return true; } /**End Class Object**/ /**Class Ground Object**/ char gobj::X() { return x; } char gobj::Y() { return y; } void gobj::GObjectConstruct(square* sq) { id=game::NewId(); x=sq->sqx;y=sq->sqy; sq->gobject=this; RenderAfterObjects=false; if (sq->object!=NULL) OnEnter(sq->object); } void gobj::move(char px,char py) { game::Square(x,y)->gobject=NULL; x=px; y=py; game::Square(x,y)->gobject=this; } void gobj::Kill() { //UpdateSquare(); square* sq=game::Square(x,y); sq->Update=true; sq->gobject=NULL; OnDeath(); delete this; } /**End Class Ground Object**/ /**Class xye**/ bool xye::useDirectionSprites = false; void InitRoundRandom(int w, int z); xye::xye(square* sq) { alpha=255; lives=4; type=OT_XYE; checkpoint=sq; deadtic=0; moved=false; ObjectConstruct(sq); InitRoundRandom(checkpoint->sqx, checkpoint->sqy); } void xye::Draw(unsigned int x, unsigned int y) { if (lives>0) { Uint8 tx=0,ty=0; if(moved && xye::useDirectionSprites) switch(lastdir) { case D_UP: tx=9,ty=19; break; case D_DOWN: tx=7,ty=19; break; case D_LEFT: tx=8,ty=19; break; case D_RIGHT: tx=6,ty=19; break; } Drawer D(game::sprites,tx*sz,ty*sz,sz,sz); D.SetColors( &game::PlayerColor,alpha); if (alpha<255) alpha = (alpha<=223)?alpha+32:255; D.Draw(game::screen,x,y); } } inline bool xye::trypush(edir dir,obj* pusher) { if (pusher->GetType()==OT_ROBOXYE) return game::TryMoveXye(dir); return false; } inline bool xye::HasRoundCorner(roundcorner rnc) { return false; } inline unsigned char xye::GetLives() { return(lives); } void xye::SetLives(unsigned char nlives) { if (nlives==0) { game::TerminateGame(); } lives=nlives; } inline void xye::SetCheckPoint(square* sq) { checkpoint=sq; } void xye::GetCheckPoint(char &cx, char &cy) { cx=checkpoint->sqx; cy=checkpoint->sqy; } inline bool xye::HasBlockColor(blockcolor bc) { return false; } void xye::Kill() { if(!lives) return; unsigned int counter=game::Counter(); if (counter!=deadtic) { deadtic=counter; if (lives>1) { lives--; game::deathsq1=game::Square(x,y); char cx,cy,nx,ny; GetCheckPoint(cx,cy); if (game::GetRevivePoint(cx,cy,nx,ny)) { move(nx,ny); alpha = 0; } else { game::deathsq1=game::Square(x,y); lives=0; game::TerminateGame(); square* sq=game::Square(x,y); gobj *gobject = sq->gobject; if (gobject!=NULL) gobject->OnLeave(this); sq->object=NULL; recycle::add(this); dialogs::makeMessageDialog(gamewindow, "No space left to spawn Xye.", "Ok" , onDialogClickDoNothing); return; } game::FlashXyePosition(); } else { game::deathsq1=game::Square(x,y); lives=0; game::TerminateGame(); square* sq=game::Square(x,y); gobj *gobject = sq->gobject; if (gobject!=NULL) gobject->OnLeave(this); sq->object=NULL; recycle::add(this); } } } /**End class xye**/ /**Class Robo- xye**/ roboxye::roboxye(square* sq) { anim = GetRandomInt(0,2); type=OT_ROBOXYE; ObjectConstruct(sq); } void roboxye::Draw(unsigned int x,unsigned int y) { Drawer D(game::sprites,3*sz,anim*sz,sz,sz); D.Draw(game::screen,x,y); } inline bool roboxye::trypush(edir dir,obj* pusher) { if (pusher->GetType()==OT_XYE) return trypush_common(dir,pusher, false,NULL); return (false); } inline bool roboxye::HasRoundCorner(roundcorner rnc) { return false; } inline bool roboxye::HasBlockColor(blockcolor bc) { return false; } bool roboxye::Loop(bool* died) { UpdateSquare(); //One of the few objects that are always drawn *died=false; bool Moved=false; bool pushed=false; bool go=false; //unsigned int ClockTic=GM->Counter(); if (game::AllowRoboXyeMovement()) { anim = (anim+GetRandomInt(1,2)) % 3; edir D[4]= { D_UP, D_DOWN, D_LEFT, D_RIGHT }; unsigned char DN=4,i,j; char XYEx=game::XYE->X(); bool prihorz=game::LastMoveWasHorizontal(); char XYEy=game::XYE->Y(); edir fac; while (PickDirectDir(fac,D,DN,x,y,XYEx,XYEy,true,prihorz)) { go=false; //if (DoMagnetism(true,true,&Moved)) return Moved; char dx=x,dy=y; switch(fac) { case(D_UP): dy++;break; case(D_DOWN): dy--;break; case(D_RIGHT): dx++;break; default: dx--; } dx=(dx>=XYE_HORZ?0:(dx<0?XYE_HORZ-1:dx)); dy=(dy>=XYE_VERT?0:(dy<0?XYE_VERT-1:dy)); square* sq=game::Square(dx,dy); obj* object=sq->object; teleport* tele; dangerous* blck; char nx=0,ny=0; if (object==NULL) go=true; else { switch (object->GetType()) { case(OT_TELEPORT): tele=static_cast(object); go = tele->tryteleport(fac, this, nx, ny ,blck, &pushed); if (go) { dx=nx; dy=ny;sq=game::Square(dx,dy); object=sq->object; } else if (blck!=NULL) { if (blck->Busy(this)) go=false; else { //Kill The Bot blck->Eat(); Kill(blck->GetType()==OT_BLACKHOLE); //because of a blackhole *died=true; return true; } } break; case(OT_BLACKHOLE): case(OT_MINE): case(OT_FIREBALL): blck=static_cast(object); if (blck->Busy(this)) go=false; else { //Kill The impacter blck->Eat(); Kill(blck->GetType()==OT_BLACKHOLE); //because of a blackhole *died=true; return true; } break; } if (! go) { if (object==NULL) go=true; else if (object->trypush(fac,this)) { go=true; pushed=true; } } } if (go) { gobj* gobject=sq->gobject; if ((gobject==NULL) || (gobject->CanEnter(this,fac))) { move(dx,dy); break; } } if (pushed) break; //It actually pushed an object, but couldn't go because of a ground object. //Remove failed dir from the array then try again. j=DN; DN=0; for (i=0;i(x,255); c = (Uint8)(x); } } void wall::ChangeColor(Uint8 nR, Uint8 nG, Uint8 nB, bool multiply) { if(multiply) { wall_multiplyColor( options::WallColor[kind].r, nR, R); wall_multiplyColor( options::WallColor[kind].g, nG, G); wall_multiplyColor( options::WallColor[kind].b, nB, B); } else { wall_convertColor( options::WallSpriteColor[kind].r, nR, R); wall_convertColor( options::WallSpriteColor[kind].g, nG, G); wall_convertColor( options::WallSpriteColor[kind].b, nB, B); } } void wall::SetDefaultColor(SDL_Color cc, bool multiply, int var) { if(multiply) { wall_multiplyColor( options::WallColor[var].r, cc.r, DefaultColor[var].r); wall_multiplyColor( options::WallColor[var].g, cc.g, DefaultColor[var].g); wall_multiplyColor( options::WallColor[var].b, cc.b, DefaultColor[var].b); } else { wall_convertColor( options::WallSpriteColor[var].r, cc.r, DefaultColor[var].r); wall_convertColor( options::WallSpriteColor[var].g, cc.g, DefaultColor[var].g); wall_convertColor( options::WallSpriteColor[var].b, cc.b, DefaultColor[var].b); } RecolorCache::savecolor(&DefaultColor[var]); } void wall::SetDefaultColor(SDL_Color cc, bool multiply) { SetDefaultColor(cc,multiply, 0); for (int i=1;i=MAX_VARIATIONS? 0:def<0?0:def; } wall::wall(square* sq,unsigned char t) { round7=round1=round3=round9=false; type=OT_WALL; if(t>=MAX_VARIATIONS) t=0; ChangeKind(t); R=DefaultColor[t].r; G=DefaultColor[t].g; B=DefaultColor[t].b; ObjectConstruct(sq); } wall::wall(square* sq) { round7=round1=round3=round9=false; type=OT_WALL; kind=defkind; R=DefaultColor[defkind].r; G=DefaultColor[defkind].g; B=DefaultColor[defkind].b; ObjectConstruct(sq); } void wall::ChangeKind(unsigned char t) { kind=t; if(kind>=MAX_VARIATIONS) kind=0; R=DefaultColor[kind].r; G=DefaultColor[kind].g; B=DefaultColor[kind].b; } bool wall::containsRoundCorner() { return (round1||round7||round9||round3); } void wall::Draw(unsigned int x, unsigned int y) { Drawer D(game::sprites,0,0,0,0); int sz2=sz/2; Sint16 ty; ty=sz*(kind); D.SetColors(R,G,B,255); char px=this->x, py=this->y; char rx=px+1, lx=px-1, uy=py+1, dy=py-1; if(rx>=XYE_HORZ) rx=0; if(uy>=XYE_VERT) uy=0; if(lx<0) lx=XYE_HORZ-1; if(dy<0) dy=XYE_VERT-1; bool up = (find( px, uy, kind)!=NULL); bool down = (find( px, dy, kind)!=NULL); bool left = (find( lx, py, kind)!=NULL); bool right = (find( rx, py, kind)!=NULL); bool upright = find(rx,uy,kind); bool downright =find(rx,dy,kind); bool upleft = find(lx,uy,kind); bool downleft = find(lx,dy,kind); up = up && !round7 && !round9; down = down && !round1 && !round3; right = right && !round9 && !round3; left = left && !round7 && !round1; bool inborder = (!left||!up||!right||!down); if( !inborder && (!upright || !upleft || !downright ||!downleft) ) { /*inborder = !( find( px, uy, kind)->containsRoundCorner() || find( px, dy, kind)->containsRoundCorner() || find( lx, py, kind)->containsRoundCorner() || find( rx, py, kind)->containsRoundCorner() );*/ inborder=true; } if (round7) D.ChangeRect(10*sz,ty,sz2,sz2); else if( up && left && !inborder) D.ChangeRect(15*sz,ty,sz2,sz2); else if(up&&left&&upleft) D.ChangeRect(14*sz,ty,sz2,sz2); else if(up&&left) D.ChangeRect(13*sz,ty,sz2,sz2); else if ( up) D.ChangeRect(12*sz,ty,sz2,sz2); else if ( left) D.ChangeRect(11*sz,ty,sz2,sz2); else D.ChangeRect(9*sz,ty,sz2,sz2); D.Draw(game::screen,x,y); if (round9) D.ChangeRect(21*sz2,ty,sz2,sz2); else if( up && right && !inborder) D.ChangeRect(15*sz+sz2,ty,sz2,sz2); else if(up&&right&&upright) D.ChangeRect(14*sz+sz2,ty,sz2,sz2); else if(up&&right) D.ChangeRect(13*sz+sz2,ty,sz2,sz2); else if ( up) D.ChangeRect(12*sz+sz2,ty,sz2,sz2); else if ( right) D.ChangeRect(11*sz+sz2,ty,sz2,sz2); else D.ChangeRect(19*sz2,ty,sz2,sz2); //D.SetColors(255,255,255,50); D.Draw(game::screen,x+sz2,y); //D.SetColors(255,255,255,255); if (round1) D.ChangeRect(10*sz,ty+sz2,sz2,sz2); else if( down && left && !inborder) D.ChangeRect(15*sz,ty+sz2,sz2,sz2); else if(down&&left&&downleft) D.ChangeRect(14*sz,ty+sz2,sz2,sz2); else if(down&&left) D.ChangeRect(13*sz,ty+sz2,sz2,sz2); else if ( down) D.ChangeRect(12*sz,ty+sz2,sz2,sz2); else if ( left) D.ChangeRect(11*sz,ty+sz2,sz2,sz2); else D.ChangeRect(9*sz,ty+sz2,sz2,sz2); D.Draw(game::screen,x,y+sz2); if (round3) D.ChangeRect(21*sz2,ty+sz2,sz2,sz2); else if( down && right && !inborder) D.ChangeRect(15*sz+sz2,ty+sz2,sz2,sz2); else if(down&&right&&downright) D.ChangeRect(14*sz+sz2,ty+sz2,sz2,sz2); else if(down&&right) D.ChangeRect(13*sz+sz2,ty+sz2,sz2,sz2); else if ( down) D.ChangeRect(12*sz+sz2,ty+sz2,sz2,sz2); else if ( right) D.ChangeRect(11*sz+sz2,ty+sz2,sz2,sz2); else D.ChangeRect(19*sz2,ty+sz2,sz2,sz2); D.Draw(game::screen,x+sz2,y+sz2); } bool wall::Loop(bool* died) { *died=false; return true; } bool wall::trypush(edir dir,obj* pusher) { return false; } wall* wall::find(char sx, char sy, unsigned char kind) { square *sq=game::SquareN(sx,sy); obj* object; if (( object=sq->object) && (object->GetType()==OT_WALL)) { wall* wl = static_cast(object); if( (kind==6) || (wl->kind==6) || (wl->kind==kind)) return (wl); } return(NULL); } void wall::IntelligentUpdateCorners(wall* by) { switch(PickDirectDir(x,y,by->X(),by->Y(),true,true)) { case(D_DOWN): round1=round3=false; break; case(D_LEFT): round1=round7=false; break; case(D_RIGHT): round3=round9=false; break; default: round7=round9=false; break; } UpdateSquare(); } void wall::SetRoundCorners(bool r7, bool r1, bool r3, bool r9) { round7=r7; round1=r1; round3=r3; round9=r9; } bool wall::HasRoundCorner(roundcorner rnc) { switch(rnc) { case(RC_1): return round1; case(RC_3): return round3; case(RC_7): return round7; } return round9; } inline bool wall::HasBlockColor(blockcolor bc) { return false; } inline bool wall::ResistsFire() { if(kind==6) return false; return (kind>3); } /**End class wall**/ unsigned int BC2Color(blockcolor bc) { switch(bc) { case(B_YELLOW): return(0xFFFFFF00); case(B_RED): return(0xFFFF0000); case(B_BLUE): return(0xFF0000FF); default: return(0xFF00AA00); } } unsigned int BC2FColor(blockcolor bc) { switch(bc) { case(B_YELLOW): return(0xFFFF0000); case(B_RED): return(0xFFFFFF00); case(B_BLUE): return(0xFF00FFFF); default: return(0xFFFFFFFF); } } /** General Stuff (Round alg)**/ Uint32 round_random_w = 452; Uint32 round_random_z = 777; void InitRoundRandom(int w, int z) { round_random_w = w; round_random_z = z; } Uint32 GetRandom32() { round_random_z = 36969 * (round_random_z & 65535) + (round_random_z >> 16); round_random_w = 18000 * (round_random_w & 65535) + (round_random_w >> 16); return (round_random_z << 16) + round_random_w; /* 32-bit result */ } square* RoundAvance_Sub(obj* ToMove, edir dir,char wx, char wy, roundcorner rca, edir adir, char ax1, char ay1, char ax2, char ay2, roundcorner rcb, edir bdir, char bx1, char by1, char bx2, char by2) { //HGE* hge=game::hge; square* osq; obj* object; gobj* gobject; square *sq11,*sq12,*sq21,*sq22; bool a,b; osq=game::SquareN(wx,wy); if (Allowed(ToMove,dir,osq)) return osq; object=osq->object; if (! object) return NULL; a = object->HasRoundCorner(rca); if (a) { sq11=game::SquareN(ax1,ay1); sq12=game::SquareN(ax2,ay2); a= (Allowed(ToMove,adir,sq11) && Allowed(ToMove,dir,sq12) ); } b = object->HasRoundCorner(rcb); if (b) { sq21=game::SquareN(bx1,by1); sq22=game::SquareN(bx2,by2); b= (Allowed(ToMove,bdir,sq21) && Allowed(ToMove,dir,sq22) ); } if (a && b) { int x = (GetRandom32()+game::Counter()+ax1*XYE_VERT+ay1)%120; if ( x<60 ) { return sq12; } else { return sq22; } } else if (a) { return sq12; } else if (b) { return sq22; } else { return NULL; } } square* RoundAdvance(obj* ToMove,edir dir,char i, char j) { //HGE* hge=game::hge; square* osq; obj* object; gobj* gobject; square *sq11,*sq12,*sq21,*sq22; bool a=false,b=false; switch(dir) { //RoundAvance_Sub does all the checks for us case(D_UP): return RoundAvance_Sub(ToMove,D_UP,i,j+1, RC_1,D_LEFT,i-1,j,i-1,j+1, RC_3,D_RIGHT,i+1,j,i+1,j+1); case(D_DOWN): return RoundAvance_Sub(ToMove,D_DOWN,i,j-1, RC_7,D_LEFT,i-1,j,i-1,j-1, RC_9,D_RIGHT,i+1,j,i+1,j-1); case(D_LEFT): return RoundAvance_Sub(ToMove,D_LEFT,i-1,j, RC_9,D_UP ,i ,j+1,i-1,j+1, RC_3,D_DOWN,i ,j-1,i-1,j-1); } /*D_RIGHT*/ return RoundAvance_Sub(ToMove,D_RIGHT,i+1,j, RC_7,D_UP ,i ,j+1,i+1,j+1, RC_1,D_DOWN,i ,j-1,i+1,j-1); } /**(Round alg end)**/ /**Start Class Block**/ block::block(square* sq,blockcolor tc,bool makeround) { round=makeround; type=OT_BLOCK; c=tc; colorless=false; ObjectConstruct(sq); } void block::Draw(unsigned int x, unsigned int y,bool colorless, blockcolor c, bool round) { Drawer D(game::sprites,0, 0 ,0,0); if (round) D.ChangeRect(game::GRIDSIZE*2 , 0 , game::GRIDSIZE, game::GRIDSIZE); else D.ChangeRect(game::GRIDSIZE , 0 , game::GRIDSIZE, game::GRIDSIZE); if (! colorless) { D.SetColors( &(options::BKColor[c]),255); } else { D.SetColors( &(options::BKColor[5]),255); } D.Draw(game::screen,x,y); } void block::Draw(unsigned int x, unsigned int y) { Draw(x,y,colorless,c,round); } bool block::trypush(edir dir,obj* pusher) { return trypush_common(dir,pusher, round,NULL); } bool block::HasRoundCorner(roundcorner rnc) { return round; } bool block::Loop(bool* died) { *died=false; bool Moved=false; if (DoMagnetism(true,true,&Moved)) return Moved; edir go; return false; } inline bool block::HasBlockColor(blockcolor bc) { return ((! colorless) && (c==bc)); } /**End Class Block**/ /**Start Class Large Block**/ largeblock::largeblock(square* sq,blockcolor tc, bool up, bool right, bool down, bool left ) { type=OT_LARGEBLOCK; c=tc; colorless=false; ObjectConstruct(sq); flags = (up<<1)|(right<<3)|(down<<5)|(left<<7) ; root = NULL; } void largeblock::Draw(unsigned int x, unsigned int y) { Uint8 tx,ty; Uint8 sz2 = sz>>1; //flags = 0b1101; Uint8 up = (flags>>1)&1; Uint8 right = (flags>>3)&1; Uint8 down = (flags>>5)&1; Uint8 left = (flags>>7)&1; Uint8 upleft = (flags>>0)&1; Uint8 upright = (flags>>2)&1; Uint8 downright = (flags>>4)&1; Uint8 downleft = (flags>>6)&1; //top left corner: Uint8 var = 0; if( up&&left&&upleft) var=4; else if( up&&left) var = 3; else if(up) var = 2; else if(left) var = 1; tx = 10; ty = var + 15; Drawer D(game::sprites, tx*sz, ty*sz,sz2,sz2); Uint8 alpha = 255; if(! colorless) { D.SetColors(&options::BKColor[(int)(c)],alpha); } else { D.SetColors(&options::BKColor[5],alpha); } D.Draw(game::screen,x,y); //top right corner: var = 0; if( up&&right&&upright) var=4; else if( up&&right) var = 3; else if(up) var = 2; else if(right) var = 1; tx = 10; ty = var + 15; D.ChangeRect(tx*sz+sz2, ty*sz, sz2,sz2); D.Draw(game::screen,x+sz2,y); //bottom left corner: var = 0; if( down&&left&&downleft) var=4; else if( down&&left) var = 3; else if(down) var = 2; else if(left) var = 1; tx = 10; ty = var + 15; D.ChangeRect(tx*sz, ty*sz + sz2,sz2,sz2); D.Draw(game::screen,x,y+sz2); //bottom right corner: var = 0; if( down&&right&& downright) var=4; else if( down&&right) var = 3; else if(down) var = 2; else if(right) var = 1; tx = 10; ty = var + 15; D.ChangeRect(tx*sz+sz2, ty*sz +sz2, sz2,sz2); D.Draw(game::screen,x+sz2,y+sz2); } inline bool largeblock::HasRoundCorner(roundcorner rnc) { return false; } #include #include using std::cout; using std::endl; std::queue foundLargeBlocks; void largeblock::blockDFS( largeblockroot* aroot) { if( root != NULL) return; root = aroot; root->children ++; foundLargeBlocks.push(this); int dy[4] = {1,0,-1,0}; int dx[4] = {0,1,0,-1}; int dd[4] = {1,3,5,7}; int dr[4] = {5,7,1,3}; for (int i=0; i<4; i++) { int nx = x+dx[i], ny=y+dy[i]; if(nx<0) nx = XYE_HORZ-1; if(ny<0) ny = XYE_VERT-1; if(ny>=XYE_VERT) ny = 0; if(nx>=XYE_HORZ) nx = 0; square* sq= game::Square(nx,ny); obj* ob = sq->object; if( (ob == NULL) || (ob->GetType() != OT_LARGEBLOCK) ) continue; largeblock* lb = static_cast(ob); Uint8 nflags = lb->flags; if( ( (flags&(1<colorless==colorless) && (lb->c == c) ) ) { lb->blockDFS(root); } } } void largeblock::setupBlock() { largeblockroot* troot = new largeblockroot(); troot->children =0; blockDFS(troot); while( !foundLargeBlocks.empty() ) { largeblock* lb = foundLargeBlocks.front(); foundLargeBlocks.pop(); int x= lb->x, y=lb->y; game::Square(x,y)->Update=true; int dy[8] = { 1,1,1,0,-1,-1,-1, 0}; int dx[8] = {-1,0,1,1, 1, 0,-1,-1}; lb->flags = 0; for (int i=0;i<8; i++) { int nx = x+dx[i], ny=y+dy[i]; if(nx<0) nx = XYE_HORZ-1; if(ny<0) ny = XYE_VERT-1; if(ny>=XYE_VERT) ny = 0; if(nx>=XYE_HORZ) nx = 0; square* sq= game::Square(nx,ny); obj* ob = sq->object; if( (ob == NULL) || (ob->GetType() != OT_LARGEBLOCK) ) continue; largeblock* lb2 = static_cast(ob); if( (lb->root == lb2->root) && ( (lb2->colorless==lb->colorless) && (lb->c == lb2->c) ) ) { lb->flags |= (1<GetType() != OT_LARGEBLOCK) return NULL; largeblock* lb = static_cast(object); if (lb->root == root) return lb; return NULL; } bool largeblock::pushingBlocks(edir dir, int ix, int x0, int x1, int iy, int y0, int y1, int dx ,int dy) { bool doable = true; for (int i=x0; (i-ix!= x1) && doable; i+=ix) for (int j=y0; (j-iy!=y1) && doable ; j+=iy) { largeblock * lb = getPart( game::Square(i,j)->object, root); if(lb==NULL) continue; gobj* gobject = game::Square(i,j)->gobject; if( (gobject!=NULL) && (! gobject->CanLeave(lb, dir)) ) doable=false; if(lb->tic == game::Counter()) doable=false; Sint8 nx = lb->x + dx, ny = lb->y + dy; /*if(nx<0) nx=XYE_HORZ-1; if(ny<0) ny=XYE_VERT-1; if(nx>=XYE_HORZ) nx = 0; if(ny>=XYE_VERT) ny = 0;*/ if(nx<0) doable=false; if(ny<0) doable=false; if(nx>=XYE_HORZ) doable=false; if(ny>=XYE_VERT) doable=false; if(! doable) break; obj * object = game::Square(nx,ny)->object; if( (object!=NULL) && (getPart(object,root)==NULL) ) doable=false; gobject = game::Square(nx,ny)->gobject; if( (gobject!=NULL) && (! gobject->CanEnter(lb, dir)) ) doable=false; } if(! doable) return false; for (int i=x0; i-ix!= x1; i+=ix) for (int j=y0; j-iy!=y1; j+=iy) { largeblock * lb = getPart( game::Square(i,j)->object, root); if(lb==NULL) continue; if(lb->tic == game::Counter() ) continue; Sint8 nx = lb->x + dx, ny = lb->y + dy; if(nx<0) nx=XYE_HORZ-1; if(ny<0) ny=XYE_VERT-1; if(nx>=XYE_HORZ) nx = 0; if(ny>=XYE_VERT) ny = 0; lb->move(nx,ny); lb->tic = game::Counter() ; } return true; } largeblock* largeblock_pushgroup[XYE_HORZ*XYE_VERT]; int largeblock_pushn = 0; largeblock* largeblock_stack[XYE_HORZ*XYE_VERT]; int largeblock_stackn = 0; void largeblock::getPushGroup() { char checked[XYE_HORZ][XYE_VERT] = {}; largeblock_pushn = 0; largeblock_stackn=1; largeblock_stack[0]= this; checked[x][y]=1; while(largeblock_stackn>0) { largeblock* lb = largeblock_stack[--largeblock_stackn]; largeblock_pushgroup[ largeblock_pushn++] = lb; int x=lb->x, y=lb->y; int dx[4]={0,0,1,-1}; int dy[4]={-1,1,0,0}; for (int d=0; d<4; d++) { int nx=dx[d]+x, ny=dy[d]+y; if(nx<0) nx=XYE_HORZ-1; if(ny<0) ny=XYE_VERT-1; if(nx>=XYE_HORZ) nx = 0; if(ny>=XYE_VERT) ny = 0; largeblock * lb = getPart(game::Square(nx,ny)->object,root); if( (checked[nx][ny]==0) && (lb!=NULL) ) { checked[nx][ny] = 1; largeblock_stack[ largeblock_stackn++] = lb; } } } } void largeblock::doPush(edir dir, int dx, int dy) { char checked[XYE_HORZ][XYE_VERT] = {}; largeblock_stackn=0; for (int i=0; i 0) { largeblock* lb = largeblock_stack[--largeblock_stackn]; int x = lb->x, y=lb->y; if(checked[x][y]==1) continue; bool performMove= true; int nx = x+dx, ny = y+dy; if(nx<0) nx=XYE_HORZ-1; if(ny<0) ny=XYE_VERT-1; if(nx>=XYE_HORZ) nx = 0; if(ny>=XYE_VERT) ny = 0; if( checked[x][y] == 0) { //start checked[x][y] = 2; if(checked[nx][ny]==2) //found a cycle! { performMove = false; checked[x][y]=1; Uint8 cflags = lb->flags; largeblock * prev = lb; lb->tic = game::Counter(); game::Square(x,y)->Update=true; while(largeblock_stackn > 0) { lb = largeblock_stack[--largeblock_stackn]; lb->tic = game::Counter(); x=lb->x, y=lb->y; checked[x][y] = 1; game::Square(x,y)->Update=true; prev->flags = lb->flags; prev = lb; } prev->flags = cflags; } else if(checked[nx][ny]==0) { obj* object = game::Square(nx,ny)->object; largeblock * lb2= getPart(object, root); if(lb2!=NULL) { performMove=false; ++largeblock_stackn; largeblock_stack[largeblock_stackn ++] = lb2; } else if( (object!=NULL) && ((object->GetType() == OT_BLACKHOLE) || (object->GetType() == OT_MINE)) ) { lb->Kill(); static_cast(object)->Eat(); performMove=false; checked[nx][ny] = 1; checked[x][y]=1; } } } if(performMove) { lb->tic = game::Counter(); lb->move(nx,ny); checked[nx][ny] = 1; checked[x][y]=1; } } } } bool largeblock::canPush(edir dir, int dx, int dy) { char checked[XYE_HORZ][XYE_VERT] = {}; largeblock_stackn=0; for (int i=0; i 0) { largeblock* lb = largeblock_stack[--largeblock_stackn]; int x = lb->x, y=lb->y; if(checked[x][y]==1) continue; gobj* gobject = game::Square(x,y)->gobject; if( (gobject!=NULL) && (! gobject->CanLeave(lb, dir)) ) return false; int nx = x+dx, ny = y+dy; if(nx<0) nx=XYE_HORZ-1; if(ny<0) ny=XYE_VERT-1; if(nx>=XYE_HORZ) nx = 0; if(ny>=XYE_VERT) ny = 0; gobject = game::Square(nx,ny)->gobject; if( (gobject!=NULL) && (! gobject->CanEnter(lb, dir)) ) return false; if( checked[x][y] == 0) { //start checked[x][y] = 2; if(checked[nx][ny]==2); //found a cycle, do nothing else if(checked[nx][ny]==0) { obj* object = game::Square(nx,ny)->object; largeblock * lb2= getPart(object, root); if(lb2!=NULL) { ++largeblock_stackn; largeblock_stack[largeblock_stackn ++] = lb2; } else if(object!=NULL) { if ((object->GetType() == OT_BLACKHOLE) || (object->GetType() == OT_MINE)) { if( static_cast(object)->Busy(lb) ) return false; } else return false; } } } } } return true; } bool largeblock::pushingBlocks2(edir dir, int dx, int dy) { if(tic==game::Counter()) return false; getPushGroup(); if(canPush(dir,dx,dy)) { doPush(dir,dx,dy); return true; } return false; } bool largeblock::isReallyASmallBlock() { if(root == NULL) setupBlock(); return (root->children == 1); } bool largeblock::trypush(edir dir,obj* pusher) { if(root == NULL) setupBlock(); if(root->children == 1) return trypush_common(dir,pusher, false,NULL); switch(dir) { /* case D_RIGHT: return pushingBlocks(dir,-1, XYE_HORZ-1, 0, 1,0,XYE_VERT-1, 1,0); case D_LEFT: return pushingBlocks(dir,1, 0, XYE_HORZ-1, 1,0,XYE_VERT-1, -1,0); case D_UP: return pushingBlocks(dir,-1, XYE_HORZ-1, 0, -1, XYE_VERT-1,0, 0,1); case D_DOWN: return pushingBlocks(dir,-1, XYE_HORZ-1, 0, 1,0,XYE_VERT-1, 0,-1);*/ case D_RIGHT: return pushingBlocks2(dir,1,0); case D_LEFT: return pushingBlocks2(dir,-1,0); case D_UP: return pushingBlocks2(dir,0,1); case D_DOWN: return pushingBlocks2(dir,0,-1); } return false; } void largeblock::OnDeath() { if(root != NULL) { largeblockroot* lbr = root; for (int i=0; iobject, lbr); if(lb != NULL) lb->root = NULL; } delete lbr; } } inline bool largeblock::HasBlockColor(blockcolor bc) { return ((! colorless) && (c==bc)); } /**End Class large Block**/ /**Start Class metalBlock**/ metalblock::metalblock(square* sq,bool makeround) { round=makeround; type=OT_METALBLOCK; ObjectConstruct(sq); } void metalblock::Draw(unsigned int x, unsigned int y, bool round) { Uint8 tx=9; if(round) tx=10; Drawer D(game::sprites,tx*sz, 8*sz ,sz,sz); D.Draw(game::screen,x,y); } void metalblock::Draw(unsigned int x, unsigned int y) { Draw(x,y,round); } bool metalblock::trypush(edir dir,obj* pusher) { return trypush_common(dir,pusher, round,NULL); } bool metalblock::HasRoundCorner(roundcorner rnc) { return round; } bool metalblock::Loop(bool* died) { *died=false; bool Moved=false; if (DoMagnetism(true,true,&Moved)) return Moved; edir go; return false; } /**End Class metal Block**/ /**Start Class Scroll-Block**/ scrollblock::scrollblock(square* sq,blockcolor tc,bool makeround,edir d) { fac=d; round=makeround; type=OT_SCROLLBLOCK; c=tc; colorless=false; ObjectConstruct(sq); } void scrollblock::Draw(unsigned int x, unsigned int y) { Uint8 tx,ty; ty=0; if (round) tx=2; else tx=1; Drawer D(game::sprites,sz*tx,sz*ty,sz,sz); D.SetColors(&options::BKColor[c],255); D.Draw(game::screen,x,y); switch(fac) { case(D_RIGHT): tx=4; ty=16; break; case(D_LEFT): tx=5; ty=16; break; case(D_UP): tx=5; ty=17; break; default: tx=4; ty=17; } D.ChangeRect(tx*sz,ty*sz,sz,sz); D.SetColors(&options::BFColor[c],255); D.Draw(game::screen,x,y); } bool scrollblock::trypush(edir dir,obj* pusher) { if ((dir!=fac) && (pusher) && (pusher->GetType()!=OT_MAGNETIC)) return false; if (trypush_common(dir,pusher, round,NULL)) return true; char nx=x,ny=y; switch(fac) { case (D_UP): ny++; break; case (D_DOWN): ny--; break; case (D_LEFT): nx--; break; default: nx++; } obj *object= game::SquareN(nx,ny)->object; if (object==NULL) return false; //A ground object was the cause. // surprise* sp; turner *t; switch(object->GetType()) { case(OT_TURNER): //a clocker/aclocker found //time=0; t=static_cast(object); if (t->cwise) fac=Clock(fac); else fac=AClock(fac); UpdateSquare(); break; case(OT_SURPRISE): sp=static_cast(object); if (sp->HasBlockColor(B_RED)) { sp->FinalExplode(); } } return false; } bool scrollblock::HasRoundCorner(roundcorner rnc) { return round; } bool scrollblock::Loop(bool* died) { *died=false; bool Moved=false; if (DoMagnetism(true,true,&Moved)) return Moved; edir go; return false; } inline bool scrollblock::HasBlockColor(blockcolor bc) { return ((! colorless) && (c==bc)); } /** End ScrollBlock**/ /**Start Class Wildcard Block**/ wildcard::wildcard(square* sq,bool makeround) { type=OT_WILDCARD; round=makeround; ObjectConstruct(sq); } void wildcard::Draw(unsigned int x, unsigned int y) { Uint8 tx; if (round) tx=2; else tx=1; Drawer D(game::sprites,tx*sz,sz*2,sz,sz); D.Draw(game::screen,x,y); } bool wildcard::trypush(edir dir,obj* pusher) { return trypush_common(dir,pusher, round,NULL); } bool wildcard::HasRoundCorner(roundcorner rnc) { return round; } bool wildcard::Loop(bool* died) { *died=false; bool Moved=false; if (DoMagnetism(true,true,&Moved)) return Moved; edir go; return false; } inline bool wildcard::HasBlockColor(blockcolor bc) { return (true); } /**End Class Wild Card**/ /**Start Class Gem Block**/ gemblock::gemblock(square* sq,blockcolor tc) { type=OT_GEMBLOCK; c=tc; ObjectConstruct(sq); } void gemblock::Draw(unsigned int x, unsigned int y) { Uint8 tx,ty=9; bool movable; if ( c==B_PURPLE ) { movable = ( star::GetRemaining() == 0 ); } else { movable = gem::GotAllGems(c); } tx=(movable?7:6); Drawer D(game::sprites,sz*tx,sz*ty,sz,sz); D.SetColors(options::BKColor[c],255); D.Draw(game::screen,x,y); D.ChangeRect(sz*(tx+2),sz*ty,sz,sz); D.SetColors(options::BFColor[c],255); D.Draw(game::screen,x,y); } bool gemblock::trypush(edir dir,obj* pusher) { bool movable; if ( c==B_PURPLE ) { movable = ( star::GetRemaining() == 0 ); } else { movable = gem::GotAllGems(c); } return ( movable && trypush_common(dir,pusher, false,NULL)); } bool gemblock::HasRoundCorner(roundcorner rnc) { return false; } bool gemblock::Loop(bool* died) { UpdateSquare(); //In theory only a few gemblocks exist in a level so this shouldn't hurt bool movable; if ( c==B_PURPLE ) { movable = ( star::GetRemaining() == 0 ); } else { movable = gem::GotAllGems(c); } if (! movable) return false; *died=false; bool Moved=false; if (DoMagnetism(true,true,&Moved)) return Moved; edir go; return false; } inline bool gemblock::HasBlockColor(blockcolor bc) { return (c==bc); } /**End Class Gem Block**/ /**Start Class Magnetic**/ magnetic::magnetic(square* sq, mgtype kind, bool horizontal) { horz=horizontal; mt=kind; type=OT_MAGNETIC; LastPushDir=D_DOWN; ObjectConstruct(sq); MovedTic = 0; } bool magnetic::IsSticky() { return ( (mt==T_MAGNET) || (mt==T_STICKY)); } bool magnetic::IsSticky(edir reqdir) { if(mt==T_MAGNET) return true; if ( (mt==T_STICKY) && (MovedTic+1>=game::Counter()) && (LastPushDir==reqdir)) { return true; } return false; } bool magnetic::IsHorizontal() { return horz; } void magnetic::Draw(unsigned int x, unsigned int y) { Uint8 tx,ty; if (horz) ty=13; else ty=12; switch (mt) { case(T_MAGNET): tx=6; break; case(T_ANTIMAGNET): tx=7; break; default: tx=8; } Drawer D(game::sprites,sz*tx,sz*ty,sz,sz); D.Draw(game::screen,x,y); } bool magnetic::trypush(edir dir,obj* pusher) { if (trypush_common(dir,pusher, false,NULL)) { LastPushDir=dir; MovedTic=game::Counter(); return true; } return false; } bool magnetic::HasRoundCorner(roundcorner rnc) { return false; } bool magnetic::TryMagneticMove(char ox, char oy, char xx, char xy, edir godir, bool *died, char sx, char sy) { *died=false; if (! IsXyeOrBotAt(game::SquareN(xx,xy))) return false; //Xye wasn't there if( (mt==T_STICKY) && ! IsXyeAt(game::SquareN(xx,xy) ) ) return false; //Xye was there attempt to move : if (mt==T_ANTIMAGNET) { if (trypush_common(godir,this, false,died)) return true; return false; } square *sq=game::SquareN(ox,oy); if (sq->object!=NULL) return false; gobj* gobject=sq->gobject; if ((gobject!=NULL) && (! (gobject->CanEnter(this,godir)) )) return false; //Everything is OK, move the object: char oldx=x, oldy=y; move(sq->sqx,sq->sqy); MovedTic=game::Counter(); LastPushDir=godir; if (mt!=T_STICKY) return true; sq=game::SquareN(sx,sy); obj* object=sq->object; if ((object!=NULL) && (object->tic!=game::counter) && (object->AffectedByMagnetism(horz))) { object->trypush(godir, this); } return true; } bool magnetic::Loop(bool* died) { //Find Xye: *died=false; if (horz) { if (mt!=T_ANTIMAGNET) { if (((mt==T_MAGNET) || (game::Moved(D_RIGHT) )) && (TryMagneticMove(x+1,y,x+2,y,D_RIGHT,died,x-1,y))) return true; if (((mt==T_MAGNET) || (game::Moved(D_LEFT) )) && (TryMagneticMove(x-1,y,x-2,y,D_LEFT,died,x+1,y))) return true; } else { if (TryMagneticMove(x+1,y,x-1,y,D_RIGHT,died)) return true; if (TryMagneticMove(x-1,y,x+1,y,D_LEFT,died)) return true; } } else { if (mt!=T_ANTIMAGNET) { if (((mt==T_MAGNET) || (game::Moved(D_UP) )) && (TryMagneticMove(x,y+1,x,y+2,D_UP,died,x,y-1))) return true; if (((mt==T_MAGNET) || (game::Moved(D_DOWN) )) && (TryMagneticMove(x,y-1,x,y-2,D_DOWN,died,x,y+1))) return true; } else { if (TryMagneticMove(x,y+1,x,y-1,D_UP,died)) return true; if (TryMagneticMove(x,y-1,x,y+1,D_DOWN,died)) return true; } } bool Moved=false; if (DoMagnetism(! horz, horz, &Moved)) return Moved; return false; } bool magnetic::IsInstance(obj* object) { if (object==NULL) return false; return (object->GetType()==OT_MAGNETIC); } inline bool magnetic::HasBlockColor(blockcolor bc) { return false; } /**End Class Magnetic**/ /**Start Class Number**/ number::number(square* sq,blockcolor tc, unsigned char t,bool makeround) { time=(t>9?9:t); round=makeround; type=OT_NUMBER; c=tc; GreenActive=0; GreenFlash=false; tic=0; ignoreDeath=false; ObjectConstruct(sq); } void number::Draw(unsigned int x, unsigned int y) { Uint8 tx,ty; tx = 16+round; ty = 6 + time; Drawer D(game::sprites,tx*sz,ty*sz,sz,sz); SDL_Color mx = options::BKColor[c]; if ((c==B_GREEN || c==B_PURPLE) && (GreenFlash)) { UpdateSquare(); SDL_Color tm; tm.r=tm.g=tm.b=255; mx=MixColors(tm,mx); GreenFlash=false; } Uint8 alpha = 255; /*if (c!=B_RED) alpha= 255 - (9-time)*14; else alpha=255;*/ D.SetColors(&mx,alpha); D.Draw(game::screen,x,y); tx=18; ty = 6 + time; D.ChangeRect(tx*sz,ty*sz,sz,sz); D.SetColors( &options::BFColor[c],255); D.Draw(game::screen,x,y); } void number::explode() { deathqueue::add(x,y,KT_FIRE); explosion *ex = new explosion(game::SquareN(x,y),1); } bool number::trypush(edir dir,obj* pusher) { bool died=false; if (trypush_common(dir,pusher, round,&died)) { if ((c==B_RED) && (!died) && (! magnetic::IsInstance(pusher) )) { if (time==0) { explode(); Kill(); } else time--; } return true; } return false; } bool number::HasRoundCorner(roundcorner rnc) { return round; } bool number::green_activator_present(square * sq) { obj *object=sq->object; if (object==NULL) return false; otype ot=object->GetType(); if (ot==OT_XYE) return true; if (ot!=OT_NUMBER) return false; number* num=static_cast(object); return ((num->c==c) && (num->GreenActive!=0) && (num->GreenActive!=game::counter) ); } bool number::Loop(bool* died) { bool Moved=false; *died=false; DoMagnetism(true,true,&Moved); if (c==B_RED) return Moved; tic++; switch(c) { case(B_BLUE): tic=(tic>=300?0:tic); break; default: tic=(tic>=60?0:tic); break; } if (c==B_GREEN || c==B_PURPLE) { if (GreenActive==0) { if ((green_activator_present(game::SquareN(x+1,y) )) || (green_activator_present(game::SquareN(x,y+1) )) || (green_activator_present(game::SquareN(x-1,y) )) || (green_activator_present(game::SquareN(x,y-1) ))) { UpdateSquare(); GreenFlash=true; GreenActive=game::counter; if(time==0) tic=30; else tic=0; } else return Moved; } } if (tic==0) { UpdateSquare(); if (time==0) { *died=true; Kill(); return Moved; } else time--; } return Moved; } inline bool number::HasBlockColor(blockcolor bc) { return (c==bc); } void number::OnDeath() { if ((c==B_RED || c==B_PURPLE) && (! KilledByBlackHole) && (! ignoreDeath) ) { ignoreDeath=true; explode(); } } /**End Class Number**/ /**Start Class Impacter**/ impacter::impacter(square* sq,blockcolor tc,edir facing) { fac=facing; type=OT_PUSHER; c=tc; time=0; ObjectConstruct(sq); } void impacter::Draw(unsigned int x, unsigned int y,blockcolor c,edir fac) { Uint8 tx,ty; switch(fac) { case(D_RIGHT): tx=4; ty=5; break; case(D_LEFT): tx=5; ty=5; break; case(D_UP): tx=5; ty=6; break; default: tx=4; ty=6; } Drawer D(game::sprites,sz*tx,sz*ty,sz,sz); D.SetColors(options::BKColor[c],255); D.Draw(game::screen,x,y); D.ChangeRect(sz*tx,sz*(ty+2),sz,sz); D.SetColors(options::BFColor[c],255); D.Draw(game::screen,x,y); } void impacter::Draw(unsigned int x, unsigned int y) { Draw(x,y,c,fac); } bool impacter::trypush(edir dir,obj* pusher) { unsigned int ClockTic=game::Counter(); if ( (tic!=ClockTic) && trypush_common(dir,pusher, false,NULL)) { /*switch(pusher->GetType()) { case(OT_PUSHER): case(OT_XYE): case(OT_ROBOXYE): tic=ClockTic; }*/ //if (dir == Opposite(fac)) turn(); return true; } return false; } bool impacter::HasRoundCorner(roundcorner rnc) { return false; } void impacter::turn() { switch(c) { case(B_YELLOW): case (B_PURPLE): fac=Opposite(fac); break; case(B_BLUE): fac=Clock(fac); break; case(B_GREEN): fac=AClock(fac); break; case(B_RED): time=9; } if (c!=B_RED) { UpdateSquare(); } } bool impacter::Loop(bool* died) { *died=false; bool Moved=false; bool pushed=false; unsigned int ClockTic=game::Counter(); time++; if ( (time>=10) || (c==B_PURPLE && time>=5) ) { time=0; if (DoMagnetism(true,true,&Moved)) return Moved; char dx=x,dy=y; switch(fac) { case(D_UP): dy++;break; case(D_DOWN): dy--;break; case(D_RIGHT): dx++;break; default: dx--; } dx=(dx>=XYE_HORZ?0:(dx<0?XYE_HORZ-1:dx)); dy=(dy>=XYE_VERT?0:(dy<0?XYE_VERT-1:dy)); square* sq=game::Square(dx,dy); obj* object=sq->object; teleport* tele; dangerous* blck; char nx=0,ny=0; bool go=false; if (object==NULL) go=true; else { switch (object->GetType()) { case(OT_TELEPORT): tele=static_cast(object); go = tele->tryteleport(fac, this, nx, ny ,blck, &pushed); if (go) { dx=nx; dy=ny;sq=game::Square(dx,dy); object=sq->object; } else if (blck!=NULL) { if (blck->Busy(this)) go=false; else { //Kill The impacter blck->Eat(); Kill(blck->GetType()==OT_BLACKHOLE); *died=true; return true; } } break; case(OT_BLACKHOLE): case(OT_MINE): case(OT_FIREBALL): blck=static_cast(object); if (blck->Busy(this)) go=false; else { //Kill The impacter blck->Eat(); Kill(blck->GetType()==OT_BLACKHOLE); *died=true; return true; } break; } if (! go) { if (object==NULL) { go=true; } else if (object->trypush(fac,this)) { go=(c==B_RED || c==B_PURPLE); pushed=true; } } } if (go) { gobj* gobject=sq->gobject; if ((gobject==NULL) || (gobject->CanEnter(this,fac))) { move(dx,dy); return true; } else pushed=true; } if ((! go) || pushed) turn(); } return false; } inline bool impacter::HasBlockColor(blockcolor bc) { return (c==bc); } /**End Class Impacter**/ /**Start Class Arrow**/ arrow::arrow(square* sq,blockcolor tc,edir facing, bool roundblock) { fac=facing; type=OT_ARROW; c=tc; round=roundblock; //mod=game::Mod; time=0; ObjectConstruct(sq); } void arrow::DrawF(unsigned int x, unsigned int y,blockcolor c, edir fac,bool round) { Uint8 tx,ty; switch(fac) { case(D_RIGHT): tx=4; ty=9; break; case(D_LEFT): tx=5; ty=9; break; case(D_UP): tx=5; ty=10; break; default: tx=4; ty=10; } if (round) ty+=2; Drawer D(game::sprites,tx*sz,ty*sz,sz,sz); D.SetColors(&options::BFColor[c],255); D.Draw(game::screen,x,y); } void arrow::Draw(unsigned int x, unsigned int y) { block::Draw(x, y, false,c,round); DrawF(x,y,c,fac,round); } bool arrow::trypush(edir dir,obj* pusher) { return (trypush_common(dir,pusher, round && (dir==fac),NULL)); } bool arrow::HasRoundCorner(roundcorner rnc) { return round; } bool arrow::Loop(bool* died) { *died=false; bool Moved=false; if (DoMagnetism(true,true,&Moved)) return Moved; time++; bool go=true; switch(c) { case(B_YELLOW): go=(time==2); break; case(B_GREEN): go=(time==3); break; case(B_BLUE): go=(time==4); break; //Red is always true } if (!go) return false; time=0; if (trypush_common(fac,NULL, round,died)) return true; switch(c) { case(B_YELLOW): time=1 ; break; case(B_GREEN): time=2 ; break; case(B_BLUE): time=3; break; //Red is always true } char nx=x,ny=y; switch(fac) { case (D_UP): ny++; break; case (D_DOWN): ny--; break; case (D_LEFT): nx--; break; default: nx++; } obj *object= game::SquareN(nx,ny)->object; if (object==NULL) return false; //A ground object was the cause. surprise* sp; turner *t; switch(object->GetType()) { case(OT_TURNER): //a clocker/aclocker found time=0; t=static_cast(object); if (t->cwise) fac=Clock(fac); else fac=AClock(fac); UpdateSquare(); return true; case(OT_SURPRISE): sp=static_cast(object); if (sp->HasBlockColor(B_RED)) { sp->FinalExplode(); } } return false; } inline bool arrow::HasBlockColor(blockcolor bc) { return (c==bc); } /**End Class Arrow**/ /**Start Class autoArrow**/ autoarrow::autoarrow(square* sq,blockcolor tc,edir facing, bool roundblock) { fac=facing; type=OT_AUTO; c=tc; round=roundblock; count=0; ObjectConstruct(sq); } void autoarrow::Draw(unsigned int x, unsigned int y) { Uint8 tx,ty; ty=7; if (round) tx=1; else tx=2; Drawer D(game::sprites,sz*tx,sz*ty,sz,sz); D.SetColors(options::BKColor[c],255); D.Draw(game::screen,x,y); switch(fac) { case(D_RIGHT): tx=1; ty=8; break; case(D_LEFT): tx=2; ty=8; break; case(D_UP): tx=2; ty=9; break; default: tx=1; ty=9; } D.ChangeRect(tx*sz,ty*sz,sz,sz); D.SetColors(options::BFColor[c],255); D.Draw(game::screen,x,y); } bool autoarrow::trypush(edir dir,obj* pusher) { return (trypush_common(dir,pusher, false,NULL)); } bool autoarrow::HasRoundCorner(roundcorner rnc) { return false; } bool autoarrow::Loop(bool* died) { if (game::Mod2() && game::Mod7()) { UpdateSquare(); fac=AClock(fac); if (count>(XYE_VERT-y-2)) { char nx=x,ny=y; switch(fac) { case(D_UP): ny++; break; case(D_DOWN): ny--; break; case(D_LEFT): nx--; break; default: nx++; } square *sq=game::SquareN(nx,ny); if ((sq->object==NULL) && ((sq->gobject==NULL) || (sq->gobject->CanEnter(this,fac) ))) { count=0; arrow* ar=new arrow(sq,c,fac,round); ar->tic=game::Counter(); } } else count++; } return false; } inline bool autoarrow::HasBlockColor(blockcolor bc) { return (c==bc); } edir autoarrow::GetDefaultEdirByColumn(unsigned int cx) { switch (cx%4) { case(0): return (D_RIGHT); break; case(1): return (D_UP); break; case(2): return (D_LEFT); } //default: return (D_DOWN); } /**End Class Autoarrow**/ /**Start Class Factory**/ factory::factory(square* sq,otype r,blockcolor tc, edir facing, edir switchfacing, bool roundblock,bool nocolor,btype bs) { limit=100000; fac=facing; swf=switchfacing; beasttype=bs; type=OT_FACTORY; c=tc; res=r; factory::nocolor=nocolor; round=roundblock; created=0; pressed=0; upd=false; ObjectConstruct(sq); } void factory::DrawSub(unsigned int x,unsigned int y) { switch(res) { case(OT_MINE): dangerous::DrawMine(x,y); return; case(OT_PUSHER): impacter::Draw(x,y,c,fac); return; case(OT_BEAST): beast::Draw(x,y,beasttype,fac,0,0); return; case(OT_RATTLERFOOD): rfood::Draw(x,y,false); return; case(OT_RATTLER): rattler::Draw(x,y,false,fac,NULL); return; case(OT_GEM): gem::Draw(x,y,c,false); return; } block::Draw(x, y, (nocolor && (res==OT_BLOCK)),c,round); switch(res) { case(OT_BLOCK): return; case(OT_ARROW): arrow::DrawF(x,y,c,fac,round); break; case(OT_LOWDENSITY): lowdensity::DrawF(x,y,c, round); } } void factory::Draw(unsigned int x, unsigned int y) { Uint8 tx,ty; Drawer D(game::sprites,0,0,0,0); //step 1: Draw the result: if ( ((!created) || (created+2<=game::counter)) && (limit)) DrawSub(x,y); //step 2 : Draw the factory: switch(fac) { case(D_RIGHT): tx=6; break; case(D_DOWN): tx=7; break; case(D_LEFT): tx=8; break; default: tx=9; } ty=14; D.SetColors(255,255,255,255); D.ChangeRect(tx*sz,ty*sz,sz,sz); D.Draw(game::screen,x,y); //step 3 : Draw the switch: switch(swf) { case(D_RIGHT): tx=6; break; case(D_DOWN): tx=7; break; case(D_LEFT): tx=8; break; default: tx=9; } ty=15+(pressed?1:0); D.ChangeRect(tx*sz,ty*sz,sz,sz); D.Draw(game::screen,x,y); } bool factory::trypush(edir dir,obj* pusher) { if (pressed || (dir != Opposite(swf) ) ) return false; //Success to press the switch, try to create a block. pressed=11; if (!limit) return false; char nx=x,ny=y; switch(fac) { case(D_UP): ny++; break; case(D_DOWN): ny--; break; case(D_LEFT): nx--; break; default: nx++; } square *sq=game::SquareN(nx,ny); if ((sq->object==NULL) && ((sq->gobject==NULL) || (sq->gobject->CanEnter(this,fac) ))) { obj* object;lowdensity* lb;block* b; created=game::counter;limit--; beast* be; switch(res) { case(OT_MINE): object=new dangerous(sq,OT_MINE); break; case(OT_ARROW): object=new arrow(sq,c,fac,round); object->tic=game::Counter(); break; case(OT_LOWDENSITY): lb=new lowdensity(sq,c,round); lb->tic=game::Counter(); lb->Activate(fac); break; case(OT_PUSHER): object=new impacter(sq,c,fac); break; case(OT_BEAST): object=new beast(sq,beasttype,fac); object->tic=game::Counter(); if(beasttype == BT_STATIC) static_cast(object)->AIValue=true; break; case(OT_RATTLERFOOD): object=new rfood(sq); break; case(OT_RATTLER): object=new rattler(sq,fac,0); break; case(OT_GEM): object=new gem(sq,c); break; case(OT_BLOCK):default : b=new block(sq,c,round); b->tic=game::Counter(); b->colorless=nocolor; break; } } UpdateSquare(); return false; } bool factory::Loop(bool* died) { if (upd) upd=false; if (pressed) { pressed--; if (! pressed) upd=true; } if(pressed || (created && (created+3<=game::counter)) || upd) UpdateSquare(); return false; } /**End Class factory**/ /**Start Class filler**/ filler::filler(square* sq,blockcolor tc,edir facing, bool roundblock) { fac=facing; type=OT_FILLER; c=tc; round=roundblock; anim=Chance(0.5); ObjectConstruct(sq); count=0; } void filler::Draw(unsigned int x, unsigned int y) { Uint8 tx,ty; ty=15; if (round) tx=0; else tx=1; Drawer D(game::sprites,tx*sz,ty*sz,sz,sz); D.SetColors(options::BKColor[c],255); D.Draw(game::screen,x,y); switch(fac) { case(D_RIGHT): tx=0; ty=16; break; case(D_LEFT): tx=1; ty=16; break; case(D_UP): tx=1; ty=17; break; default: tx=0; ty=17; } if (anim) ty+=2; D.ChangeRect(tx*sz,ty*sz,sz,sz); D.SetColors(options::BFColor[c],255); D.Draw(game::screen,x,y); } bool filler::trypush(edir dir,obj* pusher) { return (trypush_common(dir,pusher, false,NULL)); } bool filler::HasRoundCorner(roundcorner rnc) { return false; } bool filler::Loop(bool* died) { char nx=x,ny=y; switch(fac) { case(D_UP): ny++; break; case(D_DOWN): ny--; break; case(D_LEFT): nx--; break; default: nx++; } square *sq=game::SquareN(nx,ny); if ((sq->object==NULL) && ((sq->gobject==NULL) || (sq->gobject->CanEnter(this,fac) ))) { count++; if (count>=14) { UpdateSquare(); anim=!anim; arrow* ar=new arrow(sq,c,fac,round); ar->tic=game::Counter(); count=0; } } return false; } inline bool filler::HasBlockColor(blockcolor bc) { return (c==bc); } /**End Class Filler**/ /**Start Class sniper**/ sniper::sniper(square* sq,blockcolor tc, bool roundblock) { fac=D_DOWN; type=OT_SNIPER; c=tc; round=roundblock; anim=Chance(0.5); count=0; ObjectConstruct(sq); } void sniper::Draw(unsigned int x, unsigned int y) { Uint8 tx,ty; ty=15; if (round) tx=2; else tx=3; Drawer D(game::sprites,sz*tx,sz*ty,sz,sz); D.SetColors(options::BKColor[c],255); D.Draw(game::screen,x,y); switch(fac) { case(D_RIGHT): tx=2; ty=16; break; case(D_LEFT): tx=3; ty=16; break; case(D_UP): tx=3; ty=17; break; default: tx=2; ty=17; } if (anim) ty+=2; D.ChangeRect(tx*sz,ty*sz,sz,sz); D.SetColors(options::BFColor[c],255); D.Draw(game::screen,x,y); } bool sniper::trypush(edir dir,obj* pusher) { return (trypush_common(dir,pusher, false,NULL)); } bool sniper::HasRoundCorner(roundcorner rnc) { return false; } bool sniper::Loop(bool* died) { count++; char nx=x,ny=y; char xx=game::XYE->X(); char xy=game::XYE->Y(); edir old=fac; fac=PickDirectDir(x,y,xx,xy,false,/*horz priority */true); if (old!=fac) UpdateSquare(); if (count<7) return true; if (x==xx) { if (y>xy) ny--; else ny++; } else if (y==xy) { if (x>xx) nx--; else nx++; } else return false; square *sq=game::SquareN(nx,ny); if ((sq->object==NULL) && ((sq->gobject==NULL) || (sq->gobject->CanEnter(this,fac) ))) { anim=!anim; UpdateSquare(); arrow* ar=new arrow(sq,c,fac,round); ar->tic=game::Counter(); count=0; } return false; } inline bool sniper::HasBlockColor(blockcolor bc) { return (c==bc); } /**End Class Sniper**/ /**Start Low Density**/ lowdensity::lowdensity(square* sq,blockcolor tc, bool roundblock) { fac=D_UP; type=OT_LOWDENSITY; c=tc; active=false; round=roundblock; ObjectConstruct(sq); } void lowdensity::Activate(edir D) { fac=D; active=true; time=0; } void lowdensity::DrawF(unsigned int x, unsigned int y,blockcolor c, bool round) { Drawer D(game::sprites,3*sz,12*sz,sz,sz); D.SetColors(&options::BFColor[c],255); D.Draw(game::screen,x,y); } void lowdensity::Draw(unsigned int x, unsigned int y) { block::Draw(x, y, false,c,round); DrawF(x,y,c,round); } bool lowdensity::trypush(edir dir,obj* pusher) { if (trypush_common(dir,pusher, round && ( (! active) || (fac==dir) ),NULL)) { active=true; fac=dir; time=0; tic=game::Counter(); return true; } return false; } bool lowdensity::HasRoundCorner(roundcorner rnc) { return round; } bool lowdensity::Loop(bool* died) { bool Moved=false; if (DoMagnetism(true,true,&Moved)) { if (! Moved) active=false; return (Moved); } if (! active) return false; bool go=true; time++; switch(c) { case(B_YELLOW): go=(time==2); break; case(B_GREEN): go=(time==3); break; case(B_BLUE): go=(time==4); break; //Red is always true } if (!go) return false; time=0; if (trypush_common(fac,NULL, round,NULL)) return true; active=false; return false; } inline bool lowdensity::HasBlockColor(blockcolor bc) { return (c==bc); } /**End Low density**/ /**Start Class Turner**/ turner::turner(square* sq,blockcolor tc,bool clockwise,bool roundblock) { type=OT_TURNER; round=roundblock; c=tc; cwise=clockwise; colorless=false; ObjectConstruct(sq); } void turner::Draw(unsigned int x, unsigned int y) { block::Draw(x,y,colorless,c,round); Uint8 tx,ty; tx=3; if (cwise) ty=11; else ty=10; Drawer D(game::sprites,sz*tx,sz*ty,sz,sz); if (colorless) { D.SetColors(options::BFColor[5]); } else { D.SetColors(options::BFColor[c]); } D.Draw(game::screen,x,y); } bool turner::trypush(edir dir,obj* pusher) { return trypush_common(dir,pusher, round,NULL); } bool turner::HasRoundCorner(roundcorner rnc) { return round; } bool turner::Loop(bool* died) { *died=false; bool Moved=false; if (DoMagnetism(true,true,&Moved)) return Moved; return false; } inline bool turner::HasBlockColor(blockcolor bc) { return ((! colorless) && (c==bc)); } /**End Class Turner**/ /**Start Class Surprise**/ surprise::surprise(square* sq,blockcolor tc,bool makeround) { round=makeround; type=OT_SURPRISE; c=tc; changing=false; ObjectConstruct(sq); } //The transformation process relies on the draw method for eye candy reasons //But not calling draw methods should not affect the gameplay. So this dotransform //stuff is used to ensure that even if the block is not drawn it will transform without //upsetting the gameplay unsigned int surprise::Pending; void surprise::TransformAll() { if (! Pending) return; unsigned char i,j; square* sq; obj* object; for (i=0; Pending && (iobject) && (object->GetType()==OT_SURPRISE)) { (static_cast(object))->Transform(); } } } void surprise::Reset() { Pending=0; } void surprise::Transform() { if (! changing) return; Pending--; square *sq=game::Square(surprise::x,surprise::y); sq->object=NULL; gobj *gobject = sq->gobject; if (gobject!=NULL) gobject->OnLeave(this); wall* wl; dangerous* bh; impacter* bn; magnetic* mg; switch(c) { case(B_YELLOW): bn=new impacter(sq,B_YELLOW,YellowDir); break; case(B_PURPLE): game::XYE->alpha=32; game::FlashXyePosition(); game::XYE->move(sq->sqx, sq->sqy); break; case(B_GREEN): sq->object=this; changing=false; c=B_BLUE; if (gobject!=NULL) gobject->OnEnter(this); UpdateSquare(); break; case(B_BLUE): { wl=new wall(sq,0); SDL_Color BC = options::BKColor[c]; char ox=obj::X(),oy=obj::Y(); wall *b8= wall::find(ox,oy+1), *b4= wall::find(ox-1,oy), *b2= wall::find(ox,oy-1), *b6= wall::find(ox+1,oy); if (round) wl->SetRoundCorners( !(b4 || b8) , !(b4 || b2) ,! (b2 || b6), !(b6 || b8) ); if (b8) b8->IntelligentUpdateCorners(wl); if (b4) b4->IntelligentUpdateCorners(wl); if (b2) b2->IntelligentUpdateCorners(wl); if (b6) b6->IntelligentUpdateCorners(wl); wall *b7= wall::find(ox-1,oy+1), *b9= wall::find(ox+1,oy+1), *b3= wall::find(ox+1,oy-1), *b1= wall::find(ox-1,oy-1); // After the addition of special borders to the skin capabilities, it is necessary // to update the walls in the corners as well: //wl->ChangeColor(BC.r+(options::WallColor[0].r-BC.r)/2,BC.g+(options::WallColor[0].g-BC.g)/2,BC.b+(options::WallColor[0].b-BC.b)/2, false); int r = BC.r; int g = BC.g; int b = BC.b; int v = wall::GetDefaultVariationVulnerableToFire(); r = (r+wall::DefaultColor[v].r)/2; g = (g+wall::DefaultColor[v].g)/2; b = (b+wall::DefaultColor[v].b)/2; wl->ChangeColor(r,g,b, false); wl->ChangeKind(v); if(b7) b7->UpdateSquare(); if(b9) b9->UpdateSquare(); if(b3) b3->UpdateSquare(); if(b1) b1->UpdateSquare(); wl->ChangeColor(r,g,b, false); break; } } if (changing) { recycle::add(this);; } } void surprise::Draw(unsigned int x, unsigned int y) { Uint8 tx,ty; Drawer D(game::sprites,0,0,0,0); SDL_Color SprColor; SDL_Color BC = options::BKColor[c] ,FBC= options::BFColor[c]; if (changing) { Pending--; square *sq=game::Square(surprise::x,surprise::y); sq->object=NULL; gobj *gobject = sq->gobject; if (gobject!=NULL) gobject->OnLeave(this); wall* wl; dangerous* bh; impacter* bn; switch(c) { case(B_YELLOW): bn=new impacter(sq,B_YELLOW,YellowDir); SprColor=BC; bn->Draw(x,y); break; case(B_PURPLE): SprColor=BC; if ( game::XYE->GetLives() != 0 ) { game::XYE->alpha=32; game::FlashXyePosition(); game::XYE->move(sq->sqx, sq->sqy); game::XYE->Draw(x,y); } break; case(B_GREEN): sq->object=this; changing=false; BC=MixColors(BC,options::BKColor[B_BLUE]); FBC=MixColors(FBC,options::BFColor[B_BLUE]); c=B_BLUE; if (gobject!=NULL) gobject->OnEnter(this); UpdateSquare(); break; case(B_BLUE): wl=new wall(sq,0); SprColor=BC; char ox=obj::X(),oy=obj::Y(); wall *b8= wall::find(ox,oy+1), *b4= wall::find(ox-1,oy), *b2= wall::find(ox,oy-1), *b6= wall::find(ox+1,oy); if (round) wl->SetRoundCorners( !(b4 || b8) , !(b4 || b2) ,! (b2 || b6), !(b6 || b8) ); if (b8) b8->IntelligentUpdateCorners(wl); if (b4) b4->IntelligentUpdateCorners(wl); if (b2) b2->IntelligentUpdateCorners(wl); if (b6) b6->IntelligentUpdateCorners(wl); wall *b7= wall::find(ox-1,oy+1), *b9= wall::find(ox+1,oy+1), *b3= wall::find(ox+1,oy-1), *b1= wall::find(ox-1,oy-1); if(b7) b7->UpdateSquare(); if(b9) b9->UpdateSquare(); if(b3) b3->UpdateSquare(); if(b1) b1->UpdateSquare(); int v = wall::GetDefaultVariationVulnerableToFire(); int r = SprColor.r; int g = SprColor.g; int b = SprColor.b; r = (r+wall::DefaultColor[v].r)/2; g = (g+wall::DefaultColor[v].g)/2; b = (b+wall::DefaultColor[v].b)/2; wl->ChangeKind(v); wl->ChangeColor(r,g,b, false); wl->Draw(x,y); break; } } if (round) { D.ChangeRect(sz*2,0,sz,sz); } else { D.ChangeRect(sz,0,sz,sz); } SprColor=BC; if (changing) { D.SetColors(SprColor,128); } else { D.SetColors(SprColor,255); } D.Draw(game::screen,x,y); D.ChangeRect(3*sz,7*sz,sz,sz); SprColor=FBC; if (changing) { D.SetColors(SprColor,128); } else { D.SetColors(SprColor,255); } D.Draw(game::screen,x,y); if (changing) { recycle::add(this);; } } bool surprise::trypush(edir dir,obj* pusher) { if (changing) return false; bool died=false; if (trypush_common(dir,pusher, round,&died)) { if ((died) || (magnetic::IsInstance(pusher) ) || (c==B_RED)) return true; if (c==B_YELLOW || c==B_PURPLE) YellowDir=dir; if (! died) { changing=true; Pending++; } return true; } return false; } bool surprise::HasRoundCorner(roundcorner rnc) { return round; } bool surprise::Loop(bool* died) { if (changing) return false; *died=false; bool Moved=false; if (DoMagnetism(true,true,&Moved)) return Moved; return false; } inline bool surprise::HasBlockColor(blockcolor bc) { return (c==bc); } void surprise::FinalExplode() { char i,j; for (i=-1;i<=1;i++) for (j=-1;j<=1;j++) game::SmallBoom(game::SquareN(x+i,y+j), false, i,-j ); explosion* ex=new explosion(game::Square(x,y));; } /**End Class Surprise**/ /**Start Class Toggle**/ bool toggle::State[XYE_OBJECT_COLORS] = {false,false,false,false,false}; Uint32 toggle::ChangeTic; void toggle::Reset() { ChangeTic=0; for (int i=0; i=XYE_HORZ?0:(cx<0?XYE_HORZ-1:cx)); cy=(cy>=XYE_VERT?0:(cy<0?XYE_VERT-1:cy)); if ((cx==x) && (cy==y)) return NULL; do { object=game::Square(cx,cy)->object; if ((object!=NULL) && (object->GetType()==OT_TELEPORT)) { //A friendly teleport found, is it of the opposite facing? teleport* res=static_cast(object); if (res->dir==oposs) return res; } if (dx!=0) { cx+=dx; cx=(cx>=XYE_HORZ?0:(cx<0?XYE_HORZ-1:cx)); } else { cy+=dy; cy=(cy>=XYE_VERT?0:(cy<0?XYE_VERT-1:cy)); } } while ((cx!=x) || (cy!=y)); return NULL; } bool teleport::tryteleport(edir odir, obj* moving, char& nx, char& ny ,dangerous* &reason, bool* pushed) { if (pushed!=NULL) *pushed=false; reason=NULL; bool go=false; switch(dir) { case(D_UP): if (odir!=D_DOWN) return false; else break; case(D_DOWN): if (odir!=D_UP) return false; else break; case(D_LEFT): if (odir!=D_RIGHT) return false; else break; default: if (odir!=D_LEFT) return false; } //Find exit teleport* exit=FindExit(-1,-1); obj* Other; while (exit!=NULL) { nx=exit->X(); ny=exit->Y(); switch(odir) { case(D_UP) : ny++; break; case(D_DOWN) : ny--; break; case(D_RIGHT): nx++; break; default : nx--; } nx=(nx<0?XYE_HORZ-1:(nx>=XYE_HORZ?0:nx)); ny=(ny<0?XYE_VERT-1:(ny>=XYE_VERT?0:ny)); if ((nx==moving->X()) && (ny==moving->Y())); else { Other=game::Square(nx,ny)->object; if (Other!=NULL) { otype ty=Other->GetType(); if (Other->trypush(odir,moving)) { if (pushed!=NULL) *pushed=true; return true; } else if ((reason==NULL) && ((ty==OT_BLACKHOLE) || (ty==OT_MINE) || (ty==OT_FIREBALL) )) reason=static_cast(Other); } else return true; } exit=FindExit(exit->X(),exit->Y()); } return false; } bool teleport::FindCleanExit(obj* ForObject, char &nx, char &ny, bool AI) { //Find exit teleport* exit=FindExit(-1,-1); square* sq; gobj *gobject; edir odir=Opposite(dir); while (exit!=NULL) { nx=exit->X(); ny=exit->Y(); switch(odir) { case(D_UP) : ny++; break; case(D_DOWN) : ny--; break; case(D_RIGHT): nx++; break; default : nx--; } nx=(nx<0?XYE_HORZ-1:(nx>=XYE_HORZ?0:nx)); ny=(ny<0?XYE_VERT-1:(ny>=XYE_VERT?0:ny)); sq=game::Square(nx,ny); if (sq->object==NULL || (AI &&(ForObject==sq->object) ) ) { gobject=sq->gobject; if ((gobject==NULL) || (gobject->CanEnter(ForObject,odir))) return true; } exit=FindExit(exit->X(),exit->Y()); } return false; } void teleport::Draw(unsigned int x, unsigned int y) { Uint8 tx,ty; switch(dir) { case(D_RIGHT): tx=4; break; case(D_DOWN): tx=5; break; case(D_LEFT): tx=6; break; //case(D_UP): default: tx=7; break; } if (FindExit(-1,-1)==NULL) ty=2; else { if (anim) ty=0; else ty=1; if (game::Mod2()) anim=! anim; } Drawer D(game::sprites,sz*tx,sz*ty,sz,sz); D.Draw(game::screen,x,y); } inline bool teleport::trypush(edir dir,obj* pusher) { return trypush_common(dir,pusher, false,NULL); } inline bool teleport::HasRoundCorner(roundcorner rnc) { return false; } bool teleport::Loop(bool* died) { if (game::Mod2()) { UpdateSquare(); if(game::Mod5()) { *died=false; bool Moved=false; if (DoMagnetism(true,true,&Moved)) return Moved; } } return false; } inline bool teleport::HasBlockColor(blockcolor bc) { return false; } /**End Class Teleport**/ /**Start Class Black Hole**/ // todo: use inheritance for god's sake! dangerous::dangerous(square* sq,otype kind) { switch (kind) { case (OT_MINE) : LandMine(); break; case (OT_FIREBALL) : FireBall(D_DOWN); break; default:BlackHole(); } fromRound = false; absorb=0; anim=1; R=G=B=255; ObjectConstruct(sq); } dangerous::dangerous(square* sq,edir dir,bool d) { fromRound = false; FireBall(dir); disb=d; absorb=0; anim=1; R=G=B=255; ObjectConstruct(sq); } void dangerous::LandMine() { mine=true; fire=false; type=OT_MINE; } void dangerous::FireBall(edir dir) { mov=0; D=dir; mine=false; fire=true; type=OT_FIREBALL; } void dangerous::BlackHole() { mine=fire=false; type=OT_BLACKHOLE; } void dangerous::DrawMine(unsigned int x, unsigned int y) { Drawer D(game::sprites,0,7*sz,sz,sz); D.Draw(game::screen,x,y); } void dangerous::Draw(unsigned int x, unsigned int y) { if (mine) { DrawMine(x,y); return; } Uint8 tx,ty; Drawer D(game::sprites,0,0,0,0); if (fire) { /*switch(dangerous::D) { case(D_UP): tx=14; break; case(D_DOWN): tx=12; break; case(D_LEFT): tx=13; break; default: tx=11; }*/ /* ty=6; tx=11+anim; anim=(anim==3)?0:anim+1; D.ChangeRect(tx*sz,ty*sz,sz,sz); D.Draw(game::screen,x,y);*/ block::Draw(x,y, false, B_RED, fromRound); //arrow::DrawF(x,y, B_RED, dangerous::D, true); D.ChangeRect(0*sz,8*sz,sz,sz); D.SetColors(options::BFColor[B_RED], 255); D.Draw(game::screen,x,y); /**/ } else { if (absorb>0) { tx=1; ty=(int( (absorb-1) / 10)+3); } else { tx=0; ty=(anim+3); } D.ChangeRect(tx*sz,ty*sz,sz,sz); D.Draw(game::screen,x,y); D.ChangeRect(0,sz*3,sz,sz); D.SetColors(R,G,B,255); D.Draw(game::screen,x,y); } } inline bool dangerous::trypush(edir dir,obj* pusher) { if (mine || fire) { if (magnetic::IsInstance(pusher) || (pusher==this) ) if (trypush_common(dir,pusher, false,NULL)) return true; else { char nx=x, ny=y; switch(dir) { case (D_UP): ny++; break; case (D_DOWN): ny--; break; case (D_LEFT): nx--; break; default: nx++; } if (fire) { obj* object= game::SquareN(nx,ny)->object; if ((object!=NULL) && (object->GetType()==OT_FIREBALL)) { object->Kill(); game::SmallBoom(game::SquareN(x,y)); //return false; } } switch(dir) { case D_UP: game::SmallBoom(game::SquareN(nx,ny),true, 0, -1 ); break; case D_DOWN: game::SmallBoom(game::SquareN(nx,ny),true, 0, 1 ); break; case D_RIGHT: game::SmallBoom(game::SquareN(nx,ny),true, 1, 0 ); break; case D_LEFT: game::SmallBoom(game::SquareN(nx,ny),true, -1, 0 ); break; } if(fire) new explosion(game::Square(x,y), 0); Kill(); return true; } return false; } if ((absorb>0) && (pusher->GetType()!=OT_XYE)) return trypush_common(dir,pusher, false,NULL); return false; } inline bool dangerous::HasRoundCorner(roundcorner rnc) { return false; } inline void dangerous::Eat() { if (mine || fire) { explosion* ex=new explosion(game::SquareN(x,y),1); Kill(); } else absorb=1; } inline bool dangerous::Busy(obj* entering) { if (fire && ((disb) || (entering->GetType()==OT_FIREBALL))) return true; return (absorb>0) && (absorb<32); } inline void dangerous::ChangeColor(Uint8 nR, Uint8 nG, Uint8 nB) { R=nR; G=nG; B=nB; } inline bool dangerous::HasBlockColor(blockcolor bc) { return (fire && (bc==B_RED) ); } bool dangerous::Loop(bool* died) { *died=false; if (mine) { bool Moved=false; if(( ! game::Mod5() ) || (! game::counter2)) return false; if (DoMagnetism(true,true,&Moved)) return Moved; } else if (fire) { bool Moved=false; if (DoMagnetism(true,true,&Moved) && Moved) return Moved; UpdateSquare(); mov=(mov>=1)?0:mov+1; mov=0; if(! mov) { //new explosion(game::Square(x,y),1); disb=true; if (trypush(D,this)) return true; else { //new explosion(game::Square(x,y),1); mov=2; } } return false; } else { if (absorb>0) { absorb++; if (absorb>39) absorb=0; UpdateSquare(); } else if (game::Mod4()) { anim=GetRandomInt(1,3); UpdateSquare(); } return false; } return false; } /**End Class Black Hole**/ /** Beasts' AI **/ bool BeastAI_Default(beast* dabeast, edir &r) //gnasher's { edir D[4]; unsigned int desc=dabeast->X()*XYE_VERT+dabeast->Y()+game::beastcounter; //ignore sp 1/3 , do nothing 1/20 , direct 4/5 , pick random 1/4 //desc = (desc%301)%300; int n; bool found; if ((dabeast->GoFindXye(D, n, found, /*Ignoreloop*/ true, /*IgnoreSp*/ (desc%3==1), /*considerTeleports*/ false, /*considerStickies*/ false, /*range*/ 3 )) && (n>0) ) { if (! found) { if (!(desc%20)) return false; //Do nothing if (desc%5!=0) //direct step return OldBeastPickDirectDir(r,D,n,dabeast->X(),dabeast->Y(),game::XYE->X(), game::XYE->Y()); r=D[desc%n]; } else r=D[0]; return true; } return false; } bool BeastAI_Blob(beast* dabeast, edir &r) //blob's { bool intmode= (beast::BeastCount(BT_BLOBBOSS)); unsigned int desc=dabeast->X()*XYE_VERT+dabeast->Y()+game::beastcounter; edir D[4]; int n; bool found; if ((dabeast->GoFindXye(D, n, found, /*Ignoreloop*/ true, /*IgnoreSp*/ (desc%4==1) && ! intmode, /*considerTeleports*/ intmode, /*considerStickies*/ intmode, /*range*/ (intmode && (desc%10<=7))?150:5 )) && (n>0) ) { if (! found) { if ( desc%3==1 ) return false; //Do nothing if (desc%5<=3) //direct step return OldBeastPickDirectDir(r,D,n,dabeast->X(),dabeast->Y(),game::XYE->X(), game::XYE->Y()); r=D[desc%n]; //pick random } else r=D[0]; return true; } return false; } bool BeastAI_Virus(beast* dabeast, edir &r) //virus' { edir D[4]; unsigned int desc=dabeast->X()*XYE_VERT+dabeast->Y()+game::beastcounter; int n; bool found; if ((dabeast->GoFindXye(D, n, found, /*Ignoreloop*/ true, /*IgnoreSp*/ desc%2, /*considerTeleports*/ false, /*considerStickies*/ false, /*range*/ 3 )) && (n>0) ) { if (! found) { unsigned char tm=desc%10; if (tm==7) return false; //Do nothing if (tm<=6) //direct step return OldBeastPickDirectDir(r,D,n,dabeast->X(),dabeast->Y(),game::XYE->X(), game::XYE->Y()); r=D[desc%n]; //pick random } else r=D[0]; return true; } return false; } bool BeastAI_Spike(beast* dabeast, edir &r) //spike's { edir D[4]; unsigned int desc=dabeast->X()*XYE_VERT+dabeast->Y()+game::beastcounter; int n; bool found; if ((dabeast->GoFindXye(D, n, found, /*Ignoreloop*/ true, /*IgnoreSp*/ desc%10<=5, /*considerTeleports*/ false, /*considerStickies*/ false, /*range*/ 4 )) && (n>0) ) { if (! found) { if (desc%100==45) return false; //Do nothing if (desc%101<=100) //direct step return OldBeastPickDirectDir(r,D,n,dabeast->X(),dabeast->Y(),game::XYE->X(), game::XYE->Y()); r=D[desc%n]; //pick random } else r=D[0]; return true; } return false; } bool BeastAI_Twister(beast* dabeast, edir &r) //twister's { edir D[4]; unsigned int desc=dabeast->X()*XYE_VERT+dabeast->Y()+game::beastcounter; int n; bool found; if ((dabeast->GoFindXye(D, n, found, /*Ignoreloop*/ true, /*IgnoreSp*/ desc%10<=7, /*considerTeleports*/ false, /*considerStickies*/ false, /*range*/ 10 )) && (n>0) ) { if (! found) { if (desc%2==1) return false; //Do nothing if (desc%80<=60) //direct step return OldBeastPickDirectDir(r,D,n,dabeast->X(),dabeast->Y(),game::XYE->X(), game::XYE->Y()); r=D[desc%n]; //pick random } else r=D[0]; return true; } return false; } bool BeastAI_Dard(beast* dabeast, edir &r) //dards have a very special AI { int *v = &(dabeast->AIValue); bool go=true; char xx=game::XYE->X(), bx=dabeast->X(); char xy=game::XYE->Y(), by=dabeast->Y(); if (bx==xx) { if (xy>by) r= D_UP; else r=D_DOWN; } else if (by==xy) { if (xx>bx) r= D_RIGHT; else r=D_LEFT; } else go=false; edir f=dabeast->fac; if ( ((! go) || (r!=f)) && ( (*v)>0)) { r=f; (*v)--; return true; } if (go) { (*v)=10; return true; } return false; } bool IsPatienceAt(square* sq) { obj *object=sq->object; if ((object!=NULL) && (object->GetType()==OT_BEAST)) { beast* b= static_cast(object); if (b->BelongsToBeastType(BT_PATIENCE)) return (b->AIValue); } return false; } bool BeastAI_Patience(beast* dabeast, edir &r) { edir D[4]; int n; bool found; if(game::AllowRoboXyeMovement()) { if(dabeast->AIValue) dabeast->AIValue--; if(dabeast->GoFindXye(D, n, found, /*Ignoreloop*/ false, /*IgnoreSp*/ false, /*considerTeleports*/ true, /*considerStickies*/ true, /*range*/ 600 , /*random*/ false)&&(n==1)&&found) { r=D[0]; dabeast->AIValue=1; return true; } if(dabeast->GoFindASquare(IsPatienceAt,D, n, found, /*Ignoreloop*/ false, /*IgnoreSp*/ false, /*considerTeleports*/ true, /*considerStickies*/ true, /*range*/ 600 , /*random*/ false) &&(n==1)&&found ) { //dabeast->AIValue=1; r=D[0]; return true; } } return false; } bool BeastAI_Tiger(beast* dabeast, edir &r) { edir D[4]; int n; bool found; if (( game::AllowRoboXyeMovement() || !(game::counter2||game::counter5) ) && (dabeast->GoFindXye(D, n, found, /*Ignoreloop*/ false, /*IgnoreSp*/ false, /*considerTeleports*/ true, /*considerStickies*/ true, /*range*/ 600 , /*random*/ false)) //Most powerful AI possible. && (n==1) ) { if(!found) return false; r=D[0]; return true; } return false; } bool AI_BlobBoss_Gem(square* sq) { obj* object=sq->object; if (object==NULL) return false; return (object->GetType()==OT_GEM); } bool BeastAI_BlobBoss(beast* dabeast, edir &r) //BlobBoss { edir D[4]; int n; bool found; //dabeast->AIValue= (dabeast->AIValue<20)?dabeast->AIValue+1:0; if (dabeast->GoFindASquare( IsXyeAt,D, n, found,/*Ignoreloop*/ false,/*IgnoreSp*/ false,/*considerTeleports*/ true, /*considerStickies*/ true, /*range*/ 6 , /*random*/ false)) { if (n==1) { r=D[0]; return (true); } if ((dabeast->GoFindASquare( AI_BlobBoss_Gem,D, n, found,/*Ignoreloop*/ false,/*IgnoreSp*/ false,/*considerTeleports*/ true, /*considerStickies*/ true, /*range*/ 100 , /*random*/ false)) && (n==1)) { r=D[0]; return (true); } if (dabeast->GoFindASquare( IsXyeAt,D, n, found,/*Ignoreloop*/ false,/*IgnoreSp*/ false,/*considerTeleports*/ true, /*considerStickies*/ true, /*range*/ 100 , /*random*/ false)) { if ((n>1) && PickDirectDir(r,D,n,dabeast->X(),dabeast->Y(),game::XYE->X(), game::XYE->Y(),false,true)); else r=D[0]; return true; } } return false; } bool BeastAI_Ranger(beast* dabeast, edir &r) //ranger's { bool force=false; edir forced; char x=dabeast->X(),y=dabeast->Y(),xx=game::XYE->X(),xy=game::XYE->Y(); if (game::Mod2() && game::Mod5()); else if ((x==xx) && game::Mod2()) { forced=(xy>y)?D_UP:D_DOWN; force=true; } else if ((y==xy) && game::Mod2()) { forced=(xx>x)?D_RIGHT:D_LEFT; force=true; } else return false; if (force && (dabeast->fac!=forced)) return false; edir D[4]; int n; bool found; if ((dabeast->GoFindXye(D, n, found, /*Ignoreloop*/ true, /*IgnoreSp*/ false, /*considerTeleports*/ false, /*considerStickies*/ true, /*range*/ 30 )) && (n==1) ) { r=D[0]; return ((!force) || (r==forced)); } return false; } bool BeastAI_Static(beast* dabeast, edir &r) { if (dabeast->AIValue) { r= (dabeast->fac); return true; } return false; } bool BeastAI_StaticFails(beast* dabeast, edir &r) { dabeast->AIValue=false; dabeast->NewAnim(); return(false); } bool BeastAI_ReallyDumb(beast* dabeast, edir &r) { r= (dabeast->fac); return true; } bool BeastAI_WardFails(beast* dabeast, edir &r) { r= Opposite(dabeast->fac); return (true); } bool BeastAI_SpinnerFails(beast* dabeast, edir &r) { r= Clock(dabeast->fac); return (true); } bool BeastAI_AspinnerFails(beast* dabeast, edir &r) { r= AClock(dabeast->fac); return (true); } bool BeastAI_OnFail_DoNothing(beast* dabeast, edir &r) { return false; } /** Start Class Beast **/ unsigned int beast::count[BTYPEN]; bool beast::Floats() { return ((kind==BT_PATIENCE) || (kind==BT_DARD)); } void beast::ResetCounts() { for (int i=0; i(0,2);break; case (BT_SPINNER) : case(BT_ASPINNER): anim=GetRandom(0,1)*2;break; default: anim=GetRandom(0,1); } } void beast::PickAI() { switch(kind) { case(BT_VIRUS): AI=BeastAI_Virus; break; case(BT_TWISTER): AI=BeastAI_Twister; break; case(BT_RANGER): AI=BeastAI_Ranger; break; case(BT_SPIKE): AI=BeastAI_Spike; break; case(BT_BLOB): AI=BeastAI_Blob; break; case(BT_BLOBBOSS): AI=BeastAI_BlobBoss; break; case(BT_DARD): AI=BeastAI_Dard; break; case(BT_PATIENCE): AI=BeastAI_Patience; break; case(BT_TIGER): AI=BeastAI_Tiger; break; case(BT_WARD): case(BT_SPINNER): case(BT_ASPINNER): AI=BeastAI_ReallyDumb; break; case(BT_STATIC): AI=BeastAI_Static; break; default: AI=BeastAI_Default; } switch(kind) { case(BT_WARD): OnFail=BeastAI_WardFails; break; case(BT_SPINNER): OnFail=BeastAI_SpinnerFails; break; case(BT_ASPINNER): OnFail=BeastAI_AspinnerFails; break; case(BT_STATIC) : OnFail=BeastAI_StaticFails; break; default: OnFail=BeastAI_OnFail_DoNothing; } } void beast::NewAnim() { char old=anim; switch(kind) { case(BT_STATIC): if (AIValue) { anim=(anim>2)?0:anim+1; break; } case(BT_PATIENCE): if (anim==2) anim=GetRandom(0,1); else anim=2; break; case(BT_TIGER): if (anim==2) anim=GetRandom(0,1); else anim=2; break; case(BT_BLOB): case(BT_BLOBBOSS): anim=anim+(GetRandom(1,2)); while(anim>2) anim-=3; break; case(BT_SPINNER):case(BT_ASPINNER): anim=anim+1; while(anim>3) anim-=4; break; default: anim=(anim==1?0:1); } if (old!=anim) UpdateSquare(); } void beast::Draw(unsigned int x, unsigned int y,btype kind, edir fac, unsigned char anim,int AIValue) { Uint8 tx,ty; switch(kind) { case(BT_TWISTER): tx=17; ty=anim; break; case(BT_SPIKE): tx=19; ty=anim; break; case(BT_VIRUS): tx=18; ty=anim; break; case(BT_BLOB): tx=19; ty=anim+6; break; case(BT_BLOBBOSS): tx=19; ty=anim+12; break; case(BT_TIGER): tx=10; ty=12+anim; break; case(BT_PATIENCE): tx=19; ty=9+anim; break; case(BT_STATIC): if (AIValue) { tx=11+anim; ty=8; } else { tx=11; ty=15+anim; } break; case(BT_DARD): switch(fac) { case(D_UP): tx=19; break; case(D_LEFT): tx=18; break; case(D_DOWN): tx=17; break; default: tx=16; } ty= anim+2; break; case(BT_WARD): switch(fac) { case(D_UP): tx=19; break; case(D_LEFT): tx=18; break; case(D_DOWN): tx=17; break; default: tx=16; } ty= anim+4; break; case(BT_RANGER): switch(fac) { case(D_UP): tx=15; break; case(D_LEFT): tx=14; break; case(D_DOWN): tx=13; break; default: tx=12; } ty= anim+18; break; case(BT_SPINNER):case(BT_ASPINNER): tx=11; if (kind==BT_ASPINNER) ty=12-anim; else ty=9+anim; break; default: //gnasher tx=16; if (anim) ty=1; else ty=0; } Drawer D(game::sprites,sz*tx,ty*sz,sz,sz); D.Draw(game::screen,x,y); } void beast::Draw(unsigned int x, unsigned int y) { Draw(x,y,kind,fac,anim,AIValue); } bool beast::trypush(edir dir,obj* pusher) { if ((pusher) && (pusher->GetType()!=OT_XYE) ) { if (trypush_common(dir,pusher, false,NULL)) { if (kind==BT_STATIC) { AIValue=true; fac=dir; } tic=game::Counter(); return true; } } return(false); } bool beast::HasRoundCorner(roundcorner rnc) {return false; } bool beast::HasBlockColor(blockcolor bc) { return false; } ; bool beast::Loop_Sub(bool* died) { *died=false; bool Moved=false; if (DoMagnetism(true,true,&Moved)) return Moved; edir go=D_DOWN; if (AI(this,go)) { fac=go; if (trypush_common(fac,NULL,false,died)) return true; else { if ((! (*died) ) && OnFail(this,go) ) { fac=go; if (trypush_common(fac,NULL,false,died)) return true; else return false; } else return false; } //blerg } return false; } bool beast::Loop(bool* died) { bool OnTime=false; switch(kind) { case BT_SPINNER: case BT_ASPINNER: if ( ( game::counter5==0) || ( game::counter5==3) ) NewAnim(); break; case BT_STATIC: if( AIValue || (game::counter7==0) ) NewAnim(); break; default: if(game::counter7==0) NewAnim(); }; switch(kind) { case(BT_PATIENCE): case(BT_TIGER): case(BT_DARD): case(BT_RANGER): OnTime=true; break; case(BT_WARD): case(BT_SPINNER): case(BT_ASPINNER): OnTime=(! game::counter5); break; case(BT_STATIC): OnTime=(game::counter2==0); break; default: OnTime= ((! game::counter2) && (! game::counter5)); } if (OnTime && Loop_Sub(died)) { if (! (*died) ) { deathqueue::add(x,y,KT_KILLXYE); } return (true); } deathqueue::add(x,y,KT_KILLXYE); return false; } /** End Class Beast **/ /** Rattler and Rnode**/ rattler::rattler(square* sq, edir inidir, unsigned int G) { grow=G; type=OT_RATTLER; fac=inidir; anim=Chance(0.5); first=last=NULL; tic=0; ObjectConstruct(sq); } bool rattler::Floats() { return ((first!=NULL)||(grow!=0)); } edir GetConnectionDir(int x1,int y1, int x2, int y2) { if (x2 == x1) //Connection is vertical { if ( FixVert(y1+1) == y2) return (D_UP); else return (D_DOWN); } //Connection is horizontal if ( FixHorz(x1-1) == x2) return (D_LEFT); return (D_RIGHT); } void rattler::OnDeath() { if (first) //replace first node with a new head { unsigned char fx=first->x, fy=first->y; edir D=GetConnectionDir(fx,fy,x,y); rnode* nx=first->next; first->forgetkill=true; first->Kill(); rattler*nh= new rattler(game::Square(fx,fy),D,grow); nh->first=nx; nh->last=NULL; if (nx) { nx->prevhead=true; nx->prev=NULL; } while (nx) { nx->UpdateSquare(); nx->head=nh; nh->last=nx; nx= nx->next; } } } void rattler::NewAnim() { if (! game::counter4) { UpdateSquare(); anim=(! anim); } if ((! (game::counter9)) && (Chance(0.5) )) { rnode* cur=first; while (cur) { cur->NewAnim(); cur=cur->next; } } } void rattler::Grow(unsigned int G) { grow+=G; } void rattler::Node(square* sq) { unsigned char sx=sq->sqx,sy=sq->sqy; unsigned char lx,ly; if (last==NULL) { lx=x; ly=y; } else { lx=last->x; ly=last->y; } bool doit=false; if ((sx==lx) && (( sy==FixVert(ly+1) ) || (sy== FixVert(ly-1) ))) doit=true; else if ((sy==ly) && (( sx==FixHorz(lx+1) ) || (sx==FixHorz(lx-1) ))) doit=true; if (doit) { rnode* nd=new rnode(sq,this); if (first==NULL) { first=nd; last=nd; nd->prevhead=true; fac=GetConnectionDir(sx,sy,x,y); } else { last->next=nd; nd->prev=last; last=nd; } } } void rattler::Draw(unsigned int x, unsigned int y,bool anim,edir fac, rnode* first) { Uint8 tx,ty; ty=9+anim+ ((first!=NULL)*2) ; switch(fac) { case(D_UP): tx=13; break; case(D_DOWN): tx=15;break; case(D_LEFT): tx=12;break; default: tx=14; } Drawer D(game::sprites,tx*sz,ty*sz,sz,sz); D.Draw(game::screen,x,y); } void rattler::Draw(unsigned int x, unsigned int y) { Draw(x,y,anim,fac,first); } bool AI_Rattler_XYEorFood(square* sq) { obj* object=sq->object; if (object==NULL) return false; switch(object->GetType()) { case(OT_XYE): case(OT_RATTLERFOOD): return true; } return false; } bool AI_Rattler(rattler* dabeast, edir &r) { edir D[4]; int n; bool found; if ((dabeast->GoFindASquare(AI_Rattler_XYEorFood,D, n, found, /*loop*/ false, /*IgnoreSp*/ false, /*considerTeleports*/ false, /*considerStickies*/ false, /*range*/ 600 , /*UseRandom*/ false)) && (n>0) ) { if (n>1) return (PickMostDirectDir(r,D,n,dabeast->X(),dabeast->Y(),game::XYE->X(),game::XYE->Y())); //else r=D[0]; return true; } return false; } bool rattler::Loop(bool* died) { //for now just play with anim: NewAnim(); tic=(tic>=7)?0:tic+1; if (! tic) { char lx=x, ly=y,tx,ty; char dx=0,dy=0; if (AI_Rattler(this,fac)) { switch(fac) { case(D_UP): dy++; break; case(D_DOWN): dy--; break; case(D_LEFT): dx--; break; case(D_RIGHT): dx++; break; } dx=x+dx; dy=y+dy; dx= (dx>=XYE_HORZ)?0:(dx<0)?XYE_HORZ-1:dx; dy= (dy>=XYE_VERT)?0:(dy<0)?XYE_VERT-1:dy; if (AI_Rattler_XYEorFood(game::Square(dx,dy))) { grow++; if ((game::XYE->X()==dx) && (game::XYE->Y()==dy)) game::XYE->Kill(); } move( dx,dy); rnode* cur=first; while (cur) { tx=cur->X(); ty=cur->Y(); cur->move(lx,ly); lx=tx; ly=ty; cur=cur->next; } if (grow>0) { Node(game::Square(lx,ly)); grow--; } return(true); } else tic=7; } return (false); } rnode::rnode(square* sq, rattler* rhead) { forgetkill=false; head=rhead; type=OT_RATTLERNODE; prev=NULL; next=NULL; prevhead=false; anim=Chance(0.5); ObjectConstruct(sq); } void rnode::OnDeath() { if (forgetkill) return; //Make sure previous rattler/node knows they lost this node. if (prevhead) { head->first=NULL; head->last=NULL; head->UpdateSquare(); } else { prev->next=NULL; prev->UpdateSquare(); } if ( head->last == this ) { head->last = prev; } if (next) //replace next node with a new head { unsigned char fx=next->x, fy=next->y; edir D=GetConnectionDir(fx,fy,x,y); rnode* nx=next->next; next->forgetkill=true; next->Kill(); rattler*nh= new rattler(game::Square(fx,fy),D,0); nh->first=nx; nh->last=NULL; if (nx) { nx->prevhead=true; nx->prev=NULL; } while (nx) { nx->head=nh; nh->last=nx; nx= nx->next; } } } void rnode::NewAnim() { if ((! (game::counter9)) && (Chance(0.5) )) { UpdateSquare(); anim=(! anim); } } void rnode::Draw(unsigned int drawx, unsigned int drawy) { Uint8 tx=0,ty=0,px,py; //I am assuming that everything is always going to be allright if (prevhead) { px=head->X(); py=head->Y(); } else { px=prev->x; py=prev->y; } if (next==NULL) //Just show tail switch (GetConnectionDir(x,y,px,py)) { case(D_UP): tx=12+anim; ty=17; break; case(D_DOWN): tx=12+anim; ty=16; break; case(D_LEFT): tx=14+anim; ty=17; break; default: //Right tx=14+anim; ty=16; } else { //enum edir { D_UP=0,D_DOWN=1,D_LEFT=2,D_RIGHT=3}; edir d1=GetConnectionDir(x,y,px,py); edir d2=GetConnectionDir(x,y,next->x,next->y); edir d; if (d2GetType()) { case (OT_XYE): case(OT_ROBOXYE): if (gobject=game::Square(x,y)->gobject) { if (! gobject->CanEnter(pusher,dir)) return false; } game::Square(x,y)->object=NULL; recycle::add(this);; return true; } return false; } bool earth::HasRoundCorner(roundcorner rnc) { return round; } void earth::ChangeColor(Uint8 nR, Uint8 nG, Uint8 nB) { R=nR;G=nG;B=nB; } inline bool earth::HasBlockColor(blockcolor bc) { return false; } /**End Class earth**/ /**Start Class Key**/ unsigned int key::Got[XYE_OBJECT_COLORS]; key::key(square* sq, blockcolor color) { type=OT_KEY; c=color; ObjectConstruct(sq); } void key::Draw(unsigned int x, unsigned int y) { Drawer D(game::sprites,sz*6,sz*4,sz,sz); D.SetColors(options::BKColor[c],255); D.Draw(game::screen,x,y); } bool key::Loop(bool* died) { *died=false; bool Moved=false; if (DoMagnetism(true,true,&Moved)) return Moved; edir go; return false; } bool key::trypush(edir dir,obj* pusher) { gobj* gobject; if (pusher->GetType()==OT_XYE) { if (gobject=game::Square(x,y)->gobject) { if (! gobject->CanEnter(pusher,dir)) return (trypush_common(dir,pusher,false,NULL)); } Got[(unsigned int)(c)]++; game::Square(x,y)->object=NULL; Kill(false); return true; } return (trypush_common(dir,pusher,false,NULL)); } bool key::HasRoundCorner(roundcorner rnc) { return false; } inline bool key::HasBlockColor(blockcolor bc) { return false; } void key::UseKey(blockcolor ofcolor) { Got[(unsigned int)(ofcolor)]--; } void key::ResetCounts() { for (int i=0; i 0 ); } bool key::GetXyesKeys(unsigned int &yl,unsigned int &rd,unsigned int &bl,unsigned int &gr,unsigned int &pr) { yl=Got[0]; rd=Got[1]; bl=Got[2]; gr=Got[3]; pr=Got[4]; return (yl || rd || bl|| gr || pr); } /**End Class Key**/ /**Start Class Lock**/ lock::lock(square* sq, blockcolor color) { type=OT_LOCK; c=color; ObjectConstruct(sq); } void lock::Draw(unsigned int x, unsigned int y) { Drawer D(game::sprites,sz*7,sz*4,sz,sz); D.SetColors(options::BKColor[c],255); D.Draw(game::screen,x,y); } bool lock::trypush(edir dir,obj* pusher) { if ((pusher->GetType()==OT_XYE) && (key::GotKey(c))) { key::UseKey(c); game::Square(x,y)->object=NULL; recycle::add(this);; return true; } return false; } bool lock::HasRoundCorner(roundcorner rnc) { return false; } inline bool lock::HasBlockColor(blockcolor bc) { return false; } /**End Class Lock**/ /**Start Class Gem**/ unsigned int gem::count[XYE_OBJECT_COLORS + 1]; gem::gem(square* sq,gemtype t) { if (t == B_PURPLE ) { t = B_BLUE; } count[XYE_OBJECT_COLORS]++; count[(unsigned int)(t)]++; type=OT_GEM; gemkind=t; anim=!(Chance(0.5)); ObjectConstruct(sq); } void gem::ResetCounts() { count[0]=count[1]=count[2]=count[3]=count[XYE_OBJECT_COLORS]=0; } bool gem::GotAllGems() { return (count[XYE_OBJECT_COLORS]==0); } bool gem::GotAllGems(blockcolor c) { return (count[(unsigned int)(c)]==0); } bool gem::GetRemanents(unsigned int &yl,unsigned int &rd,unsigned int &bl,unsigned int &gr) { yl=count[0]; rd=count[1]; bl=count[2]; gr=count[3]; return ((yl) || (rd) || (bl) || (gr)); } bool gem::Loop(bool* died) { *died=false; if ((game::Mod4()) && (Chance(0.04))) { UpdateSquare(); anim=! anim; } return false; } void gem::Draw(unsigned int x, unsigned int y,gemtype gemkind,bool anim) { Uint8 tx,ty; if (anim) ty=3; else ty=4; switch(gemkind) { case(GEM_DIAMOND): tx=2; break; case(GEM_RUBY): tx=3; break; case(GEM_EMERALD): tx=4; break; default: tx=5; break; } Drawer D(game::sprites,tx*sz,ty*sz,sz,sz); D.Draw(game::screen,x,y); } void gem::Draw(unsigned int x, unsigned int y) { Draw(x,y,gemkind,anim); } bool gem::trypush(edir dir,obj* pusher) { if (pusher->GetType()==OT_XYE) { gobj* gobject; if (gobject=game::Square(x,y)->gobject) { if (! gobject->CanEnter(pusher,dir)) return false; } game::Square(x,y)->object=NULL; count[XYE_OBJECT_COLORS]--; count[(unsigned int)(gemkind)]--; if (! count[XYE_OBJECT_COLORS]) game::TerminateGame(true); recycle::add(this);; return true; } return false; } inline bool gem::HasRoundCorner(roundcorner rnc) { return false; } inline bool gem::HasBlockColor(blockcolor bc) { return false; } /**End Class Gem**/ /**Start Class Gem**/ unsigned int star::count, star::acquired; star::star(square* sq) { count++; type=OT_STAR; anim=!(Chance(0.5)); ObjectConstruct(sq); } void star::ResetCounts() { count=acquired=0; } int star::GetRemaining() { return (count-acquired); } int star::GetAcquired() { return (acquired); } bool star::Loop(bool* died) { *died=false; if ((game::Mod4()) && (Chance(0.04))) { UpdateSquare(); anim=! anim; } return false; } void star::Draw(unsigned int x, unsigned int y) { Uint8 tx,ty; tx=9; if (anim) ty=12; else ty=13; Drawer D(game::sprites,tx*sz,ty*sz,sz,sz); D.Draw(game::screen,x,y); } bool star::trypush(edir dir,obj* pusher) { if (pusher->GetType()==OT_XYE) { gobj* gobject; if (gobject=game::Square(x,y)->gobject) { if (! gobject->CanEnter(pusher,dir)) return false; } game::Square(x,y)->object=NULL; acquired++; recycle::add(this); return true; } return false; } inline bool star::HasRoundCorner(roundcorner rnc) { return false; } inline bool star::HasBlockColor(blockcolor bc) { return false; } /**End Class Gem**/ /**Begin Trick Door Class**/ /** Trick Door**/ SDL_Color tdoor::DefColor; SDL_Color tdoor::ForceArrowDefColor; tdoor::tdoor(square* sq,tdtype t,bool up,bool right, bool down, bool left) { ALLOW_UP=up; ALLOW_RIGHT=right; ALLOW_DOWN=down; ALLOW_LEFT=left; tt=t; switch(tt) { case(td_FORCEARROW_UP): case(td_FORCEARROW_LEFT): case(td_FORCEARROW_DOWN): case(td_FORCEARROW_RIGHT): ALLOW_NONXYE=true; R=ForceArrowDefColor.r; G=ForceArrowDefColor.g; B=ForceArrowDefColor.b; break; default: ALLOW_NONXYE=false; R=DefColor.r; G=DefColor.g; B=DefColor.b; } type=OT_TRICKDOOR; anim=true; GObjectConstruct(sq); } void tdoor::Draw(unsigned int x, unsigned int y) { Uint8 tx,ty; switch (tt) { case(td_HORZ): tx=8; break; case(td_VERT): tx=7; break; case(td_FORCEARROW_DOWN): case(td_FORCEARROW_RIGHT): tx=10; break; case(td_FORCEARROW_UP): case(td_FORCEARROW_LEFT): tx=9; break; default: tx=6; } switch (tt) { case(td_FORCEARROW_UP): case(td_FORCEARROW_DOWN): ty=11; break; case(td_FORCEARROW_LEFT): case(td_FORCEARROW_RIGHT): ty=10; break; default: if (anim) ty=10; else ty=11; } if ((game::counter8==0)) anim=!anim; Drawer D(game::sprites,tx*sz,ty*sz,sz,sz); D.SetColors(R,G,B,255); D.Draw(game::screen,x,y); } void tdoor::ChangeColor(Uint8 nR,Uint8 nG,Uint8 nB) { R=nR; G=nG; B=nB; } void tdoor::OnEnter(obj *entering) {} void tdoor::OnLeave(obj *entering) {} bool tdoor::CanEnter(obj *entering, edir dir) { otype ot=entering->GetType(); if ((!ALLOW_NONXYE) && (ot!=OT_XYE) && (ot!=OT_ROBOXYE)) return false; switch(dir) { case(D_UP): return ALLOW_DOWN; case(D_RIGHT): return ALLOW_LEFT; case(D_LEFT): return ALLOW_RIGHT; } return ALLOW_UP; } bool tdoor::CanLeave(obj *entering, edir dir) { return true; } void tdoor::ResetDefaults() { DefColor = options::OneWayDoorColor; ForceArrowDefColor = options::ForceArrowColor; } void tdoor::ChangeDefaultColor(Uint8 nR,Uint8 nG,Uint8 nB) { DefColor.r=nR; DefColor.g=nG; DefColor.b=nB; DefColor.unused=255; } void tdoor::ChangeForceArrowDefaultColor(Uint8 nR,Uint8 nG,Uint8 nB) { ForceArrowDefColor.r=nR; ForceArrowDefColor.g=nG; ForceArrowDefColor.b=nB; ForceArrowDefColor.unused=255; } /**End Trick Door Class**/ /** Door **/ blockdoor::blockdoor(square* sq, bool AsTrap, bool startopen, blockcolor bc) { mode=startopen; trap=AsTrap; if (startopen) anim=0; else anim=3; c=bc; type=OT_BLOCKDOOR; GObjectConstruct(sq); } void blockdoor::Loop() { if (IsOpen()) { if (anim<3) anim++; } else if (anim>0) { obj* object; object= (game::Square(this->x,this->y)->object); if ((! object ) || InsideKind(object->GetType()) ) anim--; } } bool blockdoor::IsOpen() { if (trap) return (marked::AtLeastOneActive(c)==mode); return (marked::AllActive(c)==mode); } void blockdoor::Draw(unsigned int x, unsigned int y) { Uint8 tx=7,ty=anim+5; if(trap) tx++; Drawer D(game::sprites,tx*sz,ty*sz,sz,sz); D.SetColors(options::BKColor[c],255); D.Draw(game::screen,x,y); } inline void blockdoor::OnEnter(obj *entering) { if ( (! IsOpen()) && (InsideKind(entering->GetType()) )) { RenderAfterObjects=true; } } void blockdoor::OnLeave(obj *entering) {RenderAfterObjects=false;} bool blockdoor::CanEnter(obj *entering, edir dir) { return (IsOpen()); } bool blockdoor::CanLeave(obj *entering, edir dir) { return true; } bool blockdoor::IsOfColor(blockcolor bc) { return ((bc==c)); } /**End door Class**/ /** Marked Area**/ marked::marked(square* sq,blockcolor bc) { c=bc; count[(unsigned int)(c)]++; anim=0; active=false; type=OT_MARKEDAREA; GObjectConstruct(sq); } void marked::OnDeath() { count[(unsigned int)(c)]--; } void marked::Draw(unsigned int x, unsigned int y) { Uint8 tx=6,ty=anim+5; Drawer D(game::sprites,tx*sz,ty*sz,sz,sz); D.SetColors(options::BKColor[c],255 ); D.Draw(game::screen,x,y); if (active) anim= (anim>=3?0:anim+1); } void marked::OnEnter(obj *entering) { if (active=RenderAfterObjects=(entering->HasBlockColor(c))) { activeN[(unsigned int)(c)]++; } } void marked::OnLeave(obj *entering) { if (active) { active=RenderAfterObjects=false; activeN[(unsigned int)(c)]--; } } bool marked::CanEnter(obj *entering, edir dir) { return true; } bool marked::CanLeave(obj *entering, edir dir) { return true; } unsigned int marked::count[XYE_OBJECT_COLORS]; unsigned int marked::activeN[XYE_OBJECT_COLORS]; void marked::Reset() { for (int i=0; i0); } /**End Marked Area Class**/ /** Fire pad**/ firepad::firepad(square* sq) { anim=0; type=OT_FIREPAD; D=D_DOWN; GObjectConstruct(sq); } void firepad::OnDeath() {} void firepad::Draw(unsigned int x, unsigned int y) { Uint8 tx,ty; switch(anim) { case(3): tx=3; ty=6; break; case(2): tx=2; ty=6; break; case(1): tx=3; ty=5; break; default: tx=2; ty=5; } if (anim) anim=(anim==3)?0:anim+1; Drawer D(game::sprites,tx*sz,ty*sz,sz,sz); D.Draw(game::screen,x,y); } void firepad::OnEnter(obj *entering) { if ((entering->HasBlockColor(B_RED) ) && (entering->GetType() != OT_FIREBALL) ) { anim= 1; bool round = entering->HasRoundCorner(RC_1); entering->Kill(true); //true: Don't trigger funny things like the red timer's explosion dangerous* dg= new dangerous(game::Square(x,y),D,true); dg->tic = game::Counter(); dg->fromRound = round; new explosion(game::Square(x,y), 1); } } void firepad::OnLeave(obj *entering) { } bool firepad::CanEnter(obj *entering, edir dir) { D=dir; return true; } bool firepad::CanLeave(obj *entering, edir dir) { return true; } /**End Fire Pad Class**/ /** Pit**/ bool pit::IsEnabledInstance(gobj* gobject) { if (! gobject) return false; if (gobject->GetType()!=OT_PIT) return false; pit* p=static_cast(gobject); return (! p->end); } pit::pit(square* sq) { end=dis=false; alpha=255; dec=12; sur=NULL; type=OT_PIT; GObjectConstruct(sq); } void pit::OnDeath() { if (sur) SDL_FreeSurface(sur); sur=NULL; } void pit::Loop() { if(!end && !dis) { //verify lone big blocks... square* sq=game::Square(pit::x,pit::y); obj* object = sq->object; if (object!=NULL) { OnEnter(object); } } if (dis || !end) { return; } if (alpha>=31) { if (! dec) { alpha-=31; } else { dec--; } } else { alpha=0; } } void pit::Draw(unsigned int x, unsigned int y) { if (dis) return; square* sq=game::Square(pit::x,pit::y); if (end) { if (alpha<=31) { alpha=0; SDL_FreeSurface(sur); sur=NULL; end=false; dis=true; Kill(); } else { Drawer D(sur,0,0,sz,sz); D.SetColors(255,255,255,alpha); D.Draw(game::screen,x,y); } } else { Drawer D(game::sprites,4*sz,19*sz,sz,sz); D.SetColors(sq->R,sq->G,sq->B,255); D.Draw(game::screen,x,y); } } bool pit::CanConsume(obj* object) { beast *b; rattler *r; switch (object->GetType()) { case(OT_FIREBALL): return false; case(OT_BEAST): b= static_cast(object); if (b->Floats()) return false; break; case(OT_RATTLER): r= static_cast(object); if (r->Floats()) return false; break; case(OT_RATTLERNODE): return false; case(OT_LARGEBLOCK): { largeblock* lb=static_cast(object); return ( lb->isReallyASmallBlock() ); } } return true; } void pit::OnEnter(obj *entering) { if ( (! end) && (! dis) ) { if(! pit::CanConsume(entering)) return; SDL_Surface* tm=game::screen; game::screen=sur= CreateFixedRGBASurface(0,sz,sz); square* sq=game::Square(x,y); SDL_FillRect(sur, 0,0,sz,sz, SDL_MapRGB(sur->format,sq->R,sq->G,sq->B ) ); Draw(0,0); end= true; Sint16 off = std::max( (Sint16)(sz/15.0+0.5),1); entering->Draw(off,off); Drawer D(game::sprites,5*sz ,19*sz,sz,sz); D.SetColors(sq->R,sq->G,sq->B,255); D.Draw(sur,0,0); entering->Kill(true); //true: Don't trigger funny things like the red timer's explosion game::screen=tm; } } void pit::OnLeave(obj *entering) { } bool pit::CanEnter(obj *entering, edir dir) { if (end) return true; switch (entering->GetType()) { case(OT_RATTLER): case(OT_RATTLERNODE): return true; } return true; } bool pit::CanLeave(obj *entering, edir dir) { return true; } /**End Pit Class**/ /**Begin Class Hint **/ hint* hint::active; hint::hint(square* sq, string ihint,bool warning) { xcla=warning; type=(xcla)?OT_WARNING:OT_HINT; text=ihint; GObjectConstruct(sq); } void hint::Draw(unsigned int x, unsigned int y) { Drawer D(game::sprites,0,0,0,0); if (xcla) D.ChangeRect(7*sz,3*sz,sz,sz); else D.ChangeRect(6*sz,3*sz,sz,sz); D.Draw(game::screen,x,y); } void hint::Draw(unsigned int x, unsigned int y,bool xcla) { Drawer D(game::sprites,0,0,0,0); if (xcla) D.ChangeRect(7*sz,3*sz,sz,sz); else D.ChangeRect(6*sz,3*sz,sz,sz); D.Draw(game::screen,x,y); } void hint::OnEnter(obj *entering) { if (entering->GetType()==OT_XYE) active=this; } void hint::OnLeave(obj *entering) { if (entering->GetType()==OT_XYE) active=NULL; } bool hint::CanEnter(obj *entering, edir dir) { return true; } bool hint::CanLeave(obj *entering, edir dir) { return true; } /*void hint::ChangeColor(unsigned int nbc,unsigned int nfc) { bcolor=nbc;fcolor=nfc; }*/ string hint::globaltext; void hint::SetHint(string hint) { text=hint; } void hint::Reset() { globaltext=""; active=NULL; } bool hint::Active() { return (active!=NULL); } const char* hint::GetActiveText() { string res; if (active==(hint*)(1)) res = globaltext; else if (active) res=active->text; return res.c_str(); } void hint::SetGlobalHint(const char* gl) { globaltext = string(gl); //globaltext=gl; } void hint::SetGlobalHint(string &gl) { globaltext=gl; } bool hint::GlobalHintExists() { return (globaltext!=""); } void hint::GlobalHint(bool enb) { if (enb && (globaltext!="")) active=(hint*)(1); else active=NULL; } /**End Class Hint**/ /**Begin Class Portal **/ bool portal::ignore=false; void portal::Reset() { ignore=false; } portal::portal(square* sq,Uint8 cR, Uint8 cG, Uint8 cB, signed int TargetX, signed int TargetY) { //portals are ground objects that change constantly and use custom colors, better cache the color they use. if ((cR!=255) || (cG!=255) || (cB!=255)) RecolorCache::savecolor(cR,cG,cB,255); type=OT_PORTAL; target=game::SquareN(TargetX,TargetY); canim=GetRandomInt(0,2); R=cR; G=cG; B=cB; xyealpha=0x00000000; GObjectConstruct(sq); } void portal::Loop() { if (game::Mod4()) { canim++; if (canim>=3) canim=0; } if (xyealpha>0) { xyealpha= (xyealpha==255)?254:(xyealpha>32)?(xyealpha-32):0; } } void portal::Draw(unsigned int x, unsigned int y) { Uint8 tx,ty; Drawer D(game::sprites,8*sz,canim*sz,sz,sz); D.SetColors(R,G,B,255); D.Draw(game::screen,x,y); if (xyealpha>0) { D.ChangeRect(0,0,sz,sz); D.SetColors(game::PlayerColor,xyealpha); D.Draw(game::screen,x,y); } } bool AllowedForPortalTeleport(square* sq, obj* togo) { if (sq->object!=NULL) return false; gobj* gobject=sq->gobject; return ((gobject==NULL) || (gobject->GetType()==OT_PORTAL)); } void portal::OnEnter(obj *entering) { if ((! ignore) && (entering->GetType()==OT_XYE)) { char cx=target->sqx,cy=target->sqy,rx,ry; if (! game::FindGoodPoint(cx,cy,rx,ry, game::XYE, AllowedForPortalTeleport )) game::Error( "level is full?!"); ignore=true; xyealpha=game::XYE->alpha; game::XYE->alpha=32; game::FlashXyePosition(); game::XYE->move(rx,ry); ignore=false; } } void portal::OnLeave(obj *entering) {} bool portal::CanEnter(obj *entering, edir dir) { return true; } bool portal::CanLeave(obj *entering, edir dir) { return true; } void portal::ChangeColor(Uint8 cR, Uint8 cG, Uint8 cB) { R=cR; G=cG; B=cB; } /**End Class Portal**/ /**Start class window block **/ /** Window Block **/ unsigned int windowblock::count[XYE_OBJECT_COLORS]; unsigned int windowblock::activeN[XYE_OBJECT_COLORS]; windowblock::windowblock(square* sq,blockcolor b) { bc=b; type=OT_WINDOW; anim=0; count[bc]++; active=false; ObjectConstruct(sq); } bool windowblock::HasBlockColor(blockcolor bca) { return (bc==bca); } bool windowblock::trypush(edir dir,obj* pusher) { if (activeN[bc]==count[bc]) return trypush_common(dir,pusher,false,NULL); return false; } void windowblock::Draw(unsigned int x, unsigned int y) { Uint8 tx,ty; ty=7; tx=9+anim; Drawer D(game::sprites,tx*sz,ty*sz,sz,sz); D.SetColors(options::BKColor[bc],255); D.Draw(game::screen,x,y); } bool windowblock::Detect(char dx, char dy) { square* sq=game::SquareN(dx,dy); obj* o; if (o= sq->object) return (o->HasBlockColor(bc) && (o->GetType()!=OT_WINDOW) ); return(false); } bool windowblock::CanMove(windowblock* w) { blockcolor c=w->bc; return (count[c]==activeN[c]); } bool windowblock::Loop(bool* died) { bool activate=(Detect(x+1,y) || Detect(x-1,y) || Detect(x,y+1) || Detect(x,y-1)) ; if (activate!=active) { if (activate) activeN[bc]++; else { activeN[bc]--; if (anim>3) anim=0; } } if ((activate!=active) || active) obj::UpdateSquare(); active=activate; if (activeN[bc]==count[bc]) { if ((anim<4) || (anim>5) || (game::Mod5()) ) { anim=(anim==4)?5:4; obj::UpdateSquare(); } obj::DoMagnetism(true,true, &activate); *died=false; return(activate); } else if (active) anim= anim>=3?0:anim+1; *died=false; return(false); } void windowblock::ResetCounts() { for(int i=0;inext; delete c; } first=current=NULL; } void deathqueue::add(char ax,char ay, killtype t) { if (first==NULL) { first=new killzone; first->kt=t; first->x=ax; first->y=ay; first->next=NULL; current=first; } else { killzone *tm=new killzone; tm->kt=t; tm->x=ax; tm->y=ay; tm->next=NULL; current->next=tm; current=tm; } } void KillZone_KillXye(killzone *K) { xye* XYE = game::XYE; char dx=K->x - XYE->X(); char dy=K->y - XYE->Y(); dx= dx<0?-dx:dx; dy= dy<0?-dy:dy; if (( (dx==0) && (dy<=1) ) || ((dy==0) && (dx<=1) )) { XYE->Kill(); } } void KillZone_Fire(killzone *K) { xye* XYE = game::XYE; char kx=K->x,ky=K->y , i; for (i=0;i<5;i++) { game::SmallBoom(game::SquareN(kx+deathqueue::incx[i],ky+deathqueue::incy[i]),true,deathqueue::incx[i],-deathqueue::incy[i]); } } void ExecuteKillZone(killzone *K) { switch (K->kt) { case(KT_KILLXYE): KillZone_KillXye(K); break; case(KT_FIRE): KillZone_Fire(K); break; } } bool deathqueue::KillNow() { if (first==NULL) return false; killzone *tm, *c=first; first=current=NULL; do { ExecuteKillZone(c); tm=c; c=c->next; delete tm; } while (c!=NULL); return true; } /** deathqueue ends**/ /** Explosion !! Begins **/ void explosion::ex(square *sq, unsigned char kind) { creation=game::counter; pos=sq; explosion* other= sq->ex; if (other!=NULL) { kind = std::min(kind,sq->ex->type); delete other; } sq->ex=this; type= kind>2? 2: kind; xobjectoffset=0; yobjectoffset=0; } void explosion::setDrawingXYOffset(int xo, int yo) { xobjectoffset=xo; yobjectoffset=yo; } void explosion::getDrawingXYOffset(int &xo, int &yo) { int anim=game::counter-creation; if (anim==1) { xo=xobjectoffset; yo=yobjectoffset; } else { xo=0; yo=0; } if (type==1) { xo*=2; yo*=2; } } explosion::explosion(square *sq, unsigned char kind) { ex(sq,kind); } explosion::explosion(square *sq) { ex(sq,0); } explosion::~explosion() { pos->ex=NULL; } void explosion::Draw(unsigned int x, unsigned int y) { int anim=game::counter-creation; if ((anim>=4)||(anim<0)) { pos->Update=true; delete this; } else if (type!=2) { Uint8 tx,ty; switch (anim) { case(0): tx=0; ty=13; break; case(1): tx=1; ty=13; break; case(2): tx=0; ty=14; break; default: tx=1; ty=14; } tx+=type*2; Drawer D(game::sprites,tx*sz,ty*sz,sz,sz); D.Draw(game::screen,x,y); } } /** Explosion Ends **/ /** Pseudo class square memory **/ bool sqMem::mem[XYE_HORZ][XYE_VERT]; void sqMem::reset(bool val) { char j; for (char i=0;iobject==NULL) { gobj *gobject=sq->gobject; return ((gobject==NULL) || (gobject->CanEnter(object,dir))); } return false; } bool Allowed(obj* object, edir dir, square* sq, otype except) { obj* sqo=sq->object; if ((sqo==NULL) || (sqo->GetType()==except)) { gobj *gobject=sq->gobject; return ((gobject==NULL) || (gobject->CanEnter(object,dir))); } return false; } void DebugMsg(const char *msgText, void *outParam) { //game::hge->System_Log(msgText,outParam); } edir Opposite(edir dir) { switch(dir) { case(D_UP): return D_DOWN; case(D_DOWN): return D_UP; case(D_RIGHT): return D_LEFT; } return D_RIGHT; } // I sometimes have the feeling that it is better to use goto and label, I had to use this thing for the // do while in the other function bool PickDirectDir_Sub(bool &repet) { if (repet) { repet=false; return (true); } return false; } bool OldBeastPickDirectDir(edir &r, edir dirs[], unsigned char dirn, char x1, char y1, char x2, char y2) { r= PickDirectDir(x1,y1,x2,y2,false,true); for (int i=0;ix1) r=D_RIGHT; else r=D_LEFT; } else if (y2>y1) r=D_UP; else r=D_DOWN; for (int i=0;i0)) { r=D_UP; return (true); } break; case(D_DOWN): if ( ((!repet) || (! horz)) && (dy<0)) { r=D_DOWN; return (true); } break; case(D_LEFT): if ( ((!repet) || horz) && (dx<0)) { r=D_LEFT; return (true); } break; default: if ( ((!repet) || horz) && (dx>0)) { r=D_RIGHT; return (true); } } while (PickDirectDir_Sub(repet)); return (false); } bool PickMostDirectDir(edir &r, edir dirs[], unsigned char dirn, char x1, char y1, char x2, char y2) { if (dirn==0) return false; if (dirn==1) r=dirs[0]; char dx=x2-x1, adx=(dx<0?-dx:dx); char dy=y2-y1, ady=(dy<0?-dy:dy); edir prio[4]; if (ady>adx) //Prio vert; { if (dy>0) //Prio up { prio[0]=D_UP; prio[3]=D_DOWN; } else { prio[0]=D_DOWN; prio[3]=D_UP; } if (dx>0) //Prio right { prio[1]=D_RIGHT; prio[2]=D_LEFT; } else { prio[1]=D_LEFT; prio[2]=D_RIGHT; } } else //Prio Horz; { if (dx>0) //Prio right { prio[0]=D_RIGHT; prio[3]=D_LEFT; } else { prio[0]=D_LEFT; prio[3]=D_RIGHT; } if (dy>0) //Prio up { prio[1]=D_UP; prio[2]=D_DOWN; } else { prio[2]=D_DOWN; prio[1]=D_UP; } } unsigned int i=0,j; for (i=0;i<4;i++) for (j=0;jobject; if (object!=NULL) return (object->GetType()==OT_XYE ) ; signed int x=sq->sqx,y=sq->sqy; signed int xx=game::XYE->X(),xy=game::XYE->Y(); x=xx-x; y=xy-y; x=(x>0)?x:-x; y=(y>0)?y:-y; return ( ((x==0) && (y<=1)) || ((y==0) && (x<=1)) ); } bool IsXyeOrBotAt(square* sq) { obj *object=sq->object; if (object==NULL) return false; switch(object->GetType()) case(OT_XYE): case(OT_ROBOXYE): case(OT_RATTLER): case(OT_RATTLERNODE): return true; return (false); } char FixVert(char vert) { return (vert>=XYE_VERT)?0:(vert<0)?XYE_VERT-1:vert; } char FixHorz(char horz) { return (horz>=XYE_HORZ)?0:(horz<0)?XYE_HORZ-1:horz; } void FixCoordinates(char &horz, char &vert) { vert=(vert>=XYE_VERT)?0:(vert<0)?XYE_VERT-1:vert; horz=(horz>=XYE_HORZ)?0:(horz<0)?XYE_HORZ-1:horz; } /** Object recycle queue ** struct recycle_entry { obj* o; recycle_entry* next; } class recycle { private: static recycle_entry* first; public: static void init(); static void run(); static void add(obj* o); } /** /Object recycle queue **/ /** class recycle **/ recycle_entry* recycle::first=NULL; void recycle::init() { first=NULL; } void recycle::run() { recycle_entry* tm; while(first!=NULL) { tm=first; first=first->next; delete (tm->o); delete tm; } } void recycle::add(obj* o) { recycle_entry* nw=new recycle_entry; nw->next=first; nw->o=o; first=nw; } /** end class recycle **/ xye-0.12.2+dfsg/src/xye.h000066400000000000000000001155251225403634500151020ustar00rootroot00000000000000#include "vxsdl.h" #ifndef FONTINCLUDED #include "font.h" #endif #include "levels.h" #include "window.h" #include #include "gen.h" #ifndef XYE_HORZ #define XYE_HORZ 30 #define XYE_VERT 20 #endif #define XYE_GAMEX 3 #define XYE_GAMEY 3 #define XYE_XTRA_X 3 #define XYE_XTRA_Y 3 #define XYE_FPS 20 //#define XYE_FPS 2 #define XYE_ZOOMFC 1.25 //They Used to be different enums #define GEM_DIAMOND B_BLUE #define GEM_RUBY B_RED #define GEM_TOPAZ B_YELLOW #define GEM_EMERALD B_GREEN const int XYE_FASTFORWARD_SPEED=3; using std::string; enum edir { D_UP=0,D_DOWN=1,D_LEFT=2,D_RIGHT=3}; enum blockcolor { B_YELLOW=0, B_RED=1, B_BLUE=2, B_GREEN=3, B_PURPLE=4 }; const int XYE_OBJECT_COLORS = 5; enum roundcorner { RC_1,RC_7,RC_9,RC_3 }; typedef blockcolor gemtype; enum groundskin { GROUND_1, GROUND_2 }; enum killtype { KT_KILLXYE /*Kill Xye*/, KT_KILLORGANICS /*Kill Xye and monsters*/, KT_FIRE /*Kill any thing that is not fire resistant, also shows a fire effect*/}; unsigned int BC2Color(blockcolor bc); enum otype { OT_XYE, OT_ROBOXYE, OT_WALL, OT_BLOCK, OT_TRICKDOOR, OT_HINT, OT_WARNING, OT_EARTH, OT_GEM, OT_TELEPORT, OT_BLACKHOLE, OT_MINE, OT_FIREBALL, OT_SURPRISE, OT_PUSHER, OT_ARROW, OT_TURNER, OT_LOWDENSITY, OT_AUTO, OT_FACTORY, OT_SNIPER, OT_FILLER, OT_NUMBER, OT_MAGNETIC, OT_BLOCKDOOR, OT_MARKEDAREA, OT_GEMBLOCK, OT_KEY, OT_LOCK, OT_PORTAL, OT_TOGGLE, OT_EXIT, OT_BEAST, OT_RATTLER, OT_RATTLERNODE, OT_RATTLERFOOD, OT_FIREPAD, OT_PIT, OT_WILDCARD, OT_WINDOW, OT_SCROLLBLOCK, OT_METALBLOCK, OT_LARGEBLOCK, OT_STAR }; enum btype { BT_GNASHER=0, BT_BLOB=1, BT_VIRUS=2, BT_SPIKE=3, BT_TWISTER=4, BT_DARD=5, BT_WARD=6, BT_SPINNER=7, BT_ASPINNER=8, BT_PATIENCE=9, BT_BLOBBOSS=10, BT_STATIC=11, BT_RANGER=12, BT_TIGER=13 }; #ifndef BEASTN #define BEASTN 14 #endif #ifndef BTYPEN #define BTYPEN 14 #endif struct square; /**ent**/ //An ent is either an object or ground object, this was required to help the script interface. //A better definition: an ent is something that has a position in the game and an unique id. class ent { protected: int id; char x; char y; otype type; public: virtual void move(char px,char py)=0; virtual void Draw(unsigned int x, unsigned int y)=0; char X(); char Y(); otype GetType(); virtual void Kill()=0; virtual void OnDeath()=0; unsigned int GetId(); void UpdateSquare(); }; /** Object Interface**/ class obj: public ent { protected: void ObjectConstruct(square* sq); bool trypush_common(edir dir,obj* pusher,bool AsRoundObject, bool* died); bool KilledByBlackHole; bool Magnetism(char ox, char oy, char mx, char my, bool rSticky, bool rHorz, edir godir); public: bool GoFindXye(edir res[], int &resn, bool &foundpath, bool ignoreloopingedge, bool ignoreSp, bool considerTeleports, bool considerStickies, unsigned int range, bool Randomize=true ); bool GoFindASquare(bool (*cond)(square* sq), edir res[], int &resn, bool &foundpath, bool ignoreloopingedge, bool ignoreSp, bool considerTeleports, bool considerStickies, unsigned int range, bool Randomize=true ); unsigned int tic; void move(char px,char py); virtual bool trypush(edir dir,obj* pusher)=0; virtual bool HasRoundCorner(roundcorner rnc)=0; void Kill(); void Kill(bool byBlackHole); virtual bool Loop(bool* died)=0; bool DoMagnetism(bool horz, bool vert, bool *Moved); virtual bool HasBlockColor(blockcolor bc)=0; bool AffectedByMagnetism(bool horz); }; bool ObjectResistsFire(obj * o); /** Ground Object Interface**/ //Ground objects are just like normal objects but they render differently, and have //leave/enter events. // a ground square may only have one normal object and one ground object class gobj: public ent { protected: unsigned int id; char x; char y; void GObjectConstruct(square* sq); public: char X(); char Y(); void move(char px,char py); virtual void Draw(unsigned int x, unsigned int y)=0; virtual void OnEnter(obj *entering)=0; virtual void OnLeave(obj *entering)=0; virtual void Loop()=0; virtual bool CanEnter(obj *entering, edir dir)=0; virtual bool CanLeave(obj *entering, edir dir)=0; void Kill(); unsigned int GetId(); bool RenderAfterObjects; }; /** Explosion !! **/ class explosion { private: square *pos; unsigned char type; unsigned int creation; int xobjectoffset; int yobjectoffset; public: explosion(square *sq); explosion(square *sq, unsigned char kind); ~explosion(); void ex(square *sq, unsigned char kind); void Draw(unsigned int x, unsigned int y); void getDrawingXYOffset(int &xo, int &yo); void setDrawingXYOffset(int xo, int yo); }; /**Square Struct**/ struct square { obj* object; gobj* gobject; explosion *ex; int x; int y; char sqx; char sqy; groundskin gs; Uint8 R; Uint8 G; Uint8 B; bool Update; bool UpdateLater; }; /** Xye **/ class xye : public obj { private: unsigned char lives; square* checkpoint; void OnDeath() { throw "Xye Should not die this way"; } public: Uint8 alpha; xye(square* sq); void Draw(unsigned int x, unsigned int y); bool trypush(edir dir,obj* pusher); bool HasRoundCorner(roundcorner rnc); unsigned char GetLives(); void SetLives(unsigned char nlives); void SetCheckPoint(square* sq); void GetCheckPoint(char &cx, char &cy); bool Loop(bool* died) { *died=false; return true; } unsigned int deadtic; bool HasBlockColor(blockcolor bc); void Kill(); bool moved; edir lastdir; static bool useDirectionSprites; }; /** Robo-xye **/ class roboxye : public obj { private: int anim; square* checkpoint; void OnDeath() {} public: roboxye(square* sq); void Draw(unsigned int x, unsigned int y); bool trypush(edir dir,obj* pusher); bool HasRoundCorner(roundcorner rnc); bool Loop(bool* died); bool HasBlockColor(blockcolor bc); }; /** Wall **/ class wall : public obj { private: unsigned int color; bool round7; bool round1; bool round3; bool round9; unsigned char kind; static unsigned char defkind; void OnDeath() {} Uint8 R; Uint8 G; Uint8 B; bool containsRoundCorner(); public: static SDL_Color DefaultColor[6]; static const int MAX_VARIATIONS = 6; wall(square* sq,unsigned char t); wall(square* sq); bool ResistsFire(); void Draw(unsigned int x, unsigned int y); void ChangeKind(unsigned char t); void ChangeColor(Uint8 nR, Uint8 nG, Uint8 nB, bool multiply=true); void SetRoundCorners(bool r7, bool r1, bool r3, bool r9); bool trypush(edir dir,obj* pusher); bool HasRoundCorner(roundcorner rnc); bool Loop(bool* died); bool HasBlockColor(blockcolor bc); static void SetDefaultColor(SDL_Color cc, bool multiply=true); static void SetDefaultColor(SDL_Color cc, bool multiply, int var); static void SetDefaultType(signed int def); static void ResetDefaults(); static wall* find(char sx, char sy, unsigned char kind = 6); void IntelligentUpdateCorners(wall *by); static int GetDefaultVariationVulnerableToFire(); }; /** Window Block **/ class windowblock : public obj { private: blockcolor bc; static unsigned int count[XYE_OBJECT_COLORS]; static unsigned int activeN[XYE_OBJECT_COLORS]; void OnDeath() { count[bc]--; if (active) activeN[bc]--; } unsigned int anim; bool active; bool Detect(char x, char y); public: windowblock(square* sq,blockcolor b); void Draw(unsigned int x, unsigned int y); bool trypush(edir dir,obj* pusher); bool HasRoundCorner(roundcorner rnc) {return(false);} bool HasBlockColor(blockcolor bc) ; bool Loop(bool* died); static void ResetCounts(); static bool CanMove(windowblock* w); }; /** Block **/ class block : public obj { private: blockcolor c; bool round; void OnDeath() {} public: bool colorless; block(square* sq,blockcolor tc,bool makeround); void Draw(unsigned int x, unsigned int y); static void Draw(unsigned int x, unsigned int y,bool colorless, blockcolor c, bool round); bool trypush(edir dir,obj* pusher); bool HasRoundCorner(roundcorner rnc); bool Loop(bool* died); bool HasBlockColor(blockcolor bc); }; struct largeblockroot { int children; largeblockroot() { children=0; } }; /** "Large" Block **/ class largeblock : public obj { private: blockcolor c; void OnDeath(); Uint8 flags; largeblockroot *root; void setupBlock(); void blockDFS( largeblockroot* root); static largeblock* getPart( obj* object, largeblockroot* root); bool pushingBlocks(edir dir, int ix, int x0, int x1, int iy, int y0, int y1, int dx ,int dy); void doPush(edir dir, int dx, int dy); bool canPush(edir dir, int dx, int dy); void getPushGroup(); bool pushingBlocks2(edir dir, int dx, int dy); public: bool colorless; largeblock(square* sq,blockcolor tc, bool up, bool right, bool down, bool left ); void Draw(unsigned int x, unsigned int y); bool trypush(edir dir,obj* pusher); bool HasRoundCorner(roundcorner rnc); bool Loop(bool* died); bool HasBlockColor(blockcolor bc); bool isReallyASmallBlock(); }; /** Block (metal) **/ class metalblock : public obj { private: bool round; void OnDeath() {} public: metalblock(square* sq,bool makeround); void Draw(unsigned int x, unsigned int y); static void Draw(unsigned int x, unsigned int y, bool round); bool trypush(edir dir,obj* pusher); bool HasRoundCorner(roundcorner rnc); bool Loop(bool* died); bool HasBlockColor(blockcolor bc) {return false;} }; /** ScrollBlock **/ class scrollblock : public obj { private: blockcolor c; bool round; edir fac; void OnDeath() {} public: bool colorless; scrollblock(square* sq,blockcolor tc,bool makeround,edir d); void Draw(unsigned int x, unsigned int y); bool trypush(edir dir,obj* pusher); bool HasRoundCorner(roundcorner rnc); bool Loop(bool* died); bool HasBlockColor(blockcolor bc); }; /** Wild card **/ class wildcard : public obj { private: void OnDeath() {} bool round; public: wildcard(square* sq, bool makeround); void Draw(unsigned int x, unsigned int y); bool trypush(edir dir,obj* pusher); bool HasRoundCorner(roundcorner rnc); bool Loop(bool* died); bool HasBlockColor(blockcolor bc); }; /** gemblock **/ class gemblock : public obj { private: blockcolor c; void OnDeath() {} public: gemblock(square* sq,blockcolor tc); void Draw(unsigned int x, unsigned int y); bool trypush(edir dir,obj* pusher); bool HasRoundCorner(roundcorner rnc); bool Loop(bool* died); bool HasBlockColor(blockcolor bc); }; /** magnetic **/ enum mgtype { T_MAGNET=0, T_ANTIMAGNET=1, T_STICKY =2}; class magnetic : public obj { private: mgtype mt; bool horz; bool TryMagneticMove(char ox, char oy, char xx, char xy, edir godir, bool *died, char sx=0, char sy=0); void OnDeath() {} edir LastPushDir; unsigned int MovedTic; public: magnetic(square* sq,mgtype kind, bool horizontal); bool IsSticky(edir reqdir); bool IsSticky(); bool IsHorizontal(); void Draw(unsigned int x, unsigned int y); bool trypush(edir dir,obj* pusher); bool HasRoundCorner(roundcorner rnc); bool Loop(bool* died); static bool IsInstance(obj* object); bool HasBlockColor(blockcolor bc); }; /** Number **/ class number : public obj { private: blockcolor c; unsigned int GreenActive; bool GreenFlash; bool round; unsigned char time; unsigned int tic; bool green_activator_present(square * sq); bool ignoreDeath; void OnDeath(); public: number(square* sq,blockcolor tc,unsigned char t, bool makeround); void Draw(unsigned int x, unsigned int y); bool trypush(edir dir,obj* pusher); bool HasRoundCorner(roundcorner rnc); bool Loop(bool* died) ; bool HasBlockColor(blockcolor bc); void explode(); }; /** Impacter **/ class impacter : public obj { private: blockcolor c; edir fac; void OnDeath() {} unsigned int time; public: impacter(square* sq,blockcolor tc, edir facing); void Draw(unsigned int x, unsigned int y); static void Draw(unsigned int x, unsigned int y,blockcolor c,edir fac); bool trypush(edir dir,obj* pusher); bool HasRoundCorner(roundcorner rnc); bool Loop(bool* died); void turn(); bool HasBlockColor(blockcolor bc); }; /** Arrow **/ class arrow : public obj { private: blockcolor c; edir fac; bool round; void OnDeath() {} unsigned int time; public: arrow(square* sq,blockcolor tc, edir facing, bool roundblock); void Draw(unsigned int x, unsigned int y); static void DrawF(unsigned int x, unsigned int y,blockcolor c, edir fac,bool round); bool trypush(edir dir,obj* pusher); bool HasRoundCorner(roundcorner rnc); bool Loop(bool* died); bool HasBlockColor(blockcolor bc); }; /** Autoarrow **/ class autoarrow : public obj { private: blockcolor c; edir fac; bool round; unsigned char count; void OnDeath() {} public: autoarrow(square* sq,blockcolor tc, edir facing, bool roundblock); void Draw(unsigned int x, unsigned int y); bool trypush(edir dir,obj* pusher); bool HasRoundCorner(roundcorner rnc); bool Loop(bool* died); bool HasBlockColor(blockcolor bc); static edir GetDefaultEdirByColumn(unsigned int cx); }; /** Factory **/ class factory : public obj { private: blockcolor c; edir fac; edir swf; otype res; btype beasttype; bool round; bool nocolor; int pressed; unsigned int created; bool upd; void OnDeath() {} public: factory(square* sq,otype r,blockcolor tc, edir facing, edir switchfacing, bool roundblock,bool nocolor,btype bs); unsigned int limit; void Draw(unsigned int x, unsigned int y); void DrawSub(unsigned int x,unsigned int y); bool trypush(edir dir,obj* pusher); bool HasRoundCorner(roundcorner rnc) { return false; } bool Loop(bool* died); bool HasBlockColor(blockcolor bc) { return false; } }; /** Filler **/ class filler : public obj { private: blockcolor c; edir fac; bool round; bool anim; void OnDeath() {} unsigned int count; public: filler(square* sq,blockcolor tc, edir facing, bool roundblock); void Draw(unsigned int x, unsigned int y); bool trypush(edir dir,obj* pusher); bool HasRoundCorner(roundcorner rnc); bool Loop(bool* died); bool HasBlockColor(blockcolor bc); }; /** Sniper **/ class sniper : public obj { private: blockcolor c; edir fac; bool round; bool anim; void OnDeath() {} unsigned int count; public: sniper(square* sq,blockcolor tc, bool roundblock); void Draw(unsigned int x, unsigned int y); bool trypush(edir dir,obj* pusher); bool HasRoundCorner(roundcorner rnc); bool Loop(bool* died); bool HasBlockColor(blockcolor bc); }; /** Turner **/ class turner : public obj { private: blockcolor c; bool round; void OnDeath() {} public: bool cwise; bool colorless; turner(square* sq,blockcolor tc,bool clockwise,bool roundblock); void Draw(unsigned int x, unsigned int y); bool trypush(edir dir,obj* pusher); bool HasRoundCorner(roundcorner rnc); bool Loop(bool* died); bool HasBlockColor(blockcolor bc); }; /** Low Density **/ class lowdensity : public obj { private: blockcolor c; edir fac; bool active; bool round; void OnDeath() {} unsigned int time; public: lowdensity(square* sq,blockcolor tc, bool roundblock); void Draw(unsigned int x, unsigned int y); static void DrawF(unsigned int x, unsigned int y,blockcolor c, bool round); void Activate(edir D); bool trypush(edir dir,obj* pusher); bool HasRoundCorner(roundcorner rnc); bool Loop(bool* died); bool HasBlockColor(blockcolor bc); }; /** Surprise **/ class surprise : public obj { private: blockcolor c; bool round; bool changing; edir YellowDir; void OnDeath() {} static unsigned int Pending; public: surprise(square* sq,blockcolor tc,bool makeround); void Draw(unsigned int x, unsigned int y); bool trypush(edir dir,obj* pusher); bool HasRoundCorner(roundcorner rnc); bool Loop(bool* died); bool HasBlockColor(blockcolor bc); void FinalExplode(); void Transform(); static void Reset(); static void TransformAll(); }; /** Toggle **/ class toggle : public obj { private: blockcolor c; bool round; bool kind; static bool State[XYE_OBJECT_COLORS]; static Uint32 ChangeTic; Uint32 Updated; void OnDeath() {} public: toggle(square* sq,blockcolor tc,bool makeround, bool state); void Draw(unsigned int x, unsigned int y); bool trypush(edir dir,obj* pusher); bool HasRoundCorner(roundcorner rnc); bool Loop(bool* died); bool HasBlockColor(blockcolor bc); static void Reset(); }; /** Dangerous .- A dangerous is a foe but doesn't have a killing aura, Xye needs to step in to die. Robo mines are also instances of dangerous, but they can chase you. Mines and robo mines can be used to kill any object in the game with the help of sticky/anti sticky blocks **/ class dangerous : public obj { private: char absorb; char anim; Uint8 R; Uint8 G; Uint8 B; edir D; bool mine; bool fire; unsigned char mov; void OnDeath() {} bool disb; public: dangerous(square* sq, otype kind); dangerous(square* sq,edir dir,bool d); void FireBall(edir dir); void LandMine(); void BlackHole(); static void DrawMine(unsigned int x, unsigned int y); void Draw(unsigned int x, unsigned int y); bool trypush(edir dir,obj* pusher); bool HasRoundCorner(roundcorner rnc); void Eat(); bool Busy(obj* entering); void ChangeColor(Uint8 nR, Uint8 nG, Uint8 nB); bool Loop(bool* died); bool HasBlockColor(blockcolor bc); bool fromRound; }; /** All beasts are instances of the same class, it is good some times but a mess some other times **/ class beast: public obj { private: static unsigned int count[BTYPEN]; void OnDeath() { count[kind]-- ; } bool (*AI)(beast* dabeast, edir &r); bool (*OnFail)(beast* dabeast, edir &r); unsigned char anim; bool Loop_Sub(bool* died); void PickAI(); void PickFirstAnim() ; btype kind; public: inline bool BelongsToBeastType(btype x) { return (kind==x); } int AIValue; void NewAnim(); edir fac; beast(square* sq, btype personality, edir inidir); void Draw(unsigned int x, unsigned int y); static void Draw(unsigned int x, unsigned int y,btype kind, edir fac, unsigned char anim, int AIValue); bool trypush(edir dir,obj* pusher); bool HasBlockColor(blockcolor bc); bool Loop(bool* died); bool Floats(); bool HasRoundCorner(roundcorner rnc); static unsigned int BeastCount(btype k); static void ResetCounts(); }; class rnode; /** rattler **/ class rattler: public obj { friend class rnode; private: void OnDeath(); bool anim; void NewAnim(); edir fac; rnode* first; rnode* last; Uint8 tic; unsigned int grow; public: rattler(square* sq, edir inidir, unsigned int G); void Node(square* sq); void Draw(unsigned int x, unsigned int y); bool Floats(); static void Draw(unsigned int x, unsigned int y,bool anim,edir fac,rnode* first); bool trypush(edir dir,obj* pusher) { return false;} bool HasBlockColor(blockcolor bc) { return false;} bool Loop(bool* died); void Grow(unsigned int G); bool HasRoundCorner(roundcorner rnc) { return false;} }; /** rnode **/ class rnode: public obj { friend class rattler; private: rnode(square* sq, rattler* rhead); void OnDeath(); bool anim; rnode* next; rnode* prev; rattler* head; bool prevhead; bool forgetkill; void NewAnim(); public: void Draw(unsigned int x, unsigned int y); bool trypush(edir dir,obj* pusher) { return false;} bool HasBlockColor(blockcolor bc) { return false;} bool Loop(bool* died) { return false;} bool HasRoundCorner(roundcorner rnc) { return false;} }; /** Rattler Food **/ class rfood : public obj { private: void OnDeath() {} bool anim; public: rfood(square* sq); void Draw(unsigned int x, unsigned int y); static void Draw(unsigned int x,unsigned int y,bool anim); bool trypush(edir dir,obj* pusher); bool HasRoundCorner(roundcorner rnc) {return true;} bool Loop(bool* died); bool HasBlockColor(blockcolor bc) {return false;} }; /** Teleport **/ class teleport : public obj { private: bool anim; void OnDeath() {} public: teleport(square* sq,edir facing); void Draw(unsigned int x, unsigned int y); bool trypush(edir dir,obj* pusher); bool HasRoundCorner(roundcorner rnc); bool tryteleport(edir odir, obj* moving, char& nx, char& ny, dangerous* &reason, bool* pushed); teleport* FindExit(char stx,char sty); edir dir; bool Loop(bool* died); bool FindCleanExit(obj* ForObject, char &nx, char &ny, bool AI=false); bool HasBlockColor(blockcolor bc); }; /** Earth **/ class earth : public obj { private: Uint8 R; Uint8 G; Uint8 B; static Uint8 dR,dG,dB; bool round; void OnDeath() {} public: earth(square* sq); void SetRound(bool flag); void Draw(unsigned int x, unsigned int y); bool trypush(edir dir,obj* pusher); bool HasRoundCorner(roundcorner rnc); void ChangeColor(Uint8 nR, Uint8 nG, Uint8 nB); static void ResetDefaults(); static void SetDefaultColor(Uint8 nR,Uint8 nG,Uint8 nB); bool Loop(bool* died) { *died=false; return true; } bool HasBlockColor(blockcolor bc); }; /** key **/ class key : public obj { private: void OnDeath() {} static unsigned int Got[XYE_OBJECT_COLORS]; public: key(square* sq,blockcolor color); blockcolor c; void Draw(unsigned int x, unsigned int y); bool trypush(edir dir,obj* pusher); bool HasRoundCorner(roundcorner rnc); void ChangeColor(unsigned int c); bool Loop(bool* died); bool HasBlockColor(blockcolor bc); static void UseKey(blockcolor ofcolor); static void ResetCounts(); static bool GotKey(blockcolor ofcolor); static bool GetXyesKeys(unsigned int &yl,unsigned int &rd,unsigned int &bl,unsigned int &gr, unsigned int &pr); }; /** lock **/ class lock : public obj { private: void OnDeath() {} public: lock(square* sq,blockcolor color); blockcolor c; void Draw(unsigned int x, unsigned int y); bool trypush(edir dir,obj* pusher); bool HasRoundCorner(roundcorner rnc); void ChangeColor(unsigned int c); bool Loop(bool* died) { *died=false; return true; } bool HasBlockColor(blockcolor bc); }; /** Gem **/ class gem : public obj { private: bool anim; gemtype gemkind; void OnDeath() {} static unsigned int count[XYE_OBJECT_COLORS+1]; public: gem(square* sq, gemtype t); void Draw(unsigned int x, unsigned int y); static void Draw(unsigned int x, unsigned int y,gemtype gemkind,bool anim); bool trypush(edir dir,obj* pusher); bool HasRoundCorner(roundcorner rnc); bool Loop(bool* died); bool HasBlockColor(blockcolor bc); static bool GotAllGems(); static bool GotAllGems(blockcolor c); static void ResetCounts(); static bool GetRemanents(unsigned int &yl,unsigned int &rd,unsigned int &bl,unsigned int &gr); }; /** Star **/ class star : public obj { private: bool anim; void OnDeath() {} static unsigned int count; static unsigned int acquired; public: star(square* sq); void Draw(unsigned int x, unsigned int y); bool trypush(edir dir,obj* pusher); bool HasRoundCorner(roundcorner rnc); bool Loop(bool* died); bool HasBlockColor(blockcolor bc); static int GetRemaining(); static int GetAcquired(); static void ResetCounts(); }; /** Trick Door**/ enum tdtype { td_HORZ,td_VERT,td_SUPER, td_FORCEARROW_UP,td_FORCEARROW_DOWN,td_FORCEARROW_LEFT,td_FORCEARROW_RIGHT }; class tdoor: public gobj { protected: tdtype tt; bool ALLOW_UP, ALLOW_RIGHT,ALLOW_DOWN,ALLOW_LEFT; bool ALLOW_NONXYE; bool anim; void OnDeath() {} static SDL_Color DefColor; static SDL_Color ForceArrowDefColor; Uint8 R; Uint8 G; Uint8 B; public: tdoor(square* sq,tdtype t,bool up, bool right, bool down, bool left); void Loop() {} void Draw(unsigned int x, unsigned int y); void OnEnter(obj *entering); void OnLeave(obj *entering); bool CanEnter(obj *entering, edir dir); bool CanLeave(obj *entering, edir dir); void ChangeColor(Uint8 nR,Uint8 nG,Uint8 nB); static void ResetDefaults(); static void ChangeDefaultColor(Uint8 nR,Uint8 nG,Uint8 nB); static void ChangeForceArrowDefaultColor(Uint8 nR,Uint8 nG,Uint8 nB); }; /** Marked Area**/ class marked: public gobj { protected: bool active; unsigned char anim; void OnDeath(); static unsigned int count[XYE_OBJECT_COLORS]; static unsigned int activeN[XYE_OBJECT_COLORS]; public: blockcolor c; marked(square* sq, blockcolor bc); void Draw(unsigned int x, unsigned int y); void Loop() {} void OnEnter(obj *entering); void OnLeave(obj *entering); bool CanEnter(obj *entering, edir dir); bool CanLeave(obj *entering, edir dir); static void Reset(); static bool AllActive(blockcolor c); static bool AtLeastOneActive(blockcolor c); }; /** FirePAd **/ class firepad: public gobj { protected: unsigned char anim; void OnDeath(); edir D; public: firepad(square* sq); void Draw(unsigned int x, unsigned int y); void Loop() {} void OnEnter(obj *entering); void OnLeave(obj *entering); bool CanEnter(obj *entering, edir dir); bool CanLeave(obj *entering, edir dir); }; /** Pit **/ class pit: public gobj { protected: bool end; bool dis; Uint8 dec; Uint8 alpha; void OnDeath(); SDL_Surface * sur; public: pit(square* sq); void Draw(unsigned int x, unsigned int y); void Loop(); void OnEnter(obj *entering); void OnLeave(obj *entering); bool CanEnter(obj *entering, edir dir); bool CanLeave(obj *entering, edir dir); static bool IsEnabledInstance(gobj* gobject); static bool CanConsume(obj* object); }; /** Block Door**/ class blockdoor: public gobj { protected: unsigned char anim; blockcolor c; void OnDeath() {} bool mode; bool trap; bool IsOpen(); public: blockdoor(square* sq, bool AsTrap, bool startopen, blockcolor bc); void Draw(unsigned int x, unsigned int y); void Loop(); void OnEnter(obj *entering); void OnLeave(obj *entering); bool IsOfColor(blockcolor bc); bool CanEnter(obj *entering, edir dir); bool CanLeave(obj *entering, edir dir); bool InsideKind(otype o) { return((o==OT_GEM) || (o==OT_KEY) || (o==OT_EARTH)); } }; /** Hint **/ class hint: public gobj { protected: SDL_Color bcolor; SDL_Color fcolor; bool xcla; string text; static string globaltext; void OnDeath() {} static hint* active; public: hint(square* sq,string ihint,bool warning); void Loop() {} void Draw(unsigned int x, unsigned int y); static void Draw(unsigned int x, unsigned int y,bool xcla); void OnEnter(obj *entering); void OnLeave(obj *entering); bool CanEnter(obj *entering, edir dir); bool CanLeave(obj *entering, edir dir); /*void ChangeColor(unsigned int nbc,unsigned int nfc);*/ void SetHint(string hint); static bool Active(); static const char* GetActiveText(); static void Reset(); static void GlobalHint(bool enb); static void SetGlobalHint(const char* gl); static void SetGlobalHint(string &gl); static bool GlobalHintExists(); }; /** Portal **/ class portal: public gobj { protected: Uint8 R; Uint8 G; Uint8 B; Uint8 xyealpha; char canim; void OnDeath() {} square *target; static bool ignore; public: portal(square* sq,Uint8 cR, Uint8 cG, Uint8 cB, signed int TargetX, signed int TargetY); void Draw(unsigned int x, unsigned int y); void Loop(); void OnEnter(obj *entering); void OnLeave(obj *entering); bool CanEnter(obj *entering, edir dir); bool CanLeave(obj *entering, edir dir); void ChangeColor(Uint8 cR, Uint8 cG, Uint8 cB); static void Reset(); }; class game; class gameboard : public control { public: gameboard( int sx, int sy, int sw, int sh); ~gameboard(); void loop(); void draw(SDL_Surface* target); void onMouseMove(int px,int py); void onMouseOut(); void onMouseDown(int px,int py); void onMouseUp(int px,int py); inline void onMouseRightUp(int px,int py) {} }; class gamepanel; enum recordingmode { RECORDING_MODE_MOVIE, RECORDING_MODE_BACKGROUND }; /**class game*/ class game { friend class gameboard; friend class gamepanel; private: game() {} static bool IsUndoAllowed(); static void AfterLevelLoad(); static void ExitCommandYesHandler(bool yesClicked); static void ExitCommand( const buttondata*bd = NULL); static void RestartCommand( const buttondata* bd = NULL); static void GoPreviousCommand( const buttondata*bd = NULL); static void GoNextCommand( const buttondata*bd = NULL); static void HintDownCommand( const buttondata*bd = NULL); static void HintUpCommand( const buttondata*bd = NULL); static void UndoCommand( const buttondata*bd = NULL); static void RecordSolutionCommand( const buttondata*bd = NULL); static void FFUpCommand( const buttondata*bd = NULL); static void FFDownCommand( const buttondata*bd = NULL); static void BrowseCommand( const buttondata*bd = NULL); static void SolutionCommand( const buttondata*bd = NULL); static bool mouse_pressed; static bool mouse_valid; static unsigned int mouse_x,mouse_y; static bool GameOver; static bool FinishedLevel; static square grid[XYE_HORZ][XYE_VERT]; static unsigned int id_count; static int lastKey; static int GameWidth; static int GameHeight; static unsigned int LastXyeMove; static square* deathsq2; static unsigned char FastForward; static edir LastXyeDir; static unsigned char FlashPos; static void loop_Sub(char i, char j); static void loop_gameplay(); static bool TryMoveXye(char dx, char dy, edir dir); static bool UpdateAll; static bool CoordMode; static bool ShiftPressed; static bool DK_PRESSED; static bool DK_UP_PRESSED; static bool DK_DOWN_PRESSED; static bool DK_LEFT_PRESSED; static bool DK_RIGHT_PRESSED; static int DK_PRESSED_FIRST; static bool DK_GO; static edir DK_DIR; static void DrawPanel(SDL_Surface* target, Sint16 x, Sint16 y, Sint16 w, Sint16 h); static bool EvalDirKeys(); static void DrawPanelInfo(Drawer& D, Sint16 &cx,Sint16 &cy, Uint8 spx, Uint8 spy , unsigned int num, Uint8 fonadd, SDL_Color col); static void DrawPanelInfo(Drawer& D, Sint16 &cx,Sint16 &cy, Uint8 spx, Uint8 spy , unsigned int num, Uint8 fonadd, Uint8 R=255, Uint8 G=255, Uint8 B=255, Uint8 A=255); static signed int HintMarquee; static unsigned char HintRead; static bool EvalDirGrid(Uint16 x1,Uint16 y1,Uint16 x2,Uint16 y2,edir &dir); static bool EvalDirGrid(obj* object,Uint16 x2,Uint16 y2,edir &dir); static bool cameraon; static bool PlayingRecording; static recordingmode RecordingMode; static bool undo; static void onKeyUp(SDLKey keysim, Uint16 unicode); static void onKeyDown(SDLKey keysim, Uint16 unicode); static void onExitAttempt(); static void InitGameSection(window* wind); static string InitLevelFile; static int InitLevelFileN; static void onMouseMove(int x,int y); static void onMouseOut(); static void onMouseDown(int x,int y); static void onMouseUp(int x,int y); static void InitGraphics(); static void CleanGraphics(); static void loadGame(); static void saveGame(); public: static void RefreshGraphics(); static void PlayLevel( const char* levelfile, int level); static void TestLevel( const char* levelfile, int level, bool playsolution=true); static Font* FontRes; static Font* FontRes_White; static Font* FontRes_Bold; static LuminositySprites sprites; static SDL_Surface* screen; static unsigned int counter; static char counter2; static char counter3; static char counter4; static char counter5; static char counter6; static char counter7; static char counter8; static char counter9; static unsigned int beastcounter; static SDL_Color PlayerColor; static square* deathsq1; static float NextTic; static xye* XYE; static bool started; static Sint16 GRIDSIZE; static string SKIN; static int Init(const char*levelfile=NULL); static void start(bool undotime=false); static void draw(Sint16 x, Sint16 y); static void MoveXye(); static void incCounters(); static unsigned int Counter(); static bool Mod2(); static bool Mod3(); static bool Mod4(); static bool Mod5(); static bool Mod7(); static bool Mod8(); static bool Mod9(); static bool Mod2(unsigned int m); static bool Mod3(unsigned int m); static bool Mod4(unsigned int m); static bool Mod5(unsigned int m); static bool Mod7(unsigned int m); static bool Mod8(unsigned int m); static bool Mod9(unsigned int m); static square* Square(unsigned char x,unsigned char y); static square* SquareN(signed int ,signed int y); static unsigned int NewId(); static bool FindGoodPoint(char cx, char cy, char &rx, char &ry, obj* togo, bool (*cond)(square* sq,obj* togo)) ; static bool GetRevivePoint( char cx, char cy, char &nx, char &ny); static void loop(); static void end(); static bool AllowRoboXyeMovement(); static bool TryMoveXye(edir dir); static bool LastMoveWasHorizontal(); static void SmallBoom(square* sq, bool ConditionalFx=false, int ox=0, int oy=0); static void FlashXyePosition(); static bool Moved(edir d); static void TerminateGame(bool good=false); static void Davinci(Sint16 sx, Sint16 sy, Uint16 sw, Uint16 sh,Sint16 dx, Sint16 dy); static void Error(const char* msg); static void PlayRecording(const string rc); static void SaveReplay(); static void Undo(); }; /** Object recycle queue **/ struct recycle_entry { obj* o; recycle_entry* next; }; class recycle { private: static recycle_entry* first; public: static void init(); static void run(); static void add(obj* o); }; /** /Object recycle queue **/ /** Kill Zone Queue **/ struct killzone { char x; char y; killtype kt; killzone *next; }; class deathqueue { private: static killzone* first; static killzone* current; public: static void reset(); static void add(char ax, char ay, killtype t); static bool KillNow(); static signed char incx[5]; static signed char incy[5]; }; /** SquareMemory **/ class sqMem { public: static bool mem[XYE_HORZ][XYE_VERT]; static void reset( bool val); }; /******************************General Stuff!**********************************/ square* RoundAdvance(obj* ToMove,edir dir,char i, char j); bool IsXyeAt(square* sq); bool IsXyeOrBotAt(square* sq); bool CanPush(otype t); bool Allowed(obj* object, edir dir, square* sq); bool Allowed(obj* object, edir dir, square* sq, otype except); edir Opposite(edir dir); edir Clock(edir dir); edir AClock(edir dir); edir RandomDir(); bool OldBeastPickDirectDir(edir &r, edir dirs[], unsigned char dirn, char x1, char y1, char x2, char y2); bool PickDirectDir(edir &r,edir dirs[], unsigned char dirn, char x1, char y1, char x2, char y2,bool mode, bool horzpriority); bool PickMostDirectDir(edir &r, edir dirs[], unsigned char dirn, char x1, char y1, char x2, char y2); edir PickDirectDir(char x1, char y1, char x2, char y2,bool mode, bool horzpriority); void DebugMsg(const char *msgText, void *outParam=NULL); bool SpotAffectedByAMagnetic(obj* forObject, char x, char y); bool AI_RoboMine(obj* foro, edir &r); char FixVert(char vert); char FixHorz(char horz); void FixCoordinates(char &horz, char &vert); xye-0.12.2+dfsg/src/xye_script.cpp000066400000000000000000001501431225403634500170140ustar00rootroot00000000000000/* Xye License (it is a PNG/ZLIB license) Copyright (c) 2006 Victor Hugo Soliz Kuncar This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. 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 appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. */ //Todo rename this to xye_xml or something like that #include "xye.h" #include "options.h" #include "xye_script.h" #include "kye_script.h" #include "xsb_level.h" #include "gen.h" #include "tinyxml/xye_tinyxml.h" #include /** Class LevelPack begin**/ unsigned int LevelPack::n; string LevelPack::LevelError; string LevelPack::Author; string LevelPack::Name; string LevelPack::Desc; string LevelPack::Solution; string LevelPack::CurrentLevelBye; string LevelPack::OpenFile; unsigned int LevelPack::OpenFileLn; bool LevelPack::defmode; bool LevelPack::kyemode; bool LevelPack::xsbmode; bool LevelPack::FromEditor=false; TiXmlDocument* LevelPack::Doc =NULL; TiXmlElement* LevelPack::pack =NULL ; TiXmlElement* LevelPack::CurrentLevel =NULL; TiXmlElement* LevelPack::FirstLevel =NULL; string LevelPack::CurrentLevelTitle; void LevelPack::Init() { XsbLevelPack::Init(); KyeLevelPack::Init(); } void LevelPack::Clean() { XsbLevelPack::Clean(); KyeLevelPack::Clean(); } bool LevelPack::AllowUndo() { return (xsbmode); } void LevelPack::LoadNthLevel(unsigned int n) { if(defmode) { LevelPack::Default(); return; } if (kyemode) { KyeLevelPack::LoadNthLevel(n); return; } if (xsbmode) { XsbLevelPack::LoadNthLevel(n); return; } CurrentLevel=FirstLevel=pack->FirstChildElement("level"); if (! FirstLevel) { LevelPack::Error("can't find any level"); return; } TiXmlElement* tm=FirstLevel; int i=1; while ((iNextSiblingElement("level"); i++; } if (! CurrentLevel) { CurrentLevel=FirstLevel; OpenFileLn=1; } else OpenFileLn=n; LoadLevel(CurrentLevel); } void LevelPack::LoadFirstLevel() { if (kyemode) KyeLevelPack::LoadNthLevel(1); else if (xsbmode) XsbLevelPack::LoadNthLevel(1); else LoadNthLevel(1); } void LevelPack::Restart() { if (kyemode) KyeLevelPack::Restart(); else if (xsbmode) XsbLevelPack::Restart(); else if (defmode) LevelPack::Default(); else LoadLevel(CurrentLevel); } bool LevelPack::HasSolution() { return(Solution!=""); } void LevelPack::LoadInformation() { LevelError = ""; int a,b,c; a=0; //Number of levels (count) TiXmlElement* pEChild=pack->FirstChildElement("level"); n=0; while(pEChild) { n++; pEChild=pEChild->NextSiblingElement("level"); } if (!n) {LevelPack::Error("The file is a valid Xye XML level file. But it contains no tags."); return;} //Pack name: pEChild= pack->FirstChildElement("name"); if ( (pEChild != NULL) && (pEChild->GetText()!=NULL) ) Name= pEChild->GetText(); else Name= "Unknown"; //Pack author: pEChild= pack->FirstChildElement("author"); if ( (pEChild != NULL) && (pEChild->GetText()!=NULL) ) Author= pEChild->GetText(); else Author= "Unknown"; //Pack Desc: pEChild= pack->FirstChildElement("description"); if ( (pEChild!=NULL) && (pEChild->GetText()!=NULL ) ) Desc= pEChild->GetText(); else Desc= "Unknown"; } bool LevelPack::GetFileData(const char* filename, string &au, string &ds, string &ti, unsigned int &leveln) { int L=strlen(filename); int i=0; if ((L>4) && doublematch(filename[L-1],'e','E') && doublematch(filename[L-2],'y','Y') && doublematch(filename[L-3],'k','K') && (filename[L-4]=='.')) { const char* err=KyeLevelPack::ReadData(filename,leveln ); i=L-1; while((i>=0) && (filename[i]!='/')) i--; i++; ti=""; while ((i4) && (filename[L-4]=='.') && ( (strcmp(filename+L-3,"xsb") == 0) || (strcmp(filename+L-3,"XSB") == 0) || (strcmp(filename+L-3,"slc") == 0) || (strcmp(filename+L-3,"SLC") == 0) ) ) { ti = ""; const char* err=XsbLevelPack::ReadData(filename,leveln , au, ds, ti); if( ti=="") { i=L-1; while((i>=0) && (filename[i]!='/')) i--; i++; ti=(filename+i); } if (err) { leveln=0; ds="Invalid sokoban level file "; ds+="("; ds+=err; ds+=")"; return false; } return true; } char* tm,*tm2; /* au="!!"; ds="..."; ti="!!!"; return true;*/ //TiXmlDocument fil(tm2); TiXmlDocument fil(filename); TiXmlElement* pack, *el; bool val=false; if (fil.LoadFile()) { pack=fil.FirstChildElement("pack"); if (pack!=NULL) { el= pack->FirstChildElement("name"); if ( (el!=NULL) && (el->GetText()!=NULL) ) ti= el->GetText(); else ti="Just another Xye level file"; el= pack->FirstChildElement("author"); if ( (el!=NULL) && (el->GetText()!=NULL) ) au= el->GetText(); else au="Unknown"; el= pack->FirstChildElement("description"); if ( (el!=NULL) && (el->GetText()!=NULL) ) ds= el->GetText(); else ds="(No description)"; val=true; leveln=0; el = pack->FirstChildElement("level"); while (el) { leveln++; el=el->NextSiblingElement("level"); } if( leveln==0) val=false; } else if (pack=fil.FirstChildElement("xyereplay")) { leveln=0; au=""; ds="Level:"; ds+=pack->Attribute("levelfile"); ds+=",#"; ds+=pack->Attribute("leveln"); ti="Replay"; val=true; } } if (! val) { au="Invalid File"; ds="This file is not a valid Xye level file"; int L=strlen(fil.ErrorDesc()); char* err=new char[L+40]; sprintf(err,"\n\n(Error: %s at line: %d col: %d)",fil.ErrorDesc(),fil.ErrorRow(),fil.ErrorCol()); ds+=err; delete[] err; ti="Invalid File"; } return(val); } void LevelPack::Load(const char *filename, unsigned int ln, const string replay) { LevelError = ""; OpenFile=filename; OpenFileLn=ln; if (Doc!=NULL) { pack=NULL; CurrentLevel=NULL; delete Doc; Doc=NULL; } int L=strlen(filename); if ((L>4) && doublematch(filename[L-1],'e','E') && doublematch(filename[L-2],'y','Y') && doublematch(filename[L-3],'k','K') && (filename[L-4]=='.')) { LevelPack::Author=""; LevelPack::Name=""; LevelPack::Desc=""; xsbmode=!(kyemode=true); KyeLevelPack::Load(filename,ln); if (replay!="") { game::PlayRecording(replay); } return; } if ((L>4) && (filename[L-4]=='.') && ((strcmp(filename+L-3,"xsb") ==0)||(strcmp(filename+L-3,"XSB") ==0)||(strcmp(filename+L-3,"SLC") ==0)||(strcmp(filename+L-3,"slc") ==0)) ) { LevelPack::Author=""; LevelPack::Name=""; LevelPack::Desc=""; kyemode=!(xsbmode=true); XsbLevelPack::Load(filename,ln); if (replay!="") { game::PlayRecording(replay); } return; } kyemode=xsbmode=defmode=false; Doc= new TiXmlDocument(filename); if (Doc->LoadFile()) { pack=Doc->FirstChildElement("pack"); if (pack==NULL) { pack=Doc->FirstChildElement("xyereplay"); if (pack) //It is a replay file! { const char * bf=pack->Attribute("levelfile"); const char* tm=bf; int tmx=1; pack->QueryIntAttribute("leveln",&tmx); ln=tmx; if (pack=pack->FirstChildElement("moves")) { bf=pack->GetText(); if(bf!=NULL) { LevelPack::Load(tm,ln,bf); } else { LevelPack::Load(tm, ln, ""); } return; } else { LevelPack::Error("replay file has no replay data"); return; } } else { fprintf(stderr,"Can't find pack element!"); LevelPack::Error("Can't find pack element!"); return; } } LoadInformation(); LoadNthLevel(ln); if (replay!="") { game::PlayRecording(replay); } } else { string s=string("Invalid / Missing Level xml file: "+string(filename)+" ["+string(Doc->ErrorDesc())+"]") ; fprintf(stderr,"%s", s.c_str() ); LevelPack::Error(s.c_str()); } } void LevelPack::Next() { if (defmode) { LevelPack::Default(); return; } if (kyemode) { KyeLevelPack::Next(); return; } if (xsbmode) { XsbLevelPack::Next(); return; } TiXmlElement* nx= (CurrentLevel->NextSiblingElement("level")); if (nx) { CurrentLevel=nx; OpenFileLn++; } else { CurrentLevel=FirstLevel; OpenFileLn=1; } LoadLevel(CurrentLevel); } void LevelPack::Last() { if (defmode) { LevelPack::Default(); return; } if (kyemode) { KyeLevelPack::Last(); return; } if (xsbmode) { XsbLevelPack::Last(); return; } TiXmlNode * nd=CurrentLevel->PreviousSibling("level"); while ((nd) && (! nd->ToElement() )) nd=nd->PreviousSibling("level"); if (nd) { CurrentLevel=nd->ToElement(); OpenFileLn--; } else { TiXmlElement * el=FirstLevel, *ls; OpenFileLn=1; while ( (ls=el) && (el=el->NextSiblingElement("level")) ) OpenFileLn++;; CurrentLevel=ls; } LoadLevel(CurrentLevel); } bool LevelPack::HasPrevious() { if(defmode) return false; if (kyemode) return KyeLevelPack::HasLast(); if (xsbmode) return XsbLevelPack::HasLast(); TiXmlNode * nd=CurrentLevel->PreviousSibling("level"); while ((nd) && (! nd->ToElement() )) nd=nd->PreviousSibling("level"); return (nd != NULL); } bool LevelPack::HasNext() { if(defmode) return false; if (kyemode) return KyeLevelPack::HasNext(); if (xsbmode) return XsbLevelPack::HasNext(); return ( CurrentLevel->NextSiblingElement("level") != NULL); } void LevelPack::SetLevelBye(const char* bye) { const char* add=""; if(FromEditor) { add="Press [backspace] to return to the editor, [enter] to play again."; } else if (HasNext()) { add="Press [N] or [+] to go to the next level"; } else if (HasPrevious()) { add="You beat the last level. use [P] or [-] to go back to a previous level or [backspace] to browse for more levels."; } else add="You beat the only level of this level pack, use [backspace] to browse for more levels"; if ( (! bye) || (strlen(bye) == 0) ) CurrentLevelBye=""; else { CurrentLevelBye=bye; CurrentLevelBye+=" - "; } CurrentLevelBye+=add; } /** Class LevelPack end**/ char TempCharA[30]; int LastX; int LastY; /* Load Xye*/ void Load_Xye(TiXmlElement* el,bool KyeLoaded) { int lives=4; el->QueryIntAttribute("x",&LastX); el->QueryIntAttribute("y",&LastY); el->QueryIntAttribute("lives",&lives); if (! KyeLoaded) game::XYE= new xye(game::SquareN(LastX,LastY)); lives=(lives<=0)?1:lives; game::XYE->SetLives(lives); } /* Load Wall*/ void Load_Wall(TiXmlElement* el, bool defround) { int cid=0,r1=defround,r3=defround,r7=defround,r9=defround,t=-1; int x2=0,y2=0,i,j; bool round; square* sq; el->QueryIntAttribute("x",&LastX); el->QueryIntAttribute("y",&LastY); el->QueryIntAttribute("x2",&x2); el->QueryIntAttribute("y2",&y2); //for compat el->QueryIntAttribute("round1",&r1); el->QueryIntAttribute("round3",&r3); el->QueryIntAttribute("round7",&r7); el->QueryIntAttribute("round9",&r9); //round attrib const char* rnd=el->Attribute("round"); if (rnd) for (int i=0; ((rnd[i]!=0) && (i<4)) ;i++) switch (rnd[i]) { case('1'): r1=true; break; case('3'): r3=true; break; case('7'): r7=true; break; default : r9=true; } el->QueryIntAttribute("type",&t); if (options::LevelColorsDisabled()) { cid = 0; } else { el->QueryIntAttribute("color",&cid); } //normalize: LastX=LastX%XYE_HORZ;x2=x2%XYE_HORZ; LastY=LastY%XYE_VERT;y2=y2%XYE_VERT; if (LastX>x2) x2=LastX; if (LastY>y2) y2=LastY; round= (r1 || r3 || r7 || r9); Uint8 R,G,B; palette_mode pm = PM_MULTIPLY; if (cid) palette::GetColor(cid,R,G,B,pm); for (i=LastX;i<=x2;i++) for (j=LastY;j<=y2;j++) { sq=game::Square(i,j); wall* wl; if (t>=0) wl=new wall(sq,t); else wl=new wall(sq); if (round) wl->SetRoundCorners( (r7 && (i==LastX) && (j==y2)), (r1 && (i==LastX) && (j==LastY)), (r3 && (i==x2) && (j==LastY)), (r9 && (i==x2) && (j==y2)) ); if (cid) wl->ChangeColor(R,G,B, (pm==PM_MULTIPLY) ); } } /* Load Gem*/ void Load_Gem(TiXmlElement* el) { el->QueryIntAttribute("x",&LastX); el->QueryIntAttribute("y",&LastY); blockcolor c=GetElementBlockColor(el,B_BLUE); gem* gm=new gem(game::SquareN(LastX,LastY),c); } /* Load Star*/ void Load_Star(TiXmlElement* el) { el->QueryIntAttribute("x",&LastX); el->QueryIntAttribute("y",&LastY); star* gm=new star(game::SquareN(LastX,LastY) ); } /* Load Number*/ void Load_Number(TiXmlElement* el) { int v=0,round=0; unsigned char cv; el->QueryIntAttribute("x",&LastX); el->QueryIntAttribute("y",&LastY); el->QueryIntAttribute("val",&v); cv = (unsigned char)( (v<0)?0:(v>9)?9:v); blockcolor c=GetElementBlockColor(el,B_YELLOW); el->QueryIntAttribute("round",&round); number* gm=new number(game::SquareN(LastX,LastY),c,cv,round); } /* Load Robot*/ void Load_Robot(TiXmlElement* el) { int v=0; unsigned char cv; el->QueryIntAttribute("x",&LastX); el->QueryIntAttribute("y",&LastY); roboxye* rb=new roboxye(game::SquareN(LastX,LastY)); } /* Load BlackHole*/ void Load_Blackhole(TiXmlElement* el) { el->QueryIntAttribute("x",&LastX); el->QueryIntAttribute("y",&LastY); dangerous* dn=new dangerous(game::SquareN(LastX,LastY),OT_BLACKHOLE); } /* Load Mine*/ void Load_Mine(TiXmlElement* el) { el->QueryIntAttribute("x",&LastX); el->QueryIntAttribute("y",&LastY); dangerous* dn=new dangerous(game::SquareN(LastX,LastY),OT_MINE); } /* Load Block*/ void Load_Block(TiXmlElement* el) { int colorless=0,round=0; el->QueryIntAttribute("x",&LastX); el->QueryIntAttribute("y",&LastY); blockcolor c=GetElementBlockColor(el); el->QueryIntAttribute("nocolor",&colorless); el->QueryIntAttribute("round",&round); block* dn=new block(game::SquareN(LastX,LastY),c, round); if (colorless) dn->colorless=true; } /* Load LargeBlock*/ void Load_LargeBlock(TiXmlElement* el) { int colorless=0; el->QueryIntAttribute("x",&LastX); el->QueryIntAttribute("y",&LastY); blockcolor c=GetElementBlockColor(el); el->QueryIntAttribute("nocolor",&colorless); const char* ptr = el->Attribute("sharededges"); bool up=false, right=false, down=false, left=false; if(ptr) { for (int i=0; ptr[i]!='\0'; i++) switch(ptr[i]) { case 'U': up=true; break; case 'R': right=true; break; case 'D': down=true; break; case 'L': left=true; break; } } if( !(up|down|left|right)) { //don't bother block* dn=new block(game::SquareN(LastX,LastY),c, false); if (colorless) dn->colorless=true; } else { largeblock* bc=new largeblock(game::SquareN(LastX,LastY),c, up,right,down,left); if (colorless) bc->colorless=true; } } /* Load WindowBlock*/ void Load_WindowBlock(TiXmlElement* el) { el->QueryIntAttribute("x",&LastX); el->QueryIntAttribute("y",&LastY); blockcolor c=GetElementBlockColor(el); windowblock* bc=new windowblock(game::SquareN(LastX,LastY),c); } /* Load Rattler Food*/ void Load_RFood(TiXmlElement* el) { el->QueryIntAttribute("x",&LastX); el->QueryIntAttribute("y",&LastY); rfood* rf=new rfood(game::SquareN(LastX,LastY)); } /* Load Rattler*/ void Load_Rattler(TiXmlElement* el) { int grow=0; el->QueryIntAttribute("x",&LastX); el->QueryIntAttribute("y",&LastY); el->QueryIntAttribute("grow",&grow); edir d=GetElementDir(el, D_DOWN ); rattler* rt=new rattler(game::SquareN(LastX,LastY),d,grow); TiXmlElement* nd=el->FirstChildElement("body"); while (nd) { nd->QueryIntAttribute("x",&LastX); nd->QueryIntAttribute("y",&LastY); rt->Node(game::SquareN(LastX,LastY)); nd= nd->NextSiblingElement("body"); } } /* Load Lock*/ void Load_Lock(TiXmlElement* el) { el->QueryIntAttribute("x",&LastX); el->QueryIntAttribute("y",&LastY); blockcolor c=GetElementBlockColor(el); lock* bc=new lock(game::SquareN(LastX,LastY),c); } /* Load Key*/ void Load_Key(TiXmlElement* el) { el->QueryIntAttribute("x",&LastX); el->QueryIntAttribute("y",&LastY); blockcolor c=GetElementBlockColor(el); key* bc=new key(game::SquareN(LastX,LastY),c); } /* Load Low Density*/ void Load_LowDensity(TiXmlElement* el) { int round=0; el->QueryIntAttribute("x",&LastX); el->QueryIntAttribute("y",&LastY); blockcolor c=GetElementBlockColor(el); el->QueryIntAttribute("round",&round); lowdensity* bc=new lowdensity(game::SquareN(LastX,LastY),c,round); if (el->Attribute("active") ) bc->Activate(GetElementDir(el,D_DOWN,"active")); } /* Load Surprise*/ void Load_Surprise(TiXmlElement* el) { int round=0; el->QueryIntAttribute("x",&LastX); el->QueryIntAttribute("y",&LastY); blockcolor c=GetElementBlockColor(el); el->QueryIntAttribute("round",&round); surprise* bc=new surprise(game::SquareN(LastX,LastY),c,round); } /* Load turner*/ void Load_Turner(TiXmlElement* el,unsigned int aclock) { int colorless=0,round=0; el->QueryIntAttribute("x",&LastX); el->QueryIntAttribute("y",&LastY); blockcolor c=GetElementBlockColor(el); el->QueryIntAttribute("nocolor",&colorless); el->QueryIntAttribute("round",&round); turner* bc=new turner(game::SquareN(LastX,LastY),c,!(aclock),round); if (colorless) bc->colorless=true; } /* Load GemBlock*/ void Load_GemBlock(TiXmlElement* el) { el->QueryIntAttribute("x",&LastX); el->QueryIntAttribute("y",&LastY); blockcolor c=GetElementBlockColor(el); gemblock* bc=new gemblock(game::SquareN(LastX,LastY),c); } /* Load WildCard*/ void Load_WildCard(TiXmlElement* el) { el->QueryIntAttribute("x",&LastX); el->QueryIntAttribute("y",&LastY); int r=0; el->QueryIntAttribute("round",&r); wildcard* wd=new wildcard(game::SquareN(LastX,LastY),(bool)(r) ); } /* Load MetalBlock*/ void Load_MetalBlock(TiXmlElement* el) { el->QueryIntAttribute("x",&LastX); el->QueryIntAttribute("y",&LastY); int r=0; el->QueryIntAttribute("round",&r); metalblock* mb=new metalblock(game::SquareN(LastX,LastY),(bool)(r) ); } /* Load Earth*/ void Load_Earth(TiXmlElement* el) { int c=0; int r=0; el->QueryIntAttribute("x",&LastX); el->QueryIntAttribute("y",&LastY); el->QueryIntAttribute("round",&r); earth* et=new earth(game::SquareN(LastX,LastY)); if (! options::LevelColorsDisabled()) { el->QueryIntAttribute("color",&c); if (c) { Uint8 r,g,b; palette::GetColor(c,r,g,b); et->ChangeColor(r,g,b); } } if (r) et->SetRound(r); } /* Load Auto*/ void Load_Auto(TiXmlElement* el) { int round=0; el->QueryIntAttribute("x",&LastX); el->QueryIntAttribute("y",&LastY); blockcolor c=GetElementBlockColor(el); edir d=GetElementDir(el, autoarrow::GetDefaultEdirByColumn(LastX) ); el->QueryIntAttribute("round",&round); autoarrow* bc=new autoarrow(game::SquareN(LastX,LastY),c,d,round); } /* Load Factory*/ void Load_Factory(TiXmlElement* el) { int round=0,colorless=0,kind=0,limit=1000000; int ib=0; el->QueryIntAttribute("beastkind",&ib); otype rs; el->QueryIntAttribute("x",&LastX); el->QueryIntAttribute("y",&LastY); blockcolor c=GetElementBlockColor(el); edir d=GetElementDir(el); edir sd=GetElementDir(el, D_UP, "swdir" ); if (d==sd) sd=(edir)((int)(d)+1); el->QueryIntAttribute("round",&round); el->QueryIntAttribute("nocolor",&colorless); el->QueryIntAttribute("kind",&kind); if (el->Attribute("limit")) el->QueryIntAttribute("limit",&limit); switch(kind) { case(1): rs=OT_ARROW; break; case(2): rs=OT_LOWDENSITY; break; case(3): rs=OT_MINE; break; case(4): rs=OT_PUSHER; break; case(5): rs=OT_BEAST; break; case(6): rs=OT_RATTLERFOOD; break; case(7): rs=OT_RATTLER; break; case(8): rs=OT_GEM; break; default: rs=OT_BLOCK; } factory* f=new factory(game::SquareN(LastX,LastY),rs,c,d,sd,round,colorless,(btype)(ib%BEASTN)); f->limit=limit; } /* Load Filler*/ void Load_Filler(TiXmlElement* el) { int round=0; el->QueryIntAttribute("x",&LastX); el->QueryIntAttribute("y",&LastY); blockcolor c=GetElementBlockColor(el); edir d=GetElementDir(el, D_DOWN ); el->QueryIntAttribute("round",&round); filler* bc=new filler(game::SquareN(LastX,LastY),c,d,round); } /* Load Snipper*/ void Load_Sniper(TiXmlElement* el) { int round=0; el->QueryIntAttribute("x",&LastX); el->QueryIntAttribute("y",&LastY); blockcolor c=GetElementBlockColor(el); el->QueryIntAttribute("round",&round); sniper* bc=new sniper(game::SquareN(LastX,LastY),c,round); } /* Load Arrow*/ void Load_Arrow(TiXmlElement* el) { int round=0; el->QueryIntAttribute("x",&LastX); el->QueryIntAttribute("y",&LastY); blockcolor c=GetElementBlockColor(el); edir d=GetElementDir(el, D_DOWN ); el->QueryIntAttribute("round",&round); arrow* bc=new arrow(game::SquareN(LastX,LastY),c,d,round); } /* Load ScrollBlock*/ void Load_ScrollBlock(TiXmlElement* el) { int round=0,nocolor=0; el->QueryIntAttribute("x",&LastX); el->QueryIntAttribute("y",&LastY); blockcolor c=GetElementBlockColor(el); edir d=GetElementDir(el, D_DOWN ); el->QueryIntAttribute("round",&round); el->QueryIntAttribute("nocolor",&nocolor); scrollblock* bc=new scrollblock(game::SquareN(LastX,LastY),c,round,d); bc->colorless=nocolor; } /* Load Teleport*/ void Load_Teleport(TiXmlElement* el) { int round=0; el->QueryIntAttribute("x",&LastX); el->QueryIntAttribute("y",&LastY); edir d=GetElementDir(el, D_DOWN ); teleport* tp=new teleport(game::SquareN(LastX,LastY),d); } /* Load Toggle*/ void Load_Toggle(TiXmlElement* el) { int round=0; int off=0; el->QueryIntAttribute("x",&LastX); el->QueryIntAttribute("y",&LastY); blockcolor c=GetElementBlockColor(el); el->QueryIntAttribute("off",&off); el->QueryIntAttribute("round",&round); toggle* bc=new toggle(game::SquareN(LastX,LastY),c,round, ! off); } /* Load Pusher*/ void Load_Pusher(TiXmlElement* el) { el->QueryIntAttribute("x",&LastX); el->QueryIntAttribute("y",&LastY); blockcolor c=GetElementBlockColor(el); edir d=GetElementDir(el, D_DOWN ); impacter* bc=new impacter(game::SquareN(LastX,LastY), c,d); } /* Load Beast*/ void Load_Beast(TiXmlElement* el) { el->QueryIntAttribute("x",&LastX); el->QueryIntAttribute("y",&LastY); int ib=0; el->QueryIntAttribute("kind",&ib); edir d=GetElementDir(el, D_DOWN ); beast* bc=new beast(game::SquareN(LastX,LastY), btype(ib),d); } /* Load Magnet*/ void Load_Magnet(TiXmlElement* el) { int kind=0; int horz=0; el->QueryIntAttribute("x",&LastX); el->QueryIntAttribute("y",&LastY); el->QueryIntAttribute("horz",&horz); el->QueryIntAttribute("kind",&kind); magnetic* mg=new magnetic(game::SquareN(LastX,LastY), (mgtype)(kind), horz ); } /* Load BlockDoor */ void Load_BlockDoor(TiXmlElement* el, unsigned int AsTrap) { int open=0,round=0; el->QueryIntAttribute("x",&LastX); el->QueryIntAttribute("y",&LastY); blockcolor c=GetElementBlockColor(el); el->QueryIntAttribute("open",&open); blockdoor* bc=new blockdoor(game::SquareN(LastX,LastY),(AsTrap!=0), (! open),c); } /* Load Marked Area */ void Load_Marked(TiXmlElement* el) { el->QueryIntAttribute("x",&LastX); el->QueryIntAttribute("y",&LastY); blockcolor c=GetElementBlockColor(el); marked* bc=new marked(game::SquareN(LastX,LastY), c); } /* Load Fire Pad*/ void Load_FirePad(TiXmlElement* el) { el->QueryIntAttribute("x",&LastX); el->QueryIntAttribute("y",&LastY); firepad* fp=new firepad(game::SquareN(LastX,LastY)); } /* Load Pit*/ void Load_Pit(TiXmlElement* el) { el->QueryIntAttribute("x",&LastX); el->QueryIntAttribute("y",&LastY); pit* fp=new pit(game::SquareN(LastX,LastY)); } /* Load Hint */ void Load_Hint(TiXmlElement* el, bool warn) { int c1=0,c2; el->QueryIntAttribute("x",&LastX); el->QueryIntAttribute("y",&LastY); /*el->QueryIntAttribute("color",&c1);*/ const char* tx = el->GetText (); string text = ( (tx!=NULL) ? tx : "") ; hint* hn=new hint(game::SquareN(LastX,LastY), text, warn); /*if (c1!=0) { el->QueryIntAttribute("markcolor",&c2); hn->ChangeColor(palette::GetColor(c1),palette::GetColor(c2)); }*/ } #include /* Load Portal */ void Load_Portal(TiXmlElement* el) { int tx=0,ty=0,c=0; int defcolor=-1; el->QueryIntAttribute("x",&LastX); el->QueryIntAttribute("y",&LastY); el->QueryIntAttribute("targetx",&tx); el->QueryIntAttribute("targety",&ty); if (! options::LevelColorsDisabled()) { el->QueryIntAttribute("color",&c); } Uint8 R,G,B; R=G=B=255; el->QueryIntAttribute("defcolor",&defcolor); if (defcolor == 4) { defcolor = XYE_OBJECT_COLORS; } else if (defcolor >= 5){ defcolor--; } if( (defcolor>=0) && (defcolorQueryIntAttribute("x",&LastX); el->QueryIntAttribute("y",&LastY); if (! options::LevelColorsDisabled()) { el->QueryIntAttribute("color",&c); } //tdoor(square* sq,tdtype t,bool up, bool right, bool down, bool left); bool u=false,r=false,d=false,l=false; tdtype tt; if ( (! opt) || (opt==2) ) //Classical one way doors from kye or Force arrow { edir dr=GetElementDir(el); if (opt==2) dr=Opposite(dr); switch(dr) { case(D_LEFT): l=true; break; case(D_RIGHT): r=true; break; case(D_DOWN): d=true; break; default: u=true; } if (!opt) tt= (l || r)? td_HORZ:td_VERT; else switch(dr) { case(D_LEFT): tt=td_FORCEARROW_LEFT; break; case(D_RIGHT): tt=td_FORCEARROW_RIGHT; break; case(D_DOWN): tt=td_FORCEARROW_DOWN; break; default: tt=td_FORCEARROW_UP; break; } } else //magic squares or whatever { tt=td_SUPER; const char * ent=el->Attribute("ent"); if (ent) for (int i=0; ((ent[i]!=0) && (i<4)) ;i++) switch (ent[i]) { case('4'): l=true; break; case('6'): r=true; break; case('2'): d=true; break; default : u=true; } } tdoor* td= new tdoor(game::SquareN(LastX,LastY),tt,u,r,d,l); Uint8 red,green,blue; if (c) { palette::GetColor(c,red,green,blue); td->ChangeColor(red,green,blue); } } //================================================================================================== // Really helpful things: // blockcolor GetElementBlockColor(TiXmlElement* el, blockcolor def) { char x='\0'; const char* at=el->Attribute ("bc"); if (at!=NULL) x=at[0]; switch(x) { case('B'): case('b'): return (B_BLUE); case('G'): case('g'): return (B_GREEN); case('R'): case('r'): return (B_RED); case('Y'): case('y'): return (B_YELLOW); case('P'): case('p'): return (B_PURPLE); } return (def); } edir GetElementDir(TiXmlElement* el, edir def,const char * tag) { char x='\0'; const char* at=el->Attribute (tag); if (at!=NULL) x=at[0]; switch(x) { case('U'): case('u'): return (D_UP); case('D'): case('d'): return (D_DOWN); case('L'): case('l'): return (D_LEFT); case('R'): case('r'): return (D_RIGHT); } return (def); } otype GetOTFromXmlElement(TiXmlElement* x, unsigned int *extra) { strcpy(TempCharA,x->Value()); if (strcmp(TempCharA,"wall")==0) { *extra=0; return OT_WALL; } else if (strcmp(TempCharA,"roundwall")==0) { *extra=1; return OT_WALL; } else if (strcmp(TempCharA,"block")==0) return OT_BLOCK; else if (strcmp(TempCharA,"window")==0) return OT_WINDOW; else if (strcmp(TempCharA,"rattler")==0) return OT_RATTLER; else if (strcmp(TempCharA,"rfood")==0) return OT_RATTLERFOOD; else if (strcmp(TempCharA,"toggle")==0) return OT_TOGGLE; else if (strcmp(TempCharA,"auto")==0) return OT_AUTO; else if (strcmp(TempCharA,"factory")==0) return OT_FACTORY; else if (strcmp(TempCharA,"surprise")==0) return OT_SURPRISE; else if (strcmp(TempCharA,"filler")==0) return OT_FILLER; else if (strcmp(TempCharA,"sniper")==0) return OT_SNIPER; else if (strcmp(TempCharA,"earth")==0) return OT_EARTH; else if (strcmp(TempCharA,"gemblock")==0) return OT_GEMBLOCK; else if (strcmp(TempCharA,"lock")==0) return OT_LOCK; else if (strcmp(TempCharA,"key")==0) return OT_KEY; else if (strcmp(TempCharA,"wild")==0) return OT_WILDCARD; else if (strcmp(TempCharA,"star")==0) return OT_STAR; else if (strcmp(TempCharA,"metalblock")==0) return OT_METALBLOCK; else if (strcmp(TempCharA,"arrow")==0) return OT_ARROW; else if (strcmp(TempCharA,"scroll")==0) return OT_SCROLLBLOCK; else if (strcmp(TempCharA,"magnet")==0) return OT_MAGNETIC; else if (strcmp(TempCharA,"pusher")==0) return OT_PUSHER; else if (strcmp(TempCharA,"teleport")==0) return OT_TELEPORT; else if (strcmp(TempCharA,"beast")==0) return OT_BEAST; else if (strcmp(TempCharA,"blacky")==0) return OT_BLACKHOLE; else if (strcmp(TempCharA,"mine")==0) return OT_MINE; else if (strcmp(TempCharA,"timer")==0) return OT_NUMBER; else if (strcmp(TempCharA,"bot")==0) return OT_ROBOXYE; else if (strcmp(TempCharA,"lblock")==0) return OT_LOWDENSITY; else if (strcmp(TempCharA,"largeblockpart")==0) return OT_LARGEBLOCK; else if (strcmp(TempCharA,"clocker")==0) { *extra=0; return OT_TURNER; } else if (strcmp(TempCharA,"aclocker")==0) { *extra=1; return OT_TURNER; } //ground: else if (strcmp(TempCharA,"blockdoor")==0) { *extra=0; return OT_BLOCKDOOR; } else if (strcmp(TempCharA,"blocktrap")==0) { *extra=1; return OT_BLOCKDOOR; } else if (strcmp(TempCharA,"hint")==0) return OT_HINT; else if (strcmp(TempCharA,"warning")==0) return OT_WARNING; else if (strcmp(TempCharA,"portal")==0) return OT_PORTAL; else if (strcmp(TempCharA,"firepad")==0) return OT_FIREPAD; else if (strcmp(TempCharA,"pit")==0) return OT_PIT; else if (strcmp(TempCharA,"oneway")==0) { *extra=0; return OT_TRICKDOOR; } else if (strcmp(TempCharA,"hiddenway")==0) { *extra=1; return OT_TRICKDOOR; } else if (strcmp(TempCharA,"force")==0) { *extra=2; return OT_TRICKDOOR; } else if (strcmp(TempCharA,"marked")==0) { *extra=0; return OT_MARKEDAREA; } return OT_GEM; //Default "gem" } //======================================================================================== // Let's load the objects!: // void LoadObjects(TiXmlElement* normal) { TiXmlElement* pEChild= normal->FirstChildElement(); unsigned int x=0; while (pEChild) { switch(GetOTFromXmlElement(pEChild,&x)) { case(OT_WALL): Load_Wall(pEChild,x); break; case(OT_GEM): Load_Gem(pEChild); break; case(OT_STAR): Load_Star(pEChild); break; case(OT_AUTO): Load_Auto(pEChild); break; case(OT_FACTORY): Load_Factory(pEChild); break; case(OT_SURPRISE): Load_Surprise(pEChild); break; case(OT_FILLER): Load_Filler(pEChild); break; case(OT_SNIPER): Load_Sniper(pEChild); break; case(OT_EARTH): Load_Earth(pEChild); break; case(OT_GEMBLOCK): Load_GemBlock(pEChild); break; case(OT_WILDCARD): Load_WildCard(pEChild); break; case(OT_METALBLOCK): Load_MetalBlock(pEChild); break; case(OT_ARROW): Load_Arrow(pEChild); break; case(OT_SCROLLBLOCK): Load_ScrollBlock(pEChild); break; case(OT_MAGNETIC): Load_Magnet(pEChild); break; case(OT_PUSHER): Load_Pusher(pEChild); break; case(OT_BEAST): Load_Beast(pEChild); break; case(OT_LOWDENSITY): Load_LowDensity(pEChild); break; case(OT_BLACKHOLE): Load_Blackhole(pEChild); break; case(OT_MINE): Load_Mine(pEChild); break; case(OT_NUMBER): Load_Number(pEChild); break; case(OT_TELEPORT): Load_Teleport(pEChild); break; case(OT_TURNER): Load_Turner(pEChild,x); break; case(OT_ROBOXYE): Load_Robot(pEChild); break; case(OT_TOGGLE): Load_Toggle(pEChild); break; case(OT_LOCK): Load_Lock(pEChild); break; case(OT_KEY): Load_Key(pEChild); break; case(OT_RATTLER): Load_Rattler(pEChild); break; case(OT_RATTLERFOOD):Load_RFood(pEChild); break; case(OT_WINDOW):Load_WindowBlock(pEChild); break; case(OT_BLOCK): Load_Block(pEChild); break; case(OT_BLOCKDOOR): Load_BlockDoor(pEChild,x); break; case(OT_MARKEDAREA): Load_Marked(pEChild); break; case(OT_HINT): Load_Hint(pEChild,false); break; case(OT_WARNING): Load_Hint(pEChild,true); break; case(OT_LARGEBLOCK): Load_LargeBlock(pEChild); break; case(OT_PORTAL): Load_Portal(pEChild); break; case(OT_FIREPAD): Load_FirePad(pEChild); break; case(OT_PIT): Load_Pit(pEChild); break; case(OT_TRICKDOOR): Load_TrickDoor(pEChild,x); } pEChild= pEChild->NextSiblingElement(); //Next normal object } } //=========================================================================================== void LoadPalette(TiXmlElement* pal) { TiXmlElement* pEChild= pal->FirstChildElement("color"); int id=0; int r,g,b; while (pEChild) { //Load a color id=r=g=b=0; pEChild->QueryIntAttribute("id",&id); pEChild->QueryIntAttribute("red",&r); pEChild->QueryIntAttribute("green",&g); pEChild->QueryIntAttribute("blue",&b); const char* mode = pEChild->Attribute("mode"); if( (mode!=NULL) && (strcmp(mode,"MULTIPLY")==0) ) { palette::SetColor(id,r%256,g%256,b%256, PM_MULTIPLY); } else { palette::SetColor(id,r%256,g%256,b%256, PM_RECOLOR); } pEChild= pEChild->NextSiblingElement("color"); //Next color element } } //=========================================================================================== void LoadDefaults_Wall(TiXmlElement* el) { int cid=0; int t=0; if (! options::LevelColorsDisabled() ) { el->QueryIntAttribute("color",&cid); } el->QueryIntAttribute("type",&t); if (cid) { SDL_Color tm; palette_mode pm; palette::GetColor(cid,tm.r, tm.g, tm.b, pm); wall::SetDefaultColor(tm, (pm==PM_MULTIPLY) ); } if (t) wall::SetDefaultType(t); } void LoadDefaults_Tdoor(TiXmlElement* el) { int cid=0; int t=0; if (! options::LevelColorsDisabled()) { el->QueryIntAttribute("color",&cid); if (cid) { Uint8 r,g,b; palette::GetColor(cid,r,g,b); tdoor::ChangeDefaultColor(r,g,b); } } } void LoadDefaults_ForceArrow(TiXmlElement* el) { int cid=0; int t=0; if (! options::LevelColorsDisabled()) { el->QueryIntAttribute("color",&cid); if (cid) { Uint8 r,g,b; palette::GetColor(cid,r,g,b); tdoor::ChangeForceArrowDefaultColor(r,g,b); } } } void LoadDefaults_Earth(TiXmlElement* el) { int cid=0; int t=0; if (! options::LevelColorsDisabled()) { el->QueryIntAttribute("color",&cid); if (cid) { Uint8 r,g,b; palette::GetColor(cid,r,g,b); earth::SetDefaultColor(r,g,b); } } } //=========================================================================================== void LoadDefaults(TiXmlElement* def) { TiXmlElement* pEChild= def->FirstChildElement(); while (pEChild) { strcpy(TempCharA,pEChild->Value()); if (strcmp(TempCharA,"wall")==0) LoadDefaults_Wall(pEChild); else if (strcmp(TempCharA,"trick")==0) LoadDefaults_Tdoor(pEChild); else if (strcmp(TempCharA,"oneway")==0) LoadDefaults_Tdoor(pEChild); else if (strcmp(TempCharA,"hiddenway")==0) LoadDefaults_Tdoor(pEChild); else if (strcmp(TempCharA,"force")==0) LoadDefaults_ForceArrow(pEChild); else if (strcmp(TempCharA,"earth")==0) LoadDefaults_Earth(pEChild); pEChild= pEChild->NextSiblingElement(); //Next element } } //=========================================================================================== // Let's load the floor decoration! // void LoadFloor(TiXmlElement* floor) { if (options::LevelColorsDisabled()) { return; } int i,j; int x2=0,y2=0; int cid=0; unsigned int c=0; int skn=0; TiXmlElement* area= floor->FirstChildElement("area"); square* sq; Uint8 R,G,B; while (area) { x2=y2=cid=skn=0; area->QueryIntAttribute("x",&LastX); area->QueryIntAttribute("y",&LastY); area->QueryIntAttribute("x2",&x2); area->QueryIntAttribute("y2",&y2); area->QueryIntAttribute("color",&cid); area->QueryIntAttribute("skin",&skn); //Normalize: LastX = LastX % XYE_HORZ; LastY = LastY % XYE_VERT; x2= x2 % XYE_HORZ; y2= y2 % XYE_VERT; if (x2gs=GROUND_2; if (cid) { sq->R=R; sq->G=G; sq->B=B; } } //Next area= area->NextSiblingElement("area"); } } //========================== // Default level, in case there were errors: // void LevelPack::Default(const char* msg) { defmode=true; n=1; //one level Name = "Level File could not be open"; Author = "Unknown"; Desc = "An error happened while attempting to load the file"; LevelPack::CurrentLevelTitle= "Xye - Could not open level file"; SDL_WM_SetCaption(LevelPack::CurrentLevelTitle.c_str(),0); const char* err[5]= {"###.##..##...##..##.", "#...#.#.#.#.#..#.#.#", "##..##..##..#..#.##.", "#...#.#.#.#.#..#.#.#", "###.#.#.#.#..##..#.#"}; for (int i=0;i<5; i++) for (int j=0;j<20; j++) { if(err[i][j]=='#') { block* b = new block(game::Square(5+j,12-i) , B_RED, false); } } LevelPack::SetLevelBye("Sorry"); hint::SetGlobalHint(Desc.c_str()); LevelPack::Solution=""; palette::Clear(); if(msg!=NULL) LevelError = msg; game::XYE= new xye(game::Square(0,0)); } void LevelPack::Error(const char * msg) { Default(msg); } //=========================================================================================== // Let's load a level // void LoadLevel(TiXmlElement* level) { TiXmlElement* pEChild; LastX=0; LastY=0; //Part 1: Load the level's title: pEChild= level->FirstChildElement("title"); if (pEChild != NULL) { const char *cntd=pEChild->GetText(); if (cntd != NULL) { LevelPack::CurrentLevelTitle= "Xye - "+string(cntd); } else { LevelPack::CurrentLevelTitle= "Xye"; } SDL_WM_SetCaption(LevelPack::CurrentLevelTitle.c_str(),0); } else SDL_WM_SetCaption("Xye",0); //Part 2: Load the level's bye message if any: LevelPack::SetLevelBye(""); pEChild= level->FirstChildElement("bye"); if (pEChild) { const char *cntd=pEChild->GetText(); if (cntd != NULL) LevelPack::SetLevelBye(cntd); } //Part 3: Load the level's hint message if any: pEChild= level->FirstChildElement("hint"); if (pEChild) { const char *cntd=pEChild->GetText(); if (cntd!=NULL) hint::SetGlobalHint(cntd); } // Load the level's solution if any pEChild= level->FirstChildElement("solution"); LevelPack::Solution=""; if (pEChild) { const char *cntd=pEChild->GetText(); if (cntd!=NULL) LevelPack::Solution=cntd; } //First of all, load the palette, this makes writting the xml file easier so you don't set the same //color N times, and you just set it once, it also makes the xml files smaller. //And people can just change the color value of multiple elements without effort. palette::Clear(); pEChild= level->FirstChildElement("palette"); while (pEChild) { LoadPalette(pEChild); pEChild= pEChild->NextSiblingElement("palette"); } //Load default values, these are really helpful: pEChild= level->FirstChildElement("default"); while (pEChild) { LoadDefaults(pEChild); pEChild= pEChild->NextSiblingElement("default"); } //Now load the floor: pEChild= level->FirstChildElement("floor"); while (pEChild) { LoadFloor(pEChild); pEChild= pEChild->NextSiblingElement("floor"); } bool KyeLoaded=false; //kyeformat allows to embed .kye levels in .xye files if (pEChild= ( level->FirstChildElement("kyeformat"))) { KyeLoaded=LoadKyeFormat(pEChild); } //Yep, multiple ground and normal tags might be present and they work correctly //Ground objects are loaded first so if a normal object is created where a ground object is //supposed to be it already triggers its events //The separation between ground objects and 'normal' objects was an old idea that turned out // to be extremely lame as for the level format. // pEChild= ( level->FirstChildElement("ground")); while (pEChild) { LoadObjects(pEChild); pEChild= ( pEChild->NextSiblingElement("ground")); } pEChild= ( level->FirstChildElement("normal")); while (pEChild) { LoadObjects(pEChild); pEChild= ( pEChild->NextSiblingElement("normal")); } // pEChild= ( level->FirstChildElement("objects")); while (pEChild) { LoadObjects(pEChild); pEChild= ( pEChild->NextSiblingElement("objects")); } //There can only be one Xye pEChild= ( level->FirstChildElement("xye")); if (pEChild) Load_Xye(pEChild,KyeLoaded); else if (! KyeLoaded) game::XYE= new xye(game::Square(0,0)); } //returns true if kye was found: int NextLine(const char* c, int i) { if (i<0) return -1; while (c[i]!='\n') if (c[i]=='\0') return -1; else i++; if (c[i+1]=='\r') return i+2; return i+1; } bool LoadKyeFormatTag(TiXmlElement* kf, KyeLevel* out) { const char* tx=kf->GetText(); if(tx==NULL) tx=""; int offset=0,m; kf->QueryIntAttribute("offset",&offset); int L=strlen(tx),k=NextLine(tx,0); //ignore first line; int i=0,j=19; for (i=0;i=0)) { for (m=0;mdata[i][j]=tx[k]; i++; k++; } while (i<30) { out->data[i][j]=' '; i++; } j--;i=0; if (tx[k]=='\n') { k++; if (tx[k]=='\r') k++; } } while (j>=0) { i=0; while (i<30) { out->data[i][j]=' '; i++; } j--; } return true; } bool LoadKyeFormat(TiXmlElement* kf) { KyeLevel K(true); if (! LoadKyeFormatTag(kf, &K) ) { return false; } K.Load(); return (K.FoundKye); } /******* The palette psuedo class ***/ // // This is a hash table that takes integers instead of strings, to make a super dynamic array that // gets kind of slow with big sizes but works for any index in the integer range. // colorentry* palette::ls[PALETTE_BASE_SIZE]; bool palette::ready=false; void palette::Clear() { int i; colorentry* tm,*c; for (i=0;inext; delete (c); } ls[i]=NULL; } else { ls[i]=NULL; ready=true; } } // colorentry* palette::GetEntry(int id, bool create) { unsigned int indx=id % PALETTE_BASE_SIZE; colorentry* tm=ls[indx], *last=NULL; while (tm) { if (tm->id==id) return (tm); last=tm; tm=tm->next; } if (create) { tm=new colorentry; if (last) last->next=tm; else ls[indx]=tm; tm->next=NULL; tm->color=0xFFFFFFFF; tm->id=id; return(tm); } return (NULL); } void palette::SetColor(int id, unsigned int color, palette_mode pm) { colorentry *ce=GetEntry(id,true); ce->color=color; ce->R=255; ce->G=255; ce->B=255; ce->pm = pm; } void palette::SetColor(int id, int r,int g,int b, palette_mode pm) { colorentry *ce=GetEntry(id,true); ce->color= (0xFF000000) | (r << 16) | (g << 8) | (b) ; ce->R=r; ce->G=g; ce->B=b; ce->pm = pm; } unsigned int palette::GetColor(int id) { colorentry *ce=GetEntry(id,false); if (ce) return ce->color; return 0xFFFFFFFF; } void palette::GetColor(int id, Uint8 &R, Uint8 &G,Uint8 &B) { colorentry *ce=GetEntry(id,false); if (ce) { R=ce->R; G=ce->G; B=ce->B; } else { R=G=B=255; } } void palette::GetColor(int id, Uint8 &R, Uint8 &G,Uint8 &B, palette_mode& pm) { colorentry *ce=GetEntry(id,false); if (ce) { R=ce->R; G=ce->G; B=ce->B; pm = ce->pm; } else { R=G=B=255; pm = PM_MULTIPLY; } } xye-0.12.2+dfsg/src/xye_script.h000066400000000000000000000060661225403634500164650ustar00rootroot00000000000000/* There is a terrible bug when compiling tinyxml with STL support in combination of some compilers. #ifndef TIXML_USE_STL #define TIXML_USE_STL #endif */ #ifndef PALETTE_BASE_SIZE #define PALETTE_BASE_SIZE 20 #endif #include "tinyxml/xye_tinyxml.h" #include using std::string; void TempMap(); class LevelPack { private: static TiXmlDocument* Doc; static TiXmlElement* pack; static TiXmlElement* CurrentLevel; static TiXmlElement* FirstLevel; static void LoadInformation(); static void LoadFirstLevel(); static void LoadNthLevel(unsigned int n); static bool defmode; static bool kyemode; static bool xsbmode; static bool HasPrevious(); static bool HasNext(); LevelPack() {} public: static bool FromEditor; static void Init(); static void Clean(); static void Default(const char* msg = NULL); static void Error(const char * msg); static string CurrentLevelTitle; static unsigned int n; static string Author; static string Name; static string CurrentLevelBye; static string LevelError; static string OpenFile; static unsigned int OpenFileLn; static bool HasSolution(); static string Solution; static void SetLevelBye(const char* bye); static string Desc; static void Load(const char *filename, unsigned int ln=0, const string replay=""); //static void Load(const char *filename, unsigned int ln); //static void Load(const char *filename); static void Restart(); static void Next(); static void Last(); static bool GetFileData(const char* filename, string &au, string &ds, string &ti, unsigned int &leveln); static bool AllowUndo(); }; void LoadLevel(TiXmlElement* level); struct KyeLevel; bool LoadKyeFormatTag(TiXmlElement* kft, KyeLevel* out); bool LoadKyeFormat(TiXmlElement* kf); class Level { private: Level() {} public: static unsigned int n; static string Author; static string Name; static string Title; static void Reset(); }; enum palette_mode { PM_MULTIPLY, PM_RECOLOR }; struct colorentry { unsigned int id; unsigned int color; Uint8 R; Uint8 G; Uint8 B; palette_mode pm; colorentry* next; }; class palette { private: static colorentry* ls[PALETTE_BASE_SIZE]; static bool ready; static colorentry* GetEntry(int id, bool create=false); palette() {} public: static void SetColor(int id, unsigned int color, palette_mode pm=PM_MULTIPLY); static void SetColor(int id, int r, int g, int b, palette_mode pm=PM_MULTIPLY); static unsigned int GetColor(int id); static void GetColor(int id, Uint8 &R, Uint8 &G,Uint8 &B); static void GetColor(int id, Uint8 &R, Uint8 &G,Uint8 &B, palette_mode& pm); static void Clear(); }; blockcolor GetElementBlockColor(TiXmlElement* el,blockcolor def=B_YELLOW); edir GetElementDir(TiXmlElement* el,edir def=D_LEFT,const char* tag="dir"); xye-0.12.2+dfsg/src/xyedit.cpp000066400000000000000000002704051225403634500161350ustar00rootroot00000000000000/* Xye License (it is a PNG/ZLIB license) Copyright (c) 2006 Victor Hugo Soliz Kuncar This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. 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 appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. */ #include #include #include #include #include "levels.h" #include "xyedit.h" #include "xye.h" #include "xye_script.h" #include "options.h" #include "dialogs.h" #define sz editor::GRIDSIZE //typing game::GRIDSIZE is an annoyance int editor::Width,editor::Height, editor::GRIDSIZE; window* editor::editorwindow; editorbuttons *editor::buttons; editorboard * editor::board; unsigned int editor::tic4; unsigned int editor::subtic4; string editor::filename; string editor::filename_name; string editor::filename_path; bool editor::SavedFile=true; bool editor::ExitPrompt=false; button * editor::savebutton; button * editor::solutionbutton; button * nextbutton; button * previousbutton; button * erasebutton; button * changelevelnumberbutton; LuminositySprites editor::sprites; Font* editor::FontRes; bool SavedSolution = false; bool EnterPressed = false; string editorboard::filetitle; string editorboard::description; string editorboard::author; void editor::onExitWithoutSavingClick(bool yes) { ExitPrompt=false; if(yes) cancel(); } void editor::onBrowseWithoutSavingClick(bool yes) { if(yes) editor::editorwindow->SetTransition(LevelBrowser::StartSection); } void editor::onExitAttempt() { if(! SavedFile) { if(!ExitPrompt) { ExitPrompt=true; dialogs::makeYesNoDialog(editorwindow,"Are you sure you want to close the editor before saving the level?","Yes","No",editor::onExitWithoutSavingClick); } } else { cancel(); } }; void editor::onQuitClick(const buttondata* data) { onExitAttempt(); } void editor::SendSolution(const char* sol) { SavedFile = false; SavedSolution = true; editorboard::SetCopySolution(sol); } void editor::beforeDraw() { solutionbutton->Enabled = (board->solution != ""); subtic4++; if (subtic4==10) { subtic4=0; tic4++; if (tic4==4) tic4=0; } } void testSubWindowDo(bool okclicked, const string text, inputDialogData * dat) { if(okclicked) printf(": %s\n",text.c_str()); else printf("<--Cancel-->\n"); } editor::setText_state_enum editor::setText_state; editorobjecttype editor::SelectedType() { return buttons->SelectedObjectType; } void editor::continueSetText(bool okclicked, const string text, inputDialogData * dat) { if(! okclicked ) return; SavedFile=false; switch(setText_state) { case ASSIGN_TITLE: editorboard::filetitle=text; setText_state = ASSIGN_DESCRIPTION; dialogs::makeTextInputDialog(editorwindow,"Enter file description",editorboard::description, 3, "Ok", "Cancel", continueSetText,NULL); break; case ASSIGN_LEVEL_TITLE: board->title = text; setText_state = ASSIGN_HINT; dialogs::makeTextInputDialog(editorwindow,"Enter level hint (can leave empty)",board->hint, 3, "Ok", "Cancel", continueSetText,NULL); break; case ASSIGN_DESCRIPTION: editorboard::description=text; setText_state = ASSIGN_AUTHOR; dialogs::makeTextInputDialog(editorwindow,"Enter file author(s)",editorboard::author, 1, "Ok", "Cancel", continueSetText,NULL); break; case ASSIGN_AUTHOR: editorboard::author=text; if (editorboard::CountLevels() > 1) { char x[30]; sprintf(x, "%d", editorboard::CurrentLevelNumber() + 1); setText_state = ASSIGN_LEVEL_TITLE; dialogs::makeTextInputDialog(editorwindow,"Enter level title (level "+string(x)+" )", board->title, 3, "Ok", "Cancel", continueSetText,NULL); } else { board->title = editorboard::filetitle; setText_state = ASSIGN_HINT; dialogs::makeTextInputDialog(editorwindow,"Enter level hint (can leave empty)",board->hint, 3, "Ok", "Cancel", continueSetText,NULL); } break; case ASSIGN_HINT: board->hint=text; setText_state = ASSIGN_BYE; dialogs::makeTextInputDialog(editorwindow,"Enter level end message (You can leave it empty)",board->bye, 3, "Ok", "Cancel", continueSetText,NULL); break; case ASSIGN_BYE: board->bye = text; } } void editor::beginSetText(const buttondata* data) { setText_state=ASSIGN_TITLE; dialogs::makeTextInputDialog(editorwindow,"Enter file title",editorboard::filetitle, 1, "Ok", "Cancel", continueSetText,NULL); } string stripDotXyeExtension(const string s) { int l=s.length(); if ( (l<4) || (s[l-1]!='e') || (s[l-2]!='y') || (s[l-3]!='x') || (s[l-4]!='.') ) return s+string(".xye"); return s; } void editor::continueAppendFile(bool okclicked, const string text, inputDialogData * dat) { if (!okclicked) { return; } SavedFile = false; string tname=stripDotXyeExtension(text); string tfilename=options::GetMyLevelsFolder()+tname; std::ifstream file; file.open(tfilename.c_str(), std::ios::in ); if(! file.is_open()) { dialogs::makeMessageDialog(editorwindow, string("File ")+tfilename+string(" does not exist. Cannot append."), "Ok" , onDialogClickDoNothing); } else { file.close(); if (! appendLevels(tfilename)) { dialogs::makeMessageDialog(editorwindow, editor::loadError+" Had to halt append operation.","Ok",onDialogClickDoNothing); } else if ( editor::loadError != "") { dialogs::makeMessageDialog(editorwindow, editor::loadError,"Ok",onDialogClickDoNothing); } } } void editor::beginAppendFile(const buttondata* data) { dialogs::makeTextInputDialog(editorwindow,"This advanced option will (try to) append the contents of a level file at the end of the level you are currently editing. Type the file name.", "filename.xye", 1, "Ok", "Cancel", continueAppendFile,NULL); } void editor::continueChangeLevelNumber(bool okclicked, const string text, inputDialogData * dat) { if (!okclicked) { return; } SavedFile = false; int x; string s = ""; if ( TryS2I(text, x) ) { int n = board->CountLevels(); if ( (x >= 1) && (x <= n ) ) { editorboard::MoveToLevelNumber(board, x-1); editor::updateCountRelated(); } else { char buf[30]; sprintf(buf, "%d", n); s = string("\n\nPlease type a level number between 1 and ")+string(buf)+string("."); } } else { s = "\n\nThe requested input must be a number."; } if (s != "") { char buf[30]; sprintf(buf, "%d",board->CurrentLevelNumber()+1); dialogs::makeTextInputDialog(editorwindow,"This advanced option will move the current level to a different position in the file. The other levels will be slided accordingly. Type the new level number. "+s, string(buf), 1, "Ok", "Cancel", continueChangeLevelNumber,NULL); } } void editor::beginChangeLevelNumber(const buttondata*data) { char buf[30]; sprintf(buf, "%d",board->CurrentLevelNumber()+1); dialogs::makeTextInputDialog(editorwindow,"This advanced option will move the current level to a different position in the file. The other levels will be slided accordingly. Type the new level number.", string(buf), 1, "Ok", "Cancel", continueChangeLevelNumber,NULL); } bool parseColorString(string x, DefaultColorData& cd) { if (x=="") { cd.useDefault = true; return true; } if (x.length() != 6) { return false; } string rs = x.substr(0,2); string gs = x.substr(2,2); string bs = x.substr(4,2); int r,g,b; if (sscanf(rs.c_str(), "%x", &r) != 1) { return false; } if (sscanf(gs.c_str(), "%x", &g) != 1) { return false; } if (sscanf(bs.c_str(), "%x", &b) != 1) { return false; } cd.useDefault = false; cd.color.r = r; cd.color.g = g; cd.color.b = b; return true; } string makeColorString(DefaultColorData&cd) { if (cd.useDefault) { return ""; } string r = ""; char buf[3]; sprintf(buf,"%02X", cd.color.r ); r += buf; sprintf(buf,"%02X", cd.color.g ); r += buf; sprintf(buf,"%02X", cd.color.b ); r += buf; return r; } int ChangeLevelColor_stage; void editor::continueChangeLevelColor(bool okclicked, const string text, inputDialogData * dat) { if (!okclicked) { return; } string wallq = "This advanced option will allow you to change the level colors. Type the wall color you want to use in RRGGBB format. (For example, FFFFFF is white, 00FF00 is green). Leave empty to use the skin's default color."; string floorq = "This advanced option will allow you to change the level colors. Type the floor (background) color you want to use in RRGGBB format. (For example, FFFFFF is white, 00FF00 is green). Leave empty to use the skin's default color."; string earthq = "This advanced option will allow you to change the level colors. Type the earth (soft-block) color you want to use in RRGGBB format. (For example, FFFFFF is white, 00FF00 is green). Leave empty to use the skin's default color."; string error = ""; int & stage =ChangeLevelColor_stage; bool good = true; if (stage == 0) { good = parseColorString(text, board->colors[EDITOR_COLOR_WALLS]); } else if (stage == 1) { good = parseColorString(text, board->colors[EDITOR_COLOR_EARTH]); } else if (stage == 2) { good = parseColorString(text, board->colors[EDITOR_COLOR_FLOOR]); } string ntext = text; if (! good) { error = "\n\nPlease enter a string in the requested format."; } else { stage++; if (stage == 1) { ntext = makeColorString( board->colors[EDITOR_COLOR_EARTH] ); } else if (stage == 2) { ntext = makeColorString( board->colors[EDITOR_COLOR_FLOOR] ); } } if (stage < 3) { if (stage==1) { dialogs::makeTextInputDialog(editorwindow,earthq+error, ntext, 1, "Ok", "Cancel", continueChangeLevelColor,NULL); } else if (stage==2) { dialogs::makeTextInputDialog(editorwindow,floorq+error, ntext, 1, "Ok", "Cancel", continueChangeLevelColor,NULL); } else { dialogs::makeTextInputDialog(editorwindow,wallq+error, ntext, 1, "Ok", "Cancel", continueChangeLevelColor,NULL); } } SavedFile = false; } void editor::beginChangeLevelColor(const buttondata*data) { ChangeLevelColor_stage = 0; string x = makeColorString( board->colors[EDITOR_COLOR_WALLS] ); dialogs::makeTextInputDialog(editorwindow,"This advanced option will allow you to change the level colors. Type the wall color you want to use in RRGGBB format. (For example, FFFFFF is white, 00FF00 is green). Leave empty to use the skin's default color.", x, 1, "Ok", "Cancel", continueChangeLevelColor,NULL); } void editor::onClearConfirmation(bool yes) { if(yes) { SavedFile=false; board->makeDefaultLevel(); } } void editor::onClearClick(const buttondata* data) { dialogs::makeYesNoDialog(editorwindow,"Clearing will restore the entire level to the default layout, are you sure you want to clear the level?","Yes","No",editor::onClearConfirmation); } void editor::onPreviousLevelClick(const buttondata* data) { editorboard::SaveCopy(board); int n = ( editorboard::CountLevels() ); int x = ( editorboard::CurrentLevelNumber() + n - 1 ) % n; editorboard::LoadLevelNumber(board, x); updateCountRelated(); } void editor::onNextLevelClick(const buttondata* data) { editorboard::SaveCopy(board); int n = ( editorboard::CountLevels() ); int x = ( editorboard::CurrentLevelNumber() + 1 ) % n; editorboard::LoadLevelNumber(board, x); updateCountRelated(); } void editor::onInsertLevelClick(const buttondata* data) { SavedFile=false; editorboard::CreateLevel(board); updateCountRelated(); } void editor::onEraseLevelConfirmation(bool yes) { if(yes) { SavedFile=false; editorboard::DeleteLevel(board); updateCountRelated(); } } void editor::onEraseLevelClick(const buttondata* data) { dialogs::makeYesNoDialog(editorwindow,"Are you sure you want to erase this level?","Yes","No",editor::onEraseLevelConfirmation); } void editor::updateCountRelated() { int t = editorboard::CountLevels(); if (t == 1) { previousbutton->Enabled = false; nextbutton->Enabled = false; erasebutton->Enabled = false; changelevelnumberbutton->Enabled = false; } else { previousbutton->Enabled = true; nextbutton->Enabled = true; erasebutton->Enabled = true; changelevelnumberbutton->Enabled = true; } char x[30]; char y[30]; int ln = editorboard::CurrentLevelNumber()+1; options::SaveLevelFile( filename , ln); sprintf(x,"%d", ln ); sprintf(y,"%d", t ); string mylevels = options::GetMyLevelsFolder(); int i=0; while ( i < filename.length() && i < mylevels.length() && (filename[i]==mylevels[i]) ) { i++; } string title = "Xye - Editor: "+filename.substr(i)+" : "+string(x)+"/"+string(y); SDL_WM_SetCaption(title.c_str(),0); } void editor::saveAs(bool okclicked, const string text, inputDialogData * dat) { if(okclicked) { string tname=stripDotXyeExtension(text); string tfilename=options::GetMyLevelsFolder()+tname; std::ifstream file; file.open (tfilename.c_str(), std::ios::in ); if(file.is_open() && (filename!=tfilename) ) { dialogs::makeMessageDialog(editorwindow, string("File ")+string(tfilename)+string(" already exists, unable to replace it."),"Ok",onDialogClickDoNothing); file.close(); return; } filename=tfilename; filename_name=tname; filename_path=options::GetMyLevelsFolder(); if (save()) { updateCountRelated(); dialogs::makeMessageDialog(editorwindow, string(filename)+string(" saved successfully."),"Ok",onDialogClickDoNothing); } } } void editor::onSaveAsClick(const buttondata* data) { dialogs::makeTextInputDialog(editorwindow,"Enter a new level file name","", 1, "Ok", "Cancel", saveAs,NULL); } void editor::onBrowseClick(const buttondata* data) { if(! SavedFile) { dialogs::makeYesNoDialog(editorwindow,"Are you sure you want to close the editor before saving the level?","Yes","No",editor::onBrowseWithoutSavingClick); } else editor::editorwindow->SetTransition(LevelBrowser::StartSection); } void editor::cancel() { printf("Closing the editor without saving\n"); editorwindow->stop(); } void editor::ResumeSectionAndQuit(window* wind) { ResumeSection(wind); editor::onQuitClick(NULL); } void editor::ResumeSection(window* wind) { Sint16 sz32 = (game::GRIDSIZE*3)/2; tic4=0; Width=6+XYE_HORZ*GRIDSIZE; Height=GRIDSIZE+3+XYE_VERT*GRIDSIZE + 9+(GRIDSIZE+2)*4; editorwindow = wind; editorwindow->Resize(Width, Height); editorwindow->onExitAttempt=editor::onExitAttempt; SDL_WM_SetCaption("Xye - Editor",0); SDL_Color c; //Setup widgets settings: editorwindow->beforeDraw = editor::beforeDraw; editorwindow->onKeyDown= editor::onKeyDown; editorwindow->onKeyUp= editor::onKeyUp; editorwindow->addControl(new rectangle(0,0,Width,Height, 0,0,0 ) ); control* tmcntrl=new rectangle(0,0,Width,sz, options::LevelMenu_info ); tmcntrl->depth=1; editorwindow->addControl(tmcntrl); int bx=1; int bw; button* tmbut; //*** button tooltip buttontooltip* btt = new buttontooltip(); btt->depth = 22; wind->addControl(btt); btt->minx = 0; btt->maxx = Width; btt->miny = 0; btt->maxy = GRIDSIZE*2; //******* Browse bw=sz32; tmbut= new button(bx,0,bw,button::Size); tmbut->Icon(5,15); tmbut->toolTipControl = btt; tmbut->toolTip = "[Backspace] Return to level browser."; tmbut->onClick = editor::onBrowseClick; tmbut->depth=20; savebutton=tmbut; editorwindow->addControl(tmbut); bx+=bw+1; //**** Test button bw=sz32; tmbut= new button(bx,0,bw,button::Size); tmbut->Icon(7,3); tmbut->toolTipControl = btt; tmbut->toolTip = "[Enter] Test level."; tmbut->onClick = editor::test; tmbut->depth=20; editorwindow->addControl(tmbut); bx+=bw+1; // Previous bw=sz32; tmbut= new button(bx,0,bw,button::Size); tmbut->Icon(4,18); tmbut->onClick = onPreviousLevelClick; tmbut->toolTipControl = btt; tmbut->toolTip = "[P] Edit previous level."; tmbut->depth=20; previousbutton = tmbut; editorwindow->addControl(tmbut); bx+=bw+1; // Next bw=sz32; tmbut= new button(bx,0,bw,button::Size); tmbut->Icon(5,18); tmbut->toolTipControl = btt; tmbut->toolTip = "[N] Edit next level"; tmbut->onClick = onNextLevelClick; tmbut->depth=20; nextbutton = tmbut; editorwindow->addControl(tmbut); bx+=bw+1; //*** insert button bw=button::recommendedWidth("+"); tmbut= new button(bx,0,bw,button::Size); tmbut->text="+"; tmbut->toolTipControl = btt; tmbut->toolTip = "Insert new level."; tmbut->onClick = onInsertLevelClick; tmbut->depth=20; editorwindow->addControl(tmbut); bx+=bw+1; bw=button::recommendedWidth("x"); tmbut= new button(bx,0,bw,button::Size); tmbut->text="x"; tmbut->toolTipControl = btt; tmbut->toolTip = "Erase this level."; tmbut->onClick = onEraseLevelClick; tmbut->depth=20; erasebutton = tmbut; editorwindow->addControl(tmbut); bx+=bw+1; bw=button::recommendedWidth("c"); tmbut= new button(bx,0,bw,button::Size); tmbut->text="c"; tmbut->toolTipControl = btt; tmbut->toolTip = "Clear"; tmbut->onClick = onClearClick; tmbut->depth=20; editorwindow->addControl(tmbut); bx+=bw+1; bw=button::recommendedWidth("a"); tmbut= new button(bx,0,bw,button::Size); tmbut->text="a"; tmbut->toolTipControl = btt; tmbut->toolTip = "Edit text..."; tmbut->onClick = beginSetText; tmbut->depth=20; editorwindow->addControl(tmbut); bx+=bw+1; //*** Solution button: bw=sz32; tmbut = new button(bx,0, bw, button::Size); tmbut->Icon(8,4); tmbut->toolTipControl = btt; tmbut->toolTip = "[S] Play solution"; tmbut->depth=20; tmbut->onClick = editor::playSolution; editorwindow->addControl(tmbut); solutionbutton=tmbut; bx+=bw+1; //******** bx+=sz/2; bw=button::recommendedWidth("*"); tmbut= new button(bx,0,bw,button::Size); tmbut->text="*"; tmbut->toolTipControl = btt; tmbut->toolTip = "Append levels from file... (advanced)"; tmbut->onClick = beginAppendFile; tmbut->depth=20; editorwindow->addControl(tmbut); bx+=bw+1; bw=button::recommendedWidth("#"); tmbut= new button(bx,0,bw,button::Size); tmbut->text="#"; tmbut->toolTipControl = btt; tmbut->toolTip = "Change level number... (advanced)"; tmbut->onClick = beginChangeLevelNumber; tmbut->depth=20; changelevelnumberbutton = tmbut; editorwindow->addControl(tmbut); bx+=bw+1; //*** Colors: bw=sz32; bw=button::recommendedWidth("$"); tmbut= new button(bx,0,bw,button::Size); tmbut->text="$"; tmbut->toolTipControl = btt; tmbut->toolTip = "Edit level colors... (advanced)"; tmbut->depth=20; tmbut->onClick = beginChangeLevelColor; editorwindow->addControl(tmbut); bx+=bw+1; bx+=sz/2; bw=button::recommendedWidth("Save"); tmbut= new button(bx,0,bw,button::Size); tmbut->text="Save"; tmbut->onClick = editor::buttonSave; tmbut->depth=20; savebutton=tmbut; editorwindow->addControl(tmbut); bx+=bw+1; bw=button::recommendedWidth("Save as"); tmbut= new button(bx,0,bw,button::Size); tmbut->text="Save as"; tmbut->onClick = editor::onSaveAsClick; tmbut->depth=20; savebutton=tmbut; editorwindow->addControl(tmbut); bx+=bw+1; bw=button::recommendedWidth("Quit"); tmbut= new button(Width-1 -bw,0,bw,button::Size); tmbut->text="Quit"; tmbut->onClick = editor::onQuitClick; tmbut->depth=21; editorwindow->addControl(tmbut); bx+=bw+1; Sint16 by = 0; tmcntrl=new rectangle(3, XYE_VERT*sz + sz+3+by+3 , Width-6, 4+(sz+2)*4 , 255,255,255 ); tmcntrl->depth=2; editorwindow->addControl(tmcntrl); board = new editorboard(3,by+3+sz); editorboard::LoadCopy(board); updateCountRelated(); buttons = new editorbuttons(5, XYE_VERT*sz + by+8+sz , Width-10, 2+(sz+2)*4 ); board->depth = 3; buttons->depth = 3; editorwindow->addControl(buttons); editorwindow->addControl(board); } void editor::StartSection(window* wind) { ResumeSection(wind); bool trytest = true; if (!load()) { editorboard::ResetLevels(); editorboard::LoadCopy(board); updateCountRelated(); dialogs::makeMessageDialog(editorwindow, editor::loadError,"Ok",onDialogClickDoNothing); } else if ( editor::loadError != "") { dialogs::makeMessageDialog(editorwindow, editor::loadError,"Ok",onDialogClickDoNothing); } editorwindow = wind; } void editor::SetFile(const string &path, const string &file) { filename_path=path; filename_name=file; filename=path+file; } void editor::Error(const char* msg) { fprintf(stderr,"%s", msg); fprintf(stderr,"\n"); throw (msg); } bool editorEscapePressed=false; void editor::onKeyDown(SDLKey keysim, Uint16 unicode) { switch(keysim) { case (SDLK_ESCAPE): //ESC editorEscapePressed=true; break; case (SDLK_RETURN): case (SDLK_KP_ENTER): //Enter EnterPressed = true; break; }; } void editor::onKeyUp(SDLKey keysim, Uint16 unicode) { switch(keysim) { case (SDLK_ESCAPE): //ESC if(editorEscapePressed) { editorEscapePressed=false; onExitAttempt(); } break; case (SDLK_BACKSPACE): onBrowseClick(NULL); break; case(SDLK_RETURN): case(SDLK_KP_ENTER): //Enter if(EnterPressed) { EnterPressed=false; test(false); } break; case (SDLK_s): if( solutionbutton->Enabled ) { playSolution(NULL); } break; case(SDLK_PLUS): case(SDLK_KP_PLUS): case(SDLK_n): //Plus - N if (nextbutton->Enabled) { onNextLevelClick(NULL); } break; case(SDLK_MINUS): case(SDLK_KP_MINUS): case(SDLK_b): case(SDLK_p): //Minus - b - p if (previousbutton->Enabled) { onPreviousLevelClick(NULL); } break; }; } void editor::test(bool solution) { string nfilename = filename+"~"; if (! save(nfilename, true) ) { dialogs::makeMessageDialog(editorwindow, string("Unable to test the level because xyedit cannot rewrite ")+string(filename+"~")+".","Ok",onDialogClickDoNothing); return; } editorboard::SaveCopy(editor::board); buttons->SaveCopy(); game::TestLevel(nfilename.c_str(), 1, solution); } void editor::test() { test(false); } void editor::playSolution(const buttondata*data) { test(true); } class passHintObject: public inputDialogData { public: boardelement* o; }; void editor::continueAskHint(bool okclicked, const string text, inputDialogData * dat) { if (!okclicked) { return; } passHintObject * dt = static_cast(dat); boardelement*o = dt->o; o->hint = text; } void editor::askHint(boardelement* o) { string oldhint = o->hint; passHintObject * dat = new passHintObject(); dat->o = o; dialogs::makeTextInputDialog(editorwindow,"Type the hint", oldhint, 1, "Ok", "Cancel", continueAskHint, dat); } /*********** Plenty of object handling ***/ /*********** editorbuttons control! ***/ void editorbuttons::setInfo(const string & msg) { text=msg; SelectedObjectType= EDOT_NONE; Eraser=true; } editorbuttons::editorbuttons(int sx, int sy, int sw, int sh) { saved = false; depth=0; x=sx;y=sy;w=sw;h=sh; mousex=mousey=0; clicked=mouse=false; for (int i=0;i=EDITORBUTTONS_COUNTX) return NULL; y-=2; if (y<0) return NULL; int by=y/(sz+2); if (by>=EDITORBUTTONS_COUNTY) return NULL; lastclickedx=bx; lastclickedy=by; return &buttons[bx][by]; } int editorbuttons::detectRotation(int x0, int y0, int x1, int y1) { if((x0==x1)&&(y0==y1)) return 0; singleobject * a=getbuttonbyxy(x0,y0); singleobject * b=getbuttonbyxy(x1,y1); if ((a!=b) || (a==NULL)) return 0; x0= (x0-2)%(sz+2);if(x0>sz) x0=sz; x1= (x1-2)%(sz+2);if(x1>sz) x1=sz; y0= (y0-2)%(sz+2);if(y0>sz) y0=sz; y1= (y1-2)%(sz+2);if(y1>sz) y1=sz; int sz2=sz>>1; int q0,q1; if (x0>sz2) { if( y0>sz2) q0=3; else q0=0; } else { if( y0>sz2) q0=2; else q0=1; } if (x1>sz2) { if( y1>sz2) q1=3; else q1=0; } else { if( y1>sz2) q1=2; else q1=1; } if(q1==q0) return 0; if(q1== (q0+1)%4 ) return 1; return -1; } void editorbuttons::onMouseMove(int px,int py) { singleobject * obj; obj=getbuttonbyxy(px,py); if((hover!=obj) && (hover!=NULL)) hover->flash=false; hover=obj; if (hover) hover->flash=true; if(clicked) { //Drag and drop, handle rotation... int rot=detectRotation(mousex,mousey,px,py); if (clickedobject != NULL) { clickedobject->direction+=rot+4; clickedobject->direction%=4; SelectedDirection = clickedobject->direction; for (int i=0;itype) { o.direction = clickedobject-> direction; } } } } } } mousex=px; mousey=py; mouse=true; } void editorbuttons::onMouseOut() { if(hover!=NULL) { hover->flash=false; hover=NULL; } mouse=false; clicked=false; } void editorbuttons::onMouseDown(int px,int py) { clicked=true; } void ifnotnulldeselect(singleobject*s) { if(s!=NULL) s->selected=false; } void ifnotnullselect(singleobject*s) { if(s!=NULL) s->selected=true; } void editorbuttons::handleClick(singleobject* target) { switch(target->content) { case CONTENT_NOCONTENT: if(clickedempty==target) break; ifnotnulldeselect(clickedempty); ifnotnulldeselect(selection); target->selected=true; clickedempty=target; text="Eraser tool"; Eraser=true; break; case CONTENT_CHANGEOBJECT: ifnotnulldeselect(clickedempty); clickedempty=NULL; ifnotnulldeselect(clickedobject); ifnotnulldeselect(selection); switchToObject(target->type,target->color,target->round,target->variation, target->direction); target->selected=true; selection=clickedobject=target; break; case CONTENT_RECOLOR: ifnotnulldeselect(clickedempty); clickedempty=NULL; ifnotnulldeselect(selection); switchToObject(SelectedObjectType,target->color, SelectedRound, SelectedVariation, SelectedDirection); target->selected=true; clickedobject->color=target->color; selection=target; break; case CONTENT_DIRECTION: ifnotnulldeselect(clickedempty); clickedempty=NULL; ifnotnulldeselect(selection); switchToObject(SelectedObjectType,SelectedColor, SelectedRound, SelectedVariation, target->direction); target->selected=true; clickedobject->direction=target->direction; selection=target; break; case CONTENT_VARIATION: ifnotnulldeselect(clickedempty); clickedempty=NULL; ifnotnulldeselect(selection); switchToObject(SelectedObjectType,SelectedColor, SelectedRound, target->variation, SelectedDirection); target->selected=true; clickedobject->variation=target->variation; selection=target; break; case CONTENT_MAKEROUND: ifnotnulldeselect(clickedempty); clickedempty=NULL; ifnotnulldeselect(selection); switchToObject(SelectedObjectType,SelectedColor, target->round, SelectedVariation, SelectedDirection); target->selected=true; clickedobject->round=target->round; selection=target; } } void editorbuttons::onMouseUp(int px,int py) { clicked=false; singleobject* target=getbuttonbyxy(px,py); Eraser=false; if(target) { handleClick( target ); } } void editorbuttons::drawbutton(SDL_Surface* target,singleobject &o, int x, int y) { if(o.selected || o.flash) { if(o.flash) { if(clicked) SDL_FillRect(target,x-2,y-2,editor::GRIDSIZE+4,editor::GRIDSIZE+4,SDL_MapRGB(target->format,200,200,255)); else SDL_FillRect(target,x-2,y-2,editor::GRIDSIZE+4,editor::GRIDSIZE+4,SDL_MapRGB(target->format,200,200,200)); } else SDL_FillRect(target,x-2,y-2,editor::GRIDSIZE+4,editor::GRIDSIZE+4,SDL_MapRGB(target->format,0,0,0)); SDL_FillRect(target,x,y,editor::GRIDSIZE,editor::GRIDSIZE,SDL_MapRGB(target->format,255,255,255)); } switch(o.content) { case CONTENT_NOCONTENT: //SDL_FillRect(target,x,y,editor::GRIDSIZE,editor::GRIDSIZE,SDL_MapRGB(target->format,0,0,120)); break; case CONTENT_CHANGEOBJECT: drawObjectBySpecs( target,x,y,o.type,o.color, o.round, o.variation, o.direction); break; case CONTENT_RECOLOR: drawObjectBySpecs( target,x,y, SelectedObjectType, o.color, SelectedRound, SelectedVariation, SelectedDirection); break; case CONTENT_VARIATION: drawObjectBySpecs( target,x,y, SelectedObjectType, SelectedColor, SelectedRound, o.variation, SelectedDirection); break; case CONTENT_MAKEROUND: drawObjectBySpecs( target,x,y, SelectedObjectType, SelectedColor, o.round, SelectedVariation, SelectedDirection); break; case CONTENT_DIRECTION: drawObjectBySpecs( target,x,y, SelectedObjectType, SelectedColor, SelectedRound, SelectedVariation, o.direction); break; } } void editorbuttons::draw(SDL_Surface* target) { SDL_FillRect(target,x,y,w,h,SDL_MapRGB(target->format,255,255,255)); int i,j; for (i=0;iTextWidth(c); int ty=2+y+EDITORBUTTONS_COUNTY*(sz+2)+(sz-editor::FontRes->Height())/2+2; int tx=(w-tw)/2; editor::FontRes->Write(target,x+tx,ty,c); } editorbuttons editorbuttons::copy(0,0,0,0); void editorbuttons::SaveCopy() { copy.saved = true; for (int i=0;i0) { char lengthtex[20]; sprintf(lengthtex," (Length: %d) ",variation); text+=lengthtex; } break; case EDOT_FIREPAD: text="Fire pad";break; case EDOT_XYE: text="Xye"; if( variation!=0) { char livetex[8]; sprintf(livetex,"%d",variation); text += " (+"; text += livetex; if(variation==1) text += " extra life)"; else text+=" extra lives)"; } break; case EDOT_COLORSYSTEM: switch(variation) { case 0: text="Color door (closed)"; break; case 1: text="Color door (open)"; break; case 2: text="Color trapdoor (closed)"; break; case 3: text="Color trapdoor (open)"; break; case 4: text="Color marked area"; break; case 5: text="Color requirement-block"; break; case 6: text="Color marked area (with block)"; break; case 7: text="Color marked area (with wildcard block)"; break; } break; case EDOT_KEYSYSTEM: if(variation) text="Lock"; else text="Key"; break; case EDOT_BLOCK: text=gettextRC("block",color,round); break; case EDOT_NUMBER: switch(color) { case EDCO_RED: text="Exploding number-block"; break; case EDCO_GREEN: text="Security timer block"; break; case EDCO_BLUE: text="Slow timer block"; break; case EDCO_YELLOW: text="Timer block"; break; } break; case EDOT_WALL: if(round) { if (variation>3) text="Wall (auto-round, fire-resistant)"; else text="Wall (auto-round)"; } else { if (variation>3) text="Wall (fire-resistant)"; else text="Wall"; } break; case EDOT_GEM: switch (color) { case EDCO_GREEN: text="Emerald (green gem)"; break; case EDCO_YELLOW: text="Topaz (yellow gem)"; break; case EDCO_BLUE: text="Diamond (blue gem)"; break; case EDCO_RED: text="Ruby (red gem)"; break; default: text="Star (optional gem)"; } break; case EDOT_EARTH: if(round) text="Round soft block"; else text="Soft block"; break; case EDOT_GEMBLOCK: text="Gem requirement block"; break; case EDOT_MAGNET: switch(variation) { case 0: text="Magnet"; break; case 2: text="Sticky block"; break; case 1: text="Inverse magnet"; break; } break; case EDOT_LARGEBLOCK: switch(variation) { case 0: text="Large block (1-0-0-0)"; break; case 1: text="Large block (1-1-0-0)"; break; case 2: text="Large block (1-0-1-0)"; break; case 3: text="Large block (1-1-1-0)"; break; case 4: text="Large block (1-1-1-1)"; break; } break; case EDOT_PORTAL: if(variation==0) text=gettextRC("portal (primary)",color,false); else if(variation==1) text=gettextRC("portal (secondary)",color,false); else text=gettextRC("portal (exit)",color,false); break; case EDOT_COLORFACTORY: switch(variation) { case 0: text=gettextRC("block factory",color,round); break; case 1: text=gettextRC("arrow block factory",color,round); break; case 2: text=gettextRC("dot-block factory",color,round); break; case 3: text=gettextRC("pusher factory",color,false); break; case 4: text=gettextRC("gem factory",color,false); break; } break; case EDOT_DANGERFACTORY: switch(variation) { case 14: text="Rattler factory"; break; case 15: text="Rattler food factory"; break; case 16: text="Land mine factory"; break; default: text=string(GetMonsterName(variation))+" factory"; } break; case EDOT_PUSHER: switch(color) { case EDCO_YELLOW: text="Bouncer pusher"; break; case EDCO_RED: text="Persistent pusher"; break; case EDCO_BLUE: text="Clock-wise pusher"; break; case EDCO_GREEN: text="Anticlock-wise pusher"; break; } break; case EDOT_ARROWMAKER: if(variation==0) text=gettextRC("shooter clock",color ,round); else if (variation==1) text=gettextRC("filler",color ,round); else if (variation==2) text=gettextRC("sniper",color ,round); break; case EDOT_HAZARD: switch(variation) { case 0: text="Black hole"; break; case 1: text="Land mine"; break; case 2: text="Pit"; break; } break; case EDOT_ONEDIRECTION: if(!variation) switch(direction) { case EDITORDIRECTION_DOWN : text="One-way door (up->down)"; break; case EDITORDIRECTION_UP : text="One-way door (down->up)"; break; case EDITORDIRECTION_LEFT : text="One-way door (right->left)"; break; case EDITORDIRECTION_RIGHT : text="One-way door (left->right)"; break; } else if (variation==1) { text="Force arrow"; } else { Uint32 flags = getHiddenWayFlagsByVariationAndDir(variation, direction); text = "Hidden path "; if ( flags & (1<<8) ) { text += "(up) "; } if ( flags & (1<<2) ) { text += "(down) "; } if ( flags & (1<<4) ) { text += "(left) "; } if ( flags & (1<<6) ) { text += "(right) "; } } break; case EDOT_TELEPORT: switch(direction) { case EDITORDIRECTION_DOWN : text="Teleport (down->up)"; break; case EDITORDIRECTION_UP : text="Teleport (up->down)"; break; case EDITORDIRECTION_LEFT : text="Teleport (left->right)"; break; case EDITORDIRECTION_RIGHT : text="Teleport (right->left)"; break; } break; case EDOT_TURNER: if(variation) text=gettextRC("turning block (anticlock-wise)",color ,round); else text=gettextRC("turning block (clock-wise)",color ,round); break; case EDOT_SPECIALBLOCKS: switch(variation) { case 0: text=gettextRC("arrow-block",color,round);break; case 1: text=gettextRC("scroll-block",color,round);break; case 2: text=gettextRC("toggle-block (on)",color,round);break; case 3: text=gettextRC("toggle-block (off)",color,round);break; case 4: text=gettextRC("dot-block",color,round);break; case 5: text=gettextRC("surprise! block",color,round);break; } break; case EDOT_BEAST: text = GetMonsterName(variation); break; case EDOT_HINT: text = "Place / Edit hint."; break; default: text = "unknown"; } } void editorbuttons::extendButtons( editorobjecttype ot, editorcolor color, bool round, int variation) { bool roundchoice=false; int maxvariations=0; int colorchoice = 0; int dirchoice = 0; switch(ot) { case EDOT_GEM: colorchoice=1; break; case EDOT_COLORSYSTEM: colorchoice=1; maxvariations=8; break; case EDOT_RATTLERHEAD: maxvariations=10; dirchoice = 4;break; case EDOT_NUMBER: colorchoice=1; roundchoice=1; maxvariations=10; break; case EDOT_BLOCK: colorchoice=4; roundchoice=true; break; case EDOT_TURNER: colorchoice=2; roundchoice=true; maxvariations=2; break; case EDOT_XYE: maxvariations=4; break; case EDOT_WALL: maxvariations=6; roundchoice=true; break; case EDOT_MAGNET: maxvariations=3; dirchoice = 2; break; case EDOT_EARTH: roundchoice=true; break; case EDOT_KEYSYSTEM: colorchoice=1; maxvariations=2; break; case EDOT_SPECIALBLOCKS: roundchoice=true; colorchoice=1; maxvariations=6; dirchoice = 4; break; case EDOT_GEMBLOCK: colorchoice=1; break; case EDOT_ARROWMAKER: colorchoice=1; roundchoice=true; maxvariations=3; dirchoice = 4; break; case EDOT_PUSHER: colorchoice=1; dirchoice = 4; break; case EDOT_HAZARD: maxvariations=3; break; case EDOT_ONEDIRECTION: maxvariations=8; dirchoice = 4; break; case EDOT_BEAST: maxvariations=14; dirchoice = 4; break; case EDOT_LARGEBLOCK: maxvariations=5; colorchoice=2; dirchoice = 4; break; case EDOT_PORTAL: maxvariations=3; colorchoice=2; break; case EDOT_COLORFACTORY: maxvariations=5; colorchoice=1; roundchoice=1; dirchoice=4; break; case EDOT_DANGERFACTORY: maxvariations=17; dirchoice=4; break; case EDOT_TELEPORT: dirchoice=4; break; //default : //EDOT_BOT,EDOT_FIREPAD, EDOT_FOOD } int roundstart=0; int colorstart=3; int variationstart=2; int colorcount=0; int dirstart=0; if(colorchoice == 4) colorcount=8; else if(colorchoice == 3) colorcount=7; else if (colorchoice == 2) colorcount=6; else if (colorchoice == 1) colorcount=5; int upperlength = 0; int upperstart = 0; if (roundchoice) { upperlength = 2; } if (colorchoice) { upperlength = upperlength + colorcount + ( upperlength? 1 : 0); } if (dirchoice != 0) { upperlength = upperlength + dirchoice + ( upperlength? 1 : 0); } if (upperlength > 0) { upperstart = lastclickedx - upperlength/2; if (upperstart < 0) { upperstart = 0; } upperstart = min(upperstart, EDITORBUTTONS_COUNTX - upperlength); } if(roundchoice) { roundstart = upperstart; upperstart += 3; for (int i=0;i<2;i++) { singleobject &o=buttons[roundstart+i][0]; o.content= CONTENT_MAKEROUND; o.round=(bool)(i); /*if ((bool)(i)== round) { o.selected=true; clickedround=&o; }*/ } } if ( colorchoice ) { colorstart = upperstart; upperstart += 1 + colorcount; for (int i=0;i0) { variationstart = lastclickedx - maxvariations/2; if (variationstart < 2) { variationstart = 2; } // { variationstart + maxvariations-1 < EDITORBUTTONS_COUNTX } // { variationstart < EDITORBUTTONS_COUNTX - maxvariations + 1 } variationstart = min(variationstart, EDITORBUTTONS_COUNTX - maxvariations); for (int i=0;i=2) { singleobject &p=buttons[i][2]; p.content=CONTENT_NOCONTENT; p.selected=false; } } extendButtons(ot,color,round,variation); } SelectedColor = color; SelectedObjectType=ot; SelectedRound=round; SelectedVariation=variation; SelectedDirection = direction; } /*** editorboard control **/ void makewall(boardelement &o) { o.type=EDOT_WALL; o.variation=0; o.round=false; } vector editorboard::levelList(1); int editorboard::currentLevel; void editorboard::assign(editorboard* other) { for (int i=0; iobjects[i][j]; } } for (int i=0; icolors[i]; } xye_x = other->xye_x; xye_y = other->xye_y; for (int i=0; iportal_x[i][j]; portal_y[i][j] = other->portal_y[i][j]; } title=other->title; hint=other->hint; bye=other->bye; solution=other->solution; } void editorboard::CreateLevel(editorboard* ed) { SaveCopy(ed); int x = levelList.size(); levelList.resize(++x); for (int i=x-1; i > currentLevel+1; i--) { levelList[i] = levelList[i-1]; } LoadLevelNumber(ed, currentLevel+1); ed->objects[0][0].type = EDOT_NONE; ed->makeDefaultLevel(); } void editorboard::MoveToLevelNumber(editorboard* ed, int x) { int old = CurrentLevelNumber(); if (old == x) { //nothing } else if (old > x) { //x -> x+1 //x+1 -> x+2 // ... // x+t -> old for (int y=old; y>x; y--) { levelList[y].assign(&levelList[y-1]); } levelList[x].assign(&levelList[old]); currentLevel = x; } else if (old < x) { // old -> x // x -> x-1 // x-1 -> x-2 // ... // x-t -> old for (int y=old; y 1) { for (int i=currentLevel; i < x-1; i++) { levelList[i] = levelList[i+1]; } levelList.resize(x-1); if (currentLevel >= levelList.size() ) { LoadLevelNumber(ed, levelList.size()-1); } else { LoadLevelNumber(ed, currentLevel); } } } void editorboard::SaveAtLevelNumber(editorboard* ed, int num) { if( num >= levelList.size() ) { levelList.resize(num+1); } levelList[num].assign(ed); } void editorboard::ResetLevels(bool empty) { levelList.resize(0); if (empty) { currentLevel = -1; } else { levelList.resize(1); currentLevel = 0; filetitle = "Editor test"; description = "Generated with Xyedit"; author = ""; } } int editorboard::CountLevels() { return levelList.size(); } int editorboard::CurrentLevelNumber() { return currentLevel; } void editorboard::LoadLevelNumber(editorboard* ed, int num) { if( num >= levelList.size() ) { if ( levelList.size() == 0 ) { num = 0; levelList.resize(1); } else { num = levelList.size() - 1; } } else { ed->assign(&levelList[num] ); } currentLevel = num; } void editorboard::SaveCopy(editorboard* ed) { assert(currentLevel < levelList.size()); levelList[currentLevel].assign(ed); } void editorboard::SetCopySolution(const char* sol) { assert(currentLevel < levelList.size()); levelList[currentLevel].solution=sol; } void editorboard::LoadCopy(editorboard* ed) { assert(currentLevel < levelList.size()); ed->assign(&levelList[currentLevel]); } void editorboard::makeDefaultLevel() { int i,j; for (i=0; iSelectedObjectType == EDOT_HINT ) { int x = px/sz, y = py/sz; if ( (x<0) || (y<0) || (x>=XYE_HORZ) || (y>=XYE_VERT) ) { return ; } editor::SavedFile=false; boardelement &o=objects[x][y]; o.type = EDOT_HINT; if (editor::buttons->SelectedObjectType == EDOT_HINT) { editor::askHint(&o); } } } void editorboard::onMouseRightUp(int px,int py) { int bi=px/sz,bj=py/sz; bool er=editor::buttons->Eraser; editor::buttons->Eraser=true; applyFromButtons(bi,bj); editor::buttons->Eraser=er; } bool editorboard::wallContainsRoundCorners(int x, int y) { return ( objects[x][y].r1mem || objects[x][y].r3mem || objects[x][y].r9mem || objects[x][y].r7mem); } bool editorboard::findWall(int x, int y, int variation) { return (( objects[x][y].type == EDOT_WALL) && (objects[x][y].variation == variation)); } void editorboard::updateWallMem(int ox, int oy) { boardelement &o=objects[ox][oy]; bool r7,r9,r1,r3; r7=r9=r1=r3=o.round; if( (ox>0) && (objects[ox-1][oy].type==EDOT_WALL) ) r7=r1=false; if( (ox0) && (objects[ox][oy-1].type==EDOT_WALL) ) r9=r7=false; if( (oycolors[EDITOR_COLOR_WALLS]; if (! cd.useDefault ) { D.SetColors( &cd.color, 255); } else { D.SetColors( &options::WallColor[variation], 255); } } void editorboard::drawWallInBoard(SDL_Surface*target,int ox,int oy, int x, int y, int variation, bool round) { updateWallMem(ox,oy); bool r7,r9,r1,r3; boardelement &o=objects[ox][oy]; r1 = o.r1mem; r7 = o.r7mem; r9 = o.r9mem; r3 = o.r3mem; Drawer D(editor::sprites,0,0,0,0); editorWallColors(D, variation); Sint16 sz2=sz/2; Sint16 ty; ty=sz*(variation); //D.SetColors(R,G,B,255); char px=ox, py=oy; char rx=px+1, lx=px-1, dy=py+1, uy=py-1; if(rx>=XYE_HORZ) rx=0; if(dy>=XYE_VERT) dy=0; if(lx<0) lx=XYE_HORZ-1; if(uy<0) uy=XYE_VERT-1; bool up = findWall( px, uy, variation); bool down = findWall( px, dy, variation); bool left = findWall( lx, py, variation); bool right = findWall( rx, py, variation); bool upright = findWall( rx, uy, variation); bool downright =findWall( rx, dy, variation); bool upleft = findWall( lx, uy, variation); bool downleft = findWall( lx, dy, variation); up = up && !r7 && !r9; down = down && !r1 && !r3; right = right && !r9 && !r3; left = left && !r7 && !r1; bool inborder = (!left||!up||!right||!down); if( !inborder && (!upright || !upleft || !downright ||!downleft) ) { /*inborder = !( wallContainsRoundCorners(px,uy) || wallContainsRoundCorners(px,dy) || wallContainsRoundCorners(lx, py) || wallContainsRoundCorners(rx, py) );*/ inborder = true; } if (r7) D.ChangeRect(10*sz,ty,sz2,sz2); else if( up && left && !inborder) D.ChangeRect(15*sz,ty,sz2,sz2); else if(up&&left&&upleft) D.ChangeRect(14*sz,ty,sz2,sz2); else if(up&&left) D.ChangeRect(13*sz,ty,sz2,sz2); else if ( up) D.ChangeRect(12*sz,ty,sz2,sz2); else if ( left) D.ChangeRect(11*sz,ty,sz2,sz2); else D.ChangeRect(9*sz,ty,sz2,sz2); D.Draw(target,x,y); if (r9) D.ChangeRect(21*sz2,ty,sz2,sz2); else if( up && right && !inborder) D.ChangeRect(15*sz+sz2,ty,sz2,sz2); else if(up&&right&&upright) D.ChangeRect(14*sz+sz2,ty,sz2,sz2); else if(up&&right) D.ChangeRect(13*sz+sz2,ty,sz2,sz2); else if ( up) D.ChangeRect(12*sz+sz2,ty,sz2,sz2); else if ( right) D.ChangeRect(11*sz+sz2,ty,sz2,sz2); else D.ChangeRect(19*sz2,ty,sz2,sz2); //D.SetColors(255,255,255,50); D.Draw(target,x+sz2,y); //D.SetColors(255,255,255,255); if (r1) D.ChangeRect(10*sz,ty+sz2,sz2,sz2); else if( down && left && !inborder) D.ChangeRect(15*sz,ty+sz2,sz2,sz2); else if(down&&left&&downleft) D.ChangeRect(14*sz,ty+sz2,sz2,sz2); else if(down&&left) D.ChangeRect(13*sz,ty+sz2,sz2,sz2); else if ( down) D.ChangeRect(12*sz,ty+sz2,sz2,sz2); else if ( left) D.ChangeRect(11*sz,ty+sz2,sz2,sz2); else D.ChangeRect(9*sz,ty+sz2,sz2,sz2); D.Draw(target,x,y+sz2); if (r3) D.ChangeRect(21*sz2,ty+sz2,sz2,sz2); else if( down && right && !inborder) D.ChangeRect(15*sz+sz2,ty+sz2,sz2,sz2); else if(down&&right&&downright) D.ChangeRect(14*sz+sz2,ty+sz2,sz2,sz2); else if(down&&right) D.ChangeRect(13*sz+sz2,ty+sz2,sz2,sz2); else if ( down) D.ChangeRect(12*sz+sz2,ty+sz2,sz2,sz2); else if ( right) D.ChangeRect(11*sz+sz2,ty+sz2,sz2,sz2); else D.ChangeRect(19*sz2,ty+sz2,sz2,sz2); D.Draw(target,x+sz2,y+sz2); } void editorboard::drawTeleportInBoard(SDL_Surface*target,int ox,int oy, int x, int y, int direction) { Uint8 variation = 0; switch(direction) { case EDITORDIRECTION_LEFT: case EDITORDIRECTION_RIGHT: for (int i=0; i < XYE_HORZ; i++) if (i != ox) { boardelement & o = objects[i][oy]; if ( (o.type == EDOT_TELEPORT) && (o.direction != direction ) && ( o.direction == EDITORDIRECTION_RIGHT || o.direction == EDITORDIRECTION_LEFT) ) { variation = 1; break; } } break; case EDITORDIRECTION_UP: case EDITORDIRECTION_DOWN: for (int j=0; j < XYE_VERT; j++) if (j != oy) { boardelement & o = objects[ox][j]; if ( (o.type == EDOT_TELEPORT) && (o.direction != direction ) && ( o.direction == EDITORDIRECTION_UP || o.direction == EDITORDIRECTION_DOWN) ) { variation = 1; break; } } break; } Uint8 tx,ty; switch(direction) { case EDITORDIRECTION_RIGHT: tx=4;break; case EDITORDIRECTION_DOWN: tx=5; break; case EDITORDIRECTION_LEFT: tx=6; break; default: /*up*/ tx=7; } ty = (variation? 1: 2); Drawer D(editor::sprites,tx*sz,ty*sz,sz,sz); D.Draw(target,x,y); } void editorboard::draw(SDL_Surface* target) { int i,j; DefaultColorData &cd = colors[EDITOR_COLOR_FLOOR]; if (cd.useDefault) { SDL_FillRect(target,x,y,w,h,SDL_MapRGB(target->format,options::FloorColor)); } else { SDL_FillRect(target,x,y,w,h,SDL_MapRGB(target->format,cd.color)); } for (i=0;i 0 ) use = 1; int tx= portal_x[cid][use], ty=portal_y[cid][use]; if(tx!=-1) { objects[tx][ty].type=EDOT_NONE; } portal_x[cid][use]=x; portal_y[cid][use]=y; } void editorboard::applyFromButtons(int x, int y) { if((x<0) || (y<0) || (x>=XYE_HORZ) || (y>=XYE_VERT)) return ; editor::SavedFile=false; boardelement &o=objects[x][y]; if((x==xye_x) && (y==xye_y)) { xye_x=-1; xye_y=-1; } for (int i=0; iEraser) { o.type=EDOT_NONE; return; } switch(editor::buttons->SelectedObjectType) { case EDOT_XYE: if(xye_x!=-1) objects[xye_x][xye_y].type=EDOT_NONE; xye_x=x; xye_y=y; break; case EDOT_PORTAL: enforceUniquePortals(x,y, editor::buttons->SelectedVariation, editor::buttons->SelectedColor); break; } //Hints are a special case, because we only want the input dialog to appear once. if (editor::buttons->SelectedObjectType == EDOT_HINT) { return; } o.type=editor::buttons->SelectedObjectType; o.color=editor::buttons->SelectedColor; o.variation=editor::buttons->SelectedVariation; o.round=editor::buttons->SelectedRound; o.direction=editor::buttons->SelectedDirection; o.parentx = o.parenty = -1; } /****** object drawing, Very painful ****/ void drawXye( SDL_Surface * target, int x, int y, int variation) { Drawer D(editor::sprites,0,0,sz,sz); D.SetColors( &game::PlayerColor); D.Draw(target,x,y); if(variation) { char vartext[3]; vartext[0]='+'; vartext[1]=(char)variation+'0'; vartext[2]='\0'; editor::FontRes->Write(target,x,y,vartext); } } void drawRattlerHead( SDL_Surface * target, int x, int y, int variation, int direction) { Uint8 tx,ty; switch(direction) { case EDITORDIRECTION_LEFT: tx=12,ty=10; break; case EDITORDIRECTION_UP: tx=13,ty=10; break; case EDITORDIRECTION_RIGHT: tx=14,ty=10; break; case EDITORDIRECTION_DOWN: tx=15,ty=10; break; } Drawer D(editor::sprites,tx*sz,ty*sz,sz,sz); if(variation) { D.SetColors(255,255,255,70); } D.Draw(target,x,y); if(variation) { char vartext[3]; vartext[0]='+'; vartext[1]=(char)variation+'0'; vartext[2]='\0'; editor::FontRes->Write(target,x,y,vartext); } } void drawGem( SDL_Surface * target, int x, int y, editorcolor color) { Uint8 tx,ty; ty=3; switch(color) { case(EDCO_BLUE): tx=2; break; case(EDCO_RED): tx=3; break; case(EDCO_GREEN): tx=4; break; case(EDCO_YELLOW): tx=5; break; default: ty = 13, tx=9; } Drawer D(editor::sprites,tx*sz,ty*sz,sz,sz); D.Draw(target,x,y); } void drawWall( SDL_Surface * target, int x, int y, bool round, int variation) { Uint8 tx,ty; ty=variation; if(round) tx=10; else tx=9; Drawer D(editor::sprites,tx*sz,ty*sz,sz,sz); editorWallColors(D, variation); D.Draw(target,x,y); } void drawBlock( SDL_Surface * target, int x, int y, bool round, editorcolor color) { Uint8 tx,ty=0; if(round) tx=2; else tx=1; Drawer D(editor::sprites,tx*sz,ty*sz,sz,sz); if( color==EDCO_WILD) { ty = 2, tx = 1+round; D.ChangeRect(tx*sz,ty*sz,sz,sz); } else if(color==EDCO_METAL) { ty = 8, tx = 9+round; D.ChangeRect(tx*sz,ty*sz,sz,sz); } else if(color!=EDCO_WHITE) { D.SetColors(&options::BKColor[color],255); } else { D.SetColors(&options::BKColor[5],255); } D.Draw(target,x,y); } void drawPortal( SDL_Surface * target, int x, int y, editorcolor color, int variation) { Uint8 tx=8,ty=0; Drawer D(editor::sprites,tx*sz,ty*sz,sz,sz); Uint8 alpha = 255; if(variation>0) alpha = 200; if(color!=EDCO_WHITE) { D.SetColors(&options::BKColor[color],alpha); } else if(alpha!=255) { D.SetColors(255,255,255,alpha); } D.Draw(target,x,y); if(variation==2) { tx=4, ty=10; D.ChangeRect(tx*sz,ty*sz,sz,sz); alpha = 62; D.SetColors(0,0,0,alpha); D.Draw(target,x,y); } } void drawMetalBlock( SDL_Surface * target, int x, int y, bool round) { Uint8 tx,ty=8; if(round) tx=10; else tx=9; Drawer D(editor::sprites,tx*sz,ty*sz,sz,sz); D.Draw(target,x,y); } void drawGemBlock( SDL_Surface * target, int x, int y, editorcolor color) { Uint8 tx=6,ty=9; Drawer D(editor::sprites,tx*sz,ty*sz,sz,sz); D.SetColors(&options::BKColor[color],255); D.Draw(target,x,y); tx=8; D.ChangeRect(tx*sz,ty*sz,sz,sz); D.SetColors(&options::BFColor[color],255); D.Draw(target,x,y); } void drawColorSystem( SDL_Surface * target, int x, int y, editorcolor color, int variation) { Uint8 tx,ty; switch (variation) { case 0: /*closed door*/ tx=7,ty=5; break; case 1: /*open door*/ tx=7,ty=7; break; case 2: /*closed trap*/ tx=8,ty=5; break; case 3: /*open trap*/ tx=8,ty=7; break; case 4: /*marked*/ tx=6,ty=5; break; case 5: /*window*/ tx=9,ty=7; break; case 6: drawBlock(target,x,y,false,color); tx=6,ty=5; break; case 7: drawBlock(target,x,y,false,EDCO_WILD); tx=6,ty=5; break; } Drawer D(editor::sprites,tx*sz,ty*sz,sz,sz); D.SetColors(&options::BKColor[color],255); D.Draw(target,x,y); } void drawKeySystem( SDL_Surface * target, int x, int y, editorcolor color, int variation) { Uint8 tx,ty; switch (variation) { case 0: /*key*/ tx=6,ty=4; break; case 1: /*lock*/ tx=7,ty=4; break; } Drawer D(editor::sprites,tx*sz,ty*sz,sz,sz); D.SetColors(&options::BKColor[color],255); D.Draw(target,x,y); } void drawEarth( SDL_Surface * target, int x, int y, bool round) { Uint8 tx,ty=1; if(round) tx=2; else tx=1; Drawer D(editor::sprites,tx*sz,ty*sz,sz,sz); DefaultColorData & cd = editor::board->colors[EDITOR_COLOR_EARTH]; if (! cd.useDefault ) { D.SetColors( &cd.color, 255); } else { D.SetColors( &options::EarthColor, 255); } D.Draw(target,x,y); } void drawNumber( SDL_Surface * target, int x, int y, editorcolor color, bool round, int variation) { //drawBlock(target,x,y,round,color); Uint8 tx,ty; tx = 16+round; ty = 6 + variation; Drawer D(editor::sprites,tx*sz,ty*sz,sz,sz); D.SetColors(&options::BKColor[color],255); D.Draw(target,x,y); tx = 18; D.ChangeRect(tx*sz,ty*sz,sz,sz); D.SetColors(&options::BFColor[color],255); D.Draw(target,x,y); } void drawSpecialBlocks( SDL_Surface * target, int x, int y, bool round, editorcolor color, int variation, int direction) { drawBlock(target,x,y,round,color); Uint8 tx,ty; if (variation==0) { switch(direction) { case(EDITORDIRECTION_RIGHT): tx=4; ty=9; break; case(EDITORDIRECTION_LEFT): tx=5; ty=9; break; case(EDITORDIRECTION_UP): tx=5; ty=10; break; default: tx=4; ty=10; } } else if (variation==1) { switch(direction) { case(EDITORDIRECTION_RIGHT): tx=4; ty=16; break; case(EDITORDIRECTION_LEFT): tx=5; ty=16; break; case(EDITORDIRECTION_UP): tx=5; ty=17; break; default: tx=4; ty=17; } } else if(variation==2) tx=3,ty=8; else if (variation==3) tx=3,ty=9; else if (variation==4) tx=3,ty=12; else tx=3,ty=7; Drawer D(editor::sprites,tx*sz,ty*sz,sz,sz); D.SetColors(&options::BFColor[color],255); D.Draw(target,x,y); } void drawTurner( SDL_Surface * target, int x, int y, bool round, editorcolor color, int variation) { drawBlock(target,x,y,round,color); Uint8 tx=3,ty; if(variation) ty=10; else ty=11; Drawer D(editor::sprites,tx*sz,ty*sz,sz,sz); if(color!=EDCO_WHITE) { D.SetColors(&options::BFColor[color],255); } else { D.SetColors(&options::BFColor[5],255); } D.Draw(target,x,y); } /* * 0 | 1 | 2 * 7 - - 3 * 6 | 5 | 4 * * */ void drawLargeBlockByFlags( SDL_Surface * target, int x, int y, editorcolor color, Uint8 flags, bool doalpha=false) { Uint8 tx,ty; Uint8 sz2 = sz>>1; //flags = 0b1101; Uint8 up = (flags>>1)&1; Uint8 right = (flags>>3)&1; Uint8 down = (flags>>5)&1; Uint8 left = (flags>>7)&1; Uint8 upleft = (flags>>0)&1; Uint8 upright = (flags>>2)&1; Uint8 downright = (flags>>4)&1; Uint8 downleft = (flags>>6)&1; //top left corner: Uint8 var = 0; if( up&&left&&upleft) var=4; else if( up&&left) var = 3; else if(up) var = 2; else if(left) var = 1; tx = 10; ty = var + 15; Drawer D(editor::sprites, tx*sz, ty*sz,sz2,sz2); Uint8 alpha = 255; if( doalpha) alpha = 128; if(color!=EDCO_WHITE) { D.SetColors(&options::BKColor[color],alpha); } else { Uint8 r = options::BKColor[5].r; Uint8 g = options::BKColor[5].g; Uint8 b = options::BKColor[5].b; if(editor::buttons->SelectedObjectType == EDOT_LARGEBLOCK) { r *= 0.86; g *= 0.86; b *= 0.86; } D.SetColors(r,g,b,alpha); } D.Draw(target,x,y); //top right corner: var = 0; if( up&&right&&upright) var=4; else if( up&&right) var = 3; else if(up) var = 2; else if(right) var = 1; tx = 10; ty = var + 15; D.ChangeRect(tx*sz+sz2, ty*sz, sz2,sz2); D.Draw(target,x+sz2,y); //bottom left corner: var = 0; if( down&&left&&downleft) var=4; else if( down&&left) var = 3; else if(down) var = 2; else if(left) var = 1; tx = 10; ty = var + 15; D.ChangeRect(tx*sz, ty*sz + sz2,sz2,sz2); D.Draw(target,x,y+sz2); //bottom right corner: var = 0; if( down&&right&& downright) var=4; else if( down&&right) var = 3; else if(down) var = 2; else if(right) var = 1; tx = 10; ty = var + 15; D.ChangeRect(tx*sz+sz2, ty*sz +sz2, sz2,sz2); D.Draw(target,x+sz2,y+sz2); } Uint8 getLargeBlockFlagsByVarDir( int variation, int direction) { /* |0| * - - * 3 1 * -|2| */ Uint8 flags = 0; switch(variation) { case 0: flags = /*0b0001*/ 1; break; case 1: flags = /*0b0011*/ 3; break; case 2: flags = /*0b0101*/ 5; break; case 3: flags = /*0b1011*/11; break; case 4: flags = /*0b1111*/15; break; } switch(direction) { case EDITORDIRECTION_DOWN: //bit 0 to 2 flags = ( ((flags<<2)&/*0b1111*/15) | (flags>>2) ); break; case EDITORDIRECTION_UP: //bit 0 to 0 break; case EDITORDIRECTION_LEFT: //bit 0 to 3 flags = ( ((flags<<3)&/*0b1111*/15) | (flags>>1) ); break; case EDITORDIRECTION_RIGHT: //bit 0 to 1 flags = ( ((flags<<1)&/*0b1111*/15) | (flags>>3) ); break; } Uint8 up = flags&1; Uint8 right = (flags>>1)&1; Uint8 down = (flags>>2)&1; Uint8 left = (flags>>3)&1; Uint8 nflags = (up<<1)|(right<<3)|(down<<5)|(left<<7); return nflags; } void drawLargeBlock( SDL_Surface * target, int x, int y, editorcolor color, int variation, int direction) { Uint8 nflags = getLargeBlockFlagsByVarDir(variation, direction); drawLargeBlockByFlags( target, x,y, color, nflags); } Uint8 largeBlockDFS[XYE_HORZ][XYE_VERT] = {}; void dfsLargeBlocks(int x, int y, editorcolor color, int px, int py, editorboard* eb) { if(largeBlockDFS[x][y] != editor::tic4) { largeBlockDFS[x][y] = editor::tic4; boardelement &o=eb->objects[x][y]; Uint8 nflags = getLargeBlockFlagsByVarDir(o.variation, o.direction); o.parentx = px, o.parenty = py; int dx[4] = { 0, 1, 0, -1}; int dy[4] = { -1, 0, 1, 0}; int df[4] = { 1, 3, 5, 7}; int dop[4] = { 5, 7, 1, 3}; for (int r=0; r<4; r++) { int nx = dx[r]+x, ny = dy[r]+y; if(nx<0) nx = XYE_HORZ-1; if(ny<0) ny = XYE_VERT-1; if(ny>=XYE_VERT) ny = 0; if(nx>=XYE_HORZ) nx = 0; boardelement &o2 = eb->objects[nx][ny]; Uint8 nflags2 = getLargeBlockFlagsByVarDir(o2.variation, o2.direction); if( ((nflags &( 1<=XYE_VERT) ny = 0; if(nx>=XYE_HORZ) nx = 0; boardelement &o2 = objects[nx][ny]; if( (o2.type==EDOT_LARGEBLOCK) && (o2.parentx == o.parentx) && (o.parenty==o2.parenty)) { nflags|=(1< 1) &&*/ ( editor::buttons->SelectedObjectType == EDOT_LARGEBLOCK) ) { if ( flags != (nflags-(nflags&/*0b01010101*/85) ) ) { doalpha = true; if(editor::tic4<2) { drawLargeBlockByFlags( target, x,y, color, nflags , doalpha); return; } // nflags |= flags; } nflags = flags|(nflags&/*0b01010101*/85); } drawLargeBlockByFlags( target, x,y, color, nflags , doalpha); } void drawMagnet( SDL_Surface * target, int x, int y, int variation, int direction) { Uint8 tx,ty; bool vert=((direction==EDITORDIRECTION_DOWN)||(direction==EDITORDIRECTION_UP)); if (vert) ty=12; else ty=13; tx=6+variation; Drawer D(editor::sprites,tx*sz,ty*sz,sz,sz); D.Draw(target,x,y); } void drawPusher( SDL_Surface * target, int x, int y, editorcolor color, int direction) { Uint8 tx,ty; switch(direction) { case EDITORDIRECTION_RIGHT :tx=4;ty=5; break; case EDITORDIRECTION_LEFT :tx=5;ty=5; break; case EDITORDIRECTION_DOWN :tx=4;ty=6; break; case EDITORDIRECTION_UP :tx=5;ty=6; break; } Drawer D(editor::sprites,tx*sz,ty*sz,sz,sz); D.SetColors(&options::BKColor[color],255); D.Draw(target,x,y); ty+=2; D.ChangeRect(tx*sz,ty*sz,sz,sz); D.SetColors(&options::BFColor[color],255); D.Draw(target,x,y); } void drawArrowMaker( SDL_Surface * target, int x, int y, bool round, editorcolor color, int direction, int variation) { Uint8 dx,dy,tx,ty; switch(direction) { case EDITORDIRECTION_RIGHT :dx=0;dy=0; break; case EDITORDIRECTION_LEFT :dx=1;dy=0; break; case EDITORDIRECTION_DOWN :dx=0;dy=1; break; case EDITORDIRECTION_UP :dx=1;dy=1; break; } switch(variation) { case 0: tx=2;ty=7; break; case 1: tx=1;ty=15; break; case 2: tx=3;ty=15; break; } if(round)tx--; Drawer D(editor::sprites,tx*sz,ty*sz,sz,sz); D.SetColors(&options::BKColor[color],255); D.Draw(target,x,y); switch(variation) { case 0: tx=1+dx;ty=8+dy; break; case 1: tx=dx;ty=16+dy; break; case 2: tx=2+dx;ty=16+dy; break; } D.ChangeRect(tx*sz,ty*sz,sz,sz); D.SetColors(&options::BFColor[color],255); D.Draw(target,x,y); } void drawHazard( SDL_Surface * target, int x, int y, int variation) { Uint8 tx,ty; if(variation==0) { Drawer Black(editor::sprites,0,sz*4,sz,sz); Black.Draw(target,x,y); } switch(variation) { case 0: tx=0;ty=3; break; case 1: tx=0;ty=7; break; case 2: tx=4;ty=19; break; } Drawer D(editor::sprites,tx*sz,ty*sz,sz,sz); D.Draw(target,x,y); } void drawTeleport( SDL_Surface * target, int x, int y, int direction) { Uint8 tx,ty; switch(direction) { case EDITORDIRECTION_RIGHT: tx=4; break; case EDITORDIRECTION_DOWN: tx=5; break; case EDITORDIRECTION_LEFT: tx=6; break; default: /*up*/ tx=7; } ty=2; Drawer D(editor::sprites,tx*sz,ty*sz,sz,sz); D.Draw(target,x,y); } void drawBot( SDL_Surface * target, int x, int y) { Drawer D(editor::sprites,3*sz,1*sz,sz,sz); D.Draw(target,x,y); } void drawHint( SDL_Surface * target, int x, int y, bool trans) { Drawer D(editor::sprites,6*sz,3*sz,sz,sz); if (trans) { D.SetColors(255,255,255, 128); } D.Draw(target,x,y); } void drawFirePad( SDL_Surface * target, int x, int y) { Drawer D(editor::sprites,2*sz,5*sz,sz,sz); D.Draw(target,x,y); } void drawError( SDL_Surface * target, int x, int y) { Uint32 col; if (editor::tic4%2==0) { col =SDL_MapRGB(target->format,255,0,0); } else { col =SDL_MapRGB(target->format,255,255,255); } SDL_FillRect(target, x,y, sz,sz, col ); } void drawFood( SDL_Surface * target, int x, int y) { Drawer D(editor::sprites,11*sz,13*sz,sz,sz); D.Draw(target,x,y); } void drawWildCard( SDL_Surface * target, int x, int y, bool round) { Uint8 tx; if(round)tx=2; else tx=1; Drawer D(editor::sprites,tx*sz,2*sz,sz,sz); D.Draw(target,x,y); } Uint32 getHiddenWayFlagsByVariationAndDir(int variation, int direction) { Uint32 flags = 0; variation -= 2; if (variation == 0) { flags = 15; // 1111 } else if (variation == 1) { flags = 14; // 0111 - 1011 - 1101 - 1110 } else if (variation == 2) { flags = 12; // 0011 - 0110 - 1100 - 1001 } else if (variation == 3) { flags = 10; // 0101 - 1010 } else if (variation == 4) { flags = 8; // 0001 - 0010 - 0100 - 1000 } else if (variation == 5) { flags = 0; // 0000 } switch(direction) { case EDITORDIRECTION_DOWN: //bit 0 to 2 flags = ( ((flags<<2)&/*0b1111*/15) | (flags>>2) ); break; case EDITORDIRECTION_UP: //bit 0 to 0 break; case EDITORDIRECTION_LEFT: //bit 0 to 3 flags = ( ((flags<<3)&/*0b1111*/15) | (flags>>1) ); break; case EDITORDIRECTION_RIGHT: //bit 0 to 1 flags = ( ((flags<<1)&/*0b1111*/15) | (flags>>3) ); break; } Uint32 up = flags&1; Uint32 right = (flags>>1)&1; Uint32 down = (flags>>2)&1; Uint32 left = (flags>>3)&1; flags = (up<<8)|(right<<6)|(down<<2)|(left<<4); return flags; } void drawOneDir( SDL_Surface * target, int x, int y, int direction, int variation) { Uint8 tx,ty; if (variation >= 2) { Uint32 flags = getHiddenWayFlagsByVariationAndDir( variation, direction ); Uint32 up = (flags>>8)&1; Uint32 right = (flags>>6)&1; Uint32 down = (flags>>2)&1; Uint32 left = (flags>>4)&1; tx = 6; ty = 10; Drawer D(editor::sprites,tx*sz,ty*sz,sz,sz); DefaultColorData & cd = editor::board->colors[EDITOR_COLOR_DOORS]; if (! cd.useDefault ) { D.SetColors( &cd.color, 255); } else { D.SetColors( &options::OneWayDoorColor, 255); } D.Draw(target,x,y); Sint16 k = sz/8; Uint32 black = SDL_MapRGB(target->format, 0,0,0 ); Uint32 white = SDL_MapRGB(target->format, 255,255,255 ); if (!up) { SDL_FillRect(target, x+k-1,y+k-1,sz-2*k+2,k+2, white ); SDL_FillRect(target, x+k,y+k,sz-2*k,k, black ); } if (!down) { SDL_FillRect(target, x+k-1,y+sz-2*k-1,sz-2*k+2,k+2, white ); SDL_FillRect(target, x+k,y+sz-2*k,sz-2*k,k, black ); } if (!left) { SDL_FillRect(target, x+k-1, y+k-1, k+2,sz-2*k+2, white ); SDL_FillRect(target, x+k,y+k,k,sz-2*k, black ); } if (!right) { SDL_FillRect(target, x+sz-2*k-1,y+k-1, k+2,sz-2*k+2, white ); SDL_FillRect(target, x+sz-2*k,y+k,k,sz-2*k, black ); } } else if(variation) { //ground arrow switch(direction) { case EDITORDIRECTION_DOWN: tx=9; ty=11; break; case EDITORDIRECTION_UP: tx=10; ty=11; break; case EDITORDIRECTION_RIGHT: tx=9; ty=10; break; default: tx=10; ty=10; break; } Drawer D(editor::sprites,tx*sz,ty*sz,sz,sz); DefaultColorData & cd = editor::board->colors[EDITOR_COLOR_FORCE]; if (! cd.useDefault ) { D.SetColors( &cd.color, 255); } else { D.SetColors( &options::ForceArrowColor, 255); } D.Draw(target,x,y); } else { ty=10; if( (direction==EDITORDIRECTION_DOWN) || (direction==EDITORDIRECTION_UP) ) tx=7; else tx=8; Drawer D(editor::sprites,tx*sz,ty*sz,sz,sz); DefaultColorData & cd = editor::board->colors[EDITOR_COLOR_DOORS]; if (! cd.useDefault ) { D.SetColors( &cd.color, 255); } else { D.SetColors( &options::OneWayDoorColor, 255); } D.Draw(target,x,y); switch(direction) { case EDITORDIRECTION_DOWN: tx=4; ty=10; break; case EDITORDIRECTION_UP: tx=5; ty=10; break; case EDITORDIRECTION_RIGHT: tx=4; ty=11; break; default: tx=5; ty=11; break; } D.ChangeRect(tx*sz,ty*sz,sz,sz); D.SetColors(0,0,0,120); D.Draw(target,x,y); } } void drawBeast( SDL_Surface * target, int x, int y, int direction, int variation, bool noDirectionAid=false) { Uint8 tx,ty; switch((btype)variation) { case(BT_TWISTER): tx=17; ty=0; break; case(BT_SPIKE): tx=19; ty=0; break; case(BT_VIRUS): tx=18; ty=0; break; case(BT_BLOB): tx=19; ty=6; break; case(BT_BLOBBOSS): tx=19; ty=12; break; case(BT_PATIENCE): tx=19; ty=9; break; case(BT_TIGER): tx=10; ty=14; break; case(BT_STATIC): tx=11; ty=15; break; case(BT_DARD): switch(direction) { case(EDITORDIRECTION_UP): tx=19; break; case(EDITORDIRECTION_LEFT): tx=18; break; case(EDITORDIRECTION_DOWN): tx=17; break; default: tx=16; } ty= 2; break; case(BT_WARD): switch(direction) { case(EDITORDIRECTION_UP): tx=19; break; case(EDITORDIRECTION_LEFT): tx=18; break; case(EDITORDIRECTION_DOWN): tx=17; break; default: tx=16; } ty= 4; break; case(BT_RANGER): switch(direction) { case(EDITORDIRECTION_UP): tx=15; break; case(EDITORDIRECTION_LEFT): tx=14; break; case(EDITORDIRECTION_DOWN): tx=13; break; default: tx=12; } ty= 18; break; case(BT_SPINNER):case(BT_ASPINNER): tx=11; if (variation==(int)BT_ASPINNER) ty=11; else ty=9; break; default: //gnasher tx=16; ty=0; } Drawer D(editor::sprites,tx*sz,ty*sz,sz,sz); if(( (variation==(int)(BT_SPINNER) ) || (variation==(int)(BT_ASPINNER) ) ) && (editor::tic4<2) && !noDirectionAid) { D.SetColors(255,255,255,128); D.Draw(target,x,y); switch(direction) { case(EDITORDIRECTION_RIGHT): tx=4; ty=11; break; case(EDITORDIRECTION_LEFT): tx=5; ty=11; break; case(EDITORDIRECTION_DOWN): tx=4; ty=12; break; default: tx=5; ty=12; } D.ChangeRect(tx*sz,ty*sz,sz,sz); D.SetColors(0,0,0,255); D.Draw(target,x,y); } else D.Draw(target,x,y); } void drawFactoryTop( SDL_Surface * target, int x, int y, int direction, bool dotrans) { Uint8 tx, ty=14; switch(direction) { case(EDITORDIRECTION_RIGHT): tx=6; break; case(EDITORDIRECTION_DOWN): tx=7; break; case(EDITORDIRECTION_LEFT): tx=8; break; default: tx=9; } Drawer D(editor::sprites,tx*sz,ty*sz,sz,sz); if( dotrans ) { Uint8 alpha = 255; if((editor::tic4<2) ) alpha = 120; D.SetColors(255,255,255,alpha); } D.Draw(target,x,y); tx = ((tx-6)+2)%4+6; ty ++; D.ChangeRect(tx*sz,ty*sz,sz,sz); D.Draw(target,x,y); } void drawColorFactory( SDL_Surface * target, int x, int y, bool round, editorcolor color, int variation, int direction) { switch(variation) { case 0: drawBlock(target, x,y, round, color); break; case 1: drawSpecialBlocks(target,x,y,round, color, 0, direction); break; case 2: drawSpecialBlocks(target,x,y,round, color, 4, direction); break; case 3: drawPusher(target,x,y,color,direction); break; case 4: drawGem(target,x,y,color); } drawFactoryTop(target,x,y, direction, (editor::SelectedType() == EDOT_COLORFACTORY)||(editor::SelectedType() == EDOT_DANGERFACTORY) ); } void drawDangerFactory( SDL_Surface * target, int x, int y, int variation, int direction) { switch(variation) { case 14: drawRattlerHead(target,x,y,0,direction); break; case 15: drawFood(target,x,y); break; case 16: drawHazard(target,x,y,1); break; default : drawBeast(target,x,y,direction,variation, true); } drawFactoryTop(target,x,y, direction, (editor::SelectedType() == EDOT_COLORFACTORY)||(editor::SelectedType() == EDOT_DANGERFACTORY) ); } void drawObjectBySpecs( SDL_Surface * target, int x, int y, editorobjecttype ot, editorcolor color, bool round, int variation, int direction) { switch(ot) { case EDOT_XYE: drawXye(target,x,y,variation); break; case EDOT_RATTLERHEAD: drawRattlerHead(target,x,y,variation,direction); break; case EDOT_GEM: drawGem(target,x,y,color); break; case EDOT_WALL: drawWall(target,x,y,round,variation); break; case EDOT_BLOCK: drawBlock(target,x,y,round,color); break; case EDOT_HINT: drawHint(target,x,y, false); break; case EDOT_LARGEBLOCK: drawLargeBlock(target,x,y,color,variation, direction); break; case EDOT_PORTAL: drawPortal(target,x,y,color,variation); break; case EDOT_COLORFACTORY: drawColorFactory(target,x,y,round, color,variation, direction); break; case EDOT_DANGERFACTORY: drawDangerFactory(target,x,y,variation, direction); break; case EDOT_TURNER: drawTurner(target,x,y,round,color,variation); break; case EDOT_NUMBER: drawNumber(target,x,y,color,round,variation); break; case EDOT_SPECIALBLOCKS: drawSpecialBlocks(target,x,y,round,color,variation,direction); break; case EDOT_EARTH: drawEarth(target,x,y,round); break; case EDOT_GEMBLOCK: drawGemBlock(target,x,y,color); break; case EDOT_MAGNET: drawMagnet(target,x,y,variation,direction); break; case EDOT_PUSHER: drawPusher(target,x,y,color,direction); break; case EDOT_ARROWMAKER: drawArrowMaker(target,x,y,round,color,direction,variation); break; case EDOT_HAZARD: drawHazard(target,x,y,variation); break; case EDOT_ONEDIRECTION: drawOneDir(target,x,y,direction,variation); break; case EDOT_BEAST: drawBeast(target,x,y,direction,variation); break; case EDOT_TELEPORT: drawTeleport(target,x,y,direction); break; case EDOT_BOT: drawBot(target,x,y); break; case EDOT_FOOD: drawFood(target,x,y); break; case EDOT_FIREPAD: drawFirePad(target,x,y); break; case EDOT_ERROR: drawError(target,x,y); break; case EDOT_COLORSYSTEM: drawColorSystem(target,x,y,color,variation); break; case EDOT_KEYSYSTEM: drawKeySystem(target,x,y,color,variation); break; } } xye-0.12.2+dfsg/src/xyedit.h000066400000000000000000000256611225403634500156040ustar00rootroot00000000000000/* Xye License (it is a PNG/ZLIB license) Copyright (c) 2006 Victor Hugo Soliz Kuncar This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. 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 appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. */ #include "vxsdl.h" #ifndef FONTINCLUDED #include "font.h" #endif #include #ifndef WINDOWINCLUDED #include "window.h" #endif #include "dialogs.h" const int XYEDIT_OBJECT_COLORS = 5; using namespace std; string stripXML(const string h); class button; struct editorbuttons; struct editorboard; #define MAXCONTROLS 100 enum contenttype { CONTENT_NOCONTENT, CONTENT_VARIATION, CONTENT_MAKEROUND, CONTENT_RECOLOR, CONTENT_DIRECTION, CONTENT_CHANGEOBJECT }; enum editorobjecttype { EDOT_XYE, EDOT_WALL, EDOT_GEM, EDOT_BLOCK, EDOT_EARTH, EDOT_GEMBLOCK, EDOT_MAGNET, EDOT_PUSHER, EDOT_ARROWMAKER, EDOT_HAZARD, EDOT_ONEDIRECTION, EDOT_BEAST, EDOT_TELEPORT, EDOT_TURNER, EDOT_COLORSYSTEM, EDOT_KEYSYSTEM, EDOT_BOT, EDOT_NUMBER, EDOT_SPECIALBLOCKS, EDOT_FIREPAD, EDOT_RATTLERHEAD, EDOT_FOOD, EDOT_LARGEBLOCK, EDOT_PORTAL, EDOT_COLORFACTORY, EDOT_DANGERFACTORY, EDOT_HINT, EDOT_ERROR, EDOT_NONE }; enum editorcolor { EDCO_RED=1, EDCO_GREEN=3, EDCO_BLUE=2, EDCO_YELLOW=0, EDCO_PURPLE=4, EDCO_WHITE=5, EDCO_METAL = 6, EDCO_WILD = 7 }; struct TiXmlElement; struct boardelement; class editor { private: static button * savebutton; static button * solutionbutton; static bool ExitPrompt; static string loadError; static void loop(); static void onExitAttempt(); static void onQuitClick(const buttondata* data); static void beforeDraw(); static void onKeyDown(SDLKey keysim,Uint16 unicode); static void onKeyUp(SDLKey keysim,Uint16 unicode); static void cancel(); static void cancel(const buttondata* data) { cancel(); } static window* editorwindow; static void onExitWithoutSavingClick(bool yes); static void onBrowseWithoutSavingClick(bool yes); static enum setText_state_enum { ASSIGN_TITLE=0, ASSIGN_DESCRIPTION=1, ASSIGN_AUTHOR=2, ASSIGN_HINT=3, ASSIGN_BYE=4, ASSIGN_LEVEL_TITLE=5 } setText_state; static void continueSetText(bool okclicked, const string text, inputDialogData * dat); static void beginSetText(const buttondata* data); static void continueAppendFile(bool okclicked, const string text, inputDialogData * dat); static void beginAppendFile(const buttondata* data); static void continueChangeLevelNumber(bool okclicked, const string text, inputDialogData * dat); static void beginChangeLevelNumber(const buttondata*data); static void continueChangeLevelColor(bool okclicked, const string text, inputDialogData * dat); static void beginChangeLevelColor(const buttondata*data); static void onClearConfirmation(bool yes); static void onClearClick(const buttondata* data); static void onPreviousLevelClick(const buttondata* data); static void onNextLevelClick(const buttondata* data); static void onInsertLevelClick(const buttondata* data); static void onEraseLevelClick(const buttondata* data); static void onEraseLevelConfirmation(bool yes); static void saveAs(bool okclicked, const string text, inputDialogData * dat); static void updateCountRelated(); static bool appendLevels(const string filename); //implemented in editorload.cpp static bool load_kye(); //implemented in editorload.cpp static bool load_KyeFormat(TiXmlElement * el); //implemented in editorload.cpp static void continueAskHint(bool okclicked, const string text, inputDialogData * dat); public: static string filename; static string filename_name; static string filename_path; static editorobjecttype SelectedType(); static bool SavedFile; static void SetFile(const string &path, const string &file); static bool save(); //implemented in editorsave.cpp static bool save(const string &target, bool onlyOneLevel = false); static void buttonSave(const buttondata* data) { save(); } static void onSaveAsClick(const buttondata* data); static void onBrowseClick(const buttondata* data); static bool load(); //implemented in editorload.cpp static void SendSolution(const char* sol); static void test(bool solution); static void test(); static void playSolution(const buttondata* data=NULL); static void test(const buttondata* data) { test(); } static Font* FontRes; static LuminositySprites sprites; static int Width; static int Height; static int GRIDSIZE; static void Error(const char* msg); static editorbuttons* buttons; static editorboard * board; static unsigned int tic4; static unsigned int subtic4; static void StartSection(window* wind) ; static void ResumeSection(window* wind) ; static void ResumeSectionAndQuit(window* wind) ; static void askHint(boardelement* o); }; struct singleobject { contenttype content; int variation; int direction; editorobjecttype type; bool selected; bool flash; bool round; editorcolor color; }; struct boardobject { bool empty; int variation; editorobjecttype type; editorcolor color; string hint; }; #define EDITORDIRECTION_RIGHT 0 #define EDITORDIRECTION_UP 1 #define EDITORDIRECTION_LEFT 2 #define EDITORDIRECTION_DOWN 3 void drawObjectBySpecs( SDL_Surface * target, int x, int y, editorobjecttype ot, editorcolor color, bool round, int variation, int direction); #define EDITORBUTTONS_COUNTX 26 #define EDITORBUTTONS_COUNTY 3 class editorbuttons: public control { private: int lastclickedx,lastclickedy; singleobject buttons[EDITORBUTTONS_COUNTX][EDITORBUTTONS_COUNTY]; singleobject * getbuttonbyxy(int x, int y); int detectRotation(int x0, int y0, int x1, int y1); void extendButtons(editorobjecttype ot, editorcolor color, bool round, int variation); void switchToObject( editorobjecttype ot, editorcolor color, bool round, int variation, int direction); void updateText( editorobjecttype ot, editorcolor color, bool round, int variation, int direction); void handleClick(singleobject* target); string text; bool saved; public: bool clicked; bool mouse; int mousex,mousey; singleobject * hover; singleobject * clickedempty; singleobject * selection; singleobject * clickedobject; bool Eraser; editorobjecttype SelectedObjectType; editorcolor SelectedColor; int SelectedVariation; int SelectedDirection; bool SelectedRound; editorbuttons(int sx, int sy, int sw, int sh); void draw(SDL_Surface* target); void loop() {} void onMouseMove(int px,int py); void onMouseOut(); void onMouseDown(int px,int py); void onMouseUp(int px,int py); inline void onMouseRightUp(int px,int py) {} void drawbutton(SDL_Surface* target,singleobject &o, int x, int y); void setInfo(const string& msg); static editorbuttons copy; void SaveCopy(); void LoadCopy(); }; struct boardelement { editorobjecttype type; editorcolor color; int variation; bool round; int direction; Uint8 r1mem,r3mem,r7mem,r9mem; int parentx; int parenty; string hint; boardelement() { parentx=parenty = -1; type=EDOT_NONE; }; }; #ifndef XYE_HORZ #define XYE_HORZ 30 #define XYE_VERT 20 #endif struct DefaultColorData { bool useDefault; SDL_Color color; }; const int TOTAL_EDITOR_COLOR_OPTIONS = 5; const int EDITOR_COLOR_WALLS = 0; const int EDITOR_COLOR_FLOOR = 1; const int EDITOR_COLOR_EARTH = 2; const int EDITOR_COLOR_DOORS = 3; const int EDITOR_COLOR_FORCE = 4; class editorboard: public control { private: void applyFromButtons(int x, int y); void drawWallInBoard(SDL_Surface*target,int ox,int oy, int x,int y, int variation, bool round); void drawTeleportInBoard(SDL_Surface*target,int ox,int oy, int x, int y, int direction); void drawLargeBlockInBoard(SDL_Surface * target, int ox,int oy, int x, int y, editorcolor color, int variation, int direction); void enforceUniquePortals(int x, int y, int variation, editorcolor color); void assign(editorboard* other); static vector levelList; static int currentLevel; bool findWall(int x, int y, int variation); bool wallContainsRoundCorners(int x, int y); public: DefaultColorData colors[TOTAL_EDITOR_COLOR_OPTIONS]; bool clicked; bool mouse; int mousex,mousey; boardelement objects[XYE_HORZ ][XYE_VERT]; int xye_x; int xye_y; int portal_x[XYEDIT_OBJECT_COLORS+1][2]; int portal_y[XYEDIT_OBJECT_COLORS+1][2]; string title; string hint; static string filetitle; static string description; static string author; string bye; string solution; editorboard(int sx, int sy); editorboard(); void updateWallMem(int ox, int oy); void draw(SDL_Surface* target); void loop() {} void onMouseMove(int px,int py); void onMouseOut(); void onMouseDown(int px,int py); void onMouseUp(int px,int py); void onMouseRightUp(int px,int py); void makeDefaultLevel(); static void SaveCopy(editorboard* ed); static void SetCopySolution(const char* sol); static void LoadCopy(editorboard* ed); static int CountLevels(); static int CurrentLevelNumber(); static void SaveAtLevelNumber(editorboard* ed, int num); static void ResetLevels(bool empty = false); static void LoadLevelNumber(editorboard* ed, int num); static void DeleteLevel(editorboard * ed); static void CreateLevel(editorboard * ed); static void MoveToLevelNumber(editorboard* ed, int x); }; Uint8 getLargeBlockFlagsByVarDir( int variation, int direction); Uint32 getHiddenWayFlagsByVariationAndDir(int variation, int direction); xye-0.12.2+dfsg/xye.desktop000066400000000000000000000004651225403634500155310ustar00rootroot00000000000000#!/usr/bin/env xdg-open [Desktop Entry] Encoding=UTF-8 Exec=xye Type=Application Categories=Application;Game;PuzzleGame Name=Xye GenericName=Xye Comment=Solve puzzles and action challenges in order to get all the gems in the room. Terminal=false StartupNotify=false Icon=xye.png MimeType=application/xye-xml