pax_global_header00006660000000000000000000000064134161505260014515gustar00rootroot0000000000000052 comment=ad2f908195a0cd558542028d2dcb7561cb149ad8 fifengine-0.4.2/000077500000000000000000000000001341615052600134525ustar00rootroot00000000000000fifengine-0.4.2/.astylerc000066400000000000000000000022331341615052600153010ustar00rootroot00000000000000#-------------------------------------------------- # AStyle Configuration # # Docs: http://astyle.sourceforge.net/astyle.html #-------------------------------------------------- # use Kernighan & Ritchie style style=kr indent=spaces=4 #-------------------------------------------------- # Bracket Options #-------------------------------------------------- #-------------------------------------------------- # Indentation Options #-------------------------------------------------- indent-namespaces indent-switches indent-preproc-block #-------------------------------------------------- # Padding Options #-------------------------------------------------- #-------------------------------------------------- # Formatting options #-------------------------------------------------- align-pointer=type align-reference=type # convert tabs into spaces convert-tabs # break line, if the code exceed 120 columns. max-code-length=120 break-after-logical mode=c lineend=linux #-------------------------------------------------- # Processing #-------------------------------------------------- # travel through dirs recursive # show only formatted files formattedfifengine-0.4.2/.editorconfig000066400000000000000000000012551341615052600161320ustar00rootroot00000000000000; ; Global Editor Config for Fifengine ; ; See http://editorconfig.org/ for more information on this file. ;------------------------------------------------------------------------------ ; Top level editor config. root = true ; use Unix style new lines with new line ending and trim whitespace [*] charset = utf-8 indent_style = space trim_trailing_whitespace = true insert_final_newline = true end_of_line = lf [*.{cpp,h}] indent_size = 4 max_line_length = 80 ; Python: PEP8 defines 4 spaces for indentation [*.py] indent_size = 4 [*.{cmake,json,sh,yaml,yml},CMakeLists.txt] indent_size = 2 ; do not remove spaces in docs [*.{md, asciidoc, asc}] trim_trailing_whitespace = falsefifengine-0.4.2/.gitattributes000066400000000000000000000010001341615052600163340ustar00rootroot00000000000000# Set default behaviour * text=auto # Explicitly declare text file we always want to be normalized *.c text *.cpp text *.h text *.i text *.hpp text *.xml text *.py text *.yml text *.md text # Declare files that will always have CRLF endings *.sln text eol=crlf *.bat text eol=crlf *.iss text eol=crlf *.user text eol=crlf *.vcproj text eol=crlf *.sln text eol=crlf # Denote all files that are truly binary *.png binary *.gif binary *.pdf binary *.ai binary *.svg binary *.rtf binary *.dll binary *.exe binary fifengine-0.4.2/.gitignore000066400000000000000000000034221341615052600154430ustar00rootroot00000000000000# Install dir for external libs ext/install # Swig wrappers engine/python/fife/fife.py engine/python/fife/fifechan.py engine/swigwrappers/python/fife.i engine/swigwrappers/python/fife_wrap.cc engine/swigwrappers/python/fife_wrap.h engine/swigwrappers/python/fifechan.i engine/swigwrappers/python/fifechan_wrap.cc engine/swigwrappers/python/fifechan_wrap.h # Project files build/linux/KDevelop/FIFE.kdevses build/linux/code_blocks/fife_engine.cbp build/win32/build_environments/code_blocks/fife_engine.cbp build/win32/build_environments/code_blocks/.objs build/win32/build_environments/code_blocks/fife_engine.layout build/win32/build_environments/scons/engine_build_log.txt build/win32/build_environments/visual_studio_8/fife.vcproj build/win32/build_environments/visual_studio_9/fife.vcproj #CMAKE stuff build/win32/CMakeCache.txt build/win32/CMakeFiles build/win32/version.h # Ignore the dev kit build/win32/applications build/win32/binaries build/win32/includes build/win32/static_libs # Demos demos/rio_de_hola/maps/savefile.xml demos/shooter/gui/highscores.xml demos/rpg/saves/*.xml settings.xml # All log files *.log # Docs doc/doxygen/html build/win32/doxygen_log.txt doc/dependencies/*.dot~ doc/dependencies/*.dot doc/dependencies/*.ps doc/dependencies/*.png # scons *.sconsign .sconsign.tmp .sconsign.dblite build/.sconf_temp build/config.log build/bdist.win32 build/engine build/lib # Python *.py[cod] dist # Compiled Object files *.slo *.lo *.o # Compiled Dynamic libraries *.dll *.so *.dylib # Compiled Static libraries *.lib *.lai *.la *.a # Executables OpenALwEAX.exe # Automake and Autoconf Makefile.in autom4te.cache aclocal.m4 compile configure depcomp install-sh missing # OS generated files .DS_Store .DS_Store? ._* .Spotlight-V100 .Trashes Icon? ehthumbs.db Thumbs.db .*.swp fifengine-0.4.2/.pylintrc000066400000000000000000000301531341615052600153210ustar00rootroot00000000000000[MASTER] # Specify a configuration file. #rcfile= # Python code to execute, usually for sys.path manipulation such as # pygtk.require(). #init-hook= # Add files or directories to the blacklist. They should be base names, not # paths. ignore=CVS # Pickle collected data for later comparisons. persistent=yes # List of plugins (as comma separated values of python modules names) to load, # usually to register additional checkers. load-plugins= # Use multiple processes to speed up Pylint. jobs=1 # Allow loading of arbitrary C extensions. Extensions are imported into the # active Python interpreter and may run arbitrary code. unsafe-load-any-extension=no # A comma-separated list of package or module names from where C extensions may # be loaded. Extensions are loading into the active Python interpreter and may # run arbitrary code extension-pkg-whitelist= # Allow optimization of some AST trees. This will activate a peephole AST # optimizer, which will apply various small optimizations. For instance, it can # be used to obtain the result of joining multiple strings with the addition # operator. Joining a lot of strings can lead to a maximum recursion error in # Pylint and this flag can prevent that. It has one side effect, the resulting # AST will be different than the one from reality. optimize-ast=no [MESSAGES CONTROL] # Only show warnings with the listed confidence levels. Leave empty to show # all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED confidence= # Enable the message, report, category or checker with the given id(s). You can # either give multiple identifier separated by comma (,) or put this option # multiple time. See also the "--disable" option for examples. #enable= # Disable the message, report, category or checker with the given id(s). You # can either give multiple identifiers separated by comma (,) or put this # option multiple times (only on the command line, not in the configuration # file where it should appear only once).You can also use "--disable=all" to # disable everything first and then reenable specific checks. For example, if # you want to run only the similarities checker, you can use "--disable=all # --enable=similarities". If you want to run only the classes checker, but have # no Warning level messages displayed, use"--disable=all --enable=classes # --disable=W" disable=import-star-module-level,old-octal-literal,oct-method,unpacking-in-except,parameter-unpacking,backtick,old-raise-syntax,old-ne-operator,long-suffix,dict-view-method,dict-iter-method,metaclass-assignment,next-method-called,raising-string,indexing-exception,raw_input-builtin,long-builtin,file-builtin,execfile-builtin,coerce-builtin,cmp-builtin,buffer-builtin,basestring-builtin,apply-builtin,filter-builtin-not-iterating,using-cmp-argument,useless-suppression,range-builtin-not-iterating,suppressed-message,no-absolute-import,old-division,cmp-method,reload-builtin,zip-builtin-not-iterating,intern-builtin,unichr-builtin,reduce-builtin,standarderror-builtin,unicode-builtin,xrange-builtin,coerce-method,delslice-method,getslice-method,setslice-method,input-builtin,round-builtin,hex-method,nonzero-method,map-builtin-not-iterating [REPORTS] # Set the output format. Available formats are text, parseable, colorized, msvs # (visual studio) and html. You can also give a reporter class, eg # mypackage.mymodule.MyReporterClass. output-format=text # Put messages in a separate file for each module / package specified on the # command line instead of printing them on stdout. Reports (if any) will be # written in a file name "pylint_global.[txt|html]". files-output=no # Tells whether to display a full report or only the messages reports=yes # Python expression which should return a note less than 10 (10 is the highest # note). You have access to the variables errors warning, statement which # respectively contain the number of errors / warnings messages and the total # number of statements analyzed. This is used by the global evaluation report # (RP0004). evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) # Template used to display messages. This is a python new-style format string # used to format the message information. See doc for all details #msg-template= [SIMILARITIES] # Minimum lines number of a similarity. min-similarity-lines=4 # Ignore comments when computing similarities. ignore-comments=yes # Ignore docstrings when computing similarities. ignore-docstrings=yes # Ignore imports when computing similarities. ignore-imports=no [BASIC] # List of builtins function names that should not be used, separated by a comma bad-functions=map,filter,input # Good variable names which should always be accepted, separated by a comma good-names=i,j,k,ex,Run,_ # Bad variable names which should always be refused, separated by a comma bad-names=foo,bar,baz,toto,tutu,tata # Colon-delimited sets of names that determine each other's naming style when # the name regexes allow several styles. name-group= # Include a hint for the correct naming format with invalid-name include-naming-hint=no # Regular expression matching correct function names function-rgx=[a-z_][a-z0-9_]{2,30}$ # Naming hint for function names function-name-hint=[a-z_][a-z0-9_]{2,30}$ # Regular expression matching correct variable names variable-rgx=[a-z_][a-z0-9_]{2,30}$ # Naming hint for variable names variable-name-hint=[a-z_][a-z0-9_]{2,30}$ # Regular expression matching correct constant names const-rgx=(([A-Z_][A-Z0-9_]*)|(__.*__))$ # Naming hint for constant names const-name-hint=(([A-Z_][A-Z0-9_]*)|(__.*__))$ # Regular expression matching correct attribute names attr-rgx=[a-z_][a-z0-9_]{2,30}$ # Naming hint for attribute names attr-name-hint=[a-z_][a-z0-9_]{2,30}$ # Regular expression matching correct argument names argument-rgx=[a-z_][a-z0-9_]{2,30}$ # Naming hint for argument names argument-name-hint=[a-z_][a-z0-9_]{2,30}$ # Regular expression matching correct class attribute names class-attribute-rgx=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$ # Naming hint for class attribute names class-attribute-name-hint=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$ # Regular expression matching correct inline iteration names inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$ # Naming hint for inline iteration names inlinevar-name-hint=[A-Za-z_][A-Za-z0-9_]*$ # Regular expression matching correct class names class-rgx=[A-Z_][a-zA-Z0-9]+$ # Naming hint for class names class-name-hint=[A-Z_][a-zA-Z0-9]+$ # Regular expression matching correct module names module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ # Naming hint for module names module-name-hint=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ # Regular expression matching correct method names method-rgx=[a-z_][a-z0-9_]{2,30}$ # Naming hint for method names method-name-hint=[a-z_][a-z0-9_]{2,30}$ # Regular expression which should only match function or class names that do # not require a docstring. no-docstring-rgx=^_ # Minimum line length for functions/classes that require docstrings, shorter # ones are exempt. docstring-min-length=-1 [ELIF] # Maximum number of nested blocks for function / method body max-nested-blocks=5 [FORMAT] # Maximum number of characters on a single line. max-line-length=90 # Regexp for a line that is allowed to be longer than the limit. ignore-long-lines=^\s*(# )??$ # Allow the body of an if to be on the same line as the test if there is no # else. single-line-if-stmt=no # List of optional constructs for which whitespace checking is disabled. `dict- # separator` is used to allow tabulation in dicts, etc.: {1 : 1,\n222: 2}. # `trailing-comma` allows a space between comma and closing bracket: (a, ). # `empty-line` allows space-only lines. no-space-check=trailing-comma,dict-separator # Maximum number of lines in a module max-module-lines=1000 # String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 # tab). indent-string=\t # Number of spaces of indent required inside a hanging or continued line. indent-after-paren=4 # Expected format of line ending, e.g. empty (any line ending), LF or CRLF. expected-line-ending-format= [VARIABLES] # Tells whether we should check for unused import in __init__ files. init-import=no # A regular expression matching the name of dummy variables (i.e. expectedly # not used). dummy-variables-rgx=_$|dummy # List of additional names supposed to be defined in builtins. Remember that # you should avoid to define new builtins when possible. additional-builtins=_,__,N_,S_,SN_ # List of strings which can identify a callback function by name. A callback # name must start or end with one of those strings. callbacks=cb_,_cb [SPELLING] # Spelling dictionary name. Available dictionaries: none. To make it working # install python-enchant package. spelling-dict= # List of comma separated words that should not be checked. spelling-ignore-words= # A path to a file that contains private dictionary; one word per line. spelling-private-dict-file= # Tells whether to store unknown words to indicated private dictionary in # --spelling-private-dict-file option instead of raising a message. spelling-store-unknown-words=no [LOGGING] # Logging modules to check that the string format arguments are in logging # function parameter format logging-modules=logging [TYPECHECK] # Tells whether missing members accessed in mixin class should be ignored. A # mixin class is detected if its name ends with "mixin" (case insensitive). ignore-mixin-members=yes # List of module names for which member attributes should not be checked # (useful for modules/projects where namespaces are manipulated during runtime # and thus existing member attributes cannot be deduced by static analysis. It # supports qualified module names, as well as Unix pattern matching. ignored-modules= # List of classes names for which member attributes should not be checked # (useful for classes with attributes dynamically set). This supports can work # with qualified names. ignored-classes= # List of members which are set dynamically and missed by pylint inference # system, and so shouldn't trigger E1101 when accessed. Python regular # expressions are accepted. generated-members= [MISCELLANEOUS] # List of note tags to take in consideration, separated by a comma. notes=FIXME,XXX,TODO [DESIGN] # Maximum number of arguments for function / method max-args=5 # Argument names that match this expression will be ignored. Default to name # with leading underscore ignored-argument-names=_.* # Maximum number of locals for function / method body max-locals=15 # Maximum number of return / yield for function / method body max-returns=6 # Maximum number of branch for function / method body max-branches=12 # Maximum number of statements in function / method body max-statements=50 # Maximum number of parents for a class (see R0901). max-parents=7 # Maximum number of attributes for a class (see R0902). max-attributes=7 # Minimum number of public methods for a class (see R0903). min-public-methods=2 # Maximum number of public methods for a class (see R0904). max-public-methods=20 # Maximum number of boolean expressions in a if statement max-bool-expr=5 [IMPORTS] # Deprecated modules which should not be used, separated by a comma deprecated-modules=regsub,TERMIOS,Bastion,rexec # Create a graph of every (i.e. internal and external) dependencies in the # given file (report RP0402 must not be disabled) import-graph= # Create a graph of external dependencies in the given file (report RP0402 must # not be disabled) ext-import-graph= # Create a graph of internal dependencies in the given file (report RP0402 must # not be disabled) int-import-graph= [CLASSES] # List of method names used to declare (i.e. assign) instance attributes. defining-attr-methods=__init__,__new__,setUp # List of valid names for the first argument in a class method. valid-classmethod-first-arg=cls # List of valid names for the first argument in a metaclass class method. valid-metaclass-classmethod-first-arg=mcs # List of member names, which should be excluded from the protected access # warning. exclude-protected=_asdict,_fields,_replace,_source,_make [EXCEPTIONS] # Exceptions that will emit a warning when being caught. Defaults to # "Exception" overgeneral-exceptions=Exceptionfifengine-0.4.2/.travis.yml000066400000000000000000000077161341615052600155760ustar00rootroot00000000000000language: cpp sudo: required matrix: include: - os: linux dist: xenial compiler: clang python: "3.6" - os: linux dist: xenial compiler: gcc python: "3.5" - os: osx #compiler: clang git: depth: 5 addons: apt: sources: # add PPAs with more up-to-date toolchains - ubuntu-toolchain-r-test - llvm-toolchain-xenial-7 packages: - gcc-8 - g++-8 #- clang-7.0 #- llvm-7.0-dev #- libclang-7.0-dev - mesa-common-dev - libsdl2-dev - libsdl2-image-dev - libsdl2-ttf-dev - libfreetype6-dev - libopenal-dev - libvorbis-dev - zlib1g-dev - libboost-dev - libboost-system-dev - libboost-filesystem-dev - libboost-test-dev - libtinyxml-dev - libc6 - libglew-dev - pylint before_install: # Linux Build # change gcc to version 8 - if [ $TRAVIS_OS_NAME == linux ]; then sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 20; sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-8 20; fi - if [ $TRAVIS_OS_NAME == linux ]; then sudo update-alternatives --config gcc; sudo update-alternatives --config g++; fi # change clang to version 7.0 #- if [ $TRAVIS_OS_NAME == linux ]; then sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-6.0 20; sudo update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-6.0 20; fi #- if [ $TRAVIS_OS_NAME == linux ]; then sudo rm -f /usr/local/clang-5.0.0/bin/clang; sudo rm -f /usr/local/clang-5.0.0/bin/clang++; sudo update-alternatives --config clang; sudo update-alternatives --config clang++; fi #- if [ $TRAVIS_OS_NAME == linux ]; then sudo apt-get -qq update && sudo apt-get install -y libgle3-dev libvorbis-dev libalut-dev cppcheck; fi # install newer version of pylint, the one fetched with apt-get is broken #- if [ $TRAVIS_OS_NAME == linux ]; then sudo pip install pylint; fi # Swig - if [ $TRAVIS_OS_NAME == linux ]; then sudo add-apt-repository ppa:timsc/swig-3.0.12 -y; sudo apt-get update -q; sudo apt-get install swig; fi # MacOS Build - if [ $TRAVIS_OS_NAME == osx ]; then HOMEBREW_NO_AUTO_UPDATE=1 brew install boost swig sdl2 sdl2_image sdl2_ttf freetype openal-soft tinyxml glew libvorbis python3 python || brew upgrade boost swig sdl2 sdl2_image sdl2_ttf freetype openal-soft tinyxml glew libvorbis python3 python || brew outdated boost swig sdl2 sdl2_image sdl2_ttf freetype openal-soft tinyxml glew libvorbis python3 python; fi - cmake --version install: - git clone --quiet --depth 1 git://github.com/fifengine/fifechan.git - if [ $TRAVIS_OS_NAME == linux ]; then mkdir build_fifechan; cd build_fifechan; cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr ../fifechan; fi - if [ $TRAVIS_OS_NAME == osx ]; then mkdir build_fifechan; cd build_fifechan; cmake ../fifechan; fi - make -j3 - sudo make install - cd .. script: - cd .. - if [ $TRAVIS_OS_NAME == linux ]; then mkdir build; cd build; cmake -DPYTHON_EXECUTABLE=/usr/bin/python3 -DCMAKE_INSTALL_PREFIX:PATH=/usr -Dcegui=OFF ../fifengine; fi - if [ $TRAVIS_OS_NAME == osx ]; then mkdir build; cd build; cmake -Dbuild-library=ON -DPYTHON_EXECUTABLE=/usr/local/bin/python3 -Dcegui=OFF ../fifengine; fi - ls -alh . - make -j3 - sudo make install after_script: - cd $TRAVIS_BUILD_DIR - python3 -c 'from fife import fife; print(fife.getVersion())' - if [ $TRAVIS_OS_NAME == linux ]; then cppcheck --verbose --enable=all --std=posix --std=c++11 --quiet -iengine/core/ext engine/core; fi - if [ $TRAVIS_OS_NAME == linux ]; then pylint --rcfile=.pylintrc ./engine/python/fife/; fi notifications: irc: irc.freenode.org#fife email: false #deploy: # provider: releases # api_key: # secure: "TiE1MLzq8DE2vJjiTeWnuhjEM/cH4hQ7yL/SSDkIqTijCY1eiCX6KPE7yDNh9F1SkCfxYyDPTuRc+f1EaAbk073aL56kUTM/bV/4TEcHk4TS40Hcd5aA10gR3XOH3lYwagT2edgXgXLA1cvU1tuwj8stKz1hEnkVlCvFdbvy4qg=" # file: Fifengine*.tar.gz # file_glob: true # skip_cleanup: true # overwrite: true # on: # tags: true fifengine-0.4.2/AUTHORS000066400000000000000000000034531341615052600145270ustar00rootroot00000000000000anchorite aldart anxs ashen cheesesucker chewie chris ChrisOelmueller donbachi hahasound helios2000 icelus ifoobar ismarc jakoch jasoka joe_hegarty joshdan jwt kaelisebonrai kozmo labrat lynxis m64 mortiz_ MuteX mvbarracuda neurogeek nihathrael Niektory nikn novade ottar phiker phoku plcstpierre prock rogerwilco shadowdancer shales sja skybound sleek spq stro stubb tesseract thebastion trapdoor undeadinsanity vdaras < vasileiosdaras@gmail.com> vja virus vovansim vtchill wulax yonibear zahlman zbyte64 fifengine-0.4.2/CHANGELOG.md000066400000000000000000001505031341615052600152670ustar00rootroot00000000000000# ChangeLog ## [0.4.2] - 2019-01-11 ### Engine * Remove Fog of War * Python 3.x support * Joystick and gamepad support * Implement hardware image cursor * Add more functionality to FIFE::SoundManager and get rid of the SoundManager extension * Sound Effects (A Feature to apply a number of sound effects on emitters such as FadeIn/Out. Perhabs also with use of the openAL EFX-extension.) * remove boost:regexp - replace with std:regexp * Pychan widget events #705 * New fifechan widgets * New pychan attributes: ListAttr, ImageAttr * The most Pychan functions should be ported to Fifechan. ### Misc * replaced GLEE with GLEW * remove build options `rend-camzones`, `rend-grid`, `use-githash` * version infos incl. git hash are inserted into version.h from CMakeLists, PR #997 * Distinguish filtered mouse events * python bindings probably should not install cegui/librocket/etc. unconditionally * cameras must be attached to layers * Update outdated dependencies analyser & hook it into travis * Pychan should load it's font definitions from an XML file * Unchecked dependency for Xcursor * Copy pychan widgets/container at runtime (gui templates) * The Console should be optional when using fifechan ### Bug Fixes * MouseScroll Button Pressing can crash fife * MacOS ld: warning: -L path '/usr/local/lib/libfifechan.dylib' is not a directory * Window width settings are not fully respected when using two screens * Build error with CEGUI * Investigate possilbe problems with CellGrid * Render problems with SDL 2.0.5 * cegui widgets not cleared correctly with active map. * fife soundemitter lets UH hang * Soundemitter callback if soundclip was played * Box widgets should contain information about the on-screen positioning (not only relative to parent widget) * adjustSize() sometimes sets width to invalid values * Spacers don't expand to the dedicated maximum space * Some strings are cut short * Borders are not rendered on edges of widgets that touch their parent container's edge. * Pychan dropdown menus crash FIFE-based client on win32 ## [0.4.1] - 2017-02-07 ### Engine * Corrected wrong postion handling for events. * Added AnimationManager, issue #675 * Enhanced XML formats, issue #963 * Added events for mouse wheel left and right, issue #967 * Fixed Location::getLayerCoordinates() on hex grids, issue #970 * Removed special treatment of function keys, issue #976 * Fixed tinyxml issue, was not being able to overwrite existing file, issue #978 * Map more SDL keys to CEGUI keys, issue #980 ### Extensions * Load default settings if settings file has no FIFE module, issue #959 * Update exception handler in ApplicationBase, issue #969 * Remove Icon from manager on source load failure, issue #972 ### Misc * Ensure that FIFE exception message is printed in Python, issue #974 * Several build fixes and improvements ## [0.4.0] - 2017-01-16 * removed Psyco JIT support (by removing "UsePsyco" and the related code) * removed "scons" build system * rename "cegui-0" (v0.8+) to "cegui" * removed cegui compatibility layer for versions below v0.7.9 ### Engine * renamed overloaded createTrigger and removeTrigger methods, issue #947 + PR #950 * Got rid of various compiler warnings * Add getCellsInCircleSegment() to CellCache and getInstancesInCircle(), getInstancesInCircleSegment() to Layer * Add MultiPathfinderTest * Add new instance function, prepareForUpdate() * Local tinyxml files are now only added to the compile list if either local-tinyxml is defined for SCons or the system version of tinyxml is not found. [t:619] * Add animation & color overlays [t:201], fixes [t:762], [t:764] and [t:763] * Merge GSOC work done by vdaras. * Replaces Guichan dependency by Fifechan * Add support for librocket * Add support for cegui [t:726] * Fixed keyboard input of control characters for CEGUI by Niektory [t: 796] * Make use of Fifechan optional * Add overlay test ### Extensions * Added the gl/GLU.h header to the atlas creator [t:740] * Removing the soundmanagers dep on pychan [t:767] * Slightly modified frange() to be more robust and fixed the ceil() call, fixes [t:725] * Convince SWIG that Color.r (g, b, a) should be a python property [t:799] * Inherit fife.Exception from python's (Base)Exception [t:788] * Import cleanup in pychan.widgets [t:787] * Fix password- and textfield not accepting initial data * Remove cell_pathfinding compatibility layer [t:775] * Fix typo in fife_settings ### Misc * Renamed all --with/--without scons options, fixes [t:797] * Add travis configuration by jakoch [t:784] * Modifying the versioning scheme [t:783] * Darwin config now expects everything to be installed from source ## [0.3.5] - 2013-08-21 ### Engine * Fixed another LayerCache bug. * Fixed blocking bug, which has affected multi cell objects. * Fixed segmentation fault within pathfinder. * Fixed segmentation fault within Instance::follow. * Fixed the visible/invisible problem. [t:780] * Fixed facing location and a related bug. [t:773] ## [0.3.4] - 2013-02-28 ### Engine * Fixed a couple of compiler errors when SDL renderer is chosen (i.e. HAVE_OPENGL macro is not defined). [t:693] * Changed the way instance rotation works. Instead of using a facing location the instance now use only a rotation value. But the possibility to get and set facing locations is still available. In case you set a facing location, internally it is converted to a angle or in case of get, the angle is converted to a location. [t:647] * Fixed grid scaling by camera rotation. [t:695] * Optimized camera update() function. Old caused two matrix updates. * Changed the angle/rotation functions to use MapCoordinates instead of ExactLayerCoordinates. * Added a virtual destructor to the IResourceManager interface. [t:709] * Fixed a problem with the usage of the size_t type. [t:702] * Addressed some API inconsistencies. Renamed LogManager::isLoggingToPrompt() to isLogToPrompt() and LogManager::isLoggingToFile() to isLogToFile(). This shouldn't affect python clients as the appropriate changes have been made to the python extension. [t:711] * Addressed more API inconsistencies. Renamed (in serveral places) setMouseAcceleration() to setMouseAccelerationEnabled() and getMouseAcceleration() to isMouseAccelerationEnabled(). This shouldn't affect python clients as the appropriate changes have been made to the python extensions. [t:711] * Fixed some problems when zooming at 200% or 300%.. etc etc. Images were not exactly 2x2 or 3x3. [t:719] * Added getMapViewPort() and getLayerViewPort() functions to camera class. These functions return the position and size of the camera in map or layer coordinates. CellRenderer make use of it to speed up rendering, especially when many cells exist in the cache. [t:647] * Added Fog of War support. * Pathfinder has been completely re-written. * Added getDesktopHeight() and getDesktopWidth() to DeviceCaps. [t:669] * Enhanced Instance coloring. The new alpha component is used as interpolation factor. [t:729] * Ensure SCons version is 2.0+. [t:735] * Added the staticLayer feature so that layers can be rendered as one texture. [t:742] * Client can now select, per Layer, between three sorting algorithm. ### Extensions * Fix event groups in pychan; only the last group's callback used to be considered. [t:23] * Added the getter and setter functions to the fifelog extension. [t:711] * Replace 'dct.has_key(k)' with 'k in dct'. [t:631] * You can now overwrite existing widget types without pychan "trying" to throw an exception. There is no feedback if you do overwrite an existing widget, it will silently allow you to do so. fixes[t:748] * Allow client to set focus to a child widget when using widget.execute(). [t:750] * Fixed a bug in the slider widget which caused it to ignore the step length. [t:754] * Unknown exceptions are now caught by BasicApplication and the engine is exited gracefully. This prevents an endless output of exceptions from being printed to the console window. [t:755] * Added the ability to set the horizontal_scroll_amount and vertical_scroll_amount via XML for scroll areas. [t:692] * Modified the default settings dialog box to no longer use drop downs. This prevents the dropdown segfault from happening. [t:756] * Fix typo in xml serializer. This was leading to a crash when extra_attrs were passed. [t:760] ### Misc * Added some excludes to the fife.iss file so it doesn't include some files that it shouldn't when building the windows installer. [t:601] * Changed the python executable back to python.exe from pythonw.exe in the windows installer. pythonw.exe crashes with some version of python when you output something to the console screen. [t:601] * Added PathfinderTest to fife tests. It demonstrates multilayer movement and how speed and cost multiplier could be used. [t:647] * Updated the header file location for fifechan when building with mingw on windows. [t:698] * Update to allow FIFE to find fifechan when it is installed in the libpath. Tested this on archlinux. [t:698] * Allow for parallel builds. fixes[t:696] * Removed unused file - freebsd8-config-dist.py. [t:716] * Updated the COPYING file to be the current copy of the LGPL 2.1 text. It seemed to contain an older version of LGPL. fixes[t:718] * Modifying code/comments/file headers that apply to this branch to conform to the new coding standard. Also applied the correct eol-style svn property for some of the new files. [t:647] * Applying patch provided by gscai. This allows for custom command line parameters to be passed to the windows build batch files. [t:737] * Applying patch provided by gscai. This allows the use of the CXX environment variable to change the path to the desired C++ compiler. [t:738] * Fixed a bug where the shooter demo would crash after a few seconds after starting a new game. This also prevents the player ship from being lost off the left side of the screen. [t:747] ### Docs * Updated the doxygen configuration file to be current with the latest doxygen version. * Added a process on the web host to generate doxygen documentation as well as epydocs for the python modules. * Doxygen docs now include the FIFE revision number they were generated from. * Updated a comment in quadtreerenderer.cpp that was being mistaken by doxygen for the FIFE namespace docs. * Added FIFE namespace documentation to version.h * Fixed a bunch of doxygen warning/error messages (now that we are able to see them). [t:550] * Epydoc formatting fixes for xml loader files. [t:724] ## [0.3.3r3] - 2012-04-17 ### Engine * Implemented C++ map savers which is now being used by the editor. [t:491] * Fixed instance Z so it works now as expected. This should only be used for small optical corrections. (r3810) * Added layer z offset. [t:366] * Fixed a problem with instance setLocation(). (r3810) * Removed sub image loaders as they are not used. (r3811) * Object is no longer derived from IResource. (r3811) * SDL Renderer now renders quads as expected. [t:607] * Changed the Image creation in CoordinateRenderer. The coordinate is now splitted into three images. So the TextRenderPool can reuse the most images and must not create one for each coordinate. Additional the images take camera zoom into account, but you can also disable it. [t:612] * Added InstanceDeleteListener to InstanceRenderer and RenderNode. [t:602] * All images created by effects are now owned by ImageManager and freed if no longer used after 60 seconds. [t:611] * Added the set method to PointType2D and PointeType3D. [t:615] * Changed the way Atlases and SubImages?(SharedImages?) are loaded and freed. SubImages now store a ImagePtr to its Atlas and the name. So a AtlasImage is only unreferenced if all SubImages are removed. It is also possible to free all images. Images that are required but were freed, invite self-adjusting. [t:605] * Added functions to allow the client to set the mouse position on the screen and retrieve it as a tuple in python. [t:617] * Added another version of captureScreen() that takes width and height params allowing you to resize the resulting image. [t:618] * Fixed a bug that led to Segmentation Faults, if the BitsPerPixel setting was different than 32. [t:623] * Added support for True Type Collection fonts. [t:614] * Optimized getMatchingInstances(). [t:592] * TargetRenderer is no longer dependent on map loading. [t:636] * Small fix in the AtlasLoader to set the filename of any objects read from the atlas file to the atlas xml file instead of the image file like it was doing previously. This fixes a problem seen in the map loading/saving where the imports would save the image file instead of the xml description file in the map. [t:491] * Zooming now works as expected with x and y offsets. [t:667] * We now get more information when gcn::Exception is thrown. [t:665] * MapLoader now allows for .zip files to be loaded. ZipSource implements a smarter file search so it can properly load files from a zip archive. [t:491] * Removed the lasttime_draw reset from TargetRenderer, because this can cause problems. [t:674] * Cursor no longer moves to 0,0 on startup. [t:670] * Removed unneeded command line option -Wl from both release and debug builds as this was breaking builds on gcc 4.7 and above. [t:691] ### Extensions * Fixed the file extensions registration for python plugin map loaders. [t:609] * Setting module is more robust on errors concerning non-string parameters. [t:626] * SimpleXMLSerializer now saves XML files with platform specific line engines. [t:630] * Child widgets should correctly report if they are hidden or not. [t:628] * Removing the hack to grab references to the GUIChanManager. Now we just use the pychan manager to grab what we need to grab from the GUIManager. Added 4 new functions to pychan Manager. getConsole(), getDefaultFont(), createFont(), and releaseFont(). [t:644] * Fixed deepApply() to now include hidden children in it's search. also added the ability to only search for visible widgets. [t:608] * GUI Icons can now be resized at render time. [t:655] * Widgets can now be cloned to make widget templating possible. [t:376] ### Editor * Users can now specify an additional plugin directory for the editor. [t:598] * Fixed a couple small editor bugs regarding map loading. [t:603] and [t:604] * Added a plugin interface to extend the editor with savers. [t:610] * Toolbars can be docked/undocked again. [t:635], [t:640], and [t:641] * The toolbox, toolbar, and statusbars statuses are now reflected correctly in the menu. [t:643] * Object Editor plugin now displays animations as expected. [t:624] * Added InstanceHighlighter plugin * Added docking status saving to ToolBar widget class, added default docking settings for Toolbox * Re-arranged init order in MainWindow.initGui() to make dockareas available for ToolBar * Small change to screenshot icon to give it a bit more space on the left * Refactored ObjectSelector ** Added auto-alignment depending on docking area (vertical/horizontal) ** Right click can be used to trigger the alignment change manually ** No annoying resizes on object selection ** Speed issues not fully solved, but pin-pointed: resizing ~200 icons is a bit too much for pychan * GUI Plugins can now use auto-alignment functionality from the ToolBar class * Small design fix in LayerTool * Small fix for MapFileHistory * Editor now doesn't load the same mapfile twice (gives feedback in the statusbar) * Re-enabled saving for ObjectEdit? plugin * Implemented XMLObjectSaver which allows serialization of a fife.Object ** NOTE: only well-formed xml files are accepted ** NOTE: provides a compat-mode to scan for tree roots, but also uses new tree root * Added namespace sorting to ObjectSelector * Refactored ObjectEdit ### Misc * Removed some unnecessary warning messages from Model. [t:645] * Removed non-free icons from the atlas editor and added license file to the atlas editor. [t:637] * Added a proper distclean build target. [t:622] * Added getRevision() to allow client to query the revision FIFE was build from. This only works if svnverion is present in the users PATH. Window users will always get 0. [t:671] * Added a check to animpacker.py to convert double points in action names to underlines. Additional the convert now consumes less RAM, because the ImageManager free images. [t:677] ## [0.3.3r2] - 2011-11-02 ### Engine * Added getVersion(), getMajor(), getMinor(), getSubMinor() functions and exposed them to python. [t:582] * Added a new math function to compare floats/doubles. It returns true if the difference is smaller as delta. * Fixed the getMatchingInstances() function. [t:579] * Added an bool to getMatchingInstances(). If a client need pixel accuracy results it should be set to true. Otherwise it should be set to false because so it skips the pixel compare and is much faster. [t:586] * Added two more InstanceChangeTypes, ICHANGE_BLOCK and ICHANGE_CELL. [t:574] * The ActionFrame for animations has been made functional. This means a minor API change. For details look into the changed demo scripts. [t:573] * Fixed the broken FIFE::Command type events. Now all event states are evaluated and not just one. Example from the ticket works now as expected. [t:503] * The DELETE macro which is defined in winnt.h is undef'ed on any windows platform that defines the WIN32 macro. This fixes compilation when using visual studio. [t:589] * Added two new mouse settings. The first one is the mouse sensitivity and the second can enable mouse acceleration. The sensitivity is limited to -0.99 (the slowest) and 10.0 (the fastest). If you enable mouse acceleration then the sensitivity is used as the max speed value. You can also change it on runtime with the EventManager. [t:487] * Added the getPtr() functions to ImageManager. All loaders now check to see if an image has been defined before creating it. This was a small bug that caused the image to be loaded even if the image was defined but not loaded in the first place. [t:590] * Fixed a bug in ImageManager::removeUnreferenced(). It would cause a segfault when executed. This has been fixed. * Fixed the problem where the animation atlas image becomes invalid after deleting all objects from model. [t:590] * Added a setting to allow users to deactivate the usage of the Framebuffer Object in opengl backends. refs[t:581] * Added a setting to allow users to deactivate the usage of NPOT Textures in opengl backends. [t:581] * Fixed a condition where if a widget is dragged to an area on the screen where there is no widget the event gets lost. It also prevents the focus from being dropped. [t:594] * Fixed a condition where the user drags from the map to a guichan widget and an event is lost. [t:594] * Added getRealCellDimensions() function to camera. [t:592] * Fixed a bug with Image names in TargetRenderer. [t:595] * Added 1024x600 as a valid resolution. [t:597] ### Extensions * Fixed a problem where the setting value cache is not updated [t:578] * Fixed a problem in fife_settings.py when starting the editor because the editor tried to modify the value of a setting not in the FIFE module. [t:578] * Added 'all' to the valid LogModules setting [t:578] * Pychan widgets can now be shown/hidden even if they are not top level containers [t:375] * Fixed a small bug with basicapplication. It was grabbing a reference to the gui manager incorrectly. ### Editor * Fixed a bug in the layertool GUI. It was using the quit.png icon as its delete layer image instead of the delete_layer.png icon. [t:583] * Replacing the editor's icon files with free ones. [t:584] * fixed a bug in pychan.internal (hide() method didn't handle deletion correctly, added a guard & docstring to explain why this is bad) * added new functionality to Plugin base class (read settings from editor's settings file) * added afterDock / afterUndock methods to Panel widget; did some code cleanup & improvements to meet coding standard * added documentation to the editor (mostly in docking functionality) * updated both MapFileHistory? and LayerTool? plugins to use the new Plugin functionality - their docking status is now saved & loaded again * added new event 'onOpenMapFile' to the signalmanager which sends the path of the requested mapfile * added MapFileHistory? plugin * records previous loaded mapfiles and loads them on editor startup via settings xml * selecting a mapfile either loads the map or updates outdated entries (e.g. if a map has been deleted) * I added a max value of 5 entries, can be adjusted in the plugin file though * fixed minor issue with moving multiple selected instances * fixed "move"-mode of editor - it now doesn't try to select / deselect cells (that's the task of "selection mode") * fifedit now can handle instances on hex grids again * deselection of cells is now possible (previous implementation never could work) * switched instance selection from pixel-perfect to location (click on a cell -> you select your instance, even if the cursor didn't scratch the instance image) ### Misc * Fixed the Free Software Foundation address in COPYING as it was outdated. * Added some more tiles to the rpg tileset in fife_test. * Added a Show Hide test to the PychanTest module in fife_test. * Small fix for the base class Test in the fife_test application. The create function reversed the engine and application parameters from what is actually passed in by the TestManager. The PychanTest was unaffected because it had the parameters in the correct order as opposed to reversed in the base class. * Commented out a whole lot of debug statements to make the debug output in FIFE useful again. I left them in the code in case anyone still needed them. * Added more tests to the fife_test testing platform. [t:683] ## [0.3.3] - 2011-10-06 ### Engine * Many optimizations/improvements to the OpenGL renderer. Depth testing was modified and now works properly with alpha blending enabled. Alpha testing is used to discard pixels. [t:556] * Optimized color overlays. [t:539] * Customizable alpha threshold value for outlines / outlining [t:569] * Added support for drawing/modifying images. [t:553] * Re-implemented the Resouce Pools (ImagePool AnimationPool, etc) as ImangeManager, SoundClipManager, etc. [t:504] * Setting module no longer crashes when settings dialog has not been loaded. [t:555] * Fixed the problem that the objects of the renderers don't get deallocated when the camera deconstructor was called. Affected renderers: Instance-, Cellsection-, Generic- and LightRenderer. * Added the missing reset() and removeAll() functions to the GenericRender and LightRenderer. * Removed the Engine::preInit() function. * Removed EngineSetting::getPossibleResolutions() and validate() functions * EngineSettings no longer throws any exceptions. Instead default values as assigned and a warning message is sent to the logger. * Some optimizations to LayerCache and Camera * Removed some unnecessary includes. * Changed when some exceptions are thrown. [t:511] * Added setBackgroundColor(), so a client can change the clearing color for the screen. [t:307] * Added camera overlay functions. Clients can now add a color, image and animation overlay to the camera [t:460] * Made sure that the fife logger is part of the FIFE namespace. * Modifying all integer definitions to conform to the C99 standard. * Added the getMinMaxCoordinates() function to the map class. It retrieves the minimum/maximum coordinates of instances on the map. * Changed Model::getNumMaps() to Model::getMapCount(). * Changed Map::getNumLayers() to Map::getLayerCount(). * Changed Animation::getNumFrames() to Animation::getFrameCount(). * FifeClass is no longer derived from IReferenceCounted. * ResourceClass now implements the reference counting routines. * Singletons are no longer derived from FifeClass. * Modified the HexGrid? and SquareGrid? clone process to work as expected (even though it's not really used). This doesn't fix the obvious problems with CellGrid? and the way grids are created. This will have to be looked at closer in the future. * Made the quad tree depth easily changeable (instead of hard coded to 2) . * SquareGrid? now uses diagonals by default. * Model now logs to the LM_MODEL log module. * Small modifications to Exception to make it output to the log correctly. Now we can read the exception output. * Changed a few sqrt to match the new math definition. * Added layers getMinMaxCoordinate() function to python. * Renaming the only 2 .hpp files to conform to standards. * Optimized the lightrenderer a bit. * Fixed a build error on updating project files. This was caused by not installing the mingw part in the devkit installer. * Added code to support different versions of boost filesystem. [t:529] * Fixed some color variables (Uint8, int32_t to uint8_t). * Added some code to the python build environment to support python 2.4+. [t:465] * Fixed a segfault in the view_tests.py unittest. * Settings now list valid screen modes. [t:494] * the default image loader now throws exceptions if the image fails to load. * Fixed a bug in RawData::read where an incorrect calculation was done to check the validity of a passed in parameter. This caused a problem with loading asset files when the file did not have an appended new line at the bottom. Also modified the RawData::getDataInBytes, RawData::readString, and RawData::read methods so that they do not create a temporary data array and instead read directly into the output buffer, this should be more efficient. Added a quick comment to xmlobject.py describing why a raise call is subverted by an earlier return statement. [t:516] * Removes an unnecessary call from endFrame(). * Fixed some unittests. * Added a framerate limiter. [t:525] * Replaced the Generic- and LightRendererNode with RendererNode. * Fixed the distance calculation in routepather.cpp. * Added the OffRenderer. This is the only renderer that does not need a map or camera. The functions are identical to those of the GenericRenderer, but it use screen coordinates. This renderer is only intended for cases where no map is loaded, eg for an intro. * Changed the swig video_tests.py to use the new renderer. * Removed the primitives and a few other functions from the python interface. These are no longer needed. * Added the swig cursor unit test. * Added some getter functions to cursor along with some documentation. * RenderItem now stores an ImagePtr. * Fixed SharedPtr destructor. [t:561] * Added the getInstancesIn() function to Layer. This picks the Instances from the InstanceTree. * Fixed getMatchingInstances(). The picked instances be checked with the instances of the layer. To compare the instances, getInstancesIn() is used. [t:562] * Unnecessary InstanceActivity? are now detected and deleted. Inactive Instances are removed from Layer m_active_instances. [t:564] * Changed from using RawData::getDataInBytes to use RawData::readString in the animation/atlas/object/map loaders because the readString function appends a null terminator onto the end of the data contents. Without the null terminator errors were sometimes seen when trying to load map assets. * Added some error log printing indicating when map assets fail to load. [t:567] * Modified the RawData::read function so that it no longer appends a null terminator as this was causing the python xml loaders to throw a ParseError exception. Also fixed the RawData::readString function so that it now appends the null terminator in the proper place. [t:567] * Made scons check for the dev libraries of whatever python the user ran scons with. [t:523] * Fixed a problem where pychan will throw an exception when trying to print UTF8 characters to the console. [t:571] * Fixed and optimized a few functions in location.cpp. [t:563] and [t:568] * Added option --lib-dir to scons build system to specify a shared library install location. The shared library generated will now contain an soname that will be libfife.so.major. Also changed the generated shared library name to be libfife.so.major.minor.release. Added a version.h file to engine/core that will contain the current fife major, minor, and subminor versions and should be updated for each fife release. [t:575] * Fixed minor bug in getMatchingInstances(). This means that sometimes a wrong choice was made, because alpha value was not correct. * Change the way you set FIFE::Cursor to allow cursor to save a reference to the image or animation. Added a function to reset the cursor drag to nothing. * Added GLee - currently it's compiled with fife as .cpp (scons doesn't get compiled .c files). * Initial support for c++ map/object/animation loaders. [t:491] * Added dependency tinyxml for reading xml files. This is stored in engine/core/ext/tinyxml directory. The scons scripts will attempt to use system version of tinyxml if available otherwise the local one will be used. [t:491] * Added image Atlas support. [t:542] * Added a zoom flag to the image/animation functions of the GenericRenderer. So a client can disable the zoom for images. [t:543] * Fixed a bug that caused the generated SWIG interface file for fife to not compile when building with gcc 4.6.1. [t:546] * Began work on de-coupling FIFE from guichan. [t:549] * Changed Guichan graphics renderer to utilize vertex array instead of immediate mode. [t:549] * Removed Abstract* classes in favor of I* classes. This is to conform to our coding standards. [t:550] * After a new layer is added it is now activated for all renderers. This fixes the problem of no instances being rendered for a newly created layer. [t:551] * Added the option to change the alpha value for instance picking. * Added a setting for backbuffer clearing. So clients can deactivate it if they have reasons for this. * Removed the old setImageChunkingSize() setting because its useless. * Changed the pump function. Model update gets only called if a map is loaded. * Adding a quick and dirty shared pointer implementation that does not rely on any 3rd party libraries. This will need to be extensively tested and can always be swapped out for another implementation including boost::shared_ptr. * Added the unittest for SharedPtr. * Instances now inherit blocking property from objects [t:514] * Settings are now validated. [t:528] * VFS now allows paths outside of launched applications when using a python client. [t:544] * Reworked the lighting module. [t:557] * The Windows icon is now freed correctly. [t:530] ### Demos * Fixed a bug in the shooter demo that caused a crash. [t:495] * Updating the rio settings-dist.xml file to include the log level filter setting. * Added animated percentagebar widget to gui animation demo. * Pychan demo now closes when you press escape or when you close the window. [t:531] * Shooter demo now generates a hichscore file if one does not exist. ### Documentation * Documented the shooter World.reset() function. * Updating the dependency graphs. [t:554] * Documented all valid FIFE settings. [t:527] ### Extensions * Updated basicapplication.py to initialize the logger before settings so that setting messages will be logged. * Removed some deprecated functions in pychan. * Removed the deprecated ClickLabel widget from pychan. [t:552] * Added changeBlending() to python. ### Tools * Editor no longer crashes when there are too many instances on the map when using the OpenGL renderer. [t:500] * Added Atlas Creator tool. Currently it's a standalone application written in Qt. [t:541] ## [0.3.2] - 2010-11-19 ### Engine * Removed the Camreazone renderer * Added light support (OpenGL only) by merging the light branch. Speacial thanks to Helios for all his hard work in this area (#364) * Added a percentage bar widget (#411) * Modified some size_t definitions to more appropriate ones (#152) * Instance rotation changes are reported to the instance change listeners (#475) * Fixed the GenericRenderingNode to no longer cause a segfault (#446) * Fixed an API inconsistency in SoundEmitter (#461) * There is no longer a memory leak when adding coloring overlays to instance (#472) * instance.get2dGfxVisual().setVisible(False) now works as expected (#471) * Removed the last 0(n) loop through instances when rendering (#419) * Generic renderer now only renders objects on the specified layer (#458) * Fixed a memory leak when deleting maps. The camera was not being deleted * Removed the NotFound exceptions in layer.getInstance() and model.getObjects() to be more consistent with the rest of the API * Fixed a bug in RenderBackendSDL, the clip area was not properly set * Renamed the backquad and border commands of the FloatingTextRenderer * Added the TransparentArea commands to the InstanceRenderer * Improved InstanceRenderer::addTransparentArea. You can now pass a list of namespaces to be marked as transparent * Updated Instance to no longer derive from ResourceClass. It now derives from FifeClass directly * Improved the floatingtextrenderer. Now you can set an alpha value for font, background quad and border. Split quad and border into own commands * Added a triangle function to backend and genericrenderer, also added the functions to set an alpha value for geometric figures * floatingtextrenderer now can change colors of the font via setColor(uint r, uint b, uint g) * Added the colorbuffer patch with a small change due to SDL. Performance boost between under OpenGL * Improved the most renderers with setColor() function to allow the user to modify the color used to render the primitives * Fixed the genericrenderer. It is now tested whether the images are in the viewport * Fixed the gridrenderer to only render the grin within the viewport * Changed the vertex functions in opengl/renderbackendopengl.cpp from vertex3f() to vertex2f() * Moved the layer visibility and transparency, from instancerenderer.cpp to layercache.cpp and improved it (r3395) * Corrected the h,w calculation for zooming in layercache.cpp (r3369) * Fixed the bug, that x,y camera position result in an screen offset. (r3369) * GLImage now only creates one "texture chunk" (r3445, r3452) * Added nextPow2() math function (r3445) * Fixed color mask definitions and use them throughout the engine (r3445) * Moved the GLEnable and GLDisable structures to be globally accessible (r3445) * Templatized Rect to extend it's functionality beyond integers (r3447) * Added some typedefs: Rect, FloatRect, DoubleRect (r3447) * Removed the unused "trigger" system as it was unused (r3449) * Applied GreyGhosts patch to fife_settings. Allows the user to load the gui XML whenever they want. Also returns a reference to the dialog so it can be worked with outside of fife_settings. (r3451) * Removed unused files containing the unused GUIEventListener class (r3453) * Removed old and unused functions: set/getSourceWidget() (r3455) * Added drawRectangle() and fillRectangle() functions to the renderers (r3456) * Modified FIFE::FloatingTextRenderer? to use the new functions (r3456) * Updated some data types in FIFE::FloatingTextRenderer to use integer types defined in fife_stdint.h (r3456) * Added FIFE::DeviceCaps and FIFE::ScreenMode to detect valid screen modes * Added the ability to query the current running screen mode (r3467) * Added a method to detect the closest supported screen mode (not complete yet). If no matching screen modes are detected an exception is thrown. (r3467) * Small change to the way the screen is initialized. The screen mode now MUST be in the supported screen mode list before the screen will initialize. (r3467) * Added clearResourceLoaders() to the Pool class. This can be used if different resourceloaders have to be added at a later point in time (running editor for example, a plugin might want to have it's own loader added) (r3469) * Added the ability to normalize a 2D and 3D point (r3470) * You can now rotate a 2D point around the origin or a specific point (r3470) * Major improvements to fife_math.h and added corresponding Python bindings. Users now have access to FIFE's internal math functions. These functions are recommended to be used by all clients if required. Note: this may cause some problems with certain compilers. I hope this wont have to be reverted. TODO: remove the static constant globals somehow. (r3471) * Adopted the new math functions for all subsystems (r3471) * Added the ability to change screen modes on the fly. This works both in OpenGL and SDL modes. (#315) * Added IEngineChangeListener so the client can update the cameras viewport if the screen mode has been changed. I chose to do it this way because the engine has no way to know which camera it should update. It will be up to the client to do it. (#315) * The cursor surface is now correctly freed when exiting. (r3483) * Added DeviceCaps::getNearestScreenMode() for the client to request a supported screen mode. (#315) ### Build System * Removed libpng from ext (#385) * Debug is now automatically enabled when you build with profiling enabled (r3292) ### Editor * Re-arranged the ObjectEdit gui to avoid misunderstandings * Can now place instances (which are visible) on new maps again (r3392) ### Extensions * Added the SimpleXMLSerializer extension * Removed the XML portion out of fife_settings in favor of SimpleXMLSerializer * Made the serializer used in fife_settings "pluggable" * fife_settings widgets are now updated when the settings are reset to default * Can now specify the default settings filename instead of using settings-dist.xml * Fixed the write_instances function so it saves the stack position variable of instance visual when saving maps * Added getVolume() to the SoundManager * Added debug flag to loaders to enable/disable annoying print spam on maploading * BasicApplication now initializes pychan (r3388) * loaders extension can now handle multiple loaders for different filetypes. A difference between map and object files is now being made! (r3469) * Modified the sound manager to better take care of sound clips (r3476) ### Docs * Added some documentation to the filebrowser module ### Pychan * Timers are now handled correctly by pychan (#483) * Can now modify the step length for sliders (#482) * Built in pychan dialogs now work (r3384) ### Demos * Renamed /demos/pychan_demo/pychan_test.py to pychan_demo.py * Added a new pychan demo - gui animations * Added the Shooter demo * Made the dynamic widget test in the pychan_demo work/look a little better (r3484) ### Misc * Fixed some compiler warning messages * Added license information for the gimp icon ## [0.3.1] - 2010-03-01 ### Engine * Updated a lot of the python source files to have the correct headers * Fixed SWIG wrappers that didn't handle simple output parameters (#340) * Added color key support for both OpenGL and SDL renderer (#451, #146) * Changed the EventManager to use deque rather than vectors for storing listeners (#454) * Added the ability to prepend event listeners to the front of the listener list (#454) * Updated instance rotation values to be valid in all cases (#361) * VFS no longer crashes when entering a restricted path (#413) * Filename case is no longer transformed to be lower case (#418) * OpenGL renderer now clears the backbuffer correctly (#392) * Added the ability to render Vertexes (#455) * Camera names no longer clash when loading multiple maps (#342) * All layers are no longer activated when calling Camera::resetRenderers() (#457) * Word wrapping in a pychan label now works as expected (#408) * SWIG wrappers now handle all simple output parameters (#340) * Added ActionVisual::getActionImageAngles() * Added Cursor::getX() and Cursor::getY() ### Build System * FIFE now builds as expected on win32 using the FIFE dev kit * Win32 batch scripts no longer overwrite the users PATH variable (#429) * Requied DLLs are now installed as required on win32 (#430) * CXXFLAGS should now be honored * Fixed a problem with the dependency checks when using pkg-config on linux * Added OpenBSD support ### Editor * Can now re-load a map (#381) * Opening more than one map and then closing them no longer causes a crash (#441) * Undo/Redo works properly if you select different layers (#443) * Docked widgets no longer shrink when you click inside them (#444) * Object editor can now skip to first and last frames of an animation (#448) * Object editor sends some messages for the user to the editor status bar * Cleaned up object editor by adding preMapClosed and preMapShown events * Object editor now uses getActionImageAngles() to fetch animation angles * Object editor animation views should now work with all clients * Object offsets can now be saved to the object.xml file * Object offsets can now be manipulated by using the mousewheel * Added undo/redo support for the moving of instances ### Extensions * File Browser now refreshes correctly (#391) ### Docs * Fixed the Linux:Scons tutorial (#422) ### Pychan * Fixed a couple python import lines (#440) * Added Widget.requestFocus() ### Rio De Hola * Fixed the path to the AUTHORS file so the credits are displayed correctly ### Misc * Added color tester to pychan demo * Demos now look for a local copy of FIFE before importing the installed version of FIFE ## [0.3.0] - 2010-01-20 ### Engine * Moved to Python 2.6 (#345) * Upgraded guichan in ext to 0.8.2 (#420) * Added UTF8 support * SCons build system has been re-written (#328) * Support for native mouse cursors * The background of Label widgets will be painted * Added adaptive pathfinding (#347) * Modified CellSelectionRenderer to support multiple cell selection * Added method Layer::getInstancesAt() * Added SoundEmitter::setCallback() * Added a setRolloff() function to the SoundEmitter class. * Added function to fife_utils: getUserDataDirectory. Returns the proper path to save setting and data files depending on OS. * Removed UnitTest++ from ext (#421) * Changed the way the fife python module is imported * The serializers will use LogManager instead of printing directly to the console * GuiManager: Proper translation of Guichan key events to FIFE key events * Proper size calculation for ToggleButton * Fixed a layer visibility bug where the toggleInstancesVisible and setInstanceVisible functions were not working correctly. (#335) * Fixed building FIFE on OS X (#360) * Fixed setActionRuntime() (#373) * Fixed unreliable time handling when changing time factors. * Fixed a bug in the OpenGl renderer where the last chunk of images would not be displayed when image_height % chunk_size was 0. * Fixed layer and instance transparency (#378) * Fixed a lot of small bugs ### Rio de hola * Made rio_de_hola save its settings to the proper OS folder. * Added a prefix to cameras in Rio de Hola to avoid name clashes * Fixed second camera in rio so multiple Camera.setLocation calls are handled correctly * More documentation has been written ### Editor * Rewrote editor: - Improved GUI: - Resizable windows - Docking - Toolbars, menubar, statusbar - Model/View approach to toolbar and menubar buttons - New signal event system based on the one from django - Support for opening multiple maps - Better plugin support * New plugin: LayerTool * New plugin: LightEdit * New plugin: CameraEdit * Enhanced ObjectSelector * Enhanced ObjectEdit * New tool: ObjectPicker. Click on an instance on the map to set the current object to the instance object * Ability to select cells and perform actions on them (move, delete, fill, ...) * New type of scrolling: Press middle mouse button and move the mouse * New icons based on Bluesphere * Made the editor save its settings to the proper OS folder. * Fixed editor bug where the map didn't render after saving (#333) * Editor can now re-open a map (#381) * Fixed a problem navigating directory structure with the filebrowser (#377) * Filebrowser now refreshes when expected (#391) * Fixed a lot of bugs, and made a lot of new ones ;-) ### PyChan * New greedy layout engine: Widgets is now able to expand in addition to shrinking * New events: mouseWheelMovedUp and mouseWheelMovedDown * Added the position_technique attribute * Added Widget.removeAllChildren() method * Added a new method Widget.getNamedChildren * New method: Widget.insertChild() * New method: Widget.insertChildBefore() * New property: is_focusable * New properties: min_size, max_size * Moved helptext property from C++ to pychan * New togglebutton widget * ScrollArea: Size is not static anymore (can shrink and expand) * Allow objects with a call attribute to be used as event callbacks * Removed unused TimerListener * Switched to new content structure (#336) * Made the distribute and mapEvents methods faster * Added a small decorator for profiling rarely called functions * Optimized adaptLayout() * Added fast path for Widget.findChild(name=name). Roughly 10x faster * Fixed an input problem when a dropdown box is clicked on (#337) * Fixed pychan event_map to support callable objects (#374) * Fixed the pychan demo (#363) * Fixed a pychan problem where unknown characters were displayed when holding the shift key (#383) * Lots of bug fixes ### Documentation * Fixed some doxygen documentation problems (#343) * Created python coding standards article (#372) * Created "Bug Report" template (#409) ### Misc * New versioning scheme (x.y.z) instead of (yyyy.r) * Moved extensions and fife.py to /engine/python/fife * Moved rio_de_hola and pychan_demo to /demos * Moved some misc scripts to /tools * Moved the FIFE editor to /editor * Added a Win32 installer for FIFE and the win32 SDK ## [2009.0] - 2009-01-07 ### Engine * Merged input rework branch * Possibility to hide instances/instance visuals * Added input and focus events * Modified clicklabel to provide a mouse listener for hover events * Use strings as grouping in generic renderer instead of numbers * Omission of a camera viewport in xml map files now indicate that the camera should use the full window * Added removeActionListener to SWIG export * Some improvements to Scons build scripts * Prepared basicapplication to use WindowTitle and WindowIcon from clients' settings.py * Logger now ignores non-existing log modules (warns to prompt) * Pools now have a function called purgeLoadedResources which deletes all loaded resources that have a reference count of zero. * Movie: Switched to using FIFE::Image instead of Overlays * Reworked matrix vector multiplication * OpenAL-soft patch for OSS support Optimizations: * Added hasing to pool to improve techdemo loading time * Lazy loading for animations * Combined events to reduce lag * Small optimizations for instance renderer Bugs: * Initialize instance visuals properly * Fixed false positives when searching for instances in a rectangle * Fixed a horrendous misconception in Pool. The map was sorted by pointer comparison. * Fix for textwrapping * Fixed bug where instances couldn't change layer * Fixed a small bug when initializing OpenGL * Fixed a scons issue where libraries checked for C instead of C++ * Fixed a shutdown order problem * Fixed segfault on shutdown when profiling was activated (#334) * Fixed: Editors camera doesn't show map after saving (#333) * Fixed: FIFE crashes with a segmentation fault (#297) ### Pychan * Modified pychan to accept RGBA colors * More documentation for layout system * adaptLayout now acts a bit smarter * Fix for scrollarea bug ### Rio de hola * Improved some graphics and added some new ones * Profiling support ### Editor * Scrolling support * Added an undo feature to the map-editor * Object editor plugin * Some bug fixes ### Documentation * Updated the map format article to reflect the datasets changes (#323) ### Misc * Removed old testmaps ## [2008.1] - 2008-06-01 ### Model improvements & simplifications * Elevations removed (Fallout legacy). * Support for namespaces: * New resource infrastructure migrated into whole engine. This enables: * uniform pooling for all resources that need to be pooled. * uniform loading for all resources (model stuff, images, sounds...). * uniform saving for resources which support saving (model stuff). * Datasets are now stored in a flat list in model instead of dataset hierarchy. * Changes in model are now bookkeeped. Observer interfaces provided for change listeners. * This enables e.g. reacting only to changes instead of polling on every round. * Also critical enabler for triggers. * Instances now support initial rotation value. * Objects support default actions. * Further model cleanup. ### XML format changes * All resources are now defined with principle 1 file / 1 resource. * Importing of objects can now be done also based on directories where they are contained. * Relative paths are now used instead of absolute ones. ### Loaders * All loading happens now from python (tinyxml dependency removed). * Improved error reporting. ### Editor * Possibility to move instances on map. * Possibility to rotate instances on map. * Possibility to zoom the map (OpenGL mode only). * Painting with currently selected instance (e.g. large ground areas). * Importing of multiple objects based on given directory. * Initial map creation wizard (still work in progress). ### Rio de hola * More assets: * Graphics, sounds, music... * Two new maps matching the storyline. * Rio de hola now conforms to package structure * Popup menu integration, demonstration of actions (kick, talk). ### Pychan improvements * Hiding of scrollbars. * Text wrapping. * A lot of smaller improvements. ### Functionality * Pixel perfect instance picking (taking transparency into account). * Ability to get list of instances from given screen rectangle. * Distance calculations made easy, exposed to scripts. * Instance outlining. * Instance coloring. * Screenshots are now saved in png format (instead of bmp). * Stereo sound support in linux (introduced with the help of openal-soft). ### Video / view improvements * Both renderbackend and separate images can now render graphical primitives (e.g. lines, dots..). * Each camera now has separate set of renderers. Allows truly adjusting cameras independently. * Zooming capability (currently properly supported only by OpenGL backend). * Support for drag cursor definitions. * OpenGL graphics chunking size is now definable in settings. Should help e.g. with large backgrounds. * GenericRenderer adding customised rendering capabilities for scripts. ### Misc. changes * Initial package structure defined for FIFE clients. * Updated guichan to the latest release 0.8.1. * Usage of unittest++ instead of boost unittests. * Lots of bug fixes. ### Non-code related changes * Switch from GPL 2.0 to LGPL 2.1 (or newer). [Unreleased]: https://github.com/fifengine/fifengine/compare/0.4.1...HEAD [0.4.1]: https://github.com/fifengine/fifengine/compare/0.4.0...0.4.1 [0.4.0]: https://github.com/fifengine/fifengine/compare/0.3.5...0.4.0 [0.3.5]: https://github.com/fifengine/fifengine/compare/0.3.4...0.3.5 [0.3.4]: https://github.com/fifengine/fifengine/compare/0.3.3r3...0.3.4 [0.3.3r3]: https://github.com/fifengine/fifengine/compare/0.3.3r2...0.3.3r3 [0.3.3r2]: https://github.com/fifengine/fifengine/compare/0.3.3...0.3.3r2 [0.3.3]: https://github.com/fifengine/fifengine/compare/0.3.2...0.3.3 [0.3.2]: https://github.com/fifengine/fifengine/compare/0.3.1...0.3.2 [0.3.1]: https://github.com/fifengine/fifengine/compare/0.3.0...0.3.1 [0.3.0]: https://github.com/fifengine/fifengine/compare/2009.0...0.3.0 [2009.0]: https://github.com/fifengine/fifengine/compare/2008.1...2009.0 [2008.1]: https://github.com/fifengine/fifengine/compare/2008.1 fifengine-0.4.2/CMakeLists.txt000066400000000000000000001422301341615052600162140ustar00rootroot00000000000000#------------------------------------------------------------------------------ # Fifengine #------------------------------------------------------------------------------ cmake_minimum_required(VERSION 3.2.2) project(fifengine C CXX) #------------------------------------------------------------------------------ # Version #------------------------------------------------------------------------------ set(FIFE_MAJOR_VERSION 0) set(FIFE_MINOR_VERSION 4) set(FIFE_PATCH_VERSION 2) set(FIFE_VERSION_SHORT ${FIFE_MAJOR_VERSION}.${FIFE_MINOR_VERSION}.${FIFE_PATCH_VERSION}) # check if "git" is installed find_program(GIT_TOOL git DOC "Git version control") mark_as_advanced(GIT_TOOL) # get git commit hash, if source folder is a git repository find_file(GIT_DIR NAMES .git PATHS ${CMAKE_SOURCE_DIR} NO_DEFAULT_PATH) if(GIT_TOOL AND GIT_DIR) execute_process( COMMAND git rev-parse --short=7 HEAD WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} OUTPUT_VARIABLE GIT_COMMIT_HASH OUTPUT_STRIP_TRAILING_WHITESPACE ) set(FIFE_GIT_HASH ${GIT_COMMIT_HASH}) unset(GIT_DIR) else() # not a git repo, possibly a source download set(FIFE_GIT_HASH "") endif() if(GIT_COMMIT_HASH) set(FIFE_VERSION ${FIFE_VERSION_SHORT}+build.${FIFE_GIT_HASH}) else() set(FIFE_VERSION ${FIFE_VERSION_SHORT}) endif() message("== Updating version.h with version information and git meta data.") configure_file ( "${PROJECT_SOURCE_DIR}/engine/core/version.h.in" "${PROJECT_SOURCE_DIR}/engine/core/version.h" ) #------------------------------------------------------------------------------ # Options #------------------------------------------------------------------------------ option(opengl "Enable OpenGL support" ON) option(fifechan "Enable Fifechan GUI subsystem" ON) option(librocket "Enable Librocket GUI subsystem" OFF) option(cegui "Enable Crazy Eddie's GUI subsystem" OFF) option(logging "Enable logging" ON) option(build-python "Build the python extension module" ON) option(build-library "Build and install files to directly develop with c++" OFF) #------------------------------------------------------------------------------ # Configure #------------------------------------------------------------------------------ # set path to our custom CMAKE scripts set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PROJECT_SOURCE_DIR}/cmake") # Create a "Release" build by default. if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Select build type. Options are: 'Debug', 'Release', 'RelWithDebInfo' and 'MinSizeRel'." FORCE ) message(STATUS "Set CMAKE_BUILD_TYPE to default '${CMAKE_BUILD_TYPE}'.") endif(NOT CMAKE_BUILD_TYPE) # if building a C++ library is enabled, then build a shared library by default # if you need a static library, set "-Dbuild-library=ON -DBUILD_SHARED_LIBS=OFF" if(build-library) set(BUILD_SHARED_LIBS ON CACHE BOOL "Build a shared or static library") endif(build-library) # Do not allow an in-source-tree build, request an out-of-source-tree build. if(CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR) message(FATAL_ERROR "#Please build outside of the source tree!\n Make an out-of-source-tree folder for building and run CMake there:\n mkdir ../_build; cd ../_build; cmake ../fifengine\n Before that, cleanup:\nrm -rf CMakeCache.txt CMakeFiles") endif() # Disable in-source builds and modifications to the source tree. set(CMAKE_DISABLE_SOURCE_CHANGES ON) set(CMAKE_DISABLE_IN_SOURCE_BUILD ON) # organize targets into folders set_property(GLOBAL PROPERTY USE_FOLDERS ON) #------------------------------------------------------------------------------ # Compiler Options #------------------------------------------------------------------------------ # MSVC compiler options if(WIN32 AND MSVC) # build on all cores set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP /nologo") if(CMAKE_BUILD_TYPE STREQUAL "Release") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W0 /O2") else() # warning level: /W or /Wall set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W3 /Od") endif() # ensure we use minimal "windows.h" lib without the crazy min max macros set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /D \"WIN32_LEAN_AND_MEAN\"") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /D \"NOMINMAX\"") # avoid "C1128: number of sections exceeded object file format limit: compile with /bigobj" set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /bigobj") # disable SAFESEH - to avoid "LNK2026: module unsafe" on "OpenAL32.lib" set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /D /SAFESEH:NO") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SAFESEH:NO") set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /SAFESEH:NO") set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} /SAFESEH:NO") # use static libs - to avoid "LNK1104: cannot open file 'libboost_filesystem-vc140-mt-1_59.lib'" set(Boost_USE_STATIC_LIBS ON) set(Boost_USE_MULTITHREADED ON) # Note: c++11 is implicitly enabled on MSVC >=2013 endif() # GCC and Clang compiler options if("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU" OR "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") set(CMAKE_CXX_FLAGS "-std=c++11 -fPIC ${CMAKE_CXX_FLAGS}") if(CMAKE_BUILD_TYPE STREQUAL "Release") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2 -Wno-error") else() set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g2 -Wall -Wextra -Wunused") endif() endif() #------------------------------------------------------------------------------ # Defines #------------------------------------------------------------------------------ # define for using TinyXML with Standard Template Library (STL) support enabled add_definitions(-DTIXML_USE_STL) if(logging) add_definitions(-DLOG_ENABLED) endif(logging) if(opengl) add_definitions(-DHAVE_OPENGL) endif(opengl) if(cegui) add_definitions(-DHAVE_CEGUI) endif(cegui) #------------------------------------------------------------------------------ # Display Status #------------------------------------------------------------------------------ message("") message("== Building FIFE version ${FIFE_VERSION} using build type '${CMAKE_BUILD_TYPE}'.") message(STATUS " Source directory is '${PROJECT_SOURCE_DIR}'.") message(STATUS " Build directory is '${PROJECT_BINARY_DIR}'.") message(STATUS " Installation path is '${CMAKE_INSTALL_PREFIX}' (set -DCMAKE_INSTALL_PREFIX= to change).") message(STATUS " Dependencies folder: '${PROJECT_SOURCE_DIR}/../fifengine-dependencies'.") message("") message(STATUS " CMake version is '${CMAKE_VERSION}'.") message(STATUS " CXX Compiler ID: '${CMAKE_CXX_COMPILER_ID}'.") message(STATUS " CXX Compiler Flags: '${CMAKE_CXX_FLAGS}'.") message("") #------------------------------------------------------------------------------ # Find Dependencies - Windows #------------------------------------------------------------------------------ # Tell CMake where to search for binaries (dlls), includes and libs on Windows if(WIN32) set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} # help to find dependencies on Appveyor "${PROJECT_SOURCE_DIR}/../fifengine-dependencies/build-tools/swig" "${PROJECT_SOURCE_DIR}/../fifengine-dependencies/includes/bin" "${PROJECT_SOURCE_DIR}/../fifengine-dependencies/includes/include" "${PROJECT_SOURCE_DIR}/../fifengine-dependencies/includes/include/SDL2" "${PROJECT_SOURCE_DIR}/../fifengine-dependencies/includes/include/AL" "${PROJECT_SOURCE_DIR}/../fifengine-dependencies/includes/lib/x86" "${PROJECT_SOURCE_DIR}/../fifengine-dependencies/includes/lib" # help to find dependencies on your local env (FifeSDK) "${PROJECT_SOURCE_DIR}/../swig" "${PROJECT_SOURCE_DIR}/../python" "${PROJECT_SOURCE_DIR}/../fifengine-dependencies/bin" "${PROJECT_SOURCE_DIR}/../fifengine-dependencies/include" "${PROJECT_SOURCE_DIR}/../fifengine-dependencies/include/boost" "${PROJECT_SOURCE_DIR}/../fifengine-dependencies/lib" "${PROJECT_SOURCE_DIR}/../fifengine-dependencies/lib/boost" "${PROJECT_SOURCE_DIR}/../fifengine-dependencies/lib/x86" "${PROJECT_SOURCE_DIR}/../fifengine-dependencies/include/SDL2" "${PROJECT_SOURCE_DIR}/../fifengine-dependencies/include/AL" "${PROJECT_SOURCE_DIR}/../fifengine-dependencies/include/lib/x86" "${PROJECT_SOURCE_DIR}/../fifengine-dependencies/include/lib" ) endif(WIN32) #------------------------------------------------------------------------------ # Source Files #------------------------------------------------------------------------------ # tell compiler to search in the following folders for include files include_directories("${PROJECT_BINARY_DIR}") include_directories("${PROJECT_SOURCE_DIR}/engine/core") include_directories("${PROJECT_SOURCE_DIR}") # Core set(FIFE_CORE_SRC ${PROJECT_SOURCE_DIR}/engine/core/audio/actionaudio.cpp ${PROJECT_SOURCE_DIR}/engine/core/audio/soundclip.cpp ${PROJECT_SOURCE_DIR}/engine/core/audio/soundclipmanager.cpp ${PROJECT_SOURCE_DIR}/engine/core/audio/soundemitter.cpp ${PROJECT_SOURCE_DIR}/engine/core/audio/soundmanager.cpp ${PROJECT_SOURCE_DIR}/engine/core/audio/soundsource.cpp ${PROJECT_SOURCE_DIR}/engine/core/audio/effects/soundeffect.cpp ${PROJECT_SOURCE_DIR}/engine/core/audio/effects/soundeffectmanager.cpp ${PROJECT_SOURCE_DIR}/engine/core/audio/effects/soundfilter.cpp ${PROJECT_SOURCE_DIR}/engine/core/controller/engine.cpp ${PROJECT_SOURCE_DIR}/engine/core/controller/enginesettings.cpp ${PROJECT_SOURCE_DIR}/engine/core/eventchannel/eventmanager.cpp ${PROJECT_SOURCE_DIR}/engine/core/eventchannel/joystick/joystick.cpp ${PROJECT_SOURCE_DIR}/engine/core/eventchannel/joystick/joystickmanager.cpp ${PROJECT_SOURCE_DIR}/engine/core/loaders/native/audio/ogg_loader.cpp ${PROJECT_SOURCE_DIR}/engine/core/loaders/native/audio/sounddecoder_ogg.cpp ${PROJECT_SOURCE_DIR}/engine/core/loaders/native/input/controllermappingloader.cpp ${PROJECT_SOURCE_DIR}/engine/core/loaders/native/map/animationloader.cpp ${PROJECT_SOURCE_DIR}/engine/core/loaders/native/map/atlasloader.cpp ${PROJECT_SOURCE_DIR}/engine/core/loaders/native/map/maploader.cpp ${PROJECT_SOURCE_DIR}/engine/core/loaders/native/map/objectloader.cpp ${PROJECT_SOURCE_DIR}/engine/core/loaders/native/map/percentdonelistener.cpp ${PROJECT_SOURCE_DIR}/engine/core/loaders/native/video/imageloader.cpp ${PROJECT_SOURCE_DIR}/engine/core/loaders/native/video/resourceanimationloader.cpp ${PROJECT_SOURCE_DIR}/engine/core/model/model.cpp ${PROJECT_SOURCE_DIR}/engine/core/model/metamodel/action.cpp ${PROJECT_SOURCE_DIR}/engine/core/model/metamodel/object.cpp ${PROJECT_SOURCE_DIR}/engine/core/model/metamodel/timeprovider.cpp ${PROJECT_SOURCE_DIR}/engine/core/model/metamodel/grids/cellgrid.cpp ${PROJECT_SOURCE_DIR}/engine/core/model/metamodel/grids/hexgrid.cpp ${PROJECT_SOURCE_DIR}/engine/core/model/metamodel/grids/squaregrid.cpp ${PROJECT_SOURCE_DIR}/engine/core/model/structures/cell.cpp ${PROJECT_SOURCE_DIR}/engine/core/model/structures/cellcache.cpp ${PROJECT_SOURCE_DIR}/engine/core/model/structures/instance.cpp ${PROJECT_SOURCE_DIR}/engine/core/model/structures/instancetree.cpp ${PROJECT_SOURCE_DIR}/engine/core/model/structures/layer.cpp ${PROJECT_SOURCE_DIR}/engine/core/model/structures/location.cpp ${PROJECT_SOURCE_DIR}/engine/core/model/structures/map.cpp ${PROJECT_SOURCE_DIR}/engine/core/model/structures/renderernode.cpp ${PROJECT_SOURCE_DIR}/engine/core/model/structures/trigger.cpp ${PROJECT_SOURCE_DIR}/engine/core/model/structures/triggercontroller.cpp ${PROJECT_SOURCE_DIR}/engine/core/pathfinder/route.cpp ${PROJECT_SOURCE_DIR}/engine/core/pathfinder/routepather/multilayersearch.cpp ${PROJECT_SOURCE_DIR}/engine/core/pathfinder/routepather/routepather.cpp ${PROJECT_SOURCE_DIR}/engine/core/pathfinder/routepather/routepathersearch.cpp ${PROJECT_SOURCE_DIR}/engine/core/pathfinder/routepather/singlelayersearch.cpp ${PROJECT_SOURCE_DIR}/engine/core/savers/native/input/controllermappingsaver.cpp ${PROJECT_SOURCE_DIR}/engine/core/savers/native/map/mapsaver.cpp ${PROJECT_SOURCE_DIR}/engine/core/util/base/exception.cpp ${PROJECT_SOURCE_DIR}/engine/core/util/base/fifeclass.cpp ${PROJECT_SOURCE_DIR}/engine/core/util/base/stringutils.cpp ${PROJECT_SOURCE_DIR}/engine/core/util/log/logger.cpp ${PROJECT_SOURCE_DIR}/engine/core/util/math/angles.cpp ${PROJECT_SOURCE_DIR}/engine/core/util/resource/resource.cpp ${PROJECT_SOURCE_DIR}/engine/core/util/time/timeevent.cpp ${PROJECT_SOURCE_DIR}/engine/core/util/time/timemanager.cpp ${PROJECT_SOURCE_DIR}/engine/core/util/time/timer.cpp ${PROJECT_SOURCE_DIR}/engine/core/vfs/directoryprovider.cpp ${PROJECT_SOURCE_DIR}/engine/core/vfs/fife_boost_filesystem.cpp ${PROJECT_SOURCE_DIR}/engine/core/vfs/vfs.cpp ${PROJECT_SOURCE_DIR}/engine/core/vfs/vfsdirectory.cpp ${PROJECT_SOURCE_DIR}/engine/core/vfs/vfssource.cpp ${PROJECT_SOURCE_DIR}/engine/core/vfs/vfssourceprovider.cpp ${PROJECT_SOURCE_DIR}/engine/core/vfs/dat/dat1.cpp ${PROJECT_SOURCE_DIR}/engine/core/vfs/dat/dat2.cpp ${PROJECT_SOURCE_DIR}/engine/core/vfs/dat/lzssdecoder.cpp ${PROJECT_SOURCE_DIR}/engine/core/vfs/dat/rawdatadat1.cpp ${PROJECT_SOURCE_DIR}/engine/core/vfs/dat/rawdatadat2.cpp ${PROJECT_SOURCE_DIR}/engine/core/vfs/raw/rawdata.cpp ${PROJECT_SOURCE_DIR}/engine/core/vfs/raw/rawdatafile.cpp ${PROJECT_SOURCE_DIR}/engine/core/vfs/raw/rawdatamemsource.cpp ${PROJECT_SOURCE_DIR}/engine/core/vfs/raw/rawdatasource.cpp ${PROJECT_SOURCE_DIR}/engine/core/vfs/zip/zipfilesource.cpp ${PROJECT_SOURCE_DIR}/engine/core/vfs/zip/zipnode.cpp ${PROJECT_SOURCE_DIR}/engine/core/vfs/zip/zipprovider.cpp ${PROJECT_SOURCE_DIR}/engine/core/vfs/zip/zipsource.cpp ${PROJECT_SOURCE_DIR}/engine/core/vfs/zip/ziptree.cpp ${PROJECT_SOURCE_DIR}/engine/core/video/animation.cpp ${PROJECT_SOURCE_DIR}/engine/core/video/animationmanager.cpp ${PROJECT_SOURCE_DIR}/engine/core/video/atlasbook.cpp ${PROJECT_SOURCE_DIR}/engine/core/video/color.cpp ${PROJECT_SOURCE_DIR}/engine/core/video/cursor.cpp ${PROJECT_SOURCE_DIR}/engine/core/video/devicecaps.cpp ${PROJECT_SOURCE_DIR}/engine/core/video/image.cpp ${PROJECT_SOURCE_DIR}/engine/core/video/imagemanager.cpp ${PROJECT_SOURCE_DIR}/engine/core/video/renderbackend.cpp ${PROJECT_SOURCE_DIR}/engine/core/video/fonts/fontbase.cpp ${PROJECT_SOURCE_DIR}/engine/core/video/fonts/imagefontbase.cpp ${PROJECT_SOURCE_DIR}/engine/core/video/fonts/subimagefont.cpp ${PROJECT_SOURCE_DIR}/engine/core/video/fonts/textrenderpool.cpp ${PROJECT_SOURCE_DIR}/engine/core/video/fonts/truetypefont.cpp ${PROJECT_SOURCE_DIR}/engine/core/video/opengl/glimage.cpp ${PROJECT_SOURCE_DIR}/engine/core/video/opengl/renderbackendopengl.cpp ${PROJECT_SOURCE_DIR}/engine/core/video/sdl/renderbackendsdl.cpp ${PROJECT_SOURCE_DIR}/engine/core/video/sdl/sdlblendingfunctions.cpp ${PROJECT_SOURCE_DIR}/engine/core/video/sdl/sdlimage.cpp ${PROJECT_SOURCE_DIR}/engine/core/view/camera.cpp ${PROJECT_SOURCE_DIR}/engine/core/view/layercache.cpp ${PROJECT_SOURCE_DIR}/engine/core/view/rendererbase.cpp ${PROJECT_SOURCE_DIR}/engine/core/view/renderitem.cpp ${PROJECT_SOURCE_DIR}/engine/core/view/visual.cpp ${PROJECT_SOURCE_DIR}/engine/core/view/renderers/blockinginforenderer.cpp ${PROJECT_SOURCE_DIR}/engine/core/view/renderers/cellrenderer.cpp ${PROJECT_SOURCE_DIR}/engine/core/view/renderers/cellselectionrenderer.cpp ${PROJECT_SOURCE_DIR}/engine/core/view/renderers/coordinaterenderer.cpp ${PROJECT_SOURCE_DIR}/engine/core/view/renderers/floatingtextrenderer.cpp ${PROJECT_SOURCE_DIR}/engine/core/view/renderers/genericrenderer.cpp ${PROJECT_SOURCE_DIR}/engine/core/view/renderers/gridrenderer.cpp ${PROJECT_SOURCE_DIR}/engine/core/view/renderers/instancerenderer.cpp ${PROJECT_SOURCE_DIR}/engine/core/view/renderers/lightrenderer.cpp ${PROJECT_SOURCE_DIR}/engine/core/view/renderers/offrenderer.cpp ${PROJECT_SOURCE_DIR}/engine/core/view/renderers/quadtreerenderer.cpp ${PROJECT_SOURCE_DIR}/engine/core/view/renderers/targetrenderer.cpp ${PROJECT_SOURCE_DIR}/engine/core/gui/hybrid/hybridguimanager.cpp ) # CEGUI v0.8.0+ set(FIFE_CEGUI_SRC ${PROJECT_SOURCE_DIR}/engine/core/gui/cegui/ceguimanager.cpp ${PROJECT_SOURCE_DIR}/engine/core/gui/cegui/base/ceguiinputprocessor.cpp ) # FIFECHAN set(FIFE_FCHAN_SRC ${PROJECT_SOURCE_DIR}/engine/core/gui/fifechan/fifechanmanager.cpp ${PROJECT_SOURCE_DIR}/engine/core/gui/fifechan/base/gui_font.cpp ${PROJECT_SOURCE_DIR}/engine/core/gui/fifechan/base/gui_image.cpp ${PROJECT_SOURCE_DIR}/engine/core/gui/fifechan/base/gui_imageloader.cpp ${PROJECT_SOURCE_DIR}/engine/core/gui/fifechan/base/opengl/opengl_gui_graphics.cpp ${PROJECT_SOURCE_DIR}/engine/core/gui/fifechan/base/sdl/sdl_gui_graphics.cpp ${PROJECT_SOURCE_DIR}/engine/core/gui/fifechan/console/commandline.cpp ${PROJECT_SOURCE_DIR}/engine/core/gui/fifechan/console/console.cpp ${PROJECT_SOURCE_DIR}/engine/core/gui/fifechan/util/utf8/utf8stringeditor.cpp ${PROJECT_SOURCE_DIR}/engine/core/gui/fifechan/widgets/animationicon.cpp ${PROJECT_SOURCE_DIR}/engine/core/gui/fifechan/widgets/clicklabel.cpp ${PROJECT_SOURCE_DIR}/engine/core/gui/fifechan/widgets/dockarea.cpp ${PROJECT_SOURCE_DIR}/engine/core/gui/fifechan/widgets/panel.cpp ${PROJECT_SOURCE_DIR}/engine/core/gui/fifechan/widgets/percentagebar.cpp ${PROJECT_SOURCE_DIR}/engine/core/gui/fifechan/widgets/resizablewindow.cpp ) # LIBROCKET set(FIFE_LROCKET_SRC ${PROJECT_SOURCE_DIR}/engine/core/gui/librocket/librocketmanager.cpp ${PROJECT_SOURCE_DIR}/engine/core/gui/librocket/base/librocketinputprocessor.cpp ${PROJECT_SOURCE_DIR}/engine/core/gui/librocket/base/librocketrenderinterface.cpp ) #------------------------------------------------------------------------------ # Source Groups for Source Files #------------------------------------------------------------------------------ source_group("fife.core" FILES ${FIFE_CORE_SRC}) source_group("fife.core.gui.cegui" FILES ${FIFE_CEGUI_SRC}) source_group("fife.core.gui.fifechan" FILES ${FIFE_FCHAN_SRC}) source_group("fife.core.gui.librocket" FILES ${FIFE_LROCKET_SRC}) #------------------------------------------------------------------------------ # Header Files #------------------------------------------------------------------------------ # Core set(FIFE_CORE_HDR ${PROJECT_SOURCE_DIR}/engine/core/export.h ${PROJECT_SOURCE_DIR}/engine/core/modules.h ${PROJECT_SOURCE_DIR}/engine/core/audio/actionaudio.h ${PROJECT_SOURCE_DIR}/engine/core/audio/fife_openal.h ${PROJECT_SOURCE_DIR}/engine/core/audio/soundclip.h ${PROJECT_SOURCE_DIR}/engine/core/audio/soundclipmanager.h ${PROJECT_SOURCE_DIR}/engine/core/audio/soundconfig.h ${PROJECT_SOURCE_DIR}/engine/core/audio/sounddecoder.h ${PROJECT_SOURCE_DIR}/engine/core/audio/soundemitter.h ${PROJECT_SOURCE_DIR}/engine/core/audio/soundmanager.h ${PROJECT_SOURCE_DIR}/engine/core/audio/soundsource.h ${PROJECT_SOURCE_DIR}/engine/core/audio/effects/soundeffect.h ${PROJECT_SOURCE_DIR}/engine/core/audio/effects/soundeffectmanager.h ${PROJECT_SOURCE_DIR}/engine/core/audio/effects/soundfilter.h ${PROJECT_SOURCE_DIR}/engine/core/controller/engine.h ${PROJECT_SOURCE_DIR}/engine/core/controller/enginesettings.h ${PROJECT_SOURCE_DIR}/engine/core/eventchannel/eventmanager.h ${PROJECT_SOURCE_DIR}/engine/core/eventchannel/base/event.h ${PROJECT_SOURCE_DIR}/engine/core/eventchannel/base/ilistener.h ${PROJECT_SOURCE_DIR}/engine/core/eventchannel/base/inputevent.h ${PROJECT_SOURCE_DIR}/engine/core/eventchannel/command/command.h ${PROJECT_SOURCE_DIR}/engine/core/eventchannel/command/commandids.h ${PROJECT_SOURCE_DIR}/engine/core/eventchannel/command/icommandcontroller.h ${PROJECT_SOURCE_DIR}/engine/core/eventchannel/command/icommandlistener.h ${PROJECT_SOURCE_DIR}/engine/core/eventchannel/drop/dropevent.h ${PROJECT_SOURCE_DIR}/engine/core/eventchannel/drop/idropcontroller.h ${PROJECT_SOURCE_DIR}/engine/core/eventchannel/drop/idroplistener.h ${PROJECT_SOURCE_DIR}/engine/core/eventchannel/joystick/ijoystickcontroller.h ${PROJECT_SOURCE_DIR}/engine/core/eventchannel/joystick/ijoysticklistener.h ${PROJECT_SOURCE_DIR}/engine/core/eventchannel/joystick/joystick.h ${PROJECT_SOURCE_DIR}/engine/core/eventchannel/joystick/joystickevent.h ${PROJECT_SOURCE_DIR}/engine/core/eventchannel/joystick/joystickmanager.h ${PROJECT_SOURCE_DIR}/engine/core/eventchannel/key/ikeycontroller.h ${PROJECT_SOURCE_DIR}/engine/core/eventchannel/key/ikeyfilter.h ${PROJECT_SOURCE_DIR}/engine/core/eventchannel/key/ikeylistener.h ${PROJECT_SOURCE_DIR}/engine/core/eventchannel/key/key.h ${PROJECT_SOURCE_DIR}/engine/core/eventchannel/key/keyevent.h ${PROJECT_SOURCE_DIR}/engine/core/eventchannel/mouse/imousecontroller.h ${PROJECT_SOURCE_DIR}/engine/core/eventchannel/mouse/imouselistener.h ${PROJECT_SOURCE_DIR}/engine/core/eventchannel/mouse/mouseevent.h ${PROJECT_SOURCE_DIR}/engine/core/eventchannel/sdl/isdleventcontroller.h ${PROJECT_SOURCE_DIR}/engine/core/eventchannel/sdl/isdleventlistener.h ${PROJECT_SOURCE_DIR}/engine/core/eventchannel/source/eventsourcetypes.h ${PROJECT_SOURCE_DIR}/engine/core/eventchannel/source/ieventsource.h ${PROJECT_SOURCE_DIR}/engine/core/eventchannel/text/itextcontroller.h ${PROJECT_SOURCE_DIR}/engine/core/eventchannel/text/itextlistener.h ${PROJECT_SOURCE_DIR}/engine/core/eventchannel/text/text.h ${PROJECT_SOURCE_DIR}/engine/core/eventchannel/text/textevent.h ${PROJECT_SOURCE_DIR}/engine/core/loaders/native/audio/ogg_loader.h ${PROJECT_SOURCE_DIR}/engine/core/loaders/native/audio/sounddecoder_ogg.h ${PROJECT_SOURCE_DIR}/engine/core/loaders/native/input/controllermappingloader.h ${PROJECT_SOURCE_DIR}/engine/core/loaders/native/map/animationloader.h ${PROJECT_SOURCE_DIR}/engine/core/loaders/native/map/atlasloader.h ${PROJECT_SOURCE_DIR}/engine/core/loaders/native/map/ianimationloader.h ${PROJECT_SOURCE_DIR}/engine/core/loaders/native/map/iatlasloader.h ${PROJECT_SOURCE_DIR}/engine/core/loaders/native/map/imaploader.h ${PROJECT_SOURCE_DIR}/engine/core/loaders/native/map/iobjectloader.h ${PROJECT_SOURCE_DIR}/engine/core/loaders/native/map/maploader.h ${PROJECT_SOURCE_DIR}/engine/core/loaders/native/map/objectloader.h ${PROJECT_SOURCE_DIR}/engine/core/loaders/native/map/percentdonelistener.h ${PROJECT_SOURCE_DIR}/engine/core/loaders/native/video/imageloader.h ${PROJECT_SOURCE_DIR}/engine/core/loaders/native/video/resourceanimationloader.h ${PROJECT_SOURCE_DIR}/engine/core/model/model.h ${PROJECT_SOURCE_DIR}/engine/core/model/metamodel/action.h ${PROJECT_SOURCE_DIR}/engine/core/model/metamodel/ipather.h ${PROJECT_SOURCE_DIR}/engine/core/model/metamodel/ivisual.h ${PROJECT_SOURCE_DIR}/engine/core/model/metamodel/modelcoords.h ${PROJECT_SOURCE_DIR}/engine/core/model/metamodel/object.h ${PROJECT_SOURCE_DIR}/engine/core/model/metamodel/timeprovider.h ${PROJECT_SOURCE_DIR}/engine/core/model/metamodel/grids/cellgrid.h ${PROJECT_SOURCE_DIR}/engine/core/model/metamodel/grids/hexgrid.h ${PROJECT_SOURCE_DIR}/engine/core/model/metamodel/grids/squaregrid.h ${PROJECT_SOURCE_DIR}/engine/core/model/structures/cell.h ${PROJECT_SOURCE_DIR}/engine/core/model/structures/cellcache.h ${PROJECT_SOURCE_DIR}/engine/core/model/structures/instance.h ${PROJECT_SOURCE_DIR}/engine/core/model/structures/instancetree.h ${PROJECT_SOURCE_DIR}/engine/core/model/structures/layer.h ${PROJECT_SOURCE_DIR}/engine/core/model/structures/location.h ${PROJECT_SOURCE_DIR}/engine/core/model/structures/map.h ${PROJECT_SOURCE_DIR}/engine/core/model/structures/renderernode.h ${PROJECT_SOURCE_DIR}/engine/core/model/structures/trigger.h ${PROJECT_SOURCE_DIR}/engine/core/model/structures/triggercontroller.h ${PROJECT_SOURCE_DIR}/engine/core/pathfinder/route.h ${PROJECT_SOURCE_DIR}/engine/core/pathfinder/routepather/multilayersearch.h ${PROJECT_SOURCE_DIR}/engine/core/pathfinder/routepather/routepather.h ${PROJECT_SOURCE_DIR}/engine/core/pathfinder/routepather/routepathersearch.h ${PROJECT_SOURCE_DIR}/engine/core/pathfinder/routepather/singlelayersearch.h ${PROJECT_SOURCE_DIR}/engine/core/savers/native/input/controllermappingsaver.h ${PROJECT_SOURCE_DIR}/engine/core/savers/native/map/ianimationsaver.h ${PROJECT_SOURCE_DIR}/engine/core/savers/native/map/iatlassaver.h ${PROJECT_SOURCE_DIR}/engine/core/savers/native/map/imapsaver.h ${PROJECT_SOURCE_DIR}/engine/core/savers/native/map/iobjectsaver.h ${PROJECT_SOURCE_DIR}/engine/core/savers/native/map/mapsaver.h ${PROJECT_SOURCE_DIR}/engine/core/util/base/exception.h ${PROJECT_SOURCE_DIR}/engine/core/util/base/fifeclass.h ${PROJECT_SOURCE_DIR}/engine/core/util/base/fife_stdint.h ${PROJECT_SOURCE_DIR}/engine/core/util/base/sharedptr.h ${PROJECT_SOURCE_DIR}/engine/core/util/base/singleton.h ${PROJECT_SOURCE_DIR}/engine/core/util/base/stringutils.h ${PROJECT_SOURCE_DIR}/engine/core/util/log/logger.h ${PROJECT_SOURCE_DIR}/engine/core/util/math/angles.h ${PROJECT_SOURCE_DIR}/engine/core/util/math/fife_math.h ${PROJECT_SOURCE_DIR}/engine/core/util/math/matrix.h ${PROJECT_SOURCE_DIR}/engine/core/util/resource/resource.h ${PROJECT_SOURCE_DIR}/engine/core/util/resource/resourcemanager.h ${PROJECT_SOURCE_DIR}/engine/core/util/structures/point.h ${PROJECT_SOURCE_DIR}/engine/core/util/structures/priorityqueue.h ${PROJECT_SOURCE_DIR}/engine/core/util/structures/purge.h ${PROJECT_SOURCE_DIR}/engine/core/util/structures/quadtree.h ${PROJECT_SOURCE_DIR}/engine/core/util/structures/rect.h ${PROJECT_SOURCE_DIR}/engine/core/util/time/timeevent.h ${PROJECT_SOURCE_DIR}/engine/core/util/time/timemanager.h ${PROJECT_SOURCE_DIR}/engine/core/util/time/timer.h ${PROJECT_SOURCE_DIR}/engine/core/util/utf8/utf8.h ${PROJECT_SOURCE_DIR}/engine/core/util/utf8/utf8/checked.h ${PROJECT_SOURCE_DIR}/engine/core/util/utf8/utf8/core.h ${PROJECT_SOURCE_DIR}/engine/core/util/utf8/utf8/unchecked.h ${PROJECT_SOURCE_DIR}/engine/core/vfs/directoryprovider.h ${PROJECT_SOURCE_DIR}/engine/core/vfs/fife_boost_filesystem.h ${PROJECT_SOURCE_DIR}/engine/core/vfs/vfs.h ${PROJECT_SOURCE_DIR}/engine/core/vfs/vfsdirectory.h ${PROJECT_SOURCE_DIR}/engine/core/vfs/vfssource.h ${PROJECT_SOURCE_DIR}/engine/core/vfs/vfssourceprovider.h ${PROJECT_SOURCE_DIR}/engine/core/vfs/dat/dat1.h ${PROJECT_SOURCE_DIR}/engine/core/vfs/dat/dat2.h ${PROJECT_SOURCE_DIR}/engine/core/vfs/dat/lzssdecoder.h ${PROJECT_SOURCE_DIR}/engine/core/vfs/dat/rawdatadat1.h ${PROJECT_SOURCE_DIR}/engine/core/vfs/dat/rawdatadat2.h ${PROJECT_SOURCE_DIR}/engine/core/vfs/raw/rawdata.h ${PROJECT_SOURCE_DIR}/engine/core/vfs/raw/rawdatafile.h ${PROJECT_SOURCE_DIR}/engine/core/vfs/raw/rawdatamemsource.h ${PROJECT_SOURCE_DIR}/engine/core/vfs/raw/rawdatasource.h ${PROJECT_SOURCE_DIR}/engine/core/vfs/zip/zipfilesource.h ${PROJECT_SOURCE_DIR}/engine/core/vfs/zip/zipnode.h ${PROJECT_SOURCE_DIR}/engine/core/vfs/zip/zipprovider.h ${PROJECT_SOURCE_DIR}/engine/core/vfs/zip/zipsource.h ${PROJECT_SOURCE_DIR}/engine/core/vfs/zip/ziptree.h ${PROJECT_SOURCE_DIR}/engine/core/video/animation.h ${PROJECT_SOURCE_DIR}/engine/core/video/animationmanager.h ${PROJECT_SOURCE_DIR}/engine/core/video/atlasbook.h ${PROJECT_SOURCE_DIR}/engine/core/video/color.h ${PROJECT_SOURCE_DIR}/engine/core/video/cursor.h ${PROJECT_SOURCE_DIR}/engine/core/video/devicecaps.h ${PROJECT_SOURCE_DIR}/engine/core/video/image.h ${PROJECT_SOURCE_DIR}/engine/core/video/imagemanager.h ${PROJECT_SOURCE_DIR}/engine/core/video/renderbackend.h ${PROJECT_SOURCE_DIR}/engine/core/video/fonts/fontbase.h ${PROJECT_SOURCE_DIR}/engine/core/video/fonts/ifont.h ${PROJECT_SOURCE_DIR}/engine/core/video/fonts/imagefontbase.h ${PROJECT_SOURCE_DIR}/engine/core/video/fonts/subimagefont.h ${PROJECT_SOURCE_DIR}/engine/core/video/fonts/textrenderpool.h ${PROJECT_SOURCE_DIR}/engine/core/video/fonts/truetypefont.h ${PROJECT_SOURCE_DIR}/engine/core/video/opengl/fife_opengl.h ${PROJECT_SOURCE_DIR}/engine/core/video/opengl/glimage.h ${PROJECT_SOURCE_DIR}/engine/core/video/opengl/renderbackendopengl.h ${PROJECT_SOURCE_DIR}/engine/core/video/sdl/renderbackendsdl.h ${PROJECT_SOURCE_DIR}/engine/core/video/sdl/sdlblendingfunctions.h ${PROJECT_SOURCE_DIR}/engine/core/video/sdl/sdlimage.h ${PROJECT_SOURCE_DIR}/engine/core/view/camera.h ${PROJECT_SOURCE_DIR}/engine/core/view/layercache.h ${PROJECT_SOURCE_DIR}/engine/core/view/rendererbase.h ${PROJECT_SOURCE_DIR}/engine/core/view/renderitem.h ${PROJECT_SOURCE_DIR}/engine/core/view/visual.h ${PROJECT_SOURCE_DIR}/engine/core/view/renderers/blockinginforenderer.h ${PROJECT_SOURCE_DIR}/engine/core/view/renderers/cellrenderer.h ${PROJECT_SOURCE_DIR}/engine/core/view/renderers/cellselectionrenderer.h ${PROJECT_SOURCE_DIR}/engine/core/view/renderers/coordinaterenderer.h ${PROJECT_SOURCE_DIR}/engine/core/view/renderers/floatingtextrenderer.h ${PROJECT_SOURCE_DIR}/engine/core/view/renderers/genericrenderer.h ${PROJECT_SOURCE_DIR}/engine/core/view/renderers/gridrenderer.h ${PROJECT_SOURCE_DIR}/engine/core/view/renderers/instancerenderer.h ${PROJECT_SOURCE_DIR}/engine/core/view/renderers/lightrenderer.h ${PROJECT_SOURCE_DIR}/engine/core/view/renderers/offrenderer.h ${PROJECT_SOURCE_DIR}/engine/core/view/renderers/quadtreerenderer.h ${PROJECT_SOURCE_DIR}/engine/core/view/renderers/targetrenderer.h ${PROJECT_SOURCE_DIR}/engine/core/gui/guimanager.h ${PROJECT_SOURCE_DIR}/engine/core/gui/hybrid/hybridguimanager.h ) # CEGUI set(FIFE_CEGUI_HDR ${PROJECT_SOURCE_DIR}/engine/core/gui/cegui/ceguimanager.h ${PROJECT_SOURCE_DIR}/engine/core/gui/cegui/base/ceguiinputprocessor.h ) # Fifechan set(FIFE_FCHAN_HDR ${PROJECT_SOURCE_DIR}/engine/core/gui/fifechan/fifechanmanager.h ${PROJECT_SOURCE_DIR}/engine/core/gui/fifechan/base/gui_font.h ${PROJECT_SOURCE_DIR}/engine/core/gui/fifechan/base/gui_image.h ${PROJECT_SOURCE_DIR}/engine/core/gui/fifechan/base/gui_imageloader.h ${PROJECT_SOURCE_DIR}/engine/core/gui/fifechan/base/opengl/opengl_gui_graphics.h ${PROJECT_SOURCE_DIR}/engine/core/gui/fifechan/base/sdl/sdl_gui_graphics.h ${PROJECT_SOURCE_DIR}/engine/core/gui/fifechan/console/commandline.h ${PROJECT_SOURCE_DIR}/engine/core/gui/fifechan/console/console.h ${PROJECT_SOURCE_DIR}/engine/core/gui/fifechan/util/utf8/utf8stringeditor.h ${PROJECT_SOURCE_DIR}/engine/core/gui/fifechan/widgets/animationicon.h ${PROJECT_SOURCE_DIR}/engine/core/gui/fifechan/widgets/clicklabel.h ${PROJECT_SOURCE_DIR}/engine/core/gui/fifechan/widgets/dockarea.h ${PROJECT_SOURCE_DIR}/engine/core/gui/fifechan/widgets/panel.h ${PROJECT_SOURCE_DIR}/engine/core/gui/fifechan/widgets/percentagebar.h ${PROJECT_SOURCE_DIR}/engine/core/gui/fifechan/widgets/resizablewindow.h ) # Librocket set(FIFE_LROCKET_HDR ${PROJECT_SOURCE_DIR}/engine/core/gui/librocket/librocketmanager.h ${PROJECT_SOURCE_DIR}/engine/core/gui/librocket/base/librocketinputprocessor.h ${PROJECT_SOURCE_DIR}/engine/core/gui/librocket/base/librocketrenderinterface.h ) #------------------------------------------------------------------------------ # Source Groups for Header Files #------------------------------------------------------------------------------ source_group("fife.core" FILES ${FIFE_CORE_HDR}) source_group("fife.core.gui.cegui" FILES ${FIFE_CEGUI_HDR}) source_group("fife.core.gui.fifechan" FILES ${FIFE_FCHAN_HDR}) source_group("fife.core.gui.librocket" FILES ${FIFE_LROCKET_HDR}) add_custom_target(fife.headers SOURCES ${FIFE_CORE_HDR} ${FIFE_CEGUI_HDR} ${FIFE_FCHAN_HDR} ${FIFE_LROCKET_HDR}) #------------------------------------------------------------------------------ # SWIG Files #------------------------------------------------------------------------------ # Core set(FIFE_CORE_SWIG version.i audio/effects/soundeffect.i audio/effects/soundfilter.i audio/soundclip.i audio/soundclipmanager.i audio/soundemitter.i audio/soundmanager.i controller/engine.i eventchannel/eventchannel.i loaders/native/map/ianimationloader.i loaders/native/map/iatlasloader.i loaders/native/map/imaploader.i loaders/native/map/iobjectloader.i loaders/native/map/maploader.i loaders/native/map/percentdonelistener.i model/metamodel/action.i model/metamodel/ipather.i model/metamodel/ivisual.i model/metamodel/modelcoords.i model/metamodel/object.i model/metamodel/timeprovider.i model/metamodel/grids/cellgrids.i model/structures/cell.i model/structures/cellcache.i model/structures/instance.i model/structures/layer.i model/structures/location.i model/structures/map.i model/structures/renderernode.i model/structures/trigger.i model/model.i pathfinder/route.i pathfinder/routepather/routepather.i savers/native/map/ianimationsaver.i savers/native/map/iatlassaver.i savers/native/map/imapsaver.i savers/native/map/iobjectsaver.i savers/native/map/mapsaver.i util/base/utilbase.i util/log/logger.i util/math/math.i util/resource/resource.i util/structures/utilstructures.i util/time/timeevent.i util/time/timemanager.i vfs/vfs.i vfs/raw/rawdata.i video/video.i video/fonts/fonts.i view/camera.i view/rendererbase.i view/visual.i view/renderers/blockinginforenderer.i view/renderers/cellrenderer.i view/renderers/cellselectionrenderer.i view/renderers/coordinaterenderer.i view/renderers/floatingtextrenderer.i view/renderers/genericrenderer.i view/renderers/gridrenderer.i view/renderers/instancerenderer.i view/renderers/lightrenderer.i view/renderers/offrenderer.i view/renderers/targetrenderer.i gui/guimanager.i gui/hybrid/hybridguimanager.i ) # CEGUI set(FIFE_CEGUI_SWIG gui/cegui/ceguimanager.i ) # FIFECHAN set(FIFE_FCHAN_SWIG_LIB gui/fifechan/lib/fifechanlistener.i gui/fifechan/lib/widgets.i ) set(FIFE_FCHAN_SWIG gui/fifechan/base/gui_font.i gui/fifechan/base/gui_image.i gui/fifechan/console/console.i gui/fifechan/fifechanmanager.i gui/fifechan/widgets/widgets.i ) # LIBROCKET set(FIFE_LROCKET_SWIG gui/librocket/librocketmanager.i ) #------------------------------------------------------------------------------ # Source Groups for SWIG Files #------------------------------------------------------------------------------ source_group("fife.core" FILES ${FIFE_CORE_SWIG}) source_group("fife.core.gui.cegui" FILES ${FIFE_CEGUI_SWIG}) source_group("fife.core.gui.fifechan.lib" FILES ${FIFE_FCHAN_SWIG_LIB}) source_group("fife.core.gui.fifechan" FILES ${FIFE_FCHAN_SWIG}) source_group("fife.core.gui.librocket" FILES ${FIFE_LROCKET_SWIG}) # TODO some files for this source_group are not found #add_custom_target(fife.swig SOURCES ${FIFE_CORE_SWIG} ${FIFE_CEGUI_SWIG} ${FIFE_FCHAN_SWIG_LIB} ${FIFE_FCHAN_SWIG} ${FIFE_LROCKET_SWIG}) #------------------------------------------------------------------------------ # SWIG WRAPPER Files #------------------------------------------------------------------------------ # SWIG WRAPPERS FOR PYTHON SET(FIFE_SWIGWRAPPERS_PYTHON ${PROJECT_SOURCE_DIR}/engine/swigwrappers/python/extensions.i.templ ${PROJECT_SOURCE_DIR}/engine/swigwrappers/python/fife.i.templ ${PROJECT_SOURCE_DIR}/engine/swigwrappers/python/fife.i.templ.cm ${PROJECT_SOURCE_DIR}/engine/swigwrappers/python/fifechan.i.templ ${PROJECT_SOURCE_DIR}/engine/swigwrappers/python/fifechan.i.templ.cm ${PROJECT_SOURCE_DIR}/engine/swigwrappers/python/librocket.i.templ ) #------------------------------------------------------------------------------ # Source Groups for SWIG WRAPPER Files #------------------------------------------------------------------------------ source_group("fife.swigwrappers.python" FILES ${FIFE_SWIGWRAPPERS_PYTHON}) add_custom_target(fife.swig-wrappers SOURCES ${FIFE_SWIGWRAPPERS_PYTHON}) #------------------------------------------------------------------------------ # Find Packages #------------------------------------------------------------------------------ find_package(SDL2 REQUIRED) find_package(SDL2_image REQUIRED) find_package(SDL2_ttf REQUIRED) find_package(Boost 1.33.1 COMPONENTS system filesystem) find_package(PNG REQUIRED) find_package(OpenALSoft REQUIRED) find_package(TinyXML REQUIRED) find_package(OGG REQUIRED) find_package(VORBIS REQUIRED) if(opengl) find_package(OpenGL REQUIRED) include_directories(${OPENGL_INCLUDE_DIR}) find_package(GLEW REQUIRED) include_directories(${GLEW_INCLUDE_DIR}) endif(opengl) if(cegui) find_package(CEGUI REQUIRED) if(NOT CEGUI_OpenGLRenderer_FOUND) message(FATAL_ERROR "FIFE needs CEGUI with the OpenGLRenderer enabled.") endif(NOT CEGUI_OpenGLRenderer_FOUND) if(NOT opengl) message(FATAL_ERROR "OpenGL cannot be disabled, when CEGUI is enabled.") endif(NOT opengl) include_directories(${CEGUI_INCLUDE_DIR}) message("Using CEGUI v0.8+") set(CEGUI TRUE) set(FIFE_CORE_SRC ${FIFE_CORE_SRC} ${FIFE_CEGUI_SRC}) endif(cegui) if(build-python) # Setting up SWIG files set(SWIG_MODULE_fife_EXTRA_DEPS) set(CMAKE_SWIG_IMPORTS "") set(CMAKE_SWIG_INCLUSIONS "") set(CMAKE_SWIG_IMPORTS_FCHAN "") set(CMAKE_SWIG_INCLUSIONS_FCHAN "") # Find python library and add include path for python headers find_package (PythonInterp) set(PYTHON_LIBRARY "PYTHON_LIBRARY-NOTFOUND") set(PYTHON_INCLUDE_DIR "PYTHON_INCLUDE_DIR-NOTFOUND") find_package (PythonLibs) foreach(filename ${FIFE_CORE_SWIG}) list(APPEND SWIG_MODULE_fife_EXTRA_DEPS "${PROJECT_SOURCE_DIR}/engine/core/${filename}") set(CMAKE_SWIG_INCLUSIONS "${CMAKE_SWIG_INCLUSIONS}%include ${filename}\n") endforeach(filename ${FIFE_CORE_SWIG}) endif(build-python) if(fifechan) find_package(FifeChan COMPONENTS sdl REQUIRED) if(opengl) find_package(FifeChan COMPONENTS opengl REQUIRED) endif(opengl) if(build-python) set(SWIG_MODULE_fifechan_EXTRA_DEPS) foreach(filename ${FIFE_FCHAN_SWIG_LIB}) list(APPEND SWIG_MODULE_fife_EXTRA_DEPS "${PROJECT_SOURCE_DIR}/engine/core/${filename}") list(APPEND SWIG_MODULE_fifechan_EXTRA_DEPS "${PROJECT_SOURCE_DIR}/engine/core/${filename}") set(CMAKE_SWIG_INCLUSIONS_FCHAN "${CMAKE_SWIG_INCLUSIONS_FCHAN}%include ${filename}\n") endforeach(filename ${FIFE_FCHAN_SWIG_LIB}) foreach(filename ${FIFE_FCHAN_SWIG}) list(APPEND SWIG_MODULE_fife_EXTRA_DEPS "${PROJECT_SOURCE_DIR}/engine/core/${filename}") list(APPEND SWIG_MODULE_fifechan_EXTRA_DEPS "${PROJECT_SOURCE_DIR}/engine/core/${filename}") set(CMAKE_SWIG_INCLUSIONS "${CMAKE_SWIG_INCLUSIONS}%include ${filename}\n") endforeach(filename ${FIFE_FCHAN_SWIG}) if (PYTHON_VERSION_MAJOR LESS 3) set(CMAKE_SWIG_IMPORTS "${CMAKE_SWIG_IMPORTS}%import ${PROJECT_BINARY_DIR}/fifechan.i") else (PYTHON_VERSION_MAJOR LESS 3) set(CMAKE_SWIG_IMPORTS "${CMAKE_SWIG_IMPORTS}%import(module=\"fife.fifechan\") ${PROJECT_BINARY_DIR}/fifechan.i") endif (PYTHON_VERSION_MAJOR LESS 3) configure_file( "${PROJECT_SOURCE_DIR}/engine/swigwrappers/python/fifechan.i.templ.cm" "${PROJECT_BINARY_DIR}/fifechan.i" ) endif(build-python) include_directories(${FIFECHAN_INCLUDE_DIR}) endif(fifechan) if(cegui) if(build-python) foreach(filename ${FIFE_CEGUI_SWIG}) list(APPEND SWIG_MODULE_fife_EXTRA_DEPS "${PROJECT_SOURCE_DIR}/engine/core/${filename}") set(CMAKE_SWIG_INCLUSIONS "${CMAKE_SWIG_INCLUSIONS}%include ${filename}\n") endforeach(filename ${FIFE_CEGUI_SWIG}) endif(build-python) endif(cegui) if(build-python) configure_file( "${PROJECT_SOURCE_DIR}/engine/swigwrappers/python/fife.i.templ.cm" "${PROJECT_BINARY_DIR}/fife.i" ) # find SWIG find_package(SWIG REQUIRED) # protect user from working with Swig v3.0.8, which is broken if("${SWIG_VERSION}" VERSION_EQUAL "3.0.8") message(FATAL_ERROR "You are using SWIG v3.0.8.\n This version doesn't work with fifengine.\n Please upgrade SWIG.") endif() # include the use swig file include(${SWIG_USE_FILE}) endif(build-python) include_directories(${SDL2_INCLUDE_DIR} ${SDL2_IMAGE_INCLUDE_DIR} ${SDL2_TTF_INCLUDE_DIR}) include_directories(${Boost_INCLUDE_DIRS}) include_directories(${PNG_INCLUDE_DIRS}) include_directories(${OPENALSOFT_INCLUDE_DIR}) include_directories(${OGG_INCLUDE_DIRS}) include_directories(${VORBIS_INCLUDE_DIRS}) include_directories(${TinyXML_INCLUDE_DIRS}) add_definitions(${PNG_DEFINITIONS}) add_definitions(${Boost_LIB_DIAGNOSTIC_DEFINITIONS}) #------------------------------------------------------------------------------ # Build fifengine as a Python extension module #------------------------------------------------------------------------------ if(build-python) # Find python library and add include path for python headers find_package (PythonInterp) set(PYTHON_LIBRARY "PYTHON_LIBRARY-NOTFOUND") set(PYTHON_INCLUDE_DIR "PYTHON_INCLUDE_DIR-NOTFOUND") find_package(PythonLibs ${PYTHON_VERSION_STRING} EXACT) include_directories(${PYTHON_INCLUDE_PATH}) set(CMAKE_SWIG_FLAGS -modern -fastdispatch -dirvtable -nosafecstrings -noproxydel -fastproxy -fastinit -fastunpack -fastquery -modernargs -nobuildnone -keyword -w511 -w473 -w404 -w314) set_source_files_properties("${PROJECT_BINARY_DIR}/fife.i" PROPERTIES CPLUSPLUS ON) set(FIFE_SOURCES ${FIFE_CORE_SRC}) if(fifechan) set(FIFE_SOURCES ${FIFE_SOURCES} ${FIFE_FCHAN_SRC}) endif(fifechan) # CMake 3.8: swig_add_module is deprecated, use swig_add_library instead. if(${CMAKE_VERSION} VERSION_LESS 3.8) swig_add_module(fife python "${PROJECT_BINARY_DIR}/fife.i" ${FIFE_SOURCES}) else(${CMAKE_VERSION} VERSION_LESS 3.8) swig_add_library(fife LANGUAGE python SOURCES "${PROJECT_BINARY_DIR}/fife.i" ${FIFE_SOURCES}) endif(${CMAKE_VERSION} VERSION_LESS 3.8) if(APPLE) set(APPLE_DYNAMIC_LOOKUP_FLAG "-undefined dynamic_lookup") swig_link_libraries(fife ${APPLE_DYNAMIC_LOOKUP_FLAG} ) else(APPLE) swig_link_libraries(fife ${PYTHON_LIBRARIES}) endif(APPLE) swig_link_libraries(fife ${SDL2_LIBRARY} ${SDL2_IMAGE_LIBRARIES} ${SDL2_TTF_LIBRARIES} ${OPENALSOFT_LIBRARY}) swig_link_libraries(fife ${Boost_LIBRARIES}) swig_link_libraries(fife ${PNG_LIBRARIES}) swig_link_libraries(fife ${VORBISFILE_LIBRARY}) swig_link_libraries(fife ${VORBIS_LIBRARY}) swig_link_libraries(fife ${OGG_LIBRARIES}) swig_link_libraries(fife ${TinyXML_LIBRARIES}) if(opengl) swig_link_libraries(fife ${OPENGL_gl_LIBRARY}) swig_link_libraries(fife ${GLEW_LIBRARY}) endif(opengl) if(fifechan) set_source_files_properties("${PROJECT_BINARY_DIR}/fifechan.i" PROPERTIES CPLUSPLUS ON) # CMake 3.8: swig_add_module is deprecated, use swig_add_library instead. if(${CMAKE_VERSION} VERSION_LESS 3.8) swig_add_module(fifechan python "${PROJECT_BINARY_DIR}/fifechan.i") else(${CMAKE_VERSION} VERSION_LESS 3.8) swig_add_library(fifechan LANGUAGE python SOURCES "${PROJECT_BINARY_DIR}/fifechan.i") endif(${CMAKE_VERSION} VERSION_LESS 3.8) if(APPLE) swig_link_libraries(fifechan ${APPLE_DYNAMIC_LOOKUP_FLAG}) else(APPLE) swig_link_libraries(fifechan ${PYTHON_LIBRARIES}) endif(APPLE) swig_link_libraries(fifechan ${FIFECHAN_LIBRARIES}) swig_link_libraries(fife ${FIFECHAN_LIBRARIES}) endif(fifechan) if(cegui) swig_link_libraries(fife ${CEGUI_LIBRARIES}) swig_link_libraries(fife ${CEGUI_OpenGLRenderer_LIBRARIES}) endif(cegui) #--------------------------------------------------------------------------------- # Install Python package locally, e.g. into "C:\Python27\Lib\site-packages\fife" #--------------------------------------------------------------------------------- if(NOT DEFINED PYTHON_SITE_PACKAGES) # get path to your local python site packages folder execute_process( COMMAND ${PYTHON_EXECUTABLE} -c "import sys; from distutils.sysconfig import get_python_lib; sys.stdout.write(get_python_lib(True))" OUTPUT_VARIABLE PYTHON_SITE_PACKAGES ) # Slash-Fix: Cmake would create a warning, when using the variable in FILES or DIRECTORY without changing it. file(TO_CMAKE_PATH ${PYTHON_SITE_PACKAGES} PYTHON_SITE_PACKAGES) endif(NOT DEFINED PYTHON_SITE_PACKAGES) message(STATUS " Python install directory is '${PYTHON_SITE_PACKAGES}/fife'.") # install pythonized fife install(TARGETS _fife DESTINATION ${PYTHON_SITE_PACKAGES}/fife) install(FILES ${PROJECT_BINARY_DIR}/fife.py DESTINATION ${PYTHON_SITE_PACKAGES}/fife) install(FILES ${CMAKE_SOURCE_DIR}/engine/python/fife/__init__.py DESTINATION ${PYTHON_SITE_PACKAGES}/fife) # copy all files/folders from the extension folder # but exclude extension folders of the optional dependencies: cegui, librocket, pychan install(DIRECTORY ${CMAKE_SOURCE_DIR}/engine/python/fife/extensions/ DESTINATION ${PYTHON_SITE_PACKAGES}/fife/extensions PATTERN "extensions/cegui" EXCLUDE PATTERN "extensions/librocket" EXCLUDE PATTERN "extensions/pychan" EXCLUDE PATTERN "extensions/*" ) if(cegui) # install fife's extension for cegui install(DIRECTORY ${CMAKE_SOURCE_DIR}/engine/python/fife/extensions/cegui/ DESTINATION ${PYTHON_SITE_PACKAGES}/fife/extensions/cegui) endif(cegui) if(librocket) # install fife's extension for librocket install(DIRECTORY ${CMAKE_SOURCE_DIR}/engine/python/fife/extensions/librocket/ DESTINATION ${PYTHON_SITE_PACKAGES}/fife/extensions/librocket) endif(librocket) if(fifechan) # install pychan - fife's extension for fifechan install(DIRECTORY ${CMAKE_SOURCE_DIR}/engine/python/fife/extensions/pychan/ DESTINATION ${PYTHON_SITE_PACKAGES}/fife/extensions/pychan) # install pythonized fifechan install(TARGETS _fifechan DESTINATION ${PYTHON_SITE_PACKAGES}/fife) install(FILES ${PROJECT_BINARY_DIR}/fifechan.py DESTINATION ${PYTHON_SITE_PACKAGES}/fife) endif(fifechan) endif(build-python) #------------------------------------------------------------------------------ # Build fifengine as a library #------------------------------------------------------------------------------ if(build-library) set(FIFE_SOURCES ${FIFE_CORE_SRC}) if(fifechan) set(FIFE_SOURCES ${FIFE_SOURCES} ${FIFE_FCHAN_SRC}) endif(fifechan) add_library(fife ${FIFE_SOURCES}) set_target_properties(fife PROPERTIES SOVERSION ${FIFE_VERSION}) target_link_libraries(fife ${SDL2_LIBRARY} ${SDL2_IMAGE_LIBRARIES} ${SDL2_TTF_LIBRARIES} ${OPENALSOFT_LIBRARY}) target_link_libraries(fife ${Boost_LIBRARIES}) target_link_libraries(fife ${PNG_LIBRARIES}) target_link_libraries(fife ${VORBISFILE_LIBRARY}) target_link_libraries(fife ${VORBIS_LIBRARY}) target_link_libraries(fife ${OGG_LIBRARIES}) target_link_libraries(fife ${TinyXML_LIBRARIES}) if(opengl) target_link_libraries(fife ${OPENGL_gl_LIBRARY}) target_link_libraries(fife ${GLEW_LIBRARY}) endif(opengl) if(fifechan) target_link_libraries(fife ${FIFECHAN_LIBRARIES}) endif(fifechan) if(cegui) target_link_libraries(fife ${CEGUI_LIBRARIES}) target_link_libraries(fife ${CEGUI_OpenGLRenderer_LIBRARIES}) endif(cegui) # include support for GNU / multiarch path names # https://www.gnu.org/prep/standards/html_node/Directory-Variables.html include(GNUInstallDirs) install(TARGETS fife DESTINATION ${CMAKE_INSTALL_LIBDIR}) install(FILES ${PROJECT_SOURCE_DIR}/engine/core/version.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/fife/core/) MACRO(INSTALL_HEADERS_WITH_DIRECTORY HEADER_LIST) FOREACH(HEADER ${${HEADER_LIST}}) get_filename_component(DIR ${HEADER} DIRECTORY) string(REPLACE ${CMAKE_CURRENT_LIST_DIR}/engine "" DIR ${DIR}) INSTALL(FILES ${HEADER} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/fife/${DIR}) ENDFOREACH(HEADER) ENDMACRO(INSTALL_HEADERS_WITH_DIRECTORY) INSTALL_HEADERS_WITH_DIRECTORY(FIFE_CORE_HDR) if(fifechan) INSTALL_HEADERS_WITH_DIRECTORY(FIFE_FCHAN_HDR) endif(fifechan) if(cegui) INSTALL_HEADERS_WITH_DIRECTORY(FIFE_CEGUI_HDR) endif(cegui) if(librocket) INSTALL_HEADERS_WITH_DIRECTORY(FIFE_LROCKET_HDR) endif(librocket) endif(build-library) fifengine-0.4.2/LICENSE.md000066400000000000000000000636421341615052600150710ustar00rootroot00000000000000 GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! fifengine-0.4.2/README.md000066400000000000000000000147711341615052600147430ustar00rootroot00000000000000![FIFE LOGO](https://raw.githubusercontent.com/fifengine/fifengine/master/doc/logo/FIFE_small_c3.png) # FIFE Flexible Isometric Free Engine (FIFE) is a multi-platform isometric game engine written in C++. It comes with Python bindings allowing users to create games using Python as well as C++. The engine is extendable and enables you to add any feature you can imagine to your project. | [Website](http://fifengine.net/) | [![#fife on Freenode](https://img.shields.io/badge/freenode-%23fife-green.svg)](https://webchat.freenode.net/?channels=fife) | [Changelog](https://github.com/fifengine/fifengine/blob/master/CHANGELOG.md) | [Releases](https://github.com/fifengine/fifengine/releases) | [Source Code (zip)](https://github.com/fifengine/fifengine/archive/master.zip) | |:--------:|:--------:|:--------:|:--------:|:--------:| | Continuous Integration | Linux | Mac | Windows | |:----------------------:|:-----:|:--------:|:-------:| | **Build Status** | [![Travis Build status](https://travis-ci.org/fifengine/fifengine.svg?branch=master)](https://travis-ci.org/fifengine/fifengine) | [![Travis Build status](https://travis-ci.org/fifengine/fifengine.svg?branch=master)](https://travis-ci.org/fifengine/fifengine) | [![Appveyor Build status](https://ci.appveyor.com/api/projects/status/github/fifengine/fifengine?branch=master&svg=true)](https://ci.appveyor.com/project/LinuxDonald/fifengine) | | **Development Releases** | - | - | [All artifacts](https://ci.appveyor.com/project/LinuxDonald/fifengine/build/artifacts) | | **Documentations** | | | | |:----------------------:|:----------------:|:-------:|:----------:| | [Overview](https://fifengine.github.io/fifengine-docs/) | [Developer Manual](https://fifengine.github.io/fifengine-docs/developer-manual/en/) | [C++ API](http://www.fifengine.net/doxygen) | [Python API](http://www.fifengine.net/epydoc) | Fifengine is also already available from the following package repositories: [![Packaging status](https://repology.org/badge/vertical-allrepos/fife.svg)](https://repology.org/metapackage/fife) # Table of contents 1. [Features](#1-features) 2. [License](#2-license) 3. [Tests](#3-tests) 4. [Python Demos](#4-python-demos) 6. [Python Tutorials](#5-python-tutorials) 5. [C++ Tutorials](#6-c-tutorials) 7. [Troubleshooting](#7-troubleshooting) 8. [Feedback](#8-feedback) ## 1) Features A [complete list of the features](https://fifengine.github.io/fifengine-docs/user-manual/en/#_features) that FIFE offers can be found in the user-manual. ## 2) License - The source code (*.cpp, *.h & *.py) is licensed under [LGPL v2.1 or newer](http://www.gnu.org/licenses/lgpl-2.1.html). - Files in /engine/core/util/utf8/ are under BSL license - Content was taken from a lot a lot of different 3rd party sources. Therefore each client directory comes with a separate LICENSE file that states the origin of the content, the author and the actual license it was published under. ## 3) Tests The test tool can be found within the `/tests/fife_test` directory. You can launch it by running `run.py`. Open the console with `F10`. To run a test enter `run` and the test name like `PathfinderTest`. ## 4) Python Demos ### [Editor](https://github.com/fifengine/fifengine-editor) The Python based editor tool can be found within the [fifengine-editor repo](https://github.com/fifengine/fifengine-editor). You can launch it by running `run.py`. It is used to edit map files for the [Rio De Hola demo](https://github.com/fifengine/fifengine-demos/tree/master/rio_de_hola). Other clients extend it and use it to edit their maps. ### [Rio De Hola](https://github.com/fifengine/fifengine-demos/tree/master/rio_de_hola) Rio de hola is a technology demo showing off many of the FIFE features. It is located in the `rio_de_hola` directory and can be launched by running `run.py`. Once started as an example game, it's now a playground for developers to test their code. It serves as a good starting point for own game developments. ### [Shooter](https://github.com/fifengine/fifengine-demos/tree/master/shooter) The Shooter demo was an attempt to show the versatility and flexibility of FIFE. It is a simple side scrolling shooter that has a main menu, one level and an end boss. Try your luck and see if you can defeat the boss! ### [PyChan](https://github.com/fifengine/fifengine-demos/tree/master/pychan_demo) There is an example client residing in `pychan_demo` that shows how the pychan GUI library works. You may start the GUI demo application by running `pychan_demo.py`. ### Configuring the Editor and Demos The engine utilizes special settings files for configuring FIFE. This file is called `settings.xml` and resides in the `~/.fife` directory (in `\Application Data\fife` for Windows users). The Shooter Demo and the PyChan demo are exceptions. They both store their `settings.xml` file in their root directories. NOTE that the `settings.xml` file is auto generated and wont be there until you run the demos for the first time. FIFE automatically fills the settings file with default values. You find more information on [FIFE settings in the Developer-Manual](https://fifengine.github.io/fifengine-docs/developer-manual/en/#_engine_settings). ## 5) [Python Tutorials](https://github.com/fifengine/python-tutorials) Our Python tutorials demonstrate how to use the engine when working with Python. ## 6) [C++ Tutorials](https://github.com/fifengine/cpp-tutorials) There is also a set of C++ tutorials demonstrating the usage of the engine, when working with C++. ## 7) Troubleshooting ### Video Card/Driver Issues There are some known driver/card combinations that exhibit some problems with FIFE. Users have reported seeing blank screens or fuzzy images. If this is happening to you please report it on our [issue tracker](https://github.com/fifengine/fifengine/issues). Please include your Card/Driver/OS information in your post. Currently the fix is to modify your `settings.xml` file and set both GLUseFramebuffer and GLUseNPOT to `False` (they are `True` by default). ### Audio Win32 users tend to suffer from problems with the OpenAL drivers. If you don't hear sound while running a FIFE client, run `oalinst.exe` that ships with the Win32 FIFE Development Kit. This is the latest OpenAL driver for Win32. ## 8) Feedback We appreciate every kind of feedback concerning the release, the project in general and the bundled techdemo. Feedback is a great way to help us to improve FIFE. If you would like to get in contact with us and provide feedback you can either visit our IRC channel: #fife on freenode.net. fifengine-0.4.2/appveyor.yml000066400000000000000000000156711341615052600160540ustar00rootroot00000000000000# Build worker image (VM template) image: Visual Studio 2017 clone_depth: 5 version: '{build}' platform: - x86 configuration: - Release #- Debug environment: MSBUILD_FLAGS: /verbosity:minimal /maxcpucount matrix: # VS 15 + Py2.7 - generator: "Visual Studio 15" PYTHON: "C:\\Python27" PYTHON_VERSION: "2.7" # VS 15 + Py3.5 #- generator: "Visual Studio 15" # PYTHON: "C:\\Python35" # PYTHON_VERSION: "3.5" # VS 15 + Py3.6 - generator: "Visual Studio 15" PYTHON: "C:\\Python36" PYTHON_VERSION: "3.6" # MinGW #- generator: "MinGW Makefiles" matrix: fast_finish: true cache: # - C:\projects\fifengine-dependencies # - C:\projects\fifengine-dependencies\downloads # - C:\projects\fifengine-dependencies\includes # scripts that are called at very beginning, before repo cloning init: #- ps: iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) - date /T & time /T - git config --global core.autocrlf input - cmake --version # Set "build version number" to "short-commit-hash" or when tagged to "tag name" (Travis style) - ps: >- if ($env:APPVEYOR_REPO_TAG -eq "true") { Update-AppveyorBuild -Version "$env:APPVEYOR_REPO_TAG_NAME" } else { Update-AppveyorBuild -Version "dev-$($env:APPVEYOR_REPO_COMMIT.substring(0,7))" } # There are multiple pre-installed versions of Python on Appveyor # see https://www.appveyor.com/docs/installed-software/#python - echo %PYTHON% %PYTHON_VERSION% - "SET PATH=%PYTHON%;%PYTHON%\\bin;%PYTHON%\\Scripts;%PATH%" # Show version and architecture for Python - "%PYTHON%\\python.exe --version" - "%PYTHON%\\python.exe -c \"import struct; print(struct.calcsize('P') * 8)\"" install: # set path to boost according to compiler toolchain - if "%generator%" == "Visual Studio 15" (SET boost_root=C:\Libraries\boost_1_67_0) - if "%generator%" == "Visual Studio 15" (SET boost_librarydir=C:\Libraries\boost_1_67_0\lib32-msvc-14.1) # get dependencies - cmake dependencies -G "%generator%" -B../fifengine-dependencies/build - cmake --build ../fifengine-dependencies/build --target ALL_BUILD --config %configuration% - ps: .$env:APPVEYOR_BUILD_FOLDER\build\appveyor\dl_extract_cegui-sdk.ps1 # show dependency folders - dir ..\fifengine-dependencies - dir ..\fifengine-dependencies\downloads - dir ..\fifengine-dependencies\includes /s #before_build: # git sh.exe conflicts with MinGW makefiles #- if "%generator%"=="MinGW Makefiles" (set "PATH=%PATH:C:\Program Files\Git\usr\bin;=%") build_script: - dir # create folder for an out-of-source-tree build: "c:\projects\build" - cd.. - mkdir build - cd build # generate build script - SHARED LIB - > cmake ..\fifengine -G "%generator%" -DCMAKE_BUILD_TYPE=%configuration% -DCMAKE_INSTALL_PREFIX="c:/fife/install" -DBOOST_ROOT="%boost_root%" -DBOOST_LIBRARYDIR="%boost_librarydir%" -Dbuild-library=ON -DBUILD_SHARED_LIBS=ON -DCEGUI=ON # build - cmake --build . --target ALL_BUILD --config %configuration% -- /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" # install - cmake --build . --target INSTALL --config %configuration% # generate build script - STATIC LIB - > cmake ..\fifengine -G "%generator%" -DCMAKE_BUILD_TYPE=%configuration% -DCMAKE_INSTALL_PREFIX="c:/fife/install" -DBOOST_ROOT="%boost_root%" -DBOOST_LIBRARYDIR="%boost_librarydir%" -Dbuild-library=ON -DBUILD_SHARED_LIBS=OFF -DCEGUI=ON # build - cmake --build . --target ALL_BUILD --config %configuration% -- /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" # install - cmake --build . --target INSTALL --config %configuration% after_build: - dir C:\projects\build\Release /s - if "%generator%"=="Visual Studio 15" (set COMPILER="VC15") #- if "%generator%"=="MinGW Makefiles" (set COMPILER="MinGW") # package dependencies artifact - call %APPVEYOR_BUILD_FOLDER%\build\appveyor\copy-boost-to-includes.bat - cd C:\projects\fifengine-dependencies\includes - 7z a -tzip -mx9 "%APPVEYOR_BUILD_FOLDER%\libfife-dependencies-%APPVEYOR_BUILD_VERSION%-%COMPILER%-%platform%.zip" - appveyor PushArtifact "%APPVEYOR_BUILD_FOLDER%\libfife-dependencies-%APPVEYOR_BUILD_VERSION%-%COMPILER%-%platform%.zip" # package libfife artifact - cd c:\fife\install - 7z a -tzip -mx9 "%APPVEYOR_BUILD_FOLDER%\libfife-%APPVEYOR_BUILD_VERSION%-%COMPILER%-%platform%.zip" - appveyor PushArtifact "%APPVEYOR_BUILD_FOLDER%\libfife-%APPVEYOR_BUILD_VERSION%-%COMPILER%-%platform%.zip" # package Python Installer artifact #PyCEGUI installs its dlls itself - ps: copy-item "C:\projects\build\*.py" "$env:APPVEYOR_BUILD_FOLDER\engine\python\fife\" -force -recurse -Confirm:$False - ps: copy-item "C:\projects\build\Release\*.*" "$env:APPVEYOR_BUILD_FOLDER\engine\python\fife\" -force -recurse -Confirm:$False - ps: copy-item "C:\projects\fifengine-dependencies\includes\bin\*.dll" "$env:APPVEYOR_BUILD_FOLDER\engine\python\fife\" -force -recurse -Confirm:$False -Exclude $global:dll_excludes - ps: copy-item "C:\projects\fifengine-dependencies\includes\lib\x86\*.dll" "$env:APPVEYOR_BUILD_FOLDER\engine\python\fife\" -force -recurse -Confirm:$False - cd %APPVEYOR_BUILD_FOLDER% - python setup.py set_metadata --version=0.4.2 bdist_msi --target-version="%PYTHON_VERSION%" - python setup.py set_metadata --version=0.4.2 bdist_dumb --format=zip - dir %APPVEYOR_BUILD_FOLDER%\dist - appveyor PushArtifact "%APPVEYOR_BUILD_FOLDER%\dist\libfife-0.4.2.win32-py%PYTHON_VERSION%.msi" - appveyor PushArtifact "%APPVEYOR_BUILD_FOLDER%\dist\libfife-0.4.2.win32.zip" - dir C:\projects\build /s - dir "%APPVEYOR_BUILD_FOLDER%\engine\python\fife\" /s artifacts: - path: 'libfife-dependencies-*.zip' name: Dependencies - path: 'libfife-*.zip' name: LibFife - path: 'dist\libfife-*py%PYTHON_VERSION%.msi' name: Python%PYTHON_VERSION%Installer - path: 'dist\libfife-0.4.2.win32.zip' name: Python%PYTHON_VERSION%-zip # deploy to Github Releases on tag push deploy: provider: GitHub release: 'Fifengine $(APPVEYOR_REPO_TAG_NAME)' tag: $(APPVEYOR_REPO_TAG_NAME) description: '[**Changelog**](https://github.com/fifengine/fifengine/blob/master/CHANGELOG.md)' artifact: Dependencies, LibFife, Python%PYTHON_VERSION%Installer, Python%PYTHON_VERSION%-zip draft: false prerelease: false force_update: true # overwrite files of existing release on GitHub on: branch: master # release from master branch only appveyor_repo_tag: true # deploy on tag push only auth_token: # encrypted token from GitHub secure: 4QuwNtXXqe6cIFwL3YCCn/47V7LdKBNbJVGjBSGDzJyUefOER3b7OrMrXm2FQYy3 on_finish: #- ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) fifengine-0.4.2/build/000077500000000000000000000000001341615052600145515ustar00rootroot00000000000000fifengine-0.4.2/build/appveyor/000077500000000000000000000000001341615052600164165ustar00rootroot00000000000000fifengine-0.4.2/build/appveyor/copy-boost-to-includes.bat000066400000000000000000000031001341615052600234220ustar00rootroot00000000000000@echo off echo "=== Copy the pre-installed Boost to the includes folder" :: create folders mkdir C:\projects\fifengine-dependencies\includes\lib\boost mkdir C:\projects\fifengine-dependencies\includes\include\boost :: copy boost includes xcopy /Y /S "C:\Libraries\boost_1_67_0\boost" "C:\projects\fifengine-dependencies\includes\include\boost" >nul 2>&1 :: copy binaries (dlls) and libs copy "C:\Libraries\boost_1_67_0\lib32-msvc-14.1\boost_filesystem-vc141-mt-x32-1_67.dll" "C:\projects\fifengine-dependencies\includes\bin\boost_filesystem-vc141-mt-x32-1_67.dll" copy "C:\Libraries\boost_1_67_0\lib32-msvc-14.1\boost_system-vc141-mt-x32-1_67.dll" "C:\projects\fifengine-dependencies\includes\bin\boost_system-vc141-mt-x32-1_67.dll" :: copy "C:\Libraries\boost_1_67_0\lib32-msvc-14.1\boost_python27-vc141-mt-x32-1_67.dll" "C:\projects\fifengine-dependencies\includes\bin\boost_python27-vc141-mt-x32-1_67.dll" copy "C:\Libraries\boost_1_67_0\lib32-msvc-14.1\libboost_filesystem-vc141-mt-x32-1_67.lib" "C:\projects\fifengine-dependencies\includes\lib\boost\libboost_filesystem-vc141-mt-x32-1_67.lib" copy "C:\Libraries\boost_1_67_0\lib32-msvc-14.1\libboost_system-vc141-mt-x32-1_67.lib" "C:\projects\fifengine-dependencies\includes\lib\boost\libboost_system-vc141-mt-x32-1_67.lib" :: copy "C:\Libraries\boost_1_67_0\lib32-msvc-14.1\libboost_python27-vc141-mt-x32-1_67.lib" "C:\projects\fifengine-dependencies\includes\lib\boost\libboost_python27-vc141-mt-x32-1_67.lib" :: remove the "share" folder rmdir /S /Q C:\projects\fifengine-dependencies\includes\share echo "Done." fifengine-0.4.2/build/appveyor/dl_extract_cegui-sdk.ps1000066400000000000000000000046571341615052600231430ustar00rootroot00000000000000#based on https://www.appveyor.com/docs/api/samples/download-artifacts-ps/ $apiUrl = 'https://ci.appveyor.com/api' $downloadLocation = 'C:\projects\fifengine-dependencies\downloads' $extractLocation = 'C:\projects\fifengine-dependencies\extracted' $installLocation = 'C:\projects\fifengine-dependencies\includes' $accountName = 'cegui-ci' $projectSlug = 'cegui' $branch = "v0-8" $cegui_dlls = ("CEGUIBase-0.dll", "freetype.dll", "pcre.dll", "minizip.dll","zlib.dll", "CEGUIOpenGLRenderer-0.dll", "glew.dll", ` "CEGUICommonDialogs-0.dll", "CEGUICoreWindowRendererSet.dll", "CEGUISillyImageCodec.dll", "silly.dll", "libpng.dll", "jpeg.dll", "CEGUIExpatParser.dll", "libexpat.dll") $global:dll_excludes = $global:dll_excludes + ("zlib.dll", "CEGUICommonDialogs-0.dll", "CEGUICoreWindowRendererSet.dll", "CEGUISillyImageCodec.dll", "silly.dll",` "jpeg.dll", "CEGUIExpatParser.dll", "libexpat.dll") # get project with last build details $project = Invoke-RestMethod -Method Get -Uri "$apiUrl/projects/$accountName/$projectSlug/branch/$branch" # Get the MSVC2015 job id ForEach ($job in $project.build.jobs) {if ($job.name.Contains("TOOLCHAIN=msvc2015")) {$jobId = $job.jobid; break}} # get job artifacts (just to see what we've got) $artifacts = Invoke-RestMethod -Method Get -Uri "$apiUrl/buildjobs/$jobId/artifacts" # here we just take the first artifact, but you could specify its file name $artifactFileName = $artifacts[0].fileName $localartifactFileName = [System.IO.Path]::GetFileName("$artifactFileName") # artifact will be downloaded as $localArtifactPath = "$downloadLocation\$localartifactFileName" # download artifact # -OutFile - is local file name where artifact will be downloaded into # the Headers in this call should only contain the bearer token, and no Content-type, otherwise it will fail! Invoke-RestMethod -Method Get -Uri "$apiUrl/buildjobs/$jobId/artifacts/$artifactFileName" ` -OutFile $localArtifactPath $folder_name = [System.IO.Path]::GetFileNameWithoutExtension("$artifactFileName") $extract_dir = "$extractLocation" 7z x $localArtifactPath -o"$extract_dir" -y copy-item $extractLocation/$folder_name/bin/* $installLocation\bin -force -recurse -Confirm:$False -Include $cegui_dlls copy-item $extractLocation/$folder_name/lib/* $installLocation\lib -force -recurse -Confirm:$False -Exclude "tinyxml*.*" copy-item $extractLocation/$folder_name/include/* $installLocation\include -force -recurse -Confirm:$False -Exclude ("tinyxml.h", "tinystr.h") fifengine-0.4.2/cmake/000077500000000000000000000000001341615052600145325ustar00rootroot00000000000000fifengine-0.4.2/cmake/FindCEGUI.cmake000066400000000000000000000710501341615052600171740ustar00rootroot00000000000000################################################################################ # FindCEGUI # # Locate CEGUI LIBRARIES # # This module defines # CEGUI_FOUND, if false, do not try to link to CEGUI # CEGUI_INCLUDE_DIR, where to find headers. # CEGUI_LIBRARIES, the LIBRARIES to link against # CEGUI_BINARY_REL - location of the main CEGUI binary (win32 non-static only, release) # CEGUI_BINARY_DBG - location of the main CEGUI binaries (win32 non-static only, debug) # # # Modules : # CEGUI_${COMPONENT}_FOUND - ${COMPONENT} is available # CEGUI_${COMPONENT}_INCLUDE_DIRS - additional include directories for ${COMPONENT} # CEGUI_${COMPONENT}_LIBRARIES - link these to use ${COMPONENT} # CEGUI_${COMPONENT}_BINARY_REL - location of the component binary (win32 non-static only, release) # CEGUI_${COMPONENT}_BINARY_DBG - location of the component binary (win32 non-static only, debug) # # VERSION 0.7.X: # WindowsRenderer: # Falagard # Renderer: # Direct3D9Renderer Direct3D10Renderer Direct3D11Renderer IrrlichtRenderer NullRenderer OgreRenderer OpenGLRenderer # ImageCodec: # CoronaImageCodec DevILImageCodec FreeImageImageCodec SILLYImageCodec STBImageCodec TGAImageCodec # Parser: # ExpatParser LibxmlParser RapidXMLParser TinyXMLParser XercesParser) # Script: # LuaScriptModule toluapp # VERSION 0.8.X: # WindowsRenderer: # CoreWindowRendererSet # Renderer: # Direct3D9Renderer Direct3D10Renderer Direct3D11Renderer IrrlichtRenderer NullRenderer OgreRenderer OpenGLRenderer OpenGL3Renderer OpenGLESRenderer # ImageCodec: # CoronaImageCodec DevILImageCodec FreeImageImageCodec SILLYImageCodec STBImageCodec TGAImageCodec PVRImageCodec # Parser: # ExpatParser LibXMLParser RapidXMLParser TinyXMLParser XercesParser) # Script: # LuaScriptModule # # author: Guillaume Smaha # # People have asked us to include a FindCEGUI that is high quality that they will # be able to copy and use to find CEGUI, so we have finally done that. # # If you have improvements for this scripts, please consider sending them upstream. # See https://bitbucket.org/cegui/cegui ################################################################################ ################################################################################ # Get the value of a preprocessor entry ################################################################################ macro(get_preprocessor_entry CONTENTS KEYWORD VARIABLE) string(REGEX MATCH "# *define +${KEYWORD} +((\"([^\n]*)\")|([^ \n]*))" PREPROC_TEMP_VAR ${${CONTENTS}} ) if (CMAKE_MATCH_3) set(${VARIABLE} ${CMAKE_MATCH_3}) else () set(${VARIABLE} ${CMAKE_MATCH_4}) endif () endmacro() ################################################################################ # Check if exist a preprocessor entry ################################################################################ macro(has_preprocessor_entry CONTENTS KEYWORD VARIABLE) string(REGEX MATCH "\n *# *define +(${KEYWORD})" PREPROC_TEMP_VAR ${${CONTENTS}} ) if (CMAKE_MATCH_1) set(${VARIABLE} TRUE) else () set(${VARIABLE} FALSE) endif () endmacro() ################################################################################ # Replace the value of a preprocessor entry ################################################################################ macro(replace_preprocessor_entry VARIABLE KEYWORD NEW_VALUE) string(REGEX REPLACE "(// *)?# *define +${KEYWORD} +[^ \n]*" "#define ${KEYWORD} ${NEW_VALUE}" ${VARIABLE}_TEMP ${${VARIABLE}} ) set(${VARIABLE} ${${VARIABLE}_TEMP}) endmacro() ################################################################################ # Define the value of preprocessor entry ################################################################################ macro(set_preprocessor_entry VARIABLE KEYWORD ENABLE) if (${ENABLE}) set(TMP_REPLACE_STR "#define ${KEYWORD}") else () set(TMP_REPLACE_STR "// #define ${KEYWORD}") endif () string(REGEX REPLACE "(// *)?# *define +${KEYWORD} *\n" ${TMP_REPLACE_STR} ${VARIABLE}_TEMP ${${VARIABLE}} ) set(${VARIABLE} ${${VARIABLE}_TEMP}) endmacro() ################################################################################ # Begin processing of package ################################################################################ macro(findpkg_begin PREFIX) if (NOT ${PREFIX}_FIND_QUIETLY) message(STATUS "Looking for ${PREFIX}...") endif () endmacro(findpkg_begin) ################################################################################ # Display a status message unless FIND_QUIETLY is set ################################################################################ macro(pkg_message PREFIX) if (NOT ${PREFIX}_FIND_QUIETLY) message(STATUS ${ARGN}) endif () endmacro(pkg_message) ################################################################################ # Get environment variable, define it as ENV_$var and make sure backslashes are converted to forward slashes ################################################################################ macro(getenv_path VAR) set(ENV_${VAR} $ENV{${VAR}}) # replace won't work if var is blank if (ENV_${VAR}) string( REGEX REPLACE "\\\\" "/" ENV_${VAR} ${ENV_${VAR}} ) endif () endmacro(getenv_path) ################################################################################ # Construct search paths for includes and libraries from a PREFIX_PATH ################################################################################ macro(create_search_paths PREFIX) foreach(dir ${${PREFIX}_PREFIX_PATH}) set(${PREFIX}_INC_SEARCH_PATH ${${PREFIX}_INC_SEARCH_PATH} ${dir}/include ${dir}/Include ${dir}/include/${PREFIX} ${dir}/Headers) set(${PREFIX}_INC_SEARCH_PATH ${${PREFIX}_INC_SEARCH_PATH} ${dir}/${PREFIX}/include ${dir}/${PREFIX}/Include ${dir}/${PREFIX}/include/${PREFIX} ${dir}/${PREFIX}/Headers) set(${PREFIX}_LIB_SEARCH_PATH ${${PREFIX}_LIB_SEARCH_PATH} ${dir}/lib ${dir}/Lib ${dir}/lib/${PREFIX} ${dir}/Libs) set(${PREFIX}_BIN_SEARCH_PATH ${${PREFIX}_BIN_SEARCH_PATH} ${dir}/bin) endforeach(dir) if(ANDROID) set(${PREFIX}_LIB_SEARCH_PATH ${${PREFIX}_LIB_SEARCH_PATH} ${OGRE_DEPENDENCIES_DIR}/lib/${ANDROID_ABI}) endif() set(${PREFIX}_FRAMEWORK_SEARCH_PATH ${${PREFIX}_PREFIX_PATH}) endmacro(create_search_paths) ################################################################################ # clear cache variables if a certain variable changed ################################################################################ macro(clear_if_changed TESTVAR) # test against internal check variable # HACK: Apparently, adding a variable to the cache cleans up the list # a bit. We need to also remove any empty strings from the list, but # at the same time ensure that we are actually dealing with a list. list(APPEND ${TESTVAR} "") list(REMOVE_ITEM ${TESTVAR} "") if (NOT "${${TESTVAR}}" STREQUAL "${${TESTVAR}_INT_CHECK}") message(STATUS "${TESTVAR} changed.") foreach(var ${ARGN}) set(${var} "NOTFOUND" CACHE STRING "${var}-docstring" FORCE) endforeach(var) endif () set(${TESTVAR}_INT_CHECK ${${TESTVAR}} CACHE INTERNAL "${TESTVAR}-docstring" FORCE) endmacro(clear_if_changed) ################################################################################ # Try to get some hints from pkg-config, if available ################################################################################ macro(use_pkgconfig PREFIX PKGNAME) find_package(PkgConfig) if (PKG_CONFIG_FOUND) pkg_check_modules(${PREFIX} ${PKGNAME} QUIET) endif () endmacro (use_pkgconfig) ################################################################################ # Couple a set of release AND debug libraries (or frameworks) ################################################################################ macro(make_library_set PREFIX) if (${PREFIX}_FWK) set(${PREFIX} ${${PREFIX}_FWK}) elseif (${PREFIX}_REL AND ${PREFIX}_DBG) set(${PREFIX} optimized ${${PREFIX}_REL} debug ${${PREFIX}_DBG}) elseif (${PREFIX}_REL) set(${PREFIX} ${${PREFIX}_REL}) elseif (${PREFIX}_DBG) set(${PREFIX} ${${PREFIX}_DBG}) endif () endmacro(make_library_set) ################################################################################ # Generate debug names from given release names ################################################################################ macro(get_debug_names PREFIX) foreach(i ${${PREFIX}}) set(${PREFIX}_DBG ${${PREFIX}_DBG} ${i}d ${i}D ${i}_d ${i}_D ${i}_debug ${i}) endforeach(i) endmacro(get_debug_names) ################################################################################ # Add the parent dir from DIR to VAR ################################################################################ macro(add_parent_dir VAR DIR) get_filename_component(${DIR}_TEMP "${${DIR}}/.." ABSOLUTE) set(${VAR} ${${VAR}} ${${DIR}_TEMP}) endmacro(add_parent_dir) ################################################################################ # Do the final processing for the package find. ################################################################################ macro(findpkg_finish PREFIX) # skip if already processed during this run if (NOT ${PREFIX}_FOUND) if (${PREFIX}_INCLUDE_DIR AND ${PREFIX}_LIBRARY) set(${PREFIX}_FOUND TRUE) set(${PREFIX}_INCLUDE_DIRS ${${PREFIX}_INCLUDE_DIR}) set(${PREFIX}_LIBRARIES ${${PREFIX}_LIBRARY}) if (NOT ${PREFIX}_FIND_QUIETLY) message(STATUS "Found ${PREFIX}: ${${PREFIX}_LIBRARIES}") endif () else () if (NOT ${PREFIX}_FIND_QUIETLY) message(STATUS "Could not locate ${PREFIX}") endif () if (${PREFIX}_FIND_REQUIRED) message(FATAL_ERROR "Required library ${PREFIX} not found! Install the library (including dev packages) and try again. If the library is already installed, set the missing variables manually in cmake.") endif () endif () mark_as_advanced(${PREFIX}_FOUND ${PREFIX}_LIBRARIES ${PREFIX}_INCLUDE_DIRS ${PREFIX}_INCLUDE_DIR ${PREFIX}_LIBRARY ${PREFIX}_LIBRARY_REL ${PREFIX}_LIBRARY_DBG ${PREFIX}_LIBRARY_FWK) endif () endmacro(findpkg_finish) ######################################################### # Find cegui modules ######################################################### macro(cegui_find_modules PLUGIN_COMPONENT) foreach (comp ${CEGUI_${PLUGIN_COMPONENT}_MODULES}) set(LIBNAME ${comp}) set(HEADER ${CEGUI_${PLUGIN_COMPONENT}_MODULES_${comp}_HEADER}) set(PKGCONFIG ${CEGUI_${PLUGIN_COMPONENT}_MODULES_${comp}_PKGCONFIG}) set(CHECKNOPREFIX ${CEGUI_${PLUGIN_COMPONENT}_MODULES_${comp}_CHECKNOPREFIX}) if (NOT "${HEADER}" STREQUAL "") findpkg_begin(CEGUI_${comp}) if(PKGCONFIG) use_pkgconfig(CEGUI_${comp}_PKGC "CEGUI-${PKGCONFIG}") if(NOT CEGUI_${comp}_PKGC_INCLUDE_DIRS AND CEGUI_LIB_SUFFIX) use_pkgconfig(CEGUI_${comp}_PKGC "CEGUI${CEGUI_LIB_SUFFIX}-${PKGCONFIG}") endif() endif() list(LENGTH HEADER len) math(EXPR lenmax "${len} - 1") foreach(val RANGE ${lenmax}) list(GET HEADER ${val} pathHeader) if(CEGUI_${comp}_INCLUDE_DIR) set(CEGUI_${comp}_INCLUDE_DIR_TMP ${CEGUI_${comp}_INCLUDE_DIR}) unset(CEGUI_${comp}_INCLUDE_DIR CACHE) endif() get_filename_component(head "${pathHeader}" NAME) get_filename_component(dir "${pathHeader}" DIRECTORY) if (NOT "${dir}" STREQUAL "") set(dir "${dir}/") endif () find_path(CEGUI_${comp}_INCLUDE_DIR NAMES ${head} HINTS ${CEGUI_INCLUDE_DIRS} ${CEGUI_${comp}_PKGC_INCLUDE_DIRS} PATH_SUFFIXES ${dir} CEGUI/${dir}) if(CEGUI_${comp}_INCLUDE_DIR_TMP) set(CEGUI_${comp}_INCLUDE_DIR ${CEGUI_${comp}_INCLUDE_DIR} ${CEGUI_${comp}_INCLUDE_DIR_TMP}) unset(CEGUI_${comp}_INCLUDE_DIR_TMP CACHE) endif() endforeach() list(REMOVE_DUPLICATES CEGUI_${comp}_INCLUDE_DIR) set(CEGUI_SUBLIB_DIR "cegui-${CEGUI_VERSION_MAJOR}.${CEGUI_VERSION_MINOR}") set(CEGUI_${comp}_LIBRARY_NAMES "CEGUI${comp}") get_debug_names(CEGUI_${comp}_LIBRARY_NAMES) set(CEGUI_${comp}_LIBRARY_NAMES_SUFFIX "CEGUI${comp}${CEGUI_LIB_SUFFIX}") get_debug_names(CEGUI_${comp}_LIBRARY_NAMES_SUFFIX) find_library(CEGUI_${comp}_LIBRARY_REL NAMES ${CEGUI_${comp}_LIBRARY_NAMES} ${CEGUI_${comp}_LIBRARY_NAMES_SUFFIX} HINTS ${CEGUI_LIBRARY_DIR_REL} ${CEGUI_LIBRARY_DIR_REL}/${CEGUI_SUBLIB_DIR} ${CEGUI_${comp}_PKGC_LIBRARY_DIRS} PATH_SUFFIXES "" "Release" "RelWithDebInfo" "MinSizeRel") find_library(CEGUI_${comp}_LIBRARY_DBG NAMES ${CEGUI_${comp}_LIBRARY_NAMES_DBG} ${CEGUI_${comp}_LIBRARY_NAMES_SUFFIX_DBG} HINTS ${CEGUI_LIBRARY_DIR_DBG} ${CEGUI_LIBRARY_DIR_DBG}/${CEGUI_SUBLIB_DIR} ${CEGUI_${comp}_PKGC_LIBRARY_DIRS} PATH_SUFFIXES "" "Debug") if(CHECKNOPREFIX AND (NOT CEGUI_${comp}_LIBRARY_REL OR NOT CEGUI_${comp}_LIBRARY_DBG)) set(CEGUI_${comp}_LIBRARY_NAMES "${comp}") get_debug_names(CEGUI_${comp}_LIBRARY_NAMES) set(CEGUI_${comp}_LIBRARY_NAMES_SUFFIX "${comp}${CEGUI_LIB_SUFFIX}") get_debug_names(CEGUI_${comp}_LIBRARY_NAMES_SUFFIX) find_library(CEGUI_${comp}_LIBRARY_REL NAMES ${CEGUI_${comp}_LIBRARY_NAMES} ${CEGUI_${comp}_LIBRARY_NAMES_SUFFIX} HINTS ${CEGUI_LIBRARY_DIR_REL} ${CEGUI_LIBRARY_DIR_REL}/${CEGUI_SUBLIB_DIR} ${CEGUI_${comp}_PKGC_LIBRARY_DIRS} PATH_SUFFIXES "" "Release" "RelWithDebInfo" "MinSizeRel") find_library(CEGUI_${comp}_LIBRARY_DBG NAMES ${CEGUI_${comp}_LIBRARY_NAMES_DBG} ${CEGUI_${comp}_LIBRARY_NAMES_SUFFIX_DBG} HINTS ${CEGUI_LIBRARY_DIR_DBG} ${CEGUI_LIBRARY_DIR_DBG}/${CEGUI_SUBLIB_DIR} ${CEGUI_${comp}_PKGC_LIBRARY_DIRS} PATH_SUFFIXES "" "Debug") endif() make_library_set(CEGUI_${comp}_LIBRARY) if (NOT CEGUI_STATIC) if (WIN32) find_file(CEGUI_${comp}_BINARY_REL NAMES "CEGUI${comp}.dll" "CEGUI${comp}${CEGUI_LIB_SUFFIX}.dll" HINTS ${CEGUI_BIN_SEARCH_PATH} ${CEGUI_${comp}_PKGC_LIBRARY_DIRS} PATH_SUFFIXES "" "Release" "RelWithDebInfo" "MinSizeRel") find_file(CEGUI_${comp}_BINARY_DBG NAMES "CEGUI${comp}_d.dll" "CEGUI${comp}${CEGUI_LIB_SUFFIX}_d.dll" HINTS ${CEGUI_BIN_SEARCH_PATH} ${CEGUI_${comp}_PKGC_LIBRARY_DIRS} PATH_SUFFIXES "" "Debug") if(CHECKNOPREFIX AND (NOT CEGUI_${comp}_LIBRARY_REL OR NOT CEGUI_${comp}_LIBRARY_DBG)) find_file(CEGUI_${comp}_BINARY_REL NAMES "${comp}${CEGUI_LIB_SUFFIX}.dll" HINTS ${CEGUI_BIN_SEARCH_PATH} PATH_SUFFIXES "" "Release" "RelWithDebInfo" "MinSizeRel") find_file(CEGUI_${comp}_BINARY_DBG NAMES "${comp}${CEGUI_LIB_SUFFIX}_d.dll" HINTS ${CEGUI_BIN_SEARCH_PATH} PATH_SUFFIXES "" "Debug") endif() endif() get_filename_component(CEGUI_${comp}_BINARY_DIR_REL "${CEGUI_${comp}_BINARY_REL}" PATH) get_filename_component(CEGUI_${comp}_BINARY_DIR_DBG "${CEGUI_${comp}_BINARY_DBG}" PATH) mark_as_advanced(CEGUI_${comp}_BINARY_REL CEGUI_${comp}_BINARY_DBG CEGUI_${comp}_BINARY_DIR_REL CEGUI_${comp}_BINARY_DIR_DBG) endif() findpkg_finish(CEGUI_${comp}) endif () endforeach (comp) endmacro(cegui_find_modules) ######################################################### # register a module ######################################################### macro(cegui_register_module TYPE LIBNAME HEADER PKGCONFIG) set(CEGUI_MODULES ${CEGUI_MODULES} ${LIBNAME}) set(CEGUI_${TYPE}_MODULES ${CEGUI_${TYPE}_MODULES} ${LIBNAME}) set(CEGUI_${TYPE}_MODULES_${LIBNAME}_HEADER ${HEADER}) if(NOT "${PKGCONFIG}" STREQUAL "") set(CEGUI_${TYPE}_MODULES_${LIBNAME}_PKGCONFIG ${PKGCONFIG}) endif() endmacro() ######################################################### # Main ######################################################### set(CEGUI_VERSION_MAJOR_DEFAULT "0") # Register var to check change on base set(CEGUI_RESET_VARS CEGUI_CONFIG_INCLUDE_DIR CEGUI_INCLUDE_DIR CEGUI_LIBRARY_REL CEGUI_LIBRARY_DBG) set(CEGUI_PREFIX_WATCH ${CEGUI_PREFIX_PATH}) clear_if_changed(CEGUI_PREFIX_WATCH ${CEGUI_RESET_VARS}) findpkg_begin(CEGUI) # Get path, convert backslashes as ${ENV_${var}} getenv_path(CEGUI_HOME) getenv_path(CEGUI_DIR) getenv_path(CEGUI_ROOT) getenv_path(PROGRAMFILES) # Determine whether to search for a dynamic or static build if (CEGUI_STATIC) set(CMAKE_FIND_LIBRARY_SUFFIXES_OLD "${CMAKE_FIND_LIBRARY_SUFFIXES}") if (WIN32) set(CMAKE_FIND_LIBRARY_SUFFIXES ".lib;.dll") else() set(CMAKE_FIND_LIBRARY_SUFFIXES ".a;.so") endif() endif () # construct search paths from environmental hints and # OS specific guesses if (WIN32) set(CEGUI_PREFIX_GUESSES ${ENV_PROGRAMFILES}/cegui ${ENV_PROGRAMFILES}/CEGUI C:/CEGUI-SDK C:/lib/cegui [HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Session\ Manager\\Environment;CEGUI_HOME] [HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Session\ Manager\\Environment;CEGUI_DIR] [HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Session\ Manager\\Environment;CEGUI_ROOT] ) elseif (UNIX) set(CEGUI_PREFIX_GUESSES /opt/cegui /opt/CEGUI /usr /usr/local $ENV{HOME}/cegui $ENV{HOME}/CEGUI ) if (APPLE) set(CEGUI_PREFIX_GUESSES ${CMAKE_CURRENT_SOURCE_DIR}/lib/macosx ${CEGUI_PREFIX_GUESSES} ) endif () endif () set(CEGUI_PREFIX_PATH $ENV{CEGUI_HOME} $ENV{CEGUI_DIR} $ENV{CEGUI_ROOT} ${CEGUI_PREFIX_GUESSES} ) # Construct search paths for includes and libraries create_search_paths(CEGUI) # try to locate CEGUI via pkg-config use_pkgconfig(CEGUI_PKGC "CEGUI${CEGUI_LIB_SUFFIX};CEGUI${CEGUI_LIB_SUFFIX}-${CEGUI_VERSION_MAJOR_DEFAULT}") # locate CEGUI include files find_path(CEGUI_CONFIG_INCLUDE_DIR_PREFIX NAMES CEGUIConfig.h HINTS ${CEGUI_INC_SEARCH_PATH} ${CEGUI_FRAMEWORK_INCLUDES} ${CEGUI_PKGC_INCLUDE_DIRS} PATH_SUFFIXES CEGUI cegui cegui-${CEGUI_VERSION_MAJOR_DEFAULT} cegui-${CEGUI_VERSION_MAJOR_DEFAULT}/CEGUI) find_path(CEGUI_CONFIG_INCLUDE_DIR NAMES CEGUIConfig.h Config.h HINTS ${CEGUI_INC_SEARCH_PATH} ${CEGUI_FRAMEWORK_INCLUDES} ${CEGUI_PKGC_INCLUDE_DIRS} PATH_SUFFIXES CEGUI cegui cegui-${CEGUI_VERSION_MAJOR_DEFAULT} cegui-${CEGUI_VERSION_MAJOR_DEFAULT}/CEGUI) find_path(CEGUI_INCLUDE_DIR NAMES CEGUI.h HINTS ${CEGUI_INC_SEARCH_PATH} ${CEGUI_FRAMEWORK_INCLUDES} ${CEGUI_PKGC_INCLUDE_DIRS} PATH_SUFFIXES CEGUI cegui cegui-${CEGUI_VERSION_MAJOR_DEFAULT} cegui-${CEGUI_VERSION_MAJOR_DEFAULT}/CEGUI) set(CEGUI_INCOMPATIBLE FALSE) if (CEGUI_INCLUDE_DIR) # determine CEGUI version if(CEGUI_CONFIG_INCLUDE_DIR_PREFIX) file(READ ${CEGUI_INCLUDE_DIR}/CEGUIVersion.h CEGUI_TEMP_VERSION_CONTENT) else() file(READ ${CEGUI_INCLUDE_DIR}/Version.h CEGUI_TEMP_VERSION_CONTENT) endif() if (NOT "${CEGUI_TEMP_VERSION_CONTENT}" STREQUAL "") get_preprocessor_entry(CEGUI_TEMP_VERSION_CONTENT CEGUI_VERSION_MAJOR CEGUI_VERSION_MAJOR) get_preprocessor_entry(CEGUI_TEMP_VERSION_CONTENT CEGUI_VERSION_MINOR CEGUI_VERSION_MINOR) get_preprocessor_entry(CEGUI_TEMP_VERSION_CONTENT CEGUI_VERSION_PATCH CEGUI_VERSION_PATCH) get_preprocessor_entry(CEGUI_TEMP_VERSION_CONTENT CEGUI_VERSION_NAME CEGUI_VERSION_NAME) set(CEGUI_VERSION "${CEGUI_VERSION_MAJOR}.${CEGUI_VERSION_MINOR}.${CEGUI_VERSION_PATCH}") pkg_message(CEGUI "Found CEGUI ${CEGUI_VERSION_NAME} (${CEGUI_VERSION})") else() message(SEND_ERROR "Can't found CEGUI version !") set(CEGUI_INCOMPATIBLE FALSE) endif() else () set(CEGUI_INCOMPATIBLE FALSE) endif () if ("${CEGUI_VERSION}" VERSION_GREATER "0.8.0") set(CEGUI_LIB_SUFFIX "-${CEGUI_VERSION_MAJOR}") endif () set(CEGUI_LIBRARY_NAMES "CEGUIBase${CEGUI_LIB_SUFFIX}") get_debug_names(CEGUI_LIBRARY_NAMES) find_library(CEGUI_LIBRARY_REL NAMES ${CEGUI_LIBRARY_NAMES} HINTS ${CEGUI_LIB_SEARCH_PATH} ${CEGUI_PKGC_LIBRARY_DIRS} ${CEGUI_FRAMEWORK_SEARCH_PATH} PATH_SUFFIXES "" "release" "relwithdebinfo" "minsizerel") find_library(CEGUI_LIBRARY_DBG NAMES ${CEGUI_LIBRARY_NAMES_DBG} HINTS ${CEGUI_LIB_SEARCH_PATH} ${CEGUI_PKGC_LIBRARY_DIRS} ${CEGUI_FRAMEWORK_SEARCH_PATH} PATH_SUFFIXES "" "debug") make_library_set(CEGUI_LIBRARY) if (CEGUI_INCOMPATIBLE) set(CEGUI_LIBRARY "NOTFOUND") endif () set(CEGUI_INCLUDE_DIR ${CEGUI_CONFIG_INCLUDE_DIR} ${CEGUI_INCLUDE_DIR}) list(REMOVE_DUPLICATES CEGUI_INCLUDE_DIR) findpkg_finish(CEGUI) # Starting CEGUI 0.8, the headers are in the CEGUI subdirectory, and we must include # its parent rather than directly the subdirectory. Otherwise we'll get compiler errors. if ("${CEGUI_VERSION}" VERSION_GREATER "0.8.0") add_parent_dir(CEGUI_INCLUDE_DIRS_TEMP CEGUI_INCLUDE_DIR) # we basically overwrite CEGUI_INCLUDE_DIR so that it contains only the parent directory. set(CEGUI_INCLUDE_DIR ${CEGUI_INCLUDE_DIRS_TEMP}) endif() set(CEGUI_INCLUDE_DIRS ${CEGUI_INCLUDE_DIR}) mark_as_advanced(CEGUI_CONFIG_INCLUDE_DIR) if (NOT CEGUI_FOUND) return() endif () get_filename_component(CEGUI_LIBRARY_DIR_REL "${CEGUI_LIBRARY_REL}" PATH) get_filename_component(CEGUI_LIBRARY_DIR_DBG "${CEGUI_LIBRARY_DBG}" PATH) set(CEGUI_LIBRARY_DIRS ${CEGUI_LIBRARY_DIR_REL} ${CEGUI_LIBRARY_DIR_DBG}) # find binaries if (NOT CEGUI_STATIC) if (WIN32) find_file(CEGUI_BINARY_REL NAMES "CEGUIBase${CEGUI_LIB_SUFFIX}.dll" "CEGUIBase.dll" HINTS ${CEGUI_BIN_SEARCH_PATH} PATH_SUFFIXES "" "Release" "RelWithDebInfo" "MinSizeRel") find_file(CEGUI_BINARY_DBG NAMES "CEGUIBase${CEGUI_LIB_SUFFIX}_d.dll" "CEGUIBase_d.dll" HINTS ${CEGUI_BIN_SEARCH_PATH} PATH_SUFFIXES "" "Debug") endif() get_filename_component(CEGUI_BINARY_DIR_REL "${CEGUI_BINARY_REL}" PATH) get_filename_component(CEGUI_BINARY_DIR_DBG "${CEGUI_BINARY_DBG}" PATH) mark_as_advanced(CEGUI_BINARY_REL CEGUI_BINARY_DBG CEGUI_BINARY_DIR_REL CEGUI_BINARY_DIR_DBG) endif() if ("${CEGUI_VERSION}" VERSION_GREATER "0.8.0") # Base cegui_register_module(BASE CommonDialogs CommonDialogs/Module.h "") # WindowsRenderer cegui_register_module(WINDOWSRENDERER CoreWindowRendererSet WindowRendererSets/Core/Module.h "") # Renderer cegui_register_module(RENDERER Direct3D9Renderer RendererModules/Direct3D9/Renderer.h "") cegui_register_module(RENDERER Direct3D10Renderer RendererModules/Direct3D10/Renderer.h "") cegui_register_module(RENDERER Direct3D11Renderer RendererModules/Direct3D11/Renderer.h "") cegui_register_module(RENDERER DirectFBRenderer RendererModules/DirectFB/Renderer.h "") cegui_register_module(RENDERER IrrlichtRenderer RendererModules/Irrlicht/Renderer.h "IRRLICHT") cegui_register_module(RENDERER NullRenderer RendererModules/Null/Renderer.h "NULL") cegui_register_module(RENDERER OgreRenderer RendererModules/Ogre/Renderer.h "OGRE") cegui_register_module(RENDERER OpenGLRenderer RendererModules/OpenGL/GLRenderer.h "OPENGL") cegui_register_module(RENDERER OpenGL3Renderer RendererModules/OpenGL/GL3Renderer.h "OPENGL3") cegui_register_module(RENDERER OpenGLESRenderer RendererModules/OpenGLES/Renderer.h "") # ImageCodec cegui_register_module(IMAGECODEC CoronaImageCodec ImageCodecModules/Corona/ImageCodec.h "") cegui_register_module(IMAGECODEC DevILImageCodec ImageCodecModules/DevIL/ImageCodec.h "") cegui_register_module(IMAGECODEC FreeImageImageCodec ImageCodecModules/FreeImage/ImageCodec.h "") cegui_register_module(IMAGECODEC SILLYImageCodec ImageCodecModules/SILLY/ImageCodec.h "") cegui_register_module(IMAGECODEC STBImageCodec ImageCodecModules/STB/ImageCodec.h "") cegui_register_module(IMAGECODEC TGAImageCodec ImageCodecModules/TGA/ImageCodec.h "") cegui_register_module(IMAGECODEC PVRImageCodec ImageCodecModules/PVR/ImageCodec.h "") # Parser cegui_register_module(PARSER ExpatParser XMLParserModules/Expat/XMLParser.h "") cegui_register_module(PARSER LibXMLParser XMLParserModules/Libxml2/XMLParser.h "") cegui_register_module(PARSER RapidXMLParser XMLParserModules/RapidXML/XMLParser.h "") cegui_register_module(PARSER TinyXMLParser XMLParserModules/TinyXML/XMLParser.h "") cegui_register_module(PARSER XercesParser XMLParserModules/Xerces/XMLParser.h "") # Script cegui_register_module(SCRIPT LuaScriptModule ScriptModules/Lua/ScriptModule.h "LUA") else () # WindowsRenderer cegui_register_module(WINDOWSRENDERER FalagardWRBase "WindowRendererSets/Falagard/FalModule.h;falagard/CEGUIFalNamedArea.h" "") # Renderer cegui_register_module(RENDERER Direct3D9Renderer RendererModules/Direct3D9/CEGUIDirect3D9Renderer.h "") cegui_register_module(RENDERER Direct3D10Renderer RendererModules/Direct3D10/CEGUIDirect3D10Renderer.h "") cegui_register_module(RENDERER Direct3D11Renderer RendererModules/Direct3D11/CEGUIDirect3D11Renderer.h "") cegui_register_module(RENDERER DirectFBRenderer RendererModules/DirectFB/CEGUIDirectFBRenderer.h "") cegui_register_module(RENDERER IrrlichtRenderer RendererModules/Irrlicht/CEGUIIrrlichtRenderer.h "") cegui_register_module(RENDERER NullRenderer RendererModules/Null/CEGUINullRenderer.h "NULL") cegui_register_module(RENDERER OgreRenderer RendererModules/Ogre/CEGUIOgreRenderer.h "OGRE") cegui_register_module(RENDERER OpenGLRenderer RendererModules/OpenGL/CEGUIOpenGLRenderer.h "OPENGL") # ImageCodec cegui_register_module(IMAGECODEC CoronaImageCodec ImageCodecModules/CoronaImageCodec/CEGUICoronaImageCodec.h "") cegui_register_module(IMAGECODEC DevILImageCodec ImageCodecModules/DevILImageCodec/CEGUIDevILImageCodec.h "") cegui_register_module(IMAGECODEC FreeImageImageCodec ImageCodecModules/FreeImageImageCodec/CEGUIFreeImageImageCodec.h "") cegui_register_module(IMAGECODEC SILLYImageCodec ImageCodecModules/SILLYImageCodec/CEGUISILLYImageCodec.h "") cegui_register_module(IMAGECODEC STBImageCodec ImageCodecModules/STBImageCodec/CEGUISTBImageCodec.h "") cegui_register_module(IMAGECODEC TGAImageCodec ImageCodecModules/TGAImageCodec/CEGUITGAImageCodec.h "") # Parser cegui_register_module(PARSER ExpatParser XMLParserModules/ExpatParser/CEGUIExpatParser.h "") cegui_register_module(PARSER LibxmlParser XMLParserModules/LibxmlParser/CEGUILibxmlParser.h "") cegui_register_module(PARSER RapidXMLParser XMLParserModules/RapidXMLParser/CEGUIRapidXMLParser.h "") cegui_register_module(PARSER TinyXMLParser XMLParserModules/TinyXMLParser/CEGUITinyXMLParser.h "") cegui_register_module(PARSER XercesParser XMLParserModules/XercesParser/CEGUIXercesParser.h "") # Script cegui_register_module(SCRIPT LuaScriptModule ScriptingModules/LuaScriptModule/CEGUILua.h "") if(WIN32) cegui_register_module(SCRIPT tolua++ ScriptingModules/LuaScriptModule/support/tolua++/tolua++.h "") set(CEGUI_SCRIPT_MODULES_tolua++_CHECKNOPREFIX TRUE) else() cegui_register_module(SCRIPT toluapp ScriptingModules/LuaScriptModule/support/tolua++/tolua++.h "") endif() endif () # Register var to check change on modules set(CEGUI_RESET_MODULES_VARS "") foreach (comp ${CEGUI_MODULES}) set(CEGUI_RESET_MODULES_VARS ${CEGUI_RESET_MODULES_VARS} CEGUI_${comp}_INCLUDE_DIR CEGUI_${comp}_LIBRARY_FWK CEGUI_${comp}_LIBRARY_DBG CEGUI_${comp}_LIBRARY_REL ) endforeach (comp) set(CEGUI_PREFIX_MODULES_WATCH ${CEGUI_PREFIX_MODULES_PATH}) clear_if_changed(CEGUI_PREFIX_WATCH ${CEGUI_RESET_MODULES_VARS}) # Find modules cegui_find_modules(BASE) cegui_find_modules(WINDOWSRENDERER) cegui_find_modules(RENDERER) cegui_find_modules(IMAGECODEC) cegui_find_modules(PARSER) cegui_find_modules(SCRIPT) # Find modules if (CEGUI_STATIC) set(CMAKE_FIND_LIBRARY_SUFFIXES "${CMAKE_FIND_LIBRARY_SUFFIXES_OLD}") endif() #Check change on modules clear_if_changed(CEGUI_PREFIX_WATCH) clear_if_changed(CEGUI_PREFIX_MODULES_WATCH) fifengine-0.4.2/cmake/FindFifeChan.cmake000066400000000000000000000062321341615052600200030ustar00rootroot00000000000000#------------------------------------------------------------------------------ # FindFifeChan.cmake #------------------------------------------------------------------------------ # # Find the native fifechan includes and libraries. Supports components. # # Usage: find_package(FifeChan COMPONENTS opengl sdl REQUIRED) # # FIFECHAN_INCLUDE_DIR - where to find fifechan/fifechan.hüü, etc. # FIFECHAN_LIBRARIES - List of libraries when using fifechan. # FIFECHAN_FOUND - True, if fifechan found. # # FIFECHAN_${component}_FOUND - True, if fifechan_component found. # #------------------------------------------------------------------------------ # Author: Jens A. Koch #------------------------------------------------------------------------------ if(FIFECHAN_INCLUDE_DIR) # Already in cache, be silent set(FIFECHAN_FIND_QUIETLY TRUE) endif(FIFECHAN_INCLUDE_DIR) #------------------------------------------------------------------------------ # Find FIFECHAN_INCLUDE_DIR #------------------------------------------------------------------------------ find_path(FIFECHAN_INCLUDE_DIR NAMES fifechan.hpp PATH_SUFFIXES fifechan) #------------------------------------------------------------------------------ # Find FIFECHAN_LIBRARY #------------------------------------------------------------------------------ # support alternative library names: suffix "_static" and prefix "lib" find_library(FIFECHAN_LIBRARY NAMES fifechan fifechan_static libfifechan libfifechan_static) #------------------------------------------------------------------------------ # Find libraries (components) # # Example: find_package(FifeChan COMPONENTS opengl sdl REQUIRED) #------------------------------------------------------------------------------ IF(FifeChan_FIND_COMPONENTS) message(STATUS "Found the following FifeChan libraries:") FOREACH(component ${FifeChan_FIND_COMPONENTS}) find_library(FIFECHAN_${component}_LIBRARY NAMES fifechan_${component}) if(FIFECHAN_${component}_LIBRARY) SET(FIFECHAN_${component}_FOUND 1) list(APPEND FIFECHAN_COMPONENTS "${FIFECHAN_${component}_LIBRARY}") message(STATUS " fifechan_${component}") else() SET(FIFECHAN_${component}_FOUND 0) message(STATUS " fifechan_${component} not found.") endif() ENDFOREACH() ENDIF() # - handle the QUIETLY and REQUIRED arguments # - set FIFECHAN_FOUND to TRUE if all REQUIRED_VARS are TRUE # - additionally handle components, which are found: FIFECHAN_${component}_FOUND include(FindPackageHandleStandardArgs) find_package_handle_standard_args(FIFECHAN REQUIRED_VARS FIFECHAN_LIBRARY FIFECHAN_INCLUDE_DIR HANDLE_COMPONENTS ) if(FIFECHAN_FOUND) set(FIFECHAN_LIBRARIES ${FIFECHAN_LIBRARY} ${FIFECHAN_COMPONENTS}) endif(FIFECHAN_FOUND) # for debugging #message(STATUS "FIFECHAN_INCLUDE_DIR = '${FIFECHAN_INCLUDE_DIR}'") #message(STATUS "FIFECHAN_LIBRARIES = '${FIFECHAN_LIBRARIES}'") mark_as_advanced(FIFECHAN_INCLUDE_DIR FIFECHAN_LIBRARY) fifengine-0.4.2/cmake/FindGLEW.cmake000066400000000000000000000015241341615052600170750ustar00rootroot00000000000000# - Try to find GLEW # and define # # GLEW_FOUND - System has GLEW # GLEW_INCLUDE_DIR - The GLEW include directories # GLEW_LIBRARIES - The GLEW libraries find_path(GLEW_INCLUDE_DIR NAMES GL/glew.h) # glew32d glew32sd find_library(GLEW_LIBRARY NAMES GLEW glew32 glew32s PATHS ${GLEW_INCLUDE_DIR}/../lib lib ) # get GLEW version from glew.h if(GLEW_INCLUDE_DIR AND EXISTS "${GLEW_INCLUDE_DIR}/GL/glew.h") file(STRINGS "${GLEW_INCLUDE_DIR}/GL/glew.h" GLEW_VERSION_LINE REGEX "^VERSION [0-9].[0-9].[0-9]+$") string(REPLACE "VERSION " "" GLEW_VERSION "${GLEW_VERSION_LINE}") unset(GLEW_VERSION_LINE) endif() include(FindPackageHandleStandardArgs) find_package_handle_standard_args(GLEW REQUIRED_VARS GLEW_LIBRARY GLEW_INCLUDE_DIR VERSION_VAR GLEW_VERSION ) mark_as_advanced(GLEW_INCLUDE_DIR GLEW_LIBRARY)fifengine-0.4.2/cmake/FindLibRocket.cmake000066400000000000000000000015711341615052600202170ustar00rootroot00000000000000# - Try to find libRocket # and define # # LIBROCKET_FOUND - System has libRocket # LIBROCKET_INCLUDE_DIRS - The LibRocket include directories # LIBROCKET_LIBRARIES - The libraries needed to use LibRocket # LIBROCKET_DEFINITIONS - Compiler switches required for using LibRocket find_path(LIBROCKET_INCLUDE_DIR Rocket/Core.h PATH_SUFFIXES Rocket ) find_library(LIBROCKET_LIBRARY NAMES RocketCore RocketCore_d) set(LIBROCKET_LIBRARIES ${LIBROCKET_LIBRARY} ) set(LIBROCKET_INCLUDE_DIRS ${LIBROCKET_INCLUDE_DIR} ) include(FindPackageHandleStandardArgs) # handle the QUIETLY and REQUIRED arguments and set LIBROCKET_FOUND to TRUE # if all listed variables are TRUE find_package_handle_standard_args(LibRocket DEFAULT_MSG LIBROCKET_LIBRARY LIBROCKET_INCLUDE_DIR) mark_as_advanced(LIBROCKET_INCLUDE_DIR LIBROCKET_LIBRARY ) fifengine-0.4.2/cmake/FindOGG.cmake000066400000000000000000000012221341615052600167460ustar00rootroot00000000000000# - Try to find OGG # and define # # OGG_FOUND - System has OGG # OGG_INCLUDE_DIRS - The include directories # OGG_LIBRARY - The libraries # try to find package and provide a hint find_package(PkgConfig QUIET) pkg_check_modules(PC_OGG QUIET ogg) find_path(OGG_INCLUDE_DIR NAMES ogg/ogg.h HINTS ${PC_OGG_INCLUDE_DIRS} PATH_SUFFIXES ogg ) find_library(OGG_LIBRARY NAMES ogg libogg HINTS ${PC_OGG_LIBRARY_DIRS} PATH ${OGG_INCLUDE_DIR}/../lib lib ) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(OGG DEFAULT_MSG OGG_LIBRARY OGG_INCLUDE_DIR) mark_as_advanced(OGG_LIBRARY OGG_INCLUDE_DIR) fifengine-0.4.2/cmake/FindOpenALSoft.cmake000066400000000000000000000027511341615052600203140ustar00rootroot00000000000000# - Try to find OpenAL-Soft # and define # # OPENALSOFT_FOUND - System has OpenAL-Soft # OPENALSOFT_INCLUDE_DIR - The OpenAL-Soft include directories # OPENALSOFT_LIBRARY - The OpenAL-Soft libraries IF(NOT APPLE) find_path(OPENALSOFT_INCLUDE_DIR al.h PATHS # Fink /sw # DarwinPorts /opt/local # Blastwave /opt/csw /opt # FreeBSD /usr/local/include/AL # Linux /usr/include/AL # Windows SDK Include PATH /include/AL ) find_library(OPENALSOFT_LIBRARY NAMES libopenal openal libOpenAL32 OpenAL32 soft_oal.dll PATHS ${OPENALSOFT_INCLUDE_DIR}/../lib /usr/local/opt/openal-soft/lib /lib /usr/lib /usr/local/lib ) ENDIF(NOT APPLE) IF (APPLE) SET(OPENALSOFT_INCLUDE_DIR "/usr/local/opt/openal-soft/include/") find_library(OPENALSOFT_LIBRARY NAMES libopenal.dylib openal.dylib PATHS /usr/local/opt/openal-soft/lib # for debugging message(STATUS "OPENALSOFT_INCLUDE_DIR = '${OPENALSOFT_INCLUDE_DIR}'") message(STATUS "OPENALSOFT_LIBRARY = '${OPENALSOFT_LIBRARY}'") ) ENDIF (APPLE) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(OPENALSOFT REQUIRED_VARS OPENALSOFT_LIBRARY OPENALSOFT_INCLUDE_DIR) mark_as_advanced(OPENALSOFT_INCLUDE_DIR OPENALSOFT_LIBRARY) # for debugging #message(STATUS "OPENALSOFT_INCLUDE_DIR = '${OPENALSOFT_INCLUDE_DIR}'") #message(STATUS "OPENALSOFT_LIBRARY = '${OPENALSOFT_LIBRARY}'") fifengine-0.4.2/cmake/FindSDL2.cmake000066400000000000000000000141021341615052600170370ustar00rootroot00000000000000# This module defines # SDL2_LIBRARY, the name of the library to link against # SDL2_FOUND, if false, do not try to link to SDL2 # SDL2_INCLUDE_DIR, where to find SDL.h # # This module responds to the the flag: # SDL2_BUILDING_LIBRARY # If this is defined, then no SDL2main will be linked in because # only applications need main(). # Otherwise, it is assumed you are building an application and this # module will attempt to locate and set the the proper link flags # as part of the returned SDL2_LIBRARY variable. # # Don't forget to include SDLmain.h and SDLmain.m your project for the # OS X framework based version. (Other versions link to -lSDL2main which # this module will try to find on your behalf.) Also for OS X, this # module will automatically add the -framework Cocoa on your behalf. # # # Additional Note: If you see an empty SDL2_LIBRARY_TEMP in your configuration # and no SDL2_LIBRARY, it means CMake did not find your SDL2 library # (SDL2.dll, libsdl2.so, SDL2.framework, etc). # Set SDL2_LIBRARY_TEMP to point to your SDL2 library, and configure again. # Similarly, if you see an empty SDL2MAIN_LIBRARY, you should set this value # as appropriate. These values are used to generate the final SDL2_LIBRARY # variable, but when these values are unset, SDL2_LIBRARY does not get created. # # # $SDL2DIR is an environment variable that would # correspond to the ./configure --prefix=$SDL2DIR # used in building SDL2. # l.e.galup 9-20-02 # # Modified by Eric Wing. # Added code to assist with automated building by using environmental variables # and providing a more controlled/consistent search behavior. # Added new modifications to recognize OS X frameworks and # additional Unix paths (FreeBSD, etc). # Also corrected the header search path to follow "proper" SDL guidelines. # Added a search for SDL2main which is needed by some platforms. # Added a search for threads which is needed by some platforms. # Added needed compile switches for MinGW. # # On OSX, this will prefer the Framework version (if found) over others. # People will have to manually change the cache values of # SDL2_LIBRARY to override this selection or set the CMake environment # CMAKE_INCLUDE_PATH to modify the search paths. # # Note that the header path has changed from SDL2/SDL.h to just SDL.h # This needed to change because "proper" SDL convention # is #include "SDL.h", not . This is done for portability # reasons because not all systems place things in SDL2/ (see FreeBSD). #============================================================================= # Copyright 2003-2009 Kitware, Inc. # # Distributed under the OSI-approved BSD License (the "License"); # see accompanying file Copyright.txt for details. # # This software is distributed WITHOUT ANY WARRANTY; without even the # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # See the License for more information. #============================================================================= # (To distribute this file outside of CMake, substitute the full # License text for the above reference.) #message("") SET(SDL2_SEARCH_PATHS ~/Library/Frameworks /Library/Frameworks /usr/local /usr /sw # Fink /opt/local # DarwinPorts /opt/csw # Blastwave /opt ${SDL2_PATH} ) FIND_PATH(SDL2_INCLUDE_DIR SDL.h HINTS $ENV{SDL2DIR} PATH_SUFFIXES include/SDL2 include PATHS ${SDL2_SEARCH_PATHS} ) FIND_LIBRARY(SDL2_LIBRARY_TEMP NAMES SDL2 HINTS $ENV{SDL2DIR} PATH_SUFFIXES lib64 lib lib/x64 lib/x86 PATHS ${SDL2_SEARCH_PATHS} ) IF(NOT SDL2_BUILDING_LIBRARY) IF(NOT ${SDL2_INCLUDE_DIR} MATCHES ".framework") # Non-OS X framework versions expect you to also dynamically link to # SDL2main. This is mainly for Windows and OS X. Other (Unix) platforms # seem to provide SDL2main for compatibility even though they don't # necessarily need it. FIND_LIBRARY(SDL2MAIN_LIBRARY NAMES SDL2main HINTS $ENV{SDL2DIR} PATH_SUFFIXES lib64 lib PATHS ${SDL2_SEARCH_PATHS} ) ENDIF(NOT ${SDL2_INCLUDE_DIR} MATCHES ".framework") ENDIF(NOT SDL2_BUILDING_LIBRARY) # SDL2 may require threads on your system. # The Apple build may not need an explicit flag because one of the # frameworks may already provide it. # But for non-OSX systems, I will use the CMake Threads package. IF(NOT APPLE) FIND_PACKAGE(Threads) ENDIF(NOT APPLE) # MinGW needs an additional library, mwindows # It's total link flags should look like -lmingw32 -lSDL2main -lSDL2 -lmwindows # (Actually on second look, I think it only needs one of the m* libraries.) IF(MINGW) SET(MINGW32_LIBRARY mingw32 CACHE STRING "mwindows for MinGW") ENDIF(MINGW) IF(SDL2_LIBRARY_TEMP) # For SDL2main IF(NOT SDL2_BUILDING_LIBRARY) IF(SDL2MAIN_LIBRARY) SET(SDL2_LIBRARY_TEMP ${SDL2MAIN_LIBRARY} ${SDL2_LIBRARY_TEMP}) ENDIF(SDL2MAIN_LIBRARY) ENDIF(NOT SDL2_BUILDING_LIBRARY) # For OS X, SDL2 uses Cocoa as a backend so it must link to Cocoa. # CMake doesn't display the -framework Cocoa string in the UI even # though it actually is there if I modify a pre-used variable. # I think it has something to do with the CACHE STRING. # So I use a temporary variable until the end so I can set the # "real" variable in one-shot. IF(APPLE) SET(SDL2_LIBRARY_TEMP ${SDL2_LIBRARY_TEMP} "-framework Cocoa") ENDIF(APPLE) # For threads, as mentioned Apple doesn't need this. # In fact, there seems to be a problem if I used the Threads package # and try using this line, so I'm just skipping it entirely for OS X. IF(NOT APPLE) SET(SDL2_LIBRARY_TEMP ${SDL2_LIBRARY_TEMP} ${CMAKE_THREAD_LIBS_INIT}) ENDIF(NOT APPLE) # For MinGW library IF(MINGW) SET(SDL2_LIBRARY_TEMP ${MINGW32_LIBRARY} ${SDL2_LIBRARY_TEMP}) ENDIF(MINGW) # Set the final string here so the GUI reflects the final state. SET(SDL2_LIBRARY ${SDL2_LIBRARY_TEMP} CACHE STRING "Where the SDL2 Library can be found") # Set the temp variable to INTERNAL so it is not seen in the CMake GUI SET(SDL2_LIBRARY_TEMP "${SDL2_LIBRARY_TEMP}" CACHE INTERNAL "") ENDIF(SDL2_LIBRARY_TEMP) #message("") INCLUDE(FindPackageHandleStandardArgs) FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL2 REQUIRED_VARS SDL2_LIBRARY SDL2_INCLUDE_DIR) fifengine-0.4.2/cmake/FindSDL2_image.cmake000066400000000000000000000075421341615052600202130ustar00rootroot00000000000000# Locate SDL_image library # # This module defines: # # :: # # SDL_IMAGE_LIBRARIES, the name of the library to link against # SDL_IMAGE_INCLUDE_DIRS, where to find the headers # SDL_IMAGE_FOUND, if false, do not try to link against # SDL_IMAGE_VERSION_STRING - human-readable string containing the version of SDL_image # # # # For backward compatiblity the following variables are also set: # # :: # # SDLIMAGE_LIBRARY (same value as SDL_IMAGE_LIBRARIES) # SDLIMAGE_INCLUDE_DIR (same value as SDL_IMAGE_INCLUDE_DIRS) # SDLIMAGE_FOUND (same value as SDL_IMAGE_FOUND) # # # # $SDLDIR is an environment variable that would correspond to the # ./configure --prefix=$SDLDIR used in building SDL. # # Created by Eric Wing. This was influenced by the FindSDL.cmake # module, but with modifications to recognize OS X frameworks and # additional Unix paths (FreeBSD, etc). #============================================================================= # Copyright 2005-2009 Kitware, Inc. # Copyright 2012 Benjamin Eikel # # Distributed under the OSI-approved BSD License (the "License"); # see accompanying file Copyright.txt for details. # # This software is distributed WITHOUT ANY WARRANTY; without even the # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # See the License for more information. #============================================================================= # (To distribute this file outside of CMake, substitute the full # License text for the above reference.) find_path(SDL2_IMAGE_INCLUDE_DIR SDL_image.h HINTS ENV SDL2IMAGEDIR ENV SDL2DIR PATH_SUFFIXES SDL2 # path suffixes to search inside ENV{SDLDIR} include/SDL2 include PATHS ${SDL2_PATH} ) if(CMAKE_SIZEOF_VOID_P EQUAL 8) set(VC_LIB_PATH_SUFFIX lib/x64) else() set(VC_LIB_PATH_SUFFIX lib/x86) endif() find_library(SDL2_IMAGE_LIBRARY NAMES SDL2_image HINTS ENV SDL2IMAGEDIR ENV SDL2DIR PATH_SUFFIXES lib ${VC_LIB_PATH_SUFFIX} PATHS ${SDL2_PATH} ) if(SDL2_IMAGE_INCLUDE_DIR AND EXISTS "${SDL2_IMAGE_INCLUDE_DIR}/SDL_image.h") file(STRINGS "${SDL2_IMAGE_INCLUDE_DIR}/SDL_image.h" SDL2_IMAGE_VERSION_MAJOR_LINE REGEX "^#define[ \t]+SDL_IMAGE_MAJOR_VERSION[ \t]+[0-9]+$") file(STRINGS "${SDL2_IMAGE_INCLUDE_DIR}/SDL_image.h" SDL2_IMAGE_VERSION_MINOR_LINE REGEX "^#define[ \t]+SDL_IMAGE_MINOR_VERSION[ \t]+[0-9]+$") file(STRINGS "${SDL2_IMAGE_INCLUDE_DIR}/SDL_image.h" SDL2_IMAGE_VERSION_PATCH_LINE REGEX "^#define[ \t]+SDL_IMAGE_PATCHLEVEL[ \t]+[0-9]+$") string(REGEX REPLACE "^#define[ \t]+SDL_IMAGE_MAJOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_IMAGE_VERSION_MAJOR "${SDL2_IMAGE_VERSION_MAJOR_LINE}") string(REGEX REPLACE "^#define[ \t]+SDL_IMAGE_MINOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_IMAGE_VERSION_MINOR "${SDL2_IMAGE_VERSION_MINOR_LINE}") string(REGEX REPLACE "^#define[ \t]+SDL_IMAGE_PATCHLEVEL[ \t]+([0-9]+)$" "\\1" SDL2_IMAGE_VERSION_PATCH "${SDL2_IMAGE_VERSION_PATCH_LINE}") set(SDL2_IMAGE_VERSION_STRING ${SDL2_IMAGE_VERSION_MAJOR}.${SDL2_IMAGE_VERSION_MINOR}.${SDL2_IMAGE_VERSION_PATCH}) unset(SDL2_IMAGE_VERSION_MAJOR_LINE) unset(SDL2_IMAGE_VERSION_MINOR_LINE) unset(SDL2_IMAGE_VERSION_PATCH_LINE) unset(SDL2_IMAGE_VERSION_MAJOR) unset(SDL2_IMAGE_VERSION_MINOR) unset(SDL2_IMAGE_VERSION_PATCH) endif() set(SDL2_IMAGE_LIBRARIES ${SDL2_IMAGE_LIBRARY}) set(SDL2_IMAGE_INCLUDE_DIRS ${SDL2_IMAGE_INCLUDE_DIR}) include(FindPackageHandleStandardArgs) FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL2_image REQUIRED_VARS SDL2_IMAGE_LIBRARIES SDL2_IMAGE_INCLUDE_DIRS VERSION_VAR SDL2_IMAGE_VERSION_STRING) # for backward compatiblity #set(SDLIMAGE_LIBRARY ${SDL_IMAGE_LIBRARIES}) #set(SDLIMAGE_INCLUDE_DIR ${SDL_IMAGE_INCLUDE_DIRS}) #set(SDLIMAGE_FOUND ${SDL_IMAGE_FOUND}) mark_as_advanced(SDL2_IMAGE_LIBRARY SDL2_IMAGE_INCLUDE_DIR) fifengine-0.4.2/cmake/FindSDL2_ttf.cmake000066400000000000000000000072461341615052600177270ustar00rootroot00000000000000# Locate SDL_image library # # This module defines: # # :: # # SDL_TTF_LIBRARIES, the name of the library to link against # SDL_TTF_INCLUDE_DIRS, where to find the headers # SDL_TTF_FOUND, if false, do not try to link against # SDL_F_VERSION_STRING - human-readable string containing the version of SDL_ttf # # # # For backward compatiblity the following variables are also set: # # :: # # SDLTTF_LIBRARY (same value as SDL_TTF_LIBRARIES) # SDLTTF_INCLUDE_DIR (same value as SDL_TTF_INCLUDE_DIRS) # SDLTTF_FOUND (same value as SDL_TTF_FOUND) # # # # $SDLDIR is an environment variable that would correspond to the # ./configure --prefix=$SDLDIR used in building SDL. # # Created by Eric Wing. This was influenced by the FindSDL.cmake # module, but with modifications to recognize OS X frameworks and # additional Unix paths (FreeBSD, etc). #============================================================================= # Copyright 2005-2009 Kitware, Inc. # Copyright 2012 Benjamin Eikel # # Distributed under the OSI-approved BSD License (the "License"); # see accompanying file Copyright.txt for details. # # This software is distributed WITHOUT ANY WARRANTY; without even the # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # See the License for more information. #============================================================================= # (To distribute this file outside of CMake, substitute the full # License text for the above reference.) find_path(SDL2_TTF_INCLUDE_DIR SDL_ttf.h HINTS ENV SDL2TTFDIR ENV SDL2DIR PATH_SUFFIXES SDL2 # path suffixes to search inside ENV{SDLDIR} include/SDL2 include PATHS ${SDL2_PATH} ) if (CMAKE_SIZEOF_VOID_P EQUAL 8) set(VC_LIB_PATH_SUFFIX lib/x64) else () set(VC_LIB_PATH_SUFFIX lib/x86) endif () find_library(SDL2_TTF_LIBRARY NAMES SDL2_ttf HINTS ENV SDL2TTFDIR ENV SDL2DIR PATH_SUFFIXES lib ${VC_LIB_PATH_SUFFIX} PATHS ${SDL2_PATH} ) if (SDL2_TTF_INCLUDE_DIR AND EXISTS "${SDL2_TTF_INCLUDE_DIR}/SDL_ttf.h") file(STRINGS "${SDL2_TTF_INCLUDE_DIR}/SDL_ttf.h" SDL2_TTF_VERSION_MAJOR_LINE REGEX "^#define[ \t]+SDL_TTF_MAJOR_VERSION[ \t]+[0-9]+$") file(STRINGS "${SDL2_TTF_INCLUDE_DIR}/SDL_ttf.h" SDL2_TTF_VERSION_MINOR_LINE REGEX "^#define[ \t]+SDL_TTF_MINOR_VERSION[ \t]+[0-9]+$") file(STRINGS "${SDL2_TTF_INCLUDE_DIR}/SDL_ttf.h" SDL2_TTF_VERSION_PATCH_LINE REGEX "^#define[ \t]+SDL_TTF_PATCHLEVEL[ \t]+[0-9]+$") string(REGEX REPLACE "^#define[ \t]+SDL_TTF_MAJOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_TTF_VERSION_MAJOR "${SDL2_TTF_VERSION_MAJOR_LINE}") string(REGEX REPLACE "^#define[ \t]+SDL_TTF_MINOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_TTF_VERSION_MINOR "${SDL2_TTF_VERSION_MINOR_LINE}") string(REGEX REPLACE "^#define[ \t]+SDL_TTF_PATCHLEVEL[ \t]+([0-9]+)$" "\\1" SDL2_TTF_VERSION_PATCH "${SDL2_TTF_VERSION_PATCH_LINE}") set(SDL2_TTF_VERSION_STRING ${SDL2_TTF_VERSION_MAJOR}.${SDL2_TTF_VERSION_MINOR}.${SDL2_TTF_VERSION_PATCH}) unset(SDL2_TTF_VERSION_MAJOR_LINE) unset(SDL2_TTF_VERSION_MINOR_LINE) unset(SDL2_TTF_VERSION_PATCH_LINE) unset(SDL2_TTF_VERSION_MAJOR) unset(SDL2_TTF_VERSION_MINOR) unset(SDL2_TTF_VERSION_PATCH) endif () set(SDL2_TTF_LIBRARIES ${SDL2_TTF_LIBRARY}) set(SDL2_TTF_INCLUDE_DIRS ${SDL2_TTF_INCLUDE_DIR}) include(FindPackageHandleStandardArgs) FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL2_ttf REQUIRED_VARS SDL2_TTF_LIBRARIES SDL2_TTF_INCLUDE_DIRS VERSION_VAR SDL2_TTF_VERSION_STRING) # for backward compatiblity #set(SDLTTF_LIBRARY ${SDL_TTF_LIBRARIES}) #set(SDLTTF_INCLUDE_DIR ${SDL_TTF_INCLUDE_DIRS}) #set(SDLTTF_FOUND ${SDL_TTF_FOUND}) fifengine-0.4.2/cmake/FindTinyXML.cmake000066400000000000000000000107271341615052600176500ustar00rootroot00000000000000################################################################################################## #Copyright (c) 2013-2019, Open Source Robotics Foundation #All rights reserved. # #Redistribution and use in source and binary forms, with or without modification, #are permitted provided that the following conditions are met: # # Redistributions of source code must retain the above copyright notice, this # list of conditions and the following disclaimer. # # Redistributions in binary form must reproduce the above copyright notice, this # list of conditions and the following disclaimer in the documentation and/or # other materials provided with the distribution. # # Neither the name of the {organization} nor the names of its # contributors may be used to endorse or promote products derived from # this software without specific prior written permission. # #THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND #ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE #DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR #ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES #(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; #LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON #ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT #(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS #SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ################################################################################################## ################################################################################################## # # CMake script for finding TinyXML. # # Input variables: # # - TinyXML_ROOT_DIR (optional): When specified, header files and libraries will be searched for in # ${TinyXML_ROOT_DIR}/include # ${TinyXML_ROOT_DIR}/libs # respectively, and the default CMake search order will be ignored. When unspecified, the default # CMake search order is used. # This variable can be specified either as a CMake or environment variable. If both are set, # preference is given to the CMake variable. # Use this variable for finding packages installed in a nonstandard location, or for enforcing # that one of multiple package installations is picked up. # # # Cache variables (not intended to be used in CMakeLists.txt files) # # - TinyXML_INCLUDE_DIR: Absolute path to package headers. # - TinyXML_LIBRARY: Absolute path to library. # # # Output variables: # # - TinyXML_FOUND: Boolean that indicates if the package was found # - TinyXML_INCLUDE_DIRS: Paths to the necessary header files # - TinyXML_LIBRARIES: Package libraries # # # Example usage: # # find_package(TinyXML) # if(NOT TinyXML_FOUND) # # Error handling # endif() # ... # include_directories(${TinyXML_INCLUDE_DIRS} ...) # ... # target_link_libraries(my_target ${TinyXML_LIBRARIES}) # ################################################################################################## # Get package location hint from environment variable (if any) if(NOT TinyXML_ROOT_DIR AND DEFINED ENV{TinyXML_ROOT_DIR}) set(TinyXML_ROOT_DIR "$ENV{TinyXML_ROOT_DIR}" CACHE PATH "TinyXML base directory location (optional, used for nonstandard installation paths)") endif() # Search path for nonstandard package locations if(TinyXML_ROOT_DIR) set(TinyXML_INCLUDE_PATH PATHS "${TinyXML_ROOT_DIR}/include" NO_DEFAULT_PATH) set(TinyXML_LIBRARY_PATH PATHS "${TinyXML_ROOT_DIR}/lib" NO_DEFAULT_PATH) endif() # Find headers and libraries find_path(TinyXML_INCLUDE_DIR NAMES tinyxml.h PATH_SUFFIXES "tinyxml" ${TinyXML_INCLUDE_PATH}) find_library(TinyXML_LIBRARY NAMES tinyxml PATH_SUFFIXES "tinyxml" ${TinyXML_LIBRARY_PATH}) mark_as_advanced(TinyXML_INCLUDE_DIR TinyXML_LIBRARY) # Output variables generation include(FindPackageHandleStandardArgs) find_package_handle_standard_args(TinyXML DEFAULT_MSG TinyXML_LIBRARY TinyXML_INCLUDE_DIR) set(TinyXML_FOUND ${TINYXML_FOUND}) # Enforce case-correctness: Set appropriately cased variable... unset(TINYXML_FOUND) # ...and unset uppercase variable generated by find_package_handle_standard_args if(TinyXML_FOUND) set(TinyXML_INCLUDE_DIRS ${TinyXML_INCLUDE_DIR}) set(TinyXML_LIBRARIES ${TinyXML_LIBRARY}) endif() fifengine-0.4.2/cmake/FindVORBIS.cmake000066400000000000000000000016451341615052600173470ustar00rootroot00000000000000# - Try to find VORBIS # and define # # VORBIS_FOUND - System has VORBIS # VORBIS_INCLUDE_DIRS - The include directories # VORBIS_LIBRARY - The libraries # VORBISFILE_LIBRARY - The vorbisfile # try to find package and provide a hint find_package(PkgConfig QUIET) pkg_check_modules(PC_VORBISFILE QUIET vorbisfile) find_path(VORBIS_INCLUDE_DIRS NAMES vorbis/vorbisfile.h HINTS ${PC_VORBIS_INCLUDE_DIRS} PATH_SUFFIXES vorbis) find_library(VORBIS_LIBRARY NAMES vorbis HINTS ${PC_VORBIS_LIBRARY_DIRS}) # Find vorbisfile dependency find_package(PkgConfig QUIET) pkg_check_modules(PC_VORBISFILE QUIET vorbisfile) find_library(VORBISFILE_LIBRARY NAMES vorbisfile HINTS ${PC_VORBIS_LIBRARY_DIRS}) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(vorbis DEFAULT_MSG VORBIS_LIBRARY VORBIS_INCLUDE_DIRS) find_package_handle_standard_args(vorbisfile DEFAULT_MSG VORBISFILE_LIBRARY VORBIS_INCLUDE_DIRS)fifengine-0.4.2/cmake/get-fifechan.cmake000066400000000000000000000061001341615052600200510ustar00rootroot00000000000000#------------------------------------------------------------------------------ # External Project: FifeChan / FifeGUI # Downloads: https://github.com/fifengine/fifechan/releases #------------------------------------------------------------------------------ include(ExternalProject) set(FIFECHAN_VERSION "0.1.5") # For Windows it's faster to download the pre-compiled development binaries. if (WIN32) #if(MINGW) # download pre-compiled dev package for MinGW 32/64-bit #ExternalProject_Add( #fifechan #PREFIX ${DEPENDENCY_EXTRACT_DIR} #DOWNLOAD_DIR ${DEPENDENCY_DOWNLOAD_DIR} #URL https://github.com/fifengine/fifechan/releases/tag/${FIFECHAN_VERSION}/fifechan-v${FIFECHAN_VERSION}-MinGW.tar.gz #URL https://ci.appveyor.com/api/projects/jakoch/fifechan/artifacts/fifechan-shared-MinGW.tar.gz #URL_MD5 1 #CONFIGURE_COMMAND "" #BUILD_COMMAND "" #INSTALL_COMMAND #COMMAND ${CMAKE_COMMAND} -E copy_directory ${DEPENDENCY_EXTRACT_DIR}/src/fifechan/lib ${DEPENDENCY_INSTALL_DIR}/lib #COMMAND ${CMAKE_COMMAND} -E copy_directory ${DEPENDENCY_EXTRACT_DIR}/src/fifechan/include ${DEPENDENCY_INSTALL_DIR}/include/fifechan #) #endif(MINGW) if(MSVC) # download pre-compiled dev package for Visual C++ 32/64-bit ExternalProject_Add( fifechan PREFIX ${DEPENDENCY_EXTRACT_DIR} DOWNLOAD_DIR ${DEPENDENCY_DOWNLOAD_DIR} URL https://github.com/fifengine/fifechan/releases/download/0.1.5/fifechan-shared-0.1.5-VC15-x86.zip #URL https://ci.appveyor.com/api/buildjobs/5rg5bi98ta05l6v0/artifacts/fifechan-shared-dev-cf9d15b-VC15-x86.zip URL_MD5 9d561d10409d71a54f18871f1a3181de CONFIGURE_COMMAND "" BUILD_COMMAND "" INSTALL_COMMAND COMMAND ${CMAKE_COMMAND} -E copy_directory ${DEPENDENCY_EXTRACT_DIR}/src/fifechan/bin ${DEPENDENCY_INSTALL_DIR}/bin COMMAND ${CMAKE_COMMAND} -E copy_directory ${DEPENDENCY_EXTRACT_DIR}/src/fifechan/lib ${DEPENDENCY_INSTALL_DIR}/lib COMMAND ${CMAKE_COMMAND} -E copy_directory ${DEPENDENCY_EXTRACT_DIR}/src/fifechan/include ${DEPENDENCY_INSTALL_DIR}/include/fifechan ) endif(MSVC) else() # build from source set(FIFECHAN_CMAKE_ARGS -DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS} -DCMAKE_INSTALL_PREFIX:PATH= -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} -DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES} ) ExternalProject_Add( fifechan PREFIX ${DEPENDENCY_EXTRACT_DIR} DOWNLOAD_DIR ${DEPENDENCY_DOWNLOAD_DIR} URL https://github.com/fifengine/fifechan/archive/master.zip URL_MD5 1 #CONFIGURE_COMMAND /configure --prefix=${DEPENDENCY_INSTALL_DIR} INSTALL_DIR ${DEPENDENCY_INSTALL_DIR} CMAKE_ARGS ${FIFECHAN_CMAKE_ARGS} ) endif() fifengine-0.4.2/cmake/get-glew.cmake000066400000000000000000000030221341615052600172440ustar00rootroot00000000000000#------------------------------------------------------------------------------ # External Project: GLEW - OpenGL Extension Wrangler Library # Downloads: http://glew.sourceforge.net/ # Github: https://github.com/nigels-com/glew #------------------------------------------------------------------------------ include(ExternalProject) set(GLEW_VERSION "2.1.0") # For Windows it's faster to download the pre-compiled development binaries. if (WIN32) ExternalProject_Add( glew PREFIX ${DEPENDENCY_EXTRACT_DIR} DOWNLOAD_DIR ${DEPENDENCY_DOWNLOAD_DIR} #URL https://github.com/nigels-com/glew/releases/download/glew-${GLEW_VERSION}/glew-${GLEW_VERSION}-win32.zip Download link is broken URL https://downloads.sourceforge.net/project/glew/glew/${GLEW_VERSION}/glew-${GLEW_VERSION}-win32.zip URL_MD5 32a72e6b43367db8dbea6010cd095355 CONFIGURE_COMMAND "" BUILD_COMMAND "" INSTALL_COMMAND COMMAND ${CMAKE_COMMAND} -E copy_directory ${DEPENDENCY_EXTRACT_DIR}/src/glew/bin/Release/Win32/ ${DEPENDENCY_INSTALL_DIR}/bin COMMAND ${CMAKE_COMMAND} -E copy_directory ${DEPENDENCY_EXTRACT_DIR}/src/glew/lib/Release/Win32/ ${DEPENDENCY_INSTALL_DIR}/lib COMMAND ${CMAKE_COMMAND} -E copy_directory ${DEPENDENCY_EXTRACT_DIR}/src/glew/include/GL ${DEPENDENCY_INSTALL_DIR}/include/GL ) else() # build from source # TODO endif() fifengine-0.4.2/cmake/get-libogg.cmake000066400000000000000000000021551341615052600175570ustar00rootroot00000000000000#------------------------------------------------------------------------------ # External Project: libogg # Downloads: http://downloads.xiph.org/releases/ogg/ #------------------------------------------------------------------------------ include(ExternalProject) set(LIBOGG_VERSION "1.3.3") set(LIBOGG_CMAKE_ARGS ${COMMON_CMAKE_ARGS} -G ${CMAKE_GENERATOR} -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX=${DEPENDENCY_INSTALL_DIR} -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} -DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES} ) ExternalProject_Add( libogg PREFIX ${DEPENDENCY_EXTRACT_DIR} DOWNLOAD_DIR ${DEPENDENCY_DOWNLOAD_DIR} DOWNLOAD_NAME libogg-${LIBOGG_VERSION}.zip URL http://downloads.xiph.org/releases/ogg/libogg-${LIBOGG_VERSION}.zip URL_MD5 1e1fb35dea32c804cfb13da6a94d0655 PATCH_COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_MODULE_PATH}/patches/libogg/CMakeLists.txt ${DEPENDENCY_EXTRACT_DIR}/src/libogg CMAKE_ARGS ${LIBOGG_CMAKE_ARGS} ) fifengine-0.4.2/cmake/get-libpng.cmake000066400000000000000000000037751341615052600176000ustar00rootroot00000000000000#------------------------------------------------------------------------------ # External Project: libpng # Website: http://www.libpng.org/pub/png/libpng.html # Downloads: https://github.com/glennrp/libpng/archive/v1.6.35.zip # Github: https://github.com/glennrp/libpng #------------------------------------------------------------------------------ include(ExternalProject) set(LIBPNG_VERSION "1.6.35") set(LIBPNG_CMAKE_ARGS ${COMMON_CMAKE_ARGS} -DCMAKE_INSTALL_PREFIX:PATH= -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_CONFIGURATION_TYPES=Release -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} -DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES} -DCMAKE_C_FLAGS=${CMAKE_C_FLAGS} -DBUILD_SHARED_LIBS=FALSE -DPNG_SHARED=off -DPNG_STATIC=on -DPNG_TESTS=off -DZLIB_LIBRARY:FILEPATH=${DEPENDENCY_INSTALL_DIR}/lib/zlib.lib -DZLIB_INCLUDE_DIR:PATH=${DEPENDENCY_INSTALL_DIR}/include ) ExternalProject_Add( libpng DEPENDS zlib PREFIX ${DEPENDENCY_EXTRACT_DIR} DOWNLOAD_DIR ${DEPENDENCY_DOWNLOAD_DIR} DOWNLOAD_NAME libpng-v${LIBPNG_VERSION}.zip URL https://github.com/glennrp/libpng/archive/v${LIBPNG_VERSION}.zip URL_MD5 160403f7a8784c300bc75f5e16cecaef INSTALL_DIR ${DEPENDENCY_INSTALL_DIR} CONFIGURE_COMMAND ${CMAKE_COMMAND} ${DEPENDENCY_EXTRACT_DIR}/src/libpng -G ${CMAKE_GENERATOR} -DZLIB_INCLUDE_DIR:PATH=${DEPENDENCY_INSTALL_DIR}/include -DZLIB_LIBRARY:FILEPATH=${DEPENDENCY_INSTALL_DIR}/lib/zlib.lib -DCMAKE_INSTALL_PREFIX=${DEPENDENCY_INSTALL_DIR} BUILD_COMMAND ${CMAKE_COMMAND} --build ${DEPENDENCY_EXTRACT_DIR}/src/libpng-build --config Release --target INSTALL #BUILD_COMMAND msbuild libpng.sln /target:INSTALL /p:Platform=Win32 /p:Configuration=Release #INSTALL_COMMAND msbuild libpng.sln /build Release /project INSTALL #CMAKE_ARGS ${LIBPNG_CMAKE_ARGS} ) fifengine-0.4.2/cmake/get-libvorbis.cmake000066400000000000000000000026751341615052600203160ustar00rootroot00000000000000#------------------------------------------------------------------------------ # External Project: libvorbis # Downloads: http://downloads.xiph.org/releases/vorbis/ #------------------------------------------------------------------------------ include(ExternalProject) set(LIBVORBIS_VERSION "1.3.6") set(LIBVORBIS_CMAKE_ARGS ${COMMON_CMAKE_ARGS} -G ${CMAKE_GENERATOR} -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX=${DEPENDENCY_INSTALL_DIR} -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} -DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES} # find libogg -DCMAKE_PREFIX_PATH=${DEPENDENCY_INSTALL_DIR} ${CMAKE_PREFIX_PATH} -DOGG_LIBRARY=${DEPENDENCY_INSTALL_DIR}/lib/ogg.lib -DOGG_INCLUDE_DIR=${DEPENDENCY_INSTALL_DIR}/include ) if(WIN32) add_definitions(-D_USE_MATH_DEFINES) endif() ExternalProject_Add( libvorbis DEPENDS libogg PREFIX ${DEPENDENCY_EXTRACT_DIR} DOWNLOAD_DIR ${DEPENDENCY_DOWNLOAD_DIR} DOWNLOAD_NAME libvorbis-${LIBVORBIS_VERSION}.zip URL http://downloads.xiph.org/releases/vorbis/libvorbis-${LIBVORBIS_VERSION}.zip URL_MD5 616e425b966604fc9e3bc09df96a3458 PATCH_COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_MODULE_PATH}/patches/libvorbis/CMakeLists.txt ${DEPENDENCY_EXTRACT_DIR}/src/libvorbis CMAKE_ARGS ${LIBVORBIS_CMAKE_ARGS} ) fifengine-0.4.2/cmake/get-openalsoft.cmake000066400000000000000000000047111341615052600204660ustar00rootroot00000000000000#------------------------------------------------------------------------------ # External Project: OpenAL-Soft # # Website: http://kcat.strangesoft.net/openal.html # Downloads: http://kcat.strangesoft.net/openal.html#download # # Alternative Downloads: http://kcat.strangesoft.net/openal-binaries/ # http://kcat.strangesoft.net/openal-releases/ #------------------------------------------------------------------------------ INCLUDE(ExternalProject) set(OPENALSOFT_VERSION "1.18.2") # For win32 it's faster to download the pre-compiled development binaries. if (WIN32) ExternalProject_Add( openalsoft PREFIX ${DEPENDENCY_EXTRACT_DIR} DOWNLOAD_DIR ${DEPENDENCY_DOWNLOAD_DIR} URL http://kcat.strangesoft.net/openal-binaries/openal-soft-${OPENALSOFT_VERSION}-bin.zip URL_MD5 03cf7160ca84c36c2e6560fb278308fc INSTALL_DIR ${DEPENDENCY_INSTALL_DIR} CONFIGURE_COMMAND "" BUILD_COMMAND "" INSTALL_COMMAND COMMAND ${CMAKE_COMMAND} -E copy ${DEPENDENCY_EXTRACT_DIR}/src/openalsoft/bin/Win32/soft_oal.dll ${DEPENDENCY_INSTALL_DIR}/bin/OpenAL32.dll COMMAND ${CMAKE_COMMAND} -E copy_directory ${DEPENDENCY_EXTRACT_DIR}/src/openalsoft/libs/Win32 ${DEPENDENCY_INSTALL_DIR}/lib COMMAND ${CMAKE_COMMAND} -E copy_directory ${DEPENDENCY_EXTRACT_DIR}/src/openalsoft/include/AL ${DEPENDENCY_INSTALL_DIR}/include/AL ) else() # build from source SET(OPENALSOFT_PREFIX ${CMAKE_CURRENT_BINARY_DIR}/openal) SET(OPENALSOFT_CMAKE_ARGS ${COMMON_CMAKE_ARGS} -DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS} -DCMAKE_INSTALL_PREFIX:PATH= -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} -DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES} -DCMAKE_DEBUG_POSTFIX=d -DALSOFT_CONFIG=OFF -DALSOFT_EXAMPLES=OFF -DALSOFT_NO_CONFIG_UTIL=ON -DALSOFT_UTILS=OFF #-DLIBTYPE=STATIC ) ExternalProject_Add( openalsoft PREFIX ${DEPENDENCY_EXTRACT_DIR} DOWNLOAD_DIR ${DEPENDENCY_DOWNLOAD_DIR} URL http://kcat.strangesoft.net/openal-releases/openal-soft-${OPENALSOFT_VERSION}.tar.bz2 URL_MD5 d4eeb0889812e2fdeaa1843523d76190 INSTALL_DIR ${DEPENDENCY_INSTALL_DIR} CMAKE_ARGS ${OPENALSOFT_CMAKE_ARGS} ) endif() fifengine-0.4.2/cmake/get-sdl2.cmake000066400000000000000000000045701341615052600171630ustar00rootroot00000000000000#------------------------------------------------------------------------------ # External Project: SDL2 # Downloads: https://libsdl.org/release/ #------------------------------------------------------------------------------ include(ExternalProject) set(SDL2_VERSION "2.0.9") # For Windows it's faster to download the pre-compiled development binaries. if (WIN32) if(MINGW) # download pre-compiled SDL2 dev package for MinGW 32/64-bit ExternalProject_Add( sdl2 PREFIX ${DEPENDENCY_EXTRACT_DIR} DOWNLOAD_DIR ${DEPENDENCY_DOWNLOAD_DIR} URL http://libsdl.org/release/SDL2-devel-${SDL2_VERSION}-mingw.tar.gz URL_MD5 f5645eed64214c3bc22a3e157fc1f15f CONFIGURE_COMMAND "" BUILD_COMMAND "" INSTALL_COMMAND COMMAND ${CMAKE_COMMAND} -E copy_directory ${DEPENDENCY_EXTRACT_DIR}/src/sdl2/lib ${DEPENDENCY_INSTALL_DIR}/lib COMMAND ${CMAKE_COMMAND} -E copy_directory ${DEPENDENCY_EXTRACT_DIR}/src/sdl2/include ${DEPENDENCY_INSTALL_DIR}/include/SDL2 ) endif(MINGW) if(MSVC) # download pre-compiled SDL2 dev package for Visual C++ 32/64-bit ExternalProject_Add( sdl2 PREFIX ${DEPENDENCY_EXTRACT_DIR} DOWNLOAD_DIR ${DEPENDENCY_DOWNLOAD_DIR} URL http://libsdl.org/release/SDL2-devel-${SDL2_VERSION}-VC.zip URL_MD5 22bdb85ce4874673c4fafcce772d8b72 CONFIGURE_COMMAND "" BUILD_COMMAND "" INSTALL_COMMAND COMMAND ${CMAKE_COMMAND} -E copy_directory ${DEPENDENCY_EXTRACT_DIR}/src/sdl2/lib ${DEPENDENCY_INSTALL_DIR}/lib COMMAND ${CMAKE_COMMAND} -E copy_directory ${DEPENDENCY_EXTRACT_DIR}/src/sdl2/include ${DEPENDENCY_INSTALL_DIR}/include/SDL2 ) endif(MSVC) else() # build from source set(SDL2_CMAKE_ARGS -DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS} -DCMAKE_INSTALL_PREFIX:PATH= -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} -DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES} ) ExternalProject_Add( sdl2 PREFIX ${DEPENDENCY_EXTRACT_DIR} DOWNLOAD_DIR ${DEPENDENCY_DOWNLOAD_DIR} URL http://libsdl.org/release/SDL2-${SDL2_VERSION}.tar.gz URL_MD5 f2ecfba915c54f7200f504d8b48a5dfe #CONFIGURE_COMMAND /configure --prefix=${DEPENDENCY_INSTALL_DIR} INSTALL_DIR ${DEPENDENCY_INSTALL_DIR} CMAKE_ARGS ${SDL2_CMAKE_ARGS} ) endif() fifengine-0.4.2/cmake/get-sdl2_image.cmake000066400000000000000000000044031341615052600203200ustar00rootroot00000000000000#------------------------------------------------------------------------------ # External Project: SDL2_image # Downloads: https://libsdl.org/projects/SDL_image/ #------------------------------------------------------------------------------ include(ExternalProject) set(SDL2_IMAGE_VERSION "2.0.4") # For win32 it's faster to download the pre-compiled development binaries. if (WIN32) if(MINGW) # download pre-compiled SDL2 dev package for MinGW 32/64-bit ExternalProject_Add( sdl2-image DEPENDS sdl2 PREFIX ${DEPENDENCY_EXTRACT_DIR} DOWNLOAD_DIR ${DEPENDENCY_DOWNLOAD_DIR} URL https://libsdl.org/projects/SDL_image/release/SDL2_image-devel-${SDL2_IMAGE_VERSION}-mingw.tar.gz URL_MD5 53fd232ce4d70a3af18909a8a7248094 CONFIGURE_COMMAND "" BUILD_COMMAND "" INSTALL_COMMAND COMMAND ${CMAKE_COMMAND} -E copy_directory ${DEPENDENCY_EXTRACT_DIR}/src/sdl2-image/lib ${DEPENDENCY_INSTALL_DIR}/lib COMMAND ${CMAKE_COMMAND} -E copy_directory ${DEPENDENCY_EXTRACT_DIR}/src/sdl2-image/include ${DEPENDENCY_INSTALL_DIR}/include/SDL2 ) endif(MINGW) if(MSVC) # download pre-compiled SDL2 dev package for Visual C++ 32/64-bit ExternalProject_Add( sdl2-image DEPENDS sdl2 PREFIX ${DEPENDENCY_EXTRACT_DIR} DOWNLOAD_DIR ${DEPENDENCY_DOWNLOAD_DIR} URL https://libsdl.org/projects/SDL_image/release/SDL2_image-devel-${SDL2_IMAGE_VERSION}-VC.zip URL_MD5 9435e3ecc2f03eed6a24c7ed2dd96d99 CONFIGURE_COMMAND "" BUILD_COMMAND "" INSTALL_COMMAND COMMAND ${CMAKE_COMMAND} -E copy_directory ${DEPENDENCY_EXTRACT_DIR}/src/sdl2-image/lib ${DEPENDENCY_INSTALL_DIR}/lib COMMAND ${CMAKE_COMMAND} -E copy_directory ${DEPENDENCY_EXTRACT_DIR}/src/sdl2-image/include ${DEPENDENCY_INSTALL_DIR}/include/SDL2 ) endif(MSVC) else() # build from source ExternalProject_Add( sdl2-image PREFIX ${DEPENDENCY_EXTRACT_DIR} DOWNLOAD_DIR ${DEPENDENCY_DOWNLOAD_DIR} URL https://libsdl.org/projects/SDL_image/release/SDL2_image-${SDL2_IMAGE_VERSION}.tar.gz URL_MD5 88b9766d5b64a67f82ba511c57e7ce10 CONFIGURE_COMMAND /configure --prefix=${DEPENDENCY_INSTALL_DIR} ) endif()fifengine-0.4.2/cmake/get-sdl2_ttf.cmake000066400000000000000000000050131341615052600200310ustar00rootroot00000000000000#------------------------------------------------------------------------------ # External Project: SDL2_ttf # Downloads: https://libsdl.org/projects/SDL_ttf/ #------------------------------------------------------------------------------ include(ExternalProject) set(SDL2_TTF_VERSION "2.0.14") # For win32 it's faster to download the pre-compiled development binaries. if (WIN32) if(MINGW) # download pre-compiled SDL2 dev package for MinGW 32/64-bit ExternalProject_Add( sdl2-ttf DEPENDS sdl2 PREFIX ${DEPENDENCY_EXTRACT_DIR} DOWNLOAD_DIR ${DEPENDENCY_DOWNLOAD_DIR} URL https://libsdl.org/projects/SDL_ttf/release/SDL2_ttf-devel-${SDL2_TTF_VERSION}-mingw.tar.gz URL_MD5 1 CONFIGURE_COMMAND "" BUILD_COMMAND "" INSTALL_COMMAND COMMAND ${CMAKE_COMMAND} -E copy_directory ${DEPENDENCY_EXTRACT_DIR}/src/sdl2-ttf/lib ${DEPENDENCY_INSTALL_DIR}/lib COMMAND ${CMAKE_COMMAND} -E copy_directory ${DEPENDENCY_EXTRACT_DIR}/src/sdl2-ttf/include ${DEPENDENCY_INSTALL_DIR}/include/SDL2 ) endif(MINGW) if(MSVC) # download pre-compiled SDL2 dev package for Visual C++ 32/64-bit ExternalProject_Add( sdl2-ttf DEPENDS sdl2 PREFIX ${DEPENDENCY_EXTRACT_DIR} DOWNLOAD_DIR ${DEPENDENCY_DOWNLOAD_DIR} URL https://libsdl.org/projects/SDL_ttf/release/SDL2_ttf-devel-${SDL2_TTF_VERSION}-VC.zip URL_MD5 304d4aa67fec7a5a8c3c47c4639b91e2 CONFIGURE_COMMAND "" BUILD_COMMAND "" INSTALL_COMMAND COMMAND ${CMAKE_COMMAND} -E copy_directory ${DEPENDENCY_EXTRACT_DIR}/src/sdl2-ttf/lib ${DEPENDENCY_INSTALL_DIR}/lib COMMAND ${CMAKE_COMMAND} -E copy_directory ${DEPENDENCY_EXTRACT_DIR}/src/sdl2-ttf/include ${DEPENDENCY_INSTALL_DIR}/include/SDL2 ) endif(MSVC) else() # build from source ExternalProject_Add( freetype2 PREFIX ${DEPENDENCY_EXTRACT_DIR} URL http://download.savannah.gnu.org/releases/freetype/freetype-2.4.12.tar.gz URL_MD5 1 DOWNLOAD_DIR ${DOWNLOAD_DIR} CONFIGURE_COMMAND /configure --prefix=${DEPENDENCY_INSTALL_DIR} ) ExternalProject_Add( sdl2-ttf DEPENDS freetype2 PREFIX ${DEPENDENCY_EXTRACT_DIR} DOWNLOAD_DIR ${DEPENDENCY_DOWNLOAD_DIR} URL https://www.libsdl.org/projects/SDL_ttf/release/SDL2_ttf-${SDL2_TTF_VERSION}.tar.gz URL_MD5 1 CONFIGURE_COMMAND /configure --prefix=${DEPENDENCY_INSTALL_DIR} --with-freetype-prefix=${DEPENDENCY_INSTALL_DIR} ) endif()fifengine-0.4.2/cmake/get-swig.cmake000066400000000000000000000030471341615052600172660ustar00rootroot00000000000000#------------------------------------------------------------------------------ # External Project: SWIG (Simplified Wrapper and Interface Generator) # # Website: http://www.swig.org/ # Downloads: http://www.swig.org/download.html #------------------------------------------------------------------------------ INCLUDE(ExternalProject) set(SWIG_VERSION "3.0.12") # For Windows it's faster to download the pre-compiled development binaries. if(WIN32) ExternalProject_Add( swig PREFIX ${DEPENDENCY_EXTRACT_DIR} DOWNLOAD_DIR ${DEPENDENCY_DOWNLOAD_DIR} URL http://downloads.sourceforge.net/project/swig/swigwin/swigwin-${SWIG_VERSION}/swigwin-${SWIG_VERSION}.zip URL_MD5 a49524dad2c91ae1920974e7062bfc93 #INSTALL_DIR ${DEPENDENCY_INSTALL_DIR}/../build-tools/swig CONFIGURE_COMMAND "" BUILD_COMMAND "" INSTALL_COMMAND COMMAND ${CMAKE_COMMAND} -E copy_directory ${DEPENDENCY_EXTRACT_DIR}/src/swig ${DEPENDENCY_INSTALL_DIR}/../build-tools/swig ) else() # TODO ExternalProject_Add( swig PREFIX ${DEPENDENCY_EXTRACT_DIR} DOWNLOAD_DIR ${DEPENDENCY_DOWNLOAD_DIR} URL http://prdownloads.sourceforge.net/swig/swig-${SWIG_VERSION}.tar.gz URL_MD5 1 INSTALL_DIR ${DEPENDENCY_INSTALL_DIR}/../build-tools/swig ) endif() fifengine-0.4.2/cmake/get-tinyxml.cmake000066400000000000000000000032751341615052600200240ustar00rootroot00000000000000#------------------------------------------------------------------------------ # External Project: TinyXML v1 # Website: https://sourceforge.net/projects/tinyxml # Downloads: https://sourceforge.net/projects/tinyxml/files/tinyxml/ #------------------------------------------------------------------------------ include(ExternalProject) set(TINYXML_VERSION "2.6.2") if (WIN32) ExternalProject_Add( tinyxml PREFIX ${DEPENDENCY_EXTRACT_DIR} DOWNLOAD_DIR ${DEPENDENCY_DOWNLOAD_DIR} DOWNLOAD_NAME tinyxml-v${TINYXML_VERSION}.zip URL http://sourceforge.net/projects/tinyxml/files/tinyxml/2.6.2/tinyxml_2_6_2.zip/download URL_MD5 2a0aaf609c9e670ec9748cd01ed52dae PATCH_COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_MODULE_PATH}/patches/tinyxml/CMakeLists.txt ${DEPENDENCY_EXTRACT_DIR}/src/tinyxml INSTALL_COMMAND ${CMAKE_COMMAND} -E make_directory ${DEPENDENCY_INSTALL_DIR}/include/tinyxml COMMAND ${CMAKE_COMMAND} -E copy ${DEPENDENCY_EXTRACT_DIR}/src/tinyxml-build/Release/tinyxml.dll ${DEPENDENCY_INSTALL_DIR}/bin/tinyxml.dll COMMAND ${CMAKE_COMMAND} -E copy ${DEPENDENCY_EXTRACT_DIR}/src/tinyxml-build/Release/tinyxml.lib ${DEPENDENCY_INSTALL_DIR}/lib/tinyxml.lib COMMAND ${CMAKE_COMMAND} -E copy ${DEPENDENCY_EXTRACT_DIR}/src/tinyxml/tinystr.h ${DEPENDENCY_INSTALL_DIR}/include/tinyxml/tinystr.h COMMAND ${CMAKE_COMMAND} -E copy ${DEPENDENCY_EXTRACT_DIR}/src/tinyxml/tinyxml.h ${DEPENDENCY_INSTALL_DIR}/include/tinyxml/tinyxml.h ) else() # build from source # TODO endif()fifengine-0.4.2/cmake/get-zlib.cmake000066400000000000000000000016751341615052600172620ustar00rootroot00000000000000#------------------------------------------------------------------------------ # External Project: zlib # Downloads: http://zlib.net/ # Github: https://github.com/madler/zlib #------------------------------------------------------------------------------ include(ExternalProject) set(ZLIB_VERSION "1.2.11") set(ZLIB_CMAKE_ARGS ${COMMON_CMAKE_ARGS} -G ${CMAKE_GENERATOR} -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX=${DEPENDENCY_INSTALL_DIR} -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} -DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES} ) ExternalProject_Add( zlib PREFIX ${DEPENDENCY_EXTRACT_DIR} DOWNLOAD_DIR ${DEPENDENCY_DOWNLOAD_DIR} DOWNLOAD_NAME zlib-v${ZLIB_VERSION}.zip URL https://github.com/madler/zlib/archive/v${ZLIB_VERSION}.zip URL_MD5 9d6a627693163bbbf3f26403a3a0b0b1 CMAKE_ARGS ${ZLIB_CMAKE_ARGS} ) fifengine-0.4.2/cmake/patches/000077500000000000000000000000001341615052600161615ustar00rootroot00000000000000fifengine-0.4.2/cmake/patches/libogg/000077500000000000000000000000001341615052600174245ustar00rootroot00000000000000fifengine-0.4.2/cmake/patches/libogg/CMakeLists.txt000066400000000000000000000020051341615052600221610ustar00rootroot00000000000000cmake_minimum_required(VERSION 2.8) project(Ogg C) set(LIBOGG_SRC src/bitwise.c src/framing.c ) set(LIBOGG_HEADER include/ogg/ogg.h include/ogg/os_types.h ) if(MSVC) ADD_DEFINITIONS(/DLIBOGG_EXPORTS /D_UNICODE /DUNICODE) LIST(APPEND LIBOGG_SRC win32/ogg.def) endif(MSVC) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include) add_library(ogg SHARED ${LIBOGG_SRC} ${LIBOGG_HEADER}) if(UNIX AND NOT APPLE) # create "ogg/config_types.h" add_custom_command( OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/include/ogg/config_types.h COMMAND ./configure --silent WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) add_custom_target(config_types SOURCES include/ogg/config_types.h) add_dependencies(ogg config_types) install(FILES include/ogg/config_types.h DESTINATION include/ogg) endif(UNIX AND NOT APPLE) install(TARGETS ogg RUNTIME DESTINATION bin ARCHIVE DESTINATION lib LIBRARY DESTINATION lib ) install(FILES ${LIBOGG_HEADER} DESTINATION include/ogg) fifengine-0.4.2/cmake/patches/libvorbis/000077500000000000000000000000001341615052600201545ustar00rootroot00000000000000fifengine-0.4.2/cmake/patches/libvorbis/CMakeLists.txt000066400000000000000000000051431341615052600227170ustar00rootroot00000000000000cmake_minimum_required(VERSION 2.8) project(LIBVORBIS C) message("CMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH}") message("OGG_LIBRARY=${OGG_LIBRARY}") message("OGG_INCLUDE_DIR=${OGG_INCLUDE_DIR}") #find_package(Ogg REQUIRED) include_directories( ${OGG_INCLUDE_DIR} ${PROJECT_SOURCE_DIR}/lib ) set(LIBVORBIS_SOURCE lib/analysis.c #lib/barkmel.c # unnecessary: bark scale utility lib/bitrate.c lib/block.c lib/codebook.c lib/envelope.c lib/floor0.c lib/floor1.c lib/info.c lib/lookup.c lib/lpc.c lib/lsp.c lib/mapping0.c lib/mdct.c lib/psy.c #lib/psytune.c # dead code lib/registry.c lib/res0.c lib/sharedbook.c lib/smallft.c lib/synthesis.c #lib/tone.c # error: 'M_PI': undeclared identifier lib/vorbisenc.c lib/window.c ) SET(libvorbis_HEADER lib/backends.h lib/bitrate.h lib/codebook.h lib/codec_internal.h lib/envelope.h lib/modes/floor_all.h lib/books/floor/floor_books.h lib/highlevel.h lib/lookup.h lib/lookup_data.h lib/lpc.h lib/lsp.h lib/masking.h lib/mdct.h lib/misc.h lib/os.h lib/psy.h lib/modes/psych_11.h lib/modes/psych_16.h lib/modes/psych_44.h lib/modes/psych_8.h lib/registry.h lib/books/coupled/res_books_stereo.h lib/books/uncoupled/res_books_uncoupled.h lib/modes/residue_16.h lib/modes/residue_44.h lib/modes/residue_44u.h lib/modes/residue_8.h lib/scales.h lib/modes/setup_11.h lib/modes/setup_16.h lib/modes/setup_22.h lib/modes/setup_32.h lib/modes/setup_44.h lib/modes/setup_44u.h lib/modes/setup_8.h lib/modes/setup_X.h lib/smallft.h lib/window.h ) if(WIN32 AND NOT MINGW) set(vorbis_defs win32/vorbis.def) set(vorbisfile_defs win32/vorbisfile.def) endif() include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include) add_library(vorbis SHARED ${LIBVORBIS_SOURCE} ${LIBVORBIS_HEADER} ${vorbis_defs}) add_library(vorbisfile SHARED lib/vorbisfile.c ${vorbisfile_defs}) add_library(vorbisfile_static STATIC lib/vorbisfile.c ${vorbisfile_defs}) if(UNIX) set(PLATFORM_LIBS m) endif(UNIX) target_link_libraries(vorbis ${OGG_LIBRARY} ${PLATFORM_LIBS}) target_link_libraries(vorbisfile vorbis ${OGG_LIBRARY}) if(NOT WIN32) set_target_properties(vorbisfile_static PROPERTIES OUTPUT_NAME vorbisfile) endif(NOT WIN32) install(TARGETS vorbis vorbisfile RUNTIME DESTINATION bin ARCHIVE DESTINATION lib LIBRARY DESTINATION lib ) install(DIRECTORY include/vorbis DESTINATION include FILES_MATCHING PATTERN "*.h")fifengine-0.4.2/cmake/patches/tinyxml/000077500000000000000000000000001341615052600176655ustar00rootroot00000000000000fifengine-0.4.2/cmake/patches/tinyxml/CMakeLists.txt000066400000000000000000000010721341615052600224250ustar00rootroot00000000000000cmake_minimum_required(VERSION 2.8.3) project(TINYXML) option(BUILD_SHARED_LIBS "Building shared libs. Default is ON" ON) if(MSVC AND BUILD_SHARED_LIBS) set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) endif() add_definitions(-DTIXML_USE_STL=1) set(TINYXML_SRC tinystr.cpp tinyxml.cpp tinyxmlerror.cpp tinyxmlparser.cpp ) set(TINYXML_HEADERS tinystr.h tinyxml.h ) add_library(tinyxml ${TINYXML_SRC}) install(TARGETS tinyxml RUNTIME DESTINATION bin LIBRARY DESTINATION lib ARCHIVE DESTINATION lib ) install(FILES ${TINYXML_HEADERS} DESTINATION include)fifengine-0.4.2/dependencies/000077500000000000000000000000001341615052600161005ustar00rootroot00000000000000fifengine-0.4.2/dependencies/CMakeLists.txt000066400000000000000000000123301341615052600206370ustar00rootroot00000000000000#------------------------------------------------------------------------------ # Fifengine Dependencies #------------------------------------------------------------------------------ CMAKE_MINIMUM_REQUIRED(VERSION 3.5) PROJECT(fifengine-dependencies) set(CMAKE_INSTALL_PREFIX ${CMAKE_SOURCE_DIR}/../../${PROJECT_NAME}/includes) set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/../cmake) set(CMAKE_VERBOSE_MAKEFILE ON) if (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) set (CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}" CACHE PATH "default install path" FORCE ) endif() message(STATUS "\nWelcome!\n== Build System for ${PROJECT_NAME}") # create a "Release" build by default if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Select build type. Options are: 'Debug', 'Release', 'RelWithDebInfo' and 'MinSizeRel'." FORCE ) message(STATUS "Set CMAKE_BUILD_TYPE to default '${CMAKE_BUILD_TYPE}'.") endif(NOT CMAKE_BUILD_TYPE) # set a fallback download folder for dependencies ("dependencies/../../${PROJECT_NAME}/downloads") if(NOT DEPENDENCY_DOWNLOAD_DIR) set(DEPENDENCY_DOWNLOAD_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../${PROJECT_NAME}/downloads) message(" DEPENDENCY_DOWNLOAD_DIR not set. Using default.") endif(NOT DEPENDENCY_DOWNLOAD_DIR) # set a fallback installation folder for dependencies ("dependencies/../../${PROJECT_NAME}/includes") if(NOT DEPENDENCY_INSTALL_DIR) set(DEPENDENCY_INSTALL_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../${PROJECT_NAME}/includes) message(" DEPENDENCY_INSTALL_DIR not set. Using default.") endif(NOT DEPENDENCY_INSTALL_DIR) # set a fallback folder for the extracted dependencies ("dependencies/../../${PROJECT_NAME}/extracted") if(NOT DEPENDENCY_EXTRACT_DIR) set(DEPENDENCY_EXTRACT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../${PROJECT_NAME}/extracted) message(" DEPENDENCY_EXTRACT_DIR not set. Using default.") endif(NOT DEPENDENCY_EXTRACT_DIR) #------------------------------------------------------------------------------ # Display Status #------------------------------------------------------------------------------ message("") message("== Config Overview") message("") message(" CMAKE_BUILD_TYPE | ${CMAKE_BUILD_TYPE}") message(" CMAKE_BINARY_DIR | ${CMAKE_BINARY_DIR}") message(" CMAKE_INSTALL_PREFIX | ${CMAKE_INSTALL_PREFIX}") message(" DEPENDENCY_INSTALL_DIR | ${DEPENDENCY_INSTALL_DIR}") message(" DEPENDENCY_DOWNLOAD_DIR | ${DEPENDENCY_DOWNLOAD_DIR}") message(" DEPENDENCY_EXTRACT_DIR | ${DEPENDENCY_EXTRACT_DIR}") message("") #------------------------------------------------------------------------------ # Options #------------------------------------------------------------------------------ OPTION(FIFE_DEPENDENCY_SDL2 "Download and build dependency: SDL2" ON) OPTION(FIFE_DEPENDENCY_SDL2_IMAGE "Download and build dependency: SDL2_IMAGE" ON) OPTION(FIFE_DEPENDENCY_SDL2_TTF "Download and build dependency: SDL2_TTF" ON) OPTION(FIFE_DEPENDENCY_GLEW "Download and build dependency: GLEW" ON) # TODO boost OPTION(FIFE_DEPENDENCY_ZLIB "Download and build dependency: ZLIB" ON) OPTION(FIFE_DEPENDENCY_LIBPNG "Download and build dependency: LIBPNG" ON) OPTION(FIFE_DEPENDENCY_OPENALSOFT "Download and build dependency: OPENALSOFT" ON) OPTION(FIFE_DEPENDENCY_SWIG "Download and build dependency: SWIG" ON) OPTION(FIFE_DEPENDENCY_TINYXML "Download and build dependency: TINYXML" ON) OPTION(FIFE_DEPENDENCY_LIBOGG "Download and build dependency: LIBOGG" ON) OPTION(FIFE_DEPENDENCY_LIBVORBIS "Download and build dependency: LIBVORBIS" ON) OPTION(FIFE_DEPENDENCY_FIFECHAN "Download and build dependency: FIFECHAN" ON) #------------------------------------------------------------------------------ # Check Options + Include external build scripts #------------------------------------------------------------------------------ IF(FIFE_DEPENDENCY_SDL2) INCLUDE(get-sdl2) ENDIF(FIFE_DEPENDENCY_SDL2) IF(FIFE_DEPENDENCY_SDL2_IMAGE) INCLUDE(get-sdl2_image) ENDIF(FIFE_DEPENDENCY_SDL2_IMAGE) IF(FIFE_DEPENDENCY_SDL2_TTF) INCLUDE(get-sdl2_ttf) ENDIF(FIFE_DEPENDENCY_SDL2_TTF) IF(FIFE_DEPENDENCY_GLEW) INCLUDE(get-glew) ENDIF(FIFE_DEPENDENCY_GLEW) # TODO: boost IF(FIFE_DEPENDENCY_ZLIB) INCLUDE(get-zlib) ENDIF(FIFE_DEPENDENCY_ZLIB) IF(FIFE_DEPENDENCY_LIBPNG) INCLUDE(get-libpng) ENDIF(FIFE_DEPENDENCY_LIBPNG) IF(FIFE_DEPENDENCY_OPENALSOFT) INCLUDE(get-openalsoft) ENDIF(FIFE_DEPENDENCY_OPENALSOFT) IF(FIFE_DEPENDENCY_SWIG) INCLUDE(get-swig) ENDIF(FIFE_DEPENDENCY_SWIG) IF(FIFE_DEPENDENCY_TINYXML) INCLUDE(get-tinyxml) ENDIF(FIFE_DEPENDENCY_TINYXML) IF(FIFE_DEPENDENCY_LIBOGG) INCLUDE(get-libogg) ENDIF(FIFE_DEPENDENCY_LIBOGG) IF(FIFE_DEPENDENCY_LIBVORBIS) INCLUDE(get-libvorbis) ENDIF(FIFE_DEPENDENCY_LIBVORBIS) IF(FIFE_DEPENDENCY_FIFECHAN) INCLUDE(get-fifechan) ENDIF(FIFE_DEPENDENCY_FIFECHAN) fifengine-0.4.2/doc/000077500000000000000000000000001341615052600142175ustar00rootroot00000000000000fifengine-0.4.2/doc/dependencies/000077500000000000000000000000001341615052600166455ustar00rootroot00000000000000fifengine-0.4.2/doc/dependencies/README000066400000000000000000000003021341615052600175200ustar00rootroot00000000000000This is a placeholder to git wont remove this directory as this is where the tools/analyzers/dep_analyzer.py tool sends all it's output. See the README in tools/analyzers for more information. fifengine-0.4.2/doc/diagrams/000077500000000000000000000000001341615052600160065ustar00rootroot00000000000000fifengine-0.4.2/doc/diagrams/classes_eventchannel.dia000066400000000000000000000071211341615052600226550ustar00rootroot00000000000000‹í]s㶆ï÷Wx”[ÆQv3ÉnÛtº™tšfzé¡%®Ì†UŠÞ{Ñß^€”l}‹"Ùò¾šIÖ’xxhòåy€Ãƒï¾ÿcœ]|NŠYšOÞö¡½‹d2ȇédô¶÷Û?ÿ|õ¾÷æ»akþñøÂ|c2³ïÞöîÊrúíõõ—/_Hö0‹Ë¼ YzOfÉõÿâ,‹¯ÑuïÝ›‹‹å ã2¶ŸÍ?˲HoïËäb“·½Ûxðû¨Èï'Ã^m5·äY^\|޳·½o>U¯Þõ|3×+ÛÙ³íiL7LvlÇþÉfn53F“Ñ»o>&e™ßÔ»5ÿði{Ûvv§£r£t²éËŸ¬>œH¡íK±H ÊC±8.Ç»»=­»ì´îŠÓºKg7Ó¼(‹8-7]Þæy–Ä“ÚkYÜ'íýÌqfN±}a±ö[ÿ”–e~`ÿ?ÅÙ¬IõÇWܱWï¨H‡û/Þ‹[ù’Ë»›?ö.J8­_\G” ΃ö°ö÷p2ŸÓYz›%Û"L'¥óù°ØüC7›_ÿ V*ÿôuÇ3¦ÞÚÎÛÈ0Jd"¿ŒîÓa2;p*®ÚìØÒÝÜìúÐQ_·kz`êÖnê•‹,~HŠùæ|º_ÌÿÀsUZ: ùí¿“A9ï·Ÿ?^\]|4‚šüÝ|Ùܲ{OŠÉOÒáÛÞ/tõ­e6hrãMóÇ銓E¡¼T$Ð"”ëño*Ì.?··ën L<eÉ“+e]IÆU_H0./5‰¤â-]'Y2¾äÅd3§è<ÌÊW¥6›¡.”Æ:¨^T°€2ppu—¤£»r·/AÌñ³î$UÂzl—¹¹%7ö²½ß8†ë9!¥í\|J³¬‹[qËCV&”ž£˜™¬3Éíõ¹îa‘™nÍIq±–ø®lü×›o¿þ°–”ýó>‹g³-âÂ\Å%4¼¹æ#§°7lî¦Ï(QÒü,÷©'î‘5Ñn2œËIýò(&Œ„zåµs¶ïþÓçdR:_"'¸ ÍmlvÕÛöã[óÝx°á`_ÒÔ!ºŸN‹d6»yüÅÌ»«Ü`}\ñæj‘ûjá©aL«xÙÆÑü„óЗ"žú¦ò2×çÍà.ÞÐGù ZÞçGé¦JX²d2ÚTÏ'D Ý|”ñh´ ýþAs.ÿ)×^«cˆ-3.o1Lòbg7ŸòM-¶Ÿ]|ŠÇiöð¶7Î'ùl #ÍÊËV&‰©7ñÞäƒiR´ó¿Ðé6{Ek»põcž ¹ÍÒÿ´½¾¦yö0΋é]:hµGë;ä´3›6ÚïÊ,6’󸚟’ìsR¦ƒ¸:2ޡֻmß·c3‘#wesOœöbéê9˜þQÑÕWÐÍ9z:Ï+ëéÜ®žx‡óìNÏs_î–Oà‡R­¢ƒV-ƒ|Jì®÷sáS&s}à5žfq™øº/¶?[ãtÁnîŠÝŠTlʨöÈÝÆ7~ÑŠê¾aá0°~#)ª}Òw6ÁoI(w–| Èý×Éô¾wƒ»ÁÝànp7¸Ü îwƒ»ÁÝànp÷w çZf€”Ÿ‚¼­§eöD‰S€w'6Aï€HÍå’Fð3Çð÷溎'C08 ƒƒÁÁà`p08 ƒ× ¸283§¶%ãún±Ú‘ù§oH\„—ö)¿²t_³¹ï@®”ž«3pBÈ{s=y–íxr †ÃáÀp`80 †ÿB —®Î‰.C©_7nBiü0Û?¢Ï‘²ê'A}÷“p¯Ù,xHù2„‡çáSÃÎ 8‚Áà@p 8‚/\u1~ye85 =σ7~l[E; ®ó–êÖe±ÑD¸[xͦÁC½Ò€MŸ?HM>PîÀà`p08 ƒƒÁÁà`p08 ¾`ðЕÁ£ºXÛNSSÅ=RxT£GJ*Þ·íÏCÎ/¹ R*¯Ð»±Ù\¸ZEO5éç>þ·ämÙá€p@8 „Âá€p@8 | Â#ç‰pI; …OR-cxHT„§ÀðN‚l¶&åÜ.¥øZ:³‚Áà@p 8‚Áà@p xàÚÁ%Ñ\žàypI¢¥çÁ'?ÍóàØ¾ ‚•®lÑkXüçxP …ƒÂAá pP8( …ƒÂAá gÔ¹+[µn¶"^Ÿ çd1 np¼Ø·‚ÈÈï3áÄ×ì¡pÉÂåÅÉØ™SøÏùý,A1: ƒƒÁÁà`p08 ƒ/38sepÁjH%‘G·N,rƒß"$BQ^áÛ5°fä­Â•eÁÅk˜ÿþÕÜñ Ðè ôz½Þ@o 7Ðè ôz½çèÍ•—,$”Qíó1ðà’)¢Õ}¦Ig¶MÕ^Ÿw®aGôˆ¿¦ô¥ÃQRbö‚Áà@p 8‚•þ»@sœ¥ÿ­Ybq¶`qáÊâš°ªo¸íTN©×Ê"¬<1IeŸÙµÉ¯H¹5’çEywS…Ó*È=¦’0*Ã}¦& ¨ èS§1knîÊ›7Œdr?Þ¸˜7~G÷üŽ9ìS|_æE~àjÏ Iä½·,ò1×öçbߨÇKð䓉¹‚­‚n‘Åo.îâÉpžK—¹¤ÞÅÓomºr}ø»lþ]±úÝ3rc‡ºÒ C!eÒë B,üØeµf¢Ö&N¤¡¬±‚²h¿,šÝìîajt"=_uJB ¡ç)¡ê e|§þž@Cåù$£Æ“XòÔ×&A«Þ!Œ¿´dôÓj«içRÚP.÷}É(”ô9’ÑgRÕ™Úõȼα?¦£ «‰vF¨æ¢î.£“éz»M9µƒÁÞDÓØŽ0µmæbÕCH_°r‡”4|N! ÏGH%õáBHçãu¨£Á^KI‚j´÷˪M D" ÝàzêOEwÖy:/øsň¨ºñ ºiT½†¹ìÛ¡ÉÐöf^Ÿ°t«Ù2»à¯©·Ñ¯>¢¶µ¨íDm'j;QÛ‰ÚNÔv¢¶µ¨íDmçWYÛùÃl–Ò#—ºƒÕv¥âü’s¢<¯¶kg§Yhð"jWÛ]xªex|]î ÒÍÔÚQNÓsŸK_ \ÊÛÓ‚×A¿aZÔÃa½®L2Î6óݱ¹Ó§oîüva]oÙªIà{vq§£ñ}V¦Ó,¤åÃIÆE‘ÙæiŸÖ¶r4ÉhUÔ]/Ç{©È<Ív½ãÝ,†i7Nœ@/ôbgqu>M9Í„§Ÿ¥à΋1ˆzµ‚+F´ÏŠCQ/ÆpÅû®h~¢„yíéW“y AB¾‚QüÌç)Þg6»øó˜§À<æ)0Oy ÌS`žó˜§À<æ)ÐrÞ¬#ð ?z×öÉŠ¿mÉ`D´híø(w ±!…³•fúuPø pP8( …ƒÂAá pP8(þµQø‡dšL†Édð°¥X»¯ÈÀIÀ¹6H̨òÊâ O!ÖSß rXwðܬXpWN¦öùì@‡N¦h¼ƒG_è£Î…•Eüåf½TËåÏܪHI;)IEJÿHl7Šd¶M£;õrE$­†1µg6žY˜J«ÑÕ(f`LCéY£w¹ÅT©Ä±¦«ã°ÛGly°Åý2ô·¯¢Åš G5GcÏ£¡ÎMzE@$cÜ.ÈhøœsD)ãéŠÞ’U»ÕíÝ6Ðî6e„k†‡L~6·´Å­½| ž¯´³¤SkIº³WõtnÏË(©…é7Õ„ê(”—ÔNkW+EhV%…œÊÐëJ»BÜÚ -°ûØÜ24’è¶û¥”P>(_[å VµK#|úy²FÕ…îÙçh˜¹ŠO zWœPV²Lô6ãÛ-dG˜Bó yg¯yêejÞþ9¡° VmÙ$ }¶¾5ž¨ÅcÛ/‚ªoÞkU{ލ_éÛänSI¢€*Ñ„¬0 ˆ’&v 3æ„0'Ô®¿® “3ö\:uQFog,LVæwýFE˜–õÙôïqZÈq:¤ÆÍtz{[¦zŒŠ@aH‰>ÌšÈU`#_7Åœ4}ŒFSVÏ%ѺËTšy]Ò®Îh—Iä„+."›JËhžJ3&O•J³ýKD.LÍåÐ|¼ HÚ.0åvÔXDX": ~†\:ð§Óû›f ÷^P„I¥ÙeD|6̶þÓx ‰°2ØW6· Õ¥&^×KÛܦY@)”nnv°îU’(´ñ½ºº×¦M2T]2Ñä]2q½Ôˆ]2™K›Lýl ël=ĪPú]X¶š ìƒB!ë›ä¨zϸùAË“,ˆ¸äSJX±FCÍMµ-ÀÙë!YtG¾„| ùò¥¯-_:Ët‰wP9¨¨¹å âwÔŸ)ëÞâ&ePQxÉâwBv{d["¢«jjxe’®ý†Êd†rÝCIHpgCj„Ô©ÑY§F¡Ë£dÁ©j"„èª&""‘çö¯vÀEÚ¤¨nÿ:/‰°I')ˆØˆp·©Ù§ýUk‹´‹·¯õëpXµf¨a8›uT=°«®Öï³ø!)Þ½©ß˜ÿFE<~÷æÿ·SÕBædfifengine-0.4.2/doc/diagrams/classes_model.dia000066400000000000000000000073461341615052600213140ustar00rootroot00000000000000‹í]Ûrã6}Ÿ¯p9o[ LÜ0ÊL*Éî&[5©¤*›g-sdn(Q¡è™ñ>ì·/@J–u¡D„lkŽªæ"¹…fÓ`³ÏAãÛï>O²‹I1OóéÛKJ‚Ë‹d:ÊoÓéøíåÿþç×úò»wo¾½MãoÌŸqO.Ì7¦sûîíå]Yξ¹ºúôéÉæq™$KïÉ<¹ú_œeñ•1ºº|÷æââé·qÛÏŸÆeY¤7÷er1'ÉÛË›xôç¸Èï§·—µÕÂn”gyqñ1ÎÞ^~õ¡z]^-†¹ZgÏØ³xœÜIügóÐyEQ—¡gI±9ìd–ÏScR>̶LƱ?±YXÍÑtüî«÷IY&ÅWõa->\·ë`•“¸§Óm_æüdõÉ`DòȾBª%˜âËór¼»›ÓºËNë®8­»t~=Ë‹²ˆÓrÛåMžgI<­½–Å}ÒÝÏ|gfŠí ‹výCZ–ùãÿgó6Ô?^qÇ^½ã"½Ýñ®Y4Œò)½-ï®?ï;]aAýb‘gLt?µ¿‡“ùû˜ÎÓ›,Ùa:-çÃrø‡~†ßü VY~õuÇSÖx¹Õ‰Läñ·‘ñ}z›ÌLÅu›†‘îfW‡Îú¦]ÛS´qS¯\dñCR,†ÿau;¿Xü‚YéÉYÈoþ“ŒÊExüòþâë‹÷&¡&¿™/›[öåªB1õIzûöò×`ýme4rëÍòÕDR„ hDôfàÛ©¥ÉÁÍÍæø…‰"žŽ³äÑ•ª‰’CP˜&ìæ1É’Éõ(/¦Û5DaUNª´²Ú2¥pND•QD¤ÂH+-|Ý%éø®lv¦ù‹2Fu$Í_Ýœ™ÛXrm/Ðû­³·YýA7Ò,káâ†Å"îxÊÊäsé9й©/“Ü^‰›–5èÎêó%îÚà¿›Ô0*ï‹dÞÞMýaCœ’ uM*Ñæ1¡&“ É!—6˜Ô"¼¦‡€Z¥At5W¥©‰Ã@P™„†‹´Å„à* „@&9çLòKRÆ“ü6É|$’³x>ß‘A˜sYˆ)ÔÍEg®<&½'Æ“¨=)%õJÂEÈŒ‘PIíµHé#È6ù…‘(R2X½¼&¢¢µWÇÀöNêã&ôó]™>L’iémüøÆ|7m9Ø÷ðà¨St?›™"d~ýøƒ¹wWù,)âÒäo®–ÛPKO-cZLÕÅÑbÂy èSÏüGSy‰?˜ëóztoåÐÇ *:Þ“géº*b²d:ÞΞO ¤›2×öú y¬Ãü—a{=¬s«0o1Lóbg×òí\l?»øOÒìáíå$ŸæóY<2°h^>Øg4¦¤©‡øÑÔˆiRtó¿ÌÓ]Ž@ëCøú‡<»ýõ&Kÿêz}Íòìa’³»tÔéˆ6Èé`F¶ˆ´ÿ=|(óØ¤œÇ£xüÕüœd“2ÅÕ™qü u>½ûpÜÎÍ"‰y(ÛGâtO®žƒå_°€²«—ègŽžÎóÚÅz:·ëïpÝë<÷åîénq*Ãuè…ƒ\vWû!⪒¹:p‹šÌ²¸L|ÝÆ—ãÏ×¹ÎA8%L VZIŸœÚ‡õÆ WrHCÂ#ãU‘+¿{xmÀ·$A$zÀÃ/|ÿD ü¼¸pà, ¢b‡=‚o3<—û-‡–óŽ &¶ÿz…ÞŽµã¼™`Oq·zí°;žppppppppppppi€ûûù<¥UO`7]ÀnéÌ{sçÔ‚ƒöª=7ŽÄ££!„Û·~s%yGÇEyw]Ó%Ä>,k%=ïdzt¤¹¹oß(’éýdqmÆêgtÏÏ:V]ñ}™ù}y¨üíö="p×·©¡ö²êûÄ$ÓÛùeÓÊä­uÎ[}Ì©[[ Ý&ð½K£Mî³2eé(-ö9¤½yŒ‹"ÿ´ËÕþõÿÇE2^Oè‡.˜ã½T¨<ÍNßñnv®Â>‡t¶ˆ½Š ´/wòé´Nƒó­ù¶üÉÅ]<½] å2¯Ôv«ŸZ@ruø»tñ]ÖøÝåÑoP_¥RØCÁE¤Œå³PDFahë…ˆ²hhÝFÖ-'¼ûòÀV•ÒîwvÐB³£ìÖ}‡iµ1Ü6E•„*é5Üãþ†* Uª$TIU’x™UR“‚Cõ°„"âöé %Œy^C¡uíˆÚU’¨À¾å$ð¾ŠÂ9ÂV=RL ´öÌ™½r=Çßã2ž'%4Ðt@ÓM4Ðt@ÓM4Ðt@ÓM4O‰ Ý›¦£ÄÒ¯¨# OLJ«ê ‘ïÞGá8UÇf{LœönêÔ3¢ cÑ’•Ø÷=0`,ÀX€±cÆ¢™±PŒÅ†&„žL×õÆ[TEŒÇj)"ÑŠ´`$Ôu¡2¿…RCx;,ƒ–FfÄF+¢$bòËs8À ÔF¸³¡4ÂBiô’K#yLi´ñ]~1 úØ•B¡ž÷£0.‚JÃ!Ô@›É÷&1µ“nÐ'¢¯\ºñk5é Ü€rÊ (7 Ü€rÊ (7 Ü€rÊ (7 ÜxJEPÚƒtCsi°`!?rCO+å#J3áY¹±3ÆFK díÄG˜RBÝ"}¥º n€;vâlØ 8(7Ôsuä ¬’ÂT^UÊr¬ÒlD’ªAD4õ,nÝŽkÛÈF+“½Åq˜44(ƒÐ— eÊ s˜@eÐÑ*=5”?™†û¾¥¶}ªo™†m ñªcZ®Æóxñ,êÇ{oäc™íÏ…×…žut[ž£\ºˆi]ÄgQúв¨&´Êš‹,Ê)ÑÌæ—W™EÍÑ+Õ"‹>Ú!‹"‹"‹6fÑè¹¶Ædî[cÊ…’’ˆyma‹ý´™)CmjÊæ_¿»ˆ7Ä·#yR"™9¢ö–¬;kÖc#j4›Ftq@tq@³éæg£¾ÇÔ7âô=˜óŽ—ÌÜø«;4“^¥-’Hiý(%µ}¸Ù>Ó¦ª •Ô^å-ÎñµQ¸Â9îÏ_ŒÚåYò1F§iˆ] vØbˆ] vØbˆ] vئ·Ñ—"RfÐg(NI$˜² 8¢,ZÏ‘õÌ ÷JÐ6E¸Ã”Ëgº×Ž™iÏԆݗ²+&úMƒ©S¦ý¦Ï†©`.ÛbŠÓïŠÉœwÅ䜰PÆ ]Q<$•ôT…{|m¨ FT(¥)“çÑë}ü )@S€¦Mš4h Р)@S€¦Mšb¦{ÀàôD4Edé ZÑÌñ¥gNxwÏ­˜ŠÆ LkÑ£v2ýRø ,¬]ºt芳¡+¤]±‡ëð½rTõ¶ø^»BÀïâû(ª=QS.¹´«ªUÂsÅÔäÓ½VÜî€ÞÚÊÂ>â(”žë6GQ(¡PB¡„¨ý´ØØ¬²N²ÕyG3®‰>…°CÛMÍ–ÂÁˆÕIÖ ºÇ×n j@Ïjo³Mçæ×7J í€¶Úh; í€¶Úh; í€¶Úh; íXc*¢`¸:¶ƒK ¡VÚŽ¥çh;š‚t3­V‰'Sh;@Y@ÛÊ”´¯LÛ¡{¤,N±•;oL#B—¶Ömj$aj¤š­C ¬© ¯{Á:EÕ–£xJQ¯½Oæû|„6™à(ÀQ€£GŽ8 pà(ÀQ€£G±ÅQpç­ -*^>“÷ ¾¡TéÇ™Ömt‚bw„;ìÖGÙ &jI$–‚šÀj P &@M¼zj‚.Ô„~jÂy«R®lII˜O‡ªzdJó÷Ð!· ) ¼²޵á'ázm ;“5ïÓyi7Ož<x ðà)ÀS€§Ož<x ðk<…ó¶ÚÂÌðˆë "‹Hú¤*»ëçû ÙPP"«÷ ½RMAî1å¡rÈ´",Ž0µ=Böåõaµ ,@X ýÓÙì…*&ç P©$‚ ”×5ÆWµª‘üwÆÜVsÓÒÌ»K”4(i Á@Iƒ’%{GË †p)ièéJÙGIcps¢¸’žëšª6‰Œ£S—7»Bl.^Ú[¢ÌA™óboR! •*T:¨tV•Ž|ÖJ§~ŸÙý°ß½©ß˜?ã"ž¼{óM6•¨žfifengine-0.4.2/doc/diagrams/classes_video.dia000066400000000000000000000067611341615052600213220ustar00rootroot00000000000000‹í]]sâF}Ÿ_A‘WÒVI-O*IídS5[Ie7Ï.2ÖF Vˆ™xö·oKc¡V3f|¨òxÀW:ºBººç~õwßÿ5‹{ŸÂt%ó»>%N¿ÎÇÉ$šOïúüë÷ªÿýûwßM¢àVÿLÓ`ÖÓ[Ì—ù»»þc–-non>þLâ§e%)‰£Y†7ÿ â8¸ÑB7ý÷ïz½—;˜Y¶þ4Ȳ4­²°7fá]Œÿœ¦Éj>é—Rk¹q'iïSßõ¿y(^ý›õnn*û9²ïE0 GiüY¿kG¿|¿Í®aº»ÛÙ"YFZ${Zì‰Ôì'ÿ÷…ÌZj©…æÓ÷ß| ³,L¿)kýáv‡¶(›é4šïcéó—'ƒÉýüåR%¹Ã<¾9/çÃ. _.½,\´¼_$i–Q¶9J’8 æ%j–®Âö8ËqëKì˜Z´ýÞ¢,KNÿC/›(P~ü|Ç{÷NÓhrüæ­HÔìås4Éïÿ:vºœòÅ|å0ΘhK¼§‹á}Š–Ñ(iÍ3ãëa³û§nv¿û V~»¹áSî­ö12Q¡ åù‘é*š„Ë—bU¦fOk±›Sg}W®é‰)?Úy¨qð¦ëÝÿ¸}œ÷Ö_ðÚ*½8 Éèßá8[«÷Ç?>ö¾íýËeëšhÇ$šÜõuªçfW½'m÷NÎ"y¾‚´VÊ“p.=º«÷¾e©ƒvQR­D0ŸÆáÖâ—HLi¤¡G[Ná´Ûÿú,Ýk9¼ÃùtßjnÏ # ¦Óª[ÞéR¨Põojˆ²Óòd=Dq|¡ÊòÏCÈ¿2»:ÌMúâû‡dßçŸõ‚Y?ÝõgÉŠç¯æïaü)Ì¢qPœÃo¨õá¨Ã‡cvnÖFäÌCÙ?££xq÷œt¢œêKts^¹r³^¶záÄ¥^ç¶à^^À N¥[¥¾ÛRÉ­_wsœn=™›¨Ù"²ÐÖc|³ÿe5 Qrív䛚’o‡xÌPF<‡*‹ì[C± ”+©jÚ-”ÏT_¶…nF¿»Q³ ÿVZKO¼¸¼é•sñ¿|øÛííÏ«H{ésprprprprprprprprprprprpò·ÈÉ5ç âè¿…"/È9]“sfJÎ%¡¢HNsÊ-sA41Ö0\à %ñ×,Ùmé€%iöx_hq¾n5r”zBˆKªšËå#ýýüÝ4„óÕìPYLõoΑ¿Qƒc VY’&+›7ËÚ_\YsŸÝj{Ç‚¯1´1Næs}ÃæÆrïŒlþÒ{ 擵ۜ%EUNoû×Ü3¹9½-]oKk·ÝT"íy“›šJŸ(ÁÕ€9DJ‹¦Ò'ž¿†Ò¼ÔFé7ŒX]š«Ö¬nˆQQñ®ÇÎQJ’ͨuŽm¬U’-ˆwí-8?Ì£Yqk€fƒfƒfƒfƒfƒfƒfƒfƒfƒfƒfƒf£ó¦Úyãóm¦™)åEm·ãØl¾Q„²|¥Fò¤Ã‡”îäÈš ßj N­’GDáò˜ VÇ+Ôi,(‰ð}´â çkmÅá­8Â^+ÎI#ê]¥”¸N‰TQ(YØ÷Ú h~èŽl.g†ñ„ñüš§¬nK/ÐǨŒ‡¡çý×y·ŸK˜ÍIèF”0T9'ÊÍ“ÒFÊêtcíšd|´e¤•l×ßʸÔvd~LÆH! „4Ò@H! „4Ò@H! „4Ò@¨¶Ü’p¿.¹'Œ¶Ž6$áB•0R“pA8Íßi2n›„j×p:ïÂ8¼ÂyB á á á á á á á á á á á á¨Æ<\HDÍ—÷‰ïäÅ‚.¡í‹"qr_³oV°pÏóÝ!wˆcŽÜ¨š¨VÉnDó°Âñ¥ZÑΫŠVÛÎRUQ{΀¢¢«)*REEþ凣SãUµàyÈKâëß6í§K˜*‘”þ—q_Û®UžÝ¸fJ6«/Ò>Ö×9*ý7m ÖDXaM„5ÖDXaM„5ÖDXaM„5Q]T²qãeU¹ §„1iµµ¼X¬LãPÍÄ©fæžËš‘ »D¼ýšÑp®˜|a øµORÏÙw8Ùtû€‡ƒ‡ƒ‡ƒ‡ƒ‡ƒ‡ƒ‡ƒ‡ƒ‡ƒ‡ƒ‡ƒ‡¿1þ{˜×…ËC…E¼ƒE’KZrdáYQ¤d1Sý刢‚$ ÛcÞëX/Êü¢3©Éü¡æ’žÉ¨ëžUÔž*\ äç…Ko¢ªˆ²îfuYVtÌ€Šë1 Ïƒ2½í LU"_§}ž€y†(l(l(lèå‡eÖ&ƒÌWöÑfL*àÎeÛ•jšy ùdá‰)4d”p¡ßûD*i´FÎé…~ºP²YNÈ_U×ùt<¿½-–Øý˜“0ERI!$…BRI!$…BRI!$…zcI¡–ËdÕ6œ›¯ÿãÆòbIJ|«5šˆz%erÈ4wòFN$“Vcš5è«ä„*E»•TÄ“ž4;¿¯°Ó|Ê´èüZN¢´Œõ»>3á|²Ü÷tgú6Œ¶[Önês×)ÕDñ#‡X 4[ÅY´ˆ£q”=]0HÓäó!¤c×K+ é4 §Us~ê†9¥àäQ\sö·ÙDn÷.\@¯ôbWqYÏ\ˆs2Ô«nÌ/‘º0^ßëÅCÜn#Kä”@y'‹þåø¥“d¹“¥ ›¤-a×>C“#œ@rÉ $'œ@rÉ $'œ@rÉ Ä=ŸP] Ä-)0·;בk$&y>×+ÞSÙ%âî)yDTWÑS¢Jœ!X ²d(¹Æ0ܯ´äÚ3(¹¦Ô^Íõ‰¯ßEåµ£ïpE„åÊk¸ž£Üþ# 7ÈÔ!ŽþÀjš·NI#Qx‚JÏHô­¤zÛQdz‘¨C¦Ðk½€èÍôJ‡ÉùRþëhwÀô£¼ýò 9'-aÑHŽSpN·àœŒ(»Uqµ:Õ4‘{n£…Uš‹åÔ_!ë„·o Þ¼%ÔŽ1oÉd­¥Ýн@Y3^l‰{DäÏo›’Æà¥“ ‡BêË0¹´Z g¨X³þ}åTf:³«_Z©æü[š|ŠÐ¿9”È¡D%r(‘C‰JäP"‡9”È¡Dýû;¹ ÖçÂ/2Â& w4ŒW,u$]MÅsX?‡6“‡•; 'cÜ;GŽoÛ/;ïÔž$j9@pÙ d'¸ªì£¦'.1p˜/y!8ñä€IâZtŒrCÊ¡dÄ)–½PV“¦j5ÉN(Âh…5]{ÓþóhV8áHO =ôÒHO =ôÒHO =ôÒo4=Q˾×K‚HÅÕ€1Âlòo ÃKª)8-‡ 3A„]n¬]î)*E‚×¾ÈO±¾(8(8(8(8(8(8(8(8(8(8(8(8(x•‚Ëàj@Q–óß2ñ öí»F‰c;n¢V³ü7u*òµï®FàÞàÞàÞàÞàÞàÞàÞàÞàÞàÞàÞàÞ`d€=3^`WPÂÊŠ6¢-µkFÅ"¤FʫчIÎ1[ÓÉf-zµêÕ‹2—7¸.pw[Ïêp* æÍcÞüi¹aÜÞB™§­žw…V:‚¸y5Ð+5|ŒøGå¶EE>LLß[5}âKš>Õ¡éã°{yê¥ðöŠ)‰\^Èæñ&úDžðôÔŽ¬¬Ýµ[;z–µ“ö¬Ý‰á3Æ ùÄL©œ«¹6—EÆ‘ÚÌ ©$ÂsD>ºÞîŒüõ õ¡sí—¶ÄøŒŸÁôŒŸÁøŒŸ¹ªñ3€Ê/µ’7^Iˆ²œ¤ñÓdÍ·#\IªÙ” Tÿjd·@fı «U²^”zÄsuLTÊ …ÎÄw¨ÂZBp—𴃻w +/^©»ÄM†õU·u/0«/%D)‘Âí xíáM%$üÉÍ%Æ u©(œI•ÍÆ…N”lÒ¾¹òÊ[>üòáo··?¯¢±¾Â‹æ…I€Ö´. u­ h]@ëZк€Ö´. u­ h]ØÏ^¯-D=™ò>‘Êæ }ü ÎP¿9jÎ’cV3‡ì@°Œ.ÈV¢×^äò8”ǽ fRiÍäÔ4û[¾ƒ§0}ÿ®|£¦i0{ÿîÿê?dY…pfifengine-0.4.2/doc/diagrams/concepts_cam_correction_1.dia000066400000000000000000000046671341615052600236070ustar00rootroot00000000000000‹í]KoãȾϯ4W¹ÝïÇjíÅæä`d$¹”DËÌÒ¤BÑöø²¿=ÕMÚz±-‰Ts­‰ÌK.vu5ë«úºú1?þôí1<ÇÅ2ɳ›!Ax8ˆ³i>K²ùÍð¿þùJºýòã,‰~€_ó"zÀÙÒþëføP–‹®¯_^^PúºŒÊ¼@iò„–ñõïQšF× t=¼ý2¬70‹ÊÈ~W•e‘LžÊxEñÍpM›ùS6VRµÜ4Oóbð¥7ï÷î3¼®›¹Þh烶Ñ<žqô›¿i cÚ4½ˆ‹ífù2‘òu±#âiÇþ¾&SK-A(›ß~ý­ºT±j«©£^%åcTÌ“lWŒMZ EšR ƒ!Œ6XqEÞÆäxu“~Õ¥ýª+úU—,ïyQQRäyGY¥õ>J—q{EËi”‚}dW3ÌOd@õõ;ÜŽ…î¼Hf#wCÂÓÊK2+î¾}4\Y°j4¦ŒRÞ~+}¯½é{N–É$›,L²²³?¼5ÿzšæ·ß  ñ«Ç;zLÕš7‡Ìt,bq|™?%³x¹Ç7e<-=Ôb×ûF}[îЩ¾ÚÊèNE½ÆEÝüŸV¹|P¿`H>ÅÓ[†sä“ÿÄÓ²6ïïe”Í¢b6¸ü-O_çy6\Ñ 'Éìfø Þ¢m£ A‘;c´ÈßÉ É å#¢–ë ðŸšÉd[K¶DÙ<ß4 ¥©tÌ Ò’©£H NÛi^ÀÈÜ9sZ¹+JâÚPÛKI>”¥ ÙÓ*F zàl%mGRP|·‰7k[Â\4Ý}—«HŠÞü¨vÚ–ùË]Ç= ÿ5’ë†:ŠtaÈ8'bˆ“  ºbˆ0Ƭ&F(3ˆ!Úú$%T„•×È]Q¦¨EÙ¤XX*²GôŠ"#±’N60ªîï­£‡÷s—zrsÚÕÍ™ •|áUR¦º9h¢ÂG I*4C”fÚt… &!½Ükc ¤K3¶“ûD¡ÿ´Î2ûatœ©Z^RǧHcÅ:ç ‰°õ ‚h`@aƒ·UD(QcPLÅàÂ0Ej§xšgÙ]œÍögŸ™¢ÄöJ´LeÙÓãt±Ý•¦YT@·àã¬DJt…Ã\¾\öTêÊ ì Ö5;®»'Úvê3¸ƒ8A” „Ój$$ èƒÁÒjâZº(¡9QŠ£2|”h6sWT»lê:&[çÈ^}ã×ø[¹æ¤ö Ù9TˆšX@|ç«â}J&Þ)ŒÏ˜‰z:Aƒ·}¥–=õ«-Cp«r[ ÿô¬|POópó¬lÒd¿ÜGIú вåp°,_mábAõè_âô9.“i´îÞÇ÷à!Næ}X«P#f6?Ýtn:âQÎØFÝ6{õ2ØõiZEQšÌ³Ç¸ù•Æ%j2{ –Æ2âq¨xv]򮁻+¬—ؤN·8q´O ®UX*ôá#Œ´X¿UKlUlû Nÿ¾§ÀÁÉë—àt†ÁIw NÊ: ¥ Q”8½k¢ˆa Na˜‚;ÍFœqú×%6ŽM^g¼Ä¦3ŒM¦klº"H a:"B]OzWÅݪÎþ`ܺ¢@ ŸCtŠÓø9*á i”Å`¬Ò;±êê—Išü÷)î#f‘ÍB; ³üNz ZŸ9hý\L›–À;o,¡@¬Y5ù¼NÝ> m51¥øØ•'1sUKBtà2¥×ÎQ˜~Ö%2ÖºL9}*žã»Y²„!˜ÆþŶ+Œ¨ÖÔ`E´Œ0Ò–ÕZÚ;Mr%7kصXÎ鈄EXG}Ó„ùƒ£2†T­Yu¹uQäöå\’kßÉÕ룗Üz†Òyç dmªµ±Ð1ëM“@Â%WŽ –Êå0s•Ô"/Ýtàÿ4Va$·Š2x°ò9ç%XáD€u¯¬Êjä°;Ìš+SQq©Ç æ\»í Z„žxÍl%Õvtè =°'_” &˜RΤÔç< ðlª!¼ûAˆì³<ÈMm­6Õ`ÅôØ I•Öö²ì¥^+Ž7 óæ¥íwWwÛTÓÍÅVâëâ÷.“ûCñ£c_S5Zî°Ÿ·Ÿ À×륎2wÛ´«ŸÞ åî ¥­FODR;ïS†Èy% Ѝ5M¶ôÓ:u$µLÒòBPû"¨^ǼÔÏLP?8°Õyß$w›Á%0$tö§›‘Aœ 6TD»’‡=Éâ5±aoL}²ÑX*»gƒ¾¨½ºÅe›h¯®:À;”¿¿·“, $ïâ€óg$æ*:Çóg>z¡ºve\§V¦<¹ü®‰R àÀWÇ1?z1¹"<'ñ‹½0ãÂ4úb^½0ÏÌ4|E†Î» !÷J{¦En'Ö4ƒ+&­& Ajl5 I\öœ…>»ã³3󺔺—¶ê xç¥5M‘‡ÈÎ{ë€ê2 žª-' ŠH ¿ÜžYM”05Í Z1ÆC#Ògg ž~AäÉ)» Rö„HÚyãp%B(RÝ6SvLÈnYä HFôØ*æJØY¯Q2ø!xŸ™GLÇ/€ì>LѾ0uŠ ‰¸àöþC$zôÎÞ$œ[+©…­oI·ºE‘Á1å3óˆºÕSý&9vÂ$ÇÛÒVÆÆ´¸N‰î»Šp§ÇÍœŽºEr­¼Â´ËÞÂ'S’I—1gÀ9§´ƒþæ¢ôQ7fB)+a²_˜"l…•½I쀖½üø¸+w›à{dùè‹p‹È Õ!EŽ&.Âõ–’÷“÷ÜY»ŽÉöd'Á ø‚&Ö4_ß- ‚ Ž A#ˆ€”ÉÀZZ‚/’ èµ·TUŠ%†ðý4ÔkÙÂ$ïïB¦õwŒ@~"Jp†QµÉ¸JÌ­£{3™Í‚K¾È0ªú nž&lo%ûK€ˆìHsº­°óM—ÐwÉ‚$ÅI0¾ ¤´‘^Ü}Ô1Q)’Ú4ˆ©eo” Ãz€ ßÞfTAÊP„@ãd>€†;h£ˆ¾$Áó ˆ´!F ÚåËïg’«oÞ«3Õ?Ý«pûeãÿ]¸ýò?a0MùÀififengine-0.4.2/doc/diagrams/concepts_cam_correction_2.dia000066400000000000000000000060711341615052600235770ustar00rootroot00000000000000‹í][oÛF~÷¯”Wy<÷KU§hXì ´ÀvŸ Zbd64å¥hÇîÃþö=gHG¶DÚ ÉÑ¥¥€´¡2šgøÛÌ™á?=Þ¦£‡8_%ËìrÌâl¶œ'ÙârüŸßþ~nÇ?}<ûqžD?ÀŸEÝŽàÙ ¯.Ç7Eq÷ÃÅÅׯ_Iú´ŠŠeNÒ䞬â‹ÿEi]@£‹ñdzÑèeó¨ˆð»êÛ¨(òäú¾ˆGYt_ޝ£Ù—E¾¼Ïæã²UÕn¶L—ùè!J/Ç>ûÏø¢êæâU?oô}-âë<޾4wMáã\›®ïâ|³ÛÛ»å*&ÅÓÝV“†~ð¿/ÚT­VÐ([|üð3ýPÞRõź¯ºm)n£|‘dÛ806i9œXÎ9 †rÖQ# {“Þ/\º_¸|¿pÉêên™y”Û×ËeGY‰ú9JWq{ Õ,JcoÉÕAŒÏIQ,{ üú›º}¯ê.òdþ¶æ¾jÑÐË×d^Ü\=¾5\” ðÃ¥\p.Û`‰÷´7¼‡d•\§q„IVtæÃs÷Oýt¿ù½‰_ÿ¼#cÊÞ}ÈÜÆ*VßïC÷É<^½CÅ×mzº©š]¼7ê›ív˜ò« î!Òè)Ϋî?­}ù¨zÀà|òûgç°¼þ=ž•xÿ.¢låóÑùè×eú´XfãuxÁI2¿ÿB_ѦPÐ!˜È­1º[®‰D 3\M4a–²Mé·íKÊõõ&H¢DÙ"K sMsÚ"’ó?†(§'\ÆŒk‡|så¥i#ãvK! ·BCK®¬y»)ܾþþ)´}«)ˆnŒ‘zÂ4±­GwŸzl´FK jƦp§nÑá ¾#˜{4}œXQ™>ªÑô‰À‡VT`ÚxgÍᥳææDõ0¹_gýco}Š“+ÖÀŠøø Oým­ÈnéF…$ {¤)7D8¸Vxó‰Ù¯³¡bm¿YFK«uŠVËõñò<¨Ð„·Z’®¬–€<—{duVëoi2ûâ‡îæªÆ^}Z¦ó?µÍjâè°br‚6KÒ¦vý@y4Ž ;±["ah%ÌTà£ñýïhÄNaµ÷×2ÒŠç£Ù`½6¯[ÏÖÁz¢õêþºC†5ËÞ¦ØÀÖkÄÑzá;L ^ãù§`½þ™Í–9 u6Ä^‡²^Ml¬×A­WyFOqþñ¬¼€?‹<ºýxöpB°a½¤fifengine-0.4.2/doc/diagrams/concepts_engine_high_level.odp000066400000000000000000001772451341615052600240630ustar00rootroot00000000000000PKZ 973&¬¨//mimetypeapplication/vnd.oasis.opendocument.presentationPKZ 97Configurations2/statusbar/PKZ 97'Configurations2/accelerator/current.xmlPKPKZ 97Configurations2/floater/PKZ 97Configurations2/popupmenu/PKZ 97Configurations2/progressbar/PKZ 97Configurations2/menubar/PKZ 97Configurations2/toolbar/PKZ 97Configurations2/images/Bitmaps/PKZ 97:Š ¤Ã¤Ã-Pictures/100002010000020000000280BD0BB934.png‰PNG  IHDR€êÈÀ"bKGDÿÿÿ ½§“ pHYsHHFÉk>€IDATxÚìÝwX•é7ðï©ôÞ«(½© QE± öé“Lf6Ù$oÊfóîl6™l’k³)“™ŒSœ±bWT@¬i‚ A”Þû9pÚûǬ¼cl”sÎ}Êïs]{]yžçþÞÏ*çwžç.…B¡!„Bô —uB!„¨„Bˆ¢€BÑCTB!zˆ B!DQ@!„è!*!„=D!„¢‡¨ „Bô„Bˆ¢€BÑCTB!zˆ B!DQ@!„è!*!„=D!„¢‡¨ „Bô„Bˆ¢€BÑCTB!zˆ B!DQ@!„è!*!„=D!„¢‡¨ „Bô„Bˆ¢€BÑCTB!zˆ B!DQ@!„è!*!„=D!„¢‡¨ Ì) ÈårÈd²§þO.—ãÚµk|î1 …‚u!DëðY úG¡PàÑ£GÇÉ'ÐÐГ§>Ì9nݺ…yóæÁØØø©Ÿ+ Œã»ßý.ŒŒŒÀãñàææ###ÖÝ$„ÆQÐ×'¢bßþ†úôiüðCXYY±ŽôR …{öìÁ¹sçð‹_ü!!!¬#BˆZQ@fåèÑ£¨­­EZZ‚‚‚ÀãñXGš2¹\Ž8pãããxã7`iiÉ:!„¨-Df¬»»X¹r%,X UþÀårammíÛ·£µµ555¬#BˆÚÐ2#ýýýؽ{7RRRÄ:άŒŒ`÷î݈¥1„½@OÈ´õõõáŸÿùŸÑß߯þ`jjŠ… â‡?ü!ÊÊÊXÇ!„•£€L[nn.à_ÿõ__xœB¡€D"ÁÄÄärùŒÛ“ÉdH$Éd*íWBBÞ|óM|üñÇ*m‡B4dZd2†‡‡±cǘšš¾ðØññqœ>}¯¿þ:fÜæÍ›7ñÎ;ïàêÕ«*ïßš5kàææ†®®.•·E!,Q@¦¥½½µµµX¾|ùK544„‹‹ .]º„¡¡¡·ikk‹üü|tvvª¼666ÀùóçUÞ!„°D»’™ê?ÆÆÆàr¹“Ç755A*•bll NNN°··‡D"™üs>Ÿ´¶¶bxxcccO\S*•âÁƒ„¥¥%ÜÜÜÐßß¾¾> ¿¿ÞÞÞèèèˆÅbMkßKÑuTiÉÉÉAÿ´Ï“ËåÈÊÊBMM Q]]’’üò—¿DMM Μ9ƒÍ›7ã“O>Á~ô#ØØØà³Ï>Ê+011áááÉ""77ýýý@aa!¾ûÝ¼™™™Ø¾};ÚÛÛáããƒÜÜ\|ï{ßCAA<<<`nn>¥¬999ظq#ŒYßrBQ z@¦eÁ‚011™Ö9\.ÝÝÝøä“OŒ¨¨(lܸ]]]øä“O`ccƒõë×ÃÛÛMMM¸qãþþ÷¿ÃÎÎ)))ˆ‰‰©©)8º»»ñå—_âÊ•+¸wïÆÇÇÑÛÛ CCCŒŽŽ"##ï¿ÿ>ÆÇÇQVV†ÖÖVlÚ´iZ™ ,X@þ„FOÈ´899A(Nû¼ááa´´´L´µµ…··7=zwwwœ?~ògb±7nÜÀ¦M›|S@ðù|p8tuuA¡Pàƒ>€½½=€o¾±ïÞ½B¡æææ011Á¦M›ÐÚÚŠ>ø!!!ø¿ÿ÷ÿÂßßZý$„]FOÈ´ÁÂÂmmmS>G¡PÀÚÚ>>>“#ùÇÆÆ011åË—cß¾}8uê<=='·é7oŠŠŠÐÓÓƒ±±1ˆÅb( ØÛÛcll GEww7ª««QVV™LöÄ{ûÚÚZ¼úê«øüóÏQZZгgÏN)«T*ÅÀÀ\\\XßjBQ)*È´ØØØÀÛÛ{J¨ãã㨭­—ËÅðð0þùŸÿ½½½ÈÌÌDnn.¢££±mÛ6899¡³³/^„¿¿?nß¾5kÖøf­cÇŽÁÓÓ|>vvvxã7™™‰þð‡¸|ù2¬¬¬ÐÝÝ …B»wïn߾ÇcddË–-C\\Ü”ú×ÔÔ„»wïbÙ²e¬o5!„¨-L¦­  ?ûÙÏð›ßüæ…”2™ ƒƒƒ‚¥¥%,,,000€ññq˜˜˜ÀÐÐb±]]]011‡ÃÁØØìíí1::о¾>˜˜˜€ÏçÃÐÐ&&&Ëåèìì„H$‚LMMÑÓÓ‘Hkkk˜ššbpp£££000‡ÃµµõKg.tttà½÷ÞCpp0Þÿ}Ö·™BTŠ 2#ÇŽÃÅ‹ñÇ?þ¬ã(Åþýûqýúu|øá‡044d‡BTŠ 2# …/^DKK ¶mÛ6£š¤¨¨·nÝÂŽ;¦=ËB´ 3Âáp°|ùr”••áã?†X,fiÆ®]»†ÿüÏÿĪU«èߢ7è ™•ÁÁA\»v ÷îÝCtt´Vm¥ÛÞÞŽœœH$¬^½àñx¬cBˆZÐ2+HNN†››~ñ‹_àòåË3Z)PD"êëëñ«_ý ÕÕÕØ¹s'œéߢWè Q ™L†žž>| Bjj*Á”÷ P%…B‡ƒëׯãÚµkèèèÀöíÛáééIþ!z‰ ¢t÷ïßGaa!jjj––7778;;ÃÈÈHíY =z„ÑÑQ=zÆÆÆG\\œF&„ D%¤R)zzzpäÈ<|øîîî011AjjêKø*›B¡€B¡€\.ÇÙ³gÑÑÑÖÖVH¥RlÙ²^^^´Æ?!„€ ¢r¹………èééAee%úúú ðÖ[oÇãA ÀÝÝ}FS  ÚÛÛ188äääàúõë077Ghh(¬¬¬°xñbXYY±¾ „¢Q¨ j£P(000‘H„Ï?ÿ###àóù(++CLL œœœ —ËŸx2ðøýã=¾ýçr¹§N‚¿¿?ªªªŒW^yžžž077‡@ `ÝmBÑHTæjkkÑÐЀ±±1ìß¿o¾ù&x<z{{qüøqØÚÚbÉ’%°±±´¶¶"//o¼ñ$ ÌÍÍ‹ììltvvâ7Þ`Ý%BÑx´0aÎÏÏ~~~¸téÒÒÒ°zõjp8´µµ¡²²~ø!„B!¸Üof­öõõ¡¯¯¾¾¾ððð˜¼Nhh(¾øâ ´¶¶Òn~„ò´Ñ/^Dttôä£þÞÞ^XYYÁÐÐpòì­­accƒ7n>þÔÏŒŒŒÒÒRH$Ö]#„DanddÅÅÅX»víäŸ ÂÐÐð¹Ëôr8ØÙÙ¡««ë™?OLL„½½=öìÙú{„¢‘¨ ̉Åb <ñþÿòåËpwwîh~‡ƒõë×ãСCϽnDDzzzðèÑ#Ö]$„Ca.33ëÖ­{â}ÿ?.ô,<2™ì¹?wqqÁæÍ›ññÇ?óU!„è3*síííO þ›*XZZâÞ½{Ï=fîܹpuuEAAënBˆF¡€0UZZ +++Lþ™\.Çàà ^x®••ÌÍÍ_Xðx<ÄÆÆ¢¸¸ccc¬»K!ƒ ÂT?„B!øüÿ¿(eOOª««‘œœüÒóù|þ _À‚ ‡/¿üò¥ÇBˆ¾ €03::Šüü|lÞ¼ù‰?ÿö@/³nÝ:”””<µÀ?ŠŒŒD{{;Yw›B4„™L†¡¡!X[[ÏøÖÖÖ‹Å/}¼odd„wÞy™™™hmmeÝuBaŽ ÂLss3\\\žXçºx<6n܈¼ôX8::¢¼¼œu× !„9*3ÇGRRÒïÿàÒ¥KX²dÉ” kkkô÷÷c*;[¿úê«èììD^^ëîBST&Àãñ`iiùÔϪ««4åkùûûÃÖÖ………/=–Ïç#<<ׯ_§Y„½FaâÆ044„§§ç¬¯ÅápÀãñ¦üŠ˜˜|öÙgËå¬o!„0AQ;…B¶¶6Ì›7Oi×ôðð@GGÇ”?ÐÃÂÂÐÛÛ‹û÷ï³¾„ÂDíFGGqíÚ5¤¤¤<õ³êêjØÙÙÁÕÕuZ×\µj®_¿Ž¡¡¡)obb‚ï|ç;8pàÚÛÛYßBQ;*ˆFyøð!LMMabb2­ó¸\.<<<^¸*à?rvv†‹‹ ÊÊÊXw›BÔŽ ¢v999X¼x1 ”vM‡ÄÄDœ={vZç½úê«hkk£Y„½CQ»ÚÚZÌ;wJ+ýM‡ º»»§|ÎãY7nÜ Y„½BQ«{÷îÇãÁÏÏï™?‹ÅÓ~üÿ˜››LLLPSS3­óÂÂÂŽO?ý”õí!„µ¡€¨UWW8,,,žúY__JKK±nݺ_ß××>œö¦?¡¡¡žÖBÑfTµƒ™™Ù3&—Ë111##£_?11Öyæææxã7°oß>tuu±¾M„¢rTµ‰DÈÎÎÆÖ­[YGy&gggxxx ¸¸˜uBQ9*ˆÚ @(ÂØØXem 11§NšÑù;wîÄàà rrr¦´·!„h+*ˆÚ:t«V­‚¡¡á3^]]€€€Yí|3°©©iFç lÙ².\À£GXß2BQ*ˆÚŒC(>÷ç—.]B\\ܬ§úûûC(âÖ­[3:_(bÓ¦MÈÎÎÆðð0Ó{F!ªBQ‹îîn(Ši/ñ;&&&àñxèëë›ñ5¢¢¢  ‘­ÎÛD!jCQ‹ÆÆFÈårÌ™3G-íY[[cpppV×HNNF{{;êëëÕ’™BÔ‰ ¢rr¹·oßFhhèKUÖê€ééé8þü´§~›££#’’’ðùçŸÓ€@BˆÎ¡€¨ÜÄÄ*++÷ÜcJKKacc///¥´i`` ‹i- ü,^^^˜?>²³³§¼Õ0!„h*ˆÊÉåò—~³ïëëƒÁ  N‡P(Drr2233gu@€M›6!//¶ &„è*ˆÊ?~ 055Uk»<oÚK?‹P(ĶmÛpúôi ©µ„¢*T•kkkƒÚÛuwwŸl¶ÂÃÃÁãñpñâEµ÷ƒBT ¢RµµµGDDÄ €½½½RÛvvv‡ÃÁƒ”r½uëÖáÑ£G¨­­UÕí"„µ¡€¨Ôèè(ärù 7øéïïGqq1Ö¬Y£ôö£££Q]]­”WöööX¶löîÝK³!Z ¢Rpqqyéq …bÖK?Kxx8nß¾‰‰ ¥\Ï××óçÏÇ™3ghV!D«Q@TfbbçÎæM›˜eàp8àñxH$J¹ž@ ÀºuëpñâEtvv2ë!„ÌDeZ[[akk«´©}3allŒ+VàðáÃJ»¦víÚ…ãÇc``€Yß!d6¨ *súôiÄÆÆ¾tûß«W¯"** |>_%9,,,ÐÛÛ«Ôk>^Õ°¸¸X%™ !DÕ¨ *£P(¦´´oee%‚‚‚”¶ ð?²¶¶†B¡˜Õ²Àϲyóf\¾|™v $„h%*ˆJ´··cll ¬£ 00‰·oßVêuíìì‚‹/Ò€@BˆÖ¡€¨DWWÄb1œYGQ‡ƒôôtܽ{¥¥¥¬ãBÈ´P@”N.—£°°Ë—/é±_¨êýÿcË—/Gqq±RÖø6‡•+Wâúõë´L0!D«P@”N&“¡¶¶ÁÁÁ/=öÚµk°°°Pù«‚   Ô××C*•*ýÚ¡¡¡ðóóÃ矮Ò>Bˆ2Q@”N,C(Nia‘H.—«²€q¹\@$©äú‹-¥3 „U¡€(ÝÑ£G±xñbXXX°Ž2ÉÄĉ‰‰³Þøy¬­­±uëV|þùç*+2!D™¨ J744¤QþaddDe×wpp@hh(Μ9ú«„òRT¥ºwïzzz°dÉÖQžâèè©Tª²Áz‘‘‘¨­­E?ëîBÈ Q@”J"‘@.—OiT¿X,Fyy9’’’Ô’Íßß"‘ *kÃÛÛ©©©øä“O”¶ÿ!„¨D©îÝ»7åýhmm…———Úò ¡¡A¥Ûù>^ÕðæÍ›jë!„LDid2._¾Œ•+W²Žò\+W®D~~¾J¿ …B|ç;ßAVV–JŸ6BÈlP@”¦®®.../ÝüGXYY! %%%*}Ú@!3EQš‚‚ht`ff†ÈÈHdgg«¼­””TUU¡³³“u· !ä)Tfª««áçç§¶6¹\.ðàÁ•·ebb‚7Þxû÷ïG__ŸÚúH!SAQŠÖÖVttt &&fÊç\ºt ÑÑÑj- <<CCChnnVy[àp8¨¬¬Tk !äe¨ J1<< ‘HÖQ^ÊÊÊ PK{o½õîܹƒŠŠ Ö]'„ITYS(8}ú46mÚÄ:Ê”mÚ´ çÎSúî€Ïbff†ÐÐP\¼xQ%›BÈLP@fM¡P µµnnn¬£L™››ÚÚÚÔ6B?66>>>ÈÌ̤Y„@™µþþ~˜˜˜@ Lù±X .—ËlƟχ™™z{{ÕÒ‡ÃABBnÞ¼‰îîn&}&„o£€ÌÚéÓ§kkë)ŸSVV###øûû3Élnnލ¨(œ8qBmmZXX`ñâÅ8~ü8“>BÈ·Q@fE&“all ¶¶¶Ó:O.—³ŽˆÅbµ¾—‹‹ƒ\.§„æ¨ ³ÒÜÜŒ‡"!!u”i‹Eww7êëëÕÖ¦……Ö­[‡}ûöabb‚õ- „è1*ȬÈår­Ô¦P(ÔžßÑщ‰‰8~ü8íHa† 2+¥¥¥ÓZüç1¹\®ö€ž%66eeej-¸\.RSSQ]]­Ö§„òmTS((//GDDĴΉD¸té6oÞ̺ ˆˆˆ@ee¥ÚÇ$p8¼ú꫸páí@a‚ 2c•••˜3g¬¬¬¦užL&ÃÀÀÀ´ª‚¹¹9¼¼¼P^^®ö¶}}}áì쬖‰!äQ@fìöíÛpqq‘‘ë(3f``€9sæ ¦¦†Iû+W®D]]Z[[Yß Bˆž¡€Ì˜L&ŸÏgcÖø|>³Œfffˆ‰‰ÁåË—i™`BˆZQ@f¤­­ HJJbeÖÐÒÒ¢–ÝŸ%-- ccc8{ö,ë[AÑ#T™˜˜Àøø8LMM§}îåË—¡PȺccc( 3ˆ†Z&˜¢6Tyðà<<>}ôë[AÑšó˜h•Ó§OcíÚµ¬c(µµ5FFF0>>Î,C@@LMMQVVÆúvBôdÚZZZ`iiÉl'?U°··Ç¢E‹••Å,ƒ‘‘BBBPVVF+BTŽ 2mùùùðôô„ ë(Jehhˆ‘‘¦1gÎ|ýõ׬o!DÇQ@Ôj``\.W#úG®®®‚X,fš#22ÍÍÍ´6!D¥¨ Ó200€¦¦&ÄÆÆÎèü[·nËåÂÓÓ“uWž‰––´µµ1Íaoo;wâóÏ?ÇÐÐëÛBÑQTiAooïŒgh:___Ü»wu xyyÁ•••¬£BtdZFFF`bbÂ:†Ê$''#77—u p8¤¥¥!''‡ù+ Bˆn¢€LËþýû±uëVÖ1ô¼y󘘈ƒÒ¬BˆÒQ@¦L$A*•ÂÜÜ|Æ×ƒ™™ë®<—½½=|||põêUÖQ|3+ ®®<`…¢c¨ SvþüyxyyÁÕÕuFç‹D"ääähô@+++<|øu—ËÅ;#S§NѬBˆRQ@¦lbbbV»ÿ) LLLÀÐÐuW^hÉ’%hllDOOë(€9sæÀÎÎÅÅŬ£BtdJÆÇÇÑÑÑÖQTÎÙÙCCCeeÒ¦M›PTT„¾¾>ÖQ!:‚ 2%}}}¸ÿ>¢¢¢XGQ KKK °Ž1ÉÄÄ«W¯ÆéÓ§iV!D)¨ S¢P(ÀápfuêêjøøøhÌ6À/²uëVÄøø8YwkVáää„’’ÖQ¦œ788YYY¬£B4ä)°±±ŸŸß¬¯ÕÝÝ ©T ;;;ÖÝš5tuuA*•²Ž2%qqq°µµENNë(„ DyŠH$Òû¹ÿϲlÙ2ܼyýýý¬£L‰P(ÄêÕ«‘——7¹#!„,X sŸÏGrr²ÖN­[±bîܹƒ®®.ÖQ! Q@|óáÿþ}ÌŸ?Ÿu­àææ†ææfÖ1fÄÁÁ^^^¸víë(„†¨ ¾™¯_SSƒÅ‹³Ž¢ Áãñ ‹YG™‘íÛ·£¥¥yyy¬£B¡€ …Rÿ?¦ŠkjoooXZZ¢°°u”áóùˆŽŽÆÍ›7µn0#!D9¨ €£GbÕªUJ{_ßØØˆ¡¡!„‡‡³îšÊØÙÙa``€uŒ[´hÂÂÂð·¿ýuBT@kk+”v½ááaH¥R˜››³îšÊlذdeÆ,X€‰‰ ܽ{—uBˆšQ@&wÿ311aE«ðx<Èd2Ö1fÅÂÂÁÁÁ(((  Ñ3T\¿~J›ÿ¯/ø|>BBBPRRÂ:ʬ¬^½¦¦¦8qâë(„5¢€¨dƒ˜îîn8::²îšJq¹\„††¢¸¸˜u”Y÷cÉ’%(//G?ë8„5¡@ÏI¥Rܺu QQQJ»¦D"AVV222XwOå\]]a``€°Ž2ë~lÞ¼_|ñÆÆÆXÇ!„¨zn||wïÞUúh}¹\.W÷ÿzÙÙÙÁÀÀ¬£ÌZHHÆÆÆpçÎÖQ!j û¿¡É I$ðx<Ö1´ŸÏ×úÁ€À7k6¼÷Þ{¸xñ"Í DP ç233‘œœ CCCÖQ´Ö¦M›pùòextnee”––Ò¬Btz®§§–––J½æã§ ºº à?²±±Áèè¨Ö. üÒÒÒPSSƒ¶¶6ÖQ!*D€‡ÃQzpüøq,^¼Xé×ÕTHKKÃÁƒYGQ >ŸW_}ÇG__ë8„¡@ÕÔÔ€ÃáÀÏÏO©×лE…,,,têÃrþüù(((`…¢"T¢–––àr¹bEi222ðèÑ#TWW³ŽBQ*ô”T*EYY–-[Æ:ŠNðöö†@ ЩK+++,]ºÇ§„è *ô”D"ACC‚ƒƒ•z]‘H„ññq_ðYæÎ‹ÖÖVú° ‚™™®]»Æ: !DɨÐS"‘J©ßØØˆ¾¾>„„„°î¢Ú­^½………:1ð1‡ƒåË—#??ããã¬ãB”ˆ =uðàA¬\¹FFF¬£ ‡ƒ›7o²ŽBQ"*ôÔÈÈŒYÇÐ)†††ˆ‰‰Ann.ë(JÅçóñÎ;ï ''µµµ¬ãB”„ =488¹\{{{ÖQt ‡Ã‡‡êêêXGQ:  ´´T%»GBÔ =TWW™L¥^W¡PàÂ… HMMeÝEf &ïÅÐк»»ufP`jj*jjjÐÑÑÁ: !D ¨ J#—Ëqÿþ}¥ÚdÑ¢EÉdøàƒðÖ[oáÕW_Õ™oÌxóÍ7‘™™‰ÞÞ^Öq!³Äg€¨—T*Å•+W°zõjÖQtÊøø8ZZZð·¿ý gΜÁ½{÷qqq:óüýýqáÂTTT ))‰uBÈ,Ð=#•JñðáCxzz²Ž¢SúûûñOÿôOøãÿ8ùᯫ¶oߎœœˆD"ÖQ!³@€ž‚‰‰ x<žÒ¯=<< ###ðùú÷`ÉÑÑ)))z±¢••"""pòäIÖQ!³@€ž9|ø0U2ðĉˆŠŠÒ›]ÿÑo¼ïÿû¬c¨‡ÃAxx8îß¿OcÑbTè™ññq•\{bbB/¿ý?fdd„7Þx¬£¨œ§§'Ö¬Yƒ>ú‰„uBÈ P Gúúú ‘HàîîÎ:ŠÎ ÂG}ÖQTÎÏÏÆÆÆ¨¬¬d…2Tè‘@,Ó@[³f "##YÇP9¡Pˆ%K–àÊ•+J¥¬ãB¦‰ =¢P(T:HMÕ××þóŸ™LÆ:ŽJEDD`||\§¶A&D_P '¤R)²³³±yóf•\¿¥¥ˆeÝUàéé‰mÛ¶M® øØÐÐÎ œËÈÈ@QQ:;;YG!„LƒþŽØÒ3r¹pqqQÉõGGG!‹aeeź«ÌÈd2H$p8´··cxxøÃþ‡ÚÚZ !""≧ …«V­‚ŸŸär9J¦jª‚¯¯/qäȼ÷Þ{¬ãB¦ˆ =ÑÓÓKKK½¥¯* …uuuÈÌÌDCCÌÍÍakk‹„„,[¶ì‰úððpxjy`‡ƒœœ|òÉ'‹Å077Çk¯½†ÀÀ@­øÿY\\JJJÐÐÐ///Öq!S ù¿YˆR?~qqq011aE'ÈårˆD"œ8qÍÍÍàp8àp8øå/ 777p8NkLÄ㧃ƒƒøúë¯qæÌœ={VVVغu+ÌÌÌ4ö©€©©)ÂÃÃQTT„¹sçjlNBÈÿG€žÉdàrU7䣳³ŽŽŽ¬»©¨¬¬D^^ââ☘ˆ€€˜››Ï꺆††üüç?‡X,FMM úûûñ«_ý 111‡‡‡ë[ðL«W¯ÆÞ½{qäÈlÙ²…uBÈKP º»»166ooo•\_.—ãĉøéOʺ«*%•JÑÑуÂÜÜÿþïÿSSS•}Û544DDDär9âââpòäI8pëׯ‡———Êtš˜˜eåÊ•àr¹¸rå ë(„ÿE€ŽR(™™ë(ZG*•Nû+++ÂßßžžžË倿¿?úûû144„ÔÔTlܸ<Ààà ÆÆÆààà>Ÿèèh¬\¹kÖ¬AnnôI¥Rœvgdd„U«Váܹs‹Å¬ãB@€Îjll„ƒƒÃäsdjø|>”~ÝÇßÎ÷ïß''§ç®Ë`gg;;»m0$—˱`Á-ú\\\àïïììlÖQ! @g]¾|ÁÁÁ*ŸÿŸ››‹””ÖÝUº¡¡¡i?:: ‰D±X ±X ‰D‘H„±±1H$LLLàüù󨨨Ààà  ÚÛÛÑ××…B‰‰ LLL ££[¶l™Ñ‡øãëj²„„TWW£¿¿ŸuBôdÆ êëëÕº3ž:Ì;'Nœ@{{û”Ž‹Å@ZZÄb1œœœƒ¦¦&Œ#-- CCCHIIAxx8:::ðÎ;ï€Çãatt2™ E||<6oÞ<íÌb±_|ñ¼¼¼Xß¾òðð€½½=ÊËËYG!DïÑ,ÔÑÑÎÎN¬]»–u­‰ØØXôööNi4¾¡¡!RSS‘šš à›¹ïaåÊ•“ÿÿĹ999pssƒ••ÕçNG?|||´âiÌo¼>ú&&&ˆe‡½EOtÐÐÐFGGáààÀ:ŠÖÚ¹s'þã?þC¥Óꆇ‡‘››‹þþ~>|ÝÝÝ3ºNoo/~ö³Ÿ!--M+öc000@xx8®_¿N+ÂdÆFFF`hh>_÷$yxx`þüùÈÏÏWY«V­ÂW_}…ÀÀÀ ü¾Y¹ÐÊÊ !!!¬n×´-^¼]]]¨¯¯g…½ÅQhú¨!2mLJX,Vù.v‡‚\.×èÝòfC"‘à½÷ÞCRR6nÜÈ:Î3á¯ý+>ùäXXX°Ž3-mmm8pà6mÚÖqÑ;ô@ÇÈår\½zË–-Sy[:ùíÿ1@€ŒŒ üþ÷¿Ç‘#GXÇyJAA~üã#--Më>üÀÙÙ®®®(**b…½D€âp8àp8¬cè„eË–á·¿ý-JKK‘——™LÆtªB¡€B¡@yy9Ξ=‹ÿóþ¶nÝÊú6ÍØºuëPQQ®®.ÖQÑ;Tè˜óçÏ#88X«v²ÓtñññøàƒðèÑ#üë¿þ+ššš˜eéîîÆo~óâç?ÿ96mÚ¤ÕÅž¡¡!Ö¯_Ó§OcllŒuBôŠî>¿ÕSmmm°´´—«úÚN¡Phõ‡Ït`ÇŽhmmÅÑ£Gagg‡M›6ÁØØXå÷úñBAYYY¨¯¯Çºuëàãã£#þ§"..ÕÕÕ¸zõ*’““YÇ!DoÐ2#hllDBBë(j# 1wî\lݺø¿ÿ÷ÿâܹs¨ªªÂðð°ÒÛŸü`üå/‰ññqlÞ¼ÁÁÁ:óáÿØÚµkQXX¨’ûHy6z C†‡‡ÑÛÛ‹ÈÈH•·%‰0:: [[[ÖÝV;WWW899!11GÅõë×add‡ƒôôt8;;C¡P@(Në ÉÄÄär9†‡‡qðàÁÉe…¥R)"##±nÝ:téêêŠ9sæ   @+3"Dèæo=ÕÝÝ®®.²Ž¢óx<ÌÍÍñúë¯C¡PàÖ­[Ø¿?víÚ…ÀÀ@888`åÊ•O\.wòÏd2ÙäŸs8 ±±qr§À_üâ L&ÃÁƒ‘——‡U«Véäk‡ƒeË–aÏž=X²d‰Ê÷° „P Sd2ÙŒ“!3ÇápŒŸýìgøÙÏ~†_ÿú×À‘#G —Ë'ãr¹¨¯¯G{{;D"–/_>ùa®P(œœŒ÷Þ{ Ø»w/ÂÃÃ|³Cá¶mÛ°ÿ~dggëì7d///$''ãË/¿Äw¾óçî˜HQ*tÈÑ£G‘žž®–¶:;;i©áo‹Å8yò$¶nÝ [[[ØÚÚâ_þå_ž:n``­­­Ø½{7~ñ‹_räÈŒv­ÓUÕÕÕhkk{é HKKKØÛÛxòÀ·ñx<ÄÆÆ¢¢¢â‰©q^^^HIIÁÞ½{1::ʺË*Áçó±~ýz:tˆuBtdFär9½nø_‰§OŸÆ–-[¦t¼••õÜcBBB011;wî<ñçÑÑÑX°`¾úê+ ±îºJÂËË 999L]"D×Q #*++áîî+++ÖQôNaa!ÜÜÜ0gΜ)ŸcjjŠÞÞÞçþœÃáàÝwßÅ¥K—ž*bcc±`Áìß¿"‘ˆu÷•N(bÆ ÈÉÉÁÀÀë8„è,*tÄíÛ·áääcccÖQôÊÝ»wqéÒ%¼òÊ+JŸ¢gee”––>õM866îîîøâ‹/Xß•066FJJ öïßÏ: !:‹ !—Ë!ÔÒVee%\]]accúÛL£°° 022šÖ¹|>J·W¯^[·n¡££ã©Ÿ…‡‡ctt÷îÝc}+T"$$ccchhh`…D€hooǽ{÷””¤–öjkkáàà ÷O:ssóí¼˜€GááÇ/<îñ ¸½{÷>õ3{{{ìØ±gÏžE]]ëÛ¡tvvvغu+þþ÷¿ëä«BX£@LLL@,ëìÔ0MÔÞÞŽææfÄÆÆÎè|LLL`||ü¥ÇC*•>5øfKÝ-[¶ ++K'Ÿ¸¸¸Àßßyyy¬£¢s¨ dÊËËáèèWWW•·eaa€€”””<±°ÐcNNNضm›N> àr¹ˆ‰‰AUU•ÎÎz „*tÀ¥K—fôšÌÌÅ‹ÑÚÚŠ×^{mV×100˜ÒX·nŒqøðágþÜÙÙ[·nÅáÇ_úZAÛøùùaåʕؽ{7¤R)ë8„è *tÀ­[·¬–¶$ ÔòÍW‰D"TVV",,lÖƒ.·oߎÌÌÌ)ÏuŠŠBmm-úúúžùsGGG¸»»£¬¬ŒõmRºÇuí !,Q@¦¥³³ Xºt)ë(Lܽ{"‘hrþÙ077ŸÖö·prrBqqñsÙ±cD"Μ9óÌ×ÚÊÀÀ+V¬À©S§hq B”„ -×ÒÒKKK˜˜˜°Ž¢óär9Ž9‚;v0˰yóf\¾|ù¹…ÇCzz:úúúÍ,§*„……aÞ¼yÈÊÊ¢"€% @Ë`îܹz?'_.]º777¸¹¹)åz<`ZSܬ­­_ºŒ°¶mÛ†¾¾>zÀçó±zõj\¹r…V$D ¨ d D"ªªª®´—ìííòÂóg‰ŠŠB}}=zzzž{ ŸÏ×É'¦¦¦X¾|9233YG!DëQ Åpÿþ},^¼Xmmž;w«V­bÝuµ«­­ÅØØ˜RÞý›P(œö"7°··Gyyù 300@ZZ.^¼¨Sߘ#"" ‰p÷î]ÖQÑjTh±‘‘ôööÂÃÃCmmÞ»wÞÞÞ¬»®V …™™™Ø¹s'ë(“¶lÙ‚¼¼¼—n lee…-[¶`ÿþýa[)lmm±yóf|öÙgH$¬ã¢µ¨ ä%.^¼www¸»»+ýÚÆÆÆ3ú³²²Bdd$Nž<ùÒc#""Н¿þZgÓqvvFPPÎ;Ç: !Z‹ -vûöm°Ž¡ÓÆÆÆ&ßý+{·?X±bîß¿?£Å{"""pÿþ}tww¿ôØèèh„„„`ïÞ½:ñ$€Ëå"""·oßÖ™¢†u£@‹]¸p‰‰‰jkoll B¡Pm»j‚ºº:¥Íû@©T ™L6ísÏþ¨¨¨˜ÒñÑÑÑ“OUzßÔ!00<UUU¬£¢•¨ SvþüyxyyéÍ*€ …‡b:ïÿe¶mÛ†ÜÜÜ—Žxìñ“€¯¿þzÊçh²ï|ç;¨ªªBMM ë(„h*´Taa!ÜÝÝÕúa,‘HÀãñXw]- rrr0þ|¥ÍûWKKK,_¾§NšòX‚èèhôõõéÄ(zKKK,\¸—.]¢Å™&*´TGGLMM! YGÑI---¸xñ"6oÞ¬òWgÆ^©©©¸ÿ>nܸ1åóÞ}÷]äç磶¶V¥}S‡¥K—¢§§G'úBˆ:Q@È3>|k×®UKµaÆ)æ‘7âܹsS~ `kk‹­[·";;[ëŸp8lÞ¼/^D?ë8„h *´X,Fkk+ÕÞ¦>Ì:¨­­…X,ÆüùóÕÒž››=z4«kx{{ÃÌÌ쥋}›““¶mÛ†ììl­ÿö¼`Á8::κ"DŸP …ÐÔÔ¤²‘éÏÒßß ,,Œu÷U®¨¨ÁÁÁ°°°`eÊ–,Y‚üüüi­+ààà 3O–-[†ÆÆF´´´°ŽBˆV @ Éårp8Ö1tRKK jkk‘’’Â:Ê´………A*•N{Düã'çÎý{÷XwcƬ­­ŒÂÂBHÈP …Ž9‚õë×S ÄÚµkU²è:lÚ´ §OŸžöꂟ|ùå—Zý}Ó¦M™3gXG!DãQ …ÚÚÚàää¤Ö6e2¸\Ýþër÷î]Èår«µ]KKK¸¸¸àæÍ›³¾–§§'lmmQVV6ísáçç‡üü|­ýÍår‹[·nÑ „¼„nÿF'JsøðalܸQgŸ:ôõõ᫯¾Â+¯¼¢öwÿ¦¦¦pqqAuuõ¬¯%ðÚk¯!''õõõÓ>ëÖ­FVVär¹Z<^!ðÖ­[¬£¢Ñ¨Ð2uuu°¶¶†½½½ZÛíè考ƒëî«Ì¥K—GGGÖQfÍÔÔÑÑѸ|ùò´¿É …BlÙ²eò1º¶[·nʼn'f´Ä2!ú‚ -S[[ kkk­¡®épãÆ ÄÇÇ³Ž¢4K–,AssóŒFÄóù|¤§§chhÙÙÙZù:ÀÕÕ¾¾¾ÈÎÎf…EÑ{W®\Áܹs5zÉßé255ÅÒ¥Kqúôé/ ±iÓ&äåå¡««‹uw¦Ãá &&5554€ç @‹Èårô÷÷«ý1u__ŒallÌú(]?Š‹‹±víZ¦9ìíí122¢ÔGÖ‹/FGGft¾¡¡!vìØ#GŽ```€éý™‰€€¥ ®$DQ Ez{{QUU…äädµ¶›ŸŸWWW8;;³¾J———‡ùóçÃÖÖ–iŽÄÄDÔ××£­­Mi×466Fll,.\¸0ãÇøaaaǾ}û´ò›tFFNœ81íi‘„è*´ŒB¡PûH|m|<½½½¸yó&âââXGðÍ}Vö½ŽEKK š››g|ÈÈH­-\]]£GB*•²ŽCˆF¡@‹LLL@(êìTtwwÏø:‘‘‘˜˜˜@II ë.M —ËEJJ ªªªf½ß!º† -²ÿ~lÚ´IçäQ‡;wî@&“©mÖæÌ™kkkTVVÎê:;vì@mm-n߾ͺKÓÂår±eËìÛ·uB4 }’h‘µOÿŽ{÷úûJ£P(pêÔ)¬[·NoŠ©Í›7ãüùó‹Å3¾Æã-„sssQWWǺKÓâëë TTT°ŽBˆÆÐß~dÆFGGÑÖÖ???ÖQ”¦°°ð÷÷gå óæÍCcc£J®mgg‡E‹Íz»\;;;ddd`÷îݳ*&ÔÍÄÄ .Dyy9 äQ %nÞ¼ +++š«ÎÂÀÀ*++±bÅ K‘––†¬¬,•]?66­­­³Þ.×ÉÉ ¡¡¡ÈÉÉѪ•öV¬X¦¦&Ú.˜ÿE€–xøð!LLL`jjÊ:ŠVÛ½{7æÏŸ¯ïþÿÑœ9sœœŒ¿ýío³šmÀår±iÓ&Œ!++Kkf‰p8¤§§cïÞ½¬£¢¨ /466###Ö1”âîÝ»˜˜˜@hh(ë(ÌxyyÁÑÑùùù³ºŽP(DFFÆÆÆ´jÏ???X[[£´´”uB˜£@ Èd2´··ÃÓÓSímïÛ·›7oÖúÁrr¹¥¥¥ Ôë}„B!ÂÂÂPYY9ëwø<ééé(//ך™&&&رc233Ñ××Ç:!Li÷ou=188ˆêêj$&&ª½íÑÑQ˜˜˜°¾³ÖÕÕ…[·n!%%…u”çâñx*\ƒþþþ/üm|>kÖ¬ÁÕ«Wµf¹` ,]ºtÖ" ÑvT½°oß>¬Y³B¡u”çruu…rssUÞÖöíÛqðàA¥\+,, ‘‘‘øú믵f¥Àˆˆ<|øííí¬£ Z`xx¦¦¦7j][TVVÂÀÀ ,`奸|¾Z¦×Í;^^^¸xñ¢R®ŽèèhìÝ»W+Š'''xxxàÚµk¬£ Z`ß¾}ذax<žZÛmii©©)¬­­Yß‚‰DØ»w/¶nݪ×ïþÿ‘P(Ä–-[­´ ˆÂÃÃáää„dzîÞ”lÚ´ EEEZóê‚e£@ ˆD"ª½Ý7nÀÆÆööö¬oÁŒ8qQQQÌwûÓDFFFHNNÆÑ£G•v͸¸8ŒŒŒhż¦¦¦“¢¨ :«§§÷ïßGxx8ë(S¦î×>Î:!jC€†S(L €‰‰ ôõõÁÙÙ™õ-˜¶ªª*H$­z÷Ïš»»;æÍ›‡¼¼<¥^×ÞÞ(,,Ôèå‚`nnŽ’’ÖQQ*4Øèè(®]»†5kÖ°Ž¢5:;;Q\\ŒŒŒ ÖQf„ÃáÀÆÆ===jo;55ÍÍÍJY!ðÛ222 “ÉpòäIÞ=pݺu¸pá‚Z_¿ÂL"‘ ··NNN¬£hÌÌLøúújõ˜‰Í›7+m•¾éprr²eËðÕW_)õº|>›6mÂÄÄN:¥±OæÌ™GGGHôDgÔ××£¯¯±±±¬£Ì ŸÏ‡T*eÒöãÝò •Þ§ÇE€¦> àñxXºt)ŠŠŠÔ²#!¬Q ÁJKK>Ÿ¯ö¶KJJªöÕgJ¡PàêÕ« ƒ©©)ë8ZK  ::eeeJ÷¸‹Å8qâë®>SPPŒŒŒh»`¢¨Ð`ÅÅÅ e²oqq1´fÿ––444 >>žu­ÁÁAÔÕÕ)ýÚ|>ñññ¨¨¨ÐØíx322pãÆ 477³ŽBˆJQ@´^ww7öíÛ‡·ÞzK'¾ýÛÙÙÁÎÎwïÞeÒ>—ËÅ{gsçÎ)}@ ðÍZØ»w¯F®ÃïîîŽÐÐP:tˆuBTŠ 522§hªvãÆ ˜ššÂÓÓ“u¥077‡­­-³ø¦™;w®Ê…/\¸‹/Æ×_­‘O"""011ššÖQQ*4Tyy9LLLàííÍ,‹WÓ%‰pöìYlݺ•u³~ýz\¿~*¹þ¢E‹‹/¾øccc¬»û,^¼W¯^ÕÈ‹„(ƒæÿ†×S …‚YÛ×®]ƒ |}}Y߆Ç‘#Gšš ÖqtŽP(ÄöíÛqìØ1 ©¤ÐÐPˆÅbܹs‡uwŸîîn455±ŽBˆJP ¡¤R)“¶‡††Àçó5~@}}=êëë±bÅ ­¬8U|>_#¾y†……A&“©l…<‡ƒ÷Þ{÷¸ÝÐÐIII8yò$ë(„¨hll —/_ÆæÍ›YGÑXr¹™™™Ø¾};ë(*‘––†ÊÊJôöö²Ž‚ôôt\¸pA©û|›¥¥%vìØ+W®hÜîÕŠ­ ™.*4L&Ãðð0¬¬¬XGÑX×®]ƒ­­-æÎË:ŠJXXX`llŒÙ‚@ßfooÀÀ@œ?^emØÙÙaÙ²eÈÌÌÔ¨•…B!âããqñâEx"Cˆ2Q@´Îøø8JKKÖqt‡ÃALL ª««U:mÏßß!!!8~ü¸FèëëSÉ”HBX¢@]¼xQQQ …jo[,ãæÍ›X²d ëÛð\{öìAPPÖ/ù«M¼½½±zõjìÞ½*iƒÇãaýúõËå8yò¤ÆFFFøîw¿‹Ã‡£µµ•uB”† tóæMøúú2Ø&‹ñðáC°¾ ÏôðáC´¶¶"22’u½³`ÁŒ£¶¶Vemp¹\lܸ÷îÝÓ¨­yœœàââ‚òòrÖQQ*ˆVÉËËâE‹`iiÉ:ŠJq¹\,[¶L¥ïݧK  99YYY*m‡ÇãaÕªU(//רE‚6n܈üü| ³ŽBˆRP aúûûÁåri^û3ë(ÌÂÆÆ¾¾¾¬£0‹»wïbppu”çZ»v-²²²Ô¶s!—ËÅæÍ›qõêUtww3í{HH¤R)îÞ½Ë4!3AÑ8ããã¸~ý:"""˜lˆD¦ÇÏÏB¡P­#ôƒƒƒ¯¿þýýýLû¿cÇ9rDåS" Q6*ˆÆillDoo/bbbXG!S```€Å‹ãÊ•+j}/?þ|( æë¸ººÂÓÓ999Ls2]ThˆÎÎN€‹‹ “ö¥R)°páBÖ·û÷ïÇ–-[˜ì†¨‰8ŽÆ»Œ‰‰Áðð°ÚßËç;ßÁíÛ·QYYɬï<‘‘‘¸}û6mD´ ¢±±À7#‹YÃÍ›7™~ëV(8þ<|||àååÅ,‡&áñxHKKÓŠ h222ŸŸ¯Ö÷òfffرcŽ?Žææff}_¸p!¢££ñ·¿ýYB¦‹ ¢1zzzÍ›7ÃÀÀ€uáì쬛ÏÀÃÃÇŽSk»VVV Aaa!Ó©óçχ\.g>;©¢€hŒƒbõêÕ´ÛŸ[ºt)ÚÚÚðàÁµ¶»~ýzãðáÃ̦Lš™™aÁ‚(**ÒøW6„Th™L†›7o"""‚Y¹\Ît û÷ïchh ,`–Ìž¹¹9BCCÕþmüñ"AB¡‡fÖÿU«Váþýûxøð!³ „L`bb555ˆŽŽf–áðáÃHIIaöè½´´^^^°µµevˆr¬]»‰'NœPk»\. ¸yóæä Zu{¼PÑÁƒ™´OÈtP@Ì>|{zzP^^Žõë׳¾ ÉÑÑfffhhh`eJ8bccQ[[‹¾¾>µ¶mmm]»váÀjoû±ÀÀ@( µ­ŽHÈLQ@˜Û¿?V¯^MÿžÃÚÚfffZµóœLLLÔ¶Qз ..}ô“¾›™™aþüù())¡‚ˆF£@\»v óçχ¡¡!ë(jW__ññqz÷¯ƒ¶nÝŠÓ§O3ÙÎØßߦ¦¦(//gÒ÷äädÜ»wÆF€¨¨¨€ŸŸx<ë(j5::ŠÝ»wcûöíôî_988`ÅŠ8zô¨ÚG曘˜àÕW_Eii)***ÔÞw.—‹W^yYYYèííU{û„LMMMðððPk».\€¿¿?œYߢÉÉɸ}ûöäBWêdee…Õ«WãàÁƒL¦ÁÌÌ —/_V{Û„L>ŸÏWë·ð¡¡!ܸq‹/¦%§ÀÅÅ===Z9¿|ëÖ­ÌFÅ»»»#>>žÙúk×®Eyy9= ‰ ÆZZZ •JáããÃ:ŠZ•••ÁÊÊ ÞÞÞ¬£h…ÔÔT”••a``€u”i{<½³¤¤Díms¹\¤¦¦ÂÈȈIbee…ÐÐPÚ(ˆh$*koo‡L&ƒ££#ë(j366†óçÏ#==u­¡ÍOIŒŒŒ°k×.?~mmmjoŸÃá &&÷îÝCGG‡ÚÛ_¼x1êêêÐÓÓ£ö¶ y*ˆÚåææ"00¬£5177G\\Î;Ǥ}GGGìØ±TûãxÌ;ùùùLúNÈóP ç ÚÚÚ0wî\µ´788ˆ›7o"::Z«¿Õ’é‹ŽŽÆÃ‡™mläçç‡èèh|üñÇjo{ýúõ(..F?“¾ò,T0$“ÉpíÚ5¬X±‚Y†±±1aõêÕji¯´´æææz7æA !‰Xǘ1[[[#//Y†   XXX¨}<‚¥¥%bcc‘›› ©Tʬÿ„| I¥RÔ××#00uµ¸uëjkk±k×.ÖQ´ŸÏÇúõë±oß>ÖQf%55‰LÚ755Å®]»PQQÒÒRµ¶½víZ´¶¶2ë;!ÿˆ ¢6YYYˆŠŠ‚µµ5ë(ZÉÔÔÃÃìcÌŠ±±1V®\‰3gÎ`bb‚I ¬X±'OžTëÔ@‡ƒU«V¡¨¨cccLúNÈ·Q@Ô¢²²2™ aaa¬£ÆÜÝÝáåå…óçÏ3Ëàíí¸¸8dffªõ‘¼¿¿? Q]]ͬÃAJJ ŒŒŒ°ÿ~µµËår‘’’‚œœÈd2&}'ä1úmÌP}}=\]]™~(ÖÕÕÁÃÃC¥#òoݺ…Bàà`fý$šeÞ¼y°¶¶Æõëי戌ŒÄƒÐÙÙ©¶6`aa¢¢"¦}'„ ¢R8yò$¾óï@(²Ž£Õ<==ann®3ûÌ¿õÖ[¨ªªRû`¼osuuEFF<ˆ®®.µµ›œœŒ+W®hõ¬¢ý¨ *£P(P\\ ø§&&& …LV³SCCC,Z´åååLÖéÌÏÏ‹-Â矮¶6}||`jjŠÊÊJfý&„ F>Ž7²Ž¢s/^ŒššŒŽŽ²Ž¢TñññðððPë@¼çYµj Õ²ì2ÇòeËpåʦ!‰~¢€‰D‚S§NaÛ¶m¬£(]?jkki·?2maaaèîîÆÃ‡YGAdd$ZZZÔ²>Àüùó! é)Q;*‘J¥L3 ÀÖÖV©×¼yó& àççÇ´oDû888`îܹÌÇÀœ9s°aÃ|ôÑGjy-±aÃäää`||œu׉¡@O‰D"äææ"##Ciל˜˜À‰'°sçNÖÝ#ZjÓ¦M(**Boo/ë(ðòò‚­­­Z ’¹sçÂÖÖ–fµ¢@Éd2ðù|¥\K*•âĉHHH€ë®é,.— tww³Ž¢FFFظq#Nœ8Á|Ç<@€×^{ ·nÝBqq±JÛâóùX²d ™„$úƒ d28ŽN½#ohh@uu5ÒÒÒhÃâóùX½z5:Ä:ŠÊÄÅÅahhH#¾ ›™™!==‡RyA²páBp¹\TUU±î6Ñô›š“'O"66¬£(…B¡ÀáÇ‘‘‘¡SE¦âñx:¿“ܦM›páÂæOÀÚÚ«W¯ÆÑ£GUþŽ~óæÍÈÊÊ¢§D-¨` «« –––L3””” ((H)Û_¿~ÆÆÆðññaÚ'¢;\]]1gÎ\½z•up8¬X±*߈ÉÃôS Q *ôTYY‚‚‚Àãñfu©TŠââb„……ÁÈȈu·ˆŽàr¹X²d ÊËË5â)¼òÊ+(,,Ä£GTÖŸÏGll,JJJhFQ9*ȬܿˆgEo¸¹¹A(âÁƒ¬£¨”¿¿?LMMQVVÆ: €oFê§¥¥aïÞ½*Ý:844r¹ÕÕÕ¬»Ltj6>>‰DÖQ”âСCزe ëzÅÎÎN/ HOOGNND"ë(OOO˜››£¢¢B¥ílÙ²§N¢Õ‰JQ fõõõ@XXë(³VVVSSSx{{³ŽBt”³³3<==qéÒ%ÖQ&½õÖ[¸ÿ> TÖÆœ9sàììŒüü|ÖÝ%:Œ 5S(P(L3ŒA¡PÌj£©TŠÒÒR„††Ò»¢2\.±±±¨¬¬ÄÈÈë8,Z´H¥ïéù|>¢¢¢pýúuÚ)¨ zèÖ­[J¥ œñ5ÑÞÞŽ„„ÖÝÑK@oÀØØ•••¬£LŠŽŽÆÂ… qàÀ•MÙ[´h$ nݺź»DGQ@fäÀôŒŒ \¼xQcFȫږ-[pöìY¿bÅ ðx<œ8qBemlÛ¶ ÇŽө퟉æ @Í&&&`hhÈ:Ƭ”––ÂÌÌŒÞý3daa‘‘ÈårÖQÔÂÉÉ >>>ÈËËcå K–,Á£GÐÖÖ¦’ë»»»ÃÍÍ W®\aÝU¢ƒ¨P#™L†ãÇcûöí¬£Ì˜D"Ayy9½û'jÅår…êêj ³Ž3ÉÃÃÉÉÉøè£T2¶‡Ïç#22•••3‚è*ÔH¡P`hhˆéÀ2™ ×®]ÃòåËgtþýû÷ÑÚÚJïþ‰ÚB(ª| ÞtyyyaΜ9*û–¾hÑ" ¢±±‘uW‰Ž¡@ÏH$444Ìh`kk+²³³ñöÛo³î†ÞãóùpwwGCCë(jõÚk¯¡ººwïÞee’¶oߎ††•^^^T¥£€LÙ•+Wàä䄹s粎¢÷ø|>–.]Š3gÎ°Ž¢V¶¶¶X´hΞ=Ë:ÊLLLššŠ¬¬,• Ì\»v-®\¹¢1S!‰n @îß¿'''¥lÀ£n]]]¸qãÒÒÒXG!z.::###7=ÎÙÙiii8pà€Òg+X[[#** ÇgÝM¢C¨P£K—.aÁ‚011a–all †††àr§÷ÿú“'O">>živB€o¶C^µj²³³5n[äøøx455¡¾¾^é×^¼xñäú„(z&33Ë—/ŸÖyKK ÚÚÚÎ:>!€ `bbB£Æ<öÎ;ïàüùóhnnVêuœœàîî®1›#íG€ž›ö+ˆ‚‚øøøÀÞÞžu|ò-þþþàñx¨««cE파ŒðöÛoãÈ‘#xøð!ë8Opuu…›››Jö/X³f 5j*$Ñ^TêééÁõë×±nÝ:ÖQÈ?077—ËEww7ë(LØÙÙÁÇÇ%%%¬£”––bãÆ¬»@^`þüù¨¯¯×›MžgçÎ8vì˜ÆM äp8x÷ÝwqöìYÿüs444@¡PàÁƒøío‹•+WâOúýrÑ`G¯Ç<|øéé騶mÚÚÚ&ÿù?ùÉOžxz@4­­­^ocii‰ßýîwøýïÿÔ×¼¼<ˆD"Ö'ñx<¼÷Þ{8}ú´ÒfØÙÙÁßßW®\aÝ=¢e¨Pƒîîn˜››3ý åóù¾ydheeõÄÏþøÇ?bÍš5044|â>q8p¹Ü§þÍp¹\TVVâäÉ“Éd›o¾‰¨¨(˜˜˜(-gDDΟ?û÷ïÃÏÏoV×âp8HOOÇþýûñóŸÿ\½7œh%Ž‚~k¨ÜîÝ»agg‡uëÖÍê:ããã¸}û6Nž< ¡P###xzz"%% …|>ÿ‰oÿ/#—Ë!•JÁçóqõêUTTT`bbcccX¶l¢££ahhÈìõ™º>ø‰‰‰ˆŠŠb… …B‘‘äääàÆ077ŸÏÇŠ+©T @0­¿ËR©2™ 2™ ™™™èëëÃÈÈx<¶oß—'fÓÌTyy9òòòð‹_übÖ×ÂG}„Õ«W#88X¥÷œh?z ¤R)JJJPTT…Bõë×ÃÒÒsçÎÕu¹\îä/°„„$$$ ­­ ÝÝÝ(**ÂÕ«W‡˜˜Z €h¬žž””” ??¡¡¡ÈÈÈ€««+¬­­'™É5ŸÏŸœóÚk¯A.—ãÞ½{ÆîÝ»áææ†¨¨(„„„Ì*ÿÂ… ‘——‡ÊÊÊ)ïÔù<æææ Bii)™î>J4L¡P`xx.\@cc#V®\‰ ¨ô¹³³3œ1þ|455áôéÓhmmEZZ,,,¦õ„¨O||<ÊËË®7ÿ?’H$èééÁÑ£G!ð³Ÿý ÖÖÖ*û÷Áåráçç…BÐÐPäçç#77ƒƒƒŸñ«@€øøx”””ÀÏÏoÖÅvJJ ~þóŸ£­­ ®®®*¹D7Py¨b©;88LûÜÛ·oã7¿ù $ ~ðƒ`áÂ…j{Ïáp0oÞ<üà?€³³3~ýë_+uÞ2Q®  ®®î©u•\.GVV~÷»ß!..ßýîwacc£–< xï½÷pëÖ-üá˜Õîƒ111pssÞ={fÇãaãÆØ»w¯ÊïÑnT¨Xss3ÚÚÚ=ås†††ð«_ý 999øéOŠôôtf‹q8,_¾|ðnß¾Ÿþô§O¬·NˆºUWWãG?ú ~ÿûß?µ®…:™ššâ½÷ÞÃŽ;°{÷nüõ¯q‰žž¥¬øxiä›7o2»7DóQ añãÿ÷ïßÇ«¯¾ [[[æƒð8Œ±cÇ( ¼ûî»T&jjjðýïÞÞÞX»v-ø|>óÀ7ýìØ±§OŸÆï~÷»->doo¹s碼¼|ÖyÌÌÌ&ÇèóFQäŨÐ0J¥øóŸÿ [[[Öqž`bb‚>ø^^^ÈËËc‡| ‡ÃP(„X,fE¥Ž=ŠÍ›7ãÝwßÕ¸eª½½½ññÇ£ººÍÍÍ3ºÆ† PTT¤”Å|’““QWWGÅ:y.*4HUUöíÛ‡ßýîwL— ~¡Pˆ_ýêW(//Gnn.ë8䙘˜`ÅŠ8tèë(*óé§ŸÂÀÀßûÞ÷XGy.OOO¼ÿþûøõ¯ÖÖÖiŸobb‚;vàСCšU–ÇcöíÛÇú¶ E€ÉÊÊBhh¨Æ/ÅkllŒeË–!++Kiûš“Ù366VÚ²²š¦··ùùùX¹r¥ÆOmóòò‚ÝŒwç Ãèè(jjjfÅÒÒ£££·-2Ñ šý/ITTT€ÏçãÝwßeeJ6lØ€… "''‡u¢öíÛ‡×^{ aaa¬£¼”~õ«_¡ºº3ºÆŽ;pêÔ©YÏêðóóƒ Xߢ¨Ð2™ _~ùå´W*› ‘H„³gÏâW¿úՌߚ››ã믿ÖÙoD3ýôSôõõÍèiii°³³Ãðð°ÚrýÓÑÑèèèY¯¸7Uööö022šÕuÞyç¾Yt(""·nÝšõX€Ç‹ UUU©ìžíD€†Ó^IL"‘ ­­ ===‰DèììÄØØär9†‡‡Ñßß¾¾>´µµa||xøðáäHñÙ.œbhhÚ„FCc||MMM¬£(•B¡˜õ<ãããèîîÆ£GÐÜÜŒææftuu¡½½}òßË£G0>>™L†+VÀËËkVmš™™ÍjUÆ   ,[¶ Ÿ|òɬ¦òq¹\$''#77wFÓ‰î¢@ܼyÓÜ4::Š?ýéOxë­·ŸŸ¿ÿýïxôèd2öìÙƒW_}ÇŽömÛðùçŸãÔ©SxçwðÑG)%7‡ÃÁðð°Ræ-“Ù³¶¶†L&Ó¹ýà‹‹‹gõÁ5<<ŒÏ?ÿÙÙÙøÅ/~eË–á/ù þú׿bÆ ‹Å(--EBBª««ÑÑÑwß}‡žUn.—‹{÷îáÑ£G3¾Æ‚ ‘HpûöíYe €……®]»6«ëÝB€044ŸÏŸö7iKKK¼ýöÛH$ÈÍÍEzz:|}}'W ¼wï’““ajjŠÊÊJ¼ýöÛHHHÀñãÇ•öM€ËåÎúQ)!/bll<«'U555Ø»w/V­Z…7ß| …éééðööÆðð0 ÜÝÝ1>>Žññq8::¢¡¡ÝÝݳÎ. gµŠ§‘‘bccqñâÅY?iKIIÁåË—i,™D€ðöö†­­íŒþ{zz")) ÅÅÅOLõ022‚……„Báä#†††WÊcûÇfƒ‚‚XßB¢Ã,X0«Géæææàp8(++ƒlll`nnþÜ|>\.wÖrår9<<<àèè8«ë,Y²½½½¨­­Õu¼½½aaaÊÊÊY]‡è*4‡ÃX,Fÿ´Ïmhh€™™.\ˆÏ?ÿ\­Õýðð0FFF4b)Vò ”ÉápÐßß?ã¹ìÞÞÞØ¶mvïÞýû÷ã'?ù üüü —Ë¡P( ‘H ‰ P(”ºlnww·Rž´q¹\lذ—.]ÂÀÀÀŒ¯Ããñ°xñb\¼xQi}$Ú  aii‰¯¿þzZçµ··ãÀÆo¼K—.á‹/¾@ww7ZZZ066†ÖÖV £³³ÝÝÝhooÇØØšššpÿþ}ˆD¢O>>J¹!!!pppÀñãÇguGGGðx<´··+%Ñn¼ÿ÷ÿwÖ!t™™™êêê —ËáææöÌc8P__¨¨¨)?î”Éd°³³ƒ¯¯/ìììØØØÀÅÅ+V¬€»»;BBB[[[¸»»cùòåpvv†µµ5’’’àëë;£ñââbÄÅÅ! €õm&ÿK*•âüùóHJJÒ¸µògÊÜÜ£££ …3™_QQááaÄÅÅÁÙÙ\.§NBjj*âââàââ‚ððp¬\¹¾¾¾022¢E‹;;»½~DUUÞxãYÏ`xÌÁÁ¹¹¹ðöö†¹¹ùŒïemm-†‡‡áëë«”\D{éÆo öøý{WW× [°`NŸ>?üáøùÏ>¥Çê––– ü˜Éÿmee5ù¿ííí'ÿ÷·Sqttœñ/¯¿þ7nÜÀ›o¾©þ›JôζmÛðæ›oÂØØK–,™òyCCCøÝï~‡ððpDGGƒÃáàÆ …àóùOl%ìââ2ù¿ãââfœU$á§?ý)”º¬· PPP€­[·Îø:[·nÅ¿ýÛ¿!!!¦¦¦JËG´½Ð éééxôè‘ÆïÞõøÛÍöíÛ5~]v¢ÌÍͱaÃäççOky\|ï{ßCOO~ûÛßbß¾}‰DxýõוöÍüݽ{B¡Ë—/Wúµ“’’PYY9« fffˆÇ±cÇTÒ¢=è··ñõõÅÖ­[ñƒü`Ækˆ«ÚØØ~ò“Ÿ ,, ±±±¬ã`hh\õmË–-H$øýï?åÁz<©©©øïÿþoüô§?ÅŽ;°téÒ'žŠ)Ó­[·ðþûïã'?ù‰J¶ó¶¶¶Æ®]»ðõ×_Ïj…@‡Y­O@tfÑ¢EðððÀ÷¾÷½/#ª*øá‘H„•+W²ŽCžA(" %%%¬£¨ÄÎ;qåÊüö·¿ò@G‡˜ššÂÈÈhVS _¤ººï¾û.V®\ WWW•݃àà`H¥ÒY-ôøÕÇÍ›7U–“h>*4Œ±±1~ýë_céҥطoZZZ˜oå)“ÉÐ×ׇ}ûöÁÃÃÿó?ÿ£’o7„¼Œ——>úè#ˆÅb>|xrék–¤R)nÞ¼‰“'Oâí·ßÆ÷¾÷=•¿Û¶mŽ?>ãß FFFˆŒŒDaa!óß/„š •••011ŸŸß”ŽˆŒŒ„££#>þøc´µµÁßߟɨn¹\޳gÏbÏž=HMMEzzúä¢BD3566¢«« QQQ¬£¨„ âããÑÖÖ†¿ÿýï°¶¶Vé7îéïïÇÇŒ;wîà;ßùÎä@CU377ÇÇÑÑÑ1㩆...8sæ ¼¼¼`ii©æ;G4j0Ýà1+++,Y²ÝÝÝÈÌÌ„P(„ƒƒƒÊa~›D"Amm->ýôS˜››ãÝwß…««+-ú£t½¾y¬?oÞ<,^¼gÏžÅÕ«Wáááccc•ûV(Gvv6N:…åË—cãÆ3žš7Óþ ¤¤044œö5ø|>ø|>Ο?OãyôMÔ`ÿ‘'%%ÁÅÅ—.]ÂÅ‹;;;*½Íû÷¥•••ŪU«<£_0„ +++H¥RLLL@(²Ž£2<­­­àr¹ˆŒŒÄŸÿügøùùÁÓÓ>>>³^‚÷Éd2TVVbppyyyð÷÷ÇÖ­[áííͤÿÁ_ÿúWüò—¿œÑ5¬¬¬ —Ë!‹é߸â(h/W•Û½{7ììì°nݺY]G&“¡¾¾YYYÉdüyó°qãF( Mkã™L†ÑÑQðx<äååáúõë011ÇÃÒ¥K±hÑ"ðx<úÖ¯…Þÿ}lذá‰yîºddd{öìH$Â+¯¼{{{LLLàÂ… ¸yóæä¿””,X° …bÚOo$•J±wï^ô÷÷ÃØØÈÈȘñ"AÊ4::Š¿þõ¯HJJBHHÈŒ®ñÛßþñññ:ýĈ<=Ð"<~~~ðóóÃÀÀªªª°{÷n\¿~777Èårp¹\( ( p¹Ü§Jq8ôõõ!?? …ضmbbbT6EЍ.×õƒƒƒØ¿?¼½½2ù÷U("%%)))xôèÎ;‡¿üå/°µµ…¡¡!`llüÄ 7‡‡óÌwîÜÁ;w ‘HÐÜÜŒ?üµû¥‰‰ .\ˆ’’ÌŸ?FIFFvïÞÐÐP~bDžF€–²´´D||<âââ “ÉÀáp““ƒÊÊJ…BÁÌÌ 8{ö,–-[öÄ#>…Bü×ý¸\.¸\.ø|>}Û'K.—#;;¥¥¥HMMEddäsussÃÛo¿×_ …###8rä<ˆeË–MîØÞÞŽÛ·ocùòåOr¹QQQøîw¿‹‰‰ |õÕWÔ¨ÿÇ’’’ð³Ÿý MMM3Z*ÙÍÍ îîî(((@bb"ëî5¢@‹q8œÉ<°f͚ɟÀÑÑkÖ¬Á–-[4âq%!3¥P(pîÜ9ôôôàÕW_Åܹs_z‡Ã™|%fmmµk×¢££ßÿþ÷'G½‹Åb ½ð©ŸÏGdd$rrr­qE‡ÃÁ믿ŽsçÎaË–-Ó~‚Ççóáëë‹ÊÊJ*ô ­ £ärùdaðx0¢?P\\Ì|޼2Ü»wÿöoÿ†ÁÁAìØ±óæÍ›Ñ“ªììl>1åÍÐÐpJ˜¡¡¡ˆ‰‰Áþýû1>>Îú–<ÅÏÏÖÖÖ¸téҌϼ{(ÑTè  µµ ¬£F.\ˆÛ·oký"/uuu8wî6mÚ„ 6Ìx-Œ‰‰ ŒŒŒÀÉÉiÆYâããaff†C‡±¾-Ï”––6ã}œœœàìì<9žˆè*tÐÄÄ$‰Æ=ª$dªFFFð—¿üÇGFF,X0«¿Ï---xøðá¬ç»ÇÆÆ¢«« MMM¬oÑS,,,‰sçÎÍèüÍ›7ãÊ•+aÝ¢&TB4ÊÈÈöîÝ‹€€¼ýöÛ³úÖþXSSæÍ›7ë븺º"##'OžÔÈ" && èèè˜ö¹æææXºt)Ž9ºDM¨ Dq¹\ˆÅbÖQ¦ìñ(ÿßüæ7X¸p!acc£”kŸ9sæ‰A²³áî€dee±¼]Ïäää„íÛ·ã³Ï>›Ñ7yKKK °îQ*ÑAˆ‹‹Óª=ßsssÑÙÙ‰wß}÷…Sü4A||<,,,pþüyÖQžâëë ###TWWOûÜØØXô÷÷£¶¶–u7ˆP ƒ.\¸@ÛõiÅûÜþþ~œ9sؾ};ÜÜÜ”ºžQQ<==•ºƒ¥¶mÛ†úúú¼W‡ƒµk×âܹsJ¥Ó:W  )) çϟ׉$äŨÐ1r¹uuuð÷÷g…—ºÿ>þû¿ÿ]]]زeË´–²žªÆÆFØÚÚÂÀÀ@©×Gee%D"‘ºnÙ”xyyÁÉÉ —/_žö¹¨¯¯§@P@a¢¡¡'OžÄw¿û]¼þúë*ÙŒ¦¯¯ÍÍ͈‰‰QI"""ŠÝ»w«úvMÛŠ+P\\ŒÑÑÑigaaùóç#//uˆŠQ@Q«±±1dffâôéÓØ²e \\\TÖÖðð0úûûáî6-Z„þþ~444¨¬™ðöö†™™*++§uÇCxx8jjj¦]<íB!:êñ“&­î6222¹š^zzºJ?üàܹsHIIQixã7púôišÈår‘’’‚óçÏC"‘LëÜ… bppÍÍͬ»ATˆ ÓÐÐGGG˜˜˜°ŽB³³³ƒX,F?ë(¾ùæ¿oß>øúúb×®]puuUy› ðööVy;®®®HIIÁ§Ÿ~ªò¶¦Ã××¶¶¶(((˜ö¹¸{÷.ë.¢@ÇÂÇÇfff¬£à›|Ο?_þò— Â’%KÔÒnAAæÍ›GGGµ´7oÞ<øùù!//O£¶cNIIA~~>ÆÆÆ¦u^rr2JJJ088Ⱥ DE¨ „¨T^^ZZZð‹_üÑÑÑjk·µµjÛã^("##999õÚÅÓÓVVV(//ŸÖyÖÖÖˆŒŒÄ‰'Xw¨„è0KKK 1i»³³YYYhiiÁöíÛakk«¶])ûúúPWW§ö ± ±aÜ;wNcÐq¹\$%%áÒ¥K˜˜˜˜Ö¹VVVÕ¨'Dy¨Ð!£££èï—ë(DCl߾ǎSû®€MMMøôÓOÑÕÕ…mÛ¶)}þˈD" ¨|á³ÄÆÆ‚Çã!''Gím?¿¿?,--Q\\<­óÐÚÚŠû÷ï³îQ*tHgg':::°`ÁÖQˆ†000˜öðÙjllĉ'°k×.¼ñÆ*™ßÿ2}}}°²²R{»%''ãÑ£G¸wï³ ÿ(-- /^œÖ¢E\.ëÖ­ÃÉ“'é)€¢€¢b±_}õŽ=ŠÍ›7cΜ9̲ìß¿ÌÚwvvFFFN:¥1ëÌ;vvv())™ÖysæÌÁ£G¨ÐATBfmttûö탱±1¶mÛ777fY†‡‡ÁçóajjÊôž899aîܹÈÏÏgšã1‡eË–!??ãããS>ÏÎÎÁÁÁ8wîë.%£@‡TTT ,,Œu ¢a8ŽÊÖu—ËåÅþýûáéé‰Í›7«e~ÿ‹äååÁÃÃÉûÿ´nÝ:ðù|œ9s†ußÌí711AYYÙ”Ïár¹ˆŒŒÄíÛ·1<<̺ D‰¨Ð!×®]ÃâÅ‹YÇ ÄÚÚaaa*ûºrå þå_þ¾¾¾jqÿ<ÃÃð³³cÀçó±téR1›ñ6lØ€ÜÜ\ˆÅâ)ŸŒžžtww³ŽO”ˆ 5X¸p!Q"*Ô`Ñ¢Ehll¤ÇgDg\¼x<À¶mÛ`nn®¶ùý/ÓÙÙ ÉóXDDúúú4bVÇÃ’%KpíÚµi$ñññ¨©©AOOë.%¡@GÈd2p8p8ÖQˆknnÆþ碹¹;v쀱±1ëHOÈÌÌĆ 4îß—ËÅ{gììl˜ TTTLùœÇƒ³³³YÇ'JB€ŽÈÉÉAPPœœœXG!:ª©© 'NœÀÒ¥K‘žžÎd~ÿËÈd2p¹šùkÍÎθvíšFL©KOOÇÙ³g§5#ÀÞÞ£££j_XЍ†fþK!ÓÖ××cccûæCØ ÀÀÀúúúf|ææf;v ëׯGll,ó)vÏr÷î]ØØØÀÁÁu”çÚ´iàôéÓ¬£ÀÍÍ nnnÓš¦˜˜˜ˆÐ6Á:‚ Btœ§§'ÑÕÕ5ísGGGqéÒ%œ8q7ndº¸ÏËÜ»wVVV°°°`å¹x<bccqýúuæ»ì=ÎRVV6åÕ9ÒÓÓqèÐ!¦Ù‰rP@y&±XŒÃ‡£ªª ëÖ­ÃܹsYGz.‘H„úúzDDD°ŽòRžžžHKKþ}û˜o4þ|ðx<ܸqcÊçØÙÙ¡··—^è*t€T*Åðð°Úö='ºO$aß¾}pssÃ~ô#xxx°ŽôB###xøð!‚‚‚XG™’ˆˆxyyá³Ï>c[·nÅéÓ§§¼S ››üýý‘››Ë::™%*tÀãݺâããYG!ZN&“¡¯¯€‡‡–/_®ãJ&&&  µ"ëc‹-‚D"A]]Ó®®®˜3g._¾<åsLMMg5¦„h*Ñ7ty™¢¢"üÇü<<<˜˜È:ö”íß¿7nÔØÏbkk‹­[·b÷îÝc–ƒÇã!::•••SΑ’’‚›7oªd)¢>Úó¯…2cëׯǙ3g^¸'ÀåË—Q[[‹?üË–-ÓšoÓr¹°¶¶feÚœœœ‚ .0øx ñššš)onnŽèèhz  å¨ D¼ìÃüòå˨¯¯ÇöíÛadd¤5þŸŸGGGøøø°Ž2m\.¨®®žÖ¢<ª°}ûvœ8q‰dJÇü¿ C8IDATÏŸ?7oÞdš™Ì:@,kä¢,Dóµ´´àý÷ßG}}=víÚÖ‘¦mtt|>_«Š–oãóùXµjJJJ˜.îââ‚yóæáâÅ‹S:ÞÑÑÎÎÎÌ 2sT考bÛ¶m¬c-óðáC>|ëׯǶmÛ´²ˆ”ÉdèììÔè)ŠSŽyóæaÏž=Ì2ðxÊÊÊ`hhKKKÖq”¦ººæææpqqaE©x<Ö®]‹‚‚f-\¸2™ wîÜyé±öööpppÀõë×™d%3G!:èñ¢2¸sçÞ|óMÄÆÆ²ŽE¦(44nnn8pà³ »víÂÑ£G§´é··7Z[[§¼†Ñ T¢ƒÚÛÛñoÿöo¸yó&vîÜ ¡Pˆèèh´¶¶êÄò­"‘eeeXµjë(*‹‰‰ ܾ}›IûÎÎÎðññ™ÒX€%K– ¥¥ÍÍÍL²’™¡€ÓÖÖ†ƒ"##¯½öÚäâ>ŽŽŽaºØŒ²LLL ££Cãw)œ lÚ´ Ÿþ9“oÖ<öööxøðáKår¹Ø¼y3öíÛÇâV‘¢@ËÓ@2©¥¥™™™X³f addÄ:’Jœ8qIII …¬£¨”““bbb••5¥GñÊ––´µµ½ôXsssÈd2ˆÅb·ŠÌZ¬­­ ·nÝBJJ ë(„1‰D‚ÇcÿþýHKKƒ··7ëH*ÕÔÔ777Ö1TŽËåbÆ ¨¨¨`²Žˆ|||PTTôÒc===áè舫W¯²¸Ud¨Ðbr¹2™ €uÂX,ÆÁƒ!‘H°yófxyy±Ž¤RÕÕÕ011ŸŸë(jÁår‘žžŽK—.¡¿¿_íí'''ãúõëSj;55%%%Sš>HØ£€-%—Ë!‹‘™™ [[[lÛ¶í¥+û…††âƬ£ÏJoo/ø|¾Î¾Þx– ÀÙÙGU{Û666 Ù3g^z¬««+zzz˜®dH¦Ž B´Tii)~ö³ŸÁÁÁÉÉÉSÚ oéÒ¥(,,dº÷ül éÔâ?SññqÔÔÔ¨½í„„ÔÕÕ¡½½ý…Çñù|¬^½šI¡B¦ -¦P(tf T2=EEE¸qãÞÿ},_¾\k·Â®ááa\¼x›7ofEí¬­­±víZìÙ³gJëô+“­­-ŸŸÿÒc§4s€°GŸZìèѣذaëD:;;‘ššlß¾ÖÖÖàóù¬c©Mww7¬¬¬t~ôÿ󸸸 ..'OžT{°bŠܸq}}}/<Î××–––(--ey«ÈP ÅÚÚÚàääÄ:Q“ŽŽ|õÕWxðàvíÚsssÖ‘ÔîàÁƒHNNÖÛ¯\.k×®Eyy9ÕÚ¶.\ˆììì' …²²2ZPÃQ@ˆx¼¸Ïš5kðÎ;ïL.î3]B¡¦¦¦èííeÝ¥i‰DP(:µŸÁLp¹\ìÚµ 999èêêRkÛ+V¬ÀíÛ·ÑÑÑñÂã"##QWW‡ÑÑQ–·Š¼„h0‰D‚ýû÷ã‹/¾@JJʬ§¾ÙØØ 88ø¥ßâ4QEE„B!üýýYGa.00ñññسg†††ÔÖ®µµ5æÏŸK—.½ð8@€ÐÐP³¾Uä¨ÐR}}}022Ò«©Púfbb‡‚@ ÀÎ;áëë«”ër8f{Íφ6Ï\P…ùóçC¡P¨}V@BBnß¾ý§H!!!4@ÃQ ¥®\¹‚¹sçÒ$—Ë122‚ÌÌLXZZbóæÍ˜3gëXLI¥RÔÔÔ ::šuò½ï}•••¨ªªR[› Äùóç_xœ››ÚÇ*©£@Kiã7825ׯ_Ç/ùKXYY!55Uo¦ø½Èøø8îÞ½‹°°0ÖQ4Š™™vìØC‡©u—ÇäädTWW¿p ‚­­-<<ÕÕÕjioþüù/]‹ ##çÏŸ‡H$b}{È·P@ˆMLL 33ÆÆÆøÝï~§´Å}¦kÍš5ÈÊÊb};^J*•¢¤¤Ë—/gEkp8¼óÎ;¨¨¨@ee¥ÊÛsvv†­­í ×"°´´ÄÄÄÆÆÆXßò-T¢&ÕÕÕøüóÏajjŠÕ«WƒËåÒÿ—H$¸ÿ>YGÑ*fffؾ};öíÛ‡•¶ebb‚àà`”••A&“=óCCC¤¦¦âÀ¬o ù*´Pnn.éÃC‹”——#//^^^X³f x<ëHZA$ÁÀÀ€þ®Ï€µµ5–.]гgϪ|ÆGRRîß¿–––çcaaAëh*´Ð;wh@”)//Gii)Þ|óM¬X±‚>̦áСCHJJ‚±±1ë(ZiõêÕ055ÅÑ£GŸûí\¸\.ÒÓÓ±oß¾ç³hÑ"ßlêD4„¨Èàà ŠŠŠPRR‚]»viÔ6¶|>@ãeŒŒÐâ?³ÀãñššŠÊÊJ´¶¶ª´- ˆD"H$’gþœËåÂØØƒƒƒ¬o ù_T¢===øä“OP\\Œ]»viÜ”M'''hô¶ÀËåpttdE«ñù|¼ýöÛ8zô¨J×ðöö†ƒƒ®^½úÜc¶oߎ³gÏB,³¾-T¨Íœ9s^:Rv*ÆÇÇÁçói]t ÖÝÝ}ûö!55ÿçÿü¿öî;,Šsíøw ,méÒA@AcA@PD{Á‚Š šcrrR[îÏuyåÊìîì=ÃìÌ=Ï<Ïý¼©´ãûµ´´”úD\XX±X WWW¶CQy®®®000Àµk×Fô{.\ˆ”””ÇÖ 000—Ë¥¾J‚€Q¢§§==½!×_OLL„½½=œœœØÞ$ò'2™ gΜÁþýû1oÞõþFááᨪªÂ7Fì;\\\`llüØçüºººX°`¢¢¢ØÞ”¨±XL=È•D"ÁñãÇQSSƒºø‘X,FJJ ,XÀv(jC__³gÏF\\ÜcŸÓ—ËEPPÐg ìî+ j3Rª#J"¹\Ž'N@KK [¶l¡à 77NNNl‡¢V&Mš„3f **jÄF˜››CGGç±}|| ‰F­R!yiff±X ±XÌö.Ð8”Œ¢åË—ãæÍ›TüBIeeeáòåˈˆˆÀôéÓ5¢ -—Ë…®®.ëÇdZZ\]]! ÙÞ%­ûŽ<99yXŸËÛÙÙaìØ±HJJêõšPPPÀöækJF—Ë¥;y%T__sçÎ!)) T܇YYYpvvÖˆ¤KÙ-^¼ZZZøõ×_‡m<“'Oîó1888 ¦¦†íM×8”¨€®®.PóèhjjBdd$Š‹‹sss¶CÒH èýãU2kÖ,TTT ººzØÖéìì ¹\ÞçÀ5kÖ &&F©†¤jJT@GGŠ‹‹©'ú0khhÀÁƒáïï­[·j쿵µ5š››Glzا)..FMM ØÞäÿqrrÂÒ¥Kñ¿ÿû¿ÃÖjiii ;;;¤§§÷zMGGfff¨ªªb{Ó5 %DãÈd2œæÍ›×gùé9sæ ¦¦<`{Ó5%D#0 ƒææfœ>>‰DÈÉÉéõZDDŽ?N£¥F U@tt4.\H­AhooÇ­[·pñâE¼õÖ[X¿~=´´´ØKéèèèôYªu¤%''c„ j1µ²: DYYÙc'õ>Ÿyóæá·ß~ëÕñÔÄÄ} "î(Dm555áûï¿G\\6mÚDCüƒÃá ,, GŽõï.((€ %eJÎÑÑ¡¡¡8~üø°$Ï<ó { û377‡Ï°µ6'£€¨¥¦¦&:tøïÿþo˜™™±’R …hmmõï•Éd4õ¯Šprr‚““.\¸0äuéëëÃÓÓñññ½^322Bss3Û›«( jE.—#11ûö탟Ÿ¼¼¼€ž1+¡’’”——#88˜íPH?-^¼\.¿ýöÛÖÃåráããƒÛ·o÷J<ƒƒƒQ^^Žââb¶7WíQ äd2x<5‘öƒL&Cll,îÞ½‹àà`ÅÅŸ('‰D©TJåUˆŽŽ-Z„³gÏ¢££cHëš4ix<^¯Î€ÚÚÚÔ 0 (PrÉÉÉ011Á„ ØE©1 ƒØØX´··ãoûïW÷îÝ£ãZÙÚÚbÙ²e8räD"ÑÖµiÓ&DGG÷šx(""ÇŽc}šjuG À(âóù˜?þ€ª]‰D"êýÿyyyxûí·ÑÕÕ…°°0º£;;;ØØØàæÍ›£ò} ÃàâÅ‹X´hÛ›N!00%%%¸ÿþÖc``†aÐÖÖÖc¹¡¡!d2ÚÛÛÙÞTµFW–Qæää„{÷ڸ{÷..\¸€W^y«V­¢ eIGGB¡•••l‡BTÄË/¿ŒóçÏ©J ¡¡!æÌ™ÓkæÁ1cÆ`Ú´iˆe{3Õ%D%577ãóÏ?ÇéÓ§±aÃ899Qor’˜˜wwwŒ3†íPÈ ÙÙÙÁÞÞ—/_ÒzüüüPUUÕkxa`` QWWÇö¦ª-J”˜T*Eii)<<<ØE©´¶¶âСCðõõÅ«¯¾ KKK¶C"T^^333ðù|¶C!C°bÅ Èår$$$ zæææpssÃ7z,·¶¶Fkkk¯ÇdøP ÄÚÚÚMÓ¤þ?‰÷îÝÃÁƒáííY³fÁÀÀ€í°Ô†P(•j€>Dii)fÏžÍö&“! BBBž×/\¸III½ ­X±111lo¦Ú¢€¨†aýû÷ÃÛÛ3fÌ`;$µ‚ôôôormooGkk+µÜ¨ GGG,Y²‡ô¨]]]888àÎ;½Ö=\3’Þ( JO.—ãÌ™3hllÄ|¶CRKÚÚÚÉd#>ôª±±¦¦¦lo.Fþþþ(//GQQÑ >¯«« ooo\¾|¹ÇD@VVVpuuÅÅ‹ÙÞDµD Qjøâ‹/ÐÚÚŠ°°0*ˆ¤¢¢¢°~ýz¶Ã ÈËåbëÖ­ˆ‹‹ôûœ9sP[[‹ÂÂBÅ2>Ÿäää ¹ðé%ÖÐЭŸŸsçÎÁÛÛ¡¡¡tñWMMMÐÒÒ¢¾jÈÆÆ¡¡¡øá‡5¯‡Ã¹¹9êëë{,Ÿ>}:ªªªz-'C§™W…ë)-—Ë‘——‡³gÏbãÆ˜3g ñ%gDçb‹‹ƒ‡‡,,,ØÞT2ÆŽ‹±cÇâÚµkƒúüÆqòäÉ^===‘‘‘Áöæ©J”˜T*Õ¸‹KK vïÞ_ý7n¤Žb£ˆËåbåÊ•½Š² —îŠo4-³úâp8xöÙg‘™™9¨ª’VVV˜4iR¯j©þþþHNNf{óÔ%Di´··ãСCðööÆ»ï¾ kkk¶CÒ8VVV¨ªª‘uWTT    ,`{3ɘ5kÒÒÒ<*€ÃáÀ××ùùù=&255………rssÙÞ<µB aL&Cvv6~þùgL›6 ³fÍ¢zþjˆaÈåríÓ¢IfÏž '''üøãþ¬»»;ñðáCÅ2¡Pˆ‰'âúõë4AÐ0¢_â(³±±¾¾> OOOÌœ9“íȹqã|}}ÙƒŒ’éÓ§£¥¥ePùúúöª ¸xñbܹsÕÕÕlošÚ `”™™™A__¿ÇP—¾¤§§C__'Nd;äÃ0 âââððáC¼óÎ;ðóóc;$2‚RSS©€“±´´DDDΜ93àúsæÌA^^^VkkkJ†%Jª¥¥<Om‡¾bçÎxôè6nÜH½ü•„••ŒQPP0¬ë½}û6¬­­affÆö&’Qdoo???DFFès¦¦¦˜2e Î;×cùêÕ«qôèQ¶7KmP@Fݽ{÷pöìY,^¼«W¯VÛ$GÃÈÈhا¬¾{÷.,,,hü¿š:u*? ç÷–––hooï1$ÐÀÀzzzxôèÛ›¥( £F,#??111X·n¼½½¡§§ÇvXd„µµµ¡´´Ó§Og;Â@€Õ«WãìÙ³hllì÷çQYYÙ£¿”µµ5ìííñÛo¿±½Yj%UWW;;;¶Ã6mmmØ»w/¢¢¢°qãFØØØ°%---¨®®¦i­5˜¾¾>6lØ€_~ùe@Óû†……!**ªÇ2[[[455hÁ*MA €jmmErr2BBBØeX´··ãðáØ2e vìØAãû•œ––d2Ù°­O,CKKKíG´'óõõEKK ÒÓÓûýWWW…ŸY¸p!rrrF|ÖJM@ €’bFåO˜ à 55?ýô&NœˆÙ³gƒËåªüv©»U«VáÆhjj–õEFF",,ŒíÍ"JàÙgŸEvvv¿û˜èêêÂÚÚùùùŠe4Mð0 €ŒˆîñýW¯^…——fÏžÍvH¤ŸŒŒŒÐÑÑ1,­2™ MMM4ý/ð{Ç>///DGG÷û3ÞÞÞ())Q$¤Ë–-éS§ØÞ•G .\@UUþþ÷¿Óø~ –ggg899± Q3fÌ@WWrrrúõ~ ++K±ÌÐÐzzzô`ˆ(PB ˜9s¦J–Ã}ðà¶oߎÚÚZDDD@WW—íÈ tvvy=ííí*y“‘Ãçó1þ|¤¤¤ ½½½_Ÿ Źsç ‘Hü>ÀÊÊ ×¯_g{sT%JèÎ;?~¼Ê=+/**ÂéÓ§±~ýz¬]»–Æ÷«(‡ÐÐP9rdHë‘J¥¨¯¯‡ƒƒÛ›D”ŒŸŸ¬­­û}ŒÙÛÛÃÍÍ çÏŸg;tµB ‚‚‚••…®®.¶C6EEEˆŽŽÆÚµk1iÒ$߯â ÐÒÒ2¤u444 77AAAloQB~~~hmm}jYônB¡°GÇÔ€€äææö»ôF ÜÜÜPQQ¡ @{{;Nœ8˜˜„……©Uí24÷î݃‹‹‹Êµd‘Ñaii‰5kÖàûï¿W4í?ɲeË““ƒÚÚZÀøñãQ]]=,ª4%JF.—ƒÃá¨Dóy{{;¢¢¢ÐÜÜŒµk×ÒÅ_hiiÇãõ(Ã:PgϞł ( egg‡iÓ¦õ«L°žžæÎ«AÀãñÜk¾Ò”(™´´4hiiaêÔ©l‡òD8|ø0\\\ðÜsÏÑÅ_͸¹¹ÁÜÜIIIl‡BÔÇúuëpíÚµ~M@åííššTTTø½à5ÈÀP dÄb±Rß11 ƒ„„lß¾ d;$2B¸\.D"Ñ >›‘‘ êHžJKK Ë–-CllìSËûŽ3öööHMM8::ÂÔÔ´ÇAÒ”IHH@ii)Þ~ûmÌœ9“ípˆ’ª¬¬„¾¾> %ý2eʈÅbäåå=õ½...¨©©X,†žžtuuQUUÅö&¨$JH¿ÔÕÕáܹs(++Cxx8,--ÁãñØ‹Œ ¡P8¨VmmmÈÎÎÆüùóÙÞ¢"ôôôð /àØ±c¨¬¬|â{gÏžªª*E)à… âÖ­[4`( OURR‚ï¾û•••‡ŽŽÛ!‘QФ¤$477ès]]]¨««ÃرcÙÞ¢B,,,àêêŠ7n<ñ}aaaŠŽŽŽ¨­­…X,f{T%JD$áêÕ«X¾|9Û¡(ãäɓؼy3^xáºøk@‰D2àiW£££±xñbj!"¶aÃÔ××ãìÙ³O|Ÿ››Œ‘šš >Ÿ… Ò܃@ €‘J¥¨®®†££#Û¡€aãĉX³fRÄDTÃèîŸ Çƒ¯¯/rssŸXˆJ @__555³¾Ê¡€ôÒÞÞŽ={ö`ÿþýX»v-õäÖPFFFhllì÷gÒÓÓannggg¶Ã'*jÊ”)˜;w.>üÄÇO‹-Bzz:Z[[áêê ###dff²¾J¡€<'NTʃU$!22ãÇÇ»ï¾K Æçó±råJDFFöû3µµµô¨ˆ ‰··7LLLpúôéǾÇÞÞvvv¸víttt ¥¥E³%,àr¹˜1c._¾Ìv( r¹8pàœ1oÞ<èéé)uM2ò´´´úݹª­­ iiiJÕ‡…¨®ùó磩© ·oßîóu‡ƒÙ³gãÊ•+€\»v l‡®2(P" ðvÁ½zõ*Ž9³½+ˆ ‰D¨¯¯‡ Û¡5`nnŽððpÄÇÇãÎ;}¾ÇÂÂúúú(..†½½=êëë]¼JQ DŽ?Žyóæzñ”ÄÄDâÝwߥ™ÛHºººàóùýªð믿"$$|>Ÿí°‰š033ƒ»»;®^½Úçhsss899áÆàóùXºt)Ž?ÎvØ*ƒ%RUU ‹Qù.†a ‘HpéÒ%aÓ¦M4…/饻sU_c³»!™L¨¨¨€••Û!5³hÑ"˜™™áäÉ“}¾Š›7o¢©© VVVŠBB2™ R©ô©“ i2JÕGÃ0(,,Dkk+òóóQ]]ÌÌLÈd2ðù|TVV"//zzzpss±Gåå娻w/ììì°iÓ&ê´EzèêêÂÝ»wÁårQVV---C `„ àr¹H$زe &MšGGGÅÝ!ÉËåbΜ9øŸÿùÌ;fff=^Xºt)"##1gÎÔÖÖbíÚµpssCYYöíÛ§³«²ÃPz4j†ÁÊ•+ †azK‘Édàp8Ëå B\\܈4§–••á—_~ÁªU«0vìXj²%½Ü¿³fÍBcc£bŠj¹\OOO$''C  «« ~~~ÈÊÊ—Ëżyó°iÓ&„††B €Ë¥F2|²²²påÊlÙ²†††`2™ <·o߯¶mÛPYY‰ÂÂB0 †aàåå…””hkk³¾R¢_è(âp8xõÕW¡££©T ™L±X¬ø×ÝdÅãñð_ÿõ_#ra.--ʼn'°zõjŒ7Ž.þ¤ONNNزe‹¢‰_*•B.—ÃÁÁ¡Ï »\.G||<^~ùe¼ð xôèÛ›@ÔÌÔ©S1}út|÷ÝwH$HKKÿþõ/ìØ±aaa¸|ù2 —˩ٿŸèì?ÊìííŸZ"uÞ¼yðóóÖï‰D8r䪫«N•ýÈñx¼^5 ø|>^{íµ'6§¶µµÁÛÛæææloQCÏ<ó ®^½Š×^{ D{{»¢uŠ µŒ2}}ý'^|uuu6¬'ÐÎÎN9rffføË_þBÒ/kÖ¬OeOK^7n܈ððp¶C'j¨®®W¯^Edd$¾ýö[´µµaºø%£ÌÎÎÏ=÷œâÿ¹\n;ªÉ“'cýúõƒZwuu5N:¥è• üÞ™+22öööX±blmmÙÞDEXXX`Ó¦MŠ‹>ŸÏâs}ccc¼÷Þ{t÷O†]GGÞxã „„„ 77·×ëôŒp(`ƒƒ„B!ÀÝÝÏ?ÿ¼â5WW×A?—ßµkž}öYEe¬¬¬,üüóÏpppÀ¼yóØÞl¢‚‚‚‚#D"""àééÙçû„B!>üðC¸¸¸°2QC:::˜7o|}}{=‚âr¹xÿý÷1eʶÃT9”°`åÊ•ðòòðûIÕÉÉ ```€×^{mPÓ¨^»v çÏŸGkk+<ˆK—.áüùópssÃüùó©¤/[[[,^¼ÀïEWw§åç燗^z‰:•’Áår±yóf$$$à¹çžëQ,M.—cêÔ©8pà C JXðÇ‹±¿¿?þú׿ÂÃÛ6mÂäÉ“¼¾úúz¼øâ‹(**8p'NœÀ?þñÌ;—íÍ%*ÌÈÈ3fÌÇës†?†aàêêŠ?üpP‰+!¡¯¯O?ý‰‰‰Š›(øøãáææ†o¾ùÚÚÚ044„ƒƒx JXÀår±nÝ:ÃÉÉ B¡ð”T*Å¡C‡pïÞ½˯^½Jóc“a„¬_¿^Ññª‡ÃÁK/½ooo¶Ã$ÂÐо¾¾8pàþýïC(¢ººííí˜>}:V­Z… &àù矇Ãéq¼J$š+਽n””” 33SqçÏãñ —Ë‘——‡_ýöööèììDuu5¢££Áãñ##£§®;>>Û·oï5c[nn.bbbàîîNÍÿä±ÒÓÓQ^^þÄc„aˆÅbÄÄÄ ²²...àr¹‰D011P(ÄéÓ§{Ým1 ̘1ƒíÍ$jÈÃÃÛ·o‡““~üñG|ÿý÷ø×¿þ…¯¿þ[·n…‘‘‘âØÔÖÖÇC^^ª«« ©TÚc}ÚÚÚ Ô¨’èT p˜Éd2ŒŒŒ`iiÙç @¯“/Ã0¨¨¨€H$Bgg'0þ|öxo]]þö·¿!::Z±L[[ºººðõõÅóÏ?+VPY %‰ÐØØàÿijjêq YYYA(ö«©”ÇãÁÇÇiiiŠ“g÷ºúú<‡ÃA[[ª««Ë†Á²eË0aÂÅð-ccc*EME&“¡µµÙÙÙØ±cüüüÀ0 lmm¡§§§¨ØíqçÜîu•——C*•¢³³K–,··7„B¡ÚžC)&"‘—.]BSS233ÑÜÜŒ—^z Š ¿är9*** ‘HŸŸ_~ùÎÎÎpww‡­­-fÍšxíµ×ðÕW_A `îܹÐÒÒ‚ŸŸÂÃᯯ߫f6Q·oßF^^x<qçÎ0 ¬[·FFFŠ“ Ã0°¶¶VŒH N8Ο?‚‚EŸ˜™™A&“ÁÕÕS§Ne{7P\\ŒsçÎ!66NNNpuuEHHär9ììì<«ªL&CYY†AZZ.^¼ˆ††¸»»cíÚµ˜6mÛ›<ì(¢––dff"..ÎÎÎ044ÄòåË¡¯¯?¬ßSQQK—.¡¹¹=Âĉ±{÷n„††ÂÖÖË–-õi„ »Äb1PRR‚C‡AOO–––3f är9lmm{Q†ÇA>å\ºt ¥¥¥àñxhhh@MM ÚÛÛ±aø¸¸ÀÌÌLmïÀÈÀ´µµ!!!ñññ°³³ƒ••ÜÝÝwþÃ}|ß¿IIIhjjƒàææ†7ÂØØX-溠`ª««ñÓO?A(*ŠìŒô0¨ŽŽ”––âÇ„¾¾>ÞyçaO6ˆrkjjBBBš››q÷î]´µµÁÓÓ‹-‚‘‘ŒÙqК››ÑÔÔ„K—.!55pww‡‘‘‚ƒƒajjÊvˆ„%%%%xýõס££ƒ°°0ÀÄÄdT¾»­­ yyyØ»w/JJJ°cÇøûû³½K†Œ€A‰DˆŠŠBQQ6oÞŒñãdzGRRbbb°hÑ")ÅÝmmm(,,ÄÑ£GÁçóáêê sss,Z´H­‡ßuO2T[[‹û÷« aaapssÑGDytttààÁƒ¨­­ÅäÉ“±xñbÖúŒ0 ƒË—/###xñÅaaaÁö.4J(##)))prrÂÌ™3ajjÊÚ…W&“¡¶¶çÏŸ‡L& 0vìX¶wF<átuuaýúõÐ×ׇ¥¥¥Z4Ad?ÔÖÖ¢££ÇŽǃ§§'‚ƒƒ)ñUcׯ_Gjj*<<<àíí=jwüOÓÖÖ†{÷î!11&LÀ¢E‹T²%œœŒ7ÞxÛ¶mt½þ‘ ‹ñÁ 33{öì½½=Û!‘!jkkÃýû÷qôèQ888À××÷±ex5Qvv6®_¿Žââb¬[·®®®Ô" fΟ?;vàÿüŸÿƒ¥K—²NŸîÞ½‹­[·båʕغu«Ê%”ôS{{;¡Tÿnb±;wîDKK ¾úê+¶Ã!CÐÞÞŽ ¾¾°±±¡ar}‰D¨®®Æ‘#G  ±eËJÔDCCÖ¯_mÛ¶aÉ’%l‡óDùùùxå•WðÑGÁ××—íp„€~H$øî»ï`gg‡Õ«W³Îc‰D"|ûí·?~<–-[Æv8dNœ8 .à¹çžS¹“ ›ÒÓÓ±oß>Ìž=6l Ç*¬»f…££#‚‚‚ا_òòò7b̘1l‡ÓošóqÒÓÓ«ô'd@€éÓ§c÷îÝxôèÛá:qâ>ýôS¬_¿^é5eãåå…ððpìÞ½QQQl‡CI*•b×®]èììT™‹?ðû¬®S§NÅë¯¿Ž††¶Ãé7Jž¢«« —.]Â7ß|›a]·H$ÂÇQZZŠŽŽŽaYg@@Þ|óMüúë¯lì.2HÇÇgŸ}†O?ýT)O|Ý.kkkGu‚•îï­®®îUîúÏüýýñå—_â›o¾Add$M£‚|Øãï/•JÑÐÐÐkùpòòò‚––RRRF}¿ %OqãÆ dgg+¦ì."‘‡ƹsçðÕW_!))iØÖíììŒ3gΠ¬¬l´w„ÚÚZ|ÿý÷øä“O0gÎÖâ‹ÅH$}í‡~ÀÖ­[Ÿz!N‰gÏžEXX>>˜>}:’’’ðî»ïâÿø¦L™‚®®.ddd@"‘@,cöìÙÐÖÖ†\.Gff&2331qâDÌš5 ]]]HMM‡Ã\.‡¯¯/8ÒÓÓ3¦§§ÃÇÇãÆÃ­[·üžTdeeaÖ¬Y˜>‹/ÆäÉ“ñÖ[oaÖ¬Y`FFF DHHÐÔÔ///lÞ¼ððáCTTT(î´LMMáïï… ¢¼¼ ÃÀÊÊ ³fÍBpp0JKK‘ŸŸ‹/¢´´mmmðññ@ ô>år¹pqqaûOKFˆ……"""““ƒ‡¢©© «V­‚ŽŽ ‹qéÒ%deeaùòå7nœœœÀçó‘““ƒ+W®(~ÞÞÞàr¹8þÿüó!'åp8X¼x1´´´ØÞä LLLðÃ?`éÒ¥Oý{×ÔÔ`Ò¤Iؾ};€ßï˜$ ¬¬¬àçç‡o¿ýóçχ——òóóajjŠþóŸËåŠdðwYN49>|ˆúúz´µµììì —ËÁ0 ¸\®¢ÚY÷g»O¶Ë—/ïQ ÃáôHlþø]Ý1p8p¹\477^ýu˜››ƒa˜!Œijj¡C‡ðÊ+¯°ñg%£ ‘‘‘øúë¯áçç×£©žÃá ººÍÍÍJ¥Šeõõõ½~b±ÑÑÑèêê‚D"@ À¸qã ¥¥5¤ó¿²£€~j¯ÑÅ‹£ªª R©T1”P.—C.—C*•B&“!99ï½÷Þyç\¼xµµµ¬ÆLFGPP<<<À'™ù×®]Crr2ÊÊÊïÿã9Ž?ŽÄÄD…BÈår´µµA"‘@*•*ÖÝý™îã½;©T ©T Èd2|ñŸ}û6Î;§h¾—ÉdŠýÕÒÒ‚qãÆaÑ¢Elÿ‰I??---hllì×û…B!BBBpéÒ%Œ?^q³ÓìNœ8‰§OŸFkk+jjj ‘HûÛð÷÷Ç£GÇݽ{÷àçç~oƒL&ÃÝ»wáååÅöîìÞûï¿ÿ>ÛA(³œœœ9sË—/ôä+FFFÐÒÒÂÌ™3aff‘H„ÔÔT`âĉ°··Ç©S§ÐÚÚŠÎÎNøùù!((hÐ#ª««±k×.,^¼lïBòæææøùçŸÍôccc‰D‚˜˜”––ÂÓÓÏ<ó ¸\.Œ!àïï¡PSSS"66¹¹¹?~<\]]qíÚ5p¹\Ìœ9999ŠõØÛÛãþýû3f æÎ ܸq°¶¶†‡‡RSSñèÑ#øøø ²²wî܇‡““###˜˜˜àáÇpvvFVV8fÍš¥ø.C À××·nÝBUUáíí¸¸8¤¥¥)Zß8®_¿Žû÷ïÃÓÓ³_ÍúÍÍÍøâ‹/°víZ:þUˆ™™NŸ> Œ7®_Ÿ111‰‰ üüü ­­ ‘H„””455!44...HHHÀ½{÷Àçóáââ‚   XYY!&&wîÜ‹‹ f̘GGG#''hiiÁ† `kkÛïm())ÁáÇñòË/«Dë+•~ŠææfüóŸÿÄþóèéé j ÀaEÃ0Š»£î&Õ?>«çñxCšâ5//û÷ïǧŸ~Êöî#ýÐÙÙ‰¿ÿýïJ¥øúë¯ahhøØ÷v7W¿w„êNJÿ|Œu/‹ÅËåŠçéÝÍ¡|>_qWÞ}¼ußaw{‰2™Lñ=‰ ÀÏçƒaÈd2Åñ+‹ÁårÁår!•Jëÿówq¹\ÅÝ_1üñ;y<^ßJ÷{žÔ?¦½½Û¶mCGGöìÙ¶ÿ¼dŽ=ŠÓ§OãСCýšX§û¸ÿãï ûxáóùàr¹Šß€–––â÷ÁápË»µîÏÿñQÙÓŽ·?û÷¿ÿ ‰D‚;wªD9jJúáäÉ“¸{÷.Þzë­!uL >ÄG}„çŸÏ<ó Ûá~jjj›o¾ ¹\ŽÏ?ÿ\i¦=U%ÍÍÍxçwÐÑÑ/¿üfffl‡D¨­­ 6lÀ³Ï>‹5kÖ°΀äååáÅ_Äž={ôØ€MÔ |||póæÍÇIQ&gΜX,†««+Û¡066Æ—_~ xçwúÕ'€ümmmؾ};Z[[±{÷nºø«(|úé§xðàÊÓ~ï›””„÷Þ{Oe.þµô[QQ¾øâ ¼ýöÛ;v,ÛáôéêÕ«ˆ‰‰ÁŽ;hZTÕØØˆììläääÀÛÛ[Q_œôM*•"##7oÞ„‡‡¦M›SSS¶Ã"C”~øÛ·o‡••ÛáþøcL™2E©g‹í µô“££#LLLðòË/x9ÉÁHNNÆÛo¿ oooºø«0bΜ9HNNÆ®]»™™©2µÅG‹H$ÂíÛ·±k×.\¹r3gÎDpp0]üÕ„»»;¸\.^}õU<|øípK$açÎHKKƒŸŸÛá µ @WW>ùä´µµáÕW_UšÆéééøú믱páBlܸ‘ípÈ0‰D(((ÀÙ³gÁãñàïïŸ~uŽRW2™ iiiHIIAgg'–/_777èèè°fmmmعs'´µµ±uëV¥k èèèÀÁƒ‘ššŠ>øöööl‡4`” Bqq1Ž9+++DDD°vò©««Ã?þ¡PˆÍ›7C(ªDÏSÒݽœ³³³‘˜˜ˆÆÆF˜››cÆ ÐÑÑ¡¡¡Zÿ͆Akk+D"Ž=Ššš˜˜˜`Μ9˜>}zQD=åççãØ±c7nV®\ }}}Vÿæ]]]HIIAbb"æÏŸ¯˜ÄKCJ©¦¦iii¨¨¨ÀŒ3àéé9jß-‹‘’’‚ììløøø`âĉ𰂍&‘H„¢¢"ÔÕÕáÔ©SÐ××WL¼ãîîÞï±Óª ¸¸wïÞÃ0HMMEKK V¬X+++899=±^Q?•••¸qãöíÛ‡gŸ}sçÎ………ŨÆÐÑÑ””ìÝ»þþþXºt)œ]FP0D—/_FZZºººcccûA!‹ÑÚÚŠû÷ï#66˜?>Ít¦º[êêê‹û÷ï#;;Ó¦Mƒ¿¿?f̘¡Kodd¤ôw&ÍÍ͉DàóùHOOÇåË—‘ www¸¹¹aéÒ¥°²²¢»} Ç0 âããqôèQ´µµaÍš5˜7otuu]£åiÄb1ÚÛÛ‘¨¨(TUUaýúõ U‹ÇN” ƒÖÖVâøñã‹Åðññ‰‰ †\7 ¾¾7nÜÀÇqëÖ-899aùòåprr¢ÞáÀïM’åååËå¸~ý:ÒÓÓÁáp`ff†©S§ø½hМ9s ¯¯Ïv¸Š–³î$9;;uuu`S§NÅìÙ³Ááp`ooOwú¤—––ÔÖÖâöíÛˆŽŽÇêU«0nÜ8Lœ8qX¾£ªª ·nÝÂõë×q÷î],\¸033Ò-ʆ€aÒ}WÖÑÑÓ§OãÈ‘#prr‚žž&OžŒ ôšâ·»*ÚŸ—K¥R=zuuu¨¨¨ÇCxx8æÍ›§˜<…¾üqÒžŠŠ Å4¾r¹ååå=*N2 ƒ¥K—ÂÝݽ_žp8…B´¶¶ökºj.—‹ÂÂBÄÄÄôXnee¡P¨XÇüùóáè記[€ŽoÒ_ˆ‰‰AYY®^½ª¨Á¿víZÅ$VÔÝŠÔ×ñÞÙÙ‰#GŽ ½½÷î݃••<==¨V×zìJFF÷•<wîÜÁ¥K—zÍÂvïÞ=ÁÒÒ²Ç •ÇãaÍš5ŠLÓÂÂâ‰åa y™L†²²2H$’Íè.\@AAA¿JOs88;;£¸¸¸_ ƒL&ƒ‹‹ –,Y¢XÆ0 ¬­­i¨*V‰ŠrÕ§NBUUU¯snmm-š››áææÖãfºººX·n¢3µµµµR´˜$JFA_»˜ÃáàÎ;055…ÍcßCÈHÈÏ¿{ÞôéÓôø‰Žc2šwLs8TVV¢±±“&Mzâû4%„Bˆ¢‡m„Bˆ¢€BÑ@”B!ˆB!DQ@!„h J!„ D !„¢( „B4%„Bˆ¢€BÑ@”B!ˆB!DQ@!„h J!„ D !„¢( „B4%„Bˆ¢€BÑ@”B!ˆB!DQ@!„h J!„ D !„¢( „B4%„Bˆ¢€BÑ@”B!ˆB!DQ@!„h J!„ ôÀ£R²Q\ö‰IEND®B`‚PKZ 97 content.xmlí]ënã¸þß§0T,ÐîÖ²®¶L²Ø™ÝHŠ&»]ôÏ€–h›;º’ãx_¢?û~}’êfJ²n±œ8ŽÌ8&Eò;žC2ï¾tѦ!ñ½kA%a„=Ë·‰·¼~¹ÿilßßüé¿X _Ù¾µv±-ß‹às­½ð*©½ÖÔ»òQHÂ+¹8¼Š¬+?À^Öꊧ¾ŠûJJÂhëtnó­#üumÌh mѼ{Ï11ßÚ¦hÓµ1£Pùæ ¿kãÇÐ/|@Ý PDJ£xtˆ÷õZXEQp5™l6q£Š>]NdÓ4'qm>`+§ ÖÔ‰©lk‚Ì: '²(O2ZG¨ëø-?$oíÎ1í ŠP…«Å!Àt™`v{ߦ _ËÎÒõ°¬ÙZ!ÚYÎb⢨¨vwQQm¾­‹¢U ÉTÆÿÝÝî䊺]ûb´¨,J‚ÎÓL¨ùö¾ïçCe e‡«H’6I¾sÔ›Fò %¦¹ÕHn!ÇÊ÷Ý} <Š1~`"Ÿ+"¬i L’êœ8´kýÛÝígk…]´#&íÄcâ…òvÈ„.q:shk„y¤³(0ZNuR3]Xn²… a|8É Ð:òYkkkrxó.ÑèøÿQò;ëüZ°YH F¾…¢Ä6Ž´ÄBÖ’/L#‚ÃQAÉçÈúº¤þÚ³Ç$$±1è`¬#óç¿c+ ÉmÚ‚Éõ#fÆHâÑeænœ°ŽŒGÄÍzè&DMx)Ãá•f…‘Ý2³“˜ü’V„eIQ°"VV Ê’øË8iÄ4ÉFÔΡI›ð¨0´®ÄqâÚž!ì ÇYYúÄ[âaD¿(Ò—[²\Eì—÷ƒ%nÁœ ¯|JþÏ9cä%(Íïë0"‹m™ðÂÚ‘¹Ä¶ìqL•`þ¸ÄzË¡kòc£ M°×ÉŠ½,’[ì8þ拲ø2‡¹zƒ@Ô õU¡q\Éê›vZ°ýˆèWLëôñØ`èG#Œ¨ÿx¾#·4-…ÞñÁÜþYŠº„v[FºˆÚeÊÁ‹¨d(UnˆÍ|Ó¤ná_¹ÄËH–›—¥t¬¨¾Ó:|ÀK‘§°xY0ˆüÑ‹¥³gci…oeøDÓ0úáe¼ÜàÛDË‚Ž™#ßCAc黾Í3©rÖ€s—¦orr/¢GrEKäºÃÊR^B±Í×SŒ=îûlHòxa9$¸(HÑ_@lGÜ¿¿¦äà.ƒÿãÈ"Ñ6ë&AÑ%”2Õ‹ÁéÁAóˆŠ;}œ7éˆóqcÛ?†8æZøàÞåòÜìˆ*³E/ƒBPuay¹‰ñ­XôÀ–…VÏý¿Î–— ެˆúLícq‚ªOù|S«Ž^U”>£ÿTå ¢(C>¢¼„ëÑ%tÎLn¡K iqùc‚T–°¬˜xàÃG=×ÅOUÐ_xÜIŸqM±»è×8å” 'ú®f¼Ä¦ÄÕß0,P$²@´;‰ÌÆ1͵@@}ÁštÇ®âöŸ&v\©¿Žðw9¥}.Tó!g1gî§ÄÄ›Tó<Ÿº0„î<¨ÄÇãÁÓ¬â×WX'ìÌß¼-ˆzôWñsŸ ˆ8íÉ8¡î>ÊŠk|šªs RñãÛ寻Áø œÞ;ßó!a^7õöa² ØJò.ë ï]A’ƒh$3znÌkà,e£ÎïGrî;v+Þtw‰Ý#†=‹ŠÛûU%‘ ¥‡d ¤>rÇ®Ù~Ç£îÑáÅ#Ë‘Ó^€ß¯Ä©{ø§õð÷ô=´S´Á~uô¾bØLZmÑ)N÷w*S8’U¹¯•N~Šÿ_Q·Æ®.®Þ+!Û ŠçK9>÷•8²‡Èösyî+Áà‹ãýüŽÇ}%N{q†Xþï+aÓ‹O«Ï"§x:$L S»•žÀÁØI÷¥çkÇÁÑ(©dåЭ|MªÆ,§ïZøßÿÓŠÏ¢Ÿ·.˜²l¶ë7àÛø›qL™njÍw2iMÿ&ž\Óp{LFi› ÷nJq›0@</|Šó]¦¸†íÀ;hmòW-Ó>Û)!¤†,*g‰6 BÆY"¤†"jg‰Ðt0„Ô³Äg6>gj§ÁÒÎÔN›"tžvšíБþº 5W:Ì“Úþ´bîÛÛü Ÿàqó.NÏ`iàI¢Fšßå,]9îœËüOStÂÓ4œOÙ0ˆ\Œâã)»-|kæùÐIe@laã,½4Y,ÏãLòÂÖ!4g¡_€«cŠÌó„ŸBŽÊ§¬ÆA[–àþ:Jr1Söʆ¨É:c?+ÌRQtQ2²²G¦Cš–Ó“ Ñ0ák*­A*SÅŽÓJ4¯Zõ–¦ìdtkƒÆO^®6Æ{+–·gC4è»8¢Û•‚7ï}ÀJI#EžJéÿk¶NRñ·ÌóóGñù¨»k|›6/¨‡œÑ-™SDÁ‰}ÕlZP˜Ù>þèµüÑ»™Ú}Ú£òêcˆŠ^àhªFÌŸ]Çsÿ±]Z »Ô\þCݲh`tˆM¼å~¶MJ}Ov(ݼ+íŒ3·÷ùøŠÀ…ãhµvç"Î>§íP‚ÐN ”’¨Í¦–¼µe«š¬ì2þ §TåÒ UËAa˜„,¹šEŒwÐ2t˜Ñ ¬¨\™Q–{ŸÍ¦ ›EíM›í~’F_¬ ˆRW¾³;ç[’¬I‰½“*3 OC°§œL°W«Ï³Z–i]XfÚ>}6 Ë¡QÂtµ<†:ß‚e\3>|B4"Œ]OSèÓˆù¯Û]¼Äǧ¹džB|<ãä%‹Y“—´>©´Àþ*»ˆ ‘žKx}îñÒÑÃël#‡ÛØIÄý…e÷ Ÿe€>§J1>ODô¡¡ÏŠÐKޏøªz ž%BO·s¨‹7Ô¤ÕÙ¹ébå©G÷F;oEMßÃZIÕ:©ÞPÑÔøî»§:ýGAbõªóVF¦a š¿’KÊN "EÔ¤=f»Qƒ; @'ˆM'ñÑE]-‹š)¿áéPyQÑg'†Ð9ì#*Cì#Öì#&·`¼Ê}ÄÌ>Ó}Ä™8SZ·+루JÊ‘öë}ø,œQ‹Ù.Ôš¨ÈUˆÀ¦™¼POEYâ1JÕ6Y|-Ó(¾÷øjEñz&V´¡œÈìÊ4EŠ?à3ùQ éýÒû÷¦ª‰·Ò¦‰§7`njR®Øé &ÀΊ<E@é{·>²›œwmç¬Æc!¸æ PiâXšñv ugV{„ÔY².3}xvu8øÖÖ~ÐK‡`OJ~a•K•U¯-Ž_ ÏšÞÃåKZ•c5> 7ö§voæt~w†½˜+\Ãò˜¼jUÝá-…cØÞ÷rÓB1ÿªMÉ!ãÞË͸BžX:Æ ÌcÛšºQFN;9ã §‰SI9ó g¦›¢ ÚZ8iÛŽ\>ºŽÐÉòùb7Õc"§œ/r}õµ/v¯UaÛW×~2×smRäÎa«_¿lõ¿Õ¿“ÉSßêoˆs:\z–^ýÚÙ”oà*&S¸ùà{õ¾øZ¢Ðãpgˆ¸ØÃN9¾á‚vÞtÙØswîÁwó˜qò?ŒÊ|”F âÙµ×›_Ô-Þ,])8P¸ù+@üZùrû»ÓËþî“÷w‹ˆà(;u}ö×HHæ¿ù:Ùû§'…¿–˜}³}kíâø7z|ÞüPK`põwr§PKZ 97 styles.xmlí]K¯£8Þϯˆ2šÞAxåÁíºÕêVkVÕRIU=Û’NB俦Wóf1‹ùóKÆObž„$$ãj©ucÃ9Ÿíãs>løðÓûÖ½Á8ñÂàu¬«Úx't½`ý:þýëߕŸ§ù®Vž_ÜÐÙma*Izða2Bƒä…V¾Žwqð‚ÄK^°…ÉK꼄 x£Qú…ÜŠ–‹µmN„ÅÖ)|OÛ6Ʋ¹¶`ÙþÎDXlíÆ`ß¶1–E˜ŠÍWaÛÆï‰¯¬BÅ ·H½‚ï¾|oÒ4z™Löû½º7Õ0^OtÛ¶'¤6SØÉä¢]ì)×™@â›%]Õ'\v SÐV?,+ªì¶K·†¤ Ô«Q $‚ÌÅã²Ý…Ä6¹ñõ¶n=ºÞÖ50;·gD8?TL·ýP1]±í¤›šþ]L~C•ä¿}:Ž«xÛö^X6•{Qk3©´Ø> ÃLUÜ€Nv¢®¡iÖ„þ¤÷âûØKa,ˆ;âð ñp[’Ó'HBoxÈgvo=¿µÕH¶f€Àk =–†*s‹9Wü‘û]ên?~À^äe×Cב_ø¯ãO^AüÍоý âïüõ‹¿CH!×K"QxD%G‚sÄ>©ÏÊÐPFæú!šÐE(ÏW+V…LÊ*Vä_®¤0H¼ô€ŒÑ´¿ ªk@°Æw×í©ÆJ–aìb?‚D&­Œÿä­7iÛ‰`WÓmûʦ[ç[~€¾î¿«oË8ÜM¶Sщ(wÚzlâlVa½mÏf¦yë­éÑü-­‚ñ?ÇÈ‚ñ¹ì—7î ß^#mdh#S£åÈçnuT¦è¸lchâëÑÅÆ…+°óY(3¢e+€æ6Ram1‹ÙoqT3¯‡ßñuBßs©ã Eh¨»8öÒœm®ø¸$àÌiQ¥PȪ&nZ®wÐlÅŽNÑœö“õ͉ë­h¼ò|?³ +¼´ãà5 M‹¸8»S+ÀwÐ)¾‡P± ÓOUu>\¥¸¦TãõXCqÝ—xžë W¨ À&©òž72_y¨¬ä&-4üê\’Ôù^’“c¢<Ÿ+ËïÃtD+q9ZƒÆô'­RpÔþ:þïþ5®s‚E÷uæ—Ãvúã.’z.¶ºMšÔí`ŒqÊá"‚I¤ Y»”%DéÄ Ï0è¤f늖¨M6&qåä2{CHW§DÈê¡ÅS"4í !Cµž¡Yo™O‰Ï¼?|žÔO/zCÈzR?m÷ˆÐsúi]ë ¢éc9j¡šÅÓºô§‘Þ@÷F9ÇLƒ~ñ³BðçKiR‘/Ëò VLHŠ ¤í) DT†Î+úð@ 0p‚«GHz¡ZÄ[ *4 w)V'»•PEÔL7q¸[oFÑÜû.<‡¾`<-ãúÄ[àâ—ÈŠ‚.¦ìP•%{Öüzl†Àå™ J;Ò"zÃbR(8b%™c"Z%Ü 08R¥ÆD:©3²F„Œ ¸6€°¯C߃«)s‚Œ —@'Ý{)r¸”Ÿ­äd8- âìq²R`s.§mT}Ú•¹ÉhåNgÞÌéÐiÒHéœ&Úׄ“ùŽ7/ñÈP¼ ]s†åÈGc.늦Sò¬Û8ÇÓ烛ÎÊ‹´\†îážš6GFlu›!ïÖÙª?v °–ø½uu}:ä{k´Ê`m½Õ¡»™4î¹›‘WeX;’’C ´%3+™YÉÌ!ÉÌJfV2³’™½/B’™•Ìì°˜Ù×'`?%>ý1º6G}ß|W¯{A@ÕëêNO’ãÌäbnÜn>kn,7=ÈM˜—ÞˆËG™¿)ã/¥Ø|{vt™oâ—(ºŸV¹#´Jß­ ÊÊ#²8çL?ÃËìv£ìfÚv³öVëªøYì:Ø++óßo>v«ØÍn°³g—Ánô{‰¾k¤/ËÔß¹°OûÝê{c]`Ðgý€>íú¼¨ó‘aŸ÷û¬ì‹>ÔG†}Ñìón°Û},¨ »Ýì‹n°ëZ+ê€qQT"°†Š«\WüüIûj`?!J¿D>pà&ôQ>9ÊUÐÁ¯ã @i÷kö¶~Áz¨Ú”|4ÿ>`Þ`n™ü7cMfª®eeüë¨*Ãd ¼LÔŸöìÎ*ØêbfÞW‡bO p]7îÛ÷P¡ØwСØSÕZè÷í‰{¨P쉳t˜4»4$®VžÃ<`òñû vÈO#qGá|…¨v‡ŸÓÆ2M¯Y¬YòÅmΊ‘û1@Œ¹j[b9ÅÐÕ)!ï9 ZÂØã¨¼Ž}Ô‰"‘ÎÉAu },ªÍ¿®íÆ0lç\2Ÿ‹Z¢0Ncà¥Í”C27*mpÁ»T¼`MæY‹XXÚår<9ÄB›e»øÈãÙ_wu£·ØI­œ‹r½¹¯ƒ‚_äzüŒq¥È* Ó"äVôIFöd¡RÐ)TR| ¦ÓÁ£u|¿·ôV~@ÿc5ر*¨¯÷ÙØ¸5}O£Ž€}.Ï"Îtcº|•®= 7=ר®Ìè½ÓsÏå9t5 XC|<ú1À)ϪkƒÓÃn‡Ï×Ò,š|ÿÙµÔ,ìÉ©úIËW»ÉóÐò<ôyÉóÐò<ôpv??ç yZž‡ÎîgyúÙŽ©”÷‡7̆ ˜eÀ,f0Ë€ỸÄGÌ2`–³ ˜o0Oj·±Š-HRòõPZJbùà€‹ð¿éó-jÓ}X¡êzáµ²-døó»ZQá‡~ƒû&+ÞPK¤&E;(àl›—BÎo|¨Û¥¥ä¶œfÏ%‹õxÌxÈVâ LçUŒJÊd»Dö€1÷¤ó3¯!vT!&îFÓ U7¬âv4ü¸~Á ßÙ¶§üÃÀñA’ÐoØ+NôZ†ïlFlžäe•höåú¯zq«.½C6 q3þwÄ{ïxßÉÀóÁ4úSŸª }ÚÑl7MP® f7¹®Æ½©¡©S]¯Ã•îxºæH¥w¸)¢·©Í° »Äz°´ññòðÓéŸ?¬Ó9²‚À¹À“k¤t‘x~D§êt1+j©úÂ5Ô¹m xZªimÓÇ{ó]vz¶l]W%]Wõù¬B§ÝÞV§ÓÅÝn_ìÝDS@¿õEðo}ÿ"úâý'UщXˆÕ«:îÔñ蕞xrþE”,|ë½= ÆTÕm»ˆˆ©Nµ™ˆˆ*M]˜ó:wÇ4¨;2À"ò‚#œÔ{û“&ßÎw©Õ¨›S»ÖlKµu«Îl¦Å- úŠrgêÔ(¹À1µ ©¡›µKÝ9‘Yç ¢·Èì,€Í./ÔÅ|z `älòήâÎAšyŸ í,p;k­F/ Í´ù´5º«åL"+iXp²dº°˜ö¿Æ ¿jÏ¥®ÒTk..2ÈûêBOáXÜlê¨,h¹P°¯·tÐ{®s½¤·&¬!Ž1U?®4Z`ͪ4gZÜb™è)Ï´UsV^+UÓ;喝³0íä¼ZaŠFša´Áõ±‘tÍ;X-&V­³ybä,`¯?l›Á}ð%wR^s³QÈ Ïx±:»mv<'ùø?PKG X—µÐPKZ 97meta.xml”Moœ0†ïýåj ìn»XàH=DŠT)•²9GÄž¥nÁFþènÿ}±Y¬ràÈÌóÎ¼Ì ”×®þ‚6BÉ*Î’4Ž@2Å…lªøíô„Žñ#ýRªóY0 \1×´¨[GƒT2¦ªØiITm„!²îÀˈêAN²¤Ih4F®­ªø—µ=Áør¹$—]¢tƒ³¢(pÈN(g3×;ÝŠ3 -øgI†'Ö;ÜjʳKK½3dk†²­ÆR³¬¥”šM{Ù8€`=OÓ=Ÿ'Út¢ÝÚѳˆ©®z~´«™ÖRt[Ëxváú¶ ÕIÐiÿ~P´ ãj@‚®­Òôe¨ù²x«$ø!¤»FëÄ{¯Õo`=¦]¶øîDËQ‘íö%¾«8v`‚/Äk tÖ7”(?œòI3’oº5WrF>ää—xJzª­eãê(Hôörsht\ØáC@ìkÁÐôÖð.¼f¹ÓÁ ýyJ_ïsn”8q8 < ¿§*~–ge1Þ‚åÛ°Ý6l?có—nüI+Ø«¿Ãá윴U\¼¯®ö¯ ÿPKSŠ58±iPKZ 97Thumbnails/thumbnail.pngíWû?Þÿß\b¼…Ò…\º(ך[îÌ-÷û\’ËT®o„ä2ÓF­„·K”%lIèFnÃ\b1›(·Q³°Ê&Û|öþ|ÿ‚ï/ߟ¾¿œÇyÇó¼¯óz¾Îë’åîj'!&'$ìm<  èÝÇ_W™aüó%K¯”2&5*΋¦@ÜØ[jW>j‹Y}?ñ¾¤>ä2*ÝpW6Êdbù£ñTI×G"å†íŒ±ÌèÓòG«šK&]R Ž£ o}¤G÷ì‡Ú ¢>ÜlÂOGl¡%TJ-®!ôñ»{È0+ýR²ÑÈ].—2MN ,ÙTzŸ@)’€î@¿*ÀB[ àþ@¦òÿÅÿ•øùHú='oûh|4â³Á—«¼VÄ»ïÙ*É1O(„?úˆÉ¼î0šbÑϽíøé> Í@P³íZ~%³ ŽËXìzð³!cqwðÙO¨Ð\%`l˜ÇÍmL GfÙØøÔ¾¼?6f 2² ‡ÒQ®¤ß“ÞöI-nV ÒÓ6ø§×gÆþŽŒ9YZæ }1®ª×ÊüÙ÷”¯d›YB~lÔx¹ï|µLË39CȵSžU³TqF°°­˜WêD{üÁmm£MüoÜPI‚‚§÷f&¶Tó|QNj±;‘o³ƒ6úË ¯–µÉ@ßsýýpOS}ß“”‰ÎŠ ëß?U iî—.•Ÿí:È{­‰û¾ÛJ>°A§?óf« ¬{"—ºv«ð{/jkµQŠEu”çiëøOLÖð5¨#á-ú6“ûóNý…Þå¦7vÑm{ë%£.i¬¬7Xà x(•ÑØ6Gwzs„#ŠÚtDªCaÌÑÂ>­”e|&ë²P#Ôa¼g¤øµmTQ@K]0Øq¨ θ ì¸ yä,qò!!R½ù|ÿ|į#O‹q­OØ-}l•”ôu T`êêž—½ŽÂpqCm¡…˜¢³ åÛt1uŠVÒ–±{ù*ªIä×£o@ç¯äÏ¥ ’.á15}Ë‚e p˜åßt.§eØãL_ˆ–Fm¯›tJ>ßÚÌýçùd2'$PkÉ.l…!üH%@™˜“ ÙÞ—C̆@ü‡ŸußÄ?€üe |VŽ-‰…”ñ–Rº,ˆÜ2ö0§r¼‰¹oB“›ƒ›0q»c+Xœ ç^`ì(«äÛz/^d=7²g0Ù–/®œ'©@fwóÃLnè³ï.µÉçÅÊVò êõ þqh¿Y#)pÖšŒR¸¨„§ÜÜ F„ó-m¿†øF åf$«¦+oéhVžø´–¯/cq®Pì^ØWɲ;%Ö-¸N€…ï1||ŠÁ"ûõ7iEý¸ÒÓá”SŸRGÊ}ÏÌ´b›ÃHàƒŽ;Ñê£çÒ¼ÖÚjlƒÌúDLÉš#¼m[8;¬{ÏuJE…„ÅÔ´«¾p- øº‰ù­ƒS m-¢ž|dÌ~§„û[=÷ÊŸînÏCšÑ™dN™}h(R×àn’`Œâ•åƒ[ß;Y+!«"*´¥ÒR`²sÖäìÕ³µÏm¶À”l‚§÷y[eõmª­¿̓‡KNä ‹H§±¢$Óð7´"ïì* ïÎûÕK¿þÛ;ÔóR!8ÑušŒõ>yáN"áP¼Ø™ZÌV|Ÿôxí¼­\!p;jKÞˆÚ{eÕžOáIæ0èõMs8û%BWá ZS”·ç¹L2áqÉ)Gxlœ‹2+u˜Ý™Úöc‰PU’ʫ㣢w9'-\\r¸Øù‘+`ÿdt¿ÓSœI8ß=0™ô¹@Iê«‚˜…m’¦únþ ™þ"æ2Jo¾ $wNÊF¬uuQÛ·r+]S2Žf„õbbµ,‡Ñ‰OÁbÁDQ©µ¹•€}qì¸&Æ”˜>"B«Èì:‡û¥š+Ûå5hŽìß®mß@|ë–\”47<­9<Øž¸BRÛžÊðÕ—/$*•kÜ6ê,6úŠ7ÛùNÜüÙ7iáÎuŽ7gíÞ<°Æ8Ã4¥©0–Ú103匉5ÒÒqq‚vPµë¹“+à_ÝòœÍ bø³.óã ÏåÙ¯=®ÅßZ%ÉñŠçµüWÍ•p3­¸ÂS°fûªƒÝPÊDʧ¥ÊFÆRVáj4ÈîR—™2Y§»ñ>Gýíw³1eÃ&2i;x8D;½36&Wh¯ü·dÜßl‰­Öœ ûrÖ®_¥ƒäÅ;DöÉ䀒yï¢U—!·´/§5p¡8‚žÿã2³×PJhÁíœX0`IjÊ5üÕ¡¿s~1Ìi``—!0õ'1‚¦0ü×h“K½8¾ŠŽ×ð–¢ ÷(ñd¼jº¥Ö‚ÁI†°R6+¨Å_“c«É¹«–•W¼pgžŒ†´(¶ò‚~æHÒÎ/( ËtîûØÓqeÖøM‚öÅ»eXFݽ¨r÷®À»¿zÝØº ÂÇç\Ë]&CkÆŒøŸ§ÃèlJæ*<):*âMlµÜÒõüÃfè¸l_.ù½v²}5SE ùH¸ Zç÷82ûxoþ¯*cñxTéÈïpÒµè ©/Àéz+ÇØ>až0@z˜ àÉQa€ª-íH¿ò&î‰È…&˜¯DŽþ;ÿ9\pµ©³ ¾õPKÍà ‡³ PKZ 97 settings.xmlÝZ[sÚ8~ß_‘aöawv†´iav BK(áÚð&[ŠQ#KIŽ¡¿~%YvCe¼ÓY¸XÒ÷£s¬s1W/}röŒ¸ÀŒ^ÊçVá Q—AL½ëÂdÜ.~,ü]ÿíŠ=>bÕ sCQYHJ5Eœ©åTÔÖÃ×…Ó‹>5éÖX€èvYmwv-&[_YLŸ® )ƒZ©EÑytqθW*W«ÕR<ºp$±ÀÇî®Ù¥u}ÄÞ±(ëÙ»ëc/BëkÅbÁ+–õ®´þ½-|LŽåÒs‹.ó%³C^í Ø?FÏÝÑz³ñ¯Ì]ßÚvkÒúÕFÑõGKäk{Ÿm.k¾ë‚R½öŒQôâ …¤u¯×L±ÐÊØ1 ÛA¹ Ô ¦²P/V.ß_•q~ »‡exµ\ÎŒ=ÃP.’À+V¹šþao‘(|å¢l}8¿èƒ ˆ)DK÷¹P”lªxò¾:FbuមBrå…ºö Ãîp »b³{ðcZ¨?"Pü6gtOÞ# ‚1Ó,ið’‡ÑÀCw€{˜ŠüHô{S”Jq‚múâ|C®lsu1w–S7Q>Ê H(n… ›D`•£ûj×U_n8ðFêV#éæ1÷€Á>¦@¢#«xÛzê‚´5]Ò¹T~oY¦Úråa¢=z`¥ÂÞ>>èò]C ÁW…zéè×Çk3YꈔàW‘¦ÇÜ'ߥô6TŸÙRÿNì³&#ìPÄìÎ> ây}XVx?T.W÷Žá3BDijðd`ê+b_¸c0ŸÓ«½ÍI™ ü •›»Oc´”-ˆS£|–4€zhÈÖ5EꌆH ²(ÙÈï xµ-ÚÂ#©Lø¾kƇº¡cn¡ûL˜ø¸ÚyX˜˜gÏìÿIÅpîH>šçáM¸@©Ò—+ …ÿ<]ölèm•§ ~yaè/[ät©3Aët8úk?ô’ñ9neqn—Ì’¡>|áxøôxÈG®ˆóiMÓ¢:L­³D…žCÚ>gÌÿBrcdN¸¸ÛwHÞ´2’'$oY­/„<Û?Ó»²ƒ€¬&ñ AÖj`©4kg˜ {)­•ßÿ•nJbÂÏsÌXUÃÊ%y“ùºIªÛ‚cEyÒ|5ÎÞ5sÍHo€XsBCNôB"íH&g?wÒ›xmÆ !¢/æËÞÒë©|6L((6{…¨©íCÍŸ‚:æ'€cpÐÃÛ Q­6‡©îo#´(üáú¬ÝÛQ @¬ÀŒ]Ü3Ûù[ ]óûja.?#Nm¡l>©+Ã¼Š®®ˆ4 ÆžʧE¼KÐîSê.ǛݙIT0̧U°Fç Ò•—ôm, ó˜# ’ ÖSÄa@+‘ËÀ˜#©š?¡ _BIOÒèÝéçõ!fc‚òu¤1ÎE~ÂT$3>ÏMi€C £d?38UÓUÕ†â*QòAb)mØ<¨|Ëã XŒBßÏ+ Å¿Ár{²tÑbXÄ»*ÅÐPÉC¬O§­Õ ‹Šª"`$Ôjf¢L¸û¶,DÇîÙff&š’á~Öýú‘Ê̾ý«dAâøÓ˜Ýy“ÛOC‡Äõì_ò5±`{L£éÛSg¶}§ªý—ßm»=Ÿ¨Ï'çÞ¶G~;mëad/›´¡toÍ¿v«ÃÊ4œý<¬÷®OBØ™®š~UOÕ÷¶fÕp0m<»t¸z˜«é÷ŸÝ!îwkÙôË ×‡ã€N¿ÃN™8ô¾z׌¢Þ-îìà›SY>»¾ÚßÛ!Œ»–âþît¦•ù,ªîŽCŸ|›­¨I÷ÃVÿYÛµ† Øi}žtÚt>íÈŸ\Ž;SK˨ô2|ä5  JYTR䑳ô%µ Q:ø+M)íSõPK›+Cj×z%PKZ 97META-INF/manifest.xmlµ•Knà @÷9…ÅÞÆI»H­8‘ܪë.ÒÍ LòFK´ÍÝ"ÉíöþDóù’©‹)«mËmuÇ˦m“Ubñë°HÊÖ‡Ïq4y¢yÁÒä~j"c:¡I†,YÞOÿñø“6›~|øÝ‡t±`½ Ó`Ó¤Ô‚4)áuÚIqWÕÞO×yr—’‚w ‰iqWwiF“FëN–¾mU%E¹« aY»¤ÏåPe.ÛÑ%óá- aY;ÌÉf¨2—PeõE:Tù¹ˆ´E ¨Ç)ÙžÏK¾ÞOWe™Ýéúf³A ¥ùR7}ß×EmkpÐÊeë<Ra ÓˆòÆ ÝD¦ÞÈÆ´$Cíã²²IÉ:žÓ|04¤$=¯f9-@ºËæ° É:ñõ´<ºž–`V$<΄pw¨Xáð¡b…²nLÊÕÿÎôÏP)þ|þ´Wy<´-.Û*ÈY6¸›•´¬Ÿ¦ik*W¨‚]˜‹ ÃÖ«Ï’ôæ¨ø&g%Í%ñà¨x@¢ E<_ äL$4úć|Dˆâ€Ö«êV¸^úŸŸ?} V4&;avZXcIQ’d‡L³h°@öÀ % <¸¬:5Mw憇f"¨_èmY—)×4ÉÅÇ*¢ÅßIõž7~? 3sZ,X¾…¢ŠµŒ,é´Ñ” µ,ƒó’ÑbÒ ò9 ¾.ót„Ú+˜ ó2_Œ‡ÄÒù/4(‹£â!+²ˆlrÓ’ÓØa]Cw ‡ä¨V²¸i Ó%ˆŽá…Çë±fEIx¢gWÑùeÞ,Ëœd+4ÅÉyB">h•¤äa M­"£ÂÑÙ¨m•æìWHiH¤‘ˆ-a´ÿ².J¶ØN÷Ÿ¸z°‹YF´–â1 Á0Û¼l¹*LÎèmÏÕ#ö¶(óô+($iÃDW—uD)8ð÷†øWwfÁ¢¨‘m ZÑ…ø·Nƈ.ʃèT#k¯rÃB>ÛÕ£i‘ÞÅ,i5 4³Í nËkaÙö ŠÏÚz7 GGóÍ0±ar¤Ã5Z9pEÆì׳ƻóÑýÖAëþ†(*ë²ÌøGºü7º ë¨Ô*ÅÉ~ŽC<²&FŽg?÷{Fr" lÍmKdƒ¡eŽ~x=‡œux»=ÒÞnLò%tš0AÃUa^óC]*LdIÖU…zsqQÓ½îFšÖ˜óSNéš³Ekç®V[Òª -/6¬(:+`¢'’3¾r>‘;ß("í…7õ¨§QxN=Æ~-NÈŽ”VI·²GòoçÍn^‡“‡Õ›H~[@µæY0ø,+‡ƒ÷ØconöôjýØcýAö¾Ž({„:¨±Êgå¥LõØcª3 8s ôèæ› „A}ÛÑ+êL©ÓOæTˆèê„j¾Ž"ZNªJ^ןV«*ï?ÞOÿ÷ßÿ î÷È¿lcpkÓ­uAa1‘„i É:k³-©w¶óGѹcæžÑ|ª3ÒE¤. "#\”.Òœ¶›¨áÙaDæ S/‘ÚyìûCÈ !á›DÈ¡ÙM"䌆FöM"䎆u“øxãás£<= !ûFyÚ¡ÛäiÓ "çû"j©ºN˜õƒÇuÅ< ·íygòáƒØ=äGVÕ>b½Ÿ ŸÍi³o¿mw+Å)¥(IKäú¬KÞÉ܆ŠÃá‰8Jß¶Hƒu!dðÊ,ƒEDH X{kqRiûU´ ®+’ѾMâ0¬Ýìíl®þÜÔDdËãà%]—Õ)Oí^ ÍÄ1/j6I-dz/¬®š“¤¨nÈS@Nþ¤™Èñ Ïw-ìz¾ãù?L„T$jMŒ|ßâ Fޝ?4+–¬éMVüT;„•SÓ2ߊæŸÝü5}†!71&Øtúoƒ8Ëó4—v¼[åêfŸ»[¹ŒÖTËR–”œ™Á›0&Õ»ê¯Ô`U"ƒÊ·ÐAóãšTÿmþ¿‘Øf€õŠ>“%ßꮬIC¶`4%Çn¯Õö;÷n|†‹p3>Á«9é4.JªÏ\¦z×Ôýkò÷iƒä¿×b˃wÑÖÓÖ¹ŸþÁ˜´ƒéE s_C4¨ÔÃ/´ôgÓ0tlÙÇ5­}Í <ù‹éVGõì—-å^iä0ª#¥z¾/XuÏXX¦Ù´S cÂøYòcñºq ž¥7¡UÓY3]ÉsêÀô#ù­½‚‘ëì[¾­_yå5^q¶Æ÷ V^¹Ä+ÆuЦbeÜyÅA°^»Ø-ÆÁßOTnyÕÄ2Ž[ÿ¬¥rË«f–qÜ‚oÝ-îA·¸o1µŒàçèÀÞˆ[Þ~Æïl"ÀTãŽ0³(Ÿ\8ß»£;ÅTN¹tZ±Gw VN¹0óF÷‰¦"eÜåJ›(_:«`å–—+#¹ÅTnu¹2’[°r˘˕‘¼¢}ÇÑr €X¾ú°‹-K–,‹n£qÊÂõÄ 6äÓ9ýÅ'bé‡f5ŸÂ4XÇT<¿+)áõáÿPK³WFÍI %ŽPKz¢97 styles.xmlí]˲ã¶Ýç+TJÅ;R|éé¹×eÇåd1®šªgë‚HH¢‡"Y$uu5«üAYäÿò%Á“Ÿ"%J¢ÜTÅ# AvîC€üðÃûÖ¼Á(vÿe¨«Úp};p\ý2üíË/ÊløÃëŸ>«•kÃ…Ø»-ô%NŒ¨±/håËpù‹Än¼ðÁÆ‹Ä^!ôy£…(½ ·¢%äbM›a±uß“¦±l¦-X6¿3[;Ø7mŒe¦bóUдñ{ì)«@±ƒm7§Å»çú__†›$ £Ñ~¿W÷¦Dë‘>ŸÏG¤6UØNåÂ]ä)ÇAâ›Å#]ÕG\v ÐT?,+ªäï¶K5†$ Ð«ac$‚ÌÅã²Ù…Ä6™ñõ¶n<ºÞÖ0Û5gD8;TL§ùP1±í$›Šþ~E•äÿ~ýxWѶ齰l*;rÃÆfRi±}©ª¸ìD]CÓ¬ý-HïkÅ÷‘›ÀH·kÅmàÙ)âÁ¶ 4$§„ßðOíÞº^c«‘lÅ ¾Ûz,+ Uæ3®ø•û]ên_?`/²XGÀqÑuä¾ÅËðo¬ìwCû}:¤5އ8(Y‰¯f^ù¢´ [d› Ùûgü±*¤Z±"™6®Ÿ@?v“Ò\Óþ"4*¯þß_}Dö¨~ÄÌÜ€ÄÞˆ6þ`õRIõ@ÏZ»ø>¬¬Ô.t‘øxùÒTͰ·¬8 ¸ïÑRV®ç)¨ÓÖPTë'7Ù‚V+ưjÄ/6\½ ?¹v²Ck¤kâŸ!ü×Ôæ¿èUCÍ›&‡Xµ ±U´,ÞàY‘Ëux@— ’ üpR ¶ ú #Qû£(ØÈï-Þ\¸ÿ)xG´¡ L–#ǵÕQ™¢ã²¡}K¯'Qð*ˆ3=õ3úñ0JñÀµ#ÛO´.$±ŽÆŠøSñ ¿Æ^0ÓG¸ÊÈJ’ùNFÐ%Ç+°óX@3 e+€f8®h¢…×rÙD€”)a„&t”¸(¢U8°PÀ. âàÛ¸ ¨(ð 2±p瓞AKÙ£êcWÒz<•eZж.…Ö`OˆÆ²² À £lÎÁJiÊ‘-K³ VL˜ž³P6”¨ }œL+ô¹‰ÀÚà6W—0;ôB•ˆ7@Uhì¬Nz+¡Š¨™l¢`·Þ(Œ¡£„Ã]È}ÆÈZÆõ‰¶À;"Äó1‘!;]D)±2Kö¬7øõØ ÊŸ”Nû¤;DôúEQpÄJ2%RšH´J0¸F wLR…‰_Ted…pn`2-‚ž‹9úu‚ –@;Ù» r¸”U/%¢8 ¢ôIº’£°ZrU%t”ªÛ2RéÀ®jZÏUÑiRKU&Úׄ“ùŽ77v—éã¢22§–Ê9Aäœa9òј캢é”l7Îñô¹Á঳ò"-—s¸§¦õ‘[Ý&È»µ¶ê]Œ†¬d»og]UE‰yî­2X[wuho&{îfäUÖ–¤dŸmÉÌJfV2³½AH2³’™•̬dfï‹df%3Û/f6KrPf n"R=Í-«UîˆMÒïaSå¦#­¸Ç¥ cÔÑ0…Ê" Óîv«ìŒuýAŸtú¸èÓ.¢ÎG†}Ú ì“v°ÏºXPöY7°OÛÁ>ïbA}dØçÝÀ>k»®u±¢öwE%k¨xà€°Êtŵ/ö¢ô"ô€ 7‡òÉA¦‚î~nJ»wX³·õë¡jcòÑ@üû€yƒ©eòߌ5™¨º––ñ¯£"¨ “}0ð2PÎ'wVa®Î&æ}uÈ÷ ×uã¾=qò=qò=1V­™~ßž¸‡ ùž8K‡Q½KCÁjåÚÌƯØO°C~‰Û ¯à+D¹;üô«6,‘©{ÍbÅÊ-nrVŒÜbLÕ¹%–sP ]òžâ¢5!ˆ\ŽÊËÐCÛ éœ T§ÐûÀ¬ÜüëÚnôÃvÞÉóù°¨D ¢$nR@1$s¼KÅõ×dž¥°ˆ……].Ç“C,´Y‘ƒ<žýuW',p‹­Ôʸ(Ç‘û:(øE®ÇÏ—Ь‚ 9!BnEŸd¤OJ@%qÉ·`Zü¤Ñ÷{¿î)£q_úF:ï¯ MX-3¥âѾ¾ŒËj Å¥Ïú …9Ÿ¶ƒâÒç·†¢ëiÔ°OÅYÄù‚v B›¯Ò5§ôºçå•) ·z®ñ©8‡®ëaˆG?8ÅYump:ø`ÂíðùR˜EX³“ï?»–š¹ý/U?êCùj7yZž‡>!yZž‡îÏîççn‚hº›¦¨F[PÓ›\Wã^ƒÔÐÔ±®WáJw<]s¤Ò;ÜÑ[ŒÔzX…]bXÚøxù×ï¼ä{úÏïÖÉ÷YAà\àÉ5’ ºˆ\¯¢cu<›ä5ÕùXÀÓP§sK€ÓR-‹ìš>Þšo²ÓÓUëª麪O'%*Ýæîsu<žÝëîùÞÐMUŸë7³=üoŸ‡^¼ý¨,îáÑ ý°veêb½4Öѳ±NƳˆ’¹¯¼7ÇÃ#ÓæE@ÆÚDDD5BäMü3sRåê˜UÇX4žs‚£jOÒèã›ù.µuôl<¯1ÜRçºYe8Ó㦇]ŸulN\àm˜³Ð©FáœÀ¬u ÑY`vÂf„gêl:>…0ò8ÓqS„[‡hæ}B´³°mª5½(0Ó¦VSp™zJS­©¸Î ÷« …ñÚŽJã†+ûtK ½§ª1Õ zhºâSõñ<0°feš3-n±Jt”dÎUsR\,Ѫ vÞS!gaÚÊw5Â4Ãh‚ëcÑ!5èšw±ZK¬î–Ü;±"g{ýa[îƒ/¹£â𛦉BBx|r{@À‹ÀÞmÓ³9ñëÿPKøóľ@­ÑPKz¢97meta.xml”Ánœ0†ï} „r5–4‹Dê¡R¥J©”͹rìYêÖØÈ6ÝíÛ›Á*ŽÌ|ÿÌÏÌ@õ|ídôŒZÕq–¤qŠi.T[Ço§¯è?7Ÿ*}> „k6t êÀÑh”*K¦TFM­°DÑ,qŒèÔ,!kš„FSä*…úSÇ¿œë Æ—Ë%¹mZœ•e‰CvF9[¸~02Pœaà;Xœ%žYïp¯)Ï®-õ옥. e_µf]Kk½˜ö²iÁzž¦žžgÚvBîíèYÄt×=ßåf¦T‰noÏ®\ß´9‰fÞ¿TS…qµ ÀP§Mó2Ö|Y½U’?|j¸FÛÄÏÞèßÀþ|L»¬xø2ÉQ™Š ßUœ:0ÁâÔA3ë ¥%ÊOùd%)Ž7Ý–«8# ³ ÏIOIªÚ¶Ð€Bo¯!·„&À…?Äþ1 ¶Io ïÂ[–&¸i~œÒ×;Á’›$ƒƒ8œ……ˆßSSge1Þƒåû°Ã>¬X°åK·þ¤­l‚õ»ßáxvƒruüêâÍuàþÍPKdÌì­®iPKz¢97Thumbnails/thumbnail.pngÍViP“IþˆF4ŠR˜QNQA@ÀD!؈Â5Ë%†e¹&@Ä$@ƒƒ CÐ1¢¹ 923`pÁ!äHȜ٪ÝòÇÖþÙ?]ÝýÔÛÝïñ¨Ë1ó­ºàFb¨Mý²Í͈ßž!S¤T¯ßÖ«wŵֽçUoê ?i;hú¤®7rµÁâ–èÀ[[¨”q>/°ˆîüj Ánψp‘ÔŽšÅÞ÷4+á„0NcNX~˜Ú=MpVzçÃ'½‚g&Ô8êÓ`п¿£Š)sòuý¨Qq §m“=…Ͷ~È£†…ö%#-÷«ˆ>÷†Ž>}µ"‘©F·‘~ÒFÊE³U”x2±Ã2|Œ~>NÙü®)a #hW0vÄEü¬ÂšK–nÌ>o-Ñü<ÕÖZ¼Þ`Ë먽`ÄGôöí7$Ïeên¦'òŸí«¹š— 2ê[_ίòÊ5¼»"¹yá²r‘IžÁ îfGš}£W•¾×TìþÀ°qJ.—¬d˜oXq‹[EcB®Dâß­­OB¾ä—ÝÄ^ª–õÛÉå‚ù_î¢kRЦ5š—º”ˬÍÙê yŒÔ®­7ÇÏRꮼw~<è…¹«=2n5ÞʉZ¿i̲í­oRÕ¡%ò7–&L"¹½«Ë<9@(®(|ÛöF__ü(zyµÓvÑé+eÒ‡)[¯Ý­ËÁ“ó+¿áÍÙ«0Ë=LÝÙ}NÀkk”ÌÀÓðááá=O w—ô]¦ÖŠ•ÀY¾ãÊÞÅHÒ éð¢-ûð8†÷’J’逳˜YÇ-'2k™¢ÛÏ Íjx»íK–’kÝsM×%d~Ÿöe÷¼!!ú_Ê |< jÛA°»ÎTþhY_½T’MEz-tì3JOœmŒŠÚh—MsF¨m(%è€9»¿ß_˜…«ÆãÃþÕÁ$z]:1ƒM‹s j| IÉÈý¡že£5¡‘å×mS³ fS­:×™:Ùcy¼sD[n®ë±aS#»ëhš`lix#&³Ç²Ÿ+>{çd²Þ–LmE®Rд&\v5DÈWB\àŸf‘|>Šk+ ¡¦æÚ°2Xæ(<‚kˆÂ÷o•äJa¢`½}ÈšœEJ׸uáj™ibY ®kƒcß1Sg‘„-º~µo3@²ÁZÉ®–%^¨ÊÀʰ!¥€:Týû÷W"ý‹Íö‡r ïÞ úšß—Å#…ÐÒ}5H°ŠÆú7£$§ŠHB¢í}²¾¬ù® JõÚ ‚Ñ«'’Ö½]3AB+csF,(lå2PƒˆÊB½rþ᪴óSÐ]ø$“°/Ï*ÙÁ§È“ó$ôòÅùevø;ˆüy¢ôå‹‹³ËCñ‹ED=¸€Þ.Œ’M¯QžÃ—‡H £Ž·#¦\ùA¡®½¢l¶m޼ŽXïǼÆ€êO ˜¿ÅÝÝãc wÄ‚`Ä4K¼äaFô>ðá=à>¢"?ýÞE¦Ra›¾8ß +[\]Ì¥ÏÔM”2}Š;@= …#°ÌÑ}µëª/7øCu«átó˜{À-FQ aŸáe¼m]uAÚš.ñ\:·,Smö¹ò0ÑÚ]°Taoxñ¡¡„àËB½tðëãµ™,}uDJð«HÓeî3ôÞ¥ô>TÙRÿNì±&Ãl_ÄìÎ>1äy}XVx7TÎW÷Žá3„XiÐÓàGîˆØî™—ÏéÕ@þú¤Ìþ†…ÊŠMŒÜç\È[¥Fù,2&hÎõိjŠÔbäAч|À¢d#f›z[´…‡R™ð]׌uCÿÙ@÷˜Ü3ñ1pµó°09=Μzÿ/+’óœ+’æyx“.`ºô•KCoùü²gBo©Ì8Uð‹3ÃMß §K Z§Ã±Ð_{!HÆs且Ź]2K†úð•ãñ?Ðã1=:"Χ5Í-Õé`j½˜%‚(ôÒöcä MÈ=‘9áâvß!mxÝÊHž  <¼eµºò8lÿLïʼ Èo€9X«¤Òt¤a<覴V~ÿ#Tü¹&(‰u?Ì1cUi *—äMFt“T·GŠò¨ieœ½kæš‘Þ17æô 9á±T´C™œMüLÜIoâµwçAúj¾ì-½®ÊgÄ‚b½WšÚ>Ôü)¨ã¡a~8{=¼5êÕjúˆêþ–1Â-õ~¸>ëA÷~”R`Æ.î›íü®ù}57 —Ÿ!§¶P6ï‡Ô•a^EWGÄ šcÏæÓ"Þ&h÷9 u›ã‡ÍîÌ$*æÓ*X¡siÊKú’†yÌÉë1 â0 •Èåa@Ì‘TÍQ…/¡Äû'é ôîôòzÈ3Œ†ù:Òå"¿a*’Ÿç¦´ x¦l­©U|/Â%Ǩ x> ^H âÒz.ƒ÷ݧÆl&w%ÔÚ ‚Dpg]p±B"¼·M,±t'Ý…ž NÖêdpÕŠ¿*j…Ã¤Ž‘ìï}ƒéþž"¨B‹a¤¼™;Ó<¦¿)I!V_̇Ïr0>Í_v‹mÑ!¦ÈéÍ8’Fp&Þ5‡Ô˜Hú_Wú‹tÑ€“c[ 1YÝ„ö`„ÒÈé:ì¸ði Dñ†¿¥vÅ\ðëOPK3“ÊáfPKz¢973&¬¨//mimetypePKz¢97UConfigurations2/statusbar/PKz¢97'Configurations2/accelerator/current.xmlPKz¢97äConfigurations2/floater/PKz¢97Configurations2/popupmenu/PKz¢97RConfigurations2/progressbar/PKz¢97ŒConfigurations2/menubar/PKz¢97ÂConfigurations2/toolbar/PKz¢97øConfigurations2/images/Bitmaps/PKz¢97Ï£€ï[[-5Pictures/10000000000000200000002000309F1C.pngPKz¢97³WFÍI %Ž Ûcontent.xmlPKz¢97øóľ@­Ñ ]styles.xmlPKz¢97dÌì­®iÕmeta.xmlPKz¢97Ñ:x¢þ ¹!Thumbnails/thumbnail.pngPKz¢97·¨–!Ðz% ¡*settings.xmlPKz¢973“Êáf«0META-INF/manifest.xmlPKIT2fifengine-0.4.2/doc/diagrams/concepts_pather.ods000066400000000000000000000333131341615052600217010ustar00rootroot00000000000000PKì¤97…l9Š..mimetypeapplication/vnd.oasis.opendocument.spreadsheetPKì¤97Configurations2/statusbar/PKì¤97'Configurations2/accelerator/current.xmlPKPKì¤97Configurations2/floater/PKì¤97Configurations2/popupmenu/PKì¤97Configurations2/progressbar/PKì¤97Configurations2/menubar/PKì¤97Configurations2/toolbar/PKì¤97Configurations2/images/Bitmaps/PKì¤97 content.xmlí]Ysã¸~ϯpi«ò&›x:3³Ù3;›J2»[y¥%ÊfFU$åc}xI"Á¦ < ©=U3cÀ¾ÐÝè¯õáÛ×ÕòæÙâ \œè·ÚäÆ_ÏÂy°~ü8ùý·¦ÎäÛOù.ÁÌ¿Ÿ‡³íÊ_'ÓY¸NÒoÒ§×ñ}q÷ãd­ïC/âûµ·òãûdvnüõî©ûêèû|®âJœ¼-¹ÏWŸNüׄ÷állíYïæ|põéyä½ð>œM‰Z}|ò>ü/§‹0¥újã%³Š×e°þúqò”$›û»»———ÛzFwºëºwùÝý‚gûq›m´ÌGÍgwþÒÏ&‹ïô[ýn7vå'ïú²±Õ%­·«?â&—x ®ÆÏÜñüØBšÙ“qËF>¸Î^:çg/WŸ]yÉS Oœ»_Ó›ù_¿~>ÈB´â+[#Õ, 6ܯYŒ®>†á~©Ù…‚æË%šfÜ¿WF¿þ‰U†ÏŽŸyËÙžâá "Z:N¿KGLýçLL÷‚Ÿ"ny€Ü·÷ƒãyëGÿ÷×Ï_fOþÊ; Þ< Öqâ­3Ê”&­fG?íŒfAðøna‘Ïé›ùÓ¹?[ÆŸ>¿¿|Süž1ñãä;ÿÞÛ›/Þ:}•TÒwÃVÁòíãä¯Þ&ŒÿVS\˜ÜT>r$³TŸ½(È ØäŽ{BýÄ‹±ÓGíGAÊýø%ˆc™5ý3X=lã|º›Ï­‹ªbY*®Hõ'þê½EݵIRyÝÛ&aj‚Ù4ÿœ½ˆå×^aêûÉÊeçÛ\jP—ÛÕz²{²zqº‰REŽ’ÀoáýCä{_§~ªnéfSï>±þÌ3c¨ÝRšÁ:ÊzŽ-Ž ·8Ç%B‹‹Ú(…/ÌÊÒ+Õe·²‹O~ðø”d³ë–£§³_ò6ö§á& VÞrZ}<‰¶>ÿÂ^øîâ*ÝŒýhºñýéNÎÞv™0oUy£Â3šñf齕ë)?-Û R¿gº çé'-£iò ~›túËåîÎÆ‹2—4ÿå肳‡Xñðf_£p»žgâ¦.Ë7‹üg÷á™Ã8õ–Áãz‡Û(órÁëînäo|oï §·¼e\±éʼÇÈÛ<1³>4{Åu¾[¦—W^ô¬§K‘‰„¢ømŠÒÂhžÊÄC˜$Ù­Ýjšæë›8\ó›o´ügÒE+K(©s«QÂPŒ‹všÕ¾Òb`nZ?o NRä¤$'¡acpÒP˜“³ü9ÉÇIshN¶uRŽ“–Â:©i‹EvWmNª²OÚÈÉ ÑIGaN>8šfØÈI>Nº srw9Éwk ³r±°¨æ"+9YÙwEÎ{EV °²ï4°ÒìO7 R‹–×—hyGÚÏ6ÐûδôË µÔ¢ï\G¿¹(µh9x¶aô¼Q×&FV^_ºábw‹¾ó ý2H-µè;âï7#£-‰Ê!÷î.š.VŽQ¶Ð] ­–Z ^Ú0zúâR(ÒwÈݯÝR‹–ÃǼY”v™´>æÕ´ç"óDåö~ª^.Ö‹é;æ…ÔÂó/ÓÄ ~È-àÅtIõ+ðb†yÝôç"w ÚwÌÛ¤å|FèEšªò9o—T¿|C‡?çõ­ìÏ%ªÅàç¼jÑ%Õ¯@-®¯¢ž›•¨[ÐÁKê/Ž•Êh¥ÊÿȧÜçÆÊÁO¹Ï§`áÜX©rUýî®Ú¬Tf¯¼¾²úKÕJCå3þ.³LWÀÊÁÓ-‚n5^\yn¬T»ÄY)ÀÊáK :GHèTZŽVVϽÈǨa…sâ³ýôåïµ<ÏégEáWÿÐþG#ZÞ€'ëÓ—Qík*Üq’·û{Ͳö8[•§íæÓþz?›Þhy2cbJPoúFÁŸ©xK–§õqÏÙÍ£VÁ|¾,jãͳ.Ž u²ÁÐîNukiÜ}(:å—ÝŒŠ%Én§Ë.®UŬõ! )ZQS´k±è-·þ4yÛ¤7Ržš£Œ$YW×ͧהªÅÿêäÍfæ|±ì„¡¯™Ú9T¤Š"AùEÂxW$¬SD‚À"‘ÁÔ‰gºz‘09ƒ1œcÙÇŒC­Ó„ÙìGö+Êþc4PxCQ¼.QqÙhûö—‘¹Ã3wŒØÐ{Û`¸’‹º8)ìÔÄ8×KG~'>kãÒí󠣺iJ8¸X†^R¿óq¢¬Ž>ˆY¶X[[U,Òp0cV¥‡ BÑ&°0«zY#ŽT!‡™I·BÓ¢*t0UqQUªôGz B(t˜U½¬m8qV ØÇ©`Öf\¸Á ó°6Sž*¼«÷234(hPР AAƒ‚åÌ Ê`ц‹à¥‚u˜ÙB‚ È`d´ä áGû0³† Ó† >ôgv3;h¨ÐP¡¡êÇP‘3o9?NQåPåÆS9] +äè㢃¼“]›*:Iø¡fÖPG/XGÔašŽuT ¬éXGøÑ±ŽÂÙ”!tT€Ï¤£X,w‚MÀb¹ÑŠåÀâOòÞË`½k5ªÈîL½ù<òãx×áöß™U=ŒyÍ›AX–›5Š8\~Ë/›¦»ïoñç4XÏýtx¶WåWªÄÈ›yìû[Ô@ûyçˆçÇûW=ûLbjyOŠìÊ[~…ºšµ»òJò+–ãîÇäWtÍ é•I3…Ý¿°„۵°sSý?ÕS[§CT'@t"CtÓ0m†èaˆ^cLAtJìv¢s¿úo½:‘zuצäÝW'®^uèÈÛ‘n®ªÛ΀¦½ë‚Vn™üRÇR ™LM ¥” $£ŽÄ&¬HV†Ú¨ëýJ¤jUƊÀ8è¶fB&ÊÍ-#†Œ8èe©Š8˜îòPS˜(×¶ºß$úÏY †ÝlÀˆn4ÏÎO':µ-£Nt­¹/è†ÅšÝÓ\éÚ,§Ç#]…Žt±ÖDuƒqÝÕ¯ü_‘àV"þ?;r`wZÓwZ‡B!¿ÜVkéÌVkèŽþnôIL9ÿF$:‡Ô¢Ú¹ÛÅHÊ$–ÉÒGwêô¡–c6âcÜ”lÔäò°ÿ§ë.àf= N'ºe³AXIѪT”²TÏSSÒ9‘C³ËCÀa8¼®oæ¥Kˆ›£1onSBëon›Ä`Þܤrh†ÞݸÙð$‚図"H©0Â’AÓâAƒ üºJËQ£)‚®kA2˜G=ì«»2¯žZךÍÓÓIÜú›§‹!ì›»r&¯„] ~¶B- p:Þ–²ÔbÓ£®Ææ¢ªcv{Ószã2ŒË®/.ã6ÿÈâ,Öz¾ ŸK/µqéN%1¦—“˜u«a9ÄÓ,·çC•Ë I¹â3´h…Ñð¦ ÂH9Ó¤tS«'.#µ1Î4¦÷pé¯${¼MBzfþÀ&ì" v“p“w©¬nÛŒgYžXU÷2Qf¹\Ó Ëu¡{ù»?Ša½Á·d«­þ=m‡œP”M䊭…Ôr™“åÚAèn[î¤ÔàtvöW^Šq%:WW"~läm‘Ï ì¾~Oæ”ñH0¤¡íSƲÉÏÌíƒüù ŽæŠ\ ÈiRq€a³¹¢fÁ·CÙ\Qá•tHwà/)„Nø(…ˆW˜J9~»ƒœÊÉRQA_ ¾¨É¹kEêø³öåòó÷ЉPN:Ê…“¿‡¶ÄÔ hULàÀšHÙrÒSÅ‘lŬ˜E@½’§³r:·dÅúH„݇ †`÷¡ãk»ÎîC G WÑ·„6˾Åú–HÕ}w߸Dà< €jÁ‡˜:)*š˜bF©7w‡=Pkt‹0¨Í:FzH­Ÿ WoA§–~óê~¸ž²˜=¿eKý›!{sìV#e~Œ€P·"#\g»H ÚÕP)ˆøEµ«á§¹€ZJaci^î;L_&¹>]¦Ã Z¨EY|nc¿Ó pÔðUتË×z+"û>K®³æ¸ b¸¾ŒJÌ(Õ]F0ÞtÀº˜©R4xNø(~÷¬”q-Ù7H²¤Üƒhïv_ðÝ`Y¯±îšð»¸ñ!f1+=Ÿ˜Q‚P/*WàÞC3©¹y¶´Ñu]rZö1;ÂWr–Ûí`(¿Mð×Å×’‘Ó5¨i! ëÔ™¸4…‘8ËnÓG—ÊQýšk@Z&Ò\ƒHcw …UÜŽ–™Y·ãËI±³ 8•~ÊûËõŠ3Ùe‹eÚߪô“>¬Ýeà{a÷ Œ¿ ¹î°®ÆdvʇGão£öØ›Ìzð÷f!rµuÕœE€è÷yx’jÈõùmœ'8ãs ò8§ gÔ–FÀkÂçZú½Â™!•ÄÖ ƒI5š¦Îh]u³#›‹næ—0¿¤²ft¤;Ó÷§”<–°HÜb å ÉšßØðé›Í×µâô]6gö à´îhÊeHù^q™]Àn85wŽŠ Láþ£Òî2d_0îèKCä¾víJÓTjLC¤|`ìLƒþ "…Ußø°yªœtó ÄjB¥òÊØ<ä|Ì 6QËaóÔQ%»q´éèxÝ8l ¤­DCP¹Ž¢×Ù¢¹ËàR)’^ixÒv6n”fµÂŸŽi±5¶†(‚­!ޝ [C(&°WѰ²"­!L¹/¯5ÄOF/ÔÁ’8GP´?B‹ ºŠþ?Cò €Ô·¤|¶+Eê›@…¼Rß’¬'@¤>è RÿRôù«õMàë^Dú–\=7"õ±HQåÇòˆ*WÅHcÕïµþt;àÑ ¡Ê-åPå瀬¨.„¬¶ä¾Ç‘Õ#«gUYm"²úR7gU¶^qd5nò5\$,Òl~ÿ,Ò’Ä ,RYŒÚÎ3©aî XB!X¤%wˆÚ,ë!Ñg„¥qlh”/Ê(cáöè† ±\¨rÒX.À/ÂrYr /Ëu6æ±\jÙ#Är¡Ž"–‹KG¥±\ã!šÕ3†ŽÖ?>WWÇæzøô;ám—Éä½ÕëÇ4þÈ;SD2!’‰kmˆdRL`ÏÉtÈ‘ï­fo,¢ÙÐWQé”ÐC.ý¯Ùì7kV¾~Wb3߬©Ó#Å(ü * ¨oQMM©fl®MßEQ˜©j€oN¾G¿eBô@ÑŠ¢Pufç0*ö$ìòPTÔ•Äpj%´“¡¹,ŠŠI³A(*—ýfßnº ˆê\|,ì¾eÅX†nÄÐ6,ÞÚáÄjl)Vµ\«L´;=˜]¬çQ½òŒ ÔÑB__m ”T€7[~orc'T檖§h¹Õõf6 ‚  º‚ÊD•”¿’Õ6”²ê@åhlœŽ*Œž@uN{<¨m0ÿ7 A1»|ŠÚL¦”èÓp€Ou²£Æà ç%T wž‚Ì`KÀ§[æ—kQÝøÒYÈ{ŸnX=a"aq#€è)4ÊX*­”¡Bôªª"ˆA„"ÔQD×QD!‚Håé#€ˆêϧèeaŒt¾„Ûíím'm£m˜"3Ëæ.NŸ¹[sß/gèž{f²>„ü äÎdgÎ( ¬­Û͹ef”Ð1씀t›A™ùÂß%Ü­ Ùmà$2sÇÞJ¨þ”!$“Šóçhde™†iEtÕ6aõJú[ÉŸxùÞ<ΪÂùÛá·y8Û®üu’N¶NÒ?ýPKáŸSÞÍ?“PKì¤97 styles.xmlÝYmoÛ6þ¾_!¨CÑcôb;‰Üض¢Ø‡¶(Úußi‰–¹J¤@R~é¯ß‘”dÉ’µÍÖuiaEäsÇãsÇ»£sw¿Ï3gK„¤œ-ÜàÊwÂbžP–.ܼB·îýò§;¾^Ә̗9a IuȈt@˜É¹\¸¥`sŽ%•s†s"ç*žó‚°ZhÞFÏÍRvÄ(+nÀmiEöj¬°ÆvdñjüÊÜ–NÞÖXà´-¾æc…÷2CkŽbžXÑ+öeŸîF©bîy»Ýîj7¹â"õ‚(Š<3Û7¸¢™A%±G2¢“^px56' µOcÛ&±2_1š¬pÏ«r›ŽŽˆmz†šxƒÅèØ0à®{'Éx÷N’¶lŽÕæŒOn½70i>Þ¼>Æ‚ÈÇ®¥±ªbA‹ÑÛ´è¶<ç¼1U ØjÌ }êÙ÷zw¾TÑ‚Çá1Îâ†qž‘¸À"[¦®S¥NÚZÖ9jÍ!?­qLPBâL.ïll5ÃŽ}×-Ü—ä/ügé|À ÔB Õ°œf‡…û\¾haì€ë´TTÅàê-Tç×½`ð•+Z,J #‚¹rG¥ü›ÞÒ|UJ³œóú¬QÔ¿aV‹…ð±¨:HEò‡ŒòÎER5n‹_m|Bָ̪’Xk®l4%Å$ËÜ~B…€!…BZ«ŠiŽa"ƒEå XàTàbÓ—°8/PB¥ÂLWbÿjFÙQX—½¾œÙÞ`¬ù<Ã,-q s„™˜—L ØÓÇî©Y³ÓÓd0µžòy¿¯§*õ ãŒô5ëÄž‘ýeÝ h@{3gôkï¸mŒ/ û4nY½·yÕE~.78á;±"‰B{íŒ ¸ ÀCó‡Öü(gkWâRqY`íišn¡8+6¸Þ}Q²X•P9C;˜†Ð§š‡†:ÊZ ‚¡s Άªgtú†Få<õÐÛq e ÑEE7F‰¶Ã4‹kœIÒs”òÈøÐ®.Gh) ‚®IÓeyÆ¡­P¢$&&Ïg©÷<ÇÌyË£Q©JhôŬЬ&ég % õeÇDËÕ‘N õçèlÂ{Pé# ÛËU-]ç`T©C—ÞÈ©ÞrÊ \IA.¡)UѳЀÎFG\ 7ÃÐR?}ç×ûØò â[·ï&òÏjkºžª±-o-n ;Qqfýl}yçõl*xY˜#c oÒÝûXJÜs‡È„£91OÖk~ôZ•N]¢feóú3h ÈqÑ9K¨2Íág%yöüiª^,šàÁE‘U|¢Np]ð†•ìûà¥=0îùÚï~OäeÙ:¡cÑÜ»QwÝ î·yÂ^¯©Â”¯v)! ›Å-FòŒ&g ;šè;®=gU°Sõ1mîM7pGXHZ¹æf-9áW±Ó%Vß1{î¾ä—ß Öß<Žc.´|¶žg4eHòRè’¾¦M®Pk±&ŽSu½Ü'åG¥ 7A¸ŽíO ÛuU؆"çÛœY1|¥µ;ÆP*¸²ä+m~ä÷4XŽÅ'HFæw»ÌoTĦI‚ËÆ–’ݯ\÷oŽïÁ$0v.Y¸ùô:„‘à~ˆÂÈ·ï?õ=§zÕ'?fcÔ½éeøÀKÕqx‘î¦ï°nË™ ¤VÇxÝ€çMBglÍ9„öI0ëʱ©Ô¿ £Ù µx;…¹Œ¬õLwPTøîèŠ+¥¿‘ð¯üèvjtï¼U•9ßÃRh´Íìšäõ|ñ° Ãÿ™ õÜŠ‹D= ƒ“é5eŽ){ÎßüHû8`ü› Äñ'Ý{°¤®uOb_ÿkHj! ³II/bzþ1Bê¿KÛÃ!îÍ_ÕDŽe£B{I3¨5]êöÚ§¢Ÿö¬õË;ów‡¢zÊ !¼¼¿¿¿óN«‘℃ÿkWÖÍ •ÐAzí¥¦YýÞJõ¢­¶mî2¨×kõL¨Uu8¿h‚×£ñ!fß“‚‹‹Ä†=bë6)Õõ^Ûó…\;Ï,NQ•µ!öýy‡ÎJ!sŠNV‡®“œm@¡­m@È\Rà§ù gîÒ¼p¦¿û¾©¬ÐÀå/Nm0XNæ“hN£‡¢§kßw )Çk͵qEm û‡BÏ>ëÞð6—PKàS‹ÂPKì¤97meta.xml“ËnÛ0E÷ý È–¢vbtQ @ˆ³r¬²¥HƒÚýûJ¢%XF^êΙ¹Wä°~>÷*ù ÖI£”§J@s#¤îô¶ÿ†wè™}©Íá 9PaxèA{܃o“¡U;K VSÓ:é¨n{pÔsjŽ çzMÓÉ(*g%õŸýòþH 9Né©LíH^U™ª3*øÂƒU%8£ƒ#yš“™Þjd¯#c£¡'»"Ë6$~£äò3«ãcóYCY=î@ƒm½±ìe˜ör5--~HÎɺð~´æ7pOwYŸo¾©®òrS“›‰Ñ[hý‹ÖB>á¬ÂÅv_”´¬h¶»ô­¹ZpúyC1ÍÅ‘R­îBÛß^§Ú"Å ¤–ó\cÙÅðF^³"Ø) û¹Ï^o–Zl ,pD2)ã…6è»>˜$G䬸+ïÃ6 ¶¼ ç‡ÈÎKaß~(ÀÜí‡Ý@Qä Ô¬m·OÕ|Œ×=ëÕ8›¬‰|öÙPK-+„°™ÀPKì¤97Thumbnails/thumbnail.pngWy8”}÷ŸIª‡ž$ÆnTLõ¨±bÈLYclqÛ—òØncì3-˜”¡±UêÁŒekC•aÆ6Bï=z~ïõ^×ûûý®÷zÿùÞ÷}Î÷œïùžùœÏ9“tcºCTVƒí@›[AO ¶ &²z“6S¸ƒI˜£OÙ„|+Œò½0°¿-FâIû-ùDšYÝÃ$®ròœDç1á±?ee!û¿v. ɚϧ‰^ŽñBj;Ó1¢X^¯T2*Ù¥xÞãþe-÷#†ÒÄæ†‡+ññ†¡þÎÏ¢Âý§t_ð†‚0vfÁì<ë#9äÏé`ÝO8˜°ÃÅVœï2°7¢¬MOopaO0Í{(ñœÌBU"V‰ üR’.ä²í¿WW°JmÔõ)·Á8N¦ÞO!èBwmØn)±éÅÆu6y0HÉ1ë|6~}•_òå‚=5°ølÎáƒ:Ýž<¯Á-¯Â-.|.«whH3yï¡îák¦AÌÍt¡„Ï_¿VVÂuÆŒÕxÊçä~}“|¨Y@Tyõ•^“i™*Ùêþ¿°âN•9Ôæo¼l$­Ò~/0J¡?˜–ý”ϼµ¡Œ"˜ø)ð—‹ñð-O7£E]¶Ò/%áj°‚½æÐ‡YI¶àJç÷è³^ç»ýòðŽ8Mþ´'ˆúAîeÈ*=£ø1ò_6ÂIDÂU]K`E%û¨ŠMúšužÀ>ÒÑ0‹rÔÑÿÁqóµ8~ÏÛA;º0Ó™ÀãKîÂ^ñ–iËV½¨´E>‹öªŽòŠW4 ¬NÄdü±èæ»g|¬hy&7kþnñŒöŒYkñdÀi+Ch}ÙQ»™ÈÔÃÒ…Ü7$:;QØJþ÷ëÁÏê¼!Ú\и·ÍfkÒþ@ÞÝ´´öÒ‰‚…̉¡ ­¬€*swü¤,žÒWæåÔ•Z •™p ©ŒêäöÑî½³Ù„‡ižyïàà=g¸Á¢Ö?æ¢2¦@½ÚA Ù¹µæç©3¹\EÉ»®«Ú¬›òCƒŽ»¼…À]óÐÇ@™ûÊG‚Íc]šÈç?÷¬Ñ8Å÷¯œsïnì ¤â 1êÅE¥˜õ¥aî³HMJ¦i/0õãöû3ð½<ÉÌ#&Njè/Ó­ôÉ®P´iÛ.ûª tõ5˜ rløç~…·Ò¤ŒPåé[ òç7Z%*SS‰GamÙÿ³p{~—r¶WAª$(çß'98¬PÊáÊ£‚ è«§ %£ˆ(-fVéÐ/U2³ˆ¿‚¢`¿‘ J¡'ÂeIÃ}žPÅ™õÆW«e¼ÈìåC…>»#/õ¯o¸ít‹Y9nÐû¡Þ®¾¾žU’-¿4|<¢}ÉF=&P;æ0«t+Z–_hº4³¶ôW‚%Ãýçr;s*Ï\:à)ÖàŠ“ÖÒË8qàÓÍ-U׿Õv N‚ä%×qò«x„ˆÄ §#¨C¥Ö/4ª=°ñ.ãÖ”ÇÕ+2ŠJï )™ohÛüÈŠþžoålp†LRÎØ[ lm Û7gwàj}ªñwÚ`íkÇ”b;ºd/ák¡¼ŒTãØº‘˳éŒáN“Þ™uØëfaþUOÏ—¼‰8¶…ýþyÀƒßN›1#8zÕIß_òDH”2’Jñ“'–yùùOªÂä^ñ¼àààöœ#®áÑ©;’ùs§™rå¸Ðá÷LqC1Œ$gþÝ·Ï–7Àb7¨‡ðõ½+¹P§m˜;e»²¹Å+ù¢E~w¡lØÍSJb^<ë¦Îî;Ï¿ãV‘.¨o²D’kØÔO[3²g¢}sÛ?ú{´F$g‡X‘ͻߒ¿, •µ×M-.Eü2»_}±­ñÍm¥ð«©ìÝ cн©E¾ØÔÂÕ#ç/‰&xõ­sSฦ•Û¹$~èhwt} ¾êêÂÕKúž¿žÀQóFMŽºàÖAœ×[TèÈNã « ÐC„:høCâUvå\ ´±èçåì|’Ñ)P‹1†A, dZ´»d€ØAnÆÛîò³ù&o|?ÀDŸ¸H;SËwªÑžFÁo6;Ê¥øò6”ð©Ämµ(Ù÷“ô‡<³Þ]R%ÔXe‡Zµ¢ò;.ì†ø“dà¥w\è}QK¡[£?9r×Ùìðò¼U.÷uœþUC%Ë€˜—¢DÎ>JóQš¢ÈpúþÅ(Äè ,wœ°“2ñ£ªžŒØ÷êºø#­š;w? p± =¥‚Ü= ÃyX!ŠjkÞéõ½y¾qûRêÉl x©ÐLC½S9“[£Y“JÒŽðjRv\ÊSnJ:7Ï×v8*íª!¨ž»Ôt¤jýCmZ·ÊKº‰ßðwË-y¥±:”ÑçRr½ÿ¯è nSŽ™Fi~üרÖ=DDÄ Ž%‰«‹ïêÒ,O'\ø¶!z>ûNñÌÑ+¼äðÛh@’4üÙõ˜«Ê8×ýžÀ-q)[᥊éEîP‹‘{¡¥ü,}AéïK/Ї›€âà»Jq¸šáfèçAa!‚¡·ØwfC`Cë¸ë:0¹ËŒH!mñýF„|ì/ßœ7iÚàg¥qª[mùƒ¡zjuå¯J™/v¿Y©(¡qÛ'ˆÃçhf#5%‚z~D²÷óƵ!§Äbº8W0i÷×ÝN?~p•ë©•èé|®%òŸØfÁH /àzF–V”qP©ï5 —+˨µåj7M³ÖkþK]Üýy¾šüO(¬S³öè—)WÖ{x•éÜ_=»ìå–²ï¾0£ï6вÀÀ½DÁg‹|Û´¾_ÔìÄ£è(iݨfºm@õïïsû12ªº‚Æ­Á G°KÄB/ßÝÃÓø{KËèes±äEòhÛlÅ€.4šsn]¤ÙÙàëøf¨–_ÆéëNy|~×Yàz{W‚¾¾ Ä‚Aoµ¨6­4õܬ\B¡b÷…ÿ ƒÁ~GO¦¶‰Gë&Ã3úTª_P*Aòþœ‘EÛÅ·}ÂjkÅ c8L\UÔ÷×Úc6¹G}îu6(è0ûmæˆØj-‘ÔÀ³ªcÉÒ¼ÍìŽÅyà&î—¯å´ W,ìQaEšè:37Ãõƒc¸ßåˆF·õ ¹:þH3TÐ tŒ´ˆQ4ò wÀ™H³öýá¤àï?î=#õðË´´Wò½ âÜ]-LKôuð }ë}UøF7zõ®ïÐó‹“]ûÂû†ÓyÊ›IØb£òôm\°3{7SµËc(œºê߯ßýœ âøë䞪s•8E††ÒT®Ž žNèÀ¯.[53W˯7oøÐš"RX®º…¨z[- Í/ ’!™”èˆD÷ðçĬãj˜;Vàà@JVW>LMU¬r£eº‚q–ó•š”õFîå=¦Z$è{Þ®ñHJ½(ð-û×ßCsŠÎ\VÈé-ºžUjæèG JÍh¡Ò°³¨+l/ïoÀVi5ά0c\Fàcõá"j-‚ô(ˆ´®€/¼ËŽë1¼ySýYqÒ.ºÐƒ¼¸ÛÄòír‚éx‹‡µù$p)âÞ3ólæ")}4ͼxlÍàÐûèî†oâ‘$E~´ÔºDš#pæœßדПkÚc\~Ú%þPK=šŠDƒPKì¤97 settings.xmlíYms¢:þ~…Ã×;­H[{uª;ÈÖ—níZTlý ÕlóÂ$A´¿þѽ- [‹:sg§~AHòóB©<PJÕE”Ôp*êIsC 9­3 ¨S@ ¨K¯ÎH·Ãê¯{××dÉ“%Fô¹¡Í¥ êårE§ÑÙ)ã³r¥V«•×­Û®£Oh¶+UÒû5cì'Q< ³&3tý¼œÜk¥È7¦iní°~ójC\N„$¶Mió8–ÖÐe}`ôÓjZÖ¸·c$‹¡É!±@Û6ÊU •Z³b\^\•Åùö-|’Yà—Õ˽±'È—óLåU¥}oø.D³y¦ø3ą̃ìŠB@p‚¨—ÐOsÁ(ÛUë1j‘ñÕ.ŠaÔóS2…äjh͸ñcJcДÎPyOèÛ!Ã9„²²Ã2´B.0¤ÚYÖ6ªÅ\ùú1 ú\/Ýe½0*É>óaÚsÆAA|r‰¼c¡§Ôo-”e Cè?¾éI´€ktÐYŽyŒbà[½y¡« æ-¬UöÄ͉â{¢¶˜”Œ|8ãáëh–×¼;»:~r"^yöÞg»€çæã² e§Œ‘‘Â9è–ŽA€Ã4j’k ¦ñ˜Á8ü¼ZPñp΢˜ ¥2íó€Ã¸~IỌa¨Ö|XÀâ4SÈÙZ¿È#<ÜÿŽÉcAw8J§ö ǨÃŒ§ 1‹wPŨžÆEÁ¬ûƯG°J%=$ÔfQ_•ÏG!YÇhŽ€ÞßC©Žp¸".ÃbÓùà $C ‚³0íèC쬸'6óÑl(”¿s«ÃJá@œ†Ï¬÷…†®HäÊ?x¶ø¢K'7—H WÔ›sFÑ ,ˆ ›ÓRvuÆÝýTœ<9ˆü‘ãñgÞøÃòÆ-¢ÏãÀ柧Î>SÒgJúLItJzÉ %³öB¬BÅááꔪæq§nr°H!G^iÓs/µÃô[X=o! øJkNÌîßeÝÇ.qV`ÒŸ»7KmìÍÌÿåo¬ûín ÷»NL³oÒÿæÑ6ÛÓ±º>»÷¦9$5dwÚúãÐ\Z´¥æ~¡Oz5ÛpÂéÃMð¸jÝ{‡~ÇYY¤¦Úõ¿­ƒI-8­…GíÕãë¹[xŒ½}i‘ÊÜ#~à{¨óâw*Ø¥÷µ¾E·_MÑ7ƒ®±\xDÙ·k³Á¨§+î·ãÓIT{Ýîüc:Ò# ·îíë»EìxmÏýÎõ·q§M§Î]ɸ:ê8z¬QÍ«QpÁ^ä_G™Öpà©Åh1p(âÐpð÷=ñ rj è ¤ž AÆǃ¼O è$Ÿl¾S 3qŒ,“Ô)mÎÈ’àwhcUqÅq↹ ÄG¨ºðmU1ŠWæ[ÿ—ùNVÎû‚ØüPKÚçÆ‡{ƒPKì¤97META-INF/manifest.xmlµ•KjÃ0@÷=…ÑÞVÛU1q-ôé&òØè‡f’ÛWäÓ6”¦X; HïFi±Ú[Sí0’ö®OÍ£¨Ð)ßk7vâcý^¿ˆÕòaaÁé‰ÛÓ ÊëÃN¤èZ¤©u`‘ZV­èz¯’EÇí×ùídZ>Tð  Öybì„`´ÎyÊ뛣«¹V4"BO[DÈŒ©ð¶RÈ»œ·)oÞ zLñ˜ =KbàDˆeð Ì¡R¥§æbw Æc!xð!…|R!|ôcD*wÒSêÅàì½)×F$ùªÙB ¢Ž;Ùߟ Jnêž&éF] þ–ÃrÆ=Ë©Wo³Ÿÿ×Ì¿s‰iv¬E†Ùžõ6ÙmHòiØ7Î Ÿ·°ÈœÿÅsiòÇ·¸üPKÌMfBQPKì¤97…l9Š..mimetypePKì¤97TConfigurations2/statusbar/PKì¤97'ŒConfigurations2/accelerator/current.xmlPKì¤97ãConfigurations2/floater/PKì¤97Configurations2/popupmenu/PKì¤97QConfigurations2/progressbar/PKì¤97‹Configurations2/menubar/PKì¤97ÁConfigurations2/toolbar/PKì¤97÷Configurations2/images/Bitmaps/PKì¤97áŸSÞÍ?“ 4content.xmlPKì¤97àS‹Â :styles.xmlPKì¤97-+„°™À4meta.xmlPKì¤97=šŠDƒThumbnails/thumbnail.pngPKì¤97ÚçÆ‡{ƒ ,settings.xmlPKì¤97ÌMfBQB1META-INF/manifest.xmlPKîÇ2fifengine-0.4.2/doc/diagrams/proposal_memory_manager.dia000066400000000000000000000144461341615052600234170ustar00rootroot00000000000000‹í]Ûn#G’}÷WòÛ‚Êûe8íÁÎÀëY`ŒÜÀö‹P¢ªÕ\S¤–¤º­yØoßÌ*JÍKY¬¬¤Hêð…RˆQQ*fž“q"âÏùã~tñ9ŸÎ†“ñûKFèåE>Ln‡ã»÷—ÿúù¿ÞÙË¿|÷ÍŸo‡ÙŸü?wÓìþÂÿÆx^½¿ü4Ÿ?üéêêË—/dô4Ëæ“) É,¿ú¿l4Ê®¼ÑÕåwß\\,¿Ám6ÏÂ÷ßÍæóéðæqž_Œ³ûüýåM6øýn:yß^–V »Ád4™^|ÎFï/¿ýX|]^-Þæjå}¶¼÷Cv—ßLóì÷ú·¦þ˹6oýO×ßöþa2z“ùÓÆIÍû„/Ù,¬fÞh|÷Ý·ÿÈçó|úmyY‹o~}¿ª‹­u4¿Ï¦wÃñ¦/FåÍàD ¾4³JPnÄó}ÙßÝÍaÝënzXwÃÙõÃd:ŸfÃù¦Ë›Éd”gãÒë|ú˜·÷3d#ÿˆm ‹µ÷Ãù|²ãú?f£Y“Êo¿|âöýôÞM‡·Û?¼+5ïòex;ÿtýǶÛE §åw–rÁ¹lKOó÷y8ÞŒòª‡ãyôóðüöOݼýú_°Xå¿þzäS¾[í6rks•«ý·‘»Çám>Ûñ(®ÚÔ¼Ó§…ÙÕ®»¾n×ôÆ”ßZÛÔ £ì)Ÿ.Þþ¯_·ó‹Åx±*-Ý…ÉÍÿäƒù"¼ýø‹we³ÙåWhâÉðöýå?éê½YÆ¿“_7nÎÃäå âŽpaTƸZ{sa©órs³îdêcÈÆw£üų…#ª¹¢”õ…!Z¨#N·õœòûëÁd:ÞDÇXx*V˜Í8ŸWK„4Š~ýb¾>åûOózgŒ·òeÛ9[CX+øê¿ÌÆ#Þþ”Ï&ÓA^‰´öq6óp-Ÿ„»Îe´ ÿI½ÏÇódïŸÝøßͶíÓ{ݢLJ‡i>›]¿ü`–ÜÕÄ#ñlî–d®ž7³ôA={jÓ*"lãhñÀ% èË4{HMá%ûè?Ÿ×ƒOÙÆjú²–JÚîýwéÚèüz”ï6Ò¯¨ÆÄù˜gww«8½Ó?HÂ*à©aδåÍú8v{X¥ýûy˜çÌÓÆ0žx8ºþ8Ù\‹Ã÷.>f÷ÃÑÓûËûÉx2{ÈùåÅlþàÇ6å[üÍo:Ã|ÚÎÿó:Ýæ ¬]»„wŒnÿy3þoÛÏ×Ãdôt?™>|Z]ÑúE]Ì  Éð¿»/e–ù%çå*^þ4ÏGŸóùpw&ò/ÔúrlõåÄÝ›Å"²ç¥l^IÔU,}zv"AJ,]ý’Ý<£‡ó¼òa=œÛÕo7äîô9Oånùnp+õ*‹pºe_ÝÕv²øÉ\íØ¢îFÙçØ±)bSĦˆM›âqoŠm’¬'”Äå±I\ƈ(Ò©žÔ[Ʀqƒ'¶ðäÿ§Ï1¬ÇCmM[¿Í¹„ØLRÍ‘KÇ"òÄ%Õ&÷ù÷ã»á8/ž¿_ÊE*©\¤r‘ÊE*©\¤r‘ÊE*©\¤r!©.Ù¸ˆ.pæÄJ,´5)Ë›91ªðìé Fó/%ᬭۆµÍÑá5¤áz¹°™êó¢á¿†ƒ†ƒ†ƒ†ƒ†ƒ†ƒ†ƒ†ƒ†ƒ†ƒ†ƒ†ƒ†—4\v@ÃMèÁŬÄ5OËĵ-=¥yàâ´ÌT+ÍSñø›²q¾œçÅÆklü?g³É`X–™-%YprÕ'—Îô¸ð„2ivÜSb§Œ ,Ü¡zðì‚gIl{ÏÓù§ë"œVAV˜2"œ°{™2¢VðZyG ±¯›îëÄïÈ››EMMÈÚÏØ–ŸµD^Ùã|2<ÎBàm‡Ñ ûvžÒÕÎnîL>¾­ïª°³¢lêïÝAj ïGóáÃh8¨) ì¾¸q:|9DQž'fÓünuQï¾.´ëòÓ†EÈx€Žæâ'ñm[º“ñ¸\gÏÛóO.>eãÛcžO QÞÅןRrµûwÙâwyíï>_ýÚu—tpÉ£Ñ+6ô¤)Œg¸ä=…¤E¿Ì,ˆLX„h—ªƒ¬Ç@{˜......½¸$O.™n /$a‰–‘š‰P!‹£%A”êqELúƒ¥Šø*"Š… ÜÃÔÇrØ'¾iŸ;¼Áî”pwb€7x€Î§> RðFwo꤬6Ø„19èîĉ^êídˆJëCtwê À&2Véã£ZËrpûìúÑÈXÎgóƒéða+¬°BÀ ë1Xs}ãn¬°BÀ +¬°BÀúºå¤.–ƒ{îX4>‡ýI¥’(½päyªgኅ䂤ikI»ˆ¯Ñ¨\b¥Q•{þƒÿØ7Ø7Ø7Ø7Ø÷1°ïžÉL‚}ƒ}ƒ}ƒ}ƒ}ƒ}ƒ}Cù(£] :bœGJõ›°pC¸Q\žŠAGÏžÓDÔeZdóŠ2}+ Bc¨‡8Á ¨‡°¯UÁØéÀ%MŒ¦B¯À%6¼¦á—›xP}^Dü7qqqqqqqqqqqqñ×qJ„Ò&9÷n¨6%/säœjs&_S&ΗSâ⼘ø¯`â`â`â`â`â`â`â`â`â`â`â`âè­¹RÐ×ÅôlO#m‹Û´©ñÐ|ÀPH¸BõÀ”eð¬‰lï¹éíê +LY8"{™ ÂVôïJù ʱ¯›¾•vQ(èC= úPЇ‚¾s)èc*¢“¯Ö1Êv†˜üöŸ6‡ñ‚˜  ±„˜$1q(¢9bZr ÚÈ ˆ ˆ ˆ ˆ ˆéí &}šˆÉu¤ùPÄ$>aR„a‹:ˆâ„I5 é—ªâ«5Š.pSIèQàtÅÄÁˆƒè|0ròC!qôú<ñèátœH{>OÞ‘0_û<”eú}žº±‰¨UÍ©Öa潊ɵ¨õç|6ÿ0˜æ³BÎ 9+䬳bT<䬳BÎ 9+䬳¢°tÁã§žJ"yqÏhRQ†$ WaÂi`á¢h¶¬‰Si K;ˆ¯ çÄJ³Üã‰8ÿÁÿ ììììììììììììŤËB?λ˜yÄ¥‰í7aáš(ížh1õ(Œ" ž Ñíù#µ_m›¦Žp^ê›ZjBéöŠâÄ!D¾núV # „æ š/ˆ¡:=Ñ`Ì,mÎ^«.‚w1L[[Æm*yÒ¤•ÆŠw¡F“÷½g[xĦ®$­ ²ÞÔ_å.SIŒ[ÔÔ4N¡yÂô˜°ß000¡´¨xXùev8À$;Lü¥¤ŠPgK‡£¼ À<;¢˜HŽ—x£rÒSëMÅ6KElYÂÑܲP´°·‡–Ðw»àààÒ¹¥ê9_Šz곆÷¡Œ«”¥©Ò£"n{”p£úáIx·œèÖ^›A¥šø*, 2Ý} wØ©0€Å®"Œ„- éT þ61iM¶v ÄÑ·#z£¤8á1E/U–²-™÷$ OÚzO}截爲­7«ê$ƆãèœYG'ÏkÝ/¨ B*ˆPA„ "Œ£C*ˆPA„ "T¡‚ý;|¼‹AtÖsâ0 Ž¥ o÷Úûé FS=Æ×mõ$çÂG†×t,üróªÏ‹‡ÿ¾àá]Œ75![­ˆUÚ$¦âÚ–ž¨÷È8-rÕT§M‹wbS:ΗÓââ¼èø¯ ã ã ã ã ã ã ã ã ã ã ã ãh¬¹RÉ×Åm#é13̺‘XÝe÷4ÜbõàÙÏŒ¸ôc´«ƒ¬0eD8a÷1µD¯jà+äò…0Ÿo𾕲>ô>@YêúPׇº¾s©ëã&¦U”~­Þ‚v€˜´5¢§‰IœÆxFLºL\ôËì‚Ø„§î­Yd= ÚÈ ˆ ˆ ˆ ˆ ˆé !&{šˆ‰uR€*!0)B­¡¢<`D©óÎÓ/UÄWiaÂ_঎¨ã€?èõ„ƒv†@8x€Î"'?R1G Ù“ˆLlj>H«§¢ååK£'C„TZ¢ÓS6´JÕZRfLžýh­?ç³ù‡Átø0‡”RVHY!e…”õ¤¬¹¾q7RVHY!e…”RVHY!e}ÝÊR=îÔ“Gf+Иíͦ*]:RJOà ÏÅMJÞE|MH8'Všå.OìÄIøþg ß ß ß ß ß ß ß ß ß ß ß ß¨$]QùÉ.Æ…áŒqŠý&,\£©Ð=[f¿ûå0"Þc‚°öü¿‘Ô¯6ÈMSG8oVë°°dŒ¨•Ëß´ !ò SŒ‡„dŠ/(¾ DQÄiIuDQ„¯V?B[«­){T&¡- Jˆž š\õ¹!4x–qµ»+#ꂬ7•»M¥‡{e@MãšMSCP„ &ìwLx€ÞF‘ÎqU‘ ¾6Qûp€Iw˜œàê…¤Šp«KOL;+<+B™HŒ—ªcÜbêáÝòEmZjB…Þϲ´¼A´„¦Øí———ε$UËùÒOy6þ;ŸUa¥è‘§¡}DØÈ‹âM™²ç†$‚•ޏ’}æã‹rÑÖ‡ZÍ2q5!Ö[úÿ+D“¶{˜%¹Q¡V*®é0剗^ähÉ´\/j±t.’b¾²ãV+([£ŒüXÚm[A£‡U A$c¼ÇˆÓ¼­¾¤Ñ*(q*øaÞO_x’¦Yè’-"ºK6ZAkC¬7ÕEÝÃV1ƒ`›V¯µ$bÙò×vÙ£1ÍÚÖÎèäV=wB«óHqsÙ úªÄÝÚZ,{þªØŽã¸V›–Xú°ô½©¥Ï¤[ú¶gdtgoG”¢÷Næ¨N™a ÄÒ\ñÐò¨ïˆf¢èìMwö® rÓ”+WÙØÖ¹KîZv”Ú0DcoäpDŒr È1œVŽAó%âm/e|Ko&ªKN¨“)w…)y ˆJô¤ N¶uÙ°ãe|lMšm("ùJ›9ñf¿^{þ•㆞蹞蹞ÇÐsã†g2“蹞蹞蹞è¹ñº-/%³pÞ®‘i{^:¬KOA’RðpgükExâ¾—Ù‹ ÙÁÃ}4\ü·ëïÁÅÁÅÁÅÁÅÁÅÁÅÁÅÁÅÁÅÁÅÁÅÁÅÁÅ׸xôø f E›ž'͆G¼t2â\æÂkO_çÄ»±!×+(ø‰ñ_@ÄAÄAÄAÄAÄAÄAÄAÄAÄAÄAÄAÄAÄ7ˆxü M¸45ðd—r…÷ÄléIÇú\eýKG¤q,)ï"Æ&TÜîÌrR\ž8ÿ0¹Ï¿{l›Oà/àãàãàãàãàãÇÀÇ?_àãàãàãàãàãàãàã¯ÌÇãg-²ÆŽ¦Svã‹Ä¸#\kÝŠ8×S¡}¿ÖIêØ‹ëå¬8ÕçÅÅ_pqÝg¥XÜ(ÉÒ’q¥ž¨dçešJ–šŽGÇØ”óåܸ8/>þ+ø8ø8ø8ø8ø8ø8ø8ø8ø8ø8ø8øø[ãã;FΘ.X9—¦§(á‰Sä‚XÁM á¦P¬‡Ôuð̈mï¹ÙTûº +§Úsm÷2•–¨!|…iPçó SÌœÁÌŒ ÁÌÌœ9Ùˆ¿Í™3REÌœ‘2ÝTæˆÉv€˜”æ¢'5щóψI‰‹~™]›°8Ñ1U¹ía ÄÄÄÄÄÄôv“>MÄä:ªÂ剘(B‹¢¢8b²D†îýœ˜œ0U…Xaé¯ÑúkÜÃ44u8 ”ç´Ï#æ`—J¸K1À<@ç““ ©˜£0ŒXÑX€#ªÏä]ŸäBغhúä·‚éCt}ê"Ä&ÂVï‡S­e˜ø“o?aëÏùlþa0>Ì!i…¤’VHZ!i=Ik®o܃¤’VHZ!i…¤’VHZ_·ÄT±X®‰RA¡hR]†w¼H%—Ò)¡ÒÖ–ÆׄsbåÊü#vâüûÿ30o0o0o0o0o0o0o0o0o0o0o0o“. ýïj±$<íbK”\žÂ bïØpuˆÂˆº+,9¡ÌÚ½Lw×E)ÿ9ê" „Þ z/Qqâ‚A±ªùû}­º%N.ig´Ù€K‚Ðö™’ׇKŠIå¸$eˆ|Ãp p »àààÒ[‚KìÕàRôpmÁˆÑKøÝ?-\Ò„nEO2B\òŽ.‡{%>]ª ±Þ’í´ÔÄñçhššF²4AK ŠQ–°×,ázÕÌ݃¥5¼ÃbΖØáÀ’ê,ù\)©6 ±’ñ˜H”/ŠeÂCï×$!C¥ªk a+W´iè¯Ù¡ìa#û=e „c%lt@J@J@Jgƒ”xmç£>VÒ] %ºèÝ•*yGÔ–}¿LÀIÊ¿Ä)'U…·Å’®™n€© “¢ÂÄyP69 $<@@I§Ûõž¿J2]$ߤ0åL]¡Ã$¦zRV$ß_ª…¡Z{P0Tkç"‚¡Zª…¡ZªUÅÅò÷oøï|V•¶ˆ¡JµÅ;ÿ·áJR‘Vé! Vì ¸£L÷™&”•Ε‰pÞlRD}¤[Œq‚»ËVîgZœ@0}>EÅ5=ç1òD¬á ?&Ñ/H5‹¤©˜G­6×»¢ò}6õ«µ±ÐÑ=ä¹&V[ÓSÄ*mXÚÊLWg¾œoBƒkCd„ëf¹º(ëMßùÅõ(´²àR›Ò†ík­(@Y\dqñ!‹[ v¸è¯£³¸åëQö”O¿û¦|áÿ¹›f÷ß}óÿZ ¤.ÿfifengine-0.4.2/doc/diagrams/xml_format.dia000066400000000000000000000132401341615052600206350ustar00rootroot00000000000000‹í]ËrãÈ•Ý÷W(Ô{‚Jåù€é*Ç´ŽYx ÛkDB§I‚B]%/æÛ' $¯„JÒQD· R ÄMܼçÜ›üÓ÷õêâ·8Ý-“Í—KFèåE¼™%óåfñåò_ÿü땹üÓןþ8_F°ÿ-Òh}aÿb³sG_.ï³lû‡ëëoß¾‘Õã.Ê’”¬–d_ÿ_´ZE×vÐõåן..^Ÿ`e‘ûÙþ§Q–¥ËÛ‡,¾ØDëøËåm4ûu‘&›ùe1j?n–¬’ôâ·hõåòç»üëòzšëƒóÔœ{-âÛ4Ž~­>5µ_aØåÔÛ8=>íz›ì–vHö¸=Rq÷ÿWcö£vvÐfñõç¿ÅY§?—µÿáËùÊ.¶([Géb¹9Ų÷gUÜ N¤Ý—bF ʵxº/íánÇ…[ —Ž ·ÜÝl“4K£ev y›$«8Ú¨YúwÇÙÍ¢•}ÄêÌbÝÏ~·Ì²äÌõßE«]Š?{\[ï]¤Ëy½óŒ¨8Ë·å<»¿ù^w»(‘ÝoXqþGoçÿm¹[Þ®â2 –›¬÷çýtúÇaNü å³øËŸ÷|"гU¾&æ&–±lÿšX<,çñîÌ£v8¦âL÷ûa×çîúñ¸¦7¦øÑÑK;‡XEqº?ý//¯ë‹ý¼Ÿu^Ý…äöâY¶7ï_ÿý·‹«‹?¯¢Ýîò%ô°ÇrþåòïôðÞ[cÏd§¾“›³M^ž JŒ¡ÁÄ#—ÇvŸÎU0··Ç(©5"Ú,Vñ ’(¨Eš2M´;fŒ0ûƒnÈñ*^ßÌ’ts* md•Ï)§†>Í'ŠèðàËôÀº—‹û¬ŒN¾:Þãê ‚ZGÛÒð©Íùw6‹÷4W¢ÄYä\frq·\Ž­³®ãMV…ÖûüÑ­ýÛhvP÷*nuöÛ4Þínž±ó•Ø`;ÊìÜâ êé}æß¨'¤ñlÚ?qÞp¾¥Ñ¶©9‡1lk”èκëÍì>:™PŸ§Ó€v;ÿþ.ÝØ 9¾YÅ›ÅéTú2eë~Y´XÆâƒ~ ¹ ‡AOÅê˜v¼Yv&\G8\Ú·CÈâï™_6‰]é­nî’ÓÉØýìâ.Z/W_.×É&Ùm£Y|y±Ë]Hdã›âNÒeœvÚ¨»\1G—põK²šÿývµüß®þµMVë$ÝÞ/g®èø‚z]ÌÌE”îŸç/eÙ)çù*ž?šÿŠW¿ÅÙråw¦ç'ÔùrLùåô»7ûI¤å¥œ^I¯«xå=gcAàÆ‚4æùÀYǃ=|ðÎâ²AŸs_p¯à·R.ZBÕÑÈÊÈîxÍþ°^=>MoœMòôî÷IÞš¬HÕ[ñprV| Î~µxƒ!®ŠüaåqñrµÌËàâÍÃzÿè½ÎÇ´‡)Yˆ5Ì‹v¸}Îqov³¤üñè Wš_Éqöé¤Ñ|çn•D\®óþ]çÎg<žÏiç9ûGâÃlÉÖåè¢|>䎢‡ì>IáBp¡èB­¨çRäúL¶{½µ.ûbžÎ¿;T9\~7rŸõ%÷CÂnÔ„ÂŒöI†OHBË) IòpÂ) „–>ÉýAŒlBî3JÄAÆ‘½srßQî»8•à×·ñ|ÏAõƒêÕªT?¨~Pý úAõƒêÕªT?Ò]È¿ª¹] ÇÑ¢žóI=Çý>_ÖŽæ<®v¾ß;9;Éû²“‚¡å„Äoá± Ü8RË©"’ÙE¨_Zrëš’‚0®ƒ×+z¤$#â(}0<)¹Òh=% êÔ#¨GP A=‚zõêÔ#¨GP•)wNPÈe! Ύdzw<žúäýÒ'ÿ¹Û%³enÅ+…íI1T‰§Dø-ñDK‘—YIWá“W|qF튛f÷7¹1L,#] mF²0'‡êF>×—mmi’.KƒŠIãèw¬æwófÑC–¤ÉCæ1Ù úl×›(™/Ý“êükè;oæÕ‹Ì³kjïá(/¥õÃ*[nWËYÅké ð?CŒÒ4ù6ÆË)Z,Òxe±××íÐoõ†Aãû{‚>ìÄÞÅT7w͒ͦ˜w'ÏÛÓo.î£Í|O|dI^a~ñòÛ/—§ïÁ’¿eå+N[æ]PÉIÐ7Zâš(§Q$Ì«èÄ!‰É‹4ÒBÚcMƽ*O1²‰öÄv˜Ñï¼ Þ^Èoy¤þ&%ñP¤@‘E )P¤@‘E )P¤@‘E )ÕT£u¾·(BP„ סJã€[·þÌ­Ë!²Å„C¨çl1S$4MD`´œæ \‹Ë‘²ëΨ͸õJK†r˜bm††$<ÜoµdkV· ìé@pëÃ$²Á®Æ²+ðëà×Á¯ƒ_á׃CŽÜ´á×iåßzã×U߈)àĽǟXo“Cb’‹F¦’‡èøuá™_ÄÈOɯWg«À­ƒ[·nÜ:¸upëàÖÁ­ƒ[·ný͸õ|i†nÙ Áª·q›b^€ßÀoà7müf'ë8K¡HóÀy å‚ã@Ê)׳”KAL2Î'š„ž‰I!Ý6ÔNÌÅóÂß‚-䓨"²Fb®J#KÚŸ„„sÙbdÕWQâlzÊåÞ±˜«;Kr–4…Ž :.踠ゎëMt\ª‡Ž+_Çez‡Kšnóãyk‡Ãs·5”DÛ#N‰ñ»7Ïæ}JýV¶\ÅoA¾ùä[oA¾ùä[oA¾ùä[?–|ëCS‚ÉÖ…|Ñ Ô 8uo‚”wR‡Š Nó)œæûÇt¼oà:¾]ç®׊뫸þoãÍ<ÞÌKD\aoVR5Nw‰+MŒá$°Hrjqµë-Á->£Ú«„«ÊÄê¡’HU¿ƒ•µFkMó‘ÖR¦zYzNÂÕP¦U÷w­¯éIÇåÑsöéóoùóg–ÁD\[§0, Ü_ñ–FßnŽ4}ȱ!¤#¬•t„Uþ±7í£}§iaŠýg¼«GÐÏò‘@[ìø× aá§Ï!$$@B $$@B $$@B $$à%ÀK|JogŠ3Àuà:’Àeà2Àeà2Ž´nÿÃØýô(œ¤¢N•Á¤ûn¦(6 a¡«t÷Üý§ÔÄš‘špfÂ3CómUÚ •î»ù8Ú‘·mÿƒÆ?c5mAÛ´ýAÛ´ýyÑn1ÚC¼ÅC΄K¼w¸DBš¿Ë"u |j¸ˆ¤Êè £Dبaªˆ(Ž%Ý‘›LUFÖ u1ŽÑg†¶ÉòHñÒ0ñÒ“ò qâ&ÄMˆ›77ñíYðfa“è6ÙH‚‡ÜÇÝ'8œ (¸(–b9ÓDUÐ{þ…ÿ´Ï½z•A &\©i0U„= ¦;rÓÞóåFÖ ¥„…ú\›ú¼Ê¹ÅТö:@Õ«¥ÑAu¬þ—ì =TÑC=TÑCõUUÕ§û¼ô×}¾R›bzkS$QTØ@&èÑH¥™8E) $®)› AL~¬\åµ…Ë F~Ê.Û4Ére š¸@®¹ ä*«@®¹ ä*«@®¹ ä*hâ¾$áû«dv=1»Y®£ÅÇu °íp$ߎ”ÜÝíâìæ;ªëáAð ô‚Áƒ ž„+Á•ÞÌ•þ?…xÁ >þØâãpññó>A,4^ÅÇ&ßüˆ…D­§LðÐ!›îÈMÅÇåFÖ „…¯›Âœeá¡3 ÅPJ¡õç÷pž{5A€<šxòcÈ!?†üø•üXö‘ûS×GNœöÖ ‡DÓgepà1rb‚H)¹ÈIh9”ð\ƒ,ÝÞŽÏÈ©ÒÈš¡¾"'aº¶DäT-‘Fì„Ø ±b'ÄNo;™áb'5BågDM”+“Wl3åµrËPHT©¼rKçÇœ¥üVn aä§ì,|—Vi!ÑZµZ¨ÕB­jµP«…Z-Ôj¡V µZ¨ÕB­Z £Z ª*|!ð…+¡^ _x<õZð ˆä!’ß“–¼7iÉãTN#!7³ÔKÐ ïÐÍ)›Zd¥2'º;r3©W•‘5C)¡aÈÏé·Œ5¨ÅPnòV›èÐ= ¥m–ëÂÁ¡ô‚Ò J/(½ ô_é%t¥o õ}£&F ËßçÊÉÔ}J½’Ø#¹¨‰ˆ"’èÙ9û¬Ôk#?e“î(^Ñ¡ª/¨¾ ú‚ê ª/¨¾ ú‚ê ª/¨¾ úB‡nh¾@‚$Ž$¬Lt½]Œ„J‡!HȺNmÍ]‰HF…jÊÑù±ÛÉ·+rÃD×F~ÊšÆ]ò°™£¦Ù-d·ÝBv Ù-d·ÝBv Ù-d·ÝBM#ò[Èo!¿å]/{g¹"^rOžEð<Ù³žI"ܱˆêŽÜH_idÍPF¨ u#|ó¡ÁŸƒƒxà!€‡þ ð<øAð‰·vò7³Ç²°IõÞ`‡m´t Ì —£&²ˆ¼+<%ZË©Å5Âá*"„V^·×©0±f¤$Á0ÿt¨‹ÀhÑä>à?B Ô÷)â‰=Å;Ïùço èç4½?ˆ3Q[UbbXê´`˜FßnŽß4}>ìní¤iå4Ù ôQ/ê`´9V÷c%#rŒ)6 ¢š=M±Vq9šh!}N°öUnK5-ÏìsÆœ)m†Ú/ÿ@;p´˜¤{et>ú,½XÎ1E7¢MŸZù‹‚ÏdMß)ú* Fšp„}&-RHÍËnI#î3YidÍPA8ºánI‡~ÖÝ’üdq²Ží¿±Y2ˆÈ "ƒˆ â[dþÎ6Kê¿97µ N»Ât]Á”ß•­Eb{$û}HÂóciƒ¦®ÈÍ 1òSÏâ¥(-@iJ PZ€Ò” ´¥(-@iJ ~”ÆùT9ZuÁâ¡‚ŽBmj P[ࣶ@ÐDræ9ý$¸ÏD'Úe› †9 ô>ñåÔü‘›ÊäʬʈTgÔŠ(ÕnhèºåšOÈöpžy¸8=zô èAЃoQ`ö Uåßz£ë5Ù¹SÓ@ºA¿ÐƒR0?ÂÈOIfËUlƒЃ A‚=zô èAЃ A‚=zô èAÿô ¨¾›û-Ðó\’ý)\Í âf*9áùqHDwä65Þ'6VÔ„…œ)ZÍ3z•ƒÃäà@‚!B„àø„ éÁ æ<-‰!¢%1-(IÈ^‰©l¸Dóp) Bqï-qJ¬ 1Õ;SíYKH©9!rBä„Èé "§ãè‡ýèRªÞ[8ò€0Ä‹\¤6ÌcÌäĉ6œù±"†wEn&¥ÄÈ&R*CØ!-!Þ¹”je‘ JnÒøn9Õ:Î"‡8¹€° Â*« ¬‚° Â*« ¬‚° Â*« ¬:+¬rçĆŽPU}$UöB…ëÀu HìO±Ë!ÒÅ‚1§–S~ÓÅL‘ÐP6 §ŠË)W$pµ"2”^wõª´±d('ûfÁ G†$<ÇÚ3·«Nnx(•×mgrèC±Ço̯¿JeƒcÇŽ;8ö·àØûì‡Jýqìµ[õ‰ÞÛ¡º}ÍMAwkÏ‘“!¡Û É!9¢Ý" G´sš‹½†NUFÖ óJ“Úˆ($ÛÈêd(vDý4{ía£½®ó«ê±[L0††©÷.¨vÂӚʉ`$ÔFùZ5ß#q£¦\™„ó®ÈÍ4Lƒù)ÛAE›å:ψ !tKÐ-A·ÝtKÐ-A·ÝtKÐ-A·ô#è–ž ¥Ñ.LùÝ<^¤q¼ûýxBŒd묌Vd@ËäÍ™âUô8¦#AÇ·Ži<“€ µÊ³©œ)¯e¯ÜåmÍDP"…PSÊUž2VÝ“ÕMÙ¸r#K†*£[ „P24O›Ó¡ŸEÊä§·Ú]꺇BÃ4–…_AÅTLP1½Út‰õi²¦ßJÆöœ$QT¨‰ýpêUƤI(hà„¦lê¥CÖDuGn8UY2”9±U›‘š0]?’åmå‚Ó¡ï=l‚jAC13@Õt²fG1E›Éš š¨úenÐ{{ažÏ$Ê.:½NÖv…§˜rMeô”I"™=ä®·“שºÊš‘’0ðsC‚¶ÍPJ¡Ñ ó›â°ÆEV¸Xáb…Û~…+z¬p‡ê"¾°ï í-QÔ?l 2Ò¹ ¥~I¾—ˆËvÈÓoH(M˜‡ØÇ™ /OH(ÝãqʦW”èüØÁûà7~ú‡2¸ÙÓ_×4ÖÓÓ_WvÑòDŒq¸í\œ¬ã,­Rc´t´²„E·²m¡ËäMŸv(¥ †±OËÛX[›á°Tþï°¶NÃ#ÞØö•Ôlx@«®Üèñ~k]¿QWÁÑÑ›+ª8êê8º"Örxø J+:$¦Ûâ”Öu4¨ìh‹SZÝáÁžò¾U]'ÿn×Ѱ֣íEÕÔ{ UñÑÚ¥ªÊ,¨ûèü™õ¸¨¦Õ]§žÖÔ ¤‡‡5Ok #ú>Ác㟩 ñ ~®T£®Xc _ð Z_%Ò®N¤µÁ5Ñec{s‰{Éâ•9×Ú4es{»¦]@ËïMË]ðÊeï>+ó¿ç2À]À*$ð ènh¥~ÐJ¶d47«m( 7ƒ›Á͆p³ÝòßñÅ÷‘­®r ^/û˜^ö/ƒ—ÁË<†Œi´ÙÝ%éú3¼ÐÎÖóÃåàr#ºÜ#\.÷‰]®¥$§¤W@ón(Ì“ž¥ÒÀëm`q¸ŠãôëOÅýo‘Fë¯?ý?(Ò4gÉ·fifengine-0.4.2/doc/doxygen/000077500000000000000000000000001341615052600156745ustar00rootroot00000000000000fifengine-0.4.2/doc/doxygen/doxyfile000066400000000000000000002072311341615052600174470ustar00rootroot00000000000000# Doxyfile 1.7.1 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the config file # that follow. The default is UTF-8 which is also the encoding used for all # text before the first occurrence of this tag. Doxygen uses libiconv (or the # iconv built into libc) for the transcoding. See # http://www.gnu.org/software/libiconv for the list of possible encodings. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = FIFE # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. @INCLUDE = doc/doxygen/revision # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = "doc/doxygen" # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, # Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, # Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English # messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, # Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, # Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. OUTPUT_LANGUAGE = English # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is # used as the annotated text. Otherwise, the brief description is used as-is. # If left blank, the following values are used ("$name" is automatically # replaced with the name of the entity): "The $name class" "The $name widget" # "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = "The $name class" \ "The $name widget" \ "The $name file" \ is \ provides \ specifies \ contains \ represents \ a \ an \ the # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = YES # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like regular Qt-style comments # (thus requiring an explicit @brief command for a brief description.) JAVADOC_AUTOBRIEF = YES # If the QT_AUTOBRIEF tag is set to YES then Doxygen will # interpret the first line (until the first dot) of a Qt-style # comment as the brief description. If set to NO, the comments # will behave just like regular Qt-style comments (thus requiring # an explicit \brief command for a brief description.) QT_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 4 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = NO # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java # sources only. Doxygen will then generate output that is more tailored for # Java. For instance, namespaces will be presented as packages, qualified # scopes will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran # sources only. Doxygen will then generate output that is more tailored for # Fortran. OPTIMIZE_FOR_FORTRAN = NO # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL # sources. Doxygen will then generate output that is tailored for # VHDL. OPTIMIZE_OUTPUT_VHDL = NO # Doxygen selects the parser to use depending on the extension of the files it # parses. With this tag you can assign which parser to use for a given extension. # Doxygen has a built-in mapping, but you can override or extend it using this # tag. The format is ext=language, where ext is a file extension, and language # is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C, # C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make # doxygen treat .inc files as Fortran files (default is PHP), and .f files as C # (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions # you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. EXTENSION_MAPPING = # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should # set this tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); v.s. # func(std::string) {}). This also make the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. BUILTIN_STL_SUPPORT = NO # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. # Doxygen will parse them like normal C++ but will assume all classes use public # instead of private inheritance when no explicit protection keyword is present. SIP_SUPPORT = NO # For Microsoft's IDL there are propget and propput attributes to indicate getter # and setter methods for a property. Setting this option to YES (the default) # will make doxygen to replace the get and set methods by a property in the # documentation. This will only work if the methods are indeed getting or # setting a simple type. If this is not the case, or you want to show the # methods anyway, you should set this option to NO. IDL_PROPERTY_SUPPORT = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES # When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum # is documented as struct, union, or enum with the name of the typedef. So # typedef struct TypeS {} TypeT, will appear in the documentation as a struct # with name TypeT. When disabled the typedef will appear as a member of a file, # namespace, or class. And the struct will be named TypeS. This can typically # be useful for C code in case the coding convention dictates that all compound # types are typedef'ed and only the typedef is referenced, never the tag name. TYPEDEF_HIDES_STRUCT = NO # The SYMBOL_CACHE_SIZE determines the size of the internal cache use to # determine which symbols to keep in memory and which to flush to disk. # When the cache is full, less often used symbols will be written to disk. # For small to medium size projects (<1000 input files) the default value is # probably good enough. For larger projects a too small cache size can cause # doxygen to be busy swapping symbols to and from disk most of the time # causing a significant performance penality. # If the system has enough physical memory increasing the cache will improve the # performance by keeping more symbols in memory. Note that the value works on # a logarithmic scale so increasing the size by one will rougly double the # memory usage. The cache size is given by this formula: # 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, # corresponding to a cache size of 2^16 = 65536 symbols SYMBOL_CACHE_SIZE = 0 #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = YES # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = YES # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = NO # If this flag is set to YES, the members of anonymous namespaces will be # extracted and appear in the documentation as a namespace called # 'anonymous_namespace{file}', where file will be replaced with the base # name of the file that contains the anonymous namespace. By default # anonymous namespace are hidden. EXTRACT_ANON_NSPACES = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = YES # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = YES # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = NO # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen # will list include files with double quotes in the documentation # rather than with sharp brackets. FORCE_LOCAL_INCLUDES = NO # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen # will sort the (brief and detailed) documentation of class members so that # constructors and destructors are listed first. If set to NO (the default) # the constructors will appear in the respective orders defined by # SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. # This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO # and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. SORT_MEMBERS_CTORS_1ST = NO # If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the # hierarchy of group names into alphabetical order. If set to NO (the default) # the group names will appear in their defined order. SORT_GROUP_NAMES = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = NO # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = NO # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # If the sources in your project are distributed over multiple directories # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy # in the documentation. The default is NO. SHOW_DIRECTORIES = YES # Set the SHOW_FILES tag to NO to disable the generation of the Files page. # This will remove the Files entry from the Quick Index and from the # Folder Tree View (if specified). The default is YES. SHOW_FILES = YES # Set the SHOW_NAMESPACES tag to NO to disable the generation of the # Namespaces page. # This will remove the Namespaces entry from the Quick Index # and from the Folder Tree View (if specified). The default is YES. SHOW_NAMESPACES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from # the version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the program writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed # by doxygen. The layout file controls the global structure of the generated # output files in an output format independent way. The create the layout file # that represents doxygen's defaults, run doxygen with the -l option. # You can optionally specify a file name after the option, if omitted # DoxygenLayout.xml will be used as the name of the layout file. LAYOUT_FILE = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be abled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = YES # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = doc/doxygen/html/doxygen-log.txt #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = engine/core # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is # also the default input encoding. Doxygen uses libiconv (or the iconv built # into libc) for the transcoding. See http://www.gnu.org/software/libiconv for # the list of possible encodings. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx # *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 FILE_PATTERNS = *.c \ *.cc \ *.cxx \ *.cpp \ *.c++ \ *.d \ *.java \ *.ii \ *.ixx \ *.ipp \ *.i++ \ *.inl \ *.h \ *.hh \ *.hxx \ *.hpp \ *.h++ \ *.idl \ *.odl \ *.cs \ *.php \ *.php3 \ *.inc \ *.m \ *.mm \ *.dox \ *.py \ *.lua # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = engine/core/ext/ # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix filesystem feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. Note that the wildcards are matched # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* EXCLUDE_PATTERNS = */.svn/* # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, # AClass::ANamespace, ANamespace::*Test EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = * # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = YES # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. # If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. # Doxygen will compare the file name with each pattern and apply the # filter if there is a match. # The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER # is applied to all files. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = YES # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = YES # If the REFERENCES_RELATION tag is set to YES # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = YES # If the REFERENCES_LINK_SOURCE tag is set to YES (the default) # and SOURCE_BROWSER tag is set to YES, then the hyperlinks from # functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will # link to the source code. # Otherwise they will link to the documentation. REFERENCES_LINK_SOURCE = YES # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source # tagging system (see http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = NO # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. # Doxygen will adjust the colors in the stylesheet and background images # according to this color. Hue is specified as an angle on a colorwheel, # see http://en.wikipedia.org/wiki/Hue for more information. # For instance the value 0 represents red, 60 is yellow, 120 is green, # 180 is cyan, 240 is blue, 300 purple, and 360 is red again. # The allowed range is 0 to 359. HTML_COLORSTYLE_HUE = 220 # The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of # the colors in the HTML output. For a value of 0 the output will use # grayscales only. A value of 255 will produce the most vivid colors. HTML_COLORSTYLE_SAT = 100 # The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to # the luminance component of the colors in the HTML output. Values below # 100 gradually make the output lighter, whereas values above 100 make # the output darker. The value divided by 100 is the actual gamma applied, # so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, # and 100 does not change the gamma. HTML_COLORSTYLE_GAMMA = 80 # If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML # page will contain the date and time when the page was generated. Setting # this to NO can help when comparing the output of multiple runs. HTML_TIMESTAMP = YES # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. For this to work a browser that supports # JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox # Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). HTML_DYNAMIC_SECTIONS = YES # If the GENERATE_DOCSET tag is set to YES, additional index files # will be generated that can be used as input for Apple's Xcode 3 # integrated development environment, introduced with OSX 10.5 (Leopard). # To create a documentation set, doxygen will generate a Makefile in the # HTML output directory. Running make will produce the docset in that # directory and running "make install" will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find # it at startup. # See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html # for more information. GENERATE_DOCSET = NO # When GENERATE_DOCSET tag is set to YES, this tag determines the name of the # feed. A documentation feed provides an umbrella under which multiple # documentation sets from a single provider (such as a company or product suite) # can be grouped. DOCSET_FEEDNAME = "Doxygen generated docs" # When GENERATE_DOCSET tag is set to YES, this tag specifies a string that # should uniquely identify the documentation set bundle. This should be a # reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen # will append .docset to the name. DOCSET_BUNDLE_ID = org.doxygen.Project # When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify # the documentation publisher. This should be a reverse domain-name style # string, e.g. com.mycompany.MyDocSet.documentation. DOCSET_PUBLISHER_ID = org.doxygen.Publisher # The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. DOCSET_PUBLISHER_NAME = Publisher # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compiled HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING # is used to encode HtmlHelp index (hhk), content (hhc) and project file # content. CHM_INDEX_ENCODING = # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and # QHP_VIRTUAL_FOLDER are set, an additional index file will be generated # that can be used as input for Qt's qhelpgenerator to generate a # Qt Compressed Help (.qch) of the generated HTML documentation. GENERATE_QHP = NO # If the QHG_LOCATION tag is specified, the QCH_FILE tag can # be used to specify the file name of the resulting .qch file. # The path specified is relative to the HTML output folder. QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#namespace QHP_NAMESPACE = org.doxygen.Project # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#virtual-folders QHP_VIRTUAL_FOLDER = doc # If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to # add. For more information please see # http://doc.trolltech.com/qthelpproject.html#custom-filters QHP_CUST_FILTER_NAME = # The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the # custom filter to add. For more information please see # # Qt Help Project / Custom Filters. QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this # project's # filter section matches. # # Qt Help Project / Filter Attributes. QHP_SECT_FILTER_ATTRS = # If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can # be used to specify the location of Qt's qhelpgenerator. # If non-empty doxygen will try to run qhelpgenerator on the generated # .qhp file. QHG_LOCATION = # If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files # will be generated, which together with the HTML files, form an Eclipse help # plugin. To install this plugin and make it available under the help contents # menu in Eclipse, the contents of the directory containing the HTML and XML # files needs to be copied into the plugins directory of eclipse. The name of # the directory within the plugins directory should be the same as # the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before # the help appears. GENERATE_ECLIPSEHELP = NO # A unique identifier for the eclipse help plugin. When installing the plugin # the directory name containing the HTML and XML files should also have # this name. ECLIPSE_DOC_ID = org.doxygen.Project # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index # structure should be generated to display hierarchical information. # If the tag value is set to YES, a side panel will be generated # containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). # Windows users are probably better off using the HTML help feature. GENERATE_TREEVIEW = YES # By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, # and Class Hierarchy pages using a tree view instead of an ordered list. USE_INLINE_TREES = NO # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 # When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open # links to external symbols imported via tag files in a separate window. EXT_LINKS_IN_WINDOW = NO # Use this tag to change the font size of Latex formulas included # as images in the HTML documentation. The default is 10. Note that # when you change the font size after a successful doxygen run you need # to manually remove any form_*.png images from the HTML output directory # to force them to be regenerated. FORMULA_FONTSIZE = 10 # Use the FORMULA_TRANPARENT tag to determine whether or not the images # generated for formulas are transparent PNGs. Transparent PNGs are # not supported properly for IE 6.0, but are supported on all modern browsers. # Note that when changing this option you need to delete any form_*.png files # in the HTML output before the changes have effect. FORMULA_TRANSPARENT = YES # When the SEARCHENGINE tag is enabled doxygen will generate a search box # for the HTML output. The underlying search engine uses javascript # and DHTML and should work on any modern browser. Note that when using # HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets # (GENERATE_DOCSET) there is already a search function so this one should # typically be disabled. For large projects the javascript based search engine # can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. SEARCHENGINE = YES # When the SERVER_BASED_SEARCH tag is enabled the search engine will be # implemented using a PHP enabled web server instead of at the web client # using Javascript. Doxygen will generate the search PHP script and index # file to put on the web server. The advantage of the server # based approach is that it scales better to large projects and allows # full text search. The disadvances is that it is more difficult to setup # and does not have live searching capabilities. SERVER_BASED_SEARCH = NO #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = NO # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. # Note that when enabling USE_PDFLATEX this option is only used for # generating bitmaps for formulas in the HTML output, but not in the # Makefile that is written to the output directory. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = NO # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = NO # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO # If LATEX_SOURCE_CODE is set to YES then doxygen will include # source code with syntax highlighting in the LaTeX output. # Note that which sources are shown also depends on other settings # such as SOURCE_BROWSER. LATEX_SOURCE_CODE = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. # This is useful # if you want to understand what is going on. # On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_DEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse # the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option is superseded by the HAVE_DOT option below. This is only a # fallback. It is recommended to install and use dot, since it yields more # powerful graphs. CLASS_DIAGRAMS = YES # You can define message sequence charts within doxygen comments using the \msc # command. Doxygen will then run the mscgen tool (see # http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the # documentation. The MSCGEN_PATH tag allows you to specify the directory where # the mscgen tool resides. If left empty the tool is assumed to be found in the # default search path. MSCGEN_PATH = # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = YES # The DOT_NUM_THREADS specifies the number of dot invocations doxygen is # allowed to run in parallel. When set to 0 (the default) doxygen will # base this on the number of processors available in the system. You can set it # explicitly to a value larger than 0 to get control over the balance # between CPU load and processing speed. DOT_NUM_THREADS = 0 # By default doxygen will write a font called FreeSans.ttf to the output # directory and reference it in all dot files that doxygen generates. This # font does not include all possible unicode characters however, so when you need # these (or just want a differently looking font) you can specify the font name # using DOT_FONTNAME. You need need to make sure dot is able to find the font, # which can be done by putting it in a standard location or by setting the # DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory # containing the font. DOT_FONTNAME = FreeSans.ttf # The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. # The default size is 10pt. DOT_FONTSIZE = 10 # By default doxygen will tell dot to use the output directory to look for the # FreeSans.ttf font (which doxygen will put there itself). If you specify a # different font using DOT_FONTNAME you can set the path where dot # can find it using this tag. DOT_FONTPATH = # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = YES # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT options are set to YES then # doxygen will generate a call dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable call graphs # for selected functions only using the \callgraph command. CALL_GRAPH = NO # If the CALLER_GRAPH and HAVE_DOT tags are set to YES then # doxygen will generate a caller dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable caller # graphs for selected functions only using the \callergraph command. CALLER_GRAPH = YES # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of # nodes that will be shown in the graph. If the number of nodes in a graph # becomes larger than this value, doxygen will truncate the graph, which is # visualized by representing a node as a red box. Note that doxygen if the # number of direct children of the root node in a graph is already larger than # DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note # that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. DOT_GRAPH_MAX_NODES = 100 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes # that lay further from the root node will be omitted. Note that setting this # option to 1 or 2 may greatly reduce the computation time needed for large # code bases. Also note that the size of a graph can be further restricted by # DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. MAX_DOT_GRAPH_DEPTH = 1000 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is disabled by default, because dot on Windows does not # seem to support this out of the box. Warning: Depending on the platform used, # enabling this option may lead to badly anti-aliased labels on the edges of # a graph (i.e. they become hard to read). DOT_TRANSPARENT = NO # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = NO # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES fifengine-0.4.2/doc/editor_mockups/000077500000000000000000000000001341615052600172465ustar00rootroot00000000000000fifengine-0.4.2/doc/editor_mockups/geometry_tool.ui000066400000000000000000000650111341615052600225000ustar00rootroot00000000000000 Form 0 0 853 507 Form 10 10 831 484 0 6 0 6 0 6 <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><span style=" font-size:14pt;">Geometry browser:</span></p></body></html> 0 6 <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><span style=" font-size:12pt;">Load geometries:</span></p></body></html> ... Geometry #2 Geometry #3 Geometry #7 Geometry #8 Qt::Horizontal 40 20 Qt::Horizontal 0 6 <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><span style=" font-size:14pt;">Required information:</span></p></body></html> 0 6 0 6 0 6 <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><span style=" font-size:12pt;">ID #:</span></p></body></html> 3 Rectangular Point <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:12pt;">Type:</span></p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:12pt;">Size:</span></p></body></html> 0 6 0 6 0 6 <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">X:</span></p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Y:</span></p></body></html> Qt::Vertical Qt::Vertical 20 40 0 6 0 6 0 6 <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><span style=" font-size:14pt;">Geometry preview window:</span></p></body></html> Qt::Horizontal 40 20 Qt::Horizontal <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><span style=" font-size:14pt;">Geometry preview options:</span></p></body></html> 0 6 Update preview window Show geometry in fullscreen Qt::Vertical 20 40 Qt::Vertical 0 6 0 6 0 6 0 6 0 6 <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><span style=" font-size:14pt;">Optional information:</span></p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><span style=" font-size:12pt;">Transform:</span></p></body></html> 0 6 0 6 0 6 <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">X:</span></p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Y:</span></p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><span style=" font-size:12pt;">Shift:</span></p></body></html> 0 6 0 6 0 6 <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">X:</span></p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Y:</span></p></body></html> 0 6 Qt::Horizontal 40 20 Qt::Horizontal <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:14pt;">Save / apply:</span></p></body></html> Save selected geometries to active map Create new layer with the current geometry Apply current geometry to active layer fifengine-0.4.2/doc/logo/000077500000000000000000000000001341615052600151575ustar00rootroot00000000000000fifengine-0.4.2/doc/logo/FIFE_large.png000066400000000000000000006062321341615052600175610ustar00rootroot00000000000000‰PNG  IHDRÎÖRYsRGB®ÎégAMA± üa pHYsÃÃÇo¨dtEXtSoftwarePaint.NET v3.5.100ôr¡ÿIDATx^ì¸Uºµ'È9I0¢ IQ¢"( ˜ÅœsÂ,"¢( DD ŠädÎbBÆ1Ç1£sïýgîüýßÚU»zwuuŸîsº9ÕÝëžïÑÿŽúT­®ðîµ×ú•ˆüŠÃc@ PÔ@Õ5ðàÛ¿4Õ9[çE.U9¦úç—êÌÐé­óëªü,þÙªŸ[CCj€ ¨j€ ¨j€ ¨j ¼4@hÎ…j€ ª …ÚõuNÒyRç_:âO·ªÜPõglp~Ö—úï·èt¯ÊÏäŸ-¯<Ï7Ï75@ PÔ5@ PÔ5@ PÔ5Py ˜U˜Qx•]1k@vm£uÔù»¸-4Ç?ó ÎÝŸû¡þìëuv+æcÈÏÎk5@ PÔ5@ PÔ5@ PÔ5@ ÄYççÔ5@ d¡ÕÛ릳\ç¯i`ùÖçîß±E?Çxâ|£ágãƒ5@ PÔ5@ PÔ5@ PÔ5@ ›̲fÅvRùyy!¢ò£Ò¿Óª³H翳€å[œ»ß+úùÎ×iÁóŸŸóÏãÈãH PÔ5@ PÔ5@ PÔ5@ ”¯ΠΩj€p4 àù7:ûëÌÕùSް¼:Á¹ý»ÿ­Ÿù9Óuñ_¾7xž{ž{j€ ¨j€ ¨j€ ¨j ò 0#4¥¨j@5 ¹—Îí:ßU–Çœ»ŸáŸú»<ªs¼N]Þ,+³ä±ã±£¨j€ ¨j€ ¨j€ ÊKf„¦Ô5P¶P˜ÜUg²Îy‚åqçîçù›þŽktÆèÔä;¼nö<ß<ßÔ5@ PÔ5@ PÔ5@ PÔ@n([`F¡ä&/¯RÑ€Bã:×éü¾°<ÎàÜýlÿO÷%:#t¶-•sË߃×)j€ ¨j€ ¨j€ ¨j€È—Îé6¦¨’×€Âáu.Óy³À°¼XÀ¹û9ÿ¬ÇäÁ:¿Í×Í…?‡*Ô5@ PÔ5@ PÔ5@ PÔ5PÌ(y`VÌ'‡Ÿj òPÜ\ç<:ÿÙŠÀÜBénU9úy7TÃgþQÿÎY:ýt~]•ÏÏ?[yíòØñØQÔ5@ PÔ5@ PÔ5@ PÕ¯‚sº©j d4 °·¡Î©:Ïèü»Às1:ÎÝÏìþû×zünÓéÁ›uõ߬yx¨j€ ¨j€ ¨j€ ¨­«’fÎÖ7w\4 `·ŽÎq:èü£šay)s÷wùDëDNq9ïü¼QÔ5@ PÔ5@ PÔ5@ PÔ@!5@pN·15@ àÖЭ³JçÿbËKœ»¿×»z¼¯Òi[È›6~¨j€ ¨j€ ¨j€ ¨j :5PtÀ¬:ÿn~Y©êÓ€‚Úmt†ëܯóÿb ËËœ»¿ãf=é´âw£ú¾<ö<öÔ5@ PÔ5@ PÔ5@ PÔ@þ5@pN·15@ ÄV d«s€ÎÝ:¿,/7pn_”¯¾ s–NÞ¬ó³æ1å1¥¨j€ ¨j€ ¨j€ ¶®b Ì(„­+oï¸h@Áë¯uúêÌÔù¡È`y¹‚s÷÷þ—ž³'tNÔ©]ñsðG PÔ5@ PÔ5@ PÔ5@ P¹h€àœncj€ˆ…²î©3Eç«"†åçoÿ⃿ë¹\¯s”N­\nNüoù0C PÔ5@ PÔ5@ PÔ5@ PÕ©X³ê<ü»ù¤ªO S;êÜ óq‰Àr‚ódpî¿ê9^¦s¨ÎvüÞUß÷ŽÇžÇž ¨j€ ¨j€ ¨j€¨XçtSÔÀVÕ€BÓ]t®Ðy§a9Áyzpî›ÿÒs¿Pç ßñf]ñ͚LjLj ¨j€ ¨j€ ¨j€غتÀŒ'wëž\oï¸h@áhK u^-qXNpž8wÓOª‰;uúëü&.šåçàõ“ ¨j€ ¨j€ ¨j€(o œÓmL PÑ€BÐÆ:gè<¯óï2æ w«Ê V׆2ÒïÏÝùÐć&j€ ¨j€ ¨j€ ¨j ü4@hZBД_àòûãœ+ØÛ^çp:ÿKX^­°œà¼tÀ¹{.ßÖïÕ:;ó:[ž×Yžwžwj€ ¨j€ ¨j€ ÊOççÔ@j@Þ6:Cuëü7ayl`9Áyi‚s÷¼nÒïÛ:;ð¡©üšxÎyΩj€ ¨j€ ¨j€( š!4å´|¾ î¹VP÷:wéü‰°<–°œà¼ôÁ¹=ÇÿÖï \O×iÌëry^—yÞyÞ©j€ ¨j€ ¨j€(] œœS1×€B¹^:3t¾#,=,'8/pîžëêwó1têò¡©tšxnyn©j€ ¨j€ ¨j€( šÆšòËX>_Æ»¼›¸›u¾ ,/*XNp^žàÜ=ïÓïìZ1:5y /Ïk8Ï;Ï;5@ PÔ5@ PÔ5@ Pů‚s‚sj &PÈÖAçz Ë‹–œœ»ø‹~—Щ³-šŠÿ¡‰çç ¨j€ ¨j€ ¨òÑ¡iL )¿tåó¥ 9ËwR v¹Î[„å%Ë Î Î] ¸ÿþgýŽß«3Xç·¼æ—ç5Ÿçç ¨j€ ¨j€ ¨âÑÁ9Á95°•5 Ð¬…Îù:¯–—,'8'8OÎÝÿûúÝŸ­³¯Î¯ùÐT<M¨s´N-Þ¯Ê÷~ÅsÏsO PÔ5@ PÔ5@ PÔ@þ4@pNpN Dh@áSG‰:ŸäJ·$ãßS@–à¼8ÎS©}Ÿþª×¬å:‡élǦü=0ñXòXRÔ5@ PÔ5@ PÔ5P^ 4%8§| (dÚEçJwËé,σΠΫÊÿ·êx‘ÎPßñ¯¼ðx¾y¾©j€ ¨j€ ¨j€¨šM ÎËZ “Zê\¤óZ@iuC2þýñµçñ:åþýø“^ãæêì¯ó>Ï;Ï;5@ PÔ5@ PÔ5@ “Îé8ßêPhÒ@ç§uþUB ”€.€..çàœzˆ‹ãö9¾Òëþ=‹é‰Ÿ•øÔ5@ PÔ5@ PÔ5@ ”—¶:4¥ÀÊK`ö|+ ©­sŒÎC:ÿ ,§³¼ 4@pNp7`ÇÏó±^ nÐéÈçƒò|>àyçy§¨j€ ¨j€ ¨¸j€àœŽó‚i@AÈö:£tVêüo€Ò8B)~¦êƒ·çÕwì©ûâ<öoë}â ]âúÐÄÏÅzj€ ¨j€ ¨j€ ÊGƒ¦QùˆÈ=× <¶Ñ9Xg±Îÿ–ÓY^Æ 8/NxKèóöª^;.ÔiÉç‰ò|žàyçy§¨j€ ¨j€ ¨êÖÁ9çUÖ€‚ßè Ô™§ósƒR·x·¸œ‚sê!.Z,æÏño½§lÐ9C§qu?4ñïçƒ;5@ PÔ5@ PÔ5@ På£*CSŠ¥|Är–ÿZ!Fo:ß–ÓYN ¤h #8¯ÑòÚßdº~ú°°˜'?;ò­ê÷âqq:õøüQžÏ<ï<ïÔ5@ PÔ5@ PÔ5°µ4@pNÇyNPXÑ]ç/ J Ë©ŒHç5Z^÷[Ãu6èü¨sƒN‹¨ >Á9¿_ü~eÔÀßôø¬Õ«Ssk=4ñïá:5@ PÔ5@ PÔ5@ P壜 )…Q>¹ËwS0q½Î‡9„yÔ@ÖÀyV×7йTçK Í?ôÿ¿D§gè{‡xŠ|;vùóxLKQÑïÊRCt¶ã³Jy>«ð¼ó¼SÔ5@ PÔ5@ PÔ@¾5@pNÇy¤>ì¤3^g áá%5P) t«ÑúúŽ:suþª#YÌ&ýoŽÖAÉ.Á9!w)BîBÿNÿ¥ß{u†èü.ßMüy|§¨j€ ¨j€ ¨j |4@pNph@!C óu^!(­(-4âÏ/º~ËÏrÝÝoHãÝoV>Aay¥æ»Qç¬ÿâ¾ç¿å9/‚sÎëel¯—Ôs3Gg?_óá¶|ny®y®©j€ ¨j€ ¨j  8/sp®0¡‘Îé:Ïéü›(¶ˆ5æuù+?È7<+;õ¼]j´QXž‡©ÛöF9èÄ2cÍG<ÿ1?ÿ¼vÆþÚù=GSuöÎÇéj€ ¨j€ ¨j€(} œ—!8WpPWçxGuþIà{àChchz×£ŸËag­“†&KÍo(Øì9ôn¹rÎk²öÍ?Q1Ö¯§Eq=ýLÏÓ$Î|Ð-ý]žcžcj€ ¨j€ ¨j€¨¬ÎËœ+ ¨©3FgÎßwŠîÆ®ßò‹L\°Eú¾Xjí4QayhðËׄ~v뽦ËÉ×<%K^úŽúˆ©>x}-ªëëûz¾®ÖiWÙ)þ9>„SÔ5@ PÔ5@ PÔ5Pš 8/ap® `[:KtþB˜ST0‡P4†PtÅ«?Ê9“Ÿ—v}gæŒW°×ßu² ?uµÌzðj%†Záõ¶(¯·¯ëy»D§5zKó¡—ç•ç• ¨j€ ¨j€ rÑÁy‰s}áÿ­Î`{tþLxS”ð† 4f tþ_Êèó”ƦHÍoŒÝì=r\s×ë‚bR~çù§ª¬ÿè1|Qçlf¹)5`É߇¾:5pïÓ_Ë‘?*M»Ü–˜·½IjÆmÒ€öZm'I/-0pï[ãB}U§¾øw—œþþWÏé Ãu¶çÃpq? óüñüQÔ5@ PÔ5@ PÔ@”΋œëKy[«tÞ%|)9øB'k5;Yoyà=pì2©Ý~r•€x­v7Iú™¬ÿ[6“égT ØïÒo¶œuÓó²|ÓÔ\5kŽ×ñ’»Žÿ·žÓE:Cu¶á7¸©j€ ¨j€ ¨j€( œÇœëËw+‹t6²”d!¸¬fp¹úõŸä¢é¥ã y‘°<€g¼ãößx>Êßh[åðó’yAV³ym/ÉkûŸô¼Þ¥3@ç7|X.‡ežGžGj€ ¨j€ ¨j <5@p#p®/ÙMtÎÒyAç?„*% U+«V.|î9æòǥŞÓ}wx–À[Ýèµ2ÎÍú¿o­ÉðY²rµãw¾Iö7I¿±KäÆEo3Æ¥5Éë|I_ç¿Óó{»N/>d—çC6Ï;Ï;5@ PÔ5@ PÔ5PÜ 8¯fp®/ÔõuNÔyRç_„(% QÍ« PN]ñ{´‡û®ûÏ•s§¼$(Få5ˆ× j  øBëÍ:Ýøà\ÜÎ<<Ô5@ PÔ5@ PÔ@ùh€à¼À¹¾8×Ò9Jg½Îß ) )« RÇEÏkÞø“\6óUérÐü·x0žWø¾kH_ÕÉæïÉæ3g„ì °Þ¤ëTsÑ#2ÿ©¯øý)óïO\¾Ç%ú9>Ôßë:|à.Ÿnžkžkj€ ¨j€ ¨j ø4@p¾•À¹¾ o§s¨Îr¿–( l#l«v Ü÷ü·rÂUOI˽OI š#`xNà{Š‚òì§öî·æôßçáÓ÷4.ùX¯­¾ÿ1Keò’÷ªý|òZÉ…Å×À[úû]®³¢‹ï!šçŒçŒ ¨j€ ¨j€(m œœë‹ðïtÒY¨óß%þòOÀFh^­¸}ÍGrÐ)«¥Þî ¯³…ãiÁx¾›þß«0u:Þ*ýO_'7=ýµ,üô¯rüm¥eßÙUú™æó¤ö\ï)p=ª+Pßí€yrá´²j3c\x 'Ä/°^ÑŸžN >|—öÃ7Ï/Ï/5@ PÔ5@ PÔ5P 8Ï38×Þßèô×™«óS_²«Tòw#Dªn ¬}óOrÅ›¥ûˆ!Xî¸Ç#áxlÎ ˆ«[|·ÄÀ=žiší3SÆÜ°Aîzï¿dõŸþ“4+~ø—\²ô}é:êþŒ?Ã8Ô¿Óû÷A~ `OÖ“ ºÔ›íu»}Ùã²à™¯yÝá"5PX ü[¯­ÏꜦӈÔÅñ@ÍóÄóD PÔ5@ PÔ5@ ”žÎóÎõå¶§Îto«&òï'Ð.u ,yé;9éºg¤u¯Y‰¼ñŠyVÙƒÓðlÿ÷]‡Þ+gßó–,ùæï²ò§W8·<ÿtîCR¯óÔ¼|†dÐ^dO‚ê@݇éuàp ¹uù„§……§<¾<¾ÐÀ?tÕ9N§.ÄKïAœç”ç” ¨j€ ¨j€ˆ¯ΫÎõ%¶‹ÎM:Ÿ—:¨äïG Ì\ÿ‰ ;cÔß㶈âMÇEž’WŒw¼Mjg9u:M•~§¬‘ëýBVüøïJÍÝüuó‹²CŸ9Yÿ½æóUà|ÿï °žªgê{t\2c“¬~ý'B^B^j ðø?½¯Ö9B§®ãûpÍsÃsC PÔ5@ PÔ5@ ”†Îsçú²º«Îµ:Ä$ò3h—ºÖ½õ³\=ïMéqØb–û<€S6?å¿ÉÖ¹ž¨§ƒé]†-Ëgo¸–ºfùûñº# ü Ÿe–N__ó½xÐyîxî¨j€ ¨j€ ¨ê×Á¹Îõ%³¡Î):Ïèü;F/ÂO[ϹÇc] Çzý–Ÿåú{·H¯#–„`ynòŒ<@îè ÿÞhï™2üЧeê¦?ÊýøgµÎu¸Ÿ1‹t¾( Wô»d³`DÐdˆƒIÓà ½eïY2îÚgäþ¾åw«¾[¼•5ÔÿZÏÿ­:{ñ»ú¸yx¨j€ ¨j€ ¨âÓ@Ùƒs}¡¬£s¬ÎÃ:ÿ d(kÈ@°·•ÁÞòM?Ê™“_]úÏõyP^$¯W”íÿ®nòÚÁh,Jçé²Óà{dÜ›eÞ‡‘û¾ùGìæšG¾¾§®“:]n7Ÿ×ÿ÷Èö÷®èøUÓ+éõ;O•¡§¯•ë>æ÷l+Ïx_ã}M5ð±ÎDŽ|X/¾‡už3ž3j€ ¨j€ ¨j z4P–à\_kèŒÒY¥ó„ „ ÔÀÖÕÀ]!‡_ð°4êv»ó4°<-(¯ {<Pã Øl¡³÷ϽŽ]!—¬üH~õ7Yôõßc?Ó6ÿ$‡hAi“^ãôäß)g°ž ¨gŠzÉÒ÷)“Ÿÿ^~ù÷¢8ãO¾óMiwðÂà÷ò~?ïwÍ|L²pªW¦G€ôÖ}çÈÉž“^úžµz*;ûkz¾P§%Ü‹ãÁç‰ç‰ ¨j€ ¨j€Øz(ip®/‚¿Ñ¨s·ÎÏ„·„·ÔÀÖ×ÀŠW”s¦¼$í˜'µÃð4–gp”§å8ÈÃpÜBr÷Ÿm˜/ÇLÛ$³Þýo¹÷‹¿•ÄÜóùßä²µŸHÏ“ÖHÝ®ÞÂ@úɨgZ¨HÓÓ¹Ò- vÄÙÊì‡>#È%È¥ªG(A^çL&|ßzâ<Ö<ÖÔ5@ PÔ5@ PÔ@|5Prà\_ø~­ÓGçï J·>(å1ç1‡æ?ù•Œ¹ø1iº×Œ0Ï+(O½Ùò:ÈÁÌ®G­ó–| wúÐ\ªsóË?ʰ+Ÿ‘Æã’| 2ÃôÌuu§§ƒéQ = ˆ¾Ï¨ûåÚùo cy-ᵄ¨ üSû:ãtêñ!>¾ñ<7<7Ô5@ PÔ5@ PÔ@a5P2à\_îºëLÑùŠ/ÚÕò¢MÈU=.ÁØ÷›–¼'ý]®q,·yÀ<Xa3¸É݈•'u×é:C±7 4Žeà…ÉõOÿÁórš™ê¨?nÆfÙùÀÁñpMTOëPÏ›^Uî;ÑwÞïN9}Òó²lã±Ó8ï1¼Ç”‘þ¦¿ë:#ujñ¡¼°å<¾<¾Ô5@ PÔ5@ PÔ@¼4PÔà\_âv×™ óQ½Ä"PÇN+_û£\0m£ì6x~Xž&~%Pž$OÀñwÓÿ›?-Ü-cnÙ(ÓÞø³ÌûäÿÊzîúøÿä‚eÉ^ǯŽ9NÎCâß—~$LϤçàFoÔmºzÞCr磟ÇN÷¼ï —™þª¿ï2Ct¶ã}¼èy>x>¨j€ ¨j€ ¨ük èÀ¹¾¬í¬s…ÎÛeöÂJhD`; ÜûÌ×rÔåOH³wD8Ës…åÉð5-(Ïà$·€<ñÏ; ß!{±LÎXø®Ìþý_dîÇÿË ƒžûN†\ú”4ê©1.z¼RcP÷az!@zT¤‹:Ñ{y@&,|[c\lyÿ£ªYÿ¥ÿu~Çôü? ó˜ò˜RÔ5@ PÔ5@ PÕ¯¢çúR¶ƒÎ:›ªùE1và’ǃð¤:40eÙ2pÜJ©»‡Âñ¤(–,a¹‰_É”‡à­ã$÷@¯ÉÍt¿Cêï=Kö;÷¹ò‘/åÎÿÊÉâL{óÏräm›¤Í{Í14ׄs?ëIîôL®ô(Gzš|ô°=¢·p—œuË‹²|Ó¼&sA‘¨~ ü¤÷¡;uöÓù î«ÿážç€ç€ ¨j€ ¨j€Èb Îõ嫱Î:tþ]p'¡45ÐÀê×’‹gl’NCïMu—GEo„cX²…åNqgRlH(O†ääUÐÛbÿùrØ/ÉͯüIæåTâÌ|ÿ/rÖâ¤ë1«Ý‚ôL0= ¤gåH¯Do¬Å³£.|Dæ=ñ%áiõÃSžžhà:Ótöáƒz~Ôyy©j€ ¨j€ ¨êÓ@¬À¹¾hÕÓ9Aç1Z\SÕ¯…ÏýA޽ò)iÑsVÅîòÊÀòtÑ+Q Ü…·æßg³Û¨ääyoËŒwþGf}ðNžŽÁÕ#.zB Æ%8Þ¾½"WzV =•}ŸÁ‰^§ÓmÒïèerã}ï2Æ…ð–?>øLïá7étæƒ~õ=èóØóØSÔ5@ PÔ5@ P•×@µƒs}¡ª©3Vg­ÎßJ«”òð@SW~(ƒO^-õàâX"¢X*€å‘YåQ®ò\@ùž Ìuêí=[úœù°\²ös¹ã½¿p x nÞô³Œš¼QZ Òÿø» ®ë?2Þ¥P=å²ë »å¼Û^ÖòZÆk5 ¼¯çâö|h¯üC;5@ PÔ5@ PÔ5°u5P-à\_œ¶Õ©ó€Î_øb›[‚¦ø8õªå\¬yãOr٬פËð…Éîò°Ûw«ÁrßQnA­ÿÏfýï–á×>/ŸÿQf¼ûÿ8[ñLßò?rÊ=ïÊc—'zA@z؉ç’Á…ÞT kÇ\ò˜ÜóÔWÕò]â}÷5j ­ÞÐcs©N>ôo݇~ooj€ ¨j€ ¨j 7 l5p®/H¿Õ¢s¯ÎŸùBI¨@ ÄG÷½ð­œpÍ3ÒªÏìÝåá‚O-ˆt3­ÃÎò ]åÑ Üs8Ï’ö‡.‘ãf¿)·¾ñg™®‘,œê=—>ø…ìwÞc^Œ‹žŸÀ‰žÒh—¨²Ñ Ýè9BtÇ…^GázÿãWÈͼO€^æ ƒ¼çÄçžãŸ‹ÿè?_Ò9G§às{€çñâñ¢¨j€ ¨j€  ¯‚‚s}úµÎ¾:³uþÈ—ÖØ½´$•9Hº}íÇrÐik¥~— q,¹ºËóËgIݽfI}céyêƒrÞòOdšº9ñ;7¼ðG9䆗d‡÷˜sæAô\@ú ©cUÂ=¥\4ÑÃúÌàBßýÀ{äÂé¯ÈªÍ?ñÚWæ×>>Äîyä_zNžÖ9E§_ ÿÀcÌcL PÔ5@ PÔ5@ T¬‚€s}éé¡3U羜Æîå”À¨ÌÑÚ7ÿ$WÌ}]º²8û8äœwNË”Üòœ`y:W¹Êí4Ýwžxå³rÍÓßÉmoý7§ŽÁ-›ÿ,'ܹEvµ4é\æÑÕžD¯¼ ½ù>3å¨ËŸÏ~Ãëa™_ùŒËg”èyyHçÚ|˜¯øažÇˆÇˆ ¨j€ ¨j€(ŒòÎõåfu>å‹h,_D ˆÊ-yé;9yÂsҦߜôq,ºË£¢XÔ-l]ÂA à§ÏÑ=;XhÞvÄ}räôÍr“–QÞúæsŠô\°ê3é}Æ#RŸ9I=áH÷ ^ÍX}tGºD9ÑUƒX¨Ir¢çàBwb\êî1U·Jn]þ{^ËüúÈç–Ø>·ü¯ž›•:£t¶çË@a^x\y\©j€ ¨j€ ¨h T œëKL;«uÞãKgl_: „ÊÍ|ðSvæziÐUábÇÛü™*µÝH‹`^‘»<¿°¼^9²×IëäÌû?”)oü§„ŽÁ5Ï|/k‘kóýç§ô¼@ôL;%\m§Ä¸ØïÃm²ÇÁ ä’;^•Õ¯3Æ…÷sÞÏcªÿÑϵXç`mø`Ï—;j€ ¨j€ ¨j€(´rçú²ÒZçbÍ1}±"(.sPL]þ"ëÞúY®¹ûMéqø}Éq,pÛ¦æ™âX*ŠbqÂp['±ÿO7‚%ñï³¥I¿yrÀeÏÈåþAnÞü_œ>“^ùE޾ãM-x}@úìÊAôp±h‡^‘ ={€¾C¯YrÜUOÉ¢ ང÷j ¾øYïõótêü¦ÐËüù|!£¨j€ ¨j€ ÊSYs})iªs¶Î‹:ÿ!˜¤ˆ§–nü^N»ñyÙiß;«ÌŒ´ÀÜaÁ¿§ÂräZ§s¦=fËN/–QS^• Z*9ùµ?sÊìœõÀG²·¾ÖCŒ‹ê! ¤§ä¢‡ã\ DOåRé—„½ž.$ 9eL[ýái|á)Ï Ï 4ð½Î Þ:¿æ My¾Ðð¼ó¼SÔ5@ PÔ5@ BiÁ¹¾|Ô×9IçI”Æ”ò¼ð¼@sùLFžó4êæÆ±fç0.ûôãXrÊ-OËëî=[º·FN¾÷}™´é™ô*§ÜÁåýA_ñ¬4í·ÐÓBôÐÂŒèþâMÖ.ô\rÐñF]G,”ËçlëòšËk.5k |©ççî…xhæÏäË5@ PÔ5@ PÔ5P^Hçú¢Q[çhuþΗÃX¿à”¹Óný–Ÿåú{·H¯#–HíÝo­”Ã< ˜gr—‡‹>“¢X2Àr¡ûÞ%ý/|J.\÷¥Ü¨qƒ°®á'9â¶Í²ËˆûÝ@ôdmåË…^»³ Ñ3ĸ Òõ;Öª÷lwí3rÿ ßòú[æ×_>Åóчzž®×Ù/7åõrÃóÍóM PÔ5@ PÔ5/ ü ÛZuÓY®óW¾ ÅË ¡MC›e¯ü gN~Qvé?7G`ž¦ð3«88|“]¿ébX¬s¸õ‹dä¤rÕ3?È æðd¥S~ ÝO\/õööc\rŠrÉÂ…îĸT 7è2M†ž¾Vf¬û„×â2¾óy©¨ž—¶èù¯³C¾ ùsŠûeìW¿úU738<E¢Ñqºæè1;,&Çmdu=crx-ãõ< Sßûwëwæx~oxï-" t€vã\_$þÌÀ¢z$¬)CX3÷±/äðó‘ÆÝoÏ#0Ï"Ž%w9 ùG¯–ãæ¾#׿ô'™ðòσJiࢿ’—>#Möub\" zN.t·L4.ô=],WÞõc\ÊðšÌ禢|n‡—F~†ê‡îúÂ6^Gß„8<E¡-qºn¨f6ÅD7ªó¸øà‡×^G‹E_Vç÷Åç?ÄäúQ,石z¯1æÝÁ‚óçøX”/€è%kÖoùE&.zGú¹TêtÔ8D²$ŲT"ÃÜ8Ì« Ìý'ýsÒßôþŽÐºú¡uÎç×E¶xApNpN G WU œSCUÕP9þù$p~ _‹þ…¦ Íü'¿’Ñ=*MöôãXRæZRXp`.ûLv—×í1Gv³BŽœù–\ýÜåšçâðlU œ³êsÙ÷‚'¥Q¿y]èÑ1.èöûªÿ¬µÛ­²÷á÷É5w¿)ëÞú™×ç¸>ó9©èŸ“6ÇØò3ÄÜœœœWþ»È¨ïØ1ª…ב"»Žœœ—#ø®êïœÎwç aÑ¿Ì1˜¹éþ÷dßc–w9€[j$‹s8\-4/ˆÃ<30oÐ{®ô<óQ9mÉÇrÕ†?rx ª]—>þ­ ›ø²´>h±t§LԸГõ\ÇÍê7»+ò Ðñõ'  O‘ö½SN»ñyY¶ñ^§‹ø:Í礢Nº‹Ðºò ¬ÔŽÁ9W‘/:Îé8¯*üáŸ'4%8§xÈ]Iàü7úBøW¾ýK!¡LA™•¯ýQΟºQ: º[aù30Ï:Ç|º‰eÉ9’%cá§ë0Ÿ#-X ƒ¯z^.|è¹òÙ?rx b§+žùQŽšý¶t:zUº÷]óƉFÂ"–]ÐJß‚Å0|¿v&‡œóÜùèç¼VѵšÏF%óltF©Á_þ>•_ 8'8'8¯Ò÷‡å tœÀåàªû˜œß9«nÍðïÿÕ¯àÞúb¸‘/‡%órH(c(sïÓ_Ë‘—>&M÷œó´.ó´±, ˆW§‹–}bLé§_ü‰üf3¾«Ö¸kÕe› ˜ûEŸuÍ?çHûQËdÔ´×å²'¿—ñ &9<Å Ó—~"½Ïy\ö¹«‚çû“= @O—rŸ›E²S¤×÷Ëõ÷nóÞËc@ l ìCÐ\yPVjÇŽàœàœà¼ò×Fµ0ª¥È¾?„0&8'8çw!w ¤€óY|qÛ*/n„$1†Ú…üܲô}pür©câX<‡y0Oç2OËâóš»ÅŸ•æõ{Ε½N}XN\ð{¹üé9<E« t‡Ä×¾(-/,<@O[ šßbÝç ·í§œ9ùY¾‰1.…¼þòg—ýóÍ?UÛ—üåïS%ð7žà‡ð¼ˆ4À¨Fµxå¼xÌ’Á95ÄïDîHç'óŲì_, õó õW¿þ“\4ýé8d¾ºLo1NÓ̱,iÊ? áÇDdŽeQ`¸Ì‘ãìºÌCæŽÃ¼Ù€{dÀåÏÉÙ«¿”KŸüÃcP2¸äñïeôô7¥ƒÚ&å ï•œƒž}º¿³Ãßé‘S|K÷9® »M“ÃÏXæ=þ¯Ãy¾óÙ†Ï6ªw™+™KñØÑqNh^DРƒàœàœÀ+wàÅcFpN ð{SU ¤€óî|¹äË%5 ,|î9füÒ|/c óÜË?«šcž˜ïrÈ2òæWå¢G¿•KžøžÃcPÒ8qч²÷Hƒ^NŒK®½«¿³±H6&©K6ñ-»Ïq­¨­Ó÷ÈäÆEï0Æ…‹(ùÓÀ¢R„¿ü*¿@pNpNp^¥ï3Ιq^UÅ?¿õ&ç[ÿ˜SçÅÌSÀù¶ MÿNpšpÊãXžÇqêÊßË q+¥îîê,ßól\æSå‚ÈI¶±I.óˆX– sÌ£yý}æH·×Ë1óÞ“‹ÔËá1(7 œµæ+xÅi1pA"Æ%€ŽÝf,<Ç?Óô¨ø·<4ƒûÜ\7ôúÑ~À\9wÊK‚"aÞSÊóžÂóž·ó~>!så!Y);‚s‚s‚óÊ_˜qÎŒó"ûþ^2ãœ(~€]]ç0œû¡oð%-o/iùsŠÅúX®yãOré¯JçƒîQØu³ÌÓ@óŽŽó´‚òÏ cYLég¸ø3˜7ÙïnÙ÷¢§å´eŸÉ…~Çá1({ œÿð·rÈ”ÍÒî°e‘½Îž³…º9ˆFÆ·$•‡fç>7‹ozMiÒ}šŒ¹èQ™ÿÔW±¾òùÏ1ÖÀ¾¥ù;U ü1ãœ/ÑÕõ^™¿—Q-Œj©Œnøgxs5@Ç9õÀkBîˆçócüÒC`P& ºX4¸øù?ÈñW=);ì­q,˜»Ð<‘eÍâ¸Ì+*ÿ„£ÕÆC¤¸ÌÝ ó™Rw/šk†³æ˜ï4ì~9xâ+rîúoä‚G¾ãðP8öî¤ûÉJýžwzÝù.eÐ ç>Çõ¥¶‚ôþG/•É÷¿Ëû!ï‡Ô@öø>WÔ!d®ô-‡Ç€¨¤Î^÷ ›´Iv¹DÝçaº¿ÓÃÄ·`œìó ÿ¼îs?ºÅìn1× ÉÒ¬Û49êÒÇdÁ3_Wù:Çû?ïÿ%ªe„Ì•d¥zìΠ΋ üÑqNÇùÖEü»J°œ—æyå÷µ°ç5œ×Ô—¦•è‹¡ÂVÍ¥¢¡%/~''^ó´´Þç˜ûÐGOB°›Åô$x®îs{jw“t4O.žþЬ~ý'TBtjàí_U'Xáß]y8WÈcGpNp^dÀ“Žs:η&(âßUš€•à¼4Ï+¿¯…=¯iÁù}•…üsÕŬuoý,WÍ}]ö±@j¶½ÉL44Ï6š¥0.óF}æÊÞg>&ÇÜû¡œ±ö5°•5pêʯdðu/ËŽßçt7¾ÅV²½*îsù¤ÿ¬žcqÏtïúÕ¼ût9öòÇeÑsßž —³ÀògÇŒWt^Î Î Î+ÿÝeÆ93΋ìûC°èE‚óÂVê¬4oZp~a1ÃO~vÂû\5°ôåïå”럑6=g8ÀÜ…æQyæ6Ë|J"˼¢h–*d™ÃeÞrðpÅórÒÒÏåôÕ_sx ¨hà°éoI§£WK½³%2¾¥JîóÛqO>@O ÏÜs»àgë(P| ™ºâ÷å Où»—çâÁWTþgÅ|ìΠ΋ üÑqNÇ9¡\iB¹­y^ Ω¡­©·Rù»Ò‚óýsüï «‹QsúTFœ¾Fì~‹ÔÜeR*4G³ ÁijD@ó £Y*Ÿe¾ë+dø-›åÔU_sx ¨˜jàè{>’}Î~\÷½KzÝçu犽¾ðÜuŸû×¥ˆÜst ÏÍ5N§ËwËewlãu›Ÿ™Ï9j`m1Ã]~öÂA}‚s‚s‚óÊ¿è8§ã¼È¾?¥ðªú{œœWUCåøçÓ‚ózúRòŸ_Lø^žN®¢;ïë·ü,×Ýý¦ìsÈB©¹ó0O‚æÙæ™kñ§PȺÔÏ9FÞ±n09È~¬CwüÓn zΑ=O}XÆÎ}_NÑX5P8ñÏeÀU/H«!‹RzVîóiR{:9qO!xŽëOæèÛâÀsDPù×¼öœ&'\ù¤Üÿ·Ewçó áy¸†ð¹òp¬”Á9Áy‘?:Îé8/G`Åß9¿ —à<¿Ç“ú,ã Îý‚ÐOsx)áK7¡yì5°ì•䌉ÏÉN½îð€yÖм y晢Ylq`Í=`Þ|À=Òï’çä¸ÅŸÊIË¿âðPE¬áS^—cVšt³(fÇPê—‡¦dŸ{;SÌXxŽZ€îîl©(º¥½1Ê=7t»`¨×Áºío’ƒN\!·¯ù(ö×q>—˜WBÃKþòw«ü¢Á9Á9Áy•¾?›brü6TçuPÁ19xåðªzž Ω“ªj¨ÿ|Fp¾¢/'|é&@æ>ú¹zÖ:i¸ÛÍ©À¼B§y†h7ÏÜu…ZØåï:]¦K.Öi®îr€²—yÛÖÊ7ɸ¥_ȉ˾äðP%¤#æ~ {žöˆ4ìug gpŸð‹oa÷ydt‹…)ÄIÙØ–”Üs¯44 ÏÍBâN¥ûÐùrÅì×ãÂ{yìîåUx&Ý¡:¡ ÿîʃ¹B;‚s‚ó"žtœÓq^ŽÀŠ¿s~A/Áy~'õYÇ3#8¿¢ /)¥ôÂÅߥÂú-¿È ÷¾%½[$µvžh€P:—9’-Ò«eš€M¹æ™»îКgŽf©¿÷éŠà¹ò`¬ÔBŸ^><ÏþŠÇàW±?'Æé;©ß™ãbò½9º:‹ƒn19üÇÿ;‡stfu~_ìß­ß™sø½‰ý='zËgè íþ*Ý—GÁéƒÅOùË î¯|írÞÍ/Hû¾3¥Fë Ì1U…æ˜ë?wËšg‘gÞ¤ß]Òã¬ÇeÔÜßËQ‹>ãðPÔ@V8r᧺3e£ì ¾hýT†/[|ѯ¦ý…Ï~-G_ô4EKËkc Í[Z ½/~N»ë#5ÿ5@ lu ™ü†Ùé‚/@ŸÝâ—†…¡Àó ÷ü&/ºe—IÞ (ÔÎN%\êŶ$œçfÁS§¦^Çû²@&Þû–Ƹ0úŒÏS[UÕZ—‡|~¾pRÔ5@ PÔ5@ PUÓ@Eàü ¾èmÕ½²„ö·.}Oy¿Ôn­°eóøAsä ·=|™ ¼áU9üî9<Ô5 ¿ã=évÚ£ºæÎÊÁsÝ¢q-At‹- ­$<Çî ŒÏÍ5]§­Æ¸œ=é9YùêeyŸã³ÔV–Ú/U{Aàñãñ£¨j€ ¨j€ äWóÉ|ÙÛê/{eÖ¼ñ“\2í%éÔ¦lßâ+˜@óP hƒ³¤ó‰ÉÐiïÈaó>æðPÔ@,5pèܤ÷%¤åà:Ïk«ÝĶ˜èç…ç8ÇàZß°Ý2úìµ2ÿ‰/Êâ^Çg¨jy†ú‹÷ßð!Ÿ/zÔ5@ PÔ5@ PÔ5PU TÎÇð¥¯Z^úJ(,~î9î’‡¥Ùî7)D¹:h>AjîxƒŽ€¸`ã- S«ï˜DìŠïŒ›Ò‡CÈ÷5ÀèV<2ÓÑ3p yóþóeïóž–³/‡(âðPÔ@±h`À ¯I»QË¥®î”©m¯kµèØ^ë‚è–ÀóÖ~l‹qž{‘-f‘ÏÍb©Î¾‡-›m)ÙûŸŸªíùéåª>óÏó‹ ¨j€ ¨j€  ŠÀy;¾øUÛ‹_IÁ„é+>ÁGk‹”훘{ÐÜs›Wä4ß:мÎÓdç‘Kdß«_–‘w~Èá1 ¨¢ÖÀASß6;fî=Ëè•„ç&ï<‹Ìómn/ï<<÷®ûfp/Ðißsºœ?yƒ¬zí%ußãóSµ=?ÍäK_r¨j€ ¨j€ ¨j ¨œÿZ_üþ›/ÕöòWÔaí›’Ëoß(]öŸ%Û7»Ê”$AsÎÕ•w"\ЦdNÁ ŒŽç4×±¥tyvš×ßóÙýص2è–·døœ9<Ô5PR8xÖÒãü§¥Åþó ϱH¯Ó•ƒçÞý¡q»‰2öÜurïS_õ½ÏLÕþÌtb>ù3ø¢E PÔ5@ PÔ5@ PÁ9¢/€øXí/Eîá2î²Ge‡ŽÇÒôÊì ¹çšë?·4oÚw®t?ë 9èö÷d˜F²px ¨j Ô5Ðï꺳橳‡Ý’Ml‹U¡ó¼RðÜsoßÜ_\Õ{FMý÷ýG-”[î}|VŠÍ³RW¾àð‡ ¨j€ ¨j€ ò¡lÀùt¾ Ææe0ÖáŽÕÊAÇ*i©[ð̳‚æÖmŽ<\œš·ºXz]þ¢ ù{5@ ”¥N~KwÚ¬“ºãÆö=d, ­žÛA9Àó ²Ñ]€çvg’½4¹Bvï=].šò‚¬~ý§Xßÿøœ›ç¤¿é¹Ø&Èü|Ñ¢¨j€ ¨j€ ¨lÀùq|!ŒÍ aìÀÁº·~–+gn’îgËv¯ítlß$ Íýˆ– Ó¼â\óìãYü2Ð Š@ëu.»ŽY)ûO|]ºã5@ Pª!Óß3;ošõ»ËôHxŽ’eLÎðÜÜŠÊ<•…1^ð÷•&ín£Ï_/‹žý:v÷A>#Åêéu¾Üð冠¨j€ ¨j€ ò¥lÀy'¾Æê¥0Ðà—¾““¯xLZî>Iùx3IÐܺͱýÞ)­±ÃÖ…æ{ΑΧ>"Üö¶ ™ñ>‡Ç€ ¨4èyù Òæàû½Ã-RkWŒÎs‚ç^7…ÝJ* E4&xŽ…YÜgj6»R8b‘ܶô½XÜ ù|»ç£yùz@æÏáË5@ PÔ5@ PÔ5@ dΫ/†ÿË—ÃØ½V 4˜½þcvüRW·Öo×èò4W·yTD ¶ánsD³d*MSŠBÐ]&‰ÍØ­Õ.³Ó¼å Òã 2xúûj€ rÐÀ~7¼.íÇ®’z]¦K­x>9çyžû‘\ˆå2ð\ïÙÀsìbR×¹…çÛ5ÒÅZ½ÿtês»\:õEYûÆŸªå~Èç¢X>Á—¾ÜPÔ5@ PÔ5@ PÔ@¾4P!8Ç_¤/‡›ø‚ËÄ­ Ök˵s^•Ì‘í^¦£ÀÐð"p𧿯m®™ç:`ÒÊ-õ·ó·ñ¡92r‘— XnÐÜçé yN·É.‡-“¾×n’AÓÞãðPÔ5P œò¶t>åQiÜkvÈy^IxÙÀsï>a&TjdxîÝw¼{ŽÞšµ Ç_ô Ü·á›­rOäóP¬Ÿ‡zæë™?‡/[Ô5@ PÔ5@ PÔ5-8ŸÃÅX¿(,Ûø½œvÕãÒ¦£Æ±40O…æA®yÖe é ù³­¿¦…æ.8w 9ç&g×É4o¸×LÙý„¥¿–Ý œú‡Ç€ ¨5-8ßV_hþ‘‡—¾¸¾/çúŠM?È™×>!;uš$ÛÖ½XäsHÌžCòølyA>ù³øÂE PÔ5@ PÔ5@ PYsE_lÞÊãË _\«ùÅuÞ£ŸÉá'/“zͯð€¹Í=pîC‡‚çšûe v+DhÓ¾seÓž¾“¶H¿Éosx ¨j€ˆ©z\þ²ÙT»Ã-^\KšÈ/¶ÅÂsíj…Ñþ‹$xnËBý¼sìfBl‹íÓP×y¦¼óxnïsu.’nûΫîØ(ë´øšÏ5ñZ̯âùØ/6|±¡¨j€ ¨j€ ¨|j p~O_hø‚ZͰçïÆù¯KŸï”íê^$Û*@0c y:·¹noäORD‹n—ÀrÍ}¸Ñ"œkž® Ô‡æ¶ ÔÙÖÜÜV-–=/~QúÞô6‡Ç€ ¨"Ò@¯ë_—öG¯•ú]§W ϳÉ;Ç.¦æ•Ï;÷\ç:<ǽ¯e»ëå”Ë‘¥/}Çç“<ŸTñó?úçëæó™?‹/\Ô5@ PÔ5@ PÔ5 8?§Š/5|1­¦Ó•¯þ(çLxJvÙCãXj](ÛÖÖq¡y6-Yåš[h~Ô@VmËŠÊ@ýÒ88Μ×ët«ì2z¥ì}õkÒ[æj€ ŠX7¾%uÇvå\ZÕ¼ó4‘-Ið÷B:.•áÇÞ'sÖ}Äç”jzNÉÃóåÇ|©áK 5@ PÔ5@ PÔ5@ ä[¹€ó>yx±áKéV|)½ç‰Ïeô©Ë¥A³Ë˜_à §y-ØoÆn•wÝæ~®yÂÐŽs݆ßZ'Mhã}fÉn㑞ޒ^·px ¨j€(1 t»èEiuàb©Ýn²Ô¬¨,ÔD¶èDÂó,òÎݢЈ¼sÏíâ±½'êýq›šÈ^ýgȵ³7ÉzƸÛóÚò|? óçñ¥‹ ¨j€ ¨j€ r絜ÿ›ð<þy “¼)ûÕ8Î70 šgÑ2^¶3nó Ð[è݈–Àiî@slÇWpnË@kír£ìpÀ½ÒùÜç¤ç oqx ¨j€( ô¸êU³³¨^§Ûô~. µyçúÏÊæ£Àñb.<·½¶,4Ùb”±ˇç¸o¶Ö—Ó¯|T–oü¾Ør¹~ÞËùR×j€ ¨j€ ¨j€È·²çø‹š@pOp¾zó傉OKûΓd›íÏ“mjè¸Ðgc¾Ô𥆠¨j€ ¨j€ ò­\ÁùÅçñçSîÛ"û›+ÛÃY¾sŒušûмà-~®¹ÎÝ2P/¢¥æŽ¤Ù~ód·ÓŸ’=¯}ƒÃc@ PÔ5V].{EÚ²Lêt¸9Ï“"[® bÁÌn',à¢kÃönø=)®ó†—ÉvQe¡#[®ssoÅ´¹×ž#;íz½œuõã²â•Ê LÇùwý:ßÇüy|ᢨj€ ¨j€ ¨h Wp>€à¼úÀùš×’‹ozV:t½I¶ÙölsÌK¼Íp^ðˆ‹P®¹ÑR»íMÒêàûe‹^’î×¼Áá1 ¨j€ÈZÝ®z]Úó 4ì>#á:Gw†) ½Æ‡çþ}È–T;ð<çÈ–4E¡nd‹çv‘÷^½×mp±>n‰Üýè§q†ÊåðÙÖñ¥†/5¹jàW¿úÕ©:rx *Ð@¿\µUÿ½³e1ùî,®Îã­Ç`lLޝeñ¾žV:Ûß­ß™ù½á½· <;Ýæòš×'8ßúà|ñ³_É1g­”ÆM/“ßms–Nh¾Õ"Z`øÜdpD´Ø˜–èBÐmk] fj_è @€ÝŠ^σpÚ™AYJÓ^.Û5ÂŒ”ªmſtkÈE ›n‰¯»Û-Òú°Òñ’W¤Óø×8<Ô5@ PÕ¢¶ºÓ©qï;½ÜójŒlIr;ðüþ ßÄ 0—âçù1W`ÊÿžQ-„]YÂ.‚óhîÕBÇ9A`ö àœàœß—ì¿/8V%Î"8/<8sʲ·y• Aë©›Î@sœ7°à<š£TÍ€s[´æ¯5ì1Sv:öÙý²×8<Ô5@ P±Ñ@û³Ÿ—æƒIÍ'Èö¸g9E¡¸ŸaAØ, c ÅX0ÆÂqU"[BE¡<÷#ÕÔq^³æy¥©ãø;=FN^ ÐqNxž%<§ãœŽs:Îs^„©Ç‹àœàœß‹Ü®#%ΛœœŸuõc på6ß^ç(+CiY–… ©ÐÜq›,nó+ x¨Ùê:iºÿ=ÒöŒge·K_åðPÔ5@ ÄV.Ú(-]avF¹ð Â)ðà ÈžçÙ’¹(ÔF«µÙåš8BæRüL“*MùgÛ Î Î Î+`Æ93γüþz°àœàœß…rçxÙPpþ-áyaáùu³^© TÁ¹Í·©ÑbcZ·yv-µÛN’ÖJ»ó_–]/y•Ãc@ PÔ5PTh£;¤ì5Sº:ЭëÜ8ÏC®ó0<·Ñf¸ÚÈ3?môˆ`¡÷^,\cÛ8ÏÏìs]ç{ö¹­!u§Ñ„à•‡_å|ìΠγtœÓqNÇynÀ‹€Žó´ß?êé‡,¯¿ÔRù~÷Šßqîƒó‡Î Îg®þ½ÎÍöo›k®/çxIOq›ûм–“kÊ6Ï&¢¥~×éÒjìziÑ&5@ PÔ@Ñk`çÓž•&ý-¯Í-²%§¢P€sžë½ûÀQ÷Ä2—âgÚ¥œá/÷Ê/œœg nÎ Î ÎËÞå ÜÒqNÇy¾´T.?§dÀù ç…çË^þ.ç‰lóèBÐH·y¶… êÀ«¿×²ãIOIÛ 7qx ¨j€ JN»œû²4;x©)ºNÊ;Šlq]çÖyŽ…iužã~ë9Ï£#[ìb÷1g¯*EH·ßéÏÇ•Çå~ìÎ Î Î+ý`T £Z²üþ” ä«è÷$8'8¯H#üß“èJœJp^XpŽã[·þE™Ýæxy·-Qnó, A·oq4=ð~Ùù¼—e— ^áðPÔ5@ ””Zû¨ÔÑìs“uÙ’eQhœ;ð<¢(ô‚‰OÇ 2—âçy¶Üá/ÿ*¿ñ?„çYh€Žs:Îé8§ã¼ªP“àœà¼ª*·?_2༠ÁyáÁùÎ&˜ÜT³ܾ˜°´²ÍG¯•ÎßÈá1 ¨j€(z ´Ö¨–ûÌöÊB5ë<È;oääg[šƒëüÆ»7—"¨ŽÛï4•à¸òà¸Üç„æY@s€ ‚s‚s‚s‚óªBK‚s‚óªj¨Üþ|i€s?çüO„ç……çûôŸáCóˆls×mn Ìl&+¶™§¸Í/“íb´ åh€꺳 Á@L³«¤n×Û¥å OÊŽçnäðPÔ5@ Úœõ’4>`±ÔØáZs_ îq…* ¹Îç>ôqÜ s)~žcÊþò÷¯üÂÁ9Á9Áy•¾?›²<~…†=ªó:¨ÇàŒ˜‡Bgþüª-œœó;”Ûw¨¤ÀùSç…çÃŽ\˜p›§‚žoòVÍœ»ÐÜ€óK$›BPÎhnCó«eû®‘ûΗV§oÖç¼Ìá1 ¨j€( 4=tµÔj{“w/ÄÀy¤ë Ëpž'E¶è½÷ÓŒE¡ÑYç«^û±AuÜ~§Ý«˜ðï®ÝæÍ}·¹Ì´¼Njw¼UšŽyPZ*@çðPÔ5@ ÄE;œò¬Ôï{·Ôhu½Þ¯¼ûV8·®s Ï›xyç9…ft+ œþ¢4<ð©¹óÞ=ª•Þ«p¿ò}“á¹. gÙUé:×…ë(×¹Âó~Ήd.ÅÏ3‹ð—à¼* 8§ãmCøKp^ ÐqΗö,Á Á9Á9Á9ÁyUá%çtœWUCåöçKœŸ@p^Xp¾Ç>·Ùæp¶™±/ì(+³ÛÇu+y¤Û¼Üæ4t›g(Mr›û®>Ïmž€æçdèÔës·4=îIáÂá1 ¨j€¨²NÞ ^®;œ¦x÷Üs0vñÖ¸Î}çyšÈ–¬‹B]×¹…çׂ{«ÙRëÜß!6õwã™Kñ³¼Q`Ê?Kàî;ÞXJ– ˆ 8'8'8çµ"›kE¦ÿ†àœà¼ª*·?_rà¼3ÁyaÁyÿáwåà6÷2YS A+r›WPŽhqÝæ8o{“ÔÔ©­ñ- ß/p6;ù95@ PÔ@¥4Ðxôz©Óm†¹·˜ñi“à9r3E¶dYšpÛÈ–Ê»Î=óU)Âê8ýNw~~WUtœÓqNÇyå¯#Ì8gÆy–ߟrƒ}Ì8Xh ߯ÕÂûo×’ç¿Spþ„ç…ƒç£OYnÀyînóäBÐ¬Ýæé Aƒlóh·9 F­v˜ÉR«ýd©Óyº4¹Zš¤ðœÃc@ PÔ5¥šý¸î`š§÷’›½{ŠN©µû­Þ=÷]ˆõày×y¥ŠBýާ(Ô,0ãžYQQ¨HÃ}8”uÞªýõ¥ªãö;õ*xËߣú>Á9Á9Áyå¿tœÓqžå÷§Ü`çtœSóùYh+Ip>—à¼pàü꙯TÉmÞr¿¹Òñ¸uRgÇ ^!¨-Ê6Oq›OÐìXLj!¨›mî¹Í}¸á@óZÛ‚\ÚZ»M‘úýHÓcžfã4Â…Ãc@ PÔ5àh Ñð•R»Ëts¿0÷]x ÃóÈÈ'ë<ÒunŠB¯Sz½Ã5âåG…jiv«ód“ñ:AÐâ…ú‹Óewëw{Ü s©}žé3g çÊ/»x1ãxÔ½¥ªãöû¼GðKhž ÐqNÇy–ŽY‚s‚s‚s‚óªBK‚s‚óªj¨Üþ|I‚óç…çK^øÖçv;¸hÁK»‰hñcZðR—{8äà”ó Aëµ»QÜö®ôŸò®ìwË;²ÏøÒ¼Ïœ{î;ãÄ Üæ Zc²p›»-&Û<Ñbƒ :ˆÔîx›Ôî8Uêî5KºÆèj€ ÊNMŽzLêïw¯Ôî4Uï ¸7èp†çÉ‘-Y…ºY瞇\çuÚM’ÝŽHúN~Û@sÜ#ÛZîóJºÎ>{uÜ@s©}žÅù€¦ü„ï MÔ™Ëá1¨@y½H½^è1»,&ß‹ªóüè1Ø7&Çײx_Ï{W§Nãöwëwæ~oxï­@×ÇN·Uý@ Í·Óù'áyáàyF—åœmn_ük¨›n :Îá:·ð¼ŸB‚Îg>)õ;Ýêo_8¹ÍMDËÁÖ÷š;fWå6O†æ FI0{L“z}ï–Æc’¦Ç=Éá1 ¨j 4pìÒ`ÈËr»¹xà܇ç®ë<*²¥2®s,Ãyî¸Îkêÿm§‘H¯ oHß›ÞÜÎûOyGvr¯lßäŠJ»ÎÏ›øt©ê¸ý>Võ¹•žÐœ ¨j€ ¨j€ ²Õ@Ú­GÙþ¿ ôm‚óÂó;MJ€s»=< ·9^þ1û^ÿšqﯮóþê¨ (è=q‹´»Zjï2ÑçÉnsšëØ Ùo” Ûlª@…Ãc@ PÔ@ij ÑˆUR·Çlsí¯ÝY\ç©‘-9…b¡Wï[^?‡Žç¾ë¼ù¾wÉž—¿,½oÜ"}&% 9ÜæX\nÑkvœWÂu~üÍqÍ¥öyúçò|Êÿ–/DÔ5@ PÔ5@ PÔ5P ä œ/ 8/8ß{àLÙ-6¦¥žiñ3WMD‹Óâo37à\Ë@{^¼AN}O¸®ó›ß6N»>“¶H«_“V.’švk{ÎnóPD‹_é6(ñ¡¹çê:-='¾%½ 4߸Í=hþŽÙ™Õ°ÓÎ+ë:Ÿ³þãRÕqú}þ£Ïšu«òÐË?Ë—&j€ ¨j€ ¨j€ÈEùç眜=jqšg™mn_üλö¨p×¹ç ×y…ç½ ôR÷y— Ÿ—&=g;-!·ù.“¤&&Û<¢4È®r›€p>CêtÃÜ!õzßeòÏ›ý‡Ç€ ¨"Ö@ã±Ký‹ÌµÝ\ãq­÷á¹ç:Áó¨È–´E¡7y÷"{_rá¹ã:¯³ëÍÒö¨µ²÷õoJÏšë½÷<ÜûlD À9vdáY[ê¸oà* ‡.“º{Ïö®é¸¶»ðÜ_4­(²¥RE¡¾ë¼ÖÎ¥ÕÁ÷K÷+_“ ÍqoÃ=΋hQ·¹ÞûúéÎ+Ñb•oÚâAsœçê:oØòªRÕqû}VTõ¡—ž/NÔ5@ PÔ5@ PÔ5‹òÎk+8ÿ7áyaàù…“Ÿ“m+‘mn^þµt—ƒÉàéïˀ緽—Rj#[°}޼½'¼%{]óºì8j…ÔV·^kž·9rmmDKÈmnàŠBs ¢[…Û`Èi2æi¢ †Ãc@ PÔ@¼5ÐhäjÝ94Ï\Ãëì‰8·ð<ÙuÙ’“ë|r¤ë¼Iß»d ^½®{Ó@sÜÓŒÛ\ïqp›'‚:nó^W¾lî™.<·EÛÛ5º\#Ñ0‹†x´úˆJ»D¶Õ¾‘mŸ¦÷è]»ß7Ð\jŸg|.¸üoùBD PÔ5@ PÔ5@ PUÕ@^À9>„Bó Î Î'Ýû¦ÎsÌ6·à¼e¿;eÈíï«ë\á¹Ùâ…šÈÇu¾÷„7 tèréFi>hAjD çíCÙæÈ£ÕIÎ6Ou›–Øló(·¹æ>8<7ñ-ÃVH“± Ð9<Ô5@ ÄN_¯;…è‚ç³èi¯ãv1tk¸Îëw»]ÚŸü¸t¿æ ÙóÚ7|hv›k¿‡ºÍ±ãʺÍÑÿEå=Ï}*œçâ:ï3tn©ê¸ý>CªúÐË?Ï'j€ ¨j€ ¨j€ÈEù眜Ï{ä3œ_bnÆéÖã‚6/pÆ¹Ùæœ7î:Õ€s¸ÎƒÈ–4E¡Æu®ÛÙáЃS𼻈ÝÎ|Föœ#µÚݤhî€s'Û<²ùæ… n¶yŠÛ|//€/{+„Áìs§Ôß÷iŒüó1sx ¨j€ˆƒF?( ß/u{ÎM\¯qíÃóªºÎ£ŠBýȰÚú¿µ½Fº\¹YºùÐܺÍmDK¸àÜ‚" ‹Ê{œ°ÞçÖuÞ$›¬ó„ë|严qÍ¥öyçò€Ëÿ–/DÔ5@ PÔ5@ PÔ5PU äœ_Jp^p¾úõŸ–Ãqî‚s@sœ£ÀÌ‚s›Ñê€:šõzàŒ<×9"[Ò…bûº- l°ðÎ=8øº^ýºìrìCROãV2ºÍ;Þ&¦4²ÔºÍ… šûÙæa·¹…æçÌè48à>iðòÏ󥉠¨j€ ¨j€ rÕ@>Áùç…ç8®Mwº®RnstO}G†ÌP×¹‰lɾ(ÔºÎÏáäëªpbË_•–#—+ÌȸŃ)->8‡Ó<“ÛÜæÈÃõÀyªÛÜ‚óz½î3}î–†-ÕÑõÒøˆ9<Ô5@ l% 4:d•Ôßo‰ÑÂõØ.j&Áó¨È–ŠŠBíý"žpî¸ÎiŽyû3Ÿ“ÎWlV§ùëfa7[·¹ÑòŽéû°nsD™í8h~œWÂu~ù´—âšKí³¬Ïõ—ÿ=_Ѝj€ ¨j€ ¨j ªÈ'8oHp^8pÞ±çTœgp›ck¹_ j¶›œ·¸Fú_¿)p»E¡Èv…ë ¡Ÿæ¾F…žÃÁ'}pöuÖ-ñÎ{Qš \àÁŒÝËs}¸åÏ"j€ ¨j€ ¨j€ȇò Î&8/ 8¿jæ+æå|;¼¤ÃéæÄ´˜ˆ–ÈlsÏm°ËA eØlç¾ëüÀd, …;¯Ï¤· x€p]çnQ(òemd  à ÇÎg<',0ÝlÃïê@slÑ8<É¥4Ñxã¸ÍÀw$æ€Å&ÿ¼Ñ¡k8<Ô5@ d£CVKݹƒHsÅp†ç!×yÆ¢P¿ðÙ”?gÎ:ÇB+@{Ë#”öm’]/Þ$ô¾‚…YÑ‚{Ž)E¶yÈmn¡9Üæ&¢Åu›§‚¾gîƒØ…Õgü‹8ÏÆuÇyÂuÞm¿;J VÇé÷y<¼ü|q¢¨j€ ¨j€ ¨\5opÞœà¼0à|úŠ÷}hî€ó,Ýæç;ô™-Ãgè¹Îg&²ÎóUj]ç€ç€€€­Lêky\œûм; ùLQ̘lóì A£"Z Ôܱ Ð3`‘‰oi4b¥f ¯æðPÔ5FØ©ƒ¾\7ÍõÓÂóŒ®ó4‘-Ø1„±Ñ[ÆuŽñÁy„ë¼®.¨6ÓkõÎç¾,íôþÑÐ<ƒÛeÕ&Û\Ë«=·¹·Èk A 8O.5ns&ˆ\su›ãþ‡ls,$÷8ë ÎkìÇy:×¹×%’\ªð\´Y'Ð\jŸå¦\nùßó…ˆ ¨j€ ¨j€ ò¡¼‚s| çßžçžß·á› ns¿Efä³b«¹q›{Žó†{Ü*#æ|h\ç;®s@ƒA•, °@)[¢(ÔlQpØèø±Ëù¥ù¨µ Ƙ·¹Í3ºÍ³(M‰h±àÜæ@ 5€û\Ëí?Ðh$‡Ç€ ¨«†Ã–KƒÁ÷{×Ê ÍÎ8à<“ë<¢(Ô”„fSŠ{_ÚhÐbisús²Ë¯HÛ ½…Wì^ÂB¬h1… p›û… ÙºÍ÷Ó\óþ)nó4G÷ÇÇ­ÕŒs€s×’ÉuîǤaç—ï:{öšRƒÕqú}Fçã—?ƒ/NÔ5@ PÔ5@ PÔ5« Î!8Ï?8_¿å©ÝLn6¦Å¸ÍÇ÷Ûö(.Ãhžœmnt jµ™ #îüP†ž×y‹B­ëð\á `ÈŽg½ ‡.5À<·y¶… )-Æiî¹Íl­4?íi¡×w\ç­ÛÜD´¸ns…æˆõ2-iÜæØÙdÜæºÓÉs›¿e²ÍM!¨î† ‚b×TJD‹‚óghD Üæ Íá6?àÆÍ pžµëÜ»ãžÜ¾Çm¥¬ãò;uÌ×/_ž¨j€ ¨j€ ¨j W  œßJpžp~ã½oš—tÏmQ Ú"ºÔ¸èœï<ä^9lÞÇž¼S#[bPD¶(Pi©nÄg¼(ÍO×ø–#’úêR »Í=h®ƒ‚: 2wl󌅠®ÛÜ‚0×m¸¤É+ ]©å¡ œ|g¦‰uáðPÔ@1h@¯kæ¦ô7¤qgŒl©¨(4ƒëоÙIÏ™ë9®ëa·¹Ím¶¹Bs¸ÍšÃmŽ˜/Ä}u¯-p›ë‚lW…æÙºÍ½ˆ–D¶¹)¦NsšÛls¸Í±€Ü÷² zœPI×ùxé=l^\ s©}Ž¿ê³äos}°åÏ—!j€ ¨j€ ¨j€È— Î"8Ï?8Ÿûð§ pn·‹›ˆŒÍSKA=h(м×L9ü\çiŠBàÖÛßÏ:‡ë¼Ÿq¿mÜ}È:Oï:Ýl¯ï4ÞË:‡ƒNÂä¢PÍ;÷‹Bmd à @ ŠÍOÙ Yí;Í·¹ Í-8Üæ‹¥œ’š¥Û`F]”ƒ1N!hTD‹ïÌ  ù…N#VI£‘«ŒÝ”èqx ¨j ÎÐ…>ÌqíÂxnË#\çQ‘-¸fâÚ‰k¨ï:Ç‚d¦¬s/²q-óÍõ;‡Ì5£×sì&Šr›»… a·9î^¶y"¢}®ÛÜ‚Âm®ýa·9î[Qnsš{nóázïÃò^g<&5Ú8à<ÉuîÝWÍ=×2âÄe¥¬ãòûlÌ×Ã._œ¨j€ ¨j€ ¨j 2(8ï@pžp¾òµÓÄ´¤)ÅË¿ï6¨·û-2j>À¹ï:[Q¨Í;WÈÀóSŸ—¦'=Ùm~ðL/¢nst~ìqÌjœ[xî—„¶ôºBì¢tÎ-×gÈmóõ°ËŸÃ§°~õ«_Ñy<³Šú¤>‹Mú½™ƒï¾¿SªóØéßpLŽÃãÕyøwó–‹ô;ó@\¾7ü±xŠÃ³X¦Ï0ú.$8Gpžp~Ø©«"ÀyæRPë6è}þ“rÀ¹ï:/š¢P'²Åƒç lN|Fšó¸WÞibZ*ç6*õÀy"¢%š+°ý 4>âAi¤Ð NM ñùO¿HÐ_Ôàñàñ ò -êl¨ {xÈ»öèΛœû®sÏyž&²¥¢¢Ðl\çá‚¿»Ù¸g|h®×aßmnœæ§& A[¤)E<L±p.E¤—WºYºê¢k7ë6×ÅXÏmîR›BP€sšns-´†Û|.øv²ÍÛ\¡9bɼˆ–M\îµÛÝ”ç9–„ÖÐìµoþ) ¹Ô>Û¹¼„ñ¿åK{®Зåñ:ú&Tíó_¹~vþ÷Ô{uk@¿7›bðÝÁ÷wCu ýûψÉqÐÃÀïAqh@¿3?Äå{ÃÏQíÏ@qx«è3Œ+48ïBpžp~êÕO$À9ÜæÆq~˜a´È ef¡RМï4Qº['cîýÄs;E¡pàÁ‰¸0T·³¤ Y瀀€ØßÊ»žë\‹Øàöƒëϸε¨ÍºÎ‘EÛ]·Ö|tñ]ç"#»[×¹nχã0pŸrkÞ9à‹[jâüÈãvT€ÓTÝçMÆ>¬QZÞé–‚ºÙæ‘nó&j mDK’ÛÜušûÐÜ€ó‡¤ÉÌÃXÞ26J†ÿä1¡¨*h‹ƒMükçº`gà¹ë:OÙ’EQhE®s渾5=þ)½æ>m-su›cWQÂm®Ð<]!¨Þ'pÏp#ZÂ… Inó 4‘mn Aµ£÷/ìžÂ½ ÷4ã6WhŽ{îyp›»ý]©©÷F,,§ºÎ£JB“ãZvèxS©ë¸ü>óù\/ÀÅzžΩ¯bÕn>7Á¹÷ý!8çu$ßÇbû ç„ÕE¶`Qppþ;ç#<Ï/<¿âŽWÒÄ´(07à… ©¥  (Øí°%2fÁ§ràyà:/¾¢Ð ²ÅçM{ÊÄQ ΑÛk`hè2oœló„Û܇K… )ns8=}hîó‡½ûˆøñž£<Ãc@ P•Ôv²àZc¯-ÞµàܺÎCðÜl©°(t¹w-´×Ež»Y縞59úqͱH™p›#¢ÅË6rͱ3… iÜæˆåJç6ï4>µ‹¯)… p›ëb­ë67… º ›Rªà܃æžÛ|xà6ÿÈw›,ܰÉç<Ï5®¥Ëþ³âšKísœUl/‚ü¼ÅP΋ë|ñû¯óEpNpÎïd¼¾“Åt>Î Î ÎC[„šo&8Ï/8Ÿºì}?ÛÜæ›gÓ¢P@ÁùŽÌ—± ?U×¹Âs'²%E¡Ø:×9¶Òc[=€²i»i±¶ÝwÖÌZ×uŽ28”Ây®óM&ëŽDd·9çei¬suÂD…:‘-pA긣ñ-YmâShnÁy Aw§ÑâºÍÌ Ü:òQÍþÕóˆõõ÷»—Ãc@ P9iÑSÈ-7×\SŽÄ¢œŽ¿Hç¹ÎÓG¶d]j¯‡.<·‹/3_Óãž Asu›#*+C¶¹)Õk7®ámôzî¹Í½>‹v(Mç6׈–(·yj!¨f›kÏv=%‚j‡q›;-çQ… ¸ç¡ç£ß%ÏzàÜwg. õî·¦W»½4¦eà˜Å¥¬ãòûô*¦—@~ÖâçÅwÎø=‹Ï9#8'8ç÷1>ßÇb;ççç©àü.‚óü‚óEÏ~(M‰iqÝæ×{ι6Þös šö˜!G.üLÆZ×y)…º®s€óãô(ìl‚[²²nóÈBPÇmn#ZÐÜçG?¦.MT@|Lý}ïáðPÔ@f ¨3…ž(Þ4×üÓÂsGK’ë<*²%Ë¢PÄT™ »Î¢£ø¸é±O$Aó Ýæê47ns…æXð4Ð\@±º“.ˆºnsSª‹¦n!¨—m®-È6×ÅV·`X”ED ÜæI… p›k„Üæ^D‹Ÿmî‚znshA¶¹Ñh~¸–dïuÚ#Rsç3ĵè½;¹ƒ¦»ºÎ Î ÎSÁùéçùçë·ü,µZú/íþ |mncZZë‹~k@ó An«ç êì:YŽZô™ÂsuûðuŒ±YÂéÜæp„Z·¹½à|7£Ÿ?¯~ÿ…R¯ß=j€HÑ"SÊqÍÂuÀsÏC®sìnI‰lɲ(TËEaÜ¢PÇunrÌõï  y:·¹ÑÒì‚êø-¦ns…æ­-4»ÍõZF¸öãà‚†Ýæ^!è›fî+¦Tï3p›ã¾“ä6×ûÒQ… È6׈d›»… €æèùètäÊ8\çÞý³0iÀyó«ä¬ž)%`—ßåýbzäg-Nx@p^œçß·xœ7‚s‚s~ãñ],Æó@pNpNpž Î÷!8Ï/8ÇñlÓmJP êƒú¥ œš‡Á¹¿ ®:Qw~`à9\ç¥XD¶ð\!”Â'ð†Ãm!¨-Î6Or›»Ð‡Ç€ tGÊý¦!Xì3 ~Þõ#ÅužÙâǵdUºZì˜ä¢Ð`Qÿ7c®[ú÷‡Üæ¦T‹˜s-…ÛÔwë\óc×¹n‘¼\ç7©ë\·Ò÷Ò7¸áĶûîÈ:¿úu“a PÒiüfã6@ \ç&ïÜq+xsy¹ˆhqF:×¹–Ô…#[,8÷A”P ‡àª¬¼Û܃UI… iÝæ€²ÎMuÃN!½^Ÿ»9<Ô@™jÅÁØÉbvÈØ]2)׬xÙ‚=Œ]äÃ.ì˜Ñ1×;·(Ôu+H7å£î.™š‡³Í‘k®ã‚žªe ®Û\¯ÓQnót… ®ÛÜD´èý÷‰=¯{ÃÜ7Ñ‚ûî'Æm®÷ìnJr›ëî§nD‹Îm!(îa&¢EÁù!ÓrؼLD vZ¡çc‡~wzà<ˆkÉ­$ôŽ5–°ŽËïra1½ò³'< 8/ÎóÆï[<ÎÁ9Á9¿‹ñø.ãy 8'8'8s|‘š¿Cpž_p>ø˜%AÎj®ns€óW¾ G/þÌs—zQ¨ë:·™ÁˆTý“àÀ„SËDÍÿ_!“œ""ZÒºÍýBP›Kå6Gî:à LuàÞ|¯¿ÿ"©×{‡Ç€( ô½ÛÄ¥4ó¯Á™0<¯(²%ª(Ôç>”œ›RP?ßÀÏ7·ŽóÞç<.ÇÜ÷¹ç¶(4ˆlQ €Ò4ã:WЧÞpë:ŸéeN †ë\ódÞöž)fë¯yçÈ›…Åm}à:GÞ¹q¿å¹ÎÕE˜ä:¿2á:GÖ-¶ïc;ßu޼sÀl÷7®sÍÍE~n´ë|ƒº!#\ç~Q¨—wnÝ›È ÖXun¡é¹1=h™mî‚ft›û™Ä)Êq›{ÐÜÆx0 ¾~?néu‡Ç€(a 4<ðÉbwǽ €èN±±¹^׬ª¸Î=ç¹ë:ÇõÆ;e¼x© Z*åzåBs½Æž²!‘kî»Íw@¶y„ÛÜ-E…)õ³ÍÑs.íî@sSjÝæz?qÝæèÖ@Ǻ6ÂnstrX·9î]žÛü#ßmî‚Z·ùhÍ8Çb²™$×9¢Zl\‹ÞOƒœó世z;O(%X—ßå?úÌX¯˜^ùY‹œçyã÷-çàœàœßÅx|‹ñ<œœœGƒóó Îó Îϼ¡Ò1-]_#ÇÞÿ¹ÂsÏu^NE¡ˆI1±pxŽ¢=uŸ«û2£Û9Â&¢ÅiÁŸCdB†BÐDNpªÛ<áàDüÁsÒTèÈ®«Ð°nϹj „4Pÿ…æºcbNì\ÜÈ ×…´¼ºÎ±Ðç¹-66à\GÿÙD¯c&fʽv¹Ð<%ÛÜw›Ûˆ–“uÒçZÖŒ…LSªà œmt¡Ós›¿bÊžQúl²ÍšcqÔ‚"ª«³.žF¹ÍS A·˜BÐ~Û\¡¹.Øbá±aˆsÝæ(µ‚ns…åp›c±xø´-R³íMà<»¸–¶ûL l.¥Ïñi1¾ò3@ 8/¾sÆïY|ÎÁ9Á9¿ñù>Û¹ 8'8'8çûœçœO˜ÿ¦Îs+5®:…»r¿gÀ¹ç:O…~j€Â( ÖuŽííØæ>\ËÕ†!ë\}Öu>®s€ë\áF’ë|bÂuŽ-øp"Ë™¶'p"ë6p+`hi«ÀŸÎu»?\çm¬ë\M u86WhcòuO}ÞÀœf€:Žë< H¥D¶œë )Howrx ¨"×z p1×'sòÁ9¾ûèdðá¹pJç:, Ê:* Eì®e¶›×/,ja²—mî\·ìõʉ”J‚†Üæ¸þê {nóÖº#×h\«qÍvÝæ¦nsÝY„k= yØmîF´·¹Þ7°k ¸ŸØlsã6×û Üæšë=; †ÌxßÜ›pB/îYÆmîD´ns…æc´{Ðõ£Áy–q-=‡Ï/%`—ßeE±½òó'< 8/ÎóÆï[<ÎÁ9Á9¿‹ñø.ãy 8'8'8çuœcëm\^ÊŠþsÌ~ð“ô༂˜€óVýï’ã—|á»Î?/ߢP€£ÀuîÃs·`Ï€s8Í#Üæi ABY×fšÛló°ÛÜ–í5;åù Ÿ«þ¾÷Hݽçpx ¨bÓ€îlwq/ Ï+r§D¶ø‹~~Ü”·kÆ¿~aÐ…:®ó”n†ä¿¤ˆœ7<À¾Sê]£B… p›+4‡ÛÜ@ó°Û\¡9Üæ6¢Å- »Í½BÐD¶¹)¤ ±áBP¸Íš#.Ì@s[ªà<Êmž(M¸ÍÇ*8ï{Ñ3 p×RsÇÌq-ÃN\^ôÏ1|6»¢_ù™‹ œß9ã÷,>çŒàœàœßÇø|‹í\œœœG€s¿ ô㾜í ïòM?ÊɼbPÍ\m…¹^j´Ö1àüÁ ¿É6·ùæ6ÇUÁy£îÓåø¾ã–|nàyRQ¨Â„#Œëü“ à×ùH¸ÎÕ½‡íïë\~ƒX®su"wYçûÞüŽ€€p¢è `®s¸ »iœç:=ÉuÀÐ×9¶ùùˆ’9ë:‡³Gäê&\ç/(¤²Îs¸:­›Ó‰AHWê»ÎÃb yÏÕ©™¶Ôul¦q›G‚z0 NóT·9œó.”‚›ùÄõzj|Kèj öh0è~Á\›‚]1ÎΘˆÈ–d×¹ ãzå\³"]çΟwýò¯a¶$ÔÙ1ãE´8nó`—LT!¨ía°×©èˆ–(·yJ!(ÜæzMwÝæQª×}‚â>Pa!¨ÎûOI-Å=(©ÔºÍõžåºÍM!¨Þ×P ·9"Êö:å!œW2®å„Ë+Úçˆ?“Xl/€ü¼Å ΋ó¼ñûóFpNpÎïb<¾‹ÅxÎ Î ÎÓƒóe1~I+Ê߯í')4·à܇æ­RÐSKA- ¨Õ~²Fµ|–ä:/ï¢ÐPd‹çˆkñcÙæpk¦Ë6wT… áˆ×mnâgüì`,ìpêi4t™ÔÝk6‡Ç€ˆ©ê÷»Gšó˜‰. Œƒ8)'R**²Å¸ÎŸñ²Î³- zlWƒBq,üîç›;fün†¤^†¨BÐDCÒ ¿Í5wÜæé A‘mÞöBÍ6×…Ïp!¨ë6Ç¢)"»Ý…âhÏmî-°öš¨-p›;-XEXT!(À¹-Åâ®Wú¡_úQR!è˜{?¸ÍQÖñˆåR«]pžE\ËÅS_*Ê燘?5)Æ—@~æâçÅwÎø=‹Ï9#8'8ç÷1>ßÇb;çççéÁùe1Q+º—ß}ïHçYÄ´ž×j7Yޏó=9Á¸ÎmdK¦¢ÐS\çØ” ¹Íáãl†0Ê÷ZõˆÔë}—ÔÙs&‡Ç€¨. (¸o2l¹´9óSЉÅ<|OMŒ”YÐ󣤲ugYjüpíñá9®SæÚd¡yÎm7ƒÑÐn Aýë–ícÀ¢"FÝî ·¹_\lÝæv… ú»¹×%›mns¯ôµ”BP¸Í±ˆjÝæ=­Û\ A]·¹)Mã6÷ A5ÛÜD´X·¹1†’ë TÁ9"ZÆúл¬š÷žç•ˆk¹ûñ/ŠîÙ!æÏbëK ?wñ‚óâ;güžÅ眜œóûŸïc± ‚s‚s‚óôà¼QÌ_ÖŠîå÷ÓWûà<ǘ…æˆj8~ƒŒ[ö¥qG…•w2a½¬ó{oä™mðC]×¹–´%¹Î5ÖºÎûÂu®0[ð±[òKm ×!܇p!"û¶ÓøÍžëü²×’\çØþo]ç5(£3N쌮s…?pNÚ×u”îY÷f"ò Òu~¨ÂóCÖH£‘«£Óƒç€æ~!h¡‘¹‚Z7§Óâý^œR 8gÕŽç¾$Í[­yϳ¤N÷;8<ÔÀVÔ@£ ¥Í©Ïš0¦{Á¿xî;ÏS®K¾ë‹dˆ>iv2;cük”γu7V—9€¹¹&éµ)Ùmî•'GLš{ ~©×,š;… øŒ.8÷wÂ`A¿'®ÁøÝS Au—z*m¾»^Ç=p¾Yû,¢Ýæ©… [LGF?Çm>… ·y… ƒœBP€ó¨BÐÀm>?¹ôÈ…Þîªcîû\êv¼Õ€óÊĵÔlu­¬~ý§¢{vˆù³ØõÅöòÇÏ[¼à€à¼xÏ¿wÕîÎ Îù=¬þïa±ž‚s‚s‚ó4àÜ/ý*æ/lEõ|òÕO¦çn)èÎ7JMl?÷ Ð $PpÞëÌGåÄå_ªëüË2* ŠlqÜ›pc&…FD¶PµÚÀsLuÉÎmže!hDD `œTœcÁÄלõ¼49p‰Ôé6ƒÃc@ Xõu§G«ã3ß=[ZÀs¸Î±˜—ÉužÙâƒsSfl +È:Wø Hn®A¸¹nó 4ÂmhnÜæÎbŸÝãg«gt›Ã9·y(¢Å\“‚ˆ/Û|W‚*8w AÅ…"h“mŠhÁB* ¤{!×\X±ÐŠ˜/,¼·¹BsÄ€aaeÔ(¢åÔžÛÜ[Ä>ûC/Û܉h ÜæN!( 9ÜæGÌûPï…7ûàÛ¹ 8'8'8Ï Î×É‹[Q¼ _6ãóòn^â[ë˜|ó¤æŽ:.84÷Á¹i,èrôJ9iùWr"\çˆlѬs7²®<¸ÎÇÀu®[ÜG¹®sžëüCÏu®ÛämÖù`¸ÎlÀ‡ ÊÜPê(8‚-ùë\‹áà:GQœq«+ѺÎáV„k ¦½¸Î¬,¬ @UZ×¹:&­£Óu#ƒÐ(Åu^AQ¨ÙâÁóUÒhÄ*i¬ŽOd ›Ÿ—1ÛÜ>ð]œ™ A£"ZÐÜËöb¼ øNyJî;_êt½Ãc@ äYu÷š);Œ^#íô;‡ï›½™0 ƒîÙå:Šlq]çž›¢P·$4ÑÍ€.¸æ˜k®AiÝæ~!¨ºÒ“zR"ZÂ… ŽÛÜô/ FÊÏh÷w·¹¿˜^Èk§×#D´ÀmŽž ë6÷ yªÛÜ‹hyÓìB87… “ô^áCó ns…渷àƒ^ SšÆm~ؼD!(î_¸yÙæ4‡Û|Ämozà\’ƒœóâZö0§(žŠì¹«U±½üñó/8 8/ÞsÇï]õŸ;‚s‚s~«ÿ{X¬ç€àœàœà<38¿¶È^àbýR<å÷7n<ÀliG‘Ú˜{?õ\çš‹­ïÈŽEñÚÃÕypíòØ>G ¶ÓÃ!ˆíõë\ójá$ \çê04ëq(ŠTÁV~¸áRD6nà:¸2nÏMžë\!²…U6!(ä "ü,aÇužäæÌÆuž¦(Ôu7¾R[a¦±‚+Às/öÀ‚óÜÝæ™"Z 4‡»àÜwxX…¹øÙáЕê:ž!µ;OçðP•Ð@£ýæK»3ž5×|¯=báy:×yÏ«Zê»Î‘Gw9®+¸Æ$¹ÍmDËaë´´XÇ€s ÍœuÝæQ… a·¹'…Üu›kî¸ÍÓ‚b!/Xij-nsÑ¢à×ù=u—‘-Å=ÝÆmîD´ns½‡à^b"Z\·yJ!è‡~!hÂm~„q›'‚âþpÞ÷ü§|pž!®ÅîÞ2àÜÆµxà|ô9ëbû|P¤ÏZOãË?sñ‚‚óâ=wüÞUÿ¹#8'8ç÷°ú¿‡ÅzÎ Î Î3ƒóŠôe.–/ÇëÞúYjY÷[Ž1-pÙÕÛcªœêƒs×u^–E¡‘ð ùçë¤)àTD ?"fl~°-Þs•ë6OÑ’€æ>°2…|^áj׫6ËÎG?(õºi|KÇÛ8<Ô€£æCK§‹^21QÈâ¶QQnI±u›È›uQjòtP\ w6\ÚfA/\`r79êQ”ãškGà6÷³Í±³%È6»Íá4PsÍÝlóÛÜBsSbá6÷Pê/ìù‹z¦nsýð»ynsoÁÀ^Ânót… ç©… [LŒW?ÇmŽri”L£tÑp~°Fƒ óÝæX¼Mr›k¤X¸àÜF´Àm~Â_H›Aó=pnrÎm\ËMRÓ„bÑ‘giâZn_õa¬žJàÙª]±¾òs'< 8/ÎóÆï[<ÎÁ9Á9¿‹ñø.ãy 8'8'8¯œO*—»Ø¼,:ö °,(È7¯Õî¦d·9`:·ÝôŠœ¶úëÀuÙâe®sÝúžp¸ÎáúÈÐØ€ëÛêM{_ð³Î±íNÂÀu®y¶®ë0P%pëÖ~@,¸áb´®OD” gØszz1 V)¨Š„T ‚²s?¡îÌÇ=—¦‚,ãÚ„{ST.E¡€ù®s Ïô€ùYÍϳp›[WgÚBPÄ"DD´¸nsšûÙÂÈÿª´¹Têî~+‡Ç ¬5ШÏ\Ùý¬gL„ˆÙé‚kŽéXÐÑëŽ{í ²Î3F¶¤/ õÀ¹¿ g#[tG vCìVѶThŽh ¹Í‘kž”mî¸Íqý2ns‚†Üæ'<-Mu¼†4ns|F¨BP\“\·¹-'v AqìL!(®?¡ˆã6×ÝF‘… p›ë½nsÜ;L¶¹ÞKПa#Z¶… p›;-Û<¢Ը͵Ããx…æ',ýBï=ÓÜpîÆµš[pná¹_¾mãZî{þÛØ< ”ÀsÕëïðëb|ùãg.^p@p^¼çŽß»ê?wççüVÿ÷°XÏÁ9Á9ÁyÅà|T ¼àÅæeùÈ òÁ¹—¿8ãð¢o_üÕ=g"ZܘΧȀ˞•ÓœÃu^ŠE¡É‘-ç:ˆK±E¡&²ÅHÆ™’u®Ð Qcž±ð\£}X•â:W¨Žl \çžó¼Á% Ô—™È'ã»Íáèðv›{Îδ… š¿Ñb¡` À•)åó£:_ô¢4Ûÿ©µÛAÙi ^·Û¥ÝqÉ^~Q%¾žëwŸ΂âì"[l\‹WZŒ…<,|erã:„]+æšàBó·9œæ:‡èõå5¦_.²×)\¯LD‹NJDK·9â¬ôÙÜ)è7ns]Äïbó·¹SNŒEM{rÝæ¦Ôç^!h"ÛÜ‚jlâ»° ‚Âm®Ðnó¤BÐ4nsD‡Yhv›#r̺ÍÑ·9¦ön·¦çÖunK¶± ½#ÆË9¯ÛöÆØ<”È3Õ†b}ùãç.^p /m=t.ˆÁœI¯ŽÊõÜé÷fl ¾;øþŽ®Îs ç˜‡ ªó8ðïæ5, èwæÔ¸|oø9bñ‡g±LŸ¡#ôý«\D^ÕÿV_ðv.‘—¼X¼4ŸsÓóæ%Þ@s Î틾ŸmŽmç4OÎ78ßç´‡äŒ5ß×yvE¡Ÿ™¢5®Ö ÙQ&ëücSȆŒY¸Î‡Ãu®nÀ¡®ë\·ÙÃ9ˆm÷Æu>%á:ï ×¹æÛöš¸ÅdɸbAVàu2‡Md‚_Ò×9€²u[X…X”h„$×¹æùÂiÎ:/@Q¨‰]ð#[ Qx>x‰4t¿ìÍ5s=ˆhqŠ÷¢ÝæžË>]!h)ìF´Xhr|zë-Ùýô'¥Aßy ÷%‡Ç „5P{÷)²ã¡Ë¥Ç5› ÀÅ÷ÀîrÁÂ’ugÙ’UQ(âZtžƒ0ºX†,æÞ¨Óü@]XK‰h‰*]‚溈§™èÉ…  Î}hî¹Í£ AÃns@sÝ Šh‰r›§+uÝæpë›…;ÿúSa!¨‚sš‡Ýæï·9v0… Öm®-®Û÷#Ü—pB¶¹-8÷ A=·ù8u›û·XdçâZ\pnà¹Îwé9#Ï%ô<5­ªÏ—üó|i§¨j€ ¨j€ ¨Bh`«‚süú¢÷çzÙ«Ö—çëï~ÓçÙæ›ûpT¡Ác—Ëk¿‘Óׄ\ç1. ¶‘ \!c×-çC6¸Ùâ… eÙ¢q-êÖ4Q)®sm¬BDBE®ó¨ÈÀ²Á÷+<¿Ïô&úsv8ý…¬Ýæ6!S!h8¢àjÏë’‹ù°P¸„ž ÛµVêvºÍ‹-àð” Z ¼Gº_örPHlé’ày.‘-È:OZÀs¢£×¹½a1¯ùqOh~ùRó½7 ha·yP ªÐ\ã[Ìë6?Ô‡æÚ—é6G¤Tà6* »ÍÑ¢ƒlóˆî·4ì6* »Íƒˆ(ÿÚcëpÝÁB©q›ë©ë6OW pžZêe›»nsSzoj!(À¹u›[ö¥Œ˜òºÎž§€óÉæœï=âÞj½÷—à3Ôq…xÀåÏä‹5@ PÔ5@ PÔ5@ TUÕΟ-Á—¾jy‰ž¹îã8·f)1-ÑùæpÛí|à9sÝ7 ×¹ÙrÒr§(TzÇ)tÀVw8÷w×ù¸ÎRŒÒ"¶Àu®c„º‡ÏþÐsÏô\‚È:Çv{l»Çö{”¾õŸò®qšÀuÞ®s)=]×¹‚^Ÿ`£ܲ>€c[ÒxîF$—§›+”ñ©»Òlq]çÇ+\Št'"[R²Îs, u]çž°X*Ho~ô£ÒF?³ë6ÇïäÅ´„Üæú»»ÑÝæNDKRT‚ÎqÜáúßçêפõÁ÷{ eyƒÐ@#ÝQÑùì§Í5°Ð Fîã:×ëM6‘-fá»^ô;˜TªßQ{rwÀœ·<åYi¬ ¼ÁX,ÓÁ™…æY»ÍÃ-ºp§… ÉnóPDK¤Û¹æ:€æˆ­Âµ0ÛÜ‚ê5 ¿ƒWj³Íuç‹î~ ‚âúlÜæèVp"Zp|qí±‹uIÙæN!(v$™BP“m®¹æa·yºBP¸Íõ~·9îOÖm~Ì}Ömþ…ï6ÿRNTp>èêà<]Îyd\‹·»kè‰+ªåž_ÂÏNªú0Ë?Ï"j€ ¨j€ ¨j€(„ªœßVÂ/[õezéËß+8OÓâGµ¤ä››/׺i¯ÙrÖº?È™¾ë<®E¡€ç&²%( Ýœç¢ÐˆÈÍ GÄ) 5Îs·(ôá‹BW¤…®sh€iKý‹L\CË“žö!•“mŽˆ€*-E¬³ns¦b2‚º1 ®ëÓ–óy9Ã[Ì2ö¼äiÖwn"ßfäóŸ<&E¤ºZ€ÛáØõÒ××6²´M,è°ÓBŽ2,ÂmîAsÏmŽ]PžÛÜÛ.·TÝæ ÍO^ñ•t;~‚s-­dÎù·½´Uïó%þÌôJUdùçù2D PÔ5@ PÔ5@ P…Ò@u€óÝKü%p«¾PïÚo–‚ó,òÍMfq"ßРöî·Ê¸EÉYë=×yœŠB“"[Ôµ¸ÎÏ#ŠBáÄÎTêE¶¼‚çˆlQx„¸‚pQhÚÈ-ÞC–ð˜(×ù:itèZuˆ®ñ\¢È&¡L¤ ‡E¹ÎE¡6²­þ€…xŽi1f½´½`cŠÛÜæ GºÍ+(ű Üæ€æêĵns€FSÒgŠú4Ngòi?v•ÔVý÷%‡Ç Æh¾ï]ÒsüËÆ½Œ¢IhÙÀsDBaqÎ…ÊÙ‚ëMÆ¢Po—‡íZïükPÝ1ÒHw”˜ï°î"ñÜæNDKZ·9œæáBÐÛNótnsìŠ1ns‚ê`׌Í+t›«ÓܸÍõZ ·¹h1nó ¢EÁ¹³óÅ-87… zÆ¢»ÓŸÍuA4)¢EÏÎq›+4 ‹©^DË{¦‹­¶Ôs›è¹ÍuqÖu›§+8w AÑ·9Àù®‡Üoî8·%¡~<•¿«"pœ[×¹CÓ…ê½½Uïó%þÌ4§P¸ü¹|y¢¨j€ ¨j€ ¨ªj :Àùoô%ð/%þ"¸Õ^ª{¶PjV"ßÜ‚ó1wl‘³œ#²%SQè È:×íî(Y³YçÈ‘ÅÖx²šï¹ÎQÔ–ä:W— u£à @Äup¹pËÄ)8nP× (ƒ(@š’+ ¹Îë÷_ õ÷»W*xk}ÂãAžpr¶ùf?!ÙmŽ…†L… A9ŸÑ÷gÎõ¼X˜è¾6K›UkÈÐçðÄL »N“îg=éu((€…v±ð(›Ï 8ŽlÁµ&sQ¨÷]³= €çnÖyÛ³Ÿ—¦#VˆùÞÐ\Á9"Z 8p›]¦e¡:(Õŵ¨BP,Æ5>L'%¢å!³€—(Up®±RÉÐ<ƒÛ\sÍ=·¹Æ³ns…æp›k®y¸Ô¸Í¥ Øåã^‡\·y7'Û<©SAÁ¹ •¼³çɸÍõÜÁmŽIÖm>Tw+š‡Ýæn!¨ç6׈ßmn#ZÂ… šŸ²ò+i¹ÿ¼ôà¼Â¸–dmµ{|<+RÕYþy¾ QÔ5@ PÔ5@ PÔ@¡4°ÕÁ9~}|¹ ^·Ê‹õˆÓV{àÜ‚,ëÕ(…LùæpÛa¾áe9çÁ?x^íE¡ˆlq‹B´À©ø‚â>ãEÖy…‘-~Q¨Ùd#[Z¤D¶d* ÕLà\ŠBáÍ©(t©É96yÇ€j~Q¨ç:×|óáyý}ï‘Æ= »œñœqº¦f›{Ç &¢%ÅñéóE¹ÍC-pêš¼aßjÊúz^ú‚4Ýgfb±Æ.ÚðŸ<&Õ : 9w?zF|¼cäàXÆB ÏpžedK¸(ß),ØÁMÝYãì¢]uÑFÙaÌ:ï»j¡y:·9º L¶yTDKØm®;W]‚æz.Õ]0p›£‹Á¸ÍÕir›7÷´WŠ5‚†Ýæé A]·¹)…ÛÜ¿þ¸nóÈBP½æ˜-¸Ö$¹Í5Ò+\jÝææºÍG¡TlQŠ\[ phžê6ÿJÍOÕìÝg$À¹×’eÎùªÍÜ*÷÷2yNÚ³P¸ü¹|y¢¨j€ ¨j€ ¨ªj ºÀù¬2y!,øËõ‰W=™ ÎýüaÎáž @T‹S jÀ¹fœ÷¿ø)9÷¡oål…ç6²åô5_ ŠBOUÈ€mípê¡T ®s”¬JsŸ—#¸Î^bx®ó×9¶ÖÃ-ˆŒZl»‡ënB@X@®p9‘ ˆSp]çÈÇ50Ël)ƒ¢P×âÂózýæKóÃVI‡ _N.µ ŽÛ‹ n1Ÿ °Â… AְѸÍáµñ ¾tÈíïI×S‘ú»Oñòõ9<Õ ‡.’“Þ0ׯ?A¯)N‡~2E¶dUª Pf§KhÁκÎwÔ °Èµï½fwH¤Û bÆmh¾$µ4ƒÛÜ8ÍÓ2Ð(·9"£Æ*4O[v›[h®ÑTê67¹æŽÛÜ- »ÍÛ^˜p›ÛBP»€gÝæ&¢×½NãÚãv*;\üb»³%]!(î©… šûŠë6Çn'ã6‚fr›Ÿ¸ä3sïó¢ZrÏ9oÖåÖ‚ß×Ëèùèú»n[ÕYþy¾ QÔ5@ PÔ5@ PÔ@¡4P]àü¤2z1,èKö¥·¿R18O“oxÐãäõrÞÃß®óê. PÉT xžˆlñÜŸ™ŠBá–Ì\ú‚‰+0%ypbž¤p ÎLuh"ؔꥸÎÕÙ Xh…¨„1Iã#Ô:ÚÏNqkNñÍ;¾25ëÅ€ªëNÔÁÖu® MãY¢\çõúÝ#€çõ÷»GZýtºüU]“­ÛÜh‰* ÜæwaŠú|h޲>“;ì¸AO}[:ŒZ.µt·C67px ¶Ššõœ%}¯|9±§YØ xî»Î³ŠlÙb袊B+r·?ë9i<ä~ﻨ»A’¡yšls ͳv›‡#Zôú‚ëÌD´¤¸Íá4÷ A+p››BPiI‚n Š£ A±€`Üæþn—ðN—H·¹SŠºÄu&ùú‚ˆ¯¨BP,Ì·¹Bs¸Í½ˆ–OýBPë6×E^]è5… ºè‹`ë6sç»8¯LÎy§æôž^fÏFoêá–?—/NÔ5@ PÔ5@ PÔ5 T8ïVf/‡{ѾyÉ{‘à¼V;?ªÅºÍ#ŠAÎwµTÎWp×yÙâ…ê¶ö$×ùR×uîå¹ð3/1à:ÔÜ@ÛÈ;?2…nÃá:×-÷Ȭ \ç cm´‚—IìùÁu®ùÛ½, MŽl¬«×÷n©×çni¤E¢íN}Ê+äËÉmž¾4Ém®^8yÝÜaS؇Q°…s:àÆÍÒzÀÝR£õAÁ4€=Î|\†©æ°ƒŽdw‹éO0Îó "[Ò…jŒ@/v¸¤Ë:ïxñFiqÈJïûg¡y¤Û¹æ:InsD´è`±,È5_î‚ꢚY\©‹l(v#ZRÜæpšë™Ém® ~XôÓÅ¿fã܈ÇmŽ\s?ÛÜu›·Ñh«¨BPd›[·¹WJüšß¯(…ÛÜÝå‚k7&p-ÇBJZƒBPÄAa.´£Å+õ²Íqß0… zq AÑ©aÜæzß »ÍÓQØu‚Þ«°SÊf›cvR¸ùÕŠÁ¹›snãÏü8´þG.)Øý¼ Ÿ‹îÉǃ,_ˆ¨j€ ¨j€ ¨j P¨.p¾¾ þ½ _óþÂ=ÿÉ/à<Ç|s€óÖÌ— ùθÎMdK5…‘-y* Üäiwá&ã–ÜùüWd§ó6 €Ü”ÈðÝA ðšŸþ¢Ž0[€ø‚f'»®ógÒ¸Î×LaÇuˆe\ç:ÈNÉ:׬b1ßuPÖp˜–"¢-Åu®Îó4E¡&B® x>Oêõž'͆> /x1}¶¹æÅGºÍ3‚ºns8z‡¨³‹Øò ¹q„ÎþÐÀ­>—nÆÝ¦KV×sx ò¦ZÓqì 9X#‚†Ûè',ž«“àyDdK…E¡Y¸Î»i¶ùŽG?(õí¢þ©»?¢Üæè(ÀŽ‘´… IàÀ ¸Î.à:ÌÔÜ\çšK;B‹ÝXëÜwŠÚx… —ظÎß5¥q,, Uø–¦(ÔD¶ôUx§®s€óz½ï2ÓzôjézÅ«Æ1ëf ÷8·ÎÏInó … )ns¸A¶|G(`&Î/\¡#õß»Ÿü Ôm;Ij´¼ŽÃcP% ì4h¾ ¹ù S 9R5æí^ñ{|x€ó¨È– E¡&Ê/#6‘-ØÝ¢ß“°ë¼ý©OJ#-ý4ß3|ß\·¹Í5·¥ šwž€æ¹„ø%“må64‚†ÜæX„Ã$‚úns‚bÏ‚ê„"Z*t›ëÂa‹3^4‹ˆáBÐ4â ÐÙæš[·¹_LŒˆ€sSŠÝ.)eÄo™c‰kNu›ãZžä6O*}Ï‹Òóç.ÊÙ9·à<]!(îE©… 8·nsôwô:ëQ…æS+s~Ú„góvÿæ3Ð/½óñ ËŸÁ"j€ ¨j€ ¨j€(”ªœßÍ—Æ_òò¾ÃžÓ*çꢃ›®:[ jw¦ÊÙk¿2ðý9Ü×´hŠÅžû®óˆÈÓEQ(à-Œ°«@7ì:ßëªW¥õá«Ì"”ÍuðýJç6Ç‚&ÊmŽÒ_ã6×\󔈖°Û-k¤ñaÓäš‡ÝæÈ5×Á‚îŒÛ\òR A5Û… Xü« 4ì6G¡²ç6Žh Aá6׈–°Û<²T³Íß è¼((¯tØ€2;Yì.1.(E¶¹îjB¶¹-8GDKªÛBØhQêSêt»CÚŒ\*}'l6.ÿ ¬/%B!‡BЈˆèàÈ…ÉÐÜ”ùzÝÿ…ô¿èIiÐîFپɜ>5tq ãÈE2ö®̵ÀõqnÌSTd‹ë:O) ­×…®p,»ñOœ‡\çûßúŽt:å1©ßëN]@še’’Ýæ(µ¥  AñÝKWŠ"¦T§ÂBÐÛ× ®&ÛÐÜw›£ô([ª¥ Q… ™Üæ>4ßA¡y¸Ôu›cwº!:èNÝt׎ç6ßl®©]·9®¹Ins½&÷Òk3®Ñè¥@?zú#Û\çmî]cÞ3ç×{,r˜ˆã6÷Š_ýäºÍMäSD!(´U pîºÍQ ·ùÙ=6|Ò¦ŠÁ9¢ÍLTK(®E£Zè²%~aàeœ¢6bÁÏ&†ŽÆÎyOÚž'Û5ºœSÇ aû‰2è²gä$=·(m´…´0»Ön¡‚аã\ï¯çßúÁy~Àù…|°åÏæ‹5@ PÔ5@ PÔ5@ äKÕ ÎñK(4ÿ„à¼êà¼Ý¾³à¼}p*5¡ót9{ÕÆun"[XZE¡ˆ6²¥NW…Š]n7Zh¡ùç}¯~%ˆQÈÕmŽ|j[â—6¢ÅºÍ-4wJý¿FNzEšw™"Û5¼ŒS„Ç Vó+¥ç¸Õr⟙Å5@M»ÀЉE6ïçÙ…q-¶lð\ãZa­ë|ðmïH‡cÖI]g¢‰"ÝæXTÂèšêõŽr›G‚j¶yJ!hÈmnœæéÝæ&×<Û oˆ}J[å6G®¹Sê¸ÍÝBаۼí…ÑnóD!èfƒeÜæÑ’p›¿%=52«×D/B«Ñpn:4¢QP&¢Åu›ÏL-Å.×mn A±* g›caÆf›šŸ¾Æs›Ÿåg›ÃmpÞqìŠ8Ï­ tâÂ-çùçåë!–?‡/DÔ5@ PÔ5@ PÔ5PH Äœ¯ 8¯:8ïyøâpîƒN‰,µà|Üü÷åò§”KýÈ–Àuî…>À½‡ÌX€ dÉz`,á:‡“ØÂ°°ëB›W ø5%È:·źunD¸ž‚L\€däöŸâ¸ÎÐôÖ,]8QN‡¼s8!#€ò:”ØÁ) Ç$â׸Î5’°(pkÞ9` óŒ½h×¹B)¸:5K8%ë.ÐcÔu®ÎPã \ççè:Wçy¤ë\ݬˆƒð³ÎQJX€f'å»®su̦¸Î“‹B®ó<‡.Ú¾LݲÅÏN÷ÁšÓ¢ç‘ &‹8ä6ÏѲçõÀ—[ìwꪯdÀùJ½6×Êv .åÉ1Øý »åØùç/®vgJà:Çî7²%Òuž\ maÇJV®s²ÝÏ~Jì3Û,™E¡·y… }Ó‚¢g m!h¤Û… ¶Tw™¤-u³Í-4‚¦¸Íá4÷ A+p››BPi ‚ft›§)ÅõÖºÍ 4·ÙæN!(®ÛQ pžÒˆ G?·¹=ñ A½˜–„ÛÜ[x±×÷ºáºÍQj¡ùy+;¸@]Çyœ×6®s5ë “¦ tÎßœçœ7-äƒ-6_œ¨j€ ¨j€ ¨j _ˆ8Op^up>ì´5ÉàåfxùGÑ`€nC¨mç :éØ-ëê2}Ûf¯à!_°ü9|¢¨j€ ¨j€ ¨Bk ÚÁ9~AçßžW žßtß» εcçYsÄrL—®G¯”+Ÿû£\¡®ó¤È–,ŠBáòƒK®RS¨N@šò?uxXæ¹Î?õc®s¸˜MÜ‚Â@•¡êH_ž¨j€ ¨j€ ¨j _ˆ 8_ÏÒª½Î{ü šgç&ß܇L!дËÐErÕ†?Ê•®ëœE¡, uó€Cp©~×iÒã¬Çe´ºDÝlóh·¹·r‚Sè—¾2D´¸ÌÆ. ¯0ìŒeŸJ÷CÊvǵ/äø4ß}’Œ¾e£9öè9”L‚çºÈa „sˆl‰. Mï:¬;ZpO"z*iM´Û‘DfÓ’.¢%Û1H˜(·9±ŒÛ<*¢EÁyJ!è³PÖ8È5×´ÑáBPv‚ÛÜBóc´t8¥T³ÍQŠÈ¨ AÃnóuÐIÁ–F& ¨Ïd#ƒ +p«s%~Ö9rŒSóÎݬssgÃÁ:t™¡‘É®su¿Œrß«YÍê:G^s’ëü®4®sÍ;G"\º&ï<¹(Ô¸zÃYÀgЬ÷xÍËÙæ©nsìDçgGºÍ×x… Q-ah="ƒÿ"Õæñw¾-;ï3M¶­u§Ç n³ñ2øüGäÂG¾5ÇüÂǼ… ÷zàv äÙ¢× ,¨¸× w—ŠÍ:?dÖ{ÒáˆåɱS)ns§4Û»-0ºó¢^/Ñ¢Žó¤ló{ӻ͓ A#ÜæÃÒ»Í 4?Lw™¤‚j¶ùX7Û<[·9rÍBPÇmî‚†Ýæm/Œv›' A7{-p›ë5Ôu›£O¢×D¯´öL¸ns\—Ñ‚ÝA&¢Ew a×À9º+à6¸Í½k~ûD>¥)Õ] fáM¯î¢[íäÄ:!Ò z´ lÐlÿ‹ž¬œ'„"ªÅç§\ÿ ÁyÕÁùO…~¨åÏç‹5@ PÔ5@ PÔ5@ äSqç#ΫÎqüZìu»·­/ûN1(\t‰bP'ÖÀéY‡æí2þÉïS\ç, eQ(4â…&Ãs —& v-Œ˜övD¶y%Üæi"ZLì‚ï6¼4¿Xç’'¾äò:aƒ4ÚéZÙ¦æùœ<ƒmk_ =F/–s×|¡Çø¹X3޹çp‡à¹)Î2²ÅÄ:aMAhØuîfUòÞg<"õö˜šÜÙÍÝk"ZÙæžÛ<‹BPÄéBSý}Ã-a·y(¢%ÒmŽBPþŽÌTú`Å… )ns8ÍýBÐ Üæ¦TÃ… ÝækÕE¡y¸‹‘É-[LTV?̲… È6G‘³É6w yà6WhŽ…Q·àÜ‚Âmî– #ïÞD=Yh®‹,ˆs AÎíb[8ÒɸÍýëÄ^'­sÀyDA¨_ í9ÎmÎyÂq>~ökçUçOæó–?‹/DÔ5@ PÔ5@ PÔ5Ph Äœ·"8¯:8ï|àüD¾yZpžZ Ç9ÜÅç¬øL®~þ'¹Êq_þôHL˜§©ë:WHw©[ˆíóp(f\ç_‚(lã¶% ×ùÇ)®óƒý¬s8á\4í}eàj¤é¯ñpÃõ÷£ë:ß{BÈu®îI”Ý!ëÎJäÃuÞ®s-ÇCÞ¯ç:×¼óó4ë\óÎ×¹ì¡h/á<ÏÖuþ„)÷3%ˆ_8Rcà,Më:Wçù!šƒ Ø×9àÛðš—¬.Ö´®syÈ\»ÎQhˆŒfÉ®suתÓ65ë\á¢BÆ:{ªë¼»ë:×âÅÈÈ0Ù=3¨ÓáfézÜ;ÿÔlóʸͭs4Åm¦ðÖ…æÐ)z.~ô[ÙÿÔÕR³ÁŲMó8•<m{M““ïyOp °»O <8·×‚,#[ܬs9º×¯!Úu>ðª¥iÏYI ‰E@÷Z–X  9vOìÑv›G‚¦d›/Öï˜N’Û<ªt¹ù¾6pn¡y¨4Åm§¹® Ø™b AÃÙæº“;Zt°»%Ñâ¸Í±#;ct\·9:°‹Æ- g›{… ¯™k#væØBP¸Í±sÇf›·¹îìÛÜ@s[ª×áH·¹Sv›zWÈm* Aõ¾abžt· ´bÝæn!(î?¸œ‡¯ö:Ñáð¥œ×éâõz‹¡þ†Hp® Ò·.ÿ€à¼êàüæB?Ôòçóʼn ¨j€ ¨j€ ò©X€süB ÎÿHx^5x>àØe!p®`SÝs4aLTKzp~Â]ïÊ5 ΃È…²(´‚¢ÐDp™Y³íMÒ ËTéwÑS Ï?Ë*ÛÜûiDK¦BP»àF´À ˜k¡9 /ÊmÇ«vÏ]ù™t:ÏçÛs²=Mv¾NŽ˜ô¢W¬€s]”°‹hžgÙ’¹(4ë|äô-²ó‰4(:†ØÝ=ô4L30Ô[´… ºð£ @A®y9é³Í“"ZRÝæ j!¨.J™Å©¨BPÄ'!F)]!(ÂL!¨›mnsÍ5¢%©ÔÉ6·NsD?!*€æ¾Û-(*6… :>87… ºÐgÜæ ÍÃnsÄRa¡1Utá0ª4ì6Ç"d¸YI… Öm®-®Û|( A‘má6GL—u›£'Ás›{‹«Øu€ÅV·;\·¹½n S?ªԺͱðÛrà=©à»®,8ÇPAs6ªEÁù‚g¾&8¯:8“ÏXþ,¾QÔ5@ PÔ5@ PÔ@¡5'pþ8ÁyÕÀùè N€s¼ôc»yœ‡Šôܨ–ÃoÙ$×¾ð'ÏÓ…˜Ù|c·Ðªëð[çá »Î@<×ùçë ®s”ÂyYç œˆ#ïüHFè–~äá©ø¸Î5 Éu®…tÖu$ÜÈàèÙ{‚—wެóîÈ:‡ëyçÆu¾Ùs_öZ’ëù¿Öu§&à Ô]ç ±PÔÎ:OÉ;w]çGd¯3-p#ê!p«ó<Åu®y烵 @`®X}õø…†‘®suØöŽr+\DybŠë\a¤BÉh×¹[¦x®QAê<<¯¹Ë$iÙwŽ ›üšq‹fŸmî9GÃnó舖hhŽœ~Ýb÷ĉw¾%mºL–m¶;—“áÔª± :kŒê{Óu€ã—ÏÍî“,#["ŠB͵a•w}ˆruÏGÒå˜UR{WOG¦˜Ñìžq®e) €Ñ… Ñnsäšëô¶Ùæns|g0é Añ}3… :)Ð<\r›Ò2PLR!¨ï6÷ A±Cý‘… ¸Í±+שp!¨ë6o¯;kvUphŽkŸç6ßlÜæØ‘cÝæn!(®£è‚⺛ZªÙæº;hˆã67… ³µ1-škîºÍ£ A·¹öcÀmŽÝ*žÛÜ»¯ØBPìdðú¼ˆ ×mnØpϺT5[;iŒãܹ–¥ç&®à\G5ˆ4ëÞú™à¼êà¼]¡jùóùâD PÔ5@ PÔ5@ PùÔ@œÀùMçUç§ß¸!gpî:5F®{QÁù ŽëœE¡Æu΢ÐìŠB ètÀyÍoÌn‡Ü'c羟Têx é6WfÁ9hÂnó¤ˆuB#JĸÍÕ!m¡9à/€?tßvõÓҠŲͶçpÜc 0}¯óå¢u_;NÌ™Ù6‘-v1-²(TÕÜÈ–8ÿJÆ)íwþR¿Ó­fÑ%ÍUO¾ÛV3œ5>â!Ï '*ò1ëÐÐíu¬׹޿&7VëÌë\çpͦ¸Îµ±OÂunÝžšû¼ cÖ®sýIŠ7H…¦Àó&Jêûœò ŒS) ©ëµå~6§8 š§- ¹ÍÍuà” ¹sì ¸Vƒ°(tÅSßÉ~',“í´8ówÛœ]ö³S·›å´ùo›ccv›èq²qMpë×¹¿x–1²%]Qh®óá7m’½f™ hžÁmn¯_IåÆé Au4 m÷„ÛNs@s|L!èüÔBÐtnó!Öm®ñ,ºÍÍׄ"ZÂnsäšëønsã4?æ‰h·9 Aq}© Ôu›ãúµóù͵,c!¨u›ëµ± ¹“mn¡yØmî‚j¶¹^Ñ9a Aµƒnsì Aá6×ëøš[·9®õQnóD!hªÛܽn× Õ˜ë67… ªGSì—»÷ƒTpÞYcZǹ{-Kç{ŽX@p^upþ|¡hùóùÒD PÔ5@ PÔ5@ PùÖ@œÀy[‚óªóé«?Lç&ØÏ8wÁ9` |pÞqÌ2¹^Á¹ÑÔu΢P…f]ª° q¶(ÔD¶h\‹Ùbœç Ïkîxƒ4êr› ¾rCÎS²Íӹͣ A­ÓÜu›[§¹Íƒ…¡kè{ÂË?Ë…«>•=Ì”ßýœ-ÆËž• z<Ìw>øÞ{QMæ»ï»Î³‰l±ñM€–v1­"×ùQw½/»_hv$hžÎÑr›‡¯aZðh‹M!h7Í57… !·9 y8Ov›£<·þ¾Z¢›Rê»Í“ A—DD´hq¯.h% Au‘ ^š–ÆmŽBP,ž¥- g›[h*õÝæn!¨ë6÷ y´Û<¥ns…æ®ÛÜ‚jô"°PÀìºÍ# A}pŽ…Îp!¨ç6ÿ8p›aÝæZíºÍ±¸êf›»nsÄýX·ùYálsÕtÅÁº¸¦×ˆÑÓ^ÏœcgC¢»Á[ |â*‚óªƒóéù~€åÏãK5@ PÔ5@ PÔ5@ Zqç¿Vpþ_„畇狟ÿƒ“ lËô²ç~ÌAëA÷¨háyRQ(\§ '‰‚@8ù'Œë\a"àF65¶Îc ="8à*¶‘ p#«™µÇ©ëYçp˜ŒUp‚íúÆu>ß+p&´À©Ç"rr‡jÉœŒÈÏ…ë|\çêt„ã1p߬®suž®sÍæ…kYç{]÷¦CpU"Ë®sdû"ç7pkižç:ßä¹ÎÕ± ×9"[G' U²ëüy¯¨ÏºÎá÷´)ô3Å~)®se0ó]çMƨëüuö3S\ç âÒºÎÕýªyË à†¬YçÆu®£…†õD¹Îï1.Ûz(E„ó\uâ‘í:W (YÉ¢PDýÈ Ïk´™ ;ö¿SŽ˜ñ–ÉÅrŠlsÑâ¸Í¡7ë"M)u"Zà”FÁ-ôÍoPß°ñg™øÊ/rҬͲCûëåw¿=³,fûçʧ¬ëžûQ&ê1Àq¾ó΢Yà:¯0²E]½ŠBí5Át ø×…“–~&{Ÿ¸Vjca‹)œ-ºèh•mî‚&úÒ¹Í+(5ns@óÔBP|oÒ‚å6_éu`wÈHý®¦-}Pw™TPjKA£ A+p››BP½FE‚"ÛiÓ/ Ðÿ$‡^þ˜ÔmxqIÃónƒçÈeë¿I¯þ"7šßûΓày.‘-¡¢Ð ]纘6xü³ÒpÍ1ÿÿ콘eU™¶=ßÿE@AňQ@É"Qaˆ‚ Q‚(A‘( ‚ˆdi@BuÃ7ˆYT‚Š *£ftÌ:êþŸû]{í³öÚkŸ:UÕÕœ¦ÞïºÖå|ÚUÕ}ö»wó¬{ÝNä¡yÛm>x†Ÿ_9mþÊH›Ÿm嶦j-sB!¨iZ¢¢E›F©¢¥C›ã5×jÑæ¥BÐy"ÍSÚœÐ<+e¬¯´—6×f›nZ-m¾Ï—l/¥ÍÙàc£/-Åmn…  ÎW’’*‚~Ó6 WV m.å´9 ¬H›¯¯à¼H›'… 9mž‚â6'4ß^¡9›¦Ú\¡9…¡4çt"´ióð¼H AsÚáŽj-\çuŽÃw@Ë$‚$¨s‚%ÈÌ4-_Sçx‚ñ·ŠBå;Pç*èÛ[Ôù^¢Î)îÛCZ£Î¿0Iê<ó·\çu¾¹”RPˆoydêü"#mG§ÎÏ ¨ó†ÚTèÔrËŸß(eK¡(4¥ÎŸôœ÷VOzö{«E_ø¾ê5oÿtµ¿æ…b¥´y¤H9é0*m½æhHZ¡¹ÂbBsÂcBä÷ó×Õ‰ZÇü¿ŸVë½é²êñ—ûü1D ?çÅÇUûž[uâ­áßùþoüÚ6 x šð¼Þ0¨šºÊ–è:ï…NLowúwªç¬svņI+4ï£ÍK mž–E‹VªhY}š… :­1´4–‚–-½´9¤ù´9'SX%Úœç §Z¬T+-Õ³Èhs…æEÚ\Ï2ži<ÛJ… )miþªcsÚ<œâá¹isº%Œ6שŸ”6ߌBP âYÍ3;‚œ‡BP¹ÍMÑiópêˆHy!èîuhÝæ±HxX!hN›S¼Ê.×ÖÏ®°ñÇüðû¯qœOœ¿÷¢Û=8Ÿ^pþG½?ù¿3ý†Ö¿¿hòððððððððð˜ß30nÁù›=8Ÿ^pþê½´«8(çÅàüÌjÿ+ïmT/ õ¢ÐnQhAÙb¡S_Q¨Èó<<7×ùñ Q³ 5„çÇTOzÖÑÕÒ¯øPõÆ÷}ÕÔ?eÚ| _ ¬’·SŠ¢%£Í9EéjÂâ&4WˆL˜|’Bå“nýMõoý¦:äc÷V/^çÔ…><Ú’‡TÛùÙêú÷ñïâßgÁyOx>TÙÒW:„:çî¡“/Ûú²p¹Öºæ\û®¢åý6'‹¬Ð£ha¾Z¥Æá”ŒmäÔ¡ùSW-ÑææZèˆúhsÊsY}… ›ÄBPç‚f´9¤ym^‚.µ… ZEËÄ´ù2ûŠ6Whž‚æ´9Ú)£Íš¯¤Á@›EÕË{hó¾BP‚ón!è÷l}V«T¥Îh¶¶ÔÆgJ›— AÙ<%8GáŦ*J¯@›ÿ(ÐæR~EÚ¼Ñ:I –ÒæV*ê ¨h±g„‚ó¾á££ç­²ct-8?û†zp>½àüëóûÍ«?ÿ@ä3à3à3à3à3à3à3à3à3à3° f`Ü‚ó—xp>½à|³·^Ûœ<Á ¡êr½]ι­¡PKE¡DHN@ÿu.•~YÂ2£Îjì½¼Æ5uNè]ç½ßM¡[ à  qÛB6Ô¹hÄu~oC¿¡¦Î! i Îñên|ê÷ͳ‹ëï.*†:—b ¥Î¡)qC¿×¹ ñu|ç™h Œ:Wð„ëüùÊwu. as+´"¼jûÎSê\äy‘:¿©"0[j'¹Î ÐvTI eÛJ®óu~]ð&ãOÆuŽOYŠJ û©sùÎs×9á !!j ¹ÛÔ¹4E×¹´Ò_@ôZH™»‚Ñþ$Äæ"+^•-PçOz–Âóe®ž¸ÌQÕòŸWíú‘ï™CdÚ\>îè6ï¥Í ÍkE ä5A2$v ÍOþöoª~çªS´ö<ãëÕÒÏ;r¡ Пð„·WìzEõ¾/ýÜþ-ü›NVpÂóš:׿;*[Œ<ïS¶ŠB¹ÿ‡Rçºfo¿þÇÕzû²zêóµAµ•’gbÚ¼P7ýZ¡¹JAë^†ÞBÐFÓ’*Z4ßxýñûÝæxÍóBPÝCêà4G+4ç¤GO!èÓ·º®Z²¯T÷÷ä Aõ 6ç4‹Ñæ:Ý’Òæzѽ‚ò¬â™Å³‹gXT´”hóWPªç`ZJpn… :­Ã©´·9ÏYº%8íC×Dt›m®. hsžÕ‘6çäP Íï«is)Ztº(U´ä´yZJp A‡Ñæ„æñDJ Í9)ñŒõÎÏ‚óÓÄyúüê ίúê#œO/8?gA¼¡õŸáœ||||||||||æ÷ Œ[pþœÿÁÃó©‡ç»þÙ@ÉQl¦‚3ó§áS@µT-upþÆ÷}%øÓÒ@y½(Ô‹BCp^( íU¶ZÓ(â‘”-:áù“¢¿êÍóª·}ì!£HÓ²¿H›â²™sxê6—^(u›GÚœ™.)ZJ¡ù)·ýOõ¡Û[}PAóúdõ”Eß¹Pè/[ÿŒê=Ÿ¸ßþîüX1<'8o…ç([rßyÔ4•ŠB'¢Î) ÕÚò¸/UÏXùƒa#ÄBó@››¢¥H›Cš¡Íã3«ÕËÐWšºÍch.Úœܵš[!èÝBÐ>ÚœÂÝMq›— Aå6g‹¬¦ôZ…æ ί¹ˆsJµƦX͵jÚÜHóo*Óæ¨žvWh>A!hJ›³±‡VŠÐœrc£ÍK… ‘6Wh޲ŠMD6ÓBPÜæ,G·yP´Èm®I‚s+Õ†e§TÁ9Šhs4[‘6ßFÁy‰6O AsÚ<*ZÒBPëBHhs+…6×ì¡rJisN£¼û³?K6ü¢ªe„àÜ B?P-¹Ê©šO/4çõÛ{~¿yõïçˆ||||||||||Ä ŒUpÎ?X°¾æÁùÔƒówžúÕ‘ƒó¶'˜ êÌjƒƒ?´º8ЊB¢Dž!ª·E.Pç›±75ÔùÛ¡Îr@ï{íOì¨=o½/SçÔÔùýF#RGÐBà²õù÷Z³åœ{ŒdÜBD#d#„cC‹|$ÌÁ»kÔ¹BžHþPpE¹†hÊW{›…D-êüˆoU+§Ô¹´šh 7_øÎuŽÂ¯ð³†Rç"E ¿Rê|×ÚcŒšAÁÙhÔùõ$«Qç”n9u~Eµ8ЉEÌRpHÑ¡hÚÅ6qÞK+XDgÑ¡Î勦l±CÏߢД:Ò²GyþÄgY-öÂã«×úÙê`ir4)óx„BÝœ6o¼æµ¦¥OÑB˜ ‘ÝÐæuh~ªÂçÓîкó·Õñÿñ³jm/®÷¸ýÇ2@_ö…GWûιµ:ýÎßÙßùT­&<už†ç¦l)ùÎG¤Îs×ù¡zp]vûÈw«¼vŽm|Øú>Úü'TOf½0U´hƒ¥v› AåÎï(Z'dl#'u›GÒüÕsªE×(Óæœ´Xl=¸è‚æ´9¡y6§[ E›g… EÚœÐ|"Ú\… -·y ͳBК6O ASÚ<„æeÚ¼S m®Ð<¥Íy>m®çåÚI!(Áy±T'~‚¢%Ðæ<›mú)xvGÚœþŠí/ê)Õé# A9”ÒæíBП´ „£Î)*ZŒ6×<¦´ùÛ®¾¿œsZAžóÆq^$Îuj¦Î_´ÑùœO?8_mA¼¡õŸáœ||||||||||æ÷ ŒcpþaΧœ¿ïÒ;»Á9ÇÏY-U‹t*H³¢´è Vp¾ú×[y Qç„ç^êE¡„‘Mp^…¶”-YÑ^®;XQäyNšR i¾óÔuÞV¶œþÀ€¶ÿôIDAT?qé#l=kµUo:ýÖê] ÆP…@›[p> m>ª¢…Ð\« Í@FŸñ]­ïý®z×5÷T+®~òØ„çO]ì jÛÃþ½:íöߨßñtV Ïü Ïkßy‰:fÇè´ Ú›xâ„ 6*bxN@ùo°ZmÇ+˜‡ÍŽœhs®5kX!hzR&>³Œ4OËŒûhóR!hM›£h1ÚœÐ\«šk3i4-=… EÚÒ\‹ ¬†6GÑ’Òææ7L\Úq›CškQ0<mn… Ò´ AûhóÃå6×&aZšÓæAÑ"Ú\… ëžtGSʆ¤‚B›'Š‚ó¾BP‚ón!hд¤´9ê.Š£óBД6§xš Ùè67Ú\š°N!(Ýõ³a×ó¿;bpžö4 ‚óuv¸ÂƒóéçÕ{º'Ìï7¯þýü‘πππππππππÏÀ‚˜q Î÷ôà|êÁùœ`xpNÕ(²à\aèŠ[]aÞçœ:‡ÞmQç Ðì¼ ‚LˆS¨sÈ?¼Ô€‘:'ìÀKÛPçòÕrŸâ7 à  9¢¿‹¹Î¨(Š#T:ßê\”"ÁKC‹bD°…ÊçŒ:éHpƒ2ßîFòîâßÝÀ¨óïZèCøuN„‚`ãêü¹ÎE]âú%PZYÁ¾s\ç8)ÕCw€ö’¢óyÒ!4Ôyí;_fß/\çò~u¨sÑ¥»ˆ<ïPçò£sÈ]ç ¢P0÷ô­Rê\ÁÝ×\çWšb¢L‹Û Ýqîý¶9Ê&i^šÓæûHïņë°BÐmžœDAß´Éáÿ1éàœŒª–Ýù‚çÓ Î/š‰7¯þ=ýC‘πππππππππÏÀ‚˜q Î¯àœ£½þauНÁÒ«>ô·èÍÄœ–ìeÁ9çû”[ •-ó©(t¨sùÎ Cö®©sÈB(ÃÝ"u~yF‹Nĉ¨óû,ˆ!ÁK@CP³¹Qç?Ô¹H¨ó#u®»H¥Ô9aÁª|çå­2!uŠB)áƒô„ø$Ä¢¤ï0D¨…\{ßR-½×CøuŽzÃnŸ¯ K-,ëPç¢QwPçoV.¸­ˆó"u.Ú•rÂê|‰×‰:§àp“è:Q«5E—:¿ÐŠŸ†Ö‚2ŵDìv|çip¾àŠBÛÔùáÕ–|Oõ„§V-±üqÕVÇüGu”2Â]Ô"„½„¾h†ŽÓì¶Üæ}´y®h±ö‚;%Ích~Îݨæ°îùcuâ-?­ÖxÃù3ž/½ÜÕ¾g}½:W?sÎ=¨ø;äá9W”2Fž|ç9uÎB¼×Ù(£Û€U^7t-9u¾ÿå÷T+mr^ØÀ°Ð|œ·Üæu!h ÍKŠ–Ômž•µRí ¾ÆkƒóVh.ÚœÙåä„‚jå… ë_æ¿¥hѽÁ}ÒK›Cšç… mÎ=ÊÚ¶‡6i¾ÔNC AÕ…0ÙBМ6·BPhs…æ+éÄL ÍÃ)š—÷Ðæ14Ï A6ï‚~¯ÚD§{xÖ·¹Bss›‡BÐ-“BPž×¥BМï¢ç}^j´¹~?´ A¯o‚r¢É AuÂ)/…Ál¨±™¶æ~Ÿç”`÷ç¨ÌjÍÔ 8?¹:ô¬oø{‘)¾©ßǽ}A¼™õŸáš||||||||||fbÆ.8ç©[ßñà|ê/yÝ£ç„Ñq^ëÞýéKc¡à¼ lñ¢ÐY^ZT¶Fõ…¶|ç HêüÄê\¾sô‘:§d2) M©ó',y˜…çOXâÝÕó^}jµçùwXpÞ”‚šk ³-mÚü•gö)ZП˜ž¥V´@xÇМûÜ{ÿX§uþ}ªÞ=ï®ê/?a¾è‹<åÀê_º¡ú°þ.çÝ~Þ¨áyKÙ2Iê< Îß-²Ý®©žDX¾”Bó&8Š¹Í¹VÛE˱mEK‡6× æ!U´ˆômúR¥Tóœ*ÐæÌäthó–¢EÁy©´6G›d´¹4JEKN›—-9mŽ×\ Ú|¯›µù&Ò\p-Ú\t‘6·Ðü€¯j/(¤P´¬(ZJ´9JªWjƒ0-%8·BPs›ËkžÓæÚ€Dņ$“h±(e6Ú\¡9´y(½».´yPmY!¨hóTÑ’Óæi!(Áù>׊6×F+®©Ûœòi-¸Íу• A9Ë‚_ú¦k†çêgˆå =Áù®ü¾çÓ Îמ‰7¯þ=ýC‘πππππππππÏÀ‚˜q Î/ôà|êÁùkv¾ªÎíAZ´—ç…à|¿þÀ4-ê¼§(¿t, Œ®óCn’ë\D åm(èÀKKø±¿ÈA£ÎŠ´¨sym)†£ n—Ë´#üÑuŽ7îv u¾õùu®à&Rç:‘„<”Øm Ð絵낒Pˆpˆ5A?uþ-£4q@¡=ÀL0µü;#u.ß¹‚+¨sJúŒ:—F¡¡Î<u®̰†:ÿBuþéê|¹‘:ׂbíPç î('L©óÍç­z T#SçYyâèÔù£W•-!<·ÂówiZ­ºÕÅÕÁŸxÐhé©Òæ}Š–44‡4OCóüðO•-Û»ŸtsµÄÒïšv€þ¸Þ¿Zç_/¬Nùê#Õ÷‡ïO@_ Ï£²…€¿å;:O]ç”7Ô9Ĺ6"ÞxÄç«Åä1çµÆ1ߢÍÑè +-ÒæÒõ ì¡0–âØ¾BÐÖsª¯T' :¡y]j´9… t AûhsNg¨`‰b!hN›š_›)ZD›sBD÷+=ÖWÝæÑk¾óM¡Û ¥h‘ÛœÓ(t!LPÊ3Æ AõÌ ¡ùW-4¡žIF›ëmCshó•¡ÍëBPNÕpº&/Íió h¹³¢”g¨‚ž:Í[´¹BshsNE·ù6=´yZšÓæt_thsýÞx[^ m®ß1)mNa0½ÑmÕM˽~î´‚ó >÷#Χœÿ]ïåYofýgø‡&ŸŸŸŸŸŸŸŸŸŸ™˜q ÎßæÁùÔƒó=ðS…à<)Ú› 8ßùÌoW'+8d/ mE¡ Ï cQ¨)[†…”-‘â¤à±H+4]¾DKë¡"Ihå'¡ûxö1d^öh hó¢Ð”:Ââ Ï;´zÊ3ßSmúöª£oþ¹…À„Á‘6'$NÝæÚ¼GÑb¡y¤Í{BsÂí ø³­s¾û›jó}¯©žøÄ·O)@_aÕ«#¯»§º¨þ~Üÿçþðe‹Vê;/*[( FÓkð:8×ë¶çy·UÏYõ”°1‘†æÚÒ¼.夀‚f´9>{–Üö\÷šg´¹‚&J©•cyq]úŠÚœòZJl×H A¥iI-ë]T-Ö)½däBÐ%6RZ¤Í ÍcpŽÛ¼§´å6¡yB›³ñV»ÍÑ@šç´yÍË´y©”"ä”6·BPhs‚®­å”6gÑÐ<§ÍChhó-ÚõМ×îòõfÖŽpòððððððððð˜‰×àüÉúÀÅ_ÿÐ:…×à=s¾5­à|½nl‚µH{Qhu¾…NJÙBp>eKLµB)mÐ4ä¹Hbù«­´§5Ѝãœ:ǃMàÚ¡ÎEž©óº(4U¶,~¨‘ç„ç_ôàj…uΨ¸âµß¼œ+L&T¶à¼Pš{Í ÍÑ¥œ_ëY:¡¹﹬ý¥º„õã¿Vï¾üÎj¹•Ží Пø¤«¶|ûÇ«óïþþ|ø:¾~¤ð<) Í•-¢ÐHkÓ žÿº:ö–_Tïw]µÈ3T¼Ê„ÜñÚǹ•‚¦¡yM›sBÀhs Aµ¸Ž‰×¼M›£hÑj'§brÚ¼î_xêªgW‹v AçØ‰6wz A;´ù¥#ÓæVªò]Ó!Yhž‚vÜæ5m-}´9ÁZl  -mÎÆ›ú§H›£hÉ Aq›[!¨4-ƒBÐošjjåžBÐW{[e´¹BshóuÚœ ƨhiÑæI!h Í¥h1·ù@ÑÒÐæÚäD±Å¦gê6ßE.-ÐæCG·9¨mÚ\Šm²¢ù"4§4§Íу±Y›‚²™‹‚÷¿ê¾iç¯Øb®¿™Â{ä½ÛÁ3ñÆÕ¿§ òðððððððððXP30–Á9ÿx}ðºËƒó©m|èš ©X¶‡2ƒò3Ó´ 'ÎWyóÇ*5©¡T1W¶ + %Ѐ:§¼-R町‚¼]Ô9Ôù¾×þļ¶-ê\¡Ê€:¾óçÞosÛAã;¯©sœº[Š<'ÀA@ ƒF ¡ÎUf·‘|ç“„Ax{ñ÷¢$ ,"4"<"D"LZý½ß1•ACË ¼²¨Í†:—ï‡0AšÈs|ÃZÏQ°…NáY »&E甆@¼Ç©ê\äy‘:¿ÞÊ €%ЃˆJ_!ºVçEØn,êœbÄ /©ƒÂí¥ÎEï®U ÎÇ´(4RçOXLÁùÓ¶ðü ZkïxYuôçÿÓ4DF›×ÄyN›6 A Š–¾Ð<æ©.Uh~éOþZ]¦u‰Èñ]ÿ\õ´%nèküËœêÔ¯üÌþ ‹¯!lïÏkß¹‚û–ï¼OÙu]ççuÎæØ›ÞKõôÈc® ‡'°ñ€3E‹Ñæòš·ÜæI!¨63…  Î',qž(Z‘ ƒ •¶¢åTÓh„1ÐæEËêó¡”SÜ9mN7«¯´—6Çkž‚êÔHt›GÒ¼å6Ohs:öTÂ^‚jÕŠ–eP´èY-EÚ\Ï"Üæœˆ)‚rz&Òæ<ß8]Ã):b!(´9§q‚Û\Šhs‘æ<;SÚÜ Au²‡>[$… <‡Ch~o]zŸ=¯ynóüÞù²¬»‚çºÑæ ÍsÚ|ý.àwÂ~C A;´¹N:•hs~?í2çŽÉç‰Zj£Ý>æÁùô‚ó Ô›Yÿ9þÁÉgÀgÀgÀgÀgÀgÀgÀgÀgÀg`&f`œƒózp>µà|îüdZÁùó6»4¸,6Êç uîE¡ EQhP¶ + -([]˨Ê•3ІJ„¨CÀ!|zÛ!Ür‹<Ï©sù¯Íƒ]¤ÎÊ>+£ÎŸYÓÏ8·ì¶ŠB3êüñO=¨züSÞY-úŒÃª7¾ûÆê¤oþwд@›w4-¡`óì»~oÞp4(s´rE ¡9ú4*¦g©Ió44aøGþß*®ó¾÷›êu»_Q½àå龜¸æûÕåÿ9øß.{¸Ïc€ž“çó<) Í”-%×¹éZäo‡ªOƒó>úýêkœjt> !8´yIÑ’Óæº&xè¡ÍñÒm^R´¤nóžBÐfc/ Íœ× )#Í;´9¤¹~6w¬T+/e®û AÙH²BP­Ž¢%/ÍhsÊz·e¥… "ΓBÐ¥vúŒ6Âz A[´9¡ùÍYh> Íc!hN›[!(´¹Bóm~«Ñ樦VÑÆß¨… ç¥BPÊ–7MhóÍ#m®BP6-c!(Á9*-67sÚœÐ|—Ëm¾[C›MW§T%Òi!(´9eÓÝØ.ÍióPúKS‰½WÁùVïÿÚ 8ožMUKz2&yNípÈœO/8_l&Þ¸ú÷ôD>>>>>>>>>> jÆ98?ȃó©矸ý¿ªE_Ô-š³8ÇûjTgpœ/®¢=ÂÄÆ… Pç?¨pñâ:ßDÔùÆPç"(!)!*:—Ï꿯Qç"0#uŽïœ"½Wà:¯©sÂ(\çPF‹ò$¸j¨ó3ê\NbˆÑ®ë\!>ãÔuŽº²À"u.ru‡uNp‡*bkQç[¥Ô¹Èsé%º®ó+-$,Sç"Ï;ÔùÂ]¨ó l‰áùãyGµÌJÇW{ŸskÎÑ´ +%8F›×Nsô,Ð\A89á8늟–Wüßc¸näyOxÞë;GÙu®°¿žÿ®:#£ÎùÜÃÕÛ^R=¡&òCpCóš6^ó¥´1Ñ)=*‚²™ÑWšhZz A;´9¡¹V«{A2z.µBsN;X)h¹´ì6W¨NWØ) N[mNh~y74ï£Í¹ÇtÂcÉb!hN›— Au¢¤Sª¾hóšï=(5Ú¼PJ¯§\8ñ²BT´ôÐæ<¿Œ6×)š@›ßf´¹‚šÛ¼]j´y¡”*u.ß9Åæ;—ë|)<–qÞK‹f& M©sÊ)qmãÜîPçí¢Ð&8¯ÉsÂóÇ=ùÀêež]~Ü.§š£Íµ†ÑæMhtš×z#Í“Ð|˜ÿ­ºògÝÿ÷4@áy£mÑÏ ttPšQç×9äü™ßû}œð[ÿ]½á OUOYêÝa# …H›CéOD›OTZ¤Í“BPNô‚šFjm®[]«š×… F›SzA·´6Whhó+G Í ͯµM*Û¬Š´ùv)m®Í­„6G¹ÔK›SÊÆÙ… ç‘6Gõ|mΚ¿pX!(´¹6ûP´ŒJ›EËÀmn… *Wfã‘МMH6#6WhÎ&%›•‘6GEhžÓæi!h Í¥h1·ùªš§… ”G£óŠns+…6Wh~ðM?³ÍX6e£T›´SSPhó_mNh~ÜWÿ«zÕ^7 Γ1=ÄùÑÜæÁùÔƒóÍÔWÿ¾þ¡ÈgÀgÀgÀgÀgÀgÀgÀgÀgÀg`AÍÀ8ç‹yp>õà|µ­.œŸ–TRjdÄ9Áù¡7“è(¹C?@0„ÇÂr}‘–Pçëu~Ç„Ô9…{PçиΡÎ_„ë\®áåhA„pt-÷ö¯˜fÁ¨saæ:gA•î-ê\^ã6uþ…êü3bÔù"\:×¢˜°CK+AàWSç^zhÁuþNéZuÂó«÷„·WÏ}Ùûªw\zç TÁùy*à„ê¡ùŸB!¨ê”è6OióÏ< ÍCX~5ëɪCt£ÐKáyt©ó‚®…à\ëä¯ý¢Z—Ë«',þMpž+ZZ… mއſDš×´9… lfX!¨ÖóT šxÍÛ´9Š­•Nô.¼D(}´yÝ·Àé—n!èœPºæBÐmNhž»ÍË´9÷ '5ìÞ±Ð<+m4-=… F›£hÑÊBsN”,Ý*ÍhóúùÀ³"U´ä… ¸Í­TÏA!h—6ç´L Íq›m®S5Ðæt;ð̳BPhs…æ·yRhs)ZÌmÞ.åù[*唜‚6Š–œï­“EmÚ\… ¢ÍchÎÉ$z1¬´v›s‚)/å÷MZÊ)(hóc¢/ºz,-NR±t¸ªe‰UNõÐ|ê¡9¯ÝÒ ê¬ÿÿÐä3à3à3à3à3à3à3à3à3à30S30îÁù{<8ŸZp~À)_18§´]JXµÙÿa^äÓœ{QhP¶ŒuQh¯²Eá_Ÿ²E^ç†:ßDE‰&.ª@BwhQèÚøÎ\*À4mF‘:WXEéì*!¨‚(~Jt ˜©sùΗ/P焲 gŸ´œ‚ZÛ†:?º‡:O §#uŽ¿»§(×¹…ç¢Î÷…ç»ÖÛªÕÿåÜê„/<\[ççßió:8§´à6Oiói^‡æ ̯aý²^õÿŸ0Pðœ¯R‡Ð’@Pçè†ê\¥x u."0jB'Â'èMÔî¡BXÙ¨ó[-´‚úl¨sÑ 8ˆê\ÁÚHÒeöí£ÎEŸR("µë:¿ÉÂ8B¹¥Þ¤pŽB£Î?ÕC_ô‘:G;!’w³„…×¹ÂsÂE)-,8ŸeE¡ê<„çÿü¸·UOZä€jóý?^uÇoª ƒóަ%¡ÍkÊœÐüc¿üGX¿ ÿy ð\ê–Ax|çžGê\Jw‚sˆw”1ðÑs~ÀE·UÏ^é¸@Ïסy ÍKŠ–¨iyWØ`(*ZrÚ\š6-ؼ`Ãhsmjd´9E¯·yO!h‡6¯7ñjÚ<(Z´:… ¢ÍÙ´Ad… !8o)ZÖ¿8lü´-šm6ˆ6‰… "Î;ŠÑæÜ+}´y,唇N{pÿÙ}˜‚Ú\÷kGÑ’Óæ:m¢'íÐüKöŒÈióA!èת"m®Ð|@›+4§T§aèbµÔhóB!('s6Mhs+…6WÄ–I!(Á9ÏÝmNhN7E(´yx¦Óe‘‚rò(¥Í­Ú<)Íió hù¥ýÞ!8Š–÷é÷Ò¾½gZÁùšÛ_îÁùÔƒóO.È7²þ³üƒ“πππππππππÏÀLÍÀ¸çÏðà|jÁù‡?uÿ´‚ó—lw•Ѝó;uîE¡ã^ZR¶H3‘([ZÁy1<‡:OÂsÂGBHÔ*\„ê5º×|ç‘:?OÔ¹Èóu.ÚÒ3RçFyRL{ê€K!®œÛ]×¹J-—u.W÷ ©—P8lÔyIÙ"]KT¶Dê\ʨsÂóþçý«%—=¬ÚëC_VxþǪ¥EœJA£¦Åhs-ÂpBñš\yºBxÔ-mê¼?8GCpJBÿT½ïó?®^¹ÉÙ¦š1jž}N›/ª2PÖÓÒÐ\¯ ¯Qôš/U*mŽWž×»¯4Ñ´ô‚¾X~ó¾BÐ>Ú>³e¥ ©¢%§ÍG-½¼ZâuYhÞG›Ó°ÕuÕ’ÅBМ6GÑ’Ñæ»æ´9^s­´to‘æ)m® ¶mÞWšÒæškcÏÜæÇ|Û6üP´°h… Ò´ä… ”$w- ÎÙd4Ú\¡9›AÑr·©°PbÅBÐ@›«T´9 ­>Ú<-%8GËmN9tê6?P /-(½¢¢%-Íióš³qió¾ñßÕNg}gZÁùûƒó©çÇÎÔ›Vÿ¾þÈgÀgÀgÀgÀgÀgÀgÀgÀgÀg`AÎÀXç¼ Îöð|òáù¼¯ÿ|ZÁù³Tªv–ŠÏ„:/([BQèoª¡ÎRp4¾¡ÎEþ}˯ŠÔ9Gí¡Î D  HJ ¡Î P Î÷½ö'F$°Dê?.žÜ”:'¤A @hƒ*€gQ u®‡Àg‹HŸ5 Î7:—–€2<ü¾Hh ðþâÿ]ê\A^`Â'£ÎFµ¨s©"uŽ2áE¢@qã &èÂwŽfÝ‚QçøÎ'K¾¡{€`íPç"Ï‹Ôùõø=Ý‹BÛÊ|Þ¦l©d´%”eª83([BQhT¶ÄàüŸÿï~k…ÕNªŽ¼îžà8¯ƒóK¬4ç}šBñ48¿ö¿ª*¬¢CœëçYp®Ÿ¶HøÍÞzuõþÞ(f,4Ðæ¦hé£ÍÙHX|Ú|™ÔmCó@››×¼H›Ÿ¨Í­µÂFˆ‚&nóHš£Ç¾g hqÞ¢Í)ÕŠÁyš×… F›£hÉhs6{úhóMëÐ\š¢‰isBókš+8o¼æŸižÒæºÿÚܼæ}´ùî*åDÉBМ6Š–¯Úsä…à A¡Íšs¦¯”gÏ4s›7… ·¹‚ªÿ!-Ý E ´¹ž¡Ðæ„æœæ±BPhs=osÚ<- ´¹ AÍm^.å¤Ïþ¦Tns£Íõ;"¥Í£Tš A9ÍÔ‚Š6¡9§Ÿ Íßÿ_Wo8öËÓ ÎßrÔ<8Ÿzp¾Õ‚|#ë?Ë?8ù ø ø ø ø ø ø ø ø ø ÌÔ , Áù'=8Ÿ|pÎköŒÕÎñV%j„N`e^a-ù`Ñ#£D+(.RçuQhž‡¢Ð¨l:áùãô¯·ÝEÕißø…9ÎGÎE•C—”—‚s‚õ‘ˆsçIѲÇn®_ú]FŇÐ\‹Ð¼¡ÍK… ÛƯÁ 4Ï AyÝú Aûhs®Kת—6‡4ï£Í›ž…ÌmÞ„æý´¹)ZtÂNE´-—Œ\ÊIŒÞBÐ"mž(Z(ìµBМ6ÿ\æ6¡yVZÓæËâ6/Ðæ!4ÿšmÆQ@l… µÛœ‚âà6(Zèbè‚B›+4Ois+í¡Í)SÞL›Œ¡4Òæ¡x™Ð<ÒæÛA›kÓr5§´¹‚J«ÅF'š­”6o‚hs´]¥BД6GýEñô‘7K–(ZÎ)e—\6t×ÇMÓ Î>ãëœO=8_n¦Þ´ú÷õD>>>>>>>>>> r†àüXΧœ¿øuL98'ð<î‹Tgu^+[F( %¼ ÄÀ7©sB(AhA¨A¨sŠÞZÔ¹(Ãu®ãûPç”ÇAï%ß9Ä"ä"¾\HF è Î muþÃ@«°.Rç„=Ð’8z¡'¡( † +¡Î7†:mI9^C‹ÈlQçǨó´(”ðœB>Â+” u®p 1”¨Qç¢F[Ô¹2J)4MƒÊñ/½§Djê:ËçCW¤ÎÚíQç^‚ß&8Ÿ~Qè??NÁyž¢/òÔwTÛ½ûÓÕ…÷ý¡!Î/{ø¯æ%§Øs"UK¤Í'«j9âc?¨^°ò áJ™mŽ¢%+…¨ï+íu›Òœ5­BP£Í¥gé(ZrÚ¼½q·èjÐæR´ôÑæ¨‚Œ6'4×j…æs­àW¿i‡6Æk®is¼æ·9^s­-U¦‹Ú¨·ô†‰ A;nsHs--Chs+Õsá9:•²\©·¹ž+œj‰… œv)‚òŒê‚Š6×išm.E … :qc´¹ž…)mÞWj´y¡”gpJ›¿%Òæê¨àÔÏðÜmž*ZΣ¢%‚þlP m®Ðœß#š›ÛüWÕ1ú=“Òætn@›Ÿ¨ŽWîzÝ´‚ó/ÿžçS ε ßÄúÏòM>>>>>>>>>>39 CpþFΧœ¯»ÓUÓ ÎþøýÕÙwý>Pç^:>E¡EeËü, Uy"ací:'„^ª“¢Æu®à“T›0œd° Ÿ¬_~ºi:ž‚®£Eд‹¼HŠT(?–?qu®‚J(èÔuNàûL¿­ð<ºÎEW£'I©sœßEe Ôù (4Î#¾Ìó¬üÈ·ªK)UpŽ®…àüŠŸ†rÐyhÅrК:·bÐI–ƒž&ýÒZ[žßï!8OCóZÑbnómi>mÎkÖG›SúœX*MKVÚ¦ÍQ´h¥Š–—´O½E‹3QŸvyꪥBÐ9š­Ôm^(íÐæ14Áù… [LPj¥ =… F›£hÑÊBsJ~)û(Z2Úœ3­R!(›m)mŽÊhs)¡Ø¤+Ñæœ†iÑæÚðCÑmnŠçV m®Ð·yP´|Ï6ÓBÐ@›KÑ‚Û<+ݦ§”L£ÍšC›EKÎ){nÓæAÍ•‚œ[!¨çØ&k^zd^is…æ‘6G#ö‚->:­àüüÏ<èÁùÔ‚óÏÎä›VÿÞþ¡ÈgÀgÀgÀgÀgÀgÀgÀgÀgÀg`AÎÀœ?ǃó©ç[ðÉ)ç1¼Úó#wTþÁ,ÚG»ÑæÒ³t-9m®×bÉòÐ\Ä9´~KѢו×W… ¼ÞåBP¹Í9°ÂBФc¡¿TÄy§T´ùZ*åTƒ‚†à¼¥hi¹ÍÚE ³¬™f¶'.ÕÆR©´6Whhs÷v-9m®{Z:¦vh^¦Í… _³Í7£Íµ7 Í¥h¡4q›§´y Í[… ‘6?¹[ÊæáëθËVM!(´¹6SÚÜ A{hs60ÙÈ … ‘6ÿQ Í¥Û‚6G¿Eù3… oK AÙ4µBPhóDÑ’ÓæAÑòËŠ Y‚s ©ÓBP6p¡Í»åÙi—aÁù²kœí¡ùÔBs^·fòM«oÿPä3à3à3à3à3à3à3à3à3à3° g`a Î?ëÁùäƒówøÖiçú¹jŽ‚óH§E¡§AßþÛê”ïüOuò·c„¤_‹:W¨A¸AÈAØÁ{ŠÝ ¡ E  qÙu~ãO«w¤Ô¹‚•ý¯¸¡Î ^ðäÄpüŸÒ9<º»¨„ŽÐ¿.žÝ#u."r@ßÛ¡ÎqøA[n|ê÷M[€¾:Mô”ê¥Ô9Dg«(ôH/ 5¸¨l Áùc±(´>íŽs[®só[x´-­¥@ÿ- Í ÎûÔÛ9¡y ÎMÑ’Óæ„æ*4Wpž†æ¨hž–†æRÕÔ´¹‘æK‰4/ÑælB Àé+¥¬u¢BÐŽÛ<’æhZ¤h± »žBP6^ÖH-9m>j!èåÝм6Whþô­®Ó) m6qZ£¥hm¾¥ êè-Íis¼æZ5mn¡ùÞê4¨ Aé9(‚B›÷‚¦´9 ¯Ð³ç•*+^õ˜oÛi˜WNƬI!(´y¢hihs=ã ÍEK¤ÍëBPhsS´(8… ÷´ AÕ%mž‚ò ¶BP‚ó¬”àœ“CÐæœ$JÝæ&nó¨hI AsÚ<†æ-Ú\… Ðæ'Õ´ùÁŸx0{æL.8ùæ{p>õà|…ù&Ö–hòððððððððð˜ÉXX‚ó“<8Ÿ|p~ò¼»¦œ¯¾ÇõÕ¹÷üѨs Ͻ(Ô|Áè§¢²å•ò ^M¶(e z‚³QŠB‡+[Dœ'Ê–%·‹ÊéZŠÊ–aÔù•:W™¢•*6Ôù¥=Ôù…¡¨ØÂsÑÁrRz–©s…X¦¹ë¼ã;O]ç"™s×9Á-žíçŠ:‡†nQçG¨óÃEX'E¡K(@^üPó~,?¾ã:‡Š6F?Qú\ç(QV—ŠBó}ý.î([bY¨…äÙ⋤y¤Íýä}Ýà¼.-ºÍchÞG›óo…´ZšÓæxÍmÎël¯wæ6çºmŽ“~EÜæ(ZNî‚r}åµï§Í)Õê+5ÚEKF›s ‚¥ƒBP”H A_W*½:‚rú¢·T÷ê#ÝOKmŸ†æ‰¢¥H›×… ”ü)ÍÝæAÑÝæR´ô‚B›+4_%†æ‰Û¼H›«ì8„æ]Ú<-mhs…æÐæ„æ[Gp®BPhs)Z¶k-!8O Amþ¹Íû A¡ÍßžÐæl–m®ÍÓ”6§HšBi A¸ùƒBPmĦ… èÁ¬´¦ÍÙÈÝûâïO+8ßà-×xp>µàü·z¯öfòM«oÿPä3à3à3à3à3à3à3à3à3à3° g`a η÷à|òÁùE_øqOpžXýª–å·ühuÞ½¬æÜó‡êœÚu>™¢Ð÷á:uNȨsùΡ΂žRçòØâ´…64ê\!Jt°´p¼ŸcþPç”ÌåÔ9¤c Îh¨sˆHBÔÁu~¯…@[ιÇhÊ-DUR€·YJËõÛ¢Î4Eêœr=Jö 9 §bxŽ"â“‹0 …ÂK»Õ üP+P臣xy…`P¤Ð¤dËÉeŒÓøÙ¸Îå8^fßPh4ªÈT´Áu®E§’ÁŽëÜ‹B“àüÑ/ úúÛ‡àœ…r%”…þ¯…㥕:Íùó|Ý{o¸·'8…  òŸ¨@Ÿ`¿·ôà‰ A;´9¤¹ê›>ÚÒ|"Úí«£hI AûhsT?=´¹)ZÖ•6/)Zæ™ßÏÿ 4O-EÚœÐ\kÇa´9*¥ÔmCó¬´¦Íé7(Ñæi!(Ï +•¦åÅz–” AÙ¸k‚FÚ\Ϫ”6·BPÜæÚ<(Zî²ç!ÏÅ@›‡nž›>>>>>>>>> r–àüÿ(8ÿÏ'ž/·Î9ú|‰Š'œ£M8ý¶ßÔÔù@Ù2¬(ôd”³ql°E+ôÈ©sŽâã:WBSG ‚ûöß>ùŸv¬ŸÀ¥EË™¨ó™Òâòê|§KqßoÞí¡ÎEJ¢h¨s‘”:¿;Pç¢-£ë|¨óS¿Wm¨€i\ç¢4Ñà:‡:_êeKJË/Ü¢ÎnEêR”b? þ"uNxNPöÜH£lé¥Î½(tBYT (AòðÜt-ãUúç—þXÁyžGúœ€<_‘N'hçk.Õ:æqÞWÚK›ã5Ï AµY‚.‚Ö´9ŠŠW­´Ö´´Bs‚š¦%*ZtREK뙓¸ÍÙ,©CóXDÜV´Ì1ÕÏÓÖRÚ Î3EËÆ#‚öÑæÑkÞr›'´ù›¤haƒÊ Aµ²Ðœ!œ ±"¦hÉhsN”h办Ïk-_³ç„‚B›ëùÁéž'/Ói–•{ A9ƒFŠg'cxVñÌâÄŒÑæz–A›[h®çϹMÏø~Shs)Z ÍEKC›ë9 mN‡D‡6WhÎ3˜g1ýVª“AœÂmn… ê«à9Î3½D›ÓwÁï¼Ú¼UªLF›+4Ois~÷šŸrÛÿTkïÿéiçGžÿΧœïº ßÀúÏòL>>>>>>>>>>3= Ep΋ Ðü‹œO>8_õ—Nœ7%}Mì÷~þáêüûþT‹²Å‹B§TjÊ穲%P牲¥vW¶ £Îo²0ÏB=Â=”¨%¶Çu^¢Î¯«žþF!âvÆñŒëy‹«¥°qÞK+„èÍ©sÈ_‚L‘Àmê\¾s…Ÿ]ê<”…Ú¬ 6Ôùé”M6|T.¹ÈJZx³#unáùû«'¿P ]HÇu^R¶ÈÝýLÄ„Äê\a2îïÅJÔù;­l“ÒM#»Q£@z‹øÆ3þτٱ´3ùO‚óKœ7á9ºV ÈóÿŒ¹…æõ×sý=ƒïÝ„æy!hF›?õ êñ¬V!hM›×… xÞ­´T:Ú\¡9׊kÖU´¤nóžBÐm®ùÁ™mÎi†"mNh®µÑÚÒ¼C›Cšk½QóÏ}`… Z¥BÐ>·y ÍwÉ Aœ'… KïU(…6×=mn¡¹¹Í¿f§Q8•‚¢eÅDÑ’‚ænóPúÓGœ[!è Úä«Có¦TÁ9… l Zh A{hóA!h—6gc’ ʼ´H›+4ßoH!h Í1Ú<†æ%Úœ¢éV!(´¹6h)¥ŽŠʪ?¤àüe;^3¹àœçM|æè¹sÚµ÷xp>µàüe3ý¦Õ¿¿0òðððððððððX3°0ç§yp>ùà|“=?>…à¼Ö'ˆ8ç¼{ªüðOF÷…ÞùÛêÔÛk¤ÄÇå[Ô¹ABÂ<µ½ç>Gñ I(‚ƒ6$<¡ ®¡ÎåÀ…Nl¨s0û*ˆÙ×¹¨ó½jß9¤ãnPç"w¹|@CFâãÝþ¢ê\ÊJø{)ÀÛB„åæFÿÀèK(L‚%¨L‚&(͆:—ö E{QhPf4Á¹…¤[pþ£¿(Úœ@ÿÉïP¸¯€¿£hÉiséirڜ̈́gæ… ÒÜ@›S¸j´y©T´9 m^(í¸ÍEš'´9›'¶:… ¢Í)˜]‹àEKÎ[Š–FÓR.¥Üv‰×iu-y!hâ6oBs‚¢7j Ak·9R(‘Œ6¿©C›SÞÛ¦ÍËŠ–mÞ)…6×f[J›Óðrhsu)¼B t+D·y±4Òæ…BÐMêÐ<¸Í¥h‰´¹ž‡)mn… ¸Í ´9¡9ÏÚPióÐ?Á³Úœ^ £ÍEš¿-)Åmn… :]”‚œ[!(nó¦tà6§3EK§4¡Íù]ôœMçvƒóF ¥9|yÔCÕª–,8¿ì–ÿôà|òÁùŸôíŸäXÿYþÉgÀgÀgÀgÀgÀgÀgÀgÀgÀg`¦g`a Îwõà|òÁù›Þ}ÓÔƒóÕ>\ívÎw,8‡:÷¢Ð™+ m”-S- …zTQèõFÙ6Ô9ômC‹<ïPçWT‹o"ß9 ¨s_‘¾‹m0·ZìµZEê\'ág‡:—Ëš°´C‡@«ñ'Ôy ÏÎN¨l9.¾(F(¶¬]çOZ6ø»-$…:ÚÁÚ†Þ&ž$uþší.®æ>ô—j.áy\1@/ü'áz ÌùÖQ×ÕÄy/mNh~ ýÝÚ¡¹þÞOKCsÑô5mn¤ùRò¼—hs Ay½ú A;ns-Z\“¨h)Òæ )ñØ7'[8Õ2Øœk¼æ¯î/ ´ù¨… —wCsæ¹UZÓæ[EÚüú2mΩ†‚æ´9Š­TѲ·Ê~ëBÐez A¡Í)FÑ’‚¦´ù**~…‚s AW•*Ðæ·mNi±Ñ扢¥¡Í … ¨©b!(nóPzw]zO»Th¯REKN›GE ›™ç(ZØäÜmN!´Ñ扢…T+­Ýæi!(Áy»4£Íë ÜÅ^­gL½1N¶¤ ÃóÅ_~jõ‰Û'ÿ»Öߟü÷7fú «ÿPä3à3à3à3à3à3à3à3à3à3° g`a Î_æL'ÿaþí'¹œS„ÖõÅ@+õ û¶:î–ê‚ûÿ¨ó!E¡§ßù»êÔ;~kÇä#uÎñy\çïÿƯ„<.¥Îoɨs‘†‘:§(Ž#üP‰Ð‰Pç¸qqäÄu®`¦EË­K9] Î4J¼¼øy·3êü> …P@u®ð(Rç„JP™)uþÚÚuŽ3 :‚*ôW„X  ¡„\øˆñ~á:GÙ‚‚ad^Š®å±YºÞvU?ø—êbÂó:@o…èi ^ÿߘëÏò5|í‘çu!(Z˜ÞBÐ"m^‚¢ ZšÓæxͳBPò}… èsÐè¤nóHš·ž3%ÚœBP­¾BP£ÍQ´d´95lØlP¦Í4Ê@'¤ÍKŠÑæ*Ðæ14´¹yÍ‹´y]Ú¸ÍG£Íƒ¢å«¦hy!Š–¾BPhs=O ÍéR˜6O AÛn󢥡ÍõÜãùÇ鞇M!(´¹ž—Ðæ„æÑm¾óe÷Û³•gl ÍUª?æ14ÏisN E·ù;"m®ç{J›sêÈhs…æÚ<œPŠŠ–œ6Š–è6‡6ïü¬Ù˜koÎE-Ôðàü…¯=ÏióÉÓæ¼fsôXÿyþ¡ÉgÀgÀgÀgÀgÀgÀgÀgÀgÀg`¦g`a Îÿ¯>˜ýÑÃóÉ…çÇ\tûä‚sȼHƒŠ8_ÿ€« ø³…çç×Ê–9÷xQè(E¡¡„]+÷…’A™ö…~ÙŠVÝû‹ÕÒ{)ŒÛs>…¢¦×ùéP·¸ž:×Rq"tîPê|ã”:y^¤Îz~ÖÔ9…‹®!ª²˜°´C+Ø‚JîPç©ï<¥ÎE;+ 5ò\!ð³EQCSËßÝOKcBÀ\»Î)Õ„Úî§ÎåÏ]ç‰ïœàü"Ý7=øç&@oBô¦'ÿiay˜ó5¬#åYn+ZÞëOÔÏî-=xâBÐmi^‚öÑæ¸äYòÊ A3ÚÜJˆµ:ŠmÎEEKú|i…æý´¹)ZŠ´9^s-fqh!hN›ã5Ï-·yRºc,­ƒó´t×ÏU‚Ö´ù²=´yÍË´ùKûf§Ú<*Z¬4Òæ*Mis+Õfª)”SM!¨6Ch~—#oÑÐæa#‘å¦TÁ9Žè®:…  Î)Ý­§4§ÍK… 9mnŠhs©¼ŽÒÆjJ›[!¨6_ÓBP‚óšH¡ùiÚ¼}çÇïOž-i—B;8·“-,6xUË«·ý¨çS Î÷žé7¬þýýC‘πππππππππÏÀ‚ž…&8ç…Qhþ Î'œŸõ‰ûêà< ´†çYpþò®±ï‚ûÿÜ([bQè9?øCuö]¿¯Îúþï«3¾û» êœà‚ƒ’6\çF«¼ êü„H+‰®ó£¡Î’–š&âÏ-®sB£Îoüi¥ØPç¢÷¿þasçBC7F×9º‚œ·ˆ„ܵ¦Î!$[Ô¹Êu~oC£*€:ÿ—ÚuuNÞÆ§~¿Ú¨vCoHAžT¥Ô9%}-êœð¼¦Î Á¼(Táy+8l…®·íE¶áÄŠz ÄDOVüïãƯ;âã η¿Hó!´9™ŽÛ¼¦Í—¨-O/¹ÍiÎbCa hÉhsHó>ÚE‹Ñæ¥BÐôT ´9… ¡|8(4 ÍµyÒG›ã57ÚœÐ\ ‡~ã5Ÿ AURkÚ Íµ6M-Ú\å·¨ˆØ¢··ô+Ô]jX!hœ¿%zÍ“BP6·´ÉÅf×@Ñò¥êY‚JÅD!èr¥BÐ>Ú\o%Ú¼[z»„Y7¡Í7 ô”PºqRJpÎsŽç´yT´4´¹º  Í·ohóð … Ðæµà|õýÖžhòððððððððð˜éXØ‚ó9œO.8¿â+?œS’fîáZÕ’甬òEêÜ‹B³¢PS¶Ü^­YP¶@†”-·¶”-ÿEe Š£Î¥lÀu¾œ‚µg¿í+Õ³ð‹RmSç"ÏSê|wv*%„z}ôkÇu®2CˆY<Í„ ME±­”Ûhu¨s…Š½Ô¹ôÒ`PZPiÔ¹–L´]ê\E¡ÒlX¹ãÚrSøØñ§Áyí!N©ó•ÀF"š¹ã:/Pç½èEž}çQ燫4ó=ò€+`ÆN༸Âç^êüø†ü†:‚Hp…Û„ÜFˆ«t]çœÒ`Ã)á­ =êõ¦†¯ákøøÝúžih®Ÿõ¤a´9^ó¼Tÿž¼Ç{«´¦Í¡óqÃ[!¨VGÑ’Òæ„æ‰ÛÜhs F›ãš–š§[:Gs¡BPÍFo!h+8/(ZðïO§”{¡¯ôM±Tš–,4Ÿ6çĈV©”û=¥ÍW¤T§´Íº's›gŠ£Í¥‰âÙ³–žA”³™Ç¦žÑæ Í¡ÍÙô3Ú\›€GEK Í¥h!8O- m^(%8… Ðæ(Z¢Û|o¹ÍÙÄd3Ó Aµ¹Ip-(·Þ AœÇМR6Lc!(©l¨FÚ½—Ñæ ÍSÚüämÎæí6'}mÁyò|©;v9âóœO>8ÿ«Þ›=a¦ß°ú÷÷E>>>>>>>>>> z¶à|oÎ'œóz=ý•¢ëR…BJœ ÎÏ®ž&"ôB…xа²%- ½;¡Î¿'ê\äyC×¾s¨ó“ Îå;'øà¸=%oxk! ! ‚:¿9£ÎE"BS gÔ9¾óÚuŸ¿BèF‚ÈÇ2uþ@Mßo¾^¼½ÛÊu¾¹Îï5¯ï–sî± u¡Òf¢2ê\´f‹:?Ù‹B½(T!6ê”\ÙRçl2±B€W8½Ñ ÊCX_w¸‚s£Í æù¦hÑ*‚RdÚ‚*ô´¹Bs6z A[´9¡ù±íÐ|‚BÐ2m~šˆ^Ö… Ú\›+l°°Ñ†K‘6'4×BÑÒG›ovUµ«¯´—6‡4Ÿ€6gcj×¼4¡ÍÑ)í%ÒóãjÔù¢P¨?‚ Sj꜠ƒÀãÄuYØ¢Îå¹%L!TÁ ™uNèbÔ¹BŽÿC£€nl¨s8øÎ÷˜÷#Ó ØUtä. } & €põBãï…¬lQçRêüî@«@/RçP›Ð›8ƒq¯¯â=èN/ õ¢Ðœ:GÕrÞ½´ez\„âõ",ÿw Ëùsçݾî°k~Ñæ„æ*4WpÞòš§´¹43 mÎf@/mN!( }… Ðæhsl +ÍŸ)ihŽë~TÑ’Óæòšw-5mÞ*MÜæ‘4ï£Í)ÂÝJ¡ùÖ Í;… ¢Íw ”༯4§Í ͵öTp½æ mÞW mÞWšÒæ¦hQpŽöiÕc¾]Úü6£Í×<^Š‚óDÑÒÐæ…BPžc±·¹)Zœ‡BÐm¾¹Í»… ç)m-Sv‘:—|qÑ‹¨s‚kØÙ¦OÉ”-ëˆ8?÷ž?V鯽ùO‚ñtþ _{Ø5"ÎKŠ–"m^‚ò÷]BïÞBÐP :´´C›Cškñ÷Ñæ1€TÙâ@ÑRŸbi‚æ´9¤¹Š£ÍQ´d´9³´«L›sb‰×é$D§ôê0¿Ìqo!¨hsœÿºz Aw¾©ã6ç^³“„æÐæVªÓ#œ" Š–è6—¢¥¯Ú\¡9Ï ž«*8§t˜à¼H›'… 9mNÁq‹6¯ AßP‡æM!(´¹Bshs6#mN¹r ÍÃ&¤‚jS2-ÍióV!(´y]zp^ m®Ð|@›«ôKEKN›ÇиÎkêœ`‡€g·HK3ТÎçBÿ0PçÜk~_B$LB¥-DdnnÔùLq@±Ô9E{¸ƒQ¶4Ô¹‚+Ã^êE¡xÉ×q>çž?h)a!(š¾BÐ>Úœ6 ´Y>*ZœO¶ÔN°” AÛ´y¦hY¯D›ã5×jÑæ„æZ­Ð\Z!mô<}‹44×FPªhéÐææZl,õÒæ*ߥ€WE¼!8¡yB›¿U*%… *ö¥à·9¡yt›§… ¸Í­TšHs4Ny!(´y Í­4ÒæR´¤´¹‚ê Ï%žOVZ»Íƒ¢EnsS´DÚ<<ëèxh A¡Íšï g#'s¢Ûœ;F›ëYŠÛ¼TšÓæ<ŸóBМ67E ´¹žûG%… üN°BPÜæêÅà¤'–ÎchmnŠ–„6ÿÐw~]ûͳÒᑈóSªg¾ú,Í'šÿ]ïÉYÐo^ýçù&ŸŸŸŸŸŸŸŸŸŸ1 cpþvÎ'œzÖ7 Á¹Ž¨7Á¹\Ò8¥{‚óÍøêÒŸüµºäÇ©æÖÔ¹…e tçú=E¡\]P¢£ u.’ñK«©s•ž­ˆë\* TЩ„m B­>K®óeöýRâ;ÿ¢é!LõJ—Rç”Rføf³;J_o* £Îߨ°qˉ¨ó+ªÅ7¹\a¦¨sM‚M•7!ÜK+$ÅgSç”E¢òˆnâ4ìŠe~)uÞò§Ôù‰=Ôùqry'Ô9ª’e2û‰Ï‰Ý¡Îå‡Þ®©sêÇ?MZŠ8ŸzPÐ¥´¨sÜuQèÚ"ÎÏQqn\sô‡ =„éíUÿ÷ü™äkÞ5à¼PÚÒ´D¯yRÚK›‡ëPÚ=KGÑRÓæ„æþ+•-éó¤ý,ázÚu]]×·SZÓæC Aç†BÐ ‡‚vhsBs-æ·—6‡4¿aâBPî+MCó¤ÔÜæ‚jÕ¡9÷)÷«Ñ溗+‚hóš—ión!¨ÜæÚ¬[7¡ÍQHñ\B)µqRJp^*mhsmæ… ç±ÚÜ A¡Íçµis6+Qeå… 稵"m~HN›+4gƒ4*ZÐuQ A¡Í­T›¬i!(Á¹‚ÖÁyP´Úü¨Ï=ÜG›&©Û¼PÚq›ÇÐ\óŬ±Y³i‰6‡4Ï-mN!¨•‚¦Š–š6Ggô¦XªRÐ,4Ÿ6in´¹Bshó¨h1Ú¼Q´|Í6ÈØ(3Ú\g6¿Õhs+Åmž)ZŒ6?^nóR!(´¹Bshó"m®ç§db!h Íïns=ßbhÞÐæ…BP‚óX mÎ žm¾Ÿž»<yó<.ÑætU𧻂gz,…6o‚B›ëw'’RÚ<-ÍisBs~ï0ïÞƒó¤t8 Î×ßõjÎ'œ_ñh¼yõŸéš||||||||||Ä ,ŒÁù" Î9ìpG| >òÙ‡¦œŸeä/Þé•þõŠê£ÿ¯…ç—ÔÊ–ÇlQ¨ÈKÔ„J„K¦lIŠBMÙ¢@ª) EÙ’…¢lQY_ªli¨s•û¡] ì1d)A¡Ù‹¡Î¥kXQAÞc¨s”„m u.åaÜ2R@ÎÝ*Ê5PçZEê\”l‘:W@H bî:'PDc±µ¨sŠê\ä®Ô]×ù•`–©ó<<Çu®…ÇŸ5Ô9~k…¨‹®¡¢HÊ";Ô¹hQNB°±Ó¡ÎC™•ºìšë\Ko×u~¼ÄOZNa1¡ñ³UŒiÔùÑ“¤ÎEžO@¯½ÍÅäÅCôQþ3~Í¡çç¥BP~þÓ ´¹Bó',9¤TÿÖé‚–isBs­Uš7pIÉp,íÐæxÍóBÐ û Añès²à|Ó¬4–‚¶-šYæ—ÓVªU*Õ=0(Õ}¡>Nh Bó!´9÷žÑæE ÷§Ñæº_¡Í£¢…S$ÜÓ„æ(Z¸×Q´pï§… <¬´ÎC!èÀmn… 'ˆ4m¾ÞIwZA1Ê(£Íõ<‚6Š+í¡ÍÓBМ6Š–¼´H›+4Ïió;´y(yŽ¡9¢9mŽ®+ÒæQÑò~m°¦´¹‚B›k3ö´;Û‚œso½åœÛÊÁ9ÏNUÕÏæ•WM1(Êz–üë;>íï+F|_‘¼;dA¼YõŸáŠ||||||||||Xè‚s^$}`ûç£o\ûí_UO}iFœCÙ¥ª ¼ê2?ó‚óg¬w~uù*8XÔ9áyRвêüüûþdÞfT¶„„gè=Ô9.Z(ÁSz4Ôù­¢ÎŒpÂð¸ÚwŽë‘Ò8ÈDEB—CE,âÉ5ê\…s¨êüQç"¡¡Î)¬ÛëšY‰”$n^t¸z „(½CGÐPç".Ôù½ u¡ uŽê€àœ0Šð|ãS¿ïE¡(2ä˜&È Ô¹…â%_{Û‹mþ„+ ÒÓP½õ×_Ã×r•‚sÊGŸ,¯y±4§Í Í3ÚœâS44-E‹6 Ø8Ђ‘æÏÕ†B‰6§”Mˆ¾BÐæôʰBÐZÓRR´°qb… Z¥BP+-‚Ú|ÔBÐk³Ð<§ÍñškA›S¢«2Ýg As·9¡ùÍEK‰6ï+MisôMF›+4Ïiób!¨‚óšç´¹6öòBÐH›k#0¥Í·¡T'm(åäM,%8… r››¢%Òæáyʉž¼ômzþ¦´9§‚è¤H Ay†¿'¡Íé´hÑæú‚â6Oió¨h¡”ß/‘6'8ßê¸/%º§³C_‡)ŸÚÁ¹…æ…àü­ïû¢ç“Î7|4Þ¼úÏôM>>>>>>>>>> bÖàürÎGÎy­ž½ö‡žsBóIçø‰/¸ï uþØ/ Ê–XÚ([F, …VŠïœ` ÃpêüëF¨ºA­R0Å uNñà€:¿Å¨×†:ßC®óÝå`ÞíóVdhnæu®€Äš:_jûOšïyÉmkE‡:¹û†ê¼žã:ïS¶ÔÔ¹‚R L!Ž:?OÔ¹Èó¨ó@‹Ö3\“¢mê\äy‰:ÇÝM@Ü¡Î$©óÃÞ&Œ~ÂÓ¥@Yâ]òË%¾Ø¡F{w©ów­Š¼äk‰8Ç»Œ²ˆCôQþ3~ÍÁWÞU¦Íñ¬7´¹þNü½øûÅÐ|)•v Aå6‡®–þ­}… ·9¡yV*ºß(ÿNhžö$hs®+Kטkm§ :´y©TÁy§4£ÍÿEe ¬m A·Ö)ŠmN!(÷@o!hN›SªE¯@ ÍÚ<-ÍisN‘DÚ<‚æ´¹)Z ÍõŒXU'Tm~[Ep¾æñ·WF›ëDKJ›÷‚mÞ)½».½§]ª’ä¼4§Í£¢…ÍH‚s6'óBP‚óXÊÆæÁÚàÌ A¡Í­T:.‚s6JK´y(ýµ©½Øl5Ú\›¯Ðæi!(S¦D’ iýwÜ4ApžøÍÓgHýyϹßòà|òÁùâ âͪÿ ÿPä3à3à3à3à3à3à3à3à3à3ðhÌÀœâÁùä‚óUÞpIpNYZ/qˆÑS¾þ £ÎÊ–aE¡´#RçˆÐ)uNÁÁ .[Žç7Ô¹ŽíSG°’Sçxr ce"uŽ€Ðæí uNaTäÞC©ójêüþj\ç"/!0!1eË)[DouNxžRç*àÃ)ìE¡Pç^j„¸ô*km;×4¶4ÿ¬¤ÂôþûúÏÖ_w‚sÊGË´¹|B|Bs L{ AsÚ¯yB›³‘СÍ!ÍëBÐ>Ú¼³ù–œXIN«X)h_!¨ÑæÚ@)Ñæ”ËöÐæœp6Ï-Úbƒh»O𦍍h)ÒæÚˆb3ŠÐ%’‚–is+Õ]üöÑæ14Çmn´¹Bshó¨hYí˜ïXp^¤Í“BPÜæVjnsyÍsÚ\Ï-ºؤ»¡)…6W·Ï<ž}‘6ç$N Íu:'‚ê´¤y ÍsÚœçn¤Í鞈… )m~X¤ÍšóL´¹ Aœ§… ¸Í­T¿bhÎï N+¥´y,å÷ §œ8íôŠ]>Þœó;PT>µ6ß‚ªåC×ÜíÁùä‚ó7®þ3ý“πππππππππÏÀ‚š…58ßЃóÉçíþ±žà<Ó,p¤½¥j ÁùŸ| ºâ§ÿ”-¢P”-ó³(”Њb¾ùU ‘ŠyùwFê\¾s…p„q„rFË£ÜPç-ß¹‚½†:ÿBuþ™P‚©sÈ[£Îµ(Mì¸Îå‰Þr@SÀ¸Äæ5é‹_zeËúõz,Èó”:ÜK§Ê…,üJŠýÔ¹|ç¾)uþÂ÷WO~Á Õ“‹Ô¹‚dHì”:GqB©&ä¶Š6G£ÎßiZ¨óµ¶™kT¬­ øŸüy¾îWÔÁùSÞY=þ©Â]´ù„… ÚÒ\ §{mÎkÃk¤…>(Z2Ú¼S0\(µgݹ¢%§Í3E 3Q,U)èÆÑmÞW:/‚ÊÁo§"˜SÜæ‘6‡4ïÐæ„æu!h/m®“œÖЩ¥w#8¡yB›sß±(Åm®û’S!ܧÑmΩ‘m A¿i=+'… Ðæ14·BÐH›ŸÐ¦Í×§·¹ž;¸Í),ŽnóPz—mô±ág… Úì‚*8GÑ’Óæ»(8GiE!(Š«R!hN›— AsÚÜ A¡Íš%WJ›/MKt›Ú<IÇÐþïõg‚Ï@wÊàœ ©àüAÏGÏ÷?éKÅà¼UJ¸`)9ºÃ¾Z]õÁùßÚ¢ÐáÊ–nQ(ÊB&”-( 6ӢЖ²e„¢PÅhÄ Jq£e 0£]ÚHÔ•®5Ô¹·à:¯©s…rPç„tPç„vß¹\çRH˜ƒ¥”¬hÙ®ëü& Š:§ ‘RDÊ:ÿTu~]##uþѽFká—…:G¿AácCžB+|ma1K” êüƒ!ð%ø…šF;²| ©ËÔù±ÄN©óe¤8¡T³HÂóNpNÐ-½ÊšRµôÙŠúÿÉŸµ¥¯{ÇåIpn´9¡y^š¸ÍchÎß¹UZÓæµ¢åIËQªU*mhsBs­•N„æ {ÝæuhÞG›?mÍÔm^(-ÒææZ”ÎnÒG›Cšk1}´9§'Xœ¤h-5mÎìsò AµÞ¬û" Í'¤ÍEšm®ûÚ<*ZŒ6W7AJ›¯¨$æ6×7íç^‡6·BPÜæzðLhÑæÇËmŽ×\´ù:‰ÛÜhs…æÐæAÑ"Ú\Š–MÏø¾o¦Ð<ÐæwÚóæàü㜜uÁm…à<¥F£ç|@ަ!Ø&‡|¶š÷Èß;ÔyZzÑ®.¸ÿOÕG~ø§ê¼{ÿhaF¤Î)pk¨sQµƒP„F«ø-RçІ8n9¶œ¨sŽóãÃm¨s0Œ u.²1¥Î!qîBïu®g\ç5uNu¾[¤Î/Ϩó¹Pç?¬©s/ 5ÍÅÖ Î¥¾0F¢léç^jÁùRµ0ß~q5Az Ô³ÿLÿ,ÿ÷UpIó&8OÜæu!h Í{ A¥Ÿ™N!h™6甊Ú ëFÈôNÑkÞq›— AsÚÒ¼.¥`vãmÎ&Mm^+Zž¾Uî6¡ù·yš¡ÍÙ”2Ú| hYE ´¹6³òBP‚óX mΆX‰6·BÐ:8… ·¹‚žÐ.]E ´¹Bshó¨h±BPç%Ú|ëó… 6—¢ÅÜæ÷Û‰›mž(ZšBP=Gyžæ´9mÚ<œŠ¡y‰6/‚¾_Š–”6·BPhóúäF ÍCÙnT´ÌÑï~ßqãG Î)ÖÊ‚óÕ·ù¨ç“ΟéoÌçÿsMý5õðððð˜™P¾þ$Bó _á×cf®‡¿®þº.,3°0çGxp>zp~Æu÷†à¼E–‚sa =zVp‹ø]í-¯æýüïF£lYXŠBMÙ¢ 'U¶œãìÅÝkʹ|ÑDe ARSв%- ¹Ù* •G˜° EªB¬´(ô5"Cו^Zt-Q£Ð£8‹q­zLB‹:]ùð„:™ŠÖR•ð O2A ˆVB:Â:B»IQç»*„ª%(ìPç"Ï‹Ôùõ ÎÓð\.i£Î¯é¡ÎûŠB/B‹D^+s¿ZêXÂØè-NÕ )=Z+lÎ¥–nSç'¨óã+ì'=§¦Îñ€ã_ö¨ ÍI™:/)[D„nt‹:‡8GG”/ Ó «ôg¼, ΋´9Š–Ã2EKN›ã5תis#ÍŸ[*•Û2ßÜæQÑ’Ðæ¼¶-ÅSV(œ©Š… \[+Õ*‚r¡§”âÙÑ A¯µž×<§Í5㜰€6çÄ…Ñæº2Ú|éÝä6§´q›÷‚æ´y_!hJ›[!(´¹Bóœ6/‚ê9Âódý“sÚüûF›óŠ´ùæ‘6W!hJ›ó,ë£ÍC!¨ÜæVú m.¢¶ê+Mis+´y¢h!8G¯ióP:p›S¢%-e5¥ÍÓBPJvSÚ|NM›Ÿwß«·]vW98gc'ªZŒ8O‚ó8×zf¼þ­×yp>¹àü§ Ë]ÿ{ú‡2ŸŸŸŸŸŸf@ÿï)ç?ðùñùñ˜Ý3°0ç›yp>zpþÑ/ý´œC܉¼ãèú€­ƒóVA臫çÿË%ÕÕ¿ø{Ïk×¹…>ü× êü’ý¥ºø¡¿T=uþç@+Ì8W$ át En„Pƒøž¡!k¡ ¡Î)‚ƒ6l¨s*+ u®Àêœr9FŽÿGêŸîAÒÞâ@ã;ÔùÃ:—b EžËáëE¡^ú¤åœ.çÊ”'S( …8ç4Eº˜óa+ÿó@œ×… AÓm.¿úZ5mn^ó>Úœ ô3à AëRÐá… Úˆè„æzf4j§PÂØ)eÓcTÑ¢à¼å6/‚Ö´y«ôr…æ ÎS¯9z i‚… ÚÈI A·.‚Š6GG´ÁyT´Ü˜)ZrÚ¼PšÐæi!hN›— AsÚÜ-ÐæR´°‰hóÛLé„ÚÉhóDÑBpÞWj´y§ônÓL¥´ùv‘6×ɼæ£ÐæQÑ’‚òŒ¥["U´ä… <«­TÏî¼”ç{»ô×ö{€ßF›×ª#~_DÚœÓK9m~þ}ªv>ýÖdƒ--.è"qžç;¿ç³œO.8ÿ”€˜Ý üúûõ÷ðððXØf@¡ùSλ°ý;ýïë÷¦ÏÀü…98¦ç£ç¼V‹¯"Ò7†`ipná9Ú…Rp~vµØ«ÏQhþ·êjçójêü±RÚ([F, %ˆzƒHNüÁx„ñ CzB£LÀ7ŒB•J£ÎUèuŽ«Ø¨s¹‹#uŽÓ˜àŒíå5uŽû2A›QçÒŠ‹Ô¹E‚Å”:ß¶vDw”-PçZEêüÊ JØÜÔ8ª B7ºÔ4PÅ]×¹|çë\ˆäµ°®u^…{QÊþŠÔ¹ÂZHRf6§ÎA!h‹6Ï A Î#mBó?UœpZfƒ ‡çV zºõz˜¦%ªZ¬4û”jÞ×îÁùèÁùùñù÷FÜ_K-}||||ì ( _Gëj­ÿí ÑÔÿ­§øµY°×Æ_o½Çqöà|kÎGÎßrÔ绡º‚Д8¯KÿVûpµ×œïTWpþ±H?ÚE¡„çIQ¨)[Þ4E¡([Ò¢P”-IQ(ʨJ”»S*EAZŠûê0zÜÀ‘:§l¯EKñIˆJ¨…˜‹° Åá!aØÚ'Ü1!uNÀFІÞ×9Ô9AúˆÖ@­zÞu®PϨs„¬HYTmê< Ï×ùMò>'E¡;ÊM™¢QçZêüº@úBüâ:ƒ(`…šKH¥±åEê\¾s¨bÑÅ×ùk¤ïܦÎåÆ^³LC:Û©ˆFÇc×y›:_dù *1úºHË N¹fJXú*ç´­¥pÑЕ|Í~s¿[‚&´9”»Ñæ‡whó'-›»Í¥IÝæEÚ\þŠZuh¾ÈJ%Ú¼>•Õo=< … Ú\×.ºÍ{isHóº´6gŽXC AŸ¾ÕuÕ’[ku-*•¯Pš¸Í›Ð|mÎ}c´¹î£†6Whm®Sy!¨Ñæ ÍSEK^ŠÛÜ A ΛBÐÛÜ Aõ|ˆ¡y‹6×óÚ<*Z¬TÏBóÜmž‚Ú\Šs›VJ‘ò>zF¢hÙïúŸØÆct›³!٦ͱgo ÍK´9%Ï(·ÒBPî6I[… ÐæRx hs)Zz A Î ÍϽû÷ß|ð\¨O¤°ÑSw!„S)upžøÍŸ±ú™ššóZ}nßÐúßÉ?hù ø ø ø ø ø Lf Éµž§µ¶ÖëµVÑZr2ßÃÿ¬ÏœÏÀcöàü¹œœtú×»ÁyZÚc¥‚ÐW[ûÅêZqf„ç×üRÔ¹)[þV]ù³¿U¥¢Ð‹ü‹…xh9Z)1ˆ§–0o-Gñq§Ô9h”%êœ&RçGÞüK+Ÿ{Oí:‡x$À:?èÆŸY¸I‘]C+ÚWês+"<ßcžÂsç^ªà\¥‰KAæ&Ê–&8÷¢Ðê‰Þ(R¤J1e ê ;Ê–C*‚sJQQØÒɉ‘—þ<_kÁ9 ¾oo!¨þ.BP…ýÏI AEÒQŸÓæ‚¢®é+%ÂC As·y$ÍUºÁymiÞG›oióQ A3Úœe“G›=ƒÐ\›@Ì4³­Í¡r!¨Ü樌8•1A!hN›£M ´y[Ñ’ÒæV m®Ð<§Í‹… Ú` ¡yN›K•(Z¬Ú\¤9¥Å)mn… ¸ÍµéÇæ_,ÝéÒX*M‹)Z´çÏÁ¾BД6·BP=[yÆ|ÓÏì™isžÅôO Aiý<· Í‹´¹ŠtK… g¤Š A#m^‚FÚü_ùE1¨çi1h78ñë.ðà|rÁùÉþá±ÿÁ¯±_cŸŸŸŸŸŸŸŸŸêŸêàœ ¨àü¿<<-<ÿG¿Wç:šC±48O=çP¼)U*º÷5oûtuÝW Ïu>E¡%e˰¢PÂóÉ…>СΠ¢ðSº‡>ôŸŸ  ø‡ñ7Ô¹T „` u.€k»¹Îqã;GßJÀJàöÒÃnµrA‚¸†:ÙŠ¢¡Îå;‡€Å»ŒJs™:/(["u…»sžGêüS“¤ÎEž©s…¢¨shãÅ6¨CTÔê\Á+l‡:—O[§ ºÔ¹B²TÇТÎ?h*£«¡¬ އRçS/ µàEºê@œP¼¸²?¿ïÅç14O-EÚ\z–g±š+m¹ÍÛ´ù@Ñ’<ÒÓ(Æ©@›¿Ze ,ùè¹V!4×ÂWßÐæ¥BК6o‚^^,]bó´T'Þ˜(Z¶Vh‰6çľþÞBМ6¡yRšÐæi!hN›s/ND››¢Ú\÷ø€6¿­ZƒBP=Œ6O-ç}… F› A9 “ÒæV mž‚¶ÜæI!(Á9›Š)ç… l@– Ay榴9'ØÔL AsÚœMÑm.e´9ÅÑÁmަ͛BP¹Ích~у®ûÄíçAsE¿Ç ÍûŠAëçÃz;]åÁùä‚óý ´ˆòððððððððð˜ 3ðXÎ?ïÁùhÁùyŸy°œ·ˆÒ´ø¯ cPpþÒí¯ªƒóHw‹B/ÿÏÿ­.ûÉ_«Kü×jîþR]üÐ_ª‹jêœcõç‰ì¥ÎUuN1ôáÉ¢#uŽò‚°ñx‹Çé¸?ô"#ÁyC‹r>>>>>>>>>…àüdÎG Î?vë/ÅÑïZç-ÏyOAè2¯½À‚ó@W °(´¬l!¥(´Q¶ŒXJˆô© v½üÁ *“=Ô¸  ¶WE E0ÕPç ¬ Î·ˆÔ¹HÐHã#ÆKLøE¶¾|ç¤8Œ)¤B@¨ÓW{[ Îå>nQ燨s¹ÉwNù „+¤+š\çÏÔ¹‚=<Ìeê\ÞfÂÁ‘‹B:BíÊÝu‹ô•[šrF#€·Äu®µÅ5r—¨ó+ÖÔ9”ñF—šãºã;o¹Î3ê|šn&°%¸í¸ÎKÔyÈáyJŸXpO¯(tõmœãs®Îá#¯úëÞz!Áy¡M̰BÐçÜæ5iŽÓ}‘壢eà6¹ÔN¡HÏ¢×¼šç´y¦hY¯D›ëÚsý[´y©t^(ÕLÙláÔOisHómi®…§¿—6ÿ\õŒ]µÞ"E‹çÚ¯yí6Oióåt²ƒ{--ÍisNˆÐO@OÁÊI!(´y«Ú\÷?§ORÚÜ Aõ¬ #aÃXJpÞ‚·9Ï+ÕÉ—´”>£ÍõÌÊió]ô\CÑÂsŽn‡=Ôñ@p¾w‡6¥Êç„æ%Ú¼S m® Í”6ç>`‰(‹mþs›ÇмUió»~oZ¯´íWJ›ÏÕæìøê´ŠA÷:î?<8=8ÿ­Þsýÿá ||||||||||fà <‚ó=8-8çuZv³B€Ø ÎG/½ò?ÿÚ„ç±(´Q¶Ô®s£ÎÔù%‘:×qú îÿsÕPç"ñÕšë\áÈYòs4Ÿ#úÕ'D9¥¦Î WNT\C+|!„l¨ó[D{Q¨….È¢P¼âCŠBWqËQTLvñµ{_x§üéç±T¥ YhþÄeòBÐÄmIó–Û<¡ÍQÖ@ß AO•ò&=…2( nBóÕµq1Œ6ï- AUkE±¨{RÚüõ}´9¡y­h¡”v:… ¨‰Z¡yM›ï© ¥=c!¨JA›BÐ/…BPhs…æÚê\Aß2û~¹à:oSçKïöy#o-LŒ¾ó–ë<£Î·“c:E¡@–6Ôù¥=Ôù…òdK÷+göZòg¯y®¹´Í©Ý¡ÎED˜á5Î]ç-ßyê:y- ûÉÙÍQqòÜãª'-'‚ýɳåÇ#¾ìÑR¤¥à\áyOQ(Ä9¡!‹ÌŠ_·÷up¾äaVD:ÍUÊÏnBsýø»ÕŠ–'-w\õä¾BІ6¡ùɃS(/•?A!h™6ÇkžºÍ{ AqØ÷‚r aÓmi®ÕR´$nóHšo“‚Ö´9Š–7ÅBP•‚v-Ðæû|ÉNmЂ¦´¹…æ:Bÿ@ZÊýj… ¸Í3E §KÖÐýmΩžœB¡Áhs=' ÍMÑ¢g… Ú<ô)ð¬1Úyr¶NDDMËà8Ÿá ü„πππππππππÏÀl™ÇBpþœÿÎÃóÑÂó×îzõ´ B»éGMpîE¡R¶xQhÐd˜®E •J ÂN…žee Áù¸…–”-18/…–Âóà:_mÛËL#Dx8•Å×îEp®Ðü K*4/‚æ´yAÑÒ¡Í … r¿7§Pš²`Ñæ*²ÁFDZ½æÚ¼Tza(|m…æu!hm¾ÙUÕ,Êe{ AG§Í Ío´ÂÛAh^*•¦Ú|¯H›-l<𳕂m®Ð|…š÷ÐæVJp.*¦mCs4Nl¬m®ÐÍolÀY!¨6ãÍsÚ<- ´¹-Ò´@š£š*ÑæQÑÝæF›+4Ïió;´ù#æ6O Aq›[!¨ça³(/}©Ú\§Œ´y»tÎ=lÑæ14‡6çD'›^¸ÅeeÓ$‹AÑ]ô…{p>zpþ–ÙòÙÿþaÐgÀgÀgÀgÀgÀgÀgÀgÀgÀg`¡Îb…æ_òà|´à|Ûwþûà|â‚Ð?úý,8ŸE¡:–æ÷‚²…Å”-IQ¨)[¼´”-iQ(Ê78h  [E¡"ÏÓ¢PHJü½û_ÿ ‹ö¹v@C`¢0ØíʇÌ ¥‰â€Š g0î`¸„¡< ® Î)飬`«¡Îå%†m¨s‘¤ø‹ É LQ4¬}ÂÊ(TlPç B«êü[-ê|%\ç5uŽ.‚ ïù uN‰!¡~ægŠž5õD, %$$,¤‘bDyžû©s¸¢k×ùRÛ²à;O]çuxžºÎ B DQq¨’"Èu.e‡Ô]×ùE*—uŽö£EŸ×C‹8%äÔ9ᯔ#Oi¦®ó™) ]MªD<Ï,ÜÁ nþöüïñköüHÎ;´9š˜–¢e@›?Y„|/mN!è çÚ<ë<€Ö¡¹Ö+œ+Œ4EKÇmIsàDÀÚ=´9¤ymÎm^R´ä´9Š–km£fà5Ïis¼æZu!èR;)4ßù¦2mÎÜ7nsBó›u´-%Úœ{Œ{“%EKS m®Ð<§Í‹… z„Ð<§ÍóƒÐœ,V m®g '\RÚÜ Aq›KÑÂó)‚òÜâùU¢Íû ASÚÜ A¥i¡ôऔàÜ Aõ¼m‚jÈàÜ rK´¹ŠŸK… g$´ù9‚JÓB™4¥Ò)mN!(Š–Kšœ/Á)”¦ë`rÅ ‹¾ô”êºïüʃóуó•ýÃxðððððððððð˜-3ðX ÎÏðà|´à|Ÿ¾8­‚Ð7ŸúõVpÞ* ýåß««þ÷êªGþV])ß9®ó>,ßùOä:×qzŽÕs¼bãöøjñÖBâ±®ó3žœNx®àïí)uxNpN¡á9s8s f ½(Ô‹BHQhKÙ"⼨l9¬Zm›ËÌ»o%‰SX|Ý Î-4/ÒæÒ³ y–BógK#ÓWZ—‚/­;ÚœÐ\«) ¦´Î#mŽ&‡%eÎÓÖTh¾V‰6/‚Ö´y«ôrÛH± •†4ï§Í-4ߺTúÉPÊæNo!h‰6Çkhs ͵±T*ÍisJyK´ù ôÖ h6׿׀6—¢…BÐãUЦ%Q´œ A#m®Òá¼”ͺ”6·BPhsmîJ›¿U¤9‡l ²‘ AÙ\,‚ú¹6m~D¤ÍEKN›‡BÐÛœç:]lÒmÁ†)§gËmÞ)ÕïŠTÑ’Òæç|ÿ¦U ºÜ:çxh>zhþ'½×úçÙòÙÿþaÐgÀgÀgÀgÀgÀgÀgÀgÀgÀg౜¿ÅƒóÑ‚ó#ÎûvOp>ZAèfïþ|'8'<ŸjQ(áù¹CŠB Ï'S Õ;?‹BQìvÕCÕ[Œ:ШÍ/ Ô94§Qç¢;Ôù½êœ?HQˆQt Ÿú}óã/ÆcŒÏêU!ZJ£thQç áp&ãN& ÃwuŽ[]A^ Îå;?@®sùÎê\žf|Íòü‹AM1!u~“tŸ ®h(^h^Ê^ê¼OÙ¢0´—:—ïuGN£ø@õ±^N+¨U`[rÈÓè8†:?]Ô¹Èó´PІEVÂuÞ¦ÎY^®óÜwÞr+¨&°Ž®óBQèª"Î!pãâ$Ĩ+~Íçß‘Ñææ9mNhž‚ÆRÐVh.Ú|Å!´¹…æé3 D›¸Zt¢BP|ô:!Àõj+ZDœo0¤´H›KõÓr›÷‚Ê·¿BóíÓÐ\sš*Z:nsHóºtXZ¦Í­T'7òBС´¹ú^®ÐÿôOÿôÿi=qšëñ>[þléþŸi^ÇÉÎÁãüº?ú×}²×`>ÍÉ&ûsýÏÏܬèš>n*÷¾_“½&O˜Ê5™â×øý(ÕõÂ8ϺÞócNþÏTÿí å‹–ÿc9:¬Åbÿ<ÁkpéÍ'Áy¢hHKS¿qV øÂÍ/-ç“) M•-xkÊ–?Txm£²ß-Gøê\„âÉrãe‹\ç([Ì´”-rëâŽFI°ƒëœ ½ÁÏÁ¸ÎEP¾CÎ^Â!t––——„I„JP™)u¾kC?ÐPçÐPž}E¡[ˆE¯@©_C+kQçòGê|¨s…j¨ S ÛÝpS0Šͺ²Qç·êü] ÏêD¤Î üÐL@Îâkî§Î â{Î]ç»Ho±«‚E(Þ6uþ©‚ëüúvQè–…Êwž…®nx‰åÚ‹]¤ÎÔ¢éPçç(DÝøŽ#u.‚º—:äy ÏEgçá9wœO\ºªÊAñìÇÅŽ²Ò¯Ùí¼:8_úˆê‰Ï ¡yÛm^ Í ù;… 5mþ¢è6Wh§ôTsÁÜæ„æ‰ÛEËD´9úÚœëÉi;U°±Nl¢%·y£hiiZÒÐ\³ChNé¬ÊgÛnóšO@›3¿¬Vh^Óæœ¶Ø3‚¶ÝæÏÒ½b´¹îœ6§O€ô °iõbÝ܇œY¹‡6/‚ÒmÀ}ß*…6WhžÒæVŠÛ¼@›‡Ð<ÐæÛ7´y8S*¥»!¥Í­Úî–Ñ‚s6‡›Ó&õï@m ½ýä/{p>zp¾ºpœ¹ŽþÚŽÏk«RÿWkO­ÿœOÔ†¬ªó´^è3°àf@¯÷‚ÎóøkýÁý~ÝÜuöZëzü«Ö= àžgþ]Ë˶…ð΃óñ¸ßÒ{ñQÎóç±ß½Ø÷<Ö<¬¢uÓzóÌÿ×Q~?–‚ós=8Ÿ88ç5zÁúçNËs~ñ}¿BWÕÇ~õꚬ(´­l Ô`«(´V¶Ä¢Pľ¢Ð’²eXQ(a%Ô9šHtãÏŒ¨<0¡ÎÑ´¨óý¸¦Îd^`TP稥vº×ùýæ†ö„úÄ5ŒsA× ¼Œ:—n!Rçh Kño€ë\šÈS\çPç„k„l 6Ôù1:§pШsÑ­‘:‡z5e‹=‚=¨s|ç¸Îê\®fHÚe¤¡èºÎEÞâ{Ωó]kb·C+¤¤ˆQniÓdh¢Ñ`©Äñé[‰†6ê\Kú%6¿ºà:O¨sT už‡ç©ë<£Îר +_%êBz$ê| ßùDÔùñAµ•q) }¥‚sæ-]8¡'ZéŸçQÑr”yÕ‡‚vhs¼æZü»ôï3Ò¼C›³Y¦ÅÆ‚)š¢¢%+åu°4w›Cš×… }´y,ůÙ(ZjÚœ2Ú¼§´å6'4¿1 ÍK… :YQ‚.½W»”{#*ZòBPî§R!hN›[!(Á¹îרhi»Íï°û¼E›×Šž ¦h‰… Ðæzv@›[h^»ÍÓBÐ@›KÑ¢çШ… {ëÙf´¹Bóœ6ç™Ø¦Í©Σ¢¥D›¿7§Í¥h6o‚FÚ\ ®”6O AùÒæh½"m~IF›ó{åµü{;8g~m£,œ2a¶›~ƒTÓÄÆ±î…÷^t»ç£çÿ«÷~¼uŒ>XŒò&ßÿÌä}€ZOëû è[úá õ -¿ÏÀ}6Áy¼ö¿ÕßåÝZS>>î÷ùäïó,´{™^ÿ¯> ÷üßë÷©~ §w 'óúyp¾à^ëQ¯Ëç<ý~\¿{'ؼ|j}r-&s¢k~üY~¼lèßoÔ÷?§tûxp>Zpþêm>:-Ïù)_y¤78÷¢P/ mÂs ÎÍ¢ÐRx>¬(TÊ–´(t”-ÊBKÊ…Ü"Ä_¹íGm“¦´ò@½ïÏí:çö@›w A´9ú˜'?W™N!¨Üæüýq¶¯-up^Õïñßúùkô’ð ËCn¢¿§BóWyp>Zp¾Ù[¯›Às‡@Ÿv Ô÷\wßÐà|P•-k”-([.‰Ê–¤(Ô”-ÊBåÃ%t9E~\B˜VQ¨|ºiQ(aÁΑ7ÿÒ\¼P’¿•ГB u® §/®s£Îåû…Ä„È$d"lBo@øDE…!RçPžòA}u.ç0 ¨ó7B+ð"øÚܨóX ††²”@Ê Îêü$Qç"Rê\ŠÂ7èUÔΡ„€:GõÚPçøÎ:ÿz ÎüA>êßy‡:ÿbð=Gêœq·Ï[™¢ù¡;®sѽ1ÖÔùRÛ‹:ßNÔù¶µJ£C‹<ï¥Î¢JÛ÷Úü×FkÉ‹½XGÙu®µŽœÚë(¸%ÀE"}È¢khAEw¨ó[JpÎŒµs7le~—sÎ … ÏÆm®Ð~¹cÍ»Þ Í_pÂ… I· ý^‚öÑæ¼¦ÒæU‹u AkÚ¼Uš¸Í#m¾y?mn^ó>Ú|‚2½… %Ú¯yRºw¹4§Í9ÁQ¢Í… ·E ´¹îÏ”6çÔk¡iÑi’”6m©4Òæ…BPž'œhi‚B›ëù“ÒæVªÓ1o!8O Ay–µ AÒ‚Ò÷+Z8¡Ãܦ´¹‚ê¹zT¢hi¹Í›BÐ_['ÏjžÛÒóûTÑætWD·yJ›£ë2Ú<+EíÕÐæ*EÑmŽ ìÙ]X‡æIpÎï.S3hó•MKâ7‡8¿ò«?óà|´àüâ‰Þ‡ùÿ>~FýšŒ~Môaé-Z{”?´Å{_×ßc ¿~£_¿É¾Vcœsí?¦åå± (´Ñk½©ÖïÇäžÿþÏžìûŸŸü3ƒóÉ¿f3=gcœó,öûq=‡™-ž}õk>ÕÀ{~~ô J3ÿXRµñÆÁúj×uÜçi˜–:cp~VµÍñ·ŒœWÕÇå:ÿØ/‡…BN¦(RbñC uN8s¢\ºïÿƯ«÷A«˜î¸¯üW…sרsQ‘-ê\áO¤Î †ˆÐ@Z &í©ók3ê|ÔùC5uþ`õf‘¸Î¡= ¯P&lgÔù}F…â"†ÅMlÔ¹‚°H£c@ËR稄jø!S×>᎑‹B¡_¡ÎWÂuu.ßùò5uŽn‚ êœ`Шsùήs‘·{‹:ßKÔ9DîRZuþ…IRç™ï¼å:ϨsHcÜÖÇh;F¦ÎÇ»(t磹ȗæ“Å•ýÙ7˜àzp¾îl|3ïÿæñû€=×DN³m|h'Ô[l&þ½þ=p{´ËAû6V~¤¿›ûÎg˜vÔk|ÀÞóÌÄŠ~ÎìïÎgöõÊüŽipÎýè¥Ý3ÿ,^qLŸÅoÍgù±œÏõà|âàüøKîlçi˜ÖPçµ¾!êZšPí¬êµÿöé ƒó@{Q¨….ˆ¢PQϸ¶×’²…`×”-ÊB×ÅMi éúŠBå WM(ýdT(pByË-nE¡Fž‹¶¨ógA]œ£j–Bq6h&\É×ì|vœë{›¢E+W´t AkÚ¼.]d¥R!è©¡´Q2š‡Í±&4_]e }ns9ëöÓæV*ÍŽév6–zýŽ4mŽRˆ…^¨ ÍkÚœ !tDVªUçVªM$£Íµ±”Óæl>± Åf¼lNå… «ÄBÐ:8Õ±9môK­BÐH›K×”Òæ›Q*¥›ll¶ÅBP‚ó h¹×”PÚG´yZzÁýƒBPФ/•Ú Åª¯H›_õÈߪã>ûãiùÍ×Úá ÎG Îÿ®÷Vî\žáSù°é_3}h{hL?¸íæ×xþ\ãÎàñ Î kÖôë>3×=¾®Ð¤czÏã×~ƯýÜ©\{¿.3w]Æ88?̯ûÌ]÷ZÓrÌTîÇð5ÿñXÎðà|âàüœO? E¦Å²ÀxœÝô ™Â!q¿|Çy#çýE¡3G-ô HC?øçŠÀ×9Çõ9¶OYÜ9*;[d"A ¡ Ô9ä"ã)µëܨs…5Pç'Dê\d¤Î†:% - 5IEI0„Nèsé Ð4Ô¹ô™ûá:uŽÞ ºÎ!8ñã&¤"¬Úù²Œ:W¨5 Îïm¨ó7ÔÔ9Ád)Ôù¦Fßt ¸ÎÑ7¬ŸRçÒ;àG^£vÊAµ®ªî•¸ÎÚ½\Ô+ôëK ¾s¨óEê\¾sth'Œ:—†"¥Î—Ù7P·$v¨s‘çEêü&•1~Æ ­˜‘‚FœÓÛJ®óuÞWzõê\kÉu¾þÅÁ§½¾óÔuÂó®ë|Á…®¢^N1ØÒ\Mzéëv:û¶ !Œ'”¯Có@›÷‚¶hó“M;c š^Ú¼î1¨Có2mi®…GžÍ‰¾BP®I_!è&±´Î·9¤y^šÑææ}´y]Ê>cg­R!è´9³ÏÉ‹¼4¥Íé XQÁ9¡ùJuhÎ}ÆýÆ}gns݇Ü-Ú\÷k^JpÞ-ýž<¡÷ Uúa‚œëÄJJ›o[(åÔ Á9Ý y!¨Ñæu!(Ï2žiF›'Šhs+Õæ '%bhޢ͛BÐ_ A¡ÍuÊÚœç/§¬´6O-9mž‚^¤ß„æ—üXÁyš·ùß*hóy?ÿ{õŽ+îÊüæMË¿ùÞvƒç£çwû‡™ýàà¯ï£ûú.€`SÕ¶¼×gcffcŒ‰sfeG¿î3sÝ“àü‘1½ïçúµŸñkïÁù˜cœŸë÷ãxÞ àùýÐc=8_׃ó‰ƒó«¿ñó,P«Ë‹žó´40©ËnpÁÈÁ¹…zQèÀw®à|+‘Äh8ÐqÌÏ¢ÐVxu^ Ï2A)už†k„Ì×y:oÈó.u¾Ê¶—Û&Ì;DNu½é¬œGÚ¼PÚ¡Íõ÷\Q«¦Í£·Ý‚óüþÆm'J¢¢%¡Í!Í;´9¡¹ÖPÚÒ¼.í£ÍchŽ¢góTÑRÓæÌÈVC Aµ13ùBPmþÔ… 6‚m.ÒœÒܼ”ͦR!hN›[!(Áù1ß¶ßWÊ|Ùè²BPé–ÒBPJ€Ù £x#Ñæ”³yÆ&šÑæR´@›[h.ÅS(´¹:Œ6W!¨hó´4§Í£¢¥¡Íš£h¡ü8u›ˆÛ¼Þä!4·BPm*¦… ¸Í­T(°Ø”Ì A¡ÍOJhs666×FgJ›§… sb!¨6K Î/”לмUšÑæóD›_­à|×3¾YÎ9I‹A{üælï~Ì<8-8¿Â?8Ìì}Ý×w|óà|ü‚šqUµxp¾feŒƒ:Îgøú»ªåÑý}[z¿3Æ÷£çcz?.€÷mùàü© ÎÿááùÄáù3V;c’žsl‰®eÞÏþwá¹\çò_ó‹¿%Èû+E Brôšª—- ÁÉ÷êœãûã?GäyC‹X<]äyC×¾s¨sBÂ<»ïÃu.êœp¥ÀÑ·Èwu.j²EKE@PD`dÔ9¾óÚuNiÞþrCh¢7€:Ç ÁY¦Î¨]ç÷[¨EqthKÙ2ç Äp”5Ô¹4¨sÊ:?yà:§TOòšÇ‹añe+”]lƒ¹l.RçeK›:W¼‹B!Ι![ Ð'µê¯{ ¥£ mn^ó>ÚœBÐÎå5QF›Çм¥bjÓæ¦hYBP­>E‹Ñæ(Z.0ÚߨÿHš÷ÑæR´,¾)nó’¢%§Í ͯ­–” hq¾í vŠÓ !4תis#ÍwÖ–hsýÌî… )m A¿:q!h¤Íšç´y ÍsÚ<‚Êm®{›àÜ AuÒÚœg@‹6×3â uhisž#%ÚœÓ.„æ%Ú<†æi!(Ï´”6·BPhs<ûI!(Á¹‚â6ohóÐCó"mþíÛÜ-¸ÍõÌ>#/Õs“EçÝ÷G Íyîóü/‚6´¹~ð{„ß'›ñÿêà\›?l½¢&Î-8?ÍÊo­ôše:&<ÿƒ±CÎú†ç£ç‡z°;~4ýšÌ¿k2Å`§ëëÞ;‰uû~Žç3ô¡}Äùd®9v*d³ç3tݧIœt÷;×þËS¸ç=8ŸùkïÄù ¿Æ“}2Åç$×q2Ïã©ÜœÏð¬Lq#‹k9™kϳ{²Ãc;8ç&Uh~çç/yÝ™®%) LõÆÜÎϹãדν(Ô‹B~⪧¢P6‚,hËB¶°5Ô¹BhÂhBéÔuÞò§Ôù{«—‹8…‹¨&»øÚÎ ÍÍm^ Íùù¬V!hF›Ç °E›×ýüÛûhóW׎øV!è€6·Ð|=…æBК6o‚&nóFÑÒO›[h¾uíÆo)Zœ£²à\j 7I$MP[Ñ’»Íchž‚&´yZšÒææl2•hóN!(´¹-)mÎÆ\lt­­ ¯”6/‚FÚ¼Phó{k·ù}VZp¾ÄdÞ úŸù ×_ãùûOá•ç3üaz¦g܃óù{Íôõšßߊ„«ç ù}_‡´œÙuœâýèÁù˜]Ç©<§=8/¢BóC=8Ÿ88ßú€O ‚óX©¼š8„l© 9çï¸üû“ ν(Ô‹BÛ®óùTÚ«lM‘eÇu®`˜€XZæx¸eNäuþÁ >!”ÆŽeù÷émÄwÇu~¬ç¨0Øt™Êâk·#8§Ôhs-ZYhÞ¦ÍQ´hMXZ÷4ê%-Z-EËœPª×¯·´C›K¥ÃÆF‹6GÑ’‚Î … Ú,±M ͳBP6Xú A{ismä¼åó¶(³(ZÚœò[JpµRÚ|9)‹ØDJ A¡Í­TÁ9E»lBuhóR!(´¹6¶ ÍÙ芴9e¿EÚ<)e …Sp›· A9µBh¾½Bó"m®Ðœ ¢W£ÍÿQ±ûôµæ„༣i©‰ó^M åØ'W×~ûWœOœ?8•7Âþ5³;”ZØ®¿ç³o^=8Ÿ}×<}.M1¨óàüQÌxæ×ï•)uúñ³ûž™ÉÿïGÎ39ÅûщóùqC*4ߨƒó‰ƒó½»¹œ¿$ѵ´èÔŒPUP±Ëi_Ÿtp>JQè¥5uŽã6ºÎ¡¡ÎÏM¨sÊåÎüÞïu~gF‹xŒÔ9$$á!N^¨sT¸ÎQ@SBUBW6Ô¹¨Ë”:‡ÊŒÔ9štûà:¯©sÈNªÝ"u~yF‹ E­¨óûL¹uŽ‚â¿-’mnÔùu® ê|ãHË…©óõNºÓÖ”:‡p…t]í˜à;Ç·¼Ê„Ôù×:ÇåL`HpH9"Ô9â€:¿¥¢Lqé=kê|©/ yw å3v-QçRhnÖÔ9´ð’ÛÉQ½­ˆó"uþØ+ ]™àô4Öv§×ÁùrǶCó>Ú¼Í)=´RÐV!è©æ|Ðæ‚†M°&4Ÿˆ6§€µH›×… œëTNúM´ä6o…榥PÚK›CšO@›sêÅ,6¡yM›SÊìZ!¨Vœ[!¨¼þF›kö‹´¹Bóœ6çG‰6… 9m®"ºW¹g#mÎ £Íuo§´¹‚êþ§”çA,å9Áó"Òæœ^ ´y8ÑÂé–¼t÷ymÚœg'e†‚vhsĉ´y,å´]­BPhsî91)%8·BPÜæz6Úü÷F›ÇÐÚœgz‹6Ÿ ”SJœVÂmNgÆ¥þ±à7`-¿yªiIüæÏZëlÍ'Íy®ïÍü{øîqžÎgß|zp>û®¹ç³ûš'š'ÎÇ,põà|öÞ›œ?Š7£>ä-áÁùÄÁùaçÜjÁy+dKƒ¶Æsž©j'ò¿¼çó“΃²Å‹B½(×ù4ŠB[Ê–)…R|9™¢Ð$l3¢»¡ÎOì¡Î«VÞö *Yl¶´— g¯OW÷ÏðuÛžþm‘æ‘6—ž¥£hy¿9×{ A[aeEËSW-ÑææZk ¡Í)¥ -E‹‚sBsJ]­4§Í ÍóBÐŒ6gs¥6¯ A—Ú‰BP­R!è´9%¸Ë*4O AsÚ¥‘Ñæ"ÍW’ê(ÐæAôòÃ¥hÑÆÔ¨… çÝBÐïY!(›d­BP©›P8¡rŠ… ç¥BPtPç¥BP6óØØ‹´9åÆÌ\Z mn… RS¡¨BUÕ¡Í›BÐÛÜhs)ZØŒŠ6*ÑdióDÑBp>‡BPm‚œ§… (ºPuQº …WS m®ÐÚE ´ùißøÅèš–‚ß|•-æzp>Zp~ä8žþw›½¶æçµ÷à|öÍ‘ç³ïš{p>»¯¹çã{ý=8ßk3?ßk•¾—çbpÎQpþ‡çÃÃó^ýƒ ŸhiN jI‘`K×Ò” žY­±çuS λE¡Áç(>! Ô9Gõ)ˆÃy‹ûÖ¨óûuNðBƒ+7Rç§ßù»êTùÎ!OÁu.êm®ó†:WØCèÓPç*ºƒ¦¤øÎ¨sQ–‘:Çõ …I°„ê½1”Qç*ÛkQç"=ñ ãÞåò®s|Ä((ö›lQ(.ä D£y€\%ˆCÿ°ö wTkÕ®ó~êü[ö¡˜ÀuŽrõÄ —g¤Îå;? P縞:W°ØPçPº¢u—ÞKä.oC¡‡:ÿL(nìPç"Ï·y> u¾¹Ê#ÿE JùõWZ Ál¡¬çZ"œñj·]çý4èèu>R=mm”- €;Ê–¨k‘²¥åHž?E¡/SpÎŒ¤‹ðr¢•þùmN ÁyKÑÒ¡Í¥Ž!ÈO-ÚœÐ\ ÷3å‰}… l(P ÚS:”6o)Z ´9×’µy6ßêÚêé[ )•+ò… :Á¬2³F›k†SÚ\3Î ‹´ôù÷©”à<¥Íéx%šu Úü¶ÌmÞ.åÄ÷0½œ$áD }¯;ã®Êhs86Š–»í4ÊÖçGÚ¾×f¦ß§ypþèç×zp><8¿øÿý¤œ=çi™`[ײü—N)8÷¢P/ µà|ÒE¡WÁl$3* ‹BžSd¹¶Âs\瞟«PXÁ0áp‡:¯=ÉËiðf¤jºi³©¡ÎX‹øîºÎ7âœÐÒ‚Ki2&³â×ýë©ß¡ùsK´9¤ùÚ»¯¹çã{ý=8ßk3ÓïÓ<8ôƒó£<8œ_ÛU‹¾$wm]KBœ§¡„ѪX]üÕçXxA>•eʹÇWK(B8rÅOÿ¨sÂQ ×P碡 Z  ^päžSSç¸s h ÎOƒ:—[—rº†: y®s¨óÚwEy4Ô¹|ç„D„EPç„G‡ª  Ó¨óC^C+€"ˆ‚&äD‡@ zˆÏÝ`AïZSç„\P¢ u.O1a †­Ï¿·vßc´)Ô)®c(ThT¨T‚¶†:WGÉ`C«|ê|Íão7âÏrtCÄ®¢µÄÊFßjʉu®0¸Îkê\¾s¨sÜÏPçh-¾ó”:ÍK@)-F×u~S…Jc©Dvî¨ÐsQÃ"‡ C»Ôùc¯(✹H®éa+ÿóMpž*Z(#U)é@Ñ’Ñæ„ƒ-·yT´Ô… }´9› ChóÅÖ»PÁùEÕbBPùÍ;… ™ÛÜHóœ6Ï A¥îçih>m.¯yËmCó¬´¦ÍÓBД6¡y™6ï‚B›«K ¥Í× T÷ … k'… çÅBÐH›Ÿhó´4Ðæ÷Öns‚FÚ\§VRÚ|háC!(Ïœ”6o‚þÄNÊÐÓ@p^*åy—ÒæœÂ1·¹ž)mn… z† Am'{xÖ– A9”ÒæQÑr¾žåÜÿ'{®whó¤4Ðæ±ôï¦h‰¿wv8é+I¹¯~/q¢"nzÑÑC󂦅ÓVûx‹çç?›é7ÌþýgqºöœÏ¾9ôà|ö]sÎg÷5÷à||¯¿çã{mfú½šç~p¾¹ç{Ο»Î‡ëàüäA™` Ý]Ë T0 ßάæÞÿ‡)…æmêüæ­§àœe nÛ¨lBô¢P/ 5ryRÊt-“Q¶ˆ8GÙB°\Sç¡`0 à:®sùÎW(PçÒ©œ£Ê˜ÎÚúC"Î Í;nóš6Š–\¹Ôܻ鉑zÓ+-]M¤ùD… F›škµBóœ6Ï A‹´ù5ÕÓß µåÇ´Σ¢%¥Í Ío˜¸´ã6‡4¯ A' Í­T›CÅBÐ>Úüp¹Íå5g#Ê- ÎÙ BÓ†ÕÇßfX”öRºîIw4… ÐæV mž(ZÚ¼PJpÞ- ÁyJ›³A‡*/%8·BPm9›F›k3°S m®ÍC “[´yRÊÆ#ÑmCóè6·BPm^†BÐßY!(J-69ÙìdÓ³Uªà¼D›ó{ 6µ¿ó3íà|M ¥¹¶Y¬{æ¨|ǃó‰ƒóOÏôfÿþ³÷ÃÒ8]{Îgßzp>û®¹ç³ûš{p>¾×߃óñ½63ý^̓óG?8_ƃó‰ƒóUßxÉ´t-úÚϧœÇð_mJ–@Ç𜢸¹¸ÎkêJ‘àGîùÎÏÑÑ‚‚ô)uN C¸ƒ‡ß9¤$ÄdC+:ú–_UG¨s|çPç8€#u~`í:‡Þ$"˜" 2ê\Ai‹: : Îƒï|ǹ÷›§x;¨s|ç5uŽšB@¨sèS(ÔÍD£6Ô¹·äF&€#ˆCÿÍŠë|¨svkâ;7êü6 ô bê\¡ßÊ ÿê\¾sŠ)@Äé m u‹¶‚¢Dh\ÐÏš,u¾ëg«gì¢E°)¥ÆhÔùc¯(”à|/BÈ'J«ôg·:å[мM›+¸OÝæF›·; pÄ夡9›ÅBÐ9¡T.xSÛ˜¢E+U´thóK ´y©t^(Ý‚à<†æY!h£iÉhsN+pjg¾N0” A9ñÀɇ¢%£Í÷ §&b!(sÏ?/å>°BPiZ8• A£Û¼\ʽf´¹î=îAîEîI+í£Í“BМ6O AéBà9A7§U:´¹Bshó hyÈž=ÌV›6Ï©¨h)Ñæ¥BPNᤴ¹‚B›+4Ðæ¡G¢Xªçp Í£Û¼6çùÎé"NqÚ(ºÍé¾Ðæ¡4=åôʯ]Ìvk³K^ÐæEMK Î?PqݽœOœ?Óo˜ýûÏÞKãtí=8Ÿ}sèÁùì»æœÏîkîÁùø^ÎÇ÷ÚÌô{5Îåà¼.}ÄÃóááù¦{|¼ Χ¢k9üúN;8' AÙ¨s)[¼(´Ú¢V¶l&e T*áù&¦l ÔêB]jÊéZŠÊÈPÈÐȬ­ \MóÑ[*ÒyHQ(¤t»(T¡ð°¢ÐU!Ïc— &ʇH­.²bFK£òdéT^ºí•dNg½‘àœ2ÐN!¨ˆó¤´uï&´ùà¤HO!h‘6'4תCó¡… *gµ×ç<¥­r›SâÚxÍ[nóšëº¾qmŽ×IM NýÒO=8Ÿ88ßz¦ß0û÷Ÿ½–ÆéÚ{p>ûæÐƒóÙwÍ=8ŸÝ×܃óñ½þœïµ™é÷jœGpþïœÎwz×M ±JÈ1vó#¨kÙçüÛ¦œ—ŠBKÊ ãP¶´¨s9r¡Î¡¡Î hu.ßyMäàÝ%Ø9Ù¨óß©ó÷&Ô9^_Täáü…Æ<ô³:?èÆŸYðµ ÁÙPç ¨Rêz˜’>HPJû(ïÃGLèuNu¾}¤Î/®sB3üÆnñá»kê<„ç¸Î7uNx¾!á¹Qçß Ô¹´®h"Œ:—6"Rçè$ð1¿×yM¿L¾sBAÂA£ÎRˆØPç*JlQçR[,³ï— ®s”h1r×9f‘:WºƒâÜuþ, }©ˆs(à°Â<¤+ê¥ÿ-üwUoü`œ7^óÔmmN?Arßš·K}… gKÑ’‚Š6§@µ6_ÿâj1V_!(¥­Všçæ6‡4Ï A3Ú<–ÅnÛC›ãÊ—3¿D›/½[N›šß\=sï44Ðæ¦h)ÐæV m®ûa¥:4çt÷ «èÞµÔhóN!è÷lókÓ„6ßÜÜæ¡”Ó&)m^*åÙÁ3d—Ëœg… F›ëÄKªhÙÿúv!(Ï-+Õs,/¥Û¡]:p›m®ÐÚ<*Zx–òL-Òæ‰¢…çò Aõœæy‚ò<… i‚Òua´¹Bs6TÙXÍióé¿_”M®m~ºÔJ9m>(öM5-‹¯ü!Í'Íyž7Óo˜ýûÏÞKãtí=8Ÿ}sèÁùì»æœÏîkîÁùø^ÎÇ÷ÚÌô{5ÎÇ#8ŸçÃóûà—Cpžp1…n ÿ6/A/z‘‘¨ósªEq~¯v¶T&£RçÒ>pïpA€¯ |yç¢Î_"✓ÖRû®¹ç³ûš{p>¾×߃óñ½63ý~̓óñΟïÁùðàüßüaÂ)ˆ“òa"] ÇàÓ²ÁUv˜7_‚s/ E¡e ‘[×E¡Pɸ°·”û ¸Î¯1íG×u~…üÚ nñlo,ß6$ô†—T‹m ÕK+FI’ºÎ!¯!°Q˜t¨sÐ ¢ „¹Î ˆà;O©ó8ÇAÝYR÷PèX\ÙŸßâ·fÁy6OÕJ mž‚öÑæFš³ÒBÐÛJ±õDëw A/¹4hZz Au—ì+µà|H!hËmCó¬´v›³ÙChžÓæ!4/Óæ¥BPtG)mn… ÐæÚ¨Z;)%8-nómBó@›Shó gBÕÜæ*´y©·¹æ‡˜”6o‚fns…æ(¦LÑÒC›ió[Ú´¹‚â6W©2åÊ-Ú\’Ðæ”1Ÿ~§BsçlZ¦´y_!èűT®´4ÐæAÑmž+Zø]Á:tÞÝSÖ´p¯n¾ïuœOœŸ<Óo–ýûÏÞJãví=8Ÿ}³èÁùì»æœÏîkîÁùø^ÎÇ÷ÚÌôû5ÎÇ 8¯ BÿÛÃóþðüª¯=2Ð>LA×òì >2ß‚sÂVQ¨Žé·ŠBþku©B–KäÄ%tÁKÁœQ碡qéâÔ=û®PLGC ƒF€€ç”š:G3@¹]C+‚¬l¨s…GGŠ<'L¢0ÿ/¾s\ç‡@+|¢`Šêªº§°QçÒ%d5Ô¹ô]„¨»(øB·AŠ‚aG¨sé¶“ïÚ|.´¹ A/UhžÒæVÚÐæÝBÐ48ßò¨/„{¼/Ù8â÷Tìç¨ïÍ´4ž 9è´¯yp>qpþ¢™~³ìßö~P·kïÁùì›EÎgß5÷à|v_sÎÇ÷ú{p>¾×f¦ß¯yp>>Áù=8œ¿h£ó¦®kQpqîw3ß‚ó‰ŠB! [RꜢ9¨s¨F|çPŽÐŽ u. ê*Ò¨sQ’¸Î¡ÎÑPvQ Y uŽ×¿ïÑ ‘ 0!1ñÿ6Ô¹B'Šõê\ „HCyî¯Ðj¿„:'ØÂuNЩs(ä@?СÎñÇ¢PB5T„l ºQ,HÁ EƒÐ¬P­h!ìp+7Ô¹=‚=t²¯:6в„€´«¨ìóÊFßj¡áJ"Ïê\¡b‹:­‹#z—@r™}C8Ù¥ÎbâœV°ÙuËS½³¨s¢K½‰ð\J£Î?e~k Ï[®ó…·(ôŠιÆÓY›xk—67¥R©ôT£nnóB!èê%Ú¯ù@Ñ2a!èFÒá Åa“Bnó%^'·y$Í;´9¤¹Ê^Ú¯y^ªÙÈCs|ù-EKM›sÒϾ|ûœ~°yÔ\.ƒ¢Es-Ë•hs…æ¸ý ÍK… Ü#‘6… 9m~‡ÑæÜsM!(´¹îÉTšÒæVªS#ÜǸÍc!(÷xP´ÈmnŠ–û¬tǹ÷W;] mfˆg†Ñæ”ÇêYÂ3%ºÍéUØ÷Úá… Ú\§h"m AsÚÜ-ÐæzFæ´9½F›«G"*ZÎchž‚m®SB-EK6·BPhsm R]¢ÍùïÖÝçÍfVkC+ç‰J©œŸpÙw=8œÿNïþ¿™~³ìßö~P·kïÁùì›EÎgß5÷à|v_sÎÇ÷ú{p>¾×f¦ß¯yp>>ÁùNœÎ×ÙþòẈu^;”œŸð…ŸÌçàÜ‹Bê¢Ð–²e*E¡yx]ç=E¡„µ“* ½ÈT$”_> 5ICŸg¾ï.u~¶Èí„:7Â-DB·¶¨sÛ*ï|ñ¶W™b#¬°I2¹uµÙ‰ß¬ƒó!… ñÞZ*âw{KÑ"ÚÚ×»‚jå… ë_<ñ-E‹‚sBs+M‚ó™gz£ÍñÒsJÀ-Z¥BP6JšBPm $… Kíôm²ô‚¶hsBó›³Ð|@›ÇBÐçœ7… _ … Ðæ ÍÙ0 ´ù­¦/BcD‰î¨… F› A7ÑæÖ¦ mNÑ¯Ñæ*Ý2)%8/‚œšsb!/%8ï‚J•‚B›[!(nóDÑ’ÓæAÑ2p›m®ÐÚÜ-æ6B›'Š‚s”YF›g… çAÑò—FÑB!è?ý›i¹P´à6Š–¼4 Ñ_¼ÕG3Ú\÷dN›§÷es"$tœwボο4Óo”ýûÏÞIãxí=8Ÿ}óèÁùì»æœÏîkîÁùø^ÎÇ÷ÚÌô{6ÎÇ'8_ɃóáÁù–û"ç ûì{N´> ѵtÅ]ó58Ï‹B!¯zäo¥q„,Pçxq _8òOu~Áý)uþGSDê÷îéR @CIBP¾ó@Ëwu®ò;ˆ:ÿ2Ôù¯ŠÔ9ª¨sŠö¥P!X»Î¡ÎQ%@C¢Q àŠÔ9št )uN@a i q yºÂ4¼ÇF+dƒ:§PШs Fê|¨sÑ­8•uþ]£_ÑG ‘ÀÁŒV½š £Îɨsùœ[Ô¹ÂDBET(Bžã:'||ÎÛE‹<‡æu¾«ˆa¨a´êü±Wº’‚s®ëtÖë߯à|…B!¨Ô0¦ˆi…æ¢Í õÑWô‚vÜæ“¤Í)_í£Í Í›à<†æ5mNÑ«¹ÍKŠ–œ6/)ZrÚœBP-6ibh¾wíÜ´y¡g?³Ì\ãòŠ–mþŠH›ë^ ´ùmvrà AÍm>P´4´y¡”ûÔhsÝ·ÐæAÑrw]iópÏoÑí*ZrÚ<-å¹BŸ½ û_Ÿ‚êyÄs‰.†¾BPÜæ‘6ç” œ¸á A¡Í[… znrr‡Þˆ”6O AsÚœçs‰6¡ùÿÚ³-—ÑæÒtÚ<”€ö­g¬5gÊšî©Ýú ·çgÎôeÿþ³÷CÒ8^{Îgßû®¹ç³ûš{p>¾×߃óñ½63ýžÍƒóñ Îÿ?ç¿÷ð¼?<ßã˜/Ôá\œçŃ1 kBº´€ðôê-§c¾ç^º…•- 6)oìQ¶@7E¡²Eº–I)[ê°¶H‹ŠF+¢2Kˆi#§!¨ñv³T~Ù¦Î"Ë÷]¢Îñƒ?uUQç8Ãq‡§^åF ‘ºÎO®Î @§³,8o6µP´$nóâ)¾BМ6‡4¯ A6§ô‚n!hm.EK ÍUÚ)ÍisBók³BÐOX!è€6ׯIB›³±ÒK›3S¨€&(Åmis6}žßÐæ ͥ͡h6¡9Gh‹Ð¡h•6¡ùÀmn… §Š4mNhN!èf(Z ÍšC›SüÝælšçnó´4ÐæR´˜Û| hI AQDu A¡Íµ¹—ÒæV*M ú©V!¨‚óšisé­ØlL AÙŒ<#/…6—2+§Í/~°[JpNhÎÆh^:,8¿ü'I4-£–‚†“ ÜOˬvº‡æûÍw›é7Êþýgq¼öœÏ¾yôà|ö]sÎg÷5÷à||¯¿çã{mfú=›çcœs¡šÙƒóþàü]g}£Mµ¦Áy$[ût-*eÛâ=ŸŸ‘à¼UªãûÊB eê\¾s\稠ÎQ@Cžù½ß›‹7§ÎO.Pç”â"A`Fê2B“Љð êüÐÏfÔ¹Ô”ò5Ô¹(P¨sÄС8‰ ¾Àvƒ:W Fé ÈdBÖ@ÿ0PçòGꜰРÕ!a¡ÔùÆPçøÎSêü¤Œ:?~@¯vÌwªWÊwYk®sQçh*PV&*.26Ô¹ÂÇu®p—t×u.}Áfê:ŸeE¡/Rp¾ƒ )yœêÚô„:8¯O‚ AsÚ¼V'ê÷Ñæu!(ƒBÐÛœ„ÅÖ«7ZŠ–KF. š–EK‘6—žÇ=¡9e±}… -·y ͳBÐÚm¾,nómiΗhóR!(÷'3"mn… Ðæ:Á±vRJpþZò g Uªû2„æ6ç´H,å^æ¾ns…æÐæºï™—N!(ns=+p›§´y»t@›Ó·P*=4/´y¢há™g… ¸Íu'(Z~m'sè… 4‡6çJoDt›§´y_!hËmþð_íôЀ6ŠhsÊ¡'¢ÍÏüÖ¯&¦Í‡hZ^öº <8Ÿ88ùL¿Qöï?{?$ãµ÷à|öÍ£ç³ïš{p>»¯¹çã{ý=8ßk3ÓïÙ<8¯àü,Îûƒó\ùýAp>‘®%QC<¥v*¯µçµ3œ{Q¨ô cTJèˆêz—¢ES¶L§(´¨l™ŸE¡¢¢ÑŠÔÔùâŠ:ß@ÔyJž·¨s‘×ø¾;Ô¹ 5W±Ý¡ÎRkãˆû q+7aÝ«m;ÏÂиØuůÙô} Î Ím3«\ïâET¼èxþ¾ö÷.‚Ö´9^s£Í ͵ ñ›Ðû®¹ç³ûš{p>¾×߃óñ½63ýžÍƒóñ Îw÷à¼?8¿ðs?Rp~âÄÔ9¡yAײâ—Ì`pÞ_ ±ˆëüR…1„2„3„4¸Î mP´¨s…; u~gpô~¨vCSBUBXQŠG€DIÔ9þߣDf6Թ§ÃDž7Ô¹Š÷©(âƒö„ú„<'ÐÂ=Œƒq¤Îñ„ˆu®ò?\Æ u.ò”ð5…n}þ=¦xÀŒò_rC«€"†:ý K°Gq!ANf‚?@‚@A‚ÁU¡Îú¶•!®¬RÄ”:_©EÝüÐ(/ Î—SpŽ ºÊw@ß"ïôåŸu>‹‹B!ÎM¿Ñ»ÂÉ‚¾ÿ¯Ýä}: Ò¡ÍÓûP^sDÔ1Ðæ¨dPʬJhž‚ÎѦ@J› A[Á¹HsinßH«q›÷‚Î … }´9¡y+8^ó¤´6礂ÊŸ¢%£ÍQi-«Ð<8¿u¦ß$û÷Ÿ½ÆõÚ{p>ûfÒƒóÙwÍ=8ŸÝ×܃óñ½þœïµ™é÷mœWp¾ŠçýÁùußùUõ c ¡QçÁ§Ü¢\{JBŸþê³g,8÷¢ÐG·(´Q¶L¹(´ lA»Ñ[*]ÇýE¡Kn}ù²ŸþFÑÌPÍoÐRX‹"ÄŠ)[®ó+ªÅ7©©s‚_`£Î3ßù0ê|9Õ¢(N(Õ\}Tê<„wçèvÒÅFÈD+ýó¯à<¿“Í«§¾<ç=Š–"m>ÉBPˆý¾BP^ï¾BÐ^ÚœÐÚ¼.esæ™{kÕŠ”AF›k3‡Óš›Û¼.}g(E?ĆP©·y¤Íƒ¢%§Í¥>ªCó¦Ú\¤9½)mn… ¸ÍµÁÅFW,ÅmBóà6gã„“”³q†¶)/ÍisÔO( öRhó “"8g£¯D›w A¡Íµ˜Òæ§PªMFŠ•ÓBP‚óšç… F›«¸¹¥hQpN¹sJ›[!¨4-¡ô#ý.yÓ¾œçê܈´y ÎQŒi…Ð<çõï8mïó¾›=8œŸ7Óo’ýûÏÞHãzí=8Ÿ}3éÁùì»æœÏîkîÁùø^ÎÇ÷ÚÌôû6ÎÇ+8œ‚sŽû‡åž×à9¯>3PçM¡Âs ì’2Â!%¡—>øÇ‘‰Žà÷ýïxo?öËXÀB‰¤"á‹Qç"¡Î/‰Ô¹ÂB¨s”¨æD×¹¨sÂ48zqõâì%j¨sé ZÔ¹(ÌH u.Ró\ç5uÉI8uH¤ÎoüiõŽ”:¿êüá†:‡Åu= EŠ»Ã.r˜¡i€<…@5ê\ÁÚ€:¿·CÎáR¦ˆEÅ„(# `¡a¡b¡c¡dG¡Î_^SçxŸ  !t —Wø¨óZÙ’Rç -:÷¢P ÎWTpÎu›ÎÚ踜7nóÖ©44ÐæAÑ’ÓææZ‚¢£±BP­¼´å6‡6'4×ÚMKmiž‚jc£Tjš–m®Ðœ²ØÞBÐm®Í˜½nÎBó2m>(ýZ(…6×<hóº´‡6ŠhsS´¤´y¡”S›&´¹‚B›ë”È–I!(Á9¦¼”àœg'PB!h¤ÍÃó‚+­BP=WÞ¦çKJ›sêå Û… 9m~TN›ëW,Õ)œN!(nóDÑBpÎóÕhsò Š–?YçÁyP´ü¥Q´·¹ A¡Íõ,Çmγ}·yüý°éA7*8ŸD)¨çup¾ü‰Õç~Ëß ?´ÏL¿Iöï?{? ëµ÷à|öͤç³ïš{p>»¯¹çã{ý=8ßk3ÓïÛ<8£à¼.ý–çý¯Øü¢Ñt-=%¡§}ýç3œ{Qè‚+ Ê–aE¡!<^¢lòE‘1JQèÒ»õÆ3 Ï¡Š;®óŒ:—{Ém寯îcdêüÊjñMEoªÀ—à·¡Î/í¡Î/ ¾oåµ.2+l¦L³LK‰Bç*™ë¼¦_ Î Hóµ ´qÏÊÿì†Ç}=„汤7é0ÚE ?X!¨•‚– AƒÛ|ÔBÐË«%^wEµDê5ï£Í9°•¼æÅBМ6'4ÏhsN$t AU ZÓæFšï}K›6/‚²ÁÓWJ nP´Ü-‘6O A έ”à<+]¿§” ,£ÍšC›EËݶá…n)*Zm¼÷©¢%§ÍÓBP‚s”O¨ŸP@¥nó¥‡zGí6?8Òæ‰¢%§ÍÑOuhs‚B›· A¡Íµ¹ˆÚª¯4¥ÍÓÐ<§ÍÛ… «Œ6W!h Í«‘‡¬¶óÕ¡[`åm>¤ÔNU)8?ícw{p><8ÕL¿Iöï?{? ëµ÷à|öͤç³ïš{p>»¯¹çã{ý=8ßk3ÓïÛ<8¿àü|ÎûƒóvgB[שó$¸ëPçú;ò†ŽzL•:ç‹:êüoFsü.Ô9>]HGˆÇHŸu®â: ì(²3ê\Ôd‹:—Š RçGH”ä½×¹ˆÌcå;'l¢Lbóˆ›U²—Rç ©P#Z½ê\!VtSÜ·¿<Äû)ðB±5Š«8§Îwm¨óêœ` 2µ¯(t …s„t„u u®‚Âu.:¶¡Îâj&$DG–×9š t”$®¬Pñ¥‡ÝZ0Bè6Ô¹È]/ =;¸ÄqŠãÏÃsÜç@Ngmxlœ5I14Ïis AµÐË´BóºÔhs A/è‚Rœ*•Mp›'´¹6,4Ý•íà\Šœ.mNh~­mp ¼æÚô`¤¡Í¥ãÙQëM‰¢eg)Z:… r›ïžºÍG£Íƒ¢å«¶ÁóB-}… šñ‰ A[´yS:p›[!¨Ny¤… tm®ÐÚœÐE‹‚B›£ìÉÜæi!h ÍUjnóÙ •mž‚ê”‹Ñæzþ¬Ó/¢…BPiZxVñÌ ´yèmà™Æ³­H›«÷¡C›— A¡Íõ|Mis+}°[ʳúJ‘æ¥BÐÉçÏßäÂA)ï$JAíT•~Ï]zóÜ÷çÿ«÷JOœé7Éþýgï¤q½öœÏ¾™ôà|ö]sÎg÷5÷à||¯¿çã{mfú}›çãœïëÁyp¾ýAŸ®ƒóI–„Z(8ßÿ‚Û@pîE¡ãR:P¶ŒX*µF»(ô C¨sÈ;¨s|Ø®K¢ù(RçÒ‚ä®óŽï<¥Î+îºÎ/R˜,ê\r›:?¯‡:WxþÊš:·ð\A¶é#»‚‚sÂÒÒ‚<ÎWéÏmð^ç±ì°E›'… Ãhsí=´ùbr»N›šg´ùærÊ[p~Mxý·ÔuÀ=Có"m®2ÐêBP®q_!h‡6WhJ›ã5¯ÝæÓrÚ!w›‡Ðük… h†¬´v›£!Ê A_©#ÊrƒÛ¼.…6×&SJ›[!hmŽ2i³³mΆV, ´y8}À=Œç Ó¥BPmžQŠÂ)¥ÍÛ… Ú¼¯ôмTz)Ê)9Nióã)Õæ`ZJQ2›ˆ§h3Ú¥U‹6׿ãH… ÚÈD£•‚œO¥4n¸¢tyšî7#Îs·ù¥ „æO[éÕ'nwmÛ÷CwÎôdÿþ³÷ÃÑ8_{Îgß\zp>û®¹ç³ûš{p>¾×߃óñ½63ýÞ̓óñ Î×ðà¼?,ØÿÄ[BpÞ¡ÎG+ Ýá„[f<8o…êx?Çü! bðC_u.Ÿ.^ÝH£8_ÞÝ@ÿ±:§öCŸ u.Š’`ˆâ;‚"(Ë“tëoª¡Î¥/hQç_îRçx„)á‹Ô9ža¨s 8ˆ¡ÎQ+´¨s©uþ#£K Ì Îw1×ùVHi Ô9%‚ª«„p­x“ çð(u®Ð.Rç›@«°pÃS¾\ç û(4ÄuŽ«g34íFߨsi*ZÔ¹4‘:÷¢ÐÉ…œ˜Ng½6çI!(áS_ž*ZD½‹~nshs‘æ}´9£Í ͵^#MKã5Ÿkå©Ú¯¹V¤ÍQ´¤š–&4WpNQ«çQÑ’Òææ7L\Ú¡Í!͵ö¢e‚ó2mn…  Ο#]Ðr¥BÐ>Ú\³]¢Í»… r›ëžY·¡Í¿[m@!¨î+£ÍuŸ¥´y_!¨Ñæ…BP4-)mNßÑæê?àÙP¢ÍSE ÁyT´„BÐŒ6i~x Í#m®gXJ›s²†^‡´4§Íé…àyÉs“S;ÚU ʘUK… sB!¨þî½… ­à»¯¹çã{ý=8ßk3ÓïÝ<8³à¼.ý®çåàüÌëï­žüÂ$8§DðüE  D´J ³’ÐWìpÕ ÎE¡ÿ°f^‘:ÿ«xvqCCDBŸ›Pçgu.ß9Ôùu.UA‹:WÀDЩI©¾`ô”ïVSçø…ñ 7Ô¹üá u®b? þöÁu.ꪔŒÀl7¨sh»\> Î¡RÑ:P&hÔ¹ÈUÂs¨sÂs<Ê„ux•ñ+£Œ€‚%Ô#ÜÛP!”lC‹žmQç Ï#uN€ˆ¶‚²D/ zQèòÛ\máiké:q­zWöç×?ZÁy²Ae… -ڜм¦Íñšisÿ”B›£¡)Òæ„æZE·y6ßìªj V_!h/mNh^š¸ÍchNQlKÑRÓæµ¢eé½(Õª-Ñm®Ðü9147·ù×lCŠ–EKZšÓæAÑòÛDb3É AOÐ}"Úœ~NkX!(´¹î'NsXh®û¬)Åm® ,6²º… ÁmÎÉNp’$†æy!hN›óœày±ßBÐ@›?2p›ëL^ŠÛ¼S m®“5)m~ … :}Ã)ž‹6Ý14O AÚ\Ýy!(Á9'‚¢ÛÜ A¡Í­ô“þ½ñîkî.—‚Ö%ºš[pNhƒóú4•6‡_¿çÇ<8œ¯7ÓoýûÏÞGã|í=8Ÿ}séÁùì»æœÏîkîÁùø^ÎÇ÷ÚÌô{7ÎÇ38¿Äƒórp~ù—Zç1<¯ƒs‚ˆ:Œ°ðûæÒƒóÙwÍ=8ŸÝ×܃óñ½þœïµ™é÷nœgpþÎû=ç‹¿ää)Sç°S 20|2_©s˜@ÿ½qÔÚà×½ê\¾]¼» u~_FËשs ðNUXmi®sQçåá:ÇŒÖàxé¡9h¨sR-ê\¤'ª¨s|à„[ÖÔ9¡ª…ý#u~mFKÑ€ã8PçVk©Pç;B‹V¥\ЋBÌÒn­à\…”VL•-RˆP\iÁù£TJp}<µÞQ"ÎëÞ@š§nóŒ6^óW÷‚Ú\:šŽ¢¥¦Í7ÖfB£h¹¼[ÚG›óúkcÉb!¨hst;;H»Ó[šÓæx͵ÒBн… F› A¡Íû ASÚÜBs¨Àç×?‚œ¯I!(´¹6•èhÑæR´@›7Š–”6Whε… wÛI `[… :1mνÜG›§… çûèùmÎó"u›ÓÝæQÑ’‚æ´yZz\R m~Ò­¿¶çœ‚B›+4ç9Ø*í¡Íy®ÆÐ<§Í£¢%‚þ­V´DÚ¼šÒï‹­ŽþÂRÐm®M`ëïx¿ý~;ð”/{pÞœß3ÓoŽýûÏÞFã~í=8Ÿ}³éÁùì»æœÏîkîÁùø^ÎÇ÷ÚÌôû7ÎÇ38çýÁùòë}xœwJB#u.⼇:?ÿû¿™R2™À<ý³„ç÷¿Æ‹B'UÚR¶ŒPJÀˆÖb垢PÈ^ÂJôÏ“*£¡Îñ›ëüË>jSlHµ«ÚŠ)|Ì©ó]û¨s©=^·/Pçðê\+ ÏQŒPlù:碨꜠¸¡ÎEž©séMÖPçxÃ]cXQ¨¼ã«œaÄ9Îùf)XÅ=Òª¿nÝ#óà¼D›£hÑê+åïn… t Aù÷nP Íc!èëJ… "Ρúy›BÐkmÃ62Ìk®¥BÐ%·¢h)Òæu!(s1¤4w›3wÚ\Š–¾BPhsÍò*14OÜæEÚ¼)íÒæi!(z$£ÍQíÔ¡9'A¬TJ%-¸Íƒ¢%çi!h ÍU*US_!èþÚlCõiówh#ÎhsmÌ¥´9º(ÊŠÑGqó/L'…¢…à<-eÐ A-8¡y^Jqr«4ÒæR^¥´¹‚J‹hóA!(ÁyT´¤… S¥Íyþ¯·ÏõS¦Í Ο{‡çýÁù•3ýæØ¿ÿìý`4î×ÞƒóÙ7›œÏ¾kîÁùì¾æœïõ÷à||¯ÍL¿óà|<ƒóEœsÙ?8^ƒ5ÿõR Χê:?ñÿýdçýE¡³2ºËΨsi.¸ÿÏæ:?ÿ¾?Uç*üA9pŽÂ ³EãïÅå e‰¢êú²¡ÎEe4©sQ›‘:Gƒ@ùÞ «Çu®à ]B Î Ôù?­»pu®lÿë®öÃu.ª”Àè:‡:ÝM!Ú[¨íZSçm-ê\AÜ€:÷¢Ð–²e ŠB_¨à|3¹æ7;«o}ÿÿ~Wµî‘_µ"Ć6Š–WöÐæúk¤… ·9¥§£Óæ%E‹è}QülH BóDÑR¤Í!͵(yí¥Í¥éi¹Íchž‚Önóe{hs6núhóR!(ÿN!(´¹ ASÚ|} Aq›hsº¸~¡4Òæ¡w€Ð¼E›+4§§ ¥Í­T÷7… Üïý… Úœç§WòBД6çijˆgÒQ‰¢…àÜ Auj&-mhs´É A9Ãóq¤BPçœôáÙۦͧWšn˜¾d«Ë‚¾ˆµa­RÐÔmióÃï¶œPÍùôýþû¿ÿ=лfúͱÿÙûÁhܯ½ç³o6=8Ÿ}×܃óÙ}Í=8ßëïÁùø^›™~ÿæÁùçuAè}œ—7¶ØçÚvp>Iêü+ïZàÁ¹…ö…Š|m…ž‘…*l…Š<_[!ngŠ¡oÑW4E¡RZL§(”°³M‹«Sªà—|C›£hIisHó&.¥ }… Ì‡N'´ A¿ A¥iÁ¥¿œ¼æ6O Aûhs˜(ÑæÝBÐÛ­t݆6¯ AOQ!(𖤔kˉ‚¼´¡ÍU⛂æ´9›cF›k³,¥Í­ôZ‚jc-U´œGEK(ýÙ Ú\¡9´9ú¨†6W™qJ›³ùg´y¢hÉióPú;ÛP$8?G›Œsî‘Û\Žl<6… ÐæÒaA›[h.MV^šÒæS)Mƒó¥×:§Íëà<-¥ÈÚJA˜Sp½B(ÂçWãçœ÷çÏô›cÿþ³÷ƒÑ¸_{Îgßlzp>û®¹ç³ûš{p>¾×߃óñ½63ýþ̓óñ Îçyp^ÎßrÄgÈ Äy, Uð@KB &Tjº–FÙè¿ÝNÿúΛ¢P”-¸Îþ÷ê*¹tÑ@<à\ª ‡²º¹¸ÎEããÅËKøsԹ B¡†:WX„¢ ¡Îkß9T&.`œÀКP›¸‚ ¤ŽQ0…  =B‹:—ïê±QçøÎkêõ Â1B2¨ó½¯ Å€eêü†:Gû€þa[•zQ(®óñ* }ˆsŠ#_wÆ]SZ|íZG|µK›¯ m^*£@?¥ÍQ´h¥Š–ŽÛ<†æ©Û|H!hm-¦iI-5mNÉë›b!¨JA³Ðœ ŠbMÝcŠ–Œ6Gõ£•+ZÐ=ïÀ¯š&(ÒæVzH»ôeR´¬ÜSúªco³Í"6 Í)Ìns£Í?hs ÍOý^µ Á¹®M ÍƒzÇ Aq›'…  m®{”^‚¨h‰ns£ÍšC›£hé§Í¶à<-MisNµÐ©‚B›· A#m®Ð<¥ÍON AsÚ<†æ#ÑæzÆò¬å™ió«Ìm>ÿhó+ÿó¯Ó¢Í—zù)š?q·ÄL¿9öï?{?ûµ÷à|öͦç³ïš{p>»¯¹çã{ý=8ßk3Óïß<8ßàüÝœ—ƒóƒOûjœu-ž×åk+u]çoxÏç¥à¼ªpæzQè½VFˆ&‚rB|˰„{„|¸›¨Ìð‚CÂ@¯Q8H"aáÚ'Üaň9u¾ª´¯h¨óoU‘è/^ü®oV+újE•+(°\þ_·ß4$ðr¢‚Ÿƒë\„0¡ç€:O}ç I)‚4êü “¤ÎEžÔŽBo¾`‹B_ âötÖZ‡Çà<ÒæEKÇm.*>ÒæòEÚÒ¼.í£Í!Í;´9¤¹E¬oŒ… 9mŽ×|ˆÛ<†æ»ä… ºþI!èÒ{}1£ÍU m®y‚6·Ð<§Í5ƒÌ"3Él¦… 9m A¿c§+˜w+ÕüC›· Aœs¿lCó´´@› A»´y_!h‘6×fÚ~C AmJˆch^¢ÍÑIEÚÜ-ÐæÚüKis+Õ!… §Ýù[SV¡h!8¡ùœ{ä5ÏismDæ… 9m~µ63ÙÔ¤bº´ù‡oû¯hsýžJhóX ʦð‹7<׃óþàü¡™~cìßö~(Z®½ç³o>=8Ÿ}×܃óÙ}Í=8ßëïÁùø^›™~çÁùøç›xp^ÎO¼ì»!8/Qç}Ÿ€:_{?*Áy ÎCx>¼(ô¯¦hQçòêüF¡( <‚:?×yMCgR¤G¡^NPµ¨sé(é#Ô‚%à‚:?èÆŸê\žb(R¨sˆRB²†:ÿØkêüGF£B¥âB†RÝù²*¸çÞoeƒÛC«|B¼Êh" _!`!a!bñ0œâBÌn(õ„…Î\Qèóœ£õ`ñšOfů[“à\E£OnsÑæ‹®V¢Í!͵ÐȬEp^ Í׿¸ZŒ5¤”âT T»Š–¼4q›§… }´ùN‘6¿©C›£èiÓæeEK‰6ï‚B›+4_©Í_z˜Hs A¡ÍUÊæ›@Ñm^,­ƒóõOñÄ}is+…6×FUJ›[!¨N‚p"$§Í߬{x—Ëm¾[C›‡S&{ë¾çÔIT´p….„”6·BP=CÒBМ6Š–_Z!(Ï%NƯмSšÐæ<çxÞqÚæŒDÑÂ3‘.ˆs Îïûc­hù“ÜáY AÿÒ(Zmþ7;ùà  « Íù{>óœžj4_wÜgâ6צ.¿£†hZÖÛþ£œ÷ç×Íôcÿþ³÷CÑÂpí=8Ÿ}óéÁùì»æœÏîkîÁùø^ÎÇ÷ÚÌô{8ÎÇ78_Òƒórp~¾B‰'?ÿ}ésü±=Ôù‹6Ÿ;­Pd:Š…–‹B Ï¡Îñ0Gêœð|ãSžGê\D-JІ:—ª"¥Î¡r  _ u®’ 2Pç·Õ á‹ès9¦uþµ@‹ N©óeö ÚgRö¸·\çòX›šÃ¨s­"u~SµÔNŸÑR‹öƒ²IJ'·ÿ”|Ú%êüº@Dãán…^]-ñ/"Ïß¹‚s9½ƒë\+w26£8‘#¼í:W@ÝqËw¾š¼ã ·-8×ÅtÖïùJœã6ï)ųÞShsýÝ;Š–š6Çïnns½©Û<’æ¼V­BК6ß*ÒæRä4ÁyT´ˆ6çÚà£ï-Íis-Z©¢eoÍG]ºLO!(3ÖWšÒæøù_¡¹¥tÕc¾mþ~-çkR mž(Z8…A@©”à<‚ro™¢EÁy(½§]z‘ Aµ¹•‚œ[!(Áy¢h¡˜àœ¢à}E›ï?„6gÎhóDÑ’Óæ14oÑæRL±é‡rª)…6WhmN1r¤ÍÏî¡ÍÑ\ÅÐ<§ÍÛ… ³ÐœÍÌ@›O/4çÀ%wªt˜Û¼Ÿ6gCx«·]ïÁyp~ÔL¿1öï?{?- ×ÞƒóÙ7ŸœÏ¾kîÁùì¾æœïõ÷à||¯ÍL¿‡óà|Lƒóº ôÇžwÃóë—Õ"/¨ƒóuq>œ:_rõ3Õà|”¢PÊë $/~ð/뜒;¨sˆÊH¡*0ê\ê‚uþíuNÁçñµëº“À â“r>Jú´K©s•ù¥Ô9e-ê\¡Å€„h„i¨PçЩPªÐª‘:'Ûa.Ôùu®2BÜÊPçy°¦l1ê<„çø™¡ŸSe‹…Îÿ¢P‚sq±Q1êŠ_óêÜwhs Aµ:Š–ºÔhs- A)@‚*8O A_W*Íió’¢EnsÊZµ‰ÁfÆ 4×&‡6;ž±³¼æ;—hs¼æ©Û|4Ú<(Z¢ÛüëÕ }… Ðæ ÍÙìaÓgBÚ<)m»Íƒr§E›+4çÞâã^k A¡Íu/B›šG·ùΗÝ_Ú<ÜÇVªû:-Íisž ‘6‡N¨m®Ð<¥Íy¶p²…g ý M!¨žCi!hJ›ÇÐ(%8§_"Òæ¦h™O´9ÁùÎ'YÁù)a©cc)ÃèܰÍÜ hs6…÷zï<8ïÎ7Ÿé7Æþýg…áÚ{p>ûæÓƒóÙwÍ=8ŸÝ×܃óñ½þœïµ™é÷pœwp~½çeê|™Wž:-êü£?úÓ£žËu>ëŠBƒ²%…¶”-s¢²%”nV»Î:GÙB°+e !!jŠHSHQ"4î¢r¡s¡t[Ô¹I4 u.=Ô9åŒPçÀ‘:ÇG—úÙrã©î§ÎEžçÔù®¢“ñaãÆV;už…âãÆËý†kª§o!â\u—:ïS¶ˆ8ï¥ÎP£EÉ©smÛçËÓYœ¿rm¾F?m!_¦Í)ÕjÑæ%EKN›ã5Ï-ڜм.í¥Í?W=cW­‰ AkÚ|ÙÚ<-夃‚Önsüûy!(´yT´X!h¤Í5ç)mn… =´yP´ÜU‚FÚ»¯¹çã{ý=8ßk3Óïá<8ïàühÎËÁùÊ›ž?Χ@Ÿyë/åà¼[z•‚œ+~ú¿ì\¦êü¨ó‡ä;9yÁý6o/D%Ô9>_B#£H£0@e@Ez'‹:‡ÚD{ÐPç §ŽSPÕPç ° Î ´Œ:]ç‡@‹… %#ƒ,ÅuŽ¢U!Z‹:ŸuþPM?hô*®s‚9¨V‚ºíŒ:¿ÏKêšÿôIDATNß̹çÝBPhs=;¡Íy–òLÍ Aq›GÚ|º… ipþªçM™6‡8?eÞ]œ—ƒóŸÍô›bÿþ³÷ÑÂrí=8Ÿ}3êÁùì»æœÏîkîÁùø^ÎÇ÷ÚÌôû8ÎÇ;8ƒçåà|ƒ®Áù]çGêþG58¬…¢lÙc^Rв%) 5eKZª¯Uв%) 5eKZŠïܨóïVø ¡Î׆:—ÿyãê\Žhè]œÑh0VV@ Ý‹SúÅPç¢~WÄw^SçÁÏ“V£¡Îßö•êY BñVw]ç O÷(Qç"”‹Ô¹T ¸´s×ù6R‡@Co†çPçZ1NÆymçËÈ8O7Î÷=ùÞ¸q^&u~âM¯´¹q˜çˆlA¶.©GÒÌÜøÙOuŽX>u>÷¿6ïœÔù¨wþcF"Ï—¤åð:§™4$&©óÁ¤ÎQ¤7äyD£hï ç¤:Iw^æ3ëœF -f3NÔ9 /š_Œ[°Ô9HRæGÔ9rižÑD#uΗuN³¤Vù@Š•ÙÉ1êÆ]Ž:Ÿcc$Hƪ(´u‹Biœs"9’6Ò~vóÿjs–F¹æy´9Œûî¤Í‘k‚&is’æa!h!Úœ¤ymNÒ<,-H›3×¼H¶ydš' A=Úœ±G?…²ØD!(is,´6çÂKmÓœ‹4.¢Å/Mf›… 3l!(s[z9ˆBÓ<*%mÎlÎèzÖ_ÓÜ7ÎI´ã3,mÎÏ$ñn Aã/¥qn A™m‚~m‹‰iœsñŽ‹x~!hÿé7>mÎÂc.²” ƒ>mθ*ÆVù… \\¤q‚þE´D´9Ls.RNiáBPwî¿ù5‹6ï¼Éµ2Í ç›ï]í›býýì>ÕËÜË8ÏžFeœgoÎeœg{Îeœ×îüË8¯Ý¹©ö}œŒóÚ7Îqžoœ_0ò¥|ã¼ ê|û“ÿ\ƹ‹l)VÊl^@c™uRç£ß ¨s’–$.™ó˼_šJÌÿ¥ÉäSçŒ<`ÖyPçÌ;g$‹ø"ê&ÖEÓ¾±ÙÃyÔ92ŠIžá¨sæ‡YçÌ7>q ¤Î™{Ls‘4ÛÒ©ó÷Cê\E¡‹íóœñ!‘qÞ6E¡ËÃ8gHsF×3ŸÎ7Í#ãÜ™æIÚ|L"ÛÜ£Íc… òMs.$ žq66ÖÆÑæÌŠßs*¢o“W Úœ… \¼(Xš¤Í±(Â…‘£°@Ú|©>qÚ¼P!(ËfY:ËòÙd!¨O›s1‡QBŒêŠh¡€6ÅÒæ,¼µ´¹ÑÑæˆh!mn#Z|Ú<,e¶¹hq‚ÎŽ‚ŽA!(Œs¿”ƹO›»ˆ¾EBã<­”1-®”o¤ð‘,%mn AÃlsgšÇhó¨ôo¹BPÒæ0ÍI›ó-G›+@›óœèLó$m˜æ?š ´9LóÛ¿þÙ4sñ²ÜÏb??ð¯ŸUL›s1¸ë.7É8/lœ¯Pí›býýì>ÕËÜË8ÏžFeœgoÎeœg{Îeœ×îüË8¯Ý¹©ö}œŒóÚ7ίqžoœ¾ãíÀ8/•:_í*Ónõ¦ÝW›®LlQ³¤9Æ‹£ÎÙBCgòˆl©ñ¢ÐXd‹- ý¤hQ(#[ #[Z¢(”¹ÎÌwÞ*Ì:'-Mã—‘4qQ˜:Éf¯}NuÎø fOÓà\å4G#ïüä€:_ÎQçˆãˆ¨ócÕ•fª5U#êü±Ôùƒ œ=Ꜯ¥Î“æ¹Ë:‡ì….º[SE¡ Ï Rç0¨‰§Îab‡ÔùòûÞió³£ýH‚¿ÉáýÎg’8g!(F¡BPK›3¢%A›[Ò¼0mnIóAÙ7I›;ÓÆydšƒ6'ÙýÌ|ùœiÐæKRˆ6'iF´ð­‚… Ì6·… ÐµD´¸ls˜æ… AI›Ã4'm¾A)´¹Wš¤ÍýBнBÐÝCÓ<*%mŽBPÒæA!h`œ3BÉ‚´9 A³ä‚&ióX!(ió°ôŒd!(is˜æ9ÚüK›;ÓC?[Ú|'1ÇVpžì_ξÆßß©‚Ïø ùÿ¯œm”Ÿ…i¾¯Œó|ã|üSŸ˜–O1Îó¨ó+M»ÕúcÐ8Ï™çË÷Y3ÆyZQ(©H=¤$™ÍPçÿ³†PŒ:G¦/©sÆ:gîo@#ï<¤ÎuÀ¬sšQŒ@`BuÎè„uË1 Œ[8Ô93‹I”2Ž%€$MIœÒDcI s#ꄪŠBë£(´3ˆsÆÜpÑ¡²1Ót9ÄyÌ4w1-"Z¶H£ÍYŠ£ÍÓ"Z’´9âYöHD´äÑæ4Í1ÑR6Ç|1fq;ñˆ6ç‚  AßÃòXÆùÐ4wÙæ~!¨O›“4çbM²”´9#…mÞÍÑæœ“d!(Џ`”¤ÍƒBPd›ÛˆG›Ïió9qÚ¦ù¡iî²ÍYàkisD´°› ­ô8[ú±=Öy̳ëÀÑæ6¢%…6·-¤Íñ&Ë…èQðió~ˆiá[/~!(óB… <§ñ­š’ Aqžd?{"â´yÑr;)«ašó\~ÌðévqÖ.ÒòšÃk¯A«ràz´Ê•f•¯¯W®ä:\>èŒûeœ§ç5Ê}¶£ü‡í³Ü>«àŠF»Œó:6’dœgûœQ¡Q'㼎yçµ{ÌWx<Ê8Ïîñ(ã¼µnâaš¯$ã<ß8¿gæ<³ð*0ʦÎabÀÐh¿Ö@”rþ\cæy…†‘-QQ(ÌóXQhÙâŠB‹G¶ä…2{™Yç{rE¡³cE¡,=dŽ3 Ûí½a"ê%‰,±Œ¨s˜¤ÎuAêœE‹.ëœt/)_fK3czís¦š1ê”puRçȬ&QL²˜„q§ãžöòÎ}êëˆõ@.v~ÖùC–n¶™ÚÌÖ¦k©óû Pç ÏYré¨óÝIb©s ?ï<–už ÎIq“æf~ø–…©óΠι¿b¦ífÅFâ络Nã|xaÚ¼h!èØ í–šßÛÁìvd¸G¹æy´9#Z0ÑÂ}T°ôÞ¦ A£RPß4÷ A ÐæË8Ú¦yç´BÐÚ<0ÍÓióüBЙ–úßܣͷf!èÀ t;/¢…ÆyZ!hD›hóý#Ú<8þ\!(ßá[!–6G±¯O›‹ø%.ˆ1ŽÉ™æ\0ã±Ï4G›Ÿ™¤Íaš“6w-\”ëë‚’6gQñ/Ä AiœÛBÐ0Û<ˆhÉe›s¥Èy… ¤ÍgÅÅÅqmî"Z’´yK‚úoíÓ÷±Ð4÷ŒsÏ4o·Šgš's,ŸÔšŒótãüêÖºïÒçÔî«æ†øÿqÞàåhYÆy¶ÏIu2ÎàYîHòœ¹Õ4F—YÌX’ÆeQ燡pòP š´yÔ9ÈóTê<, eÙ%cHHV[êüöÔùDPÚ0›Ik3ê„‘' ¸Ù£ uŽÌñÍFç4l›3Ö;mZ mŽõîÉBЛ ‚¢Íw¾Ítä(TZ6g®y‘lóÈ4O‚z´93쎂vbD ishšp-|Czq… «Ñ4‡ž˜£ï‚2ÛÜ‚†ÆyÑ2þÁ9°… ˆÍq¦yTJÚÙþÔ|¬´mî‚&isÑ’,M¥Íq<3†É§ÍY§Íƒ('gšs±-I›sQ.YzŠŠ¯Da±Ë6èhs˜æƒ±àç Aiœ»ˆ–!û´y¡BPç±BÐ/Ñ‚˜– ô—ªû×Ùó– OÃÆ´Ä#ZŠÓ渖áz6ìžwdœ§çk´æ}—>+»Fµ>÷hŠj©¢‰Òz‘qžíóQ…FŒó:?îyn©Ð¨“q^ʝðxq^Å9iëp3ŽGç­5Aü˜æ×È8Ï7Îw>bJ`œ—šun©sŒ0ëü¬ÛÞ¬šyÒœ²PRçQQ(ÌžXQ(2{IßBêt%óÎG¿÷߀:Yç 0YšG“‰yÀ4œh>‘Ü3ŠÔ9Í)Rç4«˜uQçˆN Qç DI3£ØRç H]Ö9cld ¢TZßE¡÷½Ëš¶ÍëÒ8ßÄ嚃6߬mîHs[ êG´Àð#ZÚ¼ÔBлÌb{% Ac´9sÍ1H›3*ÇÒæXÄÈ‹hIf›Ó4Ò–Àº\s.˜¤Ñæy… ¤Íašû´9£,mÓXðJ‚žˆ\sŸ6ç±o³Í½ˆçìE°ÙæO~eß\‰Ñæx³%YÊ·_|ÚÜE´°tˆÑÂsš-¥qŽsO›ç A°}1Ú¼ Aýó}§M‡åg›—H›ÏßùRsÛ³_È8Ï7Îÿ…{ _µæ}—>+ÛFU-Ï¿ŒóìiSÆyöæ\Äy¶ç\çµ;ÿ2Îkwnª}ïVáB–ŒójOŒÿ÷ñÀxˆŒó|ãüг04J¢Îi\8ã<Œl9rÈó5iœßõ­‹lA´Œó¶. "[Z¨(”&Í::êœyËÀØc3éØ}É̬sRç{:‡!Hc0 Îß²†!³ÎIÞnGê$.óŸ{¢<ÑRçÈ…&uÎÈ KƒäuÔ9óÎYÈHê—ô/©sFh &l©sЫúÔ9b8bÔ9b:H3¶Ãšª0Wi².É<ì#Yç(›´¥“©Ô9ÌÜÔù¾ˆaÔ .a/£ÎAž§Rç“l´‰¥Îi>7Ißdî1Døf9çŽz&ù\ÉXçTß8w¦y’6O+…qžWêe›;Ò¼mŽ}cMó½°¯ò AA›3Gžû·`!h’6GÔΑGy… }Ò A“´9ßPp´¹hI¡ÍmD isèo?¸BPçŒÊ±´¹ÑB-oU ”Æy~!èÛa!èìx!è˜üBÐ$mî"ZXêKãœ]ÉBPç.¢…Ùæi… \d³… Xt£qî‚^šWš ÍÑÂ>Ñb A Ðæ~D ¹˜è²Íã… ?…… ?W­Ôç“?ÿ± m+ÍË6®c׸R¦y:mþ×Ö¼çÒge÷¡¨æ^Æyöô)ã<{s.ã<Ûs.ã¼vç_ÆyíÎMµïádœ×Ák0Í×’qžoœŸ2àéçï|IH‡‘-+^fà 1Á±rPÄÆlÙv«zæ9¨ó=Î}¸&ó ²¥pQ(iJføúÔ9ã H`Žzä9©s”ç ÷©s›4£˜Ìüà Ï#êQ ŒL`QiPš[ŒT áEZ”ŤGI‘’:'Uz–ŠB¦(Ôç4q+Ö8ïærÍaœ3¢¦¼5ç7mÙ"ÑR˜6·… %Óæ4Í´ù~~¶¹3ÍÚÜæš§Òæˆg9"ŒháÂGBPÒæ,‰uÙæŒñÉ£ÍašsñÅE´0 ÈÒæ0ÍI›»ˆ.àp§Òæ^!(cˆl!(‡XŠË£mŽ£Ý˜kŽÅ%.2E… ¤Í±EÚœ‹RŽ}7,u´y°€e A‘mî‚&isvD… ÷ç A}Úœ=–6‡iž£ÍƒÎÑ’¤Í]D »xNòióX!(isœÓøFO›³ç!G›ÿ/F›³"YÊ·yšó6PS¿;¥ÕAD‹ÓâÓæîºä®S®Ü¦9¯e+ovݺÖç_ë±O®«öͰþ~v„êmîeœgO«2γ7ç2γ=ç2Îkwþeœ×îÜTû~NÆy}ç¿Âƒã¿õ@{ ¾w³=oîM³¡Rê|ÉM®3—üåýª)M-…þ{Ž:o›¢ÐXdK E¡Œm ‰ZzQèuލˆusoбûYêüKÍ:êœÆ BÆRDÔ9ÊcÔùÀuÎRÅÈ;'uN’—Ô9MJš•4-»’:GÎ4)àu¡áS礅sÔùó6»š)©óÎȵ¦qÊrÈ¥cÔù4›‡mMWË$—iÆöq^:Gtiè:g&÷b4~5’J#ï|÷êœdöNˆ6éÜaŸ:GüÉ6ãR²ÎÇÀÐuS{YDµ~æ>©dðw×:å)Ï8w¦9Œsgšo‘F›#‡=6§iŽÁm‰rÍ'ƒ²ŸbI{»í½°˜ûîhs’æy´9Ió°´ mŽ·ø&æfÉÞ4ÎI›Ó4÷hs¾MÀÁBPf›cΙmN ¸lsj#6ç kŸó¢Õõå AI›;ÓÜ‚:Ú:õis[Z€6"ZÞ Aß AG¤‚â8bDË¡iî²Íù¶»XÚ»@!h’6ç±,eßÑb… ¤ÍqθÐ+¥qÎâ˰0ç‚Ò8w¦y²ÔÒæˆ›rÙæ®tTZ!(is,&ŽG”Uœ6oBPžÇÇð³ÅQw¦f›§ÒæžiNڜײvË_ú®ógaüC×ûØõþˆjß ëïg÷A¨Þæ^Æyö´*ã<{s.ã<Ûs.ã¼vç_ÆyíÎMµïçdœ×qæœ?«iû ý&ÆÜ'ó/wñêó/Gãm¾ "‹vM¡Í¹ØÄ¨£d!(ã¸H‹h!m>9N›{'"ZîÊ/¥q/ýÜ‚ò<`ió”Bо^!(is¾ÕÂN¿”ç v/8Ú<(ýÎö3ðÜÅsis¿”½–6ǹo¬Ñâ‚&iój‚˜ö©é¼åÈ´yðÖSô”O›³Ÿ#4Íí"ðr¯÷Kâ:7ãg]÷íuýjß ëïg÷A¨Þæ^Æyö´*ã<{s.ã<Ûs.ã¼vç_ÆyíÎMµïçdœ×q>,ãÐó°ý'cüÚó/{ñ0¬qž3ÏaD8ã«IêœÅ4:I 3fƒÔ9³ªWEÑã*0Fêü9k˜Æ¨sª6ë86yŒòX=Ç,Ýd!(s[Šb`gšÇhsD:‘6‚’6‡iÎóŠO›û… IÚÜ™æIÚÜ/e12 ¹xHÚÕÛÜË8ÏžVeœgoÎeœg{Îeœ×îüË8¯Ý¹©öýœŒóú1ÎÊèÃóOØîë1M;`4|S”:wæy¡¬sgžƒnî÷¦Çw˜v¸vpñ5È6Ç¢,K¨CÓœ‹µeÐæ‹ÁH»Îáúw ÆG½˜^íaýýì>ÕãÜË8Ïž^eœgoÎeœg{Îeœ×îüË8¯Ý¹©ö=Œóú1Î7ÈàCócØæu‹0fTFÇ‹B­ñAd«Í¾?nî€áRi>yKÿ^k…2²¥XQhZdK±¢Po'À€#Áê¨s’­$\ô¨sæ-ÔùûyÔ9éY‚{ òΙåLÊ–1¤ni$’:§±È8‹ˆ:±Ûs€G_ê9Ò›ö›i³Î•A“0MMÇ49YäHZ˜Ô0éáˆ:G³¬#êq4RßA"¹Óq…¨sçÌÏFŽv^Ö9 hÐ,®\œttDßW&uò<•:ɽ]Ž:§i½ÈÖ(æÜ ƒ8HpçÜn7HG—2üßY=2ÎYêe›û¤9?36g&»¥Í‘kžÑ’¤Íišß•_£ÍYŠÁýÉýjisìçmÎìy›Ae›Ó42/¢%6/TêÓæ¶”´9t•¤ÍS Aaœ¦y’6G޲ÔÑæÈý÷ió}ŠÐæ<¾òióí[ }îÞ±-¤ÍqÌú´9ß$a¥ÍŠÓæ¶1-¹BЯm!(sF>% AûOÿ»ñis¿tˆÑBã|bZl¶ù;ß[ÓœQT4Îs… ?Ä A'~–^ÊÈ–c÷£ª}#¬¿ŸÝ‡ zœ{çÙÓ«Œóì͹ŒólϹŒóÚçµ;7Õ¾§“q^?Æùoñ°üCF˜ßÃvîUŠøa4Üm ‡0ë¼Ò¢PK †æù‚k^mÖßçVsãÿhQ³¥RãFE¡* ­fQ(sæp³À²Ò±ÚŸL¡ÍÓ"ZBÚ|;ÄÇÐз-ò#Z¸°k mîLó½Ò A‘mΨ­,MÒæ)… mî‚&ió´BPFüpÁÅe›ÛˆÒæÌG‰j@›%µ\À±´9t|Ú¼P!(‡ò Aß¶F>mÎb]K›' A‹Ñæ.¢%YzÒŸ›.%mΧ žÌ/¥q/ý›íTðòßmL#ZH›_ûêwm>¬mîLó4Ú<^ ÚÜF´üÜâ-w^ï=ø¹ š‹¬ÅhóÔBPšçŒó³Ís¦9Œó¾+4uÝõq9ŒI¹`¾ùqMíý÷ì>ÄdqîeœgOï2γ7ç2γ=ç2Îkwþeœ×îÜTûžPÆyç _nð‡åï°}ç`ü®TáÃh¸æy@ëÅŠB gÓÐ`ö¬}ž¯ÕóõzÙ’£Îiž/±ÉPsþÔ95cžW«(”Äç@Ä%äŠBÿÞ¬¢PR©ÌBf¼7RçŒ} ÉJ¢•& WGÁ¬óIsO3Z‚ŒšØY猞 MQç0 Iïæ¨ó¡9ꜱŒ·Ø¥ŠÌ‰î‰¼s’¼4'{À¤ìNê†e7K¿Pç05cÔ9ŒdGÓ eá#3¬ËAÔÌ:_ÞQçˆñ`œG:u’ùÈ꜑!,©Ì£ÎAJÓüÝ?:‡a¼²Îa 7Ù2Ñ’ÜÖœ¦IM³z[rZê#¤Î—†qN£×¤¥‹äϯv"Œs’æ=X::µ´mnsÍK¦Í“… È6ßÏ•‚ú¦y@›Û\óTÚœ¤yXʹ±… é´¹-Åüæ A]¶yz!(ucis’û^D‹Ë6O¥Í½BPj–Ú ²Íã… ;(åqais'ì"ZÞµoo°;  ÍqŒ¡S 7 AqÌñø+D›»ˆ[JÚý§#ל}±BPÒæ0Ís´ù7&YÊls[Š˜gšó\ÃsŽO›Ç AI›£t$"Z|Ú܂ΠAoùè1ÚœÅÉÉBPvDTº`™ü½±ïþÛt;ìvÃkGÜ4/@›¯tyP ÚmÎkز}ž™¾%gyã:Ù㥿' q¾I©÷ú¹ì>ÌdiîeœgOç2γ7ç2γ=ç2Îkwþeœ×îÜTû^PÆy}ç£ô!ùl×XŒNå FÙ0øŠ{iÔ9M kœ. ¥!âÌ‘×höºð1sû—?µ˜S©‘£¢PÙ¢¢Pf|·TQ(sš½Í«žçÎ4ߢP!(ŒûmžV:9(Ý­H!èÞX@(TZ6Ä,qÆáˆhAlN.¢ƹošƒ|s”‚ú´9Ë`¹H’,eq¬-ÅÂJPêhó\!(ióX!(is,Ü06ȧÍm!(yXº+ ³ÍƒBPd›Ûˆ–·‚BPD1ºˆ¦¹Ë6·´9Ló$m~(Œs.LqŠ¥¼ŒIJ‚&isšæ§À4÷ AÏ|è sö#¹lsÑBÚ… Nó"ZXšG›ÿÝçÎ4O‚2Û|Ø›¹lsÑÂls/¢%*…qÎBÐñŸüÏÄióê‚^þȇf™ÍGÄMs›mNÃOYSÖÍuÎ|í¼¼óXÖy‚:'U½/èjšÅ4K¦Î'Ô9sÄ·÷©óquNãœÛØœ± s˜æ oŽ2Ð-’… cƒBÐm`š*ÍË6w¦9 P{µ@!(Éþ˜iÒæG9Úœ… ¡iÎ7l!(isÌmŽ6Þ6XóO°”o#$#ZÒhsfê' A{à-ˆÍ=ÚœZµ´9´Ë¼~WJ]§‚Ò8Ló€6çÛ®4 Íß·´¹5ÍmšæŽ6ç±h³Í… –6Ç›#is˜æ<þmD ÎΣÍ'~ö£I£Í[¢”‹•‡^ýŒi¿Î5†‹¨i^<¢¥‚BPšæ‹ÀWzÄ5t!Œ çöZ¥ûD¿—Ý›FŸû sÓ ¿wq£ïû¶Ú>çÙ>ŸUhÔíTŽ^ñý+8GŒ-ç3ô³åë¸B£»ºüÏÒï”¶Ï*<·*gÿVx<Ž,ç3ô³¥ÍwbslçÉÖ¸ÿú 9Ÿÿ/댇âMÈ8ÿÛrÆ|ÍWûÀxø{Ù²5Œ–‡qÎ,Ù¤qžG. µä9 ŒÅÝò§ÛßncóüsÇ׿˜Û‘á;ùËŸm4 ñH]Þúɖ¼Æ &Ò™4ÏYª7êÀ<§!5œÆ9 *U,ãc¾0Ís ŒO`þ0M.…f£(´Ó¾w[ã·9cåãã«Ñ‡6>Ê8¯’Y%ã¼¶ÉjŸ3+4êdœWéx¬ö|·„Qךß1kŸUáñ(ã<ÃÇc+Ü·É8Ožˆð0¼ÆOuþPü|ÿ~íZòD ãaEç/V£(Ô7Ï\ûÓë¼GÌ”/~l½XQ(M¤ñ0”Hc’Ê´æyHÓ€bVpŒ:‡yQç¯%}$A¥àÌsRçÌ'¦ ÖfØ¥!uÞ÷iPç0Ë"êô)Í´ˆ:G23‘OcÖ9¨sÒ«$Ï™u~©suÇÞd“|elÄ a™¿l©ó )QçÈk¦)È(Š}`’²e!"©ó^¤Îa&ˆ:‡áHã1¢ÎaH2ƒYç[ôÕôí~ù,[ÎØ f&I`fÓä¤ÙIÓ3 Î_ŠQçŒä eLÚ˜Ô1éã=êœF+ WÆ|ä¨ói ÎyÂùHR2_q!…©s˜¿Œ ³ÎßÿÏÈòÆØäy*usywÐÙˆ7a©fG–krì|›éHš9âqêyç À™;Þ Ä9·«9cåãž(@›“4 A ÑæüŽE AMCÊÞÒö1Ó… È‚Ï‚zÙæ‘i^„6çÛ˜›¥¼BP¾1`isÌe²ÔÒæ˜{F´PÜgi´¹-¥q‚æÓæ~!(sø-mÓœ´9ߘp´ùΤÍašSßÔ9õž, hsD´Xãü={ÜäÑæ^DKŒ6DZ˜¤ÍÙO§Íƒ·IœiÎBÐ$mηQøVŠ_zÎ\€‹‚’6ǹ&G›ƒ4/PÊóÿÒ Aiœ;Ú|2§À8g!(» šK›_úà¦Sá0Ís¤y”k^jDK2ÛÜ/åâ.{9–½ø{,úÝ’×Bþ-\_·Çx£Îï˜o~JKïý½lP0ÿ­ðV)u~#ìßZÜçÙ>oUhÔÉ8ϰQW‹ç±FùN2Î3|<¶Â}Û;"ÎSVçÃSðý—¯Ö‰Äo`D j™¢ÐôÈk¤À<_sqføÌymfž«(TE¡‹íUNdKá¢Pç$§£3˜ñ#MïwV‚qžÑRˆ6glŒ¥ÍaèçE´$is” &isFÖp 9Óeª¤ÍQºøÁ… A‘m΋#°pÑD!h’6çâMsFôø->mn AI›Ã4OÒæ©… X¼áBNÏIÚŸ6/Tjis˜æ¤Íù߯a¼ +é’¸ÆûAW>D³à<ïÞ6jvD ßzÂPówæ inó7q½Z§Z×C\kqƼ:6з¨ÖþÑßͶUÏóß `•çÝêy¿Öòw—qžíóU…FŒó uµ|>«÷ïVáñ(ã<ÃÇc+Ü·qžnœ¯Ã‡àWð·l­% ‰^0&¾µŒ Ù’–u^ad‹5T0Ýh¨9sÒ›4•˜:þ︢Ð(²Q¤/-uŽÂÈÚgÉ8Ïöù¥B£NÆy†º¬#[s{+<eœgøxl…û¶ž2ÎÓóÓêÈ8ÿ ßõŒ_µæ Ÿó¼s»å/}>—u^BQ( Uû›v«q€8_#¿(ÔRˆÎ\YgÙåì‡Ìd˜ÖÍ5ÃËù}…ª(´¥ŠBiœ“¢Î0Ĺ87R~v…c`œo ã<Ê5kc`r… ˆ†a9)hskš§Òæ,u¥ Å A“´9sÍ-‰lsÆâXÚœ19MÐæ¶”ÙæXábH!ÚÜ™æÌ6·´9LsÒæ6¢ÅË6O¥Í½BP.æØBPf›' A=”ŒhqÙæ–6‡iÎ…¤ ¢%0ιÐÐæAÙ.ãH›3©mþÇ$mŽÅ.F-qñËe›³ØÒæ0Ís´y¼4I›û… ìOðióë’´9ú¸¨ÇH)G›ÛBP3zê– A¹ XÎyÔýìE÷½o–êŽhœÏÓ¼:-íV¸ô{\›oíë!?×áu0­£û‡9m±Ÿô™Ù6¨êaþ[á¬\ãüøN»×þ«×ï(ã<Ûç¥ :ç6êêõ\Wß»ÂãQÆy†Ç*ß·MÄßÏëŒÌ|9høð»U<øþßñŒ…ÛâˆÏãð©3¾ùìÀÓïqÞtQ(iARƒíVM1Ï™i‹áÊá‚×÷C*‘F Æê»ßb†½üME¦M%F‡9¾¥…Žmá¢Ð˘u꜄i@#ïœÔ9¢áQç TÏ|è s³ÎI#úÁeÓ¨;yç,%<î® Ø>aÖ¹OQçïGÔ9MBš…Œ¨²ÎçØ¢Ä^#fÛâÄÝÍLhfCGÔ9 ÉuŽx G³¤q3”5’¦É¹ñ%AÞ9ÍOš 4CiŠÒ¥Ij©sBúÔ9idG/Oê…’4`Y2Y˜:õÌØdÖù¡ ¤iüêœÑ#1êü¾”¬ó»gâQç½@kÓ€FÉf”wË:Gl Ë9·ƒ‘ÜqçÌk·ƒÙíåü^¾qîLóqø˜æü¬‚… “ƒBPä³Ûœö^4Í… y´9Is ÒøióĠaŽˆkœ§ÐæÇL3Kq°”Ùæ˜3f›*å"‚£Í©¾…À·˜…ï AI›Ç AI›ƒ4§Æ|ÚÜ‚2ÛoB0ÛÜ‚†ÆyPd›S϶úö AùÖ…¥Íq<$ióCaœÓ4?-|ƒƒÇscqÚ… 8y<òØL£ÍÙ[+%mŽãݧÍÙ}Ðçž.až hó d˜ 4Íc… Ž6Ç/×#¢Å/…\sŸ6çù‹oϰ”oÓ… ?… _4¯ôêûõ{Ê´_78§ÑæíÖ¸Úžÿí"*S¹°ÊV^+,m~E@›ó ¦d®¹Ѳú–Ã̈ûß#E=c©¶¸6†÷{âóß«ƒûˆÛÚjés³mRÕúüWù¬Ó|¯ZßgõþýdœgûœT¡Q'ã<ÃF]½ŸójùûWx<Ê8ÏðñXÅû¶Ûð·ÿ/íx‘qPc cðá›ÅYµ8îÇ÷Z­­NxøìM1^ð÷Í¥c^1K¬3 j‘-ÖpÁè¸ñPsê­¯·šy®¢P…¶DQè’0Îiü7g,Ìã1ÚÜ‚¢|”Æ|`š{´9sÍó²ÍiîŒsf›7£”‹1Ó<¤ÍÂbÅQ®¥ ¡iÎÅ [JÚ‹9Úü9ÅÃE?Û<­4I›3öÇÑæ6¢e´,¥ÝÜ£Ím!(is˜æIÚœ‘Ci´9‹öÐæûG´yg”VÊÒ]Ÿ6?‹T\¬J‚Úls,nq‘+6ižVÚ7YŠaÆ:]é‚Ò8gé°¥ÍQBD´xÙæˆÚüÐæ£ÑÐæ(%mÓœ´9£§X|ì‚&³ÍË-½ñ͘õ˜d,bš·TDËn}î0wLÿÊ¿^ÿר³1~Û×J|îï0ÎÁø®Fï#¸¯În‹}£Ï̶AUó_ŰrMóÿà»ìSû¬Þ¿£ŒólŸ—*4êdœgب«÷s^-ÿ Gç>«tß6 ÷×…Žç¡àð@ùn >ì¾…ï´s[èðÙË`0ÿ=uQá–'>6î2º°yNbÐQçF¶X}ÝÁfÇ30“>ý_«è4ÏmQ(ò}§  fÒ¤0ïœ&ͦ[> ̧1sÿk3ƒIs’ê¤Q5bö÷–ö$õÉ’>Z×ÂØŒb]$Ei| 9J‚”$)‰Òuó,I3Ò”*iUG³hÆÜ)0蘥LÊ•´kŒ:¿ã#kò±Äñ$fI“ ¥)ÈüæǾg£)hÒ8MUÏ4YïQç —iÈvÍœŸu—±!Iêü0˜¾©Ô9âH˜ç½ uN"{/Pç(Ò´´¶¥Î1@q7EÓ8ç÷nÎèÜÇ7ÎS"Z Òæ$Í“…  Ú|”rÄ ACÚœ4>³àm!(F^DK´9Hsšæ|3 YºBTú\`š;ÚóÐæÓ-mn A™mžˆhá› Ýú´9µEQk|ÓÁÒæÐ isÑBÚyü; y#* hs‚’6‡®}Ú¼P!(‘´BÐ$mÎcŽ=~!h’6w-1Úo•6g·ß6aץ͛(Ñæžiž¤ÍýBPž¯,mŽóisžÏÚ… ¤Íq¾ ²ÍË/½àžwÍ›!šÅ™æUŠhYtþæOCŸ/¶ÀÍky¯6¼n.…Ï¿¹Fã·o«ý¢ÏͶIUëó_¥°rMóGð=V©õ}Õ(ßOÆy¶ÏIu2Î3lÔ5ʹ¯·£ÂãQÆy†Ç¾oûïÀ¦Ž ç9ã|J çÃw9ã7MM`5þ;>÷÷`ü«©}r÷+ßš?œý€i·ÂeAYèŠø'‡{ÅÞ7ÏKŽl‰ç[#æùj»Þb†LÿºUÌs…æ"[XœØkâZ`6’ÖUQ¨‹lAùæ.±Èĵ€_rß{lŽwsƲG?fÙÊ嚇… …hs~~Ÿ… Í¢Í¹ðÑ‚˜ÒæG;Ú<ÑÂE Ñ’,µ´93ݽˆ–4ÚÜ‚Ò8ÇB c~Òhsgšs±†‹6–6‡iÎÅÑb AÓBÓ{_Œ¹åî‹ËÇÍ2º\SЀÀïõ¯p\Nº £s–÷{[n»ŒólŸï*4êdœgبkËóU£v…Ç£ŒóìÏUxïåîÙNÁïo\,–%혓qž3Îw¬Âƒj9ùOàó×k«#>{}Œ'›³Æ?õ‰Ùd›óÍó#[XgËBmQh‚:#[h ·_ïZ³Ý)÷›‰ŸüФ±Ó”ñSì¿«(TE¡ÖhÞ«ü¢Ð%`œ3Ó›F%ƒ¿»ÌQ0ηfDKH›Ç A'À4‡qË5/L›[ÓÛ‘3α8°ßŸQƒÁBP.,M£Í™kÐæÖ4ï“^š¤Í½“F›ç A§-¤Í±°’£ÍÑÂBP”ÍÚls/¢…Æy¡BPK›§‚r!ȧÍm!(is,q‰¦yZ¶¹+¥q/ý8*edRZ!èY^!(ÀÎg!(ÄüBÐ$m‚þÍ‚€qî AI›_ûêwa¶yœ6·¦y˜mî‚2ÛÜ‚2ÛÜ+e •¥ÍmDËÏ%›æçÜ9ÛF³D¦y)¹æ¶”e ù… ¶ 4¥t±µ®2ç˜^ε4íg¿ÅµíDŒÔ²—j_wñ¹ `\ŠñŸæ\c›ù»S«½úûÙ6¢êyþ+4ÎW¨çmÎúw—qžíóU…FŒóìu8efû˜©æöWx<Ê8oMbîÇVpÖ¿šz,ô·eœçŒóÅ›ùPZéƒ=éî6+Âgs»I¹ÿÜÛÏÌoMïó6 ®|yy‘-«ÃP©bó&Ìs54ÏWÞùf3øù/«fž;êœ&M¥É_üe“ÔdÖ9M(šQ4¥X¼G£ÊRçï$¨ó7sÔ9 /_,÷³Yç0ÄhŒÑ$c àe¤Î‘oÌœãˆ:GþqŒ:±ê¨ó3Iƒj%ÝJÃŽÔ9Í;fŸà¨ó»Ô9Ê {Oú ¤ÎçZ²–f!MC·$oi&2‚Ô9MÆdd‹£ÎiN’îõ©s™44™=Í8 –8Òðd>µOwQç/Yêœ&*©ó5˜uNê‘,’$uNj™7©óåuŽ,íuF®¡±{$âD,uþX™Ô9Èsæ3æÝu¨B£NÆyç¾ÂãQÆy礵îÛ*<eœ·Öú<Ð~Üæq‰ƒùáçcü¾-¶ŸûŒÓ0þ^â÷-˼è?áu³Ì†ƒóÌóÔÈÒ‡4SBs¥¨yæ;ó¼Ã†CÍ £gVÕšæ0Îc´9#Zòis[ŠâRkê÷¢iž(bZ|Ó<,-H›#Þ&/Û—Ôù-u>êÿXús2‡‡ƒ¥Á5yçÌ:'u>˜ÔùÌš>uŽXRç—;êFš£Î/"u³ÌG>ä*Í8f'ŸùÐuÊ•´kDÃÌ;áîO,{,¨sR².ëœF ÁÃa6! ÎIÚÆ¨s¸9ê|NDÓ„lÉ¢P–@’4^æi@yç¤ÎWwÔ9 %êyç¤ÎaÊúÔy§ãžNäûÔ9ÈóTêü!PÖZÒÚæ{3ç›Ñ%ûßg£Lò©ó©ÅMcšõîéE¡$ΙÁÞœÑéˆG ÓæŒh‰Å´ø¦9¾Mó‚´yÑ‚mÌE´$hsfÁsÄLó6'ÉoisF´Ä³Í—ýoisRõ4Í1Oœ/[Z€6LótÚ<­”¹ù|“!VJÚ¦¹O›ÛBPf›§ÐæA!h@›ïÑæöÓ"ZŽMs—mn AI›ãgšG´9ÞüH¥Íq¼¦‚öM‚âØg!è•^D s¾¡b³ÍÑ“ÀsMsžOx^Žs is¿”ç¡18ñmÒæ6¢%Qz›+ ³Í‹‚ž5ù-³ø¦ˆfYß'Í‹›æEsÍCÚ<ѲøºW›¾7Î(ÕoÎÏý€k`Œömq-Æçþ £ÆWÕ¾‡¿Íî9Úbÿê3³mŠ•;ÿ2γ§çÙ›sçÙžsçµ;ÿ2ÎkwnʽŸ*÷çeœ×¯q~q•`ŸÇßïV® ZêçñÙ«cÜ_åmŒ÷ÌœgŽî‹×úa’,°â[ªwîÌówºÙ |æó7ÏUª¢Ð’#[¢Pç,Ètƒ†r)Ãÿ¥`ôwØe ¤Í·¿c‚-ͧÍiš' A´9#g8?c³Íiš‡´9 ÂÂ-ÅH+ÅwÉ‚zÙæ¤Í}ÚpÑ"­Ô§ÍWÅÂÇjˆÝáBȈâ hó – &6Û (Œï‰Ñæˆ÷Ù”¹æIÚ<¯´9"Zr´yXz= AI›{-4Î ‚Ò8O+MÒæ6¢‹R~!h’6÷ A¹Ðå A¹Æ…0–ÿraÌÒæˆg"mÎ…3G›(D›{… IÚœ‹v1ÚÜF´´ù­Ÿühü&~ö“±´9 AI›+üùf×s± ”Î4/« ´H®y2¢¥ËN£Í˜G?jŽ^Éï~ŽkâóµÔµ¶œ¿ƒÏ]ãŒÿUñÚüE9ßI?›Ý˜¬Î½Œóìi^Æyöæ\Æy¶ç\ÆyíοŒóÚ›jßÊ8¯_ã¼W•\?Åß=´ÌUùÁ¼¨a1pò›f¹M†ä›ç¤uî"[ÊÈ;we¡Öб³ÈFCÍ1#gšÝÍ)Mþ®- EöïíÌ:‡ÙDR“¥z4¡hFÑ”¢9ÅHRž7…yç¤ÎI’%Qç0¾®5QçaÞ9cXHâ”q —1ëÔ9KI¦^4ís!©ó'Ô9¢ HŸá¨sæ‡YçŒ`3>R²¤Î7A#0:?¤Îß³¹Ï̦ÉÈ<è½FͱùÐŒ¼ É FaîeÖ9³¥Iý2kš™ÓÌžî ƒÓe÷@©#ã6XòȲGÆp0ŽƒfiDÃ@]×§Îa²Òl¥éʨL:êœQ ¤›I9Ó˜.LÃì="ARÕ4Ša—F—VJâœß¥ÓqüN•%{ƒ8·Æ9MsŒR A™­¾k m¾§Ë6/P£Íiš{Ùæ–4O+Åþ AÚ<ÑÂm$]o£i\D‹O›cÞ˜UoMs¼EÀ {ç>mn Aiœ÷}9ŒhIf›Ï²yù1Ú<Œh!mn#ZÂlsK›C—¤Íƒˆ– ÛÜ/ hsD´@㥂ö¹ã#cisKIÚœÇÛ©1Úü û6ˆ‹hI£Íiš' AyìÇ AmŽ7T|Ú|hsgšð Aiœóüãhó¨4A›ÛBPœËXÊs[Ú9sØ+ßš5ö¼5aš'rÍù6Psrͱ˜Úž~¿™:ã›JŒï–úé¸Fv¯ö b‘¨¸Õª¸°ý@[m—>7»Cõ4÷2γ§SçÙ›sçÙžsçµ;ÿ2Îkwnª}/'ã¼~óåZØ8ÿþÞå V[ti?|ü˜V|¼¨14øLˆÌófç3ºÅt.ïÜ™çí» 1[¯¹õÃÿ´˜y®¢P…–Dï #f6Én[XÚŒ±Äá0ÎmÓ< ÍÓ"Z’´9Mó»Ìb{M ŠM-iž¤ÍIÃXÒæÎ4? i´9 A¹èÐD!(s[ç,reDKÑBPG›Ã4OÒæ®4I›-¯ÚEf›ÛBÐAoXÚœ‹7;Á4gqí®Ì6‡i¾{Z!(³Í± ÄlóüBÐ Û¼7²ÍYzääm¼Mód!¨O›ÛBPçŒL:…½>mn A¯+u´9ÆRis”§‚ñhsF@1 j$sû´yZ!hD›Ã4ç  Ñæ§MxÃ,ÚíúÐ4m+MD´¸2а´ÝW'Ê@ çš/ÙåséÍ3[Êün‰¿3×ÌeÛâšÍÏÄgï„ñV ß‹\ÞVÛ£ÏÍîÃP=ͽŒóìéTÆyöæ\Æy¶ç\ÆyíοŒóÚ›jßËÉ8¯Sã<|hýº…XïÄßY±Úb+B¯õÄç·vùXI¦Å±ýž0í‘kÎØÃÙá“ç±¼ó&^Ò.ó40-Iý’þ%ÌÂÆ­-uþšÍ¤Þ¼ÿ,Cꜱ4D»!†#¢ÎA³’äñz¤Î‘{M"™d2 åÕA*¯Æ¼ó:§)Ë(ˆ:‡iKó–ô³5¬#‚ î%fÖ9ß<êå—$¬ó¨sÊÀXNË:§ Sšæ´Íï•_js¯4³l¿»Äá„´9MóÚœ&}ÚÜšæ{ ÍÑÂm+XšF›' A=Ú|é"´9ßH‚r.s… ÓƒˆÒæ˜ûm‚âÍ„ÍÓÍø´ùVi… Ž6‡“… m>ÇÙæa!(ió±qÚÜ‚"ÿ~!(šæì m~B"Û<­ô,¯”´9» .x2^š¤Íƒˆ–¿ÙBÐ0ÎyN` œ#Ø‹à²Í}ÚÜšæ8¿ðí?¢…ÙæmŽ.†À4ÿѾ)cis˜æ<—±ÃÁ§Í'}ú?³ãY™ö]®Ã`¨ÎÂïo]m‘1Ì—ÇçOiæ6”j.TüsƒîxÛ,¿ÙЄy…&"[H/ZCÆ™3¤‹–…±-4}Ùp˜9êú—Z,ºEE¡ïXó‘&$ÍHF`¨(4Y:% Îq^á?­qîG´¤Òæ('eA)‹JYXZ°ô^,¸lsgš' Aóhs’æa!h´¹-%mž(-J›(et£Í­iî²Í±èâ AI›3 ÈÒæ^DKD›§‚R³®”´9„òióÐ4Ÿô]LbœQmžWJÚż¤ÍÏôhós° eis˜æ1ÚÜ‹hIÒæÎ4O£Í¹Ø‚’6G ˆiš;Ú| bZÒhsgšsÁ/I›»hªë^úƬÖk|Ü4¯¤ ´‰\s.–röƒænDÁÔøµêC|¿ýÛðz¾>$ÆOÍÜOm¶ˆßVûNŸ›Ý‡°Jæ^Æyöô"ã<{s.ã<Ûs.ã¼vç_ÆyíÎM%÷TåüŽŒóú6ί¬ð•¤úqÿWŽXZêgñ¹í0úa0¦ÖÍûý&=û¹ÙêI9ó¼¥òÎ)`‹ìó¼ý×™îÇÜmÆÍý¾Ùôy)E¡ãBêœæ•Ë:§©E*”t¨£ÎI^÷ú¿êüÕuÚÔQç, di`¿0ëœÔ9K™uN‚•¦‰VštuóΧÎOFþ²£ÎIË’šeV3ã'h Ò ¤QÈx KOHPç s™Pçyάsgž3ƒÑŒÈ°Ôù€:ßÎQçˆÔpÔ93ª{ «Ú§Îi”Ò0e)$óÎÛA¹8uþ¼a$©sF„0c›Ô9)èu> Ô9ÈsG‰ØÂÈgʇ¥QçÈý&‘Rç4ÛÅšŒÁX²‰BPî_Ÿ6w-~!h’6 A]¶y®”´y¬zà ÌÃç Ž6Risè-0Íóisê4F›‡-©´9´Ï7/‚ˆ–À8g@œ6ÞÞà›<®Òhs‡.ÛÜF´6Çñza²Ç4m¾Yâ Aiœ;Óœ´9ßH‰Ñæoæ²Í#Ú{=Œ'*¼¶ÿ­ÜÏÓÏg÷&«s/ã<{š—qž½9—qží9—q^»ó/ã¼vç¦Ú÷…2ÎëÛ8߿̇Óñóƒ1©¶°Òþ>>w>ŒC0>)ó{׌qqâ•ÓÌ"kÂdIF¶8òœô"F<²±®”ŽYçaÞyTêÌsç¡yÞy»1æÊ'?ió\E¡* e\‹WE¶ÀȆ¡MãÜšõÍŒ‰E´ì„|óo³ê©-is’æMÐæŒ«±¥ q˜æ!mÎBP.:ØBP ô0Ím!( Y-mŽE‹$m¾ÊiA!(ãu³“Vº¾+ ó/É/å"K¬ÔÑæX”ñis[ÊlóÚ<ˆh™c~;ÐæAc‰þˆh9"4Ímn AQ¬Ût!h.Ûüæi… ,ùE´À8g!è•^D ókÓÂ'¿4¢ÍùDÚÜE´´y®”qQ\Àc|c¤|ÚÜ‚†Ùæ,=žøÉf»Ó´ ŒEMsÆbñ<[° 4ѾAĈ–0’kã=o1ãžú¤f®=e^3ÆÏ߈±D[\ëù™øì}0æ–ù½o«ï«ÏÍîƒP½Í½ŒóìiUÆyöæ\Æy¶ç\ÆyíοŒóÚ›jßÏÉ8¯oã|•2JÀÏ®QmA‰eÙŸÿlß·f ‹!S瘕7¿¾@Þ9LõJÌsÒ’Ž:'E chaD·>äED·üR±žVJ’“æs„iVÑ´b¾0s†@SËRç(ð#%ÊB?f=ê¨sR¥Ì2¦a6Æ3ŽIŸ’D¨óçæ™KŸùÖDÔ9VRç$Z-u³ÎQ猌`t Y\H:–”,iÙîþ$ Î‘Ù£ÎaöFL3žEÖ3 E—uÎX –)îçQç{JPç0-u΢F6’:g¤‹I 3nƒF()âî—ϲÖÌ:/L¿d³ÎI*Ó|]&ìêÌ:‡)Ks6 Î‘w~r@32ÄRç0u#ê<–w#8¢Î+“:yS¼)ê<0Îi6W>㜅 y¦y²4A›“Š·¥ )´9 AQðƒf‰C0Ò A› Í;Úû7YêÓæÌ¢_ sDÓ| Ì[@›¹õë—£Íù†AŒ6‡’… ÔK~!èëV_|»!VŠÌ}ÆõB”O›ï›RJmÓ8çÉBPK›‡… 7»Bõ6÷2γ§UçÙ›sçÙžsçµ;ÿ2Îkwnª}?'㼎óðuè' M™çËn{“¹ìÑšaž#²9ÁŒ= ÉÉÒ½‰ŸýPçÈ&ñQç0µhn‘e‘ ýµ0<¤ÎÁ0T)©sf3Ûx Èóˆ:GŒ ¶Ë™uNê<Ì;§w©sä'³|„+IWšwg!g™fž¥ÎQ\x*ÈØˆ:5{ÈsR´¤i™áÌ,gR¶4{#ã™Ôùa!u~Èø Ö"¢ÎwA‚7^ óœYç0/™A3“¦&ÍÍí½‘£ÎµÁ¬êˆ:G†5©óMûÍ´Ô9ã:\Ö9UÆyP^×RçÓ-¹£ÎA6Ǩs˜¸¤Î!B*štt.ïœñ)0‚i[êtu~ÖùC–È^ü`Ù$´D¡æ0Ÿa@/¶_u>5(ædA§3ÎY¨ÙŒ±Ä†qŽx–&isšæw!:Æy”kž¤ÍYŠÁmÁ6YÒü‡ÒisF´p¿4QêÓæiþ¬‡¢… Ž6Çœ2ÇÞ§Íiž¤ÍƒBPd›C74Îm!(ôDÚœúŠÑæÐphš;Úœ±Bi´95MÓ<6O+åñâÓæ|‹ÃÒæ8¾Îð AyìÙBPf›ã˜dÁEÓ‚^gš§ÒæxÃ$­”ç…X!(isœ?øöŠO›§‚F´¹W:nîÌV'ÝoÚwZ‚iãÜEaE-)¦y2ÐÍö½ÕÜúô§5sm©ÒuóAüÝ5«}cYd!½>ÿù"ÛÖfß­­ö‰>7»`•νŒóìiFÆyöæ\Æy¶ç\ÆyíοŒóÚ›Jï«Jý=çõoœ3³ÜØg¶é(ŒÅKAKÿ>{OŒ÷ªôà_sÆÆ°{ß1«öÑ´y¾Vhâ0:ÀÏmÞ… Xm/ýØF±`—1-i… \¨òis[Š%¿”Æ9K~/ÃâW®ôo6’‰‹d\,K-ÅÂZ2¢eT¢4F›{… “l!(hs,ð øëçfÅÇæLs›k)3ÖŠoé`¤yå¦ùBk\eŽºøqD³ÔGQu \WÙur-F[v†Ïÿ4±-ŒsùUKßèïe÷§Qç^Æyö4-ã<{s.ã<Ûs.ã¼vç_ÆyíÎMµïûdœ×¿q~¨÷ðùþ½KµES„&[Ÿÿh <Ø×œ9ÞÔ6ÝþâWf§£ï,hžç•…:ó<* -<'y¹Qï»Ì˜9ÿ*Ë8§ÑNóœ±>uN£Š¤'Kù˜wμá±Ì:©óÑïÔ9£¹À¼bf“*½ŽÔùkqêœ*5Æ90·ˆ:Gf2‰V’­Iêœyç¤Î%á¨óS¬sš€4I³øÐRçÈtŽQç“|ê<È;g©"ã.ö#uμs½4)£ÈP¿»‘:GtÆÎ05#êÑŒØØfàë–&ELS”Yç=HÃ0%mLuãK^1]<ëuŽxÆ|DÔ9r³™ŸÍmFƒÐ´¥yKú™Ñ!4uI³À²0us8Ie2ûdviÔy¼(ÔFµXr»òÁÏΧÍQ>º;F/DÂn/XzoÓ… yÙæ^!h´¹-ÕŸ,-J›‡-ÉBPÎs<¢e¦a!èæýgY}0¢…z¡n,mîE´D´yJ!(5é A©Õ 40Îs´ù\ûfsýÀ[Ô~mî›æ|kÃÒæx‹ƒ´9»\¶ù9Ž6‡i£Í½BPÒæ|s„½<žiž¤Í‡à<ÀóAŒ6Ç[*¤Íyþˆ Añ&Kmî‚ÞöÅϦÏÈf‘M®¯‚iŽ·ƒ§Å·ƒð–Pç͆™«'¿Yw×›¦®G%þ÷¯ñsÇaü_[Ü3àsĸã¿á÷}¦-¾‡>3»@õ:÷2γ§YçÙ›sçÙžsçµ;ÿ2Îkwnª}_'ã¼þóµñÐùÆ~ÕKÃ|Q|þõ?•øÀÞ°FÅ×>g:®30ÛRrY¨3Ï’²Pæ9Íó¥·m.yðƒ²Ìs…æ¨óÆ- …yÎ2MÛ$·md âZR#[›3›ÿ0ÍÖ8ßù6ÓÑæšO6‹î†BÐÝhœ;Ó7»Aõ8÷2γ§WçÙ›sçÙžsçµ;ÿ2Îkwnª}O'ã¼þó_áó÷ÕJÚßÇçþã$Œye<¤7¼Q1üþ÷ÌêÛܘç¶,£dó<ˆp1ÅÌsF·4àYd—ÿ\²ž‹lùÙ–ï1Ô9«uþ?3ÆVŒ:GÔ©ó‘!uNs, Î‘wRçƒÂ¬sk,uþ÷Têüb:g<Äy0L3¦‰XRç4ûhú1j‚F`Dß§ÎIÝ9ùCk(ö&uƒ‘±‡Œ¨sR»$x÷wÔùèuΘŒxQè[6‡šYç,tÜŽÔ9Èá­-uþZ@ƒ.¦aÚÝQçýrÔ9óÎëÁ2I–J’:gÉ$MÙ5u~æ fUŸ:‡™Qç £™ÇÝ鸿¦d#ïœtuuCùPçyÔyhž'³ÎE¡4Î!]é?™±ž3Î}ÓÆùÅhsijÀØg{.¢ÅË6w¤9·ï°À8Ls ÆÊØBSWŠ˜¿ô¾¥Íaš'ióUN{Þ¬ ú5ÌßàÜ$ A“´9óì“… ¤Íiš;Úœ:±´9tãÓæ¶YúÌÔßÍ+å›ÌÞw´95Ðæn©ád!èÈõ÷iócñößÂ(VšG›ãxK‚Úls6·-¤ÍAš_‰7H|ÚüÄ´ðx÷ Ay>p¦9;üBÐÑï5]zÙ㟘v £Y¬iîrÍËE´4Ï‚,Fb±S£Ý4Ìs¦ùBè¤8ö²'³ÍRê5—æõŠmq/ÁÏÄg·k«ÏÖçf÷!¨ç^Æyöô*ã<{s.ã<Ûs.ã¼vç_ÆyíÎMµïédœ×¹q^m¡Ì·Çƒî2ÌÓsqï˜þ•Ùí¸»=óÆMÌóö]‡™ »ÃŒ~ûŸe˜ç* ­ï¢Ðó<2ÎˉlAIèž(él)ãÜÒæ4Í1ÑRˆ6§qϱo m‚Òˆ·¥ y-MÓæŒºaѪ_š¤Í¹pÁØšæk„¦9cu¸ÈÁr×õ±è‘,e$O7,’$ A-mžWúº-ÝÁ£Íwµ´yPÚË+¥Ó A¹èCã<­”Æ9£ŠmΣrÁÉ‚bŠ Q.¢%F›G… _ÛBP.jYÚ¦9isÑÂE0.†¥Òæ^D ó,Ås¿” q\cc¡¸PGÚ|§?™Þ×MG4Ëp4/lš³H9=Ó¼iÓ|…×›Áw¾]ª‘œÅŸcl ãSl«{ }nvH4÷¥Í½ŒóÒöS#éIÆyöæ\Æy¶ç\ÆyíοŒóÚ›j_÷eœË8ÿåˆ Ô«`Ü+ü´"¹³‡½h]ïš<¯žyÞi«Ñ梿Ì-É<Ï/ ý9:÷Q@3x r‰™uN,Ió©óWÿi)TÒ¨–:G £ÎiÀшcü9t4ê˜uQçˆ`îrD#™¦Í?š€ÌkvÔù ¤Îa’¶¥Hêœfb@PçÔ92£YºÈòEÆbа$ñKê¼ÌL’À47wl©s˜ž1ê|`Ž:§YJÚ˜ÔùfÌ:‡¡J™ؤλ’:¿ðekÀ® #¶0uþ¼Í:_1¤Î)²lH3j„‘#–¢Fáå’G?ÐÕ¤ÎI[“ºîD—X;:÷"[HtÛȘÕû†Æ5ãRö sþ~3³Õƒ˜–Ú… Ö /T£Íññ·â¦yZ!hH›£”ûÅ/%­OÓœûÑ/]ñ” Wžó¤ÍWm¾FÚœo 0¯Þ/MÒæ.¢%¢Í¡¾À·¨¾µÀÌ|K›CW¤Íƒˆ–·­æÐæAþ¾-mî‚&is¿”º?ö.Ðæ8ŠÑæ4ÍÑBãÜ/å›¶Ç 3ÍYÊ>WJÚœ}Q!(ŽkK›ÏŠÓæ<ähóÀ4wÙæ7áüAÓf“ei©s–ø‘%1ÊœbKã9ÆHR¦ÃÞü—Í;gÖùµ¯~giT ©sÒªÌHލsÄ@j¨ói ÎA½²¤¹Ëç„yç$dÏ$uóï´>34IÓ¤IÈh KƒºedED#º7LÆÃ-u>×fDÓˆ$É{ ©sP½û!KÚQçiE¡Ì£¦éIb˜&(ÍPš¢4G·BÖ9‹ I“:î~ù¬’©s–O2O›¤3‰g’ÏÌÛ¨óç M^RçË9êæyD[òÔ9)kf{GÔùc¨óÒŠBoQãÜE´„ÙæÎ4O¥Í™kîg›§Ñæ! ßT!h˜mî‚ú´y`š§Óæy… ¤ÍñÆ€O›wc!h¿ ´»WJãœz .Rió¡mî‚´ùœˆ6ç–6‡6}Úœ9ý‡A¿,¥ž}Ú<^ú±-åÛ<6øvF²ô,¯”ǘ-%mŽcϧÍm!(³Í_˜gû b´9Hód!(;|ÚÜE´ŒÂy‚o©¤Ñæã>þÁ|Í f‘¯/Ÿ4w¦¹3Î ™æ6×ü*³Ò#Ì©sd€ÏªüÚ…ëØ/ã0–Ö½Qù7ÙÚgÚg-­ ¦M¿Ó»¥¿·þ^åÇ‚ŒóÊ÷]#è®B£®’ã¾Üß‘q^eƒºB£NÆyç¥ÂãQÆy礵Îó•eÞƒ=ØÛ#㼕‡å/É0o–é3mÎù’Y¬Ëà ¬ÎfžWÇ<_rËQæü{Þ-jž«(”æy…ŒlAÙæ)E¡ad #\,ÝÝŒÁ¿¿èn4Í1zÁ4ïU¬ôÞ¦ Aóhs¯´ ÚÜ‚bá!µ”Ùæ‰BPf›³Ä•e®ÉBPFïÄ#ZfÚˆĺˆÒæ¶”´¹ÑÑæ)… –6‡öÑÂEœ 40Î}Úœ‹?ŒJ‚Ò8·… X8òMs.,YÚ My… ¤Íaš3¢%F›{… ¤Ím!(¢•hœû… ]!(ƸHv]’6G!(Ô\D‹-EL‹O›_ÿÚßÍÆGLµ†y<ž„ù!ež(Í#ÍK4Í·ë}»™ü¼¢YZðúý/ü­ó1Ú¤Œ¼%n"õ7²m>5Êü—ùV®æ~^Æy+?s5A¯Qɼ—«y|ÆÌ >çÀr?G?_Þ¹¸B£®Òc¿œß“q^åóD¥FޱòޱröW…Ç£Œó*+åÌa¥?[éñXæuUÆy¥Ô¿‡ãå0&µà·ˆ?øýð‡foªºyNcjï~ÓÌí_þTÐ@¿ëÛÂE¡,ï‡,bŸ:'AJêœæsŒGÀ,îSç0ÓHvÔ9Ì6fÓ€#½ÊÌds4èH3‚ÄëE _™µLC1uR–ùÌuŽø G“°eDÍCG÷ ³ÎIç:êœÔn@¿ŸG³”Ñ…2>£×ˆÙ6‡šyÔ$…™OMêœyÕ4E#êf)#:"ê2idRÉ4Z7¾$—uάl²,\q 4j×úS‚:‡¡£ÎOzÖš¿4YtÉÂË\Þ¹O7¿(Ôç6Å,-6â?¿ø÷‡Æ¹3Íaœû-QLKJ!(Mýƒ Ðæ\ hŠ6g<†+e¶9©ýd!(³Ím!h˜mÎ9ȣ͙kÚœ9õ4Ím!(isäØs~{x´9ß:H¥Í½BÐ$mî"Z\¶9Ms¾‘J›Ã4'mD´|`3ü©ï8mŽˆ.¢%6gg@²”oxø´¹-%mŽc3G›Çmj!(Œs¾e·M\¶y!Ú|,ÞXá9äüûæše¶Ó2¦¹hI‰gÁbä"ë 4§ |FלæQæÅöß\ÜìÓ÷&úÌê=jßÖϾ­ð¡½3Œ?+㼆òEœ×ÏñYsi… åó•ü¼Œó*Ÿ'*5ꪡCýÍà42¨Ö=p²ùúßSÍs…¶mQ(#[H@¯ S—ùÛÉ¢Ð(²¥PQh,²¥’¢PÙ,ç<8iœ—÷ÿ/~ŒóÝiš‡-{¸BP?ÛÜ™æ~¶9MsŒd!(óÖYV™æ ÎMÃíeAª-Å#Zl!(\!h*mÓœûºP!¨O›¦y’6Ÿeis.–D… Ž6G!¨O›ÛBPÄýp†Ùæ®”Æy`š´ùþmD qq'Yš¤ÍYˆkisäÆ"ZH›ca)•6Gü‘£Í]!èEÓmîÑæ6¢…´9·­äÓæ¶ñKƒQÐæA´É8¯±|çå'tnÁüÿ©ŽùJÎ2Ϋ|®q^{ǾŒóÚ›“Ö:ßcî×o…s±ŒóÖšÐJ?À`|(üº†yrÿ^4z†Y¢ë±-aù¢Š2Ïsæù[Œ2ºkNAóüäߎ¬ó)Ì:ÿâ'3 yçÌ:'u>žÔùG?’£4ÃH3¿8Go†#ïÜe3ÂŤÎi¶1âÔj@#ïœÔ92”iÔEÔ9 <yiÔ9‰YRçg ëüô>·æà)aÖ9©sš‡¤Îi&’ÆísÇG–Î%¥KZ—Ô®O<ŽYçïÙx —40YÒÈø K#ƒšÔ9s©-uŽœjGoOê&)£9ÑÑùÖ4Q™uNÙRç “I)“V¦ˬìˆ:GcA"êyç«Ó®åŸÅü/1¯ÊǼŒó:æeœ×Þ±/ã¼öæ¤5ÏߘÿiU>Ë8oÍ -ç³ðÀÛãiæ­k˜ûû{Ì£™.»­ºy¾Ð†×›^=a¦ÀŸ:ÏĆŠB]dËlÃòFÂ$…mdK …2²…†mÅE¡Œ&)«(ô!K”Û8Æ¢ VÅ–rÂ0_ 1-‹Ñ8§m~¦ìßµÑæˆhYtOæ©… IÚ<-¢%I›ƒ4w´9‹Q-mŽ¢TŸ6G¤£ÍmD X¶ÊE.H°„ÕE´°œ•Æ9çÀe›wa!(cZ°Èá"Z¹c A±ÂX.ŽÄhóB… ¤ÍašS;\€q´9Kh]DK@›#¢‹7~!h’6÷ Aiœ3’ˆ…¸Åhs.0q¡)YÊlsG›û… \¼r… ¤Íc… Xðb!( }ÚÜ/1ûûmî AÏšú®Yz›› ›æ]ÂLóõ‡˜öv\kÚ¯Ç"/˜,-`šw\9ýÚçe˜·®ažÜßÃ5íTŒß”sÿ¡ŸÍöÇæ¿òùÇCÛN?TñáMÆy ™h2Î+?Vå< l‚ñÏ*ó2Îk蘗q^»Ç¼ŒóÚ›Ö8ßcþ;b¼ZÅs±ŒóÖ˜Èr>¸K`ŒÆøY¦yÛ™ænßOñ9àÌÌ‚kV£04GžÓ<_{ÿÛÌp˜,¾y+ y>9¤Î'~æSçÿ3c‘U̲¿ˆ:GÞ9³ÎIœ’:'JSQŒtHRç¤X“Ô9³•™u~±GÓà£Ñw.HÙsPjHêü¬‡Ô9[f;GÔ9¢+H3Ê‚&ãÑȃ>rò‡–:ïMêï¡aÖ9é^–uþn@( %9¼shž3ëœÔùv¤ÎQ¹µO£0’ÔywG÷ËQçÌÌÞÙÙ4hYBIÖÆ- \¹–:"[Bêü”us˜‘$ùYç0“Y˜y fÐÙŒ7±ƒQ'Œmn AI›Ã4OÒæ<†â´9"ZÐ+Àcަy*mŽ^—mn#Z`œó-’!ÉBPÒæ8þoxç{Û}À7QnÄ¿ïÕïi³ðÆA4KPš Í“¦¹5̯ óÒMóÕ·»Ñ ¿ÿ}™æmkšûûÿ-\Óv*ç^D?›íÍåó‡¶=0~¬ÒÛŒó2ÑdœW~œ4Ò9:ØãßU:æeœ×Ð1/ã¼vyçµ;7­u¾‡–Ę]¥s±Œó֚Ȧ>µ¿Å8ã2ÌÛÞ0OÎÁ%7Ï2KnÌè–«a¢‡Ã•à‘¸lØY‹o>Êœ9åí„y®¢Ðj…ÚÈç±È¿(”æ9s/²…Ä4M`æuÛÈ–æ…æ™çŽ:¿/È8§‘Ýœj=Ñ’J›ãsHº#Ýšô… AcÙæ¤Í™kžˆh ió¥™mžB›¦y:mžVÊE Ÿ6·… ¤Í±ÒÝ+¥qžZ ã<0ÍÚœ1?m¼ÁÀ ¨ÔÑæcã´9u)Äh!Ûú´y¼4‘mÓœñE6¢¥m~¾£ÍQÂëÓæ¶”ÙæˆNb„RŒ6GÄiskš£ð×e›û´y²tà‹ß˜õ¾f¹oš#–¥+£YÂx–¦LsKåÎwHó]¿ÛÜþâW2ÍkÇ4÷çâ~\ÛVkê~Dÿ]Ò@ó4€‡¶Uzx“q^C&šŒóæ'tž˜±;³J†M¹æ¹2Ϋ|žÀ<­d®Ióµ¶-2Îu>¦&ñ‹aLªäølâwdœ×ÂAÙÝ0æÈ0¯=ÃÜŸ“±lºî9®ÍsD"и²# @í@Yß®ç?f&þ£5Ћ…2ïœYçã> ©sæ‡Yç$MIœÆ¨ó7=ê…‚Œz`Á )Ö Y™wN£Ž™ÊÌV&õʬeRç4ö.„ÁQçe˜ÑQç!ë! [æ:Ÿæ3ëüR爲`¤…£Î™Í‚ÅÞ“>¨sdH3#¢Îa`îò|?KŽl‰¨säXǨsÇ.ëœQ,$uΈn ÎùAãœÔ9ÍsÒÍë[ê<ˆlqÔy[…Z3»9Dù¢ Aïµ±0ŒsÉ™æ‰BÐ<Úœ¤yXjó´9l¶y2¢¥mâßÑæ6¢óÂùám^¨”Æy~!h`œû´ùá6ÛÙüÐ+u›F›û… Ô¾¥Íhó3qlðÍ +|SžÿäW¶? YÊã΂â8äñ育›ÀÑæiþ-e—Ápf›ÏhsvðpÚä9f©­F—aš»h4Ošæka±Ð-† ‰‹vlÎö¢ óÚ4Ìýyù®k×`,\ ÷?úzÐiT àl~Œ«1~nÁ8çU6ÄÊÑ£Œs¿|½@¿Á¸£Zoœ”j Ë8¯òyBÆyíû2ÎkoNʹž¶ôÏB½0>mÁû/ç-=Iåü=<¸®‰ñ óÚ6Ìýù¹û•oÍ!ç>œ£Îi$ÏÙˆfÛŒ`f33¸K8\ ‰Ïó|Í}&šaøG,¢%¤ÍÑbis‚bø… 0Î]!h*mÓœÙæ4ÍÓ A×w…  ÍƒBÐ$mŽÌúd!(is˜æÛÂ4÷ióYŠ|‚2ÛÜ‚Ò8"Zmn#ZÞ±¹úŽ}ϾñpÈøàíÑBÚúLÒæÌì·Ùæx›Â§ÍO!mŽ·.Ris+Ž6w… IÚÜF´6i~%ŽCŸ6çÛ!–6ÇÛ".¢…Dz3Íi–³Û ÿ³_™µ˜šæ‰<ó‚ñ,•™æ{œôgsçK_Ë4¯/ÓÜͳϗiËû }¶t²¤<´ýc©fŒù³´¿j}[1ÿWÉ\–»]¡[®n~_îçèç[þ|Œ¹ûu%ñ~ghfŒóêç W2¯:ÆZþsûó±xsòÛræÁ >c¡r>C?[sq×Þ-17ÿ¯%þHVÿZÅøIzýèãžüÄl²Ï­å›ç–>u^¢yNbtdz1aŽÓ<¿ýëŸÍ…Zóœ%$‰[º(4ˆl)Vú¼-¹\!, %YM³˜¹Þ¥….Ù»„¢Pæ‹¡ ´YÆy^!(ÿ7Úˆ–0G=,]üàQXZ 4F›—VºüLóú5Í'°\7áq®yÔݰgó†]ó®y—¤i ~4 ã¼~æJÇ•æJšÒ€Œó0ÎCó|9<о*ó¼>Íó[§}jº01Ý<_ûšœ!UÔ<Z¬4tCý>ßöô‡Ì¸ÿc¦0ëÔ¹3ÏI'uþ¨sçÌ:'u>ú=d#ï< Î¿·%‚Œw ùv©s˜qÌ:§97Ô9Í:FD0*âJRç/$¨ó¿æSç4GÁDG3®‚Ô9sŸi.Òd$¡£ÎAðÔù‡Ö¤d#©óCCêœ0³§I3‹š†'ϽFͱF(ã7Hﲘ„ñÎCß´Äñ0ÎYÉÜëm¾n ${†æ9‹%ùQÓE¡$Îi|7w*=€Æù_`œ§Ñæ,/Å€±_´4Ì6çB \¶¹hq˜æé´yZ!èÈ5ïêÑæ¶”´9"Zº{-4ι’F›sá„ Am>;¤Íç„Ùæ0ÍmŽ}Ÿ6§îl¶9tÈlsŸ6‚æhóB… g% AmîE´Ð8·… Ì6ÇqÆã-F›ãxL‚^÷ú¿Œ£Í½ùu³øæ£bÑ, m8,,Fw‚‹géƳ8Óܽù‚òâ`A¯ˆiŽ·i–Øhˆ¹pô+2Ìë×0ÿ÷G7uC§ÿ®›~i@¤i 64 ã¼6æAǃæAZB2Î[È8Íó…ðpû°Ìóú4Ïï™9ÏuÉf¡µ=Js-˜æ4ÎË1Ïir) ¥y¾ÊîãÍÀg¿PQ(ŒsÆp,f,Ë iž:óœ$2‰dKÓ<©sšç4cÒ­_ Â"Ê ûÎ0]aà’~&ÍìmfpÓèe&7K-7ÂØÆÔ9òÎa³ 3¢ÎQ’Ùé8Pçy^*uþbS ˆsšÞÍ4Þm®ù½aÉ(³ÍiãÜh‰bZ|Ó<,=Ò‚>™(}Ú,ÃBPçÜöÔBPf›cŸ1ÛÜE´0Ûœ9òŽ6ßû›ûûŸ¥ Ž6"ZmŽùÚ¼ÿ,ûÖ@8—\±´9H¸PÂ9çÜ*åbK~!h`œû´¹-%mŽâZ.ê°È6™mîG´Ð8/XJÚ¤¹Ñ’,%mn A_È/åB–£ÍƒBЀ6<óf»³M¡Ì}Ó<<ÄLó”<ó&Ló.»57=ú‘Lóú5Íÿ‰{ŠZâ†OCÒ€4 HÒ@ëh@ÆyëìgéYûYZC2Î[Ð8Íó_ã!÷&™çõižsÞ®žü–éÜcx.â Õ<¢[Úƒø´Ñ-.ó¼Hihû®È;MjÌ󎛎0ÇÞ8ËLN¥Îÿg©ó›çþQçÌ;'uÎAG“\%ÁJSŽùÉ1êQ1êæéXR²ƒ:gF3³Î/xòkk Ò d,©ó³FÖ9Ê#ê14#êùÐ̉>–Yç ÎiNÒ¤$uÞ›Ô9ÌKŸ:§¹PçïÔùèuÞE¡$ΙO^h8C½ØÏð¿EÆyJ!h!Úœ2MÑæ\ÀX¦9iskš£$5YÊÅ[ ãmn A™mŽ7ø‚+e¤O`šÙæŒüá" #€ ‚&is.ð°Ôöø"… Ì6§iÎE#çç ¾(6碓Ë6·-¤ÍÑr% y¯BD z²ÔÑæXÐ hó™#GÍ2‹õ¸¡üh–(Ï<Å4 s¼šæKmr¹äæ™™?×ù5x&¾ÿ2m}“¨Ï׃Š4 HÒ€4P¾dœ—¿Ï¤3í3i@¨U È8¯’qÒçÀƒïuþðžYó…Ñ-Ç\þ”Yxœ!•gž7YêèÎ<š#ÏCú|Å]Ç™+žú æùf§AÖù¸wNêüä‡Yç–:'A¿™£Î¯}õ;3yç4ílÖ9L<šyÌ^f”éXFK\êSçÈlŽQç0 u~&©sŠ,M$™KꜤ.‰Ýu~W‚:é˨ KOxßü$0 NK#“z˜žÌ¨&=LCt¯QA†µÙBò¸ž‹Bq¾èžw5oÐxŒsF´`x… Œ„)X C¿ÜBPç¹BÐç̪Ž6‡iž£ÍAš³´m^¨”ÆyZ!(K`Yëhs[JÚñ=Ì¿w… Ôɾhsê‹: Am¼‘Œh9ánÐæ^!(5m AI›CëÎ4OÒæ|3ã"/Û¼`!(޵¼BP“güÍluÚCMD³0ÓœYæ•ä™çÎQ]÷gÆ>ñqfÏÛ r½}ÛѾVoõ½ôP# HÒ€4 ×€Œs#:F¤i q4 㼊Æyhžo…à¿5ÈÃ|&͘Aw¼mVØbDŽ>w„g)¹çeD·t@tË‘ÃgXã<ÛE¡o- ݺ̢Ð.Ž:G&·£ÎIO3³›1$4ˆI3ïœYçu›Dv'”gægƒàfnx’:?, ¿Iœ/ºŒóæŒ=aœ§Òæi… IÚ4ü‘¤ÍsÍûL3K…… Ü¦´BЈ6Ç>!mn#ZRhóõAñs¿ZÚÜ+¥qn A™mž(e¶yZ!(³Í-mÓœ´yÑòvXêhó X–Q?¤ÍýBPç¶”Æy¢”Æù±XØa¬züls–ÞºlsÑâ‚&isFåÑæ(%m+%mŽ¢^.`q!ë¼?6+÷ºµiÊ<Ï4/5Ï<0ÍÛ£›ásV4Kýf™»ëë¸_øµn´çF[s©¹”¤i {qž½9×q®9—W2Ϋlœ‡æùšxž+ó¼~sÏ'=û¹Ùê°)M䞎çžÛèçyæyñè–ÇßgF½ýÿI‚:Ÿû_3ú½ÿRç£Þù‰¼óoÿÛ ëßf¨sæ'3‚fÝ`Rç0ïQ爒 uÎh K#ŸÙe“¦e†óùÈ:?Yç ÎIÝ’Àe|…¥Î@´OƒÜ%Ák³ÎaN2GÚe3_š&&ÍÌCajÒÜd# ÏuŽÈu>':¯ç¢ÐÀ8¿³yÄz`œ»BP”‚äE´òY"¯ôQ˜ùåÓæ\0ÈÑæÁbBj!(is˜æ~DK²”Ùæ¶”ÆyTšË6·… (}õ Aù†¥Íaš“6çŽ6߇´9Lód¶¹_Ðæ(µÆyz!è xK‚ý.ÛœZ¶´9´íÓæÌù?úçqpþ“_Ù[ ãÜE´ðøáÛ¶ÔçADK’6?ìúWÌ¢ÝGÆLsÆ5±M$Ì”y…yæKo:Ì\6îÕL.l6Ðuõl˹ºánÜnÍ­æV¤ìh@ÆyvæZǵæZh| È8oã<4Ï—ÄCñ‹ ôŸI“æ„þO›EÖC¶¹ÍéY ÷<( ‰QWjsÏK‹nY~§±æ’G>±‘-· ²¥î‹B¥qÈøDd‹WÊ(¥QQ( T©±Èdo‡\læc“\&ÁÌÜlš³ÌѦYKÓ¶[¿WlÎ63·iên€¼ó.Ì;gÖ9¨s[2ë<¢ÎAUÔùóu~J@³,“ùß$³—ΣΟ rÃuN³ºwPÊÉœqkœ÷º#eÀLï•6R~Æy`š‡-Â4/TË6'mÎ\s6'iÒæÜ–4ÚœÛNòž… IÚ|ísò A¹_}ÚÜ‚’6Ç<ø´yO‚ Íƒˆ–€6ß-¢Íì5jN˜mÓœ´9HsFýø´¹-%mŽˆ–$m/ÍÑæŒJ+õiskšc‰Fz-4ÎY°k³ÍA›¦¹—mŽˆ$.X]õâ<³ùÿR8šÅæiÑ,Qžy°g#¡üPžwÂ<óMö¹ÕŒ{ê“Lžèzú_lËAºénü›nͱæX¤lh@Æy6æYdzæYȆdœ·’qšç àáøžzØÏ¤YsíÔ9f¥­nÈnqæV±ÜóR£[PºH·æÐ!Ó­q~ËG?˜±Ì:u~S˜wNêüRç³Aƒ<¨ó×Aƒ<¨ó0ïœYç4ù-AÓæ©sš}QxHª–t-)ÛuŽ¢DR猳°Ô9(]—uN‚—$ïñ ÎY¾H³²ÏíA¾´OÓÜ ¨ó÷#꜑¤ˆ™]dæy¯³m\TªŒñ`œ e–IÖCQ¨5Îw‡Þœ˜—mNÓm^¨”zH+¥qîÓæ6¢…´9Þr îøÖC2ÛÜh¡v]DKPšË6·´9Lóóœiîhs¯”´¹-%mî™æŽ6?ûÏšwßt4‹Ë2O¡ÌÛ¯çLóÐ0÷Ms.ØÙh–kÌagd‹…‹C»õ¹Ç ýŸ P˜ç®(4Šl)±(”æ9Ë$}êœ$3©s–Onn©óY6_;IwQç/Yêœ5©sfx3–„”5cÈŒ-¡¡Lꜳ¥Îa8ç²ÎAp÷ucÚ’ÝÌ·Ôùc–:g‰ç¢»ßÞ¼¨—X!¨¥ÍYŠ‘0Íù™üì\!h‚6?öiûݹ ÜkšcÛHÖ“°÷isæ¾Ûlsì’ùi´9÷§‹hÙø’WŒ¥Í±ßI›ÛˆÌ…-%mÓœo-¯›íiœ{… mŽˆf›' A哌h¡~¸cis˜æ¤Íƒˆ–À8çÂMœ6G!(w\DKmÎ2Üd!(£‹b… Ž6‡iž£ÍÑâ‚tíK¦ã¦ˆfÁÂ×B,þÅ(Í⢜"ÊüÚe¾naÓ|Ùî×›+'¾žÉsoƒ];ßÃö¬®îlÜpkž5ÏÒ€4 dG2γ3×:®5×Ò@ãk@Æy+çî ÂÃòi?7˜ 9#çäϘëƒmáèšmÎx£ ·Ü7› þò¡l‰QçÈ;¨óï-u~=òΙu~¨sæ“:Ĭó:§ÉÇm~ù3ߘM»¯iÊ<-šÅE:E”¹Í#Í5ÐlvÀ$sëÓŸfî\Û€×Êç±MKèF»ño´5Çšci@²§çÙ›sçšsi q5 㼌ó>ßÎß7 !)Sgè½ïšU·½±°y^Vt‹_:Ô3χ™E6nø¼5Î9j±(”æy±¢Ð\dKiE¡4Ïi¬¶TQèÌ:¿à%³ÞyŽ:òÎi“²¶Ô9¢Jêyç¤ÎAeûÔy§ãzÛÒyÔ9Èsß$Î;î:¥Yƒéü;Î4hó… 1Ú<=¢%6Ï‚>D´6ǾÈÑæÓͺ,ÅþbF<³â}ÚÜ™æ±BPG›È/å>mn AI›£Ô§Ím!hÚœ¦ù¡ÈÌ AmÄ%#Z#t¢WJÚÜ‚bñÇ/MÒæA!è×¶”Æ9#R A±uúÔ÷Íò;ßR:e^¬42óÌZçsäÅ+šeVý–L{×ú»ðïóëæºqo®5·š[i@²­çÙžÿši ±4 ã¼ óÐ<ï†è¯dž×·2å…/ÍŽ}¦63º%½84IŸotÄT3ä•¿GYç7†ÔùH:f©óÔù« êüåuΜæË@вðYç4 iÒ8d1"³žIá2û™T.é\Žu#’™Ñu—¤/‰_š˜Ì›¦¡Iêœ&'ÍNšž^jó]&ÇÇ®øÿ‹ÄÏ3= ÍÑò@"¢%I›³Ã/í“+íT ”‹… A¹ ÀHªZÓ \xð AiœÛBPÒæ^DKD›#¢…´yÑ㜑;–6‡iÎEÑã<(‚´9 AA›û… IÚÜE´¸ls.ÜPƒ'¡Í™×ois/¢%I›;ÓœÇsWJÚÜ‚î;àyÓ]¹·CÍÆ.•TêE³ø ®t8Ì3ï¼ùp3`ò›™Zlàkâ`lÛ¯t3ÝX7ÓšOͧ4 HÒ€¯ç҃ΠҀ4Ð8qÞÆÆyhž¯„é·Ø(ÈŒásúµÏ›Ž]*ŒnÉ+-LŸ/³ísÎ=ï×DQ¨ÙRYQhÙâŠBc‘-%…²t’9Ú=A8»¬sæl3o›¦.ó·™ÃÍhÒÒu3˜4õÚç„Ô92½I“º&uNCÙQçÌg¼ K5Y®Y˜:G¶ø[Ã;Ï8OéMüÿÖ8÷#ZRi󰟹d‘BÐ$m‚ºló"… ¤Í±ŸHé[ÓÜË6O¥ÍûÏ #Zòis¿tgF´6‡iNÚœ¦9‹am!(is˜æÉls¿4 ÍQŠ™B… Ô"t\¶ù©Ž6‡iîÓæ¶1-\$b1n@› HÎ4OÒæ?õ•Ùøè{†yŠi^R¨Íâ ó2g4Ëæßf&üõ³ÌœCø:Èh¶“uÝ87КKÍ¥4 HÒ@! È8—6t~¤ÆÑ€Œó0ÎCó¼#ª§5°iãçúûÞ3«o?ºÄè–BÅ¡MÓç ot½Ù÷Êg̨wþc,uþÎ÷†Ôùˆ0ë|Ø›9êüÚW¿3ƒw~ ²ÎÎø‡êü*ÄL0ë<¢ÎŸ›g.õ©sDUĨs˜‹Ž:?“Ô9 HÆ^0þ‚Ô9 Jf“ôµÔ9ÈßuŽòFšuÞØE¡–8ßù¶f æ¢§ÓæÈ5e›;Óûßfø[ÿ6¤Î‡"ï|ÈëßRçƒIÏü§ò<¢Î§Ô9ÍAFR0ÏÙe³ ‘.i\R¹ç€:g‘"sfD[ê†$c0"ê”ï wb²\Ú2Æ9ˆs[Š‘0Í—8üQ[BÊX˜ ¢%A›³¼”´9Lsšü,7í ãœæ?|ÚÜ‚’6Ç¢]d›§‚r‚ \ mΊÍ]!(is,`6·¦95¸¸á‚´9"Z˜mîE´ìˆ–} ‚2ßÒæ0ÍI›3¢Åe›÷É£ÍQ ÚÜ™æIÚœÚå›ÉBPêm²?4Íc´9æ‚oXÓÜ/e¶9"Z8ù… ù´ùÁãH›¿o’… G$hs–Ñ2èø"… mÜÒ8ç"PmÎE#¿ôø ³Í2Û±Çßô(ZþÙ Ê|‘õ™ú?‰sbF®kOb;;èf·6nv5ši@¤æhFøž§–1ÅÏš2ÇØæ|Gý®4. HÒ@u4 ã¼Fó>ß Þÿ̈ÉÐІÑ/}mzýñÏ9ó¼ú¼Äø–ušb®zö+Pçyî¨óëH¿§Î¯FÞ9³Îû“:G~óå/̳yΤÎiö…‰È¢DFX°81FÃ|¤ÉÈK3ï<Ì:g¶t–‹BIœwØab³FÇ]hœ#ž%/¢%I›#æè'¦y:mž+}ÎFÑXÚÑ4>mÎÂÔõH›#ʆ M‚:Úå¬qÚ‹¡id›‡… ¤Í±âÓæ¶´mNÓüÐ mÞ;¢Í?´1-Œbcø†5w¢WJÚœ9üŒò A“´yÑòµ-¥qNý÷{vžÙí’§ÍÂ_šæáb­ìÀV^ù'c–·F/¹(¦‘W¾ {Ë$¥t¥­n0×NÓÐçÀŒ]ÇnÅöþV7®Õ¹qÕ~Õ~•¤i@hm À°L¼\Óœ?/㼆½™ÖÖœ>Oç9i v4 ã¼ÆOÎxø^㓌™ k ;â%³Ø†C*¤ÏÃüsR­v8ú<Ÿ@_ªçæä‰o·xQ(#[Hé’ÖM+ E¶Ø¢ÐOŠ…2¯º%‹BBêœå”$ I3F¤ûå³ÌfaÖyaêü%QÂbLf“Âf„ ‹3™PçÈ;µMêœñ'ŒAaJD“öõMâ¼ÃöòÇøßÒFÊÏvÜe²gš?œRŠ˜?¢¥>Û§ÍñÝÒhs涯Óm~ A¡_‚ò-Ѝ´9Mó£oyÓtÚæ¦æÇ²4A™wX°9éêgò—Ñk£ÕŽÒÍp}Þ kÞ4oÒ€4 HÅ4ÐJÆùåÒ¡t( HÒ@íi@Æyç¡y¾Êʨ!Ñpæ£[ö>å~ÏgÎ|TŠù"ZÞ4A!¨£ÍƒÌzÎgT ãœó}@hš;ÚÜ‚B,¥V ‚æhsj/Yš¤Í9Ä·'XzaÑÒ÷é¯ÍŽ<‰§ëKÌ1/!–…DZ;®ÏdK‚šU¶¾Á ½ç†;¯eøúôlûºÉ­½›\͉æD¤i %4ÐJÆùÚ-ñ]õ7¤yi@ZV2ÎëÄ8Íó_ãá|t†Í‰†3š.5Ã,±‘ÝR0ûÜ7ÐsÊ6O92Ï Ç·,¾ù æøqo˜a* 5›6Ù2ÝšÈ4ÎÙ ph2|å(²¥xQ¨%ηŒíÊáïuÜé¶œq~¸Ë5m~dтҴls[ 㜅 Ó A™mŽíávqû¸\(`Ajmž_:Ó‚nîÑæ[c‘b›(¥qî‚Ò8çâF²4¢ÍGç‚´yPÊ.¬XÚ<­4Ì6÷#Zhœ»ˆ– ôó\!(is˜æ¤Í/x¦¹Í6ÿÆœù—ÍÚÜ^‘aÞd, óÐ0ç?w<ú.3åù/î\–áëÒÇØöõtsÚ²7§ÚŸÚŸÒ€4 Hµ¤V0Ο©¥íÕwÑñ' HÒ@N2ÎëÈ8wÂÅCúù¿dبh(Óé¦G>4ëï>¶iúœôjIôya}‡?=jÏú‡l)VšÙR¬(”‘-ÅŠBil’:g‰#Ë™M£ÎAç¨ó÷m¾õc߳і:‘ÌIRÊ4]Y,Iêœ3ifRÍuãvÛA¯[#×Rç(­d7³Î{:1mÍsK¿b‰jæxGÔ9¢Jh"GÔ¹3Ï™unÍóç,yÎø“åIà&ÝMÃÚQç–8ßv\³FÇ'E¹æ¹˜–´9Iw æ­“6' Ïv~¿¢ˆ– ÛÜ‚Â8÷ A“´¹_Ê}Ô­²Í±Ï¸ï¸¹/™oisìcÒæÖ4Ç~ßžÆùG›ó³ A™mîE´D´9æ—´¹‹h‰hó°”´9#ZÒhs[Š}êËE´$ió³þÂæñ' AI›ó-ŠÞ7¾n–D'@û(ÃÜ/þd(Ér7¼E«õGÇcáòÏœiÞqýAæ´ÁÏ5Ô¹K× y¯`,£›J=XHÒ€4 H­*çoâï/! 5¶†4¿š_i ~5 ã¼ó>?ì?ȸ˜×FÔÔߘýÏxÀ,¸æÕéÙç¤VËŽoI7ÐWß{¢éûØg6ëüÚW¿3ƒfýÓ\óÊ?Ì@f¿üwsòÎiœ_ñÂßÌe.²q-Ì:gd £-Hëª(´pQ¨5ηqÞŒÑq§œq¾doæš{´ùѤ͟Bi¢”´9LsšùÖ4·ÙæÑÏ‚SF´6g£ÍÓ<Ÿ6"ZfØXç¶%«¤ÍišG… ¤Íašs±Âšæˆh±… hs¿” "ûGÙæ… ASis˜æÇ) hs‚Â8w¦¹O›_ê|Û?=nÚoèJ?K5̯M7Ì Ä²2_}»Íõ÷½×ç*]s¢kÎØíu\¿7Àš;Í4 HÒ@©¨¢q>»S©ßC?'ÍJÒ€4Ðúq^§Æyhž÷ăû<ažs/3Ó,µñuqú¼¤ø–Á¦ýz! ëâ[ŠD¸,Ö}¤9zôkÍ* ¥yÎÈ‹–* íMê±̵fTÉcÆv:§¹j©sD{8êœ9Ù,š$ÍPçoÙLm·4pI?ÓÐeŒHOdp[êñ"$¦»;ꆰ£Î™çÍ\ï.Ì:©ó‘-!uš;Fƒöqç‹l}K³F‡aœÛˆÓâhóÒ Aù½ò AI›Ã4÷isfº3Ûï]J)u´9Hþd!èö¡id›#¢ÅÑæ˜'Ÿ6çÛÌ®çÛIÚ<ˆhA¶¹hq´y‹Ï7øÆß\°´9Hó½BPÒæ§!cÿôâ… 4Îm!(³Í‘ÑÚ=š5ö½Í´ßÀ™æ Ë7 ]æeÎ(¤eîÞø°ÿt Y¾ažˆeáBØ.ÇÝmnñ+™æ8¿5еêl˯uÓÚú7­ÚçÚçÒ€4 Hm¡*çâï.ÝÛ£ÏÔq$ HÒ@éq^ÇÆyhž¯ø÷Èh$s¥¢m¹ùñM×=Æ%èóå¡^| ͼÈ<§‰^‚¾Í™ Ì“:ŸùO3äyDOu®¢ÐŠŠB—°ÆùØf;N sÒæ4ÍÃlsÐæKõ‰Óæ… AI›3Z†-ÉBPf›;Ú|},pÁ€ Œ­q… ¤ÍY¦jis/¢%¢ÍS A-m‚2ÛÜF´À8 AgÇ AÇ  #\ q-4Îm!(s/¢åh”ÊÒ8?ö.ç6¢%WʘÑrÚŸ™3mîE´6ç[‡ Ÿeß|Thš—f˜ÇrÌYØëLs¿Ð×+ÿ¤a¾h—Á次/VtÐù¼fMvF¤£›ÌÒo2µ¯´¯¤i@A-lœŽ¿w`#ìmƒŽoi@È‚dœ×¹qšçKàaþE™-5k¶”mž1ºå ?=dÚ¯…è–Râ[ša ¯ÒëVsþC›A0ÎÙruÙÒz"²åÙoÍ¥~d 2¢#ê¦ä9 z™%ÍhŒ3PÈHê—ô/ M6þd0³¨ixÒø<6Ì:§!Jš˜9Ö,´Ô9ˆãu>–Ô9òÎ-uþŽ5_™uN3–¦ìn0gI7GÔ92¶cÔ9 ^G3f„q#¤Îi3†„1ÍbRçÌ÷&yM3y]Ø>uΈ“bE¡ÌgÆø=`Ù Æy3óXDË‘O˜% ‚2ÛÜ‚†ÙæAD˳6¢……¦,6M-%mŽí$mÎŒw?ÛÜE´0ÛœûÊf›{… IÚÜE´D´9LsÎ ß à‡ÿó£‡Ü¸gÊÂͽ¶Q±Ò€4 ´¬ZÀ8ÿãŒ30Öü´ìühjJÒ@55 ã¼Añ@¿ÆÝ2^jÚx)ÛHëwË«fénCóés?¾ÅÏ?¯Ð@_tÓáæðá¯DÔ9Ísf÷u®¢Ðò‹B—$qÞóæf;Ló… Ç ßœ… ˆ†¡YÏló¨Æy`šçÓæ$Í×>ÇÑæ0ÍI›Ã4'mÎ…G›³<ÕÒæ0Í}ÚÜ‚"ú†… ŒÂ‰ AÓ˜æo†… Ž68±‚2Û¦ùXñisÆôXÚ->mÞ‹+4ÍÓhs.Ê$ Am¶¹G›Ÿtç\³êž¼8–d$K†yJ, Mó^¼×Ü1]Ñ, v-úÛ³E5oÆô·u³/ HÒ€4 Ô®`vwÀXªÂ±~o>ÍoíίæFs# HÅ4 ã¼AŒó<ÿî‡4˜aQ¶ÙÜhÛË“Ÿ˜ö˜ç1úñ-%䟗á²åI1ý_œ/ ed‹_ òÔ9(cÆt •±$‘i®’L¦ÙJRÙQçŒþˆQç œw ³ÎÂÌíí½a¶eÖ9Œ^¾4~Ion©óYMRçÌÿ&uN³™…š¤ÎWGÁ&£OX¸Iƒš‘(¤¼i\“ú^ò`ç[ŽÉRMtïw:nãÜ/-@›/ãhs|vç´BÐÚ¼P!(óüBPÐæØW>mÎÜøm… Ûy… 4ιÿÑBÚÜE´D´92ê“… œ[¾]d›‡-¤Í¡Ÿ6ç .Ûœo.Ähs¼ÙàhsêΧ͸n†a¦_^=Ã|±®×šs†OÏüùªÑο؞÷0VÓÍ´n¦¥i@¤i@¤i@Èždœ7qî`<䟊ñs™5¥î~å[sèùˆ™X fyšîg-û¥…Ìcf‘a8JÉ@_i×qæO÷}D¶Xê<ˆl¹ü…yæ²çæ™Kaœ_F¶\4ís¡Ù‚H çQd ŒsF¶œF¶Ð8w‘-Ç3²%4Ι]MóüÈÉ.²¥¾‹B—J羉^â¿ÆyÚ¤¹¥Íaš“6w-,]!Šh hóÕX £ß/¥qn ACÚÜhaY*ãkb-®”´9Ls.Bp1ÂÒæXœØÑ8.¢…E­,lµÙæ^DKD›§‚Ò8w… ¤ÍÑrdhœû´¹-Å¢ sÑ’¤Íi~ ôÍO~°°Y^n$‹%Ì9¸`ŽðX\{§1fÔƒs3{~jàkÍóضÅusœ½›c͹æ\¤i@¤i@¨ç hœ‡ôù^xàÿ¾ LšTWLxÑ-Ãræy’@o!½ã&×›C†¼…2²¥XQ(ÍóóŸüʜǬóÐÝ0ê„&tDÜf$JDü¶Æù75ktÜþÖX!è’GÇ A;1¢…´9÷å@›[ÓÜf›?g)xÒð¤â™mNJž´¼_Êm²… a¶yÑ2Ãîç¶D>É|úQ!(is˜æ¤Í™#ï²Í¹¿Óhs¿4I›*M¥Í¡.¶ø´ù)x‹‹29Ú<ÈØ?~ò{fåÝo…iŽŽõÝKsYžkGnQiA¿ôÓÏ0/b˜sk¯Sî3w¾ôu&ÏG ~}¹Û7¿n–u³, HÒ€4 HÒ€4 HÒ@v5 ã¼AóÐ<ßþ_6¸¹‘9Ãjü´OM·}o5íÖ£[ªH w?îÏæ²g¿‰¨ó(²EE¡ÖŒ.TJã|áÍojÖè°óâ… IÚ<¯”´9¾§O›sÀÒæ0Í™mÞd!(ŒóÀ4OÒæ(`Å¢'¢BPG›£Ô§Í÷a!(:³Ã¸WJã<ˆhA¶¹-u´y°ˆÂ7’… ŒúñisÐò­WºÏ5Ó 3ûó óÈ,oÃ|qD³\0êåÌ2r=„íü•n޳{s¬¹×ÜKÒ€4 HÒ€4 HÒ€ˆó6ͽؖ•`¼³#3&Ö=3¿5½/z Ñ-WÇ t?F‚ÿ^ˆ@o²D”dn@é®°ÓÍæô©ïŒléû×oŒ‹lIRçŒl!u~†ÙfG‘- ‰ýÈG3®ƒ±>uN£õÀ±ï™`¾î–3MÙˆ:G4©óÝuŽ¢JG“Ž&%ÍlnÆôDÞ9 aÕ=@w'uÊš¥˜Œ+±Ôyßu~^Ž:'ÁMSšQ(ŒD!uNÒ›Ôw§ChœnÖè°Ýx³äQ0Î~Ò,Õ'N›û… IÚ<­4I›ÛˆÒæ ê¹®”´¹-%mŽ}âÓæ… A¹ó Aß AgÇ AÇä‚Ò8·… 4νˆF÷Ð8O+¥qî"ZH›S_§!GÓãﯺaΫõv½ÙŒ~äÃÌœo2tý`ÄÙIºAÖ ²4 HÒ€4 HÒ€4 HÒ€Œó ç!yÞfÀS2?2ch]5é ³ìfÃ`ž(ßR–>8Œ°£,˜ ó¼ÃFÃÌþ_0Wª(´¤¢Ð¥iœ÷¸±Y#0ΟÌçÇL³¹æŽ ²Í—õ²Íƒˆ–g­q¿2#ZR A3cis˜æ¤Í]D Aiœ»ˆ–X¶yG›£XÕ‚Úló\DKD›*%mŽÒæ\ðp´9K_]!h@›£ƹ_š¤Íc… 0Ê]DËÑæ˜w¾%\ìIƱ\Ëù¯4’…†9³}Oÿ‹¹ëåo2sŽÉÐuãߨÖ^º9Öͱ4 HÒ€4 HÒ€4 HÒ€Ó€¢Z²cžÿ¦ÀÄ ™ ™1¶n}ú3ÓýÀ‰ÖÔkžž+eösZ‘è&GÝc.~ꫨ(´_E¡ç”YzlÙE¡ïÔùèu¾©sD…° rWf}ËF‰0‹›Ô9 -™Ñ½µOà ŽQçÈøvÔ9e’Ù$´Ij¯ êœåšÌ ¨säˆÓ¬¦iMóÚçÝaœ7ctØƹ£Íiš‡Æ¹O›wö²ÍÓ<(e¶¹-Ïï¹ö9/Úï¼®WÊmr¦¹-u´9È{Ÿ6ïÉBPÐù,å~³… a¶y`š#ÛÜF´¼‚"kž™ó| *Å1¢å€±ïÚ¬z—m~¨£ÍñfO›û… ÇÙBÐ\¶9sòýBÐ=ú¿`:n|=LóbùåÌ2‡¾ýâ\ÿmŒ¥ŸÌ0w†ù’ 1}oz%3界]+¾Àön¤›cÝKÒ€4 HÒ€4 HÒ€4 øqžã<$Ïçƒ9pyÆ ‘L]÷Ìœg޾ô ³ÐÚË7Ði ú†" Æus¥‰I½óv7™“o×\þü<Óï¹yæÒÐ<ïû4#[¾6* uÆù(ç•ÛŽƒqΈ 6·… ¤ÍašwN+M¡ÍÓ<6Ï/iz ¾fs6ç"#nuâUWJã<­”Æy`š´9cuÚü=kœ³ì5ÑBÚ¥°>mÎEFø$ Aiœ³ô¤{?6}o`˜Ì/‡Ž}m—Qúé s.FuÙ}¬óØG™8—dðúð&¶yÝëæX¤i@¤i@¤i ©ç2ÎÝäÃ$8ãÇ $ o| œò–éÜýúÈ<Ï#ÐY$êç ûÔm“zŽB_¤ëufï+Ÿ5—9óü™oÍÅÈ:§y~!Ìó žüÚœ÷ÄWæÜÇ¿2ç<ö¥aÖùY#ëü¡ÏÍéÌ£†ñIj˜&(óªO¼çK“.f¦5³­™qM#•†*c<çÁI®$–iÀ’`&ɼŸ¥Îß±fí^£fÛ|í^¤ÎA@ï :¢Î‡…–uŠš45³Î·èÿª5Œ»_>Ëf|wuÎøƘÌf‰&Ë4êü¥uî…®ê|™?€8ß ¦y3F‡mÆÅLsÆ´0¢%YºBÑÐæÌ\·´92ØÚ< äm!(³Í… –6ǶÆ"Z°¸?,mÓœ´ù¶Ž6ÇþÛûÑE´´ùÛmŽýžG›§‚Ò8Ï/ ŒsŸ6?ÞÒæŸ˜d!hï±o›Î;Ü3ÌýÅž<º¼BÃ|A˜æžý ™:CÑ, z½xÛµˆnŽus, HÒ€4 HÒ€4 HÒ€4¦ç4ÎCú|GÿlP3¤á òbó6ñ™ÏÍO2íV¢[R#\’:£*Љ¦Sè~§¹à±/rÔ¹ŠB­y½,óMohÖŒó\DK§ã`š“6?ñK›/Ÿ¤ÍÈ–Õˆ–d!(³Ím!hhœ… ¹ls[ŠE¿”ª–6‡iNÚÜE´ØBд9.\DK’6w-M‚’6‡iž¤ÍOÁBË®ýž56šæ¹7#ã¼H õ,ÏåqŸ0ç±³ÔF×™KÇÎÊô¹¤Á¯ã±}¿ÕͱnŽ¥i@¤i@¤i@ i@ÆyFóÐ<_ÆÁ' nŽdÖø:ÌBk!£¹9z ú2[ßhN˜8ÇšçŽ:gdËO}mÎ÷¨ó?!ïœÔù™Ž:à3sªOßKêü“ˆ:g1¤£Î$uŽâÈÃ-u>×Rç,—$uβIKƒlÎQçsò¨sFŠ’¦é˨\’¢&MMªšt5)kÇÌøö©sÌ1ê4 n’ÜÌ'ÙMꜤ7óÅiœ/Ôm$ŒóÊw‘­o‰E´¤Ñæ… A}ÚÜ‚’6ÇwNÒæ©… Ø~ø=$ió€Öçþ‹ Amºß§Í÷a!(Þàœpn\!(ó ô}ûAod›³ôÈÉÁÛ|Ó YêhóîúÐlÐûnæM˜åMÑå4Ï‹æíV¿Êl´ç83ö‰3{îÈÀ5¡ŸnŒuc, HÒ€4 HÒ€4 HÒ€4ДdœgØ8Íóe`’ÌÊ€Q’Ilð³ÍŠ[ ‡y~UžNÂÖ7óhÜb1.4'½,ô…º 1½.yÚ\ò×À<¿h"[`œG‘-ˆkÉRQ¨3Îi€W:|ãÜ/MÒæi… IÚÜF´6GÜL×¾/ÛøF´Ð8ß´ßL»Hà‚Ò8/Tjió¼BзíB…O›3>gÿ1ù… MÒæˆêI‚þaô›fÙmnŠeïÍ.·ty‚0÷Ìò ôÓ{#ƒ‹K8FÍò‡s6w¿òm&ϸ0¢ìȦnŒôßuó, HÒ€4 HÒ€4 HÒ€4@ È8ϸqšçía&<˜Ó$“fØmÏ~a¶>trhž‡zŒBoÂ@OƸ$)tk¢ðúßnÎyø3›uîÌóóŸüÊœf[êyçg>„¼sf“:GÞ¹Ë:ÿ#©sä3ۚŤ™yM٧΋¨ó÷#êœå“$œI:YçslÞv¯³mþönÈ:g7#F"êE—1ꔵ£Î{:¿|¦5–i0Óh¦á̬sÆàfü ‰næˆ[ê¹â¤Î­q¾ÉˆfE¶k˜kÞé¸ ÛÜ‚"¦%Wú¬YéÔçÌÊÈT_5¥”ßÉÒæøŽü®.¢…ä<·#•6÷ AIáÛBP›m/ef<³ã™!Ï,yšæ.ÛÜÒæ0Í9A!è»a!¨£Í熴9 AA›û… IÚœzØñ¢§ÍÂÈÔObIÒåMı2Ìiš/½ñuæòñ¯eò‘‘sÿ?°ÛëæW7¿Ò€4 HÒ€4 HÒ€4 H¥j@ƹŒs« ¿Æ¸1#J&ͱ¯zÚ,²öÀ"ú€8ž—ƒŽˆ‹(ôN[Þ`úŒ}3ÓE¡Ë ã|ãáÍ‹lç>mÞÙe›' Ac A‚¾hcdXbê AI›;ÓÜ‚’6iÎÅŸ6·… Ì6G„ ³ÍY¤ê²Íƒˆ–7í"l!(&ò AI›Ã4gy+ãt\¶ù¡ˆiá¢ÇáˆhaôC’… Ž6?fÊfÝCîÈÏ-O5ËËÈ/'iæöMŒÕ®2›ì=ÎŒ{ê“Lž2rÎÿÛ¹n©7Fú9ÝDKÒ€4 HÒ€4 HÒ€4 ˆ8—iž·psá<Œ_2b¦dÎ(»îî9få-ݳÐáRAŒKúBÈ¡Þé‚'ÌEO‘-Ž:?‘-¤ÎÏö¨óÓøÜRç,~<éÏŸRÆ'&©sd_Ôù‡–R¦ñJ–Fì!ãß·Æìcß³„óþ¤ÎaÜ’|ލsÑuþv@ÃüuÔ9Ma_’®f& 1U¬sRçÝIÃ`¦ÑQçˆ;!ÁÍøKŸ—£Î“Ò¹…ŒsÒæ¶”´9Lómþœ¥ÍW)@›¦y:mžVÚÛº¹G›ÛBPÒæØ/Ûaÿ0Þe›3+>6 AÚœsÐæA=ç(Ñ2 ´yhš3ÇžÙæÇ²o°ô ‘¯™¥{Ž2±8–ä¢M2Š%‘]Ðå^$‹5˃Hg˜·_ã*sø…š{f*š¥Ïù¯`Û–ÖM¯nz¥i@¤i@¤i@ÊÕ€ˆs™çiæùÁ0~h`#%s†¹?—“ŸÿÒlÄí0Îû—o §QèELôuö»Íœõ—3Wjó®oÖX¤çÍ6¢eÑR€6_ÍÑæ0ìÚ|º¥Ím!(³Íað3^&F›÷ hs. pq€‹Œ¨±´9LsÒæAD hs˜æ; y#* hó·ÚÜ‹h¡q^¨”Æy~!h>mΈžmÏ}Ò,ÜåÚÀ4OšåiÙåÅÊ>“tyH˜SûËv»Î\5éLŸ 2pŽÿ ¶qÁroŒô󺙖¤i@¤i@¤i@q.Ó¼à ̆-1æeÀXɬqvÊÀgÌ"kȵzh¢ûz,EЉ,ôMô%{Œ0GŒ~=Wʼó:?ëad?ô¹‰¨óûƒ¼óˆ:}ÌèÒȤ’I'“<'uÞ›ÔùDPçrÔ9éfƃ°”ÒRç  iè2J„9Ü»#›¹Ü»Zêü-kÓ&uN“˜Ñ$4#ê6iìˆ:‡áÌlpf„Óˆfü iÔ$¼iXÓ¼^žÆù†Ãš5hœ[Ú¹æÉBPK›#ל-«…-ÉBP’ð¶44΃BÐ\¶¹-½mn AQÊÊBPf›»BPç4Íóióí"CXºßÐYf©ÍGÆMór£X"³<Ç- Aã ágŽºøqD³ÌËäñž‘s9£ÆþTéM‘~O7ÔÒ€4 HÒ€4 HÒ€4 HN2ÎeœÕ ˆ%0^Ȉá’I3íö¿2;}g`žÇ ô–¢Ðs&úš{O0§Þó¡9—Ô9òΙuNêüLRç~nNcÖyH3ïœYç'8êü®uŽŒìÞÈʨó¹Ö ¥QKêœÆ- Üý,uþŽ¥ÎIF“:ïå¨s”[:êœD5MbŸ:gA& eF˜0Ê„t6)ín êœ1(9êü%KÓ8oßuh³Æ"[ŽI¥ÍW>-G›»BÐ$mn#ZH›ã»uE{@›´ü¦ýPJÚÜ‹háv*µ´yJ!(÷¥O›s_[ÚÏäq¡óö7ØÖÍ[âÆHC7ØÒ€4 HÒ€4 HÒ€4 HÔ@“¦©„"¡P0$~…qm†L˜LšlÃïϬ¾5¢[V¡yžf ')têyzÓyèíAo}ÚCæO Îÿ„¼ó€:ÿ" ÎøÌœêSç÷’:ÿİ8òXP礔]Öù‘¤ÎaÆcö°:?d|‚:‡¡›£ÎçDÔ9Ë-iïf“¬ÞÁRçoXó˜Yç4“Y˜Qç ´}ꜙá4¦IÓ¨¦a͘”À8¿®Yc‘-n2 ‚2ÛÜÑæADË‹–t_×+%m+%mÒ|3‚ú´¹-e¶9¶—Ùæ¶™ïÜÌ€O£ÍiN’ŸûÖÒæ0Í“´ù¡x €¦ùáÈ£çˆû ½œN¿f¿gãC#ÂòJÆŠ0^„Ät¯³ ©óÝH£ôrg˜Äuó˜Ô9ÍdK£8ÓQç=HƒÚfVx7PÜÌg†¸O¯t8ˆóõaœ7ctØ|´Yþ¤gÍ Q!èsfÕÓŸ7«9ÚÜ+¥qn A™mòß%F›#—´yw|o~f¶s{,mŽí#mD´€6i¾ÃG›ûf·ëQʘ/¢…Æy¡BPçÉBÐCnžcVíukÓTyÁ’O,_-Ìã£X|ÜzÝú“̤gÍ’sôŒÓ ­nh¥i@¤i@¤i@ª¡ŠŒÓj|ýÍú8ÌŠM0¾Ì€1“£þF× "vx %\8±ƒ )á°Yån0(Wò™ËØ›åÔÜ«÷7'øk&Å žo?Ç6o¤›YÝÌJÒ€4 HÒ€4 HÒ€4 ´–šmš¶ÖÕçÔöACc>ŒË2hædδ»ëåoÌÞ'ݘç)ze&z:¾âö7™£o˜çuTº ¢Z\ûšæçÝG¥ÒækýéE“£Ís… ¤Íc… ¤ÍAš³È4¯”ÙæXà‚€-¥q‚æÓæÎ4çb,mÓ<6‡y¾Ñ1÷™mfyuÌr§»U¶¸Þ »çÌ=Ǿí^^÷µ} ùÑüHÒ€4 HÒ€4 HÒ@£i@ƹˆóÕÌ£0~̨¹“)ïÂQ/›Å×Ct‹3ÐK5Ñ‘Km‰b;<ÒØ'í¿dr‡.ƒÍžW>oNEÖ9©sæÔù'u~W‚:ŸLêyçÌ:Ÿ0×fn»¬sÒÑ4|iü:êœñ#1ꤵ£Î[ÂÜošË$³i63â„Q'¤ÎY´ÉÂMF¡0ëÜQç«ôqNã¼£ŒóU Ðæëœ[˜6ßø’üBPÒñü¾±BPÒæØ.Ÿ6·… hóÀ4hsæÅ»BЀ6ßì;â ³ÂcüIªœóžN–û,Ñ¿ûÿïxÄífÊ _fêxËð9õqlû"vó¥íÑ…4 HÒ€4 HÒ€4 Hµ¯5M5áµ?á­1G09vÀøg†žÌzcýЬ¿Óf/‹è™èÅô¼Ûüñžë¢(tÕÞ ÎQˆÙœÑ¡û fUd›¯vÆófõ3_0kœý¢ hó醯ùz,e¶ù…È5OÒæ0ñI›3J&F›ç‚‚6ÇÂ@Ž6 AQ–j³Í½ˆç… A·¿øYӱ˵EâW åɼòBf9h:¬Ñßœ>èÙÌ_:‡ÎÇ(°Ö¸né3tÿ" HÒ€4 HÒ€4 HÒ€4Ô€ŒsçUÑÌŽõ0>–ñ3¯áM¾©3¾1ûŸvŸi·Ìsèi&z é·ezßüv@#ïüçLJÔù1Ì;¿ýCìó#I#ïœÔùa!uÎ nÒÑujšF0 afwÔùlk3ß›ä5 lRç;XêüuŽ|ðž>uŽâMRç,â$u¾Ú-dœ;Óü¬Ìš¡qîÓæ¶”Æyß—m¾zmN*>F›‡-¤ÍmD ¶Í‚’6GÆ;·=( ²ÍýBЀ6GD ¨}î˃@ðopÄÝaË)/f”3¿þ‘éºËh³À ýR Ðrhô‚Fzh¦w=ôsüÚ¼sRçÇÝõ±±ÔùÅ©óI>uä8ö=KMÓ&E½OH³“ñ$$®w#u#yç¡uB›¤ö6ȧ M3š¦4©nF¢°ˆ“¦õêˆjiÇ‚ÌfŒ›Ž "ZBãW÷+Ò€4 HÒ€4 HÒ€4 HI È8qÞj€)r.Æ/2гa _6v¦YŠÑ-Î<÷ÿ™ÇQF/b¤Ó˜]x­f§ §™ãïŽSçG#ïüÈÉš#uÞ›Ô9òνõ}sÈø€:gF7©óýu>:È:§aLÚšq%»¡$3 Îß²q&Ìg.øv¤Îa@om©ó×ê&5©sšÖ«#ª¥ÝêW5ktØt„¥ÍƒBÐm!èº^!(ió ûγÍCÚ¦9©÷X!(¾[*m>ä0¢%Ÿ6w¦¹O›ï~í,³Ì–# ç“2É‹åvÎSô±ÇqSÍÓ¿–ižÓ|® t“ª›Ti@¤i@¤i@¤ZÒ@«™¦µ´Ñú.mwÂ9ã¿2ϳaž{òc³ñncÌË_Šá襘è…JF]¤#šÃ®wàdÓgÊ\sì]‘-mXº‰sf6ctè6<µ4I›§‚öH‚:Ú†¿O›ÛBPf›§ÐæiÐæ[þéI³ðÚW¹?’ežîÿ/´0RÀ(·Ú€F]³¿9÷úe˜gÇ0ç\ß± ®Ëmw]Ö¾×¾—¤i@¤i@¤i ]2ÎEœ·º`’lñ­Ìól˜ç÷ÌüÖv΃¦Írk ‡&z%Fzfz§î×›G¼fŽ ³ÎI5ÅQçÔù„uŽÌîý‘ݽ³ÎQ€IÃØQçŒ-a| K3#ê¤vŒ:GÙ¦£Î·èÿª¡ims™6gÐ8hóé–6_ϣͻ&ió~È6÷#ZBã<¿ôu[ºCD›‡…  ëm¶9H{Ÿ6ßôýZN)¹R©QnµàëáR³Î¶#ÍΕiž-Ó|®ÿ§4ݤKÒ€4 HÒ€4 HÒ€4 Ô¢ZÝ4­Å ïÔú'Ì’Õ1Þ“yž óœó|åøWÍÒ]šù;;óÜÿg½X>ºO5{äsûÕû›íÎy¢M‹B×<’Æ9Š3›1:†ÆyÑd›ÛBÐ ã… ñlóx!( }WÊRSþŒ›ÙqÈ›ÆÒæX m‚¾‚ζ‹;_ýŠéÔ}¸Y I•£É å)F¹[D¡ö>ñns×ËŠfÉÐù‘]gëÚÛú×^ísísi@¤i@¤i@J×€Œsçm¦'‹c<Ÿ!³(ó4íøiŸšn{Ü óüo0Ò é%šékï3Ñ9ñ}Qç“‘u޼óÃ-u>×üÁæYç’:GÞ9 0u¾×¨ ë<¢Îa03Ö„Yç4žIn3ëœe›4§™#άsRçkÑ8_Æy3FÇM†[Ú|]G›Ã4ïBÓ<¥4I›ó{äÓæ åCÓ<*…qN¢žyîÜVG›w?ý1³ÐW›A^n슋áIå¾Qîæ1D³\0rz拌ÿƒíÝ_7j¥ß¨i_i_IÒ€4 HÒ€4 HÒ€4Ð6h3ÓTÞ6^kûÊüweÌ8Ê´QxÏÌyæˆó6íÙ7Йžf¤ÉHwFmŠÁ»Ô&×™}¯›iÍóÖ, %qž—žÌoâÿï°ÉõñBPÒæ0Í»ö}9^Ú/(íŽbÒͽlóÔBPG›Í/¥q¾Çð·Ìê{OJ7ËÓJ^c&y³ÍÑBÚ|þ3â´9 AI›÷ðhs÷©´¹WÊlóÝ¢lóÙ¦ÛI›ö«]™ošÛ¸•t’œD9ç!u±Ã-„Øææu D³\mn AAÌ“œg¶ù®×½aVíukhŽ7eŠÖ 9&¹77Ÿøç;Ž27?öQæô­sÙ¼Û±~¯·–»qÓ¾Ô¾”¤i@¤i@¤i u4PS¦©&½u&½Ö÷3L–1¾á4/S&ã5“ß4»"ºeپሯå›éŒz ¨h—·Í.¸Òe¦ÇIT¡(4Ù²ó´È“2Š6;n44¢ÍýBÐ/yÅtë÷ŠI‚Ò8Ï/}Ý‚îàÑæ»ZÚüm³M¿Ìâ^Û7n¥Gæ„Ñ9hò¤Q˜æ}ÍËõ5vŸ™:CÑ,<§ Ä6ÏWë×}?Ý{HÒ€4 HÒ€4 HÒ€4 ¤i@ƹˆóšÔÌ–0ÞÌ Ñ”)³<9¿“žùÜl¹ï83ÿ20ÏÝ(d¤WD¦çrÔWÝùfsð˜Ùæ°‰sÍ¡·¾oÿ¾!u~Ð- ê|tŽ:gæî#H¿Rçof†3ë|{PçÛ‘:G¦øº…ŒóRòÃß¡qÞ…… ˆiñ AãÙæñBPf›o=ð5ûHÀó;ñ»‘Œ·´9LsÒæ÷€YpåË dÊ—`'hrg’G‹áÜ-µöUæ²›_É´¦3zû Û}‚nš(!]lýkÌný_ŒE¶Ð8?p,âZÙ²#[Š…2²Å/ ed‹3ÎA·û¤{¹ÿÞqÃël¶¹O›;ÓδŽ3zîú¶{7] [îZ¨}©}) HÒ€4 HÒ€4 HÒ@Ûh@ƹˆóšÖ ˜ßbÜšQ*Ó¦ãµw¼mVèz™i±¡!›j¦Wl¨_lÚ![½Ûq÷åSç4ÏÇÀÇvo¨º¶¹¡Ó~×~—¤i@¤i@¤i e5PÓ¦©&»e'»ž÷'̘~5¢2m>N~î ³õãaœ_˜3Б^Š™^Š¡Æ+m?Úì?ê­(²¥Ò¢Pšç9ã< S47ÜàÞ?Iœ§Ñæ›]ÓÆ9 A7ï?+*%mÎrRK›{-¤Í×?ê>,ôK'ôÃ,òâyŽ$· þxÿÞiíþæŠ[feZ³>O½m_¾ž¯3úîºç¤i@¤i@¤i@ð5 ã\ÄyÝh¦Ì‘?fؘʬ!ùÇËŸ°Ñ-¿ït¡‘^ÀLÏ3ÔSâ^òòÓªºãÚÌN—=ó<È:÷#[u¾×¨uŽÌð]Bꜱ(ŒGYÄùr!É]á?;vb6ì;Ãltñ c AI›Ã4'mÞãÍ{¢ÍIÀœe–ß~L"Þ&$Èó"V\®|>Ežn”sáÆ&»Ž6ãŸú$³Íøyé1lÿºÁÔ ¦4 HÒ€4 HÒ€4 HÒ@#i nLÓFÚéÚ–ÊO"0g¶ÇøGÆMªLš“C§Î6+n4(fÖúÆmÎP/LDçG¾ä›ê ÀèÞèÈ{ÌÁ0ÎsE¡ïš}mdKzQh,²Æùú4Î FŸ¤ä²§ü,óÀ4Ÿa’… ¤Í·èÿjD›oíhs‚:Ú¼ÇyÏ`!àêüŒx/‡<Š¿)@†y°H‘Ü×îÿ_zïsP4ˬy™<.q.¾ã7º®U~]Ó¾Ó¾“¤i@¤i@¤i 65 ã\ÄyÝi&ͺË<ÏžQ7åù/ÍöO0¿_ê‚`tâ(lê–L¨§Ä¿¬°ÕH³÷õoTTjó‚Dw±ÌpG}ƒ~ßàZkœ*¥qž_úº%Þ×9ün³@gô.¾¨1îŠä¹ýîwìÿ¥×éo®šðZV cm÷¬yëæ®6oî4/ši@¤i@¤i@š¯º3M5éÍŸôF؇0Í—ÆxEæyöÌsÎù©W=eZþâœîŒôÈL/ÍPǾäG¿tXýJ³}ßgÌ, ½9^šÙâŠB×ïCãkatKd ;#=ùÏ õÐŒ^hÅKÍg>nö}¾ç È:‹B7lã|QçÝ´y÷‹§›¥º mšª/d–GÆxÎ/´zî=ÖÜöìç2ͳkš3úê,]gtc, HÒ€4 HÒ€4 HÒ€4U È8qÞ€á³8Æs2ϳkžúË{fÍÍ›ß-vŽ7ÎÅ¿£iS=A­;Ó9iJ/yžYkŸ‰fÏ‘oGÔ¹5ÎË!½S~vÑõ®qŽ\ó6ßà¤GÍB+õKÿ»eâþv»}áï£;oþØï1æÙ5Ì9÷ÿÁØ/«7FÚn=HÒ€4 HÒ€4 HÒ€4 P išJÜ75ãg~Œ;ežg×<¿ó¥¯ÍGM1¿[æ9GÌD/ôÿWb®Ÿk:m8ØìtÕ kžox,Œó&i÷âæý¢ë ²Í¯˜iVÞs¢™Ÿæz3Í/ºýØ?+¬•¹îηešgÛ4ÿçÌê:* HÒ€4 HÒ€4 HÒ€4u È8qÞЀô+ŒA2ϳkžsîÏö¼é¸üE0ÏÿäÐLw¦zÉÆzšá˜í .××lvê#f#ç9ãºtºÝÿŽë4Ý.xÁ,ÞõZïo•jþ§üœ¿Ñ¿çöǶûßb&?÷…Lól›æïàxY%ë7FÚ~=HÒ€4 HÒ€4 HÒ€4 ˆ8—iÞЦ¹’ƒôGŒŸe g×@ýà\³vw˜Ða»3Ò}SÝý{й^‚ѾØ:J¤Û á .‰Y°óÅé'Õ÷¿kÚ¶xÿ›·Ú#šå”+žažmÜóÿ Æbº9ÔÍ¡4 HÒ€4 HÒ€4 HÒ€4h 3Æ©&\=L¡^ÿ–yž]ó|êËߘ}޽ÆùÙ‰á™é¾±^²ÁÞ„QݤAßB¿ŸöÝóþ·Ü¶¯´ÁUfØÝ³ešË4Ÿ‚óâïuÔuR¤i@¤i@¤i@Èi@ƹ¨óLiæÐF_È<Ï®yι¿hÄ‹fQF·t€‰œ6òŒug67a°—d\Wão$¼ÿ¿À6îxÐxsû _Ê4—i~5މùtc¤›ci@¤i@¤i@¤i ®L™¦š|¨˜D+`¼)ó<ÛæùÍ|`ÖÛ|ˆùÝ"gÁ’y.ó|Ü› ·j~ÛþôÊG¥&{3>s‘Nçšó†<+Ã\†¹Ó@߬ÜÐh;uó. HÒ€4 HÒ€4 HÒ€4Ð’i*ã\Hh¦ùÒ3džË<¿Ñ-‡vùýB0Ï<->šan7ËŒwŸ›ü>øÿ×Úøj3úÁ÷ešË4§=uXKÞ0èoéT¤i@¤i@¤i Ki*ã\HÑ §1þ"ó\æ95Ðÿ–™f)F·¤˜Õµò¿í}ÔmfêËßÈ4—iN üc›,ÝÌh[uó. HÒ€4 HÒ€4 HÒ€4ÐÒi*ã\( Oÿ‡1Ræ¹Ìsj`ÂSŸ˜nÛ3¿mwj tz»–Å?¯#¢Y.öœ sæN@¯k·ôÍ‚þžn@¥i@¤i@¤i@²¦™¦2Î¥&4êlŒ_d Ë@¿gæcÑN瘋G¾ Ê\”¹¯ë-¥ó¶nd¥i@¤i@¤i@¤–Ó€ŒsçÒ@€9µ*Æ»2Ïež; ô9ç~ó{”†þæ÷0·ÓFÌX÷Möÿ^èïà_³kÌØG?i.ÓÜi€Rg覨ånŠ´/µ/¥i@¤i@¤i@œdš–ašêÀÑC À¨Z ãY™ç2ÏMzÍ,³ÒE0ÎOªÊøí'›ƒN¸ÃÜýŠ¢YtÜEÇݰ/öÕuI×%i@¤i@¤i@¤i :q.ã\¨@0¬~q‡L<™çN·=ó™Ùbçæ7¿ƒyÞ‚cñNçšËn|I”¹(s__Cw›éƨ:7FÚ¯Ú¯Ò€4 HÒ€4 HÒ€4 HÔ€LÓ LS<:xBò|>˜WežË<÷5pü˜<æù›=ºödÆ=þ‘Ls™æ¾æ@o«è:¤ë4 HÒ€4 HÒ€4 HÒ€4P] È8—q. 4S0±NÄøIº t§!SÞ0Ë­|¡ùÍoO¬hü‘/‡žt—¹ç•oešË4÷5ðWhlQÝU÷ÆHûWûW¤i@¤i@¤i@Äy3 SD:ˆœ`fíŽñ/™ç2Ï&?÷¹Ùjבæ×¿9±¬±ÄÒç˜+ož!Ã\†yR“¥ëŽ®;Ò€4 HÒ€4 HÒ€4 HÒ@ëh@´±Ìsi …4SkCŒÏežË<÷5ðǾ™ùQîùë_ŸÐäØxËÁæÖ'?–i.Ó<©« ©ùtcÔ:7FÚÏÚÏÒ€4 HÒ€4 HÒ€4 H"Î[È0ÕÁ¤ƒÉ#Ï—‡Áõ†Ìs™ç¾†Þù–Y~•¾óß!½÷iw›{f*šEÇNìØaÔqºÆè# HÒ€4 HÒ€4 HÒ€4 ´¾DË<—ZX0ºÁx\ Ìs_SžÿÂl·Ç(óëÿ;>6–B4Ë€[^e.Ê<©ï Ÿ]tcÔú7FÚçÚçÒ€4 HÒ€4 HÒ€4 H"Î[Ø0ÕA¥ƒÊ#ÏÓkœÌs™çI œÚïQÓ®¢[` o¶õ3qÚ§2Íeš'5ðt³®)º¦HÒ€4 HÒ€4 HÒ€4 Hm§ÑÆ2Ï¥*jæ×%2Ïež'50üîÙæ„ a.äi@¤i@¤i@Dœ·¢aªNœGž/³ì~§2N¥Lkào˜ÿ­umеA¤i@¤i@¤i@¨M ˆ6–y. ´`˜ýƧ™6Næ?³óÿæ~-ÝÕæ‘æEó" HÒ€4 HÒ€4 HÒ€4 â¼ Sx:ð| À<; 㨙5PežÏÊÜÜOÇñ¾”®ºHÒ€4 HÒ€4 HÒ€4 Hµ­ÑÆ2Ï¥6ÖL´ý0þ#ónŠ4Oš'i@¤i@¤i@¤§™¦5bšê ÔAI À`[ ã™ç2Ï¥†ÐÀ÷˜Ç}t~×ù]¤i@¤i@¤i@¨? È8—q. Ô˜`´ýãv§ aœŠ2Ï&eÎyÿ cSÝÕß‘æLs& HÒ€4 HÒ€4 HÒ€4@ È4­1ÓT¦Ì<Ÿ¦ÛÕ2ÏežKu©Ù˜·•u>×ù\¤i@¤i@¤i@¨_ È8—q. Ô°`¾€ñ“ÌÓº4OE›g“6Ç뢺1ªß#ÍæN¤i@¤i@¤i@Äy ¦:@u€: À„Û ã_2ÏežK5¯Û0G¿Óù[çoi@¤i@¤i@¤i þ5 ÚXæ¹4P€×ãs§5oœŠ2Ï&eÎyï1ŸnŒêÿÆHs¨9”¤i@¤i@¤i@q^†©T¨yÞÆÜë2ÏežK5¥F)«sµÎÕÒ€4 HÒ€4 HÒ€4 HÒ@ci@´±Ìsi Ž4ƒnaŒÇdœÖ”q*Ê<»”ùw8wÖQcÝi>5ŸÒ€4 HÒ€4 HÒ€4 H"ÎëÈ0Õ«Ö#ϳn¬Ìs™çÒ@›jàSìÿ.:7ëÜ, HÒ€4 HÒ€4 HÒ€4 4¦DË<—êT0í.–qڦƩHóì’æ¯âØ[N7Fyc¤yÕ¼JÒ€4 HÒ€4 HÒ€4 ˆ8¯SÃT¯^>?Þÿd Ë@—ZM`_/¤ó°ÎÃÒ€4 HÒ€4 HÒ€4 HÒ@ck@´±Ìsi Î5oŒ¿Ë8m5ãT¤yvIó18Î~££Æ¾1Òüj~¥i@¤i@¤i@Dœ×¹aªƒX±Gž¯ CïC™ç2Ï¥ªiàBsuΕ¤i@¤i@¤i@²£ÑÆ2촄 ÓN/Ë8­šq*Ò<›¤ù8¦þ £ìÜi®5×Ò€4 HÒ€4 HÒ€4 H"ÎÄ0ÕÁ¬ƒÙ#ÏÛÁä»Oæ¹Ìsi E4ð7ìÇ­tŽÕ9V¤i@¤i@¤i@ÈžDË<—L0úþãz§-bœŠ2Ï&eÎyŸ‹±¦nŒ²wc¤9לKÒ€4 HÒ€4 HÒ€4 ˆ8o0ÃTµj_0ýÎÄøEº ti l LÇ>[RçTS¥i@¤i@¤i@¤ìj@´±Ìsi 5óo_ŒÿÈ8-Û8iž]Òü/ èÆ(»7Fš{ͽ4 HÒ€4 HÒ€4 HÒ€ˆó6Lu€ëw€ Øãk™ç2Ï¥&50ûèW:êü) HÒ€4 HÒ€4 HÒ€4 H¢ežKÐÌÀU0æÈ8mÒ8ižMÒüg§é¦H7EÒ€4 HÒ€4 HÒ€4 HÒ€4à4 Ó4¦©xðÔŒÁE1ž‘y.ó\ˆià{ì½užÔyR¤i@¤i@¤i@| È8—q. dH01EÆ©ÌsiÀjà+ŒMuc¤#i@¤i@¤i@¤i@Hj@¦i†LStÉóù`q*ó<ã˜í_IçE¥i@¤i@¤i@¤i M2ÎeœKÕLÃã1~ʸyªLólfšOƒî;êÆH7FÒ€4 HÒ€4 HÒ€4 HÒ€4PH2M3jšê¤ “BHŸï ñ;™ç¢Ï3¤IØÖßé¨s 4 HÒ€4 HÒ€4 HÒ€4 Ó€ŒsçÒ@Æ5±+Æg2NE™g“2ç¼_‰1ŸnŒtc$ HÒ€4 HÒ€4 HÒ€4 HMi@¦iÆMÓ¦¢ÿž“ÌÄίÉ<yÞ øÛuŒÎgÙ8Ÿiž5ÏÒ€4 HÒ€4 HÒ€4 H-¡ç2Î¥iÀjÆâÂ6¨q*Ê<»”ù?¡éZâ‚©¿¡/i@¤i@¤i@¤i ;i*ÓT" À`ü ÆÍ2ÏEž7ˆ>ÅvtÑMMvnj4ךki@¤i@¤i@¤–Ò€LS™¦Ò€4§˜5ˆq*Ò<»¤ù«Ðð²-u±ÔßÑ—4 HÒ€4 HÒ€4 HÒ€4- È4•i* H©€éxÆÿd ‹>¯C <Œï¼nh²uC£ùÖ|KÒ€4 HÒ€4 HÒ€4 ´¤dšÊ4•¤‚€ù¸5ÆßêÐ8iž]Òü&èõ×-y¡ÔßÒ—4 HÒ€4 HÒ€4 HÒ€4= È4•i* HE5r-Œdž‹<¯ œ¯™ìÝÈhÎ5çÒ€4 HÒ€4 HÒ€4 HÕЀLS™¦Ò€4Ф`˜.…ñR§"ͳIšÿmR‹¤þ¦n¾¤i@¤i@¤i@¤lj IÃLÂȦ04ïš÷¤`L¶Ãø³Ìs‘ç5¦yø>=uÎÒ9K¤i@¤i@¤i@ZR2ÎEKÒ@É€AùÃjÌ8ežMÊœó>c–¼(êoé&K¤i@¤i@¤i@¨’ 3 F‚‘¤§˜•g`ü"]ôyjàE|ö’:/é¼$ HÒ€4 HÒ€4 HÒ€4 HÕЀŒsÑÆÒ€4P‘`ZîƒñŸ64NEšg—4¿º[ EýMÝlIÒ€4 HÒ€4 HÒ€4 HÒ€ˆs¦¦:yèäá‘ç›ÁÀüZæ¹ÈóVÔÀ|Ö¯tÒyH¤i@¤i@¤i@ª©§2Ï¥i Y€‰¹2ÆœV4NEšg“4ÿ;µšDýmÝpIÒ€4 HÒ€4 HÒ€4 HÒ€Ó@³ 3 IB’¤j†æ¢•y.ò¼Jøw/ot¾‘¤i@¤i@¤i@¤ÖÒ€ŒsÑÆÒ€4Ð"€±ù;ŒÉU2NE™g“2缉ѭµ.ŠúÝ€IÒ€4 HÒ€4 HÒ€4 HÒ5Ð"†™Ä$1IÒ@HžÏ“ó*™ç"Ï[Hoãﬤó‹Î/Ò€4 HÒ€4 HÒ€4 HÒ€4ÐÚq.ÚXZ\0;Ãø©…ÌSÑæÙ¤Í§A?[û¢¨ÏÓ˜4 HÒ€4 HÒ€4 HÒ€4 ˆ8—aÚ↩N,:±8 ÀôÜã;™ç¢Ï+ÐÀDFÿè|¢ó‰4 HÒ€4 HÒ€4 HÒ€4 ´•dœÊ<—¤ªiæçŸV`œŠ2Ï&eÎy¿c¾¶º(êsuC& HÒ€4 HÒ€4 HÒ€4 H"Îe˜VÍ0Õ F'<_Fèk2ÏEž7¡ñßûèÜ¡s‡4 HÒ€4 HÒ€4 HÒ€4 Ô‚dœÊ<—¤ªk†èBÈ<—y^@ÿÄÿ¾c-\õts& HÒ€4 HÒ€4 HÒ€4 H"Îe˜VÝ0Õ‰F'<ÿ ÌѼú” ~IDAT12Ïež'4ð þÿõu®Ð¹B¤i@¤i@¤i@jI2NežKÒ@«j&é…2Ïež‡˜….[KE}ݤIÒ€4 HÒ€4 HÒ€4 HÒ€ˆs¦­j˜ê¤£“ŽGŸ Ãôè™6ÐÂü·×yAçi@¤i@¤i@¤i@¨E È8•y. Hm¢˜¦[cüMæy&Íó1○ŋ¢¾“nÖ¤i@¤i@¤i@¤i@Ĺ Ó61LuòÑÉÇ#ÏׂúÌó̘ç¿`®ÏÓ9@çi@¤i@¤i@¤i@¨u È8•y. Hmª©KbL—yÞðæ9£y®õ‹¢¾Ÿnܤi@¤i@¤i@¤i@Ĺ Ó65LuÒIÈ#Ï€©z¯Ìó†5Ïçan·Ô1¯c^¤i@¤i@¤i@êE2NežKÒ@MhÆê¯0†Êóæå›ÉŽu0õóë;y>™¨û…x>°x~!sû¼5gÍ1À 0À 0À 0À@-„Sñœ:c q÷Cñ¼x<ÿ9sº¡–MÑuzd€`€`€`€'ÎÓÎS4´¾Óço%ôÞЋô“™ÇÕÖ—õÅ 0À 0À 0ÀµNÅsèœÄÞ-WÄó%ÅóC™¿ÉÚ6E×ëE`€`€`€œ8L;L=Ø<ØúNž?›ðû»x¾àx~'s¶ÇZ²–`€`€`€` f©xÎ5¼>ãGñ|ÞñüFæêÍš7E×î¥`€`€`€œ8L;L=à<àúNž¯J >!žÏÏ/gŽ6[;Ö 0À 0À 0À 0ð÷C©xÎ7 ¼,ã€x>kƒx~!¿ãs5nd®Ù  0À 0À 0À ”6 ˜‰¦ 0ÀÀ< $Jï͸3¢ý§ü^•Þ |ž—`€`€`€¨Õ€`6`V+×íÁÈÀL‰Ó;3nŽX<ÿ:¿Ïj÷Êze€`€`€`€ÊÎ…s``©_θ2"ñü`óU26År›¢¹4— 0À 0À 0À 0ÐÌÌ,‹†‰ÕÏdü6ÄxÞ|eÌnyd€`€`€`€c@8Î`€EH¸^—ñÃâùüÌ7lŠƒÙÍ«ye€`€`€`€'ÎË, ‡z°Weo1ž_ÎÏÚÌ ƒ 0À 0À 0À 0ÀÀ` 8i*ž3ÀK0½,c ñü|~ÆS6ÅÁnŠæ×ü2À 0À 0À 0À€çKˆeÄýµßϸ= €þ}>÷Qæ˜c€`€`€`€Ú1ऩxÎ 2¸ýjÆõÂñüË|ÞJ›b;›¢y6Ï 0À 0À 0À 0àÄy¡Xf1YL 0Ð3ÈýRÆ…âù¾æ«`øâ‹`€`€`€h×€“¦â9 0PØ@b÷ç–Ï›¯|y׆Øî†h¾Í7 0À 0À 0À ô f…ƒ™Åeq1À@c á{mÆ·‹ˆç×òvpÄ 0À 0À 0À 00<¹pÎ È@øŠŒ£ ˆç—òo_°)oS4÷æž`€`€`€‚Ù€‚™f1ÀÀôÉó‰ÄðOæÏÍ¿™â†`€`€`€``ø„sáœhÁ@¢øÛ·f è§ó÷Û‡¿)ºî 0À 0À 0À 8qÞB,³Ð,4èHß–qõžx~8^Î ' 0À 0À 0À 0ÀÀèpÒTúlEëg¢õ a†fÁ¸q^&§4›Ýµ“½îvøîtØVC{p0Ãé[ÂæÂ¸ôЖ bÌ'çÈ\×Þ?„OO†m2D°3œ»ŒK oÍà!Fæ:°ÿ ¾~;l½¡€-Ìpâ:0.!äRÂ#§ë2 12Wµ)W]{+lœÁÎ f8ku— ~F'º&æüó¸ÿ¹êìK°7ÂVÉ ìäa†SV†qI —ÒY1æ³l‚y²ž€V>;¶|`' 39—þq —ú„$•{ fs]üú$ìU°dW%3öJ—úqÉ_*Pù.'÷Ïæ²Ó±Sø7®h;ÆÉ!ßåJå~¡mþ¶WUÆÁ£†™ ãR>.éãÒ¾TỜ2^‹ÆuâCZnYÄŽ1ÖE|·aÕýDû|¶+,úUgÑÁÌFƒíûŒKøbpj¬eàÞa§ÀžÕ5bàZÎúsÑ…k=c(×½hŸ³`;vmk××E3é¹0.Ñ»G¢j„НÛ„YÛËyqnÎò†Ú%`MËpÚé`[»´MþAaFcl{ŒKòLr¨éxŠ7¤^wI[ŒŒþëí@³.o+FG›vik›×x‡ßöNذQÆG¹0ï§6âžëÃÞ{D¾2òOß<6Ó&¤¦yy•[Æ¥uß•(ŒDÁÑ…q(,ø«”¯¹5’:àæHMßqÿ7¾Uàéœç3L!žNç fVö6ØõEå†:mw6l{P™tJhîÁÆ4×Ò³Ÿ ýÞÛ¼Üæøÿ©¿‡ñǤ~onxlEA+ Ý=5ÆÕR®Ï©N][Må¿møØòlÔ¦Äú½º8\¼¶‡‘Ôü•‘hÂCøfäëÒbg©EÎOhƱ¥ˆ¸1OVØBw¸ö™ojj´+OIá,¯˜‚ÜílSþ¹®¥˜cª„ϲ܉v:¦ãG ÛëÚÙ¡yLî‰0}k6rþÔ4Ìœúö Ej÷ú*Ú‡Ûµzç×UȺ®tÜÊÓ;ÍìãG ©éÆgyÿnf~™ãóÆ)Ü‹Kí.„EõñùA‡/¶‡qÁ’– óº×4Ì[ æ…Ù<´Å °U‡ NÌu‡oø5ßÀpˤƒ2®> 3‡2CŸpà¼Á«a:Øñó°­Ž¾âN£Á†zbÉt'q÷µ"ÑClî·ýqØv¶¦|ìÎn›¶'|È‹Ÿ€ñC‘0¦{|nf®½Ž©€.ËÂ%ªÜ¶(ës‡LAÈ)|º6ìݰ!íêzê(ÌÜÆ%@1ä}#êÈ£H:b–“ðs® |Ì8±ËÕQ1hÏeö…y‡L+Ía×%°çæ,^Õ­~xßï »–ëÎ7ëŽÂÌž,§“ îG}Nƒ­%¡‡yŽ­Ý¡…™0~uÄï…]FJŸy?Pnç…Ÿ@¢‚·dPIîþy‡Y±‰I剣S6–…q«¦[3Ðû5u0sf×g¯bë^Qpû¢˜8€IÅÐÌl·pâVN¶ôè3Ÿ3ê`æ'|> Ò÷^Üù„§a,|fHED*g\4´!Œ[:¥v8ákê`~a"0ÿå< feGCX!ýMñ›`nñ”Ê÷ý×Á̊ĺ±9‡AWÂv élÝ{8àCk¹ýôË`Ü2*äN£7Á¼{@˜»#U>u2‹L8MMý: /[6Á<#`áþ XK*'\5*2s›â±oÆ6ÁG¢ûf¯–Š3UÎaw<àd“€ïÆ*ýUÁÌW@]žym\3K ’TüFB>’žg óÉa~U*ÎT9‡Ý逑7ääM¦0sSwQ¶KG ’aC’ŠÿÁ÷!ë¢q×TŽ`«†Ùk,äûSq¦Ê9ìNŒp³~`¶Íƒ»“.e™™Bþ¸`3o™Ú  €¦xJ%8SS_ óÍumSw¤+פ¶í1l¤¿)'ª ÃîL ý5`Üß|¼æPKŸ?Òæ¹`¾W ¤þ‡æ—„ {¬¤ÿÓj`u$í[Û¼_ ˜¹¤SîéQÃû£t·7¬*Ú>¶Òêé³°lŒD»äñü¶0¯°°†ìuïa  ó-`_˜ ÷=+`žˆûk?>ªíqQ¨ÏôͲ"³óÈ }¯; Ö´‘åØÑ½¸æU`¾mR°™ó—øEÇaEGŸþ†¦y¸;÷‰ÐPßËVDf~ ÙeˆÜ÷šë 37è{ó.ןìÓ¹º×p:èyW·2ÕåC5“_Ü/Ì4›éŽë óëø6À|ø:æ†}Ü¿-X•ït‘ϧ:äÕöÞUéwë óf üEÖ=òï0 _îkw:¬ë)§Ÿ­‰Ì7`ƒŸ[®Üfî¨bߣ ´üAsích÷`ؽ=¡;§æ+$ooj³‰³†hˆë{6F—¡Åü¦BëwÁ^û®ujjGh–‡vÑÞè5ÇWL~ñ\è;v^Ѥû&˜Ï¶Ô(mvâp¢©Rú}x°C§<Îõ"˜ÍÝ?ö¯€y£@LœØ¤ë&˜y,f[m¤ß¦©àú}xÀÖ y—FO„ýÎVwª€y7÷1af¯&Í7Á¼u ‚¿¼©àú]0C›s`w:ÔèÚ0¿Þáý&A½z“æ›`^¢ÇL IoS—¦v1yS…ô{þC“ÛÀ¾æ*ží½XÌït|ß*&î6Ñuã²9ü; ÿ^“Â+Mþà–} ò‡Á|œÚxgͰþÂ<\e¢u˜ù]gŸ(ÛåÚO˜^i†3ôÇOù<¥qìøê ®Àé&Z7™ëX»ÙçšL ¯4ùà íí q*ãÅ5‘ùÇxØ×Dë&0ï ðw™^iò…šã ÄÏÐÞt:½f³æMÏè r˜¹sÓgbM…iûû“¸çØŽý‚7_x§} ¿¯ ㇠œ€j«›éß\1ù5#@™4Õ}#ÌÅsÂ-*±ži%”.}ÈÙyÇ=@kUÀÞ0?'@Ù®1Õ·)ÌP‰šVBéÒ†ÚÚvsMŠäÏ®€yße<ÃTߦ0 ˜VBéÒ„šâöT—ЖÉp|… ˜ PÖטêÛæTâÓJ(]Z0CKËÁæÂº~šhcŸ4ÖL~…ذcS}›Â¼Þ÷—"•‡c™VLéâ::vO€àÐî[j`þ¤çr?ÖFÇF0“`¾7ýþ|›Š(mœð–f©Ÿ ¾é†6—ÓVjeÿ–çòW.\©Óz˜?á¹"? qjâhf-'P}캂ÌëªLõ?¢8ˤv˜¦‰QÁã=ÃüˆiÙ”.>è¡®O8b·š> óÚ±ùü?:ò±&¼\öƒÛh»Md~±g˜Y©±Å6•SÚ0ÃoÜWúŽzé ñôõcoRP—CŒ½›¤é60Ïàœ-d »´;ô±ì+tb âé|ÆÖ8 N/ò\/žeÕj¤1ÌÅ$Ø{®ÐK»ˆJ×øí ‰Uaÿ ã2\Û`…Èolõ!êuçºÝØVÇma¾Òs…Žh[!¥÷rñÉEzÖ…KÀ+¿ @ý¸5‘ËûŽæÝúÕl[˜}ï²Pù劀õlík©©= îÛ< ÜLwÕ¼cþ°çºŽ>Ù¤û¶0ïã¹B•ß”6UJ¿»ƒþßö9Ï:ðñô=®¯ù?=×yV[·…yMÏjõÒ¼må•Þzø}%—3>áY>Aæ½.­ù‡ëÍÏ?—j«ÏV0“`>wó¿£m…”ÞP“¶‚¨x²Éa°û=ŠÙ7ÀåûU~¥„º?æ±þ•g\5ù« Ì>‡Œc;$6UJ¿ÛmÏl¾çQÄ!!ž¾÷ØÎ°Å¨ÄgÙ>ÚEÃ]`~·gç®Õ¥bº¦;ÐðïLØežýì–I÷Û³íà{ÿø·uÑo˜÷óìäçu©˜®i3üÊOß{ܳc™å;Mÿö2Ïíñü.úí³ïemÆgwi]ó4ôøÃó¸çymLO—eìœ3´Éßxl®ÿ^®‹.[Ã\8þa•{{—Šé³È ?n»Á£?cxºLókf²ÏðØ>·uÕnW˜}®¿=»kåt]=Ð'_3~–Ò§‰®;‚ʳÁÑF—z„ù’®ºí ³ÏíS>Óµrºnfˆ’ç ÿ-l¾Gº†ÐVþ_¨‰Ì>Ï)?®«n»ÂÌç+[ Ø”Ïw»VN×- 3|Æ…¿ðè»&߯öûù50ßå±ÍvëªÛ®0ó´_Žx kåtÝÌ<Ü—ßR¼ÏI£šA{q?o_‡@ð ø± 8Sw…™«‚|í Á .cZ!¥›øœ,˜'wfc;{@{ëyì{­xìs1£íó9b3Aj6;=© JÁ<æ]*"ó =Â|E÷ùl•|IŸJêÚ…ï’ód˜7¨€ù:?±VûÀ|¨ÇJÖ§’ºV0h•‹5–¬€™›úzþß«VûÀ¼ÇJ6ݧ!†p­†Ù¡¼§f&û<:_£ûÀÌ­G}/ò±>•ÔµŠÌ@~«f_gDWv&m´Ûæbì;dcˆò•6•RÚêÉ2E扑ù“50ßâIãWõÕm_˜Ï÷TÑŸõ­¨®_ð1…&ÀêŸϬÙ×f…½%ûÂ|„'˜Œz5åXkGVL~ñÀD#K“<öí«ñ¾0ó00“‚ÚH³zßÊýzEæ‰Z}eÌÏö¨ï±½ºÛêµ/ÌfK“½a.&Á~ê¡û•­J5Á\ ó)“_üfŸÇĘŒû¤±v“-˜}l˜Îèßúü¡‚[i´¬ÎC+`öÕV´¥Q[0sƒ¸>½“éµÙªøóQd®Õèì ˜wò¤éCliÑÌ/öTñΛÙj°”ó̵0o\óþž4ýl[š²ó O½­Š1Á\ såãÚêxšþ--Z¹˜ó1ó÷N[b>‚¹æûjæÎñó6uhæO{¨ü…6+?´¼s%Ìß®ù³ôü!›´ ó;=Tþj›•Z^‚¹æÊÅHh«›=èùp›´ ó>*ßùP-›–j^‚¹æÊeÂh«‡<èy–M-Ù„™‘™¾bêšî·6+?´¼s¥>Ç>àA;ñœê®5½Ž R¬®›°s1 vŸ‡FXehÚª¯`®tNÅk©-<èøû¶ü:m˜ÿÓC#lk»†’Ÿ`®„y‡ ˜÷ô ãÚÖm˜ßí¡^a»†’Ÿ`®„yl¯j´Óátü6Ûº³ ó~)6‚íF5?Á<såF‘h§¹tü|Û:± óá}¶a(ù æ1˜^óŽù_ë˜Gá,g[wVa.&ÁqÜ—Ùn„¡ä'˜Ç`®<\íô5Çþ± ͹€ù+Žâ 1„<ó̕ǡnw¬áK\èÍÌg:nˆy.by æ1˜+O‘@;ýɱ†s¡70¿ÎqC<‰ü—pѹç)˜Ç`>¬âµ”ÅON>åuóæŽaæ ›™¹ƒç¢~‚y æ=*`Þѱ~ÿ‚üWvâ_Û™¢ Ü;é·ŽdgÛåB~‚y æÍ+`~µcíÞáJkÖ#s1£}½Ã¹Š¢tÕ 9ç+˜ùr´ÇØÚhüÛ&°¯;Ô¯³-£]Á|¶ƒÆø1òÜ3gØ\×M0/€™8ÕÔÖHó`¿t ã›îÝõwW0¿Áb#ð|Ü£4é¥#]-hŠ»áìh Ò.;ö{ ÷žþšê¥¦÷o›ÎÌÛX¨ƒ\D‘™TéæÀê¶ôå,å±&ù 5Í@`æãÝ_7@¼8Òœ«;ððGøí%&:AºaŸ1 \¯4ɳk—0?·¡‚7áw£™E¤ã„šé—,W!mãp©kƒ¥|Ý`þ ê8q®¿s2ëZCø¸Ý®Ñq«HÇ(ÿÆ|×s©—0s8üçŠÊÝ‹;ؤRH·ìC0Îl·™Eœ‡ô/0¹ÇÒd3¿A^¾!"ï…4¶ÔÒHÿ^ØÄ!{1Oĉ߷®¸Çƒ®µæ æ¢r·”*Åg‹Ó›¼¸nI¤;ÆwÌm .§å'Às݈©äŸ)Ì<âeìDzOð;!ûXŸsÄùlýF=!Í Ø90jpZ“•ºÛÔŽk˜§wlà;¾ M Žtì=¹Ú«+Ä£×}y­nrïÜÓd3‡µÕg"Í7-ê鿗Ѩéž ûRqï÷ºÖ—k˜_ŠÌ6©Òm û¼ÅF/CÍ¡ý.&åÈ9Mf0ÿ ê³lÈÔŸ‹o8q{)l]½ ݾ0'Ÿ=.21)ŒË4¨äJ°„¹>¥žÏݧ{xõõ´0@¯äÆ}€s}-¼E_Gø¸>Ì_Ä='~p€ßgÁnÜÇ× |+ùðQŸ{D sô²hÈOGîlîá}HGø¸Ö#ÌFû¯¡<Ü£:æù‚À&.fñá;“{Ds4728+r éøÁ–3iøi<Á<÷™¸G~_veäþä[•“Cø©ë=“€¹ôꊧA¶Ýv×õ0{4nF¸UW‡¸¼ÎÌWáWBá÷auøöUÝý8Z8Ð¥/\äÌE”ææh1/$˜þræ0ë“§C˜NÁý…¹Þë­o‡À¯¶&NØõñËk“ƒ¹š§eøÞ;¬‹H.A9WpéÀ6y;‚¹ñœ/Fk£v—6ôy ë2qëÞ6íí;m’0@oˆ†çq$>Ýå^üšf[ߎ­ºŸ˜¹ú*“êÆçgؼüÄSKŸƒŸº–!Y˜  gÀ_O@(<Íã-]dë:‹0ó™râ™Çø“–ï€UQÔ¥Sty Ï”ŠvâÒÔÿIÃ\Í=’yª½KgÛÊûr”3ØûJK0óÌãY Ñxu¤á;f[íæ2Ÿ³QÎ,6uLæÒL÷ÜDÄsʹƒiok3˜¹³jÓ™Ç\ŠËe.´‘7¿Ü:Æfû†Î+˜‹(ýÆD†u¦íÛù=`69ó˜Ãjžû«Ãé· ûùn×÷Ë æè= ¨ù DŠŠ‡tÏpíäÒèeííbræñšÈ—'…؈˜®óxå ¶O—K_gsôÖpØÝ‰ˆë—(çN.Üæ‹P¶¦3yÈ8Oq ¡üùiåÄ}¸}øÁÕ=²„¹z8ŽgÙë<8ãûvWNî³É™Ç‹£Ì§Áúœyìº]Ëù_‡²ß§Ë¥³…¹š;Vð|fŸ¢és¯ÿ@YWsåpÃgfžy¼eÃl5;JžÒ§®>¯fŸ.W¾] w—™Ç7ÇýÅøÝ±Oñô¹·ÞÙEÛÀlræ1÷<çþÐ}êèóÚ÷¸hËóÌæÒ“ bÞ_¬,p~BÈýЬn7fîEÝtæ1;Ežø‘R#t®Ê4˜‹a÷k!F®ÆòúÜ‹Å[[bX³É™ÇëáÚj7në´—+hbÍwP0@ólè‡æ}(ëlª€ÙäÌã—'Ö^\°ÅZx>k“Çà`.€Þ }«šrDçBŒwÁz-;,Áüþ»éÌã%‘æý «Ù^·ÀÖm@Ni s4×ߘP„¦X¿[«« ˜MÎ<Þicß{môñ…$—švm·T®,ÌÐÜ_ŒŸñõy®õ}-W0íÑE`¸Ž¥4y¼Òðßõês?ÎÂ'±OW¿™^3h˜  ¹¦˜ÃÉ>bò}-jðàzkgI#¯¥ag'ÖœY?ÉTì¹§<Ì¥WWo…0RøH Üq\oãyl û^b '¹O—ËE0cåL hÎÜrÛ\ß‘¶Ïý83¿OW‘àÚýaó«3÷éÚ¥ks½N0—`.†ÝÛC(©|80Ý p¸yf›çF¤]öáÄ f}¹OW‡øî4óÌÐëC01Ÿ \É9;¿~“ˆfsØ™ge[[DÓÔN©ý.˜+`.€^Âùj‚‚çô•uBÄoÁ¸|³ÏÐ>ĵüö;ù}º\v‚¹æh¾Ê¹(Aá¶‚-| E`]žôµ@c1÷4¹• âžãq3} IáÚ;QGíÓådÁì¹±‹=BOq£ÓNDûtЕ`ÕèSS+è/g¡?:iŸ®PºÊm(›J} zÌö±Œ€þ ê¢}º¬È°áK3ݧ$4OÑ>]1h)•H–s9Ã!°÷ãÞbµÛúæì³ë¦ÙìzÔbbl6ÀHéôÅûQ^íÓ‰~4ÌŽÈÐÜ÷— »‚2nctr™™ãzM€ÂÑM_ùNw-ʦ}º"Ó"s„)"ôò檾eÒ>]±êfÈÃ’˜ëÎ×<°s#ZûtE ñÂ7#1 ZeãzêXXÈýÅ´OWä æDT »çèû‹qŸ®=Õ©>•ÄÜR…”˜Dè`zvsŸ®mÔöi€¬ °„¢s¡y¢ãÏ<̓صOWjúPÏ›NÏ[½*@»Þ!Ð_DÞÚ§+1™tXôÒî2@_€<µOWªºPdN+2—>ÐàþbgXšûtý´¦4›hï;  <Ög1îÓõ:œ6ÈfçôKäï:DiîÓõ"œ>È‚9˜‹çèçÌ{[Í}º6Èy€,˜3‚¹z=z«Ð7!Í9sf0@¯P¯™4÷éZV ç²`Îæhî/ö‘  Ï¿-&óY0g séõÕÉ€—¯¸O×Q‚8Oˆõj*sK@÷Èyƒ¬È< rþ fÁ¬¯æ2Ò€œ™‘3‡ëü,˜³4‰äÈL©¨<쨬gf¬Î<# È™9SÑyØÑY0 fi  È‘™8RQyØQYÏÌYyF33r¦¢ó°£³`ÌÒ@&#3q¤¢ò°£²ž™²:óŒ4 gfäLEçaGgÁ,˜¥L4 GfâHEåaGe=3 duæi@ÎÌÈ™ŠÎÎ΂Y0K™h@ŽÌÄ‘ŠÊÃŽÊzfÈêÌ3Ò€œ™‘3‡³`–2Ñ€™‰#•‡•õÌ,Õ™g¤93#g*:;: fÁ, d¢92G**;*ë™Y «3ÏHrfFÎTtvtÌ‚YÈDrd&ŽTTvTÖ3³@Vgž‘äÌŒœ©è<ìè,˜³4‰äÈL©¨<쨬gf¬Î<# È™9SÑyØÑY0 fi  È‘™8RQyØQYÏÌYyF33r¦¢ó°£³`ÌÒ@&#3q¤¢ò°£²ž™²:óŒ4 gfäLEçaGgÁ,˜¥L4 GfâHEåaGe=3 duæi@ÎÌÈ™ŠÎÎ΂Y0K™h@ŽÌÄ‘ŠÊÃŽÊzfÈêÌ3Ò€œ™‘3‡³`–2Ñ€™‰#•‡•õÌ,Õ™g¤93#g*:;: fÁ, d¢92G**;*ë™Y «3ÏHrfFÎTtvtÌ‚YÈDrd&ŽTTvTÖ3³@Vgž‘äÌŒœ©è<ìè,˜³4‰äÈL©¨<쨬gf¬Î<# È™9SÑyØÑY0 fi  È‘™8RQyØQYÏÌYyF33r¦¢ó°£³`ÌÒ@&#3q¤¢ò°£²ž™²:óŒ4 gfäLEçaGgÁ,˜¥L4 GfâHEåaGe=3 duæi@ÎÌÈ™ŠÎÎ΂Y0K™h@ŽÌÄ‘ŠÊÃŽÊzfÈêÌ3Ò€œ™‘3‡³`–2Ñ€™‰#•‡•?3OMMm »8#[ÃÔwÓ:æ7Ç4¿ÒkXç ¨KmojRï>iœFf8cØSÙF&ú>£zæ7×4¿Ò=`XçY ÔÅÈÇE=^`Rï>i³!t…Cs»öª»`vôh'˜Û‰S0·k/ÁüL{)2G6ÔÌ‚¹ÍкœV0 fêaJÏÌý;‘®ÚºN0 fÁ™ºÂ-˜#s¤†Ùý#¤&À[0–‘­hòêõå;R£zæÇ×4Fù%îÃ:¯–@]ÚøäY&õî“ÆélvŸ‚éZ­h’Úi@0;òHˆí„¨öêß^‚Y0K™h@ŽÌÄ‘Šlý#[êm(˜³4‰äÈL™zTQùû,³`–2Ñ€SGâ=á’°‘ÛJ¶£ê»”iMî¼–5Í/`ºåLêbšõX"`]L5»²i}|¤s s ß3ßj»¡!Â9¦+×LîÈÚì MêbšuæB™®K'}]g´šÍ´Î}Ó æ©)ÁlÁx¸.˜³­(&˜sð¡”"³"s×MÃìÈž…³`ÌMì€V`  4µ!×XðÑ[ìŠÌŠÌψS0W/–ÐlvûE$®'ÀvS~¹}Ψ6iPß=Lël’/ò:Ú4¿€éæšÔÅ4 ê±eÀº˜jö›¦õñ‘Î)Ì>* {´ïÁÕfy¶™`ü:A`å V¿ fÁ, d¢92G†ˆºg\£ Á,˜¥L4 GfâHEɸ¢dfÁ, d¢92G†ˆºg\£§0ã¥ÿV° 켜„úngPçíbRo¤Û×0¿ãMòK! ê;Ó°Î&úŠ!ÍÆ®ÛÝ5̦k³Ÿp]QŸùÜœà:Ÿõty¯D–s¶ù@c0gM æ ÃýZf;_€µÔ4­`vÙû»Ê[‘¹ÿ³¤"sû6Ô0ÛÁ˜`n/ÄÑŽU0·oCÁ,˜j ëèG0 æ(„©ÈÜ^ˆŠÌÚ¬kÏirD­Ùl¿;hL`ý{…*¸ófÅLì܆¿ÿÞ¤sH%Mña}SünR'¤Ûݰ3É/…4¨ïÚ†u6jçòšéºÝ£–º®¤òwÓY«]ãjWÁì`L"KäCñ‡`ÌÒ@&#3qäP¢êY?êÌ‚YÈDrd&ŽTÄÒsº`ÌÒ@&#3q¤"³"³`ÌÒ@&#3q¤"³"³`ÌÒ@&#3q¤"³"³`ÌÒ@&#3q¤"³"³`ÌÒ@&#3q¤"³"³`ÌÒ@&#3q¤"³"³`ÌÒ@&#3q¤"³"³`ÌÒ@&#3q¤"³"³`ÌÒ@&#3q¤"³"³`ÌÒ@&#3q¤"³"³`ÌÒ@&#3q¤ëÈŒ³š^»vìe®ï§üÛ4³`nÔà]öì©Â~-ØÚÃæºÍéºÊ?>QÔœèy@þKa—ßâó›`Vd6Ö@^¶º@ŽdúÄØ‘r`œ”_ä—i fEfi  xs$†gKÀö€8bûãÿ×ða*Ê1Z®ÙH³˜ïr-ìe§¦ÖÅý_WQÎ]}— ÷[j´¾Ú%?­Ÿ|8•}3ì×¥ÙÐéYÑé¿ÿŒß>[ÞGy<_<33;Z–òÿßtù*SQ®5pÏ/ÁþgBïÂoûû*î5c´,ï=É?Ó¿…ðç¾Øà§y쌼µ•ë¡2/€=iÏù®ËSŠ|&"aš?¶ôX®Ï¶Õî¯|”+˜é§?Á¶ñÑE§{¥¡Ÿ¼éÇù0>g¤Ò÷àÿo-YªùQ¾/;›r™î)óI>Ê…{.;rßÑrŽn|•+–Èü¿ ~š;h?¹®|̇•ï9"ÞP0?0R¦ã"y´\'*W,0/¢´Å¨ŸBÁ‡Ÿó‚UM‚yÂŒnDÃlÁ<ÉO‚Y07i@0/ú.»âqH‘¹bVYÃìEgÙãI<³ÙŠÌŠÌã«„Fž=5ÌÖ0Ûx2X‘ù™ˆ£ °p¢‰"ó" G맦祾¿k6Û|íp´"Ì‚¹x&}ϬȬÈÜfH[»A¯¦F&æúFަ뙙›42é÷Ië³`^4Öª“Ñ¢‘Òh*ÚÇ¡>½¦ÉµŠÌ­ ]ΩWS‹¾ªÓ«)½šÒ«)“Ž·.hÑÈôpV`†¿G;|Ól¶f³5›m>Ä.ÚJÃ쑎O`æ2~EÐu˜¦gæÎÿRÏÌzf6fÔ8¡`6‡²G[)2+2wf²ó…¦‚Ud6ïôÌÜ8Q©ÙlÍf7ŠDZèC ãÀm§ka»¦SdVdOdµ,ü 0np6¿dåµ·öq|›kµ¬U'£`“W€ñØž²¦¹¹`Y×'´Ñf×´ÆC‹Î7ßÐoÒ®˜§v½OÛë³`n«™éôÃìIš~é×éz¯6×ÅóoPáÀ–lSø>i³`0ß„´»w½OÛëBÀ|**8kļm~_ê]˽©&À4fÌBÌThz³¶0öMo\®7jšëšoßë™™»j¨i6»k¾}¯ÌOOT(2+2³ ˜köëÛu½^‘Y‘¹‡v&®ÔëšoßëŒ{£®7Ò0»4ZΙÁrή¬ô½N0k˜Ý¨tÈzÏÜb§‘¾Pv½¾Ñ‘]3.ÍŸ32¤å1˜gN[ßü»^ŸÈ0›'=.l+ü÷u#åÚÁq±®ÍõÓ>]uÙç:0ÿõˆyÁÞ§ð}®æÅQ®_Lj/ÁüÌc Ú⸑ö˜ÛG¦×âžM~:Ó4/›é|À¼*σÔ+WÉØ¬L›¼b„™åÇžgÍUC&çG+2/ÚN^`6ðSž0—†Û;A À..[m¦)ǹå¼ñÛKG~…Í{7å…{¯;f´­ðÿß™—å·‘ûžßà§9Mmków”írd…Ÿ^kó>¦y9̦QºæYoˆ&ÈùÌòM³obh#Ál¸Ù^ÎÌÒkÈÍ b€ —2(2§!CéM="³4&urdBŽTdVdÌ ;ÑYzfVðÑ3sš=:"ñZ°'JöäÈ«©w„z>Ó}ãÓ”zºˆ£6À]{Â⑇ñÛš‚*>¨BùD0§ óµùE¡D£ûÆÙæ¸a^Ðn9b3Sœ0…öËÿûì’ëÐ~ÇsIEND®B`‚fifengine-0.4.2/doc/logo/FIFE_small_a2.png000066400000000000000000001002031341615052600201440ustar00rootroot00000000000000‰PNG  IHDRþÖW4¾sRGB®ÎégAMA± üa pHYsÃÃÇo¨dtEXtSoftwarePaint.NET v3.5.100ôr¡òIDATx^í]´Ŷ}A@TrÎ" ((¨H ŠŠ¢ˆÐ'"Š€‚"¢d”œs’Œ˜É ˆŠŠ9`ÎÙ—óûõ÷®®ê©™éI÷Nîr­³ïÜ™žª³ëœÚ'ýFñ+v ¬øK,èíÁguÀ‡:`7݇›n­»¿¬»×~[à[à[ð¡ØM÷á¦[‹o-¾¾¾Õê€ÝtnºµøÖâ[à[à[ð¡ØM÷á¦[‹o-¾¾¾Õê€ÝtŸlú“oüRÒÒÝËâãÿ„œc½xøy |¹¤ dä/™øß©Ÿßc! í!¿‡€~ž€ý=¤=d!äf^K,à›¯}Kyuì!_‡€~àü-¤5d&D[nÀ¾ù{/ã½ï‚T·‡@îø9 |€ðlÈ$Èç–=ÙÀ×ï÷ø¬ýþ öÈÍCÀ?Ç€°yòa`O†Å÷:Hþ‹gعRÚ¹sXàçðªÚ{!o쩾ù¾ÿ³=é 9ÑÙ}Xàg)ðžª;!‡“ötßüŒ¿á™×B.‡³‡@öøY|€¤<ä6È^Èÿ’ ø‚°ú‘x‚Dþÿñ=–B.†gì8,ð3 |€¡$äFÈ6ÈRöt[üHÃø~s!çC~gÌø>”þÈÕ-¦ìÙ|ó9¾Â÷~ÒÌé?,ðÓ|(xQH7ÈÈ_Ó öl¾ùLc=ÆAΰ‡@z üŠÌ,ºÅ_3öl¾ù|ï`î‡Ô³‡@ê ü$ Ë,ºó ³!ßg Øs øæ³¾Šõ ©iäøI>”³)d äË,{®ßÌ|ë:RÉ…?,ð |(aC+ÙXÑ–Hˆ+“¯M¤H'“Ïé³™-¸ÒRÆ;,ð>”­„µë¬\ËF`Äz¦\~h¶àS؇^“ì!ÿ!`ð¡TÕ!¬Lc…Z,`eûÏó øæZÿ{³räx{D?,ð#ÊS 4V¢±"-Ûïóå+ðÍïÿ'ì× H'H{„øð¡$¥ ¬4cÅï’ñ‚)—^çà›ûñöq>¤Äf *}÷=ð¡ 'BXQÆÊ2V˜åˆ ò¬~¾¹Fß`§CZøÝ ð%ð±ñÅ —AXAÆJ²‚(WÇÏÀ7÷ìSìûH?¾>6ø8+Ä–BX1–«À-ìs[à‡ïý{ЇÑú~9òøØHfѱläƒ=×x {Ø%òû¯CO†CNÎçC /M;ÂÊ/V€%²é~xí„âÕG— ƒ<éùÖ)V“N?¬Mèw<„u¹R%ß¼>6ç È#VzùQIc~ç9O}$Îíºäõâ5Çü " ù¨ßè^÷âw1ßçk˦(»!·BÊåÃ!ÓÀÇ&Ô…Œ‚°¢Ë*­Çl=ú³½ð5ѬÛRqÂÉc£J¹Ó&ˆ+nß*æ?û‰]ËÈúôoèÚ3Þ¹zäð±Ø5 ¬Ø:bÁù°[ ë}ÛØ=âä3Ä µ–S'„ŠñšOyX´ºr…»ì¨ØzÔ¨QôìøÙ&ÈUâ¹täð±¨!·C@ò)‹.é–u¬õå°ÚeN'Ô&'Ö'"‰×ëëž?G œ°_lxéû¤?kžÜQÆQeY–õÙ‚Y |,^H+±ò5‹.)`¢U»ì ѪÇ*qR½ñâDW&àï†œŠ¿Çóõú}êŽΜ*®òŒX´ãó¤tM8ºl„£Ì~Ÿž@V‹tä:È“?dÑ Dëa…N< êµgz¢8±¾)“ðoHƒ`9óŠ•âÊÑ»Då3ƒÆ×º¢ÞçTü)e‚8 ïÝöºµbüª· õìy|sm-áh3Ž8ûm¶>ƒYtÝ!ë ~Ë¢+x=ÿ™èq׳¢ÂY)› ž,N:ÍCNŸ"Jù¨h?è)1aïWbÃÿ“²æ«‰ÁËß§w[.NÂk¤xü~ÐÁ!†‰¢ÁE ÄS‰¯üP ïá#ðëõá¨3Ž<;;Ó@F€/Î,:VN-‡°’Ê*Nk0V¶ ¬-I TƒVþ9UœÔ0 UZÍ׌Û/æ¼õG±æ›ÿD”1Û?çß¶U”<ãÑ ß—ïg¾¿q0ð9*5.®¶],Ýý¥ÝÇ8öQé;G qÚé™8Ò||A&‰\™aÅ”U’8Ö`ÃË?ˆÁ°ªõ/Zº¡î“¬ZÜ3§]¾J Xò¦Xòñ?ÄŠ/þ·L{õgÑ}Ì>Q©Õ\¼ñ¾úýõ皃’ §ˆ oÚ &­{×îm{k`€£Ñ8"í”t)>¾LsÈc¯-Øã?ì–ìúB\;|;¬éŒ€µÕ€ 8A^âLÊ4QªÉtѦÿ“bä3ŸŠ%Ÿþ³P2ïý¿Š~ó_õº¬ïíÈcòP‘å hÔi‰¸{úKbÓ‘í!Ø!ðp2R-•‡@J€‡n ùÄ‚=~°s­&­}WZÍ’è^+w=èä%ˆ§K©tÞ<ÑíÁ½bâáÅücOº Ýü‘hÑï Qò¬ê3õA0-ÊA0ETm1Kô¹C,¯`u!!]`¶ G©q¤ZùdI>îTÈwí'´ÁÒ*Þ=ý°h+ö€5w«^¢ Öë¶RÜ8û51í?‹Ùïý-å2vßw¢ÓÈÝ¢BëyÎ3ÈgqíyÊK)…+CÇ~›Å£ß·@b׋£ÕžƒÜ)•ŒC PÀÇCÔ„ ƒ¼fÁžع^Ëö|%®¿o‡´Š’Œs-» v,ôgÍ%Ï™%šõÛ*î\LLë/‘ɯü*®{ìQ»3®gÏ”‡{H/Äñ¼Æ]—‹á³_[^ûɉ¹¶r ä„‚ V2rb³èß81uÃû¢¬_)Þ“5à{º´ž†U—À‚Tl³@\|ïnqÿÎoÄÔ£ÎyýÏ¢ÿª÷ÅÙ7m‘’sèƒ@yæ!`ðÕm¸é]bÕ¯íP=þ8ŠíqG³Mäˆ øxÓ²~ToÎëÍßüêObج—Eã®Ë¡2‚@žwuu_×–]`ªÝy¥¸zê+âáƒ?‰‰Gþ˜µ2ü™/Ä…CwŠò­æE>L‚ß_™Æ‰N·=!¦?q,¯u Å^ñ¯xÿ%Ž˜Ù‚_.¹ò4„IvS °+÷-n¼—¨Þj¶‡;¯ÁËHW™–€'ØK6-šÜ¸Eô[ö®xøÅ_ÄÇsGØû½¸|ü‹¢æ%Ëïbzšõèù Lyöå+ÄÈù¯Úk@tÍÀ(›Îp„[ˆg¶`4à¿nÁ^ðÃnÚ–E§[·ˆÒÈ– "ì\ ¯Üy^ƒ)ßz¾h{×1xËgâÁ~Êi}àGqÃü7E£ë6ɃÌû*`pÊàP³õÑw̱æ…o­Á)Ü!0Üë  ø+-ð>ɪ{çgu[á$Û0Ñ&èîÎ;q¶´Ž]>$†=÷µ÷Ǽ“ë>­='ʶÔ×ͨÈ@ lãGE—[Ŭ'?²@Á€Î‰ŸIv±ãXƒÕ/|#ú<¸[Ô ;ðÊ¥7Üù†×n×Î~CŒØù½±+ÿeÈÓ_‰‹GÕ:, ¹D?¸®ç¢°è4as«›qcÓ³mX4‹ÏôZ»ÀQÖ`æÖc¢3H©ÒH¶9±A$ +O†Þpé˶š/ZܾMô[õ¡ºý[_ÊÝÛ¾W=öª¨ßcôx×€Ààfªû¿®Q8ù¼9âïkÙVa10ú]$¦?ðKÙp]øÁ÷Äë?‹û¼*š^¶Ü©ŒÓÅ2¡n=]×ÀW½h©h?r¿è¿és1ø™o¬¨5è½ø=qέO‹2Íç‚ïÀ€$'I@•äy B°ìSÅåŸsŸùØ(oõlÂÀç/øY«ï€ÿñƒßŠ[Ú#jµšåÔ¾kÐG½Ç“¥Ÿ%N½rè6éˆðÄ—âö­_Y‰°ýÿD´¶GTn·ØH ÒÉ@ª6 ÄúË}@ó–W®c–¼n[…øüü9O,ºõß‚VV¨AgG6¤€µñ¼ËV¾t³9⬾O‰kæ½-þ°ù + ¬Á­?9,N¹lsD²þª±î°mì^QPà³TÐwnÉ£½&š_¾L6¥¤BÉV}¨kt'ÇÉŸ¯Ôv‘h}×.Ñ{ù1ÑwýçV ¹WÌ@8ð†-¢TS\dM€J6BòîÏæ ?gö,‡ƒúŠAOŠÛ|Ý1¸vAÏ‘S¾>ûÊ÷x¨­;ÓB\ÐÝçU^½ŽÉC!OîºJ´}Hô^õ‰¸aͧV’¼×,z_4´ÅAó»¿j¢ºÉ.A<œøå¡ŽÁ­Ñ1øaÿu þ%Z oÔ”]€žÝmóøóaºxB”k0Áé;ÏVÓôQîó¥Îž!NGrJç)¯‰ëV|l% kÐsé1Ñö¾ý¢ÆÅËE@´þaà§ë.Ãl#ÎýľÖm=S ¿Ï/ƒwøŠàËË1T²3-È VÝ1hSeN¨õPЇêÊ·œ+ξm›¸|ö»âê¥YÉÐtDœzõéÈÊFö/0ïý¼ž…€ŸÓƒÊ7/z Ú*£wa¶É…>;ÞæÍ±?üíìu›O˜'Š×x0 èƒI¼j–ˆV÷ìÝç ®Xø¡•,YƒÎÓÞgöyJ”=W•7‡÷~mùkuF‡UǾCÚ\¹LŒ_ñFÞè·Õë ü1ùüEÛ?W Ø,ÊÖÁÆW}@¯æ€¾xÍH–Þ} $çÔéþ¸¸àÁâÛÜ÷­dñt™õ®8wðNQå‚…Òõ—w~î#WãþâÕÇW¹_œÚršgÕåÔ)ÈSûŽGv‹zM§ˆã+Ü+ޝxŸ=Oö€¥÷}E°ÆMúoí§¼%:<öŽ•_ƒóÇ‚è¹IÎ!YóÎo‚^ õãøJ#¥¾œPé>qÁKŤÕoæ”î+¬¾«)G¼8~Ìð/Á)}Í€M¢\­D±rÃE±òôØL z¸ø¸×ñ¤?w=Éöâîw˜{²ÄM‡îíx+ù·m'ú=+Ê7ŸíÌäŸÞÁ_ƒw~\ý$øa þ ÷AFˆbe‡‹ÓšMwMÜ—Kƒg& øÏg3ð'®8*Úv[(Ž/s(FÁfqÓ¤¥ç&ô¼×» Ç½ /yúdQçÊõ¢ùý/‹6Þ´â“5hrÇQõÂ%Îà‚¼®‚Ò;”à¿„à&Š•¾GT€A¹nб|÷ÙîÜœ,àOÈ6àoÂØ¦!ãv‹úgMEKÜ%Š–º[nŽÜ$l–tñ¹yò^OГÌsÂveÏž.êßð”h>æUÑòá£V|ºç ?$juEZ0<>yß'Ù ðK—Ÿà‡á ×(½Ç2ÿPQ´äÝ¢xé»Å…—/SÏÚù“ü«³øËv~.®í¿Q”«r¯(zâ¢èICäfpSäæ`“<ïõØX6«<í¶¢éƒ¯Y±kàêÀÙ£^uz¢[ªý¤W¨˜~}ß×.?½É¢¥~è]‘‹ÓÏ™$†MÚ'¶¼š5ƒCØ…7æ˜îxïøõ2 ü)«ßíºÌÇŸ8X9þ¹èôÒÚô!.>ZžÜ'Ö+ª]²R4r@4¹ÿU+v ¢ê@½>ωò-æ„Ü÷ƒ]~©w0y_&9€I¾JÝÝ—)«ß¤Åd¹¨EŠ TÖ>²‹_÷÷Z×?-êßó’»…ÖzwU»<.NªóˆËòÓи.ÿ‰ŽË_äx¤¢¥ºë‘]™þmÉþ´L¿Ãå å¢ÊÅ¥‹Åv]|i퇋±1µúîu†¶b× %:På² Ù§X~éòóº)]þ€Õ·äÕL¿Y²C¦€mÿ ÊÅ¿#„Ð fñK K«j¯gE­A`k­Ø5H– <(*\²¹ý£ –?œè“Ü ÔÂg3Öø¿ÀèñÉ~£LÿŽ1;"zA‰:Nv^©óD•>»Dµ/X±kP(¨xÕVqø"7«ÏHìq\~“èƒaø7gn4ø[ñ€>nrOÝñàÿ#à»àéJE&ôŒD•Ç2­•û¤¹u¿» é@Åë·Ë! AY}A‰=^Dß`Q±úÈLºùË“|þ—2ü¹[? „ïx¯’á»ð˜}h¢ÁÏåºm•úîµb× ¦T¼i—(Ý-טÓ’Õç$ö8¹ünl?ÄêŸÞtR&?8UÀŸ› ೆ>ÜÚeNCÑEuäWë´\Z{³ÔVöËCû,g”#—¿ »5!½×Ìè#Ñ×¶Ë‚L¿Mª€k&€ÏÏ,Wí>³7­}Íö‹D«^ÕÚ- ¤åš8lŸ¥;ã²I&j´K_°LT¸n›¨xÃ+v ¤”¿â †9î=ªco ~Ÿ…³oŸªß—E<Úê£Æ£ZÇåâ\tП7æH ˆÇÈã¿mÔs™þ‡ñ‚>!rOÝñ‹øÿÉø[_:/ìnOW¿ý£o‹¶“Þ­±ÍǾ.êö~J”l8Åi–Éúkl¢Û›[âLÌ£g+lLk)Õr¾¼ÿWèù¬?­Á5ψ2W‹Ý%G›é–ÝjX‡Ó­×éÓO«Ï‹ïÍBÆqoˆó'¾)šßsÀó®?jÖ‹™þÚ”_ÿh&€ùÍkUjn äöÜï;N{G\8åm¹­9*šasšÜ÷²¨Þ ÷µÓ°ÊÅ—SkÙ›C/ä;g}Éfs¥û_®ûQ¾ÇSVò| Êv^/JµZ(]{w^ûõ»V_5ì„Á(…ÿÊÏŠ³xUœ;æ5YÅyÞ„7Ä“ßg¡YKP鮲úÓ6¼›)àK5ð—føýîÝæâèê;UrÛ~Âkâ¢Gß‘›A¬6‡Õw,Èi0ø€¨pá2§ûª´öjžžVËÍo>OZ~*­ï{å¯Üj%ÏÖ Üe›pÀ/Ç>/@žÇ|yà—lªÀ/­>:õÂ0Ð@Ð+¬Ú}£h8ü%ÑxÔqÎh W7ÙÖ¾- Ì…Sß {o1Jw†¼ë¯ÞÿU¦€ß!ÕÀ” à˜vÐI• i°qþȃââéïŠöØ n ]1ºdg~Uœ9òˆ8}øËâä>Ï‹ÒØpÇÅŸáŒgVÖžJ •¡õ"QºÍbiýË^ºV”»|³•|Xžzéó—ˆRç-Æ>/ÄA¿@øÒêCÜ1]0 å;®uzCý9[Zû×EKx“ä’È)±%Û©—¯1ºõ8<%*ß—)ÐósË¥ø­3ü)hzÜNËi°Ñ|ðÙ“›¡‰>ºdtÍ΂Õ?ã¾WÄiÃ^õ¿^åê­ØpœôËlZ{*”‚ÊAà—¹p¹(Óaµ(·°\WÔþ[ÉÉ5(Ûi-’¸V".¿$ÞRìÿ¢`«¯\þ2Øû}vŠzw  /¬è¤×Hï±ÅØ£’C"—DCCS ¥Ð¸~íÆ2üÏ}Â䞺ãŸàÿ/Ýà_¾ë‹àÎ:ª‡ÞY}Ÿ]f¿'7㢢.]µ†#^‘UZu†¼(j8 ÊwÙà¸øÚÚC¤µ§r@IÊ´_!³þh)¨›VŸž^Åkž’u ÔúC_‚¾¬=9#rG䤵§Ôi滈(ÍtjöU§–ížÛqn¦€¿%åÀWà?ÝÀç ËàJ鎹²M6Š&Në±Vöº¿tÖ{žD]µ3ïs\þzwµ¿(j è‚‰ÔÅU^!½ÃƸÛKBÏß‘Ðc‰×ÊÎÜádó©Î¼Êê÷¾û©L¿Kº€O&€Vû9N®´ÛŒ¨Új¶¸rчâ²yÈ“Ø$úÈÂj¢›I«*\¹Sî„Ë×®j€Å+•úì–l¾tï]kÐKkOÐop” d_WîòMÒ[\€•Œ®‰X‰A8¶Üe dq8—ÃUN[}zmÚê—Áß+\»MTR…[Õ°ÿ´öÔ‡Saí©gÀ;tÂw ôŒð#G4,]f¿/:"’Ä L¡ýù† w&pϬš.à·ÏÄìpí*£k®Ó¿L£É¢Ç’c°úŠ®pù½‰¾×ƒ‰>XýÚƒ‰8íyêW¾eÀ¿GTìý¼tÿè"¬=Ae‚RQ¹d¨¯Ç“‚Y_ü¥|é-XIëÈÐ+ö¢ÂÕȽ¸êIu ü´úðÌ´Õ§Ë)òZZyî3÷»ÊmäþŸ = Ho^aXøn’¾£µçu’×Ê F½èÇïvå)Á(î àâ»DA_ rOÝñËfà Škï|20C»Äüó«(®ZtL\Ža–$ú¤Ë¯ˆ>Þσõ"úHè°f_Z}XJ7ï–¹ÛÌäÓÊ#}*Óå=- ”ŒÊVÙ_¼&0í·,,L)Ƀ8²’Ò5 ùÊ}`½…̸Dá•L¼â,½±`«ÏÄ,™–}ãN¹¿ÒÚã°ç¾sÿ¥µ‡+|׉Ö×IêXKD’X¹T¼wþ³gøÛÒ|þÏÒ þAãö¹ùzÎeÓߣª9Á¶ÛÜDNj3£Ï$úèÚqÓIôU¹ à¿àï»GZZ~* AÖ^%ö@ɨlRé˜ëºíŠ7<¿?÷Œ[IÁŒÃuKW©ýqÀÞ—´ú¿tù7‰òØ3îSÅ^ÜŸ޵ÇþrŸ¹ßÜwIèEßÑ`˜á»Î´ö¸NRÇI’9ür O 7g=¤ø¼GÒ üÍéþ’c½<‡õÒÈ¥¾dìaqíòEÅtù¢'tÜDŸrù]«ë@@ó>(-ÊŽ5q¬=AOk¯ |¨„´&ʤ@·_æ XIʔ턂*m±y0ü÷ˆ‡³Ü#íaØ€{ƒ÷!¡« ½DÂw$©[ô,k_²Ô½§Ýý†mgg øµÓ üKÓ üu‡¿SÓn¡—¨Âk~Û3â†ÕŸJ«u(ÑRÆÍèC"ÙÚ Œ>ƒè#áã}J¹¤bi‹Â;$\~×…ÔÖ„ŠÒH³Å|† kô? *vY' ‚X h%¾5àYåÚ§¥;.9IÀ*†–[ÌÆ•L¯’Áa-ïõø¹<”¡WÐðIc’Ç$‘©cUZbð&‡nî~Û«Wdø¿ô&÷Ô¿JºÏÏ+_¼3íV¹ù,<óº â¦Ç?ׯúDô\ö‘Aô©Ø>ˆ>&`D&úK¢Ç‹ès\~Z}Þ#ÕwMº”ü™ãâCµµ'q«B¥e|˜×­€Õ/Ñ'•̃èã½^³Ç’9fȉ=p·”Àçý‘®$~ŸÊJ¥%yÄPÓ@™V§ÏvQ¦9:½°DØJÐTê¸BÔG5%óäI¼òþÍPÝr×ê«èKÅvð ñM!á'­=e‡QÖW„¡—XøŽùøføŽ„=IZûž‹ßWµúQÛ4D“‘!S2ügÒ üÖW._5Û¨zÞ\qËÆ/ÄÍk?½WDô‘”ÑD_;–Ú,Ý Ëès‰>ÆöËâÞ%Iô‘=†»/Ù~&Рɇi¢t-u˜ˆÊJ¥¥òR‰©ÌÌÿfrù…Ú=Ñê ¥Ÿ²AˆÏ¥|«yâ´»düü ÄÑVcÙvmõo—ÉV°ø´êÄ*„ZURå kŸ@øŽ„^hõ¾c¨˜ž$­ýåÓ^ð'ºM:œ°ÞCb䜗3añ¯ËðN7ð/»m³áæ£Ë:¥”B;­?lþBZýÿÔ úŽ…gôi¢OÇöÑG«¬3úèJB) ÑǸ>{d¢ˆÌ G5¼€ª}w»ña*/•Xf„©ä2ÇÌ?gäK¢f—Õ²Cìöâ3)Õø1Qÿ¦§E3TQ’p%ïÂ2XÄôŽ[çT$&Zñ ­Ô ùL¡fý„L£†µgØŽaVma^Eá;¾hõ]´ð=Hz’ä‘.~è³gèåè¶æ‚úØÆ÷2üÓ2ü+Ò ü¾÷;É$WèæKÀ ËNß5‹[7}!ú¬ûLntùÑÇl+™ÑçEôˆné®$úÛ‡…‰‹ècŠ(sÃeJ E%X¥+·ˆS½ •—JÆüo*5•›J.- ÒAihŠN•Λç(‘„íÐN¹bhõÐk¨zs’«H¸²BZ}ȘV¿æ-»¥G%S©™Q©Ó¨™Mɤ*™IIB/røŽDkhõ ßá3ã ßõ\ö±äÈ#µºKöpä÷¬X¹/í 8þ ìý.SÀ?9ÝÀ>ó°s¿×tUO½ëæ½%nÛò¥è·ásq\~—èCÜÕÉè 'úXgMë\ºk} êÌŒ¾`¢.?­>]~§(DVƒ©úï2È0«qý³âôa/Ieæg8Mœn.Tz6v`’[‡5€ûÿ™SC-O¥ú…‹Äy–Q&VÑÊÒÅf=÷9ò$­ñ©VY¹;R¢ÙeÒ(ŠrÓ¨Y;¡ ½‡ïHèIkþˆF¥Ùž–†ÆìÉWªÞ8±õè/é¶ø úB±úúCü_Ò þÉkß1€h¦yù¤—Åí[¿€Õ×D_¯•±ˆ¾7ä‰/3útl_eôѽŒLôMVi¢.ÑÇrPºü¬‡¢ÊúoÔ~—ï°RÔ»m·[æ©­=•^×x3½˜dÒž%öڄɬ;é y"åÏ~L´ºG¦R³a É3VPòà£×CÎ…V_æX _bÍ^O¹yÿ² ÅSºDZVJjBOåê'¾Óí´<ªï.…g¾ëMkcB£Ò¨çzrÐ=ÿ”–3Ò z~ÞÌLW:¿ 9ßqóÙ/¿ãȽbÐS_‹þ°úÞDŠxÑ'»õD"úàš»¥»ñ}Œík¢O»üPTÝõEÖ~#·J—µ¢ñ°e7¶£Ò3ÄÈ>AÁ">ãÅ“^u.Yâ$+å°”¬û°8»ßSò;ÑãâuËi˜âäV´ßÂ.hõëß¶S”CØ“kævCBÉ´ìÀû=û"ÈÚ‰á;“Ћ3|'÷º`Vß…†ïn„µ§1áU²v§åNÿ}ãžîeK3ü>™þätÿ‰×'q:Žq¿'ð[|VÜùÌ7âö'¿·mþ2˜è#Ë8lXé®ÑGö]}2¶o}Ìcº¨NUÙb^DŸ¬ñW]_d³vûÁ0ÏSzn-q¿e@*¿´öÓ:o‚ƒùàL!“|у‡D•¦Óœ./9$l’rZ÷Uâ²Yo‹+ #ȳ°lš½mõéõœ3ì¨Üi•ꈴÐí†ÄÎ9ÁÖ>…á;쮾3Ãw½Á1Zt ¬=¯’•ZÍUÀÜó;õݘ à7É4ð¯K'ðùY5›OWÀ» ·‹ÀorýFq×¶oÅO-<ñ•'ÑçñÄIôén="úèò£¶Ÿ-Ÿd¯7Tí¡¡§nðX¦å<ÑèÛE{Õʉ`E x6imðœÌ“!$Ü/Û ~N”®3VpÈv©Õz–è6ùURåý˜¹í\wº¬¡ +-­>¼œó~MÔî±ý‘Ö,»£¸G[{Ù„ž¶öªŠWøÎÍ Œ¯úNzfóÌHá;F‰hí5à—@‰ú¸ç½GlO7ðÿÉ4ð¤øgwYâŒÆÒÃ2 S·ë qÏó߉;ŸýF ¤Õ#ú>–JÑGrÉéÑçtëÑ $%úœ¯ŽË/Û:«A•Û--ï=èX{€‚à HøœšT"IIWóúåÇÄÙ×®'p`#[9g™”¯ÿˆèxß^yfT…1o'…Úñ¶XàâZ}Xü3nA1S3§½5×DzDðŒt§ciíIè%)|ÇpªÙ<Ó ßévZFõ¾»„¯Ž¼BöYy̸c|C¦L7ðôÉ"÷~à3´¶/ßá&,政r›ùbøÎïÅÝÏ}+Óå7ˆ>G}´¦t§Ý}né®ѧcûšè“±ýàÒ]Kñ}Úåw‡9``{¹×î¶FtĽ޹[2Kì# ‚‡ "˜hu¨€½æ½-Nm?=Ü118 ä¤Ê÷ŠÖ·lýÖ*Ýa2ß´’L¤"~ ¼VMj«ßr8 ˜Ú Õ9‡Xp¾îvÌç´öºZ\á;'_VîÕwÉ ß‘ÐãÕ‘úÔsö›ðßÃËßH›î+œ-Ì8ðUêî é~Ï¡Ûð3ñ˜?|ÇwâÈmßD&út‰>tK5‰>ÆÖõ0ZfÜÅGô!Wwñ úÈLS¡ukgéò³Ÿ; w8¾ Ã>JÂ…<óæ­¢û¼÷]kO6™ "˜*én>ñ¥ôh®œð¢¨|ú8Q´Ä]™‘’w‰3».ýV}(yZD’_ ïÄ ¹V.ÿ%“^'_ºÂl"§ôlsNkÏ&´öº½y:Âw’Ð 4ÏÔÕwN>~ |ÇïÄ5'qÜmüa9{Q¦[ß¼g?I7ðûg ðg¦øƒ&pwxßr¦ä<&îØü™±ë{1tû·’è“.¿"únÒ}^DŸnËÍ}FFŸ&ú˜z™è3Šxt#Ñ'cû ï…}ŽËª½&˜âÂô]Žg_Q¾étÑæž=޵x"Í(\y ^iî‚tòŒ(Yi„(rÂà´Iͳ'‰f¿.î‚wÅu&(h¹ÖôJø¼\oZý Þ®ß$JèÚŽ1ƒµ—.>¬= O9ЄŽq8f"|Ç+ˆY}g†ïø¨GüžíGìq§í€?Alx9í 8šg ðoN'ð\Ì|é@(OÇê»ô]qßžÄ0X}*ed¢OwëqÈ&²Ìºt—¡%Yºkfôm¹ÍŒ>–|ÒÕ +Ý•}HçU-¹£}rŠ‹ߤH#™6^Ô¸`è6åˆcí&*à€‹ £òû‘Óàõæ®'¿-®Y)ŠüÅ¥LÊbTy÷v‰{ñ™\ã¡Ûïj0"‚£?,#ó(d€Þ¢LãGiÅú€VKÝIFA„“u<Âw.¡R}-|§Úi…6Ï”„^¤ðÊÇ7Ãw\sê‰ãýŸ þ$Qéìié¶öÿÖŠg ð§ø³ÐCJè˜j.Þ5÷ïûQÜ «¯‰>%*ѧÛr³tWÏßS}L!ÕDÛ/G'úP·¯[@EÉè #ú¤ËO«—_»øn23iÉ®Z#nXöt¥ .*!ÁF¯†à»w÷bÔÞÅûW½'Nm1UwÜ€¤Êñ'Ü!.ì»^Ü·ó[¹¾<\éYñZEN…Þ‡iõ»M|Yv?vB®jZ±œIÇÙ…j„™´öÎÌB=Ì$á;îaÐì;„peõ]œá;iíñýxÈ5ºvCøŠÙoØqQºÿvaAŸrOÝñ‹øÿLø×ú. PÆ@ÌΣ÷‹Ñ~#÷þ“è“ÝzL¢ŠÀdÙ£.XFŸIô¹±}Eô¡TÆön=Œ>UĒщèã€OÉ3œÍ¾[²î#¢ÍÀgÄí¿tñ•µ'øB‚ñÁ~úY¸ªÓ­œÙÃ|õ.œ'nYîð<äø} J‚“ üÚŸÄÔ£ÓÞü‹xdß·¢õUKD‘"pÿãðJ—¿G\÷Ð.1í?‹Ç S^ÿ“?”‡áMЫp­þ®ÄeîåN›àL•ag$]@¥9y0;„^xøÎ˜WXÈð¯aaÍ3Ýê»@]„3ûN7Ïtr&Ìê;7|Ÿaa^e¤g³íkEÄ:QÄsëØ½éþùÙüþé~ëžkB€?]œÒy¥TP*'ï¼aD\·ðÒ]o¢O·å–%£’è;âLÝIôÑåWÝztŸ÷¨DßB7£/Ñ']þZìèŠVÎÔˆYm'`¢PËë׊áÛ¾’.8AÉïN¬íô·ÿ"f½ûW1çý¿‰‘O|(ê7›üÅŠ ÷[+;ò‹˜ýÞßÄÌwþ*¦¿õñ()8HèE˜V¿ß¢7EíV3NØÕ,—¦µw =¾Ó£És$|G.…ÖžœÑ€µy²¸oî‘tÿÿ€±’Ùüæé~·O†¿—è󘿧ˆ>9/Ñg¶å.,ÑG«ÂX±ìö‚Z}XRY­§'·0ƒ¯ÜQºæ¢Û½ÏÃÓùÙµö+AKðôó>ü»XøÑ?ÄâOþ)úÏ|QT¬~oÐpöE3ÅøÝ_ŠEÿC,8ö1÷ƒ¿KðÏxû¯Òk˜jXýáÏ|!š^µBcú0‡Erœ™´öªïö°ök˜WøN *MuøŽåÏàkxˆ»Óp`í£†ï‰ÊÈÉÝêJÅkÍ óß °Òâ;^ÙÔ ï§øÇ’ú¤‘{êŽ_Àg¨!- ÑçÁÝaÀgRÈØ~ã_q>Ý­G%™˜DsæÉøRQXH“mDŸìã®Ç3|2u|ÕÏœ nÿškígÀÚ¼1ÁLÐ/ýô_bùçÿ‹ýM\5ôIQ§ñ81lÕbÅÿËðÿ—|úO þù8(x`Ì2¬þø—~—yZ”¨:ÒWŽƒ‡×§Ý¹ÑüT¦R‡„çZ{3?»ÃwäˆÈ£Ð€\1ñ%ø.ã$ñ,ß›Öë²ø üo§ øÃf½ì üáO.Ý]º¥$¼HDi¢ì³,ÝÕDb䬾Їèc MôI—ŸSw#}A±}5×-jF_âD---n±ò#D±2ÃDÑRCEÑ“†ˆ&Ï÷oûܵö1ÁLPô+¿ü·XýõÄãßþWÊšoþ#ÿ½ÿŸàç±ÞÁ<×êÿEô~XT:õ!'E,Âg;£Êáâ«æ§… ßévZ¡Í3e;-¤æÆÙ<“á;f_2‹µþ,ý ß9õºy¦[}Ç\ míUøŽ¹¢ÑàP:Þ»'|™s1U”j4 8~N‹¡S¸ž­À_‘.àO\ûn8ðaYú¯|OZ=’\¼÷ÆCôén=ºt—ó÷äÔ]Ñç5Oö„S}q}˜²«†9º}.ÑÇ"ƒè3bûш>ZÞbåhõïEKÞ-Šžx§(ŽtÚKþ°A<öÚ/bþ1Öþ³IpäkøußÿO¬ÿábÝwÿ“Àª¯þ#–Ãò›VÔÖÄim¦Ë… 4ÒÚë‰ÅºÕy:Âw2?xö&ôÌÙwÉ ßÑ`ÐpЀ´èoG[|•¶[»í¼t‚žŸÕ![gº€¿xççžÀ¿~Æ«’Ø"³­‰>ºü‘‰>£-7Šcté®Îèc[¬Ðù{I!úd·Uº«ºõ0™E—îˆ>¤óÊðž“ÑçEôÑ+«¬>r÷eú.2øÊV.úLÚ/->­9­=-®îD£B…ïÐ`#‘晪…¹9û.®ðs=ûά¾‹¾c¾ #E ¯Yüs¯\™nà—ÏVàŸŸ.àoyí'Q‚¬±©änî—ÄÃY’èC<;Ñ'»õD]~·t7A¢aŒíGœ¿'Ûr«1Ϊ-·Ù£Ï;£é¼Ìè‹DôT“.?­¾tùµÕ"Š¿C):P’xuÏ/îßò¾cí7ô›bÃà/ÃuàúŸ%Ë uÒ~q€È" ÓÚz™ß93 XSÜ<3røŽ•‚ñ„ïh(b„ˆ×Æš1%ÄâwºuK:ÿE²@ŸTrOÝñKø 9¤eAj¶žü¶wl“¤Ôco:a(—èÃÉí™ÑçEô¡4VvëQDïˆADâÃn¾„3ú~=¿=¬GŸŠísæËUelß)ÝubûÁ}‘ˆ>‚µ¬u‘ã‰ãŠÜ.Á_i¼m®\,æ½ù‹´ðtóiíyÐÕ¹þQãÔeª/ EO„‹oZ{Mèik¯Ãwº7BBá;Õ`ƒÖ>Í3Uõlrkï]}ç´ÓÒÕwnøNzÒÚ«0ii4 þõ÷íH‹ž+<=‘µÀWà?–.àŸuúŸ™¬~ã^%#ÍPÃZ.Ñ'cûÑ'‹xâ&úЖ›=úŒŒ>—èC÷\“èc[î°Œ¾HDŸÙ–=ú¥»^DÀ¯“F<2ú"}EŠÓå‡Õgî¾JÞ4ç%éîì¼ëóOºùMÚMw^ƒƒ‚×ÚãQ¬¼¾C>A„ð+ ëïÌ|ü$5ÏT3 غœŒÍ|üd„ïx=Kk܈ûw}ãÂ!ÿÎG¥ød;ð×¥ øú #mðk]¼L†£˜¸2 .ч{[䌾@[n}N·Ý VÍ1[ÇKô„r3úÌù{nénÁˆ>'¶èéîÆöٓσè+r<]~ÇêSnŸ}Xºü$óxþÉKàÓÚã à! =Z{\Ò¾‹2 '´y¦ÎÇGb+)™hÅ4k·úN50eC·yfŒê;]ôÄð¯‡ÌáuñÎM‡¬þØo¦ø]³ø#ÒüžÃž >]2.¬>XL¢'¸&úd9«.Ýu3ú¼æï¡t—.?R=#}d”ƒ3úœqOr‚.'»J«%£/ÑÇZuºü’èÓ.\Dßp'¼g}Ç©”ݳ^”a=2ø$ó–ñ/Iü5¾`º< xPHB¿¾¡—høN·Ó’É:Fó̆ï8Y‡ÍQ˜H%§á"|§+uõ¾cÉa’Ä}¾¾æ\ü9ϤµGµl~ÇtऀO—lê+?Ë0X"},âA:¦Îè3‰>6bÐD{űïŠlÁì–îÝzÂæïÅEôÏß““xÔ0·[îѧ»õD$ú’ÙsžD,·KôÁ¢ß6ãE±±z†í´0v&,¾Kè¥*|'óñ=šgêi8zÒmP;­ä…ïdÿB£yfhõ¾#)LkO’¸Ç¤ÃΨsÙ4%«¿îð÷é²øß'ôI'÷Ô¿Bº€? 9‚]}§Öûí_È“PHô1íT} Í0!Ã%ú–éöè‹AôÉØ¾"ú˜Â^ðÃѧÚr•îz}ª[O›8‰>ŽÝb3úE'Ûp»}`ùCˆ¾[§’é»®ÿdÂΙíf(B/ÂwºyiAÂw$…iíé1v±+ ø•Ι.Ðós¶e=ðø¿LøglE×S£,—ä Çš÷¤5£BÇKô9ÝzT鮚¿”ѧÛrÇAôÑ &úö8Sw=‰¾ù{)&úú=vPˆÌß畈2­÷Œv3³,|‡kG#DÊP©S}ç !¾ãU,´úŽá;}©ú.4|GR˜Öžcó[Ÿt¯[Ú⟎'éÐqõãrø[Ó±(k^øV¦N8:À¿qæ''.¬&ú¸%ú8ÜB}ŽË…è“m¹C2ú"}˜é>OõèC_y§t7rF_D¢¯Jd¢¯ï£åÈ¡g\83Áð™Oõ]òÃwŒ®pü[e;ÓpÞ–W2²… ß1듺BO‘cƒ+~›ë×¥øWå ðG§øüŒrg9w.ÝÖ‰w±nì•L5³ÐèÊÎý 2Ñ7‰&ÑÇ{ŸSºëEôm¹=2úÎì‰>ŽÜfv›DH¢/¬-w„ÒݘDŸÛ׃tFŸtù¥»Úå7‰¾›Ñž< wjaùn£ g„^xøNçãËÎ:Fõ¾3Ûi±yfaÂw»$)Ê5“Ö!RZ{z޵ß1Ç"áê;äã›Õw:|§K› æ:ÍÁ!Yù‚Eð‘S}ë>ø™tÿ”\~·tÿÔ‹Àwš=œ7ài«–¹ç´úšèÃFzfôi¢Ï«-·"úè2}pùÓNô5GgÞˆDŸÓ­‡ñõp¢é¼Ìãiwã”ä½U ’œôßµŸgøŽƒJ#Tßáù‚§á¨ê;—ÐS³ï¼¦á ä)ûã߬òñ£„ÃÉ ß‘Ð ßIk‘žÐ ¬‘Ã×MQdª[Ò×€ã×dƒ>%䞺ãWOð[õ|< ø {¬•ÙiŒQ3Tå}Œí+¢oÈ“èÁašèC÷ö°g›hgºõ°GŸÎèÓE<$úôü=Eô1u”VŸ}ßhõkbþ^UsþÃ{zþ^(ѧÛrÓê›m¹=‰¾á}žDŸQÄ¢¯÷ä¤$ ±øi ß¡J‘×›ò¸æ°9i·ún‡ }Ò3¢µg7cò$äKX 龃‹¹úÎJbVßévZ±Âw< é ‘»÷[Oà˜óJº,þžœ¾ÿé×ÛÑ#$_¿rÛE2uÍ7ÿ•iaD668£E=ïñ@F_€èÓ±}‡è#Áäã@R ï¢Îü=/¢ :iõÍŒ¾HDŸŽí»ó÷¼Kwc}(âA…ݵ^E'¡rúE~*«ïd>>­ýrêkíéâc-\kOõ"ô¸î,f˜ÕÍÇg­=¼3ŽïâíVß©i8fóL³úÎ ß1ñ‹ `ä‡nYø†G ªXŠŽEéÐo|F¯\þøt,ÌÐ/À'»ìM³Žþ‚ʳÿ“¹è!úØVY}´œjCe¢R9¥»^ó÷ŽÚr+¢ïTôèÓD_UIôyÍßSDYm¹×É™ð^¥»Œ¾8‰>ôçÓD_Ïñd:3Ó´°í4Ÿµö Uß9Óp¤µ7¦á”æ¤Û„›g„^Xø„®PÌ™pjíU;-¬Ì¨4›g&|§[–Ñ80ĨÐÕ…1ú¥PÏqíéÐo|Æi¹üéX˜ñkÞ 4uTÈì?´ýsYvºÕg$ú˜žª‰>2µd² Kôue[n†÷4Ñ7á ^Òó÷Â2úT,ÝES éòK«a×<íÌ߃E¤e,§JwŒ¾U‚` Êè3‰>ÝJÏsSm¹½ˆ¾«Ç5æ¦0¡©ÁEóBÚiÍ3ÃÚiy…ï0ð2hö]jÂwÌÇOVøN7) ß1¯Öž­Ê:Þ³#ŒÑ?ùü´5àø0ô»\~táóŸ…ßaö¯zGlùEȺó¨DŸìÖã}n·Eô±á"gÕ¹DŸž¿'‰¾cNén¢ÕbšècÍxÒˆ>Ý–›¥»Æü½°ÒÝDßU,v¨4¸h¾aíí´2¾#¡—ÌðžGÀ¬Íhá;FhíYÇÐô¦ÍaŒþ9ÝW¤ËÚJèSÆê+rï·þS þMG~Ä@F£!‡êß~ýÔÃøMôÑåHô™m¹=ˆ¾ð¶ÜQˆ>=/™DŸîÖ#§îš¥»^Dêöiõ=ˆ¾+ÆDf¨Ôïà#ñ'¼yfȌ i8IßÁÅg„‡¤; W¦¨á;x]‘ªï8ÇÏœ}Çê;¾Cy¶Y}g†ï˜ÕÈ(s@¨/uº¬0ÊqPÞÅý6§ ø³rø ü{S |¾õ–³Ârö; ßáŸ-¦Øp"ÑÇöÑ&ÑGkVº«‰>L¯Õ=ú¼ˆ¾ ¢.?kÅDßagênhO\DŸQÄFôyÍßó(ݰ/h¿LX2…€ ðe;­XÕwzŽž}§«ïÐ>̳ú® á;44 «¾“á;zA³ïtóL‡Ð+løŽ‰ix5d8¸L3¬!Å9×x>]Àï“«À4ÀoÜuYXÎ~³›7»À—V_}_ÅÈèÓm¹UF'©h¢$~¢Ï˜¿BôÕDF_‰>ÌŽ/môèãàI§t׋è ÌßÓ}ÝÆì—ù t{µðß§vX({öËi81gß0|‡A#œ,Ìš™¬S˜æ™3‘𫬽3 ç#•%|'Ûi9Í3Íê;†ïHè1|§ûô Þýs±Çþ‡ƒ&LðÏÊUà÷Nð/¼ SLuÛ'IðaªÎ¥Ëƒ€/‰>Û}<ÝM¢o’Ù£ žê²t×+£³ßeÌèClß ú8†ù¼¸‰>Öí‡ÎßSDŸŒí'‡èsbû£Eô$d ÃZZøo |NÃIxöÝyIkëHÙ‹UóÌ‚†ï kž™‚ðy]}g†ï´µ§žLÜÿmØýžaÓ1KßHðÿìÉUà7Lð¯ºÍ¾‘ÈÆ›þ¿ ð”è£eÔDçÔËŒ>MôyÍß33úÐß]}¬*3‰¾jfFŸ;OOÝøex¥»‘2ú"}ÌŸw{ô™ó÷Pº{éè}r¶…‰Júïõ:ø1gß,|WájtÖ‘Öýñ]kŸ‚ð®a‘ªïX“a6Ïd— ß©Á#:|ÇœZ{Â#6 »ßø³Ÿú(À5U O)¹§îø¿ðÿžjð÷¿?l€&ãùKý5øšèÓ±}žî Û¸¥»:£Ïkþzô9}^ó÷«ÏÑLŒ)³4Ôíѧ‰>9/У¯ö`ñ ¼—xFŸÛÑÇÙòŒ¡Ë¶ÜMc}îß'óL!V·ãâÀì»B‡ï6Ê,Df#Êd„*²dèR&ëà«„a£•™¬ƒÃWzìb$­=Ö‰¬¾‹¾;&S©{­D²ò,XXå4ÏüÊ™t«gßùøLØŠ¾sZ;ÍHoÿº3ìÓh¾Ák_ü.À_˜³ÀWà?œjàß¿ð59Ç,ØÝŸ!&ü6 øADÂ5ºt×íÖc}º-· —Ÿ.ñ@„÷8qENÝ5‰>¸üNén £O}-Æ:±}}$¬œŒ¾x‰>Õ–fÊuY/ÊvZ‹<~/¢à—á½èDßÅ£öÉð$=-üwÝ‹|ùpN_¦ªït>~hó̘Õw¸vq/¤µš†ó­` †gøNæã;ÕwføŽ03>é^5v?Ff©.Ç*5ºüY¥ôüŒ¹ü9©þô-ÊÖÓà;^Gl9|Mô±ÃìÊ ¢ïïá=ú¼æï©Œ>Mô9E¸üÎ0ƒèÓE<*£/:Ñ÷¬(ßyüž}¬Û7ˆ>ŽÜöjËí–î:D_‡‘û$@(œ) ÿ^‡Àç`Œz… ß­—­Ã™}(­=ž½‚n§åU}‡è£Ãwð–šgÆßÑ“¡gÆ.Ê ßÑdø—zrÁ gœYyª½9Ýü¨Mµ>«÷o‘ëÀï—ê…Zuà§T¸çO·Ì{ÕøaD»õ(¢V@¶åVD`Æ}ã"út"úd[nEôÑe ÊèƒKËsÖš³æÜÆ'чF•:£/Ж› ;´ËO«Ï2Rc‡jËÝþÞ½âf ¬å)/‘±NçÕë({8|gäãËÙw1ªï² |§§ Ñ+$ðϸzm˜›Ïñì©Ög¼?‡ÏÏuàŸ“†…¥Ü#ð vÿŠ1û<1£O·åf鮞¿gfôÁå×DŸtùã&úЖ›=ú<ˆ>·ˆ'ч²U´Ðê;Ýz6:ó÷BKwc}N[îv#öÊûp¨Ô¾xi°µ‡•£›Ë,Hr||•šëæã#5×>“kíuóÌ$‡ï9áu*±ð¦áDßé¢,Ý–„­=¾:ñ«jÛ޵×ð*/Ãxö4èóÛ©}ÊÉ=uÇ/Š…úwª«NÛ¹Aî>7¬í€§"?”èc^¶Iô±&[–îz}º-·'ј¿G¢E$Q‰>¸ü)!út[nyGåtWgþ^Ûá{eP‘À‡W OÝÑH[{p¼F”’É:1ÂwšÐÓµöA„˜üÐê»(á;r$ Wß)BO¶Ê6fß1|dž«Ü×°ðš)Ⱥ ZV?ÔÍçúõA5hªuï¿2ç¯Àÿzª«ù+ÃÜýFW­Ž üx‰>V¿™èóš¿÷¶%úØÞ$úèòGÎèC­¾ž¿W¢¯Í°=rv\°|$N¾À'AªC¢2õ¹0á;x*‘ÂwªV y¦S}ǰgÄê;DL9 ª¾KrøŽƒDµµŸûæ¯an>¯AÃf¾”àÉà/N5ð;ߺYÞOMv¿j›ùQ/]~l¶Iô1s‹ÕYrÚ.é©»,aea‡çü=•Ñg}W²t7^¢/Îù{áDŸrù;ÄKôM­ïÙ#z€‹•“/Á8²¨³ï¢Uß,|Ç’eÏ𒟼›gFß‘ÐK8|§òñuøŽÜþÃ;¿zš ÅUiâãï¤ømóøS üî{^Þa%»o|ë¾ýOTðG$úäü½ÑÇÆšèc¡Ç=Èow3út[nX Þ:£Ï$ú^ª‰>²Ô&ÑwÂ{ 4ч6Sщ>ÔíÓê›}‘ˆ>7¶¢“xÑ×jèÙO Tjuræ¾y&böh)V‘„’udƒ Õ<“9 fó̸Âw˜bÄüií±¦N;­OÄÍ ß¡V„ð&ô4ð‡¬F¹·¼Û£‹³.wFÄcñŽÏS |-™/Ào•jàÁCÎw頻íöñèÍŒô§tùƒzôýSæmËù{±ˆ>ÛWD[=É}^}º-wˆ>ÖíG údl_µåf¢¯Å]{d9q¨Ô$ðÁ½Ù ôbUߥ/|Ç‚(®)×–ž•l§O+jøNMÉV}g†ïLý¸áуH=™Ûàs<{Šuù£Tƒ>-䞺㟈Åú_*ì 0tÂQFlìóŸÇ~4¢OÏß#ÑÇÖËìVÃÔO`Swã$ú.5ˆ>'¶TvŠåÀÇ3PÄ#§îj¢O¶å>`Ìß3†q€)—.¿Û£,¿´ú^} Œ>ƒèk6d·L2b‹+øwÍN(?'|'óñ×ÈÏd³§›gF ßíož#|ÇvŻ`§#z'W/ ´Ó¢µ¿e㢠Í3Íê»Ðð üÎ÷;|‡´öÎxòêçNO5èùþëóø üï¥øó·}"dÓ& hvwçÊ·â~L¢±}–îz}zþ^xFŸÑg´åV}&ÑW})!úd[î¢éàÝH+~7LjtZ™•á;¶4O8|‡ÃÙ«úÎ ßýSv^ö ß™Ào~ÓF'‚«£äŽ`Tš\º8À‘oÀ_Jào|å'óL%¡èL¾ÞSÅ|“è“m¹Aüh¢ÓTâ&ú‚Úrì´åVD_gNÝŽ©»:£.?Yl6šˆoþÊYqwæš…/Á}ñ}gø 1†Š¾ ßÁÅ÷ ß!Kгú.jøNåã£× ‡‹0liæã7A>>“šÜi8ßqNÄæ™2_Y{Ý<3Vøm<á»Ðk`]ŒÈ2­=S™Ûß–é9ó øw§ø|ïÊM5¬¾Còuú\ÜÀ‹ècl_}¬íŽNô9m¹IJ¹¥»šè›ò–LG%ÑÇbÙ–[}ì#²Aô9#·Ué®9/.¢Ï,â™-šÜ±[6²•ê—®*tøNzN­}ø4¯ðz6Ï,@øŽQ^Ÿ?ñTß™á»Pà—Å„&Fˆ¤µç¤"x“×Ü•–é9ò ø¦øÐ7.Ôê7ë½>nàsóM¢%št ]¢ÏkþÞ^n= úd"úØ$"¬GŸ×ü=IJe·„÷ÂÚr£šUmÎ0Ž8‰¾vÑ×ÒéÑwæÀ]2§ Tª]ºZNé‘Ö¯å̾ÈÍ3c…ï0 Ç£úŽá; «¾‹¾û$¬úNçã³xŠéÔzNÔê»(á;ø+>ù{ÀÚ“3‚µ§^Ý>n_ª]ý/Óú´‘{êŽ_&ÕÀoÛsµÓgνëOuÐ`"«úsi¸m¹UFû¬k¢OÇö#}îü= ãÐm¹AN9m¹ßšèãtW“è£Ë?ÑG—?Žù{né®Cô5º}—lBoC ÿ]­3€¯Ûi%4û.zøŽ¥Çzö]aÃw,*J¬úΙ†ãU}¾3uàQ”ݺw{eíY¹8zá«©þÖ¼¾ÿ'©ÿ•·ÊÒRÓê—>cªl³ø™¶éöèCïµ°ÒÝ8‰>*ª.Ý¥ËO’J–î‚Qw¦îzÌßS}‰&ú8&Ú)â¡ÕÔ–›yün=‘JwØ)# ¡R•À ß¡?~û•2TÈÚ€ |üWß1|GO)Yá;r6¬µ¾3õc$«=“¯­=Û‘ÍÀÿO¥þâ½Gç+ð7¥rán³Ëm&a2üË>ú[BÀw‰>ÛWD;°j¢yßœ¾5£Ïkþ¬¾lËm}¬7o¥‰> (8Ñð£,Ö-â ÊèãÈí…â´Ûv Þ«C¥JçÇ|üÅ!í´ ¾¡gξÓá;Eè±`©µÑEôÕ»u§`ÂH‚þ»¾Y}+|'Ûi!5׫V„ð?/Yá»{#UßE ß» íÃhþ+?ý»hÝg£“¦ç(k_¼Æ˜w¡cÇCFAþš=þ!] O+¹§îø•’¼`?ãýAŽãû£=te·S,[DVŸw¶6„°òÓ$äöoøÑ úàò³t׋èã<:†“Â2ú\¢Ïkþž7ѧcû$úÈ‚gôqþÃ{{¯3úâ$úÎ[ç–’@ •J]ÖÊAÁÖ.>¶üb6þ¤µwšgòñßáZCkOrÓ}#|ÇþƒaíÙîœ3Ø<3™á»‰{¿5ÛΓÉ_®µ'è¡G4&0*Ïi`BߪAVB˜WŸ,÷ß}ÿt¿ILJ˜Ÿ…ú& ‹Å%³ eÍ÷Æ@ˆß¢…ô§Òê×ð]«ït–!S[ó‚ùb⾯ã¿&ú˜Þ¹<ч¼p·tW·åF¿tùq7ÕD_ïUN[>XHwþžÊè‹›è k˽Rºïµûî‡I¨Tê²ÎßÐ? =¦æ²–nž‰+ExóL„ïà…„6Ï „ïŽ7ÏtÃwïH’“žyzBNóL'ßlžé†ïàâ'¾#¡Çæ™^$/ÿ_Ÿé/‰R¦:„ž§µÇÈñj£ Å ô¯äå$è3qéÄb&€ÿt!j'~¿Q¤E¨2°ú[80R† ï9&8í´ÏÌ—ãvýeén¢Oñ˜DPz–îz}‹DŸtùÙ–[}$ß86>¢±ýÐŒ>o¢¯€ÏfŸ¡R‘ÀÇÝž|y™/­=òñ-ùøÒÚǾCòÛŠ%¾c¨3´ú.fø¥Ò¬ŸÉ:²yf€ÐÓ³ïtóL¯ðÝòÿ&ZÞ’šk„ïh<`Dþk[$}ƒ.rTÜI0h=òøøá÷.gqðºÊ=îxòpÉ: f‚Â{Áe»-ûlLÖˆê }ÿ+ôü=öè“¥»‘‰>YÄ£ˆ¾ш>Ý–›=ú¼2ú‚Úr’l9Ã{Úå—SwÍŒ>—èÛ kLôÕ¸y‡e¨T„;/ ½t„ïð9aXZ{ÝN+VøNzæì;U}Çhä\ȽèÙw2|‡fª‘Âwã0ß¾zÛùN£ìÖ$ôNn>ý¿÷L{q,ôé÷±ô¯9 ÂÑð$ âþ׉õÉüy&,~÷æÏxýpH±X_œ¯Q¯åïˆi›Þ'·˜îéòë5Ú-ã÷|üÑ>/"Ñç5ÏÍèóš¿ç}ÌUHôɶÜ/æï¡•ÛWDŸ¹­Jw¯Ò=ú‚‰¾j7í9ó¡RD`NÃw2ÿŒD°Ç€œ}+|?¬ú.FøŽSF¥µ7§áľãÕí†G˾AÕw!.~Ç׉õ/}¯üôé‚Xú§x¬SðÚÍ ê8‡Ëþ6ž÷OÖk2üZq. ‰“¥´Þñ|Y¼î2½‚ Óv²°.ìõ¸§Ë¯;ΔD“Ч½•ñuÚr'Nô‘ˆÒ¥»¬w¦îF úÛG™ÑçñD#úú’èø¥ÕNôU½ñy9À"TÊø©dÝ<Ó ôd«ìB6ÏŒ¾ûØ{ö"ô¼Âw서HøŽùÍoÚäô dÉ­Y}§\üÒõ'ˆ!S^ˆd±7B¿NŽS™¢þfœº¾'ž÷LækÒ|u*’æÄÏ›ÆóEñºFÞû£ºWƒ&©n;nÇ­vдÀ ÍhÉ>´lȨ‰¾%˜¡ÎtPw‡Îèó"úÌù{ÈècM¹Iô1~ífôÁ fë©óÞcåZP[nfôé¶ÜqeôÏß«|Ãó²·_¨”ïà³ÖÞ%ôT­}Ð4œá;töª¾KvøŽùø´öÃÚ»Í3c†ïœ¬Í±;¾Õt×\ô¬µ°ø§¶#æÄõèÚÃcé'¯Ÿbè磱Þ+Ù?Ïð#õK,Ðuñ|I¼®,„Ì>þ¸îT3·~(ê´™ܰC·éRe«·[(Øo-Ò½?ˆè“E<ÿ÷J·["ú¨œ£ÑÇi.œHËp­>'×Èù{rºõ°tW}:¶¯ˆ>Ù–;чaAE6½’¶ú²ˆÇƒèSm¹w—ü@ˆ0\Ç4ß@øé¿Âw #zUß1ؤ! tóLY}-|§Úi1ÇÁ†ƒ+ÃwœWè¾Ó„^ŒÙwÜ+^ÑzMyQ”Ĩk³U¶y¯§1èÔo“Øðòqé‘Ò·¯ñ'‡ÂÆtÑñÖ©L‡ü'‚®^Î'ó5™þ¤à|=’~'ÄúrxÍqöð‹å5xn"ïm0]W¶éR!¾ÀÀM´žBš’¨K¿~êa©4¡‰>ñ°A£Kô™ó÷Â2úÛ!¥‰>gþÂ{è ÃÚòB3ú"}èÖÃÒÝB}øÈ2÷‘Ãwx4û.Žð ŽÜÙwq†ïxêÙwq‡ï@è±9*ó+–†äã/þ௢é #¼ÓõÐsBwe‘ÜuόÉ>ôµ/B›ÅÒ[å鞎×n÷ÿéñü~2_“)à÷4¾ü:ü½V<_ ¯ëy;^ íuC¦e²×¼Ñ™W·–V£¶›Þ¸Ésðf$¢O»üî0´å¦kÊþîìó>t»Çü½Ç½‰>§ˆÇ!úèò‡eôE$úPÄC«è£7 ½ƒa ­˜á;\B›gÊê»,ßñÚµ³uønô³ŸŠª,T W…t+-ÕU§AûùbÞ³ŸôúwÉG-‡T‰S»âµ*ýüþŒ5ˆç}yM¦€__ö5Èùñ<,^W²5€7߃ãŽOmçdk¹SxÜQÛ…ÞòUáú?´=¼oŸ'Ñ÷Axé®Îèc¦™&ú«ù{‘‰>¯ù{GÝz ¢sçx¿®‚4ÙÊ·.?ÇQK—_•îªù{¯ÛæL«E•Ÿ#üû.Ù;/)Õwè)Àòböl©gß©|üˆá;ô-kž#|Ç||¯ðÝj„ð®ÿ‚(yöŒàI·!d^·OˆMG~LèÍ÷ø ôë^H<(š¹’ÖŒ=·LŸI¿‹z¼¦d"ä_ɽ~?Þë.eO~—ìC\—.¡!Eð³ÕLqí¤CèÁï S¤Èؾ"úV £/ˆèC[n²Í²G_,¢.¿Iôq`„&ú:ÑêÇKô¹ó÷¢•î>á¸ìŒû‡‹o"7ÏTã­Ù*ž4.¡ç¾ã„`Ï껆ïÈ™x†ïàâsÜ9÷`Ö¿Š³®ßàÌ´×ã­CüòèÒ4bÎ+É|èû±üüŠXú­Üÿ´[{~nF€kA°h<ú@¾KàCßw(îyeÏàù{&øÙ›þÜðü1‰>9ïWÉB“èÅn=&ÑË%út[îHDߤ7ù{ ËXMGòŒi·§êaADÀÏðžÑ' kè „ˆ~\á;ð à¤[æ°cPÃ/Ë,CZ{gÎQ™/«ï¢ ¯¾Knønئc¢r[¸öA?Y4¼d‘X°ý³TƒÞ|ÿÝг3bé{&~žuÀÇBµ†IàÍÏá}¯A‡EÀï ¬rÁ"ñîÚòG%úôü=öèÓm¹=ˆ>Çå}Wë}šèóš¿è3Ûr‡gô9±xÙ/Dä@N¶Ê ßÁ;ðª¾C$y¡Í3 ¾ã÷g 3ëÜi8àD¢†ïp­"¡·áÔË0•ã¾¢¾ûO¥ÂµçaÔ‰£âËeà‘>3k€…©Y“ À›ŸÉn½]o22ø1~ºä9³ä=r#Øýxˆ>ºüìG¢Êœѧ»õæïy}‡=2ú‰>§ÀÙ}!R¾;æÙ»ùøÁÕwß!$V}+|‡°gXõ]„ðݤ®^çL ¢¥—ì=çÙt*œ=]ŒZò–Yñ¿@ÏCd%i¦%々`ó²›ñ,`Z^Ã{`ù³¡DjžœtûÛÏÙó“^ÄÂ÷þ,G+»=úté®ѧçï)¢1j“è#ÁåöèƒËïôè‹èc%œ&úªF!úd‘ Á"ø²«ï¾ °öð]5eíùYAÕwšÐCÂ{ø9³ïtõÝûžÕw… ß Zýž¨ÔfATПÙy™X”ú‘W‰ê#ëúÓÒB;Úá’ Àgv]¡D0å¯_ðܧ¢Q'ôW÷?, ÜËÊm‰‘O~ìIôqNÛtEô1½4n¢OÏßSD;Ó}VÔŒ>—è3Úr3¼0—g?~Nâ ‚>´ú® á;ðœ@kïLÃy_åãϾ+HõÝŒ·ÿ,.¹w· ~•Þ+- -Žÿ=׉¯ÿ"»¹2Ä´ÀÌèÓDŸ×ü=”î:}ºˆÇ!ú®[ñ1fÆ9Ã8h5;aþr·tWÏß #úÛ‡Õ÷"úä´]ÞåCE[{²þèÛψ€LÖI |ÇD#&±¯€Û·[†[êŒ>ÄÐ},âiŒ¶Ür‡Ìè3ˆ>³-7À,Çn±;OˆH7ß³ú.røŽ!ÅÄÃwŸ9É:¨W`Ý‚ÙN+´y&¯Gþvw=°òAá:ô%úk1ä2 “l z¨<}. ŒéüyÖ_%50SïX6‚ó«?‰w? ~—ô XÿKGîFkg'‡|n‚DÇ?k¢¯×JXý¨DŸÇü=Eô1äJô•¿Õz(Á •ò¨ßÎǧµo§eξ‹+|‡â#>¿´öjö“%|‡óF<ó…¨{úýó>/­|8s_¥ù,ñÐò7 ÈtüÞÂlaò̓%+¯À_ ÆòÜtlNŸ1zÉQQéÜ™êÞï÷¸®¿²þ§á>:áà÷²·»&úd[n“èC[nöã((ưÝ}:£/ˆèûP¶ æÝ™-©Û±t7A¢¯îòe;£õ6»ðº²N޹ֳïR¾c ²gõ]„ðÝõ³^å[Í °ö®}Ó+W‰eh¢’¥:B¾ê¾tZñD>+k¯ÀÏPßú,ÝXyŸä½RßûƒC~Žõ¯Ðz¾è¿ìíàÒ]/¢Oñˆ¾ÛPš*KwuFŸ×ü=–îz}Ì¢ÓD³ëL¢w{ã„ I¿ˆá;¼G¢á;¶mžOønôþDëÛ"XyåÚýï=r‡xâõŸ³ôl¿Wyy"`Mæk³ø üLß -ãÍš ç½²ç°çä=ÓÍñw­¿¾ûÏ }^LóO²Gßc… úôü½ˆDŸœ¿÷ŠÃ8àò3»Î$úXc/i†H_‡ï$¡·O’ƒqUßáð!¡—xøî;™ÂÌæ¤l•=xó§¢vgŒëÖ 9V¾ZËÙbܪ·³fÿ=Œuâ*>K&}¯¬¾îë»éFº½„‡–½!xß ³þšù‡û_¯Ûj1zç×rÒ DÊ"ÜgM¢.?GD±DÊ©».Ñg´åö úX£‰>ö»ó"úØ&[N×A·Wðo |Ž·fÅ[eÇß1?´ú.føNz²ÖÞ¨¾ã¢«¦¼,Ê4ŸH»u³ð¬}ó«Å ´FO÷Þ&ðy,ΩŸ(3ñúœ¾²þ±°©˜b’eâ}³i÷•ˆùÃú˘?ïþºÊωû—m9WÜ4÷uiõõÔݨó÷Ñçtë1ˆ>„ɘ#{ôÁÚ:Sw=ˆ>ÛWDÙü2œ’"Ì苾£a6Ïä!SÐðÝlìMÀˆÆ0\oνåIò.ø’èyÓ»ÄÖ£YëÚS^‚T̈ ò™9|þ³±ÀÉÊ‘°‡ZÞ;¯¿o‡ãú‡¹ÿN?€ó=+& d—Dß8ñüYܯ‰>´åŽJôé"}˜9g}-}gÀê³Û­Û£±}Ç(ÍqZ!RžÀïCk#|‡^ÿÞÕwï…̾ÓÕwŸI¯Å+|w˪EŽËBØúày€V‡k?áñwR²W XòXŸ¿ïU¼ ÌÔïäðøkb¡“Ò‰'‰›¤¬|KT¥ë¯3þt¿¼ÿ;@íK—‹{žü ¡+ñ aÅÍè3ˆ>éò+¢ï¦˜Dæï±t×ÈèÓDŸnËÍnº¥Ï_â‡cª¿3w?Yá;öŒ¾ë2ö (Ýa:Ó¥gq‘vÛªçãbÕ”O¨êX? :³·D¦éssø ü¥°à1»ë¦ Øñ¼/ï£Í®ZÜÝ'ä(åïùèËbœWFîÁ‘3út“ÑG—_gô±ž)´gy}>gä…J…kžuúðán_í´îÀ4³y&„˜ÔÙ–›¥»šè››è«ˆäR-æ‡ ŸpøŸç]}‡||D"Ìê»÷í¥Àm˜¹õº’N¶ºFÌ6×­k^Èzמ]¡ÎÍF0'òLy|eýoÀ†ü;›€Uû¿-¯^íLe =Hp\þÈAIô±-÷=&ѧçïqGh[n“è3æï1¼'Ûr+¢¯bçµ¢d³¹aÂt]ÝNË«úNzm&¨vZÈŒ'|wËÚOÄé׬wšc˜Ö]ϬàKâïxxo¶»ö<ØßƒÄ5I'fâµy|þvؘ_³ü¼·ö}p·(ÁÏò˜ð "ðìÞ›Ä=Há +âqçï©a^}zþžÑWéR”µ6"³»ïšÍ3£†ïðþñTß]5iÍçÍs¢ªN^z;ʳ»q-¸ön|?«½5¥O{ñg™L€4Ÿ™WÀWàçЂϲü|¶ÉëÞ5ZÌt†zÈÞþ!^j˜æÚwÙ{Î0Mô¹ó÷ÌÒÝÑw©Aô9±}“è;"*uzÜ)m ‘Ê~hóLY}WÀðÝùwí%håy˜Ö]vü¾fѶ×Z±öÐw¹úUس¢©`¦Þ3À_•‘†‰8«qŸ=ï¸þõ0ÓÓZå!àxú*Pàé4j¯Săėø‰>ù{ ú*wZãÄÍC¤J¯m2?jõl§¥¬=ƒ°AG‘k`r«ïz-ý@œz¹ŠdhË.½‚Ý™SWê´‰bÀ¸ý¹x>ãØL3•Ÿ›—ÀWà?›öd"@ÌÄkéúßúÐQ’ÀÀ 7ïC`’8ãêµbàæÏ£ÏßSD_gfô)¢¯-­>\~=u·r§ÕN%aˆT»~[¡Ãw]&»à\Øy¨ñpÃ÷;å¼YbÚærôœs×'•àËä{ç-ðøÙσ5³^ѦnxOÔ„ëBqê=&ŠJ-f‹^sßtJw5чn6ñ}œeWå’UÉ"Õ{osÛiI=Ìí´ HB/´y¦[}ŽÉ:Íú£G-¼r㥣À~bÝqò{µï½VplyìÇŸðŒ2 ÌTv^ß÷Ý…dÂEV+Ýã¿m{®'œòˆŠ{HOÀ9H ¶»{‡ˆ»>3údÊèëi}]t>Mô©ù{U.f-ºwÖ¸a›h€î=2_'ë ™€,ý•Õwá»+æ¼+j_²Ì¹ªè|N>¯;¿ Ç“šx «×ÞÐ NlÎÊ!É< ||eý¯Ä†r*oÖ+à€GöŠ’õüÚ;‡€ÇAP¿Û ÑwÍÇrºlŸuF[î%áDß…StÏQQõâ.‡@Á‘I¢æÛ‚šgÆ ß¡ðEåÎz,è<°ô3ãùë´ž%f>ñaÖ¯¹Ò‹×ñgÕd,[ßË7ÀWàoý!À?mÓûâäæÓÅ 'u-ÆAÀ¾ÿWL="etéîµËÒ]7£/@ôUëà“d ‘Ú7='cýMógì?¨ú.$|ÇÙ~MnÞ*/=èò9ùÌŽ7®Kž ëg|rR¶5ÙÏå+à+ð×Á ÊÈûp»ëV‹â5'Ô‚(@™‡Á‰u­<#Gp9¥»ŸH–l»lË­ˆ>ºê$úªu\®,´vÉ?O¹y›œÇß½2ûΩ¾»ôÑ7E L:ŒôsÕàñœ¥àæß9å…\<Ÿs>$#Ã+“ èxßÏwÀWà/‡> àç3·O”“Ÿ-åQÞÈÐGæ àùœ?CÎK(ùöZ_ß÷Ý EÈÚ~~¡Óà‰pýkÇW¹_Š<´¨¡f›¹¢û¬·‡qŒã(+–îÖh¿8à5hï6è÷œ´öfø®é;EIÜ×CÆø |–þìS[NsŸþ(—@ÿÖóÔ|r¢ßÇ_,†2t‚ü%W¬ÿì­Š:çNÇW åHŠsPJÕ{D´»oÑW³ý¢àƒB§ÝòœÌë—É:“ÞuÑÔ|/ùwý9òÏ‘¢ËÍëÄÆÜqíy8½©(HòñõøÆ¬r(EÈ×¹þ //.¾­xŸ#•p„J•‘‚3ý.ÃÏ.95/\`çÐhxËvIèµ…fˆÍË%ô½Ôç”9ùA1|Ú¡\²ò|֜ꋗÊÇß¾º÷W‡‚¼™+àçsÞ=ù€(Yý~Q¬ü½âø ¦¨€­Úlº¸dòë¢Ö… …>0ðg£[·‹3nAÚ-È:yˆTÐx?¾ƒ‰Ï~œk ŸŠuʹ¾xø!àLå‚(ð—„¢<ŸKàŸûÔ1Q¯éQ¬Üp%#ð§’òøR¢æhQö´ñòï¡R®ñÔàÿ§×}¿áâ²>ëdžçк·¹=Õú’‹ïo-~„C sdq)¹¼owî½Z+sdX@ÊâïA‚á¬)¡?7~ïS¦ú(qßÌs ð|VÎ_èš‹ LÇ3[àÇð& <£r ü|ÖaSˆRUîEK ÅJ›‚¡t4 ¼–¿K9½ùT±è¹Or ôßbš¦@¹úøq\# D½ ÿÊ¥`þ3‰úçLEKÜ%Š–¼;qÁï]Ñw­Ø‚±à¹ô½ñ¬ï@jå* ÓõÜøq_ÝûÛB¡81g€ÀûxW¸þEO’”­zŸ¸ÖáœùžÆžìÆßK§ <¹ü9øq_¿ëÓ\?ŸõÞÇ^¥*ENS5›,–lÿ4A¿ßµH.ƒ1ÏnŸðø+AÁ^Î5ð/Úö±hpÖxQäøAžR´ø¢Ç-ëÇ~çÚwÃóŽI'hòá³,ð¾ÿ P¶'r ›áúw¿qµ(RôvÈ@WÊU¼G<87']{ÎQ¸)€˜îï`_à+ðÿJ7=×ÀÏç5+ËÞ-Ž;n€8óÜIbÙŽÏrÑÊÿߥ}º“/Ÿg_@àk€òÝ Éú~~¡Ԓ퟈[†=%žx=']ûÏñ}å 3ñ=,ð |eý»Cs¢Ÿ_.z(!Ïü*þ]%`ɧϴÀOðø›C!¿Ï`e³Ûÿ4Ö×7}ñRyÐXà' ø ü§@1ß·àOI®Ã¬«¯úâYà'œ©\Lþ²PÐ}üI?ûâÝ“ê}óÛû[‹Ÿ‚CŠÊ~~k,ø þ` {ø ”éø¾ø)¾²üìç÷ˆÁÿ#Ö®U:@àÇϰÀOðp_?(00f3i–mÏv ëU×€L×w¶ÀO1ð•õ¿Šüg þ¸¿ƒX§òé€_?Ç? ÀWà? ý•Tð¯ÇúïW0¦ó{[à§ ø üÕ ØG-ø=Á? ëòÛt*¿Ÿ?Ë?ÀWà/΂ß?ûâõ÷33ñÝ-ðÓ |~öó[hÁ/ûâu΄âûý3-ð3|ƒñ¿ŠÏ•lcÕÓñ<ßà{Ÿíwfêû[àgøÊú_ p€c:À–-Ÿñ¾oÍL)½ý\ñ ü _¿ €ÀAŽÙÌT>ÇN|ÏR|"£ØËè‡ÛÍl>ÀPòqžƒ)¾Ÿí‹—ÆÆ? 6Á¸óW0ç)ø°}f­¼¹þøY|åöð7çøÙï úì=÷Â?Ë€¯ÀÏ~~åøÅwhgAŸ] ·ÀÏBЛ hAr®ŸŸ:°>ß§[Ðgè-ð³øÊú_ý-Ǭÿw@o]ýÜ>ÆføÀ3´° Ï-Ð[àç0ðÕ½¿€—©~~à³ëXÐçè-ðsø üÀ?¥ÙúÀ畳 ÏMÐ[àçðøÏ¿Hø×âsŠYÐç.è-ðóø üUÈ×S þ xÛ/ôƆóò`pßIæ³)?ûâÝj­|n[yÎË#°{„û~ÎK"øÿ‚÷êdAŸ? ·®~~ÃØÂöóûïÑÄ‚>¿@oŸÇÀW÷þkÜ‚öó{¿[Ý‚>ÿ@oŸçÀWà?þ)A×ÿy¼¾¤}~‚ÞßÀW௠'øãuÇYÐç/è-ð}|þòô¡àeŸß€×ûkÃyþÿñþFðÿ ÿ¯—½?@o-¾@oÄú O1Àÿ þÞÖ‚Þ? ·À÷!ðàvþ¤½¿@oïcà«{¿%ñ|ªöŽïÓ·VÞVÞ¦ìZ°Ûßç:`Àç `-¿?-¿¾¾Õê€Ýtnºµòþ´òöŽoÁn|Ÿë€UŸ+€µþþ´þøøV|¨vÓ}¸éÖÊûÓÊÛ;¾»=ð}®V|®ÖúûÓú[à[à[ð¡ØM÷á¦[+ïO+oïøìöÀ÷¹Xð¹XëïOëooouÀ‡:`7݇›n­¼?­¼½ã[°Ûßç:`Àç `­¿?­¿¾¾Õê€Ýtnºµòþ´òöŽoÁn|Ÿë€UŸ+€µþþ´þøøV|¨vÓ}¸éÖÊûÓÊÛ;¾»=ð}®V|®ÖúûÓú[à[à[ð¡ØM÷á¦[+ïO+oïøìöÀ÷¹Xð¹XëïOëooouÀ‡:`7݇›n­¼?­¼½ã[°Ûßç:`Àç `­¿?­¿¾¾Õê€Ýtnºµòþ´òöŽoÁn|Ÿë€UŸ+€µþþ´þøøV|¨vÓ}¸éÖÊûÓÊÛ;¾»=ð}®V|®ÖúûÓú[à[à[ð¡ØM÷á¦[+ïO+oïøìöÀ÷¹Xð¹XëïOëooouÀ‡:`7݇›n­¼?­¼½ã[°Ûßç:`Àç `­¿?­¿¾¾Õê€Ýtnºµòþ´òöŽoÁn|Ÿë€UŸ+€µþþ´þøøV|¨vÓ}¸éÖÊûÓÊÛ;¾»=ð}®V|®ÖúûÓú[à[à[ð¡ØM÷á¦[+ïO+oïøìöÀ÷¹Xð¹XëïOëooouÀ‡:`7݇›n­¼?­¼½ã[°Ûßç:`Àç `­¿?­¿¾¾Õê€Ýtnºµòþ´òöŽoÁn|Ÿë€UŸ+€µþþ´þøøV|¨vÓ}¸éÖÊûÓÊgÅÿ7¿ùÍȲ<‘Îñ‚)ïÝ<Ö{⽪äÉúi=hë;óçøo|}ïëâùÎÉ~MÆ,>6îîb>Ȉx7&ïÝ3Ö{â½äÉúi¸ ÖwVÀ?¾÷´x¾s²_cŸœƒÇ?9ëhŸ¦«§~rÖ?9ëhoŸSW | ü‚^Y­«ŸÃ÷6 | | üxˆˆH®‚.h:Ïß¿ úf-¾µøA×ËêG¸ïBO,«_H. “äÞuØÀ›òDΈÇËQ¡¨x¿wíX+•'ë§õ r¬ï¬Ö°{}ïfñ|çd¿&cÀOö±ïg³Ñ¬įø…t™¬²Å¯lv­²g­,ð-ð­øPì¦ûpÓ­åÍË›©½°À·À·:àC°›îÃMÏ”•±Ÿ›=ž†¾¾Õê@Æ6]Å KãÏl–ß'ÛJ%ð½‹Äúl¼×ï²|ý¸·¥b}DŽ÷,‘ßû¸D¿W:_ŸIàçB=~“doF©Êù’¹÷Ǭa.dî]’ìïÌ÷³Àžcn_ø| ü,¼JXà[à´¸$Þß³À·À°š ¸¼ñ*X*^g-¾µøÕ+ëê{ÝM,ðc6±wüܮγÀ·À/§coŸ²«xÊÞ8i-¾µø±t$ÒÏs¤ßZüÿeµ Íd«ÄÕç=Æw÷{_ë}ñ^µ³xíôž¾ë{$ús|çgsà{Ÿ—è÷Jçë3fñÓù%ígeOª¨Ý‹ìØ ü, µXpd8òy,ð-ð­øPì¦ûpÓóÙ’ÙdoouÀ‡:`7݇›n­b|V1Ÿ×Éßßê€uÀnº7=Ÿ-™ýnñy3>0…Ì‹CšæÓf&ó{ã½*ű~zËåË:â;?˜À÷ŽGÇ2ù𙨗L?ÞF1sÖ3±pýÌR•c~o¼WH¼Õc'ô™³í÷r$e7Þ}™–‰õµÀO³«oŸ+ øIXÃLœ6üÌd Sß¡ Ÿ›Ìïm-~ÜÞN¼Ö7¯³?‚ÛÓå-3õ;øI°VvZn¡=õB¿AA”Lô2ñ{ÉüÞÖâ[‹_P¶À·wüŒé@•ÖZüBïY¡ß ›gYýèŒ|Ì+޵øÖâýÅÂþ”v„ŠÇ2&Mö³²é÷“ù½ñ^åã\C®oélZ‡Â< ¾ËÀ¾w,ýÊôÏ3Ò©'c¿0o·ð™]C¯¡~šïøpþ\¶ì¿¾¾Õê€Ýtnz¶Xû™ó~,ð-ð­øPì¦ûpÓ­¥Íœ¥Í–µ·À·À·:àC°›îÃMÏ«cŸ#sž‡¾¾Õê€Ýtnºµ´™³´Ù²öøøV|¨vÓ}¸éÙbuìsdÎó°À·À·:àC°›îÃM·–6s–6[ÖÞßßê€uÀnº7=[¬Ž}ŽÌyøøV|¨vÓ}¸éÖÒfÎÒfËÚ[à[à[ð¡ØM÷á¦g‹Õ±Ï‘9ÏÃßßê€uÀnº7ÝZÚÌYÚlY{ | |«>Ô»é>Üôl±:ö92çyXà[à[ð¡ØM÷á¦[K›9K›-kooouÀ‡:`7݇›žL«ƒvÕ Ó!Û £ ¿MæûÛ÷Jwbo_(Ч@„!ç[°¦¬É\×Bmz2ľWö+‹×ð UÀÿ2Ÿ¦òæ³NZà[‹_h؃ÔÊg äÛw+ô¦çÛ‚Øï“›ž‡Ý·ÄöÍßZ|«>Ô¬Øt¸‰§B®ô ‘&é>Éñù-=žÃ|®îøyÉt?—þ<|v1È¥Ϙ‘çÂsœò,µÓ±6øÌæY¾OEÿªÓÙ§Ð=É(ð±0§C^ a…M†˜ƒ`L‡2ñ3ðßÚÏÃý²òût=—z6†Ë~‰ò||®ߥë¹ðYO„<ÏMéøl|æ²,ß§Ÿ³iŸ²øXžˆ¯Ç±yÚ2iR¨x€¯§ÒñL ôÝâ\+>Û°4>W6?Û÷idºö)›€ß$D‘ÿŒ5$Ô²]žŽEò°øÏôVÈ3¿ŸŽgŠà‰|d<×Û!Ïu4Ï•-ÀÏÅ}J›þd3ðŸ3ÎÕËð/1î×¥³øÏUÙÿ7¹¸OøP\ ü(첇'bœ1hŸ@t"cä9ÔÕ·À·À[=¿þ»ò÷ m|w,‚uÚ'ø-ð3ühûdoÄ=iùï‡, ‘ó’yÂÅû^x†þ!Ïq†ñ¬'„ül|¼ï›¬×áóÛA†<Ǻ ºúwdbßð™LŒ1u&öiz²ô °ï“Q‹_؇·¿ïqø¯r¦€o÷ 124[ÖË?‚”lÙ´0¢Æßêq‚zl,ÁËFð[‹Ÿ›V7“ºdoou t ÑCÄnzlºµøÖâ[àçÞD{Ç·,A½· –à‚% ÊT½VþyÈ? 1“xޤêsíûæ‡waŸ»À–Ìs­h~4UûhŸ_ÀÿÀ©Rû¾ùs˜Xàç.ðkä ©¿ÿÞ‚3À™Ê½´ÀÏQà§R)ì{çÿáaoouÀ‡:`7݇›n-zþ[ôX{loouÀ‡:`7݇›ËØŸç¿G`oouÀ‡:`7݇›n-zþ[ôX{loouÀ‡:`7݇›ËØŸç¿G`oouÀ‡:`7݇›n-zþ[ôX{loouÀ‡:`7݇›ËØŸç¿G`oouÀ‡:ðÿÔñ 2mIEND®B`‚fifengine-0.4.2/doc/logo/FIFE_small_a3.png000066400000000000000000000677171341615052600201730ustar00rootroot00000000000000‰PNG  IHDRþÖW4¾sRGB®ÎégAMA± üa pHYsÃÃÇo¨dtEXtSoftwarePaint.NET v3.5.100ôr¡o>IDATx^í}ØTÕµ¶ EDzï½wb‰ÆÞ[ìÆ.Š[AQ) ˆ" R¤JQÄ‚¢b‹¨‘hì-vMÔssorssoþ{÷ÿ¾{öž9s朙3íÌ™9ËçYàw¾Sö^ï^}­í”RÛ ÉÄ‹ôrð ÄdÓc¸é"Ýã%ݽö[€/Àˆ!ȦÇpÓEâ‹Äà ð…bȲé1Üt‘ø"ñø|áò€lz 7]$¾H|¾_x †< ›ÃM‰/_€/Àˆ!ȦÇpÓEâ‹Äà ð…bȲé1Üt‘ø"ñø|áò€lz 7]$¾H|¾_x †< ›ÃM‰/_€/Àˆ!ȦÇpÓEâ‹Äà ð…bȲé1Úô??¹×0Ðí Ë¼¤>þÿzÐ% –¢Ô¶V À¯qàÄý@S@Ÿ‚”¡[}€ÿ½ùùÿßπÎ5–C ö~ `íºôžìôü3ð×þ7®t¨¾µqðkøe;Я@Û|À^(ð¿÷ÜûAÐñ ºrTï! À¯bà|-@ƒ^ý_ÀUõ`÷ûû¿ãyËA‡v’C º~• k:ô4ˆ¶xº¯ÉGÕrÿ?ã=îíÚAèü*>À´èTÐFmî `ÌvM©ï|Öñ~w‚FÊÝ@€Qà8»€Ž=úÏ€½6~¾Îxïé rDëàGø´•A‡‚–hCç ´ ×—Sâû½Ã‡øžI rTþàWø´‰AûùÇ2‚½ßïxß9ÔQÊü L?tè!=JÀ·ïÂHÄVÐXP+9Â;ø!Ì=4 ôyÀEà;ßé±&[@£AMä(ï! À/3ðiÓÛöƒ ƒ=êÀw¾ßÿ`­ý´»¥?øe>˜µèÐ{5ß-¸ëø d –ˆ_ø%ZHÚ¨ÆV¥ÍšO]PO|)¯«„W¿ïÿXÛ• #@uD(\à|Ú¢ óAÏ‚ Í¢+ ò½Gµßù?aÍ‚öI¶`ž|,ÀÏsÁhsÛ“6(mÑ|A…ëkøÎuüûphh{ÑrküÀ§milLÚš¬P‹x‹y‡Z¾s-¾ÄþÜ,€ÿ À÷>mHÐáÆ¦¤mY Тö»µ |çZ„}› ê%‡@ú! ÀwŸ¶¢±i;Ò†Œ`Kõ>q¾s½ÞÂ~Žu’C@m{àÓ&4¶áüI[±TàŠò}â|ç~¼Š}¾Ô:®‡@lOÐØ‚´ £ Òr¼[Üoהقσ.5Ó!+àÓÖ36m¿rªZî)ÀÏÜÿ'6Î5¨õC æO›ÎØv´ñª˜å~O~v^ø/ðÊàA»Öâ!P“À§ífl8ÚråQ5ÞÿÖS·Ûn_ÐzÐw ) ¶X+Û^»¿©\ïü7¬Ë*Б kå¨àÓF]hl6Únåb„ª½ïwG©Ç®è¦Æ4ÝùOºrÑ¿nÝ«ém›= j¿/„=ÿ ž±t hÇj>ªø´ÅŒMFÛŒ6š0­Ç|ºrµôävêü;¹Áîùïk»×W›®î®~xlOYOž¢v4´¨ê²«ø´¹ŒíÅqO´Å„9}ÖàõÛû«™?k¦Nßqû@€wk4®£VœÞ^}¾zYãì|ö5øp&hHµhU|ÚV £Œ­E›KÑg ¾t”–Ö”Ú§m¿]ŠvØ^ž†kíïŸQg{5{ÿæê9eÝsóÞ'àÏ›A}¢|Dø´¡Œ-E›Š¶•0]–5ø|Õjåéh¿«_BÂÿr§¸ Ú!ÂõŽ{è{‚®ïÛ@==¡§˜ÁøñðíP—¨‘>m%ÐÞ »A?ØsvoB ßq@suvÝ5¨ÏÜÙÐ.;¨³,ÕÅßñsK¼öâf»¨å§¶W/Nî£fìÝL³ëŽú©ë¿û$ï‹ûó9—¶ÜE­9§£úríp9ƒ¿?_ j…C ÀÇb 56m%a¤kðÃã{ª§Ç÷Tû5Pg&ÁîÙ0èœzÚmGu®¦Ô„ž»«ÇáÙÿÃÃ#ÕŸpKÞ7T-9±ºBâZü>Éq{ïÄá8έ¿“š{XKõö=ƒdß‚ñ.#N/€Æ€šUê¨ðñÑ}A·€~/`vØQºRÊŽm]7 r L lñmÐu Ú>"!®Á[¦wÖ á¸:Z[k0p2TÇŸn˜  ÕQ—á€`ïƒECÔwŒÊ‹þ¸a”zéf˜û4U»oï;ÏÐÏrÉÃÀhW´¯§ÝY}½n„ìqÀ=þ Ú:T¯Ü‡@ÙO›tèu{ðÃŽ*8¥çÍCiéJ)›ôÀ r†Þ.l¼³º°ÉÎêú> ÔÆK»ª/V×*}±ôžÅ¿h«5 ÞŸÏÑÏÙ!yP#0Z>ÿèÖ꽃å~p­þZ :T–lÁ²/ÛtèEPÔOFŠ)©j¯» ³º¢Ã®@»V¹4·€³ §ŸtQóÕ¬}›©oꣾyp¤úf]ééÓ{¨‡/ê¢&ôÚ]]dž;†> 2k"ðК:¢±~·7?üDPèµú7ÐÐA ’e – ø´Q@gƒ6ƒ$‹.¿^½{ï`5ÿ¨ÖZšZ°S­¶j»èÝEÍvV7ßE]Ñ~Wuß mÕ[s©¯ }µv„zî†^0šéw ñ}ô!dj V# 6`«;ï¦Ö_ÜE}ó˜lŒtÝÚTT¶`QÀÇÃ9¾ùÐ#ÆF‰”ô,`aC}:Á^˜Ü[MÞ8¥Æ»ÀN i‰n€~q‹]Ô% ÆÓÓE}²t˜úr͈ŠÑoï¨×V@|¯Ä!:ÜÚ€=øM k£>X<$Ô5:Oäñ~ßàÚY a…øò>ÄñÍÇ€Ö€J=¾9L@iGÐþ ÒOKwHÄ”d¯£¥fØ7¿´U]‚»åú^êóû‡«/VE‡>\4T=x~gu]ïÝuŒÿ)§6ÀC€š¿•¦‹ܺgõòÔ¾bä©%:‰Oñ÷) ~A@ÀÇ 9¾ùÐRÐ_ó8•bä ëñþÂ!ZÊÚï|°_Ù¡žZ„ßÛ6k€ú vv”éÓeÃÔæq=Ô­{6UcqP]Ú²nòК€5ŒƒP&\8®Ûnê8%ÿ°~¤ðMá‡À»àÇëA]³Yol‰yøóOA™[®Kw^Ñ™õÒ-}ÔôQMžy'àé‰O>!!)))ÙéA¿¾Ïîêó:«÷æQ¿_¶GÕÑ«ÓûÃoÑF›ü&­ ¸µ€fÍbø->Z2T€Â®Ý6#j“ˆs_âí.ü·£m¸¤«ººËnÉP\RÂðTç)ý´sÌøÛÐõÔÕ=ÔÇ‹‡ªO– «zzŽÇÕguÔÑh<´)àp j3À„­pnýÕm{7E⑘E Ô‹ÝÒ?ð—ùÀØØL}]t|Bg¢Mš ï<¥¥ Uâ+¾£W딾ê#¾é˜:_Ñ]MÑ$ýÀ:Ð  _Ã}0¤É¤%V>zy7ÅÄ"áɼC¢#óþe²È¹™êDJæka?^ u)¬dHVDZ*NçÐ;¤<3Ù´Ïø»±á/o»«š{HKõüÄ>ü!Ǽ}×`µá¢®êæ!Ó§úï’þ, b¹ð5ˆ<3€=EPeê•yŸ¿€…üX3±˜t2MÕ4ÙÔ‚e© )omy#åj=løqÝê«å'·W¿¹µ¿zgî`¡kðìø^è1ÐEF‰¤ ¤ýí)CúüØ6 ‹fÀïW “ %¬®,øLÔ‰íBþUm/몮êXO·®bgJJO)o³ìÀ°7 j¤¾ ‹zsö@õÖœABy®Á+Sú©ÅÇ·E¢S½d éü£ô×Å@ ÕŸ‡0„ØNAŒüffÿØò­³û üqqþ'ˇ©ûNl«™‹M( z¶¢"è­jo=öÖ–gxŽN»ÛQû¾ùšžêÍ; •` ¶Í¨ÖžÓG:¤¿Ét8þègáþðpfÏ@îÛ5]wSO\Õ=biÐL÷¬óÏ™¹‡_dñØœœ¯AJ ¿¼:‡ 'Ù¥–ÒĪö,“%èYDCÐÓ–g8ná1mÔ¯'÷UoÌ(T¦5xáÀÈs ï„ŽS«úÛ°Ÿµû ~»‡ÜG^· NÄÏîUÇàOý²÷‚¿I­ŸN¡Ç¯ì¦“mœ-¦½@o½ö:LkßWŸÙI½6}€Ú6c PHkðü }Ô¼Ã[«ËÚìª_ö³^ãôsƒŸ{ËÿÇòåßÞ‹Á!ë ¾qðÕäDÙOqú/=¥–Üîžò=íE§¤'è™UFF›>²©zôÒnpØ ªàl½¥ÂÔµp r5øÝOµŸæ™Sò;÷™íÅž¼¦G-w žP,ð9¼¢fÔým·È:h zëÄ£‡yî!­Ôx_›Ö_(bk°þÂ.ê–¡uÌß:ý´Ç? øyÐdXù˺cQ-ñ9¾åb?±Ú„ã ì  ¹qI‰ïz–Ï.=±=ì÷~ê•)ý…"¾›¯î¥fÿ¼|/u´Ç?ø­À0â›wÕÌàÅÿˆj>Ç?q íñl€·Ž<«Þ33lòÀFjÝy]ÔÖ›ú Uá¼?À¢cÚ*&N¿å‘ëPÉÁ!ì}X¥¼ÿmÁe¹öñá;]U ÀqO·ÿ¼¹væä¼Ó{OqZJmº¢‡úõ}…jd ÖÀ{}ï9Õ~7¯0DËÊÂ/¨:3àÑ¢o|ßEüTç7_ÛC¾»óšKZÔUóhû½·zqb_¡]ƒG/鮦hªs1òá: çÜ¢š‡L.ð9Š:’RŸƒ&V™˜—ÏfòZzƒï?µ£záú>B1Zƒgà˜{P+íØË—g8Áh šF|pÈ1¥>{zE øoÝ=HÝyP rËgóxzOÚDm¸°›zn|¡¯Á–kû¨e'´WWwJÏáÂO,¾Z{n§¨i_*ààó”}Í&oÀ©dsœ×ðtŸs@Kõä=Õ³ãz ɤñÀºs» ¾¢qÞ‚„ì-ÀéQÀÞáÇ\M7sfî9|*ùQ4±æÜŽºX#_À_Ýq7µä¸vŠê¬A.xüÒîjö¾-<»rñÞdf=cïJw ~ºdÀ7¾ŠÍ©¿Æ•N›k¨þOÐH=xvµùª^B²yóÀSWöR j«®lW/oaóÐ…+)ýo-5ð·TJêß2¬q ÅgÚæíû4W^Ô]=•^HÖ <°úôNjR߆ÃĄ̃VðÜ“J ü™•ú˜»o•øc`Ã?tNWµilO!Yƒ²ðÀ¼CÛ$K~³i.ê^jàŸZ)à3‰"—zÏŸŸ ƨfêÑ1ÝÕã—ô’5( ¬=£³×¥~ $V°ü÷ßÑœsõ;÷Œß³RÀgUàÛk¨òÏÇéüT~!YƒBy`Ãù]Õ”!MtO† üÇlÑ N~1—´çÏóþþß*þ×fô ¼ðÎ º¢m=µâ¤Žjã…Ý…d òâ9?o©Î­—èÀ”±Ux%0bžyGÉo¤þË•ø(v¶Ígñ×ò´žÜþ3»¨GFw’5ÈÊKŽm¯Æ¢…Z¡üÆÌ¾J`Ä<óÌrÿ®J|óðY2ëÞŒñÝ1– “h²m’î—Û4šhÌÞ§…zÀõç ɤóÀêS;©z7Lõíóà7ËgäÅ)ÚèvlnÞ›½óJ?ÐÄܼT}#ñÏ®ðùL¯\|v²}áú¾jþám<Õ2]_o›d²6ªï®h·«ZpD[õÐÙ]…d ´&8cTs]ºÍî=ìÛGAág×3½÷áÑ]Õsúx vuªFþçîX.‰?°BåYuw <­/Mê«X{ÍDi˜Pãlµ”l”ÉvØl’iZg±Aæ$tm]qBµ/Ï5˜wHkueûzÉÆ¶o%¹³[/¥:[®-9¾z€gQ+ý¼4Íc»V ø¿ ú¼{Fâïàÿ³àŸù³f ÍziÖͳ”–›ÁSx=Nãq]ëkÓ€›g»ãêθh’Éœ}vie+-6iài¿úÔÎê_vŠÉÐŽŸˆ„Žíb8µIÝ´Ó´ëfÙ®nÕ ÿCÄL Ûü«^º ëùëú¨oè«ÖœÑÉø‹^ |à™óË|~ÎÝýãcl•û„%°_FK,J}n7å9ÔÔ³gÚeÑICÕ=Øl£L;ËŽ›Î.­ÜÈÙmwÔZ­9­³P ¯ÁJDxnÙLýªS=u9L>.¥žÓz8¬ƒ‚Á)õo„SxãEÝÔ³×ôV[®í”ö/Aа»—į`±ÎèrA%€ÿðE]<úÙk{AêüFêSã&=ƒÍÚ|eOu×-uï{-íÍ<;n67›Ï)9|ÉQWô,>ªZ}r'¡ZƒU'uRwíßJ]‡&-²Aà_Ùà‡ÆGç0KlµÔ‡Ïf×t®¯˜¦û4¤<ùˆüDmò#í)hî@_?/às˜j%ðg-7ðÇTâÞ›ÔÛs¡Á°Å—ÑN«ü.©ÏJ,ÚþÇtSÓ‡7M±¤´ç¦_ iO& 3Pê³{{åÏÜ«¹Zv\uÿ‰„ª| ÞVã¼®÷îj|ÏÝõÏ <ðé转M]L@ÚE«ü Žl«k<È7äjÔ"©MÒ—Dгñ*;úºÏì•Àžù? ]Ê üá•ø86Þð:aï?­£Úzs¿¤ÊÏÍá&ñ”¦ŠÆS{3*­ž¼¼§¶ËèÔãfsÓµ´Æ÷¬¯™ƒµþ“4T7YæØJ­8¾£Zù ¡j[ƒ%Ç´W³0J{ò †z?oèÛ@ì×¢Ÿ¾–ú˜Ég¥>ÏR\fø‘O¨)fH{øèK¢€¡ a÷&7?Rs¬6ðÌ·‚‚¾ çž±ñëâAÿ û¿z`„'ðï=¢µzå–þ)©ïpôi•§öÓ8½yŠoº¬§zâÒê>Ôç“ ’ÒÌ ¥=˜ƒLBf¹yh#5eÆê6ŒlZpX[µü¸ŽBU°ËŽí ìi#›(VuÞ4¤‘ºq`C5±hsFêC»³RŸ‘ u(ß&_?ü¤=µIJ{ú”(h¼zCLѤRÀ_Rvàð¿6ðù<¯„‰™{7W¯¢×»Sê»Uþ§©ò©¿il¢xg#ZoÝ}pk5êU@2³®È$d2 7rú¨&ŠÓWïÜ¿…Z|d;µô˜B]ƒù‡µÁˆ¬æzþ!?exc}€OÜ()õµÊƒþ&´Og:7¥<ù|‘öÐÝ=§´§ ñjù6ïÈÖ•þذ€¿¼À§Þ­^MêßPOµá° ‚ßÏÑÇÍ| *7—§ûã÷ÐU|ëÎê¢n³PLHûF i¦!ó‰f å6§àÎ> ¹šwhkuß‘íաȬÁ¢#Ú©¹·TÌšãl¼8¨oݳ©>¸oÖæ”ú7¢A ¸6Žîž¨âž4ÒžÚaʶO…ïœÒž¦¤—ÙÉ.Q•Àž¹WXÀ¿¼È t/80~ƒ¡•¯Nø1K-ÓÑ×G;h¬£/©òã”çiÏæð¯<¡0‹–ö`-íño2™‰Luç-Ô]‡´Ô=ÖÈ<‹o/TÁ5X„g³-úÜC[êöל„Ãy Ìù¸ 6µ5-õÊÏÎºÌØ|ä‚nôÜÿ'´´O-íCϾ£@ápJûG/éæ |¶w¯.þϬð÷©Àê vŸñù×1¸‘Rß­ògsôY•ŸÝzþ çwÓ9ü÷ÓNK‹iTñÁ©½Z~Z{µôävê¾ÛªEÇ·Q Žm£µ¯{p S£Ô§v¶šÓ°×Õ5Q‘é!íS½Üá;š‘4'Éc³~Ö<ø¬©Ð«ÃþÚ°ÿÊ­Þ 9˜Ä³mÆ€¤ÊŸtô1×#£ÏÏÑ·‘Rߨü”¬ÜzàôÎj9Šyæž`.«â“éÈ|dB2#G-¯B‹°ÕgvTKÀtó~ÞF¨kp丹ÔA­>»£º“xÀ.;‡,ÜÅж’RÿÈVÚ÷Âθ«q`kÐcÿœÒžûëtèå¾³Òžš%ªºMN†÷ÂÆƒyÞþa\Øúá}Þ 9VžÖAývæÀ4©ŸÛ×yü>Ž>¨|~RŸjÿZ€Í)ÕRHtªyiÒLHf$S’98¯“ZwAgµöìÎjÑáíÔÝû¶*` îÙ¯ ÔtTOŽî¬ÝIO­aïEš{+(õ¡e%¤>Ì+Hý…È_ybµ†WØ/îÛCFÚÓ„sÛöù†ï¬´§fé5y‡ŸaãÁ<¯qØÀ?0ìýþÑQ 9X…7IPm#øs9úXÄãÊ賎> ~§Ô§Ô ôX‹âJ’•Èû^r|û„´óQÚ“É”dN2)ûª¯¿.íªÖœsRë®}Z \ÖK<|aµá¨é¨ÑàAúÀùÔšs:ê9‰Ô®–©O 5²U¨-àáÌ}zP«ø]ŒŠÛž½ ßÑ¡GÛž¼µmÆ@Ï™{³î xÞù‚¾(çž±ñ›VàC3fÝÓ¶šÔÌ7gR¿ðCåäè#ø]}iŽ>¨ü´ )5(=(E(MÈ`Ìá_Ž4^ÚœZÅ3’)ÉœdR2+™vãe]ÕcWtS_Ù]­Âpι?k­æìÕJÈg î=¨ š\ ‹î*€ôrHiÔ¶ó}h ¥>@M©O•ŸRZÖrHø•'à0ÀaÌC™ ç!M*þÃ^½ÂwNiOðŸQgû ´äÄŠ4àx8tàð6ø™uå´¯X3Í$žßÝ1HK}·Ê_*G_Jêü`42óøµ´Ax'!í;k&ÕÒLKæ%?yu=Â{œ“KQüsǨVBŽ5¸ âguV›Ç#evÖéj$Ö\ {ü2€ZÓzJ}hQVê¯Ä!ºÜÔPðÖÒ‡2M2Ò)i_@ø>!g²Ž–öˆQŧ´þúÞ‰=8N>ÜpI—JHü*ü aŸé³ÎÞg¬Ég±Å[si©ÿ†–ú)•?/GÓyMxÏÓÑiBcÙ.Ž…+ÌágïÊ“;hàkif%Ó’yÉÄdfNWáÀOV>qywu/B·okš=¢%L§Žê™ëz©-‘1w’h~¶Sg‡Ú;ÚT¹u65­Šùøºx*)í*¾—C¯á;jÔ$©Q>†}e“wk®&÷®ð¯ð'† |:Ö,ðm#ÍóÑGÿí»«ßÝIðgJýB}šŒ>gx/éè£Ê©ÿ 4’—ÝA-9º½Z{f'ͬdZ-íÁÄdf25™›C_¼¹úõ”¾ê” ßµwk5kXËØÑâ#Ú«gÆ£—:Ö¼x¯8ŸÅÜyOQ;ÒR?¡òSâßÌÊ%Gô8dyØòÐåáËCØéÐ+GøNK{ø¨QÒg“lÍåhÈùö¼A•~«Jÿˆ°O•/ |¶FÂé{6irs(õ­Ê¯}øY3úŠtôÝoT~2"’ŒyšÁz8§Ò¤=˜šÌM&'³oÖW½z’B¦÷S`Rˬ=ZªCZÔ<ÍÝ·µÚteÅY Ͼ<ª5BJÌç(õ¡=m¤þã88yÚڮ˴硛°íý¥½Û¡WhøÎJ{j” A8«î ;ß¡îóЈ°ÿ]! /Ú¹glü6a Dà»;è>w]o‡Ôw9úXÄ“-£Ïáèc±3ºòqô­Ð*¿‘ú(Þaÿ"¤ñR}⪚™)íÉÜdr2;™þµ°‘æÉYk[§öƒÉÐ^Ý6¨yMÒí{´Ðý·Í†ôýfR¬qðmŽwh?<© qŸÔß0¦+R¬åaˆ `M z§Šï%í˾£ßˆÒžB…é¿ìÉç´ó)xÂÆž÷DÅ€oÀÿ}˜ýæ]Ó€Oµëœz;ª—vSïÌ ©•ßÇѧ‹x|zôÙ"k¸Ã{Œ;U~?GŸUùɨ‹i¶ðvjÁ!mµãŠÀ×ÒLNf'Ó“ù ‚7怩æTTŸG#‘»Þ޿yÍ5£ßÞ>@½}42ìßwüø÷k3q SêCûa“JŒOÁº¶;׎kH Šý(<\yȦ9ôüÂw0Õ ­¾s‡ïè7¢´§)Én>ºmÆI!Ć.abÀ<ë–JS˜ýÅšáøÖ¾·Í4éY÷žÁêm þŽ>¶åFWÛ£ÏÆö“¥»i޾TO2£ÏÇÑ—Pù!©À°dÜ·SÌ>ãßÅá””ö`ú×ÁüÁ@P¼;°záõÁâ!jÓå=ÔÌa-ÔԾͪ–˜¾ü*´-~Ï{ «wæaoÐIéMtÔr^§Ô‡Êσð…û(§\€ßᚱ臚“—´Ï+|Ç||¯ê;¶Ó2­²™Ý鬾cÍSsi*:¥=… ;8SМi[pÃÎgï†01`žu\¥?%ì¶^UkßsPƽGµQïÍ¢Þ¹àw9ú¶9òøóvô¡˜Ã:úlÃE¹}dX2.˜ÌÌÜu¦ñ.…ú,¼Ø”öd~‚€` (‚ä£%CÕ'ˇ© Õ1i‚Jï¦UC³­Ø2¡·bÑÊLj)f\¾¿hˆbZj5ÔnÞ¸Ñh;4w6bYÜÃ5âaá–ön‡^©Ãwº–鬓¾£Šo¤ý[öä«‹ÑšÀ§¦y"J49Y¸6ð¼N•þñaôeh”©{žÇ["³pâýù`®{~#õƒ8úl·ž-¦-·³G_FFU~$…Pê»3úllßíè³*¿-Þa**\Œ9¿ 5W«ø”öÁA,Ÿ4Ÿ­ÚCQÃy‡5ˆ›{64ñ€¢zÍ1Ñ_¬®ÿÔàÇìC-õ¡Í¼­FK}h9[à—áÉ5™·?*í QÚÓ?ÂC“ÍNܶ}.‡^*|—h°‘Í¡çW}ç ß1JDŸÒ~Û̺ /›j&'îÀÁǬÍ1ðS¡ /‰sÏØøCþhÝJIÆ2ö=Ï–Y,ªÞ#øÔç)‘ÑW€£ÏÆöué.3ú~ŸŒ>?GŸUùÉà´áç"}•>i÷€o¥=Aò{H{ ö¤Ç˜m›©‚މė›º7‰1¦þÉ’aêÛ‡Gª¯×P_®®>ÇÁõéÊ=Ô'8ȨÅ|`¤>¥<¥¶^äñS¢´§f”.í+¾{þ"šŽ4!_˜Ø[q;5Lkç3žÏmÈx¶âÀ7àÿK˜~bØ)9T»ØŒƒ–B¥¼’Ũü¥qôõÔ=Ù|‹x’yüé}^޾¤Ô£“ᙿÏ^ /L죥=AòéÊa4AD0ýñ‘Qе ߨ•LíÓLÝØ¥IÅéÑ*ð奄Û8JýaÃHT#ÕWŽÐÚŠSê¿iÿz2u™ß~74Ÿ{ èý¤}¥Ãw”öü>š#ñÊÝp:øè¤ “ÿñ¬™Qþ–0?œùñŒ£2žª§ä@ýº°IH|8Æ õ*¿ÃÑG/¶Œ>GÛ,ë}A},âqeôYG=ÓNG¥¾Vù $ðܹg+5{d¢•÷›°}µ´h-í¦ï*‚ëÇMœb´·úúÁQÈVë¢&un¬&v Ÿ¦!êÀ¥?nÚ[3ýOì©8Õø;PÔN’RuBê?›Þþmõ·ò›ùíÔx¸óµŠiOß/|ǘ½+Y'Œð¥=MGšk9蜶c|<¬Ãä<ëÔ¨f˜ÎŒ.ÆQýüÄL<Ú`n©Ÿæè#ø³9ú8/[énGÁïÊèKsô'Õ[J}ª»”úÌßg ëí õçuÕ’_K{€ˆ`"¨®Ä:lOý ´/ºáP7th ñ Y^wFööI¼ÞëO8˜¨•üµ\oÀFf”ƒßÆoä·&¤=?+í=z¾á;æã{Uß•)|g¥=µH–sƇ¯&|@Ü›0ùÏêàŸæ‡3ëÍéѧÝEà?ì£Å°%©òçrô¡ð"g[nÇ0ŽàŽ>—ÊïÈèËpôñRÿH}æïÏBïN„\þLU ô›þŸ7ï§þ¼ùçè0¾á#„Á;úØ–Û¯GŸ©Ûgg^›ÑWGŸ.×…Êo¥>Òwgm¡nÜB«À´3­Š¯AæýO›÷W?=}€úþñýÕ£õQ7@õߦaÉhÆ–(PŽg¨~Ú|@¿ü.à“hçÓÁ¿áv| ¥=¿ßhzÙ¤}(á;ì9+73ÂwÈУC؆ïè(¦´ÿ¾#Æëí|=š˜Ô8oÀd¦0yÏz¹З̫oœ{;à…þÖ¹ÜÀç`ÌUh{EÏòG‹þ;út[n$‚ëè£ KϵŸ£O«üZê'r÷™Â;}Fy£Þüóû‘ž|J^€`Ô |ú ÐÁꋵû!½µ‹ßà/‚nìÚ㡨Ÿâ}I|žeï’ú¬Š¤ Ïwž‰wç7ð[rIû(†ï´Šol{J{j‘ãºí¦5Kš–6¤ÇÆžañ½yÎ]‘¾ÿËa.ÀE͉ åQýâ´Ó{Ñîú÷°)õ?2R¿ Gç»©n=G¼üŒW³$£G3úJàè£zL‰9RÿÖ‰ô]þùŸï6BêßJû$ðŸ9DýôÌ¡ Ã°œ†mòÿh kN멾٠ë{ñž§ß)õ?^2\)ñ€"èy`e“öåß%¦á¤Mºu;s6Ïtfè9Ãwt3†¥˜Œ’£{ZåðTÓú!}a< /ߌ2Ч\Òžà´Àö0õÓ³‡«??sòÿ‡!ñ§Y àžý;¨—ü¿{„þ} IðC›HHþ„Ôÿvý>jýùÝ=üÓú£=&š'|g¾{¦CϾ3©¹niVøÎæã§'ë$òñ=†‡ÉG¬5`CMŽZ§iicùì´&ßãY£üsÂ\ö¼wŸI<Ÿ­@¶Ø2€_«üÙ}¶[;¬ätôeiËÍžnôÄgfô•ÆÑçTùé»Ítß½¶Sï/iTpè V‚Vƒ÷HõÓ–£Ôw¡>¯Ÿvüy©ÿÓ´D‰ð(\{´¾^ÿ^üéRÿǧ@xn€ÖF¦à âä”ötNz9ô<Ãw>ùø,ì¡ySªæ™ ‡^bÒ-Ó¶í´ÒóñSá;­âCÚÓgô¤>iÀ§¦ÉX~È 8þ ŒÕ‰ð† |ö´·É;”øAÕg'žÏWO—úNGcû°Ý|3ú’޾T[îçŒÊOµQ·åÎåèc[nG>ÛOdô%ºõ0Õ–îfdôù8ú¬ÊOÉJ©K/¤ïöhª&#‹oÍ©ÝÔWëösIûè`>FýôܱêÓU£ûo×$ø'vj¢ž¸l°úÓf\ó®±Àßâ>µ£ò¿yçH„ãÚ胇õ<ˆ¬Âwtªø% ߥµÓ2Í3¾ãÀKŸÙwÔÔšåœ;÷¤[¿ê;ëÐc²zVÚÓgÄäJ|ú’œIª¦|Öy~?¤¾VùaëSåOsô I•îð;{ôY•ÿצn_Ïß+ÀÑg‹x´£*«³G_FF½üÈ^óÊè³±}·£ÏVìQò2wŸé»ÌàcèíÕé#’*¾•öNÐÿåù_¨¿<‚!þdÀÏ"~Gªï;c§újÀó€á³nÑÒ>Q.ì'í£¾Ó=góLÓ`C;ôŒmï ßѶ§´§Ù¸è¸¶À M3,~7ÏUà/ k!XΪt]ÆV-ðÙÞê‹UÈGš¨ÛÑÇXlf鮣[OrênÿÔÔ]çü=ãèËlË]˜£Ïªüºt—}ZFÆw™Ø¾Ÿ£/!õ¡ò˜“º u·ccu}ûF(zé¨>\ 矖öÇ$%} ô'ð–xü)©ÿçg†]»œv-tZ0–lÒ¾&ÂwPñ™škÃwôQpP€pßÅHÖqªú×v¯6ð‡GøcÂþçÈ÷>“x¾DI(¥~%}‰n=}ðòÛ}^},`±yüÎŒ>?GŸ–úÈé ü×µEXîô^êÛTç*~øü '%HƒßŸ*ÿ±(ÝOÍÙ»ºiÀÔ"x ô<`xÐø:ô|’uª1|G‡U|Fˆ(@nBE¨>LJkãs wXüŽçü?PݨxX ÁL¶Ñ ™§Ÿ.ñ9Ü⫵¨ #ø£ï÷6¼—¯£™]ìÌ’uþžéÑç™Ñçãès¶åÎéèc+£ÏÛ§ºtôœVågî¾öà#&cצêéq($yàÏü/×®–×]MhÛHk <@´´7*¾—C/¯ðÛi¹jí£¾£´§ŠÏÍÆk:ï–|O ‹ßñœwKú’;÷Œ_/ø¯°ãê.õ2€ÏÍø5ì_¢ºÍªü©ð^™}6GcûÚÖ÷/ݵŽ>Û­‡)­ÎÒ]¿Œ>/GŸ®Ø3RŸ ¶á»™C‘àtÿ¡F§«úÏN®Îä<8(ío4ÒÞ:ôʾcü̾+6|ç”ötmU7CÕç•°xÏYYàð¿ÖbLÞ8áÕwØø¸ñ <­”úVåO8úö(ØÑgtjGÂC[®Íœ¿§Kw™Ñ‡“;£ÏÝ­'˜£¯mFénšÊïÈèËpôAB´VêÌü[§îe¤¾uî%Ôü‡$R|¯3ÒžG.i_|øÓˆÜÍ33¦á¸ÂwXcvÖaí=ùô·0ÚRêð•ö4‹ü} |W8ƒRÂâu<çò¨yX‹Á^gîpÞ }¨oÑ"!õ¡ò{9ú¨ò—ÛÑÇn=˜ÒÊù{ò‘чaz—ÆáìÑW„£OÇö­£à§ÊN0§?iëÓÞ§]<€ßÙCÚgwèÑßPºð]ª?~ÖÙw®vZOôÏÂéÊÖi<”“í´`¢±øŠÉ:¶yf>á;š‡´íé$~ãK=€rŽŸEø—‡|ÚóiÀ‡óårôãûuì߬C=¸Cê{:ú~¯}ió÷˜Ô[߯-7ñcÿ¶ÜÞHð§MÝÍTù‹uôi•ßdôy9ú&ÀÑGðoº§qôgŸvú§ï–ö5¾c;-$sù…ï¨!’gè$æØ,/à³MZH¼þxÎîQþ>!-†â¤g®þ%þØÖuÑß ½ß(õʯ}Œíã÷uô±A§éÑ—èÖc¦î²GŸÑŽ>‚ßäñ{ÍßÓm¹Í0ÏŒ¾8ú¶NEZn2™'‘ÔÃ/8´s†CÏ?|‡ ½VßÙ =æ`ð°æ¾q’’WóÌ´||S}ç ßÑ<$ÏPcd3M |›«OÃ> !ñú'¥}Yœ{ÆÆß‹Áªì‹Â†Nà3ÜBà³m3XPê»UþœŽ>€ßkê®Æaëöoè«ÕJßn=}œåëìѧÛrs‡iËÍÑGÚÒÝ GU~—£oëäöëtZx€ŸoøÅB^µöa…ïX9I Óª9#áÅ<òñÙ<ÓY}çßQÅ'èé$fÕ§øìô›g<yàðÆ¢°µ³,W¶Øs“z¡ýÓ(-õóqôÙ¶ÜÌä"øõü=LJÍ:ÏÃÑg»õrôqþžÉã÷ÌèøÙZËÝ£/G_cí­ß:•À7i¼:57Q”³èðÎå ßaˆ³Uv1á;ëÐÛlz´íÙ¥(w>~bÒ­†ãU}çßiiM‘æ" Â.mYIb¨Î3e¹7 µǵÕüµaŸM( |&T0£Š^WžÌœ©n›>–ÄÑGð£µuÆ0öè³E<°õ}3úŽ>Û–;­t7ˆ£m¹“=úR±ýdF½üŽÒ]gl_gôGßÖ)HçÕ9üéDàG-|ÇA&¬…`´„‡i²Š¥¬´OŸ†ƒñdVß9Ãw)i?BkŒû7Ðéà̵8î8 E˜ÿ jþ¸0€Ïgð$¶­·,ðWœÞAw¥¥Ô·*?ûÓûeôÙºý”£Ïgþ^GŸ.âÉêè3^þŽ>]·o:ófvëI´¦fÿº”ÔOïÖ“ÍÑ÷ÊTæñ³r/Ñ9ºá;‚Þ'|÷B‰ªïœá;J{ò ¥=ùæŠö»:€_GçŽ,=9Ôͪø†üëû5H>‚¹‡µR?«òϱm¹Ù™×4ìÈÈèCÙ¬ ïÙŒ¾W¦îaª÷X¯Ÿ"?W>~Âw<\=Ãwtè•(|—°íÒþCdðÑoDÇ1+@m³Í —t Kâ]JЗ͹glü¦a־͓íµm¡ÎÔ­ž]Rß3¶ïӣ϶åövô9Šxàè£ÔÉÚ–›I=P[ÝSw“±}ãèóm˧£Ïªü©Ò]Û‡£O_wÕqÒ¡è Ô©6ªï`’±± ÛiÑGÃýKk§åhžé¬¾s†ï¬´§èõY’Àgž¾m¯Í‘Þ!ñø#U|þ¯ÂX˜Å¿h“‘¶;®[ýÔ€þœŽ>vëIãHÍß+©£àwöèËÈèËâè³*NG¼ü¶GŸWF߫ӆ™†죗¢%GuÖ%·Þµö5¾Cþ›gz†ï¨âiϨÐs7ôJ¥ë: t8ÿ/ þÆ3&Uð7„±0]Ø9™ÄÃÙÆòÿû>1à!5ÝÅ:ú¸±¾}œ¿—1u×Qºëpôù¶åötô%t&çï!©'ëü½l}>Ž>«ò³pÆÏÑ—>Ût¥Ó’£;宾cøŽýñ]­²k-|§çôä:ŠÝ¡<:”9Þ, þÆ3Žª6àO caž½¾Wf,ž}iüñ‰Ä€‡B}üzꮣ*e¶Œ¾ÀŽ>ŒÜ~ ×ü½b}ìÖcv¼:m¨i˜i[f'þ\ à—¤úŽá;¼¯t[á;úƒzŽ[qz{8éÑO…ò.@H/ Þ6Ïh[mÀ?2ŒÅáŒy¯çÏóùâL7#õÿ¸¾@GÒ;¶}6¶ŸÌè+ÐÑgGnkGÛr£3¯oFÁ¯vøwëÑ#¸r8ú^6Ä4çdü-;¦SöZ{þø5Ïdõ¾•þ ÷컨„ï(í bTèîÃZfxôiJ†ÁÛxÆ¥}Y{ÆÆoÆâpÀ$[Û1Z<™yB?=¡§ÞÖí§fº¥Â{…8ú8+=-ß+¶_nGÁŸ-£àgáŒÍès;ú^#ðõŽtZvl§24Ï R}‡b&4/¡óS7Ïdõ‰Ù{Uß•;|—’ö˜LŒ™…SG4Ñæ£uì1Uwþ_¼gΔϚÑçáè{uú`3ûŽSxRDà—·yfaÕwYÃwÌÇ/Aõ3|ç”ö4¯…t·w¬GÞ‘­Âþ´jþ¦rŸ÷¿ª#r8kp£Ø~Û>;%õ]Ž>ñpô±‚+5u7OGÛr#ÅÔÙ–û1´„.ÞÑ×.Ñ£Ž>ŽÜÖSw½çïÑËo‡q¼6Þh=…'–àG y¦ÍÐ{ ¹ùNÃñ ßqŽ™}$|GÛž&!¥ý7ø»—co5:î†Á×xÆ Õ ü©a,ÐÍCeØù³öKŸi–ÕчB ¯}i“xŠuôüþ¥»¶n¿xGŸ¹œº›™Ñ§¯‡]¦ÓŠã;9Ze‡¾cbA†l°±ÉdèÉÇ÷®¾óž†“5|‡ =š~niÿÁâ!©ºœ™·éêîa¿Kµÿaÿ®CZfØù‘Ñç~¶vôÁËÏÓÜ×ÑÇn=¦GŸmËÍùi¬äbE×[i޾TO6GŸUù)Å~Ý­ÇH}›ÑÄÑg‹xè5Ïéè#ø=}¯MhorênŠØ ÇkŽß!=Ø9鶘ðuè­G“&4Ѷš_®ê»døÎ8ô8”•|òÚÌ~{lðúÊ­ýÂþ_Á¿ÛW+ð;‡|ææsl±Óο¬m]õg8öœÏÏËÑð{MÝM©ü%pôqþ^¶Œ>ÎßCRoFŸÃÑgÛr3_K}Û–Ûåèû Zˆs–½›Vþ¢Sþ³ïØ<3GøŽåÇì7HO>–8fŒ‡ýlQFiï7 '¬ê;gøŽB¹tÓAœÖn æ$§7}ˆ|!ðõóå}Ù½úö¥±@)÷"=zy·Œ9z´óYKí~¶·£Ï»[Æ‘cþž.ÝõqôÙIÉ7Œí³ºŽ#¤(±Ü¤æ™9Ãwl§…ËšK¡Í3³…ïhÛS+$ÏÎÚ¯Y2~ÏNOTó9ž½Üülîß§ÚZ¹Š!˜³vÙ!Cݧ à÷ìB}¯”æècl_÷èóqôaø&ÛB¹çïy;úÒ‹x²eô¥9ú`ggÍès8ú¶âPb*ª›|§´kö]YÂwì¡gæÚÛÙw~ÕwÎðSÚ“o&öo˜TóíXlvã)7?ãþÿ Ú±Úß+„…Òå’nuå/;ønRFlß§GŸ¿ÄÑG DIÄÙëžÝz0¶™«´©»fÏcG_ª-w"µ5Ù­'—£m¹‘Ô“>Ïá胗Ÿ}¿Fb7±ýµj Ò“O_}LbU {ò€qOÃa¿@¶ çáAg$‡ø;ô¢¾KHû„ÿƒüÁ6nN5ÿ,h•‹ŽO凔‘¯_)èÃtîí€ú{Ioó§ê>7lî¡-³žÎŽ>‚ÿÁm¹µÔO•îfdô¡ÜNÝõmËöQ~Ýz˜ÂêíèK5èÌéèÃ$/G߯'÷Õ•en"ho·Õw ßô0Øî+.á;j–Oâc;7›­G5ŸZåCŽŒÐ2òô=U|“º»µŒ‹¤7kÚÈ&êþÍCgW˲9ú8ÏoKwŽ>Û–› ÓÚrçrôüÎŒ>Ïù{f‡m˽êäÄÈmÆÝ—û8úìÈm¯Œ¾az|¶ =ã]Dà³È‡a@†äàNvø¥q/ê8ÃwhN'£»ú®šÃw”ò–Oßž7(ÙX“µ Ô&ÏÜyÅjÐró2î^­n¹kþ‘­õÆpƒlÑSys=7—£OƒßŒàb_6/•?[énpG_O] ÂdÏn=;úÚhÛØþ û¨ß¯À0Høn¿¨ê;³÷ß%’™¨õ057Ìæ™~á;'¯¼ǰm³Å¤ªùgÔÙA½q§w84ŸåùóÁµüsòüðœ€ußoÍ9õÆpƒôøl“»$æštô±ˆÇ¯tWƒ˜l3úJåèÛìÌèãü=$µ¸çï%}¾i¤¾o[î,¥»ÏÁÑÈ 0nÒÀO“ömÒ¤=;1‚À& ü±ù47rϾKeèy†ïzçì»J†ïœ‚?-ß+¶ÀÑÇAÁ}ó÷tC§ZÆ0]·ïíèÛr]oÅt7ø™½6I‡ÞB3Þú>„©âqè=l2ôØu(‘ß=g>~rö{Ná;'Ÿ,G»§ïˆÚ$yËiäâ«þf9AšsÏØøu°ÿ,p!r—÷ýÍÌþêô·×Rßéä{mF¢!G.Š´£ï<¯Œ>×$žl}Gß³ã{©÷ bÍEÔœùøNÛÞ-íJ¤´çïÐß@ „MD}`bº QÅÏž_Âê;†ïàwÉ·úŽ Z˜šëæ9·Ô¬Sï •±mB™ž³¸f€oÀÿÛ\à+æçŸ,¦NÛ~;-õ“1}8e2àèû|ebþÞ'¦ˆ‡c—ÈpÉ" aôuô±'¿ÁeÛr'‡q0£¯GŸUù“Ž>‚ßLÝuñhGBsÏ\ÛKÑq妸AÃwÖ¡—OøÎæãW¬ú%Øîê;gøÎÍ{“7Ò¾"ëÔû%„ʤ¡LϹ¤Ö€¿°`çú]žÜ>¥~ÒɇL¾µç¯æÉïÕ£Ïfô•ÄÑð¿Ϻ_F½ü›Æïè[|Xbþ½ñºa¤>CsO_ÓSýnîÀ "ðy0x…ïx¯„mßGÚ3êàÕN+ÊÕwÎð›¿.o·kJÚ×Ù^¾Ãö*¤é9£j øcr·ØŸ3¯ú4lÕ2+õçÕ:§šï|®—£ÏÎßKNÝ êèãü=GFŸísš+ÁO{ÖÑÄÑgÛr¯ âè#øMÃ&âSà2*?rNGß“WõP¯ßŽ.ÒÀ×zˆÛë ½¶*·CÀwVß¡äV;ô<«ï¢¾sò#Ú¶¯»ƒöQÚ“¯²¥€çÃcY®}¿Ü Õ¹glü]ñÁÿ¯D ä æYû6Óä”úãºí–ðù~ÖÑgÛrkÒy9KÍoþ;¼$Â{™}¶A''¼äÌèË9¯8Gߦ+{¨×fôË ?ˆC¯$á;Ž·Ö“n1޺̳ïÜÍ3Ýùø^üHG±[Ú“¯~=¥oÞ¼”'¿ß_sÀ7à7Ï…Èk¡ï;±­¾Sꟿ{¼îaß/}‡G[nãè³Ýz sô¥æïe8úÛ7yüž}œ¿ºÍèKwôuÔqv/Gß—wW[§cª¬‹|J{›Ÿ[Úgæã—4|‡Á%宾óãŧ®í¡MÅ3Œmoyê½…C â¥Û–›±ov Õ¥»A},âAFŸuôY•ŸêûÆKº©ç&Á¾vO€Ò^‡ïàŒSøŽ|ùÆœêŠöõ´´§Ðpòþþ–1WÉÿ+èCwî™EÛ ö%\´p¯vÁ°9M\›¥=²‰þÔ5]wSïÌÇ@‰™|öß¶ÜE:útÝ>“z0·t7€£réSw]}ðò;{ô=rQ7]aæ&ÚøÕw:fŸ¨µ÷ ß!C/ÿæ™aætè P¬t䨲ß݉d#$F½cÆ[3z’ÈЪM,šZ¾Òª¹³y¦_øŽÿÿa˜‰Lر9ùNßðÔ£–ÏÀ,5 úS>¼”ãÚu5 |þOJ°X_àžÃ°I›2¤¾#¼wA£ÕcWøwæñz·¢}lË &#g”îðÿúÆ”£ÏÆöŸ±}:ú¬Ê¯}(¬Y|x{µá®jóxTŹhÅ  ß¡cnfóÌh„﬊ó2úØUÇ+|çà£ÿÁß3zàW‚nýO xzB­m‹Ä†7€êú-6h{е 9ì³dR-Û¥êÏ0]wIªüf*¦bû°+MÝ~±Ž¾_ߘ#£*G“j˜\ãåè[AWõä5=2ˆßY}g3ôò ßÙþøÉÙwîi8!„ï˜l•˜t›˜†“-|Ç«,Ýf¯F[ˆãvè‡> ÏJðPÐãAx)Ë5‡Ö:ð¯-`h¬ŒëØ:½ßgì´kÁo}Tùyº33ëÚîõÕÛ÷`²LÕ?Íч)ªd.›Ñ—îèÛCé¶Ü¹}lËUÖù{×f¶åÖÃ8Xº›ÅÑ—ðò{;úÝE=~zÙ»ˆÀ§FOõí_’ê;†ïàÿ`ôã d<²«ûpT9s#è0e]וՑ £2‰ŠõA›g&Í7¨öë.ìŒzû“ùø ß±ÎÃéлu¯¦,Ã]…ßk”¸îPЇAøÉãšAžQŠk¶+ÅMò½>ø <æ7¸~dçàº.  öþôìrÚ©Nêa+Ÿ5ûLó},KSN'³¤«ü#5ø=§î:‹x8úØ5Ö³G}?Kw}}(yµ}ì[ŸÖ£Ïvëq8úÖ×Eg ¹i9Tý ùø«¾èóižéU}ÇÐ.U{g­½;C>!††|ú7ü}% íGÚ‘Zêsê.{ôðSõÍès8úm¹Þ3*rþ^.Gçï!¼çž¿ÇÌ9zÙu·T˱FÞÝ­gíÙµÛM”øºÁF VßÑG£§â4M4ÏL6Ø0}ô´Š)ßC¾Ï‚ßúåâOÃëpís9øó¦ ÷*Õ5•~Rw-Èzü;ЄP\7 ôz.À;þÍC#Ôm{7MªüºM—±÷).l¼³žŽúÈØ®¾V²;ú\ :³eôÁËŸ!õµÊŸÈèKwôù´åÎåè#ø]޾5gvÒ p½ú‰vZß±Á†Wõm°‘×ì»Ê†ï¾À5ªöc’ ¯“f×3-—Rãe]ùzüDI~¨i@âºãAŸûðë1AîQªk* üI®xÿÞ?ȇẶ ûAç0“Ïa$ºõ$œ}üh©L»ÿ΃ZèÞó^•·£ó÷à˜rñ¼i3ú tôqEÒчá›^}IG½üôê3:©µçe{™í´|ªï¾c;-3é61û.Hø®ŸnFBg0—sÓzƒ2z¬ƒ C P¨M}†Té\=î‹m˜»AÐS££fÇÁÎнúùæv¸x‚³!Ç‚vÊÅ¿¸fÐ}NÞêëwKùóJÿHóáÆŸrN Á5uAAœ2’ïéœq=çê]Ñ~×d>=~Ë4è´àŸÐkwõ挕v=Ï+£Ï:ú¾Z“¥-w.GU~ãèó¿çéèK4è$s9úVýà?;“(ñómž™3|çd¹«ï¼Âw?<:J=p~§Äl{ ú]μD½98Üÿ¸!XH7Ͻk P\×ĺ ¯?ùR^SIàóÃç€ù \w"èË‹Ÿ×@{nöþÍu%–ï[g‡)pRêØÖuÕ†K ºGncâŠW·bð+ݵ :s:úþl}ºA'ÚR眿çáè»ÿ´êþ32‰6~Ði8% ßÁÏQÊðÝ?cŸfz¸%5·$èÎ<ð›®îž¯äÁ{qm·€|ÍÓ‚\[Êk*ü Ez1E/h3™Ég+:=ý?s(9î8°…b–—ó]´Êo}¾m¹ótôÙØ~ÒÑÇn=Óçï¥eôù8úì$·£oÅ)ì§µÏ$ßÝ<Ó¶ÓªdøN«ø&5—ó 9áÁJg*§9gßmÖW]ƒ‰J^ §9Çùï—¿¼–-²g€åõ0¯‹,ð±`ÍAìÑÇœ‚Àœïïqâ.íAíìs„ùœà§êÏl/{ï”Ê~ü!¥gô•ÂÑ×?åè#ø‘ãÎæ¾ó÷ü†qØù{pô-?!»“ÛeÐr”åZ‡^µ…塀­>«ƒºÚYôf¦=¥»ÎÌèçÙJO Η7Џþ{üî¹ Âv®gEøX ¶á¾ ÄÈ07H?‹à{XKøëèðUû)ù/s=<¦KÒëŸÑ–;WFŸ£/mþ^®Œ¾ñ™}ÖÑgëöý}KODÎþ m3HßÑ*;ÊÍ3™4Å”i¦\tßPuë ÕúžêþÓz†ÎOf‡é½r2¬ŸG øX˜ÃAWðîg2—C7’ß~ØŽd2ú8xÒ×ÑÇØ~6GÛrÏC›.¯a6¶ŸËÑÇ"ž«ó÷R¥»G¼ï¬Þ³}ó’Ú©…ÇµÉ ÚøÍ3“ýñÑG÷b/:m²;ñÙ|;מI©«ï¬Šï®µaro­¥]ÚÒzãȳ’þº> ôá¾Â;¬µ à~ωð±»6Edc’ òþ¢!Šª½[í§Ãèþ ½ê«×gõ×£• uôið3©yéž}¥rôÄÌè»ïxtÝ=ºuøÌï·ã­é`2PF;-˜á;8½gß¾³ùø~á»/a߯À¤:^/…F?ŒÓ{oAÏî{xø#Æ[ŒJ•½w~¶Ã%À7ÙMLÍ-EicI7™ö Ûs;~6ÔGµ’’f,R<™üÃcèð’ËÑÇn=~Ã84ø¥»‰Œ¾TO)}‹Cý#ZetŽoõÃw˜ÍÇ™lÎ>ŒN°ïÒqÉïâ÷ñ;YªÌZûw3jíýz´QM5èizô‰8½ ÙÁ¦çÿc£‘ˆÞ¾ÏGx¯Î•”ú‘¾ÿþ•²ís1È3×õTcÚ£$±~”0d0J2á¬}›ëÄJ˜b}oÎvåñ{ñpô1Á†uòe¥v@ê/:¦­š{hË "ð­´w÷Ç-|ÇYªïØÆpÓ\{Z¡Ÿ3B(„]΃!RÀ7àï‹…É–Ç_± ývâ }¤Ÿ’ƆûÆ‚¯íQÝkûiÏ1ÁŸ³t—޾,m¹·1£™mYKwótô-8ºÎJt{©ðTüJ̾sdè±·µíùç’“Ú%T{‡NW:_mFÞ’“Új“«B Îõ\–÷–u nÐÃ"rÀ7àgrÏQÜxسeôÍ?¢µš‰*4V¢Yâ¿—ÿ¢}äfß=…èÊÕë%T{¬·Ûž§éuÓFêÓ•‘Uíÿ>>¿X –ú÷# |þ±h¬~*€‹¹7íÈIz«þFúÓ}qrïÒ]‡£ÏvëINÝ êèãü=8ÓÜó÷žb>fô±ˆÇH}Û–{Þa­u…¢›(ñSz¥ßÁg‘GóÌq`.„2éµ7é·IÕÅT”ôÌ@d™t1ûXÆßýÜûàRƒ¶÷‹4ðíbñ®\‰WÆÕö$mO[Ù—JöI·ý—cØ"CP~ÝzØU&Mê§©ü G§Êèμ…8úØ–Û8úî>¤•š>ªI-ƒsÏ3|‡ßõ ßa»ñÐááôb6 -¤úξÛ6k€º #ª½¤¼­¥gÕËSË>Ϊ˜åðÝ€R€´÷¨ àéò¿Ê âbîýâÍ}´I)d½þtü±Èdžý¦o¢ÞEß8¯ù{ºG_Ž>;r{ }äÓ¿ò/â™{p+5exã ZvB{_‡^Îð@ï¾Ãa•OøŽ-ЮìP/é±§-Ÿ&å¡Úß²GcõÙª=Še¹÷-ðR Þåu{V ð øÙxãÇbZÎßýýŠaj2$•SúkÛßzþ¡®þªÓnŠ¡AÝ­ÇtæM›ºktj•ßH}ß¶Üy:ú¬Ê×A-ÕÍCeÐ2¨úeiž©U|Ÿæ™¦?>[“̓ïA'ãhµ>›·Ržöüª3;¨l3í˹¿ïý®Û=ø*yMU߀¿¶}ùËrêÓÞ¤ÝI&µÒ?åùO©ÿ÷!WþSÄü3}™*¶Œ>Ý­‡Õ{°õ­ÔÎH}]º›tôõÔ ;˜Çç-ÕƒfÐ28÷ïgÜ£i°Áßa ý›Ý­²m²ŽVñ‘¬£l YÇÑ`ƒáH–ܲá““8RìÝ{+llL¯Lë§&õo ŸtÞÙ0éwYÛ]Õ+·ö+Ëžtg³¨,g3ŽJÞ>»ê€oÀÏf/—pÂlj^×Ðþd\ߦû&ÔúKôF³ÉÁŸœ¿‡Ôô¶ÜïYG»õdËèóqô°NGß?o¡&hn"ð½òñYÀ||"©||ØöÓp˜aÈœöÔ­²s8ôÖ£Øér€:™rë<O®ßÔ‘ÛgEx¿é mF)Žª¾?»ñ<afÐv(Uj¦ûjõßû0µ4ûßY]ÑnWµ ýí™ñgUþœŽ>‚?›£޶l¥»³÷k®®ï³{]‡SÕ÷—öhï ¿;ÿÅ4i¤VBÚó0›“# ð&ûŽš’>0±fkÎéèÛû0"{ÏÆ°§–ŒaÞ£joÀÏ»·E„<%íQv»aˆÌ ¥°€!¬Ô$ž€}ÈÏ9Ïåè»ýgÍu7áñ=w7Ä¿×Wtî•®ú.•ïž}Çðæ„^ ùõN oÏÚùËÛÖÕýò¢¼·x·Ÿ@û„ ØR=«ªï÷Áé]^1F¢}Êð›|Ø€É?4è ˜üúŒþº¡$»ÎÐþ¥ÈÑÇžü¶3¯éÖóœÆaçïA]gF߬}š«qèRã&ªúÌÐãD^¶îNkžÉê;†ïà?ð ß±W wóÌÔ4œ0wž9öÔztª­‰ÇSÂð\Ÿé(ÀùC/"zö×ïY* †}Ÿš¾‘þ¬åww.ó°–œ¡(v‚I?!@!ÁGÐß­¦¼Tþb}´Õg £ðWwË Jü@Í3Y}—-|G‡ž«ú޾™Ð4èçHÞØðð<DƒL¿‰¶:^û4¬¥|^Í߀06„Ów"xçû©™ÇOà'H:kÓZ?»¿RÒåè»!3£Ž¾Ûöl¦cån¢Ägn¿–öYz/ྌ"üÚ”Üz;ô¾C½ª-PQg¦×PË¡¿#!á Û›Sµß6;ÕÒ,Â{ȹ»–„•¸WM߀¿=6æÝ3Ž>”^ƒJOé®»ûš¡ç”20Г•~SúeÉè3#·8ú¶@M·á½[G6U ‘èQ·'ðK¾[޾c Ö[½•î<ô8Ì„ßÏÁ”î&¦Ý¿Ùx¯HõÎ+ôШ9àð7À=QæIj#lÛ5tìïNN-€‡mÿ1ü"[鮿ÇF9}°Õ§Hô§s½ú¹¤½»Á†_øîµ[ûã9M’,¬t'àñ­üfxœæSª=¾Ž-dQü½š¾?›v.‰:øÉôkÎí¨‡zpB«÷!°£îÿÊu“E<ø»oFŸÃÑgÛr;}ÓPâÊ0š›–Bâ§’u ß=õ«žSÖK;F“óù}YÅÁ”oÜYª=ÛdEðóN5 |‡ÇŸ“w"kóÛw{S\/êÏ1Þàèu\»üù‰½ÓtzMÝuÌßóÊè›2¬‰Ö$ÜDàÞ<=8õØÏžÒœ£§S`OÌž?ßGÕž3 «`_Ø{bÕß­yàé6"ÍlœÀ3ê1§¶r¢¯û ˆè[yz=r;-£^sg>«òÓGðÓ!gKwoÒXGÜ´Õy‰Ô\H{gøz^ÕwÎðÓu'j”Tã­d·`OL(Þ^Oèú>˜÷ûvŠ*p‹}¯X߀ÿçØÈ‹:ÓQõgH‹€9u»í’‡%¥ÖŒ6ÀŽ4,_õìÖãWºËŒ>ÄöoÜXKe7QⳎŸzœÔÃ’[^¯›gÚ =wóL8½´»º¦µ¾#,¾ïi;1~ëê77saD÷ãy¼W£bÁåß ð ø{cC¿ˆ(³¥IÂßÂþe¢ Ac‰ ²ÚÅŸo¾¦§.~q·åÎæè›<°‘v"º‰À÷ÊÇ÷ ßá€a7Ÿ3x¾¥ººó½9¢šƒ/ªaÝñŽ+A‘è‹W΃#VÀ7ào‰ÝV LH;øÖ=›¦ß}PÂ.†]ÕчöÖla}7h¤lnb8/«´wTßñ0˜€”_/ Ûwäý7ŽÍ{æ|%ˆ›Ë ¶(Ý;vÀ7à¯às¢i%™,ð³i[Õß |çß'õo¨Ëa™!gÃ{©n=(Ýh­£oR¿† í"Jü\Õwô<<º‹î5è÷.üÿ—£øèíyƒc…÷‚óΉ0Ëý.±¾ÿØì¹f¸ÀÀ }L;9ؘÿþØeÝ5ø½}¶n"j¼îCà{OÃIÔÚo½¹¿šs`Km»g{;h¡» WÉÚþ;ÞóÀr-j÷-ðá¾+±ñ¡Mä- ´“i/gíìùhŸ­{ôqþž‡£ob߆ž÷`®>3ü¼fß=3®—×µ~Ög31çñ+Ë6s¾ÉרþQeï{àé<àÅ€2ÌߥÝLû9Ûpfþýzr_=ŒCƒŸI=°õ)õ}b‡DõÃwÌÇ7Í3מÕIgàe{ÞUë©÷ .8ËuÏ7±gmÂYŸ!ÀWJ¯˜`$èOa¸˜gÑ~¦ ŒŒÓoÓUwÃaW;6¾×ï-?©CZøî¥I}Ôí –ÍÇûÌ9¸¥úã#‘L™íÀà€ÖúQdXï$À7À7àï†ˆÄ˜î ‡íhNÃÉ~ÚãìªûÚ4Û–›ýí¼¿âäIiÿ$âù¿ê¸[Ö{3øÔ¸å’Èåºï½XÛÃXTŸ#Àw߀¿ 㥠À‹Ê5´«i_g;®Eãç®ë­UþlÀg²Îý§uTçÖË®Ú_2Û)8Ëq_öÅU †ý^|ð øw“¬‰ °ƒ¼íkÚÙÙÀÏÒØuçvV7öoä£ê·W3P«ŸíüGls(h÷ŠÈ5ì‹wRØàŠòóøÀ7àg?¿éaÜ@ £M{;«êì?ÖÄ{]“ËǦOOèè]"´nÆ»ìeVâÝø>Àw„û.ãpðaÕ0<ínÚß¹$w>?×½¾úhÉЪY³_ŸâÏî•VÔŸ)ÀÏ|#ýqbÕ0>íoÚáù€ÛïÚ{iå™ó~{ò ö«YÔX©÷à¾ÿ@0Ò·Õ~Úá´Ç ?Uޝ¦o6ïºÖ­¨ªá¹ü€À7ào†z»Ú€@»œöy>À$}²<²3ç³F³°?ÛWø*ùŽü<€oÀÏ~~›« ü´Ïi§ç?“uÿ¢m5ªöœ«pq%ÁTMÏàç |þÀd‹« ü?<¶§¢½î~Ž®zñ¦>Õ¨Úÿ{qd5¯Òï*À/øÿõ`8&†TXh·»CwœâÃé½Õö-xßï@C+ ¤j{¾¿àé/òýüÜ€¦ýni,=¥]ÔgÎûHïá»:Vè¢ð¾ü"oÀ¿/ð/Õ&-©úÿéƒçÿ¬wÃ(€¨ßA€_àð÷#~^mà¯Ò÷]Ž÷®S€‹Ê; ðK|þ`ÈßT)˜ªÅ¾ŸðTó{ðK|~öóÛ à/¹Ã“}ñΪf°EéÝø%¾?ûùÝ)à/øÿеÜ?JÀ©öwà—øŽpßå`تèçáCê+¼[ßjZÔÞ_€_Fàé,—ƒ«Å†ŽÒ{¾uk5ÐÔÂûðË |þá`àüy~a½v«Eñø!߀¿3ùC ð߃uŠ}_¼rü€oÀß ý‚€ßüL¾ºœ /÷Nt•à‡|þÁÜ«üàÿ/¬É Ì0ËMe@¹? ïg?¿)þ$øÄZŒªÆ½¬Öwà‡pºú1˜ýðÓ¯pe­£Ö¿O€_#À7àg?¿eÿ?pïãkqø>~ ßáñ¿¹ àÿî92 ˆÃ7 ðkøFúŸ rÐd) o>Æ}ºÄqùF~߀ÿ@¶Ø~~/áM∸|§¿†oÀßÀýº@É¿¿·K\À§ïà×8ð ø[Àoæ þé¸^úâÕ(ðktcÝÒ ®z"øÙçtœ¤_¿U€àÉ¿#@=? øÿ?;4Ž@ˆÛ7 ðc|G¸oîîç÷-þßÀ¸ ®ß+À!ðô? @ç J†ûÞµ‹+âøÝü˜߀/~-HúâÅŒø1Ûð8J7ùæÌ±Û|¾ð@ y@6=†›.0SÆmMø|áò€lz 7=nÒM¾Wl|9èä È"„bȲé1ÜtQ}Ź'Àà ÄdÓc¸é"ñEâ ðøÂ1äÙônºH|‘ø|¾ð@ y@6=†›._$¾_€/<CMᦋĉ/Àà ÄdÓc¸é"ñEâ ðøÂ1äÙônºH|‘ø|¾ð@ y@6=†›._$¾_€/<CMᦋĉ/Àà ÄdÓc¸é"ñEâ ðøÂ1äÙônºH|‘ø|¾ð@ y@6=†›._$¾_€/<CMᦋĉ/Àà ÄdÓc¸é"ñEâ ðøÂ1äÙônºH|‘ø|¾ð@ y@6=†›._$¾_€/<CMᦋĉ/Àà ÄdÓc¸é"ñEâ ðøÂ1äÙônºH|‘ø|¾ð@ y@6=†›._$¾_€/<CMᦋĉ/Àà ÄdÓc¸é"ñEâ ðøÂ1äÙônºH|‘ø|¾ð@ y@6=†›._$¾_€/<CMᦋĉ/Àà ÄdÓc¸é"ñEâ ðøÂ1äÙônºH|‘ø|¾ð@ y@6=†›._$¾_€/<CMᦋĉ/Àà ÄdÓc¸é"ñEâ ðøÂ1äÙônºH|‘ø|¾ð@ y@6=†›._$¾_€/<CMᦋĉ/Àà Ä*ºéÛm·Ý<в¡#‚JR|ß<"×=qŸÖïU-ëÜ+×7óçøoz }÷iA¾¹”×TøÅæqkÆÝ|ï?~ó)¹î‰ûô x¯jYãýr}³þG5ôÝwùæR^#À/Ý¡#À/ÍZ ðC0=ø¥aVJS~iÖR€/À¯*@€/À/ÔœU¿Ší6¾_€Ä‹s/;XĹç£ö‚wĹW„I 6~i¤”Øø¥[G±ñ‹t«£"A/,Çu8µO]#Ô?èá{ÏøÍsÝ÷ið^ղέr}³ çWCß=<È7—òšŠ¿”"÷’4Táà< ÀA­† βVᬕ_€/<CMᦋT GªFyø|áò€lz 7=Ê’HÞ-mD€/Àˆ!TtÓM ºþŒ2íPj)”Çw×ÉõlÜk‡ˆ¯÷¶a®ïÈ÷ç¸çîUðÝ;åû]a]_iàWCÊn ÆùlX ëñÿšÏú¹¶JRve!ùÞR_#ÀÏj*ÀϽF¹ŠSø3'ø¹™Z€Ÿ{øÞk$ßKU©’ê<¾?×Áæ÷s¾?¦¿ø•ØøÅ­¡¨ú¹¥™HüÜk”K"Š/6~šä¯~<qðøiÀݨlì¦UÊYŸo¨ßúvÀï=<×½qŸÎïUÉõ}=×wäûs|ó¦*øîÐë샮cEUý /)×gÏÉúÉú¹y@€1L@* ƒø|áò€lz 7= ‰"ψ¶æ"Àà ÄdÓc¸é"£-ÃØ¾_x †< ›ÃMC¢È3¢­UTøHÀ˜ º7 ¬%FÂ÷Î ðÍ\—a¹¾×´ x/Þ¯A®ûUËÏñ-“óøî ÍÞ‹ë[?×ýªåçø–Kóøî\üUéŸöºWTâ‡ý±ò¼âÔCY¿ÚY?~Ây ÚPµî¥_€/<CMá¦W«”’÷.¦$Àà ÄdÓc¸é"9K'9«u-ø|áò€lz 7½Z¥”¼wé4¾_x †< ›ÃMÉY:ÉY­k)Àà ÄdÓc¸éÕ*¥ä½K§©ðøÂ1äÙônºHÎÒIÎj]K¾_x †< ›ÃM¯V)%ï]:ME€/Àˆ!ȦÇpÓEr–NrVëZ ðøÂ1äÙônzµJ)yïÒi*|¾ð@ y@6=†›.’³t’³Z×R€/Àˆ!ȦÇpÓ«UJÉ{—NSà ð…bȲé1Üt‘œ¥“œÕº–|¾ð@ y@6=†›^j)…v@wž4s·/õ3ä~¥ÕRøü¢y`Ÿ rN‡ý™µ´@-õz½é¥~!¹_´Ækú£@ÿiÀÿ þl$ûí}à‹Ä/ ìu@ðѼݟ’lºlvul¶ì“ì“_$½ú1æÈl>ÔÄ^ Sg‡±&²OU |l\]л@F }–” ÈPöpº> &7 ?!àZñÝÆ…ø^Q¾ì“‡ISQ‰æébäÿ0Òžä–l‡†ÁÌÀÿÌñ^ï¹Þù£0ÞÉß °Oïõë½Þªà{UJâWÃ>¹ù'´}ròCÔ€ÿTÚËm·Ý23W øÉçâ}ZEøû9ìþNüíªaŸÜü#Àã ð³xš±>n‰/ÀOÏàŒTˆÄ÷²2{ÕÀP"ñ·‰Ô¼à ð‹æM¤R6~5Тê{8÷DÕU?ðAäá„à‹ª_DŒSTýÀàó‰6ˆÄO÷=8}1"ñEâçw8‰s/}½DâçÇ?ÎË¡U)C‰sOœ{5µÀõæsHüüNl‘ø"ñóÁW¶køâÕ/šÄ«Ÿq eË·_$¾Hüb$X•šd|¾_€¿¤ìJÊnöƒ@l|±ñ‹9(Å«/^ý¢ízW1•Û¦•8¾Äñý¥˜¨ú¢ê#ÁÄÆÏDâ‹Ä‰0µµƒ)‡I&Î=‘øùØbã‹_ÈAäõ;%=ùó})¾?_žqùܽ¥H' &#À—ž¢y@x$'/&òøÿÂÿû«ƒþwvÜ=¨ ôw«Ôi$¹úÑÍÕÿ»ƒ§ÿÝÅÓoåËR^—PKù`SÎén¶én«íü÷[X°:¥~OûGÊróâ ‘ø9%~6¾>3 žv?#¯ .õ zH|¯ú_\·Ô³ÔÏ÷»ŸHü¢}ÇO×T½øú;ðÙø°x:êÀߊÅ䢶a/Ž_€_ Ïyh@ç»xz þ½s1Ï(öw£&ñÓZoûq…þ¾_€_(ïö—ŸìÀSÌ}Kù»|ñêÍbãç´ñø®8¬Û¹'_šm>ˆªQ3+¥Ô.æ^¹˜‡dq¢ ð&\äR! çE7œ'_$~~ö³k½|mG¾Î÷ˆ|æ^9h!÷ŒšÄÿ›w«ƒòQÅþN©«k5ßåP ­ÁƒØø9m|ç>…6]9* |V*qB®_‚Ã)Å‚¸ß0ðoɲVî5à§óU˜S³íÓ÷…ðd©§¢À7vë™`æÿòah¾Ã€5ÚôJ@ð ð+|îsR¼šßžbX æ ‰ e.Qê“.Èýð¹Þ£¿ã]º~6=È=Ky ž h±ë=ª ª™ë]ö.å÷fqG}ŸöǺ,r­Íœ0Ö&×3*.ñs½ ü<˜3ÌÕ©RÀ—= ¶GQZ'~á´(mœû]øÕ¾Jò“_€/L ׯï€àW7ð;ä½ÔßQ€? ç»çü*~¾›-×ËL=ffˆˆÄ‰/<Cøÿ©fí’õÒ IEND®B`‚fifengine-0.4.2/doc/logo/FIFE_small_b1.png000066400000000000000000000170551341615052600201600ustar00rootroot00000000000000‰PNG  IHDRþÖ`ÀÄŒsRGB®ÎégAMA± üaPLTE  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~€€€‚‚‚ƒƒƒ„„„………†††‡‡‡ˆˆˆ‰‰‰ŠŠŠ‹‹‹ŒŒŒŽŽŽ‘‘‘’’’“““”””•••–––———˜˜˜™™™ššš›››œœœžžžŸŸŸ   ¡¡¡¢¢¢£££¤¤¤¥¥¥¦¦¦§§§¨¨¨©©©ªªª«««¬¬¬­­­®®®¯¯¯°°°±±±²²²³³³´´´µµµ¶¶¶···¸¸¸¹¹¹ººº»»»¼¼¼½½½¾¾¾¿¿¿ÀÀÀÁÁÁÂÂÂÃÃÃÄÄÄÅÅÅÆÆÆÇÇÇÈÈÈÉÉÉÊÊÊËËËÌÌÌÍÍÍÎÎÎÏÏÏÐÐÐÑÑÑÒÒÒÓÓÓÔÔÔÕÕÕÖÖÖ×××ØØØÙÙÙÚÚÚÛÛÛÜÜÜÝÝÝÞÞÞßßßàààáááâââãããäääåååæææçççèèèéééêêêëëëìììíííîîîïïïðððñññòòòóóóôôôõõõööö÷÷÷øøøùùùúúúûûûüüüýýýþþþÿÿÿâ°]} pHYsÃÃÇo¨dtEXtSoftwarePaint.NET v3.5.100ôr¡IDATx^í]y€OÕŸï cìc‹J(-–ɯlY*~I´Yæ—ˆ´¥BI¢¢T¿BR’¢ühAmB‹¤´ÈÏÏRDa"Y‡1fæýÞ»ï½ïúî¹çÞw¿ËpÞ?i¾çžs>Ÿ{ß}w9÷Ü´4zˆb€ ˆ„1pÁe–©þuf0… =v£1Åòç·âewÔJ!ÇàÊé#׿cÃ7ÿQ´è¦ª 0›&êÜû½…=¾ùï‚zWL ÷âêDÍÛ¿*vÀ‡Õ¾ý—Cou+WãIV^õÆO ƒØ£jßþû¾™K'ÙÉ8™¯Ðëý‚pìžðÍ?îšzqzœ\HšÚ¬kÞ<…ßüûö -IsU»áÒ—ÍØ‹€oþ´ù‰sµû‘ …éí_Ü剆oþºîá†ÉpX§ÍÏnçaÂ7~v²No««É8kHã¾Yvùàëµk F­…±cjŸi(Z|K5=>%JK½¡?±£á›‚Gö©”(ßýÚ9þޝ1Øeà›²ùs{”óëYüËW»ù³"$ø˜A¯¨Üþ×»dƺ…н?ˆØùîú"ü=í’ uÿâY²l÷·‰ê/ê÷à„W¦ÜŸ“Z§Ü°ôå¯í—Á`Ë*Á7Ëm^<+RRwÆÅSÿ–Çî¾YtØF’^ÆG<Ðjb®vðÍÒ«î?%>ðZ›>±Y»oø¦‚wˆ÷U·dÃÑë}`×ß0Š—¬¡FßÉÃò‡]|kHøaßÊõÉœ0øߨµÁ·†„ó{&lHX}ÀüÀbiOw«Bž;¢ƒIãÀ®(£¯~yš*]¿P»ÆÚAl#µÇþ¥…cÏËKÅ“r=æåëñ´xÁ¥aC·²7®Ò£ÖØ1¹Mœ†„™]gÐääþ‰§G×Rûyz^(Ãøã©ho¦íÖ„Ýøe°çÜýä'õYxäL Z?÷§.ìÆ§]¸«øåþO›™Õ#NÕÃ@³'׿TÞ A§?mùµúí“ü2ÐxÌ¿^„Êo¾¯ŠØŸÓ&xï ¨¸QüÅ ãÄyõøYÅ(§ÌÒk •îÔHyáÇ7d«0Pûî±z¹‰„é—¢ÑöáwþU^¸)ZcàçúÞAó[ô€ô´¤Ñ”< ä͹ =$Ìî÷QÄ6´_7–å(ŪÜ+Ø$‘ókï+—"Ü(Ÿ3ÿ°œ^XúðLõAHÆÕKtºbìœÒÜ:/sålMÎ0rGù Z:gšìò)LØÖ_ÀéJýsú­dßõÖ°,_ýþ?ôzµñ±³c´™¼C¯•#sZÊu·\éR=—éuÍX32rÎ1\3ÃÆÎÇjkÏÔ4›©µC2Ù\yi˜sôÒûSÿ,à-]µF)¯'{cëæáPð ç¶ÓéËìý­F/sœì Mñîñõâž)m9GÓJ“¹:?W]ü5â¼âXû±z\ý.¢’¶hPZü^‡øU|PsVÿ ì&Ø#\ïþÞg4­/ˆ)l7×ÿ |@„™‘>᯿=¡ñÈõÆïöéðùð»øÑVüÑeqZ^å·„òXH¼êS;}¢ªÃ80¹¸½ÆC¢Ãûê“òŸ£R]ËÜ8$;Ðp:O}VuaìÕ( •ªÿ³+“|]ñµ…±;£à?&ÿàÔ³p•W©@çä]7ÚDùÔMVÇ–a)jÙp²ìöSqôFË)rð¿ìŽX9Šk­G(Ͼg“”ÿëc\“øæ¿Ò4qÈ–2®Z,AÀì­èÒÛô±u€£$vöKè…±¡1žÂ‘÷͵)|Ô¨Úpä~\ìä¤~Á,ÞB¡RuÅ¡P©_!pÕcL7Û1¦D,8o†palK,ñé‚%îŸû¢÷IâP«R*k>$ˆ–™ï¡N°œz«”I~nÊ#=Ü›—dDR愱\?\d–”ý$ "¬½"aÏ…á™dD2æ+ÀPþôÒ• w˜½¥ŒG •|Åz:³ä¬›‘Pœc—µÿ¨g±—àBuR·›a$Ý<µÜ j3T©³Þfæ‘xŸ‚hº6©À0Æ«M.\Åäf€Hv{ë*¯žÇÎ’0.%N¦Ôæçî}fž½~Æñé¿ iÏ%‰Š¥Žlá{2+ú+ä)Žú™`©÷TœJT™ÓÞ³}f ÀŸð^§îáÿ”((òv*w³êx¸ã%Eh«ÒcÈ;«»DzÿÐ&û<]âÈã­ÍW†wMº‹‡ç¨uøp Nºƒð—qUÿ–ƒƒ±ñþj•nGª‚5Ú‚ÀÉÒüdÂ\¿ ®zó×ÌA(È¡Nsq*dâû$ÂoŽÉ–ÑÇrð8Â/0„€ç`ÊQøWÒàŸ8ÀÙÎr°ÿ ðä\œƒõy®e@®±ü«!øl-xž† ''x·Û&áKo ³ssƒ!éŽø½¡Â‰8®íß9ø“œÛXY0FKt–¸1¿Â_þS$Rz|ÃÜ{@`¯O†G2å ¾‡E¥5ÿ^ú®ÝÈvÏÄÞdæ¡OÄ;B¡<›Ó…¥µ tçz`ÇÞ¾?$ôo2À÷"aig| Só–,‹R/}"» ý»0ºAXZ›@姤²~2§¯²¬×‡HŸ¬m ÏOÔ‘ô›UT³ –íÿwˆk'b½¦¸¼‰6?ȶ{&Ͼj×Eí!ü@¦Õ31ˆ¬†ý^ÞmáÂ;Ät<À‹ðbPþDyŸ"åF£ÃÒ£]Ç,OÜg òÏ  <¼X ÒŒø=ÐK=“À'L?´`SáA þ¿åýˆüÃOž†—™e í×LÏ]f¾å›°l­é¨i-¯zF1Àäp‰ÐK8º¥@M¨ÌPÕ3‰lë¶*ÐvŸF9ö_C.J’ЕppâKx‰e· xʱ»ùŠãu¤áLpyÝaÙX \ZkhÜŸ3úU'ù?oìPöm|ªòpQÉÙÙ¡ÚœP©Û¸7×àªÝ–²G´Oð‹|t ˆ ì‹T!!V}µ H¾¬#"Ô'R— ¬—x‚‘€ê%Ú@zc.S °kU÷ózÉ'Vâºà?ËtƒFìÉ[à4ÀÇ© ˆåZ)þ˜­›? Ø'Y›ºðÙ|¦¿áâ÷¨ø-(/uá³óµmt¼·Nx´—*ý9 t½ûÇ[ð“È,ì õ<ÌçPÿ-yšàfÓ¹á|Ï[  [BWð•\V‚ÔÿWfïy®çEø Ê:|ø·cQ¡å4Á_Ì òÇíÀÜÃS !¥ ¾‰‡ŸVú5 —>æVÿ -8QMðaÖøá wã¼aRã¸ð±ó¼1Mðo¶,V濵íð¥õäªÙ*¡'ª >K=z~6Î&u¿Õž¹D|¶–Ñ™ë·ýa@>þ²›ö«Q5Ág×¼ ä·7¿±ÏR®80«?LNü¿™F~Xâp)ÏžáÂï-¥!¬þÌÒë\·Ã³‹êÃÕs¿¸°œ„øï2£ŸsÝ–Ë4u&W»AQ磾}<›Ñÿ9ù!> 䉥õÀgçË3¸‘þvãÀ?Ü!8 o (©þ¿,}üã²AYÜ©Ó>„`=ð[Y6Zr_YÙ‰êM\MÙšñëÏn Êá:-{AÑy\M±wøãC ü#lç>žÓ;e],à ññÊø$«=\^ üÍL#7ï–ü57í•îÜeZàÁàs3•É'ã’W· -ð_g6¸U&‹»Uª;w™øvÌ7S™üÆt+^7¢;w™øìh*7SÙ^LPOd-ÏÛ.²{}ø¬?nÈ«1•Ã×¼)ݹ˴Àg_cnú•€4îäQv!h(Zàg[F¸C5•Iú=¼¦ÄÆ—úðí‘øžÇ*“^ÄSÆfúðíyØ«â‚z"!UáÁל»L|{¾˜ãñr¥ºÚÈц‘AÕß^ƒáÅ$ÙyÌdŸ·9ð5ç.ÓŸ­Àq3•Ý$‹œÉ?À¯9w™ø,^“›©Œò~:qàs²Jëw h€¿ó K×9 ÔBQky«[{™*Pïrþá/µÓ§ñÞàüQÑ_¯ó{îÒ½Ëå~Ñ#ÁïÚqS½Fêvœ¿üó~Lõ½ :+oÅ'ü\Èí>çz¬ôß&ï+1:þ’&Ž&|üÁ_ä^õê6›£½V½ôªHE¿¹'Ž{iµÊ0’S ~àŽt+"gÛ}NØbÙ‘‘7 IÞ@t³n8ü#œû53ï1{˜ƒ7*¶¨Øb>àokç¨ËzÁtuƒ{Dµö¬pÇÿ§ìi(мø57©ûåNb”×uå®T‡ÿ¡Û5p²ù|ì&”lõ]ˆ{Lå Þƒ¾Â Šk:'¶ÞíT4‡•Q…d¸»†Ó;x|éÈζæ@¿\—ë«ô8g¶õu Uy6|-_Ïš¯"üßÝyw¹éáM}× §¬ø¸“¼VýÛ5ÉË'Ì ÄÑñnoÂYpp”«ÁÏ®m}ðlµû%<ÕN¿ÇÒ˜)=Væ»yn>s¯tY¿j8Ô«¿`ˆÛðû{d›˜ïžÖì`ñ‘e0°ïç‹ÞNöN—ux°¯á…àoroGªà½"wxœÓ/›Ç„üœ¼¼Ìy‘*<–Ï[üxG½qÙ$Èß›íÐwÎ:žWÛû9Í£ªÿ¥¹@(]Öf|¨´gK‘…8V<:ëý­ê`/ÚIQº¬#÷Éï"¨ø~qgï•DÇü_§ª¿¹' Òe-ˆ½âK¬Ø•«ý9î=ŠÍà$üÖ[‘72òºY¼OAÉûy¯Wøßÿˆ¾ÛRÂ’ üCÁË“ïÞ;fù·Ê¨K¸%šÃíôÂñŽPžJÀ_çÞ_e¦RŒß5„b\ˆ;bú‰jZ<üלñWZsn[+?x]>%Ýοe–ÕíîAÒ~ž›Z=p.¥ÏBM“²ËQM­h´Ên ö»ÿ_w6W-vÊÓ½´Ý[–·äew‰J"c\í¿ìžDj»n³X”˜P¦¦ƒY C$ì‹Fú¸{´ûq'ýósdà‰eoÇåÍ+'Ýäµÿ[Ç7ŸãNïºPŒHN¢«à®N· |%»ý/†?Åýz·çªenüÊòXè}š×OàŽpËDð÷ött¥Âµ@ãký«ñ¦ õ€Œ6Œ<-µ"€¿ÒÊ:þ3Ô÷Ç0Þö=Ôõ®»ìÅHVÈøáOt7è:†î‚½xZyü)j±™ð­]!·öHä6ƒàï¾Úq)ãQdB§"Õ=vö{ÌÆ¯&&¡·UøßÔsœªý²Ýå‰ÓQ¢pò„úᜆñýiH;|øO¹}HgÁ­ÊAnr›!*‹]eñ¯£}È(üà¤ôxdÃ7Ö¸­E¸àYÑW!qÛ勨.˜?8~¨ ¥Î°½8[콉¾G¾ˆÆ*LRoOø¡Ñã•‚•C¾ÌĦfñIA…Xü®›ò‚œ;dÂ׋…û1ZlJ“DÆ,~ãáö²üà̱~ØV%l² Ÿ&l(5C±½‘±æ,Âø¡uƒîØnÖØã‚àK¨'j Ъ±ƒ‚°ºhø¹îªQ?ItKØ¢1ÜGK+ì·Ø0f«NQð?u× OçM‰y ¾WYfÁÁäJ†Ï.¹Êö¿ðAwÄÞ µÂΘøÀ]õ‰H®xu|VÙ| eR8ü­î~AYÁ}èá ày¥%F9¬^ÒYo¡?Æ[ÜP€0ø ݉z#| ÃâûüQÔx#/ ÿÈPw¯°reÉ´~HþŒš"X¯bƒp+Kœ ×.ü-î–lyøõÆÿò¿í‹Ë‘WæXN¿ãÄEtà¿ëþxöZ|“Ú€VúÂ>º # Èf¯=w?Ô4n–HоÌÏβ&FêÂ÷ÖG0z½CÆ-øÏwþ¿âl|ÕoúÞ¿ÕAAö" —ƒ{в ÿmw¦Ú”sŨ§'}EUè@në(Í;BååõÖèÄ? òƒËs·¡GÒ†Q¨'ªP àõ—Q$„v¶éšnÙläN"Ów@w_<\]´\ë#Lž¿IâÚ®v>ÇF¨ðÅ{$œ<‚`«½[†ÀÕuãDQqã˜cEc¢ÆéU¹‰¼´,ÒL«ˆ“WìxðâóhÎñ#GYKôò©¥çU©M4Í0¹êÊ#Ã.l&vv * åß«ìQù£HÒNtY ŽâÇP€ %º £±z*é·6ñ{ÑK€âeu,Ãm·Ê ß£ž¯ %_Qw‰»aìêš–þ ~ÎhÒ´Ù pJ-wÊÔ¥1AîJ’•,w*?§Ê Û¥¨2Œ÷…›Ég¦úW’ ÐâÏ%iQOŽÓ,Q¤9o„`qÒ/€GÒn‡Qƒn–:Ô i=ÄJuçJvê:œ‘v:K,bЯ—Ϻ•œ<#M‘ˆì†ñ¥þ;1âÌN~ª|ä0©7RbQOްÊr#€“'RdQOééÒÕìU 0x~GÎ|ò¥GjÀ¿_s¦”D²ÒGfË“«múoÂI íwûk?ˆÇ'ÆT#Ü¡+IŸ¤à¢uH¦:8+–‚é)¹¨'‡¿¼Ô"n8q¸ûPÎu-ÒÜäÉ`¿pX%Ť‡u+"µh“²»½n/’§ï©%@ ýo¸Ks“IÊr‹rÀoÝ\TRVRW¸>7Ï„/ï–€E=9®«aÏ£˜tL,‹zrøË`ãVŠd.O“ó!™Òq¨÷ÿ Ä)°d‘·} b pGsy½%¥D'aœò:7ãRI$ågÁ~æž‘R&RZø$'µžw70}ø1¥AÎUâßóiŒ+‘‹zr5QjçPÈ®Ó<úŸžø÷‡¢]Žr ®óH¹´µÉQ: ^»˜%ÀU:ò‹•nŠ|>v3‘•þ­¹"ÿ4é|/þ¬'¿t9;‘({F$ß„{>Á¸WÂm§„ÁÁ,ÍßÚoöM p'®2³Ìnjˆͼ>0‚…C÷K÷A*ìu-q+lácözO_ßy*L Ä1@ Ó „&¼¯(ðOyËkDzCcÃßä­„J|‡Hª}éfD˜ïÓ»/Ûž¨ëÃÍ÷©çwðõá«\Ë}*Ë6TSÞ«tõ Ærò+ £ÿQCÞ • ˆb€ ˆb€ ˆb€ ˆb€ ˆb€ ˆb€ d¨–üD¶l‰—ÏÞbäu)ñ(”´1wfŸV.]â X0Éë [‰FˆÆ@Í»?Yb>ózfñoû¡ý,|¤„.Ðúy&5’ê`JŒäj Zz´h©í4ËéÅO€RˆšhçF ­ ¥‹.—Š$ºÐ9)(v-_ª¯)4Ÿûs˜¥Kƒ–z!0"_‡yÔdEÜÚ[«ìª¿+q¥Ðð÷ñ-µYÚ£“r.×Ôtۀϛÿ™ÖÉç ØhJñ¶l‘#UÏ|±%«:Ä–0í‚o¾õW á[ä,ÂÆ‘ò_lÉ‚/¶Dð… PíSã§w_Ôó‹;$«çwHâŸØu}¢…ýž)@]u}ÔõQ׎ùÅý1õüˆþ˜>|‚ù¾¸ÑwÑÎè»/d€†=Çú°§wNΓ%nµgANNÎÓkþº’°å;c~gáð¡õÝwœÎ«‚AÉ•±Þ}ûY[¶$¿Õz6ãûfùòåŸß^‘¯ÈúΊ¿Æ‰õm7^>«…?ôî„Ö’Šð­…ÿóá#øTû)÷îSã÷ÿêë]ß6ó›–››;d÷î÷1U噺 À±˜Žù~ÇRSßõ?ÂóÌ×?ûо3(ª~Å-¶%ÏÄáR””zx‡.øiMñÇ~Ú¹ ŠõÀOK+{AóæÍO9«fJœlJ46ÿ ÄÀ¤¥a 4_6þ 5´¥ú–¥ R5 á}ÏÃäh|Ì|Ÿ³ðøTK‚´Rí«µß¨oß¾ÖG™ÿáKPLŽ™Áö—¯¿h»äø®ÁªŠÈÔ`%eUt³Bm§6IYÿÈ1bà˜aàÿжK-cv®ÌIEND®B`‚fifengine-0.4.2/doc/logo/FIFE_small_b2.png000066400000000000000000001114721341615052600201570ustar00rootroot00000000000000‰PNG  IHDRþÖØ|£ésRGB®ÎégAMA± üa pHYsÃÃÇo¨dtEXtSoftwarePaint.NET v3.5.100ôr¡’©IDATx^í]˜TU²¦óL÷äDÎ9ÉA@P1GL(¢ HÎCÎ A$GDE0"æ,f1ç¬kÜ]Óæøv÷í{tÏ ÝÓ=™Ãw¿ýXìXýŸºUýUU£†ùc,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,P* øJõ,ó$cjb¨N0sp¤p’Ï—¦ä@z‡pÞUÁh_ «š|ó1’°€/XÌ)ŸV{¿|~ô;ªÿΈvõùcI¼°yˆ±@•´€/˜Ìì—V46½ÎBÇå„~´£ë1 "ù—¢¬’_Ô|(cf_ ;˜Ñ+R4:½î"ºê©kqz=q9¡ë¤þû‹| ž^g~8ÿ’@z»¾1°±@U´B”`F÷HÑÕÜú‹µkIzý%é l— úmÀãÅ%_ç¡î¼pþÐ@z+œ­ªøýÍg:Þ,àó§c]"…ÃÓëñ:¾—F:®eцˢèr@?˜Ñ™ÿ;=€.ÛÓ,µÞ¢îÜpÞy´f5jø7k›ï[,à ¢Â…ÃÒë/.5° p (7^õº\Ðïâù0ñ"üTˆƒA§‚†´z³B¹gù#dU‹˜pl[À DÛ„ .Ž6X à®pé€x“QÇÕôº¨¼œÐÏì¢þýÅý\ýÅÕ;Òa “Vwf(÷4¤Þ±m{óí*þ@ ½y8ÿ‚ôúóTÐbóÓ ¬¾cÍ®‹5[éq5_é„~Ö ±æ^lfq6Ô©Ã`Ý–¦×Ê9Ù®U62ïyLYmÎ?'½þgãºq€˜®Uâj±*f]«c-èB† Û)˜Õ•ÿ»öHö,õ"ü5ÅAÒ΃ã$ÈcVgR({ /TpLýæËT¼|þHýpÞééõŠmˆ·ÃÝŽuSñÕ±–êZkÉ®V¶Ë°C?»«ãâYêuôƒ!΃ë$ðg¿¤ÕÊêç æT¼ÑÌ;Tg øÃµC¹§ lð@<‹dÜ•S'¬3oMu@üúŒÖ®«ÍÚ v9 ÊéÆÿ.׳b­®·½ {;u‹ “ð°[AZ­k‚™=}Ìêüû˜Ï^Þð… ¤×™œâ9Ü…?¾Ü†WbúË m=.軆çÒ%„v*¬Ãà8 Ú1°åüVÀÒâHÍ«‚JDËÛŠæõª|ÁÜ`V?„Ä“ž;xÉØà.=ºM;ÄÛ­ËЯöë2èZÏ/'ôs»«ÿÄf.^G?®ûƒ¸'ðcÀïžg@|Ù‹Â…Wbjø#Õç3Ÿ´lÀM?˜Ù+RëÆ 2¾\ÞÕpÄË`†ë»+ð)D*”køÎì°>³ÃçÕqCfÇ NèçuÇ?Òå~|qZØÙÐŽku[a’<<(ÒÏKŽõ|€ÝP—\ˆ¶5B‰²Áª ?·ø`¬k¤èªô‹^¹y¾âíÞw‰u èÄ7ЫӯLqmÊì$.ô{¨ÿ$Ìž¥^Äv*Ôa'ÁëXgÀ~°!- bgB‰ i-P¢ £8¥æ‹¢Ã—keWééel#“WÍÍ»}<‡÷î îv¬3˜*ˆwÞ”)®Í™7gvq^Nèç÷p?†žH{)qfôó n2Rr+c¦3`‹…xN,oÚE⺳¹çø#ML‘8% U™ûBô6áü‹ÓëÎ'%™ÐxÞåæmQ ñänELÂýºë:Ä·dึf°5«+]NèôäÿN ËöÄÌ.[¬ƒa; ê$Ø?ŸâV ΀ȌqÔM á€ÑÒêÌåœî7¨2?ªù ,à øÓZ„sÏO¯3G((I2ÉÔ`<¦×=½= ‹•›çq¼ñÂÁ{À]a]«À7Có¶¬n—ô½FOçGBœ ñ.Öaà'î 2:bÙ‚¸¨3ÀS–h7– Ä=L=ÊÔiµ¦„²Nö‡jèUA øüá&¡ì³ÒjͤžRÉCîK:J'{ùy'èY4¯¸HÕHo!ž‡1î–oVèÔáÛ}{–~õØžÕc‡º|·*ì¥ÿ×,<ØñtõÊê0È›ƒv xh$oÖð¼ ¨(¨ÄÀz ¨s`a¤p|0s€/XXpÜ}$¨~(sH¤hü4ÐËÇÎÞ¸A¯Å62”q< !DH£#^zwwéÑR5ˆg÷Ü‘Ýs§íêµ3›]¾  úáÂÞüßér<¥§u`¬óà8 Ö1`ÇRÜ ôûËŒ­›€Š‚X¯¸ f+mI0ÓŠ É4‚Fô!Ô¥v3˜:R0&ëã äw€«ô/ìÖf ŠLL«5/­ö|;î]yzîì%=¯Ó”*¶aŒ;C¼½åãuÄÛá.±n]€øÆì^7f÷Ö¯›²{‹Ë ý¢Þê?±¿ÈgáÄ¥ yÔyã'AÄEôQEn`;*’7¹C  Ê9PÄ„~áþ©“¸Öü´šó¨›>½‡ÏoŠÄ|&|Â`ôÄHÞµiEsaw²¾pö Ud'±@/ÈJ= Wtîæ-#¢=jç€cÑ‹ðЄuè7e÷ѯ]Ù}—ú5û¸“Ýg—õ:â̰#Aï¥N‚ýxž[>PÒI0±@âˆ2°Ûý³{¸üEsÃ9—Òº˜"q9ŸŸ?7Þ+œ32R0;­pŽ ÷^‘=«ÈŠGT¦dM*襛÷FS$.Ã)Àm4éÎɛɟÍp?—L¬‚„ž¼6n:+˱<ÂÑY‡§·ž1*=äà]ˆ§€DÂ]€’*!kAœÝÿf÷ˆ¶ ç_”^oaZY¡ì“#µ{>Ì:xy$¬“ n <@’ÇÀyxfÌSg&à<: $‹ÁžîŸ“?,÷UÁDÿìHþ¬HÞôPÆùþpkS$Náø|Ñ@¸S(vi$gf$·XâÞíì½pïpöŒµ´rY^“rƒ^Å6<\æˆgQÍÇ[ˆç>Ø ë èöæ¨kàÞºnÉî¿+Ö®8½átÁ·Ê\˜Ó›LÎè²a—ö\þ"êeå}ƒ3í°£h¿Xg@ÝXBì}ô$Xq %»‰~d\,òa¾Ÿ£¿8’;3’=9=ÓD'1ÝßÌ/ ø"þ`»`ôÂpÖ´pö ÷%9Z¡J9ÜÙÛ#IYZÔ <½ ô7Ïâi‘ªr¯#^ºvÖÄù•{¿nÅ•ÝgS¬Õ”h£yq{vy—IãŠsìæÏ⯠^Ð:KŽ“ ~+Pg€ø"–¨@H–Ä5™ðZ˜-ŽçþUîË™úúçJôÏ"ôçÌgOgL¦ê42Ýô ý! e rV86)œ9-œ5݆û„Á½­PÅiö\biE8¬>%œ=coÀ|ëáJa­Ø†óŒ,ŠHŒxî’@tk.]·Ñ5ø¶¬îË£-¦F›,óè¸õlÃ¥¢Û‚Xë©Ùý6‹¡—â'ƒóÎÀ¿ØÎ¿Ø¡€ôB8’¥@ñ•y ˜Eÿ®ÜWV¾Á¡…©VúñûfL G¯ „ùüè$>N»é~Ó@è´Pú¸Ptr86%Ü;‚{+ȱs—`EAȹB $<àÀÿp÷ï*~ñ~HÅüx%¾% ?m` ÷zù|Çf'±Ïç«ë÷÷¯†Æ‡ÂRƽ'™ÃqïrΞjûÜٳʔJd=@OѼ jt7Ï"xáã-Ä ¬çžr;»ög÷^k==Öb…»KvRütÙpî¼'·¼ùËâ‡Õûª{2Ûpu ¿´.^½ «ù¢Xû9wàèíÇÀqÔ} ™`%Á2†¹ÿ8Ü Á ý]´O"ô§O1ô‡ÂメqÀ¥~_W_œc!öùjúý}‚+ƒ±t)Üã ó8'oýLjã÷ œ½²d)ÄôZ@Ï@ïpó‰¿?ïÔýy§Ü–ÙuA´å,­ý\ëʵõ+®m•Â&[;¢wGâªX›éÙ}ÖÐûžŠ3 +"¢¬@¤Šb™€íàx=Ø¢€’pÿÎÐ_K|í¤§ý¸Ã󸑎þà8Ž“€¨ß×ÙW£‰qóòû{— ÄsÜÇápÓ×qè|Ž=¯o@ì¥E“êK‹ÉARëbr„!ž³×@Ïéyáéã^Fð,žáž!ï@îI7‚‰µZìlgÑ[reW×Ëï.¾ç³Û¾û×¾ïÿíyíúìoWm~½ñÉ»-±j‹±7%âí¢­fgv]˜wê>|Œ¸g@¥Å‰€`d-Œ,þÇéþÁ ý‘ü$‡þP”£b(2ž Ñ1ðŸï÷u¨Q£ÊwãVå÷wÃmˆx7îÓ¥¿'ÜOù¥ø{Ç´ã^SÛL«V%2ZÆá‘½“ªça}ЋØF²4ˆ§ˆr oÈì~7ÄÚÎÈh½R¾»]ç,ÛY/æwÛ<¤ø‰•/üvï7ÿ“Ìuó×ÿœq÷§]‡ßcëÖÕ%øœ{á÷„V‹3:ãâ#ÙÏ€Ì速瀱@*p»ÿdжJû¡Ÿø~ø;Êî˜ïgèŸý K×ügû}mjÔ°í%¨ü¸7&Üžp“ò@¼Ä=…:‘ ôõpÄ£,ÎaT&ÃýL^·rò÷–¿ƒ{Å`:ƒ;#вöG±7¶,–Ñðˆæ9Q#@/|<ÁkÈþÌî‹c­g ðy4²X½, í¾lí‘Mïþq×—ÿ(ŵü¹ßœ:ó‰üî[µž]ÞšènÈZk7§‘}Bº °û€Ì¬l˜1BÎ;cD€Üî_?òÝq[³B!{&Þ³dôËjWކþÐ?™ÐOA¿‡ï×p5&à?Ãçk ñGåâ>Š›nIq¯ã©-á!~ò¸ç³‹½p¯3÷^¸—4ŽªRqÜÛ½-‘u^6 O¹ƒwgtšk½X4²84ýºÞ³ÓÆŽ—Þ5þÖ·}ü·Ÿþ½Œ×ú·þpÉÚ# NÞc ñEŸ®v dCV¬õœÌn‹q>Õ d€'ÄÄ·òú€v¤>‚-Upºü0´-÷eÁƒõOŒ~«ÚUŒª¥ðý<èúEÊ ôÛÂ/€ø‡ø|Mr‘8 ·Ü€p*ô"µEˆo§tôÒÊÝ(zØu V^› îuúÒ¢q<½ÖsêF÷ô:èO»#ûÄõ±ö3cˆm¬Þ\Ù˜kïbÉí¾mÀ”Çæ=òí–ÿZ¾×¦÷ÿ2ö–;\v·Ôâ«¶,—³í t>;ÏÆYõ:Œuä*þq¸.ƒƒˆç¾ È<˜Ÿ$Ðï¬vI¥T*qÑï úã#mTÀ?Øç«Ø"q7Ün‚1I!>Aj«(|{¦KÓEÈŠ¿W]…*¾÷ô÷ªFëî¹®ØÓÙSv¯ä+exc÷ôY=–ÆÚ°ØFÞXì‚~«…¥ÎI{Î[ñÒò—~ZÿÞŸ+ôšõð78]¹=¶ ^ÐðÏÃ!:+qbqnóN»ƒGAÚ@ÿØåþ5ú_Dÿ’øúë_‡ï·Ð¯é|¨ÐËÑï |¼SÞ’Pwµß?Ðç+Ï"q·Ü\‚Ñ%½7£qô Ùºñ'!ÄT¦Né¿g!¾'î1$‡wÓÆÇ½(ÓÆó÷Š»‘½ÃÙËš”Ó#¶9ùæŒÎsb­Ùݼja±_Øzè#v¾»úõ?\ÿÖŸŽÚµäùŸÎYþRÝA{<µh¶˜g ÍlœaíÀrÁ„ºãF€r÷ï‘ûje/w䃊D<ôëÕ.]å¦dî”·„ ß6 x#üþ~>_é;‰Qvm„[I00*eÄ'â3I¦¢2I‡,; •N!1îIž ÈU®2cgϹK•Î:#IV9ÓSF»™±62¶QÍŠ¼…ESþÀïö÷𤻿\ùÚ*ëZqä÷÷¿Óæ¢;m‚d·MÜá<çÞ#ïZÀ‹ZL£ÿÝÌ­è«I$éY2ú5§ùX„ú­”·Ä ?Á¸Âïïíó%ÝIì«‘…G0pu)¯_Èâ J‡X|7¥ãÆ=Bþ^à^gî¥Ø¸„ ‡§³V„C|ÈýY=–ÅÚg ªª ›-ÙR@l©=p÷ÏÍ~ì×Ë^þ]¹&ÜùE¯±ä‚™!>^‡¦–•ò€SÝnfΉ©(!Êa\äéþõà‡1?ŽÈ‡Iœè·²^;ß/t>6}?+u1ys9ýqÏ@ 0Ìïï^²bõײ‚žU¯X¨c¯^9C|+µe>k¶Ò›NâÅ9vÜÛµ zpÏ%õ,ÈQ‘½•Î’³‡ÌDlÓjÐ[A”?ˆâ@³s ]ÿæ¼Ã?-|þ—*xÍxøûSæ?‡“i¯ÈzIH7QŒÓžw*«Ð)þG¹‹ûw0?Œ÷¤Ä7¡ïèwU»ÜèW„JymUÞ¹Î.ßñŸ®N† &KÝ8"{õ9î%›?Ä×R[Iáë:dÙH®)á’“Á½*ÐÚ‚-²?åöœ7‘ȬÕrѺ¥ <-Í>§û¶.£¸jïÇsÿTõ¯YOýpÁ o4;ïïÌJ\”¶šŸÙiNΠ=®èŸÉàõéú'…~š~®‹œ™ÆÓ^èU­-"åÕë\åöpeÄÙÉ@¿FÀq™œPǪÚZ!¾ì+'JÇFá3ñ=ë8±×­˜Kqއ¿ç‚à^9·gv_kЯ…Xïr ÝŠúïê?óéñ÷|UüäÕîºrÏG]F>#¢ %Éô æ£-—ÅÚNÏî·‘¹;ùÃÜ¿ý‰oBôK•¿ý4Ú„MvP„JyA¿“éOžëô¾ èOúƒJ}ÕqÔ!¾;µÕ©L¡Ç”=µ  2¡bm ¸gANÎI{2:͉µ˜‹LBÐÓ+7:sß+ŽL~ðûiþ¶Z_×ÞõÕ‰3žÆv„(Œb4¨¨ËB 5ÔŒÌnËDñË3øIŒ~;çc‰œ•ÊÍ)oMÐÖè úË;ìñùš'}ÔhKý’Câמo â!¾NéP³ßk´ºì±J÷¼V•ÝoS¬Í´hó%¶î-ÛYRþìn[Û]~ð¢-ïN|ð×ÇÒ5îÐw§-çÙ:ñ¹ùhó9fçœDM’–ðA”½X诓ž߯Ðo(­½K‘ýñ‚þÄa]Ù–D“Bû|uRz]ëÁJ›)zPt¡ŽÆf*Ÿ‡øîÔV5zážd÷Žb­;Îaå*ø04ÆšA@Ï»íIÌW#ö¦ ÏÎ~˧c}w _lzgy°½4Ëûq5IfóUÑf‹á/²ûnL ýú‰R/¨èN)ðtý²Î•(ìI¬íIœïŽJ¾2\è{°8«/Ôa!¾Gjk•lµ¶Z«neç1¸§Úä¢M‹e·.uoéAŽ^«{ÊÞ“æ=õ¯®¹çÛãä¶çÓãËï³Sôd9ÈrX³•&ˣͧfv]*Doq}¿J©¡d?N„~-åuý‚é÷ {,]'/rÅ#Wâÿ{À^RÑP pYÊïaËn¥FMiñu¡Ž uxõÊâ;(> Pk/Ô•˜vÜgõÞÅàƒÆóQˆC‰WËê¼¹ÅлÎXõúUw|}|^Ã÷}9`Îó8ù²#Qõã*YŽ–¤6™‰1*9ýn’‚g{ä£óýJç#º{µWóú5¦Ÿsް‡ë:U3WêaŠ»©@ßJjÐwùM²C°àul­†š‡VT¦j«Ep)&äÈ+ÆçdvYšÞ{à–PÂàQ°î¹Ý·vùàù[Þ¿b߯Ì ¹îõæÜ™ÈòÜW~œÞz^´Å䬞ëY×.v°W»ýl¸ƒD¿HyÕL[Я5µp®“‡=Ž"og)•ºÁïk•ô¡¿O úîìÖVÀ’Z|Åê8BVWˆoQ™º.MÕkiRÈÎXÛ™é §XÚfîµl¡Ö€›zM}zèMŸ^zË—ærXàœMïwù`n·­¢:«òT©ËÒ,Å*‹Ò›LÌì¼XC?›ó£|?i<µBo¼—¢i:ש¦é·+ÛDØÃ»xStü>_~ Ð÷ùê§}gç¡=»å5> 6N¨ãbñ¥“’LÒ鱋1³º­‹6Ÿˆ­Îlð Ô6ÛŽ•Ô6>k_ÿ/_¸ûss%¶Ày;>é>ù©šýo[ b ‡­£Ÿ ¬?%ÖzFv¯hq#€~äÐSpI)Ï"Ôm„ª¼¦Ÿµó’¸M{˜ª™)Ûl‚~ÑÅ›j¾;ºd ƒýd¤§}ËåÛ;Íyvë(`顎b3Ý,>ﯩ­Eé (£ã’ô†ãÒȩ̈ÊHBÜgwÚÐêÒ{O^õÖ¹;?5WJè7ïE¡„ÚÄèdëÎŒ6Õõ ývy³öh ´ÞÒE\§ {Û£i{ô>FÞÉ•´ãø/LÁåó‡W$…~¡É;©ã–MÌ´e·L›É´ø«ÇO{¤¶Ý¶F[NO«3³Å…æGÏ’µ×¡i=·uýÈuõs•Úƒ®{³å%÷fwÜ ë.ß/öÜôúc3Ú/b"Iø° ßÒ·ÙNè#1ÆG {d‘Ë;ßU\)8~ŒÀIúÿiIA?—ψ|»FMhñE¨£ØL%+ PGè%3;­Io<.­æ6f™i”ÖM²C*U¨;xO·i‡‡lüpȦÌU.8yí{®y¤ ÇV"=m‘ Wøð¦JˆÔ>4ëŠQYõ@“NXL¿öØJ¼2ì±ò])ê,­ã÷ûÚ¦ } *ú6—¯MæòY–è4÷Ìn=Y5“BÍm¤ÕÉŸ!:ùëX!“:?+3[_߸ܽæ¿2hÝæª Üð~—)ÏÔ9i7Ðo‰Òhá®®pô#R/˜”ÞplF‡Õô‹:—àŽ˜¼GÖ dØ#Š\BÛãÎw¥¬ÍjáMÖñC‰œ2ôѪR2ôKvùBž)4 v"_Pïö:+o@‰6.-jaV–ÌC&Yf©Bn§õ-‡ê³ì­þkÞ7×Q°@÷¹¯4:{FËÕ±ˆ•ëR‘ƶ I‚;ÎFÅ %ôK®“‡=NâÈ•ïº?8C5¹$ÙˆÿÚÒõ­g”8jAŒ”Òç,ð¹|EhòÅ Y93P°X¨ƒ^Šôz£Ã9cE¶€×QÎi¬hQïím¯y¬÷Šwú\÷®¹Ž²z.~£ù¥÷åtXô+Ÿ-ÖLÔr‚’9ìüQÑÆ“¤`ÎUäò¤ùÕ D¥qüÐ §ìòe¦;"ú“tù6BÓÍBŠV´ÙÜHÑUá̉|¡P8[!“•ÚÆš,¯{òͦ<×céÛæª\ t_òVë‘öÚfç(eØC¨µÊPÖµ‘:¸ ¬€^ÈVäâù.W7¸‰N½Â•bÄðŸTJèügÆ…¾ƒË׉$\¾–Ý®No0!œ3BL#T#8AŒª‚€ ñ3[¬jpÎg½ÒeÑ›æªRh;épíÁ7Ó®E•ò*–†×eZ©GÇE FD›Îfa+ßõÌ;þøê6´°T073.ô¹b‡MS³Mµ¸|w Ëîò›-Ô¼:˜~µíu1* üEäv\ßøÒûÛÏy½Ã¼7ÌUe-ÐvÆËõÎ>Ù|%_-*‚~^—e‘:›/+F+‡2‡§Õ'6VèD'ß`­èÒ†xTO¢â.4È¥>„ž¾¦ÞÐw*vœ\¾$v¼£|îòÓê±Í[xU¶`uÒk/(è½£éÈ'ÚÌzÍ\ÕÅ­‹_mxñ!¤VŠö-§hF³|WŠ:EÒìE¹¿®ê‰ãøkÔ•ú5²ãA_ TKäò‰Ë_¯æšÞxæË1—ÏŽ‹I(œ£õÕ¼·é¸g[L?b®jjFW=žßs{Z͹RŽÆFMñÁâ\“~•¬Ø+\ºãËñ— ç„ú¸”¸—™îHô«ÁRÚ. gùÖÉÁ‹&,+Êo±\Dj¡`‡ fCMÞhü M¦¼b®jmW?™Õæz)Gc, '(I„]óêÃæª‚(¼ì1ôQyoCQõ)ËmÛˆÎôÆS,]´rü¬¸«©z”œ“7p9XN‘캖]Q‡/žê ®±Ð¯¢¯×›Óôvùk![ˆÔ½Æ^»ÝæŠCÙ-WŠÑ³\«£žMËÕ6äywÑ•O™« YàŠ'à•bm®'¦’7àRuVS¶Õš_Ô}s“3ocn[:þŒ©Ñóy#‹Ð´•( …0Ž9~{ ‹\Ç¢‰ø1¼ìÐÇ06¹7ÅAçÛ¢G‚+8M¡Ë·Dš–ËôÓMp¸üî3žïwÝ;M/¼+Öx™ÖÀ4jB“,oY=w\p?B sUºòÏÄ‹MÂy£KÁWzîœ6k µê»êÝæçßÁÚ¯,ÇŸÙþzk ïáR'Gk_´Kƒ´WPbÆéó ;.èûý' ¯Oâ±EÑùJlSR‚‹µà툡 LœmNI|’»u¾ö±׿ßwå»]ç½Z…q«K=—a£.LÈ(¸è¡ÂË5W¥X ÿüû°zªLÙÎË”9ZÜ’Ñle£ ïé¾äMHëú¯~¯á){X}W8þHö½^©zTÈd»oˆtY&»J¡i9õ˜ÇçkXÐ÷µÐGç{ˆvâ$¸|€¦˜|¶!£Í2G”ßöòƒƒnøfê}ݻݗ¾Ýfâ἞ۘË×nè]d³Ihö`÷m˜ ¨ðâ‡ÌuÔ,Ppáý¹oA7³ÕG9ˆÕZ´X®ÖÉ·t,~¥Û’·{­x§ßª÷®}¿v¯-’¨!ÇÉ£¹–‹Ïÿñ´éª8© µ‰#¬ÆÅ5bå} ç'èÛ¢û˜›ÞÆ)-öLpÅfžN"¹ÓY£Ø­ÒüÜÛO^ÿ!ÌcõZþN·%ou^ðfã+Êê´Q?3ÔûC3Ø,ª;rúíBnÁ\n ¡±|ƒÕŠÅäø,jÏë½³ÅØg:-x³ëâ·z.{§ÏÊwÑE–×îzbA¤ã]#z¸xó®¥ã—Ù‚;Ùõ&øí‹ÄóŒ(ܳ—ðÓþ,­!«„hÇ«‹Š œ¦Kž;’?A´®³æÃ'ÝtêÆÐdcÁd=–½}¢·:ΣÍÌWëœs7ïð·\>›ÉC0ˆªï.̈Ì?ûÞ‚ó™«‚,Æ]¹n–c7ÙrülþëÁÍÁ°‡ÚÎ~ ». ßÄ}Ý'®&—k¸D0ôŒ¨I« èËæÝÉ®¥å´üŽ˜‡Í¨â16¾•ô‘éÕFæ3©¦¨dñÞsGWŠkP \Ð#¬£1R4Fô1²Q%µºn<}Ëǧløð¤µÀd0Ì#¶ŸûÄ[MÆ?W0ø6ѳËÇnb&¦ŸÒ`q¶2hÀ^ø¤ü³ïÉ?ç^s•§κ#Èùºi9~‡ áŽwà.›kžsO³©/·.~­ýÜ×q¯&—¿ü¤mÖ¼?]£«ß¡ —âøóf¡ƒQ¶/ò;süžÉ®%â/1æ!èûý=Ê ú~ÿIÖB8]jF•,Ûq4R r†MÊW]ˆ¼ûVvSë-¯0ÍONË•gnûÍÔƒ×}Èó]˜FÄݳݜ×[Í|µÙ´#õF<‘{ân2ºpù| þúa°' #ÅOÞ‡µùgÞe®r±[L+G±s’ŒŒÑk´gŽ­ÙbŽ?ï”Û\ûl³©GZÎ|µíì×;Î{÷jôÐ aƒÿ:é†àËú-xE Û‘bæh³)Zߺêܵ%Ê¿#æáûç¸$NŽgóùš”#ôÛ;u;úY½’åˆv\\ÁÏÈ<5½Áµjƒ"É<ë/>këÇglù˜Â–і{(‹¯BÎÕ`ÂK…C¤€¹|Ú‡Ÿd¦+³Eç'ßN²°4óô;éÍU ðÅ£Ø:A wÙ¶9¾l‚¦ï„¯©uÅø9ð£@^Š÷çÎ ßD’†T „&ü¼|YÏ©ÏØ‹»Ø¿=OdÉj` ÙàžûTÌÃk[Dqú|Yå}Ÿ¯–³¡Ä«‡PŒ qŒ…Ší°Y‚ѦÅÒ\>b¤þâSW¿uÖöONÛü±;ßÅ÷ÓæÓŽ4žürýñ/Õõb›l¾‘¶eÁå÷ûØf¸À=|^ÂS±2-Ž5Wr`·Í»a=rðúX¹EûÖÙÄ}æøsÜ\8ôÈŠðC4šü2îÆ¸'ãΌČ\þ²·‰Ð\#\>‚ØÎ£¤â®¦êÉ츊eÉrdƒJv1£qQõìÚ…œÚdBŒ/Ï?¡Pd¼PYÆ´ÆEkêª57œJQ‰¢P4±V3ùtÑrÞ`ÉÀù/aNØ™[?fa3ßÅýwÕ¦S_i8ñåºã^¬5úù¢áOâwbûŸáò÷áG"ÜÃÏqWþY,è?÷>ÊÏè—cÛrÌ•Ø'ßNÉÒ¹Á0ô³;'9~ Ÿ9þ·à?Õ¼ú™Zc^ÀO€‚\þŒWáòyv«šð_§múAl›‹ïâ«„äÄžÙYÝÔ¤*>«§ä˜'nÛ»óƒç–'ðñZÁðå ú­©zmºÛ¤9ʃÛá2:°¬ßÙ°´÷”'Ͽ鳳·ê™ïv`ùnóéG`nèxk_û"ä\5G.¼øaZˆÉ]> uð³ñŸèŽ îÇÅOˆ¹âZà¤[òÏb1ÌuÞ}ä5à;pçŽ '÷Á‰]þ8 ^ëšça|ü'¿‚ûp«â×àò¡‰$š\¾ž½ãÓ¦§ßÂT=lÀ ’ÝZSøxZwÌã5¨Ö->¥Ç9ïD.[—#z>å ý@èTD½hM¶ Èј¢ oÔ*8µÿ—"èwÛ–yÂù\±f¢ËÕ÷Ýýùy7~*òÝõqóÝF“^®Ç?æ…š£ž­yÕ3д\pH„øÒåã',8ÿ~ÎBÔ}/y!¦’¹ì€Ì˜UÄ.ú *V0špüg±°ñÏéwâ02ü}ÍQÏ)—;pËÈn_Cvë$47|xÚæÎÚö ~ͺýv°ê¬œ,[w¼5¢Py<¨m¹Æ¼¹{Þ©¬Ká¾ßß²œ¡ïv¶´õè‹‘šJ²¦S캛TSçvTA*­ö,k°T£em†ÞqñÍ_\°ë³sv|zÆV™ï®±ò]˜ØÊw'¾\g,…=5G>[sÄÓ~Š.{”~3rùuîáÆ²rï¥@]§…DÀJ‰š¹úÜ„0†0}ù㤆¸äøB¿püÉñãVÅÔåü5¯z¦†ÁavžÝâÐ$—¿õcüŽø5ó:®SJfºÉ7gŨ$¬Å<ª¶åÐóÄ¡8•”‡ûЗ3ô}þzÔA+4Æj´ ¨ÂZÁ:ô•æÌ®ÛóòiOžÌ–D¤ÕBª¸>¹ñòƧìÁè÷¡{àø?ùî½¾û68cG¾‹d‹Âž«“˜ñŠ'è'ú`>ü=.ü„Òåãß‹†=Nz/¸®+ŸÂʺãö­Æ.föXá¥ÂñCBa9~Øðþÿ v«9.¡¹üzÈn'½œ˜ÐW_¿ã…»>‹AΩ”Ì ò—e{Ì#j[ØèH­[ššß1ä¤÷”+¡h—üÚ¬¤Oˆ/ân#Y³7¦Øu;ln8Ÿ—ωù˜ÃøqfjõÜrù¾_]²÷‹ w}Îò]NóS¾‹RÕwÝù®{àøáÀààá½÷Üå?Œá¿¹®ý?ÃnO!-¦ ó8»²{ìÀ]±,0ò0醩ÿÅÒñÃkÀtpÂå#Ô!—_.Ÿg·6Bóm¡‰ß¿à»>?{ã{R–#bžh‹)b(¹U¶dp%PœñÃý`䢤Ê13‡ËëÅf8׈(1 ÓèóÕ&jd>_‘BµX’!ÀXOl²"»Íšáû¿ºìÖ//ºù [¾{ƒ­¾Ëó]˜^Ëwö&Æ"{~ã¾àþ‹êðß¹ü«€ûÃ°Ž¦\­öðÇsOÜCéø¸ †ì¯3ê0Ý*("MBëŒÆn˜ÒñÃkP È$æ2†Ãå#Ô!—_"¡‰ì5,°goÿ¿àE{>?uù«RÄOZtxºXÛ9ðz,Ü×…@¬•ŠâL%Ü„¤‚褌œo* “Ñ}ûÊN­ˆ+¶’ ag´ù$ípiþ°›?ÃŽ' {X¾‹< Ù`žï®ò¨ïR¾ šŸç»W3FŽ÷î‡èÆ}el4—Ü“÷â¹h ¼BKÈî¾nJÇî•wâîúW?‰/ 2žr¤1,P„ï‡/Áÿ°Ç€x‘#ñ»%wÜ_Àh©špù¸uãÞÖ³B)cžÌÎËE1XJ!lá>ŸL¨7¾¸Û¾øHg;»ï¦>R<üBÝ-鎛Ñׂ†`Áè+¾ ôÅ¢s¾ ®×±63­®T›¯:ã;WøjØm¿bùîçžù.ÉÚX¾ zê»î|—?ÂrüDí3a~HîòyÀŠŸ àÌ4Š2-¦¼\眻Ä6lÂ9†®ì®[!,ûŽèt$ÌrÌæø¯zºà⇹•(Gâ E‰,».?5B“\þÍ_àÞc죚™bž¬[Ä"7Åi ÷=TœŠÝwvëfLõù “ArÊñYSÌ@Öûª¸ZS ô]>mÅÊè¸P4"òÓbÕéË_¹úί‡ßÎÂÏ|wôÌÉ廜­CÆvÈŠ»AQãw-ºêiêËMÚpÓ©G 0H!ZOz¡æ ½Ô=|L\™íÖÕ?﮶Ť2@Á•—DÈñOx !;wüE—?ÐS*!Œ€Ë¿„¹|Î $ 4ÙšDh~Ì Mìíºdï—ÈÜ:\~¯ÈYYãbZý¹\þ™B¸o›f.ZÝ¥þYj÷3'§º6+Ù3àóÅR÷‚{©­ê.ðæ*W®wâ¢TMœ(Õr®šŠÐ$—€\þÅÛßkTd¸ŸÑn–Tü'Êt•Ž-AMW#y¦—nmV²§ÀçÏrBß»3 ‰²×Mïh9.b>‚~Ë)bµ›V’Ùv ?áﯽï;[¾»ÛVßåù."“Tò]ÐüZ¾ ñúàÛHƒÎûîzÝX0ðæ¶ž.Íûè“D=`¤ §Ízζ; ?˜6S¬Ë¬W~»ëûÍ< FrWˆ½¡CE w*ܯpzÉDKßnzåùø‚¼­‡÷ôp•+—¸¡)E~ Mž9šë,…¦"4AÐ]uç׈ZÏ^ýš}š¶Ùy‰‚¾,l1³Ð±‰wgM7!ÉΑ,ˆKý¸HöDÙ”(Vž”†Þau\ÞNŽ#Övƒ¾¶Óö†Ñ¾˜üЯÇßÿ=Ïw2»MÖwwH=³¨ïÊ|—ËÚy'ß}„×wíù.ž[)졾»›(úì¶­î·÷˜w„\þ:*L¢ n8€”Xà[ÏÝü~Ë3ö’æ÷½Ê»2.î6òÐÐÝŸ!§æàq‘¡ŒŠ{wüð&.°‡J(ÜÚ¼Ê{–ÝzšL¨€²)4“ 4GønëÚƒß ž÷únÉ…óU“Y=Ö k[]Ž®šn< §'É“[Œž^jH'ûÄPÆEÖ ›ÔÞ>$Ð99G­€¶Ó;¬­6£ã< }Q¶ã½©þf⃿v滜ægõ]jãbù.ÂY«·ø5wZ}7a¾ %:Ëw©ZNæø‰lfû¾›]rpàêwÉåo!¢.ðBùâ½ÄÙx=så«u»­gkböJ»ÍÙ·\´ó#| DÕ Q7…e Œ‡r1á)?ì³ðÕº§ï#…,xdÆ(ðv6ѾÌÙÊHhRÿ!sùR¡‰ì–šˆT¯Ž;ô]ï‰ÉÙl<Ó]žsângƒo<’Ç-gˆÃo"'$‹àR?.˜Þ¿Lз&)z¿Gf·•¶Ñ‚íÖ·úÕÿvÊÿ¡°çàw óÝ÷©וïÍïÎw•¬Â|W8~Tšqÿí´ Ô~籟¾å#ÄJË †@¿.r¸‘w~3x擹M–ÒdŠ£u5è±á‚uoÂ&ð¬H%q?„XŽÿîø·rê ï5¿äÞ,>¥«Û6ÌåS3¹–Ý–¡‰h+4uB“»|ü|ò1;l,a´é<ÑÛîMò¸ÕËÚ4BÕ¬¨/gà ýÁú¥†t²Oô‡[¹w’ ”†M†Ù”5D$»¯}ÄZ»u§Ì=\üäÓû­W¾ËemÌ·ÅËw§SÕ¦tù.PÂõ´Ô@DSõÖÕ:ñÆç¿D.)RàÕ@¹Ž8Çö bY0Q£ïüªÇw¥çÏ"m_E^yMŸ>ïÜ [¦ Âñã#ÁÝ¢z èw÷xî ôɉT`Êp¢xvK.ßNhŠìV#4•\GWh²þCÙrN M$Ъå\)4q?T„&¹üû¿ÇÏ×üœ}r¦,ñôÑf3ôÝCMôYnqøMôès÷køÂÉ"¸ÔóòôK&õõñšÚÜ(öcÀÙççD›-E,Èçîƒê3îá9Oÿ8ó‰¦<¿-ßý’ÿÆrl E´*ß1<ŒõïRØCý»Îúg&Y[¢|—D…'l¥Ä õEæ´šžµïÌõïÂåjÜå|øD|BüÆ£nù¸ÍàØöQW4¯¸ßÈ{'úA R oMŽÿR|p œ´ð¥Z}wàӲ¹rùT7äC+ÊHh¶zË9)4ãš×Àå3³àç«Óÿ&9˜A¿Å4ïy>¥à7e‹z8{t©ñœÒ}‘¼©öyâ4I!%R_AŸ~æ¢Íçˆa´LÞÜá²»ç=ûÓ¬§~œþØo'?üw¾‹›;âZÑ¿ë™ïʱ%Tß%šŸIs!Zf4¿=ße4?êš®|—…=LGN‰ÚšÌÖ×wqèÒ›?C¤ØÁå㞎Ï8â7Æ= gõò ¯×m³‚¶}”ßÕá´ÇÝñùŒÇ˜ö(Yoæw !5ÿy›ÞkzÆ­bqPe8\>Ñ•$¡É³[»BÙ­ÞrΪñš6B“ä:Ìå3BŸ f;@– Š™„LŒÙzšc¢‰èYáЗƒÜ´…V ‹£ß eœ“‚KÿàPö°}‰öz–$õùý×êPaôçÚôc-fèÐo|Ú- žÿyÎ3?Í|ò‘ï²×wU¾»Yä»|L'ÏwQ¶DÅžòÝÉJÏìÈw©Oתïºó]öð߃bðãñ1ÍVæw\wÒ¬gFá†Ë?D¾ p(MœU|æy‡:«ø±ì¢Y4Á¥lWƒö×]½ý-xÙOÿˆpúã¿úÈo)”üp·ã~Û]FÜ—‰ƧXóŠ˜ÅËh´Rš¬AµœSÿaŠ„&>Î'>긻¿R²Aò´+¶C?1µÏÛµtý¦GU+Ö³ôhNé™ÁØ`ôÝ}‰ú&\“­èÖ LFêóéQ±VÓÄPNæõ zl[üâ/óŸý?9å»<ìaù.‚lÒ3;ê»|l‰+ßcKœù®ÖÆ¥ò]ÈÚ´ú®#ß…â~ˆýx¬$ÙhYý~Û.\ÿ–rù¸;šø´€)->üÜ'~Ýï²} EŠ¿Î;ÁÊ)*¾`þ“K_üeÑ ¿,xî繇šýE€¸· û'Çß÷ƒf=×á"ÇX\ôq ŸÊ(³ÛRš½Mªô‘Ë·šŸ)…¦"4a¸ØäÊÝ1¸(Ûruf—ñ ¯¨}mj¹˜HåªjaKô›¢ ë5N À¥p ÒÞ62Í©ÔO­ž% ßv†Z4Dý\6Î{ú‡…Ïÿ‚Ÿ¼Ä| ƒÊwq;–õÝ7h^Ïwil‰èߥž Þ¿ËÛ¸„žù¹a¯ï"Dvä»Tš!š‚MÁÆ|‹;\°ïšÛ?W.î3?¦ëÒ—·üÈïW¾ö‡™÷~޶߆”ÐI›0èê;–<÷ãu¯þaù+¿_òÒï`xÜO` 8xÓ‹7¾U¿ÏÎ+9—‰5\>4‚äbŽ6¡ –I'4Éå?úÔ ox]L$ÏꬫÐwWµôUU+qA×çK/=šSz¦/Pdƒ>†«8ºÑ“,å²z+²ìÍè8W@ŸnÙý)…_Hâù.~o4a¾+Ç–°ú®Êw!Ì,k¾‹°‡ç»<ìi±škQh°LÝE™–œðдG~Í]>`нì•߸«^ÿãõoýé†wþ¦SŽ-±å»²‹ë™“Íw‰ŸfÒsê4es‘j¶]5tåKÊ寀Ëý€/@¼þÝ?oüà/ßûÓÐ9dæLwê·\2iÏ;›?üëÆ÷ÿ‚§¬}ûO«ßø#îÊñÏ~â·Ç=Ñ€FÙ¯á.ŸdÞl-¹|™Ýê„&æÒ•¡‰"Ÿ¡™˜ÐÄmInS}'=¦C?Úr…Ü©A_Œ­MIË zµBY–Í©==œ;¢ôз«¸×Ïî½Áý‹ox Žs)ÝîF á•ï~e-A}—ç»r-?-aù.:QT¾ËÆ–0=3{ kK”ïî4¿žïRØÃjò|YZ½Å|˜jº-úo·ïcîòܵoýipÿþ_¶|ø×mŸümÇg_÷ÚÏ/»5dßî7ýò¥OîÀ>ýûÖÿôoxÿ/ëÞù3î¸opÇÑÊ‹Z_‡w¡yGõÄà¾o†»üÒš|JE–sÜ<¹”•ÏÐLDh‚ï’„&2~ܤ¡že‡þ¼øÐçZ>‚³d‚~ Ú75ì–ñÑ¡ÌÓJ€¾{‰}ƒðpèç¼9ÖJ¬Œ–>mþaüðˆ˜µ|WÒü™¬å»àÔlý»Ž1¤g~ u}L§¦gN˜ïbJ!dml¤0£ù©¾Ëi~=ßåa˜Ÿ?+-¯¸÷°ý žú wùÞû˦þ @Ö7~ñ]_þsÏWÿ\öè¯Úö¾î?ÊUû·¾ûüã®/ÿ±óó¿oÿôo[>úë¦,Ç?qÿÇÍûms_øP^^=äª'¾Z¯¼ MXLÍÐL‰Ð„ò ‰8rx+ø¬¦gïcýæªD5Ó }·Œ'EèûÃÍËæÔžHï\ÎÐ?éÖXËÅâÆÍ ªÜîøðyÎ|÷~©gæcKöˆú.ÏwÕZ ä»|-EÂ|WŽ-á£öö𓚞¹¤|a›!Ì'ÇçÑjËì:sÏ›óøÚ7ÿ¨\þÎÏþpâ·|ó?·}÷¯}ßÿ{Úî7×þ¹õ»íýæðŸnúâxØ6îøßû˒ÿí}é¾4ZÞ1‹’«ZpùrV—Ên“"4ùÜé„ M TK’Є’É™Dÿáí$×A‰CšHÌÈå?G4Wa¿úœÚo3Tâz¬_fèûü™©a·ŒöëTôçèÐowÉ]H6 nöÌwQБý»Žú®}L'«ïÒZ –ï:ÆtÚÇ–ðú.µqÑ8r»žYìϱç»ÔoÊóÝzl0&d`[VÃBΛZ¯Íòñ7½¥\þî_ýîoÿõ¿üö?wü@þBèÿö_7ý?¸'Üøù?¶ò·ïþé¼ÙfÖšÃÚA‹Éås¥ _/³ÛŠ!4X34…BӃЄŒ·œ[„&«o€ÐDv ^ÞjÁ³?²i²ªãvm¬}9{ýHZÑò_0­&ü}i\âY ‰ž“n¶ž¡C¿Á)7¯ïÏ—‘/–”ï²±%7±12ßUkÝk)æ»÷yå»,ìazfG}×ï2Ç? ½lhá§)i; ÞºìÉoáÑÉåû?:à~çÿ{÷Ïÿ{÷Oÿ{çÿ»ÿ7ÿÆyÀ©ÀÙ@P4þÆ7ë´\Bj>Û”\¾œÃŽª¹•ÝÚ M!×q(4Y3J9)4©_GShÆ#4‘Ý"݇˟zèkô3:Ï-ßX?œsÉQ>½]$ÿšò…>Tû:ôsºoÃMÙ‚fÊw)ìù.Ò3óúî¤^Lïò5ŒÈwùZŠDùîÐõ]G¾+‹óqò]±Ñã±è&2!-}âécîÚöþŸàÝáòáìúƒ¿û¿{ùï]?ý/wü„V<ùM‡›h1†¹cf<\> }™#]>4‚%šR®S M–ݪ¥@Iš`äÀË-{ùw×ìýÈý¬îËË—á f ¨臲ÏN úîj®Æë#Ìè0K‡>üëŠ×š¯Ä|—-áù.:•<×0zä»4œ÷ï:òÝ{ùdmQßù.Ôü2ßÕdmª¾ëÈwá°YØÇ? ë˜ÔæÕ,uýó·}û/`ˆ¿ç—ÿÞóóáþ÷ÿæ?;>üã‘Âläž@­Ù€GN´¢¯Þ(BÓk ZI M"4×'Eh"»å.*ÂÔK6¼á€~vŸ ^ÐË0<ñxý@¤U%@?í. _Õ\@?ó„…:ô1»aöƒ_!áÉÍó]8¸[}W从±%Ÿ8ò]} £Vßek)hâ$':滼 £SP±ô̵éõ]|—…=püØk9Ž3úúo@„ÇÐãºã·ÿÙøÚ93ðŸhaY[b9ÚÿóXvK„æÂ¤M¹VÌRhŠZËy™M–Ýò)#¬åœg·\¡©ÍE/þ‚¿×‹ž·CÿúÜ“Ð)r%(i%_Íõr*úþP}}¾«¬üZY½lä& ?ö–‘#‚$ùî«2ßÍ/ë»ÔÆÅò]>¦Ó®g޳–"™|WŽ-‰ŸïnÖë»2ßÍ/ó]´Pð|—Â8~!æ©Ù` Îÿ‹øgÅã_Ñ©à ã¬Uv —_.„¦X2à¨fÍÐär$ MÜcu…¦ƒÐD)µðýPÏi.ãé[/õÚEgÉ×RÖðÔœQ ¸§·ô…5èÇ-'«Üd“v8¼þeë_Žz‚~+ß}1A}—é´ò]¾†õ]Ï5Œö|W-‘c:=ê»^ù.Ñü¼ÿˆ—õ]™ïÎTù.-4Œôoùö_Èkùf4?ÛÈP‡¹|+»•DׄWBåg0¸Qw¼ü^ú±Ösiú †ØÖ0&3”Á®Ü”«YÂy9n-ñ©ŠŽS3–˨קƹA·e´^%'—`XÕæÓçÙ‡:(ªBî|—dm,ßE¨G¾›äF>mX_KAcKx¾+ÆtÚûwË”ïâ5̽ù«ÿÙûõÿ€ÒÁNsÉ#_²µÄÌåóìöèš´ò–-JHhòN„&ØpTÎ{çÏN»•CŸ8ˆÖ3½ /WO§®×f®$¯_£F(çüãÅSêÒâеZ` íé²¹÷µ‚ïC•Ng¾û×3;껎1”ï&³†‘­¥`ù®ZK!ÇtÚó]6¶„öõÆÏw¥¬ ËßÍ¢Ó–ïÕŸ‹Ú¾¿Àå/zè –ÝÂåk„¦Z,i#4•\‡)4 ¡ Ú€/bÕ¸B“ÚÓàq”BSš¨¾ƒ“3±þÝ¿äöØNK¡©É“UsÛΰֺ·®§Þ¥HkWiÐÆz‰å‡eëÍU[oc­géÐo}ápŠ`ÄQåñÌwQ=ý»ñò]ÐüZ}WÓéÌwåZŠ”ó]ÑÆÅF =³#ßEûžd¾[Ôp3îfü‚xaÁ_$ 4Å‚&M¡É•­ºB3BeìKب]Úr®÷Ê-穚Ènáòq‹¾î¥ŸÔYý޳µÍ»¥êÍÕVx¾`A¥Aßn¬íý,i ÜdŽŠwQÈ›¤_åÃaÝJÔ¾-ãÁµìBX¼ŽÿsÒuÅÍwÕØtjkùnéÖ0:×RØÆt²PU-¡¥ Ð3§–ïÖl¸!3ä:¸ð÷y÷ž¡ÉFz•¨ÐÕØ ÍÕ\„&f²-ç¢å<%B“w)pB“D{P.½ÿ—Ù}mK[!°;a!et`ŠÙ¸»8c7“žÈPkV¬ÍJú(ùüé)@Ú/*èºæðhÐÏh?S´‰†Æ­»¿ø;bD”ï"ì‘ù.r)hÔ¹‡þÝÇeÿ®¥gÖò]µ†3(=ó]k-×3»ò]5¶„úwÙ˜N °Õw7‰pÖ‘ïÖe{^Qßåa«ï5^€;¾‹¸>üë샟BSmˆK°X@m9·š´òVWhzš¼ÙMh"»Ülì­Iè£K‹ž¬ž«„€Ç}xÔçð„óG$ÓŠy`¤hrÙ§¯ ñ&¨ýNsíÐßrë?ƒ~¯|÷¸žï²±%"ßÅçFMÏì¹–Bl×)M¾+Ç–p…¯ïò6.MϬê»Eá㦮â{>£Vj„&¿sj-ç4PÍ>C³¼ MHeUËyúëe^· ÏFæçôß^²lÓüÈÑ=¶9ãØÈ"öN‡²†T ¢“~ÕpîE úLV¥¯ åÝ¢Ž•*în­=—ªZÝ—Iè‹Þê æE~žïò°ÇVßuä»|lÉg¾[ú5ŒŽµèßU²¶Rå»EMˆ†Õ5ãîÏ*–ÐäûùR  Íål¸4¶œkÕ<š<»}„ú•BSšpù¸§!œ;cÁ³¨Ì™7A•'©ŸL‹–ÚI!—Ncmú‚@z§¤AZ1 fôÐר•`Ò²}(\ Ý4‡+X¨Ç”&ÉL¸õ”ýÁ‹|÷S|x¾ËÇt²ù̉×RÐÜmµ–‚ïØaý»qÖRxê™õ]5¶DËw‰ægzf4P3Y\{Q³%Hð Ÿzç'R®“ŒB“/Ÿ,EË9[‰•·ã^d-ç2»µš|ë-çPh&Ohâ0Ã1Á=ÁIõ÷^ʵ^XZRß{{®?T«bô«ú#ÍÝ{Ò“™¯ïžBE™îÀ›3Úȉ”lvÑ»HåB²^+ßý N}×1¦S[ÈyUÖF ÖÇtBÏlÓI=Ö0&Èw±ç»jl ­JD§£¾[\Ô|)hôÝò ÕŸÉ> ÍJ"4¡ðƒAàòÙ@µXÿa²„&²[Eh"Cýqû§)×ö¢;íõ,Þ) ³ÉëYµæÖð’iÅ<ÐÈ,yshI[Ut’'£õ2ß¶„å»4¦Sæ»%­a´å»|-òÝä×0 O&ôÌÔÆÅh >¦Ó;ß-j³¡.i¸ð—kö~H¢ü’šIšÎ•·I+47„¤ˆ–±šL®ãEhRÿáÏJ¡©MŒœ€ËG\ºàÞŸ%‡µY›Ùm)¯²6l‹GöæúCuSiÅ<<Öš _ÚméjÔ8—3dt(¶ë77ßüÅß}G¾‹°óm`÷5èßuè™=×RìÆòÚ;b廫JÊwÝkÏóXè­¥på»¶6.Ò3úàõ ‡DçC² M6.\,Rý‡ö¥@e 4Ñêél9OŽÐäM˜ $ÀËÙäÊmÖf÷Z'ë¸. C<õŽš¶ÉG0 6œ_ê,§øª¾@nÉ™.›¤I”%¯éêrôhá~fçô)Ü_ûò€>.´5%ÎwÅØ–ïb˜s #å»ÔÆ…Sjã¢Ek,ß•k)øbMžïZk)×wKÓi×3×]XØn5qŒ×?Œ¸éý’ZΓ%4ÙÊ[ˆòÕR )×)‰Ð¤½IbË9mŽ„&¤NÓ¤]-çJ¡I„æ‚ÐDv‹ ‰aëŽØ„k­¯Ï°+Q ¯º×ùtN~Ãä,ôµË‘ÂkSDhE><­VqR™®caºšE¥¶²º¯´Æè19ÜCŸsèó|—‡=¶ú.ÏwcKD}7é5Œèß-ÍÆýjlIü|w^ß-j¿™"ªê¾ó}Ö¨·œÇShª اZÎåÊÛ ±!"Ù-ç 41˜Ú‹ÐüܥФ)ê|†¦ê?ô$4!ÆÆOBâô9OÉqá|Ðì2·L_³\[´Ô G—Æ^P‘$”snEb9Å×ç/YÎp…(M‡dÓÆ³ûn•ÐáþèßVЧ|÷G|Þx¾ËÇ–ØôÌI¬aä{•=ò]çZŠG’XKQB¾[Øáz íЯËw¼§úõšŒæ*gBÙmR M¬á.ßê?¤)#NB“ä:¡‰y "îüá?=F²Í i9G ôi‘#©¾1Ãëÿ±¡kî¾DmUº%aÆz¤ÏŠ|x0ëdïš®ZŠÈ%‡ø-É‘Ëéb³µT‹Sœ±V«ô˜ç‚eÏ+è[ùî÷qê»^ù._á¹µ†q{…¯atå»bLgaǵhfÕ¯K·½«ÍÐL‰Ð,iå-šlÿaéMØ/J†ÐD¹.÷dÜ™›Ÿu›mòT«V´c­Ð¢.gâÄxBL³Èµ=BèÇ©ã†V$–S|í@z{wMWíŘ>‚²#ÜWNm‹(§8£-U¸OGeÀ„‡uèS¾K4?«ïBÖ†6.–ïR—ÊwùZ ôïÆÍwkÖw“ZÃhÓ3»ë»2ß-ì¼ýÄtb×}ß]¼ù^ÃrÎдöÀÙ7D”ŽÐä+oK"4Ù¦0«å´Ba\š÷ká“yQœ cÁó°5—Ô¹BR¶¬î”ê[å¦ìûÀ }žï‚E¶ôÌ|l úwù˜ÎWôµ”ï–°†‘ê»e[ÃÇ_R}· ûVÔŒôkȪ7ä†m)P\…fM¾òVÍÐäÙí®Ïu…&M¾òÖIh²j¼å\)4uBSý@'MzXДäò‘ÞÌ×u;è«fÜxE\íØõ  #…“JÍ Ž/@cǹ‹f“,%Ö"qÌcÛ¤kíOÏö…ðE°Œºâ†W<¡¯ç»(%ò|—‡=õÝÇxÿ®£¾+ÖR êõZÃèïZki^Uâ5Œlº˜5¦s]aÏmÐSpê:ùº7¬¥@ñÍ“Ý ÍP_+t*4±òö…úã_BË9)4“&4Ñͬfh¦Dh"»å„¦ú:^|‡ÜÍVî5›!]¾­’å.koÆué­pîÐ ‡qéÞ œ?Ò#æñæyìµ-5ž„ö¼’ã5ã1¨çŸ1ë‰xÐO2ßåk1D ¤5Œ S Ïw+b cAÏmPÑ!Ð’×§ƒW¼ÆÚ2Õ–sÕÈ¢|4¯ñ–óò&4ñ1’PhRvËghr…&ï?ä MEhê¿N½72ñ§çWE[L‰Oç;*YbK®hÆuE;ÁX¿Ò!³ÂŸÊ:Ãóxò<ÎÚ–G²mZÌ¿hlï1âžxЧ°G滘ægå»ïÉùÌ%å»j ãéúƵ†± ÷¬ÝÔ¯K_‹³åœšƒ ×ËךçÂê;áò¹B“Ígm-çqMô*@º'6DÄShzš˜yš€Ð´DV?þ'4Aϳ²TË©qè|máŠuT•,ÁíP£O­ù膭p—î é'ÐØ+æñJ¥Ïhð øE²m6URC”ì6²'ô=ò]Ó©­¥`ùn k¯11ÏwÕFêß,ò]k #¦¸†± ÏNœ1lQ׉‹_å[²¡}H²åœ)4Ev‹6bGv«·œƒÐĨ]'¡ÉWÞ&Th‚Ð仯ù MO…¦"4Õ¯³óƒ?jÒËUTØi;ÃêÉB‘ÛFç;t;,Çã£\ô¶,Æí µÿh¯ÍJþ @ìÿ`óàãIìz›†Yg9Ù˜†hó)z9,·óFNœ% {¬|÷Ÿ(1ÚÆtÚò]5ŒÈó<Ö0jzf^ß-ÓFžÞ°¥ ïð»hãþÞwá±åÜš¡™¡ùŒpùc_Krîò美s+šIš´ò¶D…¦‹ÐT¿ËuO§¹|ª^gt˜Ç+¸ÞRÍøº·)œš<ú#}¡´šrëKvÕøåD¿HvUe—¬ÕTñH_ËyË—Ô°’àRzfžïª1ðX%¬a¼Ýc #ê»´}Úªï&^Ãø(t"ßUkOõ^ÃXÐï&,)ѯÞóh Múú%ÍÐô 4‘݂Ŕ5PÍ›ÐÜbßr~û¯(»M’ÐüD´œ+BSÏnùO3}ÿ‡Rm/üwf—ëD®UÁuìǵ§@_ô¦P´S9k³’?C‘¼Ñ2摎ßÑ­ËÃwFØ‹ÄNH(©ÇÚε}Ùà»N6¬ÄC?JèBÏì¨ï&\ÃHóªîàóªâ¬¥Ðò]µ†ÑVßÅöišÏühzfªïôßs¥_=æ¾"ÚwŽ"¡‰þClFuª¥Bh"¡R M÷o1bý¥Dà]&Y½¶:]¾G×+Á•º¾‘;˜10yVÂ#CYgk1mÛŠ&äd¼®fs9þŒŽrE&ŠÁÌñÏ»ï³Ä^_å»DóË|ca°†‘ö%½†õ]5Œ ßì0ï ´q‰±%¨ïŽÕê»ÃE}!8Ädbÿ.¶qyÕw}ÜOpaç.ü¥Ûì—©°Í=—ñYý‡Ž–ó¤ ÍoŠ-ç²å‘rŒ³·‹–sÔÔˆÐÔVÞ&˜¡ ¾XµœC¡é&4ÕOsÖì'¬«&+Ò/ˆïò™^­ä—Í-­9¯rÖf%†‚éÝå>]EðkÉ®«²+?ÂÌË[ YÝn[2åd‡1Ûß(úÉä»e\漄5Œ–°†1àÍ}V¾«_]Š_ÊêšÐ<»ÜšÉšÈn]„&íýõ$4ÕOÓkÄÝ䪸Ô£(Íðvùš:_Ó«ÅMpѶ>ØäqX ô‡Ðp¾ßØ#ÙU•]åø× IÓñïˆ6´9þ ?S"ôñ6¶ä?|l ¶68óÝ#z}×#ß-ÍÆ‘©­a,8i/zô«ÓÌ—4—_fBsîë˜ËÕÖÐ@5B“6D°=pú†¹å…p(4‰Ð|ÏK¡Ir«†¥ÿ.͇ìÖYšôÆ“ì:MåÇqù¬‚+fkb+f6bCàT0½МÚ[úÒøHm¹¢½²«Ïça2æxŽ?½Á,Ýñ¸öP2ЧúîÏ¢בïò5Œ`ëJXøGÔwã­a´ôÌ4¦Sì#J~ cÁ [0õI¿:L1Þ Íü3ïÊ'—â¨*Khê¿K^§uÊåS/yÓ ²QëJq»|ÓÔ:ЧIËiÂ9ÃRÃa¥<:’7–­zeŽÝÖN–Óíø¥–S9þn[Ó^©9·”2÷E™ úµ|÷_ú|fçFVßÅÄ`Ú>-×0"ß-a #Ó3«|£[™¬ÍsL'YîÍ?ón¶w¿šÏœ?øVÌ<Ó¯¶S^`‹6¡y[-çÏàM©†¥šHE¼M¾ò–ÏÐä Í_iK„\ã!Jh9—Ù­Rh:~‹ƒ¿ü÷Šë_²óKçG[MvpùB×éŽò-—/Ôù<Áœ‚±A•æÔÞ4”y.-¶OÙñ ´ùxzm¼e8ïþsbô[ù.[’ÄF„¼kIÏüñɶµ¬¾+Ç– ¾ ðɵl>3mŸ~´ÐZÃxoþYwc0 ZØÊ>Ü7ô«åÄçE‡mUrmˆ€lý‡³•·- v{•pùq[ιBs­Ür.šÞ„æcöš^ M"4¿-çnË/⛺}¶’HUËfBqÉãu¸¾¡/®98£ýj×ô$vâ»| *õ*omVò§Èj‚Ï*?—1»µœ6ªgm¬Íu¡‚Ž±Ñ¾`^¤æX* ë PFtÖì±eÁƒ_$F¿>¦ùn)Ö0"<€¦¡Í«ZÇôÌ+å¼*>¦ÓQßu¯aD×ìyöèkóO½Ù‚~5ÿ\©Í M/BDmÅš0ò°Õ/f¶c›ƒõ‰QLdÎ;¿†/¨#ÇÌŠÔ»4£íZVöR\¾$vx”¯•±(v ½Èq}É#°Ò‰fšœ¬ã_©s‘/˜áýq}ÁPîYÚF^[§ï…Kž½ûÇÿ$ªïª|7áFÚGÄõÌñÖ02=3:úx}—¯¥h?—h~çÆ«Ù6.rüyÔw‰æßW0䄨¨«ÉØgÅ i]¡)³ÛR´œãsÂåãf…4âHB“¯¼Õfh>ü|q›¬÷:šq Í=Ÿýå„ËîÔAl‰ìëÏĺă ?½~z£ ¶± ]~(ûŠJCsªoΟŒãO«?ÆŸ–hn¨?½N´õÔX«é Úz¾äª¢Co¿ñÃ?%®ï¢þ‚5Œ”ï&^ÃhÏwÑCÈó]k 㺅žÙs-E¢|×6¦3ÿ´ÐéWÃ1‡-…æ—B“ª=B¡Ž®Ðû"Æâ6žü Ξ’ëMBsÉ£_Õî³Ýs€BzÙ—¤5¼ÄŒÅGn£çz‰Õd”Ï]~þì`ì”TXie^Øñ§7˜Èèàóá>Öàb^ã;Š#’í¡.ÕÃUÔsÛ\m2¡ãx¬¥øÐc #ÍgN¼†q‹Ó Ç﹆ÑYßu­a”ùnþéw"1Õ¯ú×–¢üý ƒ¡yo2„f3m)Ph^go9ç Í=ΚèVÃø7Œ¤¦jJ¡)WÞºghê MÐ —¬|!³ƒ½+‡c¦7™˜Õ}³èÎé´&\Ô¿†Ï÷‡ö‡Cy'G±‰‹¶FDAìÀbG ’*•†rÏ7¦÷ÁÞ(Ëñ×Ò"þúóC9ëãOÊõùÃý3:¬¶¦Òò mÑf…°Ç%=oÑaÏàGæ»r-EùnÒkmù.º¢´|÷°W¾{ç»ùgÜ…GêWÝ‘ÏPvëž¡9Ô1C3¡ù†K¡éAhB®#·œ§LhBÈ•³»>ùsg9ÞrËűÖÓµ‰‚‚ȵšÈl™ÐÍåD /¦(<¸Ð' b@òjV-|'ø4þPsÚ“?KFü¢¸λÀÈJðÄ@F«h‹ÙÎú.ïáú{Ýk7+½ébÛxÐìu½Ý…ûw¼ÿGwðã^K=s k–°†Ñ™ïδë™Ýù®¶†óô«ÖUO‹ äòï†ËGrÌjXR¡9Üj9çý‡`–’QhbäwùhÃO¤Ð|å÷b)[yËå:nBsÁC¿ªÕw‡×dÌëÒ›gvYii„(ߪݦ5¼ÚÎO„™H£HÑ«|[4—»üH.rÜÊ^›•üÉóù³"¹3¥ã§â.zýáz‰¾y¸0­þÕ$fR£9…¢“ªHØ#ÐßûÆÌ®kқδfœhsÝ {oŸu¯‡Êͪïò|7áFä»%¬a´ç»XËÃó]m ãsXÓ/ßÓR”~Õ¼ò)çÊÛ2šÈn©†•:¡‰Fz˹NhÞýÓ.\þ<ÍKåÔ¤cFZ³IÙ½¶1Üc¶”hFa­·ŒÈçµ[<«õêpÑ>‚±¾@´K¤hçò™Ë/g^™<ðªÄ#ÃÙ°$§6œ7)–0¬÷§… ÏÀÈ m4'«ïŠÁ´Ö¸6§ n轟¼u]ÜÀogÍÆ1²J­¥@¾k­a|¿¤5ŒwCcKìkiÑú²å»ç¤ê¯v!u-R Mmåí5h9çÙ­ÖrÎå:ËÞÁˆ/"¹ÍI)4±‘`sùj ¹|¹!‚+4w|ðÇŽ—ÜÉpïÞD›.Å}˜:Qø`)9Ðpßr5ÍYèCº#rC¸÷dÃòõ_iÔl)}~2ë¾ \˜8÷ó›øü‰2„*õä?„/Î*D Î.Í…{ý²‰QCN_êfC{ìèGtÆœ§Tð“` #Í«âzæTÖ0"ÀÀرÈZÃÈæ3ƒæ·†ñ‚Ct+Ð.(8¡)³[«å‚Pç@µ2š•$¡¹îµ_Ú]t‡[uƒl´åÒŒs´Ñ:,Ô‘¸÷ñ•Léø-"_(4ç3Ot}“ÇRõy¤/ÌèŸVkŽ[Ñ)›wå½Kúí)/[AGs{2:ͶXjo}z¸Öçïßòöï¸û/a #Ó3ó5Œ(s–q #âòZ×<¯ò]ö°þÝ  ú”v¡bEãÂÏ9H.Ÿ͇Ñî(kXR®ãTh¾Ñ™VÞ²¥@¢åœšŸè MÞ—Á[| Z\…æGbË9ªMÞÿq‚/µY´Å¬¬k¸×S[¹' ñùb,àžËÔäl)È!!l]}pœâ'õGÚF &².]Ø#%:ö0=3Ÿ<¥÷ïZA¿=å³ ú³z®¶`ƒù­61×ÁÏ”ýú Ö0Ò|æÄkíùniÖ0¢÷â‡H˜}›~]üpùšX‘]:Bsç'2çi±áÇ¥²Äð÷œ~Ô?©æêèm(öÔV&Äbh8›2¢Æ òÙR‚È·j·áœË}ÁêCá'ƒ_°V(ërg}—z¸dó®öèA¿±žòÊ>F‹ð‘¾?§ß. (Ïh0ÕÃse:3§?yà×ÿŠ›ïÒ˜Î? ö]„°çÙŸy¾›ÂÆ¥oÓöi–ïª5Œñò]ZA×#ìz0mˆˆGhŽyÁ©ÐdÙ-m9— M’ë¸ M.×Q-ç^ Mš(qðš×½ðC«óxâ>Öjî«bP¸\¡Q:² ÅJmÅÄp9ƒMŠ™ù€M¦Æˆ|U»¡YŒêóU½™²ÉÝñ¨M$göú®SÏìôË&Fk*?˜æ4ñÝ£jÝ#¶®Ÿ¸'³Ë¢X«%ÖÐqlè‰-ν}ã¿ð|·„5ŒÏüD²6±†ñ;Ä <ßE77|*Ígvä»|l‰m cÜ|—jUú…(5,5Pm˜'¡ùŠ5CSšÈ4JGhâ„;ÍÑ{Þǽ‘vû¸˜™XËY¸£&…{[j+GŒ¸B|§fAŠòyí¡pÖ”†J¶ªöÌ¡–Š×w#LÊï{Ø2)»…®)i¶XK‘òZ.<1ú1Ð=†­D<éæü^Û'ÜòAâ5ŒÈwKXÃ(ô̶µq×0:òÝKÊm´ÍÞKžC'wù»áfB7'¡I"JPhòìÖS¡¹þ?4íq®(ÜsI}›ëqÍ9‘-·tÇ9úÀd½å<Bó¹HSh¢ü,VÞü M"4÷Vhßöv~/9.ÅA[´žÌÊê½Ñ†{âïµ’­ØûÉT:Þ¸w§¶V'ŠñÑÀmif…³®>6âá Ô ggaÏlöèMŒõ—ˆ®>•Ÿ×¹tÂGM­J€~Yí¢¾'†þì>[b­Š9úµ2MþÉë±mÔÎw0[FôïZk)(ß%šŸå»j £èß=À껎1´–Â{ cÐüb^«ï^þ8 YЯsîµúI”¯š|åíô#¬åœšo» Mt“©–ódÍë^ù¥ï„GœAWÚ€‹l;ö Àß÷ÃÎÃݲnå‰{»J‡ù{VµuážR[66YŒ±únI¦–7+”yqÕÚ š¤GOþa>v8{$%4¶ ŸÍ«R³â>Ú̶ÄègJÚÀÞý„nÆÏI¼'G¿] ÔoÂÃ[?ø3„+¥XÈ|ãÂmõ]ÇÆiG®Øê»W¾†õÝ%˜NÎê»qÖ0~6.ֿ뽆‘úwIÏ|D_ÃHb5t©k„ÊΖóò&41sß…‹‹nx-·Çv ¸|>KjqoÌî³Ù ÷L§à¨[ÅýP+ت¶‹¿OÊç#Fàþ »£ª#¶\?_ ˜q&ëeÑf7X ìˆ|Øž¤ÑOŒ'Ð/j½\ç×sY¤'?}·F[Í´‚îþ™::·û¶Ë7¼¾í“„k™žL9ørŒ²)ÍÆkž/ñfqêšW ã¡þC{FF X*4“&4oþÂ=C#†f<ÎVÞ>KrÏüØýšè¥(gσœëYs³'î…“ésJð÷:îuJGV¯ôÔ–É’‹kG¹¬j¿X0ÚOïä’³ ù*.úiõ´Û÷c `<Å6RIùÃQéèÁEÿ{°ìÚqO÷ßóšÖ¾þ{tèy¬aļªGå¼*Ï5Œ›>¢±%,ßUki^Uñk´–B®a,ñ ­šÓ®¼Óï€x“mˆ@”Ÿ<¡ù±«åükªa¤=pªÿšãîø¼Á©{í´½ ²d€ú8Á½÷ÚíBÄ÷ pφ,¸RÛ©þPêЊüth»„2Û–ò ÂGWh#ûíè·ñý|f­½àe ~Hí#˜Ÿ®Ëc­¹Ü?i¤ëŸ¼gæ¡_%³†ñʸù®ÇFd«öŒ}ø¦ÝXÚ•wÚGË9ß‘TËù®ÏÀ´’Ëg34= ͳW¼œÓ}« ÍI]!1ë8‰µœ  „àÞáï…Yžž×&‹{ÑyΉYFëT$økøC"ù¬1‡ l“U^Ò8XkD>.ÞÆ ýöà¹ï‰{²ûl‹µœ!’=ýí´)»ëÖ V½LŽÿÍ?^ÇÆtÂqÂ}ZcKœk?g4?å»j #TTߥ±%¶5ŒµFÎ=éýBŸJ"Bsþ¶–óTÍ|ßéÊû$èåä31j î~ÄäÚ^*s(©•Á=j&”Ô²8Ç&)>Ç{5Y„ÕÑ)V½ çŒðù㌟©P¨UÁ÷ #ùã=éÎЯî„~ú+½ƒåþÁüXî?Ön&•½ ùQì§|.W\úü$k“ù®ZÃHûwïcý»Þk)>ÀôÌŽ5ŒÈwöÔ¹æYŒÑ/?åFhÊ•·Ph^uóÇuíf¤»ôðÓ-!é'Ðëå*“csö®ôÀÆcJ52_v«Ôi^¸e M4”  ¢³¢?Ü@8÷j…~ðBØÏ÷;ø~»ÛfRŸxÁÈ}ù“ÙuE¬åÍý[h7M8ðä.èâ#=³cL'ËwÁ£ó|÷8þŸÒFÌ«ºÏ«òXÃXoô³sy'îAO:ËnŸ+¡å|Í{è?ô"4ÙÊ[})Ðc?œ:ÿ¹ì.ö\–ÀJ¼{´%öºmÑ@¿KuZYŠ4¯¤V´\ñÞ\1> ]ã*|G^ëÆ=¦Æf Û°:ÌQ«h¸;_ßg_¤)|’@¿ZOdóÙki~do»E}2÷ÂMŸmÑ–|Jò¿®Þãh#ªZ½Ÿ/”9$Uô“ÊMG­*Z1½ã=ݹ/ooçÜ¿ˆ‹X«•ÖKiÇ©ý%wÎyü7¢¾û4«ï>ò {~Çi~õ]>¦Óµ†±ñ8ÌUÆ[[â~¡‰j †Ä†ˆeï…&ß¡ZνÍK·½W«ßN–Ȫ4TUXdž°Œ©qTX/´ ‚¶×;­<9P=¸çú4U;êVÞñ}±?ÒªZá°’>l0ÚÓ ýãi)øN'íc•lEc»ü8£ÿ Ç”€ÌVD›Ï³ÊgZP³ÏŽ‘{>,)ßµ­¥ÀàK8~ÇÆ&ž'âU»rúï…ËǨ~§Bs‘½åœš„&R"4}?`ÆÓLCÆnY¦’~‰¶˜šÝ{‹¥BÙ鬣@ŽÌh5go¿uH2Gâ^ ÙTõZ/ÜG ¦øC‰æÐTʪêÛ"­Ó gqm³ÆùÈ]¼\é TnñЉ&Šõ÷tÿzüc€ìÞۢͩÙWí~’Ù~ýɳŸžø'•ïBYB¾ šßžï6›ø%ßü2G‹Dmˆð&4¯·/Úõ&Dè„æÕ·Ñâ¼ýñ–ofœcËë `µyzè“röº8Ç•Ôr‚’,ù{*ÙFò¯­ê;°ªà€«ˆLu1žNôÛ„nˆ>ã?|® sÿDþhÍ.䀹ö bmfÆZ,çÀzMvhuÞíSîÿ†Æt¢×¹–âK[Âò]µ†‘òÝë¬|·åä]h]H6ÄÊ[ÕrîEhbÁúcÔ M¥Ð<ï†7 {ns¸y Ä17¡ù¼Ì.ËE?¡ÃÓC˜`½M–ÇÙÛ“Z]Ÿc«× ©B8w¸ÏŸ^¡U >’/Ék¡ßªviOòü0÷/oùcc?µÀr€Ì®‹6›MH :TLDÄn…=¶ ÛòŽW¾«-Qù. {x}m\­§¼È (uåôÝu§§BOÄxçÁëD˹C¡‰V¯ f:Ý<¢p¶Ã°Ùä¬^[{col ×µ vFHEM¼be÷ŒÌñÐ¥©z-ùûPöyÇÁœ…ŠizÆ­¬’ª ÉSOPËhò+І»•¨XLï zÆÙ3ͽ—³ç dÏ ‡ëù˜Xîƒ'U$(ŽŸ×Æ‚‰ìó=ÐÏ)Ýdèï ~4±'‘•šbY¦¿ÿc•ˆ((ÖfF´Évx uš¾wô_jk)¾† €õïz¯aD}·ýŒ—ˆ~Ñ®œ^;шMåëÕøR [ËùîÏùR !Ë䟰I:c…xð-+Ó›ÎÎì¼\€œšh…7ÊÓ[Âc&Ôæì%sïr8ye¼»­'5çÒã.•8~0[žß4˜1ÈŽ~¶›QݘÈÙ¦ô´»'õ)%û €pË£ ¥¹.½q1ÝèE<-VçuÞpÁõ¯ó|u¥8õ]kLgÇâ—).×®œž;ÐrN"’ 4/½å‹.#ˆµbp>žσô¦“²zlÑܼŠ&JTnÐËB¯Î ñ; wöŠÁt9ŠÌácÁùvÛÂþpÓòüÕÍkq ÒOH+šÃÖ’b’/x)™§D¿C꬇éDö9 <°3 4¨¼ tßm:Q0vx+ƒž£{ðÛkQßíÏòÝγ^9ÏZ_ŸÓc›Õr—ÐüŒz6Ð`Ð.ºó¡Î8uŽHrÆ‹c­¦ÑA%m=Cž“ôZl£Ø+¦Wž^ç.µÇ™Ñz09(º‡2Ï<>Új«ü#áœËœ=.ý Ü¿œò÷(H¦Útˆ…¶F[NO«7—Rm:otqPâª×wÛ…[ßWk©wïßý°×ÂW…ÛæÎ»ñòœ.Ah‚õwš½¦=Ê”À:«˜R~I:ø´úS3Ú/cw$Õ舷ܼÅÞª>.è]ŽV¦µ19¢¹6í[uq\}?\Žý÷¯U¾ÜüeÀÅZ’Ù&‚<ϯ oøÒêNb7vÏá¤AsIV‹ëNš}ض–zæö]üš¸Q€–¥kin§ j š"4O]ÿA‹ó( ³ž~L\”ÞplV— Voùx‰xËÍ³ØÆ¥êѪT"i¶Âz§&G‹ìÁäƒ 2gV í¸l«­:',ëG›Ùõ&/ÞÞ.É'÷oUmwM­À†>ˆ(ˆßg€ÅD8”ÙyCZƒ±Ä8á}é­Ù»ËÃÐöÂí¦]nRÏüñ‰K^çgC]9×ó¥@J¡ÙÉëE]7²ãÄ^Š.öâ ÏëÌŽ6›**Á"¤Qp×ÊR\¹É/˽¢“ЊéƒžE8^Γ㺭¶ê ?iOZ7 ý¢ÃÝÿèÅ/ç°Wjy€3¡î3`»ˆ¬ ÚlZ¤ÖL.¶ã—: µNØpæÚ·.c:?î¿ìu‰fëÜëØR Zy ¨óØÇ2/ £;ä ¢{3R{b¬íÖpÈàÎ3WæàETãF<oz€ž¸QM’`yz)D㧎ת”³ÇÓV[u O‚ß´‚i^îŸqÿ"ý•ñª© &½q¹Ž¹Ï‹…¬[:7f´]šV{<ÔdÌúŒå•ÑpIïÉOðþÝ“V¼a¡™Á:§ÝZL,„Ë?qå;O»…áL»ø âª7:³ã:©€pÄ1؇ƒ žyRò°êSâ0¹Ž„ÄÐb!™È“À°Ø~JŸÇ`êbØmqÆÞ³·~4xå›ÊÓ¹m¯'içì—òÛ_/þ“þ\L!.šm:™»v‰u9UAÁ]è oã+µØFQõñ@o D:ËqʺдÕVÑóD ¾Ù#h¤!Ÿl%G» Û­î=íiõù_rÛ¬ns屺 Ô¿ÓX2õô¢±±V‹Ø“ï↻ÓÇ+†ž«Ù´Ø†S–2¼±tö\‚¦ƒž§³|lÁì`ìdÓV[Eq/>–/DK'Õ\·¤€]ah5½„äpÞ ôÄ€å±V‹#…£i¥æªó CvÙŦŽñ¿³màô/â/âßÕSòŠÓêŒÊh+o5"aµÚ¯¬ Þrð2ªÑïpó¢>¥bz;èy¸e¸™Ó­jÿêæÓIøc§°‰¶r°¡ÇP!DeŠ×G=D L0Ãë¯B¾¯y7j~qOh³&­öHÚ(ƒµ¸°>^\Å´cÆyi`çNNo8I¾”P×H¬³"”‚;•`â¹¶‡å¯–¼G¹yÐó 9 @/œ}$oº?Ü «:Y Ö]xVuD*H‹ˆTd¼ªI•pÜÇÀv¬{Bëëßp΄pöôpöŒä.ê¤,!K› Ÿ»fÓR/³HC´³XÑ‘VFŠF„c“ñ)‰®Œ±éõÇ !¾…ræÔ…JY fÜp×4mRäcG¼Êb9ei%²2¼á‹ÜòŠ1¾†/­Jÿ´æÃ•h¸®pÖ(±Â‘'—Î@ÌúD*k¦Ï±ß Ô1ÐÌJÆÌÃnu¥ÕŽ ¥Oò¼ÀMEÏsåÑ´€Ï_/Mƒ4\î3ÿˆÙR&Ëó  ¸ù¾ŽiÇßéPÙ¥Î2ŒqcÝáà¹gˆ§¯™ ck§Yôp4U­ÞËçË ††‡ÂB\úpÜ Ø ß ÷u[àçÁ:IJöI¯o=Q½‚®yVoÊVË»Ûà>IÊ„&àë‚§Õ¨¬V?…ù°•`h 8”Ô5a\ò ¨c`»PP$ã"×ap‰d%ûRÙ¯-éÔ½±.¼»pðz|rºH&ä`FšÙV[ HªŽo NÇÑÅEfŽcà< êž ’Ûy°4úœXÔî6ÿ-hG‡ ŸŸ.–{ð†…1n¬ã6¥Á>6}þ±~ŸQ¤UGVægöùýý‚±t‰3`?ú Aœ–!ˆÛ‚åK¼rì&s |Kˆ[(gNîìbw$¸³KŸüŸ¯qešÐ¼wõµ€ß×1¸VýÐÝ@? ,4‡% úÅñÊSç.õH‡ ?ÐéŽÄ€Î/þ Å5Âç+ª¾–7Ÿ¼ò-àó5û´£JC˜‚v´I á›õãÁ³íÒ#}9ÖµKºëÖ§ .õÕȪ|Û™OPÝ-àóÕ FÄE¿Í×j’óTX7 ;šíÈÖ½¸þ îw‰ó/ÿ95jDª»ÍÍç¯*€…+MýI#µ|_3àliU4ÇÐçˆüç–/RË÷ÕüþǵÍW©Zü'—/^ËéÕÆø}­«–©Ì§9ö,à÷÷,'¼ê„LYþ>Êç«ìÙÙ|£ªh¿¯M00¦j´æWE™Ït¬ZÀçk Œª\ôüÕ¨a=««ÂßËç+†Wúþ3jÔUaó˜vŒ[ ®÷è£ßïïoHÌcYÕáë…þ3&úý¾.ÕÁ,æ3ðûýŽ úGû|ÍŽ ‹š/Y,à÷PÁè¿Úç«] b>êqdŸ¯y‘žÀ0_œãÈ”æ«V; ø|u‚«Ë×ýüçרaÚj«Ž¿ ÷ ']^èøO5mµÇˆªñ7Nø/(;úýþÞ¦­¶£àxýèÁ€HЭß×þx5ùÞÕÞhðí[*ô£­¶Qµÿöæ çÀLgƒo ,h«5‹ŽsÔ+_“5øj'!¸ÄW#óXùÞæ{ Wõ•ØàkÚj RŽM $nð øEÚ±ùÛoÅ,€ßs܉¯ßo=€ûðcn‚†~´ÕšEÇþ¯n¾¡°¦'0ôôùê£ _ðùZb¦ùñõÍ·50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000¨ÎX´hѪ*ù§ÿþ‰íšø“wèÐ!ÞÓ «ä7¦Õ¤I“ßzÚ´iUó“Ÿyæ™Õïüñü¿*ùgöìÙ‰­™ø“_rÉ%ñžÞªU«*ùéC 0 Á·þä“Oªæ'ß°aƒ~¹ý4ún0è—ç3^¿Üky¼ñúå  åñk–ò5Œ×7^¿bñú¥<šó4ãõ+îú«èW †KùªúúÿgðTì1ÂWÉ?}ûöMüÍòvíÚÅ{zAAA•üÆô¡5j”à[O˜0¡j~ò!C†T,LÍ«                      ßøæ›o e¨”?íÛ·/‹íòóÏ??Þ‹7oÞ¼R¾/ÞŸ¹,_ùµ×^«¬O>hР²|òªøÜJÔðtêÔ©,©Ž­*øÌeùÊ•¨×?ëµú¥š•êiúe9ùåü\ýRa¸”O2Ð/gø–åå ôK‰âR=Í@¿,X-ççè— Ã¥|’~9÷,/g _J—êiúeÁj9?×›G“.4äf9Ã×¼œ±€±€±€±€±€±€±€±€±€±€±€±€±€±€±€±€±€±€±€±€±€±ÀñaRrªtó”ú“—8‚*''§Ò¿ç0#¨Êów)µê½ß3Ï<“`w¾sZZZ9~šÐçc̘1åøvx©>}úüç?ÿIðq0Ê÷+ú•e½Q£F•¯õŽÒ«uèÐAank ùŸýë_êßÏ>ûìrü4:ôÿú׿ò·ûÓŸþ¤Þî£>*Ç·ÃKíß¿_½¸ç;¾õÖ[åûŽGúUÄzåþ{•ïo÷Õ:uê¤`ñØc©Çé7ÖsÏ=·?ý!C†ðWFùS}ŒO>ù¤ß/¥¿ã€ø‹ƒnWïøÎ;ï”ï;èWë•ûïU¾¿…¾À¹~ªÀ*Ñqè'kRãõ“µ”×ãô»±ñúe±d ðàv`ž2^¿LL²ñúe1¥ñúe±ží¹Æë¯ŸLÆë—Ûa3^¿,¦4^¿,Ö3^ß›)àÇxýŒ•ü ´Šp&Í5i®)i•Ï 7%­ò±c…¾ŠIsMš›ü]Ú³ hJZÉžP“æ&k)SÒ*‹¥J|®ñúÆë¯ÿF¾V¢§Hò&ÖOÒP•ù0ãõ×7^ßxýróAÆë—›)+î…Œ×7^ßx}ãõËÍï_n¦¬¸2^ßx}ãõÿ½ž(Oð?z³ì9çœSŽgÏðúe1fåÊ×0À‚ÃãóÏ?WíüqY¾Q¥=W÷úž3 ðm³³³Ëñóè—Ř• }O„Ì™3§,ߨҞ›úï½÷^¯^½Ê÷Ãè—ÅžU úÿüç?wîÜÊò*í¹:ô1“ÃÔŸÞ½{WÄÇ2Ð/‹U+úóçÏWð@\¾ƒåÊb–Ò<7^š[š×Jî9úÉÙÉûQ• }%_+ËW¨*Ï5Ð7 O)žªß²|}}}[I«,Ç)ySš.­TílžT-÷ñÆë¯Ÿ¼«:fc}Œá¾VþiÙ²e¹/û Unš»nÝ:þ‹‹‹ÍÌÍd~bý÷RÖ>|x2Ï­Ò©S§Îßÿþww©¢|§Âë&8úÐ_µjU‚ ãÆë'¨§õ~øá‡* ë$?ܸqãþûßÿ:Àq,A?‹yî•0^?„xZï>¾?V§ìÞ½ûYíJ@“±NJY¸p¡zŸîÝ»óçbÓ úÇ[o½5¥LæÁ¡Pû#ž|òIõ./¿ürÅA{sÕ•¯%gÏž]¬wðàÁdÌnS-P¡óõ«â6ŸÉX€[À@ß á8µ€þqúÛ¯m o0pœZÀ@ÿ8ýáÍ×6Ð78¾,€‚Ú×ìÖS+róí·ß>¾¬`¾íqhâîÊîĉCS˜¯||YÀý¿üå/kÖ¬ÁÊøãË æÛ‡@ýåUþçÔSOŪêãÐæ+                                              ïøg&«pÙrÒIEND®B`‚fifengine-0.4.2/doc/logo/FIFE_small_b3.png000066400000000000000000001060651341615052600201620ustar00rootroot00000000000000‰PNG  IHDRþÖØ|£ésRGB®ÎégAMA± üa pHYsÃÃÇo¨dtEXtSoftwarePaint.NET v3.5.100ôr¡‹¤IDATx^í½w”UU¶.^¹Î©œsÎPä ’A‚¢b ) ‚€¢AAPsN˜³v›µƒìdç`¯Wo÷í¾W{üÞï;î¸ï½ß·Ö\kíµã9§êT‚Uc GYœ°÷ÜßškÎo¦„óc$`$`$`$`$`$`$`$`$`$`$`$`$`$`$`$`$`$`$`$`$`$`$`$`$`$`$`$`$`$`$`$pæJ =)1%ÑvûiI ©Ig®@̟減²’g—¥]VÊKµa¿*#éÒúÐôÒÔºÌädû®8Í…bnï4–|}Vò¬²ÔÕ ¡Ë›ÄÊK³¼:#IüSc{`ZI*þ’döÀi ‹ÓøÖÜšÌäé¥i—5†×5;— úÉî׬¬M.I­›-pÃä4º5hêÊŒ¤©¥i—6†Ö·„±6ØVƆ¶ò`Ýk?Õ™ÉüïÖ‹é½l5‡WÔ‡&§–„Œ7påtº•²pÒ¤’ÔUá ­Wè«-ã ¾6j+ß}œô¯ôJ¶´OÀ²Õ’±¬>4¶(µ0ÝìÓ 8ö^ŠBIã‹SW4„àÞØž±©=Óo9¡Ÿ•ìùJ|ˆ¾aÔ–¸¨>4ª0Õa5 Xš PvÇ¥.k3hÚQ~å L÷Ú<8S_ùvÍ]›•¬þÕóíúÆPû;ႺPgAj¶/P‚4;@$“š8¢0õ†¢ŽT ߬̓ÙÚ2Ä{]5$Ë }¿ÓGñeÛQêh',© uä§d8âDªæ2û¯2S‡¤œ_à\X·¡°¾ªÃ¶¶vd‹54{«\v­_—¢þI½Þö9ö]D;Aß ´®hÏX\“>(/%ÝDú/š•…’‡ä§œ[Ú(ÏgǺ:ƒ¬Dö¶¡Ùb ËÞÆ×Õö冾z½ž-ù!ú®°öƒÜ î3í¶Ì³«Ò[sSR 5:Ö_®1-)±-7eaŽx îJ¯+¬+”[øžsõðœíŽÕ™³]®;SY—“"þÉõ.|[|ç¨ý 6CG¶Ú d/9¶öÀ†¶Ì9•éÙÉÆê/ðê‡×‘’”М“2¯*t×ñ¤à R¸;±®ãµ3g‡cÈÙ9"×±ЯÏIÑ_°cD[Úç°!¿Emu8Øv‚í4æöÀºÖŒ™ið§Í1б×7—( Ñ`veúú6âI»Ûà®°®£ÜñkFæº×µ#siÚµ~CN þèùç–ߨ6ƒãL`Û@žÚQ`í5-áieiU™Æè¼õý·"ìŠêôòôµ-ä¹*5O:ÞB<™én¸kXW¨eÈE+kÖhUJÖEЛê|»\l·èCí:Û€ì"Ï=@wJ>ñ¥MáI¥iˆÄõýÃ0WÐ;(ÏHšR–¶º……œœ†â•v—p·°®P®AüºÑy×±­ëÇäëË }õ¯Ž7²Ò>Ù½<·Î=`ùÖ!btecQ¹"$îüõþ· fBIÚÊ&‹ ´Ôûºab_…´ÐoÊOåg¯q¼ÿ»KîµØfðÛÚQ ö¹Ü]Ñ !ÆJ+H?(Y™¤çÖ¤wä™ q/ƒ·K_—•’84?eIM:¥Oè•M¯kzÆØpÐ3@šçv¼°j$âm ž´»wH å:¾æý“¼—úîWª}B¿è[±ôm Œ"v¸ÏÍRž@À࣬Ø`AUz{n² w •=ù¦prâ ÜäEUé”O §¬2rd-ÐM©»šçv¼´j¸ŸJÖ……x©}@uì˜\(WÑÉE7Òšb­¢ ›­ß\&þ•¿oáK|ˆþÉÚ~ç Öi "}8l!Á )O€[A¾€çKC°ØkÃsËÓš³“M%qOÂ9ŠÏFص%;y~EÚåM¬¤ƒ•z@ÙkŽîÈ‚¬ô½RóDD’š'«F!ž´¬Üm(×ð}Ó”"¶¦ZëàÔ"ZÅ.èãú+ÙïüíÖ†ÑöƒÚ r'ÈmÀ¯“¶¹Ë¸ ÚÒ°œá »6€ô Jéqdÿ@ÈØ¨¥¼¬!4³4µ>3ɉ£Àiü^q7f%ÍAÉ«]ñ0¸²·,ÉÓó@,·é#€žœ×@Ä+K†`§àNÐÔQÎÁ]|p[‡<×YÅè·¤¹_IŸÀ>jj±µ+Ôf;®G´?i¯’—,\r‹•C,½a}ˆGÄ(-Âá@³ú_×¾¼1´¶1´².}j±©$ޏ=? áÇÚŒ¤³P UŸ¡3ÐseÏpOÊÞnáˆÈ”Ë¦× z5Ïà¢éxB¼/ܹªvý¬â›õ5½äf¾kË ýÂ4úWz%[Ú':ËÚBr3ð#"p¨= ¹¢Ù*¦6¹Lnõ±¦!´º>}YMúÄ”òÉ“ˆß6`Õ®á¤ÉE)ËkÒ!bZà çFŽrgÊž›õº#ë z/ÃF×ñ\Á c ¥×…ªV0µãûðŒ’#>«8“Ùú% ù\P-…iž¯Ä'¨ £ïú^Ïm@N‚vðC@úÊ!öÞÊ –ñ`Rÿ|Hû‡Œ©þ¡€ú/«K¿´.íªԱùÉ%馟DW÷$Wšž8® å¢ê4buâÞ˲÷´pˆ¯”6½¦éèmjžJÍ“{*oÙ0B+kX×±{ËÌRµnYÊÖ,ká•ÃÓ“æ%$\Ì×Ì„„±Ù)x½õííüs¬-¤6ƒÚ ú6еt‚H÷„à6Ànÿ0ÝßÎÎX·ñ³¦=£K±jÓVÖ¤-©H‘›\`*È¢ßEi‰£ò’ϯHø Dˆò2¦ì¹‘Ó(Œœ(•½NY"Ücy±> × /ÄKí.4±Ôè€&]‡øÑY¥Gg«UvtvÙ±Ùe‡§o«Ï\‘šD ×תPòŽæì#g•à•Öµ ƒ—ÛIìÇ6 »ˆŽkxš+ìØV8Lƒáÿã­þ5ß—«†~¦þkÓVÕ¤­¬N]^•º¨4ehvR®ñˆýö’ ÏIZ\– a­¨N…à >©ì¥qïeäw ËžÜY”•¬%K=艽ᎬàmìšÞRóä¶’UCN*!^*xÒîÜ9:5 3ˆ›c­Ûæ”aW¸©W¬ãs˱ð—ÝCóÖæ¦ºÕ|ð_Ö¦í‘|>D~¦}3ÐN +¡Ó€ö$bK 6gDN„¢€¼Ô?‘?nãÇiúkè_ÎÑqyÊEeɳ ’Z2ÏМQðÚm‰³ “ ˆ#6Ü·«4c ÷¥r({ÅÓË(¬¢çÉ .¬²æ55OVÔñâæœp@Öç•ßNk~ù­3Jw6g­ %-KJ+9J}yà ؒo¹,#ùÚöœc3Kñ™øp¾œ;AHtè{€(#~dICHB~N0 ái€ì "N©OßWòž6Ç×ý–&/-Iš–—ÔJ8#rFQ¡ÑN8+/é‚’$Ü|L¸×™aäHΞhoeÏÍzP–Œê朷æÅ M¯lKÍkVÐñ³K•%CÚà®°~ÇürZ7O*¾ª:cEZÒò”ÄX©I´V¦9×åy©«³RÜWoÁÛñ!+Ó“®®Ï<2µŽMEßH;2ê4 £È}h‡÷˜9£Nßêà@‘ áPÿvòÇÉüéÏY"=5»? –®û ý'-)Jœ˜“X“žpºÄHƒ­KO˜œ“ˆ›<¿8ÜCˆ 8œZ ÷.#GXöe/Ízâ:¸²÷½Róä³r»B˜ÝñR»K¬Ÿ8»ëŽùûGæ_Qœ. œž´ +„•|)VضvÔg¾²©ñß^÷ù3cž]]·¥2ìxÞÅÿ@Ÿ>sSYøÆ1…ü»Ø£m ŸÂ=à{@ÙBŠn@;X€¥þmÖ?NWÝ÷µŒ=è+c^úAûT{£8¯(qIaââ‚„±Y •i ¾„ >}uZ¸¬„Eù ¸1Ü^ô¸÷#s¨zP¤×{9Ò²×”=×ôBÙñÈJ»Ao^º­¤æˆÚÃë䂊ã³Ë®”syN*Ǻ€8l¶2“W³•펵&+åÈ„ÂïÞ8èï¯OøÇÖúÛ«ãß½®ug^@¯doÉdo§Ï¡A›a]~êž¡ypä–Ó¶´ˆh0[È:¸'àÞÜ­‡.P!a «0°²þ==î+b^p|‘ó#S`üô×¥­Šýç$œ“Ÿ°0/aTfByjÂ+!Ö­HK“Én·µ¤ ñ¼ÂÄ󋘾_*ìœ ¿6"îõXqö8—A㈠²ì5eOf½ éyüU÷bc£«yOÄ+¸ñX·L+ÙÞµ:#¸”@ˆ×d§¬ÅÊÁJÝTœþà’Š_ßÛù÷ׯ¬ŸÞ>ô®yeòÓðöÆlö!ì£ä~P;ÙÙ’utz).öÈÒm!y(oرJ±0ÊuªAÿkêŸòŸ‰ùᦿÍñ•oäø:OÅù× ËÀPºŸÐOë켄™ %© ý:B† Z–š023aD<]ý¹÷‰÷I2¿¶‹¸×LeÜ[FŽä.ɲ·+{EYÞ¡æÉa…š×çB€¾òƱ…›+ î:Сþ/ÏM]—'ÖµÍY/mhøì©1{e|”ëzzUíÕµô!ø4¶ì›Ç ð+M(¢­¨ö€f Ig xpH©k¨b~œ¼' ú:b^±¡¿0ŠRA_ý2//aXFBaJ¢8±‹S†g$Ì·#^â^˜:ðfàÓ8pïâïõ •- vŽ?îýŒÁá@Ù‹p¬´ptê†4½=s^¹â$ÃÆúÊ;æ–ÃØX_F6ŒÔëÖ×ç§®ÏOÛP¶¹  ?ØÛöå‹ãþí¥®¬}nì[;ZŒÈçáñ±øpµرÀn%ÃÇØ×™b~¹Úwp—@wˆ™dÛ– $B2/Ȧþyü‹È§ñÃã¾.Ó_¤<¸)w´ t6g<ás€éþ¢$P—nôÓ_æä& 'ä÷í(HIš‘07×:ž—‹“‹L|{IéïÆ=NFÊHs¤aêé ÔAå&X´½2r4G¸³ G°7*% zè¥$ݹ° ¦Å5ÍÙœPð9)Jµ3Pr¬_U”¶¹<|ÿâŠOîöåóãâ²~x¤ãÎ9e›JBøp|‹Ú Ú6`›{—´«-ç¶™eÞ‡·‚Àr‚%ª«ª³Yÿð}©Fã=ã‚~¨E€ÊùÜåÕÍÏm0+7¡=œÓ›²\¡Â ³ýïÐ÷°á˜¾wážòôä‰{[FšåÔ"Rkgîɸ§­fäx){No“²WDÝÀ¦ ÷Rów-¬<4¾èªê°Ðñ ñÐî€{€ûÆâô%é»Z³ž[[÷‡‡Gþë³cã¾~s߈'—×€bßUœnmƒü48¾´ à0ß ;e[]&8Vn›¹¬ }H'Øéû©¢>]ÌO´ºßÅxBýA ’î'£ŸèN"|"¢Ÿ6#'¡5”Ùs1®má„™9¾:Þ±5…kë¢2Áìâ†{øû1à^‘9#r„SËL_Üó(•rgY|JWö°pu#ÍeÛ1Pó'æWìžwEQ:Ô.¾0PèW./Ðïéòú™@êïÓršB q g$%´„ΊñJåsJ‡\[=t• ïü.p¼4žŒiåç8ø{“pO‰h¼zé{'“#=Z»eO –Y/RºAO ?6£ôÚÖld0S^ªy²àâ9ܯ,M¿ª*|ïÂòoéøìÔ˜^^ß½qð‰Y¥pµq¶=À½ëÈJY——îõ¶ÙÌ ²ü`1ÍPêÖ¿ý0~ˆù±›þÐ/¼^‰~G¬W _Ks°—7☜PŸžÐżivMO˜š­Ž×¯Æiâ{R:ÈCŽ÷‚ÄÔqO ¦Ý¸çʾÈâ.½”½ˆÂ‘6=þÐÄ¢­ÕÒ¶áΫ]Íd€Ú•e¡]-Y a~}O'Ôp®ŸŸþØEU;2qIÚ° ÊJAHøð”çöÌ?™ !Ý_Rÿ ÷¯QŸޝ3à¥q>2Ö«Ðõ§È~Jq#Ý/]^ƉGiö¸÷Ãâü„ Y µÑ‰a3MÊNÀÛ"î-¿¨è•§‰¯§¦YE'öŠÁç¨úq™poÓ÷÷Ä` ÚÞeäËž‡¨‡CŽ4ë…%Û¦“bè¡5A§)Ov.ôë^TÝ«2œQŒ¡Ò›áÃ\ÞØ~?@"¢Š¸jä¤iX8]½ÅâÛM|OJ'î)™ûµžú^2÷Ò©™Æ‚¶·ØÝ~|zÉ–Š.Ø:8)dm*ÆÞÞ+hV™Ø2 ÆcÀ"ÔÇøé úE´Kf:èèWI>ÁFw0Iáᨂbž }4ßM¦Ž4ñ­¬LæÚÂÄ·S:,d++kU—(ÊS™÷Äç¸í{+beÇ=åÖËŒKiÜsÇ¥ìB0èÒ –hÀY²éIÓ[ gj1©'.©ùÙíÃ~ÿàȱ~tkÇCçUî¨Ï`‡@iHxú À,"–ɹ ÉÅ0üÈýµØO‘ÊŒ•ííørÚÇMù;OýTÛîuú•Ù#ŒþHL4Èœ’],lb÷L|Åf:£¶–kËÎ;‹Â—ÝÑl¸G2fŒ¸§¼KÊJ@ò9Ä]Rˆ îö¹å{‡çAJB¡°p{ï° ȼašžÛ67ŽÌ{ucã¯ïñ»ûG¸õË;;Ÿ_[¿·#Gß:D¡– J¾¢$ý†‘"'”—x¨aüØr~tÊß~‹ñä™z–›UÝb§;™Ë+ëZ¤Ñ3×é¹€Šê´}4;ÉÀâ‰:Á¦ŽÛµåT£(¤C©üŠ[9ì{»#ÈrjƒĤv6gã¬G6%Rn˜…Ô==ØúÒÐU•á;f–ÀxøÍ½#Nƒ…ð­“‹ø>Ûœb0³Ü¸ô$l†kÛ²Î,UêßiüHôÃñUo ýšÝ/8~žç£7w^Nwº\^‹é‡ê$¦_q]€%½ÎnT?Ui1CßnêXl¦bñUôÊÓÄ×óõä{–”¦xL§ ÷ÒȹiË·Y™–ˆ¼_§²Wwdw6d>r^åLJ;~}Wçi¶¾w`ð} ˯®É`N0EÄ” Õ?2C);¦àÁ‰EdüóCU`ëÏiŸˆè§Êó‘9ž6Â'J£_Kpˆ™}Äa£úAõd¬ÛËÁê(SG±ø*z¥L|½ôDQø:îAá븗|Ž•p¯HL»¾Æ=ÛõCsAÏ£0 ÅÐj\Ù“eo·pJÓ÷ Í}~Mý'LJÿòdçi¼~rtØSËk¯kË&À¡þaý“ú‡¸P, pog•¤u ý¬ÂKËrSèW„§Ñïfú)Á!¦¯`0<1„zÙ—Á;*ßÏÔ…¶uiª•ˆ0ñe/XnêðÔ4Neêù9Vž‚ÅcF…ûÃÓŠ·7fA{]’Ä«œÒXɈ0rȲ—Ê*ðèäâ7¯nùùÃÏœõÉíÃ_»²éæ1œåêŸçA0ë?“%`ú¡2PG£`g oî·E»(ÏG¢_uvP.¯Ûè·3ý"¹Íföøg¶ù¡QÞ~‹RñÛX¥«ãJPS¦‹ÚZ&¾“Ò‘T¦–§ÀãVªš–:&¸í{(§c­Æ¨p•¸—-§qȲGè Àwo MÆ®®o¿své–ò©–d7~ @ˆô¼UDÆã £±|,ôÊ.ý"ÍAsy™Ño‹ò²Æ3ÔÈÄÍu’Ù}npg”>.펌h¡Ïruxù°‚LÙS™:ÊÄ®­‹Òyiޏ• ÷·Ì(¹¾ƒÙ6ªÍ [•q¯9×µfŸZ^ ƒþ§Ç†™ |ÿàG/¨ÚYŸIY@äû‚ù!Ó_¡Ÿd»® m÷°¼#²æ‡{œËt ,7>ð‚Ðïéò²ÙÇÜÁuÚÍždG+J½L/CRC ?5ÑyººwëÎÍd[‡©Ã»‰(ßÓÄW”Ž#SÔÚqhJñÕ°mÒmMîSY57+žâÆ=%Ÿ]ðê?¾e¨Yn üèÈPx;û‡åqô³Ülâ=~(Òýj­ 'ooÎ:8E¶{°ÇzEžG?µ6ú=]^§Ñ/¹Niö8ó:E1W`B¿{WÄ–Ü4èh6–-_æê°:dêȶ÷>&¾¤tô«´âíа®œã×Ô‰ã^‘9)àò>¯ ýu˜“¾µ{Ð} * ÖßýÊ Ú54W¡_T÷òâFEö;~7Óïâ•A.7 ’KG,²ùcþ‰˜¶i©|?ïV°Ü¬ŽÓÔÙ ¬ÔP¤à‹Ô4Aé0yBáÖúL‡m£ŸÂ:î÷É}þ²ºÜ4ĬîHÑ€S—Ô M5"úñ Ve$okÊÚÏÛ½(ô —×Ëè÷å:-³Ç–ÙæHêŒÒßE±xÌ?(· °yÜ„&uP#"ßÀŠhê8M|˵-º~dÞÆ2ÛÆ†{nß㌾uBÑ7·´|oÿ³â(W74U€”'OËÇ¡€6U†wÊ#ô+—WÕµ0£Ÿ×³;¸NÅö¨¼NÊl#W¦4Ûã»QȽùM£L*_÷nyŽšƒÕQ¦Žª²e¦¯>±Lü …;e¯‰¢a%œ°Åi÷Ì+ÿÚ¶ïîlVIàí­wL/êðz=û‡^^¶sp¶jé#Œ~ég\§fö8ØjÞæðwmÍK¢+b,êB;üâV¾'¡©¥g‘/ÊÌ¥wëgêˆjCnâï“¿¥.#À¶Ñe½³!ë‰ k¾½{ðwö˜ÕøÖuƒ:§êªÊŒhzè ÚÒ¹›+5†~×If3È%r{ìþ®¨eD§H쉤ø#§é»øÅž+ö–H×±5I–c lÞ­ÈQ“,-p«›:× ÏÝPšîæmÜRÆÉ{`xþË—7~ëúAfõ‰ž]Y·gPN4'À²”Ä+ÊC× c™)TÎëñª¼Nnö8Sšy%— :cRüèÚÐÅŸé^%¹ÊʷǰlùTqëçÝ:jPÈÔÙÚšµ: Û{¬óíÓJÞÚÚòá®v³ú\olj¾e|Ñeáäȇ@bšüÔ­mY¢‘ …x­¼Nk\Ëí‘IŽø.ከøGwÁÇ¥½‚žon›Çmå¨|ª4wù*G^¹›jÂQÚ6Ûª2\\ùÞÎö÷¯1«Ià«Ûàk¡YPä À¹ MuáÃyˆ×ÇßuÔ²P /u.‰^ñ7‡º¨ôYeº+)_dªÅªò)gA÷n·ÍYW’F2¢°Gµopî3+êÞÝÞfV?—ü®]ÍÙçǰˆXJâºÒô«‡ñÜÝßåuŒrH5kVî¥ø£²øÑ¬³‹?hqè€~Ì*_Ý¢¾iˆÖ¶ÁÙAÏÉÊâ×64¿³­Í¬$—Ö4U€, ˆ˜@©„~ËßåimzbO?ºÛwñÞ±îéºÃ·—/‰ËÊ×Òu,•¯§%È «ï™[þÍÍ-o]ÕjÖ•Ü€ÓK‘í÷ ¡øÉßu$uÒ€^_ů¨UÃå•ÕƒîœÝúÑÛ­Q’&5ÐTQ¬î™vbÇÃR*_vX€w‹;÷Ê–²ÐKk}³´Z\}ý”Ћâ·Q=¬c¬bqX(˜RÑ­tø§Ot'ivG塉;>w·å¼piÃ76¶˜5à$ð̲úu™ÁÏwu^ªHêTñ]™Í¬ø=‚»®fUm]öqiÇÀG–Ð×òòåì7Må‹:,âò#«|žž ª+¢-ˆt´#c‹^½¼éõ Íf  ¼´ºñÆáùÑðýpsÑéVü”ÚàEõ8¿•Ω+~L{èÖzçÓÇi®#ŒåÌØaá[™”ï¶òUÓL¤©­/M}zîï™]þÚº&³ú³ ¡nŸRÇÏë¦ê°•Í øUpWeõØû3{p¡yf·~à#“µCÕ·:§IyùÔHJoõ’s‹Ëw[ù\å£åÊš°úªÿ´½&óñók^YÛdV?”ÀC‹ª6—†‚Ÿ ãqoiÊdñ]™Øã£øEp×Êê‘å‹îð–ÊdÆ–8ü •¾åàÊüd+Œ%{…[;þ*_õÕa™Éãò·5g9dñäŵ{y0?à‰©Ð¥CÈ_xvy=NU³ú‰žº¨vO{.KlFA#/fwk4”ÈÝwv…ãïÛg«"FÊè$ª‡7íámKÔ4v‡âçÃUx‹ÚÓRË2RÐh6?ð”U;A*I vpY’¦ÌØ¡Q‡,|«;¤ò‘¡yM‡å§.©E¢W 7=rñÑ2 ‡Ù)˜Êvû”ÒV6¾¸Ê¬¾”ÀsËnW…—óòF&öÒ9Tý¾²®ñÛ»Ý9»Ìý]¹zF§ªßÕsÚô¬¡øUݺ7ËÉ ?(ä'´†½¬ÕpAæ'»\JÒ¤Œ½•©|dh^?*Ï! T}wï`ˆéÃ]ƒGo ¼€T>Õ²B[ÞU]4Ð1êþù•ϯh0«O$p÷,ÖÓŠõsÎgå¼hc(ŠPüxLœWG‰ì:h´Ãc õÇÇ*ʸTý®âøEpWdõ°ž%á-»³«:3ó\NÌðŒÃOYZ‚ óÖŽÍÁeÉj2/_ï®#2vx–-)Å( ‡#ªB?ºeÞ~ûz†þ·¶¶Þ<º“Ç©·vºe nšú¢3æ–Šðáy-©yvY½Y½&‡W휋–ÎhgËZYQ+(þLÖÇŠ{àø´’ww´}pm;’œ¡Ë Ñv·Ûù•¡$*d!Åo5nY=”ÎIyüZxKL`×kÕRÕ¦*>ó…à)SódÍÚцÀi®Îiz¨|ÞMêUÝ­#q P[„J‹oïaª‚{gûKk®oÍÆy*T>k†Ìú¢rsM0d)ûÇ&•œZZ÷ÌÅõfõ¨ž<¿öȸÂíõ™Ûj2 |<<œÀÔÆ‡ú8èÌýŠfdâñ}Èqÿ½¬~èª «±:70Ð*­df•ÎIy :Ë)]«WÍ`´ÚT&.ȃƱ Pþd óe[56(—s𼫔¬Ã¢–RkrlÔ>‚ ß?0„)~2{®cèoGÛ»W·=v~5ŽW¡òy3dô…ÅØ^—±³1­ÀQ{÷ìò§.¬3«'$Írrz47D SbÇÌ-•a<êaÈzö7eÁOC'²k‘P ý-Ü´™¯j­/IWŒ¶*–H,' !u'ñ«þ„“³»œ»ãÚ3“rÕH,ÉíkGOÚÑ.0+ßéàJNSuÏD‹Ü¿Mùiß¿‘•ÕBX0{ 8ˆB„(‘¼õææ–»f—ñhŒÓv+Wù§sMSÖ®ÖìëÛ³÷ É“ðЂªSç×™G Ü?¯ò¦‘ù/„Œ*u³!|<RüÐJ.ªD®Ñ;ÛZ‘[êPù¤Ë.¶3?WV‡©K3Sü¢cèYâÁrªNU¼hr9ýlžŽÌøAHf¢§µ#è|WWY;ª‡&2H哃+§m¶SûÈaþþM@?”ù»°™âßÙ¾½¥²½²®éè„"©üz®ò[²ÐBu÷àtÅ\ôÅ?>µäÑÅÕO,©5«›xxQ5Ú’brõ Ãs÷väBÈ5SüLñãôwœU çÍ-­oomu¨|è/h1è²o^Õâ 4¶6eâägýªdÏÞòsví‘]V¶k#ø-›§¦ ¥è~&Rez"t.¬Éâùj¾ÖŽÌO¦±(äà§É`RW©«]Ô>JËpSÇ÷”ÙÃý]¡ø¯nƒp!âo^ÙòÌòº›Fä+•¿{P6Æ(Ü0,é¦Qù‡Æ™P€#âÑÅ5cVW$Ýqç̲Ãã )€H1±âŠ¿5›)þ†LØý/^ÖðM-8¹ÊgpÏ”w e•§ùüeõè_3$GïÚÁÙU¹œœà÷µyxéÝÆí'39R5#X;>t>µÉWœ& Ï¿±Ñ¶×vä:$‚Þ€?<È¿Íß…ÙÃ?„ CÐ÷W4?²¤σ™:BåçAå“ó¸‚# 1R³¥@€>º¨Æ¬˜$pß¼ŠÛÎ*L(„0ŽÎ‡`÷ÏùJŠÿÆ‘ùO.­ENòê ‰Þâ*.™´ò¡I*Oó‘%U޽{d¾jÕ¦;»~¹œÁhó,)NŠŸ¹ÃwÐ’W$+·CÖŽŸƒK “÷ŽÊwt/©ùøP¿‡¿ ôkŠÿ-ýËkïWãX¨üÑLåžPxë¤ÂcSýbŒH¹{nÙƒgW=¼ Ú¬ˆ€ îœSvûÌ’ÛÎ*>:µè–I…&DÊ?Ìœ«y0ë_]Ç ßØØ Ü¿¹™¢Låsïöx·’Ðüè†!xŽxš'f”:4šUáäŠ_ äR :)²ë ø¥Íãäy´ØÖôünæî¸ŒéIÄíÄdíˆv‚^. Ïf²N.rHäÞ³ËÑ]ò|ýÝ«mŠÿµõÍÈšzne„ U•3ú–‰…G§ááÝ>£äÄì’;ç–Þ}vÙýgW<8¿êÁyfùH`~BŠwÏ/ƒ¸NÌ*èn›V 1âüdŠLþM£òîžSþâ¥8ÄŽSg/•Á óônIåã?h×qˆQª¹,ÂÙU³èTgfÁ…ͳ|DéÚÃs’<óv<"YvnÇ×Ú‘=“å¹·N,úñ‘¡ßÜñnö8ü]2{Èß…ÐqÚB÷ ™é\/¯nýPº¿K4?ìHOçï+@ÿêFÇ/¬l@Hj Ú 'ø½ ËñP\Rüè…U_RýäòšÇ/¬y`nÕ½3*ÏØó¸(.®†X>¿"Š>Sü'g—>|NrÔ R–TþkëXÍy·Á„¦RùhÞìúWV†Ñ4ÛÏæq&5h¥[Ž|Å ƒ'Þ–~6}‘„>Í„sКμýéÇíHksù ](†cÔÇOn y1³'Ðß±€@þ.Na<h&¤s"ë¹eõ§.¬{`Qå= l*ÿ±‹«ŸXV}jeÍÓ—Ö>·ºÀ÷ά¼û¬Š3jAÙ?yQí³kê „S+j Ç.ªÂyˆS‘™=‹ÊqN¢åÑSÕAŒ&D Á¾â­ò} M<;RùßÙ7È‘¬µ­1Ku寿qæóh9ÌzXwnQyMí(˜]œBó}gW£5©šîäÝÚô1òÍ–Ÿœ”ø£#?åŠ_š=>ñ]/W™=Ï/oxö’ú§/ªâüšÏ…>«d*ÿ¢ª'.©ÆÃ~zUí³«ëž¿¼îÅõõXž[}çÔò;§œþë®iå_PóÒúÜõókëžY]ûÔªÚ'WÔà$dŠfÏ’Š‡Î­zò‚Zäáð„aCrS§ç*N×è MÚP^ðܾ¹µÅÑLC0ÚÞióøÄ¶¼s˜‰â´×mÉ¿Òg;`t^2BÇÔ@\Õd9RÖX“)ÙqDú²²ÉRÖ&›ïb£öáõ¾}ûϘâæôw‘Ö&ã»>þn3ù»8Ÿ_Ù€“Ïïé ëN]P÷ØyÕÐj8Ùq¾?µ²æ™ËjŸ[[÷ºú—®hxeSãk[ðz''•ŸÆë‘ÅÕ¯ll|msã+›^ÚЀÛnMD3)~˜=TÁ¬jiÝÓÕAq@€#„‰šÍ»å„桉tž¡©MÔP^PaÏ]VïHâ© sWÚ<’ât'rÊ|*^¡Dª`ב¾ƒ¼9>›.Ó¿13ÉVŽèièkM¦Ôà[•ª©"Yb.ÐŒLä»A£½(5ÿÕŸÅÿO—gó»ã»ÊߏLþ.Njè- Ï -é?¾”«üKIå׿¸¡þå ¯nn|ýª¦o^ÝŒÁâ/®m¸gFÅÊN³ußìÊ—74¾¹£ùW7ãf_½²7ÎÿåuÎÀS°ø/¨yò¼Z¨ d¿ •¿B©|›wÐ< MÌêîá¹a¶ ª·ô³ý&¦ÓK„Í3™x{>ƒâŒÎÜ/êzÓ©@O73ªØd¸.ú”·C£ØèÏé%°výCµOàN-«ùùíÃvÛ0áïöñw¯ñˆï:ü]è-2{€~$Ü>~.VÍ©e\寯*ÿÊÆ×·4}c[`ñö5-ï^×úÞumÏ®¨?1©üø¸²Ó`œRþÂê†÷¯o{wW+nðÍíÍolkÂ)‡³')~Ç=vn TDÄU~=©|Ý»í¡ o ><·3KÐ[™ûøô–À(Ì}•ÏãEqzšûzFòªÔØÆfEŸíOwy ³vÈǵýh }Ö¤)ç4âc¸Î*S9}°vP•r_ÜÁÆÙFåï‚æßÚJþ.ÑüÂß…Ù#ý]¦ø¹ÙóÄy úé?~^ ù+pú¿±µé›Û›ßÚÙòήÖ÷®oý`oÛ·nhw^|ÛèÒ»Ž-}êâº÷¶ãv>ØÓ†[{çÚÜ&Î7¦ø73ÅÿÜeu-©}lq ”©|؇y·„&ónÝšH×Q„&T>Žn¨°ƒ¨7Ò QÎC`6ƒâô4÷‡f;Ì}ʕ괥]#5ü”§Z>®—Bͼý†~) lN™*XÁ±è\ô‹¤øcñw[)±‡â»n—?tÚ€~„ôO]T‹£ÿÛš•ÊOÛ‡ûÚ¿s`ÐG7 úþ̓1wñþ9•GG– ¸õðÂêö´ïæÁß½iз÷·ã¦°™q¦1ųg[Œ~$á<² š)‚s˜Ê‡Mè§òc"4É»U** )åx¬*vyy^*NûÃ38ôí§GÝ–+£ÁQ­«˜'ô ½C»cBa ¾)²KŒ¾=ÁÓÐ?:›A²ÐkpošûË;;qb8FÚGéï"M\Äw7Q|×åïÂìኺ z՟ͲzT+Ÿ©üÝmîmP¾{ã ïüƒ#C>¾µãÇ·u`8ìŸ[;Kĺ{ZÅ»;[|¬ãã[‡üàðÜn‡)þ½\ñïj}s{ ,:ºwàŠ€L£À»U*?&B“{·,CSšJåC…¡œÚ ^Ù<˜úJS׿¾3}ßÃÜ·ªu©5•žÌÓžÝ3ôA¿5;Éž£of9š/¸²5݆> Ûœ2Èá†~NCÔ@üê®Î_žìü¹2{üýݨŖÖ&â»Òße4¿ðw~îï*ÅÿÐüj¶ ûú¦&X€SùÿðàÞ2äGÇ:~r|èÏN ûéíC_\ÝÝdXq¿]·)}튦ON ûÙÃpÙ?:Ú[ÀÙõÑÁA¸)¦ø÷´½²¡{‰L€>~AR7,@˜v>Þ­$4‘®ãÊЄäUɹÊÐT„&:¨-¨üOn† ¤è* Ìýmõ™8í}s_f4Ðü•Ñ@3焹OJ´Bu l•¦Ç;…A·†ŠÒ}ƒYŽÔÞU‰Ê4ŽÊy×nèÏ.»mndÁ Ï­T4ãøõ]#~ÅD—ʸÜùÌÂß]#â»—¡Ÿ)þ 8@V¢<§–Ö„… TþQ¨ü¡?»cèÏOûåÝÃ}oçOoúø’š›;ŠúÛ:<´è™euŸœþ«{;q÷ðON²½Šó §Î.RüoïhÁÅß?» [Þ¡ò£$4Y1Šž¡Iõ‡.BÔYùx|ßÝ?¥‰T®Nçµí9€~s_kӠж‚=ÝÔžTúlð4v˜ÍÇ# =úŽXÁ,­6n bØî¸sfèsèïâm§ÈЧŽ#?>:ô×w3Åïáï"­²ˆ¶%zWþ.™=ÂßúTέ&î›YyïÌŠç/k€šüá­C`3@P¢¿¸kø¯îéüÍý¿{hÄùƒCCî9«âР¢~²šWõ“£Cqa¿{p.òW÷ Çã²™â?ÆÿwöBeò5°½±É•Ê×½Û¸šÀ=ìU<¾7¯nQ}JÈÜß;"ÿ(ƒ¾ÃÜw²û¶¢-‡§ëÊc[RÙÍ›Qø»çV¦éÐìãj©;ÈÙŒ>ƒ>¸fèŸ[¶od¾j¶Ã:/d§|¸§ý7÷Œ€Ùãëïðªß%³gsÌþîCóªIñÈhÀ6øÆ––ŸÊ¿sØ/ïþëû:ûàˆß?<òÓÇFýé‰Q>5ú½m°nj+ìÃuûø2Ì‚ÿ˩Ѹ¤O‰Ëûí#p©8£pRáâttè«W4aKß3½ÿÅ}a“c«“w«¬üž 4™½ åõüšzè2Õ› пiB ]aîŸUÌØ}–ÇÆØ}G³êìr÷µ ¼!!‹é²*õièÛÓ?SŠSô‰ÞÑF‚Zq\߬5V–EÐ'FŸ|ÜãsËM,ôa ¢}z¹ £ËëW6ýöÞLñ+4¿ŒïRZËg¦¶%\ñË´6_,5‹ïúø»Ð…÷ý%ð‘ÔðÈ¢êoß0ˆ©ü{…ÊÿôÑ‘ ö/Où×çÆ~öÔhÄ8¶ÝØRØËëðbÄ•þå™1Ÿ?7æ³§ÇüùÉÑ||Sü‘âïÄe¿¿«7u×Ô œQØÒ÷ÛT~MOšL城Ç÷ÈU¢7›ôtoÁý­ž®­^Ñ;¦kõâõÒ‘Û“ômªÁ¹ÉÔVÖ/…ÁQžB-w½cf‘{|^ù±™¥ÊÇe}¦rRžZQûÛûFâÊßú=ý]Ðü—7ø»àõˆè$÷þÙLñ+@Ì“ËOL,GŸøŸ •`ýñ±Qÿù³c¾xa쿽4îo¯Žÿôá‘€Ñþ¦‚^ZÍؽŸý·WÆá¾x~,.—ôg¦øG‘âÿø–06''—ß5µ‡™:ØØºÊïiB“T>Ò?ew*´%LDC1˜¸0tuOב»oõhˆšä©÷¨¥Ï¡_J’=£¥w<ã¸,˜CµpóÊï˜_.Z¬…“a¢¥øý‹*~÷ÀH®ømþ.Ñüˆ»ó™…¿ËÛ–èõ»’æÁß%³¸A>2ð_ÌÆùýC#„ÊfÌ¿>?öËÇýõ•qmü?¾1á?ßœø³Û†ß1¾l_}~®{¦WþöÞ‘øº¼1áß_ÿ×—Ç}ùâXœ?PÿÌìy|¬Tlž˜Ä®×]Ó*pˆ!5[ÚÓ»í9B*DßÍc  Ë”§‹…NèËÀVP §«bËAò„z^é'Àз:*g]…鈳éÈUö£wÈÇeÐ?»Q>.úx›ZüûGþîþ‘¿!³'ÈßmKD¿*UÆåßEZÏgVimÜß­Ççðwàè⦽wzåwö þìi¡ò»u<  ~õÖ¤ÿxsÒû× †ý³·6?îë–a%ß;0ô«·&ã‹ðuÿñÍ cΦø_`ŠÐÿš6lW8'&–q•Ï2±ÝÞ-'4k£"4Qh/9’ЄwK*çöu­ÙÐeÊÓÝXbПô>ótbºé T¬(ùÍ «ãÒb3 _aimºš!Òô‰ÙÔÚÊ:èÉlzÐ;€þ‰³+6–„¨‡8uDùóõ{(~ÝìñŒïú»ßôŒï‚æ×{l4?÷waKÅ_ IÀÓñ1¥ÇF•7¿¼«*öÆß_ÿߘ@¸ÿêíÉ_½=å«·§þÛK“ž_Ñ´§6wu^\Ö ¯_Ñöﯳç_!Ñÿ 8spò@ñ#ÙéÁyÕàõoÇïHåÃcQÞ­?¡)Òu24©»ŽUr®ªÉ’sÊÐÔ M¤òqn#žE= ÉÓÝV— ïÐ$A_xºV•:+VjŸõâtÛ²qòÄý™¥=Oïо˜^–ꆾ_š¾O®²Ha½sû|}HQ¢wÐÂQ­Oõ®øÉì ðw­¶%~þ.²´ø®åï^äßuû»döUÀËhQ‚$ÞyjŒTùî¿zgÚWïœõÕ;Ó?}d½3«¯«ÌëæztqýgOMÆò&ÐÏtÿÄÿäŠîN0\rp4á€Â1/ÅOåÇ—Ðdé:H[š‚Єw{²ó×\åÿüöahF«CÿÚ¶}äñË^ŽÌorèwæõ‚¹Ã¡?,?E4UöJ\óKÓ÷a6Ë ú»Úsú¢—rQ žOÅÌOe\îú]jÓÉý]{ÛV`áëï‚æG>3÷wÉìþ.ØÍßeŠlé±Ñ ý· /Á!ï‚k}ú ÷_¿3ãëwg~ýî¬>2¬dWynÖñ±å¿89Â>êýú\ñCåÃ¥96ŠmEG¸?•_B“ª^Óë)CSšdê@g}tã`jÇ©Hž½yŒØ€Ö÷ç7­L¯:]ÁojÔ~MFÏû¸¤õ+ÃI:ôý×X¯5ORßÎlÂÇô÷ÈWÌ&$…æ½?¹mØ¡øàï2ôkýªô68 ýü]–ÍωN·Ùãˆï:ü]Rü@Û­#€þâÃC‹aT|r{'™:¤ò¿ôßÐÿú½ÙÿñÖ¬onéØW_=úol)úðúίރ· èãuÅÿ֔д"\®׃«r¨üøšÔPMµMH×!Bîœ4œØomoq@ÿàøB@ô†›ßìµ­Ÿ÷Rt?³?=9‘ ïÏ²Ú ZÐ÷%õ ú‡&!Öd°UèkoûŸ%¿òwAó»ó™‰æ¿Á§Mgtþ.¥µ1w¡-¾kù»0{¸â‡iÅT6$óî(>4¸èñ%µ~b™::î¿~ðûõûó¾xq橥ͻ*"¨ÿë«ò^¼lÐß^Ÿƒ·°7²·KôKÅÿ»ÆÀ¬Ç÷âÛoéd)¥8ˆpUšwk'4çY1¬˜Mj¨æ×C“ºëPý¡TùáÉTþ}#ઽ°¶³'D÷}Œ]IOºõ¬ ý² jßÑw_ËßtDµ–×űÅfžî%õ!'ô©.Ñ+že#õµx‘ú€þÉGg”rè3RŸ†¦ ‚äOæŠ?Z—ÆRØú3«´6÷YÈ“¿«ÿÍCŠ"©apÑ«ë[ÿýÕ©ú°Rf Ü¿7ïë÷çýþÙ_¿¿à7L;9¹ÚOý?0¯þO§fâeüÅó¿Æ ýdó¼;ã‹ç'Ã>8¸߈GWùº©-¡‰bWÉ9ÚºPc)¿š”¡I Õ¨ä\ÏÐT„&L¨|«( Å£\ÇÆ®ðÁá$°X y@mµ\®%º3PTKkƦR—ç•÷½CûbvEZP(W¦+ûų°ÝU<‹ Å/æ¦äм ô§WB•Žú»âïʱ*­õ«B>³—¿ËÍw⻕ßÕý]föhŠÿ`{á­…øËwö ÿêYL[ •/pÿõ ¿þ`Ñ×ï/úèÆqÙ€[G”ÿôødö¯l-äèÇ»,ÅÿoÎ|wûÀß‚=F*ߥ¼Û8šh¨¦õÐ$BsnTÛd»Êš:¡I*: ñ,>x‚AŸ鹩 ² úþQ-[¥¢£1‰*ÒUÐ]Ðó) úa0² %¾Ð¿sa%äBñ,@‹ÕúË“£ÿüøè?*³Çßߥ6VfûX ÕŸ™ÕïR¯ß¥2.+Ÿ9:—ÌáïýC‹¡†‘ʆd¤3 ¦{rJå/ïžÀu¶Tù,Ðÿpñ??<ço-zíŠá{jòoh,|w稯Þ;üúÃÅúx±¦ø|ëh¸¼ød|>¾ß…o”*¿´· Mx·\åšPù`ç`¬“O3W(ªµ±4ç }¤ôêÍØüºîúôú¬Þ¢whÔf&{Bß/‹Á‘©Ïµ¾Ê…Öô7•†ô1%®€AÝ?;5æ/\ñ[þî}*¾ë*ãŠÙßåÕë±ú»“-¢¼ŠÍìA2Okáæ‚ Ó}|Iã¿<;Lûîÿùá¹ÿüpÉ?¿uÞç/œý××áö¿ìç|ýD?WüŸ>6õ¹µû ð™7µ"Xæ©òû€Ð<äEh»åÄ9Rùxj×µfIè§ú[k3ãýœÔžLÓwÿð©»}Êb P.7xýmµ™:ôÑÏYb@?€¿Ë˸d¿ª`m:eý.µé=/Ú–hñÝ—ÌP+~þîM0{¸âGjo]>PûúÆŽ¿¿9Cñ×îÿù­óµ%Ðâÿë«s_¸´[ ¸w©ü~LhÞ7Œx9˜©|d$f®ÀvåZŸAÿÚÖoè³\†¨´>òô®$—6†¢ðLãý’UMaÅð¨´M›ÖçE*”»æÔú^п¶5[‡>&v|þÌXDŽ„ÙãéïÞáU¿Kc)„¿ëj[âçïýžþ.hþÀø.hu":Éß…Yr …¥²Añ#ÝCCJ>ºqì×ïK•ÿ-¨|àþ‚~ûö_¶,èÿ绋޻vˆ¨Ëß×Ï9ÀM|²Û»EÃ]å÷B“20S~b8F?ôY.CfÊÞayèSÁ oGåê>«Mb#u)ÇýU½KïÐ&:»*=>Ð?»‚´þÞáy:ôÿÃÃ#?'ůü]Ðü2¾Ke\¬~—Ú–ðF…c)¬|f+­ù»hÓ)ûUifO2ºõ»ªŒ+zW™=0èAY^W‘ nç·N'SGBé?¿½”C;è?÷gwL96º»yØ9Bå3SÇònû?¡ •SfêwoŒé¢:ôo[è}Ö}Ö–ÁôÇõV ƒ~rŒ)N/ôŽ+t@Å"ÿª+þˆþ.Ðï7–Âß•mKüü]Ðüžñ]¤µÉ|æˆþ.Ô6”7 |}eã4+rŸ\ÚúÅ+ ÜÐÿË3sœßˆ‚}²§&ﺫ|2ul}ùòüÝ®ò™·Ð'„& ÃbC´‘·,]'jBœT><´‡Ï«Ô¡ôSǃ܌ÚÍÕÉ͵ͽKîhbmK5Ÿòvs /ÉMÍôï^\‰ ÒŒ×çä&ÌDôÇüò…q_@ñwÅß<†Ñ£_ÑüÜßõh[âçï‚æUJþ.ÑüÒßelòw‘Å)¡ÏùM¹¾|ùl‡ÊïeB“b·¾Cì ÕàVYš”®c'4Iåã Æ\5K¸G^º/ô§EËðèÐ?·¦/èÂÿâšú"‘!öh.A.…´ð †ÛüÛ‹ã¾äŠ?¢¿kµ-ñówÆRÄèï2³Ç3¾;ÂJì¡ø®ÛßåZŸØ}±¾|y>Ì!·wkařнËçÀÅ6!Â/]GšB 'Ç=ê›FæIè³hîÖê @ß/š«1qür-þâåyÊ»ŠÐœ`%åÇDhRC5Ÿ¡@‘'D8Òuô MEh’©JúógÆ`¬4AŸrx®i΀¾Vžm"C[/”¢ûýÍ9)V·M­­¾#s3šô5¦õUîlÊV™›âþí•ñ}iÌž—¡ŸqòwWyç3wÅßÍïòwA\ÊtJÚYôÅËsãCh¢¡š«‡&Œ7wÛd½‡¦kä-³ò}Òu()ß#CSšJåÿéñшg è祢 cwG.ƒþüékªý GS{úZQzo¥é»7@^ZR@£Y{¾~„¤e‚>¤èCI@U@jWU†€û¿½<^(~åï‚æ÷ÌgÍܧMç^k,ETþ®6–Âßõòw)­Í3Ÿ™ù»­V|——<¸k­/^žÓã„&&DhCˆÐDõf¼24¡)UþØŸŸÆ _’Nùú€þQý¸$-¯o͈÷lè¨ÉM¼þõú¶Œ ËQ—ªÜ¹°â®E•Ui!ÉRƒìþðèH¥ø£ôwi,Elc¯pŽat¥p´é¤ú]*ã²êw£ðwQ¶Âs3­õÅK³{Фù‡ˆèÙFÞò)çq!4aåÃ+ƒo†.Ÿx|%ôQ¥uó¤b;ôe*9c"¦R•óëúÎÇ¥=r^]Ñ TÕæ:†Újsyÿ)ÞuPµ^Š  xR1ÕæBU@jºç¡ëÐäïzµ-ñÃÈúUaôówùX ÕŸYÅw»àï"[Sfð#³­/^šÅcXýÐD1J`ɹÊÐT„&·òÇBI¡uûæ2}ªÍ=6“‘úLëSYzôŠ9(A6½Ëþ´²ÞMÓw SÊÒÐgƒGåú5ÜTЧÎúª, ÛÌ2ÈÈ‚~YÝÿþú´ýˆÆßEæ ­_U<Æ0ºÇRèmK„¿ ¶‡÷«ÒÓÚ<ý]£ô‘Ìl­/^š t€š(FÑ24¡I*¤Ü3—Ö"$µ*K?y6+Çs@ßÞe?†¶›Còz7Mß ýö¼‚>õáAß'ômm–}›‘ôï\PIÍH /Fí—…0÷P‚m7{¼ã»]ñwÇ0zÖïR·6›â§~UÔ¶DÔïÚó™5÷@s!Oå·Ö—/ÍPé:ð ´¤üB³² =4{Ðî¡òAKÜ¿¸‘<Žf$¶ñÑÖätg3Õl¹´Ú­ÿ…éIH"í~ * è‚Ú_‡,?™²Ùa¬Ú-±fc¯Žðw©m‰èWEim~þn7Æ0êimø»@¿«~—h~ŠÑò.k}ùÒôÈš 4Ñ]‡wéÏ„&ˆ8à±Pn¡Ç³6—‡mñ,Ñ‚Êc¬ÐÞ(&j!a>¥ïر#àeo¤€®kv"šë£ÖÆ7oÙ'  M¯¨}Èîäì´7CÏô{bf':þî£^õ»¬zÝ ãõÆ0Zóˆ\c£õw~¯ø.U¢xõ»|}ùâ4–”ßµ Mša ÔW„&SùÏ…WëtÏÔ¿º>Ó—Ô÷ÌX›¯¦KXËrºÄEõ}íãü—Ö‡£Ée€ÿ—ç $~½¨É#ùÍGæQ»%ê2)ýÝq*¾Kim¬~×§m‰§¿KÙüÈT KÁ Yô|f5†Ñ=–"ÀßeÙü¼q)~ü——™[ë˧öH†&¼•SÎ5BS޼ÝÞF]FЪZ޼¡äÜMh’©õô×—Ç_UÖ™Mtž²H}æãºjÒEÆrT¡Ü™}íãôÏ*Oü¦T m7L.´ºPÙ[ñP*â7Q°¢“<Ûë3Yg?¡øíþ.h~UÈâ ù¹¿ÃFÞ¸!Ö1Œ±ù»¢~¦<ïÚ`­/_œâPùñÍÐô&41ÿ0Þ„¦TùãÑøÖáãîžï`6Hü˜M¸Ž wí†õr)ºŸÑ?$?¥;ã$ yž. G®øY{áHþ®­mIïŒatù»’æÇØ]Þ¦ÓѶ9¼•š´±…_¾xaJÜKÎiä­ç”sww6ÈÑPÍ¿‡f¡I*'3¦ZôÉÇÅ¥"OfÓwˆ¢뵊^k·ìé–„áéF(äè8KCsõfËŒäYX ÙR—KCèmÏ[º²öÂAþîc¬_•Ö¦SKÁêwE×ô±»}ÆRðù»Ñadm:ù<"•Ï,â»^þîá@ͪ¬õÅ “ãRrN#o‘yÊGÞ6ø§ë´F3òÖ#C3¡ +T\2LãÓ}\dê™RÌÒ•£¡wÆ8zÍ2Rß>P(­/¹ÚnÀ€­Mƒ¢í3®›ûªÅ¾žº|ËÔbÙˆJ¤3`A_ú»Üì‰ÕßúýÇ0Ââ4†‘7‰¶%žùÌc)xfj[¢ù»¨âå]c­õÅ á È.#±šÔP-`Ê9š4ÿðÍH Õ #o Õ<34É»U*'3qÃзú®e&Ÿ]æÈÙÔªrYi"ìaXÅÑÐ;Ëñ¤ôðk/iäž®‹äA2y‚«ÐL!j?O2²šÎòt ø&è;ý] ÿy§¿ЦSø»c)¶{´éD)²x·-qa¤2.~UT½Î»GñÖúâ… Þ%ç>„&&ñÑŸ¾CbyûÀ‘·ŽšžšŠÐ„©*'ó˪õ<Îìmx¨ïH><ÔMïÌ©ì‹Rt¿4³‚yºQŒÓryº®˜.Ð6]º¹ÿìê:ý¸ù»r #<È ÛXŠîù»dö8ÆRèùÌ·túhÆo­/^[M5òV›rN„æóËÈÊÇvEÑ}/dhê„&Nc„ÞÁDß9·L7ô7¦{úžÙ;ãXg}0›~}×Fö]š¾{ +Hí’§ëmî#ª¥Ú°¡fåþÅåô¹Ùãéï2¶ÇêWÕ-7.cmimš¿ ¯—OF±ÖÏëNMy‹[ˆ=["Ö4ØéMBS©|¸dEÓ5¤é³’ÜÍaCÝ6ÝC%ÆÀL`Ð÷÷q«3{·ÝZ°ÅT‘‘ÁÓ ž­õemØÊÂÔr™±û…i(XÑ¡où» ùy>3•q‰ú]†þØýݨÇ0[Æ0úù»|,±–S`«õųcãÝC“áÞ#C„&ˆünôÐT%ç*CSšJåã¾v4dª\e˜¯Û2= }ý©–¡LG èã†á\öŸxÜ úµæ(ÚÍ}6aEW1ŒÉ}›¿‹Qj^ñ]ÖÜ1Hu'÷÷w{f £ÍßÝ «Qpv±ãë ÿòôظôÐì.¡‰váÚ”s}(P4„&›¨‡Ébßd‘G=k #Ámiúþ†¾€¾ÿ­•MýÉÇ¥¸¢ÙÓuézϘàÙË”ÂIMq,ÂB{:Ì]R禒ÎP'ú9ÑI4?ˆÿ˜üÝ®adþîš8ø»°ûq͘§Ö_ž£Ç°"õÐôðn{–ÐD»pÙCÓ¡©Íp+Z SV­>›|„Ö¾Î|Nkzå*Oµ‹†Ö§ÎS=H²P5¿OÚ­2sªdLw(o´ß™ã7YLŽ9ôšC⾓Ýç=yöÄÑkŸlŒt@ß×ßEÓž'Y›N«?sTc£s|´þn7Æ0÷茽ª/ÔòYCÆ;æÀydhö¡‰é¼¢äÜòny Kª|ÆÂ}|´Ã²vÐS?”tÓø"Ñ€Ä18Ñ1=.ÐЧV›£û¤ÝZ0ôáw{šûØÁ*MMu'óè6¢ZúH9$0ÿìÄ0'ô»äï²lþxaôšG$¦Oó1Œ˜Òì9†ñøØ2ŒÝÕÄP >ÿehbä­=C“š ú5¡©Næw®mUA\X;+Ó“ŽL+¶Š5kÇÖgÓ–°)r•ÝÁ¬º^n)S¿ÛmîCñúì>?UlQ2â<2µ˜fè*žmØÜÐÊßz #æ¢!˜ÏʸüÆ0Úã»]È83T¤é·edõÚØ¬h@O¯ %'z7&% ¯›ûÁ6ÏísÊV¤&ÁæÁ*Õ}ycƒ'ô£÷w{| ãùÑŽa„^ÿó“£a©õ›ûG8&DD äMh®íB“LÝ{àÜ }d"blÖŽbô)kmh¶ê½sYsÿóq ý«š­uïñÑÅlóÀ@6/ÚzäÂ*Oè«ø®åï¢m‰ìWåKÁçïRfÝìÁØ×.ŒaôAt>m:yãÔ1þññQúúõ½ö9pÞSÎiä­ÿ”sAhÒ0, Pr6TëêP 7¡ 6™'å³tŠa)•'rˤ"}P4k' ZSÎÏ¢Ñq ªûSW?æW‹u‘Ñ@ÅŠÑÙ<:ÏÃ…˜Í#ÝãÓ‹ý ÏÌVÈBùÌö¶%Üßõh[â™Ïß1Œ|þ®Þ¦SÄw'±\à@ôõË»†¼…•/%2Áé:”Ī5û¥ëxdhÒüCÞKê Ë„¦þt®kËÆYÈ ÎmœÞW–‡»ií@ëôÇöC—6À¨"xº¶œž)wßmóЈ!JeÃÐ¥)‰ÊÙÝÛ‘}aö¸êw)›?Ö1Œ°ø»0†ñé¨Ç0Â…ýí#ŽªÖ''†¹'DÀK†¯ŒœÐàtžÊÐäói(P4„¦•dõæD0›ÈCƒ‹Ç·<%Q54ŽRÖ‚‚¸®ü>K‚Ac[FcŸ´Æè¯ÍJÖ;RùÛ<sV˜³;ÛêÑpUMÆòäDåì¢+Iômþn@Û^¿‹¹–0{Ð4ÏK!ó™#Ž¥èúF–Ø#ÚtÞ5¥ίï³ÖÏŽC=;Nì ´òÄ+Ý%çQŒ¼í¡ M/Bóe'¡©žÎçÏŽ¡‰q8±ñø–%'^Ó–C­GôÚongLÞµ”¿ »èÓBýÞ› èé5°èë vç9XÎY´Åb[¶|ž-ÙË’¹³›D‘]”{FVü²m‰o|è÷ÈA°cy>ó»jþî•-Ž1Œ/Ä8†ñî©¿¸{ø/µõãclô9#4û³*@‰¢¿T>šÌÔáV>ŠâO]PGIùî‘·H[yÛšîPã/îއE*çö%I‰{†çú0h¡Ý¨õÈ!Ðù~‘,·£¬5ýÖÇ%ô_Öœáió`7ƒâDz"ÕÈÉV?v?¡ÁˆmiŠ¿|÷°¼Kp\*ů Vüý]gZ›¯¿k¥°ù»€Ü7Ö1Œ÷''‡éëã[;ÐÈíLí Ü+SMXÉ9Ã} ón]„&+F‰œ¡Ù„¦z(ßÞß®8MœÛ'$Ü8®PUâʱYvWE²­EýÖÇ%è/¨mÇõ~lÔ™GmYù<ŠàWI |²âc !5]ñÿæÁÁ6ù»§ÇàïÂìQ‰=QŽaÜbadówcÃ{-å~z»µ~pó¡ò§W §Õý³+˜[/ÙË»ueh‚ЄwkõÐ (9#o£™rPr®b·n•GðÊ•Bå§&âñá!žVB-wØ`t©ò%_ˆZ-oÇÃÚ!ÝG&÷Rt?+hlqª°yì©lzl˃àŸ&“¤ÅxJ ¤¦+þo\Ýú]ôwã8†ñ’Ècï™Qù££?:f­ïŒØ­Cåsﶺ»„&Z-tiÊy¬„¦z4^XEa,Rù0xt•O©šèN@5Y¢©òXWÞŽ¬H$—A¿5£9§?å*»7€ç€-+ŸI dó0‚ßîìÊÈ.±œÇf—BpºâÇ„•ˆÐï‚¿Ûµ1Œ‘ý]¯1Œ÷SvÃÌÊÞ2D_ß½q÷n+tï¶?šÈ†R=4õúCÊÐô| ¡™•/Uþ¥ÉVoMÁU“µ,e=AßÉ‚ƒ»¡µÆfEïéª[V>:”¸þ È®TüÈýÐÿsK£¾#¾Ëº“;æE=†ñ{4WOk ôwQhÕï^X—4¼{ ã}³+¿wó`,˜pXøEÜäÝöB“™:„&ðA%甡‰ôAÏDZwHŽRùx|ˆgq×Ái²äÕG_¤jú;¸°vÖ6‡ûS’¾Ï†€'Ž*²³«"»ª5•®øg—­ÊNÑâ¬U4Ëݶ¤+cy„ë{<±ÇIóo³æï:§qñB :h~=¾{ÿœJ¨ùïÞd­÷´ B“ÅnER¾ïƒ@-5;ôìÖ•†„•ïRù¬0%ÀÁ•Ö òaíœSÓ_ã¸ú.XTc’v:»<²Ë9e­ºgxëÀÔâI5“¸ì„âONOŒ"]=`ßE6¿§¿‹éÓžñ]éïþŒµ-áóˆnîmKnBùÌ”Ö0–MoÝÀʸüÆ0òø.\X¨y0!j½w]›¡yN¿ 4©¡R¬õúCOÉ£BåÞ…åà£ÁåӃÞ˜0§1ë&žªèè·£})4å @çohÉè˱YÑÛ<ã‹S±SÎ.2øG° ~š5äd9¥â‡t·fg¤²V¢R|ä-Qp÷汚DÔý>þ®Ö­5*ô(ãB<ß{,ÅžÁð?Ü5È£m ¼Ž‚@g›NŸ1Œ@ÿ{ÛôõήV_Bóg†f/š4ÿé¥ÁšúSøÝC#¿|4È ýFŽ›üpò%ƒsôÎ Qª|rp×·„Ûú¹KÛ¬aœ©‘º¾,§Kñ¯–Wši5MoÑ ÏüÝdŠp%o© ˆ~ѯ*âX ßíš¿‹<ÈàD§«mIÝ)—¿ûÐüª÷®oÕ×Û;[‚ M†e•œ¡‰t1Hšyëì¡-¡‰Ö]ÑšžÞ-¶.²”|d*_š:„þ2MeÖç¥n‘g³òQÎT~Pîúæ0zG¯|ûì•yi‰Ø©ۥ◭÷Qv "».ÅÕ¨¼öB'k‹ŽtůE¸"òÌeµž¼²žL¢¥µñ1ŒÏõ‹1Œ`-ß¾¦åík­õÍmÍZºŽ 4)vûT¤†jš¼w¬3)ÿp†i£,:´_G4U;¿º‹¼ÅÜùàúC¿ MˆÖ?Œ=†¥«üa|ä”þƒ¦i£ÊB;FçûYùŽ.kСZÂk›Âý¤ÛZ„M…»]Óœ›Ç6K]V-ÚÂ[có¯“?±2”ìg͉‰É”G¸dN[VÊÍã >{:Èø‰¿{¨Kþ®ÿF4©}sG³¾ÞØÚ+1,š؃šÇ¼24QwËU> ŠžÐDÞõí9('‘¯ÒHÙ/MJ¬ðgdB)‰³ê2v +ß[åS¾Sù-á%ý<Ž«oˆÅÕéÑ(þ…™Yܬ÷ûTœ~í¤¢›&A¾‚íá9mTÅ‚\‘­ÕaÕ–ÐÓbf÷w=ÆRøù»ÖXŠ¡Ð”–¿ ¶':—Ì?÷ÑEÕolkÂú_ømú¢ÈÐ yÛš3¯`\ŸŸvum†gŠ›G| žñKqÏï1Œ<ŸùûîøîÎv{>3ëN.ÒÚ.k¤ø.ÑüpXY|—¡¿æÅ õúzþòz[†&y·ª‡¦h±‡f@†æ°ˆSΣ!4ßÜÑ‚®ùP4—ç°–ù2M±:ë ÓœU‚–ñîädꢼmTþࢠü3d¼O¯L¿rp¦Cå¯i„k«îí»×c¯i ëŠ^u9WT©‰Ãsµ—-™Ytâç5\Çç”m•…,Êè'ô£>è©•5ÿp?Þþî3}6†ñùËëøªç«î¹5u.ï¶Î—ÐDý!›r®š×8†ÅŸÐD±ÄÝ ÊÐ B¦º[†{^"Å(¯SCqV«ädž©f¥-¬œ]hè‡’έ é*ÿüäã¾Ï©N#Å¿´.„Žœ ÏKO:¿%KÏicS·ìmªt³åý¨`DC/É"›?3v'Í]úaü åÃôóFÍß•ŽI oocXdimb,Ëg¶üÝå Pü¨2âkùÌjÛzúR6ŒZ£Ä“мÅIhâL‹†Ð¤t*9ÿÕ=ÈÌ¡†j ÷¨D‘&>~Az¹*밬ĩE*9YŰvÉ›W—‘¨QˆxI}VþÚÆÐÔ’¾žë2¹8ueC¨=7è°JKNœZÚ9J¤6¨œ6š¿³Gôê‘MÚ¬ FŽþ[Î*Öak2£Ÿ£ŸÍšfèOß^ŸñÑA[~d7p ã=Ûtúû»H ÷ˆïÂìác)p4=µªV­SË{–ÐÄ$IgÉ9k$è$4aª9p*)CÏ·T„îùh îÚŠî:›ÊBGg–¢ä*Ÿ2“Yššž”ïHN¶Òò¶Ï]Šçï +àfDAʪúÐàäãÒݤ%¦:'ƒ R7vÈæ„<™YMuš=ZZDL}Ú˜îç³™v4fT–.¯…~ ´yry ¨ +ÈÕsc¹âÇ•Öæ5–‚%&àÂlk™wºJ{d(Fh‚È'+_N9ç„&&D¼:Y wÍ+cÃQ8î%¥ÃYüPÒuƒrXÍy ÷ÊÄgÅ(¸¾ÕíY 9AJ=3%1{ Yú‘ˆòŒäKš2¬¢u­[‰·Ù£U0ZF?Ðϱ Gç1…PE°>9á#ÐÖè‡ñƒŽ7„þØü]T¯ó1Œ˜¨ƒð'ÜD+­-Ðߥ1Œop³ÇÏßÅlÛº¨Z5TCÊ'Yù~"º?ˆÇnG¢Û!Ø-š/îÑ$Lá©Né@÷šX$:'ksÏÉÄWijnS‡F S:« Bshö¹uá‚‘§ ØAÿž•š8§*K’U,VF§Íì!£ŸZ*®SŸƒÊQè?6³lci:>Œîä–¡½Þ¿sã þ¨Æ0²ÆÂïÃ&æ‰=>m:=ó™¯öÏg^Õ€‘'”ÏüÈÒ*Çêé’sÜȯïîÄ4yô¤ð d™:/usã–J6õÖû-UáÛ0k>;uY‹­ÕážJÎÕl,=)_¥ë¨1A*mac{æäÒ´ô~Õ8¿;@×ß‹S ]zÖ·2êJÍ_A1ŽjÙÀêÖ}Ìëd™e- ëäÈ~Òý'T^Óší@?ì~ sYèñ‹«š±Ê¸<ã» ùy! aP«mItc]þ®•Ö&ÆR\\ÿà’ÊϳÖCK*­t ¤MLˆX׬æÀáHÁÄЩhRd’ú÷Ðé:Ž9p¤òý&DüùÉQ'甂Átãѫݹ4Ȇ{­…›:÷*MÍÓÔÁ™Ü;bX«›ÂƒóN'û&!¡!+yY}HpÙoÙ–¨ FYº.\^Ö¸AëKN./uåWèÇD–ƒãE×;eù0ô—¤ãq“ÿé£#•¿Û•1ŒGã3†ñþs*ôõÀ9ÔC3ˆÐÄüC¡¹KŸr.Íu ¯œòà†jH[`Vþ“£õúÃíØ=([á^Ø÷íö¹ìh%}/q/¢WµµêÍɵeõ‡”ž)‹QxšÚˆšˆèÈÐT™jDh^ZŸžŸ6€âXþð¯ÉLZÝ(#\ZbHåw›=¼ŒK7ú-¦ßîòúé~¨ÿëå*¯—ЇŠG‹Fn.­BŒF¶éäùÌ4‹7*ôKÁý]¶%~þ.h~ÿ1Œpaïš_¦¯{Î.÷ôneMß‘·¾=4î‡ÁÔ±õÐTÞ­–¡ BóÓ‡GÞ>£b¹²4Þ‘Š[Ç\““ºox>ŒI ÷:•Éú‹ˆè™ø¢c¸VwË3ò©ä\ïî®ÓFÚ²ÚôâÓÉëÅÍ,oáDó0{´´6QÆå2úӯŹTË*•ãàÖýw-ª<<©eÑ"Ú•Ÿ†Qäøâ1ß4*9·ÔŸY›>ÍÄk #"\0QPÈâ¨ß…Årv)Ljµîš[¦ªõ¡ù¤ 4¿há A,l–Œ×Bh0o™VâÆ½NeÚ¢Wv_7ñi:Îê¸LVÜ_P“õ—óÙ«Ÿƒ¡Kk~³Y{4ƒHï̬ýú8>F%úï˜[~UU<Ó!U ŸŒŸºŒw¯kef£?³Hk‹} £¬ß¥øî;*¾‹2.m,À}ûÌ}˜]Úû„ægOynuÝUUaiܧ3ù9<^ËfÎgäCß»qïIé÷º‰¯ên©Ëˆž¦¦›: *ÓÒFMJìƒV¥;ÒÚ\§ªe±JxÇÀpTq.G”—›ý,è~¬=¹krRt%ý–ñƒ9è× )~—Ùã1†‘eƒaØ kTènÓ¹k÷Fß}eMRùo;«X_°7z¢‡&'4Gxš nM+FŽÍ¸g©iûGæÃb´ãžñ˜Á¸ÃQxk2ñ9‹ïmâ#•Ý–¦Öž^–zZr›Ö.Á®ž^–ÆÌQºîä:©zÒ$"ŠsE~ï¿saÅ] +ï^Tydr ´šåø*ã§,´¿3MRcÃàï~èï¢qÃÑ)EúºmZ±“Ð\߃„æ·o´«5‹){‡‘““²©4ttz©'îeª‚°ï>¹¶è¦êvm‹oc3eO5ÉêŒ.h‰:±ë}ñŽÑ…©:Û#¸Nnô;™~ryE“ZÖ°zóë~B?2ˆòdz„î¿c^R>¥éÏŒ˜³äûn«É@cCÝßí¹1ŒhÜpdBᑉÖ::¹È£ä\Nˆ€Ï€‰w9‘ D>JoQ/öÑ ±šY`¡‰rr˜G«"VÒÈÙÙ”ur>deÙ9,OAÄ­,>Ǻ²Q:2QGwmUàV7ñÉÔ¹¼)ܘËÐeŒõß7¶æ¦àΩ~WÍŸÓ~1{Töí:á-š=Ðïi÷‹<ð"ôCýï–ÝOÆc~¤ú‡¼ûì20<¼[[—üÝ^ýª¨;¹æï"£éúºeb‘ç„ß’s†{/Bó6«äœMtTW%ç¿8Ù‰-G–½òhy†³ïŒ.°”ýÙ"?GÅke¿XîíT¦œu®'ê÷ž&>N~ݪ³zû/|»yeUÉk[X«6â…ä@?ëÛ ýš×+ù~ÐBYnú…ñsË”’ …é–ú—Ô' €½CrzÛPFtZe\þþ.ʸìc)¢Ã‹ÿ¦Ñùú:<¾µ ï>¡ÉZ-p+C4~' Í÷¯oÛÙ˜EŽHOàÊB@æ±n#GËSˆ÷¢Ÿ¨LJÔÑ(÷4û–ŠW4„F‹‘n¢ÜïíÈ[ZÙh5*t»¼Ý)É~OÝOèGƬÈtày><ÇÓîUÆÏ‰ùåÛj3AePÂ2Ñ•ýsUEèÕMŸ»Ë¸<ü]žÖæçï¢[KñŽ},Åkëštæ¡¢Z‡Føgh¶,BË74~ûºŒÊ?0ä7 q´ ÿ„ ÃŽÌ =];]X½©LZ8œ¾¤t4Dý®i΂M¨9Ìô×îûb,;C?§>ÉþQìç‰Y%ˆõ ›7îc__ß´ohî ìuãÈ|÷„ˆˆš,v{sz$²9p7ë9gÏs0Yy!¿åÇú9Ph@#€X >ò¨s`¸wDmeôÊrmT¥'´ìvÿBÑ‘„fRÀèŒ~è%Ýo1žTÕå~žêã2~”úGÔ˜ ¬µÈ@'½Bþn cYý®h[=mkÓÉó™Áñï’£/ =aE Ľ[Rù'D¼¹½åêº è¹…ƒ›åFNÏù³3÷žÆ=åçÄŠ{/J¦Î´2PÜ݇Ìiô ÆÔ²t…~¨ ¤y°ÔN·î×,br~l@š@Ǧ!0ô§ÇF¡¼ƒò™cÃÈ¿ß}cSóµÍY×¶X E!Ž‘·„æžh Md°ížG) ̼¦ g'Œe/Œݸ§’+†ûÉb [ÁßÛí{îyS÷`óšÏ43Vü7å¤\ÁW1ËÇ[÷ëœúY²CDõoËõgêÆ¬aVí¥ŸÜ Þ‰z—ýƒë‹l~8ŽÝÃø+[v6fêkw{¶2u"š\š 4áÝòš 4_¿²éªŠ°znÞP ÛÆ’ÐÑ¥–…ÃË }•½Ó¸·HL6ýŠR2ýô½+[#*2N‹<äXÑëëËÃÉk[1‰ÑýNÎlj~ðr™þÔÍÊJyàäÃý,ö‚ñƒòSkÀ#¤ ˆÂ´S+jÿˆB–‡F‚4$ÅOý™fÏX „¥œ¸a‚ë ±U>å¼ëšTHy÷<Ö jL6=ÌܤílΩe·p¬py´Ô2M1÷~ƽÊSP<¦SßÛ³tV4†óWýÈKKZÑ@?Uu¹ò|dÀK¤y²âFÁ{ÊúF†~I}2ò‡sÿ:ÿƒ ãç²0C Û™¬ä—Ó Ì><®XgŠ_•qyæ3sô+WKñæU-hª¯kš²Ü#oc"4¿{`ðîA9¶AÓôÉA¿V?Î.F^&Ü Ð3G·ì9“C žÆ=M;T)ø¹þ^·ïí¸?¿.„vzÑ?wóJ&PrâùõÐOy>ÔÍhåø*ÓßÁüØÔ¿r]àÈÔâËóX§ G?XÛª0æ Xõ»T½îãï²i\{#û€{@ó¿µµycÈ&Pk{]&y·]#4_¼¼acq.ÌRó¼iš]Qœ#Ç=OLp¸³NËÞbr„‘ãžJlU>¦#ŸÅk•_«5œW•žbÌœ®íf¤òA|º_d¹1ôÛݬlfü°^nLý[åíšýã³p \U“c¬·3úh{°G.¨úí}±ø»× y ˆªê -‘Ö)»ÝîžáMh‚Yº}z‰²æIÍãRqÁ¸ìÍYÌfŽ ô6 '¢²§á?–qo•žPžÚ¯UM3Qfn´}×`o½kbišßoåxzÐ>‚÷t«Fþ(ûGsDüK; /÷ ËcHJa3]{`ÿðÜŸÊ7¸Û–Š2Y°ïî1ŒÈãG*¾pŒtÐüàúök3™)oG<:â/ÈÉ‘¬¥®é9‡£¼-{ƒi9v§V•žè¸§1·h¯0¬àŒÉÄì.º#½¿£¤§ˆv©<ðÇ`‘Eu‹fú ãGæ9 õÏ­Ê÷Tä%>0÷WmëàN0ך¼Çm šª¢•¶¾ b‘ öæÕÍÒßu™=^þ.P¢¯Í!aê824Ahîsfh"oÊþéµ°ìu Ãå±Î¯ièKÇÙiÓó–!:è-w–Çhq*ºi{XNã^Î{sãÊžp¿¾-³“#=Oóï±H .;yC»Èt ôS†3ÕvQš§eúÛŒ»úçöOT€’ ø!€æ3[ª2ÐBíh@¹Šs ”„~󿺓%ÏPýnðF˜û _à4«ueI:Lt1 Jב%ç?¼¹ã– …8ȪÁe⩽ýöÆ¬ÛæXj^9²JÓë î¬ÈM`–½ W ÓÓÈáN­•‡Ì{Âýê–ŒÒÓ£™B,Èì×¢ÏúšÖ Êt`è·‡{ÝÆ§úwØ?ÊP'€â@)HZAlÀøÎÔHSíÎÙHIdY‡†ÉèßUþ.¨Ð/ú‚ñYn²»KʧaXHS„1¦”®óÎŽÖ­Uî ñ|†<òý£ ”k^²– ô‡ÃAO±* ôe/Z¦iÆ=k5òžp¿¬1œØD¶7 rj–—5…ú½^@€ú×ÈVä.ê]x浄 œ`ÐöÀ¡ÉEhð¯†cÒ ,lø¾¯nlõ‰“KÁç!ÏLMŸF…÷¯mý¢¯õ©¬Ez·~š-­†…C ^ŸÖÆ&3¦™VB5„ºm#¨ziÓë wX86G*{brh¨­ÓÈ‘$&åc¢3øéÙ;­_í%ˆøœÚr|}ŒÎüpß×¢>…õ¯ì×à`å“ *ÿå{ûaKu†Ž~ë÷Ä„3KvœåQZm:íþ.*­0 O_ërR=U¾ê®óÑþÁ7È÷üFìíMYÇfYˆWÔ ©y¢Rl½Ë¬W‰Ç`‡á*ÕDD92‡p?»ÒÀ¾·¶RÿfV ÒÓ×øÑ­YåȸéþRÞ+wÔNå JD¾è€-„éF0<<ḣ.ó;û9Ì¥ø¡ÔÉg c8²R”ÊGðKÖÆpDolnF©çÁÈÙ7*ŸüWB¼ éIÍKÊR·éU š·…Ãioeïeä îdÜšñÖ[øìñï[ ÒS:¾Z¦§Ý÷ê_D¾¤û«‚_Î  ±@dÑ!@ž€cœT„&Mž çøüšzòwcaÇ;Þ‚Xùžš.®ôÛ`hxóÔb:—<OjžØ»MïzÝÂÑi‡²·ŒfÜ_Ñ–9(Ϙ=Žsï/hÏK‹ì4~´dOù£B¿þ@8Á´¦2è(O@ìë`æÐ‘é%[j|ŒŸ„„cSŠá›:ÆRÀÜwCß*9'Bsÿì:òüŒœ«›²îTJ¢t¼°æ)Á²m,G–Ì+:ËAÏzJw¹ 6Ë^Sö±"#g]kFMàh >BÄ™ôµU™ÉëÚD®3~¤úwRŸvûGþJHø6+(p¨£àº¡¹~ºy[uÆû×µ“â'ÔúŽúÃW64¡uŠ·‘JÞ;2ŸànY5\Ç+ÃF¨y>ÇJ±7¦WŽÊÆá wº³œ¾–½]ÙÃÈYÕ>£ËjûÏþBïªf ß®þ%õé´ýO0?”@,²‚è TPÛ9@17‡è480¡ÐÏøAÄS+j¡þ)¾‹J+7ô‘á£Í{çWø9Eé'‘O ^Z5\Ç“a£!žlÅÞˆ•]ÓÛ@?‚ÅIDNޤ/ueÜ_XB#½þóôÏô+á¾a½Ä‘Ô¿ˆ|ñR/ ý úßH7Àv°=@Þ°Øš9$¹Q p³¿ñsd|!Užñ€>÷nß»¦mO{N€‘÷C‡;ÙñDSz!^³m{£™74ã„Ì‹»Ôsr´pd Ü/¬FY­Á}?ÛnªÀ×¶dä‹Ù?²ÖQmÖ|ãdé‡B|ÙŽqHÇ`WGîòÔ$Oø¢ˆäíí-°ãÿº&3*ÿ…Õ ëó¼Ðù»GäsŸUhwwVÔñ╚§ÊeÓëš^€ÞËÂQ–=u1eµý òÚåðß4ÙÖŠ‘?ŽÐ¯ÇP>m—¤íËrou `'ìW°&×›ùAZåÃKªÜZÿäÌRĪ<7Ìú¢´ý -¬ {Æ‚»ñdÍK5¯Ê©ei·é wZ8¢‡áÞ”Õö_Ü«+ë,H%ô[êß•û@'€2T ˜²€ª{j¨£€\ZÖ@gÂä¢ãÇ;Æólqâ¤ÄmMYR¯3¬“Ϫ’m”OŒ…xra¥š'ÐãˆSì'èYÖ±ËÂè×›²Ú€zy‰˜9ŒæÜœÿQÉ?êP päèV¾È"‡Ø¾ Äi ïÚ × Éñ3~"¢U8y×ð\ÐÅÀAPj žb½¯lAY’#«Ì®éuÐw)z¤µ±Þ€§ÉxŸßn^jY8鲿0”–{è`ÚŠ"7Àæ «s@ÚBbhÛ€C½€Ô9-ú(Ë’a^¸PíJ»]£œWB¼eÍkj^•S GVÚô¤é!ŸË›Ã&#­÷ÑÙÓß8(7‰Õ@«kr‚~0¾{@™CÚ6Pα}30²ˆ–òÇÛÚ³–KãFÎö!Ù ßÂ=å"lIF·dÖ¹v·Áìx¥ã]ˆ'5ï úf6«^ëLFZO£°¯>_L𥠀Yް‚øP~0õ:§TP=@™ÊÒY%L.²r” ²îµcXÎêÜ”µEi;;Ùì0÷Ò?ljunÁS¦Pðv«†Lyݰ!Ä+ƒ7M!À¼è1¨yy}:ê?û깘ïí ¥'-«OgÏ[lÍ rÚpj8v?YD”‘$Žw䀵@¶TäÖ[ˆ€—@wcÜVEÌSž™≯T¶ £jOÛiµ½¦öH<<¿:ÚŽm÷!`ßÄYG}PŒŒRåÄ™ Oá+ÓáËbê\jtaÆp½îÄ: 3Ü…ójéx²æí '5Ï@ßZÛ:»ÓjÚ#4×Ûe  ÿéüŠ4}d¾)/<éÖ:óS@öÀáØÜ!þ€ð‰5jȱ¤—,öƒ²‘¸Ñ/²¯äÌ m6…uæ³r{Æwî¼jþ+kJÍãf±VÕ¦·˜i‘°qúÿ{SVòª:¾ä!àØÜ°muh±(îý Pë/ê?£c]º­‚•&Ý”×Õüeõé—Õ¥/«I«4=ÒN\Gw‡å¡¤Kj,µt[ÈvèÛ …q&Â.rl¯-ဲçÿ*]N(J»ªN¬+í®à.¼ŽxÜníR¬Ú´ ªR LFZt¨8S^•—šx~e*ÀˆØ÷€uXn1¨!Î ‚ȶXÄ€qˆú–>#[ü–ýõô œ‹”J]·d$Oö ñN¸kˆÇ}­ªI[Tžša2ÒÎDÇrŸáä„e©€È*l¶ÒضîÏXDú™àÞÂøVö9ö¥¿Fë–#.HI ë îä¹’‚W:žµ²:mFqŠI͉gØk‘®8½(eeuêJޱÔQàÚÊ(roA›Òù Ú¾K¾XèrÒèv K¬ –Æîñ¸ ~Eu*Ö¸|£íÏ0(wávQà;&/yECŒµlÛ@œú ÏfÑ¢ÍÐÍ¥>M)uu·vW ž!ž]xó~H‰3 ’.䨢åÞ êL¸dUçƒ@­ÄÿË߫Թ®Ô î ë  KÙš˜—d؃۸I`𛏴4‰àÅ–s'ˆcÁq8(Ŭ›LJmë¿8^éÒè6½N;P] .liIÒ%IóW·§n>HI`hfâÅ aÀ[œÚ öÍ tDØ6†ÔÙJyÛ´8½^0å6 'Ö îl'WœÔlÈÖž“@c(á¼¢Äó‹’Î/f‹v‚µÜûÁ¾7pVø.ý•òwl-…rèø^º€ó‹q=ç&V¤õÜM›O6à(KKXTx^!Ã-à϶´-áÜêÄðùEhqM[(g@OR_Ê. 0qIaâÙù‰&ñÞ`³—$€†óòÎ-H\‚Åñ‡EX´ )¶ßò”ªZélÇ/ôJþFýsØïò[è»ðÕçàfå&d˜Xm/=vó5\ÈxŸ‘“pN>[„B¹lûAm ko¨MbÿE¥õ;ƒ¸@9}>}#­ÉÙ &#Íà±$ØM̶aQÇ¥úݾ1ûÄû=?ÇñÇQ™ FÝ÷ÁS7_IøFdFF4PŽé5ƒÂæ  ô ´…{ý‹ójÓûÁ=›K0 Ô€öѬð˜Txô/^—`†“Èõ; §$œ×ƒênnBnr¿»ksAFLÈu›“Û#è?+'Ád¤õk  Ó$é½%üÊ Y fÐC¿~êæâHÈu—7Ýß™‘`2Ò ´ŒÖaq@KhÀܲ¹P#KM¡®£|Q•ÉH3h¸¨LKX;í¦¨Ð´‚¸OÝ\9I  %a~,蟛eHLƒžÓC™I,Å2ÂgjvBºñjO§nî‚$€¶ S"åºÍbìù18Ý$XöÏuë0$æéöÀÍýØ%0ؕ놌´F“‘fpr&H >=p'ÓüOyê™pÓæ¸ÊRèQåhÊj "Î8 Ó”ÕžqOÝܰ‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘€‘Àé'ŒŒŒáýõ'<+++øÂ“““ýÞ^\\Ü?ozèС·œ––Ö?/W•=ÀvǸqãþ_ý@¤9mÚ´à ÏËËó{ûÖ­[ûçMÿ×ýWÀ-×ÕÕõÏËÆUÍ;×@?nOÇ@ß&ýxî.£õã¶SãñAFëÇÜÁŸe ÄÆí3 ô ô˜ŒÁc žÜ FëÇMcÇヌÖïA¬;>Ú@?ˆÛgè÷ô‡ ö‡þúÓÖÖ ˆ1cÆ_xÓ¼råÊþyÓ¿üå/n¹²²²^6®jÒ¤I½‡ZóMFFFFFFFFFFFFFFFFFFFFFFg˜êëëï룟C‡uGØ---ÁPé2}úô>ºéûÖ¬YÓå».,,ì«Ë¾óÎ;»|Ùýô}˜ÈðùçŸwG(´TåÙgŸíò]÷a¾~p†E—ï¨/ßh ·ü›è>È@¿/á®·~tˆÛ« ô ôÿŸ1xb1xb•XÐëÖ›>Ö'|»óYúÑ!6n¯2Ðï\ãù^ý¸:º2Ð'|»óY¹¹¹è Ò'?S§NíΕ_vJJŠßç×ÖÖöÉ-ãKQÔå»F¤¢¯.{Ö¬Y]¾lóF####################øI  ¡ÓSÀObbbü¾-žŸ„¡ÁWž””ä÷}ùùùïEªLL_‹ª> GKè÷ ª£úý¨Ä勌Öwë3£õ#êx÷ ŒÖrÇÅáeÆàé@{î-úqÀt”a ßs8îÂ'èG‰Û8¼Ì@¿ í¹·èÇÓQ~„~ÏḠŸ<ð ?jÔ¨ÿ/ð'===J,öòË0Ë øÊQŠàwIW\qEÀ{?úè£^¾—(¿®¦¦&ø–ûð_g̘å]˜—                                                                                T $'':tìØ±iiiõÌu tA/¾ø"õ+þéOÚ…·›· T |òÉ'ýüã)))õ6Ìu Ä*!C†ìÛ·ïðáÃãÇõ½æõFFFFFFFFFq“@^^Þ¦M›~øÃ~®ý|öÙg<òÈäÉ“ãö5òƒ~õ«_é_¤~ÿÉO~²mÛ¶¢¢¢¸#><ã}÷Ý÷—¿üEÿêýèG[·ní‰oüôÓOÕÇñŽúôzôyÅQb¾þáã?˜¶dÉ’ø^F>|Ýo~ó›p8ßoœ={öÿý¿ÿ×ïK¦¸ û¯ÿú/õueeeq¼Þ—ædõ²ôâ(® ‚¾ž˜÷ÕW_Å÷R‚.f÷îÝñýÆ/¿ü2øwìØßoì+è÷„ôþüç?÷²ôâû,|?mÿþýêÆîºë. 够þóŸêïñ½úêëŽ9¢¾îŽ;îˆï7* þ÷ÿ·úÆãÇ«oÄ·÷Ð7â+zNë÷ŽôÔóÒ¥§?¯¸K/¾Ï"*èÃðU¯ûûßÿÞ ÐW_w饗öô±Ô7nذa C¿w¤§ ¯KO^úÑîU]ë÷ÎÃSZß@?Ú‡¤½Î@¿ Bó~‹~wDÙûÒ3ÐïÎó²½·÷žÑúÝyxúÝ‘žþ–žþ~xFëwçáèwGzFë`éèà‡g´~wž~w¤g´þ–žþ~xFëwçáèwGzFë`éèà‡g´~wž~w¤g´þ–žþ~xFëwçáèwGzFë`éèà‡g´~wž~w¤g´þ–žþ~xFëwçáÐûí·Q¯H?ÿûÿoS¥ÕeÄôNm®º¼­qSÐÿŸÿùW_}µçjܺ,öØÞ¨×æzVÿîw¿‹í#½ÚäëG’Pп÷¾ô"¶X¹rewî¨ÏÞ }èþ‘#GÆ÷âzÿყ;O0ú¯¼òJw>¼/ß«CýŸÕ~víÚ•ŸŸ÷‹3ÐïŽH{_zêÿÏÿù?:<}ôQ´èéνôñ{uèëzî²zÿá­ß§ééævçûË{ ôááĽÆiéæêý,ú |»súúÁø1Z¿;ûË„´°ô ôðÃ3¶~wÞýë®» Çé'11±;ò xoߺ¹êÑмç‚2§«­¯¤—‘‘ÑCðè½Ü=#Yñm’ªßOïCÿý¯ÿÜ+ظ¹€Ã$<·ô{ì±ÞÃh}SAAÁßþö7÷½NÐ×¼ç0Ð@×æÍ›OOèãžÛÚÚüq´Öïðt‚~RRÒÚµk1éÄO÷è@Ò[³fÍïÿ{]z§ƒÖW÷ ëMYr=jëçææª/Rߎ©âêqŸªBßïE¿Áµõõ{Œ¯×ÔO¤w:Øú=dGõÿíÑþúýÿöÍž¹0Ð?sŸý~çúg8ÎÜÛ7Ð?sŸý~çúg8άÛÇ`ð˜ôƒjÌž‹æžYb5wÛÿ% …<©ýK.¹¤ÿ_¼¹B#®KÀúÏ<óL×?ѼÓH`@H 55aHõsÏ=÷Œ?~@\¹¹H#########################################ž”ÀÿGË•'æÓuIEND®B`‚fifengine-0.4.2/doc/logo/FIFE_small_c1.png000066400000000000000000000344671341615052600201670ustar00rootroot00000000000000‰PNG  IHDR;º7^sRGB®ÎégAMA± üa pHYsÃÃÇo¨dtEXtSoftwarePaint.NET v3.5.100ôr¡8¦IDATx^í ÜnSÙÿãŽÃ1Ïr:DxËXhŠBBQQIG)š¤AÔiN†Ô?”7¤Þ%‰h % Š¥PB)d:dJ†÷wö£ûÜϾï=¯iŸÏçú¤s¯{ﵮ뻮õ»×^{­)=öØ À À À ¤ÊB±0004I7.U…J»øõ00å@ì æa``’f 鯡zË«^|…¯``Re±ƒš‡€€Hš¤—ªB¥]üú‚€€ò vPó000I3tãP½åU/¾ÂW00©2€ØAÍà À À $Í@ÒKU¡Ò.~}Á À À@y;¨y€€€¤Hºq¨Þòª_á+€€T@ì æa``’f 鯥ªPi¿¾``` <ˆÔ< À À À@Ò $Ý8ToyÕ‹¯ð À À@ª vPó000I3tãRU¨´‹__000PžÄj¾)S¦l*û˜ìü¼Î¥ÿ¨ìÙ²itÀò_á+€èžÂŽ t„},Ѳìý²kdevõ±sâ@™Ûôß'ȶ–M ±mÔ©ŸLwâýe±ÃÌÎã Hœ¬%;T6o@¼Lûß2bg°üMúÎ1²-H2ýM2ÄžØÃ øf±Ós±#!²ºì ÙÏGœ&bgð»×éú–mäzîOâ…€~1€Øé¡Ø‘àXQv€ì"Ù#%DN•ÇXƒgÔ_¥{&[—„Ó¯„C¼‰7 À€;=;ËÈ^#;Oö¯ §­™QÂç2Õå`Ùl€{’xa` }; ‹ ˆ™²=eß”=XSàt-v&®ÿ¨êw‰ì-²UH>é'bLŒa\1€ØILìH(,&ÛUöeÙ½-Wbgð>«Þ?í'[ÞUgà>$^€H“ÄNbG‚`QÙ dŸ—ÝÕ²Àñ!vïùÚsŽloÙ,Qš‰ˆ¸W€.@ìD*v4ð/"³½l>#û{‡Ç·Ø¼ÿýjç²=d3ºì\›Ä 0é0€Ø‰Lìhß\v´Ìö°)óæS›eªî³Ó潇¯uÚºlgÙt’R:I‰XK€¶@ìD v4˜o(ûÌöªéR@];$±3X×;ä—ÏÊž'c׿˜n;‘q=G€q v4h¯+³½hlOš"âêóPÅÎ`ûo–¿Ž—=Ëõ‘I€00ˆ€ÄŽçÙ²wÉ~À iÍNUQwƒüh˜nJ²#ÙÁ À@@ìx;ˆW‘ÙÞ2?‘Ù^3Ut—åc˜Ùå;ÐÔ6Ý€„×ß„Gì‰= ô“ÄŽ±£w9™í!c{ÉØž2.K“{Å,vÛ}…|þÙZ$¾~&>âNÜa _ v‰ ¬KÉ^%û¶ÌöŽi":|}7±3è?;õ Ùê$¿~%?âM¼a ? v:;@gÈlOÛÆöˆñ%RÚºoŠbgÂ7v êE2; uE’`’ ±&Ö0>ˆ–ÅŽÊé²ÊlÛ ¦-¡ÂuR;ƒþµƒRíÀÔ×È–!¦Ÿ‰11†´@ì´ v4 N•Ù/¶×‹íù‚0é¢};ƒ¾³T¿)³Ug’ÓNˆÄ—øÂ@š vjŠ |v\ƒíåb{ºØÞ.]ˆ‹Ð®ÙG±3;XÕXµƒV#)¦™‰+q…ô@ìT;ä6•ÙÞ-7ôDàļÏN—bñ.Åß^µX%9¦—‰)1…t@ì”;Ì6Ù-¶WK—hè×îûÌΨøØA¬v ëslÆ™N‚$–ÄÒ`±3BìhÐZKf{±Øž,¡‹WõCì³`´ÚA­›“$ÓH’Ä‘8Â@ü vÄŽ¨ÕeÉlïW"¦û vªqñGqd¸nH²Œ?YCbñ2Ð{±£hE™í­r‘ÌöZ‰I|¸ªëòËɲò:»þ}UÙ²[ðßH~~+ß¼O¶ 3Þ„Iìˆ ÄÉ@/ÅŽœedseçËlOW¢!¶ûüE¾±Gy+”éà*·˜ìÕ²P2 Åÿæ;ðuÍ2~¥LœÉ•¸7‡Þˆ ,3e¶WŠí™b{§„2ð…X;”ôå²iu;«¾k¯å19–3;øÕ|ýfÙ*u}Í÷ÂI¨Ä‚XÀ@˜ $-v4€,.ÛMf{£Ø)! ‹PêôOùç4ÙÓÚ쬺Þd–ÝŽÿÇògÂ~_ö:ÙrmÆ€k…™|‰ qw $'vl6Bf{Ÿœ"›Ï[(ðlCÄûžYÐõíœ0Èy»­Xt›ð´cíàØ¥Hˆî"¾Æ×0&Iˆ ¶›ñÖ2ÛëÄö< e¶$äz\š ¦ÎwÖ}·•)³ÙŒ}BÝìÙ¯Év7ÁH"N3Wâ Ý2µØQòßBvŒÌö6 a` ½ÉOöHï!t,ÕcŽì(™íFºïB¨Ÿ,û™4;=„R‡n4þÅ¿0Ðщ%ù e¶ä:ÈÒÁf»>([=ÄŽ£z-)³×ÿGLKÇÔÖ@${®ljˆq¥Ní$iüˆa 9Qˆ%óue‡É®b0,=ÚLįeûÊ¢yü¡º>_vŽÌÞT a6%†:üM¾ú¤ì™$ÅæIâCH`ÅŽ÷lÙÁ²Ëô* ú¶æë²­cî°ªÿ:Ùnnb¡Ôñù룲MbŽ?uOo°!¦ÄÔ'A‰%èUdo‘]Â/ûÊüò™Æ>Û'Pmß[í™%;Pv-¢§2WËgGÈÖo;.\ ` &¼‹%âåeûÉ~ ãíœê³v Ád3c¯j]Õ>{ãngÙw•EÍ:Í“*›SÕ÷”gPƒˆ/b'ûµ¾·þ×ÖfØB¡<ˆ¥v†×Ù²íb°NýÕî d¶ÍEÖë;?“ïÞ&[­Žÿù À@l 8;J¬¶©Ü²3d¶wH,Â"¤zÞ-¿+{Rl uQ_ùaYÙ;e×ÃS­þd¢ù‡²ýe¥Î?ë"Ž\“` k:;J Óeöèát Më ¼kä?[ËÄnºMN òËTÙ‹³;$qS]ì@ÜïÈö‘-Ýuâéêúªûª²½zd[VñeÖWªøçe¯o›_V¹~Ìe«úÆf¤cnoÕº?¹ ;]—íDì( O“}Nv¿¸kýâ¶AÒ^½>O¶“l‘®AHåúòÕF²“eÀ^möì \Ûáz—ظPwìYÜO­#ùÆfØ«ˆð+^~ÅëW©Khe«úÆÖÌ…Ö†.ësPvº.Û•Øy_Ï‚Ú&0ÿï>-[¯ëà§|}ùoÙ{dÅÚ öœØA쌂ةÝòr16v;ˆ‡}±ƒØY vÎu]]Ñáú{7Ê'‡È–mI±¾Šƒ½-ø*Ù¥°:IôÜcÌ;ˆ‡}±ƒØY v>à:×¢¥êý~,_¼T¶hŒHê¬Ø9N`  l*8Q! v’yÙ‘ËÙúŽ/ɶh¾G'VœgË>&K]ÄÛÆ–ìÚÝñVôû8ú=qJ#N]‹'*vnU»Ž”qjtÅ}¦ì ²ß&Ê÷Å$ø4Ö–+›Ÿó¯éki7}Òd k±3U‰ßžÿÇø‹÷vÕû#²5?Mø»ˆ«xYJöÙ5‘ro}u£.|Ã5éG0¾èTìX£ôwqdIÿJÕw?Ù¾‚Â}ãOâgÙN²ódFÔP]§Á`ü CbÿaÀ…Øùd‰ÞÖ[œ%{.p Úf@\ÙãÜOG2ËyiÛíçzô)€ß ¸;s;w©nGËÖòîŸ~2gËÈÞ.».à>q,¦Ï"1&Æ}cÀ…ØÙ(ÀÄþ{ÕéM²%ûpÚë?ɉ;[˶«,Ä}¨ö™‘Ì·3ô¿±Zç›’VôM¥7OumÛyUv’ìþúˆõÑÍ]´»«{¨þ;âǺùîÔ®|“­¡´A«Jݪ‰0¿âõ«Ô¥ë²•ÚZ5NòË¡ûÆ|PÕ6‡T¾s±“u°K=ùÝûxÙº!9žºøŸa )âsyÙ»e7zì+¶ÍÂŒüRµ.ˆñý*›Y¨"* ]±3â‡$bÇoÎw%vì—k•ÖfÙë&LÊû…²ÏþW?±s¸Úä¿Êµ®ŒÝ÷ˆÄNƒþSIØUí+ˆ¿ãŠ+±³«$ë¼²Ÿ« %åýBÙgÿ«Ÿìí±¯túÅE\;ˆý±Ñ)æUó‰+±³y›ŠïVu å;¾P?yǾò6_ín뾈ÄNƒþƒØAì4ü²çĶ ©p©óýß·•H¹N3ð_±ÿÔGNðÔO¬o='ö!v; úb±Sœ¤‹’¤´‰ëˆ•¦ß¹¯¨n|Þ<¾ø°ªØƒM™¯ó}{[qVìqDì vôÄb§y"€§6€°NòüÎ ±'qêßœÁ|¨>òOýäÚüSTGÄb§AÿAì vš4ðÀ6;›%I>oc|ØÜ‡ê#w{ê'_I!~ˆÄNƒþƒØAì´’Ä·jaS±³[ ‰œ64ç0ª¼Ìåáºèßì8‰¦¬×ýþ»CðMÓ:Ø£8Ù&Ûì¦>÷}ùŨ­âŸªÔG×Þ°âõ«Ô¥ë²•ÚZÅ/VV+GìóýJUÛRy'oce^JÎòuúó[Cr:uIC´Tc–è~” šäˆ(ꊕ¦ßÛ¾j{(ßOމ;q‘gb'<×xJæ18Ô9¤b¿ˆd¶±æ#ü¯Ÿ#vvöÔ?L(±®#TœŽä·4ò[,qt ·ê—=%ó$Ö#ÄõüwÓßtÙ;dós¸Ÿt­Ê¼ÑSÿ¸‘˜1ðÀ ¤Ì€k±s°§dþÓ”ƒHÛÂKRâü…²«Gð~G^ÌTö#žúÇ7a(<†ˆ 1öp-v¶÷”Ìošö Á—£})¾×—}§€ó_;_òÔ?8?ŽGXNÇrùØ5NW"·“›.¤¬ó}[+1ݵs¹_:´øZVv¬ì¡Œk„ع¸Äwëð_ôÁjX%Öĺ 8;Ù:†<%ô9} 0mî6±‰å©2;èö¶ \j„ع±Â5ŠL•ÏW‡“n9Á¿øü2àCìœé)¡o l~aKÍÿâx[Ù¼<<ì ]cQÙÃ5®UEÔ䕽5µ¸Ðú9 ÀÀ¤ë %óÃ<$tKò{»n+÷K³Ã‰¥9²3p¼gŽØY³Áõšžóà4MN‰+q…ÿ0àcfÇ×^"ï%ðtþ& HŒ,)û ì†Âä™9bçÙ ¯YWð|¨‰OBû®|h;µÛ[peíÓ¡µ¡ËúÈ/‹UðùðŠ*õQùK+^±*×¹¬üòúо)Ëp¨åö )^>ÄÎjž’ú !9žºÄ#¼Ä«m±¿·ì¦–Ø]#Gì¼¢¥kW=/M‰EùpÇŠ~<+¥öµE¾™QÑ?•΋ҵçW¼þŒ¢:§ò¹ürhEßTíË¡•?(¤Ø9;ÖxýÝì!èç†äxê‡Ø§[È~Ö"¯ö¶ÖÔ±sH‹÷¨’ôÖN‰EÄÎø~…Øñ—w;þ|¿@wøHt ú¹ûo|´•{ú¼®ÿŧÍ@ž&kû<·ëóê¤ûü}⮺þ õ{ˆÄNÀl2³ãq?+_bÇÖ=TùõÙFÙ»CíÔ+A$.—½GöŽýѱóíŽî7®ï\˜{ˆÄN¨L3³ã7Ïû;»{Hì–ô— µ#P/¿!{¼ú1r]Çlž>Bì\Ññ}óDÏÑ©q‡ØAì„Ê4bÇoŽ÷%væxHì–ì7 µ#P/Á¸]àˆÉÜ·Ÿtï»ÝPô¼*5î;ˆP™FìøËñÞÖìd¿¢ïôÜwµ#P/÷Aü­ ûŒÌåf~ûÇZ÷Ÿå¡/˜èÙ 5î;ˆP™Fì¸Ïñƒ,x™ÙÉÄŽ«_Òƒ¿dßjG ^î:‚’Î4Ù2‚{§±óbç>ÝsÒ[a±sˆØAì„Ê0bÇ]ŽÏ]*à þ( þþÚË}ý‚>á1÷Ùï<°7!ºŸ’#vvòPŸŸ¦È¤üø_²+Ø)úaT›2¡_Å?¹ç¸¹þ1|oõ˜Öÿ«­;TôM•8…Xöy!ÅÖçÌŽMÔ¾’ó©‹;¤$³®ÌÇOà ƒgåˆ;H´7«\£W;Ó×Üõ5|¯CdÀ§ØYÏC‚ÿqˆA NÝ%1¶t6‹øO¼ ‹ù¹Ó«S¦|ÈCÝ^wÝq‡oñ- „Å€O±3U ¾«½LFý½Ã°«xØzÙëd·z£ø»r„Ø9ÝC7íÊ÷\·}Œ8ç˜ð&vÌIúû‰ã$ÿ/ÝoјD]«'ÅØƒ¼Ì1[e!3BìüÈq]m–«70Ò‡ª÷!|†ÏRcÀ·Ø9Þq’·é ©‘öü;1éo¶ì+˜*#t¬ÌgFˆë×ùr˜a0ƒè¾ÅÎ\ÇIÞœgõ)À}h«b:Sv„ì~<•:VîÐáxdÛìpÐ*×iZöä>pAÌa&ð-v6vœämØ‹N°xÊþì£:‚ã•9bg u} >@,‰% 3à[ìØæn:NöïŒb0B÷‘˜yšÌõš¯:gð;[åˆg:æßêóŒÐãKýâï£Ä†Ä€W±“­³ø¥ãd_i“¬‚E]¬ËYEö?²GsÓTèØ÷gçˆ=·ÃŽÆ˜ K D0}b ±s’ãdÿ­>8•¶Š‘ÅdËîqÌK"Ç®a"cÒ›€Y›ÚºG™ë\• ´ƒÁ` ,!ˆ^¿.ëÊ…Ñ‘ÄÇ®²?8椌p¨RæÏy<©M®ßH<®Ãàš8pÇ@bg ǃØæ°&¾vÎÑ÷óQEÀT)û“bç,Çí{G“˜ðÝ8úq"N0°0!ˆJö¶Ù_•£iÙ%!Üd –Ëf<\sÑ”«qßÿßbçrÇìo ûá²Olˆ tÀw±“-R¾ÒqÂß ºª‰_mM‹ìM²ÛóХș¸öGGˆ—m}T~]¦IŒønxý†˜(f ±sšãÁmà(†Ã¥ÿíd¿qÌ ‘3qI{Û¨­K:nïu.cʽÂêcăxô™PÄÎÛ'ý×÷9è!µ]q_[öMÇñw)r&îõ¢a¿«Íë;n÷!Åžº0øÂ ¸b ±óÇIÿHWæ>ùYñ^Jö™ëM%}»çF9bç޹<2¸À ô‘PÄÎ,%}[Oàj :µÁ¡ÍŠñ"²¹²›ÆÛWãî³lŽØÙϱv êÀ` 0àš ÄŽ5Z×:Lüºv4÷[c;áR‡qAäXîÉ‹¿þýHǾXd`úÈ@Hbç+ÿûl_mV\í°Ë/:ž½ EèX=rw-Ö¿Ÿêù›|ÅŸû2¸Â øf $±ón‡‰ÿŸö8Å·óS¿¿|l{(½Ov¯Ã؆$r&êrÞˆ™ úåìÔy£} ¨0£Iìlï0ñÛ ´*£»Ž!ÿ¾Lvƒã˜†(t¬N';tèŸ÷Ã{w¼ã[| a3’ØYÁaâ·h àlNùuÙÇ2T‘3Q¯ÿÎYœl µm†ÑUÝwƒ÷öyǧøâ` ±“-R¾Ñaò)¶©â¶’Í`ÈqCWB¡é}^#vVuì§5á½=Þñ%¾„¸Mì¸Ü\Žõ\Vƒö¶²ùŽï¦Äå÷·É;.À½­8svú ~Ä0àžV»¶§Áò0‡æ±mÕ»ï×QÌp7—"¥­{­•#v^êÐgßë;£´ßýà‚ÏñyH „&v^äpøFHˆ¹.ˆ±ënì±Þô±ó‡¬çB3sÔ`  ¡‰Õ¿¬â(ÊŽîXˆ±bç¯yìÈgÇ9d}Oøe`€è3A‰ „þnq4ÜÚçÀ·ÙvÄÎX±ó³bçLGœ[§Z·Íxs-M€ØQì|Çá 0#¶€…X_ÄÎX±óÕbçWŽ8¿G÷aÍ–ã‡Øÿ¨ÂŠQì|ÈÑ À/Þ–ÄÎX±sÔ±ówGœÿ˜DXœñ>‚´Qììáh0±³€7±3Vì¼5gqò?Æ›3ŽÓð¡ú³ù-ýÈ­O„(vÖr8ì[ÀB¬/bg¬ØÙ-Gì<Ù!ãû„È uJC<ÄGõ·÷Ên–=,»T6;–ºSÏvúJpb'[¤|§£Áàp@jbg¬ØÙ4Gì¸<nCoÎ8>Œ×‡6›#{`hL9‚˜ÆÓ:± Uì\àHìœ\Çi|gáN‚Ø+vVÈ;¯uÄ·%øiðÚ¯¤N¼'Ç[ýà{}îQý÷³ñS¿úE¨bçŽv–máù-bg¤Ø¹oÄâä#ñý z¿:ñηúÛTÙÆ²]d“~€à·ôûI¨b畎ƒ«¼9䈑b'—/ùëóŽø>¾›óñ! ÄÏ@¨bg}GƒÁý@ÜbÄÎH±“;s(ýÀßo€ïæ|ãC|ñ3ªØ±)Ç{ +r3;#ÅNîš0ùëZGl?¶›±ÿð ¤Á@b'{#ëGÂfÀÜ fÄÎH±“û¶_Λ!m®>xé>‹÷™ílÆvúߣdÇåØ;õo«ûö‘ê°Ïˆú ×y®Ê-廾÷W]‘m#ûøˆú¬‚ïúªËçÔï•>ê¥zÌ*ë¨Ü–>ê8ꞪÏrY®ÏëKÇè³—È ©Îƒu Yì|Ê‘Øyq¨Á‰¥^ˆ‘bgîp å«•q}E,ütQOùøå²¿”ðµJ¶ ˆ]Ô£Ì5uﯔ¨ç„µooSË\»«2ºÿβëKÔÛükG­ÔU]Š®«{ÏÉ©ç©EßëâsÕcÕ>üÑrÊoÝE]Ê^ÓŒìs²KÔýv•™´‘jÙ{uY.d±³o Ƕñ‹øÀ.܇k#vFŠç刧;âú”>°—×Fùw3™ ²UòÃù¾üUQìL´é½ë»®êüPEÿ^ä±¾1‹‹÷}žÅâqcmun!d±c¯ VIVuËæž]ä«cÆx_ÄÎHN×É;»;â:È_W.ø–¬áco/+Ô;ºðå1iݪæÛG=Ö7v±c¾ÞÕ£ÿ.¯ïc|ÕwÔ}C;ÓKN›UítÃåsO¥-P!×±“›ømã²IkfôoÕHuß*dfº¬Ûo¥·GvÚPì²Nã®#vÕùCõõ9S27‡a[5èßÏ—ñèßÐÅŽí+7è»Wäø×ÛL‰ê2o¨>?Íás8Gw&_°bÇ:†þ~å``ø™¯N˜Ê};¹bç–¿Šm!_ñRå;ö'˜…¬®9!vÖ¬‡Êœ°Ø™Ÿ3#xuàbg“!ÿ‡ØÉÝÉ9oÍÎBGWÈo;.v& íœú"vª$>9pÒ¯ƒŠ¿V©es;ðÄ¥ÊàbÙKGˆ3øª×›e"vš½]Y”ãäß¼™ÄN‰Ý賑á|…Ø)á»".‹>}fÇÅ j¿‚§9ŠÏG'Pfvrgj¾>BìüÂØùrŸyEì v†f™æäô¹ÞÆBì v¦lé``0•½VŸ‡¦mGìäŠÜzòÕ͘>¸iLcþ>b±ƒØiõ§yEPyŒÕP­ÉKÈv08lsr÷]wÄN®Ø9(gÝÅâò•-\îú±Ûv¾™ðyÄN{݈ÙIcÕÛxŒÕ-›ãòNб¬âúûƒÁáÕ>“sì÷Fì䊗ÝsÄΓ°lÆÛy!°ŒØév@‘;ˆ…´3;5š‚~E´‹_ÅÞ6è aphZÄN®Ø™t.•üô\b熦ñŒýûˆÄ±Úc€ÇX-™2IuDâj[ðœX¦.”Éï@ˆ\±³rÎÌÎkˆ3ûÎ)b§½ŽÇXíú’ÇXíú³J®‹á1ÖÖˆïTqe±3Iì< Ÿ,’#vsÀòûúÎ'b§Û…ÇXõý‹Ø©ï»¦y-±³´ƒE¿mêÈ>±3IìüaÄ/b;L¯íYÉáëíÜg³u~åø™M[šGìÔ°;õ}×4¯/v²äumǃÄ=MÙçï#v& ˜ Fˆïv̱ ŸÕúÌ"b§ûÁ±SßLjú¾kš×b;_u0H,ÛÔ™}ý>bg’Ø9e„Øù}ÇßÜW‡¤2³ÓÒ,kvÚœ;íú³J¾‹EìÒñ a¿ˆ7ªâ8ÊþZÄÎ$±óþƒÄ}sÌÚ³oWØAì<>¶‰‡99ýŽ”K2"ßÍògcu%äèçwˆ…ÄÎm#'Õ1¿¹¯»§ÆZ™ö0³Ó퀂ةï_ÄN}ß•éûѯÙÉc½¨ãÁâÆ¦Îìë÷; ‰ËGˆ®·O8ª¯ü1³ãvAìÔ÷7b§¾ïšæ·˜c­Ñ¡Ø±íýlê̾~±ó¸Øù§|ñúbg/}vk‡ ¿²¯ü!vÜ ˆúþFìÔ÷]ÓüØÉfwº,¾!×jêÈ>±³@ì\'›tÒùBÏŒ§L±£O>!{¨ѳÐq=ç‘5;¬ÙaŸ–P®š7”¯Øg§ë+‡Ÿ×â q…®õÜ®ë܇ë#v¦|M>Xºl¬Uv]Ù·[dù^]kjÙû§^N¾È;Gëß°ŸùÿA_~Q=¾2T—ù9³UW 8®êÏÌNýÙ‰Dfvþ4Ô—¬_ ŸÑwœ+ËÞ'¶™µ0@Ü– ΋–uåÆwî‹Õö7ÖåCßÝAö»˜¾¤nRüÞ±StëŸ|ù±S_<”‰™ü;'§±ƒrÉ™ùn^uH™Ø¸,›Øyi §O$¹é»ÇÉ8«$äeAì©Ø¹FíÞ¤¬F•Ó5¦É”ÝÙ€íO5­GJ߯!vÕw¼Íò"v;C»wÌÉ/öÕGkˆ«ôÅ}Õwd® ­Bãê#®]s@8_ßÛ L[Udû–)O™gP3.E¿¶CýüKjïR¬>[e~*Û³ #*gÇI|Föp _Âꀀ¯(v.Qù]ËĨ«2ˆÄN"bç~±|’,È5°QÍìú»«Â`p­Ê–:óJåV—.³_yƒìôßKv•äR¹nÄŽuæIç^ %ªETÆžaÛLâGë¿7+o•ÛPvAÆíg˜ÊÔ-–2#Ä΋ÍOC¶nmBì v";¿ÊéKÖ·– ¡?%1³“‰ K w«Ì»d‹9_efÈþ[f‹<ófla '¢yôÕ±ckkžZ0›³’ÊØ,bGèßO–­RÄdÆùKTÖÞð*šÝ²uCÓË\³/eFˆ`ßVCì v";“ÞÆŠ!·Ä8³coUŒ&”•Ë8_×ÙCv}‰ÅöáyC™kö±LÄÎ)jãÌ¡³ÊüµK&Ä.)ÄW9›%úǘëþªÌÄâ !vZZ«'ßÎÍñïB³‹úü¸á2¾8U=æäÔ—Ê%yïæ ù±ãf9ýU#•Gé?,10 ‹*{Et–‹vÆt„ÅŽÍöíS0°NU;ʤêZ›?è;»”‰³Ê­&;U6øˆu‚ÍÏ•¹FŸÊÈOˆ’Y.;õg¢ä»UsÆ#˜Ù©ïÓ² Ç8³³Á,vzÙE +ªì 5¦AÑcƒT©õeƒ{¹DÅΕj×ØÙ€,qý †häé»úþ•a@å6—Ù¢çÁï×~õ½Ì=c,ƒØévà@ìÔ÷/b§¾ïšæ¢ÅŽý’¶_ܶXôÿÉ&0=앱×{ß&«²¸yÜZ ['ñ–¦ÎOåû ŠÏq¥Ï·—ÝÒPè n‹p¼®U¸ÀOel´ÍnÞ”Ý{ËT8j«ˆnÄN}ÿ"vêû®i~ˆNìXƒõgëÖ,Óx•³= ~ßÒ 4,€ì¨‰ÞïۓعGmÙ«à±Õ¢*ó™­+Z<\õóÛuÍ7Ë 7¼T™™²#‹DY™>’ZÄN· b§¾;õ}×4OE)vÊ4ZP=YvNÒðf œ·(S§TË$"v.W;Ö):¶=Á0õÝc»Tyéº]#ÄÎðqÁ¼®¯ú¦p\Ä'³¡Grüd¸Ÿt÷Q×W=æäôY(—\×%ßÍòߤã"|ŶÊ}“; J—‡-Žú¥n;¾£ŠãS*›€Øù´Ú0vÇO}n3„vÔHÕÙš&åÏÒýž”+.Ú"Ÿ½¬DœpQ—2÷ˆPì<¿„'q_Æ]”Aì4›M‘ÿÎ-ŠwqkûšÉˆÃÖòì'ëâdô²ÖÙºÿòm)ôëE,væ«î{ÌæØz¯ÊòÞ„*ËE“r¶>ÌîÏ[€%‰fºmá÷8¿#v*øs¸È·vøm%®}å1ÄNc±³Ž|x߸xûŠm•û&!v„çÈì1D¥Î×Qy{;ìYU‚{ÙHÅÎ¥ª÷ØmÍõùš2;N ®nV=ö•-;/.ê/?-+;lÌÄN3±³”|{ˆìoeû‡‹¸çݱÓLìd?6“íqkî¾b[å¾Ñ‹9ÿãe;›ÃrvT€%‚^ LŠcUç±»ëó]dw8d¦¬ ú±êT¸3x•$rYùj Ù&9¶B(íVÝž8T¿ sfRÖ*3v}™«¶©N¶ñåÆ9þµóãbÚUr|·XNýfû¨êa3ÅÃ<®:X}>+§Ì2>ê›ãË5òúSu+ªC bÇ6i²³:Ê.˧z­T„Ø?Hì˜x{裉 Ù1òdk†ž;/Ô¿ù/íÐ}(N Eì„î+êç¦?D/v²)¶%Õ±¾èeGl“2БˆÛŒoì¯9}¾–ìrd‡Úñk>e–i[;b§?Âc{~LBìd‚Çö?±·j\ÎÜ”½—=ç´õSS„7p±c ‹?&›6Î÷ú|wY[›N–å¢l9{7˜Ç.)2L›ÚT²|ÌÌNƒ5QðØ. ˜LÍ©Þ)óõæLÑàeG ,ô|6ÿ,vì±ÏN"ÇÖ|*P‘l<}U6#NhCû Fì„*±Kµl²b'{nü$u:[ØYV„¸.W8ûx‰ÂY3{$$;1`&þ¡º½0†¸SG´—»ŠÛ¹ö½á>/ðⓤÅN&xVP§»8àÁ­p]‰O@ÊÜ;±sê1v=”>_OvEÀ,Ø›{›–ñ9e8Bb@ÜÎ+èWw…T_êÒ¿þ“¼ØÉ-B>lÏõ,θû•zc(ÔêYìØ#ŸÃecßtÓç{ËlÖ$¤¸ÖÅÿ\3ÔS¯þ Ub^BìÌ­r=ÊÂ[Û ôBìd‚guH;c(ÔÁÎêeGxÙÙ³ XÅŽÍ„l;®îú|¦ìóÇýûªßÒMbÀw|20FìØñ9ïòY7îMßX ú‚:Þþ²Üó= wù -fžÄÎùºïØÝ©õùSdW×Q"Û„ØØ£+B‹7õaðf@ ?K¶ãm£ÿŸÄK0?ó½;Ù,ÏN?Ò°ÑŽ,ˆbt,vìܱCec_ÉÖ篕=©7tI4þ$J ‰! „Ï@/ÅN&x6Ñ`gAB~¬Ux2w̡ر)ñg<¶²Ó˜O<®ÿTýö!vÔ!ü$MŒˆ 4g ·b'ć0àž^‹Lð,­ÁgÒž˜vî×â!v’ŽÅÎCº¾RôØÊÖb…ºköÄìáõªã!Æ:¹O¾øŸÃ€;z/v2Á3MƒÐÿ(p†±]®:wòu‡bÇÄÁ–­L¬†¼­ÀD ©z®Brs—Üð5¾†˜`±3p2­£÷E xîQ÷ ©w$vÎÔu—-:›©Ì#ˆÙ·TÇ™!ÅŒº0À ô‰Ä΀ØÉfyló9[@òÂe«ÛgeK„kËbÇ|ÿÖ¢vY™Hât¼ê9vÃâ¶ò9ƒ À 4c±3$v2Á³­([Hºà±ÅÕëûî-Š›¥yZÁlβ*óbc’¾Ýwl¸³‰ÿð ¤Áb'Gìd‚g V¶f$tÁs¯ê¸ÏÙ’Øùª®3va}¾E$1¹_õÜÝgL¸w š8Gh‡Äα“ žU4hÙ^7¡ «ß)¾Ö…4;öÕEZeÞ!³7³BÅßUDZ‹ª‹ÚÊçí$7üˆa&@ìŒ;™à±³•li胬Õïw²§ºîà Ď퉳qÁc«åUæìHüoíYÛµÿ¹ `Æ3€Ø);™à™ªAÌšÆ xìÊ~.Á¯)vl—㥠„Ž·c»&Çà÷«žË»ô;÷b€ƒ€r vJˆÇ§Á¦L9Hš-0ˆÄÎDÇÐ`øzY,¯KÛ~ƒìM;ö€Ø¹Lÿ½NÐY]e.ŠLž¬úNkê'¾Ÿ^%¦Äâ`±Ó¢ØÉfyvÐÀh Xc™å1qv°¬öëÓúîþ²OÉÆî5£Ïw”Ùq ±øæQÕõ½$³8’q"N0£@ì´,v2Á³±I[ÈË nõMe>*3ñ‹OlmÓ+ëøƒïpa` ,;ˆLð¬¡ÁÒ´Æ2¸[=M =§ÍNªë­)»$2?Ü©únݦ¸VX‰x舎ÄN&xfiÐÄÒa±Ó±Ø™è,ÙlILkVLðÜ,{n•¯òsd&bz|guý¦l‰*m¥l:‰XKH›ÄŽ#±“Íò¼BªU“°½pŽ(óXKeìÔ»"kŸÅâ¸2í#¦ ‰/ñ…t@ì8;™àÙZ«-€IðX]([-/èß“a›LÈH‚K7Á[b 0°`ì÷ h€]Of ac‡pÍbÇñÌÎÀž•5ØþÏŸuÿ§†Ü9¨É`Ò`±ÓC±“ žé§y<—뾫‘DÒH"Ä‘8 „Îb§§bgàM­÷;<çê~K…Þ1¨É`Òa±Ós±“ÍòÌ•±…Â]?Ö:A÷X”’N!–Ä` ;ˆ èo;™-îBð<ªëC‡ Ž$n€HÄbçqlÁ°ìƖϺÞËHé%bJLaba±ƒØYˆ[8,»¬%Ás»®óìX:õ$qà À@š v;“@YRvNCÁó}]Gš‰ƒ¸W€˜@ì vr°…IJÏÔ<—è{+ÆÔ¨+‰`Òe±ƒØË€-,–Ùã² —ÏPÙ$t“±%¶0±1€ØAì2` Œe¶Ð¸Hð¥2‹ÄÖ ¨/‰`Òf p €´(_‰˜gÉn!xÖ¿¿±ìµ(S00.@ì0³Sš šud¶ðxp†ç^ýÿ]B˽H’00U(=ÐU¹(eÓ…ÐËl² ž¿É6#Þ鯛Ø[€@ì0³S™[€,û„lv €6Ìa` m*t‘6Ä—øÂ À ¤Æb‡™€€€¤Hºq©)SÚï-€€¨Îb50004I7õ[]ýâ3|00ˆÔ< À À À@Ò $ݸԔ)íá× À À Tg±ƒš‡€€Hš¤‡ú­®~ñ>ƒ€HÄj``` iþ/п"Ñ;9IEND®B`‚fifengine-0.4.2/doc/logo/FIFE_small_c2.png000066400000000000000000001101401341615052600201470ustar00rootroot00000000000000‰PNG  IHDR;º7^sRGB®ÎégAMA± üa pHYsÃÃÇo¨dtEXtSoftwarePaint.NET v3.5.100ôr¡ÏIDATx^í]˜TUÒÝõW‰Cš!#A¢ä ’E²*ˆA1ƒ‚"É9ç ’MÉ"IŠ9§Í®»înýçÜ÷^Ïë4ÓÓLÇ©ý¾úÀ¥Ãëûªï=]uêœ?ˆÈ4t 444444’5è(ØÓÐÐÐÐÐHêHê—¬U?—þúÒÐÐÐÐ=ì(š×ÐÐÐÐÐHêHꧨ7tÔ«k¥k¥9 9 9 9¬9 `GÑ¼æ€æ€æ€æ€æ€æ@Rç@R¸dE¨ú¹ô×—æ€æ€æ€æ€æ@è9 `GÑ¼æ€æ€æ€æ€æ€æ@Rç@R8E½¡£^]+]+ÍÍÍÍdÍ;Šæ544444’:’úÃ%+BÕÏ¥¿¾44444BÏ;Šæ544444’:’úÃ)ê õêZéZihhh$k(ØQ4¯9 9 9 9 9 9Ô9Ô.Yª~.ýõ¥9 9 9 9 9z(ØQ4¯9 9 9 9 9 9Ô9ÔNQoè¨7³µzöô/…}¯ îð}¼ýïïáÏQˆ*™½žþ{öÝ]K]KÍÍÍŒs@ÁŽ¢ù 9Ð’q;âYÄ¿bGï `Çùwþùb¢¬~ u#ÖÐÐЈe(ØQ°ã•'¹]›ÿp7 ì8ÿ^ã Ä#ˆâ±Lv}oÝl544rf(ØQ°ó€‹×"V#þà„ vÜÏû^û5Ľˆ"ºéäÌMGï»ÞwÍÍh瀂 v6.B\ƒXŒø1€“`ÇýÿÆ{>è‰ÈíÄ×÷ÓÍVs@s@s ç䀂v,!f!¾Î"ÀÉn°ã~½_q-[ݹuÊ9Þk½×ššÑÈ;9ì@ÔFLD|r'’`ÇýÚÅ5®E\‡¸$_}Ýl544’;ì$)ØP¨‚à8ÇÁÝ`";þž‚ò…¼ßϸö¥ˆÖl»éf”Ü›‘Þ_½¿šš‘Ê;IvÊ"8îͱï ™=7Z`Ç}ßâ3ÍA4Aü1R_}]Ýl544’/ì$8ØÁÁ_ñ0‚ãÝóÎ ¨dÇ¿Ç츯û3|Î)ˆzº)%ߦ¤÷Tï©æ€æ@v瀂;8ä #8¾Í1nŽsg€ÉÊkÄ츯õ|þ1ˆjÙýåÐ×Ó Ws@s@s 9r@ÁN‚€æùÓ~Á±í¬€“ì~l<÷g;…u†(¯TrlPzõ>jhdG(؉c°ƒC;7‚ãØËæxvvƒ–p_/^ÁŽûó¼‰õ€(™_} Ýp5447ìÄØÁá| ‚c׿æv¸€$’ÏK°ã|þÿb ÷"îG¤êf•¸›•Þ;½wššá怂8;8„©fÜ ±ñSœœhéìD¤ý޵}Ñ Q Ü/>O7\ÍÍÍÄÊ;1;8p9FÍqêoà$Øq†bÍ·!nAäÑ+±6.½_z¿44²’ v¢ vp°ÖELF|š`'ÙÀŽûóü ÷bâzÄ¥YùécuÃÕÐЈÿP°°ƒ´*‚ãÑ“Žd›&Z¯Hœ¬®É/¸GËmÿ§›Xüobzôihd– v"vpP–G EœL€“Ì•`€è{Ü»ùˆæUmŽÐw%³MJÿ]2ÍÍ Í;Ù¸ã@,‰è8œ„''‚÷gþ÷t¢Á…~éôùºqkhhD7ì\ ØÁá—ŠàXóÇœ³Ú6IÄÇ's+”ûq÷y<¢ºnXÑݰt½u½54ÂÉ;a€r)ˆ;/ b­fÊáœÝÉé`ǽžï †#.ç ¨ÏÑ[s@s@s ò9 `'D°ƒÃ,âfÇ•9¶œÝ"‘^OÁNàû yñ(¢´n^‘ß¼tu54BÍ;€ZT3îŒXàxr"’H^«;yJº‘ŸÇÚÒõñäÝç÷#B õ˨Ó[s@s@s 29 `Çìàpú?DÄ2Ç# òµ—îþä¡ó¨Ôlž<!¬H«9Mnðœ,峄\ƒ(æÇŸñ^«ëfœ37c½ïzß5"—9ìà©€xq:ŠXBð&7|^ÒjM—¼'J¾JŒIÖó[tZ&®;“kåœùï·q5Û«ºùEnóÓµÕµÕÈ99´`E)Ä@Ä‘(V y O\Æ’üU&K¾Ê®à{b þJ¸Ÿã~½IRµõb0ý Ùr쇄\§(çÒWx¿™ˆ†º)çœMYïµÞkÍìϤ;8Ò ö!rŠšqØ €ƒÀ£j›%é ¦*ÀŒ‰©’¯Z ˜†ÿšÔé¶^†l~O¦îÿZÚ x^ Ôœaþÿ€Ïák™°_€©X½YÒ}ÈnYùúa_”G¬¯ó<>ïD-ݳ#Ô5Õ5ÕHîHx°ƒÍ¿â.ÄnÇ|c}(Åýû`tü%)V¶¨ÉÅ4ñŠêÓ%¿+ Õž%mû?/“÷#›¿ÿ¯W,}ÿ¯Òcò!)Õt¡×sÌó}^× ˆRðo­z=#S6žûu‹£Ü:‹k¨¬troÐzõþjdO$$ØÁ&Ÿq+b;‚ã¼zP†°S6½'­îÚ")Õƒš’¿†OÔœ)¥Z,–î“É¢wÿ"¾þ=ÃXóùoòÈš3R½Ë:Éçšp¿fu¼¾DÙ@ˆ¨úµ+dÐì#²íÄz?C¸ŸvÞŸÀŸ!.ÓM1{6E]G]GÍäË„;ØÌ/E\xÁ±]=CX‡AsŽHŽ+­ ‹h¸@Jøg­Yž¨qÓzé»êYyþŸ²æóe9F¿ô¹\Ý÷Y)PwŽëumä‚ì*®±äUóäŽá¯Èê½_ê=áÛߪ6DôCÓÍ:ù6k½§zO5Âϸ;Ø´©fܱñ'8¡<…;†¿*¥ͳNpc›”ڳʼn‚õçJ‹‡ž“'_øL–Ÿÿ-[bú±Ÿ¥ËØýR¢ùbI©“þ^éÀ*(+Xk¦´ë³Mflù@AOè ‡kõÄ«ˆ{…uƒ ƒÔµÓµÓHŽˆ;°ƒÍ™jÆÍóß+À àp­ ÚݳÍOûÈ©Üø‚›:s>¨¼o±Dn³_¦¼ù£,þð׈ļ3•»”*7¬7ïiÞÛ„€œª’Oû À§vçÕòøüc²ý­Ÿød øü yñ,¢Âø˜ièhhä´ˆ›qÄtÄ p²pê\¿U»‚ã8žÊ ܤÔ+)õæJe»¾-³NýEæ¿÷÷¨Å ­I£ûvIúóÌu˜ëñ üx*?®–W™¦ 䮑¯Ëº_+èÉèázýŠxq"wNÛìôóê¯9ss ¦`n ÄxÄG p²p¸^<ðyð˜*N0€Caƒ›”zó¤@ƒùrÕ½»dÀædö;‹iŒ~ý[éøä^)Ú|‰¤8ÀÇ€ïª|Ò+>œ »öþ2{Ç9=Y=\³¿ Ö :"TµY+^1= „ä\­{õÇÆZ1qFNÖ׌|Çv |ÈHÁ›*ŽÝšò‚ˆúó  h?lŒxåk™þö_â*&½ù³tŸy\.ï´Î€1 ø8UŸÀÇUí©wãZybñ Ùñ¶¶¸ÂüNý„ç-A\ƒ¸(Z›¾pššÑʨ€l ¥ƒÇÂÜŒsü¯wä<ÐëwYëݪ2 ‡Ç9V{Ê€‡ ·L?&ãý(“Žý)¾ãèŸäþ5ïI½Þ;¤À•Öõ{€»Õå´¹\ãíe›/”>cöȆCßäø|¹€ïÙ7xîlDãhmBú>zàihD:"vø ñb?‚c±z…±<¸ï»Wx{ñq< Ç"€ÃJ@B+H^Û¥Ïʳ2þ0œËßL¼ôìçrÍà×$­ÙRô8ÀÇÕæòp{Ò[\…ëÌ’Ní’y»>Òœ #ç\ßÕOñ÷Iˆ2‘Þˆ²ûõÿð‡?¤!ºä (›•5ĺ”ÎâÚÔ õõñºe³øÚ‰~ŸÒ²°6š—1jG ìðæc“üQANx oÞ³›»pmâÔÆq89@ŽprR›-‘«}EúoÿTFü))â‰W¿•&¼)e¯]гÀ¿ÚöŸ÷æõpÝ®¼iŒXö¶ì<ù³ŸðOÛP7óxyÛk’ƒ¢wVÖëÒ=‹k³8Ô×ÇëöÎâk'ú}º& k£y™¤`ç;¡ƒÈ#q0ó€ö†rÈeÖH§qoÈc»¿–á{HÊxbÏ÷Òcái©Ñc›©\ùµ¸lÐcȨ̀‡Ói*,×|‘Ü7nŸl<ü­‚ž¬ƒž"¡næñò8;·Eìd+V°ü‡E–@x$÷HWv&+ØÉìð¾ü>)×­*GåØä rá´«<•œR½ûV¹mÞIòÊ·òø«ß嘸oÃGÒ¸ßn)Òdqˆ Çòè*Rg¦ÜÐo—,|þ¼‚žÐ@Ïg‘Ü€"õÚ vìD±º¤`GÁŽñ¯ÒC%È,|á¼9x‹Ô¦cøT? c¦«H<ö9E/–«zQî^û¡ zéÛýv|!mGRmW¹@ON§Ò3Ýrg‡ {#8·^þ¶ì:¥-® ¾§Û#H"ùº vì(ØÉÖêU¸­ÆSÙ©¬`Çìñ`³â¤4î¶VòU™bÝŒ[Vñx¾”l½RZ?±OÜú™ôþk ×<òÜWrã´RåæÍ@-Pè<\sã¾^uŠTùûÁ§öɦ7¿S`îÌGF”Dêµì(ØQ°£`ǽ¿DºE늗åøCd3Ò‡&ì—Ë›/|•'›C6ÔjN¥®¥óäcòª}w~©‘Éܾä¬Ô»ç9)Üh¡5¡Æ‘u_>ÍåqO¾*“%µætéòð³²øÅOr|¾º¾³"H"ùº vì(ØQ°5°cOdqô<ÇKw"7=ò,RT*MB5Çè" cŒ¼`CŒŽß½KnYð®Ü·õ 0֠׺¥Ù ×¥XËe¶%…åÃåM`¶¸<¬°™{S÷¨ÒDiÒmŒ[u -®œ›»ö÷¶d$AI¤^[ÁŽ‚; v¢ vfå4°Ãr<Êf7¯“|'HÞŠ­CÔ m+››S¬ÅRi<àUé±êœÜ½ù3lXƒÞ?•vcKùÎ4 uWyl³TŽö;m-¶YyàÉ{ù©Øl¾ô›¸_ž9ú}NìßF ŒDúuì(ØQ°£`'Ú`§WN;[p >шÐ\?ó¤Tï Wx*L»U˜}ÛZðL²î!îejõ)Òí‘]²ì¥Osèy1Ò $R¯¯`GÁŽ‚;Ñ;5“ì,ù3¹aê8Ëtðs SU†jï8å-¹}Íy(®ÁM ߓ&‹¼ÛZ.â²UáI•@ÏS‘#úºj 9 9͈(AÙæìüÀίÉx&®9--pðå½l¬ä);6ÐÁaɶˆg¬Ür&/âlÝ{_æ¾+·¬øH#†kÐmé‡ÒlÈ>)Ón¥KˆãéÖ¤–ð iªui9õŒF¯AãQǤb·g¤@õiž±tæ«|¦Ú‡ªŸ©ð0glÀ“«ÈPÉ›6TZu])ÓÖ¿“( çöHn<úÚz°ihD3¢vl’ò©x;3ž>#­»® ì"FrM±>ݳh§°8ÔëÁëöÎâkKœ=¾K¨Ÿ5«Ó¼Ì`'6ïÿÆbßuêgÉ“ç¹ø’¾æ@¹$wó‹:£öUJå‰RúúMRmÐa©>ô˜†®AX9PþŽç¡×3Çj‰ig]’—€9 ~ñ%ýäâ‹ûÊ“³ÅìÜÕM<Þ¯‡Šzc]€R°ó‡ ¾Zá‘ÜG¢VÙ±IÊïÇìð=Ë” ÓÏ®ê¸ÚW¦ª“Þ¾*T{¦\Ö}—T|DªÇócì(ØQ°£`ǽGE»²38F¸´»i¹Å‹ð"%cúÊTuÒ§¯H,Mm»V.{è ”}ø ]ƒlÉ·ì„È$¿v–!+ÛÓYNu'oÊÀX¾ïñx1¡^›‚; vìÄì´ŽØéÑw«Å‹?Ÿ”ì?}Ń)­Ëv)õà! ]ƒ°s ø¯HúóÒ§³|Äí7Y¹l¥1±;KCñü8; vì(؉%Ø)+°ÓÜ«vU'Mñ@ Å¥à *ÚýE)qß~ ]ƒs øÝ{¤PKxª•Ǻ±“°Õ•½ÄýµwÆë·˜K°ó`<ƒ˜P¯MÁŽ‚; vbvl’ò'±<ã—÷©êؤd·%„Çä3]%9/4ShðY¨ÅJ)v'ÄãúìÕÐ5È0Š\·Yò_1ݲ“ð¨+Ó,ÔôÑÞ1ÊʶöFÑ;ܲ*–`çªPEÝ:ÐjÍ’”:sÌ—vó³R´Çnœ¸Ý_ÂíÖKJ½¹’R{¶ä¯9Ó€axŽóUžlUwìvVZ“…RgÐi:á”É·zý^I7 uUwžZþV¬ÀΚP4}\ì6m]{]{ͬç@TGÏmÎNñXª ¦¥ ®Îp)Ùhž´ù.ª;g¤9\»iìY{ð!)Ör9~™O´~¡WÐaUÇ™æ`K©‹äåW.”Âm×KÑ[žþÂ×ÈkP¤Ó3R°ñbÓ¶2`à— Øä@±UÝàA ´ Œc+÷Ù-WŽy[?eòŒùVó®]fݲ‘H¯î,~þãXº‰f}Õ5Ó5Óˆÿˆ:رÏ×±<Í:-u¹šÃèM‘êS¤ýì³ÒzÆ»rõ”wÌ¯î«Æ”ú£Þ’Ê÷¾"…‚ƒQí+TuðË=¥¶UÕI© Ó`¾h¸P \µH 6]&E®Û$i·<«‘Äkzã6LY­”[÷-M‚Þ”ºÈ §ºc·³Rðg™›¶Jí'ŽIýÑo™¼j:á´É3V«tÛ$¹9Šnl$Ò¹;[ý+°ÓB7íøß´õé=ÒÈzÄ ì< °Ó¥Ï&‹ êšÀ"‡¢ãÜ÷¤í¬³rÍ4Tw&Ÿ–ÆO2¿ÂëŽ|Kj;&enÝ!p˜Yí+wUg:<ø 6Y*›-“B׬‘Ôë·JÚM;5’i  ¹Ä–UÁæËlq¯/±î=*{½^ÕTÿŠuX/U’ZÃK=ä‘©ê ¯XÕaž±šX¾ýJCŒwWwŠ–+ ó?|'StÍú&ªk¦k¦9ÿ9+°3.`çÞ'v{©%ó ÉSj¤´›vR:ÌyOÚ ºC²r³‰hgáWxƒÑo‡kVð†CåÆjîªN#Tupð±²Ãƒ°ÐÕ+¾Jáö èa%@#±× HÇR¨Õso 6_a@-Á­§ºs¥SÝ™+EÀã*wßëRuÈQ©1ì¸ÔqÂäÛ£Ì+VuXEd5±T“f2+½º3T®h43V`çœnØñ¿aë=Ò{¤9^Ä ìt‰Ø6û°WU'7uu`ÑrÔaé8ï}i‡È!+7A;«áØ“æW9_ñ8Ï #Rö¾=R¸õZü¢·ª:ämxª:8èt ]³Ú<¦pÛuUß$©·h$àP/§p» R¸ÍZ ìðÞBoɯºƒvV!€Ÿ·¿`ü´h K€\{ø ©‡v(ó¨ ª:$%·bUUÄkQM,RsÀÎHcêTwZܸb~½Ó$´Ô%­ëNŒ [ ùåßÊ©ê¬7­,ÐÁôNj§-RÀ§p{¢ñ·J¯Ã}êü þÜlî¹O­¯žêŽig-7àµxŸ=Rºï!€+>ú¦Tuª:h’än‘’íªHÉíPÕ!G¬ý´SFwÇ£ªlˆÊÃåþ/Ç ì´ÓM4¼MT×M×Ms þs –`çÕhƒ]§~–|G®êðÀ©qÛféºôœ\¿ðY™í?²2~­óW;½—ïXÊô{CJðƒH«}åTutXÕa5§ie݈®ü»9@Y1Ј‹50÷B‘©7€_týáh¹¹w𰺃ûeWwøßÔV*qÿcz€o…oš6'ÛµXÕqHÉ®Qó6¨’ÖiÁûrÍè7ý=³Pq>ïÍXTݰãÃÖ{¤÷Hs ¼ˆ%Ø™m°Ã÷+[{Šm ÁªÌ¡–\ñºÕÒmùGrãâÍAäGV¹Ô!+×Àt½›ê~Í—~è9ôŠß³OŠõ|Éæ`DEÀTu ÐAµÀ&+§uÝaMiuÛeÔB<@ÉшÉ Mµï¤¦ºCÀcÚY¸§hiQDÒø£Ý cXÝ2¨êø²½i‘’R»ï¨yëéïN¹aÕM½ŽÜC‹ŠÝàîª;37ŸØù<Ù6Ð0ì"rg ëÓ=‹v ‹Cͼnï,¾öäP_;ÑF^Rî:‘£w¼Ü³X‚Ûbvê·[dsuvØFÀSºÙB¹uåG¦ºsÃ"Tw‚‘•Ñ–p“•ùkþ2TwJ>xиaó,v×kÐÙy.ŸÃö*¦b€ƒÔ›w™Ç½íyë±8L D#jkÀ* [FòVÜ€sox8Apjª;v;‹÷ŽÖ Åï~Ý[SÕÐe;“À·2Ú›¦ªcš7ë?jNNXg€i‚êú÷=/yÉÙ¹ Žè.ƒÐµ{¿ŒØÙ/Rv]G‡Š‚ŒU;°Ù¸Ðü #/èðÚìèTŽØißsƒ‡˜Ìƒ†NáZÓ¥ûêåæI—%$+SùÖ!+“|ê&+“³Á_ùÅï݇Ãpëõª©òððL¯êè°ªƒŠ…yÀíþ¢i‡ëù²9l µZ â+t\4"·àWxòþí¸÷ÀæÞðž™ê[>|Œ:½th lMU@—U¶5ƒš·tš_M0MP]£û3~¡ùQiÜuê—X€Qº‰ÇÛóÃ8Tì(ع`0“Ù÷ Œ¼T°“ “÷%â77ØÍÐù#â¯Ñ<=}ÎCLö~Vœ ·¯þHn]õ±Ü´ Õüòάlkïx‘•ÁÝ(qÛYhqàP4¡ŒÞñ²y,-«:l_²é;jNRr°QsNüL³ezùuk,ÿ5SݱZYåêψÐá{vÎl“N´ãPQ°£`'âçay©`'ÑÁŽ=‘u Ú`ç‘IûÌÁb¨qИF]ç½#·¯9/·Øí,‡¬Ì釬L­²2ÉÊh[ø’•Éåà„Ž9PqHšÃ”•¢¦ªƒÔ]ÕáAÚË:€Ía °DÂ3[(F´Ž*½´äEñ^°ýÄ{cÀ(«o\{RSÝyÁÜÓbÄ}2÷È£6å½aU‡mK¶/9jNRrÀQsãå=jΉ?‚é[W~,¥š/r«•Õ Ã’XR‰f2»Þ0; vìd??HÛX6Ø™m°3vùÛæ`qZXŽ»yÇ G¤çºOä6´³“•ÏXÊÊÈÊ9æè±›¬Ln‡ÓÎ2‡)y!6à±R¶¯¼«:ñÕª°MRòîפH›5–—F–× lŠh–dÕ$rQVÞxoœêŽHÑRô¤äò°ªcW‚ Hâ½Á} gÔ¼3Hɬê°UÊ–i‘:3ËäNyª:öý1\VuB5·ý¯èjî5')¹«:h•v_yθ¡3÷Ü­¬ž= °ób8›v¼?'ŒCE+;ZÙÑÊŽVv"ƒ‚tjEìl>ò_ ‹Oã¾/JïMŸÉë?Á/ïóédeü"÷UVvÈÊTÈu“•IV HVfõ•/„œ`1âL’²C|uª:l“p¤™“>l•p¬™í’2·ÀÞ\4$Õ¼4à¬ôðAÓ^$Ÿ†`‘ ‘à‘U35gª;{¤(î AŽ¥äÇÑf$‡äåôªŽ‹”ì7jÿ« £æÉΨ9IÉ· ªÃVi—¹ïH¾Ê“%oʼn^­¬SÄìLˆwàÎõ)ØÑÊN8yéç„‘—ZÙI’ÊÎÅ;ÿŒ6àI«†ƒÆáëàÀÉWy’Ô¹c«ÜóÌçr×ÓŸ¢…ê~󗸇¬ ‰8Òȱé—²²CVv´w¨¬ìÑÞ±ÉÊääÂV y!hg™‰{¼™?Åz½æ™òa;Œ ‚'g¬™Ó>Tp®>¯ÝÉ_c¦ä¯>CÃ^ƒÔfK¥Êƒ{Œ­¹Tô§"H$X$h$5lg¡]È N‘NÐ@¢,+mFUTyL‹Ñ©êdÓ¨y·åçä6äsëÚ G%_•ɦ¢hª;¨0²Ò8~ÕÉX€n‘Þàcñúa*ZÙÑÊŽVv´²™ÊŽÍÛ9m°SõêV ‹ädv&Kåë×Ê}[¿»QݹsÃ'þdåyï©’•ièè&+S1×CVÆáê(+&+£ekº=G¼Z;A¬<°ªÃŠ[cf¬75\XEª pEsÒšöKÑK%_µ©9: Ö›-•ïzÞX3ÐÃŒ:7…‡¬†,4:Õ¶Sá^ÏÉ,# € ›# `¦äH.UF£æ$%r56jNâ;«:w¢rxÍн;SÒ[Y쌓EÏ °S!`$Òï °S ñ`¢m¤¯)ž^ëR1 kÃulêõã±U³øÚB}íD\y™•ŽÇÇV—{q$›ÙÐYm°Ó¬Æ~=|IæWv©«˃ۿ4ÕÞYÝ BV†ä?ùá‘•ÙÎr‘•íŠcM`¼´%z¼ åm¯%ŠÕY+ëNª9s¼™í´ê÷½$…ëÎ6€-'E~€¼ Ýž‘F£Oÿ)NÉ ²ºSÉTwÞ”Ò}^ƒ7Ù3é~e¦ªcÙw˜ªŽy´IÉFÍÙVÌ꨹MJ&áÄwæ+‡l™æ« °ƒŠ¢»•µåè÷Ñ;Êìû©ÿ¹zº¶º¶šÑËx;÷Gìtyh‡«ª°ƒƒ§PíYÒwçWrÿ¶/¤ÏæÏ’•) ç•­vÖ):ê²ò sÀœ²2Z'neåâ½-mG×Å´³l²²igQ©F”Æ–£Ò©¨ô”»÷u±$pà Á{9NÚ|ÿæqn1á¤T¹m«äh3m‘$2mWJãGL…­)&äúxhÑ@•SÝ!H¬þN±®ÛÍšÒÆÃø•9^e¨¬™ªÈâY5·«l^®æfÔ¤d—«¹{ÔÜTu@€gå°vÏ­È9Tä\¼b5§Eèðýöèf½ÍV×Z×Zs v9`çÊhƒ{G½æÕÂ"ØÉÅ4¹ó'òàŽ/åÞ-¨îdHV>+×Ð(\ ²2« Y&+Ói›¾ZtÙ†9¨ñÊ‚}Dñž‘ª ]ת+1õÃêA¯…‡ìÕãOH¹«ÁGB‹. £hƒ9rÕ ½ÒÕ5NDZeÄ{Р¯‘SÝa;  °ÆÐ£Ræöç¤0ÌY¹–ÆpÕq¡7vUÇÑ>2¤äl5GËÓwÔœÄwV Y9¬tý:«õèâíToµ(`gºn¾±Û|uíuí5¢—ñvrìüMÀ3tÞQo°ƒƒ'õérÇÒ³Òo×WòÀö/¼ÈÊ$–:dåNóQÝq“•8>Xqa …|¶OŒQh&derD|ÉÊÆe†“…ÛÀ ”u‹ˆåR¶û.©;ü˜wUg²UM Éd[ð‰h`ÊêSóá°®h8ÇRæM‚(Pe’Ô½ç9L6½g&ãh¨IpGÇêAÁ«;lñU¾ïUI…û|!XCXNô¨ê bÆÊ™©êR2«:Y5wü¯Ü®æ!ŒšS΀²¬’Vêê%6ØIçí´¸u},ÀNÝl£·ÙêZëZkÄ.bvl’ò©h‚i›ÎÚú:_‡¿² vnš~\yîkyhç—Y‡[~ÊÊYÕ‡¬LãGrF²2ɱå]deË(ÔVVvkï!+çtØ-WIÁæ+¤ tv _½BªÞ÷²!G7CEƒU¦©çbÆœèÚN} .K>«À )Teì1F&dä-3J®¸iƒtžó®1Ïdµ„£ÜumgZÚGT)fu‡-½:’â×n0kÅ5ãÚ¥Wuо¢ƒ9«:®Qs‹”ÙQsSÕA¥Cò ֙m*‰nÞNׇwÅìTÓÍ7v›¯®½®½æ@ôr ^ÀΪh‚U¯á;øu]mš;׎< _üF~ö+s(™v–MV¦ê­Ÿ²²CVÆaë­¬ £P3úl++Ó(”#Ï´+ð(+gNV.܆í,TwÐÎ*Øl™ñ‰¢uDñ¶«¥>vSÕA…ƒSb¬xÐÏ‹6E¤®K·ÅïKíÛ6I^žÜÅŸL˜(Ûb¡tšr¸Ñsl›êÃqsuwNu§éX´ïnÞ {E–—ŒTƒ<«:¨±RÆŠ™UÕAû*›FÍ : ´XabkÍíjnHÉö¨y/’ûlþÜâƒm8ÙHxÀŽ¥·sߘף vþŽïÜEºÙFo³ÕµÖµÖˆ]Ä Øy$š`gçÉŸ%?&a8 ãðux5ï¿[½ô­ôþké‹v–‡¬ŒÃÊWYÙ!+³…ä&+³:Y™Ú;.eeG{‡deÓβÈʦBvVÁ¦Ë,¿¬† %¥þ<)ße³\ýÔ[VU‡<MRˆv7ã°¥V«RœºiÎ)¹¼\iÃâ:Ò®˜$m‡ï3âŽ\s‚6‚7‚8‚9‚:VwÚÌ8#Õû¼(…Ã? kR°ñb³F¦õ‡5ceÌCJΆQsCš­2‚[¶Ï25‡Œ§ª>Øí‹Î¸ÀN:Iù‰Ç¢ vÞÐ7v¯®½®½æ@ts ^ÀN³h‚¾WÙFs­QmLÅðW6ÁN½^ÛdÈ+ßÉ£¨î°E²ò}.²2½Xe`KÅRVv‘•£P[Y™Ó@Y™Ú9Tð5vPïõ…RY™F¡lg9ÊÊÔÞ @V.hÜЗZ¦˜W.¨)è©Ñû9¹<"ãªÍª*"¬FQÄŽ­8V¨X]è4­ž“%WáÇã*ò—!MïÛ)w?mVCÒ¸æFàà Ωî4¼:CË èãZXU¶¯ìª*b¬Œ$%‡8jN­£ ®æh›±…É6"ùR¦ªdÔœ¤äPÕ!ìÆ)Ç$M BNw‘”'ÉôgÞ6Ø™§›mt7[]o]oÍØå@¼€ü ÿ&à©ßye:ØÁÁC°Ã)™¡¯}/ƒQÝðÂ7ÈÊÐÞ±Éʬ2¸ÉÊü…Ï1hCVÆtødeØØÊÊþde»Õí,T2è•RwޱŽHk¼PÞë©êð: X!¡¶ ùGl˱ZõÀÖÏ嚇Ÿ—”ROÊ¥Ç4rzLjݰRî^sÎÃÉ•"(#8£¸#«;mo¬î´xBÊ^»VRjÏ6`ϤšªÛWvUÇ!%5wù_ÑŒ53Wó0FÍyÝΨ9?ÓCÎÐížÜïv,’òê=_FìÜ­oì6^]{]{Íèæ@\€›¤üA4ÁNû»·x‘“ùk»d‹%2|Ï2äÕïdÐîo³…¬l´wl²2U|=þLÈÊ· ºc´w ¬Œ‰!K{‡£èþdeÓÎbu•”:yË“šªNüŽšw]ú¡™ät^°Qsæ «:Ì£›g7m8ßÊ[ªQÌû3ºéÆvÓÕõ×õ׈~Äع.Š›¾4ë¾Ñ"¾º¦|*BX‡2Û9l·x‘•A25F¡6Y™¿âÝde~ee´³Hd¥w¹¯ó¶Ôu“•©½~HhÊʶöŽ­¬ìEV6F¡¶²2T„-eåàdååcȯs$­ébS…`Ë…m‡¬L~KÈdeG{Ç&+ÓCÉ!+sŒ™£èU`J+‚²°$(õcjWwŒöN²2ܺM;ËøfÙÚ;f=²ò\ÏÔO ²ržÒ¨îhpäJ*¹ ‘¼©K»QÙ:ü£§ª³€e1€Î²t>ùMVþ/YûÅ¿eýW¿ËÈmïË=“÷ÊšÏþ%ë¾ü·¬Á¿Y€çŸ±º3ß©î Rt×Ì7¥X•ñ’«¬*²Lu‰U€/SÕ!·ˆUãDÞ¨yjç@®æÐÔ¡R2ªfäFq䟣ÿxtHÉFÍyÏŽš;¤dTu•j·«¹{ÔœUANž±m×ì‘Ý~`§hýÙÑ:|¯ºéÆvÓÕõ×õ׈~ÄرIÊßD ðô³ÇìP•wâ០DŽ-‹¬ü“YÙ…Úde ö‘«ÁC9œÌ¹>(Yù¤cfå ²deË(Ô­¬ì!+›v–EV6Õ«ºó8l#3*ÊieGJ¯)d*;,K>bUç7YPã§¿ùlúñÝd#þÜðõïð ­(Z päTw†n?'U›Ï–K 6U$‚+V•LU ‹“by11Qó=Æ}ÞTu2Ë¢ªcü¯PÕ!å½ÉÚ¨9Tª]®æÎ¨9IɬêP€ÕAV kßhŸ6VµöË£ v®Ö6ú­®¹®¹æ@ls ÁÎóÑ;χ)££ßbWvžxñ CÐåQ†de´³8bl”~•-£P‹¬ÌVHède…²º„¬Ìê…GYÙ­½&YÙ´³RxPÝ! ¹4ß@¹$w©tå¶õ}\`dhžþæwÙ ³å‡ÿšØüý àaµgÍVu‡• éG”«{¬³l(RáõCU@‡í+OUÇMJÎlÔþWYr5ÏxÔœ¤äì5§“ï¨9«œ8cU‡° Öùæ=6Eìüß­ºéÆvÓÕõ×õ׈~Ä#Ø-°3eÓ{.°ƒi£Ì;OúmøÀL‘¨ë&+³á•©ø›1YùC3±cÈÊhgQu·)œ²}Éʬ(°²@ÞHIðGJÜw•‡t²²ÕÎzAÒnq´w8ŠŽv}³L;‹¾YkÍDR¡+ HWVN7 õ#+훬\Â"+ˆ˜ê€É%yÈ%¹’r?iÞm…Ì:úƒiSÐØ<€³í§ÿÉöŸÅVxXÝaåg9*AÝG¼$R‡À~b€v`8jUuоbUa^¤d# ˜•Qsø_ÅÈÕœÓw–£¼e²lÔ܈5B€UrÀRÑ"õ­ìtéÿ|4ÁÎGºÉF“Õ5×5׈}Ä#Øé-°³âµÏ‚;ç½eȹœH ‰¬ Rª›¬| ¸Y¹#«;¡’•m£ÐâfÕjï˜êÎn)zGÑaÚ5 ²2Ľ••-íÀde´³XÝ@1^Y°Ž¸‚ùRÊmÃ^UŸüŠÊÎL5gëÿ3€ç‚»•õØê“RºÒ(ËnÕ!V‰¬ª€ŽSÕ¸ 8jî’Aî•£æ %5·IɬÀQ6€9ŠDRr°Qs´1ƒšS¬‘œ/j ˆ¿åRï=uÏØ½Ñ;›uÓý¦«÷@ïæ@ôs ÁN¹hoÿ$)œÄ2æ’ŽçÒ<¹aì3…Ä)"«•NVææEV†B. 6ùëþ.xPñ×þm˜Ðéæ(+»ÉÊS߇¬L¯¥ŒÉÊ<E…¬ì…²ºc´wXÝQ(½£ìÖ±(Ș¬Ìv–EV&@±ÚY3¿¤Ÿgòªd…²ëFpCÀà «:lm5í²ÔzoªB¨YU´¯À 2¤dSÕ¹€QsLŸjÀÕäíÔ.Û%­´‰Pc5¬hÝ.R2¸:‘$%—î{HÊN½#š´’«SÄñú£Þ²ý¯N™JÅ!)ÙqÞ{BWóLGÍi®ê5'׋œ/r¿íø4 غàx4ÁÎPÝd£¿ÉêšëškÄ>âìØ$埣xÊ6_èvZØmˆ¹›¦FL(deK{'¬|«/Yí,²2ÚY Ç'+SäÎ1 õWVF; #Õ©7RVF;ËŒ¢³µÔ˜d¸24²ržR.²2¦¥²2ÛP.¬î8^Y^ùÔ´¬XáaK‹@‡í­âeŸ43UT…LU‡¤dVuHJ.j“’#=jŽ*˜¿«yÆ£æ$%gר¹±à°U©9ÑG°|ß* ¼Է²3móûÑ;ítÓý¦«÷@ïæ@ôs ^ÁÎkÑ;õn\ktvÜ•:=·šÑiêÄPÕ¶³²2§kü”•3$+ Y™z-ÁÉÊGLÅ•N yÚY!‘•…¢º]𠍽c·OXÉ2F¡••ƒ‘•ÉÝqÀÎø—>1Dåu_Ù¿“«cÀ«:¨]’×j_™ªN"šC&ÀÏÕ<“Qsú_Ñ?†¦îQs§ªC°Ü}&€•¯M°“¦›lô7Y]s]sÍØç@¼‚©Ñ;íúlK´½—ÊuXc¦‰}h©{‘•©½ƒé‡¬ÌÎMVf;‹£Èš£àíh+U²2ÅîB&+wr‘•!°çMV¶ÚYÖA;ÇÒÞ±=™ŒQ(Gу•9=å&+;í¬±/ž—ÕC'a™Á)­UŸþKŠ—{U »ªÃö•gÔÜn_e˨ù:£1Dr6IÚ$k³ÊÅjWüÄÈm"lj\'¶É}2í« £æ'‚ŒšŸ5µ³# Hÿ+ÜO‡”LmVó¼FÍi¬ê5'8æDÁòu#÷Yr.ÎNš3„­Ô(åúºáÆ~ÃÕ{ ÷@s 69¯`§{”éþøKÞ`êÃ….å;Ô—¡¨žCVžв²CV†ûµÑÞ±ÉÊä|8dåVTVžœ‰²²‡¬¼"x.²2x(“•×N‹ÕÎ  ¬ì&+û…ú*+&+~þc3ŠÎ Ð ÿ¤`ñò#|HÉÞ£æl•yû_]è¨ùI½a›ñ#W‡~b¹š›Qsø_e‡«y(£æœäcU‡­Ðæý^´ÁNºh¹‹¢tø>;u“Í&«ë®ë®9ûˆW°S%Z`çᩇüÀI½³ÞúÅàÆ DV6F¡6Yù±—¿•hcP970Yù#c/@›Nöp§¥CVÆä›¬L¬£¬\Ú£¬œ deÓÎr8#¨î .Yyä³Kêï˜ÀßÙö+^SX^£æ %5÷ò¿‚eG¦®æQ5)™Ós¦ª€Jƒ×LGÍR²Ï¨9[Ÿ´É˜VhÍÛ·øú]×EìŒÒ 7ö®Þ½š±Éx;Øù[4Ïè•§|ÀÎ\ ƾú¥ÇãaîGVÆ/v²2´whôHÅ\KYÙ1 µÈʦe“•op”•C"+C{•ˆ°ÈÊŽö'—ŒöNFd婯‹Ê2 µ”•ÓÉÊÔÞq‘•mí'w~dü²hjÅ?ÌìÄí¨¹ñ¿òq5ÏlÔÕÏÕ<“Qs‚`Žš³ªC&¶@Ù ½¬ýjØØÄ`û{·Gì\¯›ll6Y]w]wÍØç@\‚{"ë`4Àμ]¹À„Aä%ظéÃGa‹ÆMVæ/u‡¬ì…%+Ã(Ô£¬Œv«ø“•·ŒBëŒ8!5†—ªCŽb,ÚEVƸtp²2µwv˜vNº²rv•m£ÐÊÊÃ`ÿÀj—Wà@/Vqtæ£æŽÿ•¯«¹-èÈé1N‘ ± Çv\ðQs«}ùQóó]Í35gË“:M$¸ÏÃT_A÷TyS¨¬Ý>ôåh‚ÒºáÆ~ÃÕ{ ÷@s 69Ï`gN4ÀÎÓpðÎ_ÝÖÚŸÅ;½ç0ÓFôƒ²ÈÊ¿f‰¬üÈ«Y¹çºÌÈʧӕ•£P[Y™ÞMÁÉÊ/ú++{ÈÊ4 u‘•]Ú;FV(o;gqw°US¼â˜ì5o[\/ NI¶æç0®æR2¸:7‚«ã¸šg4jŽV` Wóì5ç„«:Ψ9Ídg½cUu&²éF¼£yôÈ´7¢v¾× 66¬®{ü¬ûþð‡?"j"îB´@äÖû?÷'Ò÷"žÁÎ]Ñ;|Ôz–°Qíå´ &—n³ÏèÇp¤Ú´³ÀKqÈÊ3ñ‹Ý‹¬ KNáÐøñÑÝßÈ#Ï}-aʺFYÙ‹¬ £P›¬LÁºl#+íVw¶XVXÝ DV¦öGÑy𺔕ƒ‘•½ŒB-eåÁ[>®‰·&ðwV1ŠU›Á¨ù¸lt5Ççìâ’) ˜îj^¼w`WóJ¨”±bÆÊÅÉ“2®æš£ýÈÕœ£æäh5wHɬê@…›òÞ³9þï;cWŠØÙéD_?ç‰z¯nîDˆ+6$êgÑëÎú÷-žÁN­hªí–»ÀŽåÕ¢ßóF˜by­‰¬ 197YùÁí_z++ÃO©F˜C!+×v̨û’¬l´wÜdå»]ÊÊ·¿h¦ØÎ!H…’p‘N0 ¥oV0eå`deG{‡£èeÇGr:“S Э¬ü(Z|䣸ƒSGÅ*óö¿ŠÊ¨9”’³:j¥ä†cß–&O2Sq×`:®íÌŒGÍY¥Ëʨ9շ磪ÊàC«ßµÈáì`‚ŒÍ6Öüç>ŽØ™¨›cÖ7G]³äZ3€œù>`çc½ÇÉu3ºŸñ v.Øùg4OÓîýT”kܺÉ\R!˜zŽ“·CV&ñÔ(+‡AV¶´w0Š>ï}iˆ¬ŒÃ¸ÖðãrÅãǤ2ÚY„KVv…ú’•öŽÝVAUËhïT ¬<àé÷*05dœ˜„ÿ.^u¼—«yæ£æV%@€Z@´¸ÈØÕ<ƒQó^¯{â}öõi»Ã5çý¹Å®ê°*Çê\¦£æ6)Ù5§ú6s…Á3ŽÜxøÛh›uSÏ9›ºÞëÀ÷@§2b7âÄ1ÄMºV9ç{·`Ç&)‹ع¾ß³~ãç%Z.3&—ô¢5š/‚“•'@<ÎMVf;kà‹ßÛ:Êʲòy¹9D²rÍ'"EVÆtVPeå)’cá–Q(«;.í’•á\þð†÷…Ÿ™NÞ&ðw è«:Áååãj£æ¶ÿ­:šÀ²£Åätÿ« £æð;ós5ÏdÔœ\&’·)[ÀŠàuÃ÷ø§5˜- Ã÷¹\7õœ³©ë½Ö{­9àŸñvGìÜ=úõ€ãç¿þ·l³7M/²2¯ ÉÊû~0–FY™Ú;» ½c“•²CVîÆêF›ý•••퇬L+‰{öZF¡w¾"Åz¾dx+œJ²ÚYôÍb;ËQVNV¶´wee—öŽŸ²2ÛYE*}×½gFï½âŸ¥Xµ æ1¹3s5wøQöä—©êRrV]Ím¥dVu°&T. õi)yЩ† c]Çÿ Óo]ÍÃ5')ÙwÔÜTu@lgE°ÉýÏúWm¿k8+ÞYódìËŸËŽ_D¶²åKVÆaæ­¬ £PüÂ÷(+»Èʦe“•{£-B¥Û‚’•ÏH3L5r)+;dåŠfDV~Ù8};deK{Ç&+wÜ”E²²Ë(Ô—¬\l8¼ß5êÑîx­bÕ'Bsž`®æî56U¦V0¬Qs·ÿ«:ÞþWä9‘ïDÞùO᎚“”üÐÎ/Í„Á+[”t5ÏhÔœ"‹”+`Ug-ø^ÅZ,u‘“-~.Z`g†nôºÑkhäôˆw°“`ç÷Hže¯|æ;³L[‡äÝþkß5`‡á&+Óô’‡[ŽQhP²2*Á••£Ðä:•Û»ÈÊMÁ)!·¤^ ²2ÚYneeŽ[³UÔøf¡ºÃv–©îØí,3Š"Y™“BY¹²¯²2¦³PݹgÅ»æÀw…‹ÕØA(O™Ñàû„7jÎêSá¶0ûlÿ´H£P¢·ÿU6šÃ²ƒëM’øõŽ«yf£æ°ñs50jΪÅ()J¹ü£$'ß=zO´ÀNÏœ¼É„zâZÄFÄ_¿ˆsøÿF!ÊÅr­ðþ§ƒ\ŸûšÿÇ<‡¸qi,¯—ïÿ¥! Þrí¿Ú¤àÛc­kƒ÷Ö÷cµ~¸ŽC¸×Çc¶#º .‰Õµ:ï‹k(†„8äÚã*7}×+®ÁŽMR>i°³ý­Ÿ$¥ú4?’ò3ŽxÀN8de‚‡¬ÌÊ@†de´³H’m;ó]3 Ý|ŒBmeåºPVvÈÊÔ‹a;«t_¸¢TVàá(:ÛY!)+Ûde£½ƒÑhh ±òÿ Vw“•{/;#CÐÊa;Ç þwÑšS̸zžËÆ'uZPä`â”—§rf„ç­«ª¥äfPJ¾ÚÌÌÕ£æu\Í9žOFŽëWAU§úPVuàjnFÍAJ8jþ‘ $€ÛÕ<¬Qs’Éç"¦%§ø¦¿ùƒ9™k1dÞ±h+b½IÆêý±!_ŒØ‚pk«dôwÌׯðz?ȵòs@äáõÖÆûŸ…k~ -Ãë}É÷Zcx-ŸeaÝx¯_‰%XÄ{7@ü”…kŽinº¯‰vVEìðõË4™oƒˆ ÚJʇ¾ê;¦å"+¯ÆaæEV†Z.ugHT¥7ù,lídFVæëEVžsVZ£êpõ”w¤é„LÈÊ훬Œñk‡¬\ôV_²²­½ÓîÂÉʽ–ž‘A¨X‘¿ÂàßÅjMÍÄÕ<FÍaÀÊõeU‡äpJXþW–€`vŒšÓ ~ Ä(9Å7‚‚–€c:_‡`gÊÆ³Ñ;ÿ@n_« =ÖC6g½«ëƵfìðšˆáõîc}‡Æðzìð^ßõãÈ~¨?œÇÅ,7ìôØ©Ýy•ogŽ4ì½Ý ì%+£å!+S{ÇEVNee7YüteåOÍKM—®Kmee‡¬ ÷mŽF;derN¼ÈÊ0µtÈÊÔ•)Þg» í¬;ÀÝqÚY!‘•ÝF¡¨îí[YÙ´³¦XF¡$ÛF¡w,~Ç(»ƒ“gEkO7ãꦪ“é¨9ü¯XÕ¡ÿ«:­.ÀÕ.Vº(¾hª:˜^cUÇ!%5ïÌÕ<FÍ „9½G¦~«ßñãë°j¶üÕÏ£vÇjsŒ‡÷ÅæÜ;Àýþ¿®øÔç1ŽÕµ;¬š¸¯õ…ŸgL ¯÷ˆÏõP¿Æ}½ü»ï9;†×Ï`ç[Ÿµ .†ÅpíNùÜKVyÜ÷š-Bß{³ÜLT°Ó<`§uï-~¼Ë;®ñ;¬î˜v–MV6œ LÜ,vÈÊÐW™£P íù“•]Ú; +ß»åsɬŒvVË©!•ÙÎ2£èû¤¸GY9D²r«Õhp䛣ߖöGÑÓÛYùªù“•o_xÚh±5çÿ»hé (ñ`÷¿c8jζ ׳ ª:æ¼'XÕqFÍQ]£;=]êïÁÕ<³QsZŒpzM·O=œ¾ž¶xcþ+¦ËŽ·ŠØ™«Í1Þ7Ø©æ¾6FÏÿçx‘•ù•Ù΢ Ç“9¦Ln [=†¬ íNùôÁÁÊ–í­+“•­v–›¬|Â[Y9(Y™Ú;.²²£½”¬¼Ì¸SÉØ£¬¬<^n›ÊL(õµƒ§XѺ3|ü¯ÈÕ±×Óq5Çëw5·HÉ´»à$™ãÜÕ<ø¨9ý¯êƒ«sý¯°~\ÇV¨–Q±š£þô'ëºôC#ðØ}µ3jþ™% ¸ý £Äj•ã••QsZŒÐj„M†¼bÞkc Ë;l™F:Ÿí×ï #V× `'²H vÂ__;á¯]¸ûIÜsvøÁ°qéÃá¡I,°ã8 Û¦ +?ú»Ø!ÊPY&SNüÙ( ;ÊÊYùQ(+;deZô¤¬ì!+ŸM'+;Ú;6Y¹L-ƒ’•v<£.˜¬ÌÚ&+ç«d)+ß<÷”k¾Q´î,‹”ìTu¢8jÎöU–GÍ—ƒ«ãTu øHðiù_e0jŽ{J« ·«¹ï¨9«:ÔfbÛóÊ^[½ù:X˺WG ìÔ wcH†ç)؉ì¢`'üõU°þÚ…»7% ØÙi°3rÙÛ’¯škj¿Äù‹|Úßú7YÙ…ÚdeÚÐüq–CVÆ¡˜!YV,eehï¸ÈÊl³´·ÉÊ-YÝö«¬V‹BN ¹)<ä9T*Šdå›fŸ4×íEëì«CQ¶¿ãõÿ…ˆù¸j¸Sv¼••“•ï@…¡»KY¹ó‚÷ ™¶CVÉÖ£¬ŒvVa0 EuÇ£¬2Yy›áÅS¸=GÑ×aÊ!+/7ŠÆ²²K{Ç!+_?ã-μã)zå£ÍãFV42v5_kª:E:8‚!¸šÿ«,¸šcÔœ¤ä¬š'ÃàqFùʰBçø_Í„ã½ÛÕÜ=j¾ù»ÿÃüXñá߬É6pÀ<ÚEÔýÐ2t>ãõ—…»)$ËóìDö@Q°þú*Ø íÂÝŸì‰Âá …kbÔÚÕÊâ!uÓØ}AÁŽQVþñ¿fĘr޲²›¬ìhï¬ÌC38Yùsé…vV0²rëéŽöÎ)O;‹‚y´C W…ö4¿ ¬¬œYùZ—²2*-4â,Ø4c²r§©o™ëô¢WÎM_?›Iò&ÙÙ‚ü­Qs¶û|]Í35·IÉ$“Hnü¯ ÀŠyWtw'k¦í<®æÆÿ꟦錚3Õí©Ðé-,Ø‘û„ µQËߎØy(ÜM!Yž§`'²Š‚ð×WÁNøkîþ”`Ç&)iÀS©å"¿VV˾Ïfv¼ÉÊÿ66´  $ÅY‡e0²2'™Üde¶³8%ÄvKç,’•Ëø*+»ÉÊ·¹”•oÜ+†-vuçicÑ@­3ŠŽ6‰©îee¶blÞ 쎓O~‘ T¢œ¿§]5/FÍѾ‚>‰Õôú*Ö3sWs>_WópGÍI ìeTu ~Mï/Vą̈9øW®³PÕ¡EˆÛÕÜ=jîTux†ný0½ªCÍ"iò™æî< °Ó8ÜM!Yž§`'²Š‚ð×WÁNøkîþ”H`g{¤ÁNã›Öš6Œ!×Ú“D5»mÈìxÈÊŽQh²2'wxXf™¬Œi!Z8de¶c¼ÈÊ£/„¬ £PðcL;ËTwÜÊÊ.펊ítàöO0æ°[H» *Ô±5Çz5‡ÿUQs’’³kÔÜ!%;•{žØ1ٱߠ@cåɲáÐ7‘;ÿÁw%O¸›B² ì¬ü üØÖ ëµ!+” Y™F¡¯|'޲²›¬Ì „CV¦µA†de…’¤k”•ÙÎê£ÐÈÊ;ÑBJ'+[í¬ŒÉÊ-F•ka¤éiM—„?j~ó.‹”ܤ䗤Ü‹÷fû*ÌQs2v5‡ÿ4‚HÄp# è"%5')9è¨9î·›”ì<%š ­ç"&Hwº{4ÀNËp7„dzž‚È( vÂ__;á¯]¸{T¢" v–ìþ$ÝîÀ•­êÎÀugB;~de£½óOS  ²2«Y™>£1éÃÕÕÁPë¥=™H˜õSVv‘•öŽ‹¬ÌöMýÉʯ0APQôÖçL;‹Tþde3ŠîOVn:òˆáùFZ3€ì5GŠîÅïÞ#Åц#ÿ(#Ws‡”L.“ñ¿Âµ]Ȩù¸0GÍÝ@gã×ÿ¶Hîö¸9«:T—¾ ­ÒHæ0^ûˆánÉô<;‘=Pì„¿¾ vÂ_»p÷¨D;ã#yPl;þcº‘%¦f×î;§½2ØI'+ÿÇW³JV6F¡.ee…z)+£Õ<”PÈÊ ¬ìMVÞk@D±€dåí†( Y¹Ñ“ošVš;2R›c\“[Y§‹:ÝÔ©ÛCÐT¸µMJ¦€ IÉ{gE)­k6šC€1+®æ¬¨±²–£æn°³àäÏ~Uú† F«4’9Œ×þ(ÜÍ Ùž§`'²Š‚ð×WÁNøkî>•h`ç¦R¢œ»3K»ºÓñ±Ý!ƒteåt²²£½CεwÈ!ä©,’•oÆx·CVf ©mFÊÊhgù)+#+£…”ÖÕØÎòUV¶µwš¥++_õÄa3ßêÄ&øwDj ˆ^«9ÚWNU§«:–«9Ûqå` ÁÏCÅèÃŽ‰q5sÔœDðìp5DJvϸݟºª:“MU‡&ª“Ö½i°óL¸›A²=OÁNd;ᯯ‚ð×.Ü}*ÑÀNùHƒšm°c -íêÎUwlÎØ JVþðFŽGYÙ!+?¹×jg9deÆtàî³9Yùà Éʵ¡¬ì•9¢m)+Ûdep`È…1 Â´³^€ÚYð¢JíÂê´w8ŠDY™dåà Eû|#µÅr«ª» SÕ‰æ¨ù´3ü™ªÈÓÔ'ê†ÖGÍ{®Ë¾Qs*e5wWvú¯>í$WÇäÀÎÒ—>4ØîflÏS°ÙEÁNøë«`'üµ wŸJ(°c“”‰$àiÙ}½ÕÊòTw&Ëåm—eì˜v–‹¬Lÿ¤ÉÊ»¿±ŒB©¬L£Pj²ò-óó"+ƒŸr zÆO’+Ǽ-u#AV6Ú;–²rÝÇß&x/wð½S[B›`¨`Ó¥F§Çíj×£æ¶ÿ5&û“ÑD¢6GÍ5·ý¯‚IôœrÐ3åTuòU/ÛNüi°Ó>ÜÍ Ùž§`'²Š‚ð×WÁNøkî>•ˆ`çµH‚nåÇ{qw Á3‹à%3­ßg›c“£¬ì&+S{Ç&+O†²²›¬LóIY“B’•í’•ÑNj‡¬Ì6«;UÐöau§,Ú@¥Buçþ˜p‚ö«;½‚•op)+;F¡.²ríÁoHñ'Z1ƒg¤¶™`ˆ (½ªÀÕ¤€®ænR2®³4®—×Íëççàç¡X½Qo™÷#Ø")™`¯í̳f:¬ó‚L«¯Z~´²è¹î¹ ‚$|³RÖ7“Qsú_…;jî¾ÿ¾`I8UäTÉ:ÓHŽ4ØI w3H¶ç)؉ì¢`'üõU°þÚ…»O%"Ø™Áãì•–/É[nœ_uçÁÅ'² v¶üÀQtYÚ;ee´³¼••aêRVv“•ûlþL‚’•¡½ã­¬|R꡺SË¥¬ì•ÝF¡þde»ucÆdå4|ßHm…êLD )• CJæjæ¨y]G@püIîòŒ«y˜£æô¿òu5wÔÜ;³ÞüNÊ4]`tuœªNÞrã¥@ŧN!w7F0¿ w#HÆç)؉ì¢`'üõU°þÚ…»W%"ع=‡[c .ÎSfÌÍyÊŽõ©î@hº;×<¸S6|ñ[–@¯²²¯Q(«¬&dHVF;ËWY9¬ü©h8de¶³PQ¸€AaÇ¥jP²ò«ºãVVFVviï\1ð ymßHmµ:½ªSÑÂmPÕAeÈØBÀƒ‹| ò‚¬ªÎs°…x"‡°…È`Ôœ¤d§ªS›¤dTu25G«¯»SÕÙhUuÿ«@®æÙ1jî¾ËÞ–B5gX|¯J %“«ƒªNž²ã$Ïec¶Ú­ØæÈµ·"Ç»ÂÝ’ñy v"{ (Ø }ì„¿váîU‰vªfã!AÃĈTgó”}%1Õ¶³\Ü|U§JùÖKeúßf ðlA;‹J»$·Ry×(+‡HV€Qt‡¬ÌC›žNôvºÕ£¬ì"+£ÂA«„¦N@@`à•« >bÚAéde¶³‚•öNp²rÕþŒ€a-;øwFjLn]è¨9ÚW$Só:+ xÓø}Ñ÷‹ïE.9IÇŸ2¥–SÏH›(Žš“ƒL@ øš‡vÙ¤dh4±}eO`1—ò\6Vò”=ÓÉ3äÜEˆ{ßec>w#HÆç)؉ì¢`'üõU°þÚ…»W%"Øá!ñ·l8 ^ÇkÔò]¸<¥FåÅ¡ô‚©î õ`ÈÊœÌ26–Ð`ÁÚ3å,´µÜdåµPVvÈÊ$¿Î vȰ¬îL8ú‹±) ]m Œ²rˆdeŠèµuÈÊ“3!+ÛF¡ì+ŽoÓÎ2ÕÝÆ„3 fœÔ¿ñWV^/…P±©ôð@|£H›µ¦}ÅÇP…¹p{hêtÜdUuÀ¢x¡ñäbUS`´®6jNèà£æ–ÿ•D ºC–«ù9ãÄÞ}õyã-F1VĄ̈9øOmüÒ·fêm8¦ßFøÉ³Ò u*ÖŸ÷Ònÿ«ÕàZ­ÿêwý 6jNð[¾ÍRÿQsOU‡@gÌWyJjà›oDLEü+rúúp7‚d|^°#øÿ3Š?Åj-p]ø\ÛKîkÁ¿ pícbx½G|®çˆïµ¸ÞÙ1¼Þ—|¯'†×ò™Ïµìô¹×%¬]Ì&-q-§2ùÞúNÅÕ¯„;vàÐ çñÜ®%9¥?âpÀó»SÝq¢S—ê¸-Ø)ë>ûgHUžLÉÊF{Ç"+²2¹$Yy ••Ýde´fH¼åX5‰¸³æ¸µGYÙEV6í,›¬Lšì +_Þw¿i-ùFj;Ku¹0@OÄ]ͳ{Ôë?ë¿iVÝX}£«¹5jþyÜ«@$õû‚ufÙ@‡Îæ.R2²©êŒyà ‰ÃÈÉJˆg/ ¯I|.«Í;ß7L°ã©¾Eû3)؉ì¯}¬¯‚ oÃ;¿â9U£ýÊèýìÌ ãP`5h"Wf7¹ñø´gÿQöÊY~de¶³ àoV¹ÖËdêoB<Y™¨QVDVÆè3« ¬:"+[Ú;YÙ´³Vrýœ\ï(+»ÉÊhgqj)»ÉÊåÜgª.¾Q¤Ýz’YÕY/5)«9MR¹·`-¨6íåjîø_±ªKVuÿ« £æð3#·ŠîõWsŸQóõ¹Wsÿ•eöé´¯R*N{G¿&»Ný¼ ùT6³¼³|{<ölùýC(¯Ÿ“Ø9ˆçäŽÕ)Ø ï õ~)Ø }³vþ‰Çßê}‰ÖãìôÎÂaÀqßÕˆ’¡,*w#âcçõ7¢Eqõm¶öŽO;Ëxð¬;[î™<ÓñtCVïƒ(R_²ò ²2ÛY´1xìåïŒY%M+i^iÈÊÐÞa«†DÜ@dåkÀgqÈÊä¹x“•EbúMQ¡Ø´³àCYùi¹ìþ½ÆhÔ7ŠØcê…Û9¤dØBx‘’ŸM'%£mæå•…QóV15Ÿzð)×f¹ä¯9ÓÇÕÜVJFûªlÃÙ2}ó{î1ó_‘Scy3ËC<æb óYÑ”òjydö9á߃€ðÿoò‰eøïf±^;áÆ¡Ü;;á¯o°óC€ï¿W#q)‘¨`§vˆ`çM<®a(_<®âÕ`¯ûàø½R Šõ«ÝQVÎWÍjgðä¯5KšÝ¿SÖ~úk†UžÉÊ4 =£P[Y™\‡¬üª;¡“•O%+— ¸”QV‘¬ÜÉRV.}ï^ã¹E±'ðß–cº]Õqü¯`AA+Š4gÔüö¬¹šsÔœ`fGÍ?”›–3.SÕAÅ˸šCŒ1«ù…Œš³uÏ‚R¨ÞèྣOïöÕÕÝ7Ar\úÿÿí!æd*K=‰ô™éóL å5sÒc‚€jñº vÂ?ŒC¹§ vÂ_ß`g_(kOIT°Ã_¾¿ep|…»ñÇÌ)‚˜‡ø=³eÖÖ¤|“yYÙejåð”m³B&ïû*(àI7 ý]²òÒ ½ã"+“,ë!+È„¬¼áË(Ô(+£¢®CVf¤yÈdåýÞdeŒ„{ÈÊ´’€i'Í;I8.qÏ#PèE:lÌ–Qsr‹( ˜£æˆ´àxüÕïL[pÖ3ÓQsTÝÖ}õo3A·åÇÿš{¹ö“_ ˜M©=ۺ׸: ¬;<U'˃OíÍ ”8ÿNÞ™a9P¾âq5$ÔgôÚ·d–ë9íß세…’+X_%(‡Ïù̇ð›he;¡|I²ã1ØøØüÿ‰ÿÎèù2{<æÿý?grÜÿ¾ ‚q­îØdOgÑ=¿ÃC‡aÁzs¥÷Üchký/ èÙŠvV†ÊÊAÈÊs”¬ŒvV†deG{deiºÉÊT*ö(+ßí«¬Œé,3ŠN£PKY™êË|¼o˜É+ž,¹šãuX]Êò¨9Ù7€˜mª: j“¿DùL¬êÐjƒ–^®æh ’üMø$ÁéOFA’’)ôH¹T¡Æÿ -GÞÃI{¿ˆ]nZ6Ðñáé”o:_foû T ã<Ž-Öˆâ™å«ÍçéŠÇ’`è}*†ò9é1 vì¸ó]+;áçƒVvÂDµÙ±ábÃ_â³éoÁ—åµñ¸¶ˆw³r|û0¼ Uç¯zkÝ!,;€'¥îi|ÏY}þÉÊŽöXNÿø)+»ÉÊhg±:1h÷·b)+;F¡þdev9ŽÍ±l²²CV†öŽ·²2´wЂʊ²²áÚçWòôØgˆ^Шù‘ ®æÁGÍYÑŠÔ¨9ïAkÁúsm ƒ©+Vt ÐaûŠ„äÉü_@>ýÏ}qifù‹ÇäBhï–_ø3þ;Ó*ff¯lÿ®`'üÃ-”\ÐÊNøë‹µÓÊN”ñCB¶±ì_¹؇ %ø[†òåÄã*"v^À¡äu ÍÝyN*^½0ðxø;V…‡€§ ÚZö|éx¼ÈÊ_dLVv´wHV¦öN†deþô†¢G”£¬ì•)Æ>Y™Ú;¬îl3Dæâ} H詨ú˜ªÎõ[Ðö²•’¡ÙÃv5|¨åcž‹êý¹Xb+ŒÜ!ŽÄW†ð¡„Í'ÈŒ€ ü¯H´¶ü¯Þ5Ÿ)Ë®æh_‘ìmª:G~ÁˆºÿU°Qóåþ]¬¦ÔЩÊ€ŽMH¶x:Sv§É#½Ù•Ox7„˜Ë%ñXïYÚÊsrÚc섇’+ vÂ__;á¯](¹è1‰ vÈc¸qQfIALFdÄó ëÐÚ|ä{iw÷VëW¾aÙ<êÏ—^³Žú©ï’¬¼‰ÊÊà‡¤++ÿjÚ*l¯°Í2 ÕñYîÜFVî¹Î¥¬ŒÏuóß—ö¨î´ö(+»ÈÊŽQ¨­¬œ1YùE#hµ³¶´¼bZY¾ANOjg Ú¤d<¾è­´Iɰ…(ÞU!€¤÷í7“`ePUâTW¥GQÕ­í-89F} ‡”LA~~–ëP± wÔ||0WsŸQó1/}.¥Rƒ©R±å"™·ó£°r&pô S#³¼¶AC<¶w(ÍiQ°ÙEÁNøë«`'üµ wKX°ÊfiŸâÛ˜ :¸Î8,…kÁ)àI©7O®ê³CV}œÞÖò#+S{Ç&+Ï…²òL(ú:de’jG†JVv´wl²r;(+;de:…³bBëZQ„`þW!ŽšÓÞÂ×ÕÜŒšã3dÕÕœm?*Q³ªÃêØTu<®æPJž÷ùÅþ*ËÏC@6”¸}Ú›R Áü@'}òª}Ÿ­Báœ"ažÄù"¡äº>Æó vâÿ/äŠL[‡ÑZÛ$˜Æ:î³¶\g_e]UPFû& ÀÎ!Ÿ{]0Zß“pß'iÁ‰&ˆ@$æˆR žûX*Ã;ËQXvFÒ OéÖ+dÜ+Ÿ{ÚZÉÊç~5ñìwþ&4 eÛÅKYÙhïXde£½;Ž¢ßå(+%+Ÿ1ãÛ£P²²ÑÞ FVÆÈxÑ[-²²1ï$xñ Vt›q¯‡­ïáû`¼¬O‚Ã!¬¯‚Ü”;ogr¯‹—ïQ°ëH:°ƒC¡ bC„u=ð¶ûA:Þ¿#CÀSðÊùÒcú›ðZ²ÆšÝdeZ¸ÉÊlgM}ëÏ21Y#Õ‘•9©ä•ÙʬŒv7C!+³-EÀãf<®æŽÿ•¯«9|¸Hlfõˆ‚†WŽÿU8£æU$Às»šg:jnû_™ª@%«:Cwž—R­1m•Щï«Ï6Ðq¿ßät›xßPâéú°9D|™É&­`'L¢(Öµ§‚ðÚ1 vîQ°æ%»7E¹#ÿˆÐq¿ïà9G$µ.H­.ÑÁô H¯àñ4¸k»¬8÷7Ãåñ(+g@VfÆcš)Yù¼1Å4de´³‚‘•YIaE…|™ŠàͰ\YÕ¢1<>a€ Di$jgmR29>pY7¤ä0GÍé–]£æ‹0j¾X]Ÿ:(ŸŽì‚ØxÈ+\ ö:f⾃ újÄÇlÔ vB\Ë€¤Ï?üa*Öö·,€mc%`‹÷ÿ›ƒøW{­•ì5^›)ħqryÅE/~"W´‡­@PÀ3OJµZ!c^úÌ8j»Éʬ8,ŸÄ•aP™!Y™F¡»¾GYù®§ij‘•»±º*YÙ1 u”•LPHD.Öë——,€C  R t‚ºšãuÀ2¤dTu,Ws‡”|̘•Öý–Q{n:Á5o=ý]?WsŽšSD1ˮ樎¹]ͧ¼ù£Ôé¹Õâç ½ÈÉ9ï©«¬>6ïh¼€÷uhß=ß­dxlÎ!nAÌMãå3âÚžð¹¾Ü׆Ëàú¯õõ㚊#†Yßxjc=à{±Z;\Ç(Ÿk¹Çç^§XϘWvqM%´„ðý.M‹ÕZ†ú¾IÓÆÂæßñ¯x<[ÿ ûîr{,½Wˆ²¢ÀÊ­“Þ²£˜QVvÈʨ@¸ÉÊÂ(ÔMV ÷ÑÝß½‡v~iõh—p§£¬ì&+Ï{O²r‹É¬\ËMV&#²²™ÌBõÆ/ ´lª:Ùà±ÿƤDK¶­tptŒ` 3^>C®è°\¬Æ[>Ù×ó4þÌÔÐ6ÔM@^+B×-óu PˆYeGïWæ÷+™×(iÀo€–ˆ¬˜'Fí0ºà¸¤Õ‡§Eél¥åê¸ð°ÂP÷Ž­²ð?Ëú¯~—Õ˜ Z~þ7Ã+ ‰¬ì…ÚdåÞ‘•¡WÓF¡ÁÈÊäÑ'+¿lUol|#à¨9ÚWFÍAJ6jÞ2œQs|~_WsŽš“”LÎ'Ûfþ‹\7bŸUÍ!?‡@‡÷À:¶`à ?+©q t&àºT@ðZ/ɼ¡ÇÛgS°“³F<åcRð\--œK^úTjt\é<¬$°ub* l¥ ÒÀŠÃÐ˺/¡½ã"+;Ú;<¸y€ÃA>êÀO2ÜQVάü±áº¬L7Y¹©—²ò #êGq?CVF;Ë­¬LœbÐÊI¥Wø9¾aUuÀçq¦µ¨´ 7uCJâjÎQóúPun8ö¤©4±ât!£æô¿ 4j>zï·RýÖÍé@Lj:@Dz€Hk0G†-<¯ ‡£è÷ÆÓæ¡×¢Yf9 `Gs$³‰Ö¿'رOq Çâñ—ù¶?J—þÏ{[mÙik±òpã˜ý‰þ§¬ÀXôTwÐ(Ú0äP+&Y™íº}ß»åsév¹-´Sð'+Ÿ5ªÄT'v”•ÝdeŠü#+§uбÇÌÓÿÜ*EÑÞ²HÉ–$)‚MœôÊpÔ×Òrê;Ò†‚s QÄw5wü¯25¿Õ»R¬Å2»m€Ÿ SóºU²ôåÏâèÐN¢C´6}= ²+ìh.eW.]èë$%رO^{r%.°'—¼%EQI°´x\<VPå!à©yÛf™qô'3M²2ù&!“•·aiïØder]²r'*+Lx”•¡½Cb0+,tçx7YÙ£½c‘•Ó`a©%{‡!-³ªƒêñÏŠÀ¨9Ûs¡ŽšOÄôZÛÇ_ón[ùòs°þ7 |ABããš¾BÔ¾Ð/º>_X䀂Í»Xä] ÷LZ°cž‹pPÌÓCL–¿ú¹Ôê´:H[Ëâòk±Tú?ý¾¥¬ì&+S{Ç&+‚²2Û7C‚’•?5L·"+O?cZGY™žTY¹2••]deVh`XÍ1¦Ÿ>Ab²Çÿ*+£æ¶ÿyDmÀ'ê0ÇåÌÕÜ!%ƒ«CR²t¹š?þâRµëFW5Ç¿mUìʹ2béÛñ rx]ô}+/›…^‡\YÍ;š3YÍ™H=>©Á޳h80"þ gû[?É̓^ôok9äe›Ësí¯£²cYÌF;Ë£¬Œê§Ž¨ÌŸÊÁ£P•M;Ë&+w¤¬ì•ÑBòVV†öª;²2ÆÅÉ»¡'>‹\»Ñ/Œ–§ªãò¿ò5‡ÿUGÍï\xJÒš-I'!¨æÔ¹~µ¬ØŒÇœ°¯é%ü™©/¾¾®BÑÈ;šgÑȳPÞ#G€»ÊӇǯñz¸Z~RŠ7œ—a•çŠneü¾oýŒBƒ’•¡½ÃÑì>›?3£Ú=ÖB{g¥?Y™z6ÔµqÈÊlgÕq8Y¹ÜÍ ·ßàÆÙ< ®æ Çv5wÔ|$ŒR[ xÉän¦­@B6®å3ä–Á/ÊŽ·Šg ³yzq(_`}Œ&ñ’6ƒιµvfÅËõêuä¬ïNŽ;6ài„Cä‡x<+_ûBêÞ¸6@•Ǚؚ+iMË}+ÎdJV~퇬|_VÈÊŽQ¨­¬LÏ*‡¬L1@йn“n»Î/È×1¤ä £æ|­@®æáŽšÓŒ.ðOäôßö©\~ý:[ Ðg¤œ ÜœWÍ“Ñ+OÅ3Èùró Ý„sÖ&œ,÷;°óo<¦^²|^ý‰õ=ÍQ`Ç<—ã@ù ^+݇ :QczÖ–%FØzÐËpD·Œ-'ÿ“1º}ð'sð Æ(úGYÙ‹¬ü‰æ#Y™B}n²2AGS‡¬ 5ã`då"7JáÖkk]±FŠÂÂkÔà¨,ü¯.ø¦!<ÿ«ÌFÍamA‹‹nË?’ÛÐvë¹þW¨J‘”lQ­¢Ø Ýß ]ÍÉUºyÆq)Òh‘màé#hkçÔ»q¬|ý‹x:TE¾]7ÐÄÚ@õ~¥ß¯LÀ-%ÑõÒüŽUä8°cž"8XÄ+àáu]u•ˆ¹éÊˬNP—‡cê†Ï3G*¡’ñÄî/-£P’•öN:Y™€ÀKYí¬;7„FVf‹É!+›v–‹¬\¤ÃF)tÍj¿ 99Ш9ŸÐÕÜŒšƒ”pÔücCªæõRšÊо£æ½ô4zàùtcZVPAvZV:·}9ÞÛVt6o«M@ßW ìÈ€™JˆMb4-%²ã=ô54WÃÍ vlÀ“  e÷ãö×þê=_Jƒ®hkÑ[ \G}Ù zR-;ç¿-“ÿYž ‘¬liï ºƒê «;äÈpŠ“PFYÙMVF;‹­'7Y¹ø:…®^éôÏ ÛÕV4,eU‡š@¼>Ëÿ*ð¨ù½ëÏI¹kW[ÀÏrl»»šSm«qkNÇíýµsï<þ¬îXŸ§›¿æ€æ€æ@æ9cÁŽ xþˆƒfb<ž'–Ã^–”êÓÒ«<¶å„ô4ëû¼Œ;ø£©î°å§¬ì!+žNVF;ËWYÙMVv´wHVf ÊQV.Òn½l¾Ü/HNös5‡3+Cg¯‹±ö+Ǥ“’Ã5¿þ©ÃR˜Nå¬rùTr 0¼bš\ ¸zï—ñtŽ ÷ŠêF•ùF¥k¤k¤9 9p!9£Á޳p8pîCPŽ?nǧ־#%aZ y°JOùkWÉÀíŸÈX…Bs††˜Ô qÈÊl9då;Q5a›(Cee‡¬ R“F¡6Y¹HÛµR°éR¿ D`Wóà£æ´®è ‹ëQÕéºôœx¹š£}ÅÑù1BßïÙ¯¤ïŽ/¤^ïÞ¦6ùØ9\Ÿ;†¿*‰ñ|?qmÛy.äË«ÏÕÍ_s@s@s ´P°c âà¹AYþ¸=$×îûJÞ´VòU›ôÌ”B æÊ-ÓŽÊhhï„LV†›¸›¬LCVnDee²rj›5R°ñ¿à$V)¨-—…§Iɬ™ªÎðã†ÿCÅ iQA«Š¶h›];í+«9HÉ]Í¿’žKÏJ™ÖËÓÉYݲÛU8\“Rh[MXw&nïŸ+·fáïé&Ú&¥ë¤ë¤9 9p¡9 `Ç垌¨‚òüq{`î:õ³ôzòUÉÃÝzœjÓÞBµ£aŸ2ì•oÌ´§–²r_(“ì{w ²2ŒBYei7무r)+{ÈÊ-/EZ­–W-ò Nb•ÿ=µ*¹HÉuÀûi0úm#ZH§õLGÍ7€«ãTuPj7b¿!Ûèä8ÇnWq òU*º­—µû¿ŠÛûfç…-u"EËußÕЈrè‚û,8£2ˆÓñ xxm“Ö¿+¥1­•¯êz¼«=ÖØúe¨„<°áà ”•£Ðåf•IvÈʬº#+§^³J \¹À/JÞ³GÊeã¨yŸ§ÏKÍÛ·XÇUÅq*9üì)øì½G¾&q~Ïþë»áBèóõ®æ€æ€æ@Ös@ÁNt‰C)ñrœž²þÀ×Òøæu’¯Êd@ | ¯Ç®ö·ó؃F{g´w¨QC­KY9Y™F¡àÒ"+S'§HË–J±O”¾w¯q57£æ¨‘çC'u’’MU'“Qs*<;£æÝæž–’Í—Xü$ûó8Uó9ñ™Ë4š+Sž>ï ‡×÷¢¡nPYß tÍtÍ44²#ì)¥ápº±<Þ+wzMRx*ô ÐÚq·¹êöÜ"žýRÝm)+;dejظÉÊ]—¢º²0¹4mÑÎ"·†›Æ.²rêÕËÎo\vÿ>ã¥Å1u# Hÿ+XOpª‹V4e{Œm²Ž5')9Шy‹Áp*¯‰jŽÍÅ1ŸÅ?cåIÒô–õ²þà׉tÞC•ÏŽ/«¾†núšššá倂Lú†8¨žDPÆ?®Ö©Aàm8GòUšdÀ@ àSªù"éµüÝŒ••²²£½c“•ɵqÈʩ͗š‘oß(ûÀ¾tRr€Qók2q5¿}Å9©Òåi«-àð³ÔÝ3úu´­âû~Øù²ÒÍ)¼ÍI×M×Ms@s »r@ÁN$)X=ÿŠwÀ³áà7Òm­¼'šð>¨Œ€^O»a{­v–‹¬ÜËWY9²rjS´—Hv85åÜ/Uÿ+TuHJ¶ª:§Ñ(ÛbÁFÍ;M9!EÍ·ª7N•Š à­’õy.»jŽLßü^\ƒNWެÃß/Í®/ª¾Žnúšššá瀂À WKÄ/ñxXñ¸wÌë’B€pùðñ?Õ»mû7"bÚ‰Z6½7&+›v–MVf;‹Ü›T˜‘ZZ?ÞQ±ïþÀ£æ“35oÔo·!›Š”7“<×m>¢Å­ëåé7¾I 3^7¥ð7%];];ÍÍìÎ;!‚ðTØù$Þ¯² gKÞ OYaƒ†ôªÏD)Ži®[çžÊ€¬ü¡\ç•ÑÎbu†Ü›Ô&‹<`Î$ÿ¬ôð~CJuÔüÆgåòŽ«‚çºS*NÆíICaÊ>Ùý%Õ×Ó_s@s@sàÂr@ÁNÀŽ xŠá@;š€gãßJ‹[ÐÖ*7^ò–·ÃüäG5åê/CYÚ;.²2•Œ²rG²rj£…ö˜Mˆ¶ÛNU9àíjî’) R²´IÉmƼ)EêÍJaÎuñOûZˬÍÜò~¢¿ 'Úé†ta’®Ÿ®Ÿæ€æ@$r@ÁNÁŽ xòâ`Û™€‡×ø *#)—?%yÊŽðaøƒŸÊ×­–;VŸ“»`¼ÙsÝ'Fɸ[ ²òÔw$õªùém&›ÄŠQµƒŽšÓh”U¢}(uïÞ%ùP±1Õ„ñOsmãpc¥e÷õ²ñð·‰t¾À:׊ÄT_S7~ÍÍÍ Ï;a€ð\„nN¢žY¨”k0Sò\61Ö †0øgZrý”câ•o]ÉêÎ9¹Þ!+C{‡£ãiWÎKo¹*2ÕÌpÔ¼ÃôÓrY«eØò ܘkµ¸|¼ô}jo¢€^çID)ÝŒ.|3Ò5Ô5ÔЈT(Ø ì87Ýmâþ€Þ„JÉ5·®•<¥GKž2 'lðS~œ4ºÿ9¹Õî«ÝÊʶöÈÊiðßòª™ªÌx©1è—«9GÍInfU§éÐýR¨úT/`cÞ›×ÀkÁ5Uh8Kælû î×Ñu¯_ÄßóGêË©¯«¿æ€æ€æ@ö䀂 ;v•§ ½_ððû¡rR ÀM©QN8ÈAå[/•n‹ÎÊ­hgÝ´ìœi?9då´úsìJŒS‘±þ¬=ø £Åã5j>ë]¹¢ûVÉËÊ ØÀÅ÷æ5 Z£mµùÈw‰tc-ÿO7¢ìÙˆtu54"™ v²ìØ€ç*~ß' àa¥|ýé’»äÄHO8àƒ®6IÚ~C²2IVN±Ø+ÞQwÈ!ËÕÜ5¿zü )ÙtÐX¯þ^|ß”²c¤ÿ¤}‰r(094’_J}mÝô544²7ìdرO„$ àÙüæwÒæ¶u’»ø“V”`ü8 D€R÷Žm¦ºsã⥔•ÓêÎôHXª÷øWóúýaa²Sî×äßí÷»¼Á ™·ãÃD:¿áÞÞ¦›PönBºžºžšš‘Î;ÙvlÀSâþD<¼Î¨¬(ƒŠK±áÞဠüY¦é|¹næi´³>´Ú¨¹þÍù{ƒa‡VÅ7XÇyŒïë.í{¬—-G¿O$ óÖªY¤¿úúºékhhd(ØÉf°cž\8ŸN$À3–ËëO“\iÃ<‘»è⎂ÆJ‹!{¥h­iøÿŒ|¢Î#¯KQ´¸|Ÿ—+í Ïk(=R²?‘@¯õcDeÝ€²Ò5Õ5ÕЈF(؉رÏq@NH$ÀÃJKûîk%W‘¡é‘Š¿»"7€KTlr¥ùDTsÜõüÝ~½Jõ§ÊÂgÏ%Ð9Œ{˜/£¾‡núššš‘É;;NÂâ ¼A„9äMF[«ÄpÉUhˆä*ìŽÇñß¡†ý<¾¢cÏõ²õØ ³öýÚŠ?sëæ™ÍG×U×Us@s Z9 `'Â`Ç®òtÀ¡ù×D<¬ÀTª;Y.-8ñXØQ Ä2dÚD9¼Þéˆ?F단¾æ€æ€æ@är@ÁNÀŽ xêàðü*‘+1o_+—¦ +ªÔ›"‹Ÿÿ8Ñ€Îpú馹MG×V×Vs@s Ú9 `'J`Ç<¥qžN$ÀÃk2u¿H{\.Í70äè|Ç:Ùv<áÚVÇçíí/¡¾Ÿnüššš‘Í;Q;6àIÁúR¢žÅÏ}$•kO”Kòô·cþt‡õÿH"ÃfL´j¯÷[DÝp"»áèúêújhÄ"ìDìØ€çb¬Ë ð°RÓ¹ÇZ¹$×#£ZI²ô…„k[èœE”‹ÅPßS7~ÍÍÍÈ瀂€פÖp²´H¨JȰ¤@¡Arñ%ýAðÂZ¤ÆãL¯I7~ÍÍÍØç€‚;Îü=ˆßs8èٌϟ[7“Øo&zôhhÄk(ØI`°cWyÚã°ÿk #öEðü€÷hœè_½~Ýü544'ì(Øñä@È¥ˆõ<âµ/× "q6½Wz¯44’!ì(ØñË’§"xâ5‹$×F?ƒnþššš‰• vìÌ“{¿gèÙˆ×É¥›Cbmz¿ô~ih$K(ØQ°4PÚ#þr€gžÿÇdùÂèçÐÍ_s@s@s ñr@ÁŽ‚ s@¥6âË0«B÷ë¦x›‚Þ3½gššÉ– vìdš-¥'³xþŠÇ^›l_ý‹‚àÄ“ìXÏý?¸ÇM°a…ãñ!sÊæ* 2Bv²„ì€(4€=û F'QdÇz?áÞW®€Í)³7'y¿ò~‚Xa@ÈN“‚°‡agã@p’Av¬×ü Ï´Ö –/V9l®‚Á€` ó0 d'ÃÈeØØ+°ÿÄ™ä„ÓgÇJTbý÷oðœ³aíd“ʼMJÞ©¼SÁ€` Z Ùɲ'_ÖöìÿDp’Ù D˜>ÁóO5öÃ!¿/¬`@0 È ÙIS²g^v/l/ìŸI 8©Jv¬÷õÖe<¬žlX™±aÉ{”÷( D‚!;iDvà´‹Àn…mƒý5É'ÈŽõ_Çz‚Uäƒ"¿#¬`@0 H_ ÙIq²ç\v l-ì¿Sˆà¤Ù±vm>‰u«(›Wún^òîäÝ n1 d'Éœp~Ø¥°e°_S”à¤+Ù±wmæÔö>°2n?4rœl°‚Á€` ½0 d'…Èn'ØÓ°ïÓ€àdÙ±>§¸ï†qª{qÙÈÒk#“÷%ïK0 †!;I&;p¬-aÓa_¤ÁÉ4²c}Nwßã´wéÚœäψ81qb‚Á@´²“„´lìÃ4&8™Lv¬Ïög¼#NçxéÚœ„ÏK´›œü¾8JÁ€`@ÈN‚6o8ÊZ°Ñ°·3„àd Ù±>'§Ás*<§ÃK׿}vÄQ‰£ ¢Å€8nØpˆUaÃa¯ÂÕÍ8Ö݉ݜoˆxÞ¢Hê¬kÁ)ñœß>Ú¡ü¾lä‚Á€` ¾²c²çWv?ììßîðSe\„BÏc8=žSä›Ë†ß KÖWÖW0 ˆBvb@vàäJÁzÀÀþ7KN6¦±Ü¦÷ñþ'ÀêGò”ß‘\0  ÄBv"$;Fšævü¹ö·,$8Bvw E~8mžSçkÈæûÍKÖTÖT0 p‹!;a8­B°ëa`ÿ/Ë ŽÙ¹÷‚ òÁJ|Y Ù Et¬?§^ëe§ÑWvûá”ãd# ±Á€dΉ݌/ƒ­€ý.Ç?šñéúö#Ar†Ã>ý¶tDµ¢­e­#?œJÏéô}aee#‹ÍF&ë(ë( À²'”Öö ìGqÚÎéšVµSËnÎQ= æû;޲Ûm˪“7Q¿ ™î 'J’IÇrZ=§Ösz} Ù¬e³ ñÁ€ ÙÃi› ûJŽ3A!q9õT3õdÇrª{>‚ãDzåQ;ÖUß=×9“ˆJ¬Ÿ…Sì·Ân‘ />ž¬«¬«` ;1õdŽ%ö8ìc!8#0?ìî¬v«¯FÕ,æÁq"8Nÿ¯O±jÙM9꣕mcM2í|ÿ,rÊýÕ°‚²9gçæ,ï]Þ»` vÈJ²R6vNNðÓ×´S+o¯®ú—,¨#9ÝóçS÷Ù­þŸ“ÙŽãïò÷å¿@G†^y²™¤¸BWtqêýRØ%°ü²ùÅnó“µ”µ d²†ìÀQäÀ„½&'´†æµ™ÍÕŒnTÏ‚ù¨ÉÑÆ¿÷,DËïc½ çWÌ÷XÏ9ÌóõAz¨vqµ£ïwIŠË.¿Ã1ó`e“ΞMZÞµ¼kÁ@ôÈh²§P6ö",[ºGœÒùqoµdõhƒšÌx L‘üª·iEñ÷¢´õ¡!5E›Ø¢Œ:2¶±z{A+µèÚªêþÒ…ßØAmìYK «ZTGQ̨­ñ!6å ©å «å «Á‹¨WVV¯Íh®¾GŸœXØÇhF¸ ‘!Š“y ^k®i’*Þ É–7 dF‚æ]VI1"%ïÞý»ÇZ±kóQXX9Ù Ýo²V²V‚ÌÀ@Ê“lÎìf|!lìgqra99õÖü–ÐÕTÖäÁ›ŽB:ÉJn’Ü€t ¢!ê2¸baMDÖßWK_ÞVGrâa_mé¤>Ü)®²úš¼6ÍK€Œˆ’‡ü)0ƒøLhVZÝH§Ðaa‚]›÷úÃô31YÁ€` Ó1²6âv°Ù°oÄ™…åÌÔÏû»ªÆ5FÚ©´'‚c¤¦¼))#rc%7LÑ&·*£ö?Ø@}HÐ7Û:%ÌNOo®žØy("O¼’¦»òÈ'òãõÁ³ ÇñŒX}¾©ƒ÷ºs­þ†ÏÖvØm°¢™¾ÙÉó‰C d/RŠì`Ãm› ûTNx‡ëõå–ŽjsŸÚjDõb:ŠÃ4Á±Dn˜ž"©Z¹R[EÔü+*«—§4U_áÉ´÷—¶AD©¦z¸nq}oChù±G}̈&sˆþÌG‹‘,ÁNøØÁšý7lìZ˜tm–ˆWJù!)ÙKRbõî“hl¬õaãaŠÈI©w¶R ¯­¢@äÃÅÉSc¦¦tôäAœ*EÔÃuJ¨µw×TçžiHNÇ”²OÖ´W{‡7P·.‹{-ª†â~ˆ©õÑ"g£Â‹-V€1Â%˜ŠS¿aÝ–Ãþ“®ÍB|’î'båðä<ÙKš’bl ÕaÁÞg‘3R?£¯Í± ¹ZïÂT•ŽâÀá3ÕC N^ŠÊÁa @y2ªªv®§>^ÙN}¾¾CÊÛÉÉMÕüË++åýûSäl¦¹ ÒÃ#]Œx Î"ÃÖíØ|XgqÙë(äÝË»Ow $Œìð"l0ì%ËbÅE°_m먶öG³> äô'9‘1õ.fŠŠÄ€a8ˆÂ¼?TRÇ'4QŸ®é >]›~öÖÓ­Ôš»˜â*¡µ::âãæÊÓöxzù0ݵðš*:&¸‹ês÷%Öo:¬Fºm|\pA Ø¥YduÂyGX—’a®M{·çÇy ‡yîtO®×†kˆÿr³l}*ºÅN,KÙáMc“äPCq8¬Á»‹[«Å×WÕŽÛçEr|SUž4NNQõ´/«0†áÙ-Õ'«Ûg„_ÖVíTO‹©ùŒÖhµH¦¶ÇKz̆(¹ŸŒ´ØÑ Hq!2&XŒø³xE,7¡Dœ Îd$Œž%[ìñpÖëÒ:̵9çöü8oÕ0ÏîïÈõÚdgm–­Ï-n±ËãMv^ãÞÁür°«:>1W=Ѷ¬nÈNæ&Ç“®²‘3Š0±yiµýþºê½Åmtº*Sí(´9ìÍÈ•ÒC¢ÈµdŠk+ÆY|µUR\|&ËÇrJĹ„ìOÃÙ‰) ²üKEVl¬Y÷ ü›í@Tªª^Tq`@]]eôÇ159Þt•…ä̺¨¢:ŒÉç—µS.Ï{mz õì­Õ!º.®S\¦®ÇéaãBjzØo‘G’žþ¥â‚¸›‘3Á¦+"þU"ÈI¬¯!dGÈN£'Bv„ìèùUâT¬Á{(»^rCUMl8SGsl%享1úÏhMŽArFÕ*®–ÝTMšÚL_Ú6«íù­Õ¶¾uÔch:èéñè™H½%ëŒò€H’Pr)S\ÇËUŒ¨ N~NwÅšˆ$â|Bv„ìÙ‰iô*šTcVDvŠñu"¿ê¦^œÜD§ªzÂÄqNþ¶Es¬)+oohrÆ7)¥6õ¬­ÞÂÌ©÷‘®Ë[ƒ÷µQG5T3»UÈ#=F¿FSÏcò`ö*œ_ë€(g„MðêGz&&‚œÄúBv„ìÙ²“0ÝG?°yYÖ;‘owzRU#rŠ©ói'ëæ Åâmh”‘ë”{ä š3­syµ=hÎ=ÓF½»P,Ô¼„Òõ%×稑5< ­©-Ÿ("i}Hx@8{ʧIç"¤¸ØèP0ëýÌ^k"’ˆó Ù²#dGÈNÂÈŽQ‘ÅÒó¬u¬h Ç[U;Òû äÓN•D‡NVkH mŽ=šÃ3 ¯®ªN<ÖD[ÐZ,‚5x}f µ¡{-5¦QIoWfo”Ç«åÉKk1ÒÖï¨{¾ tå׉IM#qÙŒ_<{N"ÈI¬¯!dGÈŽ!;‰&;Og›³ ƒ|鉦:Uu/„[tž¢ãŸ¶2ËÉÍ~9£ë—Ô½e^{ª…z{^k±¬Á[s[£©b}5µ}9K”ÇÐòXÄ˽‹æ×D”‘·îùóéwGÐöê*Fæ² ÇxÞcMBu>!;Bv„ìÙI4Ùé•-Nâ»ç:«ëêοt”&Ña´À—èxJÊ™RÑ•V sLÂŽûë©7fµToÎi%§58:&Wwgæø –ò3¢Æª7³DÝÔñðÜg¾GþFèÎ#R—-xÆsJ9‰õu„ìÙ²#d'Ñd§y¦;‡V¶EuTŽNU™$ÇJt<úœü~ÕVCÐoÎ%•Ôó7RgArÄ·¯<ÑL­¼­ºz¨vqƒð DÝèÉ£u8ºâFs;6¸Ë+ÎÚbM †¹.ÜžçÍæ¹Óýý¸^£©`™,[Ÿ"n±ËãJt ÍN¿eá¡£{åÉfêÉåtšÊJr´SDTÀOˆlèsFÖ(¦–£tü¥IÍÔë3ZŠ%q ^›ÖBmíSWMDéºîÉc)O'áéi‹ðXß3>‡ÎÎßïꜩўÛb¹ùȹdÞ’`@0( $œì„çL¦:¶ÝCë©‘˜Ue'8Þԕѡץã=j«ÓS›«3Ð䈥ÖÒõ®õ4y6vd¤NWj!<|ç#¸‡S¡6ù¹8Á€` •1L²Ó5™ùÙ¹-Õì‹+êUá8¢ÞE ¨§Ú—W»¨¯Ž>’+&k‡l¤]UU±Cv8Xã±£ë—Pj¨~Ú—Ô×3©¼‰¹¹7t¨ û¯4¶±nž3Òc°.-Â\›WÜ^ ç­æ¹Sí=¹~V·kb=k³$Í×çòHž;Ñ¿“L²SdçßÉ <ìvÌ*šps.¸¼ª:8¼‘:òP®˜¬ADX{GMõ(†»ºi]`Åçñ‰¹ÉŒòôMôÆëëeÀl¬Çc½&6‡Û:ÌÙQçÜÞ1 A…yþT:Þõ³º]ÛÚ¯Mãµá{º&’çNôï$ì"å’AvxMëpÎ`¤gtÝjÕ­5Ôá‹ÉÄ ÛûÔSSÛ”S½Ñ‘Ù é~ç™VÉ$;­½1ÅúzBvdh„BÈ¢ÌAÖOÈN¨ ¤cS²ÈÎäVeB:™sŠ©í½ëªCˆæˆÉÄû‡4Ô)Q7dç«­“EvþÏh¡PŸåTÿ¹!;Bvâ6õ\ÈN¨ ›èÃÉ";ó¯¬ìÊÉô€¦‡iÏ€êÀÐFb²1ÁÀRTï¹Å3åš¬Ï ®{6Ôç8~.dGÈŽ!;IKea#½,Y›øúî5]‘ó[7;ß.„fgÿà†b²c`Ã]µÔÈêî;qbšz²>'¸îŠt 3¡îQÈŽ!;Bv’IvÊ%kß?²AXdÇ$=l·úÖšjïÀ†b²®1°½w=5 ]µÃ&w·)›L²3(‘H‡Ÿ Ù²#dGÈNÒÈŽ!Rþ"„‡“¨Ýh%œŽ¡Ãš€¦q[î««vßß@LÖ võ¯¯æt«¤»kGŠ·WUI&Ùé˜d&Ô= Ù²#dGÈN²ÉÎÎdŸmëè|žêP^=„áÁ{óô,”3³ ©™]*ª¨¬ÙÕ¯¾˜¬–_WM ¯ZT·9èQ0_ШÓ¤ìÅã„» =j%‹ìü ŸÍ¢¡ˆD:ü\ÈŽ!;Bv’Mv&$ƒìp’¹“c™ƒ¡Ž/=ÖL—›; H»£»-K†û/ ‡„ލVL-¹ºHO}1YµþÎÚz\Ç?#½ÑA™äØ©%ÿߌÎ0j$W±ã²&Œj˜,²ó~:7÷GWvi[7Ïé1X—’a®M{·×Ây ‡yîT{O®ŸÕíšØúìä¦ùú”ä¹ý;I%:FëÚd^Ó‰Ì<Þº¬zyR3urBSutt5çÂJÚQ™NˆÕYü¦Îü6~?Ú€²…Ô  …Õ„ÜÒjÍm5Õö^õIJp ¶t¯«f`<ÄÐÊEÔÀr…5¾H†û …Õ äØÝÓ ”Ú=°¾z‘Skª6u¯íHv^Þ,Ydg]¢7$¹žŒ âT ;U’EvmPÒϹ°‰à+“›©—&z{îÜ@Î,êYÈ7ªó@™Bj º+Æ(€¡UŠèf…Ó;VP›î®£¶õ¨'–%k°ðŠªŠÓˇ!m5ƒaI~I‚I†û•ðDwH’É\¡ˆZ{g-u| ÇŽÑΈ·å7Vs$;­l›,²ó`<69§83Á€` ÑH:Ù1¢;ß'ƒðLïRÁϹp,ĩǛëèÓYüÖ}b¬gÈåÆ{kë²a~S×QÒˆê”óDu†àÛ<õ,U«¸"‘ZpYUµùžºj˽b™º+o¬¡&5/£ßùƒ5Š©á9E5é\±°'º2ÌèÓYŒôé¬á >7¿µot'Öbe#ºCçJ'KgK§»æfDà€w úàêà›>#tÜÏi¤^×X{,W˜ÔD~¤‘zÂÛ¹«dµ=ƒH×®õÕ‹“1ša"¦ŒcØë‘1ŽƒÄÚ‘,’4î6¢;Ôð¬5f”‘hn¼£NȨN,JÍ™eT‡‘ø‡^…Avl©¬ó+Ú&ƒìÔçÆž¬sáÜÛ†õLÖ½&ãºX—ºa¬ ×ñi·÷‰cˆyînÏ ÇamF„¹>áà8m“Œ÷–RÕXÙYšh²Ã&Ùá·k~ËU³¸z÷™6ê¿èŽ¥³²úX3­Ýá€GÎ?òêB¬¼)kt‡˜3³V£<šé*{T‡‹c%pýäãMÔËSš*FöoñrŽšÓ¾rVÙ<<®×áˆÎO>› $ƒ$…ÖèÓC;§Ïs¹Ö$:Œ¬mÔé+DuLQrœJÍͨ±Å”)ÉZSY?ìé’h²óçdlBrÍÄ|³•u–uÎf ¤"Ùh²ÃÒo“ìÐáÐñÝR½ pnQkõÞ’6êÔ”fŠ=f¦·¨”6·CuSæßų½»¸µzçˆÈAîHòHö¼Ñ¦³@÷`¢øJ øäÚq ͨ#gVQr8¥æf§d·SÍYjnŠ’!$ÑađÇê”P}ŠðÑípŽZ"?Ƶºgóf(Ï.d@0¹H9²cèvÎ%r£? 'I²cêuúà[v¿Õ^T󼿕é,C¬ÌÔCD•Ù{šó“8Gi¯½³r±2S.ŒH<‹èÎò«j¨eW ñ*Žö j ^EÚ† F6áà¤ìw¶h­Þ_ÖF¶­úhU;õÂè\5¯SõT³ŠiiÓ@Ö¶ACC÷!ž‰=’øw’:’;’¼×Aött)½#6Öz½VX3®×pµ‹¨Ž½Ôœï+Ü©æìÇdN5·–šS”ÌH!õ`Ô… ([ÈKv˜F%ÙÁ9‘ŸãZ¹²Ùgîf/ïVÞm6c UÉΚDnôŸmè Œ©×á·l–£oÂH–´Uï-á *V¶¤³ V¦^# X„Ç1ºcvVfu–!Vfe…³¦X™©Îbt‘Ίb*gˆÐQTy£:ˆtœCÄã½¥mÔ¨èùpe[õÇ5íÔ§ëÚãÏözÌÁôÕ“M*¤12ó6Hܧëñ kÛiòFG2§£; wLÝ‘¸2ÒEñ¬ ׈kåÕ(ÙÕ±—š›ó¯Â)5çø“šê”¦}ª¹µÔÜL_1ªsfF Õ¿TA6eúÔì·Ã’øD~p­¿Àògóf(Ï.d@0¹HU²3<‘ý/»j'CëeèuHv–ÝTM_ ‡º„'Fbe3ÅyJ{1@’c8=Û±³r±²™ÎbjjÉe <—VÓÍ™†9=­¹OT‡W·SŸ¬m¯Hê¾ØÔA}µµ£úpy[-ÊÒ¸BJ&2:òõ¶ŽêËÍÕç;hÒö1ÈIœŽî€Ô1ºÃÈÎÞÁ @p<óÃHt¸FËôÕJS”Œ ,ꡬ¥æ$˜*5§&Ë qbl]‘Çʼ—'5SfTÇœjn-5·FuŽÏŨ¤M™>eÛ¦SYA–ÈÏ®õªlô™»ÑË»•w›íHU²Ó-Á½Z¹ˆ&;¦8™ß¶ç\R ¤ _tÇG¬Ìê,C¬Ì™GîÅÊžt–wP(Ö™be³÷ŽOge±2µ;K‘¢á€PŽDXˆÑ /®¦v#åòÎÂÖŠ}Z>ZeDu!QørKGõõöNêÛ»G¿5¯•&J7(ŸRÆT«œ¾ÛÙY}÷\gõÍŽN𤑬}¶¡½&o$qftç8„ÊpóYüqM¸6\#þÿ@¢d¿RsvJ0ÕœóÎ"jn-5§þ‹Qè½C¨ûQùÇ´©U¤Ìtd‚? ³}3”çB È\ ¤*Ù)‰þ߉ÜìkQF«6ÅÉ,ýܺŒúhê2kt'€X„‡snV^ïT™½w܈•‘Î ÔYٛβˆ•¹0ÓYì¯ÃyYŒ†0âslL®'ªƒHˆŽêlFTÑÇåçý]Õ/0¦Þf´¬¤&×+Ÿ\«_c4ꩯ·vR?èª~ÜÛE}¿»³&g$i$k:ºÃt¢;o@§´©¾ݪêg'é³Fuì¢äpJÍ÷8M5g©9¦Û›Qãx·LY†SjNýÓ¢L2Uú@D­"åÏðŒ‰Ä?®ÕW6úÌÝèåÝÊ»Ív ¤$Ù1DÊ'r³ŸwY%]úËo×ü–ÍoÛ×.¡>zéFwt:Ë+³÷¦¦XÙì½sÚ%ñ „©/¥èÔqpPèÑÑMÔ çjG©…:ˆ•ÍtKžƒuVÖbe‹X™‘ 3õÌ…ÂC12}cvKõ9""$ ߀00RòÄOûº¨_@(<ë|!PWLôn¨ÉÎÄ:ånKv:¿¼½¾ÞÓ¯H/þ"FRöÈ™7ºÒö!Þ §sLŸ•Į̈×€kaŠ’ƒEuÍ¿Šzª9KÍ…@¥æç€è ªÃôèò«i²Ã´©Iv]üõßIB­u¶o†òüB™‹T&;›¹Ù¯Á´q6¤Ãá·l6T¡°&:ft'l±2 O¼ÅÊ$<>Ñj:ÂÁHÇÓ $š«Sv|6’Ý@t\DuR¥ÔœÕ}$Î$Ðs.©¨«±Hv(R¦flDµ¢‰&:ÿÀg­lô™»ÑË»•w›íHe²óH"ɧa›d‡Ž‡ß¶–/¬ÎÎi©>^é‰îØÅÊfïÝYCY^LAª5uò14¶á9ë1#º¨÷N´beÎ2ÄÊft‡ƒ1ÙI™ã#æáïG ªýv‡ÕAäÄŒêXÉÎoGþ ~;r™:;»šÝ®ª_½l\lRòjßà&ˆÞ\ŠëñšøÓFxHÆHÊÝ9‹’í(!'yãx>›T¢ä/5gúŠÄ™éÑÉ­ËzÈŽ¥"‹éÓDb×z3Û7By~!‚ÌÆ@*“˹ás¼€ì Ù91±‰úãªöyé,8©÷-¥èa‹•Ix@8(¾=4“ÎÚoôÞ‰N¬\#O¬L££;HgÑ6â›Ý®²šÙ¦²Ö´œ9Eu4áñødç÷.W¿¾©·jR[csÊÄÌÖÜ\ÕUãWàZ—kr¥ Ctç³õôr޾ i#y#q#ÑYÀô•ÕI‡RskT‡úá:Å5ÙñVd!²³àÊʉ&;Y5xQœZf;5y¿ò~0Êd§\"ÉÎû(_ö–ã[6ÓXœ¥ôÉjTþ ºã“ÎÒ¥è©/VÖé,otÇ3+kfktR†ya~²BXÂB É :$$:šˆ¼p¥úýèUêÛç.S›ïm¨ÆU‹ŽðÌëTM½»¨‹>§>·¾®e’KtçǽÝPýÔØsÏ i$ks@Ú˜¾bŠ.O” ­Nš”š[£:Lc ®TX (²A|?]~^@­ë^3Ñdg°8q‚Á@&c eÉŽ!Rþ2Q„‡%ÎÖ²s“ìlêU[}ŠF|Œî|R¬œ7(4˜XÙLgyÅÊ%aë¬ì#VîQOm¹·®ŽnpX¥9(”•EሕÍèÎ,ÎËâøˆih.¸û†'C·ãÕ1ˆÎ %G¯†]»¥ì— ´»fØž)*ªÚªßpϹxN_Âã–:*ERFrfêØÓWQ—š÷©¯žCéÿîþ +°ö¡ÿ?zJÍ=‚r¦)0绣àÜl H!:Û °íç_YÇBXç_™¥æ%3ʨÎÌ^\±°X®°Av<åçœÊž(Ü×é”É›œ<›8qÁ€` ÕÉÎs‰Üôâ6E¢L)ì Fdg9Úö¶®" Œî e”¢ÛÅÊo£_ ÓCì–K§ç7(Ô…X™Ž–—{é€wX;+ƒð°‚(`ge‹X™)–a;‰•gÑ–šOkŽNÊM+j2ñâ„–ê—ÃHaÙ¢:^²s DåØu°ëѼ°~·rHÒ3¾FYL`oª~Ø‚ƒßÓ¿o%<$S–èÎË:éÑì³C2FRFrƨÉšT'A¥æ :l m©¹©Õ!ŽŽaöÚàŠE ²ãéµÃQ%ì@Üÿ®ULœ8Á€` “1êdgB7}5¦QIÝÉÖKvð­{6ªe>‡fäÓµÔtÖ‡$<¶ÎÊnÄÊfïWbež•Ix6Ü©è·b”„Žîø õöÞ "V&¹1£;$ÁnÊlJøÎ‚ŽFŠÉÕ±ßß ~?~£úùð jÿ°Vjbmg=ÏŠkë©O7"Btü&}üïÇð{šðøGw¾Þ~ :7PSs+¨§@¾HÂHÆò¢:U´VÇY”œ¸Rs³S2…çì”Ì6>ó¯@tÏ‚ðúFuòJÍͨ£„{ÐPpH%hÃXýgöÚaWèâþýLÞàäÙÄ Ä@ª“ë¸é«Ý*hÝõÔQ0Å0©eõ9ò™Ñ±2 O0±2ª³Ý ØYÙ"V>©Xº›5Àá–ÖA¡ÞÎÊ!ÄÊ$<$$$SUД×ÝRM/1ÒMyMXH\4¹Yý~âõõÎkÕºÛy£<³Úæ`tÃÅêOøÙï'pŒIvH’lÑŸ]©l®#9SA¶žlâR(ªM©¹9ÿj+æmÇ@QFÍ= >ÿ Õ1ÒW'ç_5÷I_Ù§šÛEÉŒê0J¸±G­<²ci,Ȇ Äýzqâ ‚LÇ@ª“ª ÜôÕò›«yÉSZ$;£jS_lD×^#º‰XùôÔ•QE]ˆ97+à Phw8¿i³1(”Ñû PëÜ,{geS¬Ì²m–o[ÅÊf:‹„㉆袌NÆüsÏÀ¦êÇýˆðé+;ÑùÓ‰[AjnÓöþòËÕ±qÕoÇÌÿÇ?AxHŠ¢;g¦w€à¸ª¾£JS]"ÑÉ‹ê }¥+°"+57ç_q5dôŒ%ÿæTsj§X!ÇJ9V̱T?Ôü+Ý@ÄöuŒ9; QÛTs«(™QAŠÝ%\vcŽÙaZ+‘˜ÇµFfú&'Ï'Ž\0 Hi²cˆ”HÔæÏIÓžîÉ¡£ð¡UЍ1a›„‡%Ð!Åʘ{äé¬@¬ŒÔ'c›•ƒ‹•}…êÎÊÄÊžt–ÑYùZ4„î…ýf;+³:Ë(E·Š•­é,FwÌNÊŒ²¼4¹¢<–¨"6$2šè¼x»awàOÓðÿ4 ºUG<„‡¡ÔG«/Å€ÎÚ(g/§£HO šÄ¨µC$:N¢dŸRsο‚É^j¾òÚšj•öé~ª¹)JæPV’Ì.æ_…3ÕÜ/ªƒô£ƒÔ€Í¾¸’Ùa§q¹¥Mv.G Ž@0 Èt ¤Ù9(²ÃIÓyd§°—윅øøËMˆîXÒYnÄÊÔn+ƒðp¦’wn–_*ˆbe:äXˆ•=½w,•IxÄÊ$$ $"“êblDírjBͲèiSC½· ©-Fi4Ñ1"8šìäÜi1þÛCvÌèη»¯U[{äê1<¯=bT‡š!kú*ªRs¿@SÍ·ƒ,îà°OT`åEu°ÖÊjFu˜RdT'SÍ­QOú ³ÊÕ¡Œ)RjvØÏÉ1뢊‰$;ÿÁg«t¦orò|âÈ‚t ;SEvÞ˜ÛÒ‘ì¼8©‰új3&n;¤³\‰•§ûwVö+c˜$u!;++{ª³\‰•QÅÙQN•½é,Dp<ÑŠ:­d¦³HLáaeûìPŸót:šÈИDçä]êO4MzHv<ÑߎެŽ<Ü竨à ’FH¦¨ Õ‰¦ÔÜ“¾ª£¶ ýǨ£c$:zþU‚KÍ9gÍŒêP6ªVq?²³âÖj‰$;ŸŠ'  dÒìÜš(²ÃIÚN‘}#êë)ÜöèN ±2§ZûuVv#Væ PDL±²Ù{ÇÛY™ÕY½ëkq­9(t“Ñ{gýí¬Îr+›é,ö£ ÖYY‹•ÑwÇ.VžŒt ‰ ;)³ëÀ°Öê—çá BvÎνÚ =n‚Ñ!F‰BEu¢)57ç_q=Ø“ˆëÃEÁDÉûŒôÕAô;¢vJO57EÉQN5·–š3hFu8*bXÕ¢~dgÇ€º‰$;Û²a““gg. ¤Ù©(²Ã¡“ÔMx4;yi¬M½j©o¶uR_aj¸&<>beÿÞ;Á:+»+7Öú‘Ø‹•m½w‚‰•™Î2ÄÊft‡„e\õ¼.ÊÓšWQ_í¸Þ–ÆòèvÖÞæ©Ðb4ˆ$é±ZÒdê¤u©9EÉ.KÍIŽ©ùbT‡ ÈÎÑñIvƈ'  dRžì"åßExFÕ,î'P^Šª™o¶wòDwŒt–+¯õí¬ìé½ÓFQ”ÊŽ¹oG(V>‚È# Œ4ðPO²w@±2«³l•M±2ź¬ÎŠV¬¬ ÒNÖèŽulÄÏ^n({ËÓZTQcItlQ(¹|ŒKÍ‹’“^jŽô•5ªC²|l|®—ìè>;(='Ñ>;¯e"ÉΕٰÉÉ3Š3 Ò…ìKÙy¢MY?²3ë zR¸'º ¬³2«³\ˆ•Ù—eÎ,wöê$Vö¤³èÈ™¦Ñé¬;êø•¢³÷Î vV¾ªºb)ºÙY9°XÍ-•‰•I`ÌÁ ¬Ù±Ve¥è$;Œ1DÍ=}å-5GêÌÓ@ÐVjŽqáL5OõRsŠ’I’©ýÚ3´¾ÙaSÁÏ6´O$Ù©(N@œ€`@0 H²3+QdgÁU•}š ²ôü±f¥ÕwÏuVßnﬣ;ñ+³;/«³BŠ•ûC»‘-«Š(ºu콬³r ÄÊ:e ý`ÅeFÕ+¯òlzË*FúÊ#JŽªÔz#ÇRs4SL—Rs¦¯XÑÇTèúûjù‘ûÑEù—ƒ]Ev¾É† NžQ¹`@0@ ¤ Ù¹'Qd‡§­ã"HvFT/¦¾ÛÙ †èŽ™Î‚Ãúbzïs³üÄÊLg=ƒtV ±2Ñ™•9L’½wØ—C&Ù­—„'j±2 ­³²XÕY ºå蛜9eöÞaÙw8bå÷W`ž–î–ÌrtÏŸìœ<½UÕ€Q˜—šCœÍ‹Œn±k /’êRstJ¿Ô½0ËŒUs qÊ ñšÑ@ð  í¥æfT‡©ÐÅ×å¨aU<es\ÄCµ‹'Šèð:{Ä ˆ ²éBv%ŠììEå•uèÐÊEÔðœ¢êãÕíÔ÷ŒîxÓY1+cZ6©YŠnFw|ÒY˜¼­X™ ÷V\FƒWzÒY‹…º+?ŽÎʾbå²èœ|©Ñ4M»IÍh]5µJÍÑ)9‘SÍí¥æfT‡©Ð]+€ìñ:¥]¹D’IÙ²ÉÉsŠC Ò…ìäÙùŸDž—¦4Uý©çƒ0õÜ$;Žþ°«‹Žî|©Xy®ogeF 8D’Ã$Ix8\ÒÞYÙXÙLg±—LH±2 O°ÎÊ <œ0¨³²“Xùƒål4hÎË2†~âß3[W Pj|þÕÓˆ4±ù!'¶³S2‰ ‰ EמNÉ5õ TD §ÔÜì”ìXjŽÈ›=ž Õi¥;e³Å£wŒâù7Ì+5§(™Z¦@™ ߤ”îÎÍ.ÝìÖÍ Àg®®’H²s£8q‚Á@¶` -ÈŽQ‘õJ"ÈÎ{KZû!FdçøÄ&êÇ=]‡4F.Vn­ç&…+3L¬Œê,ßÎÊÅÊírPè*#X¬œ£H2˜ÎšcŒ’ `Ø+›½w¼•Ù{Çè¬ì!;%a1 Õ¦jÌKÍŸ…Øš¢k>Ÿk-žé+7󝨝ˆ•mû‡4 9ÿ*àTs3}5dä•ÓîÙjà=Tཿ¸­²N5·–š3åI­£:lað`õ¢^²Ã¡³$;ëï«™H²S=[69yNqè‚Á@:‘‰ ;ßìè¤K€Y Ì6þÔT°ÊžaõÕO{»¨v#ºc¤³"+¿ Gùª³Îé¬ì+³:kT°A¡Ñ‹•]¢³2*¥‚uVþ`ùÅÆ4óë}þœÝ¶ªNyyKÍ9ÿ*Ì©æ¦(Ù?ªzþUÒ¦š;”š[£:ç—·Ñ©QF #z8 ,È¢‰ûl(²ó³lþ²ù Ù„t";½Avx : ’ GM²ÃoÝ?íëjDw<é,ŸÞ;†XÙJ½Æ‡ËÛ©ÌÞ;®ÄÊHg+³÷f6q"·cgeTgY;+›é,OgåÚjM„be3¥;+c”KÑ9âÁ:(ôƒåSѯ³üy­šÝ¾ªÏü+ŸRstkv*5×é« sôh‹Å¬Àº é+¤ÝØ+ÈŒêPtͨŽ}þ§ÁS”Ì 5ÿùWž¨N"§š[KÍ)J&9&fÎÌj¡É£†L•’ì0uúÊÔ¦‰";‡³i““g§\pÁ$ØG°Ÿ`[`…/™‰—t";-EvÆ6.¥@0»(k²ƒª™…×TU?ïïêî8Š•QVLÇ‘…²Ñ Òft'oPhsuÊ¥Xù`°ÎÊì½Cí¿97‹i¦{¼é,C¬¼<±2ššbeMvŽ^»Ö0þý5»CÕȧš)5×é+C«³Á ArÇ~C£AÒDZžšÌ©æÖRs¦®¾FŸ&¦@9pv8GEdÇl(øþ²6‰";ÓdCÏÌ ]Þ«û÷ bSöoê’½v§¬¡û5L§µJ'²Sdçï‰ <3ºUðk,øTÇrº ÏLgÙÄÊfïoge#ºãé¬ÜÖ·³r±2Kœ]‹•1ÓÉÞYÙG¬Œ˜œEBÀèŽ_gå beßœëF¬Œê¬–w¹¹ÚÏæ€ìPÐíTsS”¼Ò%3JÅ9`Z” ÔœD'¼©æñ-57£:Œ>7¨žã¨ˆoÑÞ øÆ5îH§MJî53O²ß+NAØ7¢óü½a²ïK®¼§ Ù1DÊo$Â,»9Ç·üU3£ë—P¿ê¦8?+/åB¬Lƒ¡ÉjVí¼cï½3½¥zí©êôÔ:ºóÊd”¢[ÓY†Xù§ÎÊnÄÊ <Œî˜be³÷ŽW¬Ìê,£ÝêF¬l¦³Î/ï ¢s•¯½pÈRÕˆ¦š{ÒW¨ÀÒé+T`…%×ñ¦¯|¦š³Ôœ¢ä%ƒ2"veüÅA{CO#ö6b{1øÊäæºßß £oÔX1—'Jní'JVjÎîÛŒê0"¸æîš~=v#‚˜lר'j|6TY×ôZW›ò°›a}`uåý¥×û ç}¥ÙY–‡°µÇЬvwV¿ìæ˜ÎŠV¬¬ÓYF)ºݱ÷Þy!be¤³ØqØœ›åß{'|±òùå]Ôï/\égó:ì4-JNz©9‰NœKÍÙ®€Qïd—n{Ùù¸ÜR‰";gƒc3wó—w+ï6›0ndg@"ÈΑ1+²>ZÕN;$ßèNÄÊ콃è‚)V6{ïx;+G(V6ÓYZ¬Œ5,á¦è×:(t¢*/€HØÞYÙÞ{Ç+Ÿ_ÞDçr؆ñï—«§;çhAs4SÍS¦Ô-"-5·FuXÍ7¥]Y¿J¬™˜¿–lã'²iƒ“g‡. éFv:$Â!¼>»…âPFŸŠ,ˆ”YEÃë{ÓYF)z¼ÄÊ:…q[àØY™ÕY) V>¿¼“úýÈe~6¿kŽz²ið‚$TYÁô¦k©9{êP˜Nº½ gª1ªC{5=R§„_%Öò[ª%ŠìÌ•Í_6Á€` Û0nd§(ÈÆ¿âMxþ¸¶½êW¢ DÊžŠ,v¹eÚáÈØF^‡ä#VfïKge_±rõÇXˆ•Ax¨-¡ÆÄ:(”]€9Jb_±²§:Ë…XÕY,õ¦f†Ñ–€sê¸)VžÓÞ¹³2ÉÎoGþàgóAbX®Î²uÎÚâÌ­Ùm+«9í«¨y?[ÓW™\jîI_uÖDçë­ÅÉÛ(²s_¶mrNÏ }FØ£°±vþ_¡d¯î¡o€û³Þ3Ÿ¡k²ïÕ~}ÜS{Øè÷;þ‘dß3î¡–ÃýuNÆ}á>ª¹x×|ïa•’q®‰û)»/Àý?Œÿß4î7­ÈŽ!R~7Þd‡WýJ𛑵ý<‡ä$VÖ½w De—\vËå,$¿A¡.ÄÊg‚‰•9(Ú€berYnÍj$–_³ {+ʱY–½ å٬ΊZ¬ÌA¡h48­9¢6ˆÜœ_ÖDçR_{þR±á1ÓqìÌÖ•Ô,Mt*ë*¯y¨ö"‘bºŒD‡é3-JÆX–ÄSKÄy^ÖNɬ(K§Rs3}Å&”L_±ŠååÖ™XlqÀ(⑱Evš¤ÂÆ“¬{ÀÆ{7ì– kÙ±õï¿â˜)°üI¼×s.îÓ¼çOqldÝ«y]ÜÃm°]Ü÷ŸpÌ XdÝ3®}©Ã}ŽMÆýà>:»X3ó]ÿ Çîƒ%µ :®_ ¶ö÷~Ç\œŒµõb3™äÚ :kâMvxþÕŠú‰”WÜê›j(V&áA9vÍeJ#¯÷*³V´9ð”¢sÄG pä€_ï¨ÅÊÂc–¢ê½¾X¹Š&-$/$1$3ç—wP¿=1ìÃø÷‹udhz‹JyQÌÜâ( ޤð%£ Ãü+ÇRs5§©æºÔ¼?úê ‹åøÖ‚lÆÈ ò$ˆ$ŠÇPÝÆùW±žjn¦¯¬ ­QVñ½:­™ß˜ˆ~% ¨×çxR¤q¶¿âüIsÞ‘|Þcù;Øl¯‚±¼8ÁqúÿSbyᜠ÷Ù1ïýúp®Ëcq¿Áì}kB­õ¬XÞC8çJc²c®)I{¾pž9–ÇâÚÛÃü,ýÇ'­´?#;#âì´Ã™Ô²ŒW¤lvRž}qE?gD±òÏÁ:+ƒð0º°³2 QŠÎÁ’ggµT¯cþÒ™i(E7…†)VÞËèœþsý<£$XŽÍf{ŒîØ…+›é¬PbåóËÛƒÜ\ägäéÕ©¢£:L‹1ªãÛ)9†¥æœåTjN¢ÃRsöQÒZ5íõ;¶N5·‹’9j„ÃÃ4ôÓëô-^@}‚Ôip}:–›]º í¢07g:•·’õœ’ÅI¼ß§"XßóI¼ßtìX dòÈÃü5‚÷=,iï;YŽôºp&À)¨y—U2t;õTjêv&4+íç‚‹•óÒY!;+ƒðë¬ì+Vnª£ŒR±öÞ %V&á ÖYÕYL¹é¬LíÝùp«Ô.ô³…WÓQVqq’ú\#ªã%‡7ÕÜL_1GÒÆÔStÁæ_œjnôÔ¡ø› YêÏéó,ýç¼²7ô°Oÿ©æï£Oû%12÷"tì’X”ì)57EɌ곭»r“@›“Iv~ÆÏ€ëE‘~î2á÷°1/sØœ[ãÿYíMÛ1ç’õìdç=Û½ò¾ÿi»ßeI¼_¦¥ì‘œŽ¶{~ÕvÌÇI¼ßT';clk÷¤Ãúæ&qýþa»¦Ö¬Ÿ¥[îwdÒî7YŽôºp%aÿŽ·cX}WuE'Äœ]ÄFœgDrc¿vØb啞¹YfgeO:«µzÛHgå P#ºcï½ÃiÜL¿8‰•…#V¾+pge³÷Ž[±òyûºð߬®"!2EÉÁ¢:æ_%mª9¢loÏ 0ÕœDLjê0bǨŽuªy ¨Î¯èÀͪ+g ß)€§~Dµb‰ :¼F¿H?w™ð{NdÇþ\8æd “3÷kw8©FvŠZïkû¼ÿJ0¬‰“fçÛÚ Jq²³Öv¿¹BvPóÍæ‰Mûãx“]Cêi²cŸ€þ%fÙ¯L¬üu4bežx‹•9J˜›åØY¢a’³³²Ù{‡ÚFkXaÅhS4ŒNhãßaœ¦îÕñ/57EÉÏ^[C7<¤–(Ôü«Æü«]dïyZ£S2«ÓHü<’¡ÕA§dö("AûéLvFÇÛ9¼³°•ê]4¿þæmMe|¢I@ǤÓY†XÙú Æp”+tX®XÙLgyÅÊjÌÍrì¬ Âspzï Aïuã"V†¸˜UÔà0ºsó¾¾CC¹5+¬ÌRsS”ìWjÎùWJÍY"Ÿî¥æ$:ÄñÊ?ٯɛ‘&¡^swD¤ mÝnFñ>NÈN|ŠÈ×WÈNäkçvßH×ÈÎåñ&;_¡ù[¯" ;–TE¥{‡×è˜òÒY˜ŠŽ¾*¾•m½wØhW3ºcê,V¶ …¸–óœXBí(VáqŒîô®—×{Ç+sr8‰õ1:ºsƒg”DH±2r°)IÝ7;,†³r8¥æžôUMå3Õœ¥æ%ã^Y>¿½‡U”ŒRs¦¯bVjÞJ½©µ:­õ3qh+£V¾¢äv~¢ä`¥æL_™z¦/6uðKa‘PïS1Äù³n7…L=NÈN|ŠÈ×WÈNäkçv¿JW²S>†N y¡^G§²¼Ý” ©uÝkýN*¿Í3C²³r±²Ù{Ç•Xy¬ge{:‹¥è»ŒRtßÞ;h4¥Xù-y©e"A¤ñï4 œVj>Äaª¹ÑS'VSÍ#)5'L¬¾ýL+¿*,ê-Œ!λÝ2õ8!;ñu(Bv"__!;‘¯Ûý*-ÉNà«:GóP⪷Ý1ª²8±:ØuŠ•™Î &V†ðÕÝa„‘oïC¬ü*DµºÝHgQtK‡îÜYÙ“ÎÚcöÞ±tV6{ïx;+G(V>;§¥ú|#úÌн0ÿ¾d‡é.sþûîPììÔ@ÐŒêØEÉ1-5Çz9–šÏŒ_©¹µJ:0¶1¸¿tAM û- zίéÀbŒï¤´Áw»%â8!;ñu(Bv"__!;‘¯Û½#Éή;?3¥}YíŒÝ1«²žh[6¤¾"±²&<Á:+ÇJ¬ŒtÖ6¤„uVG¬ü!~ºC0­¶®½Z‚Ѧ]©9"pl h/5' \jîÛ¦`÷ÐzºAVa!=J"ݳ`>õ5ˆpœ±ü81·›B¦'d'¾EÈNäë+d'òµs»_¥3Ùy,ÎB-¼¦ŠêY(?„ÊLey„Ê#k¸ë‰âJ¬ÌQèÓB'Êrf–5³¼™eÎ,wÖ½wÝñtVÎë½­XÙLgéÎÊ NÈN|ŠÈ×WÈNäkçvÏJg²s]¼Ä†µT|óö¦² áa×[êqB];–be6·{“‘ny}zKÝæôT‹X™é,bå}öRôpÄÊ$<¨šâ N ™ŽbZŠO?Õ\}ø,zЬ4Œ‡-Ãñy’=ó¯¨ã Õa¿ ¥)˜æü«Í†(™„Œ:#޾ QsšuȘÅŽÒyó¯š8ο"Yä8Žå`ŠÐ(™“ëÙSç3ƒè%wÑ=uÌRs+NXbnöÖ!&‘~¨VñX …5?_ïvCÈäã„ìÄסÙ‰|}…ìD¾vn÷¬t&;9.6ù¨ÉQ Õ}òyRY:ºÃž;ÕG«8!ôÐÆˆÄÊì½££;f: •AÖÎÊ ÿŠÚ¦¼‚X;KA’HV¾qIc 1PAßùWýÒW$ÁÖRs;FÌyk:ªƒ‰ô”v¡Ó¢n°â˜Qn7„L>NÈN|ŠÈ×WÈNäkçvÏJ[²cˆ”Œ#H\^ÞLuÏŸOë*¬Bå×f6wGvÐ1—ßò9‰éïÙ‹ó’tïbeÎbbù3Ë ýÄÊŠèN@±2:sÊ7§}sê7{ïì7zïD*V6ÓYKt›2=õÊÍÔ»KPªmµÅ­5©q#Jv,5çü«”š3En©¹™¾â{´O5·–šÛ±Éq#L‡šQi¦Jã‰aãÜ—¸Ý2ù8!;ñu(Bv"__!;‘¯Û=+ÝÉÎÁx:Š–¹M¦{˜Ñ£ ýðèF®T ±2E­_¡<›Új@ò…bÑY9&bež•݈•Ñ{'Pgå—'7Uï ¬š½†SçÃè§Sr5#}…¨RbìãÃ~>BûÏ¿ª£‰ÓWÔ1}Å îL_‘¨±ºl?KÍAà ™Óc!Õ1KÍÝbÃÅ“šêŒ¯`j±öùWn¦š[KÍ­Øüawg-r7…ÉŒêtÏwÚØ³–k,Eˆõÿà÷J»Ý2ù8!;ñu(Bv"__!;‘¯Û=+ÝÉÎÔ€+ôÉÎ}ŒîÊ‹îlé[ÛÕï›÷æŠèNÀÎʱ2lDbeLð¦ƒ7;+3ôÎó˜EBÀ)ày•jòàF¬l¦³V+¿8±‰zói‡ù†ñï06%Lv©¹N_Ù§š³Ôœé+#ªsÎh ‹©æNƒb‰ê™¬åæŒê[j–"Àû§n7ƒL?NÈN|ŠÈ×WÈNäkçvßJw²s[›XÎ…‚d~·Fw–ÜÖ9¬beÎÂ(…ow ¥£;¶ÎʨΠÖYÙ+ŸF¬Œ¨HP±2RHì¬l+Ÿ˜ÐD½1§…Ÿ­¸ºº-ªSCWv1ªÃ¡£ÎQOúÊI”œÕiä‰ê%s:<{ê¼bgQ2"Q :çØ¢:œjÎRsŠ’mSÍÃ)5·bóôôæ~Q’Ó3Ü¥D£Àùv·›A¦'d'¾EÈNäë+d'òµs»o¥;Ù©…pEXmXÒ/ºóT§r®~×zoÎbåκt™k:‹N–ÎöÃÅÊ/a”Ä‹¨Î:N±ò£žèN A¡·¨³2 ÃybeçA¡ÇÆåª×far¸Õ kbºŠ•[¬àJëRó AJÍ)J¶L5„ǃ7ô64£:$;nÅîQà|¬ÛÍ Ó²_‡"d'òõ²ùڹݷҚì"å?EáB’–]+h²cÕîqê½cˆ•™r‰…XÙLgyÅÊ%Š'V>9vV¾Õ37‹Ff¬bå£c«W§5St{ ÿ¦Æ‡D'+JÍñ~ƒápS¯ZZänjuˆ'F ÚºA”ø¾ÊíféÇ Ù‰¯C²ùú Ù‰|íÜî[™@vŽEé ‚:©å·Tó’­Ý°”BÓ@ÚŒ`÷¾XÙP(S.f)ºïæZŸÂôÝ9aDwØ{†=h„æ‹'&åúÚÄ\Åê-’¡˜–šã¾KÍAtR©ÔÜÄÄÞõõ,,ÕAdЊ%ü}§‘нÇ¿Ž\»×íF Ç Ù‰¯C²ùú Ù‰|íÜî]™@v»ÜøÝL\«`. RG›ƒÒÑÏÌ,´ûÇdtö– çüÄÊ$<ÛÅÊŸ„#VÆŒ*{ge{:+2±²§:‹bev9ö”¢ç‰•<ØPßX€H ‡­¼DÇÕ‰÷T󠥿è”L½“½ÔüÃemuo#VÁq½ÙóÈþ•§ [°¢Ž"ƒ5$ žwYe=D–¸YÍG¢lÃÒ<gÀO~XØOá`)ı“ÝnÙpœø:!;‘¯¯È×ÎíÞ• d‡Nâbà ¨ýin_88§â°ƒŽÑc":‡;r¢µë{ˆ·X³Ÿ‚vVfïKgåhÅÊû†7PG R¶›¦b©9»Rû4´–š#}H­Î:jÑx$¥æï,l­©[Âg²¹CTç;`ªoÀPiØ,Ø?]ã)°†çF·A6çDvðÿúØìcü[Yì\²Ö÷pÎv/gì÷‚ŸÿÃv̲$Þï Û½p‹Zïÿ~ÞvÌÇI¼ßKî7)Õ‹BvNÙ>KãÖwdÒÞw².ËëÂ)œŠÂ1|Žß½%ØýÀ)僆ýË$=¦XÙ:$tÓZ;:¹"=LgqŽÒO(]þÓ²}{ïx­og娋•u:+bå=Cë«Ã@Kc±C4Ô’ó´:蔌ˆu?Ôÿ8Í¿ÚaÌ¿ÚåbþÕQ4L<>¦‰:atJö…2x‡NÉoó¯8QÞÕü+§©ææü+ŒùÍ¡kϰú ÂcÑ1†}ZEÉ~Hžƒ ‡É°}Qàš8¬ËÏYºŸ+Ù±§¿¿˜¬ç²ßoûX_!;*ò5v Ú¡>Küy¯¤}ž’uáX^›ú38FƒÆÂŠ„ºS6óþ:¤r‘¼ê,o:«€vnÔf°,ýíîÒZ^±2 Ò#Þ¹Y,E7zïpÊö§±+£Éž½³²XÕYï ³r±òîÁõÕtö1èx8DÔÚ@0QSÍ™Ê wª¹™¾r=ÕÜFtHrõTs ŠÕ’Íô•1·oë_‡•|Û€§Ú¡pǟ㸫`ç#À÷/nΟMÇD@vþ¿Ó6Yk$d'rGìæ Ù‰n}# ;¯âw ¸y7ñ8&íÓX†Cè†3`¹ïZXŽ›Åq7Á>5Ïÿ œÚô.å5áñŠ•t–žŠÂ3¨BaµkH½åé~be ÖY™ÕY>s³œ…º+&VááTñ<±²§÷+¥8…|«³î¨£µ;$/ì½óÜÀzjß̬zÐ0þÆŸ9Í¿Šu©¹gþÆBó¯BO5Ï›‹Ró·1ltƒ :…T?´% ÑaÄm ÌôIòÙy-­Q¿¿SS`ÅCáÇ„Q0NO©çC7Û~&Ùy ÇøÆ{ý„ìDçŒC½!;Ñ­odçŸ8v,©‘æL!;-]’Ó8®C¨A šâØwçÀºº*˚΢“£³ã·{¦2X­õ5&c»7S¬l¦³¾K¤X™½w0@ÓiP¨î¬Ü1„s†qr|Ç8l¾Ç_¬¼ãþzÐ,aP§Í8͜рSÍYj"Åê/Vñz¼î^–š\jN²Æ ³pJÍMQò{ ˆ°zÞ…(9ÔTs’UjµW,¢8VÄ;èÂukOiË+’ä8øÿ¿»KLVÀ±‹aÒ‡J—NssÎl:&Ù¹ÿßníSa]„ìDçŒC½C!;Ñ­¯Ù9êðYâgËU`!ÔûŠöç™BvøÍ÷AÀwøÙ}°|¡ Ç”ƒ1-ö¯P…ßè‡W-šW…oó:ÂCç7°\!õ(¾ñs(fÀs¹+S,°³2{ï@p°³²E¬Ì˳©s¡Þ…º=(4”X„ÇÚYÙì½³^÷Þ©¥¶÷¯«žÂb3’œ¨§š›ó¯ìSÍYjÎùW¦š³?žSÍIb™¶X¾°‡è ¢×¯DïHV_qxìâP82~þ*þtådq\sØñç½3Ö³íçNd'•×@ÈNtÎ8Ô»²Ýú:µ¡Ö<™?ϲcDbÎ:lþÇÿãdô¡Ç€ …ýîÒ9i'ÆãYUð ¥(ÕÔïxOa5) @]—c!V&á ÚY)ž`•£+oíSGm ®Ú1 Ïøï5·Ôô%3 Æt˜n èÕi ÓgŒêìgT"NigÔ‰SÛIÊ‚‰’_Q2µ:(¿ÜjÎRsŠ’mSÍ£-5'yÓ¨¤¢ÃS—vÎðœbê-—Ú- Þ˜b] « ¯æoűØ;ªúnΑMÇىι… ÖWª±"übí:Ãìß{¬kŽŸr8&7Ô{‰×Ï…ìDø²£}!Øð—Û6ýøw7çÅq—ÃÞ‡äØe:Ã¥êt¾åÓ j§8¸ba5÷R¤µ¶utü¦ï$VþÑ -Vn«Xatnæf±³2œ<»³k0…ºfïN'áaD$±²™ÎÚ¢ÓYy•7÷ª£¶öƒA|«‡­…¦‡F}{ô°WÓ`‰žj®KÍ‘¾z±¡Õ±—šCî¦Ôü—ÝÔsƒë©aUŠj]–&:$[u:ˆæÌº¨bØÍ&mxúø÷£°Â¡ð‹cŠÀ(´·¶_ø/ü;d3Ô¹3íçBv„ìØÈÃ¥äAJÏ]úp!;.*Ö)6÷†Ã` þKÜœÇՇ펆äX—cªULwWö`™N‘Qj;Æ`ŠúÙ¹þi­HÅÊŒRPƒBg®£;öA¡Ó[ê2ìÓS[h/…¼,Óö¦³ ±2G/øuVv)VÞØ£¶ÚÜÛߘâJ«Ró-è«rɺ Züh”š¹¹ƒbk!•ŠxˆR”${u::…YPë–b…'œç3ØÍ.±œƒc)¼gtèE7¿“mÇÙ²#d'v²“<²CÃXþP›8Ž)› ¦ó‰Èi}Šª§¯¨¤«qì‚e“ð «ZD§|(N¶:FG±òŽÈ;+›ƒB™Ú ÙY9ˆX™é¥ båîµÔ†ž6ëA¢ã‰ê°z+TT‡%ïÖùWgAòÅá¥yó¯š%¿®ç_A«ƒì”ìfþ•›Ró×g·Ð$Õ$:Ôb±‘dž ¹€z¨vqunQëˆ0ã‚Å1ÍBáÚHmuÀ±}Ü›mÇÙ‰£sÂŽ¤±"__IcE¾vn÷±ŒÑì¸y`†öé`?ºp0Q9®è3èõ;Ö -:Í¡UЍ9—TT_"š`½Ž à(Ž$øÞ©÷Ž!VþS¹u):¦tsZ7§vëA¡¡ÄÊж¼2é,#ºc¦³¼be 5æf9vVv+¯¿ÄæÞšj]w‹áß03}¥KÍ‘ö¢Vg›¡ÕÙi4d‰»]«sÈÐê°RŒZcFAÞkÞü«ø—šÿ°»³Ú~]ˆÐ‹øŸÊ«jþ•ñ®Â›‘þ(˜_+ïërŒÿæ)d'¾EÈNäë+d'òµs»×e Ù“è{#'1éyY]eVh1ía¦´LÂC¡ëDÌûr%VÞÀFƒô'Îsrì½chwÌèÎëÞtVsÎ )V&áH˜baІ=ÑÛ P£}í]5Õê»jøÉ;%%ÛJÍ)Jv˜jžŒRóO×µW³AF‡”úDtŒÊ«¾Ðd1ºs`Tƒˆñ!) §>i͹Ün.©v\€ÒsŠ>­V-Uî;Cª±†ÙÖ÷¼M'#ã" ɲóší]ß*Ÿ%ÞGÆ“8…ê°†–!ÑŽIë>][Å‘ðPÃÃÏ𜢊u)R¦ô+ã÷©1ÅÊ_ùtVî þHÂcDwÎëèŽ;±ò© beOïVC±*Š=oì•­½wVßQC­¼½ºŸ­w%oGÏöîy®ˆÎýˆê @Bhƒ8}DÇš¾z©5Nk?>Ö“¾Ò¥æX32ÅÙ_Ô!1ÆBIJÔüÔSÍtµU0¢óhý’Šd6B‹ߣ þŠTÚLRý^°?é HµWÀ\š*Ï‘†dçëk_o!;éKv¾ ñ¾“önÓ¬©òÁŽõ}À…M„ý5‰ÉëÔž´‘î»C‡5£ JÓ‡¡_Ïì‹+ª/6uÐ%ê¾é,•Ixâ-V1qꬼò6L7¿µš-¿¥š§+N¥æ§§)5GUÓyï Ý–š³‰à–>µÕðjE5 ÑYtmUMbSW¸‡=0)3w¡ÄÆ\ öyˆ ZÈŽ‹µ  Ù)еý(L“4‡ˆû”j¬ߵޔ\pÁÍBv¢XÀXlþÕ`_¦ˆ3ò:ÅW¶Uã›”2µJËÓ‹‡„‡BØÓ3šC¼ì<(”ÕBftÇwP(ÈJªÙ˜ÑNõf)ºcï6„vÇŒî¼ôX399 #)Œ¨ê¬lŠ•ÙñØŒî<{KuµôƵô&Ãøw؆;Q¡£RsÞ£Žê "Å{?í8ÿª•¿(Ñ.®ËÇ+Ûé(çŒyEÉ–©æ‚,ÎìVQGÙ¬D‡UWfÓÀå ©Ã£¥ ɱÞ…ö>=9bñ9ÊÄs`s®cëúب…ìD±cMëÀVÂ8"ÀÍ`H!;iÙ1Ï]xÏïx×I{·ÙÙaÇä¦áa)ó²›s|DËfÎOb:Ü͈0p„ÄÏш•Ixì¥èFï’’†¨ÅÊHK-¿©šZ|]U?Û²c%‡3ÕÜ%;O5Gu™ÃTs;<×SÍYj¾­“:9¹©ÖV‘l’t2Úf6 4«®Æ¤ž¶m*ÞÓfXȶ™H^"}&lεaN£"RFŽûëj»ÇÎöçÅϯ´Ó4Ò5‰åïឪXß7mŽ1i÷QÞáëÆrÜž ÷QÆá^|š‹âç5Ž Ù0×í=DsœVùÙº0šsÆúw3Z³p ,œá‰ sfG'4VƒQ•åm<ˆN˃ѿÅ.“ð̸°¢ú‘snÖ÷œ›…Rôoà ¿‚£þ‘‰Ïc VÖ½w¼Ñ¦:ºÃro–}{{ï+/½!G=su?cV ‚öRsV€…[jΦ‰Ñ”šsýÖ£‚ŒkM¢C²ÉæÞÎÈFy9£T$©©Fœûy JÁ(¢±ÞTå|+kàŸO²#ï)þP©´ÆMv¸Ðp¹©˜Ò¢£úxu;5±yÂÆu&á¡fÄáå)Mµ³¥N$\±²™ÎòvVžíßYÙG¬Œtçf1²Â²o3L¬¼äº5ÿÊʾ†rìÐë*5ßg á¶ÔÜ%Çbªù{(ÓŸÞ¥‚‡èúFÙÌÎÈŒðß8UIKÑïO¥ÍDî%»œG$ï[ÈŽ`$ÜÄâw2žì„§ CBËÎÝF~Ú×EW1q$µ!yÝ–ótW®o¤­|„Èž¡žŒ¶Mh^Z}´ª]ªŽ“¸:€œCœO"1 dGð–H¼Y¯•dÇ <ÅÊ•”t`/Nn¢õ"f¥–WÇc4 $á™Ö¹¼:¿¢­2ÓYÔ›+›½wòÄÊ…†+ëtšû±–¢Û{ïzç,B'g'’c¦¬%[{/ÒV ‘)ü¾ÙóbÙHÓg#•wåü®‚ñ³Q²n‚ñDa@ÈŽÑyÎ¥Œm÷SÖ ~¾±ƒš N¿ujË[¦n‰ôŒ¨VLíÞ@wVÖ½w"+·P§¬é¬`bežéÊë™_vÛÖ³nЩæŒ9N57ç_…1ÕüªµkVÚ/’cöÍé’È”Ö+O6KÙ÷k`ï üÙ8Q€\GœM<1BÓÖÇf7áß…ây]9·àÚŽ!;–6óp2ù`l¿Ÿ²ñ—ƒ]ÕÆ^µ@x èùZޤi›…hôGî§k;蘄é$V6…žeg噞èÎk¶Þ;'kª…ç P[ge ŸêP^mTÒÏHvÕa_FuLQ2#CìÎ|ç¢ÈY”ì)5}zK}_¼?V‘±´Ïü+h‘v>PW÷ᦫL’ÃHX_¬5E$‹©ünqo¯Ã*ËF-µ`@0 ˆ-„ì8ÌÔùÆvü)ë9¾oq_Ò£»0#ÒC!ó¸ÜRêµéÍ›éýqU{M~Hx(V~?±2 enÖÔvåÔ£èHl5v(ÞÞ«®0ïâ¾ÔÜì”ìfª9…Öó/«¬õK,#g÷i¦«¨m"É!!äú°û4µO©ü>qo»aÅdƒ‹í'ë)ë) Bv „ã¹ƶü)ë$¿ÜÜQ=Ù±œêSÌãÔuzË¢é¡ó§xyç€zF:+O¬¬«³ØhpA€ÎÊaˆ•§ ê‰}lØðPÿÛ†îÉö¨»13ªcN5§è䌅€>ˆU`LŸq„E¨©æ/Nl¢Æ4,å!8ñ`”‘3ÚÅH×dhå¢êÔ´”O[_óaùeS–MY0  ÄBv‚LK†j c{þ”%<¿ê¦6÷©­ú¹û‘£dd`¼›Ñ¥ˆîàßïjÂc+ç õvV!V~¼UY”Àó³íèžÌnË2›SÍMQ2µ:'cz,øü«–ºDžbjFrX:¿¹wm­Íñ#ŠC’ÂÇ5è]´€šÒ®¬úbsʧ­ØØr„lnñÙÜd]e]‚Bv‚£R«:Ò¹T&<¼·×g·ÐÍózɯúÀÙkâcêzíñ]¯„zéñfÞRtÿÞ;N•C‹•'µ(£(Œ¶ÛŽÞuÕA‹V'PT‡U_Œê„šjþF\̺°¢‡ààyÅ1SU’“_?ÿÆžµI`Š¿³¿âþn‘ÍX6cÁ€`@0 Ù Av ÂS މíúSÚ~µµ£zªS9Õ³P~Õ NŸÎ?/ÚãÑö @4ds¯Úz¤‚½³²±2£0v±òDTA Cƒ>_+¢vô­—WjNQrSÍ_x´±z¨vqC‹ãÅ!ÁéU8?:KV¯AË”êï ÷ÇF–eƒ‹ÿ'k,k, ˆfÇÑ1?(pNa+RÝ‘2¢±µMv4é `jÇ$>ŒøLGo¦…>`:+˜X™ƒB¡¡ ØYbå MXòÍ~¾¶dÇiþ«ºH˜Xåõò$DuÌRsT1*°Î¢‹ó»Xµö®š;>c‚ùôèŒ/·tL¢ó0TW6`Ù€‚Á@â0 ‘0ågÅ6þ)íXÏ¢¹ Ç!ÜW Ÿ&¾ÄÇñQ½˜:6.×3J"„X™SÇY)ErbFw¨¹¡öf\ãRºC±Ývö«çi a©ùé§šë¾B¦ÇŒàðYzâ™zàÙz̯5Ó`ô¢V)Õ߃q›ðgaÙxe㠉ǀDv"'<ÁyýžŽv;šî1ºs/: øKÔç ÌŠz}f Ë PX™é$6öc)8ÓY>•AxNŒmª­WR—½kÁ°iø÷sýë«°KÍ1¶bÅÍÕuÚMGo`ŒN™‡Ï@cÄç«mi‘¶"{–O6¸Äop²æ²æ‚Á€Dv"$:–Oc8±ÏÓð¼5¿•—`’óO+ùa¤äШFºÝO¬<Ý¿³²™Îz¤n O˜ÍHvÂ)5gŠŒbg+¹áýYï™?ÛÚ¯Nº¤­Ø˜²¿l¶²Ù ‚äb@";ÑžJphgÒð|»³“šÑ­‚á±’ ¦‰–ßXMC*‹½mØãæ,J¾_7…:ˆ•ªUB§™ì¶ë~‡‚N¥æ»Õ× ídÌúï!hH-R:¬5î‘ )¯’ .¹œ¬¿¬¿`@0 ‘(‰Ž%ÂS ŽmWš8aµkp=ML‚‹ñ5ñ*Dɬ†b:‹ó©òÒY¾båQ5Š{4A6Ûõ@}ÅaŸÇuAT_95yZxUUý»ÁîgZçòФ4YãoqŸ-e“•MV0  ¤$²;“îé4qÆê…­Ð°hP‚AÁñÞ¡ BŠ•G¢ªË‰¨ìP_Wk™’í¥æÇÇqäCÉà‘&hvv ¬›.$‡÷É”ÕeƒK NÞƒ¼Á€`@";1":ÖÝpǤ¼ƒþ~Wg5ûâŠAÉ53‹®®ª§Ž+$;œj¾£_]ÝÕ9X4‡¡ßZÐ*å×Ñò®Ùx²”l®²¹ ‚Ô€DvâCxn‚Óã8€´pÔ{GÔ×åÝÁˆÇ˜%ÕIˆ™Î:c+¬áÙÙ3¨ßü«W&7WOÿ¡²® v½™VPßîìœëg¼g6œ,(\jmpò>ä}Ù‰ѱèx:Àùý”.„çÝ%­ÕƒH‹IJ8Q}çõòÄÊèxÌÎÊÈÎÞÁ t/sªù‘‡«Ñ¨Ü Fr¨%Ú5¤^:‘6˜'ªl¨‚Á€` u1 ‘øž:p„¦ áùawgõôå•C¦µæ_VYuðôÞ!Ù)îø;ûHv Qòæµu/ž`D‡¢s‹Z§ÑacÉ{eƒKÝ NÞ¼Á€`@";q$:–OY8ÄÓ…ðð>Œj¨çi#&ì­sll®z ÑQ5ÉÎþ! 5Ù™sa¥i«9—TTÔ¥Ñ:±¡äE²‘ÊF* RÙI á) Ǹ!¹ú`y=e<áa¤fK¯:ÉÎVüì¡ZÁÏA­5Cé´6¸W6’l,\êopòŽä ÙIѱUjMM'§þãÞ.ꙫ«%<÷Bh¨gO¨^>#kSï-m“nD‡ $+Ë*¨`@0 H Hd'ñ„§œ%Ǥ“þÑFzòx°(O¸?£6ˆ¡tZÜ+G“ .}68yWò®‚‰ì$˜èXtŠY)HxÞÁ=U‹Üò»²9 ‚Á€Dv²œèX7‹A°ÿKÒs÷QR6)Ù¤‚Á€` ÈŽ/@0®ƒýO’ Ïr\¿@,À-çMR0  $²#DÇì‚h´ýÂÆ‡cdc’I0  b‰ìáq"<5A<ÞO áù®uw¬Á-ç“ S0  $²#D' Ùù(;šÂó;®q¡lH²! ‚Á@¼0 ‘!<ÁO!‘5q$<ŸáÜân9¯lœ‚Á€`@0 ‘!:®È.ɤ8ž×pÎJ²ÉF$ ñÆ€+gï›ó§>ÐALzÂþ#ÒóÎSLÞ{ê¿wyGòŽ‚LÀ€‰î¸ÆÊ`Ž’ðÌÅïçÏ„<ƒ8Á€`@0píèä…¦Ç ÷{Qi û*Âóoüΰxߟœ_p* v Ù‘ÈNØi©;áù+޽Q6 Ù€‚Á€` ÛÑ%ã&åš©÷áy)Ûç‚ðü„cÚË;L½w(ïDÞ‰`@0-²#‘ˆ1@í laÂó!~V'[>Lòœâ8‚Á@jb bG'/45_h2Þ ÍC0jr”Å^ÄßË&ã~äš‚MÁ€`@0 °b@ÈŽDvb‚›Û`3ÈÎüYX6Ùl‚Á€` 0G— "÷üNgØxyÉòä‚< Ù‘ÈŽ`@0  Œ~8aµòÍF0  ‚!;Âæ‚Á€`@0 Èh dôà ›6/ ‚Á€aó‚Á€`@0  d42úá„Í › ‚Á€`@ÈŽ°yÁ€`@0  2ýpÂæ…Í ‚Á€`@0 dGؼ`@0  Œ~8aóÂæ‚Á€`@0 ²#l^0  ‚ŒÆ@F?œ°yaó‚Á€`@0  Ù6/ ‚Á@Fcàÿ §¢Í·ü¸mIEND®B`‚fifengine-0.4.2/doc/logo/FIFE_small_d1.png000066400000000000000000000340011341615052600201500ustar00rootroot00000000000000‰PNG  IHDR;5d  sRGB®ÎégAMA± üa pHYsÃÃÇo¨dtEXtSoftwarePaint.NET v3.5.100ôr¡7pIDATx^íw|Å×ÿB !¡÷Zh‚t¤7Q¤I•^¥‹4)¥KPD@zï5´Ð ¤©¤òœßsÏårsovî½3»³{?¼òÇ÷kfÏœyŸÙóÉîΜyï=ü@ÀÏϯOŸ>,]º´Ù|½zõvîÜèãã# O˜f$E$H$Kñññoþ÷_Ù²eÍW7jÔÈôcbbþúë¯öíÛ{yy1ÛFCp™ ɉI‘I“Ìÿl*–ù·QQQëÖ­kÑ¢EÚ´i]ö@@@À’’+¡bT,s³W¯^-[¶¬qãÆà   |¤J•Ф…†dÆžP9ªXæöÏž=[°`AíÚµS¤HÁÇ]Xp7$!$$$'$*ŠBå´b™/|øðá¬Y³*W®ìnœ1^ç T©ReöìÙ$!ìBåºb™-ܾ}ûûï¿·üæüHp%€€€! HT`8!TËlêÊ•+ß~ûm±bÅ Iƒp˜I Ƀ+B%B±Ì6Ïž=;|øðüùó;<6\  `$#FŒ8wXfãG0`@Ž9 ÀCP @éž’>¥~¾B¥Žb™zIHHسgO=|}}o£ äÞ³gϽ{÷Rº¤U&³Éï æÛu\\ÜÖ­[;uêäíím´€a<  àn(•SBß¶m%w¾jaÏššŠeö!::zãÆ­[·N—.»…ã}ðôôüüóÏ)‰¿~ýZ¡Ró­`2# _¹rå'Ÿ|’:uj}‡Þƒ€€± PšþôÓOW­Z¡²PI¢Xf7^¼x±hÑ"*Ÿ2eJc£= ¤\¿~}JÐÿý÷ŸVB%›b™ýyòäÉO?ýT½zõ÷ß_OA…¯  `$”‚kÔ¨1wî\JÊš •´ŠevìîݻӧO¯P¡‚‘æÆ ²¨X±âŒ3îÝ»'PɯXf¯_¿>qâÄ’%KÊfø ú%PªT©I“&ݸqCB¡Ò‘b™]½páÂèÑ£ *¤ß)ÏA@@.… 3fÌÅ‹e*=*–Ùç“'O<8wîÜrÞ€€€^äÉ“gèС§NÒ…PéZ±LÎ'&&8p wïÞ~~~z™$ð@´$-[¶>}ú×qÁ€ð!P @#Fœ;wNÛü(´wZ#7kÖ,ªÅ™…Z ¿xñb:DX¨ÿ'™?räHÿþý³gÏÎ ‚€œ9s8ðرcfCº¾víZ¿~ý2dÈÀÅÙFY³f¥¢´÷ïßWaDZuAKThùÉ—_~IïEå„ë@@ÀY²déÙ³çÞ½{)i•ûTè—ž þùçZ‹¯æAˆ´¾mÛ¶ôD¢Â5ì"66vË–-_|ñ…è¿™×h  ` ÞÞÞ;wÞ¶m[\\œ†ÉN…®#""è”Hú&§aôè°ß~ûÍ0u@ìEÞ…nذ¡U«VéÒ¥Ó6º0OOÏ6mÚÐ~£×¯_« ÚvAë³iÃoÆŒ% }ø¡•,?Ö‹ ½‡‡‡¯X±¢iÓ¦´Ç\øp@@7R§NM›^W­ZE*$,Í» ï+Íš5“³|Å¢cÇŽt„•æ”TpàÅ‹ .¬W¯­¥ÔÍÝGA4!@i¢Aƒ´töƪž4ï‚6óR%ËJ€š`gì”¶c¯Y³ÆðoeM³‚ž,çÌ™S­Z55¿#2Í@´$@I¡FóæÍû÷ß5Wu  ¼Ã‡×㢵\¹rMš4‰Êú©Jó^îÞ½;mÚ´>ø@Ë;}ƒÈ@€¾ðϘ1ÃØ‹ª­r.³K[wõþÒ‰ŠßwíÚõìÙ³š+ŠjÐ6ƒ &”(QB†>€¨G `òäÉ7nÜP-ÝhÞ­Y²d‰åáUêáÙSÍš5ׯ_¯÷c0šT#Ô¨Q ɶA´&P¤H‘1cÆ\ºtÉ¡¡÷ÆT\œ6çÒ]­ñ ì?oÞ¼TÈñùóçz–CþŸ8qbРAôšT Y˜ЄÕv( ñÑ£GiC®û,˜¦­=zô¸xñ¢bÇ>ÚÉîãã£É=eÙi‘R¥GÍÓ×OÓŽ]¹¥óôTÔà·C/á‡þ¤hGªý'OS„Ó ÅçRùÌâLÉJUÇ%Eúòá&ËÌhã-m¿¥OtRp׉ºuënÚ´ÉØEIÌ’vïÞ=-[÷ÙgÄv••¤å¾àËŠè õWô62>1y;™2eR4"[ƒç± ŠpŽ_Ðßûª¯Æ§8.YË6-øúCK¢iË-*®š&}é™9sæË—/ùB–Íi³ 7+™(@±ä¹kô¤X´ô@p|=¡ ¶T§Ž6Ûʼ¤òÁËË«OŸ>>†þF‘8 ŠÅ7§ ²¦'Å¢QÐÊ,½ç¤MµU«êäͬv™•¶Ü5lØpëÖ­TáW«` ê—Š³hÇõmÏP,(– Î׬ž«zõê|¯¡5ÚBK ô±NÌÑd]´hQª%¦aìøv;wnG!ˆhÅ‚bñØ‚¬éI±è‘¾ÆÓÑ‘´DDÞq›T‰À€ØGUZ$  Š%HcøšÕ“bÑ”Òï÷ Ú$K'SІYI2”Ü Ê¿T.}çÎ|o 5­mß¾]’@@± XjÎ|§ûÒ™bQ9v§‡ªÕ…TÏ›¶ÇæË—O’Üd<7¨ôÑüùó###µ ±ÓýN™2E’p@± XNOc5/Ô™b 6LM:.öE›aiK,mŒ•$+Û Ú‡;tèÐÛ·o»55/oݺµ$Aé9XOw–)F;ŽŸV¤W¸hQÅ€†ÅÄ&oG«ÛGD+Â9rFû…º ­8.‰ÐÞRÅù§yúØF›lÈU‰À¹+Tž yóæ{÷îÕ|°8P¸paI"C;+h# ¾þeÈA‘ÍÅA)–@£¥ªŠFdkÀr°)±ln+ú£³"à–D UÚîJ›^QäT1¨Ð téÒt¸"l¯ÕdPì÷Õ«W8=K…™€.@@Kr¾ö¡%!´Ñ•V3j‰}'!àëë;räHª„¤¨ê7Ø·o" `p7nT?¹Øë‘6´Ò¶ÖFáe™§‡‡ÇçŸ~èÐ!yfyBã2Cƒo Ð#2äððpÚÊJZ9 &Ô"P¾|ùeË–Ñac2L!ªË¥Ö¸Ñ€€Fš4i¢mº¡«¤M¬@·®ðóó;vìǵH%K–tu$¸@@r´˜D«DC›UiË*m\•Üc!@µoßþøñãšL§¨¨(­zbaŠ6 I ¨ü×1mMýùçŸi›*baH•*UZ¹rell¬šÒEÇu& `M`Ë–-ê$—ÐÐPÚ”*ñ˜¢ äÈ‘c„ Ož0ÐæS–x£ Ô¯__Ü#Ë´jQ*z=‡ŽˆM|#ÏÏÎÓç¹ð)X¸ˆâ ^Æ%&ßWÆŒcí¨ÖàqL8NŸUÍg–ŽúNœÊe\Ò¡ª²B³ Ž‘.äª;äïï/nŽÑ73ÙΛ–­î¾àË\b^¸¨r#ãK¶º‚Ïcù(Öñ —ÄMr',˜}zÙB± X,³Wh#+m³ „ª1É–Pà84—’®µ¹~ýº Ùuù2ŸUp|@± X‚&<»Y#+M¯ƒ²³p¨åÕ«Wù¦X“–@µjÕN:5zô;Gq“†‰«ï¾bÅ i@± X%I ®X³gÏAlÒ&b s \âK Ož<«V­2M!«ƒ?²eË&hj‘Ù!C†ðkYýü}ÜTžŸ¥¸Œ‹öV*ªVÝzÉ÷Eç«5lò±¢ÕT­Q“ œ²åË«æ3KG>¾¾\Æ%©ª¦#.­dÍšUÒaÃ-— ¤K—Ž×Pcóüùè£,­V¬XQÜÔª]»¶Ë#€½—Vd+¢£·àÈëo›6mîܹc5s (`éq‹-ÄM-ÚŽ*/x ˆ=ªGGG Ê,Ÿ}ö™ ·aV+ôWˆÍoŸ´xÎʲôŠNì4¯nݺ¥ÕðÑ/€€ÆNœ8!(³ôïß_㱡{~èÐá… ’2Ùœ-<°êjæÌ™‚æÕúõëù –@tE€Z”Y¦OŸ®+pÖ6*8K'œ½zõ*™y’ôpEÒAójÔ¨Q€€›èÑ£‡ Ì²nÝ:7ej aòÉ'×®]Sœ!k×®µ´¸g÷F0† à *(æ#ç;vÌGÐV.ŋ߾};cè§M³>ãàñãÇŒ×:ÚŒÖÍËE Þ€¨F€NŒ‹‹s4k°´øð¡j£@G øøøÐF=‡fE¿~ý, I•˜˜È2Im“ôƒÇÀ€;š8XÚSÎ’íÌ=CSS¦LÙ»wïgÏž±ÄײM³fÍ,/\¸°£ÛoÞ¼YSBè@@kâjl,XPëÁ¡VuêÔ9þ<£rX5+W®œe7dÊ9;ŠWÑ &¬ãQ½]ǯú>{ŸüÏŽ3T÷ËÕóæË§8®;ᯓïÆËËëIdLòvîEƦJ“ÆUwÕ½~ÃŽÝŠpdkÐiØ;ÕÔÆ£7z¥£˜)œkP«V-†Xô‡ÅÆ ±é*ßwkÃtéÒÅkÉ\+ó&?–º‚Á¡÷ÅÆR€õÂEý£Ÿ˜|Ï,gG&¼I•&­€4yüÂ%E8²5øjüw‰¨`š*™ bÚ©S'üGN ¿|§L™âbÉZªÕdåÀ7ß|#hFåÍ›×éÁоŠ• a(– ; ³ºW,J[öv†:Ãò’1cƈN°ïª­NU%iuŒ‹!¦ËCBB¬| ½Æ®›Mj>°97Xu®‚bA±DL{î6u¯X4Ï®\¹Â \°`:ɽ8D råÊ÷KÑ"x«ÞÙ—Å;4ëvìØáÐ0Un Å‚b94ŸµjlÅ2ŸÁâ¶mÛTÎè.y¹rå¢Ã¥ø.=ÿõ×_­:¥§.¾ÉdmêÔ©2ÇŠÅ1í¹Û4‚bQî\Èà¥K—dN1nårD/i#""¸zìØ±V$-O!áØÕŒ—9dP,(ÇÙ.ΔKÐräððp™SŒûøÖªU«ÐÐPA÷}³$IëuT¤H™CÅ‚b šù|ÍA±¨Ì_(fkdYæ,cxßÊ–-»oß>AÁ5™µ:_‘öf‰è.,,ŒV‹È/(KÄÌçnÓŠESíöíÛÜÑÁ2eÊÈœe ìM+_­µœ*… ²ÄHõ/DL¤H¬º7=|1ùŸY‹–J>ФîeÏ‘Cq\Û)õôôžÒÃC_|~øñ'E8²5¨Þ¸©¾ ÛövÆ " ÿ6]W4hÐË—/EÔÊ&-â *‚–xmHŸ5k–®‚gAD=z´ˆ×§O‘^ö5&MšÚ«`szܾ}[†Á© ÐqD|SÏo¿ý&õ€Õr®FgΜáËV+k6l°ÂvðàA¾ÎlܸQ­È Ý ãˆø¦žýû÷ëÇ©€½ ãäùFŠÝZPPš;wî°_ÎÒr̘1|èà €€ |ùå—, …½;¿Þñôô?~|TT;.]´4hå-2eJî;ɰ`ÇÀICnè8"¾I“–Ð÷nþéÊÐO?ýĦ$ÖZ¶li‡E”3ç® N¬X±¢%\ªþç„‘d.yôè‘öÁƒ º pîÜ9¾ ¨J•*º8w'ªXÙ²e³dÕ®];¾fË–-Ücƒ Æ$°xñb¾ ˆªÂ“”Ò¨ ©X¯_¿¦”–C>|8ß 3qâD%´ø=€ü/¾}ûòM@Æ sO´†T¬ëׯ[Esîܹ|'LóæÍÝsÂ`Ô àþYbΜ9;aˆ ©X»wï¶ ÷rSùóç7Dü1ñÒ§OOGqü«yÓ¦Mâ½–±C*Vғ샃ƒ9ΖçÏŸËKø -Ž9ˆj=H;R¡ŽR±h‡™4¾G¥ìÚµKhP`@Àhø–‰{öì™Ñ±ÇŠÕ­[7ËÑÓ1Áÿ¸!SÓ¦Mc£‹V TiÒdË‹×Ëî1Ièh"¾iˆÞ4º¹wFiHŪ_¿¾å K”(ÁwªÐZy7œ*2_»O‹NHŒK|s',ª@‰¾ÆaM:uêÔᛆŠ+&Ý Å;dHÅò÷÷·$רQ#¾SÅʾø(¡£(ðΉØ?®¶.Ül´c<>>>|ÓPƒ ܪ!‹Š%Z†²G§Jxx¸ÛÖôrÃDÐéÔ¤á¦i™ø¦J]wL>‚ØÊköÖ­[3 %ïP…yf<Åzúô©­I“&qœ'‡ v#tFv£O> ìÓß7kV7¶;uýúõ3Ñ„ ܦñëôéÓVq\¾|9Çyòã?ºá<ÁA\%0zôhŽ™héÒ¥®:¤Ãë§Xüñ‡UöíÛÇqžtéÒE‡q†Ë Zhܸ1ÇL´gÏ­¤AÿÆS¬Ù³g[qäûö¸téÒÄ ]‚èÕçæ¨X7nÜÐ;'ü7žb 2Ä’­’àx6 ÕØ¥oæNp–篌™†M™¾ïâÕÃ!7-Öí9X­áÇ¢ýœ·z½U¿æÿ{(äÆœÕò+!Ú“ýôÞ‡O±? ‡Õ»TiÐX´«V³ä0|†¨WÍå*V´œþû¶SÁŸ÷ê—*MZÑã5Ù¯V¯Áï»÷[ù³çÂÕ!Sƒ2fõSÇ{yðà/ÑJZð[㱩ҽñ«uëÖ–äræÌÉk†“'OªQü°hyT|¢= ô‹Ï^.)poЕû’íOÚqö’è:}áÒhû¨þÛ•§/ ŠäжSgKò–m•ÏÙy×¼ÛW‚0™-R¬øí§/’ }X|â䥫­Ž\ê’6ÆùV8uÃSe§X•*U²œ‹•+Wæ¨X ,Ðf¢óèµu×îvÅʂѵ'«&**–É‘%›·ó±mí»³L‰KrJ±ˆÆË¸Ä,¹òˆc~ÿésEæô'D³î½Åù …eZà§‚½ÕÁµRŒP°ÆS¬9rX2£G.ö  Ø²gÏž‚"Ðü‚µH bÅ9Á¨Xï?çÃ’ß7²pˆLx#ÎÙ‹€4lßIÐx½½½Y€S›«6 òA³Ÿ}ö# –f-[¶”e`jùa0ÅŠ‰‰±z±@ŸµXBÏØæÃ?T+2üûùõ÷?,‡Ù¼mz©`úwêê ó¯bfjKÅŠŒO0;@ÿ#*.ÞìÃ¥ÿòÿÿY\¶áOKuš63»qáf¨ùW†T¬W­7vùºwv5éØEóL™2Y?vóžÙ«ÃÁƒÖX/ôä’ffóæÍ˘kXš 4H³‘hÔ±ÁëæÍ›V ié KèYÚÄÅÅÑ®OÅ¡[+Åú¨a³Ñ£—®ª¯Xq –£ŠŒÓD±ÊT­avãìµ›ÆV¬)‹V˜ûó²–Ó^5Å:p5ÔìƒU5ã+œÊ®³¤–6AAAƒ®LL±öîÝk…Ÿ¶g±„ž¥Íùóçu[kg¡X&"VÏXP,Óä‡b©twïØ±ƒ%ݰ´Ù°ÁíêQL±–-[f5í¨KèYÚ$5®ÒçÔ  Š…g,N7“ f¦NÊ’nXÚè}í² ¦X'N´‚@eYBÏÒfÀ€N–ç( Š¥ýýئM–tÃÒæÉ+”´'e˃)Ö—_~i9ÊtéұıMo?xÈÍ佂bA± XÚß¹EŠaÌ8,Ítýi݉`L±6lh ²b :K›ÄÄÄ 28AXžK XP,(–ö÷#­f cI:,mHÿ´’ŠL±Š/n #f :K›k×®©!]A± XP,!·–£F÷ïßÏ’tXÚÔ­[×ÑÞuÝÞ`ŠåååeŽnݺ±¥Íš5kthrŠÅ‚bIqÏš5‹%é°´éÚµ«CRË #)ÖóçÖeuÆÏt–6_ýµZ1Õ ŠÅuw9d·S§N,I‡¥Í¸qãêZï¤XgÏžµ Ç’%KX‚ÎÒ¦^½zz5 ŠÅ’â..UªKÒai³páB)†¤–FR¬M›6YaÛµkKÐYÚøúúªQý@± XP,Qw—CvS¦LÅ’wÛÐ~d‡ºÖ{c#)Öœ9s¬ÂAË%#ÎÒàÎ;z4¾c™#ˆš&¨Ò¤åM}ìØ1–Ô£ØæÊ•+ZCõ¾¤XÆ ³â­q–TêIõÈðïÏXxÆÂ3ÿûÊ9‹óçÏgI=ŠmèYÍ9tz•‘‹ö’[FÁÏÏO1ÜŒ ¾ùæÆ×Òm( Š%ËLųb³,Y²È2*ñ~I±ªT©b ¬B… бflдiSñ¡Þ ŠÅ~›1vðÁ0fÅfåË—gìÔÍŒ¤X¹r岌H‹-cÍØ gΜˆ5 ŠÅ’åFN“&Mll,cJ¾)˨ÄûaŢëR¤Ha làÀ\æÃãÇÅÇA XP,(–wcçÎã’¡ú÷ïÏØ£šF±nß¾mŽ™3gr™Û¶m3@ iP,(K¢{yñâÅ\2T‡$•`WŒ¡XTtŸJZ¡9r$—ù0yòdÁAPÉ< ŠÅRéfcé¦oß¾.f(:«jÕª,}¦kÏž=Ù³g·:“;$$ÄÅYѲeKc„ŠÅ‚bIt/“Ø8›=zD© ¼DãQÅ]+VBBUÕ²ú|e…ÍÃÃ>hý÷ßNÏ ¨ á@± XP,á·{éÓ§§æhbЉ‰¡SŒõ~ô;%«–úU¬‡ÖªU‹qà´cvìÅÇÇ;:=H껿™•bº|íL?O#ßnµŽM|#n,Wî?2‡ ".Á²£ÈØ8ó¯.=øWœ¨yab«UÍ‹G‘1æ‰w<äª4AkŒ°Uß©ëè+ ?ÿü³P¡B6;øðà PJN‘Nkûöí´AØæèrçÎ]ºti›¿¢ÿ¾wï^‡D‹^9*2ÔK+ŲÇáETŒ¸A±LlÛvêlÉã¡‚˜·lÛβ#ž±’¹ûOúAIÍ®\¹’1]¼xÑ^5n:¸vëÖ­d‡^Ö®][Ò¡rrKwŠEÏI´¤ÂÞû[*{ñêÕ+ŠÝŠ+HºlB¢ïR´°qžLŸ>iíͰ(Vâ›7m¿ç+ ŠeïÖ;}÷QŠ”)ÅÍ=-2D1Ñ)J´Fƒ>o$@¦L™‚‚‚,÷uÑkÆo¿ý6ù/%2‚`öI_ŠuïÞ½êÕ«Û\Ú´i­Æ9vìXúïIÛÓ5jTDD„âl1ÒÂQEźþðI`ßÌsÇ™†P,(VÒ›.<6~Å–~¹lÿ‰éÌ<ÓË5ôH”L¢?Ïúé§Ì™3'iRÏž=Ÿ>}jórz•”#G½@pÈO)Ößÿmï=-=ÛŒ]hhhëÖ­m2¡JË—/OL¤ç »ÿŠ/îO™[)V×¾*V«nþ)Z¼„ ÎC± Xô,e9ñ*V­–&]:枌]ÐC’½Ü³sçÎ’%KÚtš>à+î>¦? 4qÌ®ù¤ Å¢§Þ¡C‡Ú{رcÇððð䟖öïß_¶lY›¨*Uªd¯ð?=„éñÚJ±*תëÚÜqæj(ëÀÕPg¦ŽQ¯¹uë–UòºqãF³fÍlŽ7þüëׯW|5dj@Œ÷Ýwt—‘ÐɯXôT¹re›Ì===-ZÄ>zÁûË/¿Ø\¯AZHÇX?xðÀÊÔáÇk(–)šX+hâ ÕZA(Ö;YÅR†N%“æZ ?iÒ$'ÎO:xð ½OúzÌn’+Låããc,=1_ºt‰Q®ÌÍ^¾|I;S¥J•Ô¦——•·xýúµ¹1½CÖcLíù Å‚bɰVŠõÎJ_ÔMÏCK–,±Y þ þâ‹/’þAÍžûž={öñÇ#—I«X´O.™´°‚=dV-¯^½j/‚´_xÆ ¦öÔ‹1¢l ŠŒÂ> V®‰Œy[-ŠÕ¤c¡s²uû!¡w­8C±ÞaÞ´iS–ÚqŽ&µäÛÏ›7Ïf-;¡³ÁiãÚ*m¨²Wˆ„VClܸ‘oh­QeªÙï4L½\Ho°K”¶üÉd«t™ˆáäÉ—ßÜo‘bïTÀ¢ÿkþUî|ùEône“ÞV/`Éárè=ó$úŒå™>½e¿Y³e4^ÚeoÙ‘w¦·»}³d±üUj[8¹{•7ÿÛ @½(R”{ú6H‹¤©»bªâÛ€j>-ªHh¨X´aŽn'›Ó‹6!°—Wç;Z…hà÷ú¾Õòþìµ›ê(–ZB?:$7o^:[„W^c´C•îtQö[Å¢_ÚÄms*Ñ7†Áƒ[–Ïgîb3*òU«Víî]ë³Nwôª%h¯*¼sHq•~ @±ô;czNÇ3:šÑ\oOðºté"'PÕ‹ª·mÛÖÞ›À#FPù ×Q;dzìÞ]¥³rF^Y€baJHG sçÎê&¡LJ‡RÁxÙp¨£XgΜ)\¸°Í±gÍšõŸþqHi¸4&mذ¡lá€?Ú€bi˽Û&P§N:u‚KâsÈHHHH@@€TQQA±èÌ{_‰>úè#WŠè;ß²ñýû÷©D¡T€3Z˜¶`Ñ‚u˜~ž„E`­ V@¿É m@wîÜq:å9}!UÆëÑ£‡<±ªXôgUɲ9X*2ûÍ7ߨ¼ÅÛ5Ú{+W.yBO´%ð:.Þæíü4:V[ÇÐ;¼C€NÏ:}ú´ÓÚãÊ…«W¯Î!ƒ ñ§X'Nœ°·½‰Èk²t“BFo %!/Côá°©X‰oÞt8|@@.ôaI“åÔ”:¯_¿^®\9ÍqR¬™3gÚ;ö¥^½z?vEï¾ö×_õððМ9Š@RÅz1êûéR9 g@àÿ 3&æÎëttåB: ½oß¾ÚF‚»b=þüÓO?µ9(B=qâÄ„„W 9w-À9räHmQ£w9 4oÛ¾]`wóOý¦Íäô^À[C‡¥¤æ\6tñªõë×ÛUô j ®×®]ñÇ>‹Í¿þú‹jë©1ÎÿëÃuÅ¢w}ö‹ÓÂ#Gް \D›cÇŽùùù© }€€Ú|}}:$"‡²Ø¤ÚzU«VUmÌ®(­¡ •´žÂ¦·´þ‚Þȱ YD:[KòĪ…œUk]»v­ˆLÊb“êÝ >\ò¬N+­P§uê6ç­k b© 6Ô;íP6øÅð@@ÀL€ƒ>ÀJ©,f·mÛ–%KÑqN±víÚE»€múF»†iï0ËE´¡Ç¾þýû‹†û  #^½ziRIȔͩæžèunŽ*Ñ;v¬½'ªÉ¤IÁF.ª‘߬6ÓÈxÁ'•4iÒ„ñ@Àb“b̘1âÞq9¤X¤ T»Ö&wªuKoYF$¨ ½¥¬X±¢JsÝ€€€´¨œÒÇ¥Z³;wîÌ–-›>ìŠEùèd›>ÐK:O„e ‚Ú\¾|9þü"øÀ&€è@ž>>ÜÉÀ €è˜@ÆŒéYGPÚe1KË &L˜`o5¹sd‹VÛÓyö6Óòñ_~ù…ÅsqmV¬X‘:ujçÆŽ«@@ÀÈhÝö’%KÄå_ËôH‘3gN^”“W,*looGs±bÅΟ?Ïâ°¸6´ŒØc £ÅeaËÿþûo£F¸Àµ§XT5jðàÁöºèÔ©SDÄÛÓZY|æÛ†^Tr!#  `p_|ñELL ß,ìµä+ϲӷ©X·oß¶W™×ÓÓSó§ÌW¯^Õ¯_Ÿ}Œh  îN víÚÿý÷ŸC2ý1îAKB\‰DRÅÚ°aƒ½ÓOJ•*E«ò¸Â!ƒ÷îÝ peȸ@Ü‘@‰%BCCJ¸ÜSí¾O>ùÄiú–ŠEOýúõ³gª{÷îQQQÜýwÈàÙ³g9~Ãs.] bE'Ožt(íŠh}šjý9à÷»M+T¨@çͳ늠–´¨¤zõêN‚€(¨\¹2íð”ÄÙÍÒ¦%çžN  íV3Ói%HÑ¢E1Û@@Ä(T¨ «(ïÓ {ïý’" z²þù'»(ŠkyôèQ{uâÅFÖA@À P9¾ƒŠËéì–ƒƒƒýýýC@†šï-3 jýúõTcWÑa4àF€–?¬^½š]Zĵ¤€TVÊÞÀè‘¡C‡R!Aq°[¦e⎯äZã 1˜2e {¾ÚrñâÅ´uÌ ²¯¯ï–-[„öËhœN[îÛ·¯ñæF z"УGª5Θ¸…6»téRÉ’%Íìh%•éÚ#£qz t¥Ö”žf|É Ðá áááŒé[h³ÈÈH:§ƒþFE5Bûb4NÇ+ÓzzÉ#÷@@ÀP¹£0&qÑÍnݺ%º FûôØ—/_>7š*€è‚@îܹ5?·—QHÔi¶gÏ{'›è" p@ŒL€ ÎîØ±C=¼—åË—§NÚÈÁÆØ@@@ï<<<-Z$¹œˆvoüøñz#üw!0fÌѪ §}ÚøÕ¥Kw 3Æ  Æ Ð¡C*ø©)l/_¾¬W¯ž1‡Q€€€{øè£^¼x¡¦fhØ×Ý»wK•*å^ÆhA@ÀHŠ+vûöm …D®Ïœ9“#G#cw$-[¶'N¨£šôB… ¼¼¼Ü1´3€Uü“ä¤î’6þü”)S/d€¸/ªY>{ölî‚¡¡ÁÄÄÄaƹoD1r06&$$h(3¼ºŽŽŽnݺµ±ƒ…Ñ€€»hÞ¼yTT/åÐÄγgϪU«æîÄøA@ÀTªTéÉ“'šˆë^¿~½H‘"î&Œ@@àÿ(P À•+W\ו->|8K–,!€€€{Èœ9óþýûU–Wºûý÷ßÓ¦Më^AÂhA@LÒ¤I³jÕ*WTDµk§M›FE"p  îK€d`òäɪ ÑYƽ{÷vßaä  –ºwï焜ˆ¾$""âã?F°@@@à-† †……‰V ‡ì?|ø°|ùò€€X(S¦Ìýû÷q/^¼˜7o^ @@lÈ•+×¹sçÄé£åÝ»wg̘AädÈáŸþa”Í–.]š*U* @@” xxxüúë¯"ÔHÑæ¸qã”ýC °$0jÔ(ª®¨1¼ÄÆÆvêÔ !g´k×îõë×¼4);/_¾¬S§Ž3.â0¨Y³æóçÏ…ŠVhhhÉ’%@@\%àïïóæMA¢uêÔ©ìÙ³»ê"®??¿cÇŽq­Í›7§OŸA@@€'téÒmܸ‘£hÍ;7eÊ”<]„-0H‘"EPPë¢EK‡ ª   –@ÿþýœÖ­èèèV­Z‰uÖA@@ÀD Y³f‘‘‘NˆÖÓ§O«T©Œ    Š+>~üØ!ѺvíZáÂ…Õs=€€€‰@þüùCBBEëСC¾¾¾@  ÚðññÙ·oŸ¢h­]»6mÚ´Ú¸ˆ^A@@ÀD uêÔ+V¬HF´¦NúþûHA`âĉIE+>>¾W¯^Rø'@@@ÀL 000..ά[áááMš4‘@ýúõ_½zE¢õàÁƒråÊÉè"|€€€mÛ¶åÉ“@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\%ð?èž®"qDIEND®B`‚fifengine-0.4.2/doc/logo/FIFE_small_d2.png000066400000000000000000001234571341615052600201670ustar00rootroot00000000000000‰PNG  IHDR;5d  sRGB®ÎégAMA± üa pHYsÃÃÇo¨dtEXtSoftwarePaint.NET v3.5.100ôr¡¦žIDATx^íœTõÕþwúìÎöeé½. ]:JT±#"H‘Þ{ïE¤JÄ‚- *6lØ¢ˆ½·¨‰‰É›ú&o’ÿÿ9¿v÷βËî² ?>÷“‘™;wΔgÎ9ßóœ”óÇDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀDÀD f<~o ¦ã_½þÊoš š‰€‰€‰€‰€‰@Yˆ€×ªÈê®4-Ta´ã‚™—…+Ïæ\ãKmžâ •…Ë5×`"`"`"`"p®EÀã Ö dõ Uš®2¡ü1NÅÊê£þÒȹÊn’â œkÁ2Ï×DÀDÀDÀDà DÀ¬Ⱥ$\iRjÕù©ÕôcA¸ÒX§be÷M­¶€ò–¸W•YÁœ+}áF)ßxæ!MLLLÎîx•™…+OH­¾€ ­£ÆÂTv„«D)VN_þOtèwa' W™Ìéç ÕMIñœÝÑ3ÏÎDÀDÀDÀD Ä#àñçù3»†+Ý&…gQjE©5£Å©5‡«ŒwæX¹—㿳#ê.8LêªN d÷ñ†œàF‰?=ó&&&&å=_–?£s¨Ò(Mi§ÕÒ%iµG¸ÚÇæõ‹¾YZ­%ú©t= WȾجZÞh®ßDÀDÀDÀD d#àñ¥ûÓÛ‡* O­¹PM™ê,Ms=ê.K«»,\c’S±*\ÿNG¬;ê²'‘ÒµªY=¼Š%û„ÍÙMLLLÊW<ÞTz›PÅ¡iµ‘P)Ñe† :ê-O‹:Â5';+¿ôÍè¿8Φ?zt&`¡*cý™zü¹å+¤æjMLLLŠ5Þ/Ò"Tñ†´š \TÊMœ"õWØŽ+"âXi°2µÖÇõ…*À—‡¼±í$šò©GŒ°Zh’ôgtòø2‹5æd&&&&e9¿/­I(ÿê´šó…P)…àš!“'KœH–¤ð4\ǪHCv4Gj©NŪt¥úWú ¿½:ƒ.fRƬœÌ!`<÷‚tU¾ÅŸÞÎã”å›k30008x|¾ÔÁ Sk̵ •¦R‘úË…J)‰Râ$diu¤ÑêHãX) #­Þt§bU˜ÞXü«ó^8Lít%#S™œÌÀÍ0R¯E¡ŠC|‘Voø4‚bîj"`"`"`"P†"€¯ô:Á¼+RkÌŠ-TL!¸JÙ$J×§5ÐÛÑdmºýH«?éXU:nCÿ×~¦vRm&³:‘~iꥒBHWÍ…¡Š×ùÒš¥x‚e(êæRLLLL’Ž€ÇªÈéZ}º«P‰tÊU¥„~húd)Óºô¦QÇy·§³#­ÁL§bU½ŠÿÑwl²Î¦gRÉ„€¹¨Ͻ¢¤‹ kÎ VìK-Hñø“Ž’¹¡‰€‰€‰€‰À™‹€7P9Ý+\u² þx:b+ýééoA‰ÇÊ~”D)™QÂÃÿÒ ÇzÇi4Ëñ¼Ãծоû/RÆb¦4ÌU½xÌ*2éÒ †ÔèZ’Zcv0o€/\?%Å{æ^óÈ&&&&1"àñWdu WÇæ¨XΡ´Š‘²AÅë~ºPÉ\J¨”L¡”Diâ”ÑüëhqG†86d´ #R0Ç©XÕób‡¼½~’æšìEgcü’˜z‰â!O¼ìÒ%` 5õ¥ê39}½¡ÚÆÊ|nLLLÎ|<¾lF—Pe2§ˆ§UªúgeTv¡â¹”=Êh¾^艞–2ı1£åÆŒVÖi2שX5®Öo@·;‰.fRÆdNf¯%Ús/*:¤KU UÊ%u ‘ WȾ¾gþ3W`"`"`"p®E@˜STN¾|1´Jvª´¤Š5¨DéÒ{:Ū|N‰Râ$”iSF«M­ÇæÌ6t¤7çT¬š×ðÊhÍíŽ8LðHÆt ™\ õ‰—=벪…¶R¡¦[°1„“/ü|áê{®½aÌó500(í9EZëP…›R«ÏçZC#g¿Š£’*M¨Ö B¶£D.¥)•9YõG;îÌ<ßv¤Ÿ7ß©Xµ®u܆þoÖy,%Sf0]½´Ä‹g]¢`Èúp¼Z(»\NÝbf†1æ"®4ÆŸa¬4Jû lÏDÀDàˆ€'„¾Á¼ëR«Î›>˜zb­RIo©ÒkMÙ„JW)‘ ¹ŠÓ–̶ö£ÝÖLy¤7_èT¬Úש¥¿8î{þKϤ†ÙL¦_¼ Æ*‡¸ÁŸŽìuÉ”Ku¹,ŒÖ-a¼KºE[»Bù#ü‘Žpþ=ÞFæ)š˜˜”\`NnÈ®<‹­Od[©TÐÎVhy£*H«X§Ji•èQÅ*žK)•’É“®1JœÚoÍl—ãÈêpWF‹EŽ`¤Ö¹ÿ=úÆ™8ƒ&u–’©¤Íª%Êâ!O¼,ébȆB )—EghºÅQfœÁ’­EOD±­:/˜7Ô—ÖÖXi”ÜÛÙœÙDÀDଌ€×ªȺ"\i:V΋U¿H¬2 D™£’­_åÔ*ÉSˆ¤ŠÓzàu?*«FÇC©MŸ²:Ümï΢c›:2Z.v*VÝô°Ûkg ³)=Ó4Œ_ÏÀd QôÀTÓKJ—èu©y/½TèZ'têO¶H·ípå9Áœë}©-=c¥qV~¸Ì“20(žx¼ÚŒËBù“Õæ„+Ï•rå–ZÉù*–Z1¶Â¡UVPòJ«œBÅÓ)Yë*EB9ú¤‹S§mYtlGçíYòÈh½Ä©XõnPÿ*þ"îÈO¢ÔNɘ0• õb)/–êÒEÕB™r©R¡jq)ÝÒyÂɉV•¹Ð­p¥YÁ¬ÁÞPSc¥Q<ïns³#^u¤W0w|86Óª9ô¥‰ìªÚ|úù3µbx×*6,k€*¯R@-©²JšPi¹”]¥¤®@f,eÚ‘ÕE?vfuGæù˯HZý!ÙX7°Ý±óëœ$cÑfW/»t‰v§ yµPu¹ìù–Ößb<¡jn¹'[¨òdk.½g‡+L dô÷+³ããfž…‰€‰@Q"àñUò§v fU˜ΟE_޶ÔÊ’+‹°p–“Ó*GR¥2*›P±,‡WùTÅUÊÒ§yìʾÐyd¶]Ž@0ò¾#'ÈÓ ‰¾Yö»Ôy¤Ú1 TÆŒê"÷0~ÁJºTÊ¥ë4D‹KË·´.á´+ Œ8É–­üYxB¹“ü‘>Þ@]c¥Q”·»¹‰€‰@yŒ€Ç›ë wfåNå͈!W¼È@G×ÊVt²Èò*›Vi=*ÙÒŠ~²ÖG*¥R(7}êº;[?ºíÉ–GzóéÁ¼Œ¼'®!TqXjÝ!Ù]w©Øîˆ“èšÇ´ ˜C½dîÅZh–t¹§\Œ-Ô[\<ß’\† ‚“lYm-™iqÑÂë•;=˜=ÖŸv±×_ÃXi”Ç ¹fÄðx³|ÁvÈPöÔPö´råã§VÜ«Âb+bk•ìQ‰ÒŸ•Qé¹”T)%'JŸ”8uß“Ý}¯utÝ™Þ|FZædèr̈4™”Õe‹í.8ƒ&u–’ñeI˜¦^ìòTÙPI—J¹£!‡”muB­¿å„2â$[‚}CÈq Ê€ógKњʙ†×19ÊêîñUIüò›[˜˜˜”ýx<_ U õÚ`Æä`æ’+|ÙEgWUæâËQo\EU]S+½eÅ8@G^¥Ø?K«ôÒ_´PÉBW)K¢„>åôØ›ÓcŸ8.Ú—uÁæHãÉiuæC}w°óï ÓNÌì°*ç¢}tˆ“àlJù¤†)êÅs/žxIé’C–rÉRalݲp1ÝEB>q¬'[ûNƒÆC(’­P…Y¡ÅæzLÎòx<žê^ow¿o˜ß7šÿ€ËÕ8T„iV1yj-WîX «³1 Á¯K ìkaáRŒ¥U²(“*[éÏM¨r/ÞŸqþ‚´FÓú¤ÖkûJê^¼søoíúâïü·~ìÿÍÿM»ÿãV×Ü'LxÕš+mU£(ͬNk47½åÌœž» “8¤zi‰¤K UÊe• ÝtË¥¹eMG%[nm-‹G´ˆ´‰VªÊ´n£w«øFú¼}<ž†))Á³üSbžž‰€‰À™€ÇSÅë½Àï*¿}4¹ Æ+Èî˜~Îb`tãÊ™Z±A+.WZP2ëŽ~U,­rfT\'r/=˜sÑŽô–3"Ø”¨eZjñ#s¡m;äé}ºïÛÞóÝ¿â+^ü¡×ä#Ù­7ïZeK¡†¥$zžV°,rÞÔì 7âJœÒÅ †¶”Kv¹lºÅ¤Ä2å[\·˜Ï“•l1›Œ¢œÄ6b̨w‡)†ÕÓb¢•©eZB´Æâ&Z\ºnõy/A19%ÅfßÕæÑMLΪx<ù^o'¿ïF›PéÙä M Ê®@[2²«BÊ•;gá^ d&ë–\ñÔŠµ¬t¶‚×­¼Š‘åœ÷³—þH.=˜uáúHÓ©é+,ÇwÛnb±á_ôym7÷žþÌŠã?íþêŸÉ›NþéÚÕ¯Vï¶9*‰³95L¤_«#M¦gvXš{)‰¨”.ÙîÒEŒ+jºeÕ ™n±æ–-›né!«rí$#ª­ÅÂZKäz-§hÙ‘wK´mÓ»™wÈU´¸t GaÙã©e¬4Ϊo ódLJ9O®×ÛÎç»ÎE¨D…g4Zè® Ú‚äŠÕñ+›ËUŽæjá0·*Æ‘+—J #µ²P@š[Àº»V©6˨.!¡Â‘ÙnQ¤ñ &TÚbb}gè[l¨Õk×u·¿¾ñäÿlÿüE;îúäocö¾ÞàƒÚê%`Α‚¹­gç\¼—_§­Z¨R.Ý’È|ô˜¹=E%[6OBg²åÊb$-rİxwô´"“„h1 Ã-Óâ¢Åa^o7œ•F)ÒÍÙ”ãxR2½ž6>ïÕñ„J&XŒ¶`p`|¹BûJ÷b'Wl¯Wr²àãVÒÆÂY t¦V¶á*R¿JäUL«$OÁ §×îôV³"¡’;´äãªÕ$Dy´¸þ1÷|¸ùÿnùøoÅrÌ~â› Ç=™Ýv3&‹½ûªéºHãeéͦgwÛœÛû¾º%ó-½¿ÅGI´ìÉ_e’L…0 Œ'ZÂÆÉ.Z D¦%DK5´t­rü}(ŠÏOårü)2—n"`"PÂH÷zZø¼ • m¡^eÁØ‚eW°EP·dÇÎÇ„]È@-»’r¯èy×JÃÖyj_«zß—uáh@¤É ª†ÅZöH¶„sÚoé>é©ÙG¾Ûøþ_KâXþÊÏW,y©J÷rà7ʋ݂úÖDšÎÈì¸\êO¹oÕ Ù áb†OÖðVüd+V[+yÑR6Nxõ¥† :hQqD‹ÿÓ^oG¥KøoNo"`"Pn"êõ4õyû'+TŽöU(}˜f`ÂÔrdO WÂÏÂŽªì*²Ð€@ÖµŠQÔûU‚ªÈí}0³ý’ô&¬h颖Éi›«÷Ü5`ù+K_þùöwÿ\ÒÇš·þtÓÖw tÙܵF$ÒxnF›99ïcù–]·,žPonÅI¶8Ž!+„®,†C´tzPŸÓ"ïAi˜+DËAaÄohÅ0”¦Q ö¤+róµb.ÔD x#òz |Þ¾”)œVqÅRí«hÚBØêrÅ=ãdW4{ë.W.L ª  ›\QjÅ𠬋™*VÜCÀ&óíI•îðÄ'‘ Alzõ¡¡wŸ\ùæW¿ý§R>ÆßÿY‡Q¿Ên{§Ü€ÅìØå,Ý!J…ͧgwßU'dß²x¦0”'»'ä2è>o¯ÿä$ñݺuûåíÏ /¼Ä3Kùé§Ÿ>³ÚµkÇ?Õ‰'ž¤¬Ý eË–ñŸT‡ÊÚ5'¼ž$_ôdÞ%~'ïtK˜j8;Ûz%­˜bЂeײ+X˜Ã –L˜ÈžX®ôé`ie ®û¯Ë®UÖ…›"çM‹4ZâÀìö[Û |Øžf=ûÛòrŒ}è«®SŽå_°Ý^*tõ \i<5³ãJIrKxF(ÂD¢å6§EÛIh© ßNR“Å-»F¼†V±Õñ~özZ•ø''‰0Še+¡Z”…”'Å‚§¬qŠ.Z6óÀ¨aaGûJlh´ÓÊâVȫƔ+ÝÓVGØ¥…¨ 0£ýÒ´‚©‘‚• µ Í¡nÓŸóÐ×Óžþ©<“žøMŸ¥¯Õºìž¤ªÍLo5'ç¢=”€ºà²B¨[c`ZËži%-5¤¥( ŒsÑ’ëùîÇÓƒÝ]².6q|æÿÅ2ŠU)á5”/ÅJ)ĸ•åD ¿&l| ^Ô½-í+;mAû®·Ú˜°£hY°kr¥\—$d‘ÝcwzËYi gi¶¹üœ(j[‰ÁQçòý}–Ÿ÷Ø÷Ÿüá,8o>yÞõe:ž¶+OG)¯ÁBæU¸¥ð¢%¼ÞuÑb6Nl¥–¾¼µÁš‹äÚâyá*úÎb­¡UܵÁ2boË(VBµ( 7(gŠåõv-bŽ•°h ëí+m!ä Ý{åÈ®»Z8È@±1„É•câŠÉUV—M‘&Sè»X?¡[ƆïôfC|ç{cûþì;nÚûIûÛŽæuºK[‚Å<ŸÐ4¦Á²HÁäÌ+P!´ƒïq2-·9-µR­&Q¼{¬†– ì®jƒÑ&¹Iu°Ø;ù†3Ÿ^±+0Še«,RÂk(oŠåiRDÅÂ2áΞ°(½-Üi û‘ Eì„ZðÞ•‹\e¶]’ÖpR¤þ2—$ê„4¼©BçmÆ=5dϧ£wvÃïûªÇìãÕzí!Ýâ‡õdKß5ŒÄ¨þ´ô–³sº3saá&Z=È2-uBa˜ËV“pÑ’ -IahV¹‰kƒ ýã0î—ÅJø%ëI~yò"Ö{Ì%þéóx*E±T‚Åç…)3à‚Ù[(¯[Qt +–]Ð6–ÝÍõ¹«XruáŽôf3ÒêM#2Þb7V»²Õ/ÙÛcîK7ürøßœSGŸUo6tˆÀ}F¨ÇmA͉4ÁäÍÉŠ–RAry×yw…±ˆ( ÑЊWtšäF¢ý`–øg&¹09–ɱŠüÓ¡4ï˜äÏ”äÞõ¥q+_¡g‡-àb| Õž`‘½…Æ*¯[ǰp¡ÝŒ” é«C¢³«¬ŽÒ &¦Õ™g‹û»g¶ÚØhð}V½5ôàWçò1ðÎ÷[ÞòxN»-2ÙâËDl2ƒ n–-Jk0!ãüåÌ„Ð5Ó’£`*uÓëÄ»ÇjhEÁîŽÚ Ÿ)†2™ä¥6Èv””‰?F±Œb•¦ðù±Êb¾\¸4˸°-‘öÊ<Ð^ŒI[ˆU¹âcÂdn‹/Ќ֋ÓêO«µ0ÞÜ1«æ¶ÛÒrø¯l~ÿú{¾4ÀàŸv˜x¬Ò…´ŽK$[ª 'f5B½öÄôf3³»P–f´=¨¯‚äõF[“Œ4놭¡¥jƒ:7e’«g%JªoÝ””´2¡W)):uBõ¬|ý9|øp2Ñ{ï½÷>¯5jÄ?ÕO<‘ð$eíM›6ÿ¤Z·n]Ö®9áõ$ù¢'óÆ(¥Ûø¼= ¡Xz‚Å÷‰èõ@áήóÎnó¶p´¯˜ñ„€±›ñNÚËá@±éêîH“i©µ&ÑÜq­Åv¹r‚Uºíè8éÙAÛ>¹z÷çæˆŽÀà]Ÿu›÷Jí¾÷ZB:aU¡ 7=­ÑÄÌ­áb}¤œ,vêŸhhéZ®µA¶ŽÄn’«Y76ÍZJŸó0&&g*^OóB(O°˜A»s[# `I»[µL„ì-4ó@«¨µ¯¢i M®2ÛÞžV\jõiÄIÇ“+BØëôÛßmþ«w|jŽd"pÉê_\ûPVË ¼B(Ò#;:!¶ W›“ZglF«¥ïAf‡¡QªÒÈkƒúX±»ëµAe’+ý¹u¥Y¨ Áðyûœ©‘y\RŠ€ÇS%YÅ –r¸p.@‚aV”æ…Ùî«8õ@émÁN´ Ñr¹eÙUz󅩵Ƅ«ÌIå¶¹N¹bIïÜÆ×îµò×WÜõ‰9 >Þoyë“:l‰'ZÌÜ–,—jŒ%›]n¡¬Ï[†ÚE¢\0N+Íòz;žÑÏypÒ‹@8žb¹"‚Z‚%£(P¿ÊµÎ¯¦ÕŸÊ¿9>KÓi–‹ëƒ\’¶ˆÔY [¼f·]ôŽ9ÊBZÍ.æ‘LLÎlü¾cŠ–fra›ÁŠê`¹$Xš!SjÛ‚™7‘Ÿå£Ç+9È%ÛW™VÖì¨ùô×ZÍ{Ûe--ç¼YïúÇP¤¥Ú xwª JÞµAl½Â++ºPã‘[ÂU†G.³Æ³b“îÔÅZ7‹[`ð٬؞”ì3û rï¥î_N“‹ˆ 52ì28®6ƾß8øÞ¡ÉÐ4¶LK¬*æõ@ѾÊi¹¾Îu7ëf³ß4G@ƒOçw¾?SDC «UmP K‡Àà­¡ü¡6[÷hbþ´Ò¬á))ž2õÑ*k¾‚G-®øœ•Þí-[¶<ýø”5ïöòç˜ükàõœK±àIÊ#»Ò8Á8 V¨âÍ~b7¸Y†ôvÒê©UæVètW½áÏ4žþ†9ÊWŽ=^¹×¾HÍ…2C’iê–uE ãF†`H[wÇÁs5 F)K³‚1Ó,Ÿw@òoõÒ¹¥Q¬øq>qâD‘Í[KâŽF±JçsQlÓkwŲ£(A•飾ÑÎV…«b –ÍÛ‰¯& WœS©çÞºc^l0ù„9ÊoêOxµê÷Gj-¢/Õ`°Ú jz̈=˜3Ĺ=+qšÅNb)ß8* ºÍfy½]Ší“PL'2Še«$”µPç<›s¬””ˆ‹bÙö`±RžÎJpAÑ|b3X:"¨ §ÕžÌ,m™,ÙË“ÝmÀ?•'ٜݙuS¤ú`°F+½éÚtkß1S,™fÉ\H³”¡; Ž…o\÷¥Y^o×âšb;“Q,£X…R—’¸ñÙ®X)™–b9|.Ì…Í–IìÁÒýj!9ÖVlù;ïöPþ0Fmð¢âŒôZ ;Î}½Êw Û\åò^w¾Ë„Ú5Y›Ý}oþõG+yÆe"7>Ûû>xݲ➦:”f “ÜœóÖ´¸íXõnÛY’$Ëz™chI±so¤f Ãc×î£AÕENêü…ד`—y±©PaNdË(VIˆP¡Îy–+Þa~ß0!Z||ÊΣ“£K°l=¾¿JƒÚIr˜M;ë`QIßVáªÃU‚ÅS´®«NÂεùmÇrZ¬§»c@G&XÌâÝ÷¼Û3[o̽ìPÅ럪xƒ9Îd* x8«ÝV±³‘»ªu$µáº´8½Áò×>Üié»xY+µÙÀjƒ,IBb;‚‹œ×¹: :÷oÙì é +5˜åñT,Œ””ÒmÃápí²ô§R¥JÅõÌkÔ¨‘ð™%´¨R¥J“”æ àQrúñ …B¥yÍ  ¦§ÿ¤Êô`€-Ë} ‹;µ3¨Ýé°®IO’l[EîH­9Z%X\ðºÌ;ÑmÍ©.+NvXüNýëÁ46D‚%»_Ìßý¬'Îìxw^ÿÃù×>iŽÒ@…AewÝÑj#–‰HáAGŠ›²Sq/RoYµÞ÷¶žózÇ¥ïvYy/kvÃå²EiV¨â-ö-$Ö}5Wxj†%â/xaPÌ™’’À¨LäÌÅ™˜9^o'R,[I0j K!éUd ª†c±ˆÜƒ%,|[¥Õ›¤R4>ÅÕnòsXïÔuÕ{–Ÿl·ø–³^¯Úç@:²+‘œQ-w¤=­7ag v´gwßSáÊGóÿÊ¥«Ϲxf»­€,ð*ৃ%<Ò”=ÿ‚íÇ¿ØfÁ¯Û/y§óò“xAñ²¦¡#…É*Ù‹Âò3üòPjÇÒ¬dø ±›Øm0K}ÞÁE~·›;š˜”ïÀ›+VtIÐ} KíáЄޅâ%A±kC¤ñ<Ë£­iuë½ÖÐ}í© V¾‡ßæmý–¯ã^¬Ðu§ª%Ò†ÀVI®°½ÝÖ¬weuÚžsÉ@Õ>jŽбY]vdu¸›«í±h˜v6òúÞÚ¬ó7×z¤ùì·ZÏÖò—½‹—²ûšS]—¾-¡ÁYäÊŸ3-µÖh±ìwD•X`îîü…biù–˜GŽYôy{”z"GÀ“’CŠ¥(AìŒp5Y±t‘c~æ‚çIé-Öò˜°É¨2·éµ\²áËn¿ëêSWœÄ/tüNo1ç­¦3߬uÓÑìö[µëNúÆlWVÇ»³:oÏ견Zîe÷çõØ%ܾæôØ—}ÁNŠvÇmˆ¼-ÍB¶Õƪ7šúúy³Þl9ïíó²kÅI¼”­{¿ÓÌ—¥§;Cþr¦§ÕŸDùO³ìü…Øôo]¤c0ËF z=Í‹ün7w40(ïðøý· @‡©’s‹•½$(,(/ ZÌoD¡¦Ê›¤#õûî»lÓGßñAµï£WE…¨ â×z³ÙoÁ ¶Áä×*|8³í,ÁÚ¬»³:mï~|“¢­Œ0§×½y}ïÏë÷ 9Š-—?€!nÄ–"|á.ʱ:m§4«½•fUè} ÎØ— WMf¼Ñ|%XxáðòáEDÆŒ¼ùü±O N]ÎfEÏåm0•ŸÙø 1˜%—fÙ³œ…A>¬ˆA§JyÿÈ™ë70(z|¾+c;(AGIP3d” oD•½PÅÛÔV4Ø«_xWß-_ºñÞ· Œ¥ïâ×z˹oá—{Á´×ëO:Qkôñ —ÝG?ð)ÁÚ&¬ w!ÇÊé±7§ç=9½öç^z0·Ïýæ(†ô>„®E V·=$Z”fA´¶¡‹W!§ûÞª7«3áµSNàW–¡ð«€‹'»­>Õóö÷‘77¿émuUö2Z¬Îh…6ë‹6Œò¿PƒYn…Á¨Yl”8%%Pô÷º¹§‰€‰@y€×w¡s-ýrJÐ18Ì­oÛÀtðcé'щV„N„«Œ’%AØæÎÏouûw}ÒgóGoø¥$…`´^ð6~¹ã÷{é¯×øZͱ¯Tz _£2ÁÚ%¬‹öåô¼7çâ¤X—œýÅE‹¢‡â¾—@æšsDk/‰¥Y;‘fewÝ•õ0<„Wo½I'M{Å[”p ¸@‚µœ+#cî½é£FJ î48-³7l…AÁ_8 ƒbÐ%挻µÄÄ翾¼ÜÌõ›˜œV¼ÞÆrï"šXºY»sS0Uh”`¤¾½$(˜ QÄwV¸ÆHÎÄÓ&­ê Òë-°íÓË·|Œï¸h¿ßYmðDí ¯Ö¸í˜ìᓾFE‚¹b Ö%H«úÜŸwùy—?ˆ¿ã?š£¸ä òT&Z,Í‚híµÁ®»Ð*«<âŪ£_Ưü†h8å~O x R¼Œ"Ú‘+#cî{çGµ{í®KÜ'°òx†n¶íƒYñ›b}¾‹Oë½nîl"`"PÞ#àñäÇÛßh3kçƒÃ®” dÓ5Ø/µÎmôýU…½SrÖoÓûýïþßq.Æ\B0Ð,©7éµZã^­6æe8äVºåy̱f÷ØGI@¯{I®X‚EݬËÌ»â0þ5rñ‹ Ìñ#ÐóhU…`Ð-¯ßCy}ÈíÃRUJ³xmp/[qÈ1ÈU•Q/áw~=ÔŸ|[”m[Ìe –F´#ÁºlóGý¶~\¹ÃfËiŒùÇP'² K›éÄà*§cÞÕà« Ç&ž¢Ù=µå#^_ëòþq3×o"`"pšðBcÐÜ&JPsÔwÛ3k%iu¡{Uð’ šXäsᜦJk8‰¾ƒè¾"9»dÅ›Wnÿßq± ü–GË“c_©2êe|uVö|ÅŸÆW-R’+‘`A®B*@Ôû Çò?ÂFu-s¸Eâ”ÕãˆññLæIòûª4‹2WŒ*“¥áðð[¿ð»,\8ˆöµ§z®g Ö–ñ$»éæa!ÆSkŒbp¼kap5̲ù(±ðÕeŒ»eŸ¡›_x¼5Nó½^rwïÔ©¶ËÇÿsàÀ’»€’;ó{ï½—è™ý_ŒøðÄO$©²vƒ³Á{иˆvY9šXÊýÖau¡‡‰k·ÌÚuJÏÿf´Z)’3.uu–v{ôêÝŸÜñ)G0¨6( ôó£ ´Rxm_¦ä {ýÑ £ŠÖ!Q äê ìÂÀ¿"ƒt¡ÆEˆö9 Ý„D!&phÌ¿î‰úà_U¸J¥Y‡‘fU¸òaˆÝæ¦c•†±käK<ÁBy6ÑÞ{Ó‡hIâÇGï5ïÈ$‹8i8‰)–½0k”XíxLĸûÃ7—æ—QaË(–Q¬²&N®×s6(–××S/T$·uk½½µÎÊr¿•öµn^‚D33JP Tµß®:W•ñ½ÖrÈák÷~qÕ.¤YŸ^¾5‚ßøÁµÁ›Ž‘ á›ÉŠÜƒ'XH ®;Jι”(CN†¬"ëÂ]4 {NPkdQ•n~V(=éú£<ÍB•jƒH³<‚¿“\ñ¸áÆ·P=¿X‚eí.¢‰ö>w~„Ÿ·Úcþ+Ü*Pӛζƹ,«'m”Xúò’qç­,¾pË¥•å ö)¬Š”æíbÅ2ŠUJŸ8·²P,¹ÎÊ¥‰åØ8¬¬.4/A>8Ì-ñ…AÔÔjÓ„Ñ;º_u—ô¿÷†{¿¼fÏçƒv|Æ 6žewÁàÆ4;‚AµA–f!]À7/rT·2ËA$X×!ÁzJ$ øæö<å #^$÷ñöw“|ž;GÛ­y½!$óÈMYAUÄM¥Y¬›EruÍ“<1%™gwÁïN´c6.>ÑŽøÙ'“ŠÅ7=ÎÏh½œ~(à=ÀÍ Žº®Œ»[+ óÌ ž·²¼þv¥ôy(ÒÃÅ2Še«H¢ÜÉŒL ïM±´ ÷‰šXŠkÇw %Aé±”Zs‚è~±ZbÍîÛ‡øêº}_ Þý9C0>lí‚>?G0Ðù· ^¤4ë(TŠZ2,ÓBŽE_»"Á‚\=G¹ûò­6úåê#_Ì¿ì }ožGn÷=Õ†#̉)ª©yˆ7‚ÆÒSJ³®yη«£| ¥T‘` àÂ…h' A¢¬Ÿ¡ÆÛføãbU#_šUmAV{rØâ­,F êæ1÷èV–s*k¢ÇW§(oíÒºQ,£XF±JëÓ#Ô!ÚÆØ“XI7±¸iEjí±b„‹­ÂÊo³áæû¾¾ñÞ/©6¨#ëí.q –f¡6ˆ4ë1bµÑÓø(åXèÄPi Ö‹ø¾>€tý¸jx.¯Ûn2ã8KìwÕ¸áI<ž/J©ÔÿãÕÔ[ˆ[A …4 ¬ Ÿ¹)K°† Á¢¬´°D;~p ÁÂëØôêC˜ÌÓ ƒ3™e†ÝN×ÅüBßÛ® 9VÖTzg¦Oòx"¥÷y(ü#Å2Še«ðŸ›¢ÞúT4±œv‚jš*j˾Ëjb!Á’®€iõljåäò¾»En>øÕM¾ºþž/-ƒgÁXý¶Wpö – ƸW%‚ñ‚B0Gð8¾|ɶ߃¹}ÀÿìÀˆãÀ,³l – †ŠêÜôdvÛ;É4è,: ÁÕ.˜z:Jyçšã³Ä@•J³*^{„pàì,)ÁBó•R‘`‘ÌÇ Ú™… åÑÎ,ÑŽº.ª»xëöÞCóU¢•µ8µæ$¡XÊ™0ÉV–s*Ë6Gˆ`-V™þcË(–Q¬Òûˆú­cbq&±lM,k¯obá›+­`²pu{IV]·ý£a‡¾²ÿ+'‚q‡¾ˆätû• G0è+˜gi‘o€®ööï}îÇ·0áà³Y‚…´ˆ6Z2Ð?PÚÍg¾QkÐC™P,Ì•ÿ£ê¥÷4ú …gIæuTˆ4J©¨ˆÒlÀÐg1ÀK_#V…²R¢Â¥í–¼«<ÚÑŽkð®ÏQÝÅëX¹ó¾æQƒuÆ¥Ù^ºŽV–îãîleO=0B ]á ê€Òû0鑌bÅ2ŠU¤N‘îäõU§7‚d'¨låü¯¨²ï¹_­íµ’æLZ ß\‘f³8×.ö’4Zuåí¿þÀ7C~mG0¸C.!°X‹Hb"Ï9 ŒÄ’‰ÃýdÚtñ~¤\U†? RO<$ðÍ÷B¹Â¸¡ÕÌÕ.ÝG£¬åöÈï|W³ñ/ák5ŸòQˆ1ž#`tXT Í"ÓÑ/aÊ «ÅÄÌ5M°Q=,ΪXD;ëùiD{Ó™îíŠhÇPÝ5{¾À+8ôàW™ç­Áx•ª×ïXYÕÊâSY|Á£('âMÂË>GŒU[¾ð…:é}]zwª_¿þ‰þŒYÖ3E×x-^¼8Ñ3»#777~¬'Nœ˜ð$ÕªU+½¬8©V­Z ŸTY»Áرc‹ã©ŸñsxB…Å.˜_»µÂ‘ì­Å&F弞Ñz™pu¢MZ4¿Õ{áË·>ôí-÷ãŽ`¬³-"á|í4CŽg ”€!T¤é"a”Ǭ]+ z´Î¸WT‚…D>C¬ÌEVCX–Ñjò ;nEE«|ÙÍ×7~åS¨£d† Ãô2ÃÓ,TA«Þp$÷Ø-Þ+L­àÁˆ‹ûƒÐ0€.,¢ |²D;ÀJ°PÝÝý LO" YSŠ#“¸b‰VVôT<þå:cq/’:FmH× 2÷²;_xý ÎøGÄ\€‰€‰@Š@ ý¶58 »KÖÒakvØÅNPìæ»B:m&£wµª¸`u×IO~ø»~`ôFšÅŒ•ôuL‹HÏbƒ¶£ òÊãFy=ï…¯kîE÷ÔrÉÕç‘+ΉÝNä庂ÜDZ?·ùˆ'³Ï[KO­Ìé V4¼êþ®+ÞEÃ×Ñ…ôâA†yšu¯sësz›Yàsßû>¶QŒÕ‹L´¯íŠhGE—¬û¾¸ñ]¬F£•ž\±ê,Mo6Sî+Ñà jeEo‰ _äc*Ër¾ðx³ÊÐGÅ\Љ€‰À€?ír§bÅr»Àojîv;AÚ‰EK‡Åì°†]à› nI©µçKÅ¢Åç{ä¶Ç¾y˜Ò¬›&@0ø’b|£ÞE‹H’A0`;ÄýÈ/º‡¯Ï¨pɽ Ç<-\:” 1ƒeX÷ŽõN=Ö½š çÚ÷ ŠÔaÄZY=jöÜÙmÉ›˜¢Q‡Ü¢½é…ó4«ÉäW+÷PXÝ“q0³aDo[+¢42,‹hv\@×WžÄcIöÑàø ^ÁË–¾&K|¢••Ñz±¶’µ²”Á veé+‰¹Îñ˜@––¸È±ärÈPF²ÎŽ:Æÿˆ› 08‹"à µgŠ…&gÛm×%(¨¶8Æ6ÀUØ_œZgºjbáÛ­ñÀƒãõ›1|‡Ú G0hùÃØÇ¾õðw„`ÜçŽ` âª^è?IŒÖ"îëpÁ°!­{hç_ßñnõ®¬ã’w(ÁZs ÉJ¯;׆Ã!ê]ðà€çP÷9Ç+¶\®2·,™õ—¶õÄ•Û>…} ïaöú¡…Üò4«É¨gr»î¢¾¢]bÝ÷ÒfîsO[Äâí¸°<Ú݈vTk¹G»"Ú‘#ÁùзíG=^¦le£X,vB²V–š#V»²(ǨIw).è w+Ž7¸9‡‰€‰ÀÙOšM±Ä¢ØKFÚÅŠr»` ïé;4­áDÚýˆB"[UœÓz㔣?NøÕon{ô{|å%B0N¢ê…>Ž`€¼‹qáëŠ``ójƒ„`°$XÅXkÛ-¹·7ó K°>@ÊB ÖªwÁs¦Ä®ÙýyÇѿʬ³˜lÏБVen³A®ºû£«÷|ŽA]$7 8ÏÂ"ËÓ¬¶3_©rñ>1úÖy;%XÝö ­‹Ä¸É}Q‰vJCW“¨Ûˆv\ìÿêæC_£‰~äy×> ‹·²f銕Õ!–óE<\Pî ¾ \Ðl|6}ÎÌs10(ž³ÆÄ@Ûs€BfKÔ‘J ¢‡ï¯HãÉãIÅÂOìñ~;éÈãÿ…`ìW.lI1C0€E$B00ž% rÈe.Tdë 5ƒÕ‘fáW?Y¡åV¥çîNs_£ëNÚIˆ$žC˜1´& Õ*w~Ò|нâKß›¥xÔ¹ðÎÞ‰º%8€yHn ¨Xíê%Ò¬î+~]wàýdˆÅݰà1]wS‚…ÅŒ ¸ «D;Z†øq€Ÿ(6–‚‘á;P2íÑþ5%X‡¿ÅoŽ:—íMì)Vj½)”çá÷+.ô²(Ç’¸`ôÚ7ÀÝãK@NϻߜÅDÀD |E ~¥«bE¯ÅRh{ô’ü²¦"åX¤X€Ç˜bY"7bß'SŸúqâ?8Œ=XDò-"q¸` UÃ Ü Á  YZDâpÁø•å‚…`Ð%q÷ ˜Ý¡­Ò|}½‡.^{HžCH°öP)T½ÐcCÑòêMïÖí²‰Ú{¥rT,XÞwáKH_ Y»q?È”/`-4 K¤Y}6}Øì–'²™Y-!ƒ·ª”`í¢ ;ˆ I´Ó„õ”À)AÿÇóhßñ©"Úô щÄoŽŠï"úFÌW­ÀONR¬‰½šiX|À=gRJЧ|}ŽÌÕš˜”Fü©¡Xq©õ€=£ïÿÑÀcA !“"ͺXJˆhŸ5o×¼x7/¸£ßlg¦\P‚%‰ö>ÉíÌ ÓÙÀ2~¸í¤0vE´³ë{üÚqàs;­¾2ÒlûeÀPÞ8ŒV¬f· ‘S£ÇÂáI÷õ–ûÓz–»Ï‘¹`Òˆ€Ç›ÊÚ>‹~árÅ‚ A  íÌiI '3ŒÅÐvúþ꺋åXr~«Ùú‹¦›óÂïfûm4‚"˜XDr—\D"\0$‚Ár™ F ãI› †@00ž% ^¤9!Ô7Ðw.§Ý¬¬Ýsgÿõï ÁBïe´Ù(“øÕoÐuCyáø‡¾lsÅ®`êø@x\±uÛ®½eÇ{ÅÔ§(é„4B´PpC—×€úÛµ;>nºAF¾¡HȘs#Kd‰hß—Ñ~Kí«ßp‡h‡ ",Ð×ë·ž’}) ¦·^`S,¸'3’½Œ˜ ûBÍJã­oÃDÀD žÅ pqÁÀ@«å‚1ý èÁòûD˜ F\ã²CrN퇛äHVU¶Œ˜ª‚¤X_Åòø92×l"`"Pd^-K^Ԍʱ’ÞŶHÃâ;—U:¸ðåßÏ}ág|SsƒÆ³g¹`¸ §hI‚Á,_%‚Á—óõðXR¬‘$`@J™ÛÐJƒ­½$»`e·‰Go{ä;Pø,Áú i$×¼à¥ß/zåK_ûåºe/V¨6Ëï]Ø#-}Â%£/<þ»Å¯þgƒBg£2©J³®Xy¢JûÈkIDy×` ¸ØœÑÎ,y´sÿ*øeà§ê®IíPq(+bÒsÖóšb‘WSV×í–b.hwpOR±ªIÅ‚íEÞ´”oi¼ïÍc˜˜”Çø#ÝÜk‰ð_Wœ:·h¯~nÑD9–\=̪U||˜+VZ£)ºbUë±_ÖóÿßÔ„`uG0Ø’bB0P¡rG0¦Oùi!m%‚æ jƒ ×¸?ŒY«/¬zþúAk_§ëJ°æ<ÿ»ùdžÖ.yõË^ÿeå›\öêÏ—Ž~(52>IÑ øÇ´í»mÞSß­|óOË_ÿ#dâ‡8@!‡<ͺyÏGzbÜð^LPÿOĹ؉öÑDûGHpAüëD;ª”œhGéå\HxÇ1Oˆ •Óê Ó¼6sÆ"Ÿ5DŒ F: Ô…–G5Ų½`FMÁì¡åñCd®ÙDÀD ”"à HÅŠÚå¨[4Ù6cÁµ]S,ðÖ\±0šÃs¬&6ÅÊl½ié«À—5Ò‹Y1Œ/ðuIÆ&H°õ ËDPä{âÉ!×rÁ8Bi-)Žƒ`l‹F0(p·!2dëš_ºcÔþO(Áz‘,híÒ¿¬xã«ßúÓÚwþgýÉ?/zæ»v}·%­º-–OÚÿ>n¿îÿYýöŸHð^ÿgƒò4kÒãßuv8Rs!öná=ï"Á²€ ;ÑŽðºíÌB0®G{òD;€ îÑ®íH:‘â…kvÝL$IÑh–»bs!Å""ŸøLÝZvŽÄ³ô§_ZJï{ó0&&å1_N"SALV¹mÆR9V”b¥7›®&Ž9;0ë©ß,y퀅``lõ‹¹•¦+Ý §Žë{ÛƒwžúÓ¶Ïþq×'Ç-!Zw¼÷—uïþ‚ÇÓ¬ÛOÖj·žì gÂÅd&ßÏÂ˲C´sàâÕHñ’Aes;lµ)Vã)…T,n-hW,ÚëÈúXÌ ×ã¯Rzï{óH&&å1Á윊…ïPÞV늕Ùa¥P,¢ÝH±†Þ}½|ûÛ îË Ea&6 ¶¤8ÁÀC7ã)…`°Úàƒ0.âKŠÕ"’h ‚Ájƒ”fÑò 5eO«}þÚ1»Oñ Óæþºåã¿Ýýéß·þ]_þïžoþy÷GéwÛƒáðØö—m]÷òø/»¾úß_ü’¶õã¿mþð¯ÞiÖì'¿mÓ¬‡yëwÑ<ãƒ<Î|ŸKáˆöAp¡{´'O´oøé,z‡šG; Sã]í.¨¥‡á„§~`¤¥¬òáR›M‡m¼K+º*m†«ŽØkVŠÇ_?AæšMLJ/þôžÅ«XÙnË´¤b \ñ*Ò$+I Ÿs»6‚ã;é‚ñ€7ø ‚1ö•*£^ª<¤;jƒÇ°»á±!žÆ³Ä"¶¤ø‡ ÆvrÁˆF0ðÛŸ#¼6HiÖ,¬» fM ¦OjÛçÂg¾Ûøþ_X‚õ÷mŸÿc'äêëîûö_÷~ÿ~ø¿Ÿüÿ»ÿ7ÿwÏwÿâ¢I»ëSJ³–­yã—ÞãTd[á±Û êÖpÜêþ4‰vßtL,ÁŠáÑÎ- E´™ý(ãîÿ¡X­æ¯b…rG”Þ›Þ<’‰€‰@9€/|^ñV1½›^°BôcXŽÕsú3¨Œ¡—³ì„hä(ð´}I‚ñ,é‚¡Œú§`ÐxsÁàãYQK³f²ƒS‚‘Ii9SúŽtûB‚… š´÷Û2¹ú÷}?ýûÐoÿsè§ÿüñß-ÈØî¯ÿIiÖ§GB6ìöW+Ö]€“W!÷ĪŒ õ@–`)à¢4‰öÛx´s¢¥lDfVu«åKk[zozóH&&å6žpÅô5J.M ©TØÚêcÉ‚gØûŸn'Åj‘¶ü?vý„M± ÏO± =Aœâ –â[Þ<”‰€‰@¹@ ³·T,†p'\}‚ØÅó‚ìYáÕÍZuÏ êc5›¦+¬†6¼û?@½1œÄkƒ.Æ£rɯ0ÇŠm :‚Ñc-Ï"{á>ÁÀx–D0xm_Rl-"‰`Èñ,¾ƒ#TDš5i'Ú;ØŽ¤ ¢…L r…žÖ-«^ òA6†œŒêè`堃ŀ‹xD;Ûá’У½?¾ê±ü«ŸiRñ†§,àâÖã°°ªÉ=Ú§¾îðhG’Ú¬°ÖNù£}Ý£=ŠhÇôZh@6½ú~]±"3튵Cü`T‹ð¼(ŒKS¨Âèrûé1n"`"Pº𥶲+Ú»½N¸P…ô–³…«#/ X‹ŸÿàqW}~Ž`­ÆN&¬‰Âv`» ÆøÂ%ƒg1Œ‚i¯sËã¦cøÏ¿Öá‚AKбM K{)3àæ­XRÌKXv[Á„ FurÁp (ô‚c¹buºbÛ=ßS7‹1†­xž2° ,Ô)ÁBìLíˆ /y]¹G{ÒD;÷TDÓ?/ð#£F¯Ý6Åj<•ÜñÉbr d (Ý·¼y4ro Já¶(ïvt\(Çb¶âÒ»Š•Ñv MKºŠ5õðçªÅ<“@0ÞLˆ`|É ZR,Œ®H³Š‚`<ì†`°Ú s‰ÁXÄ]0¢ òq÷îØoÛÞoÁ@O ÿ zpèòçü$X¨rà VB¢}}=Ú݈vTJy‚ÕÀÅ|a!èB´ïü ¥WZ‚uð+0/ÜB{´+¢íFŒ<“ßÇÛÊnËïÅžu5jƒ±ñ¬‡òú>ÀƳf¡6È‘Á ñ,…`tè· ˜;¸A~àï7-{˜H°Jh¿õx•Q/c@ cjˆb8ÅéÑ^x¢ü>Þ¤káó?Òv1Ý'°Å,K±lYUж+™Žó¼Á:¥ü–7g"`"PŽ#ª0‚\h1›R$†[ù‚AµƒK›ÐqÁŒó·ˆEȱ:³eƒœmë±7§VèÊ•Än¾j ðÿňRò« £ïp»ˆ»`¬‹Hæ¾Õtf‚A¹|‰ÁxÈæ‚! Ô%‚¡-)V‹Hâ#í/¿“€ÝÕqãÒç´ËN´“… Ý£]Z{iy´ó5c{QÀDÅL\6,<òú? dóÑhÑå_çB´£:êF´“… -Áâ‚äÑþ©Ã£ˆöÇ\ˆvPðÿEwòá/¤b /öŒó2VpÛ踓íÇÚ–ìbLjs “r¬,Çšëñ¦–ã¹tRŽ@ ër1'dS,fÇÀ76q˻欄Å÷6qL`– :ë¢{Ò/Kž ßsêÓÈBðýï"‚~‰m‰@0¾‰xnÆËvŒ¸6eàÛ–Ö½ë.lI1‘ŒxF»ËdX×/y®(D».î¦0–¢T'ÙÕ¿÷çá;OiŠE9Sf§µ¤X C±ÐäëžQBÄV>  a¦š«i— _陼P¬Pþ¸R~·›‡30(ßÀü¦R,rg9–0 <Å™bÑH–]±Äz\ô„ºˆ‹òR¬ÙR±hŸÖùCïýö_˜«Å—» Áx]º`ð%Å ÁÀ{Ž`ÀJµÁxƼ·#WËE$¼6Áؤ»`HãYÁ¨`¹`@™Ú]¾ Ï¥Nq|ô·ë XE'ÚY »î¦$µç½§K´/±y´ƒh‡÷,Ø #¤–GûÃßÁÝÑòh׈v Ïa„UÜÁ«OÅâ Ôd]v÷íÊð‚T¯>ϱˆd‰R,¾OËU±ÓWȾª|xÌÕ›˜”r¼ÁêL±h¸UøÝqÀ<Å£ìÛQ@ãÛÜñ źG)V¤ñ4]±êöÙ”^|( q¦ækAºsãå¨E$– C0vX˜7Ž``qÜ€4n ‘Ø\0Ø’âk°¤˜»`$`Ðx[D–S6`C0¦qŒ¶ý¶Ã6)#?ð÷k=[8¢]†‘bÈwŒuß½‡IpüÜ>‡ÀŒÀ¼£ÈD{÷Ó Ú‘`á5B÷’™ÏÒ¾+äÊL±"M–ÓJ\¡X¸~¤ªŒ½TM/däLáÖ2Å‚q;r¬å|·‹°p$ÅšçO¿ ”ßíæáLLÊy<Ü¡XÜöBÙ·C±zád5•#YlgqNû­ûCLð‰`üÕrÁ-)fƘ˜ÆG½ÖË%ÅK1žÅŒÙor£Î„W±¤¤;¯ bVI8äZƳ"ø÷l\ B0ο|ŠføZçþ~õÂg‹h¿ì2¼~Áо÷h¿öI0öa+vƒá9 ÏÞXÂÖé&ˆvÐÿnDû'Nö¿ux´;ˆv ÏAƒ‘>¶ñíg‘U¾HãyñLJm˜F´q;ßFV“™³-šÞPƒrþá1—_V"šj¢eåµ(ñëå¶l/â,!£&!jeYCÄNÀ=½¹2j¤ÆÝþCKÀÁymÐÁxñgX¯bÃÅD¹ˆ„¹`ðñ¬Ïí`KŠ‚«!ƒ–³E$ÜC!4ž…4 µÁGù’âB#Ö’bk FƒÏï·‰VgOÀÿâïW-xÖ²ŒçÑ^ÌD;@ŠF´OˆA´ãéÐv•ÿŠF]£+Økºmç"úø0…Ó íGÂ{9–Ç›Qâonóg{ ðé§Ÿþ¿ÿ÷ÿ>þøã^½zíO×<¿””@ö¸+Û n|G»q.ˆ:ÁvÅR#YvÀ=£Í|i{!HU/ÿwsØî¹"K^ýG0°ñSA˜ ã@0vK ¾¤Xº`p£ùlª j‹H‚ñ,K³ ‰`´dƒGü«ÖÁ˜ejÓo'Æ•ÐïÇ[´àÙâðh?Ÿ¬+`=‚5•2Áz ¤H°n=ŽEÌIíw~[aJ°v’eÈþ¯†ú#hÚ<Ú¹… $Ú‘`¡Î‰ «U`²eÆj:U˜ vÁf±A¯(ÅŠ3Œå¶€8Ti²ùð™œ~Nœ8¹âŽ=zú'4g(ëðG:$ÉR€;r,à… f¶_å"žõðg÷3¯X`|–,‚5ƒ Á°í“¾[>†Õ ‡l. ÁÀxV, `Èñ,€ã4žÅ\0hû;:Ž3þ\!º™í–E»¶' ¼tc1´Ý.8'>]æIš˜{BÇT{ÝÜ#h­¬MÝÇ?ùð/ÿï!ì‘úé?5(Û"’ä VLÁxŽ\0¢Œ¼¾÷³ñ¬ý–Cnç¸.v£E¿ÝÈNæÿ^S8ð—ËgKìÑ^¢ýñd<ÚÑÃk5ÿm¸Úc…Y"ÁZŸ”G;~Ìb –òhWD;&øâÊ‘;NêØ+«Ë›®»Ðüœb€‚ mÇ/$/»ØßÆæ„&&çD9W%½%KÃÝዽ‘ÜØüšCP,X×kC0>±¹`pcŽD0³¡6xëCß;$]0‚ñÉeÁX'‘8 TÌ&Àp¯òlÏbKŠaKãY±‘8]00„…`Ðxóo­4§Å{€ŠàÀÕò¿ôu ÿÇ/maè 3 iºŽïÃäŒ%9s£J°ö‰‘ᤉvpüE#Ú\ÐÈð“?€É™IDûË–G»"Ú1°ëËÿEÇqðÊW¹bñ)Ì·r`Îdógb†ÂL» ´}~¨Ò´sâsež¤‰€‰@IDÀŸÞ%YøÂr´y5éΑÆS…!Û9R­Ç®X¨ r~çøZDõ‰\0Þ—‹H.G¤ r%‚Ž€#½‘f­‹`°ñ,FºË%ÅXD’ ‚Ž€‘ 6ÈŒ0‹¹4¶¤˜f‰˜ Fó+ö€lD×øûe3‰Ê*Ÿi£l¹Ä™Û…ð‹]‹‘a²AžÇF†ï#ÃÜB/ÁâíÞóÀs»‚Ÿ[&I´¸Ð=ÚcíïþYíH°ÐkDDZ×Ô§m¸pÜkù3!%Un¼‰•»Ð\Ûƒy7–ÄÛ¸4Ïéñx.¸à‚U«VÝaÿ3cÆŒš5k–ô•év<®þG››[Ò× Îß²eË¥K—:®gÁ‚7.…kX¼x±zèY³f•Ü#âä±b~ûí·_qÅ@ ä]?³ßïïӧϺuë×3~üøüüüÒ¹†3ü(ÞP}R,§®¾P^MèphΔ4ˆoaÖÊJ?ŠÅÝèÇÿã¢ÁXùæ9‚Ÿÿ‚ñX"cµ@0°ª…î‚a!/PšE¹v …` 6ˆ½ºH³ø’bkIL£Ù{‘©à€¿üåÒÇp‹ÏpWFîÇÈSRž`1«{¬šÌ½¤˜‰vli)ÑãGíôÆï üª8ÿ¦ÃL±0\Eà_¤`V¢&–æ(ÇŸ‰yàú3{žáwüé=<¾/¾üòK…¨9þòŸÿüçÈ‘#+V<½‰wo|UÅztþßÿùÏîÞ½;—Ü5àÌЪ“'Oƹ’7Þx£Q£F%z ?ýô“ºŒd•ÜcáäñcþóÏ?WâV™7ß|³þ”—ô¯ýkÿþýiii%‡2qf7Ý _Äñjb·( ßqG+«Ûžô³H±¸C9Ëɶœü#W,ª º"'ÿŒæ?\ÃÅ’b;‚Ájƒ_scð.¤YŸbû;!wH ¶¤8ÚÞn.³E$Œ}öE$ñŒó®Ø;éÈúqñôgȼø=ÚŸ¯4üE$XØ]É<ÚO4šözÓ™o@›áS…rh§e ¸Xû¾îÑŽLJŠh›<ÚÑàƒÞH°vÖé½Çò´m²6­`ªû"G¾fNj)I<¦Eô«ˆ°‹óÊÄû¾HQ¿~}|/Äÿò¿¾öÚkE:}RwJ¨Xüò¶nÝšÔéŠt£ôôô_~ù%a¾ÿþ{ŸÏW¤GHêNeG±x(l%uÝEºQ=7Ø»wo‘N_®îª4ɾpÌcUcÌ9bkíHÆù‹,@Žùç.yæ[¥XÑwÈEóc¹KOüôn®Áxø;7 >žõ~·Õ´¤E”fñE$..ñ Ç’b¾ˆD.)æä ™Ù C0š^±4£~ôšö ­ká»Zˆh_]úD;lA`Á‰~Œ×ßó,ðÑ„؃º¤‘á#? äÀ ŸøEí0{äDûî¯þ‰Ao ‡~ûoÚå¨&±0RÝdŠ‹e{ü&–r»ˆògòøóÊÕ‡Ãv±C† Iæ[· ƒ%ô4“T¬?ü°„.§½ð “ŒCÆ Kî2Êšb¡BXrOvùòåÉÄü‡~(¹k(+gÆDgLç —EYÖÚçTV×Ý™é+ÞZ¬ÕrãÄý(ÅbÆ“D0¦ýQ!Ï‹H’@0N9Á 8D¸#ä‹4 ãY‡Øxö=²=bÉÝÈ Þí‚`4¹b¨:cÇ£ß_4õ\PKí´¢¥å \܇ˆÂíÏ  "%X°OÀK°Þ„*C›……`’Dû“?`Ð ý6 ½oä‚Ùçh¢Ë”súéßÛ?þ‹, 2ì¯f³é¼pê´lwLbÅšVM,k›™’â)+ïûÂ_ÇСCõo‹.º¨²ü³mÛ6ýŸJ®(çP¬Zµj©kxî¹çJ§JÖ­[7ýÉŽ9R]ÃôéÓõ*((ÁI†3¢X¯¾úªz²ø‹þdñÒþ=•ì=V®\©?~ ¨Ë@!Zýb’ìËïíüéÝd+k‘¶Ú1N+‹¡Ž©,†ÀewÝAöNZ+ëÆõ'tÅŠF00Ä ìÄÊvP×HÐ"‚±Ÿ‘p‹ -cåILÑb–KxÅ"î‚¡ŒaÁ %Å|‰Ãã^› F4‚¤!MúßóøÉª£û”gd‚Å6aòçn[í¸Ð=Ú“%ÚáMU4¢ãnN¢[J¢ ~I l»ú¥•e;ýò€bµšG¯,Z}°!®}Q‚NËv±”Ä}Ɉ\äÌ»¹ü~LpåÅB/G=‡”šbé§¢3¢X×\sŠÃ¨Q£ÎnÅzá…ô÷ð™R¬ììlu<òȹ¥X¾p£˜­,‡‰{|ƒA¶™0Òh±^ì3ë]±Áø} Œwþ‡#T”Ö8!•.¿ºþî‚ñŠ`0w.ÁàµA†`€©£E$§ƒ`Pm¯Û°¹`4¾âôéG·ÉO‘h' A‡G»´”íîDûŠ“]W¿û‹7|Ü¿ßVvn!˜Ñþí”`ýö?(ÛÎ<ü)kb‰¥!øý‘Ñv…¶ÅQãÚ©‰µÉJÈì“Xö%#¢‰ȼÄ(ÖiF Ž4Å:ÍØÆº»N^Å*¡ â´_–X”åX;ËW º1î]w§5œ¥; {Ø¡X ÁÀïzZD¢\08‚ñ†+‚ÁdzÁ`KŠ“D0^ÃbŽd ^$³A,)fiÄùc5Ò¬‚þ÷â2Øñ ;¾¾pÒÓ1ˆvî ¢í=Kœhzð+TP!ð(WŠh¿ ÖÏÿÁK3â®·­&ÛʘÕeKÌ’ ÅµóÉ-æ#Œ_9\¹dÄ—Ú¢ï˲wS“cñ×ÄQ49OqJ³*xNçXx †*MqŸÊÂhgµíûˆÝíšXa0ÒpŠ^lÐwo´b‚ñ[› †XR, ^´-"áÆ}rÉN¾ˆÄ‰` 6¨!'Ä"5žesÁ@m‘HŒ¤ŒFýï½éÀWúÑeâÓ…&ÚÉBÐîÑÎ-ù¬8íÌB[W.ºý}ä—ÂB0Ú£OpA#Ãní Ú\(¢Ór‡ÿð_¼RW.zQ,eæœzÃeÉ–9¥¢ö3V%­Öb-¢lhbÁíÂ_©ìÉP!®È(–Q,“câSr7 æ^m‰ë¾81˜V0™Ú9|SI³õ¹m7G+–…`|/‘8\00ž%]0‚1ò!rÈ‚{40{„‚˜Ýã¤pÁàãY Á€{¬‚ñ$ÆuÙ’bÁÀx–D0äx–ÁhØ?Øqýè4ái±œ…3ý´HŒop‹µ÷`ºH ÖDÑÈp?l~N#Ã×`dø¨–À…h³‰vlÔt%Ú1-Ç_¦®c×K‚i fk%A,ޱË•k'ÅÂG(qíáʘñô–Ü{¸ÎlË(–Q¬Rø %~ÆEE. jÄ í€4*Ó2±[kï—-B0h[ä²xûk¿uM³’E0hIñÁ§G‹H8‚±'‚y[Ž`PmP,"u“î‚ñ+–f¡6(‘D»`ØŒý ‹6x×çêh?î)i!ˆKYÑ^pD;"–<ÑŽB½@UºÜ%Üë ˜IU£IÎŽ®” kIPçÚ«Ì d^V&Þë§qF±ŒbÅ:PñÝsl½Ó<‡]“( &C ²ø1žÑf 9U¼}ΣŸ¹*G0øx*øÕ/‘8ŒçõE$NƒÕÝ\0æ¿ RØ#%–'‹`Èñ,Z¶+ Ï‹Hê88pû§˜ÕÇöOÛŽ}ª8‰ö1/q„Ê6䂳ßr'Ú·|Œ6˜IÈ6Ä}59 ?ú=¦›±´íD´·{´Ç ÚÕ«K-é~ËŠ•‘Ɠٖô+%’œœUÈšX`.°ad9†©YK+ V™ëKm]|oØ3s&£XF±Œb™Ï^Ô£z•¦Ç+ *âvyÌÏBx Ú³²:ÜÁÍË1jÛ¯c)–…`|ûOa®Ž`,;!Ƴ€"« r Biƃ܌Kh< Ƴ˜ Æé ÛtŒzýB*ôãüÛžíÜBP÷hç‚=a!x€v6öåÀEb¢½ÁäH°pñ-ç¾…'B#øpퟣ>yãþ¯à à¾PD;,Ñ®^-ïþÂ,ÎPü¤Ÿ7=Æ–ôäƒÃî”  ÌšXóð{ȨVFÞëE¾ £XF±ŒbùãSÌw æÞ£0(F‰#ŒžbË0ÿŽN¯ ˜1n¤þRúy.EnÐ’c)G0€Vßà ؇oýäïX†‹k~ý?pgÀ’_B0^øj\„`ð%Å Á@ba!w%`ÜêXD’,‚ÁƳ6ÔpüãÑÄ@2!Õ×ìùœYºíÏÿ뻿ò eÃKYÞõ)-ÁâíŒh·êx-?õµ, ²«þŠŒ–󵋭±Æ°˜'ˆÅ\ˆ»ÈËF †+ÏNñø‹ù-[ê§3ŠeË(V©ìb<` ãb½0H»tá•§\qyÎÄ @eÍ® fé[‰ÓêÎf{¸ ‰\÷Û£X6ãY Áب!øÚEu‹\0ž‰á‚Ádz€`l² ¬:´\0¦¿£#Í#)ƒVlÐxÄØx-"©3à>øðbÕ/?ð÷–£Ÿróh§aj›G{òDû”(f6C‚5ïm<\”(Ñ®^ ûNqg&‚Ô›bFÛ5’¹`>q˜ –“‘#c.%ÁPÞ­eå~×aË(–Q¬Óøë]}áæáÊsl…ÁZL±8¡r&}0ËfåÎj°4+µîqæØÔ|Ðþ8ŠÅ]0àh‡_ýøí y „îxO.)V.Á Ú`ã”î‚Á ì—rC0žÊ¿öÉüÁ„`°ñ¬Fí‡à4¡ÍG-Ñž?¸ˆD;VYB !ÌgË£ý¾¯Q#E4€¥ EŠd{&çÿ=¼ðáˆÏ-a¢ÜŠ¢«îÑ®ˆvõêܰ櫾WªºK³:3Fßµ ³v1¶ÅŽ7½p>†Å™ 98Œ_BÌË‹õÝzfNfË(–Q¬3óÙ‹~T¿"v醫€¿ÐˆAfI.<(gb¾yT”VîniVjýñj– _gÕºl‰¯X:‚qŽ`ðڠ̓#G\0æ‚ÁdzÁÀ7{÷µ§°K¾_DÁ¨4ô¡PÃEϲ-"qG0j 8„é]ØÆ«£ÙȣȽøÎ°¬ŽX‚Eˆ?%Xa ÛÙˆÖåbÅ ÎKCæ_{¤"¾#Ã/ÐÈðè—17àœ%X³ßÄþíÈ‘`u[s »zI´åÑþ½Ã£½PD»zuzO=¢'XiuçÅ€Ú%sÁ:Xs‘“ÌÆV•yx_ùÓÚ••7úi\‡Q,£XF±NãTÌwõ†ógàç°æ1È–êò -͢ ¶ãQãŠ4+­Áx+3ƒ1]ÓµüößñE+Ic–D0ðíŽ`l‘.ÏZq’#à‚Ú VúZKŠ… ÆJ³È!7Ž !µ®¼úÙ/~àïMo=ZŒí¸HÊ£}ÿ—p¡ëáït2 A7¢ýäŸQbE¡{Ÿ)Á’í:Ñ®^šv76K"[šJ VGkj˜šylVT‚%™¬’ g.08<Šå Ô(æwë™8Q,£XF±ÎÄ'/Æcsofi–ë`–â/Tšµ^lÌŠJ³"§È˜0yºû”µ×1–tÑ’b†`ìÑŒ÷’E0È!iG06|ÐcÝûXxˆµ‡6 î  1žõ<[Rü´}I1wÁ¸Ÿ-"qº`Ôp?²7ýh<â(%Xícy´ßO V–`Ááâj\ ÁºéX¥›Ÿ«4œ,((Ê•E#Ú¡œ&Ñ®¿õzmç,A¨×à65 µÇg.æ†+»•¡7zQ/Å(–Q,£XEýô”Àý½I±´Á,¡ã€&þ‚/f‹‰ÅþJ³Ò›Í 8ä]–û&aaÐÁøX"|I1C00fd!|ªl7oZD…`@Z8‚AKŠg½YÀŒ j‰Áx‚Ò¬( ‰`ÐxV+€ vZnÃÑ>ýdˆvx™h‡É÷hwu!Én¶ŽÆT;ªÞ8½ƒ%,rvg»E¢¡v7æï¨PÞ¨x·žSÅ2Šeë |ðb=¤/Ü ?‡£ø ¶®Pó¿°aîÜfОfe´b´˜â ­š|ïû  7`KŠ‚ñ¿Á`Kб6×ZD >žu˜/)vsÁ¸ý} v§…`ô¾/‡»`t§•†hê@±0¥ o9*-YKXî‚<Á²,‹H´¸HŽhÿ}a‰võºìùüo ¼_ÉYˆ`ì+swT ³z—ŸÆ¥Å2Šeë4>@Å}W¿J8¶L³æÛü/,Ì}¥ÀÜ£Ó¬6lÍ#¹ø¬×6Cgxê—“Q¬hã ÁÀxø7Pp`á,ãQwè9G0XmP!oY.c­E$‚qD0¸Cîe‡r/±!Õ¯|›~4v” ÉÎØ2ƒhçÀÅ`OjÀ…Ý£Ýhï–¤Gû§G;ÖŒaš Ü Bgy´÷/$XÊ£=úåX}ü7"Á’ôD¤`2aýb+ªƒeM ǂډ¹€bùR;÷[õÌœÏ(–Q,£Xgæ³çþ¨?Á”fqþÐàB`ÊØ‘|š•ÚàVo¨B¸úLq/P Vd5];ê®·’-켋H.ïþ“°Êƒ#X¨‘Áøp„ÁÝPgÁ¨våC(0‚?TG½¡Gz´3¢ýÉd<Ú±”7!´=Ö¾Ÿ<Ñ>§¨D;QV>ÿ]õ.wŠ*‰§ûµCÕûe¶Þ@õ@w[¦˜P;÷¹ ÅÊŸå Ô.Kïò¢_‹Q,£XF±Šþù)‰{³oi–…¹/ SŒ4K@ƒ-7FÏôg4äWª|ï7ÿH¨[Á ñ,‰`léÎŒ7c¸`V.lI1C0úèÆòâA0ª^ùPó9oéG(ÖéíØŠâ$ÚW&E´ƒòŸÄ,ŒWcXL¢ýë¹ñÀÿÖ=ÚÕ«pø÷ÿºþµŒ&ð½eU–%àB//¥7”—Zw¸ŒN°,#A jǯŸP…YOjI¼WKÿœF±ŒbÅ*ýÏ]¼Gô§÷ÅâäÒ,k6+½É²@…Î)kûQ0ïj§<¾ V×î±mÍK?Ä­d X¹ ‡b l< &œ‚ï>…`T! 5žÁ¨råá¦3ßÔÚ7W,Ü1h ÁÞ÷aK$vE’…àÀG©xÍ“À1ûE;‡Ñ,lF®~Û+Èó@‚Šhfâ Úgû-\¬àeµäÕ? pJ#ÃD´ÿ5ŠhÿO4Ѿ÷‹¿u¸é÷ÅÁÕæèo_zýHÃiÊ'×ey£65¬'XÁÜ1eë-~WcË(–Q¬Óø•À]}áóCf’bÙ¦‰íi–>›Õxu¨JÏù#ÚãM V¸Ž*Š‚A¤;¨¬æ·Øò–ZÈäª^Á€Uë^rÁˆB0Nü²ðåßÏ}Á¾¤XC0`¸_ó+îÂ’â°«3¿„`¬8 be7,H„äX.Ï"³AµˆÄá‚ñ‘îÁ¨<ð0F?j9€ Œ cg#ÆÎÆ"íËÞ…¸bÒ«çúhd˜vví0Wtñhg‚ TîHäÑÎc¾ìØ·Õ°[Dz2 ¢,…«Œ÷ª8ß_o ·c¤`±4¹Ðf°¢,ø§°+qe ¼OÏÌ)еfÍš‰òÏ‹/¾ÈW§ó?áp¸„.«Ùc=ÐÑ£GÕ?}üñÇ%t8m·nÝôk¸æškÔc5Jÿ§‚‚‚’»ŒŸ~ú©tž/‚©¨Œ(Ö¬Y³Ô{ïÔ©Sêò“’ xY<³×_=”73Fš¥ A1›®q‹7T1ÎÓV¸4­ÖB7«§u]F<|Ï×ñ*„ü,‘p …`p‡\ È*ÜŒ_ÿÆþ*î‚Á ô„‚ýÍfÇG0Žb5°pÁPgÝ[ùʇ‘œÑ1…ýïäÕoxR³tx´Kà .`Ý‚ë8¬·½Rg«äуh‡Ðb° K–ñ,ð\ðŒ†Õ£=šhG%ðÆu¯fÀv=Ú` rUõf”c½¬øuªÔ/Òw¹Ù2é ~ýøR;—Å7z‘®É¡XúW³þ÷?üá~IÙþÅR/ݹ¬X±Þ{ï½÷^‘ÞÚå÷Nž`(o†3Í‚y<â4oÜÔZS|‘x¿ž<þŒÔÚ×c®6½Ùü´Z3mÆÒQ·fm«^üM¬ ¡†`ü˶ˆ„#¯‹E$:‚u#@ºß÷5Í1ž%‘ ‰`p‡\æ‚¡Œêº ÆMÇ@ôÁH vJš Æ,Í:PiàÃõÕjP¬#ÚlKÆ£,í°ŒåѾû³¿¶½ñkšŠl•àB¬pˆp_Z<— o0?\íæ¾·D‚…÷’7P¯ü~Wž¤bé9G±?w£XF±bÉÕþóŸÎÏžˆÉ~v‚Y#â¤Y©µæú³Ð²òÅ<ǬtQF˵´z¤;ðèvw¤Õ¯g)ÂÌw ÛôF¬ !!|<‹!w}òwŽ`¬- ‚Ú G0°\ª+HwŽ`,xôV&bqb.+ŒŠ?…~T¹þ³Ä,n!È–`¹íÌBpÔË5Æ"Á’‚vví°D‚ÕçÎpå@Hï Ö°Cl Ö#ß) A¬ ›ûâÏ(bR D;Â’h_òô7U/¼[[bí`L­=-£å}+\ëzüòˆó¾ñ¥5J­>Q÷½u$X¡Ü/ágÇŸ„Šõé§ŸÞzkɺÔÅ2ŠåªX¿þõ¯xv|Ð ÷,‘~ø¢¡4‹ÏfqhÒ¬Ü~_$Îéü™M#s… †Ï¢q¥ŽÛÒMJ«»Xrƒ«hq‰´ïxËÃ{¿ü»« ð6µö±%Å´ˆ„\0þ 3rrÈ… g‚AãYG~ÄW9¾ÐÉÃÁø¨×zá«#4žÅ ”é`6è‚`\%]0.‚”?ð$dúQéÚ'sz¢ƒu@Œ ÷ÃÈ0.ˆhçÀy21àÁ ,™ÄªI´ÓÐTCk­}4Ѿ5±G;ˆv”F“ôhGkðºÕ¯à'‚°«àí+ɦ֟Ù~3s¸`+Eà`B‚›Ò›¯æ_ÿJ ³s¸Ú¬ÔêÌEùÞò¬`öØÂ½ùÊö­Š5|øpttÔŸ:x½|TBOÅ(–Q,(Vß¾}õ÷^«V­JèýVNë µåN×Ò,r U¸É¨ç꽡ʩµGéîpÁ  ÅÌ!·ã¶ôVè„Í´™êÊm[5zìXþü÷ѢŌÿ(Å.ZD¢\08‚ñ¢+‚AµAŽ`^pG0æº!Ã%‚AµA} !"t¡ô²”„GûsvíÈðlí1‰ö/‡øjØ¡on……à#¸(,Ѿ󓿴¹ñrWrY¼5@k¥ €3¹Ò°ÒÎögœçÕ÷x#ìËñãFÍ`á~÷Ò•ƒw|Ò—‡Lú§{C£XF± XÙÙÙ§ûN:kîïõ× åLSiV¨ÂX_¸q¼o+_Z°Rÿô‚UrÙ#3«³6ó5äcĶgevØ”V"í{ŒZ™ÙjãMP!tZÞYÆ×.îÆ7ø¢'c·;‚Ár`@9€Q L‡b]•Q/³4‹9äéîD0* | èŠ{âqŠ•{ %XÅF´pÁ¬]Ÿ¡wãþ/A´£?§{´Ç$Ú?vx´“…à‚#_U¹ðn&Wëíí«•©õfd´^žÕi»0h×w6:<Ú›¬ ×Àlx¥x¿Z•ƒ9CX‚5“º¡9Óýá ΚÏžˆQ,þjVP½«õ~L”Ü»}åÊ•úcÅÒBíI eOÃ×M(w²/ -«ØÔpç¬Niõæ«uÃÖê,åÛf³°n‚ha}­|Üi25Ò`»—sáVûaÃàNO¶8‚ÚàÞo‚ñÙß±œpé¿`¼ Á€C®tÁPÆ Œyo'`žßÔbIœ#‚‚Üæ‚ÁŒi¯×›ôÈurÈ… F4‚1èÑü«'öO;0h\h¢}ö›-Y‚Õaé»péI´pá$Ú1æ$Úß³y´ïþêû/|Ard1PäIi&fwÞæ&W[m¡ÚW’Ѱ ™øØ–Z‚UsŒ’ƒy×xü¹…z•ßÅ2Še«¼|~áuÐ*Tq²ÝÓ]¸`XµÁF²6H V>Þa­|DCKNh9D+³íÊ´s\E«Z‹žÛ Æ'b wÁà€oÔ'ý&F¨ ‚¯egG0Ø’bÍC,)–Ƴ,ã'‚AŠuýSú‘Õc,Á*ѾÜîуhÇ0”:§ýO->ѾîõŸÏ|È)Wx-¯I+XšÞbV¢duÙI?]u”Ù~I´Aûj“­}…D?>„)M '2dZÿ-*Ç̈öʳü àφ-Ãñ?q\šJ /.ƒ¬àÞ½{•cÐý÷ßo\šJâ;ÝA^è.Mõê=CúÅ:o F0{˜ÍlP¸`HÛ@aЮ€<Óâ°»Naè¢E†È´²ºÜV0ÙU´²Îß|íêWüù?T”Æ®„ÆZD ZRÌŒ«v~†šÌú`Ùã>±ˆ„»`(ãYã_é‚Ak®Žèê„yW¦‚áUÁ&ÿ$—`=‡,F†G¿\sì+BI´¿7^xòb,¬‹ Ú™… †…àn.\ˆögx´O8øqÅ ¶9ׂp¹j43³ýº˜r%h‹Mîí+Uä¶îÌxI¶5€Å-ó&øB-RR<Åóž+“g¹ì²ËbÙ à+»t.¹,(VÓ¦MÿûßÿÆ …Q¬’x'Lž<9VÀû÷ï_X.ωι(v˜ b¦£5°:kq̆[ù¨MhÂØ„ßò:Èxw%Zð“Mo>3R°LMë£]­‡<´ã㿸 ÏbL`ýàïwÈe-)f†y-Œq¯Bi„C.H÷! Áøà@ýïߣ±Äí§G´oùð¯—ÎzÖe‹•È®&e_H 'ݳ+9,l“+Ü‘ï\ÙýI®X=ëÓh^X.ÁâXÁÌ›`MY.ßëÉ]ô£>êúÅqN)BµqãF£XˆC©ÑíÁ`Pw¼Õ×(–õÙõ…:…²§2Ò]sÁpî{”¢…åÂÖ]ÃÖí¡ƒqE+³=¾%g‹f˜5LjW¥ÛŽyO|õ¹`Hãsé‚qRwÁø½rÁ@m#h¹ lI±\Dò-"±#˜æãY‚1øWä«e Öã$c×± € Y‚…–c”`M}rØ|ö[k»èŽÜ£}­Ó£Ýh?ú#L=ð¤æ§%XÂBPz´/yñ§‚¹E…#IŠ Ør.6¡8äʲb²äŠB¶pi_qƒv½ˆ‘aáp!°@´û#W¥¤Ä6ñJNÊì­²²²-Z¯[Ç÷õ¹¦X0§Ç¯þï¿ÿ>¾nïöb|'W¯^?þö·¿9bnËdo°‰¹`@´Øê,›u_R¬5´,Ѳ( Ôyw5Y¬gZYlþv)ZÎfØ å/øÍÿq Ý!7‚ñðwØ)5ô pÁ« 2øƒXDÁxŽÒ,¸`À¥º…`4ÑN‚šG{qí#vÊïŒJ }‚е "¨v\O›P.Ø©gWN¹Þlú wdÙ•”+û>Û,ž`Q=NÿpHáXþÔK±²?¥eóTééé]»vÕmrðmR:—Z¿~}ýqu_¨æÍ›«j×®])\O ÀÁžJýYµjU©U;uêT:ÏÏQ=PË–-õÀê¯^šRˆy… ôÅßñ_JáqËÓCxýuCÙ(ͲjƒdÝ$ý™hqn­dZdiAK‡-lý<ï®Ùa袅´ ½ÅìHãå;dÍ0é£Ñâº6½ûG Éîæ.qŒ Œub‰Ž` ç¤!Øž% l!ÁЕ~ðë–` A–`|‰'Xో‹¬9”`áQ:-{«O`³ï½éÃË·Àá‚{´g©¡ÙÈðaZ‚à %XÏÿnþqi!Ȉöµoÿ©Ç”§£?îj±&Òxrö…;¥\±¹+†ZÄ“+D=¦$gÙ¾b äŠÕ‘ˆûÂËÓÛÚ\k D 4÷c•Àå›Sž-ðø*³`dÀkƒ³è«Š×eCËÚE¢Sõ+|ÕªÉâhä¾j»îÎì°.R0;zÀ )E¥ ·O{ðSŒÊZÆû1\0‚‡Ü(£·B0Vžkî‚`0‡\"݇=‡r” “Â@-¬cÀà ¸xRX‚%€ ›Gûì7Qu,2Ñ>ÏîÑ>ûèwõ¯Ø¯5®¬ )Òxiz«ùT Ù•%WbîJÝêÙ•îmÁÛWöé+I[8ÚWÊiŠ/Øôly³›çQôÅ*zìÌ=‹7 fÛ³¸­»ÞÐr¥0”y`ôV,ÑâÃÅ]X~€¯Ý®;àÓj‰–°ÙåÇæ~ ^Øñ9-‚" Ž`¼c!´¤˜!á‚ñ˜tÁ8øH<ðx¹ †B0V ƒ/)Ž…`ÀEö kò-åÑ^i¨Ó£½~´G»+ÑÎ,)Áºïk0GþÎhã0­rç;yï²`teNÑ?#³Ó¹Rc±äJgÙ]åJÐÜ ]µ¯È =”3Áë¯Y¼o6s¶r£Xåô…;K/Û d\mkhUÆ.’y4—xŒ7´ô±büNw-Yâ) bp§ÎL´.º| Òx™Í´B¦yM¯ºoõk¿Û–‚ÁƳ‚1xH÷O/ç. ÁXö.°ˆ8ùÞö¹_?`uQ\D;,ív¢}É+¿ï2îˆK%7®šLÎîÊd^Ï®¸g wµˆ'WÒŠI‡y=ÐI[ØÚWÁìÑ_ÞYúv7O«Ð0ŠUè™;”p¼þÈeVC‹( {C+Z´¸ã-_ˆeÙa'!ZŽáb;õNÂŽë#3£*„”låw¹{ì=ÂC8ä¾ó?ð.ZÊ\0PLƒ ¼øàȇ¬öç„`°%Å ò¼'8‚Ú] Á8¡»` úG{°´åAZ‚5äiؽó%X ‰hŸðjýÉ'°æN»8-Á‚…àò“àé{¬{#Ìd†Gû•Û“óhí—IU§Ï>=µRh_¤`qFë…šVaF&XÒâö´äJ «õWH¬9mQa&Xvì)á÷›9}yŠ€Q¬òôj;×êKí,Zøò0-ZŠÂ:ˆL+him-Z¦¥\ÞÅ|±¬îDa›Öâ8åj›.žqlÓûäW„=¼ÂãYÒ†Á€ :¸w `°%Åó߉NµA‰``w0öŒba·ˆv ­•€hgÀ…N´¸ ‘á-Ã5 ª)ˆv\ûÙŸÚÝú¸kj•Þdu¤éªRSìv,P8²sÏ@>°¥äêvbÙËó¶Ð‡…Ùú+¤×Ùmoq>Qåö!Ï?ÿ|Œñ?[·n-5º½ÜÌ\øŠ€7P3”7¿¸£ÐÁdEK›ÓŠ#Z6_ V!¼ƒ*„ÂSCçæ7æuÜzËö“:‚AKŠ‚1ÕÁ`KŠ]Œ%ïp£éÌ7À¦ƒt¯ ‡ÜÑ/W¼îHÎE÷èLidx˜ ÑŽûhGFȉöQ?«yÉa÷gO­Ò/Îh³(*µŠ] ä+¯ø˜°dçÙ•2ºµY1Ùá@&W¾piÌúœ¡7µyØBGà¾ûî‹5G\«V­BŸÎÜÁD ä"àñUæŽcÅ:§¨!­™–›÷ rrrV-ãB^!Ô–›P²Å{c»M<ºêÍ_€Õ-ã‹_ý&™ðí ˜|„r±{^!´¤˜!h)¹ ´¤X-"y Ý©Š×Éî¾W?r/°ÒÍÑ A¬3ÆRc¬/Á}“'ÚqI£¡%XÈ‘£½ßÒW³Ûnf2c+²éàiY6¹¥V18 ]®ô1áÅ@eY£àÀp…iÞ`£’{;™3—ÇÄR¬-[¶”ǧc®ù,zïÁì¡1DËr¤Éb.ZQô %Z¢)''·i-ªj-ø¶ÂúãÅ èç!ݪ×wߌ'¾á¯ ÆC0vòE$ƒ#¨ãE#• XÄÜ[v9ràc[Õ¹…àiíñ‘`M|üû–7vÓªué«"M§ÊJ *j©* ä+îÈ¥yqzWš\e·ä ^·^µ³üÝlž^á#­XÿøÇ?vìØ‰*§ðÑ4÷(xÁ¬A…È´ ZöábM´(IâãVQm-æœ+:[´[ IFVÇ i §ë ¢Ò­Üvw^¿á-ZD ¾¤8 Á¸þž/ïþ-¥~wÉE$ƒg1£Ê Gèqµ#¯ïýÂB0Ú£€‹höuví.`!ó#àâÈ7íú°ZQÃÌ“-Èh³Ø2^²ºV®©•£qemh´äJ ;-ä&5z•;ÒãË.÷’yŒòVa‹úsà 7ß òöž‹×ë ¤_S´¢A &Z´’¨÷urÖJ99IÑB¢ðƒòs¢-ÑÙ’EBV!l¼š¾Ó%@¯t«Ó¨ÇÿÝb¤YÇã"|<‹!´¤8Á˜þhõª7¡ŽA´_}ç{•.¸›’*…EXÉÐÜŒÖK4r]yÚjZ¥›Y­r¶ÆUT1Í]ñ­W6¹òGº'~ÉÍ-LLLÊo¼j¡ Š–Åb虯ªUÚŒ°ÕÙ² Us‹‡pR¤Ñ Vr”Fòœç=<ã©€áÆssÁøê„`ð%Å·¿ï@0 E5¡Xxtí€ÿ…îÑ¢L¼Ó£ýWö¯ùÈp×)Ç2‘Zi@ʄŗÖ`RfÇÍbÊJø¯Ë–•",DЖZÙs5¶=DapÖ¯¿Á§ÔŠL˜¸«…XÒ¨¡³|áVå÷Mh®ÜDÀDÀD Ùx|9¡¼Q1æ´b„ºÆØDËJ¶˜¥“FdXÍ-›n¥·\i0j_êœÜ#ªÉºêݶ¸çc`À!Wº`€€àÆÀ¸Fí¡Gé´#¯÷} ÚQLŠhßñ)‚F†ÉBðë›îù¬Ñ€ý¢S¥’*\3 H-ƒ°œæy•«Vi@  ¯êб+|C#¶ä*ª7X/ÙÛÜÎDÀDÀD ¼GÀãM æÜh­hÃ\¾O‹¨÷m-[²¥a„±tKr™í7¤Õ›Ä`zÖ-Ó¤+«ùú> ^šöŒtÁ`KŠi wÁPÆ&`ð%Å|IÝ¡G©E¤y½Æ#Ú™… ÊŒ°ÜÙ“pÁ<Ú¯Xûv~û;ÅúDªdr¡¢5iõg¡È–ZÙk€V^µ…@J¯K' 1Í&%W¬qE&L¡ ã½þJåýíg®ßDÀDÀD ðøÐ·w-Ô j.NNBC(QÍÖŸ£aG‘š[rÜXå[‚Ë ¤0­`R¤ÞR’C>¦IW‹k{äQdV)º lI±B0êÝ|”]†uT¸ôSN€€o6û-t¼ÈBpé»p{ê¶æTÏÛ™…àd!s l9ÁC ÙÿeÇÛŽd4]ËZnR¨Èu‚à½Ôú2;lIí`dýªXZåj©•ô³ ÝŒ΂gWVãŠÉUî7³/³¹¹‰€‰€‰ÀÙzw7Ѳo'±’-™Eu¡ôae€Ë tѺÅyBB3Ò[,H«;ÛÊä´¬«r§-7l;å†`°ñ¬­_¦!X )ª?ì(Yç“G…K÷»{´¯~À…îÑΉöÁÛ>ª{Ù^ÊùxF%…Šõ–G €°‹ µ%D, ±çUÑ„…ÓÌ"VjÅýmœÉU0ûÚOèlyß™ça"`"`"P¤ ‡®¤\Þ±OK§Þm-ɺ&[ÑEBfÜ.K<ß\ÆV±Ú9J» iu'Æ$C!™te4^sÑôcðF²/"‰B00žÅ\0ÞrT ”hº.ÿ’ý §¾Ž‹[:<ÚDûÅ‹OäµÞ TŠ AÔ]–ZwFFË%l±=OªäF+Áj5@M«¢ ‹(È"FjeÃI®™}SR¼EzyÍLLLή “Ο¯BÈWAÆK¶T‘²V'„k»µpÄÒ-5tÌJ…\ºÒNL«³X=“.ÑBkÜÿÞá¿y˜‘pƒ–+cÃØhuáª÷:-?Y0ü(|iGÅKîM†hG«õ°ÇÒ‘Q‘J1á5:6•Zo\f»M–Pñ¤J2ëV¿*¦V9Ê€ÚÎ{ù´iSíf´8 6tUiŽ?­ËÙõv3ÏÆDÀDÀDàô"€~>ºúIW5B7TWçìºEN‚'T¥Bžr1éJo¶ ­öt±%™«£L¼òÛltǯ%‚ñ• ‚±öŒÆÃ²f˜uT¼øA´/x‹µP<„¶a– { ¸Øàâ“Ë7¼Wó¢í•s»µç§5š,2*]¨X‘X«¤#ë‡ÉW,{³w­bVÃù3|áóNï…5÷6008#€®~(w¸&ZnBg²%1º%S.ùì¥B­Z˜Ñf}jíÛm÷âÅŽôú˱“~¸D0°hѶˆ„!MGe‡uTºx_|ö gÏ>o­°–àî”îPÆ®9%½ùba\Ë3*]¨¸‰-Ü%¶n«ZZ¥ÏZÙ—”™…@Ø£8‹üÉXs6¾ÑÌs200(–xBÁ¬km„U籆Π1„Ø©u¶¢‹„®ºeõ·ôR!O¹d—‹g]¬`˜V|jù49KÈ";¸Ô^R¿÷îëw}"–ïr"çÝzT¤J¼¬Woy¥^ûZÌ} Ë´Ú#ÁZ~ Jˆœhï{çGM¯}P™?Q|b·Ö˜Ì6DéÏ)TÊf‰o´bÆ€È)íNƒjÐØŽoØ—da«2,0ï6/¯X^Rs³8Þ@FŸ(Ѳã<²:[ªHhŸ¯ÒÝo…né(<ïr9¤‹fÓ›âá&3™JÉŒô2¯ÙÚ>+^¿áÞ/¯Ùã@0>h>ò¨ÊÉø_*÷ÚëJ´÷\ù몷XÅUŠfuqÌ&3 R)­ôG•*+©’&¶‚Tý*•W±–•£ ˜(µBäƒ97cMÌYü3OÍDÀDÀD 8#àOë,Ekí ¬2¬2Ù²³ïÉë–0Ë-.kŠKJ+òÄ+£ÕºÔ£ \¤ \ÀBiÚÞò(Ì)8‚AKŠ7tñ†Z@±xN&*½öP‚µäÌluåDû†ÚM|6³á ~*&QÜT‚­Ÿ¯6>ý¼Åb½R)ŽT8„Êaß.L1’×*ɯ 3 1 Lr•5(Å(Î×ÒœËDÀDÀD଀/Ô”ls+ζã,ÙŠ.&Ô-iÅ$œ )åŠ#]¢ÝN/\e–ÐK’L~ÀÔê~÷•w~ »`´uTèW£ «öÜ à¢ã²wÁe¸è¹îTÃøÝ¹D‘ ÓÕˆóÂ5Fe´Z/r)½GÅJ²úÇL+ì@ɬ+¶ÂžWéþë¢ê(5R¸°Sâ\q6–¤¤xÎú·–y‚&&&ÅtþC&ÅH¶„é»è6)JB4·´:!÷³Ð]Û™‹`”t±‚¡-ñ¢Ü+Òr2ž<Šp°l™œF+.š÷G0Зj ŲT¤¨ZÏÝÊ£½Ë‚×+¶Ù ÄIž„Ÿ6TyzZ½‰ £$Ð|!TrÙ!T¶¤JÓ*ÅÇÛÈu^× é½DΟéKmWü/¡9£‰€‰€‰À¹ôÿƒ9cÂù³ôd+ºHèª[®fµ]¤\RºxÁõºoS¯ôfkÃÕn€t„˜Uª<7µÊ¼×=0àîOà‚ÑfôQ&iÖQ­ç.N´·y$½öb!{lÈIg‡*‰4^DÓc2—Ô¯û¹ •=©rXcH¶Bô«¢´Š%vÊ'iÕìp…iÞ`£sçMež©‰€‰€‰@IE@0{¨­è"¡ ©¹O·ÈQ—™<Ù-­5|Ó£’.Y6T–Z{,9C;é š:ªµßØ{í;mǵ¤ˆiRõ‹vv^úNíK÷è7¦ûŠ“Ì W‘Ñl%Q.*Åx –Q ¡r˜ *°B:µŠµ¬ (µŠ«&ÉÕ¬`.Ìm«–Ô‹gÎk"`"`"pÎEÀd U˜©%[”âÈdËeXº¥xB[©ÐEºÄšG+ñ’ê¥ Øy·§5šÊʛʛ‰‹ÑŒZ‹ê]º;Ta\$ÿKþùs›®vÜ’îKwŸ”Zg‚ ÒõDŠF©*Åy »Ù ÝÆÉ6Ñ%@y¹×J×*äÌ‚k®0˜}«Ç—}νÌ600(áxü‘^ìÛŸe9V²K·äð–ÞâJ,]rI17[âùJ¿HNV…*ÝÊ™NG.?f$wÈÛãŽFFηL•DY¹S©˜B¥99ñg1z¬&º‚(k€¶–—«™¬ëS<á~ÕÌéMLLÎÕøÂmCyøÆgÉ/ÍQKI0|P$º:VSÀüûÝò½•û·hnI¯Š¥Y¯a°ÔšcBÙCÙSCÙÓ sàöSC•‡¥7^­×úl?‡Jqûv‘Q9-…V1 >1&ˆy " NDåU"µ¢$/Þ/%Åw®¾Ìó600(•x C9S¨4­[ªN(†·¤tÉù_a¿$½—tó@îB+Öe)õM/]ÀXêS°&­>&mG3§âÈ—Zkœp£à)”Ð'VñSF\UJóÆuKª\µJ«jZ…ŒÐŸÖµT^+ó &&&ç|@ sÆR-Žõ“ìù–èo¹´¸˜Ï“ô^²;j¾·‚0t0FmX†¿/æ ¦OJêÈ–Vožå“ËOE$Ï¢X"åÈ¥*¥Uÿ¤ÕºrÊ`^j´KïWéZ™Ïæ µ<çßA&&&&¥7;˜9\´‘¢uK” ùà›ÒÖºñ7§pšÞŠÄKV­Í#–†1vCáj£‘1´‰±ñ¡ü¡Vöf'Û†%Q|ì×Ö£â¥?i<(ü2¬Id«¨8@§VMG%Ó¨SН’y(O8~m(gšÔ-ªÚ¸ ®[¬ThO¹l.a°ëª^jíˆ= “ëY Ë;jÏ ¦ß>‚i#ÃÕn%GÚ¹%Lr-Ï\~f]¢T.ÅÖVi=*{F%,3øD³, P°ŒKD^EœH0s´ÇWѼwLLLLÎT|H_bœº%9xŽfØè nQ¨e]vÇ[ËPZ¶ëkGDÞ£dÆÒ›ÅÁœÁ±úL’Zk¶•´¹Š“žHÉU#N•ŠÊ¨,ï ’d9\%™uRnhAŒŒiÌžÌêñfœ©É<®‰€‰€‰€‰€ˆ€/|A0‹a{Ð-‚ÎÑßÒ[\ …T¡ÚÝ¥×m”_»µsDO”˜©ÚûK¨Ò­þ࿌ß?:˜{cZkÖ…KèBÈ0?["¥|Üm*Å{TÒ£êÊ;ƒûV0`i§í¡Uœcœê\•â š·‹‰€‰€‰€‰@™ˆ€7Ø<˜5YèI—œ”bH¡Îг.«`¨Ú]v³vé×ηsi‡Í£]÷kO­>-¹.\y´ÃÇ]S&I¢ ]®‰²r—V¹ÂÉP”þt¡r$U\«hVŒ´ ÑÀáO½$%Å[&^$s&&&&<^`ÆxbÍ)ßrO¹bH—-ñ²r/U<ÔŽðý Ò],ТíVòP¦ÿGñwíŽbψZ5¬ÜnîªAŪ¤ÃºÌ¨XR%:UVÏia÷¾`óö0000(‹ðxóé·3&sÝrO¹¤Á’0÷Sö€š¿m´M»,ÊÙŽX{CÄ-µIËí/Ö’‡8i¶ÜÓÓ"J¥,¡RþOQB% €ô¬ùˆXƯ¿qY|‘Ì5™˜˜˜ðx<´I´¸né)—£ZhÙrs[ÙîReCiнjD-a‰™h5©­WŽ¿Ð‚µ¬Äú‹Ò'»§»è½‰•êQém*«S¥’*ñÄ#c¼¾êæ-a"`"`"`"Pæ#à úÃWŠ©Þ˜Òeïuiζ®îì6Sv¶gÄý°o‰y3]œôrŸd(¤—.')”Jñ•›PQR5™?å@Ú07·Ì¿HæMLLLD¼¾`Ï`d"Ü“Â.]ZÁI—NjØ­Ù­Í QKF,Qí»Šóm;‰µ|DÛ<ÂìÞ5‰ÈŸlP‰º±VF¥ U02 OÖ¾6Å“fÞ&&&&å,^Û@ÚXQ$’.ihËáx¥^‚’·XymoˆØ*b×3Y]Të¯Üþb)“¥O,‹rJ”Ê¥”J©«yr%fBÅì6&ø‚—§¤øËÙ‹d.×DÀDÀDÀD€GÀë+¤ÞHSº´v—„5tÓ5L[,ÂF¼p—ðÐîb-(a¾¨õÙ$JæRR¥x:e É0ª@*Žñ¾Ìm=æu7000(Çðx«B·’tKH—J¼¤‰-¥^5” ¼¶U„ò09ªl)Ú•ã/ú-y#ʪò‰9_®—ΊŸ®R”Q9…ŠùBõúZ–ãWÈ\º‰€‰€‰€‰€Š€Ç“ã „ÆÑÆÁÕ º¥Õ Q^S.ìÑF&ˆy-ãƒ_InÉ7Ö”ILMYûJÔãÚ‹~ŽtJº²§åõÖ3¯µ‰€‰€‰€‰ÀÙ4Ÿÿ*aú§K—M½b˜7yX¡–c9n¬‹“Ò'Ù—’eýHb)â*…ƒóx*M/’y.&&&&<~Ÿï2à6 ޱô½ï¢^*ýÒŒã1Va9ä'úÿºîÐbЄ:DSJô¥¨5eÏ¥”JÑõãðù®óx2ÍKk"`"`"`"p¶FÀãõvaNµcüõŠ%`º†‰Z¢… jª£+ëßµZü<œ›`úä"QN•¢kfïóöOI ­/’y^&&&&"^O ¿o”ß7š®^$`J½Xú¥g`¢ûÅ`üàc;”ö¸þÅ~ck“뫉BÓ'QîÈ\J©”¸`ßhŸ·WJŠÏ¼œ&&&&çD<žº~ߥQê%LÖu Ój‰–Ò(¦ƒ“Úḻ8éú¡’" 岪^¯1·='Þ¢æIš˜˜X³à÷ –ÛQ˜VEäÙ˜&f²+f_稭vä7 CÝWþE'7}²_ÞH¯§‰y MLLLÎÅxR2}¾kˆVT–c«%ê’–üß]Ï™à?÷xjž‹/’yÎ&&&&2!P E­¢¨Ž³Ä—ôãñx*˜—ÌDÀDÀDÀDÀDÀ–!iñ(²êñŽ>ïà””tó"™˜˜˜˜ˆ€h(ƒ¢åóÂÜ6h^$[À5ø}#ËŽny½Ýáåk^$—€nðû†—ÑòzÚ˜WÈDÀDÀDÀDÀD ^À8ø}CΨhôx˜ÉDÀDÀDÀDÀD ™¤ƒw8C¢sÛªÉ\¢¹‰€‰€‰€‰€‰@ÔC)‹–Ïwƒ'%Ǽ&&&&&…€ìC©‰–Ï;0%%µ°—hno"`"`"`"`" "¢DËçíe(&è&&&&&§p%J½cJJŠç´.ÑÜÙDÀDÀDÀDÀD€G4„ß7¬’­QX}b‚l"`"`"`"`"Pœ2¢XEk„ÇS§8/ÑœËDÀDÀDÀDÀD@F |D1‰ÖP¬;150000(¹øAIœ¦haÅ ”Ü%š3›˜˜˜˜ðxÀJY´°Ü$%%dBi"`"`"`"`"PJðzšû}£ «[Xk’’â+¥K4c"`"`"`"`" R-O¿oDò¢……&&t&&&&&g& 'ü¾¡IˆÖH¬293—hÕDÀDÀDÀDÀD@dZ)™ )âŠÖp,11á20000( §ˆ!ZC°¾¤,\¢¹¨ ‡haeIJJº ‰€‰€‰€‰€‰@™‹Ø %Z>o_¬,)s—h.ÈDÀDÀDÀDÀD€G„ls½Þnø«‰‰‰€‰€‰€‰€‰@™Ž€ÙÊX¦_sq&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&çLþ?€)>æ%Ô\IEND®B`‚fifengine-0.4.2/doc/logo/FIFE_small_d3.png000066400000000000000000001166301341615052600201630ustar00rootroot00000000000000‰PNG  IHDR;5d  sRGB®ÎégAMA± üa pHYsÃÃÇo¨dtEXtSoftwarePaint.NET v3.5.100ôr¡IDATx^í½tTW–.¬XU*åPÊ e$"ƒM4`0Á68‘s0&cc&'lc0ØÆÆ9çØv»£Cçìéiw÷ÌtO·ç½õÖ[ïÍZoÖüÿwξ÷ÜsC $±µÎò’QÕ­[ûVï~{ûÛqqüÃàp8ŽG€#Ààp8ŽG€#Ààp8ŽG€#Ààp8ŽG€#Ààp8ŽG€#Ààp8ŽG€#Ààp8ŽG€#Ààp8ŽG€#Ààp8ŽG€#Ààp8ŽG€#Ààp8ŽG€#Ààp8ŽG€#Ààp80ÉñéIñú âÿ  ðø¥8ŽG€#>iIñÍYI3K|KªUi‰úSãñ7”û‡ä&åùºøcÄàp8#@£~™‰ÓK}ËjjUÛ+˜¯ÿõºr[NR–ÏÆÃ.ƹókr8ŽÀ%B|CfÒÔÿ²Ú”åÚZQ›‚U“nãX@,ü£þ0ú}V¹@v²ˆ—@Àø-r8ŽÀ…@rB\mzâä€jE]ÊJkWÖWÖˉXIñÆŸð±Œ'â´®.ó·d%¥Ú«_öñ«q8Ž@¯ˆ@b|\Ÿ´Ä‰Eþ¥uÁUõÚj®j®v­Ú ;ÇJŠ×ƒ§Ë<”³eþ¾™I¼ÿp8ŽG ö$ÄÇ•§&Ž/ò-­K±!ScðæÆT÷ZÓ7•VmF’þ*Á¤xü£çSð«-ÌHV\QœZê¯ÏLòá ø‡#Ààp8á"”( &Ž)ô-®M7Ò‘Fa’úå–~©ÚJ»¥ŸXu™NÄ¢WtG‡4…aË냓KüÈ1&±À?¯ŽG€# G 0%aToam ¡”Ž+&ØàYÛä±Ö5¥‰Õ,V]–±Œ¿z=Ñ3gú+*¤€-« ^QìGf’Ib9ŽÀ%¼@Âðüäù5‚NÙÉ“Ÿh­oN7VKúzûª·#$ŽÐõ£Òt T„LØÒú”qE¾²T®t]ÒŸX~óŽÀ%l_ÂoNuŠ¥r(Τ#Ó†–tcõOßÐ?}£{µfÔg'ëÑb9†'Ë<ši:Œ™¦2Štž]‹ë‚—úŠƒœ.¼ä>·ü†9K(éÉñs“¯ïc•L÷YüÆâO’6)p² §5cckÆ&} ÈØd®Í2°ˆ•T±=WM,‰| ÆœfC/‹ºÖGæûòÙêúó[åpz{ ØëŸ“<«Ò¨ˆK "¥PJ1'2&‰50cËÀLÏåF,÷ÃðtëP ÏäË) &QSœ˜I¿Ðê9CÅ¡¡ävêíŸd~Ž@¯z›úÂî¯"p³L©éŒJ§SÜ(œnmËt¬ÛÚ2od­Æ{V09Þø+æz.¥ã™‚1ÁÉ€ýr —F¼ô„á }ƒr“3Ùª×~¨ùq8½+èdB?ÓUeU FM¥þ¼Jq)¥Š(pÒ`)ë¶AY[±;×탳°úæølu¬äü£ûÁ8Ž#—@;éÕóD/‹xIè"±†‚.( gW@+aÑÛ»®-¿ŽG€#Ð+"€Í¹Z¸(ùWZ@e”©ôԟŨ¨Â ” Q6p˜4Ķî’m¬¡ÙwÈÕ7׉Xôïê‘¶#H³ðÌÄ0`žèE¥/"^ º(a¨²…¤Ñ@K(fSVL{{ÅEæ7ÁàpzrÐ¥T‘–8¡Ø‡¾%¥Pá Ü U$£ ÔŸTf9ŠBÒ ¢t|xcbÒ¶¡ÙÆ–½M®íÚêgG¬´äú+=R,õtó€f’if003—h —„X"^6è¢Z—r)ÜZÙ¼ªÔß™ÈV=ùÃÎçÎàôÌ€2”ts ʉé @ÒS«b*  ¥D)p²`ixÎöá9;ÜkDÎŽ9ýòl ˆ…t?GK3‰dŠ9ŒÐ‹Õ]TîÒ(´ž*T¸#¨åuÁ+K|°Ò€±/ÿp8Ž@×F@˜Sä'/¨6ìþ4^eèÔ…öO#U$a Qíõ‚NIFEå(J9!JG¦9wÚ×Α9;Gæê«)ϯ¿ÿ4_‚ýÎ#èxfÃ0z™Ü˺l”Ëž*T%. ·¤Íü’Ú” E¾ÊÔDÎvíç•Îà\‚ÀßayÉsªØmáK¦¼Ja•–ýS@E©?'PIl@EÉ=Q89iר\÷Ú}Y.VsȉXžÆ?êH¦!2ô23‡T÷r@)5 …¡¤\z‰KÇ-².D 1ýãNV§Œ)H. &° Ô%øµâ·Ìàtf0®C{¯¯ È‘TV\éõ*‹Wya•Q£2%ýˆNQjÎHÜ™(¥C”‚Â$¹ò°ö`]î\nÄr>F>W.q(φ)ÓÑ‹j`$â œ¡]öl¡A¹"ã–œ{"f`L—29¯T(¹(…‘«3?À|,ŽG ÷Gæ­ÙI×–û—׈ýT Bµ’èVQÉÊ–´'•žÂ Ur—·•I§!J¹ ÊN{/ÏÛ;ÚZûFçÉ¢Õ’ïäXæŸÄì'â :Ú¹0Ì^”<$âå„.;åRU®¸eéà‰l‰)'rPrMʲêÀMþa¹I!îGîýß3~‡ŽÀyD3æûe&N/ñ-­,« `uP+= H^†Ð«¬2•"U:£2J$èì(eA”Â'–Æ„ö íw¬±¡ýcCär Vº/ÿˆ¿Š¥= ËÀ9Ɇ™Fge¢—QsC—E¹L†nÉú–¦'4Œ µ$¡A¶yÄIU`v™¯-;)‡û‘Ïã#ÍOåpz[`Œ×ž8¥(yq•ßÀ*I­\µ’sUnC(몭JSUذÊQ£r%úT–PJA”BÂ$cË?0.ÿ kõ/è—ˆåx ž%–yÉL “f¢åÝÐec]Z¶ÐLÚT…ß2qË!&4*[&ÙR µ¸QÿÕ%¾þ™‰ÜÜÛ¾yü~8˜#àKˆ«IM¸"?iA…;#nêíÔ*ÅSa¡Ò€Ñ±JÓSˆ‚–ú#0€Jbƒ…Rò§ñù‡\ëð„|¹ ±Šãâªãâãâ€Xô'÷SŽ·Ï†aò<ÐK+}ë"è5j]2[hU¹ŒT¡·d —Ñz,û·TÓ1 D¦9ÈFe Bƒl‰«³¨Ò¿°Â7­0¹_z<‰ù3Îäpzxp§^LJš[î[XéÃVèWΪ•Y²r¥‰WI Æ«”¤BVª¤Ê ¨¬\ŸB)ƒiàD˜Dë.¬+œëÐØüqÉWÅÅÝ(×µqqCã÷]–g{¤yóP˜) SFôN¢—F¼œ¬KâºT•Kª3ßÒò„JOHý[”$4Í2Ì$¡Zµ ´ ´”ûæ—%OÎOªOKH&óG€#Àè}€­4?*'ñÆÒäùå¾€+‘qZB™Àê€YÄB­”º!XW"À0X¥H¥þLFeåèÌŸâC>™àt䊂#Õ*<:ÑXû/ ­«ÎMŠ'¬Ò×Mñq« »çЃˆeÁB2 Æ ³ÐKž›'t©„¡ƒrEÁ-e™A>On²eÊIŽaËJ¦%AË7¯4yNiòø¼Äê`è2ÿp8˜Súã‡e%\W”4·4y^Y2ö;ìz&µ2 W¨ZIM W$^W úÂì¶5W™"@ÕP¥´&V2tY ò*“K9(”‰.™&YëØ¤B±&2äw•û_–¤'ÝÞ” ÌíC0&1ÌÄEý"¶GÄË€®Ñ!«Öe§\*UH¸¥ò„ÔÂ¥\3¨y‹’„Šlé¶„TÙÒ5„HÛL«RÜpà¶W×tNIÒ EI£s*Râ¹ÔÕ㿱ü8—fB¾øA ×$ÝTœ„MÍ ®ì…«p™@Ói‰¬+œi@`Õ³ÿ×Ì’N]¯T)RE;¾Å¨@%1ƒPJ‡('¬ãb¿²½½_æ¢Ô$£ò\êaó| «ÓÉÇ‘ÇKa˜"avô"Úg@—ɺ¨Ö袖/] aËJ]†ÐÚ‹[–?¡“lyeµ²˜1Ò¹ÐÂU¾±(qVA∬øR<[i\šßz~×줸þiñÓC‰7&ÞXdÁŠvvåWA§~lM“uC ß = h¶«z•«„êOÕØíû„ª"Eé>…RD |º›Ö”¢Ãcó7V¥Î÷'ÎIˆŸ“(Ö\ZI—| =OÄïkJRöϥÊ—PæB/JñRÐeP.ɺ·H^·Œâ–Ùtl-Ó Þ)ÇPî²ËX×b ©ë Z×&^Wpu(aHz|¡/Žó…=ì ̧˸"‘×/?9'av~Âõ탫ș@E­L¸’ - ¨é¼Ê†Uv X”r•A¤luÏ”"±¦ïž·¦8enrü¼¤øyÉ Xó}Úò',0ךBÿÖº4õ¿óý¶GÒsç% „[‘ãÛ1 ûîÉ…x À¡`6îEÕ/ º$å’¬Ëè÷òÂ-Uߢ.£õØeµ®˜Å%+[žB¥!T]ÆÐB‚WOÓ"ÐÂ'aV^´œø©ñ¡¤8žwr)ìü9Ý:© qõ)q²â¯Í‹Ÿj\Ag{ö°…+¯L °”ÔÊh6=eÉÊèXmURX«hß·1*3ݧˆ¡Ô½S‹±îž\´£5ky¶Oà“‚¥@âB¬k- &bÝÙ’ùþÖº¿¾>üïoøìHÓ±1yKÒ’èOÖƒ‰ ÄG`†ÇÜÖqtB!^Ž^šÐ‹¸—ž6TÐå¤\*Uèâ[· ¼(n™IBÜГlAŽ!—å%á»'h‘êÝ´òf‡Zñ׿Æ_?93®%—“Ô­?Ï|rŽ@/Œ@ Z©qc2âffÇ]“#¶$‚«ëbcWž²@›ë’G&ЃZéò dÃ, ½X%³2¨H•̼©º¥ût”:qU1ÖÑ ·Ö§N0„O„=‹R‹•´8- ÅZž™|bbÁïnùÛ#ëwµ½±lMA€‰§ˆ'¦&á :’‰—HIÜP™zð²!%X]Xè²S.gªP¯o™º êß‚ÞF¶Ü•-š]bÓZe­A Ù`ä„Aµ¯“ …»™kh‰O ̸֤~)q™¬Œï…¿%Ž@wŠ€?>®ÊwYº±õ`÷Á½³€«<®•ÔÂ]» §b×áJµ+ 4ÑLá è¢V«ˆZéõ*3ha•ÐSH 2°ÊHý¹ XupTh}E*#ü—ð‰ ’¿¥XXÉË2’×—¦<9¿ü÷gýÛkÃ#¬?½0ôõõ5wôÍX–™Œ'Ч§‹Ci0fØj¨áå´p&zÙX—ÀZR*…¡­ÄešB)]¨§r{¢¦c7Ù²2„B›îz·ú‹u¦´º&dÄ5¤Ä¥3tu§ï8Ÿ G ÇG s~ýq#ÒâfÈF-Ü5K¸ŠÇ}4ê¨^ †A®È$àJiL )$“u;µ2±j´MhãU¦¤X%Ä~¦†BåýˆQÝ7­øÄÔâ]m9«óJ)ˆ"|Êky–X+²“wöÏz{sÝŸ_ö¯¯ }}w¿ccB+sŒãÐ1|†™$ '°<;ùަÌã éôœ¬KËŠT¡©Î°ø‰2¨ûXe8È–%#”ÚwQÖ±¬¥©Þ# 1tÐw0-ýƒ4.#®.d‘Fß*ø p.^Ð[Sê‹–7ÝT´×®êÁ6$àJª-"ÃÚ„Ã%É'Ð ®Âe …¨•£dejÅ*#(±ŠdÄ`¨î›Vr÷¤"¨Õ—e%\J²(‰QÙ€(T+s|«BþWär¨é//ëðúŃ»®t]IÊÊ\qXø $³¡WzÒæê´ÃcònQ­Ë(t…Ç-è2T —Ù²W¶ Ç“!ttk -FTÐ*Mž[’,UFzP¨0LÐÒ±Êñûèô¸j|&ù‡#ÀàÄlEÉqƒSã¦eÙ•ƒ]\a"¸"-»ê»B‚HkBvO¸ ±Àe c@‚+'µšu%X÷Ä*MLabUÉÉi%‡GçoªJ¥ìœL÷ÙP PY•'Ö¦ÊàsÊ~ujàŸŸÚ)ëŸÎ ~õæêíý2Våùq|¼^N˜^"(3‡¨~ÝR’²ghJœ”K 4”:ÚRxj=&¿]o²å‘!Ô4„fYËSõîN}Zäˆá Z¹ñ(|F-ü T~Tz\¥?Ž]ãcúÆòƒ8—` >.HŽkK»*ÐR[è­WHa“Ržº¿­ÛÉƨd…ŸÅmm–„Ý®ŒQ FÕÊ# ¨´¦Ä 2X"€“‹¶5g"'H•PJ?n)ôß3!ÿ[{úþóÓC.Àúñ=ýÏÌ*ÙPЕº_“·Ô¥ß5¶À·džPè2L=!á–Ù’2B]ûN®N@ É[›Ý»Wzôîd˜KNV“–—t02ߢ¿"/=4-®ÄÇV¼‹q.ÑÀœ¢9‡.™X¶ ]m‚%ÔBËž “†ÚBÀŒ-„Å­O•åèè»ò„+ËÓÖCgaÏšâu‚+C¶®äÒH‰êU¬B55¡%É6Re2*TP¢oî“zöú²ŸžhýÓC.ðúÍ™¶—WmoÊXStݬAÈŸQî2³…kKSö˃`Äfèõ-CLXhúe>OdN(*[n9†™!$K'ò!t0-7h9$ïºË»2h)½{dFäO#2ÕƒRã “ÙJãݵøm_r@Lß”¸‰íªXÔ––="\AÈnÌ¸ÒØ• ®”„Ý^¸"‘…å è¨ZIj¥°Ji+„ðª’=Cro)ˆö)IP(ûgÖ¨ F º¥0€à—WUÿætÛ—¾ˆë‹³ƒßßÚpä²<ä- º,ÖEJ ÊÊ*×Ê<ŸJ*]†UÜr“-SFHž„dìdhUY‹´^ å®ié eæÚ;‹=TÑ ZÐkjVÜ€`\~2[i\r;¿áK%ȨŒ—=¿^¢Y8¼ÚB· Ôg3ÚM˜4©¹Ìð„+’°“C © ´eUG0™ 5 –¤t™Lfa'¬‚öOb•”üåù@ªÀ`€àÙ±±¡·5üþÑA¿¬­O7ŸšY¼±"4¦Ú(—·–d$m©Eª0ßjá2-3dç–A¶ÈÞ‰d„о› e4lÙºµb-ÃÞƒ0Ì­8AË.4 Z ±´"|b¯Ìê.>k×®=ÔÓ~ŠŠŠ¢n&Lˆú¶&Ožù8mmmQÒÝ0{öì¨Áé­=ê¿@hoЫûÊiÅä©¶@§L˜hì=ÄÐæÌûvÁ•©³ð*\Y™@;µRi@#( &4^eÃ*AªŠ›úÏ\[òù]-¿{dP·]??9àÙE•ÛÓ-Êe 4t¾`F#×ÚÒàÞa¹²e¯l92„¢IÀ¦ÅhÓÒlœê‚(X´p¿B e¸åÒÁN(hyBW7éAþéOúÿõ´ŸÖÖÖ¨[Ï®]»¢¾-€Mäã,\¸0êAºÛΞ=58½õ¢G}ãèP^uŒ`Ùº¯lå+©¶(³'Ô4a£SXÂî¾\¡|eô]…gWfƒ°®P¸rh• ÐN­°Mï’³¦(¯ U(må ^E¤ª(°£)ãù¥}~vrr€=býúá¶·6Ö‘«§ IO¸…„'àYX@¡9G¤ O’.…D¶L› ªlr ½¬eZcL æ¹0! ô´>-´êƒ(XêïB:èRa¸ ZûLÒ³ mí&»½uóbÄŠ°;÷Ö‹~)êË4¦t±ÜÝWN+&Mma¶^9á õ½MØ WÆ8+iˆqõЯ#HJaqL¬BiÇðU’ÍU$X×s€„UwÊ{wsݯØC×wv÷}`jÑú²£ÄE|K6rQ²°ßMS€íÍ5b:Ž©²åÌšƒ"u-†Í#Ђ[®gg±§ ÃVÐÊ;ßÜ <úÉOoݼ±±.ÚW¬8¹#ˆe˜Ú­ÙÝC=ÄrÞ•%ìpµ0„ì¦[ '\‘Ω ´gÎߨ'»3ÜÐåmOæõ*ä!hZñw÷ôûå{ÁúáÑþçæ”c¬‰…[ÒAƒD‚lÉ$!°áLzbá#Yp»@Ë¡´w_‰òªëÔ,,ÊW.µ…Þz¥[Ü®¦]͸2††˜*vv5®¯…·5f ë…I¾Ø…±kU+©DÉŠ¨UÿМ××ÔüôÞ?;ÑË×7no¸wBD†k†N¶R“ˆƒÚ1Fr¾OŒ59pyˆÜßeY+&Ðr4s åh½³XHëRZÊ*W´T‡Vgå»ÏÔF,F,F¬Î¿}©Í ‰ ]¦;»MèÌšÝWžå+Ã6P¶^iŽìš “áÅn“Zx%Efÿeyëʃª›0x^ì¼ z&PT­L…ÅÚâÀ} ?ÚÖø“{Z/©õýýMÌ*E4p‹ÈµméB„nNBüñq«`@58Ç-¡Å ÂLË-á=h¸¼ËyZf“–TaH/ ]…¡ ZÆDÍrð|rƒðÂè&² |Q±±±:±šb_xé…@9B>Ðð¶ÐÊWº8P½·<¥¿­Õw%…ìžpµ£-{ežÿƸ8,ì¶&\™™@i¶$­r}[ªÓ›]úý}M?:Öÿ’]?¸«å¹Å•w6gB‘A•-!#”e-¤O1ø©Ô9‰ñO€Ùm}3È=Ä ZŽæbÍÆÉf‡¡¤ƒ-§Ø=lnÓ¨wQú0S´ûü0b1b1buþ÷DbÜ”àB¹³Ûô^ù@Õ,ì¡¶°w +ÏÀÈpuhlþ­ H&ÑÞJp5O²+*\Iýº‘ ÜÕšõÂҪϷüðH^·7ÔÁ8cužß’cH !•µZ7ÅÅÿ®¯LÝ;*Ï-rr²KÞmÞƒš‡“Ra¨‚–ÞV,;´üárƒÊ$WU˧~˜Ýçç¹çžhõ¬Ÿúúú¨\³fÍo£ýlܸ1òq¦OŸÞ³"ƒ³Ý³gOÔàôÖ‹õ_¸ Ý2–½€–éè&bØ[8òŽfaø²Û'4ZãíŽìªv…d”Rî‘· À$ƒXp…,\¡Ž¸‚JVÇ.½³±XÅË3ïèûàÔ¢uÅCCHe-h!È0¤ ··e‹ô i?èh.6@Ëîá$Tö‚ÖêÆˆ¹AkI"fâ®(–ZŽnÿ…ûâð+q8!ÈûÇ4OÄnÈd . wv5ûJéE>ÐÝ,l(Œ1¨‚ ­„-Oײ«÷WÛd­@м÷·Ø•ÐYÄ[:‹ô$LD<5­ø[;ú}v°…WÔ|oó¹›*n«Me- ´D]ÐíÅéI[3ö /GÁ´tÐòÔ» †½ åìÐ “< Üœù‡#Àèå@Óedše,Á…éÎîÔz祷…³|å€+š# ƒ»Ëó6×§ë @…U"hƒ«¤ÛëÓŸœSñ½½MŸìoæÕÞ¼²J¨áѰ%ºµ$Óò-„Z[Ü5§¸À”`Ä@³ªYvÑû÷*~‡81¿­—ž Ž`‘A{TÁj4ܘ 9»­YøŽ¶¬›KSbÙU;úe>»°òãí}y]°¼±¦öà°\ä ÃÝC¨GªpyÈ¿¥9Ã*hyç­žbLŸ eI0ÍBe4 mé$ÁJ÷ØÌsYvÁ»Gà‰Z/=Ë"Xº… "X†A»eÈD‚ ew+ú…Ãä7÷K_–ëskÒÜ;㢔ÄÃÃóÞ\SûÍ;úòº(xsÃÉI…hˆŠ[xÀ"ˆ6kRA³ÔÀb‡nÐá7hY7UŠY$ÂCWºÇL³’ºÝÅ%²kðÛä\¬ õÒX‘V¹“` ÁE5­‘†;»©Ä†lmuêÂÔÄXö¾›Cþ&½·©áÃÛyu‡<>»lKUZ,×n®/aUI`K«˜(M¹A£§Ø4ÉuH0¬‘¢YXvq±ö~]ŽÀ…Z/݈Õ‚e2ÉáÂ-ÁÛVÿŒ•Źɶ`ϽÄkkmú¹ë+¾±¥‘W7ŒÀKK«÷̆ÏHTè‚ßãÒ\ßúÆ4€õ{H0,[wCéÞš5¸ûÉ.àWìîóã÷wN¡¯°°0ê›***м‰åääD=È…|@iii§ìº½õ¢wJp:ó h½t –»‹$‚¢‚åI°\ŠvA°Èîv@æ’œäX€ ü‰ûå¼¼¬úýM ¼ºyÞº¥îî1ùp{ŠŠ[xÀ´Äuiª=Ë.Á0æ[4K(ÝÕ,K4虾® tæ×¡SŽÕÝ|:å}õʉŽ=ôP§§·^ôN Ng­—hÀÔ÷}ªˆ‡DPU°¤¢%tQÁRË%¸À½vä} m@÷Ž+@±êÝ õ¼zPÞY_zFÉÆò`TÜZ[Ÿ*rƒ–u“1§Ø®t÷ Y±ôf…’;óëÐ)Çê­›#V„Go½èòè䃠S!–î"ˆFNl1,‡¢æ‰ k~JØÂÕºâ”G¯.}g]=¯gæVnoÌŒ€[›Z„ãI¬4Ë£š‰fùºŸì¢·n^ŒXŒXŒ=;05Ä&°°™\D”¢3TJ…àB)Ú•!ÓâLËmݱ©¡r׈¼7VÕ¾µ¦ŽWÏÀƒWÆ8bÝ”‡ƒ%Á0\0b¡YÂ`Å¢Yy nC÷I™ûÈwí³±"ÄwáÂ…Ýjg»öËÐGG&!–5 žL’`¡3†Æ6º{°tO&"X4KÍ&ƒvtêDÎÁDü¡+‹ß\]Ç«ÇEàÉë+Ö—DÉ Îó'@}Њ™f9-0l†îö¹YCÓºâ q¾ÇdÄbĺè¨ÜYÅËóý2tÅóÑ€© NnÁ*\‰” m$“ 8 HŽÆÏÈ,"Xäp±º4%jØP¾s:’’’¢¾-<&2b%&&F=È…|@ÔŽ‘Ã÷Ö‹ãÛ¿ÐËOŽ#Í&é¡fVs¡æ`5IÔîA° ¹ ‚54{‡œÙˆ™ú.›LÊøÖö~°v}eEõmÕ­N¬¤xÜ¿ã.~qZÒÒŒäÙÉ«ò|k ‡‡å=sSŸççUñºÐ˜[ub\áú²\ î!–¤©iÅñt·$á×—´µW×ôÌÕ%ĺ­†1ïqI³Ô„bå4Ø`Ò,cn–£›XssÏO ý«1åBMøõ8n´aª6,»¨=’æÂµ›6írʰœ*24 ˆµsd.,½õ]ìÖê´ïììš…[ònï ›×³³ÊW‡ü’`%.JMĽ<€à…\SX[ØRzß„ÂgçôáuÁ"pzZÉöÆŒu%)¸iXï_™ëÃEYšš•$rƒ¾„%©Ib´¦t+þæí}q5¿½£ß=ãòˆµ}¨H;h–î4H4 IfCQ#ƒ¨fA›jLzÔôb6qž1›¸¸[Ê.ºÅ÷™O‚#Ðë#peN<,OŸ #%As¡lÚ Q»˜2, K –²1ZÀ!LÎU4 ·ç߸µñýõ'Æ,—wñ¸—_‘íÃ}ýÍþ[ŠëJS6”7õIÝÕ’yæªÒgnèëK#ðø5å‡än®JÝX\_š‚;†5~\5ƒfÉÜྶœ7V×~°¹áÃ[?Ú*fÁ€`ášÂR¿Ö°?Þ1"÷.D³hBñæ–¡;8:î{¬ñÄšYÄ’C³ vKÙE¯ß(ø rºEFdÄ Ÿ wJÐn$èÐ\ès°¼VήQ¹7—ØZ²À¥¾·§é;´0Ÿ·ç¸I‡O9îÖ__Us`pò¸£«0°¶$Y©M•AЬÛjÓnoHÇĬ³W—?u]%¯NÀ¹Y÷Œ)ÀâÛêÒðM}‚¸WÍÂ}ÃÍù~LÉÂ¥¹£!ã¹}ÞÛЀJ$n5>”ù@\G¬ïìlBAKG¬…iI¸kÕv {Ôçf‘7®KáL êú Ö´œÎ©Ít‹ïŸG€#ÐÞ4bEH ’æî¥æäF›æÂµ»ÖîËr×»Z² üîî&+7¸µ/nÕqÃþÞÆ†w××?;¯4D°p;ýÍ}Ro­IÛZ—vGcúö¦Œý³NŒ/|âÚ ì°¼:+N.ÞÛ–½£)c[ßô­õé·Ö¦4«ŒhVWáé »^Ü^|°EŒ.Ã¥D>9^\M\Ó5ù±0º$ˆeÐ,¡¿4KÍÍ’ÝÄZb0(³Tb°2lbð² F¬ö~Åùñ^"_¼wJÐåsVs¡‰ÚIs‚µû²¼[ûf8j¯ß\šå‘ÜÔ€›wì‰oßR÷ÈÌRܰ‹| F°¶õËØÑœ¹³5s÷À,ÌtèÊ’'®©àuž83­ôȨ¼=mY»Z³îlÉÜÞ/w¸?¸UЬT\‚•Á ‘|{m=n)pcÛ ,\‚ug?f\Ó~›Êfuqˆ…ORÄŠf2w/ý…ps-1؜ʈՋv~+öF %!.–” +¬æbˆ©¹, ÖžËó¶ t¶d==·âûûš¿'i²IJ‚ÛvܼcO|gm=œaáWtß…H ‚UŸ~G_"X™»d픽hÎÁá9ÇÇ䣸uvf9¯DàÑée'&‘‹`îœû„wG3hV°ˆü–ªÔ»Fæ½´¸êÍ›ëp› ‘ C°>ÞÖè¸5Y‡êã(X"1‹þÂÖ˜^1J(ëœ!…íý–ðã9n™ùºõ­M%© +¼æ)Á½—çí‘ëØÈNM+þdó÷÷6!ä`¨ÜàÛ·Ôc—„³;,ìŽ^Š{0ð°}ƒ³ Ë942÷®ËòŽŽ œXøÈUeN+ç{<>6täò¼Ã#sýû†dïiËÞ5@Ò¬&A³ö Ê~ê†JÜ7À¢7ž‹ Ë XoÞRë¸Ð›ÓX"1èÖ_؃–þÂlÌ2ÇÛu£GÅrÑ£¾ñ ü€–––nÁœJY ^Œ!/Á0fíÆðFLÃjIÎL®” ®¹@Jpߘб¡e9¶–,Èÿ>?ÜòéAƒfyH0 4%”Äî ÐzyIõóó«œR,ò£rÁÀî™bRÁÉ)…\UôÐŒ¢‡¯.>=S€ÖÓxi˜\zfFÉékŠOÍ(~pZÑýS ñÍ"šu⊂gæôy 6ÄK…}>np» çŠv.v6¡‰;O÷7£¦¨#f9â~w-Ír4f…U J+wW+±ò˜Þ­+'ÜžhûvÁfŸ={¶Û×Å}J,½;ø êçÐÚÚzqƒv¾¯ž–ï˜ßèôl z;3 Ê´û\ØR‚Æåß\d=g$ÿ஖ϵ 7hJ0šH‚AíY†¹AI³PG4ky vRì§/.¬~úÆÊû'Š| ÖDƒ`=8½èÔÌâÓ×–<:»ôì ¥^SzjRÉCWð*93½ô±Ê½®ô̵%@ô‡¦=pUáÉ+ O˜4 ¨ÿÄlaáãÝ——Ôèù@äf#+ÚQÁÂýÇîV›Ä&¸_Á] ËÒ_ÈVbcÜð‰Aá1XîÃ6ÜKÉÄ`bŸ”nŒeóbÄŠ°}3b]lëñˆÄ›]¤±4];tt³vÆáp)Á±¡ƒãò×÷±MÉ‚‹àç‡Z@³ÌÜ`D @ËF³j°«bo…ÉÞã³ÊQ!‚Þ‚ñȬ’Ç®/}ü¦²ssËŸœWñÈŒ²Æ•\²ëôÔÒs7!åÈc7”>24«¸.hrƒ“ î›TðèÕ¥ÏÍ­za~nÄœ‹`E\¢÷¸óÀýÇæJÛU^š•Œ„0 ™1&­ÄÒcÐsøHFºuãF¬'–ùXŒXŒX±~¿'ä%‡5« }~£¡k§”`«˜-"Æ ›Ãž)A Ömö–, ÖGÛpWà–’`PnÐá‚A¹AC‚ÜàòZì§ØU±·b‡Å>ûìM}À¥D>pºÈ‚C€Iœ½±ì‰9eOÎ/zaųK*Ÿ^P‰ûþ1Å—ÔzhbÉ“s*ž[RùÌ¢Š§æ—¿¿± X~f–¤Y3@³Š ¯xú†Êçæ£áˆÙ.‚¥+ÚIpáhF>õHÜyàþÞZ6;®ÂÀþ±¡˜ƒ-éëšÓì­ÄjÆ£Sã~}aR·Î Æ6ƒ˜9s¬ K^¥7p¬™‰Ž"–‡®½Ù(b¹§a¹U‚H Ÿ¿}`¶­Â÷úšší/rƒí•` 7¸„hV5öY8Ã>scŸ'¯«|ôš2A°f›k^ùS *žY\ñüÒÊWôyyU”lN(¾ïò¢^¿î[|îúò—VU½¸²ÏóËú<»¸È šÉÒÙ¥Hœž¹ºôÜ슧oèÈw,Ü(E; .-ú¢]ä4 Æ|¨y^’­}x]e*J˜*1¡•ØcÆ£Cãnºâ¢”59ÔÝ…í̱˜c]t4ŠåzbUæ—ù`›9°÷[‡® ˆåôÔ‡÷I];kïÈ<±0¨âéy?:Öÿ‡Gú¹A©to—C€–I³°óÂdô›]¦¸Æ Ëû¼´²ê•›«^[[ýúºš§n¬89ºøÄ¨¢Þº`ºøÚšê×ÖÖ¼²¦8ýŠ>Ï-•4kA…A³®+E6v…1.D°^” ·¨`½›¢Š`;†fmiHbQbÖ'­Ämbby Bȳ.¶RÖ¬nN±â±±bŒ‹þ˜Þ€X™R…‰Ã@¬XŠXR×Nóu³vj&• ëð„€–ÍÒ;1þÔôâo5h–’` =kgû$Øm±ç‚f=}}哳+Ï][íøÜœò§T€[€a‚µºêÕ[\½¹±öí͵on¨Å¶~ÏðÂ^¶ž\úÚÍ5ïl©{kcíëk^»¥8 ´4 ©QÐ,$g—ÃzêúJ UæIpQmS´CpáR´lz´+E;,$xß\[ë˜M¼­5 Wˆ…{(Vb›Ç 1ãQ ‰¥”U›Êˆk’¿sÇZÁñŒå6å¢C”ãzb¡¢=Ëå×nëÄŠE×.  XÄ:2±@Íu¤áÇF‡~rw«f™.Â!WÎ{¤A$– Fx R[Àš[X˜ìÁ¯i1lÓ‚`­Áœã 5ooª}÷Öº÷·Öc[Ûëj $<>´ ¬“£‹^ZVýí ïß^7H¨ „~UÒ,`6hÖ“7V§„Rù@t  (AÑN‚–G;YšŠv$up¸\ù™•påׇJïžÄ‰ÁX4î®Rl—¡q‡ø\ŒwQ`ÿ æb˜[÷þ‰eóâ:×±.:€õÄÂVpeA2ôÄÐha³@OŒ’]Xf‹:±0 ݘ8lÎo$/A²º "Ö]±–d$ͦ†­ fK?½·õÇ´~€Ü §ãkI, ¤¹ šuuÅÙåÍ(Cî‘8˜øÇ{·ÕpGý‡;¾¹³ñ[{úbÖ;ÊZÇôÐu÷°ÂçæõùxgãÇ»?ÚÑðÁ¶à± Y›$ÍZ+hÖs‹úœ½¦yüê pÐ0«ýŠöýBÑŽ¤...âé«K0æqN¢LLëàØüƒã%bw#1èéŠë(e9<‚ñ Ä*ˆ•ØÝ+nÑ¢E[£ýääätoØõ8»Q£FE{[[Gù}577G=ÈÔ©S{\pb¹èQßø~@~~~‹³Ç ÍIÄ--!–%»Û‰¥MvX]È” @¬+ ŽN,\]`´daSÃÖ¶©2õg'üäžV+7x°]¨.hÏòtÁ0%¨Á( ’]Ø‘Á$ŸYþØôòG¯*±xqYÕ› X›%Áº½\ä£;?ÞÝøí½}¿w ßw÷÷{n~ŸcC Ž´å÷¬…·¬Â[øÎ¾~ßÚÝüáöàñ{·Išµ±ö•ÕÕW x§›`¿¢Ú¤v|¼ÿÝãòçûTbpnreƒq×¢kÜ®¸^¥,Ç€GÝ`pZaRoøŽñ{àp:+µi NÙ…4g²z‡¥®Ý’]D+b ÄšT¸¾"ˆûnJ bkÃlÀŸß7à§÷pæÃH0DnÐÛCêí •„-,Löàq7ÖÕ¾·Õ"XßÞÓXõýƒMŸÞÕôùÑæïîë8< ¿G¬'”|㎆Ï5z¤ùû‡šðF€¾‚fÝÙ€„§ Y›ëž™[yfJ)Þ>‚ ,üPÁê,E;ò X¸ˆ˜­…Q#ó’âq‰q¡§'ằ:XÊj®²O¡>â‘9Ý](ØY_C>G€#Sr|ñž² Ç„‘ÈXŽ"ëÖ1% Û65lm‹‚‰?<Úò3€–¤Y?"¥{, ´g™.¯i.¨Ç8%WW<6nîeg¦”ž\ a¸(Éwö ‚õÉá¦ÏŽ4ÿàxËîíÿ“ûúsGã㊵„ºíBðíµu?¹¯õÇ÷öÿáÝ-ÀÚOîjúÞAI³ö4ë•Õg®8}p% 'Ö“³ÄàæNT´›«\a`r¡JY+C~ Öá ±Â–²´J|A]YÖHb{qc÷ögŠé Æâp:1°Å^ ¤í¢ˆ…Ò÷Ê:»®KvqÇo¿v½ˆulRᎢ%‹ŠXØÚ§&}¼£ïÏO Ü` ôimí«ºA)ÁÀîL ì×DЂÍà©+JNO)}muA°`5ƒ©üðž–Ÿèÿ³û[þà€_œøöú:$ 4åu«u¨ƒW~v²õ À©_tO °ˆ šôÍzgS˜â©‰%€g¼e¼q=h)Úç ÇóW´+‚…’äªaJ¢*e­-ˆU`/e¹|Ü#Ž$v‹/òýݾŠÕ‰_E>G€#K¦û"Ë.½Ã˜‰.{‡Žz'±ŽM.Ü7B´dQ [Ûâ´$è¡qÿ@™l·^ b‰tÈu»` tƒPºK håZ°„c샭õ‚` |å§'[þ@ë/O øõé¿}´íW§¾¸¨ú@Sh_ß¼î°@|Oÿß>Ööë3q’@Vœ0P–h›ßÚÕ÷é›*/Lñ6ñfe>° ODÂ+ÚkœŠöuNöŠv0cðc°d”²–¤%7«RÖæºtÈmŒR–gW–Ã`°5C‰/À±…¶ÄB. ñErwW¶ÇòõâÇp8‘yI6ÙEƒ0ÀE¯ ¬t6€cÉ" -\»ìÂìÄ’² XÖN.¼k\ M¦„XØàžYXùË*šekÏ’ Rü-}H±S‚a:äJ ’`PnÐ`´L † Y“KÁ?PBêïä˜bø”ï@˜ ø X ¸Ë¯ø›GÚ~w¶í‹'ýÓSƒvr8Êކ܋¸î»¬]ºxjð—çýþì  )0UЬ$ͺ·?@÷Õ5À*¼©‡&”œš(òŸn‚Õ ŠvXJv¥h§ Š‘ ËKÒb!ßKâ‹m-Y@,ÈDÝâ Çä´ôé}ÄÈ †›îxMIr§~Ìù`Ž@¯ˆ@Cz¢ŽX‘Ü.ÈwxŽš‰åèFjˆu|ráÝSŠ@°°Q Üé™Å¿zh I³\ŒýÞ.Q$ ³ArÁP ‘ÔhöwX¡ ÿ}}U ÈÊÏ Ö™à1¿|Ð?=9øOùê¹!~a(ªk÷Ž*Ú]—{סÖ|L÷øêyœÆÐ~fN 8ú»ÇÚ~óÈ@ « Y÷·~p[JtpñÀq¬v)ÚÉBðÝ õïoj€w¾—…`“r¸ E;šÀQŒ|s}íÒŒ¤Å©‰²”ž»‡å‚[G_ ÉFkî{¢:_\ptˆ…‚½bá7ÁèÜ„üñ±\s‡–í^ny ±Tï°D¬¢{¦¡v…ílA aQjâÒô$Ì ùõ©¶_>Ð $È š jσHhH±ç —ƒr#I0Z‚f•‚‹€‘ÀÍX°kB+1œyuZ,ð˜/ŸNóÇg‡üéù¡yiØ¿¾2ü__؃M¡]Õ9`í®ÍÁùêÙ¡ÿúêð¿¼<ìO/ ÅÉüáiЬÁ@S¢YŸl~üšrœ<ÞÞˆ"Xxƒ X1*Ú!]‘C°¢x´“Ã…òh×(C‚%?»¨riF2®ïBS|qpLˆ‹ÄKÜ#rIƽ8:!X»Óù¢!è˜GÜ”ÉBÁÎý¢óÑ8½"hÒ$Ä 7d$’PPë&· È.Ž_) Åy%»À-ùžY¿y¸ 4KÏ º$ÚbO †[ó­A$Â!7¢äYÅ'.+ºwdáÝà Ÿ¸¶üÇZ¾ œÌæÏ/ý——‡ýÛkÃÿö房¿=òÏ/ ‡ýîÎêœ;ûdwÝ:}eÙïüwFþû›#þúúð}ePØ)hÖS‚fýâÁ°¨À9ß;²9C¬$Á‚®D«`…U´“à"ªG;•a\R²HÌbN´n!¨ .p«Xæ/ËLFm’ÄÂÓdR!îT ñE;å‚ἚŠS¸ŠÕ+ö~NÀ¬r?!–‡?“6dD ‘n—ÙÝ.®b*ÄZWb‘ìbYFòæªÔßžiÍú• Y†ƒÚ³„ †° )ƒHà‚ë¦-È\¹Û³Ú+Á eÒ¬{FB8~|Xìõ~ûH› X/H‚õêð¿¾1âßßùÇ;£þñîe¿=3äÔIJíÙ¾Ž *øìЀ¼{9^¯ŒüÛ#€—@M$'ÿøœH "OR|bk)±IùÀSRpá©hxÇâÑþþÆòd‚?BíéÑî&X¸á¸g|> µIB,-°jXR|Y.x›.tx5¡% ^M¦ÀÝ+ÿp8wÆ$G–¶ß&ÇbiÒvC(HþLºÛdwƒcM-¾µ.]É.°Á­ÌóÿötÛoN Ðj· µ±ƒ0Þ–CБײ†Ç*Á(5$£‹ÁTÀW`Œ AØ5Ý;ªð·5±þå•a}m8¸Ž‚+ '£ÿñÞ˜O¸k@þ¶²¬NY»ksßYß÷oo7KЬ·ˆf v~~WËÓJ »²_)ýòx#1)Úa!èòhÇ´L÷,"XHÆ‚`9<Úu‚'n5pñopöò¬d_@.ˆ+ V­Kˆ/H.(滼š±f -Ý)$Ä’î‚×—ûø{Êàp¼#Д•ètl2ÆbÙ!»pKÛíþL„X÷N-ÞÑ?ˆX9¾ïšeå=]0.ˆÃÈ +$Tp×À|`ÀŽ·‚`ýÝ X—)¸úÇ{cÿñÞ¸{ÜÛkûÝY•s{IfÇWiæS×Wÿé…Ë¿~oœ<ì´ˆfýþ±A0ª€ƒÐ˜ª,oÁETE;FŠ +½èÀ´LCp! Ö‡‚`õEÑN,Üj ¯{[mšB,(kÖ–¥±À­ÝrAÛØMàîX(e™ˆ5¡€…‚¼Yq8a"P˜’àíÛ!i;„‚@¬½ÃrqNBAlp+s}ßÚÙ÷w Ó #Á0r£K0О%i¹`XŒ¹U¶A$Ê#ŒÜ…hà M»ÐþáÉ!”ÔkÜ×ïÿúý _¿ÅWÏ97»fkqæÖ¢v¯û./ýÕ©‘8ˆ<Ôx  ­w ´Dbðß^)Nf`>pÔA°tÁE*Ú1³ÑKѮ֯j[“ïÇ…šš Ö–Ú4Ü£HÄ2ä‚áÜ1§Lݸ·ÊAYÍéJà®·d Èf¡ ïVŽ@˜ UÓXáš±”´®í-¡ÆbQ3IÛX‡Çä+i;!Ö[ëkA ~{f[‚sUkÞ£Ã!7¼ÓA +CŠ…³ )övÁ€nðŠÑÉ$”î– x820ÿp«°kÂßZSÿo¯´D> >€!Äúúƒ‰_0é—§FÝ;ª4vÐÚß/ôÝ=ƒ¿þ`2žûõû ÐÒiÖ;—wOó=Ë€šÀNE°ºT‚‹‹«h‡à:Ï_?4ð‡Çú¯Êó-ÏNVw4c Äš\è¸#clÊÊAËù6È¥À=bK–È Â~¥<Ȳ Þ­8ð¸¡27R(/ÜíÃŽÑÃÍX4Ë@¬"B¬{§báfˆµ*×UôgÿîQ€VÛ¯¡ŒM‚AÓ³"I0ZRé®9äJŒYÊÃÕže—`ÈÜ `6ŒƒÍ¡ýýòcßÛÓ_ À•I°®ð|ãʯ?˜òí݃÷õ EÆ-è5^_Ýü×·é)±p;ÍúåƒCžX (‰—ùÀN èq{K¬j¾(ŠvÊâª}¼³/ ÖÆ±’Ð’µgH®'b9F;*ÄBM4jq°ûOáÍ„#À¸ˆ˜PäˆeŸ3âpmÛ>lrTÍX@¬û¦•ˆâ¼lƈ•ç{øêâ/ š…Ü !Áh™fƒÎ!Åž.¦sc•`\m "!‡\ìøÊÃ!Á³•;@ ౿oœ/º¢ìW Õ–„«®üúS¾þÆÔ¯¿qÕ_ßžòêÊæíåÙž¸õØÌš~~"&Œ§˜ eÒ¬¯ž»ìÙ9Õð…Â+”ôNæó Ç¥à½ÌÝDÑ.Ö)!œQ^•ç_‘íS-Y‡Fç{ –íèF¶‰X5án ¶–àXsûø/â_š#ÀèhÍIŠŠXÛÂ^¸Û‡ ±V…pFÀÍ8’H@,4ÿÓƒA³~/iVT Æ÷÷6¡›õÛwz )†|€Ì=Ú³æVAÛíá‚! ÎÉlP¹`¸%€ € @²·Î9ÏÜXóÕó£mKÀÏU_8íë§cýá¹IΨÑAëîá%?{pÌ×ΘfÐNÒ¬¿½5þÝõý4‡ö5æ‚ÒØ)—@Í£NÁ…—¢‚vö®V´ƒ`ázáª(¯ ÄBǵdŸTd Ö$&btAÀ‚R5Çb{1¹˜…‚=`ÇàSä\Ì”€Xá,šÚax!Û‡ ±Ö— ±Dbí ]×-I³<$hσH\Œ;ûA~ 6Ì„¨= öB-(ßL †å+\0\ rÈE÷@Ëí‚!$Ð j Ê NöÔçîªÉÙט÷Îú¦¿½¬ I°>4ë£ÿñÑÌÿøèêŸÞ?öøÐ’=õ¡w ûúCüË̯±,вhÖ§R¸§Nz¬óR´/-ï,S†Qç¢KE»zÚ:al¯¢®ÚékJbåø¨‰4×y`Ô/Á°ÃÍñ¶½€òB¶dMĦíÅà\–]\Ì­€_›#Ð"HŒ±pã á2n“±Tûð‰«b¡% ¥‰X> ÖÆÊà??5äŸÎ ¦Ü` Æ·À€¾vÎ!ÅîA$¢=«–$ئ; Á¹Aá‚!$-S‚aЬa0ЂíÅ‘¶ÂO ‘ù=E° ¸ú®ùo^ûõG×üõ™øEüïGWKвѬߎ@Oˆ@EZbç"ÖÝ“ ëÍõ5«ñÏO1$g- †lÏ2‘Ä,ÁxOI00¤X¸`¸$Ð ^_ùäl!Åí•`ЪÊ!šuGiÖíÒùâH[ÑïíF¬/žš|jrƒGâñxÖU’`…\XŠvXÚ=ÚÏ\)+?:-ŠG; .àÉÁP<œ…`ŒíJÑ*Œt.ª?º»ÅX»çt.b Ïc¦ž°Yð9r.zR“â;RÇ Ÿ¼z JªŽŽõôŠ?=7ôÏ uæ]ƒH„ rƒ%Áhͪ59+‡?rU™5¤ØtÁð’`䣫×-Á@~´éŽ’,¥hÿòé+u¬}ùøëí%"…è XW´Ï('‚…÷‚EŠöççVÙ V­"XH™"qÚav¥h‡àù@ˆ<Ñ>ì@¬£ò:±jÒYvqÑw>Ž@‰À¢Záy«7hŽa­­:ˆ;¦¼¸F ºM•VÊ‹S3‹ÿüü0Ь?Jš¥·gErÁð’``F&ex"ÖM mH±Pºw‚CäMƒÁ/žœ$Åæúèš½ !`é‚‹óW´Ë|`å37õŽj~CpÑeŠv"Xybú°ŽXP·P‹ò"v­`–e=d³àÓä\ô\U°«%b¹ÔíÂóBöc‘º Z2ÕÄ:2:ï//Љ…"7øÔ?œÎÃC‚!Å»›0ƒ†$Û³0ñ]´gµW‚Ð’4KR,$—Û‘X.a$ÈøÍˆ%íj] Ä ª‘àâüíh)ƒâñ‰k+á|*¼àÂéÑE;°:äÑ® .po;ŒgVØK6cu"b-­ 2^]ôM€O€#Ðc"04”ì‰XÄãm»ç…èÇÚgW·;\š€X[jÒ”çëÎæŒy  ‡ÉÜ`‡$»½]0Äô¬[Ú-Á@}Èî‚“c—©t— Z_<9‘úˆÍ5socHV°„¼°û*ÚŤh'‚…; Pä5Ry!=/VäúpkBˆ%œp½:ˆž·κm©¤â&«ƒxf9 {Ì^Á'ʸø¨NOŒ±rbaì¬pÂHÞí–çÅÉé%w4e*_A ÖºÒ”yi8hÖŸ‰fµS‚ñ hÖž&t¡—H )Ö\0"H0È!9´° X7I¥»>¤X¸` ±‘è.n Æç®ÍÂbQ×ðŒ}}ÅHKÑ^w>ŠvÁÅ…T´ÁB"÷èè<#•¯à-Å)biÞí‡'䣃x¿ð ™Þí¹ðn§~¬p.Mä+8*Ÿý™.þ&ÀgÀè1ÈHŽëÝ>$K8áËëÝîD¬b Ö®¶åÝ~s¾ÿ–¢À’ƒá‰fÅ"ÁíYá$­[aå€YmH±Ph.ÕÖ S‚ C¬ 8ä¶ rÈ5\0ОeJ0¾87<ÕÚß/ß[ÑÞìòhnMçÑ~ñíBp¸Â½î0vöÏÄm‡ôn‡nÒ¦ª47b¡9O Ö§n8ïvɱ '܆ ögê1{Ÿ(G [D`Y}>oByÑ’¾Ñšè˜…|ޱó±Ìi#Æ|,ìe@¬ƒ#Cj¢#!Öîi¡Áð­Ø%Ôžõi @kCƒ—Cn»%'G‡qÁh!³A§ ¸ÔçÆK kh u‚¢ýª‹¯h§| R¸_=7tcE‹æcÝÞ˜«|²‚í™aÚH®ŸÇbu‹M€O‚#Ðc"0³"à…X™ ± û‚÷îËr#Ot$Ä:6¾P!Öj‰XßÜÙˆa»ÿò²È  ä=%hÏ:1 ¼£©Œ…‚f='ç=Rn0r>F  )> F?A³L £=ë‹sã¤A»ZS4ç‡\´Ï£].¼í ô–áŠö¾˜.¦· #³úéæÏQÁº«ä#?¹§qþùÉÔ2LíJÑ®ÖomÃåÃmFÑ â;d Äšbx·‡›A¼s¤×DGšAÜbÍ ^^L`ÝEÙ'øD9Ý## |„XØM°§lù{¨–; uB,T,BõBÌ žXˆ <î¸Q'Ä:1U´dÁç{eŽ{(Í^_[ó×׆ƒfÅ(ÁÀfêí‚Q‚ÃrA$Rf I0hH1¦ýÚ†‡sÁ¨Ë! rƒ_œ+rin–øå`Kþ…P´ÃB°k<Ú•¢]¬¡Háþàx !ÆI±p#²ox!¢°”D!ó® È YAÌ †]2>'H#‹ÄC³!Þ±f·f }b}³@,$¢QÇšUɲ‹î±ôü³ÈÊÊJMMíùïƒßA ¨ËHB]ÕB¬M„X°DVpH6ªØ}À±LÄf¸@,ìS:b!S$ ÷%ØÝ€X˜OAˆun^ùßÞño-I³H‚AíYb \00=ëtÆ[ÐâŸÝ7à§÷¶þXZ7©A$ç+Á¸!Œ †—ƒr¡t'šå”`T šõÅcÄÀFµ>¸òPÿ|MÑîm!Õ£=FE;9\`ö ’¢˜Ã¹¿P´ßÖøÑÖ¾‡%Xý1Ø ÖE°„G;Z†•à—飷À¢IC¬»Æä; XcC‘kóÀ ´ú9kt!Ë.bø~òC"F ##ãg?ûÙÿ÷ÿ¿ÿ÷ÿ^}õUŽVï@¶/ˆ…;_±„® ±r±p-ìÛMÄB^ˆ8–Õ’5£äæÂ€PB ûva-xÿÔ¢sÄ__!sƒ‘$¿~h òTÈV š¥;äz"1%°xˆU‚Üà5$Á ÜàÃbHq‰R,i9äZƒH\ Ê Â~é‹sùˆñÄÖ:ÜZÐ1v´ˆáLàʳ‚CGd ÁŽx´S>ðHÜ€¼ÂÈÑÓ£Šv¤jÁBÑñõ[j¨ t·  ÎwOdZp¬ÉE‰‚c)ÄBÛ¤¤HãæF·+Ž5( Ÿ%wXr8–âXý²XvÑû·—®~‡‹-úÿ´Ÿššš®~E>þEŽJ +%b5§“í8!µdca² !Ä’wÇÀp¬ ©zñÁá9kh–žl¯CLÏ’Jw÷â÷; Á˜éí‚»ãKX.l­»`~±˜ÙƒG;ÙH GFf3'#[v¡Gûic–›` ?9¯ÜhÆ’ˆµ43Y5cˆu…@,´:€c9KJÛñùAcŸ'b­n æXvq‘¿û½àåóóóÿÇÿø„Y?ýéOãã¹4Ú ®j´·pme@G,äptÄÂý²…Xž¶ö–¬ÛêÓuûmµiÿxg¤F³<$4¤Co‘„«pÈ 'Á@{ÖNC‚AíY† r=‘¸$ç”CŠ=]00=KÎ{t)VŒ/Ÿ¸ìë÷¯k"ýrd`kíP´÷A"q‘‚u|H‘U—ÈŠv²|ZZ¢«ì‚x´ÛíPÇ®À†˜Z¨IÛ“Wç¼Ú‡=Æ9Æ2kUC0‰÷–h_Lþ{,HLL4hPSSÃU,áê ¹¼ÐgX jFM^¶®&bˆ/d1L/ºoš_ìèŸå ¢ˆõ÷·%hyJ0Ήy(¥x )öDA‚к Œ/Ÿõõûôu¤­@,9³ñ` àŠf6æ£$fóhSL ¢,áÑNù@éÉ4…¬‘†`Aè¹#FaVW{´ëŠväÑŠ¥ ȱ.m__ +míÃyîöaËfÃðâ†>,»è [¿ŽÀEˆ@cĶ–,p,XÑZ²„øb’,eIÄ"¹àž!¹¹àïk4Kæ…íY 9¤86 å… Æ‚f}Cš R{ôP%ÀmODB.R7Y‚Q¢»`XCŠ]Œ/Ÿùõûãõ.Õ.vÊž#EÊ ¹ŠvÀ•ãf6C°.„¢],o¯O×e[jÓ-i»(bâêëBA±lÒvG3–j_IJ‹‹ðMç—äô†ä ¾p7G¸‡“ ‚É·%,|~¬ˆeÐ,S‚!Ú³<]0Zá%ŸîoþþÞæïJ‡\Œ}2r¥ †‡CŠ—Ô`ÓaÝ£ €–DB._<1òïÓ×ÑÁQ=Úe>°BÈ= ú#¸py´CÑŽ™r$ÜÌ€g€4 €ì(â€f5äKáŒø|²¿•?´`k‚‹V]p¬‚e,¡hÁBµ"¬)²É.¶5‰YŽº´Ý]Ä&mw4cµd³ì¢7lü8!hä\Ý7-šÀ=¼\ÐîànÎuLZ‘ »d–>¸£ˆ%@ë­‘±J0Jwl²Pº;Û³Ú-Á eÑ,mI¬Œ¤ø¬!Åy_<1üïÕÖ˜cC Ñk )<*XÅC2Ša]®h\už¢]V°†ƒ`ýÓ‡ÉWÊ.p ²kšåh í²‹ºtéR´Iuipð™3gê/ÝÐÐÐE¯8vìØ1ß¿ccc½´û°C‡=zô¨ã||ðÁ)S¦$%]÷‚×W¥X÷˜å‚ž~¸;²85‘Äh>E ê‹+úb‘ãoͲK0Оõø` @K*ÝÑN•ög‡Zàà€ÑïÂ!7 &Êc®üK‹…u&Ké.ç#Áøò‰aÿxw´¾Ž-3+X¨`!¯xψ–ࢼ…|íGÛ­h'‚…rãçG›MÙ…ðgÂhéý#YŽšk{DÙEx¡ Ú‡“{²ÝEiiégŸ}¦‹ª¿ÿ¯ÿõ¿Ö¬YÓuûWeee„W§?ýéOÂ&Ûuç€#§§§¿þúëè… w2ÿùŸÿyäÈ‘.DìÚµKõ1cÆtÑ[^¹reÔ˜ç;ß)++뢠Ã677ÿîw¿‹p&ÿû߯½öÚ.=‡nqð±E~¹ ÇÌ‘(â *eáÆ\/e™U¢+ŒÃpÈ +Á¸G4“Ù Pº‹Ü`“‘ÜÞÕ,4ÏbÞ£Í!7¼Ã|¡Ç;7«Â9¤8¢ „Šf}ùÄм{¹¾ ¯p,hÑà…6/4{uE»Èz´ ÁB—7n)@‹•Ûn>Œ/ðvt¸¶£‹¤íúœ³ Ég^Ì©êZ ÒÕß(lLQ7/<`äÈ‘]t&± NàÿüŸÿ6ÖEç€Ã‚PƇ%K–tÝ9t+ÄB4>ÿüó®{³Àþ¯¾ú*jÌÿë¿þ Ä·ëN£[¹);)œ\0¢®—WÓ´’5E)ª”…>âccòbÅ*Á8c¹`PnÐpÁhIš¥·gyJ0ÞŽ*ÁhI¥;tz? ) RšžõÀ¸( ‰X—é Ù?oEûe=IѸÁBæö¥•Uzï0ëÞ)¢O<œ?S̲ X‹ýÝâCßÑ“ø¿ÿ÷ÿFÝ5ð€uëÖuô¢ô= ±PýV‡qPŸ †Xú a«º(ˆõé§Ÿêáìõˆ¥K<ÉúûíèÇ*úóˆ´VÏAïÒB,¼ó›j¤ø"ŒW9_ÐØç0b£ØêÊÚÑš½0%‘JYd‰ûÇç†è4ËÈ J 9äZƒH: Á@{–Tº;]0Оµ¦;>öýŽI0¨=ë^¸`Œ°¹`üî‘¶¿¾>û»\øeø‰Q…²eØ[pUÑNІ@!àʰt(ÚWU´£×-²¢ò`\ÌrT–í¸ùX_TCF`ØOX£‡mE,ß C׎‚ÄžmwÁˆE¥Î±±`DGžŽ>‚˹ %B|A£á.÷R£Ø5ŒX;âÙ•µwhîÂ@"%IãþóZˆeæƒH´!Åž. ³=k{?è¼=$k "Áô,)Á@ßn{%ègú×WDM.ü2 ‚@¥h—‚‹B3.0ÊÄe!X¦;\<%.ž•ž‚í²Ë9ë Á²y´ÿÂ6ËÛ£])ÚÁ•ZW’BºvÜvàæíÑŠXrȈc,ÖÀ Ÿ"J âsE²‹ùÕ=[vï ##s¬ŽÂnç=¯Nr”>b­”e3q·[â"}txLþ‚žüö޾ĒíY1¸`¸$ÔžõƒŒ­6 K‚±¢Üà16ŒöK0~ujàŸaÛa­¡†#Xº¢žñ]ëÑî©hÇÌFI°Ð<àöhWŠvE°þüâP-%˜´ xGslMŽË” fO» p#År±®,íÙ² F,µå0Ç¢PpV°óP¨=G*& Äò;"LÜå ,§‰ûØ8–(eÙƒÇ'Î÷%è‰Á7Ö×x ™ ê.˜žõŒF³t‡\ÏA$¦^6  †È "Õ&Ú³U“ƒÚ³ÀrŒ!ÅžƒH\ ´ÿò*¯/$©eØ­h' Á<Ú……àËKÄÌÆ×¤Ã즷ÒáB‚EK8\ôƒ¾*åp–CT i%ÆŒÁP¶Â0V.v›¢ׂʿ<5FhŠ#n;pó±sP¶QÄ’)AÌóDJPX¶p»‡ŒØ,ÛíƒåõlÙ##€Ì±Úƒ-]óX4uƒ²ÌR–aâîÕ•E‰AìYîyÄ4+ YAÜ›+Å๹enÄòvÁ/ÁÓ³„ÒÝcH±ç ’(ŒÊlÐÕžM‚ñ³“­xZ(°ð Ö}—[í"Øc<Ú…¢ýuª`ê˜ïîï§T‚¸íÀÍÇQyÑtí¹¸¡‰Ð‰¥ÆbU¤õlÙ###V×@Pû:WŠ/UŸBÑ~¸ƒŠv²Ôíêê윭4ó’âW†ü¶Æáñ’`ÃíK íù² F,F,F¬.Ÿ­@,Kãš5 ]5aƒÐ_ŒQú‹kÀã•EÛ[³ç$ÄKšý… Y4×1,h¹‘ˆéYÞ.‘`lóIéN4KÏ šó=r•Ù î‚ñéáæŸ?8@_@¬pí@ÑŽ)DÿФXC°d>Сh‡S‚e¶ ;/ÊÆÊTärIs171þ–Ò \¸ÔG½qØ­ÔS‚];ŠXUé=^vÁˆÅˆÅˆÕ!xéš'ͯ :ƒQƒp–Ã.F‰Á# Ècpϰܛâã@³ ýEZÒgGÅ\ÇËRìé‚aJ0hH1DÛnCÀI‚!Ŧ  )~wƒ˜…(†.VnÐS‚A¹ì–`|ÿ@ÓOO¶ê x¦{´wE;°È“ &XðdúóóRÑ AéÑ®íêºà_¬@n8pÛ±¹&Mµa‰”àØy ¯K5»U‚H);¬.V5Ó“{¶Û}çXyÁÊ V^t þ´ÿ¨SJîÄ  Yƒ´‘Ä"1h÷´7f!‰thLþqqsã…þBÊÜß»­.2b) †È ¾4 ö¬î!Å¿=3ˆÌͲrƒí—`¬®õ–` =ËÓÔ``hœ,¾·¯éÇ÷ö×׃W”EûXHKÜ-ÃK‰ Ì5pð§¥à¬]ÌÐ+Bµè°|[Z¾gY6:,!Œ„{=F…!Apñ;9Rä˰‚Ã…… ©hW—æ‹'é ··7eêÎL¤¹€S—"XеoÃx‘!YPè@sO ¨¹Ãêkqmo]0b1ÇbŽÕ~`é²g ÁS%uÅ v"ìG¢•xhvdýY¹›\tc|œN³ž]R±¼$Ã@ t‡\ìÂHvý:f ¬Œ°Ý Æ­‚f¹r_nÐå‚AÓ³ÌA$.‡Ü1ÅßÞÝïÇ[ô…%–¢}¢h>seÙ#v‡ è!£‡˜ËÐ(¢‹zÅW¼[†p¶º… Ö2ܬZ†10 -Ã2Ø*óΖaA°Î þ秆 ¿ªç•G»ûŠàMé ·;å€:‡Õ\(/A5ÂÑK%ÄšÖ+dŒXŒXŒX]†?í?peZ"4]ÎVb—Ç`¸Æ,MQ¸ÀŸ¨Ó¬‡¦GE,x.x¸`<ƹAI³hHñyI0Zž.W—ÃT …¨3SŒÜ I0¾µ³ïgGšõuFLŠvX:<ÚápÑAvÃB0ª¢òžíî+‚YŽF+)7¸‚ûG…l>4ÊKÐ+%8<ÔãÝ.8+¨ï(ìÒDÑ`—¦öãLç= ž@,=1ïmø™Rbл1KÓ_X2÷I…˲’±ß)šupxNtÄfƒ#á¿Qj-Zn0¼㤷 †RŒ†â;ûÍúHÒ,RA‚y@$îÜCŠu ÆG;¿¨I_@, ™Ì–<<¹ç X2XÖ£Šö5ðd•6Á÷IѾµnô¨ÆÁ™þ;;› ƒüþÞf ÃfH5‚¥ .NÙ,M‚å)¸ð–n>¿¬RU°pù°àɤ¬}¨`y93Y)ÁV3%Ød¸ß‚`­ªÖô Ùs,æX̱:p:ãHhó4ƒîÆ,åØ4,›†¸ý/ÍB1my¨f¡†¿¥:-Ä2\0Þ3ˆÄ.ÁíY¦¹BéîrÁpI0`ÓE‚ÐÒ\0, Æ•† Ƈw4ÀÊH_§&•v•G»§¢ù@Ù2 ~ –£G{E»º4§f“DÖ<_‚$XŽiXv³v±às1(S4Èš »— ke]0Ë×dŒXŒXŒX3w ´y:h ‰‘fá–\Š —§bÍ‚M(Ó"Ê鯶!Åí•`´·€… ØF¯XË!wk_E³ m€ÀA¶g Ô“l.$KÞßÚðí=}õõðdÁÅYòdšUNpa Á’3=oï šøÙ€å\ôG>ÐCÑÁ…æÑ£¢]]—Csæ%ÇC"h\»”Äö,·æ¢Q¬%5)½¯X+hn5œä¬`çÁÎy mž«ƒ±ë/Ü4kûå¡ÁÅ)õ® š%{³vµfÁ‹/&ÐÒ‘´žwJ0à<E‚q°=¶ž¹1K0´Ü Pº[Œ÷n­ÿæÎF} |·ñh'Á…‡¢3½ítEà‡ûÐô""XêÂ]×';yí£kØ4¤iXš¨]ó¹0 93 ‚UœÙ[ḏ˜c1Ç:xé‚§¢Í»L$ý…4ÆuΑլ½£CWV§ùåÙR ±ˆfa7\ïÿξ~ÑA«³$-÷ jÏ2]0¨=ËpÁˆM‚ñÎæº·7è U.”²€[¨`QËp÷U´Ë‘"ŽÇ©ÛÒÑ<‡Ët“I°€[å,>>npQàö9á*Xd}+æ7zi.VÖ¥Œì-² F,F,F¬.€ó8$Ú<‘ơĠÛÿÂSæN4kNSFNŠej¥!–¨f š%Šañøe‹–!DnÐS‚­6ZbÑi$i–­=ËsI †È ÞRïé‚Y‚ñÖ†Ú÷o¯ÿ@.ü‚ufj©\\Eû@Ǭ(ÚqþM6í(:*‚…_ê´R )~RŸÔ#qÃN‚¥Dí-é0ú¢‰Ã¤¹XQ—RŸÑÜ.(ÜALqଠgÏg:õ©‹jSÚE³V̪ÊòÐ.—ÇÅÍÒsƒ²¡;#ìqwÌB³jL.Ð ¾<Ü0„Òó¨ž‚ÆØ/΂ ¹`œ¯ãfA³ 2W¹† †—ã‘©eo¬«y÷Ö:}áÍ™eNv(ÚÑ€…–áUrfc5šÀ`…W½C †‡ÀN˜BʈJÛG[û:Z†……àæÏEËp'+ÚѬL 0½%O&SѬº!.®ìÊõ¹ÊMI¼±1=yªk8*ÁZ^›’ëOèÔOèÅ<˜ŽXصw™?÷Üsî¾ÕÏúõë»è,+++ýÐÌ™3õ?Mž<¹‹ÎKöb©Û?þøcõÙ;{ö¬~Ýñ1èºëÞ<­ÔO·Ìlušµip6òE á«êY‰ñ³ý ºCM!¹¥Èÿ­=}#™ ê¹Á0 €–— †lÏ /ÁøÐTºÛ$È .«1%bH1ÆR<« $úîƒlýµ[jÞÞT«Ö[›jÏÈž­Ž(Ú׺íw\ Eû¯OÜÖ7CMÑ7&ÅWû"aLuVòŠ– )´f‹>.‚µ¤:%Â'¤;~"ž“ŽXú6áøý†ú]òȥŠ-[û˜1cº$âqq+W®Ô_¨;¸4Eøì <¸‹âÐM‹fO$s@³dbPÎQƒ‰ÍnbxžNª¦DÐ×ZØ~yÞ‘+ ÖW5 †e6ˆ9Lgo(Cö/¼Cî•üË“`,óá¢äá+%¯®®~c}¾™VšBHáa–A3Å,"XóÁª(‚`ÁÙH˜BgÃCÔÕ>Ø"FŠ|$° ‡ ‡G»t¸p(Úm Á¤Á2-‡ Á0íïm­GMÑðh·ç—çøöí›?¾O*&S‡ûŒâ/ƒ üë[ÅMLø Vëê2_7ý wè´bA¬÷Þ{/Õ¿®ùaÄbÄŠW>ø`×|îºñQÑì‰j¹Í2Ýܯ¯MÍÓJVî·R’ž´²-[)ÝáÛtçÀl”I€[¢©Ü vL€2„¿ê‘ëïÿûÞ½{srrºîû͈ňå‰X_}õÕ–-[RRz‰g;¾AhöÄ^ãI³–4¦Õd&E8Vš/ášú41…DºcïSH`6(íqa„¡tƒbBqjöMìžëJR>ÞÕèÉ´: ÁÓ³ÐP|ÌáÛ„ö,OŒöJ0^\ÞçåÕUúzl:V¹N°t Á¤… ë £O ‡ O‚%.š‚?–‚0­d!èðh·+ÚyjÀö~®0³QŽC° ‹Á0³ƒ…… ®—5hXÚ´/iÉ,J‹tÑC)‰³ª‚˜^ :^nˆÚë‚+jS–Õ{‘ìÂX¯¼ò DúO hÇ7­CeÄbÄbÈØ™]Š1Nz†PDboÏ’ ˜é š¥)Ž$Áh" å r¥Ù ÓÃ%ÁxrnùSóm ˆ¥YFóh§™ºG;í°ìö·6Ô¬-\ÙÔþ„5Eˆ,Àz¡‹¤áxkNvx´‹±Ã²áu¢í³kRs"ÞÊ„ ÓK|—‡"À:H.Ø¡±±ºƒºËö•÷'ÄGÈBÙ< Ï·¦%½YÖmØ£2 ³ u×8ä u·­{§ïž ‚%UNÐÚÓ– ÷ Z‘$ç¼]0:"ÁhÝ\õ94èJ@.a9䚃Hž¸©ì‰9¶õ8o;EѾ[˜ÞŠ ÖÁf𢂠ͣ=FEûŸzÿ”›óýà²+ ®LµÅÂ@Âý2Átqë¸r–¯¬)ÃV>ŽAÃP´¯ïŸ1¦ØO¦\á~‚ÿzÁ`¦_ˆ‹‹«¿P]~¨ò´Äùu©hµŠA³ìfƒ*7¥™È z´ h»¢÷ûJ:(˜VŽÁ´6”¿±­A–%Á@nðE8ä  )6\0`Ýd¹`D’`Ðô,—CäÑ&…f©×Zš †ÖžUùø ego(Õò]êÑNù@EûÞŠößÛš@O¸‚\óÀ¨n\¹ÊWÊñvQ¾²òw ÉÆ,}ªµ ¯hLmÎIîªæ£.ÿ8·û±±±Úýµ¹(OÈô%\Up4‹)$mbØ£•ŽÑY9 YÈ Ê‚VÈQÐB ·öB…¦5µøÄUÅ÷]UŒ»þ…ACﮃäm§¯-þ×WE†0V @ËS‚qW˜A$í”`<:»ô‘Ù%ú¢ ÖES´?#¦ ÃážZ†_½¥Ýn¸B½p]Yðø¤BÀ"¯à ÜWÉÙUù ÅH*_¹ó¸â¸Y\mhIWŠöªRJ‚—„¸6œKS×Ù29¾ìÝPyñ—¿üE99|(PæéºÍêRö¼Ð]š.\ØuAî‘G†÷Áðüä• –=.n®Í’£³"ä= ZF‡–)4@kZÉÁQ!0jÒr€4„¿:=P€–kH±¢YšCnZk¥Ùà@4Û¢‡ÉÙžnIx †È š.\[rúÛŠ@°@Ô”… ç,LIÛç3òç¡hÿòÜ “ €ñ®|z2"‹íý³†%¸ÒÕst•¯pÃApe8ÞÉËôh×Ç6ꦷ‹}½n}ùå—žý›üã/Ìw»› Ö›o¾ÁyAý‰«³>iiiÿóþOϘ½:ëUzüqíñöüê5«)$¸¹Æ-6¦K¨Ü `¸rƒž-Ñ¡EmÅ&ha'LkZÉ=“‹Ö•-Ð’êA1Ö!|k½Rü房¾.†ÿ‹Ã!7œ uO+ü„Ù hÖ¡ô9a@¢hÏÚÙ ÆÃWŸša­‡f›]ñô “ pÊxQ¶ â0\Ë0úÀ ø€îêÎR´~¤y[ßtW†ÔBÖ®Ð6phtÈWîî«&gÏ…ŽÆæx«M6,› v|*àBŠöÅÕÁ¹I·zö—æuÿýßÿíÞ8.5ĪªªúßÿûG-F¬Nü¸/X°€+J<1|äÆJ?)Ýh™ÃݹAå EnÌq{Ž›tÏ‚yaÐ2¥ƒP(Ð:9½d{KäÓÊöaÃ]òß\à¿¥(ððÌ⿼Pm¤©"Ëk„¢}aŸ@i°÷˜µ»¿!£G~÷Ýw{Ç¥†XKssóSO=õ_ÿõ_p‹« ‡š1cÆ'Ÿ|â8s,[Sã¯)óãöÃd‰f9'ËÜ (h WÐÒ:´¼¤ƒÔ¤¥ƒÖáÑ¡•¹ÂªUJÞEs±Z…­Y?°íY¿‹ö, Æ`Xí…•` =KÒ,½=KH0îÐ]0"I0¼ªøä•…úzòúŽ*ÚïDËpÆN¢eøÓýÍŸlå<È D&¿, ÁSmxGPðCǯµ ýÝ#mwÏ–¯)ð#D ¤Ô& ¼_š‘¼s`6È«®tq š…-µ…Ö}e•¯”íºã-œ‘­!Xbnhp[ƒ–ṕþüÞernÇ)++Ómrª««;wo w´äädýu³³³Õ#‘8Òÿ”ššzN©  ÀaU¥ï§]ŠXyyyúKƒÁ.z¿YYYú ù|–¹³ãíwÑ 8 ‚«ŸOy9&;ñ¤„¸IÅ>݃<ÝÜ Ô nH-QðÀ9ÄÐÈ)éZV[qtÐ*ÓºwJÑ†Ê –pÄB?*4H|m(OÁŒ37(znèŸJ4Ëæ^‚„NÀ`BÐ,Ý!×Óc¹1ˆ¿û® ô›öŽ{´“… [Ñ Á~![†Ã)Ú¿·¿f߂•„+ຂ«Õ¡À]c ÚWºÚ"RùJ .¨|¥çW³Ëý½¾ŽÅCÔ\0ÄŠz&ü€K7(haö¹wnг Ð&@‹rƒ$4ÚŠÃ4iÓ2…Å'§•Ü?½äÎÖl¢ Â{ÐT½#ýV¼ÜŸ¢rƒ_´¤Ò]—`Ðô,S‚árÈm·C´gÝ7©´F_(bÁ~Ò Œ)yyq5&C¾º¼‚‹7¤ÃEÁ|QNCQÍn!Øÿ'ºÃ…ã]*Úñ6Ÿ[\¹®4Å,\ɦ+xJ¦ÍÕi÷N¥Á¨ìJJ{ Cma l¤ò•1¬ÊWºã­‘¬MA¿päÞ¬K÷Ës‰½sF¬Kì‚wã·Û’„»D‚íu˜žÕ’¾ÁÔ #¥ Zº{“´Æ ‰špÔ:‹Éx ¥gŒ) Ã\rrRÂÍè=rJ0Оåé‚aJ0~»íY¦ Æk YKk^Z\}⊂ccBúzúÆJ9+ŠG; .lC°¼<Úe>0’G;0øèè‘ ´®bíœ ‹®„ÈÅ ô€+SmáQ¾jÍPrv0låxKùÀñ…ɽ®W¸»÷©1buïës‰]UZâ²:« E¹A]ì®wh9TB:¨3- Z(þ[ ¥ú´ìe­S‹6U¥™Z QÖRBð Ö$ZnÕ¬3CŠ=‘ãc!ÁèY‚vu×eyúzúÆ>:ÁÒíp~žL`¹‹ÃBß‚™[ÑŽÒtŒP3BÓh#X†…`›òhÿxgß­õi‚Z92I7ŽŽ/pÃ.žp¥¬˜æ¸26¢_X+_éùÀ!¹½ÍŠéûNwòÛeÄêä€òáÎ3„E5)bwW‡1-]:èZr’–-]ònÚ8‘êe­ûg”ìjË^š)†e²EBÒNL,€í…ËCJ0δÁé\oÏ‚ï‘D³³¬ Œµ YÇÇä‘«/Œ#Ñí¯›S†õ!XnE; .b÷h‡æ–†ð " Õqefo­M?1±²%Í6aKÈNR °+®ì^·¦y ®¶0º¯ìå+\}(q–×¥4FtÅ=ÏO?½'F€«'^µ^~Î(°ßT•â»›-S…ᔪš–ié“´,вlœ$he­#c ¡Ò‚lɆ-?º‘>»« áõ`œjóDBíYR‚üˆ&Á¨Ci ª£—‡öÍÑdrf£]ÑŽ™’`aš )ÚÁá¬þÈU‚`…óhÿɉV`$U­”Ȃ܊=C´LàÔbÃ3P3eWc…ÃÁ•MhoW¾Z\“RžzIø\ôò/sg¿=F¬ÎŽ(¯3"€ÁG˜E¢ÄîF‡–K…á0pŠ ZpÄ€“Þªå(k˜Z eÐ*²E•­|ÿÚâ”–÷ñtÁˆ"ÁØ/ŠÉlÐÙžåDrר¼½ƒ²õõìÜ>¨oi‚‹Z]pñ¾Ì~(ó£Šv.Ú£hÿÆíõ[ªÓ( ¨Ì,HÂ~saàèw&P3a2‡4*v³Gè6ÍÁWv+&—·…îÆ¤—¯æUò. {g|Wzù1B¡Œ‚Ô#V/¿Þ=÷í¡Ø>±Äouh™* xaP‡–һ뮃±–­¿˜ŒÞ­ áô’Ým9@,ªl™Úw#Ixllè7gÚŒ!Åá$÷  ’`P{–á‚ÐòD¢I0ÏÝ= K_ÏÍë—wÝávº0Õ}wC=fcšI8Á…Ó£š¢vS°1¼¹ÐL*ýzFš¬o­K§°xÊᔯf ·®ìâ@MmaÉÙ¯«¤EœðÙs?Ò|æˆÀ°aÃÂ58p ä§pº0ÃCÉZJ…áNÔ¤¥ÙahêAËâ1$Ó’ åÒb(Ü:2®`u~@¸c˜2BCþòßV—ö}ý¬Ü`¬ ­=ËS‚±F "904çΖL}=?¯O'+Ú¬úÁÑ–}ƒ³eÉÊèµBP̼—8½wh®%²°g¡³@Qа¸Õ]- v%š œF·Ä®\ÁëVŠÝj‹«Êü¾ÞìhÑ…ß”ÞzèpˆõÕW_efföÖwÍï«G _VÒêó-ws±¡z—e-[†P'[ÓJî“BxYIBéê„Ô„sÏ,¬ø'˜ >!¬›<%ä+$Rìé‚ë¦-àIúâýƒs0ËC_ÏͯŠl!èR´{ .ÁºÀ/Ñ€uªííMu*‚VÉW”Ä›•™ÀBjåY¸‚ t0aê\¡{A5 Cm1¦Ð‡éhüÃÐ#àF,X/¾ñÆ---(Ž@7@EZ⊆ òÂpèÝ)=«\Ïô Í%Á–ŠwpºCËI¶0¼˜”˜ ¥ÈÖîA9@,lå"IHÅ-·ÌÅØx› F$­ ÐP ª=³á4¡¯çTu¢¢ õðŒbQ¯BPÃ*°I̽D&•<# (©y±SÇ•g&_Üp%\nI¨±+Ã9ìJjÙpÕ–›ÜM?||Z5 R“í?555õŒøÅ91D ª÷º( Nˆ‹ ´4S +C(½Þ!×6¬1츅 áªQj¢·„MÆæÊàGÛM‡Ü6’`Ý DârÁˆA‚±»5ë¶Ú4}½° ª³íŸhÚÕšI~KŠWVAÙL`xjedAOõyW®¤Å-™0 W jŽ WÚì+¤|!d¯Ëফ¾üŽG E ^ïÕ)‘™–»OË-5ÒR½«Ê–™!4É–&#,†/Ѧê4Ì2&Üë‚·“¡ËÈõ½±ì÷'YrÈEæ TY8¸K˜ Ã!7ª¬-U©jm®J}aQ5f£gË\tTÑþêÍ5;Âù×UƸÝÁ4Ÿ@9DØ V“\ÔJÙ±»e퇫%µ—Ê´ÆôEãSåp:'(t̨ÄZš÷ e?%C¨*[Z’ÐTïjËY”š$p  Ü’z¬dèÑ|OOŒïÇtT³àžŽ–^›C®K‚±£_æÆŠ ¾^\TýÆj›¢.œŠvX†ñhGEíääB¨¤¶'èÅY™@¼AÃ$ÐH*ýzj¦på ô/ÂÕÂSjd ]Í«NÉf¡Eç|3ø(Ž@·ŒŠóã‹ýAËh.&ïAáòn÷Ì5@k´pg@Ó«YÖrÊ$¡YÜ"Ü:2.“J ÜJBp²ÓƒywK½pÁðRì)Á ö,`’`lkÌX_𢝗W`‘ÃETE;@Јׂèî yßÚÕtëË`à–° ¸µgh.a•5àJ*,<ªV–Ÿ…ÌЦ+›,Ђ«ÁÚLa¸Ü’2ÐW³*AV±w˯ŸG€#ÐÉJÖAË%y7AË[õ.ËZ"Chßr Õh,äﲸ¥á6wøÎ÷%,ð', ˆÝß \R ÿðÌ’_z<‘<9@Ì{t)ötÁŒÛëÓáB«¯—–TGöhGor8ö–V­ùˆT¡Xe`•?'¿*?pd|Ad¬rV­,jeØ/¡p…8Ü\ZAÿb3aRBv;»šRêïÅ£„;ù³Î‡ãpzAê3“VÛû´p/o ÓjËÄÖ‰ Ô˜§eµjyeM²E湺"ÃlÛ²p‹ê[È. $ÌKN˜ïOP”‹ª\w6g~v¸9²c«<]0n«Iƒ¿†¾€Xá,1y æO˜Âå¶Dóòñ±!P±ÀªyÉñ[jÓÁ¦Pä…Ð,Y¡×Ê2^ŠJ­œ: kB#Í¡¾+8«1"—øXÄÞ ¾€ü8öE 45qyCPo.6@ËeŠ&Ch‘-Cûn& =qKå ÅÔ’)E‡Çæ/ÏöÍMŠ tuA>þÆÚZ›íYÂÃ%Á¸³ßÇÛú~óvcH14Ðòéëå¥Õº…`,íÞÞɆÊþ™@•€SŹí’ã‰U¢/X¹.=†O F­¼3.;LIlpeö]¡¯®ËÛ÷!çGs8½'9HÍÕi EÞƒ^NN´ì¾j¤£²¥% -¾e’^ê2ľ?¹pCŸÔ9 ñsã%t # K¯Dè sÿ¹• Œ®÷`l3‘lª B"¡¯W–U£‚….côÇâÑþäÜ T­@ût š›“\™ç»k\¡´×«Âa§U+-HÓC”¥š®p…û j^ÑZÎæ¶½ç«Çï„#ÀèHPÀ¿®OŠ`Zðli($£ì %ËZf†ÐcŒÐG‹ÙZÑqË´w2œ2Ì×mÙs“nг ËD/tV}wo“lÏjà‚¡$Ê‚BÇa.” ^Y^#1x´C:hx®Ìû‰Ô8ŠS‰Ý·¹6ýø$+¨´*h5ZCTk°¨ZéÞK¢jeë¸23Rg¡Qpµ¸.XÂþKùxós8Þ¤„¸©eP½‹b‰ZTÖrØæºÈ–ªlIBà C·ßRyBÖtð&å:4&YVòqqX@½?/-«‚Ã>О…ÉŠ(2‰A$pÈuI0Ö•¤ ›§¯WWÔ¨™Šö}ÍhÒöîÆºu% Ñ©›¨äù€óí’Cã¬d±Êh±²êU*hÇ*j ¶°ÊA­ì~µ²Ë‰]Í©NÉLæÒUoûÒñûáp:숗ú´hr1„®²–MCèÖ¾“.) #à–!Í ÊeBÀB µzúÑ1ƒfÙÛ³lŒµE‘QÔ+²G;àêÑY¥ ü‰:J©X‘ç?46_¬SÐÐÆ€U6A I­Hx[›pÐwfMY ¹¦"€Ù1¿®üLŽG€#Ð[#К›¼F-w†Pj•5†ªlÁ^HM* ‹[R—aëß2àt혤œ·èÑeõÍbHqx Æš|¿àIÚzme µ $‡`é3‘üöÎ~0vò|9€%2”ýSª  @ÒV8x•Öh¥,ØÉxÉÞìÌZ²À&qÓ@p…y1ŒV½õ»Æï‹#Àè„Tg$­j”ÓIÜBKChT¶ÈÒI-Sþ·dDZðÒu¦ ¥:ƒ K²®—‡–eûÈ|ŽGàÒˆ þ×V Û\'ÙҴ歷О$ôâ[fó–!Í0)WèTHÌØ;*/\†2ô'n(×r›à^áF¬7o®ýhkßÍ ÖËË«1+Ä;åH¼sP¶ŽRV™J0* ¨©" ¡­P9@;V‰4 l(,ôî`KdaŒ½_P›‚¹0—Æç‹ß%G€#ÀèÔ ìâ?òTn²åh4¶’„æ¼#O(ë[¦.ÃÐÁKi† ºˆuQÂÐI¼Ææ¯‡†ÐÔš;Àfß 86©!Ũc9ðÖ-µ\|¼½ï·ïìwÿä"ˆ×½3!ÿÞË\%‰)ÌÔŸTBUá$U†1 yFÀª‚˜N¦­­N­P¸º¾O Ím;õÌãp.¹ Ï÷Iв“-SF¨' ¸¥ò„š<•¸ˆr9¡ËHÚЋÄÛZ³Âeá"øöú:DâXkë|KÃõéÞ™À„¸MµiQ6”²•©  ÒI• «Ôr€:¯²Äë.Ÿ@ªZa®¦—ùyèý%÷Õâ7ÌàtEúe'A`‘-)#4z¶d’02n©¦cš]B”˺d;—êè2¸—¤_»Gä.ËñNèAÿȵ¥`¸ëíuuÏ/ªÂ.ïL`Jâ¶¶lAï€O´ä«Ëi ¥¨Øª\:mñLR%4ëd».;‚=°*LôëÀªÕ Á±EŒV]ñ±åcr8—j €(€8#Ihô{à–Õ¼eèàM)|è2‰—•6Ôl]Ÿ r£p€Ð®þYptüã¡a¹ð°— Ü=2WA”¬Ny •©, 2‡ƒ(Reê­zU¸’•™4ªVWm¹¬b¿T¿Tü¾9®‹D jR°Ï:“„RIèÆ-¥Ë¸ô„Tâ"H‰ªrÐ%‡FJÖeä UÚÐ`’míŸ ç$OŠñao±¡&Mâ“ ¢—"áŸ@)QÑ+'©  ²Ü+œX%KVj\ˆžV­¨ Öe°Š½ë>°|dŽGàÒŽ¤´nA–m;)Ü²ç ·d‰Ë¤\žÐeÖºhäq®ì–.C´¤$Þ> “r}:D).å¤SdW¡eÿ¤ÊÐšÚ kPHx¬ZÕ\\›RdYà¥ýuâwÏàtuPr™VêE Ð"¾·dÓ±²Ó¸% K–|ì¬ËF¼4ôRE/7†­­ ›! ‡[+B~ ’¤+h¤Ò”¨Nɤ ÿ  Â@Y¦" R•**©RÚ ;VY%«Æ ⶪ>8§OJ6ÏeìêO*Ÿ#Àà  ñqc } pKè2¤žtðJšaQ.‚.-a¨r†z©¢—`víÆ­ÍóbË"¸¾&Ueù,|²C”7JQêO¶UY@E¤Š„²XÌ –-V429@…UT²V­¬^SîOa»@þ"q8 ¶Ü$lÁ±à–(qQª(—´Ì°C—“x­¡¢—`:†I&JtÇàì¥a4„Ši!xkÿ "O2‹R*ãGþ—2èT 6K:VîÞXµ¢.eR±{®.ä§”_‹#Àà¨ÍH\^›¢ã–S—A³KH ¯S.“uQÂнôÌ¡¬{Yf˜fk*Âf—‡|w`¥Y‹"Ÿ…O2Ýgdü\(¥§þtF¥•V¨Œ$[×yÕʺ”µ)#C<犿;ŽGàâE 8%aQM;²·”ž¤ÆØ-]&뢄¡"^ ½Ì¢—•<¤ê—Q3Ë` Ì6õKwd1Dø–ê z€ ™¬¢”‘ñ£iUî¼_d R‚uJ-Vf½ 9@ªeµ)Íln{ñ>¥üÊŽGÀˆ@–/þÆÊR^رGSžpu£MšA-\:t뢄¡QëRÄËkèôËJÍ¡¹ld1L®[d.É1Z² ÜÔ”!…ú’ÏÕÀI±(%£ ø¤ը܌Š*Už¤JÕ«`8èâê”Ê46·åï G€#À耔àê2?vg ·ê%nII¡®*tB—™04 KG/ÀìæF2EðËêò”e!ß–gÒ™=×À'©žð€( ¥HOA©?bTºªÂ–$mE­ ¬ZV˜×ÇŸÏæ¶ÝãSÊgÁàpŒ@P0±È·¼F° p ]b×)—7t©œ¡B/Ž$€Y Lb˜Ê"*°1~ü8–‰FŽGÒAˆB,JB”K)”2éT8 R¤J$ëÄÛÇV-«Ì.÷gp銿"ŽG F >.nD^²Ø¬k´që”+tYÄËŽ^FæPÏRÑd&ü(rüBÈG)> œ¤ÌÏ`Q¢ .¥tF%€ÊEªØxïK«ÅºªØççánø1åSâp8*M™IKä–-pËF¹d•K±.{ÂP9?)ôE/À Á¡$a´i¬E*s÷r=RAÇ'=ãçàR ¥Hû§•“T™Xµ¤*06?™{®øKÁàpz@*Söñcã¸t‘LCå ••†lÂ5JGT@rÀIÕ"RËñWëÍCiE)ÑA¥ô~aQJ–©t ÒIÞï’*ÿâ>þA9ìØ>¥|ŠŽGÀˆ@ÈŸpS¹;8áQ.Ö°/%Öp˜I„s¼Z Æ¢þ¢?ËNJ•n4QImºâRdTA(EÚ?±dö`Œ÷¥€ Xµ°Ò_—β@þp8žô¤økK|ØÇ±lÐ¥±.M¦!”zi™C%”'8qS1›v-ýP"×§C”,MÙPJ*]*Â*zw‹°*ýsÊ}%)\¹êiS>_ŽG€#@€ôàÊÂdìæXnèr/…^†^C0‰a†vƒú½Ì®/•Qtàþ¿“LXRÏ¥Zø$‰”âRN:¥Õ¨@^µ°Â7»49‡ÍmùsÏàpzt @¸õ,…L8¦z ñKN¼|i±&dÄ¥²£L9ŽG B ph ÆÍ̶–B7’ÙðÆ?þW “N8¬þrøý²ô8næO)G€#ÀàÄê@Ü ´ˆÏ †d9' E8þ4(5ŽÉUL‰Äàp8âä¸iYí›ÈPË_û²,?ŽG€#Ð@øpå…-PºJΑŸÂàp8È ‚ˆ…Ïc®ÊŠ+Hæˆs8ŽGàü"¤çH‘Ÿ;93.3ñüN‘ŸÍàp8ФDthˈKa¡Î8ŽG s#YDç‚Öˆ´¸$¶ ìÜ‹ÄGãp8ŠÄ1ªÞ£bÛ€`£®8ŽG  #‰„Q)òê]x†|hŽG€#Àà€Pr‰ŽÖôì¸26·åG€#Àà\°@.ÑD{AkjV\›Û^°‹Ä/Äàp8ˆ& ˆ´&fÆa¦ ÿp8ŽGà"DÒ (b­Ñéq˜fÂ?ŽG€#À¸˜€Œ"2h M‹Ãþáp8ŽÀÅÄTxâf—0Z]ü+ÄgÀàp8*T@X¡ƒ:·ªÙÜ–?"ŽG€#Ð #aäZ˜TRÄæ¶Ýð"ñ)q8ŽEò ˆ,0£“Jø‡#Ààp8Ý:Y°¹m·¾B|rŽG€#Ààp8ŽG€#Ààp8ŽG€#Ààp8ŽG€#Ààp8ŽG€#Ààp8ŽG€#Ààp8ŽG€#Ààp8ŽG€#Ààp8ŽG€#Ààp8ŽG€#Ààp8ŽG€#Ààp8Ý3ÿ?Q $û4)IEND®B`‚fifengine-0.4.2/doc/logo/LICENSE000066400000000000000000000004371341615052600161700ustar00rootroot00000000000000=== FIFE engine logo === Author: Urban Breznik (http://www.urbanbreznik.com/) License : Creative Commons Attribution-Share Alike 3.0 Unported http://creativecommons.org/licenses/by-sa/3.0/ Affected files: docs/logo/*.ai docs/logo/*.jpg docs/logo/*.pdf docs/logo/*.png docs/logo/*.svg fifengine-0.4.2/doc/logo/fife_icon.svg000066400000000000000000000342771341615052600176360ustar00rootroot00000000000000 image/svg+xml fifengine-0.4.2/doc/logo/fife_logo.ai000066400000000000000000012716771341615052600174500ustar00rootroot00000000000000%PDF-1.5 %âãÏÓ 1 0 obj <>/OCGs[17 0 R 20 0 R 23 0 R 26 0 R 29 0 R 32 0 R 44 0 R 47 0 R 93 0 R 121 0 R 150 0 R 153 0 R 156 0 R 159 0 R 162 0 R 165 0 R 177 0 R 180 0 R 226 0 R 254 0 R]>>/Type/Catalog>> endobj 271 0 obj <>stream application/pdf FIFE 2d isometric engine Adobe Illustrator CS3 2008-07-18T16:49:02+02:00 2008-07-18T16:52:21+02:00 2008-07-18T16:52:21+02:00 160 256 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAACgAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FUPeaha2a Brh+IavEUJJp8snCBlyYymI82L6z+Y2m2DCIECdxWOI1kmYDYlYY+TkDx6eOZePRGTjT1QCWRfmb NbsrajbvbQt1lmETR9T9p7d5fT27yUHvXLjoL5NMdaCebKbDzZpd3Gj8uCuAUkBDxkHoQy5hz00g 5UdRE89kRr/mby/5esBqGuahBptizrEtzcyLHGXYEqvJtqkKcx29KdN/ND8utTEh0/zHp90ImiST 0rhG4tPIIogaHq8jBV8TiqHT84fyskultU816Y1y7iJYRcx8i5PEKBXrXbFXP+cP5WR3TWr+a9MW 5RzE0JuY+QcHiVIr1rtirMMVdirsVdirsVdirsVdirsVdirsVdiqTeaoedgkgG8bip9mBH66ZkaY +qnH1A9L5P1+DW/L8KTw3Dsk6hp5WJdmlX4XZn3ZviB6knOwwGMo8uTz+X1ZCCWPR+ddeaSNDMQZ hyhCuH5LUry+GtByBG9PwOWDhJ5M56XhFkvZPyW06+N5eNdu5+ti1YR1ISrvLzbgPh5bCp6+Oart OQFV0tyNETIV5vaPOOgX2uafa2VrdyWardwy3csFzdWcpt1qJVjltJIX5kH4Qx416jOYd6hT5Nls tDGm6TqF7IxvYLt7jUdQvriXhHJGZI1nMvrcWSP+75cCSeQIJqqhfKf5fyaXNb6lqOq6ldatE0xk h/SmpT2BEhdU/wBGup5VNI2H2hs24ptirG7P8vPzMsfMI1W31uCWNJ3kS2utQ1yeEo5I4tbvdtAa K2w4UB6Yq9WxV2KuxV2KuxV2KuxV2KuxV2KuxV2KoXVLZrqwmgX7TL8PzBqP1ZPHLhkCwyRuJDxD zhocUumXGm38RjkE872l4a8H9eZ5RFJWvpyKX4gHZtqGvwjotJmogh0Gqwm7Dx/QPLCnzAsE6kC2 PpcQCzEl2k4qoqWJ59Bm2nIRiZNEskpgRfS35daBNBcNdSQ+ggK8YzQlUSPigZl258mZiASB45zO uzAinbaLDwp7590jXdVsNMg0eaSCWLVLOe7kjkMRFtFJylrRk5DxWu/gc1Ts0BLofms+aPNt5HLI thqGmwwaQPXIVblInDFU5fuzyb7VBiqn5M0/XpfLvkee9juEuLK3J1Nbsstwpe1aMCVZDzLciK13 xVKv8JefX8l3umfWZotTn18XUM31olksWu0kJDhwQqpyb069NqdsVenYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYqlWuaBaapA6ui+oylW5gFHUinFweoOXYcxgfJqy4hL3sP8r/ljpun6ndXaWrQSTP8A vpZGaR6UA4RFyeKUUdP4bZ2fXExAu3FxabflT0KGCKCJYolCRqKBRmsJJNlzgANgvwJdirsVdirs VdirsVdirsVdirsVca0NNz2B2xVT5XFD8CVoKDmaV7/s4q3Wav2VpXryNePj9nr7Yq0GuKbonKhq OZpXsPs4q7lcb/AnanxH/Zfs9u2Ktgz90WlT+0enb9nFWuVxT7CVp05n7Ven2envirdZq/YWlR+0 fs9z9nr7Yq1yuKD4ErQ1+M9e37OKuLXFNkStB+0evf8AZxVus1fsLSp/aP2ex+z19sVa5XFPsJWm 45nr4fZ6Yq3ynr9haVFPiPTv+z27Yq6s9R8C03r8R/2P7PfvirRa4psiVoNuZ69x9npirdZuX2F4 168jXj4049fbFWuVxT7CVoa/Eevb9nFVQVoK7HuBvirsVdirsVdirsVeb+aNT81Xn5gXOgLr3+H/ AC7YaRFrE89nbJLeToZpYp09ab1VjCekp+CIt8XXFUl/IX8zNb86an5gga/fVvLumLbnTdTu7SO0 vZWmeVSJVgb0WC+hsQincVA6Yq9ixV2KuxVi/n7zXfeXNNhubS1Fy0zsjVqeFFLcuIpWgB2rmt7R 1k8IHDXq6lzNHp45SQTyY7+Wn5o3vmrU5LB4VliiRne9VDEKqaFOHJ+lRmPotbmlkEJ0b+f6nJ1u ihjjxB6Vm6dU7FXYqw/8x/O175U05LuG0M8TBjLMo5mMLT4uFV5dRtXpmdotKM0qJpxNVqDjGwS/ 8qvzOk87peFbZkgs+IF2y+n6rMSCAnJ6caeO+T12iGGqPNGm1EpkgiiHoGa5zHYq7FXYq7FXYq7F XYqwj8zfKXljzFZol7qy6BrkEUg0zWI5kiuIklAWVSrMglhk+zJG3wn2NDiqK/LPyf5J8p+X10ny q8M8KFWvLtJElmmlK7PM6d+P2RsANlAGKstxV2KuxVKvMtrol1p31fV5o7eCRwsMskixESkHjwZi PipXbMbVaWOaHDJtw5pY5WEj/L/y55T0FJbbSr+G+v5ecs7pLG7lC+/wRmgUMadOuU6PQjD6ieKf f5N2q1csvkGY5nuI7FXYqkvmqy0G+shZ6tcRW3rcxbvJIqNXjRuIYjl8J+IeHXLcOaWOVhqzYY5B RQHkDQfKOhaWNM8v3MN0YVX6xJHKkrmtSpbgTSu5GT1OplmlckYcEcYoMpzHbnYq7FXYq7FXYq7F XYqxvzP5QGt3UUzNZmNRHHPDd2MF36kSM7tHzl3UFzGw8Cvvsqq+UfKv+H4bkNJayzXb+rcTWtlB Y+pJyb45BD9tuBRKn+WvfFU/xV2KuxVKfMWhtrEFrEJIIxb3AncXFtHdqy+m8bIqyfYJEn2xvSo6 E4qlXlbyTNo1/DfTz2U9wlkbKWS2063s5GrKJRSWL4hGvxUj6VPLrirK8VdirsVY/wCbPLFzraxt bXFrbzwwXEMb3VlDe0M/p7j1acV4xlWUbNXf7IxVb5a8opompajeI1pS+EKhbaxgtHCwRiNRLLF8 UvGnwcvsjYYqyLFXYq7FXYq7FWnUOvE1ofAkH7xQ4q+L/wA8Pzt/NTy9+a3mDR9G8wz2em2c8Ytr ZUhZUDQRuQC6MacmJ3OKsE/6GM/OulP8VXPSn93b9/8Anniqd6R+bP8Azklq9jJqNnrd3+i4jwl1 OdbS2s1cfsNdTpFCGP8ALzqcVU9d/OL/AJyP0Fojq+tX1rFPVra4aG3a3mH80M6RtFKvujEYqlH/ AEMZ+df/AFNVz0p/d2//AFTxVv8A6GN/Oytf8VXHUH+7t+3/ADzxVr/oY386/wDqarnv/uu37/8A PPFV8f8AzkP+eEzenF5nunY0ACxQE/hHgMgObKMDI0Batd/n9+fNnJxuvMV5A9a0eGBf1xZGGSMu RtlPFKH1CkN/0MZ+df8A1NVz3H93b9/+eeTa3f8AQxn51/8AU1XPb/ddv2/554q3/wBDG/nX/wBT Vcda/wB3b9/+eeKtx/8AOQ/53yEJH5ounY7ACKAn/k3lmPFOZqIJQSBzXz/85CfnnA5SfzNdxPtV WhgU7exiw5MM4fUCERkDyUv+hjfzr/6mq57/AO67fv8A888qZMx/J788PzW138zfLuj6t5iuLrTb 26WG6t2SFQ6FSackRWHTqDir7bxV2KuxV2Kvz2/5yR/8nb5p/wCM8P8A1DRYq80xVn/lqzn84+Wd I8q2jpLq2jahd3cGmu3CS6tb1Lb1I7YmgeSJrV3MdQxDfByNRirIv+ciPMHkt7/TvKfkyGC30XQp J5HiteJi9eeOCNgZFLeq6/V/ifk25pyJrirx7FXYq7FWXflfrOl6X5oik1OQw20qMgnXrHIQfTf6 G6+2a/tLDKeL07kOw7PzCEyD1Tz809ftbyzgtXvvr+peqzSSD7KQD7A37nrmN2ZgIkTXDH9Ll9p5 o8PAObzXNy6R2KuxVl/5aazpema3K1/O9oZoGjtL6P7UE5IKybb0+Hi1N6E9embjsnOIkwPVwdfi lKGzXn3Wk1GS39S8a/v92u7lzyIPRUDdwq0y7tjPGhjHMGyw0OIizVDoxHNC7F6B+QP/AJOTyn/z HL/xFsVfopirsVdirsVfnt/zkj/5O3zT/wAZ4f8AqGixV5pirMPJflnRdTsZrzUF1PlbyM5l0+ON 0SCAIZGYua8+UqBabb7kYqhvPHl/Q9Jk09tHe8eG6gDzi+RUdJqKxjHBQrBVdfiBNa4qxjFXYq7F WQ+StC07WNQuotQS8e2trY3Dmx9EyKBLGjOwmKgqqyE0G5NPc4qm/nLyj5f0jRpLiy/SaanbX4sr yG+W29JVMchBDQuzcy8LbUoAOtcVYPirsVdirK/I/lS08wfWEmivZphPbW9utl6FAZ/VZi/rMvRY TxC9e5GKqvnXyromkaRpV/pw1BX1Brj1FvxbhOEUpSMxNCzFiQp51Aodt+uKsPxV6B+QP/k5PKf/ ADHL/wARbFX6KYq7FXYq07FVqFLH+UUr+JAxV8k/nH/zjb+Z/mv8y9c8waRb2radfyxvbtLcojlU hSMkrQ03Q4qwz/oUT85f+WWx/wCktP6Yqvi/5xL/ADsir6UNpHUEHjeKNm6jYe2KtN/ziP8AnQ9O dvZNTYVvFP8ADFVv/Qon5y/8stj/ANJaf0xV3/Qof5y/8stj/wBJaf0xV3/Qof5y/wDLLY/9Jaf0 xV3/AEKJ+cv/ACy2P/SWn9MVbb/nEX852Ys1vZMzGrMbtCST3O2Ktf8AQon5y/8ALLY/9Jaf0xV3 /Qon5y/8stj/ANJaf0xV3/Qof5y/8stj/wBJaf0xVw/5xF/OdSGFtZAjcEXaVB+7FXf9Ch/nL/yy 2P8A0lp/TFXf9Ch/nL/yy2P/AElp/TFWV/lV/wA40fmn5Z/MPQdf1O1tRYadcia49K5R34hSPhXa p3xV9f4q7FXYq7FXYq07pGjSSMERAWd2NAANySTirD3/ADi/K9L02beZbHmriJ5xJW2WQ7+m10B9 XV9vsl64qyhdU0xkSRbuEpIgljcSIQyNuHBrup8cVVILq1n5ehMkvGnLgwalelaHviqrirsVQD+Y NDS6Fo99ALg0HpF1rU7j9WWDDOrph4sbq0TJfWUZAkuI0JXmAzqKr/NuemVs24Ly0uCRBPHKV+0E ZWpXxocVVcVWySxxIXkcIi9WYgAfScjKYiLJoJAJ2CX2vmby/d3L21tqEEs6GjRq4rWtP15jQ12G RoSF/jl3t0tNkAsxKKbUdPRmV7mJWU8WUuoIbwIr1zLaFWGeCdPUhkWVOnJCGFR7jFV+KuxV2Kux V2KuxVD6jY2+oafc2FwOVvdxPBMvikilGH3HFXy95y1Dz43lvyp+TegWM9jr9sn1TXrOOBFhvLS2 SNY7uK4I9P0JSGaRuQPKqtvsVXtSflytta6VYDSNJv7Wws7DTpJ7lZPrLW9sY45VrTiU9PmwQmha lRiqc+T/AC3caPPfTTWOn2TXqwGQacZgrSxeopqknwoqxlAvEeNegxVk2KuZQylTuCKEYq+dvNn5 Y+cLnztb2OnzXUOm3jyS3kcbkW/EMTUGooH5DkNtwe2dNg12MYrNWHRz0s+MiufXuereYfJb6hcq /wCi9Nvoja21nNLdNMtwYopJHljUpRQlXVgK/Ea8ui5zcjZJd3EUKRHk3yf+gtQ1C7FhYWLX6QCU ae9xwZ4lpQRSn0o0XcIEXpkUsrxVK/NGlSat5fv9Ojp6tzCyRljQcu2+YutwHLiMRz/UbbtPk4Ji ReM+S/InmKTz4Dc/WBpemSK5jnJCqaE0r+1tsPpzm9LgOSQjw0QRxfjzd7qdTAYrB3I2ehTeR5JN XhupNE0WSNb57ySdxM8xaS4nLyuGHGSQW5i4cqhHLcaKFzrnnE48i+XG8u+X4tL+rW9osTc1t7SW 4miUuqtJxa5LSbyl6e1O9cVZBirsVdirsVad0ReTsFUdSTQb7YqgLvzDoFnMYLvU7S3nX7UUs8aO K/5LMDiqj/i7yp/1erD/AKSYf+asVa/xZ5S5cv0zYcqU5fWYa0Pb7WKt/wCLvKn/AFerD/pJh/5q xV3+LvKn/V6sP+kmH/mrFXf4u8qf9Xqw/wCkmH/mrFXf4u8qf9Xqw/6SYf8AmrFXf4u8p9f01Yf9 JMP/ADVirv8AF3lT/q9WH/STD/zVirv8XeVP+r1Yf9JMP/NWKu/xd5U/6vVh/wBJMP8AzVirv8Xe VP8Aq9WH/STD/wA1Yq7/ABb5T/6vVhvv/vTD/wA1Yq7/ABd5U/6vVh/0kw/81Yq7/F3lT/q9WH/S TD/zViqrbeZPLt1KIrbVLOeUgkRxzxO1B1NFYnFUxxV2KuxV2KvhX/nLz/yctz/zA2n/ABE4q8Vx V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KvYP+cT/APyduj/8YLz/AKhpMVfemKuxV2KuxV8K/wDO Xn/k5bn/AJgbT/iJxV5BpMFlPqtlBfSNDZSzxJdTJTkkTOA7LXaoWpxV7D5Z/LvSfMHnTXvKum+V IjpXlp7hNX1O51KdNQUW0jRmRZFX6vyYxtxQWZG/xHoQqg7L8t/yvU6mdSuvMfoWOoajEt7ZWPr2 xs7Bm4s0yxlfWeNGc/sKAeRWm5AYkljv5oeTfKXl610eXQJNXM16bldQttYtXtngeL0jHGrekkUj cJav6buBt2IqkLE2wHAybFK79MIq91ehw/l/oSaNaNdTXh1TUIkntGijQ2/BlY8SeVTQr8TbUodj nSx7KxEV9t7/AKnVT10xI0BQQnlbyp5PvdPEuszawk6308M0un2X1i2S0t4o2Z/U6mYvLTh0AoWI qK89mgIzMRyBdnE2AVLz55Y8paTp+m3WgXOpyyXLzpewanatbNCY2pGoYL6TsRXlwkbidvfKmTC8 VRujWKX+qW1k7+mtxII+e23I0rvlWaZhAyHRu0+MTmInq9E80flp5e0/TLn6m92t/psRkvTMqiMg GlRQmnTpv881Gm7QySkL4eGXJ2+bs/GIE9yF03yd+XjaU13qE/mFJobGGeX0bBTC9zJEs8yxyOQB DDFNGzO9CQwKhgV5bx0THPzB0HQ9C8yzWGh3F3daaqKYri/t5LSdmFVlDQyJGV4SKy9+njsFWef8 4n/+Tt0f/jBef9Q0mKvvTFXYq7FXYq+Ff+cvP/Jy3P8AzA2n/ETirxXFXpGk/nXrGl6LfrZ2UUPm jUUS3uvMSMyvLAvI8pYB+7e4BbaY/NgXAcKsKt/M3mO2tZLSDVLuO0lWVZbZZ5BEwnRkl5JXieay MG23qcbRSnqeva5qvD9Kajc3/plmj+tTSTcWcKrFeZahYRqD8h4YrSAxS7FU8g85eYIdLTTUuW+r wh1gruY1k+2qE9A2bKHamSOPh697iz0eOUuIhAWutaxaRGG1vp4IWLloo5XVCZAA5Kg0PIItfGg8 M1pLlLLzVdUvVRLy8nuVQsyLNI8gVnNWIDE0LHriqFxVdHI8UiyRsVdCCrDqCMBFiimMiDYZHrX5 geYtX08WV3PVGVVuHH2peGy8jmHh0GPHLiA/Y5mbXTnHh+fmlK69ri27Ww1C5Fu6GNofVfgUKJEV 41pQxwon+qoHQZmuEoXt/fX07XF9cy3Vw1S007tI5LMWNWYk7sxPzxV6x/zif/5O3R/+MF5/1DSY q+9MVdirsVdir4W/5y6+P85briR8Njag7gUISvf2OKvF/TbxXt+0vf6cVd6TVpVetPtL2+nFWuDU rUdK9R/XFW/SatKr1p9pf64q7028R3P2h2+nFXem3ivb9pe/04q70mrSq9SPtL2+nFWvTalajpX7 Q/rirfpNWlV60+0v9cVd6beI6E/aHb6cVd6TeK9v2l7/AE4q702rSq9x9pe304q16bUrUdAftDv9 OKt+k1aVXrT7S/PxxV6h/wA406zpWifnBo99qt1HaWhS4i9aQ7epNC0ca7V3Z2AGKv0BBqK+OKux V2KuxV8T/wDOX9gr/m0kiKFMmmWxkIABZg8q1PiaADFXiH6OfFXfo58Vd+jnxV36OfFXfo58Vd+j nxV36OfFUXqXl+SxuFgLh2MaO1OxdQSv0YqhP0c+Ku/Rz4q79HPirv0c+Ku/Rz4q79HPiqa+VdPY eaNHPhfWx/5LLir9MsVdirsVdir5h/5yP/L7zdr/AOYMd9pOjXd/aiwhiM9vC0ic1eQlagdRyGKv LP8AlTn5jf8AUsaj/wBI0n9MCu/5U5+Y3/Usaj/0jSf0xV3/ACpz8xv+pY1H/pGk/pirv+VOfmN/ 1LGo/wDSNJ/TFXf8qc/Mb/qWNR/6RpP6Yq7/AJU5+Y3/AFLGo/8ASNJ/TFVZPyo/NCNAieXdTVR0 At5KfqwqtuPyk/My4k9Sby3qTvQCptn6D6MCqf8Aypz8xv8AqWNR/wCkaT+mKu/5U5+Y3/Usaj/0 jSf0xV3/ACpz8xv+pY1H/pGk/pirv+VOfmN/1LGo/wDSNJ/TFXf8qc/Mb/qWNR/6RpP6Yq7/AJU5 +Y3/AFLGo/8ASNJ/TFUfoH5RfmDBr2mzS+W9QSKK6hd3a3cBVWRSSTTtir7iwq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FX/2Q== uuid:DA67F312D854DD118B9382D307AB9C37 uuid:3c061617-c783-4f02-9e0b-953e3698edb6 uuid:D967F312D854DD118B9382D307AB9C37 uuid:A4C7FA12B754DD118B9382D307AB9C37 3 1 False False 29.999999 45.000001 Centimeters MyriadPro-Light Myriad Pro Light Open Type OTF 1.006;PS 001.000;Core 1.0.23;hotunix 1.28 False MyriadPro-Light.otf MyriadPro-Bold Myriad Pro Bold Open Type Version 2.007;PS 002.000;Core 1.0.38;makeotf.lib1.7.9032 False MyriadPro-Bold.otf MyriadPro-Regular Myriad Pro Regular Open Type Version 2.007;PS 002.000;Core 1.0.38;makeotf.lib1.7.9032 False MyriadPro-Regular.otf Cyan Magenta Yellow Black Default Swatch Group 0 R=46 G=49 B=146 RGB PROCESS 46 49 146 R=4 G=3 B=105 1 RGB PROCESS 4 3 105 R=24 G=103 B=195 1 RGB PROCESS 24 103 195 R=144 G=211 B=255 1 RGB PROCESS 144 211 255 R=175 G=238 B=255 1 RGB PROCESS 175 238 255 R=154 G=195 B=233 1 RGB PROCESS 154 195 233 R=120 G=25 B=15 1 RGB PROCESS 120 25 15 R=4 G=3 B=105 2 RGB PROCESS 4 3 105 R=24 G=103 B=195 2 RGB PROCESS 24 103 195 R=19 G=76 B=171 1 RGB PROCESS 19 76 171 Document endstream endobj 2 0 obj <> endobj 17 0 obj <> endobj 20 0 obj <> endobj 23 0 obj <> endobj 26 0 obj <> endobj 29 0 obj <> endobj 32 0 obj <> endobj 44 0 obj <> endobj 47 0 obj <> endobj 93 0 obj <> endobj 121 0 obj <> endobj 150 0 obj <> endobj 153 0 obj <> endobj 156 0 obj <> endobj 159 0 obj <> endobj 162 0 obj <> endobj 165 0 obj <> endobj 177 0 obj <> endobj 180 0 obj <> endobj 226 0 obj <> endobj 254 0 obj <> endobj 255 0 obj [/View/Design] endobj 256 0 obj <>>> endobj 227 0 obj [/View/Design] endobj 228 0 obj <>>> endobj 181 0 obj [/View/Design] endobj 182 0 obj <>>> endobj 178 0 obj [/View/Design] endobj 179 0 obj <>>> endobj 166 0 obj [/View/Design] endobj 167 0 obj <>>> endobj 163 0 obj [/View/Design] endobj 164 0 obj <>>> endobj 160 0 obj [/View/Design] endobj 161 0 obj <>>> endobj 157 0 obj [/View/Design] endobj 158 0 obj <>>> endobj 154 0 obj [/View/Design] endobj 155 0 obj <>>> endobj 151 0 obj [/View/Design] endobj 152 0 obj <>>> endobj 122 0 obj [/View/Design] endobj 123 0 obj <>>> endobj 94 0 obj [/View/Design] endobj 95 0 obj <>>> endobj 48 0 obj [/View/Design] endobj 49 0 obj <>>> endobj 45 0 obj [/View/Design] endobj 46 0 obj <>>> endobj 33 0 obj [/View/Design] endobj 34 0 obj <>>> endobj 30 0 obj [/View/Design] endobj 31 0 obj <>>> endobj 27 0 obj [/View/Design] endobj 28 0 obj <>>> endobj 24 0 obj [/View/Design] endobj 25 0 obj <>>> endobj 21 0 obj [/View/Design] endobj 22 0 obj <>>> endobj 18 0 obj [/View/Design] endobj 19 0 obj <>>> endobj 149 0 obj [254 0 R 226 0 R 180 0 R 177 0 R 165 0 R 162 0 R 159 0 R 156 0 R 153 0 R 150 0 R] endobj 5 0 obj <>/ArtBox[0.0 0.0 850.394 1226.66]/MediaBox[0.0 0.0 850.394 1275.59]/Thumb 270 0 R/TrimBox[0.0 0.0 850.394 1275.59]/Resources<>/Shading<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text]/Properties<>/ExtGState<>>>/Type/Page/LastModified(D:20080718165220+02'00')>> endobj 263 0 obj <>stream H‰ÜWK®$·Ü¿SÔº“n5’½ŒÖ¾ay# ã¹?àˆ$‹Ìêê¬ÑÎô¦3X$ƒdF~Þÿña{ÿñƒÛ¾ûþÃööÃøóÞ!¹Bþ …+¯PêЗ7·‰/iOM¶šÜZÜnùÏ¿Þþ¹ý†¯Þÿþ“Ûþýõíýo¿ºíûßß>žË×õK‡>~ËÒw8aþ ž`ñ –ž`¹cßÞ?»ÝÜ.•šÇßT¶}½ÿÆÂ_6Ùþœ¥î­ÊÖÄï©Ö¶Ý}ãȯo7·;ÇÏ>¿á›špLó^3 ^d/iuQ|zû…$çF©¦=Š<Ýé2ùvÝàv!±ø=îRÁÉsØJu{õx—µ—´¶‡,XYÒ.Nw{À<ÇF9ìÉóƒ>n‡ÏȳóN–ÝùVŸø6OÌý‚Û½®uþ–Û´ww@¡¥ÝW¹Þçè¯øýæ²çfWþ}s«ÇÚõ蔺¶Ût¹íë§í‡Ÿ7ÊÏm)xD\4\ÒûPno>AEÅéƒtîëZ#¯Õ¿Õñ´÷ZCÄ´X½:ížsÑk¾ çg¬M¼{‹Ð~ ¼Ó²§Ìïs„«a4 V^Ä68;|(\}7å¥#q/.(ÒZ#ï/ ðи…'úhx\çåɆNOõ¸€nZͦ˜´Æo1\sÛšË{Š òVb`“²g¥fáŽoˆ@QµlµTÄKýfÌ‚£Â I!âMsjæ›Oƃ<:ùŒGã nÆKùèù²²§\C©¦‰ñ¡/†/žËž€^$xü[U%“]ƒsQv² y}óéäß^ö˜“« n~ºr‘‘0P‰“œ?“KáÌcx ®°_/#O&. rŠÐ«úeBâ ÎÒ€¤rx—VáRï+ÐËžR>ÿ^ߨ"%G ©Pjò)´×ŒÁT ;Ãøáó—ªô"$#5Ù#È<¦=ÂM2n ‚Ç­AÄ`§3?Çݲ†oܳ ÁkÏט ì d*ÃG¬v‡—:¢Ù†Ÿ#râ È=Z¨P Â+Ä2>Ã)óªÐcJ@Ò© B`̨–Оû†MpAÆ"5ˆ}-¶XÌÑÉâ@ãûƒÃ>8DLåEôû3èVÂù" ƒct2@°(tÈÓ= s|Rð«…ó5È™R<7Ÿ$ô›ÅbO n—Êks|²ˆ¢àÄâDâ+Hé¯ w‰yŠpè2=ãoï»@zT!à‘lh#i¨ Áh@M}˜Dï:*!@‰qȘf@î ™k›6¿Ç¥´2‘ÏÁ©“WdмΜ€º¬AHg Ï/ÔÄ•«é³ÚÐs·QÜu=A‘1#£æ£Š@íèú‚EJÄKQ¤Åþ…Hgéj>Ù^Ž=ˆð9|óƒæðdºfP3ñuS¡]ôú™u¤µ~ÐQ»ñ=P†û®W•ÝBúåUgçxM2Çšú¦!™]õÑSž¼§8h[›»kR6U†&~¼†³Õ b*ê+×+þlHÌA«›8[úô«ý)¬b/ZN'› |Ø7EÝBB‚Å€Ë'†Íº¶k\þEÿ-̉£ÊˆBŠå"¨ª¾¢!¨p¸* žßSÐ{z¼0) —ð¢¶Ë´ù T˜h@¾ë¢ÅEJý"IU;ǦvˆyÚœá™\&òÙ xªL/ÀЧdbe®ÍÔ¦¦Ô<櫦ˆD?%EÓ§:%EÛål$…H»×¦¤h—’§¤¬Ý%u KRQßäšµ,ßÅ®âšõn¯áxº¿žC–<`—“¢pQ>[AˆÙÎÀVEÌŠ/N[âÍ%RÝ'ée/A¡N7QïÆ ~8·æ2t <'jŒªŽ¶€‚ÞfЋɈ…jæŽnÞuu©mÇž:ŽÙÓäê÷7H­›ØbWwú´f÷1>¸õÙ'î÷sôˆiÏ,™þtøGó[H:ðHB‘Ž-_gäñÁJÉ('œŠn¦ä‰Œ”œð`@zJ†Y$Ù” UÿÊɰƒÔ•”aK\)ø®IIÉ&å‰Ì<™^‘#`$ºsz|ž$чd…Ú±ÙÄ›’xmm…ô|õB€äWJ]!ÄØ#„ Ä„ƒ¨¹f­K­ì4Ï!„\0Š×ƒ˜ˆÛÆ”þ&ÚǬ(Ä„v´Qv>G>üHÜWwŒÅ{ÙÏÒ2“ƒÇó44¡F£+§ò`'ëÕ¥q›Æ®èΚJŠ3œ¤H—ÓÐ- 5óZÞì’Y¶‚FŽÚ8Q‹€DÌñ5ƒWˆf…Ç”A^ .Ïp¡À–O›q¹§È´d…îͯ+U­×Q»'áJNëx‰Ô±¼Ætr^“¯èIn„øâåàhC\b«æIXÊæ~99°?J<ƸUßX?A¯ár^þ|Bße¯" 8Ò™7>OzÑvÍÁ£ß¡9<ö;¦û\ O僥?j>‘³÷Æó´ù\£‹Ä@ž7Ÿkø  H>µµ×ͧ`g¨èù%ÌÁ¹?SüëžoÏíñ ÷—ŸD¸hJ¯ÚÎ5<@])§×æøä¤Wþ/I4êè¡þ&}ñ™½à­Øä5ž»Xã¤.¤l3€˜Vâ‚éóÊ[»g“¶*’­‹&kMàHQ“ߪ²ÍK';”iÓŠ3]ÁòͼFC˜úÇέr.^ÇhOUˆ™ fò«Ö5fÏSXiÊ< — «Îåv©šlA:¥Ít¢äW¶á¹›MP¼\1é‰w/ àˬ6TÛ ›šø®ye¦ñêUc>ËK(ñà†õ ¾WýâéçŸéÿb¹‡Žg½xÓ/¬~QWdõ‹`¿H;i5ÜûEÚAË¿£_$"£ƒd¿ÈMš_Ý í’¼é|B^ÈgƒŒöp1½C*œâ²<Áî ®S¦|Ô>PýAì™ ¢ÝB—í8úî!"£3 †hJSDÖî*:%#‹ð tɶz3Ú¬1–s)Cjô~=È(ê© Ñº 1ñ®r.FNDj¶sâIž´}k§]ym†Vw‹E{ÙKTâƒoÚ3Ši…Ín±]£EØøÑ.z=ÚrAiuµRËv¼gˆcú²{kgö~vÄj»vŽ–€Ž/~}úùçÞQ!´üJ"\øI(™©÷ø`æ^VQåw$ß…ôìK;øv¤_šâ½É¿\³^’ ˜vñ«/¤LŸÈˆ=9˜¼#ç.¦Wä‘òð@3–Dã׌%´S¶±H¶±v´±¶âˆ%‘¬`Q×´‚‰±G0ˆ &QUrͶ¡v‚6&…â¿kè—´84jH.NÉNé.q…@Ó ŠnJ¡<´EÎ757ü×ïÿý O ˆˆ„ÊN÷?^ßE)iÙØ†0°"Îû÷_ûçoùñßßÿøõ±Ç§PÐÜ8jWaÎB94½Ý¦4RlŽw$¯òÂ{)2yGGü¸Ÿa9VM\™>r’èœ+—s QòÏ‘³^í¶C`¨s Ö§ÆæAoŽ­Uä]"]JqŽ×Ù‹ÄÁòØÆöñuÿžsp‡š%# 'Ëó:CÏ!´þ¥Ç!ò%Ìz õÑ.·eêÐiÔå¿ëñ.9K Iø1X ¤2ØÏO7‹‡G]þF¼~á/r#5D6ƒ¥âØšUŠ^0¾¹‹u²“ww'{†w'Ûò…éîdÓieÏ„ÝÊÊ ÝìÝÊ6Ø" €÷b˜gԜؖíÄš¿]°áíB£ü¥pY>èüË\mDª\÷p<°Qó ãB«×58lü¸€ÒÏÔð×o'*RÚÝ‚N9NìQó´ÒþÀ…=l€Ù(z®ýÕtôtëšìtÍž`ºÉ nu²Æ SÕ†Ú¶ªQ6­NÔÐÀnu‹âRd!N=9Q#`–>œ¦1Ã0ÇÉwËR0¢ô_ Gã(LÕ$ qéÙIZr­&iˆã(&iˆYR¤a8ECˆ¨4EãñT4Ûr·ðdºd:í‘nZŠS´$©¦>ô í4?ÄÒ|{ÄCœ¢¡%;‹¾Y·&5õkW¼úÒMÓ/ Šã¶Á£hœ~Yúÿ¯Oèþçô åçú¦¼”·t‚‘¡<¥ã;PÉ1ÂtA×CŠ@à‹â ×Àqp åS¿ÈŠªQŒ  Gî†9©XšY>ÍÜ4,/_ñÊ~J{1Äý~¸“ɤ¸¸\¢!Äl¹Ô"Y"Z. Õå-EÄ’©i‘–LÏdÚ–“LÞÂÛ×5Û Zâ’ kZÆJ7¾$K ✳K&^U¯Ù%$TÿÍ@‚·æ@øÕkWª q~Í8~|Ò©¥î)¡—Òm-hàc¡c¢Û}¿,½¡Dåz™Õg§nдVØøXp~~07x~ó–ØûÃ/€ä7úÆÎ?þÍÏïÃ(UË5(§C®I@ü£Áâªð?n‰OÀ@e…4Ô»PycNõb ¦Õ{„°EÔlïÅ0'Ψ9a–åÄš¿]ØÃæSœ«˜:ÿò€yê}Ç52î¶Ö—kp.ìqçBŸï¯!ÞNhÔtÊqbš¬ÔàÂ>dáz—×þZ`£ÖÀojÎ&tÊߤo‹6CÔÐ^p…" ˆâBìžÒ…§˜à|´PÔ—:1ÕqZ;?5ýP¶áóªê’Oç廥 -Óúˆñb‘3GqªŠSè³8ô5úÜT'°šÎ MÆ…û(ëµàïhó(ÛRôpº$ú>â4æž .ÂRÊò2AaT=ñœQPìˆe=qx¾ y[fÁÉ΢¯Ä­‰g…Žð»âyôæÖ szÁyª)æ\ƒ „´Ïz‹ò§¤ôWÚ£rµGå'Û#$½”·„‚q¡L5ÇW¤’%"„ ÂÊé² ýY&Q£¼*¦r&®BKV\ØnŨ0gÜm¤œï†9¹ZšY>…·¨õlûùfØéÃo’~sY¢=âƒ8î¢Ä'..Ÿh1[>µH²ˆ–OÄ'Ÿhá¯PM•ذ„òx&”Y,¡ŽeƦ®Ù,r YÓOhÓ2VÆUUYM?ÜÉAœsv ÅËê5»„⣄ê¿HÒâÖˆÁzíJm!Ç­æõÆ>¥Zêï!þRÚñ­u ´-t /Måò±8D<ôvp÷ ®˜{1üÔ=š3c,Åó&“‚”MU~œLâ+ü+tR/:É?I'PtåN¬>ïq+ÏÔ ¢9¸ê³7°@×X¬@çÐ]…V)¢Uhî1b´LÜŠ+Э€~JwúXvA6Gß Æø&œ°-q>) #Ç'Ä%zB¥{Ba{⠸܄ m„[<„âð"”m9„b–•š\³[âÕ›O¨Ó’Ë}žÃó Îíùå©—%Ž=æõuÏ'x´ Ž£€S¿+>4skÇÅvڰ瓨íTœhCð÷É6ˆ7¬ecü"¹©`¼Ó[§°Çôó/™"Â4¦Þû„øäãràô gt{p,Ë…»O°áíAdïB=³\xk"ûÏôÅØ mŸp™¯à¶_ö{œߟÿÞ½T¼»»ÿ»A8Ãæ@Iдõkö¸¹€¶%åú>t0Ò`Ø@]@?+GA{™²Ç(]´ª†Òä6ä<€½-±Þ;¡È Jþ0”:y ƒÅ“LØ—ƒ„)Ÿß:’)3|Cb—ðy|ÅìÑç%ÔÛÛ1Nù5PÞ€Òþ|ŒéÀRk -  t 9FFˆou—ôt0HšÞå®ã5‰Â ³ƒRÆœ®Ü~Kêý1p·¦Uv+¢»ñêÓô,¨°Á^uyž’ùyl6D êŇƒ?‰S<¾K²ÅøllãÖV|T•3Ó‘ýäÓK‡xˆWõÝ)÷¾/<ý´ú¿~þˆúÿÉr‘nEYÙ%Kròß&Ì`$d¼ .¹q¥þbaí"®,'²âœæxFæ>õ ¦?-5‹›PöÈ%â†SlüTâÉr,ŸÇÒqÂÔÕ²]}·ìDáWAâÿ¨¯–Én¸¯Sä²G”¨ßÖÀ`à…½OÀãEµ7}`"¨_V¦ÑƒY èzdRbH"ƒä³&Å­ÜX_éÂ˦¼ö°ô¡¦Å“@”!Œ ¢¬5¹¢&¶B¥éÎ!/$ÚšE^3}ÆžvøRÎ6¯Žè¦\gž1øíÚvjðÔ¢Õå杖겉šVüštÉNʱwç“ïî ͰXˆxrJb¼p›µÿâú‰œçÔ€‘æ»Ó¨ k}EZî(½mùa>r/‹Q æK^Ãël€ü¬ÞÅIJ8¨Ç×S\ût3A«ÿït¢¸Òt²kï6ØÅ—-¦èª¯×°üRN±ïúKOà 0wí’w¦\cÞ%–rÎGæ 0PI®ͬºêÅæe†ÄgMJ‡MÔÅ7ïšr.žM )žM «gåÓªghB“C'Ê•ùЉ“',Í¡§™NÙ$íÜ…œ¤žÔf–ÚI}Cû¡Èž^Æ“héžN )žN ·ê(ŠÏê<æQ46¢ ð_VhÁp¶)¼“†"t2 d CxwY•0_YºÄ–F´JA¬÷‘ ´½+þù1µFo1ÂÞùÍɦôsˆ=~wfT´ þÜŠ{„—Ö¦FP@ï`‹` ‡»'ü òÊ€ä Dq &è—s”ððrïßôg_âìñ:‚‚ÙÝ~<þò‹È"ÌŽÒ1ñhöY³uYlKºÝEAÉÈËñ9²¢;å;GN Õ2w¬¾³ä:J_$þmÎú·ITCcs˜=,ðܽ[Ú6P¥ld¬…Ú¿ÍÈ¿žÅ•…¿ô‚κé ì’‹åÓÒ(‹mÕ½£Dð˜A¼¼äÎ;î¯<áVÍmõÅÙ<ÓÙ·ÂÂÎÿuð÷“_Ä*WQZTñáS…5‘mF”ËFs?'hW:"ûÌÚ;£Ý̼ÝÏO¨ ¦ †ü~k qá]–.±‘m²,d,Cƒ&y@Mï“x¥"|Ryã0åŠÞ ˜¾:\TÄÁæl`N‹s:ÖðèQQñÛMᣡÿHí#BMqUÍb·-¸#eOžøJŠ(®¨IÇF¥[G±öq«à¡×‘ ¿ÝðŠýï,ĉ$Z9d y.L4ªlqº” vè_~¿ýã×?ÓíÇŸ·þ~›'Þ€ž…žQy‚å]V3ªU0ˆ€[–GÍ,w]¸Å DCL»Ï0Á!ÝÑñ)ú‚’RÀN¯à:ÛÆd瀡›ÄWWªEƸªZMÓ¬éÒ ýÎHloîh‘·ˆÚxý>6t˜jîùEDþmE:nÄ fÓè°nÍ<4•³b~ƒ•Í B,´Šä® ­†ê?§Aq&6k5DÑñð1–\Þ£EjÄŠÀ†Ó–Gý¹o Ú¢ÀH‚Ú‚Ý^404"SH ˜¬Ÿ3ÃÑ÷Íí›J´Ó(Jñ]0Æ…|cZlÅ6hÆ\X‚: 8“³#òqõÈQD4Š[ç’?>Л~‹å‚tPÌŸŠ¥˜ –ý°~Þ îž)0! û ‚Š&’”õî"ÖïC›”þtÉ¡ØFE9`”ù›¨YÄ„cÚl Û`É(”1ä÷@ŽÁ‚(í!þ £_ië²9ÓÞ!`€²È˜¿ƒ˜ú¸t‰%‡T¥åI£LÈQÕäÄÂÇ{X¼ÕBM³"KžÉ 夺e®È6s,ͧÓÃñé°~Õ ²ÎU©¥g“Cr“c¿‰‹ˆ M …Ú„b²Ÿ¥müŽë~Xjh­,äb㊗^fù+LcµÌ¨{k*8q8QR9ïR‡S2¾'L»vhÈ;ã cE•!³9Xòx{¸©ù4¢=>kð7ŠÛ;_^ñøI®ö„»]NöÁÖËÁF‚‰ñLy?‚íê s«[ÌÔk£•ù~ÑT>gU“ÐjS0Ð&=l{‹¶õóô¶×™»?>¼&åÙ`Ö€å`ˆ\0ܯŸ¸±ü ÿqe »I¬Â¼d‘|X$ÿ‹$+$îó§ÙDþG6Éhh…í„g“æjô6Ø5:ϽNöÖhÊÖ¿ÍMYjt5š»v[³FS®VõF¦œÅ×h6 ÍrtÕè£Yù`ýªYäÁU9˳FŽ e]±„59úmÍÐ$)Ò åYÔÉ&9 *õÐ ‹.H'”s:%Ú˃N¶fÓÉÑŒ¼´=OÚRìâ+4AI=ÚŽ!‡(—ìÈ„w¥â 45‹ l‰k»÷–|Wõlb/Nã°#c¡Þ²gxaø£ ÜévûñøË%\ÂÜ[seòà†Ð‚º„CËÇ&bô¸»„ÀjroìkÕèFØD}.û»pX-´©Ýaq\º£€ii"á' Ÿ\¾¤1‚%¡¯ËÝ2vjîDª0jtÁIK5ˆwf[(˜¤Ê ¯yë+ŸÁˆ‚Èe‡áXœã¥Ùà†Îu˜/ñ´$+DѾ!ŠÁ!#bϼ›„[JH l«©Z´¡Â[á+ätör 13 ²æ§‰µY&µÀÇ¿»“ÇÊI¿")$Sí ¨é2 ÆÌ›äE¡:¶ÄÉd;—„¶¢Š¡¯V9VˆàšÚž †[Á©¢ôˆñË}†P»D1¤“"ìž6B½ dôöH[ÒŸ„SpçØ˜p*Ò•cžÀ’ ñ´‰×Pª1ÏaÔFiXˆ¡ RsZ¯ßÎ&!bº&‚ É tFüØ1Ã;d"lŒØÊÃ^ªu8D&špÉoaß9t؃@î€QðêWé¿ ê¼+€—D”2âî l䤄ÜBƒ´pßÔ3±F43f`-`‰÷àl›F½-È¢LÐ<Þ])èBC¬ñb –Êmž© qà¨)Ï4nà?«wÔ °Öüñ‘f-&ÔLq`œÅ³U Ì\tÀl‹ &GöðÌ\r“ÙøÿÍŃ …­WKÏ÷¢ʶ8Pùh1rî”å¡”Œ hâ°˜Q;XœÅƒªoýĘtÀ‹ ¦–q½‚i0lÞ;/a8‚v1í°MBãu-`¦AèéÛxzvÞIQr(½¨—cfjmˆ‰ ¢®÷DE0–STD¡4• s2ÅeB+[Æ]¥oͧӀKÏs:x_©@ˆ:f´>ò¬Jc¯¡¢"ZA ¢GS,¹@!ÒÔöMP„6÷èØLKBY7?è˜ÜX„É4Ä¡êœÝ ø÷U’$¹ïzE ˰ƒ|O]KºÌÿÍÆ=€XÈd¶4ÇÑ¥*É%ÄâNZ€?niÉš$ê²ÄíÏ:ú”iGc£t¡›Éæ}½-ØÃÒppuüŒ È} B@€AV`¦Ã-Ï-¥ÚæÓðœyy³æ“—ËÞŒ I õO£ÆNžr±(çdYþâä„…ygJ¼—»HÊ”¶~·—’iþñ7(ºëZ¦à‡ÛÈa6äÄ‹ZtLQ‰ð™Vím‰” „.}4úÎvMö†^ÿ]£ eSn—äëSÆQV…Ñͬ0”Ž„pŸ PWˆ!þ `äº6˜Þy4åIhF¡ýÓÑ›¤…¦É~zòá'a¹>ú‰„gª©Óå[gkó•²’@¶çÆzKº<‰ð], $Mmæ ˜^cÆì 7³œžƒÚÊ핃`å Ažƒˆ, Ÿß1ÎÍI¡BÐÁ2ª§ŠjœžL<ö¨=æ /pÖ˜‚|ž–rœ…f‘F\qÔËuïSø‚û§¡c'ˆ€ç`—Û=üi HPÝ5ªsìjS’ô?#”Eô© Ò#cÐS|8ø–RšaŒnm«8°vúv÷ÐêD¤ø*2ßwÚ&™76FýÕUîgú¾”#PÆ~ûPŽˆZZ» ùf{*—ßÿKA*—‚Tn©þmA ¿}Umg%°`l`M×Ù@€Èhæ5g±ÑŸçÙÀû:ÈT” Õ±^?:zÙ9,i5¬ñ»·OVD:˸C¬À˜©{!"ÐÇ ‘\»"²UPw!­‰ µ:D¤¦éuh@Žîú¶êÐXuÈ ¯CˆY, ÷P‡èL:/\€ÐQC½3E.À-¹Æ:Äw¨éŒ…ˆÐ9CµâÛ#¬Ë÷.ý²7cbU™íŸÆŒ O\ÔoÜbY>2ÓÜK’?¥ï6îÒƒ}ˆÿÌ/¼$B÷2ËJ¯ 1øªˆÉBÎØ/S´ÏÏNw s©Ú>{ðªrF_ᾃx0܃7ïg¸»€”Cn¸¡DÁãÕ§°à ÆW™«V`M”N¦u¦+‰âzƒÑ#߆+‹ÛØä÷ƒƒu³!ˆñУ¿¼À!<Í+W;ÉFÐO¼ª\Î@êóˆÂ#PÍN¤ÜÙªã( ¨k¼C 5÷<#v ­íhtyù cÁ,PÓì3Jñ•{`9rðÅE€£T™ ŸÑü+ùW&J]衈DA™äq¨iué¬<[è5Á‡àNèwwÂí…ÎØNØgóbTé(êÅq|¬ýæ"ô³û@;ï7QÝ ûnNÞ¯¢_¼(çŠø7/öóØaàkÝ°Ïæ{Q›¿ó‚¯ŽÔjuˆ¶AÃ,!,k…|Fsr¬æ`έœè˜í† öØÐ`bãX4 —€YPоeMlE ‘ÿÁœ¸ÿ†ü;Y/a÷`s^-E‘Ÿ€ÀÑ™Y޾¼«ºçÄÜ^ ;—e³9Â^'‡µnO*Šƒ eÈ¥‹}s"δf°}KN <#·¢MºB»Êõ¸Ýl† õrvñÓ‘‚ú&kÂ?Ú ”JvíbŽÒ¶›ý”ˆÐ ¤¯LqÚã˜f¯7Aܲîoœ5ÌÁ‘j\“tf\vÅz níÀ0·ÝæÁî,w„T.ç~üðBž%ДŸ`…¼x)vèào¶ Eýß?QÛK©kw½È>ÃM>f¤9£p_Üq^R¸€ÄYâ~ëGÃÓ+‡ÌГŒ˜X¤§Tes•™5`G,kž‘7Ž&‘{¿ ü¨k™á°6DØ£f±G‘T¡Ð=hˆXšy,»çžÌ µ¿¥PI‰ØÈO@4UâO=},“úÙ9ïH#¶æ#s ö:ŠåYBnÁî5äìš/¹$!·Æ!õÍr+Ø;·ñÜ ˆ)ÖÌ)äw9†9X²DàIFH.Ü)fH.\×1.ÉÅwI!¹øl-¬É‡M—äâÓ\êw°=¹2 ÿôwAâ5Î¥sá'¤Q!h;^“R’ \š%â¾g±¥½nû[6ià>boj+¸Í=¾ÿˆHÁÚ °©×lmÿa^„êåZázŽ«@EB³*åßQYJ:P½Ï·Ò¢=Û¿kÓ&“H»%¯¦6í’Na“»iÓœ¡eÓnÒ“WϦ]êa™vj¡e£û@óÌвÑm~> ZF8+qGª’–-,b· ‹Ð¢³Za¡=R³ÂB»9"¬ÀZXh§Ö¬°D»Ù A¬°D„ *kÎl L›,ÍS\ü:+r’Ú¬Hðä »¡°ð¾Îê ß!ϦàÝòKâ¹g¿lJ%âuÅCݶוD½ó+ÉÌüë×¾ÿ2ùPZFùû¨. ™[ ꢀ°1|PìxQ]@ì~µù[u|xTÁ C¶Ïê"x±Õ…zñY]|ºûl>lõp½‰wuœØêârÏê¼ø¤.Ü->¹aŸÍ‹­.~ãÅ&áÐÈ…êò=ª "©¶ ‚::]]О&.hõÄš]\Ð.ÙÅ…Ú..qq \-h‰€WÅÅ VDÅ…ØÍÅ…ØG‚L›º‹ ÚxÖ .ˆ 4›˜ ÝÏ~±g‹â‚/RKDzvqA{œ&.h3Š‹Â^Ð]\ÐÎÍÅ…Ú..qqás–¸ð5—¸ˆ».qáni\¨Ûnó`ÅÅzÿs ° ø%¯žÄ…F¬K‰‚¬n©ßÒ\\ÐNÓÅEÉxÆáâ‚v?\\¨íâB‘Ÿ€4¬´Ä`™´ÅÅ cT\Xnmqrk‹ Ë­-.,·¶¸¹µÅ…åÖ –[ÁÞ¹¥ˆçV@$H·¸° Þâ"„ù–[\X¢lq’k‹‹\[\øœ%.lÍ-.®[\˜_êw°=¹”Åë+|Dô8¢¸([\\ÐnÉÅ…Ú..|ÄÞÔVP{íáâ‚H¯..h×QÂËvqG¨ßk…ë9>ˆ‹EeQ ~/-wqá=[¢÷lGVÏVq±zöÒÞ±U[hËVm¡ yk ïØª$¼cb ÚÜ|@´Š¨¶¸!ÕëŠj ­+ª-¼®¨¶Ðº¢ÚBëŠj ¯+ª-´®¨NкíÙ¢¶ðºæ§j Í_Õžáª-´¨¶Ð¡ÚÂëÊÖ^VT[ø”¥-|É¥-â¦K[˜[Ûí`‡²ÂœZšÂ“ìbɪ HД!ÅôHf„ÎÙwšõ;T¯ÈÖž&çse ǾZ"Eĉ&ó5 X)R›ê•¡† šßöµ ‘F²Õʵx•$a¶ŒÔ{1/dBþ¢²Jùa;ðéVxØY'ž2!IÓÓ$dtc׆Ú0Cõy©wؾNVˆ¿¨`ÓoHoóŸï•ķĪ3¥‹' ,BçÓQq¡§ÑÛÍ®•îWu¿ËËmÀÞãñnÉŸîVÏ\C¨ýñn±ÿ£[Lƒ·ØËåì~i~‡ëÈûsþÓWK<…N’a·L̨¨¨hU„`OGÌÅ‚W%Á@—ZÙØÑ}òÊÆõs2;jŸ˜}fJzìÙ¯†u‰F ºoC’Ïÿ˜;Õ§ô½Â)A^(FÇX«ªËÈ·éß6½~*A9SyN|¢——ü°xnâº"|m¬‚›ó”©ùc<Þñà·§Vvp©#,õ¶Ù›?oç¢â:ØÚ¢‰ø"CG( ‹„ºÙç*-Ô­£ƒ#Bh¨/öŠg*_}ŽSlú@¶éX¡5˜äMh$¶Ão´Ì“SPìº^¿xÒl^èWsBíƒWô³y0*¶¬æÁq`B±Q¸ûl.ý‹I{½‡œ°æÅ$º^C½xÁN(œG½ØcÔ ÿ®nHC'§úä†07#å¿óƒÏ*°Ø_î‘ý‹‹5_ÎõÈã«ÏcÑ¿œ/Ž h·¾lsÚEˆCújKaÕ¥“pLðY˜³/3SŽÀþ/íU’ãZn÷u ]@eŽIrkÀ0¼èÞ`÷Bß›¾?àˆLù¤ÒG7Ð^I™CÌ!¢:›òdæy Ÿ¶Œ õÈOÈsVíõÙSãö¨Ò„Y&e”…DY+=()´cšÚ90Â$€IÕ<Ò¦° CGT1éYq ÞnkB4‰wþ¸x nZ—SWBOê¦ÅH|7m X)L²–¢£Nzg¦tY¦½H©u9ìîŒ÷Ï x±œÜzàP#^vÄ«—î0­¨X˜ÍSùså¶"nÁÖKä'Y¬ŠÚq¦Ê¨ôbo-•ý_ê¦Ð–¬ò6uÞX¶êª¢º*6ÓU*ÜÈ MW1fAêÔSìWÿd,²„ø9B­\S ͧÔZ3GÌ€eáHZ1“{<9HhwÒxØ”´«2mÔ Ó¶ðdVxDlFT‰ƒ¸¦ mÑrÚ_Z­,¢Íópž¢k<ÔWÏÎ$AS•üìIãäìNQ²’‹vî>»„Ap’KH9âI.؉1t’K(FòI.é¦ÜVr9Û’k9Nr9*—”qvN݇:aõz’AÏw®4Êœì’ wÕgòXráQT‰® x³è’‹¯*—tæ»'9˜V\,ÌÎ>É;b ɾ„`áòæÚº’U‰Œ(U»ÝòÓÝhð%š/D[_tÚ_ºùê1÷\ ,Óvøúðž2l„-€ a:[˜ýõq@œ µ­p=Å×µ® 4³Xó_[WŠÿ{­+åOÔ•öçëJ Ð_êÊnÙgÀjÙ) Ûp-ûx¬eÓî®eÓ–Ø]˦'7Y-›f¬²27skÙ81¤Ys-{{vƒÞP¿ñ¬"B^3z{öœ½©Íô™e…v—âÊ =mµÔÚ•”mÖÚ9$WWè ¼ˆYWR@ÿÙuÅÛÍ&LÇ®+ÞÃÕ%è3‡uÓš\–+… c×=ÈiÚ¼¿à›6/Ë^mÖ¾Jg<ž,g·ÊÖ¸nÈgwˆVT,ÄÇ>U*ì#£fFR:ÍBzŠäA”V ±¢¯œÆd¬ŽÑØ1 .¿Öˆí‘Ðs•3G…±¨Œùå¡„|ýÏN!9ÅT‡föÝÙ6j€“!nk.‘ÿ‘éÿõö·ý–o¿ÿvûǯ·z衊¶ƒ +ü¹q êQ¡12öˆ r³M9w …Ï$5tÞÖù²¨Ä&#ºš@ ¥ƒ¬\‘‚Ðz>ÙãaòŒ¬Ð £"‘$ÖZ«ê1ç'lüˆéÊ=r€8èòôÿŒÉœ9¨Q^Gþl"ðÒï³ñ°…»ÉÐ=Þí™gzèý‡”ß¾#N_YPIïƒdº7VÏówhÈÏ<(9{ l~™$7Þí –TÕ¬÷+å³µ¤%Hp‡†rZ'ªt\ƒÝN³ÅiªùâA9P~äO„¨jq4Ög\g[|ÞøŒ¾„=ÞF.£!Ô½ó×bš‰²…¿$€kѱ°“–¼¯ay’óœ­Þ „±¡Ýî#MûòàH—:ñCC*FÓzóþ!E‚Uë¸C s(pµzD6w7„YÒÓ8«¼ G5>„ÛS%ÑjPJÍïÀ£;§†ƒê7ˆ²vßôbnIBn·ß¿þûó‰K)hÃè!÷lÜÜP8x}mÒµ&æ5ûÜÀÊŘÞ#é„=¥°éLîT¼xÆÒ¨>Ç@â'õbÊ¿?Š »ÞƒB/w£Øß7Ží™8ÖŒcß0ðb•]|°  Í0×÷w±¿o]ŒD_n#:{À†ÑHãõ6ä‚£’‘;.sÌr, 8ºáÓ³€ m gÀ¨ú)ŽR”¥NV—Õ5euk Ž5€_оu·fñê a8 1[Pi·d„¬¨VÔ€S‰Šj‚‘´“˜¡igsNûö<އ‡jÚÕÒoZ)«6Rþ¡Ú¨¿ØK ¥ìÿR iÉV­T¨qÙª•ôkÄÓJR¯Z©W“H¦V*$+“¨––§JqY••û@Õ:3GÌ`eÑ(ÚÓÚZ¬ó0’h3õ `FaX¡ö&Âã¢#™oI“´…&˜©Ú•%eÚœ!óö<œQ== é«ggfRï)£Ÿ¼¢]ÛÉ+ÚA|^‘þÔ~ò v~ò ä­ñyÕH×ÇÎ+˜ZüW^9{æÕòì¼r R®˜ë‰aî9ÄG9PEO3¨?Æ–B4%G—W¸+­;¯àÏ<^on½¢‘çwd=IÓŒŠùØ;³J›N§Ð! hí rmZÙXøW¯Öç–'Ä™Q ?ÉThƒaÒ¬\ÑLà‚c°u®ïsÇ=}Ù¶Áׇ÷Thœ³²Œ}cï`¶maÖˆÚV¸âëZSFµò¦¦ÔSSê_RSÚÿ·¦TÔâKMÙú XšB˜2»U{{5íšêîÕ´SÏ®WÓ4^­Ws—žv#¦))»VM2†oÕÛ³ó†úgUÎR¨WO¤ã=ÙѲƒÎ|TÁáÆ éCTô½Ž›%HÅ–ždiç (¨µ˜.6_Æ&&©ä¡ÄFr¿ui¼èRâ¨Ü9¢žü8;S!WPbââÁÁ⸀lC-B"´áÿ†‰-JM -:w+)léŠ •Ê&T…®Ø¦ÁÕæÍáU@m :J+C=`Ê'Â3 8Ö/Ü9ã™ä.AÖÈÓÿ3†½AÂMä-bA  ³x{æ¡àÁ½²üøŽR˜¥·È$Б)ôrùë(²²!Øãã<•Äï \dGj•Éxë°yÇò AEc¾%žKãl÷¬_){UÃîïçQ^Òð²,ˆAü”ãTã8+:ôs⑆>uÅ­[ÄNOž„ŠN;‘²?‚Ó< ÚÛÐþÆUõàÁ×í:Ì–¢f¦d1“ãqHf°9ÎÔÅ< 談÷Õæ¬‚N~õ.ÚT2´ rpTµK¨J,sÆàÐJ\ƒŽh]m‰¶ˆÍ`÷W)3ͬ·#J¼%Ï êÁ“´ óx†Þ—‘È’Q¿ÑâtSHÚ¼yƒŠ:J;GïjW±s’Ó,Ûž$ñΧÇî¯&qsP(ZtkâY™*nS<üÿH¯–Ën¸ï¯è艞”´ 0²ˆ÷p¼hæÿTQR÷ÎØ“ÁÜâÑ£$‘E’·yh-Ç8´ ó`³Ðq…EA%VØqés×Õ@$k ’6 )ï†A^ðîb÷?Y¤¸ˆâ0ˆ µÐl\ÿPÆÝ?´Ù5ÔÞWûpš‡†LRj¾â*iš x8Uš5`9,âH" }zâÍÍm¸;q Ä 1²³bõYy8bqIq€DqÏîðC¥JbY>%c -wÓWË ¤Êb÷ÉІXd×j‘E®È‚¥VYÀÈ‹Y”µrE¯ÊÄŠ,_¡[d9¼"k[,²œE]”Kf1榣z'‡¢laÀ‚q¸Ðù -ÜV WhÁ2r³9Bvkò]óZ°Èp¼¶glÞ[hµ†0&xðB<âörÍ]pÕ…òIÐY„— ¬ ¸c.qéà‡n’š¸kÓ³‚aîñ0Z¹«vÚ ð p¶ÇÄ7ca#&˽Â}ŽÇ­+£Eò·u%›®äוáÞºRŸt%^ÂR/aé·°ä?Ó•—IéYWN¾ÞŸ-_®}œË×΢ù¸µjù¸²Âµ|=úL;_¦‚•¯±io'}s¼|IÕ¥ëOn>4_-GAFÕ¢åÉ"Õ4…8ÓàÖÄk ,’Ä4¸d§)À)¯)£ y&*À½5‡—¨l‹‰Š³hpmï,x¹«\¢ÂÒ-¹ÜÊ“ˆ•!^PpW­e/(|àr5¬ ·ž4\‚ÂG'(Û)gÃ&(pdü½}̾"cb*½±*éYÀÊ®ç÷¬ ξ"â²Sáy°C XI»¯˜ CÕˆ¼"¡æ-«€å^,`›õ!uÏC‚çq¾Dzxì›Æù~hԤ¹iÌ  I¢øýÛ8ß‹–õbïÛˆŽÆ`4 nè¯Ûh7>[réàÙæäš¹3æ£TâKã~²æFz K%”Ôµ ;09oòXÚóU¼ø*÷á[–G­yãØ™7uØÙ«Ì39˰CØŒë6Ù¡Nv5h«óìÀ* Þ`óQDÉ1¹ÏΡŒâ6ÕºCÆ·êÆ´%“º—q“XÇÄgoHZS&å¿p‚뮉A0ù÷„ºÇñOü‘ä¹/KåÜúÛÁ¬¿Æ8r,˜J|"Þy,\¡–Öö3 %F„TVL]”-Y¿—Ö±Š!ÎA~À©†`Ûòé,uÅœ}µ 'iÍ’Xž,˜q,ŠñnÄ.¤8´‰KZ\øÖjÁ>ÄäD\CUÒ\Q´>fHôœÕÒG@róAQ6\õòç µ ÒŠ-+O³dÝk¢e".¨=tW™ÙvñdéH j¡yE”7¢vÐ|„é6ÌË+fÐËg1}ÒšÜvúæ-BÇ'ay¤YŽY³S"ò)Ýz‰)Чى­ïf‡?ùFyö6(§o¤Ãt-ÿ3²(³±a×âq“²ñ;Û‰‚¶=T; TÓjtb$ƒ«ÃKÔÿdt˜ }Ñ»ºC …Ò†ê˰<•j[ÆRµ³ßŠO–M&n™~È\Y׬°5† ¬Yha±AÌŒBŒÜ“}è‚Ï‚qãOí\å«eG'¥Ÿ-Å,ŠW 2žˆãZcÆ-lw4¸—k¾JpY2cé!šáÌÂ7&Fu¯¸ÓPŒðý63–'A܈µçYÁpžªï,õ¼­PÑOF·ÇÄ7c±G˹Â}ŽÇ-)¥ÂÇÿ®(ñþ?šR/MÉQSТ)¦÷KÓ¨„ niÚY4M×Ü,Oç}ž®¬„ÊÎÓØchžZy¸IqyºTÜt‹.O›ådåÃôÕrT¤2Nâ³¥$Óâ—©+5ë8]¥{]–VMW€w¾YºKr²G1Y9øÈʶ˜¬8K^›æP,|kª>ÀY´'<ˆ—ÔËÌC¯KZ÷²Kw>[ð²Â‡×¦¢Ùã°ZŽqX6QaÃÁÒ¸Cµ ¢õ>Ê <ˆƆ¡"wª(}óøRfn!Îrc:JÔrÖq³:£¦?5Q™š"‚¤±ýá0'–ø_Ö«\×’¤ˆúï+ÚìFºMî‹;öÃBÁ4,ÝÆàñõœ%òV½×ÓçÞʪ\"#Nœ8–®Ó,°zë%#;Ÿ-SÓ2]'ƒÎ£ÔBÐ/fZÛ^öŸ€R·ó ,OÀÆ„ŠiˆÖuƒ™áÔÕÑÞŒÞón¯Æa¯lÿìqIÆ“Ýa5zê²îßézó߬û¿x“:ø$à9Õ ;Ø„ XùÝí%ý öký>‡y‘¯}®U“íO}w‚3R/­ ÜÆ±.Ov„¼ÀŸ‚QŸÈï.6Ø0ffk±DÔó½ÂÜ™¯9wãŠý=XÓ ”Ñ‘‚ûþ˜Þ‡dØ¥®rónù«ÎgNìª2}ÞVèY©ôÛê™h-ôº¯äeõ{kÁ½:j%ûÍÄ%¥¬ñîùšÃóvBÁ‚4¢b(Aß78IJt[óE@DíÙû2AÍÕAwý{ÆB"”‰ÂÖ ®HæÇó J*­øáõ%©ÞÜ?üëǯ/¿~ͤÈxýë P‘’S)Ñ‚+Ú2 «áV¯_^>–”֧׿keöÊßüÝÏŸíãŸÿôõÓ^«Oå|úáçOëã_þýõoÿз߼ޥ 8kwx´¡¡e¢?¥ ø4wšPÀ)-6Ÿ©(Ð}ùyƒÏ=¢öhŒ ÅGÑ “ƒ”})¨ª_ÑcoNï¢&JâzVØ"DbŠ¿R$€RרŸÒª•ÏD=æ¤Êß]´°[¯æ5½‚"ˆc¤ MZ|KïïZ ÃÏ„ÀÝ9å,ýÒQCî*•¨äœJbù¼6]X:çÎD–åS³:<rÖ^Å} ( ïŸWšEqë¥Ù*ú(fÈ´€£ÎÌiÚ¬Ì4¦ ˜³Býø`†äåáDÈ1;¶I`©<˜T™:˜Â- MÞH ÊLÏBú0l/0 ~Bç/‘+/TxÕÝv`†{Í1(æ@Šb¯]Nl¾L„©ën•ùÊŽjHš³öåc kL¿q>‚@g À ð*3W÷¥„?ÚyÁÛM1 zZ>;›¡à¦å1ôPQØhUå TÏ+…×ìU''Æx+xáz¼¬H¯R¼×Æп,è {åâ–p/Á{És}ÊRˆÇ—ÕhpC€½°oÆÛçH NÁ–öEO LÖ–m6ÅoxbiZçhPƒÁ¬È\lËŸƒ ‚2pîÙº;§Þô±bžÝšVd°“•wF†œCTÐŽF΃ÓTÒìwr±°¡¡FNë7ªk‹R«»"×W9.±«e;æ›.—·²ľ-Ób™þ4¢÷ÿi:*šŒâ=óéžhļJ ̬È#ØÜwÇY$øÆãÊ]XU ¶ÁþAgNÃ0>/(íHÚ•‡‰÷žhQ¶}JRP›ª¬#ÈW]‘ÈbƒdĽ #ir³ïD‘ôš3_œ“ºM(©ëY‰´‚´q,çsi%Ø GL3a[ÜjÊxb~(C<÷nz™Íc‹êǬá-Q%ìC¦Â• QF»Õä Æ¡è¼¢Ø6 ض9î²k¹j@–’ÂÇ€à#*›yIýÀÌ6¸ùeˆÇD¬‹ßL¬­ÊÒºÎÄÛŽ}ð´i³FÒ`<ƒWŸ™—¡¿Be¬s æðí­ÊH£‹4µíFVQ°Z $ÓMÕu'‘—<ß&ó¹y«™uó8MnÅ&K€$j Öâ@¡K‰HÁ¶«Fb`ùò¬3U‘p¡«Â¡“ãÂ&=vÖ¬6¹×º¸¢*Ol‘ÄŠ3’ã(é¥ÊÒSÛñô!'¿Ø5c/M+ÇÑ ™óª—…»yÛu\Õ:¹*ç)Ú²-ÊmD…÷9Q,H㩪>lì Ÿ ,åÚ•¢Q¥2è™EÆôÍ *”&-ÅâŠrV ‹ÍoiºH4Eäl*¡Y…w/(‰»{î85±{Ëgs©L;ÒM[K¨“~e‘ƒæ$±[aà¨1âÊs ûº2k–ˆÈݲy#¹¡0¶ ioì¤ 45"`4áÏΣDÐêbÐvä1m~.ÙäZ¹a.5ÈuHùÞB®J¢M}É98‚ÀžÎRÖã91XLÚVž³Ô*ŸÁ¤‚ZE‡Q•­@Y5…¦:¤]ß•½É—ÖÚìu]îZI)$IbÆÌqЬüqe¯^zóçRÂa˜=¦Ô”½Ú‰ÇQßT†ñª(–o¥wu4kH²jÑæ¹‰4ÎýDŽ•÷pamîZ¹+o~5íUëª\­‚¬ŒÚS±¾Ìv¢[™L3ÅËãVÓ¥ü ›x-ˆJµiÏ:¤£aÖ1Û8¶}Z@§qíu·,Gãò§Îb¦èÛôÌAíSKŽ”î=·Pµte‘A4 ;1¤^’ÝÛÊ©öE>Fv1º+ÝÔI+…ÐÛÔ:ÅÐÊ,ÎÌj¥ŒM*H"²†§©XÛÀV/4·ÈŸîpv¥Vqý›c8{¾úÇ[5dÙ¸òT\V{®4!a¥,H©ý\¤tâàH6ŒŸ­šÆ¸Xxuo§*S$§¦uêŠÏ#”‰BuhÏÕM¢"žg±D\fÕÛ²¿´ ,=ÊŠ±DüÕ¢VßF0‘¸KxoÕ(_zóÔ5êáQ»Õqk’oÉþU¹Y3_²•­“±¨oÓh¡|²† *º­qeãj 5yÌí¦¶[ŠC3úùr2åqºµÓ…¥Cõ-Ô¾«LYo²»:*sË—tÑt5±§5€±`£yë'.o›v)p¥8Û?*Š¥¦³SP¸ÍLMhš‚gb!®ÂâœE|}Uõ-ÇZ|7 ù¼jG’]‘lWºòp ö©C²&!?Âe9”oUŠRûD÷‘Ù£\¬¿w9’Cœ"ŒŠÄeVš)¨^Ù|ŽÐ ˜ÒLñ”“# 3ÐÈзžbjÝÒæ†m’¤î|Ø}Ä[h…º Ýl«º8ª‘W¹·‚sS^š‘ºdDRŒjYÇ/?}[Ik*ìÆ˜¯7¥D!Ö•{3¹Çí—Ø’–Sc¶Ý‚ö·YqùmVýeè2ªy㻬Zë½µ¬\"¦Â8v kF†%Þ˜!»äÀLÞœfZ¹f`$‚»y{«š½qš1qao×US»Kç"Uø‘•¢‰MZˆßR®«4ézÌ‚Á,>¶^ÄãÈÚh‰K¶üV7$rZÁë}kRZœÄÊKª)êSf˜ägΪʕÖÍujËé&¤ÊIH«ý<(1\U‘µ›Ù”p#öU’_¤Çká~=sY)q\Ró%Ä$¶t,ô¶¥?ÙOlí üÛe9Œ¶'«d†ù|²ø[ÔÄHïæãÈ#Eõàh+Îc´ämÕ¢}èK.vCY…¦䤥æp?‹aWQžÔoˆaº8¹˜tJsò7à£ß*þ%⦢y„õZA‚8H ‚²¾ðá^ŸgëO,à*]¢Ÿ¦ 5nKmØt3®q ‹¿p8zÑÑâq¢°[‹)èŠÌÔ5`­Þ§H…vs¶@¾7­ÒC#àÂŽv‰úg3«rÚ*Í-âÏ…Ò<â²¢o¶OQ_ETë^î%«Š¾em8”:*nqpŠí¶2©4ÉÍÿ°].9rä0Ý÷)z=@ D}Hés³ëÅÜ3Œ*« xc;]J¥>dÄ psÎ QÉ †ÝåvY)ZßvÞòÒuJ]óRgäcð(s ä™ÐúÑÀ1¡ù቎ýê|Ë CxÚ«[ÊcûÚvÊw»žØãû¦œ…÷ô“Â4cLÔƒ·N,Á:-gÝ÷MÑ×lR—‡âáMYëN§ðgÉô™pC0s@0‡Þjëêö5»ç7¡MhºÞþ¥“¿;?P’Žiyí9Ø%á›1ÒBkœÂÌŠ§J'|Ãtj圄[h'…“a{Ô§i$X®S¤¹¨@G?Í Bkˆ3Q“[ãJbµS7Ê ¦kN‚=ÞZT¼­è‚w¦"ÂSÊ[”SN>N±:N=ÄŒ31eDáÚ/Q»Û}Ÿ/¨‹5…¤é›,å÷XÐve´{@Š»xÒ(–î^ÛMgºH”ÔŒöÔ RŽ*¯D°Y9Ùa*6JpµúÞ9*wR`Ú·Bî†WA*açOÔú3o¢ÌM˜[…ÞÂÁ D¹ô¹¬Ôs§öJ87Ì<:ºHGõáùÆß±Æ[R#š“HP_þw ñ†¼‚ÞˆÁXåå­ÏêÜW@Ï?¬‰¬iÏjàwGSd*ÙDþ»û-±Ž_Ôž¯,·ÛšN%ëXDè =·¹TRà sÖ©£þœNÃ8‰%5É ÓX=ë. ú±®Žq\¹P£dH ³&M—) åÛî@é@"òRbœRå©nq‹´ÓW(#=‹ÃorE4@sü{*}qm5ªët¶Ä2×-ÉÒ|phÍ·D‚üÍtœ{îϽ]uÔúh‰ÞŸFÎr¥lFëÂx›øîCòùO;Ÿ£¶¤`æfüo}5²ünƒ®ÐÂå.‘ÎóÚw MË¥±—‡*]Ê%²RK¹:j¬t¾åù`Âþý[•ŒSüä“+B í]È¿ëŠovB«Ñ®£P/·õ+„ §û5©³N½ÃS‡ò-Â(†õÆK]½œLöó„í¦Éð?qô:þ;¢2âeÆÇDVíå°é í°kU¦¨ÂŽ‹YQ6ì±öN UÅ´uˆ ¦;x|>MZ_ï“Êÿ5•á &ÑèëˆO“Ü7ñºr1ZÔ@ÏÊ)TñÀ#q!_ŠGþù‚º¢Ö)–B±“f Do„®½8QÏê›”ËÁª‚vü¡3EÖ•Ã:Û#HÓ8´lÞMã@¤†-íìΓõ®‡,ˆ“º5cºn>nÉgþ… hÞÔÉC©›~ÓQ"';$¾Ÿ_z+-ÐoÀílpU¨l–eñÇÊå7ÄDmók·86/£žv9©u4êÞ£êù’µüqÑij©6Õ+ u>œi¼ÊAúƒÀD£ßŠÅ‘Gí€á³Ú7(uõ¥ t:ïÌÉÉdX Ëd„AÐ]LZ ººÖÒ8OŠØdn€Õ¯/Ýu^2¥„¶Ä‹w(cl3XxGÐ8tšéìœH7h© ÒnŒy{N²ŒsMk`¼ù:ó-p.H¼7RýøÎq¨çvÛc¢³±¤A4 Q o2ì‡'W'_:xÇ¿Dg‹^x wo¼‚ÀÕIõFøªô9ûä Á• 2;·žƒ¾‡ùÉ]ù. €!¼f2Ÿ¯x09GQ»áx€=9 PÖÔ’TKØÍ$Î[Lg jb?â<(Ë3pôÈ3rXŒÚäæM 3îìSâ}ýû××?_ÿ}<ÿœƒlš…’6±þõó…_~dÁ¨ÿ&ææÚ —ãC³WïÄâºUôø¨%ÑjpNv›l/&"ã$QøàVÖ¾g¶øNÓú\”ÒQ›å(PxJ„ Z,ùî×Yð–+¦ÁÈø5ÈW ¸{¶ØCî†éºQ÷‚¨ZêVeÃG*òÑIoí(¼ÒY›’lCÓ`9R\vZ3ô[{Ð2hwœœ×/ÚrÜÒ—c?íÉÄÊÎüØ™x`’Àì¿áïbëÇæ^†¡W§b‹¸»pU²ÎÓŒ…òœJ´ÙéÌ‹O›t7„üT@º–>íࡪUb|+Œt–/°CÏšRO JŸàÀƒ¥qÆé¬“‚»B!£¨÷PÎÀ;red†©x u}Àn'µ‡v‡ûÄçmØ*RqÖˆuºð’YÑAw݆ó‘…lƒÔêB;&,S[4×ãšý©@¦ªIŒƒI°ÒÛ¨´¶ÅÊl/ˆ:wºÔˆ»ZÐ&i‹]7ÔÂ/¾¼% Æ9 uÊÓ iM…ÑÅxZt~u±] hŠy˜@G1šÁ„J¹ Þ:¼¹ÖÖ \ᢚ¸@}O¬pk‡jßNuP£Ku¨uE÷ÆÙÕ\~oÌyd]ª¼øÖ¡ÊÞž9ìú Gž;ÛÕ|*É)g@étmÓvÃ|=ê»Óá ¦=¥ºEéNùCÝHJ3µzŽ{|ƒî«àÛêhd£™å¿oGƒ ?Šh‘YDh9ðÃKêžE¿nU®(Å[íp êlƽðšñ,fW)W^Ö¼5 ›Ì"R[Œ”.ôyθ)OÊGvf‘ð'aÐSGè[š±wª—æÔ8R=n뫳‚S(›¯ø)T^Rx^z—<`õC¥†µ;éÃŽ98]#\tÝ#j6K'¬ú(q†³Qjذì¼oæg¡yÍk“76V%L… Ò/ì cëaõϰv/ÖÖFNÞߺ'c±EW‡56ùé ëKL†Ð?}ÎÆÚN+ͺg˜O?ÂÚŒ ͇Êh  ¶‡-²Ê‘nîïß´õ¤ÏÆéký¡ È,øþ šñrnþò©a)x:ÖORãäŒ Pì?ùÈèN)£”¸_z1†4êB#„B _J ùÛ²Û˜µìê8‹^ ƒdŒsïX¯«ÛÔm”oÒ2;ÆA¼º}žá·„‘Ã)>泃8EÙŸO躶fTTÎTꦀ äÏcKÇ$˜^šgR+߸^¥ÄÞÏ{œÞÎÓ“VÏŽÙç¹d =&?ìÅáñâ…/Æ-ü<Þ;F¹pÃ[Pî]HS½)1'· ÞæjOÖØ®}c0RRÅ6¸!u(n{W+Ǧ»Ϊxf¥Õ_ÞÅÍjç0›/~›Jñª#ÔØOÅ”<·ZmÁߊ®~çjÑgXÝ‘]·¸ /ŸWS÷úù6´öU#Ѷðv\tîÚ´@xÕ¦^uÜÏX@.k¾ «M!Â¥¸Yü Ä뢄>/ý\Ï d¢©£Ñ_=´;¾n§àV—ÙˆMHgŠ ‚”‰4IDH9ùs‘n§ÕVÄ\ˆ*eÙaÆxZј|^EkXàü.À.Úx=4”m)T+T=ƒ„3Î~n'‡0ؽàØ">9b, váioWkòpÒÎ+q¬Gî  ¾e_ˆ‡ÅZ]Ú¥E KQÛR̃§AUC9fÙÅ…¬Yá„ú>Ár™TÍɳÄÑkgÉ,`ƒêÔ)œ£_Ý:'¿GՆ嫭³M9¨q‰­ãðºîñ­ßpl>Ékb78Ú·uŒÆ"aÈ]ÔX£»ð9ÿK 'Øúì<ÿV¢^$dÆ;Ò‘iš—ÝvšÝ¬V®¡¬ð?ÝU’$Ç ïzÅ|`nïq„ÃùÿW#3Áêi:¨1ÅB‘ ‹`ÎB¹ÙRÿÛÍŸêIš><\"¡½×õ Ÿ‚N‰T xO»Úc¿æ³T~®Ü°ê6!ØT'†Æ|_q·¦²ÉÀJR´6ŒrJa6VAii—f-škÎ<çJ”~ûó"lkS’¨©‡Öœ4!|6Hnðv4z!}ÁužÎfá°Aÿi(÷@»Ãu­Sñ.N*t@ I°ã%WAøå'ø ·Á:WýŽê„ƒZ»)É êú2ŽT¼³..\å6 óû€çÏÅØA!JvC‚G°ƒ¥ªÝ)M#‚{ajJí8ðh÷V°‰¦s¼èZ"¾Tw†Ù£«Îâ×M®c¬—JîÜ€Kó\}ÞÛ+aó2q§ìÖ] ¥ ³‰]4\T¿ZJ»’ëè¼9¿ ©ßˆ›¾›oÚ :F+ËD­Ë¶ÈWÆU´GÌ·‰DÓí’:œL¿ÊÉ1¥)°Nò˜Ã%¡Á`ÛÓÅ=?3‚°³‘²1Ó€ü3ÈyÛœ ®[©`6—ÁÈòmwf‘Q¡gîÚy3Žg3Ï•6<6 €™h/-œ‹M=ð(°Päá.£} "ub·Î1I‚Ð cCÖ¶Á½{ï~|uKß¼NV•ôöC+r€D/­j¡ÿAœ97 ,ø⦠dÔÕ² ³+÷ŠrbtìWW¿â’§ù›  ˆ›ªûcUÆ(þ²Æï€„ò­£‰!;E_ï ûᾦ^·ÉYâo:ƒO¥'Ž€ihòØêõy-m²gvÁò&6BTˆ…¸‘‘À7Èê$.@B!!ÚHXI_fÔYÜI®_{µ Cf¡"γŠ%©è)Ã>¥¹tnçÔi¦ôÓâqJïêûŸj äÓ±¼küÏ­Õí Þ=FWi ·°(3p¤šJŸD•‘˜¿ ˆ¦Â·#±:ö.†ÊÁ¬†A0R}]”?š>Çöž¢ÁÿâÀ<\—‡~ý€< èr JƒŽ©Åe ü&»¢³ï릺«¢u§óîý˜h>ÅÉñ—ÄÙ0BèÑ ^ VªPö–Á‰Wò pmj%̳QçžbL‚Åmud·¥T¤Õ³‰ ”k8\]¼Qg_(}°ÀâÇO#úñïêç`©Yý'q8È|"2bräåk' g×n¯’¢g)h5Ù¡šhÛÿ ÜÁÎäÙÆ»²)>lÄŽ©qh-Ê®]‘ëBÎoÔüÓ4 1¨÷ÛP€;â6¥"Ç‘•ÔÚÉiZ£Œå0Î!h6s+Ò›šßÝ*­V°è2EÍ𽘃èNÔw(ôõEŒ"✚ZêG($«”•ÄýŠÝâOXi:—I}UÔ&:)~“$‚£yÜ6IÑ®kȦðn®àÀ ν¿JZA¶lÂÇ&00]Бã¢2ZÁ¥6Jmû!.ÐoÞ®VñIc–¾¯˜$Hª$|@ɉÒ¡ãþ¦âÏêæ©é.ÈùpDþ¡ú¢ÉõÌýï+<Â+œBäF]Z(ëÆ¯ÉàzXI4¢´È(à J/ >›C¤T¿e—¨§êœqP_Á._¥0D°ãÅnˆ{Úâé¯gFU F§?ˆÛ}¬]õ’´ÏÍרŠŒâ×J¥Ìs€ðq¹Çѹð½hBX¨ßÆÁQĺuªhÖwRU-1€Ôç3›5í¢=§q˜Ño@™*‚Ô3j4UEL¹Í+M¬hVÁ»fø)LE¥çÛÓnû=Ò”õy)zúE×W0öé²}½=c¼½y£¨¼7–€µC‘áèóFj6(™çiH^ô"ù ¬¶«D¥R¼P¤hLšÅJk—¦ÚjΊ†\HE LÔß¿aÞÁ'OANžÞ夰ë¼leR€ýucèàùz6Ö~‘GuAá×[Øí2¡¬Œdi;1`V¿ÞúñjÙ±+·{ÅýÇ¢ÞÚN'›NxÌj²‚ÞÏïXUÔQÇ ·U—’Ž$’Å¢ú:[ؼ@¾¿–a{`¦,NÉ%G6|ͪƤ¬%ôþ Žº†~¬ ¯Ñ8bÀÚ|§Â,èbôå219êà|@ë‹b.S·è„pT!‰£ó[I>Ÿ ÍþØêj-}F2ØÜd™ù4í%ÍÒq‡c×|øvN{€wCgýþþ@]Œ IZzn(”¢¯¢“!ÜNßè(ºÒ8@UýGæqZ©ÎC\Ö^ATRä¾0OÖ(b 5OK=ÐÊe-ñ€TÌ1fŠ2å9ÑÈPM/¡P²þØ”oªI_AÏ‘"o2%?¯ïü-qó_y¾öåw+c¯”[ÎÙbþe¨e{÷fŸeS/g÷18· ¨ÁB+—-ŸVä¢ÅyÅÚeË%œ™FØ-r¦abÕÃ@ÔGÇD(R,÷ê.¥qÕw‰Ò¥£ÿàŠ65Ƭš º ­@Çaj§°¢e<\|ÃÁߣö°¢†ÛêÔXBò‰’]€Œi¬¶•9Üô3êó¹…°AÏ®¹ßðò9ºE×Y–/Î5fʉJ/~>hBûØ™7q¿ÁS²3`\è÷¼ =Âùh\J€‰m]6HÈŠ4Aÿ„^oŒ¬2‚y¾Ùãɧ,göPPºbUÖ™°-ÇQ<íRô¯S l!NàÖNçV(,t¦rVñ–Á‚Œ²»‡²<¢|­Ëf gºÁº€Êoå,táTÅ€øœ†'ü]ËçÇâïÄpà6¬6©0ðšJ‘Ê(2HHú…\r&³D—*õerBÂÜYî¹+*~”ò·˜»Èž*K­Õü’Ì U7—*°š'#¢v2åJ¬Pdôÿ|Rkñø¬c´©¶®ëÝÊšáΛʥyf¾@+7¯K eû_Þ+^wŒléÖ›K±Û{"…)Áö«¬0,ª!>®‹Ð§5 ‰Wü¤­éh Q=O|DÃG¤ÚkÖ3Ρ±¹è>ã:¤5ãÉüuLGe±HP„¾cÕ¹‹¤s´#Í«|Œ›Ú"¦.pYo.:LTç†å.ýØiñôh´&d®óã, ZªÎ˜ÁŽä Ž}ÖJ]ÈÕ¯”ïrqÙ[Ç]?oT}’A«õ‚®*}–×äciX_Ê3¶¦YŽ\O²+ËØ1ôN“€ †ârл)ÿž†8$) <” oCzgñ§ëoHë ®ÁÎÑ[»=<º¡é¬FÑïdœÄ.hõüž{Áü~Æ<Ñ–¡ b¡¹çgfeòszij<¿ßý¶ÖåjS49埣˜ª|8øÞ Ò×áuvV e¾w•F?¦¨Å%Îc2ÊUWºŸ§sþÓ{Î&ãî9øTkra%wÔ D¶#(ƒÉ•˜¤‹"„Âwu>I& ­ÙFv[ ¡BZs@͵.¾Pý ªƒ:‰BËåžI3äyeP èü]r,› Qïîä±–•¯•ug[~Y›³—óJ=Ú€q¤ú2)í):ù_IµR ûÃ9ÊÏ£^…ª©U_ jõÇQ5+¼ø ÉXG陿³+ºCϲ×gV­’<¨ËÒîÎã;þí”Ï ØIÕL2‹Ëu‡ ÁIÞ;ÒÒôb·­{ªu+"Øâa ¼ö•ªÒDrræ±Áðbj:` ”,ÈØá"JØÏÙ<–Üp†*7BP¹Æ…<µç¹«çF9›YïCîOÇ&ðs,]ÏqšÇIJtZ’+ûò¾y ,Oú–Ó‡¤÷’ôC«“õb>îòŽó.ŒŠyŒÐ<5V8õÇ„þ¡Ìk¨J‹s¬F¬P ¬€ôRGPÕ¹oÃâN¬úUMA+ãX¼Xó†š(þÕt¦lÜÒ-K}ZÀZæy2O ,§1¡9R´x¤_Â}”£.tÈ2ÊæÔ GG4®™Ït°¤HO+2šÌC)í×ÂkaÇêaEšÎ ÄNÏ{Žï¹» N²‚ÿ·5 Oà‘)ÄרS ÉŒ¾5¹&°pKö0€)&`fÏ…É~­±òqJ¡H¢-Aà F6ô{àîÝ“†JÌãwá!¿™£r ¸Ô0lœabE!A°ÃmJǶÂE@p{Æç 4ã¦ö.×þXŽtqzñŽ)²iÐGˆ¨ÃÂ$€©ÆàIH­²Ûå=|ØGP;ÒÃfÚ£Ã.'÷ßÞè^ýý ç dÁrúкq"aj°ES•Pvá[O®*¯fàÎŽh²Lõ/êR‹ò¶.«uÌ쉣3Ê›šž±§R­x*DŠ|Æcë7ëì@=EÿE¿”A6‰¬D 0j“xï¬S—GÒ„ï(in[å"ÑA Ž8ÏàAV¢«jLG€_×XÅw‰VScTh²æñ¡½,×¶˜To+³¸Î9®öa?þׯë_Ÿ¡µè#  ­Ý^¦p-S/å “9[t“œjh‡ö…Þ˜)& ýMV­&À©å±¥ uÏWI½H]$G :Ô‹…¡¥ÛÌÅ<Ȳ½¢Œ4Ôf¶Ù±Ôôª œÐÎÂï@Þ¨·Ãé¸høÏ¦~«c’QY=ÍP›ýj“<¥¡eêט_'È`C.÷Ð¥LáØg¹Ž…߃-6bË'ù¡ùW›ìV+峕7a¡7};Æ8ÔlÚZ´~Ì÷ó}×±äYžqŽ+¿ÇÏlé)3ÔR<ëÌü¢±À¹ëßX—[%«1¦4Ä…¨ÍôH8ÎŒÁÉNTÕ’|®y<A]©[;xLž B¥“=ø ülõííGz½ý8*æùûúñö·/_üþª¯ï›Ðþ³ÿýõõOÛmkÿ5½þõºÈîkÍ®dv msóúsØnÕÁÆn¿ÈýͽiÛ{ú>m­Ÿ6êÅ+}~­±c–{£>·Rè6Šzo?í4êÎý­QçΨqï4Ö^›ÏNŸ,Ú鶯ýŸ‹ö™]oru¡øÓ¢çòùþöúòíïo¯oßßÖë—?o„Ÿþñå—„¾9 endstream endobj 270 0 obj <>stream 8;Z\70m9Wn6$G[Jp>0E@V <9s7)pGo-?E5l?h5t$nfQM3P=8m]FX`W-!13,Q&3EPko8[DWgC)]D#ZR#J*Fk/lLC %ELK",o"dlpTp^.'AYrEDIem1Mi]KLl%X7.mad!88=?>GnqQ$lQ?LR/b+bL@4Rl.7 dE2$qe_6.?o+^V!N!#&E[4CI7kjloL,`Q+9$]lLU&gT[Q7t63]^pQBi$=E"UqD^u! S(=Urf#kr^ELFQ78=MQh*g5j"pn.)NPZ1 ?HVlim>r+g)`hF'^mFYNf,#lG5#!$5GDs,5_F(&3*0QBRQqp:Ho2#c%8(a/)Nt3VS \$*fb/<,S6BXq8Uf\KBMkM@`H(<>J7BJqV+%lO5Fd]K/IgG6#lk/2L-2d3I<]Jr<` )pd9ZDZ$tRHVh+2Cu#TF0"UcB::cQF>n'H^&Js_S0$D+S"*=iA,L[NYJ)_u_;+l>jO1;ajT(Khe.KH-4;Poa13_au\Tp3MZ%)r-2_TU^+=&gd Fc.TlhseXS"L_[S^T"_P)P,G\^.I"4'Y&c0Q.(;,V`nq0b>@XX_Gl,p>=>*KZ!`,f!H:(bu>O;T< !P!LKi`LL&DtjbtQH<#tADO(;mh/XVic")c>\O8Y$R+u(gEc@W_$5#K@ceD8Zk6^= 7\T8fnSOtDE8(tCPn8"*)a= endstream endobj 170 0 obj <> endobj 173 0 obj <> endobj 257 0 obj <> endobj 259 0 obj <> endobj 261 0 obj <> endobj 262 0 obj <> endobj 267 0 obj <>stream H‰|PmL[e¾—¶·c¶E¹» {·Þ»ˆbFÛ!¶º`VE>¤Ý2Zë¤[Ë,”µ»­ÔF‘ª ö2‹khUL>2Ép(kf†ÄÆ3ÿˆ‰ñ‰ ³,nɹì­Ñ[øïùqÞó¼ÏyžsrpLš‡á8^Tg­i¶Õ–™ÃœÇéjâ|º}^WŽavH…] =‹wIל‘Á@Œ>rûÁÎB,ÇSsÕ>¿(<õZ­(//׿²Ý|ŒU.ß 7k ‚îŽûÒé“>ÎïãœA·KÏVy½¬%' °wÀÍuæ>ê­z¶Il8dk FƒÖ¸¿B¿µë °N–sŸòˆnœÛÅ9§ËÝáäÚY_+û?“öÕY„ýnv?ër·bb<†ÕaõXÖˆY±—±mâ 03vgp>‚ÿ‘÷t^ÛH4-ü•ÆÅ\’–D¥BßFS¶€A´B!|(ƒu±è r ;$ÏÇ7k0!Âu*W¡RA~Èàà`Iá*”AèÐn0÷W©ÞÙåÞŸhPÿšš¿Æ,ÌN.eÔ¿YVLc^N k“sËß©3ž¯ãš)»å¼ž~¾òì{'({‚âG>ágè[óþf[KÛsŒ@¸ô:AÞ_ËøÖö× Gù·Õ•ë÷îÜÅgàq8{$Â;ÐLñÉÁO/ªAÙ¨™Lh7zéþÜ •«™ä…´&ô·ìíΞctùÒ÷½ÌÀ=êʹ‹+7é?2·2ª±N¡+ô è ¿#z ´ä:xŠ„.¤ÍvÉÉ»kÊÞÞöjŒqL{–èôôìsuÀ;c§U76¥p6„g@+φBÚì 1¿ÛÑ+2h$®B5Øeèñ$*í~£; =ÚO¨îˆr%DB…¢ âäÅLh òg˜“ò£çšÉÄøÔ}#ÕÒÀ ÏĦ/åPòÂji¥Íá iúr±ç*&øþØaµŠë{¶ ÉË93ˆä­áØ0ŸÐ|øâÒ2ýñH_’9é‰vÑŽÆŽŽyŸ /÷þ.C; ÞÉ;ªÕªp”žHREÂP¢nž˜œÿ|bJÁ\|;[‚ÐÞ/÷u¼ðµ!=:Z¬Š$7žF¶$ìM¦Ù@œê?@‡âY_r1~aH¾EO¾äµd68´M¨£†-z*ž¯k©}wô_E>H·ƒö!ОW(c LìÞ¤þ`=¢ºÐ endstream endobj 260 0 obj <> endobj 266 0 obj <>stream H‰|PiHqŸIw–Ê6rš¨šý‡‘^é"•’™b^™›QA‹ëîä‘¶6»)ŠÁj—“ëŠV³iEú¥„."E‘]*R2:ÈØÄœ/v@Åý/Ôl}ï}xï÷{Çï=I„Ï!H’\–iÚ±oÆú¼:¡Üb+ì ùÒc•!Tä–T–†+Ë#=³³³¹p/3—"‰9$Ùs;Ý^­Ž––9QB\\܆ODCRšÍ^Â#SÃÉW9ÐÎ#V»Pm,NÞƒÒ*+QahÌ y/Ô„’E1¦T 6q¢‰I‰’’bþ]†ÊÈ‚¾´\Uxr _e#û!ôŸM±™¦=uÕ> endobj 265 0 obj <>stream H‰|OmHSa¾wîCsNôz¶º{A!G¶Y‘‰´r#ËåÜŠRКî:Wº»î]0ü“°œmÒÌ 0¢V$9¢tQ4°…Õ JЉJýQ‚÷ÎwQwú¿óãpžóœç9çà˜X„á8¾Ñh­?ÑbØfêc6»™e¶7:Ýž,UÆ«p¾TÌo–“­È¿^•I¶`ØÃwÐWƒE_ÓÒbL„ã×÷ T ¢SvVUU½é µóнhpu2¬›amÚ®úž`ÉŽsÀBs4{>Û<¦µjYpy@=Íi›vÙ.‡vý0àä€ °´Ã)8²´xX›îµ±gÓõ¿m:£õhŸ›{€î„(ÂlÓÚó˜ ÃæðîJ_œÿÇ…\Ïñ‰ùÁ´93(…~ôŠDupD¥ ç$Ì‚LP–‘¶¯Õ° XÊ?#³Ê"…7§"ø£8œ‰çÀ/ Kæ öCOõ ’"¼¬yը߿´uYu9BVš`>lð«á¾”/AÑR6†VTˆ0Já‹ðŸã¼(–ÃJ#hvH6•À¸{q–(“mËHuÐâ¦mÔÓ’[w£÷*( ï×#q­5 ƒºÉ$qɲÍOGâÜ4¼;#RDúÓ²l¯Qc [¾8ÕeDªÆqüH²â‡æBìç(úØöF7A ˈÅTävâ…’H~;<‹pŠH ü‘“šæ·ÉaõûØë…;ÔïÞD‡NYÛÔ\IÉa~ž\˜0™ë[N9õ®›ÖÉKŸsg¦_~§ÞPºzu\…;Bñ+™s#R8Ì0¡'ÁÙ:ׂºP,”ñsùCÔè§{>stream H‰œ–yTSwÇoÉž•°Ãc [€°5, ‹ì ˆBHBK!aPªVÊX·Ñ=uº¸Žµ:X÷©KÔè£ãÐZ\;v^àõ´™N¿üÞçÜß½÷ý~÷Þw΀.MÑh«aUZƒ>31[”_€‘& (€DȵºÔ¬„l€K/Ájq'ðVO¯›V®¥éþ?±:½O“Žs€RU«À¹çÊzƒÎdŸÁ™WRab5±? Ζ&Vϳ÷œÏSº7åÁâT¥rc¥3ÕMQ]YmÔcµ:¹B… :Ä¿9ð—Ïá©*UéUZ<"Ÿ2V·[«Ô4ÕZL£ýOMüa?Ñü\ã⎽¼"ÀºÈÈ?.”KHá6|zÓ·J.HÇŸy÷æç~NÐϳÂ}¦¥V£ž‹“dfc £¾n~ÏôY &à+`œ;ÂA4ˆI dƒ|°(@¨zPZ@;è=`=؆Áv0vƒýà ƒàÏà<ø\·À$˜Á x ^AD‚²‚ WÈ ò‡ÄP$¥@™P>T ©!-d„Z PÔ C; ÝС£Ð èt ú š‚@ßA/a¦Ã<Øvƒ}a1'ÃÙðX ×ÀMp'¼‚Gá}ðaø|¾OÂáY 4„8"BDŒH4¤)EôH+Ò "£È~är¹‚L"(å¢*DÃQ)šƒ*дíE‡Ñ]èaô4zBgÐ×Á–àE#È‹jB=¡‹0HØIøˆp†p0MxJ$ùD1„(%æˉÍÄ^âVââqâ%â]â,‰D²"y‘"Hi$9É@ê"m!í#}FºLš&='ÓÈdr¹€¬%wÉ{ÈŸ’/“ï‘_QXWJ%¢¤4Rú(c”c”‹”iÊ+*›* FP³©åÔvêu?õ õ6õ Fs¢…Ò2hÚrÚí´ÏiS´tÝ“.¡ÒôuôéÇé_ÑŸ0 7F4£€a`¬cìfœb|ÍxnÆ5ó1“™)ÍÚÌFÌ›]6{̤0]™1Ì¥Ì&æ óó"ó‹ÂrcIXrV+k„u”uƒ5Ëæ²Eì4v»—½‡}Ž}ŸCâ¸qâ9JN'çÎ)Î].ÂuæJ¸ î î÷ wšGä x2^9¯‡÷{ÞoÆœchžkÞ`>bþ‰ù$á»ñeüJ~ÿ ÿ:ÿ¥…EŒ…ÊbÅ~‹ËÏ,m,£-U–Ý–,¯Y¾´Â¬â­*¬6X[ݱF­=­3¬ë­·YŸ±~dó ·QØtÛ´¹i ÛzÚfÚ6Û~`{ÁvÖÎÞ.ÑNg·Åî”Ý#{¾}´}¹ý€ý§ö¸‘‡‡ÏþŽ™c1X%6„Æfm¥ŽFÇŽޝœN9NNœî8SÅÎ¥ÎÎ'g\\R]Z\öºÜt¥¸Š]Ë\7»žu}æ&pËs[å6îv_`) š{·ÝîQî5î£îW=ˆb ­_zžAžež#ž½`¯`/×V¯KÞïPo­÷¨÷ !]#¬îNùð}R|:|Æ}ûºøønð=ëûÚ/ȯÒoÌï–ˆ#JuˆŽ‰¾ó÷ôWøø_ `$´ ø6Ð+P¸-ð¯AÜ Ô UA'ƒþ¬Þü Ä%¤8ä½bž8]Ü+þ<”Úúqè‹°à0CØÁ°† Ã+Â÷„ß_ X Z0¶àn„S„PE¨úU÷J#JûKï«#ÔÕÊ¢ÊËi$šaÍ·åÒòíåÏ*Ò*>¬ø±2¯ò@¹ª¸ê¨–£­Ðž®¶¯n¨¾¤óÒué&kÂj6ÕÌè“õ;k¡Ú%µG <ügê‚ÑݸÒ8UY7R÷¼>·þP»AÛp¡Ñ³qM㽦„¦ß5£ÍŠæ“-Ž-í-SËb–íh…ZKZO¶9·u¶M/O\¾«Ú^Ñþ—¿ŽþŽïWä­8Öi×¹¼óîÊÄ•{»Ìºô]7V…¯Ú¾]­Y=±&`Í–5¯»•Ý_ôøõ öüЫèýb­híÐÚו®›è îÛ¶ž¸^»þú†¨ »úÙýMýw7¦n<<€ t|¿©hÓ¹ÁÀÁ훩››'‡þ ¥ZþL˜¸™$™™üšhšÕ›B›¯œœ‰œ÷dÒž@ž®ŸŸ‹Ÿú i Ø¡G¡¶¢&¢–££v£æ¤V¤Ç¥8¥©¦¦‹¦ý§n§à¨R¨Ä©7©©ªª««u«é¬\¬Ð­D­¸®-®¡¯¯‹°°u°ê±`±Ö²K²Â³8³®´%´œµµŠ¶¶y¶ð·h·à¸Y¸Ñ¹J¹Âº;ºµ».»§¼!¼›½½¾ ¾„¾ÿ¿z¿õÀpÀìÁgÁãÂ_ÂÛÃXÃÔÄQÄÎÅKÅÈÆFÆÃÇAÇ¿È=ȼÉ:ɹÊ8Ê·Ë6˶Ì5̵Í5͵Î6ζÏ7ϸÐ9кÑ<ѾÒ?ÒÁÓDÓÆÔIÔËÕNÕÑÖUÖØ×\×àØdØèÙlÙñÚvÚûÛ€ÜÜŠÝÝ–ÞÞ¢ß)߯à6à½áDáÌâSâÛãcãëäsäü儿 æ–çç©è2è¼éFéÐê[êåëpëûì†ííœî(î´ï@ïÌðXðåñrñÿòŒóó§ô4ôÂõPõÞömöû÷Šøø¨ù8ùÇúWúçûwüü˜ý)ýºþKþÜÿmÿÿ ˜óü endstream endobj 232 0 obj <> endobj 235 0 obj <> endobj 239 0 obj <> endobj 242 0 obj <> endobj 246 0 obj <> endobj 250 0 obj <> endobj 230 0 obj [/ICCBased 175 0 R] endobj 251 0 obj <> endobj 252 0 obj <> endobj 253 0 obj <> endobj 247 0 obj <> endobj 248 0 obj <> endobj 249 0 obj <> endobj 243 0 obj <> endobj 244 0 obj <> endobj 245 0 obj <> endobj 240 0 obj <> endobj 241 0 obj <> endobj 236 0 obj <> endobj 237 0 obj <> endobj 238 0 obj <> endobj 233 0 obj <> endobj 234 0 obj <> endobj 176 0 obj <>/ExtGState<>>>/BBox[8.1748 1102.53 706.217 377.814]>>stream /CS0 cs 0.18 0.192 0.573 scn 1 i /GS0 gs q 1 0 0 1 8.1748 982.335 cm 0 0 m 349.021 120.191 l 698.042 0 l 627.619 -362.355 l 349.021 -604.521 l 70.422 -362.355 l h f Q endstream endobj 189 0 obj <>/ExtGState<>>>/BBox[8.17627 1102.53 706.216 780.829]>>stream /CS0 cs 0.18 0.192 0.573 scn 1 i /GS0 gs q 1 0 0 1 357.1963 1102.5259 cm 0 0 m -349.02 -120.19 l 0 -321.697 l 349.02 -120.19 l h f Q endstream endobj 196 0 obj <>/ExtGState<>>>/BBox[357.196 982.335 706.217 377.814]>>stream /CS0 cs 0.18 0.192 0.573 scn 1 i /GS0 gs q 1 0 0 1 706.2158 982.3354 cm 0 0 m -349.02 -201.506 l -349.02 -604.521 l -70.422 -362.356 l -70.422 -362.355 l 0.001 0 l h f Q endstream endobj 203 0 obj <>/ExtGState<>>>/BBox[8.1748 982.335 357.196 377.814]>>stream /CS0 cs 0.18 0.192 0.573 scn 1 i /GS0 gs q 1 0 0 1 8.1763 982.3354 cm 0 0 m -0.001 0 l 70.421 -362.355 l 70.421 -362.356 l 349.02 -604.521 l 349.02 -201.506 l h f Q endstream endobj 210 0 obj <>/ExtGState<>>>/BBox[8.1748 1102.53 357.196 619.98]>>stream /CS0 cs 0.18 0.192 0.573 scn 1 i /GS0 gs q 1 0 0 1 8.1763 982.3354 cm 0 0 m -0.001 0 l 70.421 -362.355 l 349.02 -201.506 l 349.02 120.19 l h f Q endstream endobj 217 0 obj <>/ExtGState<>>>/BBox[357.196 1102.53 706.217 619.98]>>stream /CS0 cs 0.18 0.192 0.573 scn 1 i /GS0 gs q 1 0 0 1 706.2158 982.3354 cm 0 0 m -349.02 120.19 l -349.02 -201.506 l -70.422 -362.355 l 0.001 0 l h f Q endstream endobj 224 0 obj <>/ExtGState<>>>/BBox[78.5972 780.829 635.794 377.814]>>stream /CS0 cs 0.18 0.192 0.573 scn 1 i /GS0 gs q 1 0 0 1 357.1963 780.8291 cm 0 0 m -278.599 -160.849 l -278.599 -160.85 l 0 -403.015 l 278.598 -160.85 l 278.598 -160.849 l h f Q endstream endobj 221 0 obj <> endobj 214 0 obj <> endobj 207 0 obj <> endobj 200 0 obj <> endobj 193 0 obj <> endobj 186 0 obj <> endobj 171 0 obj <> endobj 268 0 obj [/Indexed/DeviceRGB 255 269 0 R] endobj 269 0 obj <>stream 8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn 6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 139 0 obj <> endobj 140 0 obj <> endobj 141 0 obj <>stream %!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 13.0 %%AI8_CreatorVersion: 13.0.0 %%For: (Apfl Strudl) () %%Title: (FIFE 2d isometric engine.ai) %%CreationDate: 7/18/2008 4:52 PM %%BoundingBox: -306 -534 894 1386 %%HiResBoundingBox: -306 -533.8701 893.8496 1385.8896 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 9.0 %AI12_BuildNumber: 406 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_TemplateBox: 298.5 420.3896 298.5 420.3896 %AI3_TileBox: 10.1968 14.4746 586.1973 833.5942 %AI3_DocumentPreview: None %AI5_ArtSize: 850.3937 1275.5906 %AI5_RulerUnits: 4 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 10 %AI9_OpenToView: -879.3496 1175.2588 0.6667 1610 1103 18 1 0 73 97 0 0 1 0 1 0 1 %AI5_OpenViewLayers: 7766677777 %%PageOrigin:-165.4004 159.8789 %AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 142 0 obj <>stream %%BoundingBox: -306 -534 894 1386 %%HiResBoundingBox: -306 -533.8701 893.8496 1385.8896 %AI7_Thumbnail: 80 128 8 %%BeginData: 5734 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFD0EFF %AFAFA8AFA9FD4AFFA9AF847E5A8585AFA9FD44FF84A9847E535A5A855A5A %5A8584A9FFFFA87D52527DA87D7D527D7D7D527DFD32FFAF85542F5B365B %365B36362FA9A9FFFFA852527DFF7D7D5252A87D527DA8FD32FFA8852F30 %0730070E0730072F7EAFFFFF7D7DA8FFA87D52A8A8FF5252277DFD33FF84 %5A36300729072907303085A9FFFFFFA8FFFFFFA8A8FFFFFFA87DA87DFD32 %FFA9A95A610E0706290107305A7EAFFD43FFA985855B0D2929070E615AA9 %FFFFFFA87DFF7DFFA8A8FFA8FFA8A8FF7DFD33FFAF5A856030072907365A %7E84FFFFFF7D52FF52A87D52FF7DFF52A8A852FD33FFAF855A855A300736 %5A5A7EFD04FFA87DFF52FFA852FFA8FF7DA8FF7DFD34FFA8855A5A300E0D %5A7EA9A9FFFFFFA8FD05FF7DFD3CFFA9AF7E5A078585AFFD49FFA8A97E84 %84AFFD4BFFA9AF85FD4EFFA8FDFCFFFD86FFA8FD4DFF7D277D5252A8FD0F %FFCAC99FC9CAFD0FFFA8A984AFA9FD22FF527DFF7DF8A8FD0FFF9F749F74 %A0FD0FFF5A305A2FAFFD22FF7D7DA8F827A8FD0FFFA099446EA0FD0FFF5A %300130A9FD22FFA85252F87DFD10FFCF9E7598CFFD0FFFAF36307EFD24FF %A8277DFD12FFC998C9FD11FF855AFD75FF7DA87DA8FD10FFA8A87E7DA8FD %0FFF7DA87D7DA8FD22FFA8A87D7D7DFD10FFA87DA87DA8FD0FFFA87DA852 %FD24FF7DA87DA8A8FD0FFF7D7D7DA87DFD0FFFFD047DA8FD24FFA8FD13FF %A8FD13FFA8FD6DFFFD07A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8 %A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FF %A8A8A8FFA8A8A8FD10FFA8FD3EF8A8FD10FFA8FD3EF8A8FD10FFA8FD08F8 %27FD0452FD11F8264A26FD11F8280600FD09F8A8FD11FFFD08F87D52F852 %A827FD0FF84B99C1744BFD0FF829365B0728FD08F8A8FD10FFA8FD08F852 %F827FFA8FD10F84A9F4A754AFD0FF82F36013000FD08F8A8FD11FFFD08F8 %275227FF52FD10F82699997526FD0FF82836300D00FD08F87DFD10FFA8FD %09F827A852FD12F8204A26FD11F8060100FD09F8A8FD11FFFD3EF87DFD10 %FFA8FD08F8FD0527FD10F82752275227FD0FF827272752FD09F8A8FD10FF %A8FD08F82752527D52FD10F827FD0452FD0FF85252527D27FD08F8A8FD10 %FFA8FD08F82727522727FD10F82752272727FD0FF827522752FD09F8A8FD %11FFFD09F8272727FD11F827F827F827FD0FF827F827FD0AF8A8FD10FFA8 %FD3EF8A8FD11FF2752275227522752275227522752275227522752275227 %522752275227522752275227522752275227522752275227522752275227 %522752275227522752A8FD50FFA8FDFCFFFD0BFF5252527DA8FFFD04A8FD %0AFFA8A97EAFAFFFFD05A8FD07FFCFCFA0A0A0CFFD05A8FD1EFF7D52FFFF %F87DA8A87DA87DFD0AFF7F30362FFFA7A87D7D52FD09FF9F997499C8A87D %7D7D52A8FD1DFFA852FF27F87DFFFD05A8FD09FF84300130AFCA7DFD04A8 %FD08FFA0746F6EC9A8A87DA87DA8FD1EFF527D2727FFA8A87DA8A8FD0AFF %AF5A305AFFA8A87DA8A8FD09FFA79F6E9FCFFFFD05A8FD1EFFA82727A8FD %11FFA97EFD11FFA69FCAFDFCFFFD0FFFA8FFFFA87DA87DA87DA87DA87DA8 %7DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DFD12FF27FD3CF827FD %12FF27FD3DF8FD12FF27FD3CF827FD12FF52FD3DF8FD12FF27FD07F82727 %FD15F820FD1DF827FD12FF52FD05F8275252527D272EFD0452FD0AF80029 %2906F8FD042752FD09F8204A7520F8F85227522727FD04F827FD12FF27FD %05F8527DF827A87D52847D7DA827FD09F829305A30004BFD047D27FD08F8 %4A9F99992052527D52A827FD04F827FD12FF27FD05F82752F8A8FF27272E %282752FD0AF82936013000FD042752FD09F84B996E6E4AF8FD0527FD05F8 %FD12FF27FD06F87D27A8A827275927522E27FD09F828303007F82752FD04 %27FD08F8209F9975F82727522752FD05F827FD12FF27FD07F87D7D27FD11 %F80001FD11F8204AFD0DF8FD12FF27FD3CF827FD12FF52FD3DF8FD12FF27 %FD3CF827FD12FF52FD3CF827FD12FF27FD3CF827FD12FF27FD3DF852FD11 %FF27FD3DF827FD11FF52FD3DF852FD11FF52F8F827F827F827F827F827F8 %27F827F827F827F827F827F827F827F827F82727F8F827F827F827F827F8 %27F827F827F827F827F827F827F827F827F8F827FD11FF52F8F8F827F8F8 %F827F8F8F827F8F8F827F8F8F827F8F8F827F8F8F827F8272727F8F8F827 %F8F8F827F8F8F827F8F8F827F8F8F827F8F8F827F8F8F827F852FD11FF52 %27F8272727F8272727F8272727F8272727F8272727F8272727F8FD042752 %2727F8272727F8272727F8272727F8272727F8272727F8272727F8272727 %52FD11FF7DF827F8272627F8272627F8272627F8272627F8272627F82726 %27F827F827F8272627F8272627F8272627F8272627F8272627F8272627F8 %272627F827F852FD11FF52272727F8272727F8272727F8272727F8272727 %F8272727F8272727F8272727F8272727F8272727F8272727F8272727F827 %2727F8272727F8272727F82752FD11FFA87DA87D7D7DA87D7D7DA87D7D7D %A87D7D7DA87D7D7DA87D7D7DA87D7D7DA87D7D7DA87D7D7DA87D7D7DA87D %7D7DA87D7D7DA87D7D7DA87D7D7DA87D7D7DA8FDFCFFFDFCFFFDFCFFFDFC %FFFDFCFFFDFCFFFD5FFFFF %%EndData endstream endobj 143 0 obj <>stream %AI12_CompressedDataxœì½gW*I»0ü~žµæ?A:Ð EAÁ  $ 3÷žÏo¯  Qw8ç™sžM-÷†îêJWU½­Ö2j{Ô´3|–‰üùÇúº>±³Ñ¤Á—#¥~>MÐ¥äy*ÂB5TK-ÉO´æ¥=™öFþGîZèù¤:îô#µÙdÞî§"ɺQïÍú6ܲJ–áÚ‘Þt4°g“^+b_zC;Ûè¥ÜA@£FcÕ¥+ç8†‘#ù‚ÀEª'¨Š6šÛ½á‹6úO!’á1’ø|DVò0YDU{çö4´Ÿ•%†…Êð%¯ˆè !+Ë ~̵æ{8«NF-{:ÕGýÑdZˆèßÃÈIãî4"7v¿?ú;¢õ­7ÿ3Öh8ƒº'ß&½FÈ”{/ݪ‘ö]<·_æýÆdñ²6ê·ýÚvÛnÿŠ&Õ’ðdõú6fИE &µÄrOÚ¼×oŸÎM@–gD|“¾˜Âlaâè;¾.=•p©fÏf°¢0( íóÍ¿Tp—䌩‡q ù¢-×íÁ¸`Åðà9+Dò“åañ~:À¸qe–ɲŠ(GØ|6/åň ‹pAâ#2ÀSPò}ÀƒŸýWÏþ»9 mºêdVëý“’èDá¥ËIÃ"3Î=Xñrã›ðŠeh/•±=¬.ñ3²¤dyŒš,Œd9ÂdEQ„‹,ôÃ2|„•q°ŠäöŽÿh/¨EÔžÓ•$¡ÐÁ­  ¬Lz@w… + Ù<Ãí І¬PxLzmÜ‘É?xžYÙ÷§8t6°8³™=t PM?ñ!“=©¡A˜Ã¶> pM1UÊ ›ú£z×ûïAóñŸÜýù¯äÞ磙=…ûvDs/“Æ_6TΙóɈšñÕh6¦v®pì ÉÕv“\Jî§=è>×n¼¼ØúÜϵzÀ¥NßþOnlOfÝÑ|Ú¶sµVc2æ^€vpÛ}»3ËULÀL´.@{øû‘«Û%®êü ·šs¸:ËÙÃvcÚÍÙüß ÈÒÎñ´íAc<&7]è”<<²sí0Õé´‡`—»i÷ì ÌxÉMÇ,‡˜Ïµæ“‰=l}ƒb®9½ÙÃ&â¬(çœú¹Öhü¶9iwìAo 9ÂJ\Ö¿×jô‡£Y®ûmܵ‡¹ ¦lx°4ZhX°¬¤Ü¤<9Ÿæf¦sX´Þh’›u'¶íþj´æ3;7˜þò9|­ÝøãÖZv»×ï7 % Y÷ Р1mÍûxD²Œn¾Ïx}í6úÒ½8° —S1>@S*éQõAS%뫺³WÑrª™Óér&~W"µJ¤‹’¯NÉ­cκ¹SÜ!4S!TÈß2¦ŠûÜ`ÞŸõÆýo¹Ê´pâ™ÐyøÂ÷ð…ûÔ ¹YïŽ&€-60ü! Ú4× 7œù4|O7H× ·‘^ކk9Ëa“ÇmÒºí= MÙîs=R«Gjõ|]ôÜ:6,Çt8"ÕGΘF¾F´Šû\»÷W] ‹1'ÎIOóÀxæî3ßÈí^ŒoÎå?ÿ¨›„E GOõ)H ŸàŸ0£1‡­Ò ‘§Ñ»,Šïr‹ur‹Ïö\¿ý÷|ÍiŸèYõocû‡FDå~˜&½š[~ò¿jdHõXÒDcB—r |y4¤ç'Jpu†ÙÏéß“Ÿªý9Ü<˜ŒæãÒ°3úó$Ñf«Y”6`µSPIÉ5ò3B«åÞ_ÎEPGÇ©Oš¬}4GýÞtà6è¿â~ÿJSõ Ð$Ì´Ò|µ[3xš^ð¾Õæ½™ý•¦ªHøN†•!™ñd>íFê£Qß$­@o¹“­†<ó¯éÄ­ÖÜü÷6®7@³.5î‚}Ò~È}·£Ï~¥[P¼&¶×þ ÿwÐÿ_Bè†Z؈ƒ·Ü.–ŸøwôƒÕé Ûð&oåGƒ12 #µncŒ.£š–¯æWÆoذ¦|¸¯šÃ¿ìþhì€{äpäª1‰´ú!ðf|Ãms¦j¸Ý·Â×¼fÄ7ýœ1“ùó)¢ ýœó`‚¤ýpÖø©ýwÄù©ýݘµº`•@[«îæ"Z«á;þ‘7q1|E÷5´(´È´Hy0NпyÑ-þsŠóáñŸçð*,ÿ1¼…‹I X üo@ÑqÑxÿ)¸È´H¸ˆP(¨qòáp{‚g8‹39ƒƒá_ÓðŸÊ)øO†"q EÀ Ë1¬Åd (:«±*ü)¬ÌJPDV@ƒfù?ÿØÃki Pòxð<ƘŠnj¦j*¦lJ¦h °àœÉšŒaÁMÃÐ ÍP Å É @Àt¶¥n醮뚮êŠ.ë’.ꀅÓa0:£™š¡éš¦©š¢Éš¤ *^c5FµTSÕU¸¡ªª¬Jª¨ 0©Ê©Œb)¦b(º¢)Š"+’"`0r «0²%2t%«²"Ë`M X´À¬ÌH–dHº¤Iª¤H2X¢¢V6,;ËÁˆ–hІ¨‰ª–>«€ŸƒÂŠŒ` 01ATAdA@^àF`òÅ9 a’»–¿øóßÚ¢ùÁc.º¥á¢Z K¶DT Eð‡`Qã)61¨˜ÎÇ XE Á-pK¢ø…0Œ7óÎZ<T< TI4€‚‡äƒ !P½Lé™Ð+‹¨(ÒÂÔȆ)QžCsœÒ J_ ¦-S¡-BY&¦* +0gU(e!ÚBÔųP•eY†eÐ0ŠŠ E‚"Bh&ò爑ÐÂù ë+ßñqÖð(@JÐL  Á"t‚¡ ‹@9Ðt¤ÊзluY0h- 0¯¼"üù€@„&¡*P£ 4©e;Z*L†SÝ0 c¨5ªe#úÖUhÝT-X`N÷ç,À  ˆ¸‚Œš„ªð 8 ŒfÁ"¢¥ç€¡"″  ÉÀgà6šŽ>  êŸÀ²³œÀ™òˆOÁÔaJ p.ø—n iX& x€a ÆE°¦ª¢®MÝYK€7â§:`ÉZ0ƒÇX|‘1gF\x6g Y@°L./Þ)XèX>Xy€à'‡e ’:€B Ö`‚`´¨Á†ó€é`¼˜¯GÒ€ ¨(Ä}ð@'r¶‰2¦–QÎfŠ  ÜŽ’$ä“]\À˜@ñ€wq€`¿‰`ðfØS¸¨ë.Ä ¼ ´%ÒÎÊœ _ÉYKÄ \Ä&Žž,b1]¡"â"Ñ"Ó¢àC ‰Q Ó¨ŽáDЉ‹E %,§;çC/îQÀt WR$\dZZT\4Zt\ ZLZ,TYbèähw¼óÁÌ kÆc )ŽÆ@ô•XR¼–ùÈú“6Áê“e¤¼ÀF˜,ŒšAÞR%ϲ2v *œGNSX>À5T Æ!ñ ] `3 j¹IŸ~²mŠFÂ3‚,s¨¾ÈHr9q³ÐpuôEbˆ“™Qd†G­áÚyÒˆ$?Õ ‰fxjª£]~jÊ­TM¹Œ†÷©¦ æ~˜Ñ‹‚Ù?)Ž0 ßtß7Ý÷MG‚Z4p1© q¾™Œå*üÄä“CR>â"ñGÅ•Ct>òsÉtÕ‡âAd Æ$i*½ÇÁâ6L®Ë$ FXOØ%"‡Urùª; Ø#¦DÂÆè°E‡)Küó—%"†HØ¡ a„À‘´êuÕ ÊôËCB1<¸=M˜œ¸Äè0«s™]ÝÁ€å-3½ÛsEšFEhDœ TœÉŽ(EDhdDˆ‰X€!᥹¢‹ÃsbˆêhhNQÜ"»Er‹èÁ-y·€Â-:ÚœSêâ¶H1´=¿Æ§c9 ü ÿ¯ºEq‹ì¬ºZµNuN˜X+Ž­b†Z*üG¶ h®µš‚I­¿­Âck…¥\´VDj¯p®Åb¨*l³(~«„ X-*²[œ9r!û…Çö ±`LlÃh® #,&v Gí©/ ¶ŒRht<¿=£S‹Ù4µjxjÕXX“6°&­ú4i¿.måÁÞı£¬Q‹Øæ»[» Q$Òx,±E,™u¥pmI£2Ó¤r’¥RËC˜¢+*÷tªA™9‘ýÇÄaMŠÇÖº€™†ˆ-33`!0\Íõ8d?¸¨O•rë^N!‚Ùq xX^`@"ÖÎ~&c Eõš lÁ¸„ÐÜ\lwµ4…êiA-hj~=mAWÚ‹u5ÄÈ ]ÊÄ–5¶0­mYsst7Ÿö†)AvõsÌÊ|ìÌahb@C'ú9úCÌÀrµsø(2¨¥ËTOG:ºSÈw‡émÝ¡qÓY=| ¡…@µx‘Z˜ˆ«¨X—GÕ‘±Ë`nF,VÄ _Dÿn‰9&pô?á¥0èÿR ü×´è0cç£Ã DÌ3ïŽE¹¶ë!Ú3¡‚ÞÓ%<;”¨°yZ,ø‰è—±]«RU†()02¬…"Oõw)”/x\aÙ‚rì'à( ôiÓ<çÚM®r€éÖU 0õåQjô†ÕÛF,æœyJqÈ&B´æ© ¦-DY,U R b:²0ý¸*ÅפO¨ìQäÐÙåÏ×¥ŒÞ/yÂäN˜Ô “9XÞ€­”8aò&LÚ¸²Æ•ˆ²;¶°Ñ-/l„¾1bNÊc“mQ.†sy¤KcO<&•Œ*õ"%#CýÀõú:¾&{›xâ×Ū”çÓU]o“ãoò¼M¦ëÅ%ž&¿—‰uVú˜5jz>fÇ¿ìy˜ó3KMx<¸`¦ #ÓñÈ4<:•ÚºÄß,¹#ðhóÔ%ÞgTêƒvÆxöšáBüf ž‘L­yÇFýÓ®1B>ÔÀÁþ4j ¿Ò}~5Õç[ó¼k¢ã[£ž5ÏŸæøÇ‚¶3`+bW`XE$iGŠœþ…¿ cÝ$_–LÕ{žXËŽÁ ¸¤0ÈÜ•eБò¤Ç° Œ-nøiã³€«Jˆñþãm‘1åÑ„ðóŽ™ “A¹aydóÃô'"Ã[ÄùbL˜7á'úV|~•ŸGá%¿ O6aÙÓ¦l;„q‡ˆu#Æ­R…IÄÌ{ë^ŸctÙ"دˆ1~Ì´–-Y6ÐÒ‹ô ËF¾ši;lÐþ0},PBìÏeä: ðˆIxFÃ#…Îð8Ñ(M`Ú*Vr%<>³i4*$žeêú"…Ñ ±×? ë ÃQ &LBtŽq¢S†ˆ˜!b€˜ùr°z”ÑÆKœü(º¿¸C`°ÙoQÓÿöÝêØ«Wöã*Ø—+cYëRÿR>›ßÏæc¤ÆÑ7‡÷©”÷é4f1 çñ@¿UäEâP¾ ëf©äݼÑÍIQ(ô¢r^dΉαn|ŽG»&ݧóÇê$𙫸¢vJ ‡WóP·¡Å`,/XÌÅèâÒëFøh”àáEûhŒÆöHtOññtœtàjDè>yÀÑvY. $ŸUH¸?âÿ¼/"èqÿ0›0,èYƒ>nÔ2·÷sú eµhW-ÚT@t€ý~›Š]°§– ϳ¤$js(ž5…l ÐoYŸÆ‹‘‘ZÄÂpbuŽvîz±&.¸9|’›Ã§ÓÖ©ãZ2ÜBP¤Z8ÑÈan4ö‡Šùa–ì•=òoh‘DEj“Hp4†¨ÀJs?àÀbCbŒ¼[¨Î -z:«Dõ=/ÒèÆ©®ÉQ­R º££ý¹ú²30äiŽß²OÈ\ò )^ÔÑwD¼ ë@õþÄ$}$ƒp Ò;ë‹AzQH‡ÄzžHé°¹4@ËCtÎù¢‘$QÉ¡q¤Õ 8&©¸ø¯ÓìÇ6õ¬S_¼Üµ ½È¤?6éE'A{pÝ^ŒÒsu{Y2^œÒ‹Tz±JÏå -ºno/fés~ûÜßnä2,:èÅAÓõ"˜ž;Üuˆû¢„ºÏ-îÄ2ó¾Ý4NÚ¸æs{±Â°,ì$wÖÿgc´‹Î~˜ÛOÆh#´ØË÷]1Ú¥˜ç‚6‚së#ž‹ñNs)Ö¹éôÅ9Aqöª·;³àt÷û°'ÀU%ƒQPei§ ÷X#¢$FëFEiv¯ß‹áŒúc£þè¨?>ÊáôG7Jˆ“ÒH)Í[ö"¥N¬T¡ùÎ^¼”FL©ýìšúâ¦näÔ;¥;œ4T/zJã§Àu¥…j0Žê¤®Š¥R³-Ë9> YJ4$JŒ6¸†BÈÎá±íRý™f‚‘ÕïNeæÄ¬Âðâ¯ÈŠvš¢™Ñt Y%/0Šì ÐfE< µ ¥~ÿ³?kò|¨—6æQ/K3_9š8ÆS]] E¤›<$j©4+V£æ’N'25¦LÇ{ê9ÍÀå©E@òìH¸@¢›MȆ…:2TU =X E#X|=ñnO‹ý,÷¥„ÜñîÁX EïƒÇâFNM uÚ— žc@ª8Z5”9¬Áz å©Þbˆ­KûçN†°£p»Lò{ò'̳‹Pvü½Œÿ'zúÞ~~¬§‹“hv…èæ28Ù Š›ýNÄßû$a"¾‰j“Œ ÿ¸Á çY'Ç„uG,ÚÁ-sÖ_ÑÚϲQe-pyÁÅäiÛÔÛjR žs­tOß^¹7ʵ°‘†gÒm~/«çcý8òâYÅÙuȳº*êºjW”·ç0B×— º÷—"˜ØÞö,n_ ó‡Ò œ0<ïæxúó;±Å…ön‘dlqù=틾v’Xám÷Ðè¾(‹ÚXÈÂ’yПÝÌnÇËN’9¼­È£bQŸ Oý)Ä›âmü@–±ž s8[dÛÀ–dT£|jCÁ¥£È8ÇÓX°§pާ/‚–và%%p úçKfð,\Ÿ®ô]ðøÂçߨ¢Ï¹ú³FТ FÑOA‹&Î2ú)#hÑ„þi#hÏqMKf½r^N5I6ög­[Y‘·ºåeÙ ]‚&@X hL—¡ºlÚ\‹]†mt]ø6å›8¨O6±ë¾@¼~÷6Dy¡w/ðîÛòð°|¡w÷¹ÉÛÐämc© F IÑŸƒ“þßnî»ïÏ\¸fRß“›%ïÞ3|uý-ûž§Ê‘ó¥ô‡½YŒ›uOvyþÈ€ïW?·¸üa¿VèAKW]³ßÙùþKNÛÊþÎÏ>;ïì·[ÌSãC¡·pÈ…ÁCÏ=þÈsˆ…Á/ ‚á0”C÷D„Ã1 ’!°)Ä…Â3|wDD`ŠcÆ ¸†g¡õÃï RÜ7Pø fÜkŽsÍ„çVs\jÎy»~W9U×ïH“.4ÞÝýƒÝg®ëÌqœi—u˜.ôy×Yæ¸EÍ€‹Lu÷Éçu‘B¾=²¦»cHwwÆ:»b%ßÞ¡ý÷9è¿ÏAÿ}úïsПƒþûô_|üÁŸƒþûôßç ÿ>ý÷9èÿÏœƒ.„½¿ì‡šù_wúùÊW˜q‹áM|àŒäS¨R’„¹ ñ¹iËþ#ŒMšÐÊÓdeG¸9GëðîñYž€£óÄb‚Ì3èòç=q yO‹»ôi˜ ¹òØ©æZ ÷,þöÿ †{~‘¯Åå`ÏŠ§ƒÁ/ÔC¼)Ø[òï õ|1àôp=¿ÐéD&ˆEGhþ´ËŸˆIg¡.ÿ/(Þ¬>šPÎ×ߎ:ðÑü| ^ˆÛûS÷¯ä¾'aÑý»äüEêu8¨Ÿ:=×ï¢ó×uýÇ/~µíÿHׯ'i³¼#^Á9 &+p¬ *Þ³î‘9K²û§šù¢Š_%ª–Ž›ùÎ3þ?Í¢H;y4þÓܼ™ÚQº{ž·pv£ÿÄü<Ö¾“ÝsÝ„F//(Ä Õ‡Ù$øDn2¿S‹ÝŒ/[Hu÷ˆ ™:óäÝS‹U`iÎ\MÇ¡8ÙÍ«XȪȻ)^nÅê¬ ™·B¿¹Ùª/³Â»æýinxÀûóå1`!HB¾L×EüsFé²I xï¥?}ìâîøç“Ô5²=Ã:lß²ETKgfb‡ÙasòÍ 8éR®f`†Øà….—«C—8x Ðô—þ\ÿåÐåbðrEèd•¼¤.Ë‚Ÿ`•A)ð“ þÏ¢W ã”JǸ`ܬOŸåáœ\FSN—øÿO5ó ø¿°Šÿ ‹üÿË™_Tº°‡}Åö#÷˜©å4éå—1Xåv,r'Eq@ïAÔúþHáý¢’ídÅùóãœ+˵•˜ìµóö.RϦCþÐ+Þà Æqœž_Œï‘m™¾ìñÅ-ìœu¶êxa')Ô;þ×rwÚxKç¥'˯<ñ övŸwž,¿ìÄ92ØyÙ‰¾òe'˜‡°$õšY 3'ZAÙÑ+ÆÿîGÃ)aáhR¸¸ Ï#DˆsçÇžÿœA\ÅÄÅW¸ý޽ý޽ý޽}1Rö >¿co¿co¿co¿co¿co?{û8ù;qòwâäïÄÉÿ‡'ïþm÷SBÂÿ½´ŒŸ´Ü¥U–»´´»:¸3ø]ò•à+e*uß^©à¸‚â“Í~™ê?ÔAHWÝ'+M7ìŽ ®ûdçÊ·^ú¾" —w“+tTd'29@Ä‘ˆž_ÃÀoM¥rKżïÜ0"‰7Ã;;LÂm8ï3"‡m8‘!!/¹ï0Ó²ry¯1––Þ^cúþ3¿l]>_.üt9š¨öÎK`L }ã¥؃Žüî».} *Þ>t…ÚHÄ×@^ãò˜­ã¾DÞGÒ®xãYà–TFzç"9åã×ûúegˆô„WIPçD¥U2t…Å'.…¿ÌpAšÒ‚%©+/öú¤f@nú%çŠ3¶ð–B¿ Õ”0Cƒ’Ô/KAš? ;kË/SC"Uî+šþ;MÚzaÝŽøí¯àá/y.cÅyM º$ .ï ååèO6D¥–iøžÊ;ô4ˆ$Aò!ïÆX^?òø/]ò*Ù%‡xƒв…Äùl§EëÊ“T¦„Q´lÉ…V¤/Y†}uð0#eÉΤ–§ÏÌaC!¤ƒŽ"EE„ˆþ¤'Gt<ŽêG?d‰‘#Š¿„L߭͹‘6•¾][À¶<ñ>_BûoÙ¦Çác—^Õþñyhæ¤ÞŽž§ïG·ð;Ò—ýb᪽ΔOƒæËaó`àÜe*®/Ê žsÀTL`(H¹Gª=b'˜™ø_aë¹™Iñ,#ÏZòx¾' <éà})â½(Ó‹‚±>IäI'_ä‹/¸K<|:›ä“…ž„\8¡Íç’[|%¹âõ¥xòò+L¿cü<¸_ôä‡f¥ûeÞ«ÄÃ_&¾ô:q÷5´K¯´;¶×ÿ:qO±òíã½L|áè^œ)bD“C‚;#|ƒî+è{ÑV´¨Åhâð“³}Þ)ÄÉ)ã°•H‹÷Éãרç1[á1kq K6ÜcVã3RœÐ±?UzÃ[òEÜp[¤&‹^‘L]—u¥†Ÿ®v¾=[ÍÁ L„Ë¡%Ã|rQ PIn¶‹“éÂyž Àv“¼5«°c–õ"¿n„™yÇÛ’†vrÛ²¦äd:9v&_ô^øÝì< 8úõ&•&©Þä²u@Z4Üð’EéQ£t¨¯ Q}ÔúŸjiã„3Ò€ *ˆ·¸Õ{9/BF2w„ND·w}bnn•€C”¬÷â^€À šEðR]8„0tˆ.ë  ¤Á( %ž#«À€ä)@”TÈS$WA@^!BwNРX0èÌ…Ó ?“œwv¡wz¡é¥æPç€L¿£>øšKï j6¨^¸¯o_…r²Ë° ƒ® ߀Kiñ`;pÜŸ|ë¹À‚®.“îñÌÏ<áéñwyé˵%:#A4•¾fÛ9ÞÐp ç¾r›¡GÈs^À-¸•|IÎÁ³puú^tÎÄe\ÇçKÖ!§á’€£“²#ÓWx“Äœºók6½-˜É?ØÂ¿ÍÏünó_ä}ÿ%–»²ÊrW½Î®‹)¯ÎÖŽFåY×í©²ÁbТ;gÎkôÝà~U×QweWéõ_ªòºên@Ñ\]TrýÊ­ìž4åWk‰RËÐP ¬†£GçMʾ7uÿè!ÁÒ’KÎò;ú¼`™ES¯ýo”—BOsQšëõÑÑÁ«ÒÑ6µ—Û*çG¹';ëB7‡ý˜Ãnõ1w-ÉvA«%›!=*áäÕÀòŒ› *bUQÅùb$ýTG&(þþ rȾ[¥5ÿ› W ïäAœïFœãŽ3Áq)'¸ã 3]%×ð9£e7ŒK”\×<ÀxÁ`œÐ°!‚°ÇXà©·¢«Þâ2†5¿ ÜbÿÀÜSnLDï% {†«¶N.ŽCq@o &ŠûüÉÁC¹c¹ƒ¹©RKß㾜ƒÂ/)µ+½faênèùÂ?¡òúöIý"•½NûçÝE~•ÔÝÄõïw9î"Wùý(qÕ^¶ÅÓƒ};½:áN¥0—Ò—à˜þ¡±òýpè|h¬|/Ü\UØ…õå,¹J,O_ øTYÑ}¥€L‹«Òt‚Š­§ÜõÖt=¢ŒOÅ%JnPÑ¥Ê.Ð8Qwƒ*¯§öÅ×Q}‰ò먿ŽlRß+&dúzOv^áW‡ƒ*±§ÅØQ±r¢S’söüÈôy¤Q:[’œ Ò!¤ð ÒÏ4ã(¦ôøxÙ 5É޻ˉî퇲h¯à½Txßlˆ~úó­}¢¦ÂÿÑô™ÌLJÖÿà3 ¹§NfµÙ·¾ CÊGñ¯H´`u8¦"¹ÓÆÀŽlÁíZo0îÛî}&RÁï—wvÁƒ@öp<œ]%¼g[ürÝ@í8o®¿þ†~Á·W¸öw$9‰Ü=0‘öŸpïœÔ¼ý;WmÀd"ÛþÉv}Yû\oÌû³‡O'@ûfq!ãA]Ñ ÌÏ5?ƒDqÍ44fõ{fÀ®ž €ÑÏ![môíÙÌ&Ó¨6¿cÜÉ»sh`:›4f½Ñð!…—àú´tÁþQmá=ìnÐÔÙ«Ã8ˆ¿¼ëœu*Óí‡h]“ç»y1r° ?µ]6/Ò–55·êý >àÿ1ù¼ ù¢ÚÊ·2|Ò0÷C sŸ7ÌÿPä9Gás¦KÅ—3]Z“DÔp!?ÜA®uWƒêÊ÷vócâ…u–¦ªy¢ßðß§Í•A€´ eý‚TùAå‘eÈÍÚ·AsÔGMýÎuhlñêªè Qk>€…0³R²sΤ¤¡Ÿ½RE“oôÂõIùtÔ¶WÜÞŽ$ÿ3è¡B¦1›MzÍùÌž¦•ÕɤñßÚÌ/êÅW¯ÕíõÛ{Hkq‘\ –ʽþ™}Ûôv21œ>ýÕ˜L·A®A×`Ý¿ý¹[ݘ®¨ˆ^MëÑÑLƒ?ÿÇ/Ø;öWV©?j½Ùí/-“Suë_1Áfo؆³_™$àLÍžâÙ|a¢þê¿)~~QØåkKÑk4ûö—(ã+þ¿ŽßÏ }- ºÿ„Gólͧ³Ñà_ÀþþKQ´0m ç’¡@‡_ÇÔÿºýÛÆó¿‹”§¿ÿøý?€“Oû½Öÿ6Ž"`mErçv£ÿÁ¬»vï¥û%t«þ+Ø7+ò2ÿéìþîµgÝ/MŽÖüWÌ-#ÉÊçsûÏ׈õß2'çQÞNþÓy}ûÒ¼¾ýKæ|G>šOs4£lwf•ILÚ/Moù¡:ùdm4Ÿ´lm4¶ÿúˆ¹Å8ö¬ÑEë FùéÁÄÛÔ[ò%œóÕÆ—µÕ’7Æö$2í æ}üYX0T¥1™5GI;ÒõGg w'v»7DÎíé¨?§¥ÜŰׂ8ƒRK,q]; ƒÍÇ :šÙCèµ:±§ö,â3 Yohð ¾?ùËŽÔíÿÌ"f»7k4{ýÞì›7:Èå^Êá˼ñbGª£ñ|Lï &Òq2iLgö$ó—Ýš&‘f£ß¶ìåÕ <3šÏú½¡™ÁØBFVu:›ŒÞ\º^U»Õïa©‘fÿŸÈÄ~•ý쑱³P£¿ìÉ9ܦ!£g#"DÞ†£Ö +ò2¹«³¢nàÛ˜ÙP¢±'Á‹À8,!ɉ=íFÎñ:öþÁ˜äà úÏ©ÌgcÂ'q>LœMÃ鸤ÔúCïµqÿq%¢¬ª•haaó/×}™Ø.½¢+yueÎßð§u¿«á‰ëFútÀ^Õe•5(@jvÿ°1rÆìIɘâÛáÂÆ­[µ}D¨Úþude¡®W ƒw•Öq£Ý^ĹAcú¶ˆåÓñh‰g5ú½©ðŠ´Ç½,½˜§—`]&Þ(ÕRDÏF.®¹Ú‹ÃçôÉh¬Nì† cþË_ ·Žoì|SKÕÆÖšŸ^u{­nu2êôúö±íTe=ìԮ͛À­í9¢ßΤõu` @ïÓ³©W5,Tš 0M6lÄæ i·—F¼ÆÛMÚv;¦‘Üéhö}÷xå<%'÷:jfXˆÅ, ÀÅzc`èÀ^ì…¹,Ö›¾õÆM`âo©ûØÀ/§6aY°ìAÉG£fiØE|xýÝBÇ/JêC»¿ÌÛ•Èpä±òHoˆÅÁhÚs—h…ôõ‰].8ÿUQ‹+ëHîèTîœäŽ_n⺄Žr—D`j ¤ºöj ÛTR|(ÈSe$3Õ y «KO}¾lĬ־Cç@µ?X‰åÊ*Ükáî_1RïëKFê÷š‘Ǿ°hŸQirY[$Ÿ‚F[­þ$;€Ç½*d”:“vv4yÉv¿Ré¯eºXm Êv[û´â_ ×÷[‹A¿¢V d2~T©Ï¶°”]¦É…ŠÓnÄŒ_ý­†´ú!ˆ÷EFâ¯öŸq6h¤„-TB¦Ä£‡£qkôYéG+€k´çße.<ÿ 3™´'°*óa+õ%ö„«7†CWu W'p5&úˆÈ~>–¼ÈÖ²‘+» ÂÔ•vä>Y»ªTïS‘¿¸팉vµ 7.Tqo÷\C=ÑúQë >Ù˜¥ÅÚRÓY?Û&MbÕÂÕz>YSô}À¬¯<4n£õë¿>®qûëÍøy(Y1”ª€Iõ —ûè8‹+gó×¹lT…Ïžø¥ÌIYû¸>ñ~ΦGÎÔž}Z¯»X/TÝmÛÓÞËÐïæYU»I½€Ÿ×ôcö‡Ófo6h|Ä”P]Ri²¨¸¬R5€Oƒ²«7ñ¥±ª'!ÏI³1™~´ÈžÚæg_¨=ûX Vž5­ÏªøG8oBõÉÛtaä_¨íü •ý#ÿBõEηB]O:£á‡äŒ´EWÈŠŠÀô*Ïy´ L–ضΪ¾|‰C!=Œ0¨ «øƒŠÄQü™N¤éP}’èNÔø~¤¤c …x‘[ƒorF¯æhÖuUˆÐ•Ñô©Ž…*Qáï°OEÈ®”Ÿ~~!çÙ¬¼ªbÀxI‚&̦i~‹Ðü'Ÿp3h Eñy…T§žß/´äO w 0«ªÕ—‘íò±Wßï…o…ÖYlF’”@WG£f¤2Fè<Ô<'é§þ‚»R¿?Çlw4‰ü„Êú‰„Ac¬Ö‰è£a ÓR„t¯Ós11 ÉÐ" g’ Vr³1+7¾Ù®e^΃¬`Y“Ñ@ÌþMÞ´O9ðÊGÏýˆùÝ“Ó,õiÁ}âÓúD÷w; G­. Æ6FIÙqoØö3»°¹|-ÄÃqaºÓ÷Á¤ñÍ뵄4aµ9rÍð¶ó×cEâ}ëHÜû|ç¾9O|²Þ¸E;|4By`@‰òå§‘¿»ö02mü…0 1Œø‰ ©e‘Æ]VÛ£¦Î܈]6r1ÅM¿Áƾæ‘q‚ųõ@˨kÒÜK£7DÎf_G[èÌ}tÊGd6BM´ìH{¦‘~ãŠ$6Æã~¯E3·ºhx¥¡M¯ÒÛ@<‡Ñ:^÷½id>|C;:³_cÐtkÒû½Á_{îuüvú±ßÁa}Òœ íå¥v±þ•ý™Jç<¡!­®ìih+0 ¾6k ÛÉG^@—A±\ÙÍËžý÷jW‰}F^¤Á|@±«}Ü>G–0į­¬¬ €ÌĘTNh+Gã…Ñpí 3<ðÃõ#æ±@Ç~~ùÁS®½ÃP ܼî‹pu´ÏTjÆÀºJžõç Ÿçü§q€±jžöcâÿ+sA‘ŸÆÌ®wçƒæ°ÑëdV8ÝÅ$Q÷»ï9áSõmŸòæÇöЪðl¨"á(p_EÝ5ä>9‚öÂÀ?¦ü€H bGØSŸ$Î|ò>ÆðEeÇQ÷|"Í$rOoŒI2QÏþÈ,úznÎ÷©€>nêáÿŽ¥|¨yêW÷~PyYÔ˜‚ÚK¸U¼C–4µŸ2Ÿð¸çw)¸Ëý@ù4¢4lÒ, ¡ïbR(Ãf8£í}޲=”„g˜©ñj¼l1kÅíÇìfqgk<-N¹tSÜ.G'N­£™örxV.îäíšÞÛÝkÙìÆËR_åö t(ÖzAº=˜¯Zþ6³¥Få©ZªÍºé=1>·ŒüÚ•öÚ߸‚nŒsÔ mmMR:ÒåÙݽZ׳—«{õ×+<wÞ¬‡baš¤­õ¹•8V+Ú‰¥wŽd†=n¶-½=¸Áœ4Z_ܽògåÝ[í°ß]tã°+ÆÁÛº }í fÃ3ÂÕhy¼‹õZðmkv0Ž5%½?]X“íÒtÔÑ{ÓžˆYgæ®Ê¥â¥Co^Ûv!1š>O!$;IïÝ9½¾ÜOãáîzyó`öÔ¨µç##×ÛMZ¤ÎÆ¡¨ÖOF/ÅËz©a™òÙ5t³“fÌ{wEÆæÖ蔳bá?WÌÖÛ{ÂéJ¿AØtân£ ¼rwC=ï7ýõ·À 7òÒyw3«ßԆУ;žŠu)QÑËïu6 B6FGÝx ˆ„sËzJE»x"À€‡6–Ð\¸ë ªð<¾Ç7A¬ŒÌ­zkòì Hüz-½·+òø®ZÛ*õ^ï¬&EUêÆññaÆÚ1…¾‹gó²9$õë'Åu­Äd¼îãUÀ 9ÖÄ Ð Sw+Í-iû¶l©üÛÚ¶‚SJcóº‘GGŒdf¶:yãxÿ=ïïF{²ÕóaíB­ÍJ3]Î%ƒwûVQY;6ÇyÊ3ÏH¥»ú»Zѵ*Öl¨Ö5¬ ˜©H; ÎÕ§HÛ­‹sUº?:7Ž&›Ïa ¨ÂáCI=¾:C:4ÛÅúÛÁ´bO¨NX5å÷Y×´È~lZ|lW`•Ã1-Pk’tñ`³i-׫ÞJm¾ëDç¹ØÝÇÖÒJS ºñ[K¢¢ÉCüZ­XÆëÕ“Þ{sÛÁú ¨¾›,,ËÞ³$·GhtOm¢n­ÿà5…š¶ö¿Ëð7]ÇÁžñ’Ií“Îø½gPà*z7}£çz{» ¯àRL•7Àþ¬åYˈ§ùáP=Ä €^ù8ò2” îSõd•Í‘Ø#èîÑAõ° Ï<Ú¾¡*oö±Sj§­ç§=Å8¸‘:`µ›ÃäOÛ=‹¦îlŠi¦Óñó™Ñ¹H×¶ .Õ6 )bs‰…0±ÇÄÛ*ú’¬Ç‡Í¸eçÏܺ2ØÙZËÝÉR«|¤U‹0››Á)uÌoÖÕ³ÓÚ¥e¤ÚÎ çG Fz›7«Lù¸9ö,éEçwû†`£wôÞÁÓ“ƒ_YcöX{;Iƒâ_íxÄ[@^™GíÛz7\‡Shú ’)§hÁo=¿2 CzÿÕ]SêÔOÄãìYzÿ²ñîôP—ŠÛÇ7101»Ñ`ãµvÐ~ØìN¸âETÁpÀ@ØMÎ9!^ß@šŸÙ,áŽnì¶®ï€xŒõ¼^|_FøTïížL‹k½!î‹×ú©~¹ïª¢#o¤^ëÎ(µÎ«ZþŠ›-Aÿ1aœYÉ£ý²rxoͨ‚L™t;·×ÔŽñÈK…qV%©·é5EÔAÔZÇ!Ü»ÛI­­?!$ß1›¹ÛqP-'c“뉵šõOÔ`†é{óñuÖÂnËå%=˜™Mm3 ÝNÒüZ¯'¢”Ù/¹í–©S‹âF™°dççý ,9Œ[ºúºc±„¼ƒ–±U\7#¯ò¦šuURÎ_”ü³6€ijÌÊ*H.4-•Ê ·ê®ÚvZýrÿ­¸³7Fa"­?d!mØÚÛÆìHËßÄ.wïó_š+Õÿ­$³÷¸›·Ò)˜'æÈO€bq„äãr„>Ä­âµQ`åè©•º©ÎÔã¶íëu÷ø´m´ÊV âcKÓ¯¼½xܘ°äÑsWð‘¬û ì7}:z5:ÊQßhnöÖ•òódÇRûÃö¡. B,œê¹{ãøx'Gt8±L¶“´ êyÌêUA='îZêž&®£Ôè¯/±¢~5«ópŽkÖ8.Å£k’v¶æÕ«ÈÌžðæÝÜbÁν@)Pÿ ô¸/ûÚå7“)b€JuéÑ ×Bxt¶­di *ÝûÓ¸eTOjÖú8|æÊ~)òÚmÞ#JªÁ7OïÂ@UªÅuþ‹;™l*¼T+q€œÌ÷PËä—‰-þ¦æ“Ú…™œ6Oa׋™nÝb gnVwS+k\ªSmƒÝ8j#ÃúXu+›~Óê#’ÅØï…€ë·¿Ã/ÎhÔîÖd@𷹝ò¬l= ×°~‚CX‡‹'F¶ÒÝñ!5²6S["hGùu°4Š}³Ü¶•Ö%ã‰Gþ¹ú}ûœµ½óìüeLó‹òq»c%?¤1ÊžÝÇѾZkŽ;Ä äÄØ‹6ˆÉ¯>ªx8~wÉÓ“7¸›+~§!mŸUªjm~Á- ab”½)È1mCì‹Öóɺ²Z+¨v£K?i—ãá0w YåZfst˜ù¤^=qõ`6žK1mNød¶‹i>dÿôÀÝóå,´æ#À¥¹"Óy@n¾ƒ:^:u…4f¦¯“k+1ÛZ~®)¹ÏtÇUIØiÖìk¯¯Õ¢QjŸÍŒ£dÒBñÔ‰<©ýÆkLæ,QŠ:]¡ðjˆ^[Sn©†;‰·öm©g›O 3[ÖÏœæ3¦tw°³@Îl@miÕ §Í¹õüÈ ¦ñnlþÖP»¶æ“ˆâÉJ¬3ow +®“F'1Ž‹³ãÙ®õÔÏæ‚Ýô·^"ÓM©ð˜®¡ˆRz6|jȃ’o¨ù‘Â^çTù`:Cy è•×Åiê:f=¼öÎc̱žó ¶;cà$÷9±Ð¬$¾ú8zVëëðÐzš=d¬â†]WÏû£w?2‚ííøÓœÜ€ê­Tš—Ý5^1rá¾'î½ošy¬W.grÙ™ÃɨwŒ‘j" Ý쥘sÐxu©ÖíŒ×3ž7“@ŽklVµ~†­\ß^ÎÙLóœ…~à>Ì»(«cKH¬†ÐH¡(¾³J 8DÍB­¡Ê™lÌèä2Wˆ$ÕaóeêÅX?Ä— ªÞÐF/Õšðˆ }‚¶~6V¸[Yª{˧¼_Ë0óÁUÀ¥‰–ùù 8Ø™ªÌÎéØçuE뵫mì ‹ÀØìåZ`Fkª¼UBM&z eÕê;¢äa~k-µr|Ø@Aå)"£ë,f¶nì»íÆh,9󦩌zæãu÷‚ÈBÿHågñ¢r÷J°¯^¶î÷*cKz¶=2[bJÐNR©ž4,¥—}äg CžXëÖÚ­™¹‘_@¯ç3>p O|?nìïÞvà»4·¡ÍÝífám×xèÝÄ}èæQ0I lpÐnü™Þ-¶3F©¯_©#µ“ ¦ZQq¥Éjõvkä[‚€·\DÉfkë!!-˜Íº)x¡ÿ@×·2h/‡mbIgFÄñ —•âÕY:âì/€yÝR‡ûѪõœ|àQÜGÑãmüéq»T9< ×M˜m'äÃóB8ª¬1/H³HA÷ß\ÅBüáK™L‚ò”6OÒ P_z {™°.°w­]$ÆkÊ…y·¦¼\M`l‡ydK=’¼åÿÙûÓÝáÜfàóIÚ£·Í„dä¡­¾#Roñà!¾¤ÇSö¢Ñ¨9WªGÚSôfo7r•CeÛj¬OvµZç$^æ·O£ÑÉMäÏÁô-Δžurÿ\¹™w­ÄAyüÏ?ÐF4¦žhts¾%%ÈBÙ¬üã}P5®89+±ðem‚~‚õðÒ‡/ëg¨ ù@+ÚdT‰.ª /ÞSðecÿ4Ÿ[¥#ôsÿÔxy{ý¬ÊõÛVýl៪|ÆáK2†ßQåêk¾¥vÑOÄy6²êüØDµbçëo§<|Û:E›@oõú‰‡*€xÏLáK†ÅwA¥š¼£ŸègÆ|Þ{O¢/ øG4®ÛœàŸd6 ŒM^àÀ»ÿ»@"LÌÚ1æj–/ïoòZ.SUëïS`LÚ&kž|0›k…;lãÇsþ¯^O$Û0Òj<ÚåŒÂkwæù’=ÿçÀÀIQz/b=ss˙ь–ëöÒLàqô64˜ºèPn¾Ý’‹¾»kXx ­uú _DÃõ#˜êÆñ#\ë9•c¢ÊÜ){–0âhgµ}™¿?ͲÚÍí¹zÞÞOhf.žÇ#Jf_ÞÓÆÞÛ®™]oh÷â³öVhoßozš£¼f+ßP˾%h'Þgçeò¼TÅãJÕ<,Á–Yä±’ÒfÙ:ùµyëŸroGÇÑôÞl"ÑUhBÍK½¼À^q ɼíXVôrÇt^ܱ ã9VsX^¸5 8Þx¾¦µŒrv‡¥9¶çA k}a½`*Ê"”ØÙô]ƒΧ™\ç@e'”ªÙ¤‚>sÏÚÉÉÞ"`)DÿÁÈüO4žb3Ñx®5ˆÆÚ‡¯Ñ¨q•äèÑèþÑ .Xjó!M^¿G7 Ê&Fv]¨B©7ù€~›ÉÌ?âU¦ŸÕìEF·2É£‰h,ñPˆÆ·ŒÓè—nF×% âÄn9e£æ šÜïßESfmÝ<ÞÎFÓg1-ºuùxÍÜ›¯Ñl3“Šæ^z»QfP=‹²SÉŽòñÙZ”Ÿ_ˆQ!±s·âQ‰}šDåâ U¬üa´p}Œn·ZLÑÝÄ•ÝÛ;ªD÷/w_¢Å!›Žj…M#ªßÅŸ¢fb²µªïÅèáúø>ZªŒãÑãÌ\–ëOÑÓýt*ZMˆ¥èYSíEk¥“|ô‚¹¾ˆ^Î_cÑëÑ–½}ÚE¦KôþúBŠ>žõï£Ïua+Ú¼<¯EÛ×ãµh§½WŽvGYô-ÁF…›÷訒=ˆ¾·®Þ£³-î0-5æ±øX;‰%´x"–ì^_ÄÒú>ËLןcÌIc;Ƴ'è&&¼ŽbòéF2¶]ÞÇö6;±âäæ=¦wÏk1ëñ8+=”ú±òýa%ViŸäcçý³aìbvYÝ0ÐнÚÅžjѧXs]w¶K\¬w âã‡Ø¸*#[<6Û¸ã±Úd-žÈïwã©^ó*ž©‰‡q–¿‘ãB‚OÇåAcßyÞîċ篷qãô¨?¬1V¼|õ¶¯ÞŸåãõ×ÝLü&žÚˆ?(ãX¼QmLâöKmåŽ_¡›øð\ïÆ§ õe-VÙï¬mlé/kéǃî³}üº&D/kÊýÓûÚÞñ8º¦ìÆÚ!¯fÖNÒWÂÚùÖtwí*[8X»Ï]V×…øÝZç主öö &ñxv]nÏQnËzâú´¼žžo€¶xÚ®‹35½¾sšØ[טNmý {Ö]?9ÞM­×¤lqý&6»^쿽¯·_{âúëÓsu}Üi Ñv#ŸØxkŸ%²‰Á8‘—bÛ‰B•½K{*Òâåqâäúm˜¨'¶v·gÍDƒéå/¶p—WÙÄ<“ºÚHL¯2;w½‘¿|ÈnlŸmßohÇ£üF©RkoTï÷ö7®zÉñÆã¼{²ÑoÒƒréicöVÜGÜpco7šÌv”뤨ˆ…ä%’÷÷V²}4.'û#&gÚq,µ¡Ù­TNOWSR¹¼—ÚœfSïÆ4U;µS×GúUêy=NõöꨛÔ{_6×÷ôf6qߌ÷ÍýÃüÛæ!¿fož%FÍ›‘ý¸Ùì7î7ßzw›³ÑÓ]:•zyHsòè)½}k¦g¦“>Ý2úé«“ëIº›®§_Oälz;— ›­äS\Ûâ¬ÒéÖNft·eN­ÞV¥5oÝ?|ÌU 3>w{qô˜trïÕÇ&“Lª; cö…†ÅͪqæòŸbšg¼À ¡cv½”DÖ+Ëž¦rìn-ÕeK 愽IÛdõ;<¬^rëï=•ãv7ÒÜÞÈìsÇúã w½™=àÚvMâÞËñ >eÔ†¼˜O=óºð|ÁW%íˆPÖŠükùEÎÇ®*(ršÏÍôt~wGJänÒ±üõæÚ,o߬MóS~m*¤ß6g‚r%Å„]_.r•”Ðʼ0ÂûÖ¦$nnjû¢Ì>Š––«‰õóÚ“Øì'ûâ»r“6ï󢤤Ú8‘îàñøZºÜãÞ¤öd´)MÛHØœT®äÃñ|¬kyùvoûTî_•x¥È)œ}\U´ÄåX93»;ʳ½”/ïl6{7g…‚‹ûÚ?(ÜØÝq¡WßE/âÝ^;î¶óúµmÓíºñPÞn_mlÏÌÕ“Œ ;Eýµ·Sí¶J; ù>µóÞ¹}ÞÍìßè»{›íÔîi£ÛÚ}º\;Þ üÞÖÁñdo×h>ìo–öžnO ì{ãÄ~&£¿íïNö+ãru¿amû“qC)æ*¹¢*ñÅZr=ZlÞÆjôñáMåw=Õlß¼¨W/Wõu£ÑCõíUSÎæíxÌL´Gí ®'-dòëÙÓM^W¹òž^›ÍŽôNóàÒX»ž· ©r:5Ž*Ù¬ñpÕUñóIÍÌ%öz¦&o¦Ì‹û¨jö67ÖÆÕëÔÚÎuëÔ~»°š•Ùô ZHíùñ ”:EÝ<¬·NÞÓ©É!£ë‡FuòvxÝ5÷›ý—ÒVýx¯¤¦R¯¥‹»–^zU&G©9wz´gÇÓGµz÷á¨{iï'+wÓãÝÛÇËãs»¡óìÍÊIyrSÞ}B¯·_/×6ÔÍr÷òîõ$ÅF/Oözš~R¿èq'¯Úvô4-½tOUѼ;½â§§ƒ{£’=±¶+Æ#ÃUîbó­Ê»ù¶Qåºxµ´?¯>ÍggчÎüL¶F±³Š’\‡nÎ:i1užÌU™ó}þU:¿”sûçƒÓ‹£ZÎN\ÔrçÍÚc%5®Gc÷éº\ßß©W ÉJýeÖi^l¶.ãÚÝqáâ¶V<»˜Ô·ß.…Ç]öò¤»wrÙI˜¯W)­†ü$WêKçâêV^]M:{æµxøðz]I'·¯_ÞNZ7éç5éÆx¸hÞ<Üqòm´ÑëܺåýÛúVat;0Så;¶3ݼ;æ_ïÚͽûÔn+z¯¯÷nïï›ã½‡èCe¸=lŸšgµòèޗó 1þX‰Þv{ÒæÅSöâÂ|*%Yé©uÝM?§ò¥ù³>dßžïf­ÆZ©yߨ/^^5n‹ÕZc^ªž5·Ï«Õæeû²Úœl6Ï[òé ¥Ð´jSö®5:.5ÚâÖËkû¬ÅLڃ˻”?b»º{«Ù}}û¼Ã¾·:•«ëyç­Sä_xŽ/½Tj‰§—·é(ÚåφÛÝjnpÙí¿M&½ü}j»wvQ¸ë OËH1}«­Òkí>=x¿”vß”D¿ývi¨ÒÛôuÜèï˜grÿfÎÚƒØõ`oPÜ© œu4ÜH*Csƒ½¶rÌîhKÊÎFG‡üÕ¨ÛÜÛsL%>®ÖžžÇ£tôºy—Ÿ÷„÷«R#6‰òY{RÌ>\Nž6¥ƒij½£mc÷ô^º/Ïo óè­·¾³T–êú¶Ön‡¢â{ô»Ñ~9òÒDt¸‹sóÏ?ðF:ÿ¥pË:½'Ùúd²×@»ú—¯MíùäLU·FVÚ¼Òc×¹CusÛ¸µjç*+_ÕØMUÒnøµ˜š;µ¥y=w²h^µèÖɵÍ0'ÜNîO¼QÑ›ßnSÝŸ•éž|¸s•µF·ùKsrËÀänêÖ®ºÛZœœžÙ<‡Ëâ*@rЬÀ¨WÖ–k•§“Éö´½l•˜\¾F&â l*[³KîqFD;Áâ®+ÞRM˜é´,Ï1¦DÞì³¹©|—ß·_áçA¿1‚½ÞONîÏÂ{=…Bé1»Ð«3›ÉãÚiwÖ«Ø;>Xïu'šœLÙõIx¯Uö>ã (%lºÓ­“ÌŠ^…n²±qc†÷š¿¹f,fód¡WÔ î8fµÅ5éŒ^2eÒk#6;Ïþd~u—G½¦z…n¦r%¾zœž ãÝÉb¯Ï›çk´×7esAò$˜“S÷Êmì%ƒ½f'Ó—£8ê5C27xE9½‹ôZœ.ñÅû‘BzÝOš[ +U­ÊéõaV8òz…n`‘SéíÃÝ#Ôqn™/^°©œx…^­ùb¯“Þ~ŠöZ8Ëçzx¡­'vp¯Ð ¿Q.¦¿› Í»*ê•YâP§J"v=;+A¯Ü¯ž¨ÍáEzßY¸ëéÉD“7n.Ê÷G¡ÏѦtŸž­¸»±Ç6¦ÕxØ]‚…ƒ`ëÚš*,#åas(JÖ‹î."ÜíŽÙvw8‘*‡¾†‡³™ÌîÝJá—ÑbåÊ<[qw¶}\:ŠOîzšÍ1óPN§…yøãÇâÓiqo¾±âîq§Z.3¡wåÓ[9 ©xå¶–¹³æ4³|WL\4î̽ww’—úÎUß [´²¶yµ6éi+?ÜzÒÅú}øÝÕzÝMñ©…»Þ¢žw_§Of:üñÓë×?Íq+îÞG™7[¿{󀶉çÌŠÇ6ï\$_¾ûô~é0Ç»kn7¶%Y+;>µf±Šþx‡yèn¼–b¡wׯÎÚ—ÉèéþŠE›LvŸÎøâY2‰*d—¨{—ÓJ•3m€î.ñ£ÿŸ½;‘lË ýKùÇHH ‰—µfVfí¹Ö’µïûòª^½zõj¯Â0hŒ<4›acaµi{ã1 ·Ê¬=;¬{'oÉÆ\?>[ºy+ßžŸˆú·Ú›ïœèž;y.{Jî=¯Ý:Ý?piðyö_dz{ÔÙþ‘Ã×Béü½m…¶g÷Ã{¡8§öåXþè±#ÛlÌ»ê»Ï?Ïï‡BSûÖ®Ò§®»»ûæ`èú­™÷Cc•è“5“w)Þ ­{gå=k§²lpè~áfèæº“÷*úù?uóàåúŸºfáêHÝO_˜Ùz¬êS ]õüƒC§ùÁÔÎku>õÂÕŸºØ¿¥þ§..>¹÷¦*¾îöko}~yùSß?uWÿ•øS7ŸZŸáûNFŸzkƬŸVþà¡ïž9ZçS·¼Õ¹Gµ?uó… õ?uÍÂñÊðÌ>8>Éá֢Χ†;Îpkq³Þ§Þ¨úÔð1'y|ºî§æý”ºŸšuRÎÔ;ÃÃ…Û¨º_÷à†ªK;1: ùççÿU¼GŸßjüsÙ³–Â[{»•C®9¶»¿…Ÿ{òüÚ½õåvc¹BÿÑõC{«‚8üóá¡™‡O¢ ü×lÖ1<˜Ÿ›å“[ŠýÅc'Ãi>2\üeïxa¨g¹ Ç“6ŸŒëø†ÐVn¼4[,Ä“3¡¨Ó÷<¸uºº Ÿ?3ööí¹õÙ/kKŸPº[« %º47±iæ…짦 Ç(MíÙ3¿>ú%4“³¥[€ªA½Y9ç?R³)~çr¡ÇmY¿>ÿ%«÷!ů~¬ôæ†öÜœ:ÃèÔ/ž9~»a}!ß<ßÔ¼XO—¤v™Æî®Î)œÒÂØN~”Š[܉_zÞüÄ翜ŒoÝk|ý‡—Êß0ÿ6+¿dñ—ççÊ—±Ö5œÚ{öô‘f×pøÈÃü9Xþ%ó[¦å/Yñ wnj|¾Z¸†Y….\ÆÅSÚ;_õkÄâÙê:_LiXík¯ñ·6>>߸~•+W¡Bׯ_'n¬Ûx …³ßøÔÚ´cŸýåóuói­S_¼6MÏWU+taøAu+4yöQü ¥ïŸ>Ë7­_‘«óóWž.–Ž1Uû.ÞPì¬ÕÏùËÇžÕ-Q^’¬©Î~¹Õ®8}óÙ}öáÊðŒÛñšá9X÷ËM­Ûyx©…/—]›ÊïWñå.¯møåòs½¡KõJ2~ûƵ3Ë#·+óSù{ nÈ¿Wí:aøQeÖ¨ù• "V\²Š¯47ZQÝKñXQÝÇoÝPÙ‘.Uác.?îüܼ5=p±^âÎîJ•§œ»‡mvôRÝ£Õ=T9IWàÍɇÕxcÍR ߺfôUÜ„ÝX(ýT :±¶­ÓwnÅ%ªÿX«v/¹Îé{t8Ï‹ÅìÙhD´y/9|¹nÄÍáê¬ØvuÏOÚô‰þÊ„Øò0vTÝ÷žY?U÷+•¾M _)Kƒ«l ¢šöèpu\ESNL­áÅÂDåzɯN77;AÛÚÊKù ûrOweòªœ¾×ùSµ°qôÕ~Mò*ŸnDßëök#ÕW›eÀºé/;ÚX‹qÓ|”6;ÚxZèÙpV÷=ïp?¿r+r`í'…ÍTy³Ù´85Ÿ°çZu(V¥x»Yî§­ö@-%Â|L“\˜­òAc[iuóðÉÊ©½ÙãêÛÎìÏ:~ƒÊŽ6Ù…Ôl¸ƒ8µ¦ÓVàL¹uë¬8ÓjëVªi Ôyëv¦KOqóâ\«ûøm_^Óž+Ö¥•#a+/ÚÎñº÷Ùå'U—ŠQŽbÊ+fc¸MÞ³©jÎXã¹íÍè:¶zdmOøÃ%-·¸Åì¹úgÂÙÑš·¸¥›Âfî…G­N¨¨Õâ”Z·6®úƲâÊÍ µØØ4=ÐHûũ̞ËêxVE~”¨=nø ¿éêGPU}ùcêÇc8Z›ã„5’cy€øúàpüx®ýÞÝgÒ¡Më¼÷nÁêσXœÃÑêßbÖMŽuFn³£u!Œn¬¹½® ií\«#`ÍÒÚ¹ö{ÿµŽR¨çÇs“c<Û®ùäÇÆÉ±FcscÍ‘ÉöócÝä˜ÍB.N²ˆòãŠ95mLuªüþçËÉ±Ô Ô›šUžÚQ·= »Z÷–µp6ó™÷U‘Ygl#»—hÒ׬ä+ŸdGk)2[è‡Cmi:üа孆n ¯=i4æÝ`Æ^2ÅÑu¶g5nãFk¤© Uiª•q躷q7Ÿ6HSSãZ¸P=…¿í «šœ9¯ñÍS«S{³C=^×àÚ´õø';Ú³&u¹õÁ” -C×{ªPU¡o>Í'û¶x´:ýŽÙѱZ3}Ë׌±ºÅŠÊÔ`4yE¯MõˆQ9<²ÿ*LD¯ññº½“ë¶õ¿ýΩlÞRÿÈö‘kåµ|ácº³œ¯ñZ¾¾Ò¢¥—ó5^Ë?Åíh9ßPõ|}¥¥‹.ç+}j͵|ÑDåΖó5^Ë×W^ºØÙr¾ºŸš¯åë«»t±Íå|×òõÅK;YÎ×x-_U—cõËù¯å+¤µ.,çj¸–¯ð1]XÎW£µŠÖò¦Áµ·œ¯rtý•HªoØkßǾúëÀö5žÛV(S ÄÇ7+§²mjaQZ6þ9Ô¸Lµž68Úð*¿aõŠ•æ‹øZÿ†£Mã¦å_µ†¨^™úZYˆÙdجA™–›Rºíõ{­7;†ŸTOT^Í2®æ—ÒZ SL®Îwò€¯jù…‘5¹ýúZÓyš.»k~ÉÊqUŽ4¯¸^ÃZ n£š.»kc~Iݦ3œ›ˆÛºK ‡ÊjZk Åj­r‚W¸±]ªìV,ä·î•-ôÊßRûucÍùÆ“&²î`‹7Ç Uë^›?ʬßBßXh¼¢²¶…òƒñÚÄ#*uÚ*LJVލÜZ,¯P(5«_ÜSÿÅËãZ[véYã>F[k ¿]¡å©|·«:dµÖß„\㪿Fnϳ½‡ê”iE7»ÉÌûP¬ú3ïK—¯ù5ì+¬)\×, ·¼¦ðAÍIé}ÑŠüVG±›¯É©>Táþ¦îÑš¼¨¡å‚žx4Y¥ÓÎ׬|xÒéIk²b§Í“VÿIÊjNZí6´x´ÊñâmOVL¢*,ÁêÆýÅ—Oõ} ûºÇh¶ˆ²Ùâ!ÕzÇ8=Qø¥I[ýloý ¯œsÛü~pňpƒûÁzo²˜œ¹°fCûǨ(ĵѦ·¸åË]ç´ìyÚlÉ^«unï¨~°RÿF­þ²¿Zæg¤þ“ÊÆ§£<ÜÝtÁ^U¾«×Ÿ9P+ÜWÌR]ÛjsòÊÓ›£•=̃uWêö•VzUõ0ëUè+O´3ÀQ¼—ê[¹ä·ÆZ½† PýeY+&'­ºŸÊÔÊ*ÛåV Ù©z6ÐjÜÖœâTªi¡X»sªªŸeõ êÞ³åzÐl^U™â™+Öµ5zÓ LSm¦µF‹ýÞô-¿q¬µb5YžW·L}+ß2²wâÐӪћ©u;5¹íkríëµr‘ì*Fo²¥pMGoò¸iznšMðoº:h¹g“ ­í-\m0ñbßóªŽt_q¥W³i:­t¤îÊ É½g&_Èúw+ftîd¨êË•géÖAÜÊ—Û=Øj-­Ÿoni2DÓelùdˆx¬s•KüZ™—•ÏUo²Ä¯ã óò…˜ ÆéZšv­ó«7lZU¡[›>zíÆª²áÏêÏ÷*OkáÑÅêWæUÜ­•çu{e^Ãi×Ý[™×¬¦uie^a”£³ê-¬Ìk}2lG+ó¢>t¼8¯ÃïµbeÞŠ›ÂV'F¶·2¯ÁT«n®Ìë‹6tª¹œ®;+ó 5mÅâ¼n¯Ì«}mº¾2¯ñÝZçBÙ K{OùâìY¹j¡q5jyêeþþä–z­L½\1ñb•­À™NVÿG.Ï>ì¼Q8ÊÊyÈí?,ÎTu‹Ý¼85Æl êô…£,c´þ&zÊÓÖë3 ÇË«gÞ·4źÆÁl-]ã•@ÅE²-Äc¸-Ë*ŽuÎvï-ÇÙ¡ÎVGPó6­n<Î_¾Ðò×ú]õpÎ;}GžÖ»óªãü@Mß…Óü7?PÛñX3­eê<³£ÔIŽ}u_Vwbwv´Ê÷7{Ûô㾯žÌ¾áPÕWögM»Ù+o»ûj.’=×E²—ws‘l8ZÉ^~ÜE²k¶t:Ú”¯®u”.›hèŠQŽü@M^7ÐbqÆ[¼[kz V^t]5w°î2²( ^ÛÚü¥Šé­|…r+O&úê-•ŸkéPƒÉÙŠÃâ ^_íµ¸-¬º®*SãjQžvÝx2Bq¸èDa+½šµz¹O˜ï ºí­Kom›»¸pöÔ¾±g3KácæŸ\Ý}m÷é¹{³3c‡ÎÍ­½}èÔÜÞ¡S§w?¼>´5ü×âñð£gÎ_^¸5¹qÏš¹BrÊG‰£qè³+סm?º·ôŽ®ba*—Ý­={áx<ÚU±mÏôì¥ õ–Ýo´Ø/Û´p">UËîÆ7©ó©[×f;‘_©·…^³Å~¦êj¶yÝOÍv"¿Sµ"¬/Ú§p°Á²»ã[&£O­\—ïÎ]úÔê-ô²íCßí«·Øoó`ƒÅ~knŒÖýÔñ…ûŽW}j_¼OáúÍGç®×[vw­Ñ²»u[ëê≵ûìS¸þØÝ#7ê}êÉgøèá³UŸÚ/öŸŸ?³Pyi×åïT(ýWqQàóM»ÇZú¹©ÙñÊÄõ~tüú¦éý-rhúá³ùr2 ßúÂærµ<-aùP;ÛhªÓù½+:·áÔn¬|Ê4×lŸƒÖRx¡Ø]sîZý–ú{zÕyczÝ]õÍ6™¹ZëùY­ÑÁ·×«(Sqo½¸MëÒözµ._kÃv+ÞÚÖîâÌòññ Ç›¼/½rî`ƒ½ÝVÌÖn>l×ÎÎzu¿a_Ó½ðšm´ÒÒ7¬ÕU_õªØ‡­ì±Òê‰o6G»õ¸yØl{€ZSkíÊ·|SØÅ…}]³iea_­»„šÃv-ì«ørÅU}uúÐ,ì«5ŠØWÜi©Þ™^žê†*[ÕW=² û¼§› ûêwwwa_­é)åºk ûß{vma_­ç<µŸâv´°¯Öª¾úVV½°¯ÖL_åû:»±°¯þŠ•®.ìkí]/ì+ýp´ª¯æãÕÎöÕJN}Xßí…}µÊ=úîÖ¾Z«ú*gtuea_­k¸7]\ØWëPŇÅÝ\ØW«Ÿ¸rÅJÇ ûV{ÒÚ\Ø×ä¤uka_kË|:^Ø×ÆJ¯NöÕê“öU­úî¾ZmO9Iwma_­‡-yMëî¾øË«úÜâ®va_­k]÷ÁÊêö•¯RùÉLƒ|³Ú…}µNGQõNöÕZÕ×WwAÙªöÕúJQW½^5+V§÷ˆ…+sOª7)¾òôN“~Gã…j¥UjýÕ·Q«^}ÕB»QÑåèÎ.~MºÝÚůÖ~µº­ª¦{ÇUµ0Yw³¼f½ÖêÁܳücšìÙ[A 7ð«[¦šü«ålTY¦SF¶Ð+hµLå»Ð›§êv+aÜ·bAYå-SÙ÷Ufˆ›VŒ™Õ¾÷¬ÞÿoU‹çâÍÿê̳iµ¿Þêæ}ha¤ùPÇ›ÿõ6l²Ykkú̹hy>tg›ÿ•Ÿß4Úÿ¯ãÍÿÚ„\íæ5!Wìÿ×Þz©Ù•›ÿõU¿ð¼æþí?~šÚ{f(ÚÆ¾o•ïèzt¸{k<öNŸhiAnóÅMácÂ÷›èx\ãùågÍÖôÕŸ«ÓúìîÃÝØv Û³¯ÎL㪠0Í×;ÖŸÒòò¸ìÜt² ·rÅcܹnP¡ëï7?? æÊ%MáÏ*3_|·ÖÖs¬lÝÜhËW³ÁT«SÝ›juª«S­Nµ:ÕªÉLêã÷[šeÕÂBÌÁŽŸ¤äG©zëy­*ÐâÚÉõ&ŽåZ](V%^ì·Ú•öÑÑê¿$±•Íë«WûÖxýrø³Ýw¯7ÌŽ6ÛxíLý+'‘‡£M¶4=JfuÏæ;·7åg³…kÝl6èYd½¸Áê)Ûáφš>÷lm°0[‚Õ´_ßʘ³Ûê^Ôê[ôū𺶹ãÙ‡UK(VÙ <½×ÒvK-,Äܹ©Ó»„Ùò;˜;{ô¨•¦}Í—W½y•Å)Œrì¬\ÔÑæfDURk Åêg}²M+–Pl|Ü|aL‹ñ¸Š}ÿjÍL©Øúo•ñªk{}7ß÷¯µ®zÇûþõ•bÖÞú¯½0ª÷6æ6oqW»ïßÊ´Vµõ_ßkÅÚ¨ö6ë[ž•ÄÖn¬jß¿–_ßžÍ}éüöå;—¯fHÍsxc͵šësû¢·(¶¾Ú÷Æš›kÛºQ­9˜ÎyVû^~\^z_º#XíZüj<£+;P§«}ó£dÓ…Õ¾Yqê¿ÛîØ‰¸ÝÂZªs-¬¾¯µ*îÙTÅãHx<¿Êa°•ól²o_ÿM8í.¤ºö$¿«›Öꬥªw6Ï7¾»ï+¼w°Õüó«¼»¯žç[ßne!Õµ'ù-~Wî=³•§ïó«î=ë­¥Ú¸ûlýfº…cåðCV¬—صÖcœÉ{ŒU3;Út«ô–zŒªzŒOqW±îvæüÛu_È5 }•ï¼o°2­É}Sã'>+NZK Ù[x«V8ÔÖêžÍê×ÝV¿ê¹Îxf_‹».®~3ÌòœÛ|ïÀn­»½PkÑm_½åØúnå0[¸6Rë——»Ýž}òdïDÖ  žÞ»íÂÜÅ… §ç.Î?Ù·ÿÀÖÓ‡fgFßœ;œÍ=õh9­·ò¤Ç¢ª¶¦;óèÝKkØ+7N»TC¼í'¦ÇªbeÞÐÎ7Õ[¸åíð1›ÖïêXoI`Í…ˆËkänÕýÔñ…Ó3'*ïoª¶¦‹W«UêõF›ÿìˆ>µr\ø˜'O§‡ž–>¸zÜæóo/í¬³5Ýšºkäž<¿>­ì+îä];ó©[׿»Ö[™w©î§† 'ù~ýåã OŸ®û©–n¿}«Þ§Þ.j1{V. m2ß¿reu›¶yødå׆Š`à~¿±ñÀíí;6í½´îâšþƒÏû÷/œ[sáêÖéu§Î­ÍjÚú{N-m¼ýö£‘­§–_ÛvïÖÒ}÷®}ûðíS;v½|àñÙS¿uêíwß=³8väùÙk‹ƒ×®Í ¾saË;ÇîÚùÖ£¡‹ûž=Yj`ã“'Sëú×<¼ýplýøº·w^\zólvÒv ØóxÝý¥ñ[ëÌ=y²wúxÿ¦+‹Gú'g޽;´óÍÍûÆÆ÷î_8}na|qíãã‹Ç޾ýäÉݽ#Ož¿½gãÓÃGof_½¿¸òsÏãù¡ÝÛ^Ê.K¾ú.;ióg·]{òôΡµãcÇn×lœŠ×&_òºçé³¹‹ û—vïßýfyƒÌ‹gŸ¬:_ùÉ ³ñö»›O½}fÝã'ûl=Úîèá¡ò×­þ®Ï¯®Û´aýùãë¶ï|wfýñS‹‡6^?up÷æŽl*-W —êòüȶ¥ 1”-óyºfáàHÿ“»WƲ¥'Cª9ö¤²6‡ÑõõïÆÕ-ïcGigÊ_®œÊ}Âúßm§7<œÜ<næñÙ}cÏ6Í íØ|slf~òÀ¾ðgGí{ëÌé£ûl½~thÇ–Ý{v¬;yköÊ¡µòï:9sah¾Pµóý÷,žÈÏ Í ¯ÏVH. 8xpbþêô®Ù»7Æ&² ô`þÍ{wŒ¿72yíÀ­áñ±G²¼¿.›d1’ýóBw?¼7µ÷ÌšÑüaÏr;¿vc~«4>¶eó`þÛpÒö=ÌãfËôPþ'!°O>¿Ý7Røí•§·‡óÿšZ·k×õ…kƒ—¿uuß};—úŸ„’.µPÎáñ×K±)þ‹Ùõ7ÃÇ”þn8þ»3·J1ÿÅÝo•þb<ú‹‘uß^þ‹£ƒùwX\Zs#ÿ³Bö<:ýüâÕÑ7K??ÿÅ£éñìÏÆŠbËÑñlÑÔý‰[—¶„s³g8œÃþçãcÇ÷mÚÿáÒÓý‡Ï»¶<£+üñB~n6…½=“_ƬÑÝž7NyÅ ?rl,»´Ã!Á<^~{f"ÿ¡u½ÿ,üöÒÔØ‘S÷¦Â¿==4´gí®µÙß…O½?>va)Ûl«ôÁ×—?æúö¡=[/ŽÌÝØµaú΃gvÍo~§ü€¯ØZ<"NðËY~9´—v„">˜Í—Ÿ´nr9dò"Ú~bÇöÅ…}oŸž;xkwÿr"_íüÄÂüä‘íÙŸ,_‘ÉÁw¯­-Öï 76—¾úð1ÏvCàæ±¼n‡óº-Ôå›gÆò[Áð_çÇ'n.̯ÍÍK…®úØÍ«“{vœ|þëÆTþ_ÍÛƒåìuãñöòߊ{¾¥§}ÙæÉgúwÝœe™³ý¡ÿ6׿nnû®ì¿e¿ìÍþâPÿðãGDz¿¿Ý?u«øÈùý›¯}’…ñ¶bÛªq¸ðc @±FyPšmbS!Î7î>µ)?ùjã<ì³J6^ ûsó7 zûƵ¬7}` ¯ÕYÇ?{#ÕM…ÏÊ^597ri(„ûî¬g³|EŒä™=üñìhvGp¾0¢~Y~Óè–…±Ú{¶_®%Ù(ÏòPÏøØžÍ!.Œæ#PÓÅk¹g:ÿ"¡‰»u)/ôÄðÒPöžžÃ#…À¾ºív©ºíìÙë÷ößÊú,ïμ»æÁBu{Pì äMxÖ.Œ¿ä⾡ì")÷„ Wºòv#çøl©±«ªQ9"~¨pïùhvâÀ¶™á²ÜÛ5ñæÞ§‹á;ÜØŸW­pY.ïÏÓÕÊàÉÎ͵'ë''ö퟼4³cìèÚé“×ç¯ÉÇju³’×\þmÕËBGg_èl^èmØò0Þº7ÿ³5³ûׄvòY¡B?=[±,¾pŒÁøÃw竎14»noáö,ßu{r`Ç…©rï!ÿ³5köì]Ìs{þ1»nŠ{}!™†Ä½°¾|ŒñÛk¶ŒUãüùãû‹}¡Ýw¢¾f>"_ˆ›¬ÒÌ_Þ™5Sv^š­ÜÜp– ÝíüÏBU<;Zø³+O¯eÍïå§ËµÿÚ³ŠÊ°vcñ…“wNTì½cÍò+&ò7jdá¹&û» •oØXúJooÚwnÓå÷GìžÌ£»´1õ•PÎÍ‹U/–X^ë¿|mž÷—{sý›Ÿ^Ú°Ü‘Ë7ß±¶ØÍ{÷ÌѸS“ïà™Ÿ´™ÁÃ¥¾Ó+£kÞ9“w›²ÞVsdz´VÞ*»zÂÂy˜{zªt.—ÏÃÐÎç—Ž•NBÕkB†¢“péÉÔ;ŠËËçaöâ­«Ëçatdå “Ï„M뢓°wöñò´ëå9Ÿù5…Îeþ©Å>dá²Tž‡Z'¡p—”êÔ¶c÷Š'aòùDvÒ¢óР2Œ•ë÷ùþ‡có…“ðdæÂ¥òI¸¹îäåZ•¡ø`e :—ëwõ_¯U¡ê#;À`ã,W†ÇØÔi!†–G9VÅ×+6.Dø˜†åéô‹Œ.?ñèà‹ŒµZˆÂ쇚Çï¤je˜( |̪Ž1Ú—­0Ž1>0:V(çàÞ};³Þ™íà4³åÙñu·¯\¼ùÎÌ»Û×nÏG9Îß[›ÝžÝè¾vëtÿð-£ÑjéUdùqÇî/ÍfO&†'ì›ZÈo¦öÝu°âÖòôÄÐüÙóö>?¾6ž/0SzBq¬òÑw4Ü^dϾ×ò¸æâ»“wîì?tþfvû-.+¶-e|p]þm&ÆÖ>Ý5tfç“ÒÔÃBw{ã£3ú‡ß~çtvú¬ö¨Ôµç…o³gøÀÄÄðÄ¥ñÒ¾T¾†Ù4¸Á‹§úó1¦h(/êÆ=ª¿Wt¼yînv‡â } ßÜgxìîñƒ»²1˜ÑÒâ‹ìN²X÷.Í~jfûÔö­gvOÏî?³açƒ};ÇÏ®Ë+o[Þ½ykÃÜÅ…‹5} ¸}Pa ¦âËåÃå Z3ÈFâf.mºš¨\,wd«¨Á6–¾ð¦üލp×ùxÂåŠA’Ù‰M3·æÊ_núÖŽJ5ý\ùúŽOܸ3ªørÙ ›v ßæ`öÜsrîÝ3ÓSæ.Nm˜ÚUxqIq(~÷ù§Õ‡œ¼þp1|ë©åÏß9sòì‘|´«ê/v¸ð<›²¿ðfØãWç&Þ*DKþpÿÈÃÝ“×n­_žl2½krpÝý‰¬±»PÌ#3›Åw`¸\-'¯<›>T8ig/Ÿ´|DtËHñZæ°v~ÃäõùÙÛ^No¿ýìü|ö6£Á‰›Íïž¿—M–|·?Ô7yåé½ÂÜ„©u;çåg.ÿ6áä-Ÿ¹™Pügg²]˜šœß5s0Tû†öNîÙ9µþͧ³SûwMMæ v¨­c›ò31ží‰t) WîäÈ®¾ªE²çOgÏD÷d-ÔXyêa/weÓäµû{OdKtÆV|¹{ÏžgC2ÛÃI[3ç›Á³^ÊGØÆßš[7?98ÚŸ•rq{øç—vNnÛ 89~»t,üÿ#ïŒMm¸{ýÔØÝµÛæ²ÆæleÕ>QQÉóQŽÂ„ËÒèoiÊD>Å{c8îÕÅl¿œ|÷ŒR™^ (]Íx8p.4vï,NžÜ4Y^J²<:µüøþÉÀò9Ÿœ åݼjÃä™ÉÒ'\ÈÛƒìíOÃ7[’þmá‡çBP¯™¼¾óVe˜YÊ«ÀÚmû²’OVVÍã‡nîÞ=9?uøh*p¹x†ÏöÏL /½“ÏýÞQq†‡'²ö;ãÑ;òñ´–NòX~’«Îp>q®x†ß¹}¿8È¿eó`ic[¶mʧŒ,[õ#åB¦*>Ÿ[ùËúË£®µ«åO²*ðb«åÏÔ qó"«E½^äcµìÏò1›ûX-¦V•=)ë?29>¶ûBÍ©nQÏúâÖûw\_x¸íÜÔø­ª›°|àlÏî›û‡=î=ŸîÙ~`׹х‡7Ÿrùâxþîö|VK+gî.í¨ÿ40ÿJ›®,d“6²[•óýÃg¯Î‡âŸ;ß?0rcMéðÎì ðñðÅ7\í¼ûîžþ‘'.÷½9º#»}*¯¤Ý· ¡W¸o{>¥ ½Z97äÆºû—óüRÌ…-…„µ|§5R¬´¥@*FÚRXf†³»ÄÐuȺFÑ£áüIq¡ ä2;š?J-ýË(,ãúºgó@©¨Wªõ–ÿ"ν{ö ÇÓ®„¾ØÒžå¿[þâÊó«û–ÿbi¼üUñR¸µ>zqßPÜâ_?}qa¤|jÃ9<Ú—Å¥±bkµxlû¦Êç¡ðX x6•OBVœ{ÑëôfÎ_)Uèºçaïô½ËçaÓúÊ©-?h¯ÿŒ{÷³¦S@U†½ÓÇŸ•çÁšÎSajU†lsc[sHÂǬ8F6¬ÔÁ<”â¦Ë¨œÐÂ1 Å®ŒŒÆa‘/æ¨XQÚÑ),[y€êðlxŒ|ÿ²v¿HÅû Šk+:ù"g¦ÇêN±Ê‡šZ8ÆÕ}ã­NÓªu€ìcÂMé@'qž 5 6>@á©pÃcìx¶©³BÌ®/¬T®qŒ¯H6‹t¸…Bª@½rœ™ivEnì:Z>ÀÔ¥w'¶Ç¸ºm´4åquU+ïã´Z7ëÍÞ~4;Þôl6Ê#ëNäxºfñÀLÔtn]›="ýhèp tá‰òÏeOt¯Ç?·´fÓòÉÍañä2d¹¦5:7ÙÎŽjÚâÍ#QM[ÕZ|4ÝJãQQÓªq`ݾ±Ž¾È‘…ñòäÚUµÙèìD«…ˆ' Æå¸yu}g±óÑDtIã$Ýú1Þ\·m¤Ã$=ñæÈîÑŽbÿÍ­³ÕqÛj’ÎÈm™˜œ¹0q0ÿ—ÝáSC÷¶e›¨]¸º|£|äAy =;i¥»æp‹÷îhq­@a,èBqü³t{X¼yÜ2ºqù¿&  7cÑðêÁGùZü·ùôùKOòeËÿra¬t³?ZyéZé™CÕˆiéùÂáxÍNh¿ßŒmÄϪ–Dñh¶ü¥ê.0Þ:?R*•,«'Æ GÞÜ{0;s'ŠÇ}óÄ™ü¸SÑŒlÁ@q|hdsVsNÄÃüËóEòÛ¨ÓÏNμ;zgÓþão¾µ4wø`ÿ©÷ª³•/¤Y_ù™™ÉÁ »Êº«ŽWñT¸õCžXÚ½rVËö;ûO=_wwþâ­ãÙãÒ<”P‡ûò7˜•†þ.\*=äØ}û¹½ÛJÏ£ÎVLΘÍŠsc˵ÿ\8øÍ+ÙÙ¹‰å¡ÌsùÓÛ‡…švn*ÿMiõê–Æ«sÚ_š³<ÐÕÖêœö—æôÕXÞÝtuNûKsú¢U}-¯Îiº4çiö0#«ÅÙÓŠkónÅO*¯têö³çòÙrmæö»–n|÷íÐ\L¼QøßxøßÄ[ߨ¶ãÉ-[òÿcKö§K7û>00sãÍ{wž<|þàÖ¿ÿ?Þ¿qçöàKÙ´ºkcûŸ<›»ûæ³»ÜxòÝoLçvþÈÒ™ƒsoL¿ý»kßµüZþO¯M\|cç¡´ã×Â??:˜?>¹–}‡Ð ¿±?ûåüßèûÀÒL±Ìá+ä%iú% ¥/~‘øK,\˜o±ÜÙ^Ûüb˹¹t¦CY;)çÔ‹-çTV¾.œÎÉ[ÌÉå2vx6»^;Ç£bæ-”±³b¶PƉ¼Œã¥O>ÿÝÙï…ÿz'üÙßõïÈ—®Œ¿q«/üÝÉbÁî¾{{:þ'o<}–}‹ÁðÎ/ö}`lîöwÞ}óöÉÅ™7ÎíûÀ¥7ÆGwìØ±}Û–ÂÇ,ÿfdj|ëSÛ·®^ycbr<”eÇd^”·Ûø‡ùY+ýãòm5s¼xf7‡ÿ…ŸË»¼Ôs7žÝ˜~cëŽì§7÷}àüÁü5¼4¾ôå÷~ûw?~íuA€NÞ öÿûÿú¿Œþïá×^xáä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤CÞ &/@:ä}bò¤éK_~ï·÷óá×^x_ÉûÄäH“؇4‰}bò¤IìCšÄ>1yÒ$ö!Mb€˜¼iû&±@L^€4‰}H“Ø &/@šÄ>¤Iì“ MbÒ$öˆÉ &±iûÄäH“؇4‰}bò¤IìCšÄ>1yÒ$ö!Mb€˜¼iû&±@L^€4‰}H“Ø &/@šÄ>¤Iì“ MbÒ$öˆÉ &±iûÄäH“؇4‰}bò¤IìCšÄ>1yÒ$ö!Mb€˜¼iû&±@L^€4‰}H“Ø &/@šÄ>¤Iì“ MbÒ$öˆÉ &±iûÄäH“؇4‰}bò¤IìCšÄ>1yÒ$ö!Mb€˜¼iû&±@L^€4‰}H“Ø &/@šÄ>¤Iì“ MbÒ$öˆÉ &±iûÄäH“؇4‰}bò¤IìCšÄ>1yÒ$ö!Mb€˜¼iû&±@L^€4‰}H“Ø &/@šÄ>¤Iì“ MbÒ$öˆÉ &±iûÄäH“؇4‰}bò¤IìCšÄ>1yÒ$ö!Mb€˜¼iû&±@L^€4‰}H“Ø &/@šÄ>¤Iì“ MbÒ$öˆÉ &±iûÄäH“؇4‰}bò¤IìCšÄ>1yÒ$ö!Mb€˜¼iû&±@L^€4‰}H“Ø &/@šÄ>¤Iì“ MbÒ$öˆÉ &±iûÄäH“؇4‰}bò¤IìCšÄ>1yÒ$ö!Mb€˜¼iû&±@L^€4‰}H“Ø &/@šÄ>¤Iì“ MbÒ$öˆÉ &±iûÄäH“؇4‰}bò¤IìCšÄ>1yÒ$ö!Mb€˜¼iû&±@L^€4‰}H“Ø &/@šÄ>¤Iì“ MbÒ$öˆÉ &±iûÄäH“؇4‰}bò¤IìCšÄ>1yÒ$ö!Mb€˜¼iû&±@L^€4‰}H“Ø &/@šÄ>¤Iì“ MbÒ$öˆÉ &±iûÄäH“؇4‰}bò¤IìCšÄ>1yÒ$ö!Mb€˜¼iû&±@L^€4‰}H“Ø &/@šÄ>¤Iì“ MbÒ$öˆÉ &±iûÄäH“؇4‰}bò¤IìCšÄ>1yÒ$ö!Mb€˜¼iû&±@L^€4‰}H“Ø &/@šÄ>¤Iì“ MbÒ$öˆÉ &±iûÄäH“؇4‰}bò¤IìCšÄ>1yÒ$ö!Mb€˜¼iû&±@L^€4‰}H“Ø &/@šÄ>¤Iì“ MbÒ$öˆÉ &±iûÄäH“؇4‰}bò¤IìCšÄ>1yÒ$ö!Mb€˜¼iû&±@L^€4‰}H“Ø &/@šÄ>¤Iì“ MbÒ$öˆÉ &±iûÄäH“؇4‰}bò¤IìCšÄ>1yÒ$ö!Mb€˜¼iû&±@L^€4‰}H“Ø &/@šÄ>¤Iì“ MbÒ$öˆÉ &±iûÄäH“؇4‰}bò¤IìCšÄ>1yÒ$ö!Mb€˜¼iû&±@L^€4‰}H“Ø &/@šÄ>¤Iì“ MbÒ$öˆÉ &±iûÄäH“؇4‰}bò¤IìCšÄ>1yáEø³/þåo~ê{] hDìóJmihQ{]Š×ŠØ &/¼ßùƒÿ*œÕûßû±/üÉ—{]¨Mìó’ íghEC- -j¯ËòZûÄä…!tcn×GÉýöí?ô#þ•¯þÕ×{]"¨&öyi…63´œ¡ý U4´¥ŸÿÂÿ×ë½VÄ>1yáÅùÍOýáìÅŸ §wjéïì—~¯×Å bŸ—Sh-C›*gh?M¼Ä>1yáEûÙñŸ6Îüh8ÉK7êÓŸýã^ŠÄ>/›ÐB†v2TËÐfþÌG«×Åym‰}bòÂûàÏÿâ«ü{ÿæÛ¶üÀ·ŒßÓ~Ü»xˆ}^¡U mch!¿uêûCkÚÌ^—èu&öˆÉ ï›ÏþÁŸ^yôóálÇôøŸþÚ׿ñÍ^—ˆ¤‰}^¡% íahCm -dh'{]¢×ŸØ &/¼Ï>ùë¿¿óÔ?ç|ûñŸøÄ'?Óëâ.±OÏ…60´„…ö0´½.N*Ä>1yáý÷õo|ó#?÷kv(œù‹þ™ñpzBìÓC¡Ý ­_¨¡% í¡ùï'±@L^è•/}ù½ïþá]X/ó=úÅðÛ^—ˆ´ˆ}z"´u¡Å í^hý¾óÿ•¦ïý'öˆÉ ½õéÏþñé»?ë}z¼ÿÄ>ï¿ÐÊÞ·Ú=ï[î±@L^x„ó_ØokÏ™ÿêoý÷^‡$ˆ}ÞO¡e í[a?ÖùoÿK¯‹“4±@L^xI|õ¯¾þã?ý«…—ìÝþ®~îó_ìu‰x͉}Þ¡5 mZáÕÊ¡• m]¯K”:±@L^x©üÉŸýÅýïýX¸"ß¶å~ðÇÿÝWÞûZ¯KÄkKìó¢…,´c¡5 5-´l_ø“/÷ºDdÄ>1yá%ô;Ÿþ£¥›?®ËÈâýÂÇ?Õëâðzû¼P¡í -X¨c¯ýãЦõº8”‰}bòÂK«Ô›Z¸òô¦è:±Ï Ú«ÐjÑzi‰}bòÂËì+ï}íG>ü+f[ñ"ˆ}º.´Q¥ï?ü~ÙŒ÷—“Ø &/¼üJocøöí?äm t‹Ø§‹ oÄ m”7b½üÄ>1yáUñ›ŸúÃÒÛÚ?öK¿×ëâðÊûtKh‘J;æüÚú\¯‹Cb€˜¼ðj±›3Ý"öé\h…B[*Rh—BëÔëâб@L^xåüù_|õoþèÿó­Sßÿ-ãß÷ôƒÿÒ—ßëu‰x%‰}:ZžÐþ„V(´Eßó¡_ íR¯KD«Ä>1yáõÙ?øÓ+~>\»5»?ô‘Ÿû¯㛽.¯±Ïê„Ö&´9¡å õ'´B¡-êu‰hØ &/¼Òþíøìöã?®`øõ—ÿãëuqx•ˆ}V!´3¥6çŸüL¯‹Ãjˆ}bò«ÎX=«#öiKiNÂwLÿ°9 ¯4±@L^x=üÙÿ²´–çoý_²–‡¦Ä>- íIhUJk–CkÓëѱ@L^x|ú³|âÎ?ñ®?Z!öiEéÆÇný´w¿Ä>1yáõSÚ lÿùø›ŸúÃ^‡—”ا±Ðz„6Äž§¯±@L^x-}õ¯¾þwÿñøöí?.îíïúèç>ÿÅ^—ˆ—ŽØ§žÐb„v#TІüí|2´'½.Ý$öˆÉ ¯±/üÉ—ïïÇ ºùð¯|彯õºD¼DÄ>+…V"´…¡¤Ðz„6¤×%¢ûÄ>1yáµ÷;Ÿþ£Ù‹?®òÈâ}ô_ÿç^‡—…اJhB+jEh1~ûw?ßëâð¢ˆ}bòB"~áãŸ*ôô–nþT¸Cìuqè=±OIhBËP5 mE¯‹Ã‹%öˆÉ éøÊ{_ûàßû7ß¶å 3Á¼4>qbŸ¿Î·ª)Ì*-ChlU“±@L^HMéMß1ýÃ?þÓ¿êMÉû‰ ±Z€Ð„jpóù?÷Ö©tˆ}bòBš>ùë¿¿ç̇ o’ÿÄ'?ÓëâÐb?e!ê »Ò„v ´½.ï+±@L^HÙÏ|ô·Öïý‘PNßýY;M§Fì§)Dzˆ÷pé×ìþPhz]z@ì“÷¥/¿÷=úÅoúþoÿ¾ðá·½.ﱟšB°‡Hñ.ØS&öˆÉ Ÿýƒ?=wïÿ,<2øÈÏýÆ×¿ñÍ^—ˆNì§#DtˆëÝ…É!Þ{]"zIì“(ùÄ'?³ýøOXR”±ŸˆÒbáÝ ó×b€Jò±¯ã›?ñOþcᕃWýüïÿÿÙëñ¢ˆý×^ˆßÅ¥— {îOØ &/°ÒŸ}ñ/Ÿ~ðãß2þ}¶${‰ý×XˆÙÂf£!ŠC,Ûl”˜Ø &/PÏïþ×/,Ýü©P=6Îüè?ûØÿÛëâÐebÿu¢5Äl¸¸!~çÓÔëâðÒûÄäûØ/ý^aŸ²Ù‹?ù›ŸúÃ^‡®û¯Ÿ¡!NÃe?øwCäöº8¼¤Ä>1y¦¾òÞ×~äÿòíÛ(T•·ÿ×ñ…?ùr¯KDˆý×IˆÊ›á‚†8 Ñb¶×%âå%öˆÉ ´(t8ïýoÿ—çkCì¿ ×Ð.±@L^ -&¤½6Äþk Ä`ˆDÓ¹i‹Ø &/° ¿ðñOyaÅ«Nì¿ÒBÜyÝ«#öˆÉ ¬ŽÚ¿êÄþ+Êv0tHì“èÄç>ÿE^¿¢Äþ+'ÄWˆ²káÂ…¸ûýÿñ?{]"^Ib€˜¼@ç>ùë¿¿ç̇CEÚ~ü'>ñÉÏôº8´Dì¿ZBd…ø —,ÄZˆ¸^‡W˜Ø &/Ð-ù¹ßX³ûC¡:¾û³Ÿýƒ?íuqhBì¿*B4…˜ +ÄWˆ2OáéØ &/ÐE_úò{ßó¡_üÖ©ïÿ/üGøm¯KD]bÿåW ¨oÿ>E·ˆ}bò]÷éÏþqéqÆÏ|ô·z]jû/¹;¥î!¦z]^b€˜¼À ò‰O~fjéï[îôÒû/­Ò‚ÜAäÒub€˜¼À‹óÕ¿úzéuˆ7ŸÿóÏ}þ‹½.ebÿ%b$DJé…½!‚z]"^Cb€˜¼À‹ög_üËûßû±PÍl—öRû/•Ò†žá¢„x±¡'/ŽØ &/ðþøOÿÑÒÍŸ •mdñÇ~áãŸêuqû/‘!.Âå1"¥×Åá5'öˆÉ ¼Ÿ>ú¯ÿs¡ß;{ñ'ûw?ßëâ$Mì¿ B„X(Œ“„èèuqH‚Ø &/ð>ûÊ{_û‘ÿÊ·oÿ¡Â¼¸/üÉ—{]¢D‰ýÞ 5¿0:ÄBˆˆ½.©ûÄäzâsŸÿâíïúh¡3ü·?òIïÍxÿ‰ý^ µ=ÔùÂHˆïYâ}&öˆÉ ôÐo~ê÷Ÿÿ‡…÷êì—~¯×ÅI‹Øï‰PÏ û°„šê¯‹CŠÄ>1yžû™þÖÆ™ õðØ­Ÿ¶ïöûFì¿ÏBÝ5<œóPÛCïuqH—Ø &/ð2øó¿øêßú;¿ô­Sßÿ-ãß÷ôƒ÷²ý÷Øß„úju¨Û¡†‡znËzKì“xy|öþôÊ£Ÿ/lÆý‘Ÿû¯㛽.ÑëLì¿B59ÔçpªCÝ5¼×%±@y—Í/ÿÇÿ¶ýøO„j~ýÄ'?Óëâ¼¶Äþ‹jo©&‡ZÝëâ@‘Ø &/ð*ô‹V]u—ØB- uµ´6Ôá^—ª‰}bò/¹OöOßýYoeì:±ßu¥7å†ëM¹¼´Ä>1yWBi×¶=g>ükÿés½.Îë@ìwQ¨“¡fÚI“W‚Ø &/ðªøê_}ýÇúW¿}û…{û»>ú¹Ï±×%zµ‰ý®õ0ÔÆp&CÍ õ3ÔÒ^—šûÄä^-_ø“/ßÿÞ…Jûm[~à‡ÿÁ/彯õºD¯*±ß¡P÷B õ0œÆP'CÍìu‰ %b€˜¼À«èw>ýG WþQ¨º#‹?ö ÿT¯‹óJûµ.Ô½pC= µ±×Å6ˆ}bò¯®RŸü൬OÞ.±¿:¡¦…úf,‚W—Ø &/ðJûÊ{_ûÁÿwæì­‚ØoW1yׯ¯þÖ/½óÿ_þÛÿÒëâ¼ìÄ~‹B]*íuêX¯‹ûÄä^3öo‘Øo*ÔŸP‹ÂY 5*Ô«^ºCì“xý|éËï}χ~ñ[§¾ÿ[Æ¿ï;ð_…ßöºD/#±ß@¨3¡æ„újQ¨Kª¯±@L^àuõÙ?øÓ‹þY¨Þkvè#?÷_ÿÆ7{]¢—‹Ø¯)Ô“P[B ''ÔŸP‹z]"è2±@L^àõö‰O~fûñŸ•<üúÉ_ÿý^ç%"öW 5¤T[BÍéuqà…ûÄä^{_ÿÆ7?üO­ðrÈ+~ÞŸ± µ"ÔÂ+jCmñ4™×˜Ø &/ˆ?ûâ_>ýàÇ +Â>ø÷þÍŸÿÅW{]¢û¡&„úPXmjH¨'½.¼Xb€˜¼@R>ýÙ?^ºùSÞù×b?Wzm¨ÞFK"Ä>1y}ì—~¯°£ÜìÅŸüÍÿŸ½ûñ®ªºóÿÿ?H´fœâ´®Ö¡F#¨%©¥.™§°°|Š.Y‚µH‡Ïiiiaj~ä—RhR@4M•´ª Y¡B…H)I‘0BC#@€ï ¶==åG¸¹÷œ³Ïçc±XAáæsÏÞ¯½Ï=g¶Ë±#ám_ï»Þ}³[¥ÎÛåÁIxÛ\‚\@2uîžS²¥_î,ÿc§T´¶ýÅvEAKlÛ×{­w\?»Þ}:lW*±mpEä’¬íHÇ„é•ÎÔàTçÛ'm_ï¯s@ï»Þ}Û$°íz@.έƒ†.xsÃnÛå$im_ï¬Þß„ß$ œO^ÛôŒ\Œòª†/~mžYZdgÓ!Ûåø.9m_ï¦YDHï¯ÞeÛå–%§íRA.³õÀg¨QL|ö­xo=„¶¯wPï£~L½§l2Ihû€Ô‘ À%´¶?6©ÜlM¾håÖ¸®7ﶯwMïÞAýŒz7õžÚ®‹x·}@o‘ ÀÕÔíÏQ¢Ö1𛋪köÙ.Ç{1nûz¿ô®é§Ó;¨÷Ñv9@¸Ä¸íÒ@.=øey}ÿAÅj#ßZ³ýÊcÙöõéÒÏ¥wMïír€0ŠeÛ¤\zv¼£sjñ†¾9Eú¥/ôGÛy#fm?®o๘µ}@†È øèOÎOËÖl³]ŽâÔöõŽ8ãê²]jqjû€Ì‘ @êªköåæ/ŽÇƒiñhûÎcžz_bù˜'à¹x´}€WÈ WÜ WŽž¸6º WF½íëÈëøÇ~XÀsQoûo‘ @޵ŸœTXéí¢ÛöÝÛDê]ˆ÷6‘€ç¢Ûö~ €´íl:4lÌ µ [î›[^Õ`»œÞ‰hÛ×qÖÑVå:ò:þ¶Ë¢'¢màrÈPå¦=†.P;2ª´¾á írR¹¶¯c«#¬šu´uÌm—DUäÚ>ÀWä¹Sgæ”lé—;K­iüOßl;Òa»¢k‹PÛ×ñÔQUµ:Â:Î:Ú¶+",BmrðЦ-c§TDeÚ‰¶ïžhëØFb¢ „\$Ú> 0äà-ç¶Æœa/†ù¶Æð·}=ÃÈ݈ „\øÛ> Häà‡Õo|è,{Ò¸·Ív9W涯#æ,Ô£#i» VÂÜöÁ#Ÿ8Û"de„p[„p¶}³‘‡ŽXt7òB.œm` ¹øª¹å¨³múâ—ßï>{ÎvEŸ [ÛבÑñÑQRU:b:n¶+â)lm`¹ ¦nÿ=ßZ¢¶–›¿¸ºfŸír.UÛ×1Ñ‘Q=:J:V¶Ëâ,Tm`¹£ûì¹ek¶õT¬7rü«Ö?ÿ IÛ×qÐÑP%:2:>áùüˆ«´}@H @Žwtþhö;YÙ}sЦoÐmUb½íëg×ÐqÐÑÐ1±x(€D±Þö¡B.Ákj><ü©ÕjzŸûêœUÛ­Ô`·íë§ÖÏ®tt4¬Ô$¹p#[ÔîÌþzy#J‚hÎVÛ×OªŸ×ìÏHÏܸ‘ €E]§»­ÜjÕ;¥â@k{`ß:ø¶¯ŸN?£YjU?µ~öÀ¾5¹p#ëŽ;1az¥Z¢ÙtïT百im_?‘ÙŠQßQ?©~Þ¾)€+"÷nä;› ³BíqÀÐåU ~»ÀÚ¾~ýDú^úéô3úýíôŒÜ¸‘ @¨8³§!£J}=ÐöU¿~ŠÀf¸RAîÜÈ lNuž™S²Å¹»²íH‡ßÅ×¶¯š;`õ³s,€Tû7r'gõ•~¹³.¯õ|õŸÚ¾êTµª9ør¤‚ܸ‘ @˜Õ7tvg¨Ü´ÇÃWö£í«Bg Uîá+ð ¹p#€ð[U±ý–û檩>üäË^íÞîmÛWUªM/¨:U­'¯ Àä>À\"á“]Óænì›S”•]0©°êXûÉ _Ы¶¯JTªRmªPufø‚|EîÜÈ Bš[ŽŽž¸Vm¶ÿ âek¶uŸ=—öKeÞöõÝUƒ*Ñë¨*Õ–öK ¹p#€Èy·¶97±Z®~××é½H†mߓܸ‘ @eþÙ\ÚmßÃÏ(ܸ‘ @teòì^mßógܸ‘ @Ô¥·¶goÛ¾kœ¹p#€xèíÞ©·}ÿö@{nÙšmý«Õß÷íRçwýýwý_Ûð¹p#€„¨©ÛÏ·–¨½çæ/®®Ùç´}}­ÿ¢¯õy„ˆ=ràF.±×ÜrtôĵfqÑÅ/¿o>t·}ýýw³Ä¨þ¦þ¾í’ø…ܸ‘ @Œ}r¢Ël>˜•]0©°êXûIç]Þöõõwô7Í„ú·6Jà/ràF.qµúo¹o®ø°1+÷¶]ò¯Ööõ7õ÷õ¿ôoõ A ä>À\â§¾áàQ¥fŸÁÊM{®øwznûúWf_B½Ž^ÍÏbŠÜ¸‘ @œ´é;¥Bº_î¬9%[Nuž¹Úß¼fÛ׿Õ+èuô×ôšzeJ(ràF.ñàž¾ÿé›×œ¾¥Øöõ:zµT&˜"ܸ‘ @ TnÚ3`è‚^ÝÞÙ«¶ïÜ€ªïrµPD¹p#€HÛÙtÈYþ¥¼ª!õ˜FÛ×ë; Ôèûö¾Xö‘û7rˆ(³=„ÚozÛC¤×ö ,ôo/ÙÀ@$û7rˆœ®ÓÝ‹Vnu¶?ÐڞƋdÒöõ îU‰êIãEXAîÜÈ Zªköåæ/V³ÍQRS·?í×ɼí뻫½ˆêQUi¿€ ‘û7rˆŠ?|ô§áO­Vƒí?¨xÙšm¾šWm_•¨½”jS…¾¿‘û7r¿ãS‹7ôÍ)Ò/}¡?fþš¶}?ÊàràF.!÷Ëòz縦æÃ^½¬çm_µ9_ªf¯^€·È}€¹„–ó€ÞÀo.òü=ŸÚ¾êTµ™?ÞÀ'ä>À\Bè@kûc“Ê}]ÀÓ¿¶ï^þT?EzËŸð ¹p#€Pqoð7ñÙ·üÛàÏﶯÊUÚÛ#ð ¹p#€ð(¯jøâ׿©I³bgÓ!_¿W0m_?…~}#ý\úé|ý^RAîÜÈ êUªÆ8`è‚77ìà;ÙöõéçÒ·ÓϨŸ4€ïàjÈ}€¹ØÕv¤cÂôJ5Ã~¹³æ”l9Õy&˜ïpÛ×Ï¥ŸN?£¾©~^ýÔÁ|_— ÷nä`K×éngŠ4vJEkÛ_‚üîVÚ¾~Fý¤Îä×urôŒÜ¸‘ €•›öä {Ñâ-”Û¾ss¬Ž€ŽCðIFîÜÈ `M͇Í+·Ü7wUÅv[eXoûúÙuÌâ9:&¶Ê’ÆzÛ„ ¹æXûÉI…UYÙ}sЬoÁ†¶o6×ÐÑÐ1Ñ‘ños Ž0´}@x @ºÏž+yå³Eûè‰k›[ŽÚ®(Dm_GCÇDÅèøè(éXÙ®ˆ³ð´}@ €ßªköåæ/VCÓï5uûm—ó©°µ}ç(éˆÙ.ˆ­°µ}€]äàŸæ–££¾_¦&ÖPñ²5ÛBõÉWÛ¾ŽŽ’Ž• Óq ç¨@ü„°í,"?ïèœZ¼Á<÷ƒ™oë¶+ºThÛ¾Ž•Ž˜yÊRÇ0„‡ˆ´Ð¶}€äà9gåÌáO­íÊ™!oû:n:zÖWaâ'äm0rðÐÖíÌQbvÖ[ÿîïm—Ó“H´}C³K£ŽªŽ­ír€8ˆDÛ†\<`»œLŦíë½pöøÐ{d» ìbÓöž €kŠåÞè1kûz_ôîè'Ò;¥÷Ëv9@xŬí)šTXu¼£Óv@‘ @”J¬ì‚¾9ES‹7|r¢ËvEž‰_Û×»£÷Hï”Þ/r¸šøµ} :íû*^¶f[÷Ùs¶kÂ…\®Hy¡ÔPv¨Œž¸¶¹å¨íŠ<×¶¯wJï¹\M\Û>гêš}¹ù‹uòë÷Íïd» DÈàrJ '5” ¶ËñE¼Û>¹\M¼Û>Ðs¥÷¦»gÇõJ/rps>]R^Äûӥط}r¸¢Ø·} gÇÚO:O‚ülþ¦8= ¤‡\ %‚rÁyúLya»"%¤í“ûÀ%Òöž55~艕1[)H¹œw­N©tHÈꔉjûä>àHTÛzæì$5ø‘¥õ m—ØA. áÔÿ+¸{]Û>¹œOdÛzÐuº{Þ²š~¹³Ô.ÆN©8ÐÚn»" häK}¾z~ÿJeÁvEJfÛ'÷d¶} gmG:&L¯4C‚9%[Nuž±]r ¤~^½½™¨ÿW خȂ$·}rI–ä¶ÄJ±Ÿÿ]cëQ¥j †.¨xg—ßU!A. iÞܰ[ý¼N{õùêùm—c mŸÜG2Ñö‘4&÷SÿûåU fœ0lÌŠM‡ü+  rÉ¡^]}»ÿ«··]Že´}ƒÜGÒÐö‘îÜïÕ?üäDWá ¿¹qà sQì—G‘ HõäŸ}K§ºúvõðl:pž¶ïBî#QhûHOrÿ@kû˜É¯›-‰­Üš´uäâM½·úp³)¹zuÖqÐö/Aî#!hûˆ7Ïs¿¦nÞˆ³yuÍ>OŠB…\@Œ©ßøÍE:ÃÕ“«?·]N¸Ðö¯ˆÜGìÑöcþåþªŠíý땇?µ:!û#9ÈÄ’újõØ:·Õ{³ÿøÑö{@î#Æhûˆ¥rÿxGçÔâ }sв² ô…þèÇw‚G. fœîZ¿è®{@Ûﹸ¢í#fÎýæ–£ÎÄsÙšmÝgÏùúí€ ˆõÌÎÇ:ê±m—j´ýTûˆÚ>âÄVîW×ìËÍ_Ì)ˆrñà<ö¥þ™Ç¾RAÛO¹8¡í#¬ç~÷ÙsÎÂ5£'®ÝÿñŸƒ¯ð¹€¨;ÐÚ®~ØY’OpRDÛïr±AÛGÔ…*÷µŸœTX••]À†Vˆ.rÑål§~X½1ÛÆõ m? ä>b€¶è mî;ßßrßܲʶËz‡\@D•W5¨×ÕÙ«Xý°ír¢‡¶Ÿ6r‘FÛGD…?÷+7íÉ~`¡*2ª´¾á ír€T‘ ˆõ±êiuÞª×Ußk»œ¨¢ígˆÜGDÑö9ÊýSgæ”lé—;KÕ~÷Ço´é°]pmä"DýêøŸ¾©3V=­ú[õº¶+Š0Ú~æÈ}DmÑÜWÙ Svá ¿©­o±]Ðr‘ÀÀÛs´}¯¸s?BÃ$m‘ 9”fR‘Î}çcMýÊ·*Š?‚\@øUnÚ“3ìEnÌómß[º GÛGÈiÞ¤Ù“™FÅ ÷K^ùà†3ô³deLž±¾ët·íŠ€K‘ ³Æ½m,ÜáÚ¾t–†|¹€¶ÐÒ\é‡3ßÖ¼I§¨æPKV¿o»"o|r¢ëéiëú\ü¹nº{6ã„ ¹€pba¿Ñö}ÚåЃ¶pÒ,Éìñªy“fOñËýýÿyð#KÍçžw<øBãÞ6ÛŸ"6ÝgÏ-~ù}6þömßW:oó]2àFÛGØhfdž ѯ{G.wîW×ìûüàçÍ;rü«\3D õ“¹ù‹uNæ(©©Ûo»œ8£í@ç°ÎdgÕ:·m—\@ÛGxh6¤9‘™i–”~²ûì¹ÙK6÷Í)ÒO}ýí…3½Ç5CØE. $š[ŽšPè?¨xÙšmô~£íCg²ÎgÕ:ÚßZ­óÜvEH:Ú>Â@}£æAš élÔÌHó£¤åþñŽÎÇŸyíºÛ.Ì…oÎ+^·q·íŠ\ä¬S—8µxƒâ +»@_è¶+JÚ~ÌI®3\ç9'9ì¢íÃ:Í}42 jN”ä.±qo›¹-ÊÜÅ5CXA.À®UÛ?÷Õ9棓¦æÃ¶ËIÚ~ðt†ë<7‚ëÌ·]ж‹4ß1wÑ›éYSÅÐùŸïyNÇäºÛ’>A†älq­ÊöbBÚ¾-:ÛÍÊ <$ +hû°Â}{äMwÏæöÈKtîž>¯ÚÜ@{ÃÀ —×Ú® B. xZÛÇN©p–^doV+hûéœ×™oÑ3ùuµÛ!Ahûžf7fOvÍw4ë!÷¯æXûÉÿxòegwk›mW„D ¤SgÌÖl:ë&L¯d™e‹hûÖéüW+лÀ&›mAzï·ÿãl¯ðð“/“û©Ø¾ëà¾`ÚÐG_âš!üF. 0åU †.Ðù6lÌŠM‡l—“t´ýP[P‹Ð{¡Ö¡6b»ÄmÁÐ,FsgûuÍqlW1+^«ï—;KG¯OvÁþì­SglW„Ø"x‡Œ*5#ÞŠwvÙ.ÐöCEíÂ\-QKù]c«írg´}øM3—‰Ï¾¥YŒÎ4Íh–—×Û®(ªt$'ÏXŸõ×#YZVg»"Ĺ_µé0wÄ©›S²…«[áAÛµµs5X­FmÇvEˆ'Ú>|¥9‹éÇ4‹Ñ\†ÜÏœû“ÖCðI+<§¹‰f(fª¢9‹f.¶+Š-g¥Ö¬ìVj…WÈx«©ùð×J¾å¾¹ì¸f´ýðS R;ÒÛôÐ+Õ²l—ƒ˜ íÃCf×<󀻿ã“]ßûÉ›ÎNŽe•;lW„È#à•cí''V)úæýlþ&Ï9Ú~$¨©5©M©e©}±T;2GÛ‡W41û¨jnòÝ¿Aåè½#—šÏdsó7îm³]"Œ\@æºÏž[¶f[ÿAÅ:—FO\«>ÊvE¸6Ú~„¨M©e™KÁjkjq¶+B„Ñö‘9Í>41“ÍJÈ}[ÔoÎ+6oÄÈñ¯ïè´]"‰\@†Þ­m6¡ ß7¿ÿ‘ír*Ú~ä¨}9m­ºfŸírU´}dB3ŽoO(3ÍD8‘¬ë>{nö’Í}sŠôŽèw}Í5Cô¹€´9ŸYôTÌg‘CÛ">‹GæhûHóŽ0cžŽL HÃ''º¦ÍÝè<ÓÄý QDÛ.µ8çYÝ©Åxf½BÛG¸/1¸é!Ð[Κ‡ÃŸZÍš‡ÑEÛ:µ>µAÖòEoÑöÑ+¬[9¬óƒÞ"ºú†ƒy#JØ-hûñàìõ©¶ùÁ‡l—ƒ í#Eìk]ì‚^!Š­íc§TèTé—;kÑÊ­ì´ýØP{T«TÛÔªvªÖj»"„m©`ßóh;Ò‘?n•ùl÷ CæÕÖ·Ø®!E. g§:ÏÌ)ÙrãÅP˜0½R}‹íŠà Ú~̨mª…ê=Uk½d³Z®íŠR´}ôL³ÍÌ$B³ r?ê¶ï:ø¥¡ Ì:ôÑ—¸fˆË‘ èAyUÀ‹}È×G¿´³éírà%Ú~,©ªµêUËUûµ]ˆ¶«ÑLAó3qP¢y„íŠà™Ò²:sIVvÁäë¹f7rW¤Qå°1+UÆm?Æœ+9<¶œ+9¸m—Óì@só¸™f š;Ø®ÞÓ»<ñÙ·úüõ]^^^o»"„¹€K9v¹ëlæ¢÷¸‚W´ýxSËUûåNo\޶K¬x­Þ|r¤™Âþì-r?ÞÜŸßñà | Œóä\̪fbV¥ˆ=Ú~8+A©]³ Ú>š hFÀ“e ôÞoÿçóƒŸ7oýÃO¾|¬ý¤íŠ`¹C瀳jýÖí´]|GÛOµhg§˜õïþÞv9°Œ¶Ñøÿ?ž|ÙL4/x·¶ÙvE°ÀYEöúÛ YE6ÉȰ«u2Ñö“F­[m\oºÚ»Z½ír` m?áÌÎtÿ³3äxGçãϼæì2¹nãnÛÁr!ÉÔ ühö;YÙ}sЦoÐmW„àÐöHm\-]í]­þ3ߦÉ'm?É4Úÿç{žÓ  ñ¿ft0š[ŽšÛHô+7qãÞ6Û!PäB2uŸ=·lͶþƒŠõîú~™úÛ!h´ýÄR{W«×»¯@ý€zÛ!P´ýdÒ_ã|3à×ÈŸÜÇåÖmÜ}s^±9I¸\(äBÕÔí¿ç[KÌ% êš}¶Ë´ý„SÛ7ƒCý®>Áv9m?iÜ7j´Ï èA÷Ùs3½gn'î›S4{Éf®&¹(Í-GGO\kn/yåÚx’Ñö¡@ý€YRX=Ÿ$m?9ÔÆ5ž×¨Þ,¢q>¹Tk?9rü«ÎrC|v{äBB|r¢«ð…ßÜ8pFVvÁ¤Â*m†zõ æ9bõê+lWÑöBcxgCíÉ}ôVãÞ6³ò¼~Ý;réþÿl»"ø…\H‚Õo|hÖ6fë  íÃM=ƒúÖNÚ~ìiÜ>ø‘¥Î†ã¬ ‚L”Uî0·‘ôÉ.xzÚ:®Æ¹oõ ‡Œ*5ûŽUnÚc»„m—S/a®«ßPïa»ø‚¶c«kÄ®q»y0D#yÛ!ºNwÿpæÛYÏ«ÎX²ú}ÛÁcäB\µé;¥Bon¿ÜYsJ¶°Ç(.AÛÇ©¯P¡~C§‡úÖ¶¿Ø®£íÇUÉ+˜½Å5nŸR¤þD½ŠYJýŒír)Ú~û ×Gm?4öþ§»Xòöhm7·‘˜Ål·ïâδH""­ët÷¢•[Í:ÀM*W«´]"ƒ¶ÞR£~Ƭ[¨ž‡Õ*"жiokÔm†ß÷}»”ÜG°ÙeÔ‘ Ñ¥Ö—›¿Xo_Þˆ’šºý¶ËAÄÐö‘õ6êstò üæ"õB¶ËA¯Ñö#Jcl´Í[coZÂfÞ²š¾9E:?¯¿½pú¼êî³çlW„T‘ Qô‡þ4ü©Õzãú*þey½írI´}dB=úBꋚšÛ.½@Û«ÿk~µÆØzã4Þ~~éÛWv¼£óñg^»î¶ W-nÎ+^·‘…È¢\ˆ5´©Åú¥/ôGÛ!ªhûÈÝQDÑö£E#j«õ–iŒ­‘6 á÷‡þdn`Ó/}ÑÜrÔvE¸r!BÜäÕÖl—ƒh£íÃîÛ–­Ùf»\m?*4оëá¿ ªù ÑÂ¥Œ!"Áy`G‰À#ðmâqæ¡í‡7Ý!ºNwOŸ÷·[.¯µ]®Œ\9ôƒOhûð–{¹ãÑײìahÑöCNcf÷¢ä>¢Ž¥Â\-÷†_“ «X¼Þ¢íÃl‡~´ýÐbÑ~Ę{«”û¿³Œk†¡B.„SyUÿ6OoͰ1+v6²]bˆ¶ÿ¨×Rߥì–ûæª7³]þm?„46Ö™M½{e•;úåÎÒyÞ'»àéië¸fäBØÔ72ªToÊ€¡ *7í±]b‹¶¿©S?¦ÓL}šz6ÛåàS´ýPÑxX£bõ¦hœ¬Ñ²íŠê<3yÆú¬‹çüÿù·™¥eu¶+¹"mG:&L¯4‰0§d‹Ú‹íŠg´}@ý˜z3s5xüOßT/g»"ÐöCD#aÓ:46Ö™ÜGr(¾ñèró™ø­÷ÏÿwlW”häBtîv†Lc§T0dBhûŒú4õl\ì Ú~ÔíøXc`3Ö¨˜ÜG2ÕÖ·8 !Ü*‚-ä‚u•›öä {‘[ª0Ú>æÜ ¯›á-¢íÛ¥¯Æ½ÎÇ"Û®°ìÅ[o¸¸|bVvÁf¿ÃšºÁ#,jj>ì,¹°úm—ƒd¡íà õuêñÌbY{Ûl—“D´}[4Êýqñ¯ÍcSýj l»" ,ÜÒÞt÷l¤ ¹`…Y’]¡À’ì°…¶[œÍtÔ²™NðhûVh|kvçdYEàjš[ŽÞ;r©ùôüÎa/rÍ00äBÀºÏž+yågËfù¶+BBÑöa—z?õæRðâ—ßWßh»¢¤ íLcÚ;ÿ}‘âj¬Kî=«®Ù÷¹¯Îa#Î ‘ AÒž›¿Xüžo-©©Ûo»$ma žPý¡NEõê!m—“´ýÀh«Ñ¬Öj|ˤ¨ûì¹ÙK6÷Í)RÛ¹þöB}Í5C_‘ Áhn9:êûe:Ôý/[³³ÖÑöêÕ+ªo4—‚ùôÄo´ý˜Ñì?ÜQ¨C­1-£Y Ç;:ýkÍ•›óŠ×mÜm»¢Ø"ü¦“yjñÅY4I´]pm¡¢¾Q=¤úIõ–ê3é*ýCÛ÷›F­»šA¬F³œÌ@&÷¶™›ë¸ãÚ?䂯VUl7+é juSóaÛåCÛG©ŸToin®Sÿi»œx¢íûǽ†F°¬†xåW¿n4‹o\wÛ³?ó+2y‹\ðÉÖíÌQbvÚâð"„hû-–fWVõ¢Œí»Þñà ¦é }ô%®fˆ\ðJyUÀ¡ t0‡Y±³éír€k˜õó÷tºêwÛ…× UýªNWõ±êim—yä¾'4þÔ(Ô G5.ÕèÔvE@â”–ÕõË¥6Ø'»`Ra× ÓF.dNc•¯~‰± ¢…ù ¢Å¹æ6dT)×Ü2AîgHcN<5þÔaÔXT#RÛÉ¥ö8yÆzÚc†È…L´épîešS²…ëˆ惈õ±êi{òÕÛ®(’ÈýL¸?Ð(”ÜÂÀýyýmßXÈçõ½E.¤Ç¬u`BµEÌQΚ]ê.¯eíŽÞ"÷Ó£fö y^ ­Úú÷ó¼\3L¹†ÊM{œµÐë¸Hb>ˆHSßëìé£>Ùv9QBî÷–F•Îz†mjÌi»"WÅz¿i zÅÙ+Y‰À^Ɉ4惈õÃæjðÃO¾¬þÙv9Ñ@î§Žý΀(úäD×?¬pöeqk"Rt¼£sRaUVvAßœ¢is7êL³]惈õÆê“Õ3g]\_îXûIÛ…¹Ÿ¢×ßÞevÀÔ¨RcKrˆ–æ–£÷Ž\j>ÙÏÍ_ܸ·ÍvEáE.\S÷ÙsËÖlë?¨Xjôĵ:»lWx€ù âD=³úgÒê«Õc«ß¶]Qx‘ûפq£Ff©ñ$¹D×[›šnÎ+6Íù;×ïè´]Q‘ =ÛüþG&ôû»µÍ¶Ë<Ã|ñ£^Úé±Õ{Û.'¤Èýh¬¨£:j ©‘¤íŠdªûì¹ÙK6÷Í)R»Öïúšk†— ®†«Íˆ7惈%îè¸&rÿŠ1ñv¬ýäÈñ¯š«=ÿ’7§ºfŸíŠB„\¸Ü''º~6O£ Þ˜"ÆÔo;O|«?çÉ/7rÿrj|hŠ1’û@\5îmûòC?çnðK —`µ:$óAÄžúpõä¬} rßͽâ„F‰¬8$AYågµ¨§§­ãš!¹à¨o88ø‘¥ìf…„`>ˆ„pvŒUÏŽ±çÉý¿ÒPã@gEzmW 8]§»2gCVv»Éœ'.:ÐÚ>vJ…ŽC¿ÜY:عIÀ|É¡^]}»zxóêíÕçÛ®È&rÿ¼kÇj5&$÷dj;Ò‘?n•¹CàÖûç×ַخȎ„ç©Î3sJ¶˜A„é•:+lW„ù ’F=¼úyséO=¿úÛÙ‘ðÜ×xO£>3üÓ8ܰ}×A§[øÆ£Ë[Ûþb»¢ %9*ÞÙ5`èýøCF•îl:d» PÌ‘LêíÕçëäWÿ¯°]މÍ}ñ4Òs>ÐÐvEB¤´¬Î|B”•]0yÆúD]3Lf.h<0lÌ 3(¯j°]`óA$™z~s=PY´ë Ì}ë4º3 i¼§QŸíŠ„‘úЧ§­ëó×¾bõÚ®( IË…cí'ÍýB7œQøÂo5÷ܘ"áÔÿ+n¼ø™r!9[ $-÷5¢3×ü5ÆÓHÜг­íC}ÉÜKpǃ/$á^‚ääB×éîE+·šÕeYO`>œw­'¦tPF$a]‘ää¾FqË™AFwä>€ÔU×ìûüàçM2â{¯ÄûšaBrAï©Yo÷Õ9jJ e‡írüïÜ×hMc6Üô3öÍ)Jøžb2w¼£óñg^3{•~ö+Ï­Û¸ÛvEÞ‹q.èí›Z|a£I%‚¾ÐmW„óAàr&8”ÊŽ¸GŒs_ã4ÖôÓiä¦ñ[,ß>V4·½ç[KÌ]¹ù‹÷¶Ù®ÈK±Ì…î³ç–­ÙÖP±¹Ì«wÐvE@è0®F©1rü«æÆ¥‰2ÅvE^Šeîkl¦šªÝõðbr€ÖmÜ}s^qü.:Å/œÇ@ <2\ óA gJ3ňكç1Ë}÷­\§ÅòV.áÑ}ö\ÁÂß87¥ÿâ¿mWä8åÂþÿëbïtãÀ¥eu¶+êˆæBÛ‘Žïþø UÞ/wÖœ’-zlWD óA =JåŽÒG-HI¤<²]QïD4÷5¾Ò(K•kÄ¥q¹ l=±Òܽpëýókë[lW”ªÈåBÔƒ æƒ@&”>ãúf/KF.÷5¦ÒÈÊ ±†YAî3w—¥éa$º¬håBå¦=Ù,Œô:@H02ÅÇ"”ûѽØ áJËênˆÎ- QÉ…M‡âñ ?̯”W5DhY³Hä¾ûa©J^ùÀvEÐ;îGžoº;Ô<‡?b¶Ð7ÌEhÛ£ðç~ ëã’%‘šþ×vEWæ\è>{nÑÊ­1Û 惀ç”ûJ+s)XùÎíÑÜû)¹7ó"÷ÄCÈ·L m.è¸åæ/Vmy#JjêöÛ.ˆ惀O”YJ.µ/¥˜²Ìv9— gîkt¤1’,iÔÂãš½dsßœ"õr×ß^Xôâ»á¹fÂ\hn9:ü©Õªªÿ âek¶…çXqÂ|ð•òK)¦V¦DS®Ù.ço–ûJy‹4:RU)i¼Dã?óÚu·]¸öus^ñº»mWtA¨rA‡hjñÅAVv¾ÐmWÄóAÀoN¨éWxB-T¹¯±FDªG£#‘BrˆÀW{ÛÌmúõ•á¿°~Í0<¹°ªb»s)µ©ù°ír€˜c>C‰æÜô¢¤³]NXr_ã‚ÌpHã"ŽìÖ[·q÷g¿ò\.ˆ…!œG-r†½È#@0˜ARº üæ¢0<o=÷Ý·Kýó=Ï…äv)^×éîéóªÍ ó7ÜY´py­•2ìæÂÖö1“_w–bÓ1±R@Ì€)ãœE³•}J@+eØÍ}v4æ1Ë)hDîÀ±ö“æ6[ jÙÊg«&}÷ Ó+öì*{Ì+”wŸ}K­ÏÖ¦º¶rß½Üú<ù2¹nÛwt6ÜúèKA^3´’ åU †.Ð÷6fÅΦCA~kóAÀ"eŸPmPi¨L ò[ŸûÕhlãlǬ1O`ߢåå_ý®_î,õ–}² žž¶îT百iÀ¹ð»ÆÖ!£JMV¼³+˜o àrÌëÞܰÛ\U2*ƒù¦Aæ¾F2ÏhT£ï¨Ί×êø¦iê9'ÏXŸõמ³´¬ÎïïX.´é˜0½Òü\sJ¶3Ûp5Ì0P*ÍÕ`¥¤²ÒïïXîk c~.j4¶!÷ u­mqî¬ø×¯Ï÷õΊr¡ët÷¼e5&ÆN©°õ=7æƒ@x(÷•æ’©Ó×UVÈ}[4z±ò ÄIm}Ë­÷Úæ[åÓ5C¿s¡rÓžœa/ê[ ~di} aÁ|¥¤y¤B¹©ôô黸šû«hÄb†._2O#?¾ $Ê…•™/.™•]ð“9<¿fè_.45~艕zñ[x¸1ÂI‰©ÜTóT†*I=}Ÿr_ãRÌ/·ØÚE bé“]OO[gvn½éîÙe•;<|q?ráXûÉI…U …¾9E?›¿)øÅ´\óA ´Ì–LÊP%©òÔÛ­üÈ}L̾Š«|ï'o’ûà‡æ–£÷Ž\jîÁø·üŸ7îmóäe½Í…î³ç–­ÙfBaôĵªÙ“—à9æƒ@È)C•¤æR°²U ëÉËz›ûhLb'¥ûà·êš}7盎wäøW3¿fèa.¨¶ÜüÅz5ý¾ùý2Aþa>DBMÝ~'[•³™¿ W¹¯ˆÆ!f@¢‘IðÜ@buŸ=7{Éæ¾9Eêõ»¾Îäš¡'¹à\Ãì?¨ØÃk˜üÃ|ˆ sïÖ“{o2Ï}oÇ!€ôïèü¿ÿ¹Æ¹.·þÝß§÷:æÂ''º¦opžqPUé½€€1¢E ûƒ™o›gó•¼i?£—aîk¼áܧôí eä>ØÕ¸·ÍÜF’ö}û™ä‚³Úð§Vû±ÿ0¢Hi«ÌÍdíî´s߽ޯ^­cÈ\yUƒ³®×¸ýªW× ÓË…><7¢Äï=’ø‡ù ]ëßý½ÙÛWY¬DîÕ¿M#÷5®Ðè§uΞè:Ý=}^õõ·övßŸÞæÂÖö±S*ôOúåÎZ´r«çû!óA Ò”¿Jas5X¹¬tNñö6÷Ýû k¤Aî@˜µéÈ·ÊÜËqË}skë[®ùORÏ…Sgf/Ù|ãÅP˜0½RßË‹’ØÁ|ˆe±YmY鬌VR_󟤞ûE˜§BôK£ r¢bû®ƒ·}c¡éÀ‡>úRÏ× SÌ…òª†Cèo~}ôK;›yZ/ ˜±¡\~à±åjÑJjåuÏ9•Ü×ÈAã3øÒÐWxZ/ ¥euýrg©'ï“]0yÆú«]3¼f.ô*eDóA fœ+·Jí®Üöœû-hÌ ‘ƒy0Dc ßêøN½ú¤Âªž{õrÁ}ÊÌEï¥r €¨`>ÄO*Ovôûî+ÉŸ}‹Ü€xpßõqǃ/\r×Çs!í§ÔDóA ®œ•ߔ㗯üvÅÜר@#„Ÿ4DÑ–ºýŸü¼éê~òå#ÇN˜ÿ~y.¸W±Þºý–êà/æƒ@¼¹w†R²;ÿý’Ü×x@£3<Ð8á½ßþ¥zApV¾þöB³j´;2ßå@T0’@inÖU¾+åÏ»æƒiïTˆ´ONt=þÌkή²ÿ5¿Z_üê×?˜ùvVvAßœ¢©ÅŽwtÚ.€¿˜ ¡ÜW²+ß•òÊz%¾Ú¾Òß<¢ñ€Fä>$MsËÑ{G.5÷‡è×ÿù·™ú}Ô÷Ëôßm— ÌDQ¾ž¸ÖI|ó+oD ¹IöÜ/þÛ¬>j–§æò ̤QÊ› ¤Ì ¢Ø®`sð3_¾p0ë⬰oNÑì%›»Ïž³]ß1’CÉ®|WÊ;‰o>%ÔH€Ï i>9ÑUøÂoÌs“ «^{—A¿ÿê§Ë‹Ýû|uÍ>ÛeðóA !”éJvñÊz'÷50ëhT ±í2ApÖ6fÅ%ëŒéëÆ½mw^ÜiB¿î¹”k†@Œ1bϽV@ΰ•òçÿ>÷5x艕¬+IPßppȨR“•›ö8ÿýòýË*w˜5Çúd<=m× Xb>Ʋ[ n–P¦+ÙÿuyîkT`öÖ8A£õ|ÔÚö—±S*ÔÏ÷Ë5§dK×én÷ÿ½<DçG³ß1Ü0pÆÏWþ6Ø’øŽù WJm³×°rü‡3ßN1÷ç-«Ñ8AÿKc‚-à‹Sg44Ýû„é•mG:.ÿ;WÌC?Ü*sŸÉ­÷ϯ­oñ¿da>Ä’Zym‚[ žFîk´à\@Ö(Âÿ’~ysÃîC\óörÁxÿwœpyà±åW ‘Ã|ˆ¥³³—DÏ—p¯™û¿kl5˜h¡±„?õ|´³éа1+Ô“ñkóÊ«zþË×Ì£´¬Î¬M•]0yÆz®QÇ|ˆ%²rÙ<âñ™/ÏT^÷ü÷SÌ}ÌUe(4®ð®^€ŽµŸœøì[ê½o8#Åå£SÌ…óÿpz¿ÜYî‡ÓDóA ”Åæ©Ô—€ëUîk,qãÅG5ºÐË’¾è:ݽhåV³.èc“Ê´¶§øSÏC¯|ÿw–™;Rîxð…í»Xˆ ˆ$æƒ@¤)•Â&އŒ*õ5÷ÇL~ݬSª‘Æ%«Ó ºfßÀo.R_7¢¤¦n¯þmosÁùŽŸü·Ím¹fDóA ¢”¹J^ÁÊb%r¯þyz¹¯Ñ…Æú‡oôö;üÓÔ|xøS«Õ?÷TüËòú4^!½\0.¯í›S¤~ýí…ÓçUs͈æƒ@ä(g•¶Ê\5^åï¼e5i¼H&¹¿ªb»Æúç{h’Æ+¼r¼£sjñÅ~é ý1½×É$L?óÚu·]¸Jys^ñº,DDóA Z”°ÊY5[e®’×bî{2üdbÙšmκ?|ô§L^*Ã\0š[Žææ/6÷®è‹ Kæƒ@T(U= Y¯rß¹=Ic’L^ Ð+Î üJOnà÷$ ¯.]óA üü¸ ÇÃÜ×8ÄLTÓX¾Ð[ZÛGO\ëù_æ‚tŸ=—ù£ À|9e¨é{žûÎò楤¾Ì) uî €&Vy»˜§·¹`d¸ô€0BË×E¼}Ê}O²² Rßþ¢òª†[®{ؘ;›yþú~ä‚‘öÖHÀ|!e¥Ó×M~ýË}R4VÑ‹kܢыç¯ISßpЄ€¡ *7íñ黸— FY厼k–¾EŸì‚§§­ãš!ÌPQ>*%••j˜ýrg)=}úF~ç¾F,Ù,4—‚5’ñé»@¼µéÿÓ7M"Ì)ÙrªóŒßËï\Õ?yÆú¬‹÷™/Ï,-«óï{HóA <”ŒÊG5Ie¥3¹¯Ñ‹Æ0úFÏhTãß÷€˜qw¡c§TÐ… †~–ÿ¥¹æÖûç×Ö·øýô€ù JCe¢ Ç[³Üÿîßæâ6ÄCå¦=9Ã^ ø‹ÀrÁp_þ¸U\3la>Ø¥T™4àÜw~ÑÇ¿‡_ ê÷¶9`¯~ãà ¿uÀ¹`,Yýþ —KÍÊ.øáÌ·½ZC@꘶(õ”}æ1 ¥áÏWþ6Èïn%÷Ë*w8‹ãiÌä·€³¾D³•\8ÿ÷Îßt÷lÿœpEÌ+”wf·>[ˬYÌ}³y–Æ<žožQÔ}öÜâ—ßw¶pmn9j¥ [¹`ìÿøÏ÷Ž\jî–Éö"× À0¦Œ3O…è—²/±¹¯1¹¬QÆBVÊëªköåæ/VxÏ·–ÔÔí·X‰Ý\0|ÝxÀ1£\Sº™˜ûü½Ï+õ,†Ü×È'oD‰ÊÐXÈîÑ€à5·5¡ÐPñ²5Û¬_ C.œ¿øiéì%›û橘ëo/œ¹è=ëGˆ7æƒ@”eJ4åšš›2NIg=Ý“ûi,d.Ûú´‚t¼£sjñÅAVvÁf¿£?Ú®è‚ä‚¡còø3¯™+¨7ç¯Û¸ÛvE@l1ü¦S–™P{lR9¹934Ò¸H£#}’C~XU±ýs_£xøS«›šÛ.çoB• FãÞ6s3­~å(áš!à惀”\æ~HsKd¨žŽaîk\¤Ñ‘ªÒHIã%Ûå€Çœ›äs†½ªî×a.ë6î6‹í\wÛ³?ó× o1ü`ntQr™%S~õëFÛ]*´¹_]³Ï¬·£Q“Ý¥À+ZÛÇN©0‰°håÖpî²Ú\8q‡¦éóªÍc7 œ±py­íŠ€ø`>xN9ev×Ur)¿ÈýÞÒÓxÉ\ ÖJã(Û@šNuž1›ì¨C›0½òȱ¶+ºª0ç‚q¬ýäÃO¾üé²lƒŸï·ÿc»" ˜R69 e+³ÈýL(÷5vR‘fkf©lW½S^Õ0`èõcÃÆ¬ØÙtÈv9×þ\0¶ï:xǃ/˜¨úèK\32Ä|ð„òH©dâI9¥´²]Ñ5D%÷5‚Ò8J¥jL¥‘•ír %껆Œ*Vß•\0–—×÷Ë¥‚ûdL|ö-®ic>dH¤$R©))›JËêlW”’hå~Å;»Ì5v¯Â@’µépîm˜S²%Bó”håÂù‹ù;yÆú¬¨å/6ÌL(}œë“J%rß?:¶Y™£­±–F\¶+€¿Óuº{áòZÓMEñÙçÈå‚á¾?çKC„ÿþ l˜éQâ|éâ'V}~!º¹oÖèÓˆKã®p®Õ *7íqÖF®oˆä”$¢¹`ÔÖ·|aÈ<ÊùãVqÍHóA ·”2Ê:·Ü7Wd»¢tD:÷5ÖüÈR³‡—Æ`¶ËhM͇͢—J„Hïé\0œõ½³² B»¾76ÌÔ™ýÌ£ Qßÿ(¹¯q—F_f)WÇl— q޵ŸœTX¥Pè›S4mîÆONtÙ®(#1ÈÑ»ðÝ¿áìÿ[V¹ÃvE@Ø1R¤L1;â)eÆýèWä~è]øÙüM‰i<¦Q™Æf¶+ÝgÏ-[³­ÿ bu¤£'®mn9j»"Ä# ½#÷Ž\jîäÉÍ_ܸ·ÍvE@x1®I9¢41±¢|!÷ÃFïˆÆcúq46ÓMã4Ûˆ³wk›M(èw}m»ÏÄ) ý,7ç›øþö„²ã¶+ˆù Ðe‡ÄD‰2eý»¿·]‘gâ—û›ßÿ(–#4áï«OñË…ó?ɽdsßœ"ýhú]_Çì]2Ç|¸¢Ø'H\s?~wpƒONtM›»1Þw§Ç2Œã#Ç¿ê\ÝåϤù p9÷&Jr?Z”ûqZá€u Y½*ƹ`Äòé sÌ7÷èÿ–ÿó?ûÜטmøS«c°<‹êæ(IÈî6±Ïý:Ü÷~ò&× 惀¡DP.$g…ê„ä~ vˆ`ÅÖö±S*Ô{ô˵pymv²KH.œ¿¸{ÔOælˆÇîQ@æ˜çÿ~[e¹'z7õþjD§ŸW£;ñlW ÔNuž™S²åÆ‹¡0azeÛ‘Û$9¹`èÍ·ÊÜô…!ójë[lWØÁ| §þ_)`â@¹@îÇ•ÞYëô#kŒ§‘žÆ{¶+FåU †.P_1dTéΦC¶Ë TÒrÁؾëà¿~}¾ }ô%®"˜"±Ôç«ç7 ,P"Ø®(PÉÌ}î4ÆÓ®ñžF}¶Ë"ê†Y‘äþ!™¹`”–Õ™ÛH²² &ÏXÏ5C$ óA$úyõöæÁõÿJÛYäÜw®ÿkì—´ëÿ.wäØ çþÂ~“ع@’sáüűÁÓÓÖõùëØ`Åkõ¶+Â|Ióò¯~g®ªÏWÏOîÛ.Ľïõ9Ïi4h»"tî^´r«Ym’狞 †ûÞ¡;|!i÷!™˜"9Ô««oçƒÜ?ïZ?P£A “°Ž‡:@gýᚺý¶Ë±\pT×ìûüàçÍ€á?ž|9–ÛæƒHõäf+:ýR¯~ÞvEö‘ûýÅ8 @8û“~î«sØŸÔA.\âÂÚãwé˜\{áôyÕ\3D\1D¼©÷V®žüÂCw±ÇƒÜ¿„Æ„ê˜h”¨±¢írøâxGçf¿“•]Ð7§hjñýÑvE!B.\NgÈãϼfö&þç{ž[·q·íŠï1DŒ©ßþìWžÓ®ž\ý9¹ïFî_NgˆÆ‡%j¬¨#' 'ÝgÏ-[³­ÿ bu}#Ç¿ÚÜrÔvE¡C.\Ζ¯ ÿ…¹Ë(7qãÞ6Û^b>ˆXR_­ÛtÝêÃÉýË‘ûW£³EcE5zÔÒvE2US·ÿžo-1ƒy¸r¡gë6î¾9¯˜‹Ìˆ惈÷­ê·¹µãjÈýžiÄh.)h ÉB@t5·=q­Y6jñËïs…§äÂ5éü)zñ]óJßœ¢ÙK6sF!˜"NÔ3«6~«Ç¦—î¹M:4z4 Ñk<ɧÌ@´|r¢Ël+“•]0©°Š%"¯‰\H‘Î%s ‹Ô!˜"ÜKC«—&÷¯‰ÜO‘Î%$5ž4Uk„i»"×¶úo¹o®z¹acVð´WŠÈ…^ihú_g«Á,ÝÿñŸmW¤‰ù ¢î@k»úagëXõ϶+Šr¿W4žÔ¨RGL#L3m—àªêUjv©Ü´Çv9QB.¤¡¬r‡¹¤OvÁÓÓÖqÍQÄ|Ñ¥^W}¯z`ó`ˆúdÛE ¹Ÿ-ÍîÕmjÌi»§íHÇØ)j¡ýrgÍ)ÙrªóŒíŠ"†\HδÉ3Ög]Ü0pFÉ+Ø®è惈¨Ò²:õº:{Õ«&÷{‹ÜOÎ435ÚÔÑÓÈSãOÛø»†9þ§oÒ0ÓC.dBgÝCO¬4w+ÝzÿüÚúÛ©b>ˆÈQ«žÖt¹ê{Éýôû™ÐY§1'CaP¹iÏ€¡ øà>säBæÜC”acV0DA$0D„pñÍCä~æœÇ”4å1% x;›9ö–W5Ø.'òȯ”–ÕÝÈ-Lˆ惈÷ÍùêcÕÓÚ®(òÈ}¯hê,c¨Ñ©ír€D0 ÿšD`á_¯ r/qðOw±ÄBù ÂÅ»ü@î{ÈÙæL‡”mÎ_uî^´r«³1èÖvÛŹà¹K–@ß¾‹û™FÌfînuoîCî{ˆÜ÷œÎONÍj·¯jÔj»" nªköåæ/V+ËQRS·ßv9qC.ø„-’rÌNê-ÕgšÎS½¨úRÛÅ ¹ïQ5RÕ±Õ¨•óðÊ>úÓð§V«eõT¼lÍ6ÛåĹà«â_üwßœ"áëo/ü¯ùÕÝgÏÙ®øóA„zÈ‚…¿Qo©3S=§úOÛŹï+W5jÕÖVãXÛåv¼£sjñÅ~é ýÑvE±E.øMgïãϼvÝm®ußœW¼nãnÛ0D¨¨oT©sR½¥úLrß?ä¾ßÄ™ûey½si¥©ù°írbŽ\FãÞ6sÛ³~Ýõðâæ–£¶+BÒ1DH¨?¼ç[KL÷¨~R½¥íŠbŽÜ†F°ÎMnÙÚ.ˆ çÖëß\Ä­×Á ‚´nãîÏ~å9.€# ˜Â:÷íê¹}"ä~4šÕ˜–E0€ThmlR9K3\˜Îíéóªd.¯µ]Šù ìRïwß>^­^‘Ü ¹0÷"ùë²X.p9÷Ö-Ÿ}‹eF.X¡ó|Ä÷^a=XÄ|¶¸—_VOHîŒÜ·Bç¹F¹l¢ \®¼ªá‹_›§Ö1lÌŠM‡l—“Dä‚EÛwt6غÿ;˸fˆ 1DðÔË }ô%¶gµ‹Ü·Hc]xuü5úÕØv9€eõ ‡Œ*U‹0tÁ›xdÀrÁºÕo|Ø/w–Þ…>ÙOO[Ç5Cƒù ‚tªóŒú7õr:ëÔã©ß³]Qr‘ûÖiܫѯÞ„5¶]`AÛ‘Ž Ó+M"Ì)Ù¢Œ°]Q¢‘ a V0yÆú¬¿Ž”JËêlW„øc>ˆÀ¨O3W½ÔË©¯#÷í"÷Ã@­@c`Ó.4*ÖØØvE@@ºNw;'ÿØ)­m±]È…Q‹øÆ£ËÍT·Þ?¿nÇǶ+Bœ1D¶ï:¨ÞÌtkêßÈý0 ÷ÃC-Bãaç#VUBìUnÚ“3ìE>r!ljë[œáSþ¸U\3„O˜ÂWê»Ôƒ9¸Ô³Ù®Ÿ"÷ÃÆy„Jãd–m—ø¢©ù°yxö–û殪Øn»ür!œ.¬Ä~qÑݬì‚ÿšk†ðóAøDýÕOæl07À«cW°!÷ÃI#d“Í‹9Û.ð̱ö““ « }sŠX\7œÈ…ÐR{yzÚ:³SóMwÏ.«Üa»"Ä óAøA=•ÙgM} d…¹Zf 6™5rÖø™­XuÝgÏ•¼ò …Ñ×6·µ]®Œ\9µ{G.5÷\Ýùï‹÷¶Ù®1Á|ÞRïôå‡~n:+õZä~h‘û!§¶£‘³¹¬±´FÔ¶+ÒQ]³/7±Îdý^S·ßv9è ¹ jSÿ’7Ç ´FŽ•k†ÈóAxE=’ú%ÓA©§Re»"ô„ÜŸ±4m ÑÒÜrtÔ÷ËtööT¼lÍ6®i„¹jM³—lî›S¤÷ëî(Ô×´/d‚ù 2çî—ô;ýR$ûQ¡Ö¤±´FÔz¿4ºæ3w„ßñŽÎ©ÅÌ=Ï?˜ù¶þh»"¤„\ˆµ¬ïL\c®ÃßœW¼nãnÛ!ª˜"ComjR/dº#õKä~TûÑ¢–¥qµY‹C#mBËYiøS«Y)ZÈ…(jÜÛfn#á9¤ù Òæ~®Y}Ï5G ¹E]kŒÍZý§­Ûÿ˜7¢Ä왲þÝßÛ.½F.D×ëoïrÖñ3ùuÖñC¯0DÔÏ<ñà gÝcõB¶+B¯‘ûÑ¥‘¶ÙË[coÀm—œ?ÐÚ>vJ…I„E+·²?ZD‘ ‘¦v7}^õõ·²Ïz‹ù zËÙU}Žzr?¢ÈýHS»Ó¨Û\ Ö8\£qÛ!¡Nuž™¹è½/†Â„é•mG:lW„ô‘ 1 6˜?n•¹wë–ûænaQ_¤€ù RW[ßbž Ñ/õ6ä~¤‘û1 6¨¸ÞGÆ5&×ÈÜvEH–òª†Cè |à±å;›Ù.™"bcû®ƒÙ,4¶¡¾Ä5CôŒù R¡žDý‰éXÔ蟱]2EîdžÆáëÝÔÈ\ãsÛå tÖ}}ôKœu1C.ÄLiY]¿ÜYzOûdL*¬âš!®†ù z¦ÞcòŒõêItž¨WQßb»"xƒÜç“Òù¤þq*={ÉfF˜qB.ÄZ¨f‚ŒâÐ3æƒèW–bŒÜµPÏy’ >1O­šPà©ÕX"⊻¼Ð3惸"õw<øwžÇ¹WÎJ·³Ò#¼R¹i³ªí°]|A.ÄÛ–ºý¬+b>ˆK9v‚•©’€Ü7Øà4’·]"Œ]/“ƒ\HV‰Çå˜ÂÁÎ5‰Bî'Fïæj°ÆóÕÛ.s¼£sRaUVvAßœ¢©ÅØá:öÈ…„P[3ùuv‘†ƒù Œ_ýºÑìe¦þA½¹{ä~B¨-k$¯ñ|Öŧ€5·]" ûì¹ek¶õT¬^bôĵÍ-GmW„ ‰¢v}ïÈ¥æ~°ÜüÅ{ÛlWk˜B=€úÓ!¨g ÷‚ÜOµkêõŽk„¯q¾Fû¶+Bxm~ÿ# ú½ºfŸírr!ÖmÜ}s^±~gâ®&óÁ$S«ôÿ­5€zõ ¶+BpÈýÒØÞçkÌo»„ŽsÝ঻gsÝ È…dRKŸ½dó?Üqáq¡¾9Eúš¶Ÿ4̓ɴ}µz½ûêhû Dî'“¹ÐÜÎ}€p|r¢ëgó79÷k?i»"X@.$™ZýÈñ¯šÏþ%o÷$ óÁRÿÜWç˜&¯¶Oî'¹ŸdjõÎ:!šð¼pÂ9ë=ôÄJÖJ2r{Ûîü÷EA3Í tJhŽ ™‚íŠà£Sgæ”l1o÷„é•mG:lW„° p õùãV™ûÊn½~m}‹íŠà æƒñ¦–«ök²Z4¹¹K¨ÐìÀ|`¤ù‚f ¶+‚÷*ÞÙ5`è½ËCF•þ®±Õv9rWT·ãcg0ùG—·¶ýÅvEðóÁ¸ÒÐNmÖ¹¤£¶l»"„ ¹+ÒA3š5hî`»xfgÓ¡acV˜w¶¼ªÁv9#r=(-«3÷deLž±žk†qÂ|0~ÔBÕNÍ-ßj¹j¿¶+B‘ûèæ æS$Í 4°]2r¬ý¤ùä÷Æ3 _ø KCàjÈô̽…F˜«ßøÐvEðóÁ˜)«Üa®Þ¨µ²$z@î£gê=4w¸ñâ£ÇšM°1Muî^´r«Y'pÌä×y2=# õ$÷g™¹íŽ_ؾ‹…È"ù`l¨=ªUšæ©vJî£gä>R¡žDó³.±f¬F!Õ5ûÌʱy#JjêöÛ.@. uêa>?øy3ìñ½W¸fiÌc@mpäøWM“TÛT µ]"€ÜGê4›ÐœÂìRG~M͇‡?µZïWÿAÅì,‰Ô‘ è­…Ëkûæé´¹þöÂéóª¹fQÌ#MíN­OmPo¢Ú#»Ã uä>zK3 Í/tÚh®¡‡írpÇ;:§oÈÊ.P"è ýÑvEˆriP?óø3¯]wÛ…O%>û•çÖmÜm»"ôóÁèR‹»9ïÂØLmP-‘ÜG¯ûHƒ™nh®¡ÓPé>{nÙšm΄½¹å¨íŠ=äÒ¦>箇›{Õró7îm³]zù`55V[3N­ÜGÈ}¤M}Žs;¢æ š‰Ø®(éœz ÜЋ´‘ ÈUDóÁhq(¯LJòH¹ iÞa.L±\‰Eû?þóè‰k˜›#ä2§^è¿æÿíQ¦â_ü·íŠpmÌ#äù¥[œ‡vÕÖÈ}d‚ÜGæÔ 9ÛhV¢¹‰íŠÄÙ$+»`Ra‹û!sä¼ÂR‡ÑÂ|0Ü‹úª}‘ûȹ¯¨GÒ|D³¶;LYåŽ[&¼¥Y‰æ&:©4OÑlÅv9±UßppȨ ¡ýÀÂÊM{l—ƒX!à%Â?Ýuá6’>ÙOO[Ç5Ãb>Zj/j5j;zƒÔŽ_Á[ä>ü Šæ):µ4gÑÌÅv9±Òv¤ã»?~CǶ_î¬9%[Nuž±]â†\€OÔ_Mž±>ëâ˜öÆ3JËêlW„¿Ã|0œÔR>óå™zkÔvÔ‚È}xŽÜ‡OÔ_i¶¢9‹N0Í_4‹±]QäqH r¾Rßen#ѯ[ïŸ_[ßb»"|Šù`بu¨˜Æ¢VCîÃ'ä>|ŇY^á#W†\@Ü݇žXÉ@7 ˜†‡ZDþ¸U\6A0È}€‡Ý2Á#™¹€À”¼òÁ gp#\H0 ƒ®ÓÝÎmÕjj#¶+Bü‘û ‹aöK¶Â rAr/”qÓÝ,”aóAëtþ›Ý»Xv A"÷$6ËK[:Â"rÁS/7ø‘¥ÎBú Mÿk»¢$b>hQãÞ6÷¶,ä>‚Dî#xêå4Ç1—‚5ëÑÜÇvEáR]³/7±ŽOÞˆ’šºý¶ËAâ °…¶íb>h…Îsíæ´×ù¯V`»"$¹[4ÓÑ|G§Ÿæ>ô~FsËÑáO­Ö1é?¨xÙšmÌ”a¹‹ÔïÍ^²¹oN‘NÂëo/,zñ]zÂÀ0 ˜Î홋ÞÓy®Ã®s^g>g;¬ ÷a‘ú=Íz4÷ÑI¨yfC¶+²æxGçÔâ Šƒ¬ì}¡?Ú®ÉE.À:õ?óÚu·]øÄäæ¼âuwÛ®(˜IgµÎmpç:Û endstream endobj 144 0 obj <>stream É}XDîÃ:3ÒBBó çVIÍl—ç¦Ùœa/rÓ,B‚\@¨¬Û¸ûŸïyŽQÀ|Ðoî¾uVóÁ7B‚ÜG¨hN¤™Q–R9ÐÚ>fòë΢:]§»mW|Š\@ب‡œ>¯Úy·¶ÙY8Wç0¹°!÷Nê-5WÒɳ­ØË« ] Ÿkؘ;›Ù.¸ra¶}×Ag›¶¡¾¿k†1ôœÎO¥ÎÆš:{mW\¹0ÓŒIó&¢šCi&e»œŒü®±uȨRó³T¼³Ëv9ÀU‘ ¿¯Õ÷Ë¥µOvÁÓÓÖêè!“ÿù³·t~êê\Õk»"àªÈ}„ŸfOæ35ͧ4«²]N¯µé0Ÿu*æ”laÜ‚# êK'ÏXŸõ×ñviYíŠ"ù Wt6šë:?u–’û9r‘ ¾T3)Ó»jn¥–íŠRÒuº{Þ²SöØ)ÜׄH !îûñþõëó¹/Ì3§3Ð\Áæ~fD¹Q¿ªY•¹¬yVÈ׿ªÜ´Ç¬•:ø‘¥õ Qä"§¶¾å Cæ™Axþ¸UQ¹f6Ì3¡³Nçž9 u6Ꜵ]*r‘£¹•fXfÏ>͹l—sM͇zb¥*¼å¾¹ÉÙK±A. ¢œõü³² ~2gCȯ†óÁô˜ýPÌ­Ë:Ù‘Cî#¢4ÏÒlKg¯f^šÙ.çSÇÚON*¬R(ôÍ)úÙüM±Y‰B. ºÔë~ï'ošý¾oº{vYåÛE óÁ4è3;dé¬Ó¹Gî#ŠÈ}D—z]͹4óÒüK³0»útŸ=·lÍ6 £'®mn9j± ä¢N=ð½#—š;÷þ-ÿç{ÛlW Ì{EçUnþbsšé|#÷]ä>¢N=°æ_æR°fdš—_CuÍ> ú}óû_à!rñ søæ¼b3\9þU6¿&æƒ):ÞÑ©3ÊœZ:Çè-uä>âA³0gF¦ÙY`ß×™öTlk6 x‹\@l¨Ož½dsßœ"Òú]_ÓK÷€ùà5qF!–È}ùcSó²`îØüäD×Ôâ ÎݪÇ;:}ýv@`ÈÄŒúçoO(ãÓœkb>Ø3÷'Î:£È}Ĺ˜Qÿì¬è¢ùšOOv;«Ù juxV³âM½·ænšÁé<×lNsº4^äTç™ÙK6ßx1&L¯l;Òáy@x HõäùãV™;¿0d^m}‹íŠìc>èÐù ³Âœ:OÈ}Ĺ$PO®yœNuÍé4³Óü.õ[^Õ0`èýÛ¯~igÓ!ÿŠB‚\@rlßuðK{xýúèKé]3Œ æƒç/Þ ¤3Áœ:7t†Ø®ð¹äÐlNs:ðšß¥ø÷xl¹ùûšú]ä’¦´¬ÎÜF’•]0yÆú^]3Œ“„Ïõ¾ëÝ77ë|ÐYa»" ä>’Æ|Þ×óßqž8sÑ{‰ ™È$úù‰Ï¾Õç¯sååõ¶+² ÉóA½ã暀Î ä>…ÜGõÐÏ›ç Íêsi?oD¹€Ärß+xǃ/$í^ÁdÎõ.ë½æža$¹8Ö¿û{g=Ò­Ûÿh»Àr ÷ÞoÿçóƒŸ7„‡Ÿ|ùXûIÛ$ióA½³zÍ­w\ï»íŠ;È}༟û‘C.ç]{ \{aBöHÎ|Ðì9¢w–=G€óä>ïxGçf¾•]Ð7§hjñýÑvE€eä`(æ5g/òuwÛ®È_ ™ê}4O…èÕûKîä>«ûì¹ek¶õT¬&0êûeÍ-GmW„¹¸)òF”˜» só7îm³]‘_b?Ô{§wм•zOÉ}À ÷‘L5uûM(è÷êš}¶ËB„\.·nãî›óŠÍT"®*Åx>h>ê5oŸÞÇØÔ ô ¹d27ÿ”¼òA÷Ùs¶kÂ…\®Hy1sÑ{桳¾9E³—lŽY‚Är>¨÷Hï”Þ/ó(¨ÞÁ˜½k@æÈ}$Ӥªä,ô ¹ô@Ù1rü«Î¢”qºÃ$~óA½;ÎR±z×È}àŠÈ}€¹\SãÞ6³?‘~Ý;réþÿl»"Äi>¨wD•dŒŸú2GîÜÈ Ee•;ÌJ•}² žž¶î“]¶+ÊH<æƒzô^è1†è=²]vä>À\R×uºû‡7-2;Ù-Yý¾íŠÒƒù Ž¿Ù5RïÈäë“°k$9ràF.½Õv¤#Ü*swâ­÷ϯ­o±]Q:"=Ô1ב7oÞ ½#¶+"ƒÜ¸‘ @zÜS’ÿeä¦$ê8ëhG}2XDîÜÈ ¥euŸùòLç–ÅSglW”ªÈÍulu„Íͺ:æ:ò¶+"‰Ü¸‘ @†ÜKšüã]³¢²¤I´æƒ:ª:¶±Y̰ˆÜ¸‘ €'´¶Uêly°}×AÛ]CTæƒ:’:žæÀÞ÷íRgÛÑFîÜÈÀCÚ=üóA=Cs0uTulmWĹp#ÏÍ[VÓ7§H-ëúÛ §Ï«î>{ÎvEWæù Ž˜Ž›Žž*Ô‘|~éÛñAîÜÈÀÇ;:æµën»ðÙÖÍyÅë6î¶]Ñ¥B;Ô±ÒSm:z:†:’¶+b…ܸ‘ €þðÑŸró›;õEsËQÛýMçƒ:>îÃÕÔ|ØvE@ ‘û7rð[8?ð Õ|0ü§±AîÜÈ ]§»ÝÄ-\^k»¢Íu4Ü[êXÙ®ˆ3ràF. Õ‚™a˜Fh9V 6È}€¹̽¡ÞýßYfkC=»óAýÔúÙ#´]#ä>À\¬(«ÜÑ/÷ÿgïn¼¬ªîtßÿmy‰çp®·õÇIš›2„nZ#FI$Þpr¢C›nt„¡&6šæ bZcG:¯]¥!yQ¤¢–  ÒÔ€F,|)Ð ¡ŽTå)¤°x©‚î#3™=ÃKÕ®½×Zs®¹¾ŸÁ` R{ϽöZ뙿½×úÍi:ú.©®¹ÿÑ—ŽíÎx¾êA½R½^½j=»¶€¶CÆ ŽÜ¸ÈÀ—ã]'œ²¦êleô_ÿjêÂÛ²|v/õ ^£^©žW¯Z¯][ Ëgp†Üü)rð«ý@ç-w-6WN~ö+o}{o6Ï›q=¨×¥Wg^æWï\¬WÍó8¹p‘ @67¶ÚriÔ½K3(—2«õZôŠlÁ«Wšö3è¹p‘ @8þuÉ|jÈs9åÃÓצºòBõ ÆÿÃÚ3Äêu=ùÌ–ôž @‰È}€‹\‚â¶[¹üÚééµ[I»ÔÈ5~ s\¹p‘ @€ZZ~éö§Ì5–_ùäÎ]í‰?Ezõ Fû…ÿo®¼^…^KâO lä>ÀE.Áúd¹ö/¥µ\{õ F¨qš_uà ?Árà"€õœ:=}þƃ'ë8½ôšIú³þ&‘GN¶4ãü?>?I©Ñ&8NÉ"÷.rßáή»&¬2ß»]9¬ö¥W߯ü1¬5Ê ïÎÿù¼F[ùcH ¹p‘ @^ìÜÕ>tÔ¼¤îËK¤tïsÔØÒ¸Ï@²È}€‹\òå—ÿ¶Óôíü³Ï=öíïÿ¼ì¾ÖƒzÞ±þBc0}P5ªò@ÆÈ}€‹\r§ûDÏÄYë/½f’Y×oÎâÍeÀE.9uàÐÑo~g™¹VóÓ7þdÓ¶=ýúñòêA=ËÕ7Í4O:êÞ¥C¿~€wä>ÀE.¹¶}ǾÏí S ¸óé½m%þ`ëA=²ß<‘žQÏ[îøDî\ä…+¶ :MÇò%Õ5&­>Þu²Ï)½Ô£é1õÈú÷z=WCà¹p‘ @Tµ=8eMéU[‰õ [iêñK©4„ŒÜ¸È &îUŸûêœ^®êì³ÔÏVß2§Œ+Q„ŒÜ¸È >›[Ý®/í:Ïÿ7½Ôƒú÷ú)óãz=ZúCrà"€Xõ¾*ÄëÁDV²2rà"€ˆ9Ú}ïÿ´«Æ¯ZÝdÿ×ùõà/^ÙaWº¿ûëÊ^é@ÈÈ}€‹\¢×ÒzðK·?e®ÿ:jÞÎ]ígþ´ÔßèïÍ?пԿ÷=di!÷.r(ˆ5¯ÿêÊaµ¦èûÛXùϯ×ôûß_iþRÿ÷å ;‡ ]ä>ÀE.ÅÑsêôôù ž¬£¾êìÊæwýþ^ÿ×÷¤ŽÜ¸È hu>z¡ùNP¿ôgýïAȹp‘ @¡¸÷Ú_Ü3¹p‘ @A9Ú}ÿ£/Ù^£æ¶Á1㟷=Eõé) DܸȠìZ„UÕ5ÿ4c]÷‰Û_TÖߘ Ysˆ¹p‘ @Ü67¶~ö+›ëBGÝ»´ý@§ùûsÖÔßëÿš¦¯Ÿò7d)"÷.rˆU[ûÇ_½s±-ñ¶ïØçþßó×£ý›¿¸ùÅãˆ;ŸÖ#d;d©#÷.rˆÏñ®“NYc.8tÚÂÛÎÿ7¬ ý{ý”¹¸T£GKÈ2Bî\ä™å/¼cª¹Kªkîô¥‹Us½ÔƒgÎV”úÙKþXQ.ûåÛi@vÈ}€‹\¢±}ǾÏí {µçÞ¶Ž^þqïõ ¡GÐã˜Ô#ŸsÅ)€<"÷.rˆÀ¡Žc·ýý³¦pûô?Yß°»Ï)¥4ôhzLóà·Þ·œÅë\#÷.rȵî=g­¿ôšIŸ¬ñ…É¥¯Qz=h|²bÅ&ëGô\zF=o¹Cà¹p‘ @~½ôêûþÅ1«Éûû??ÜÙUúÏö·=¾žÅ¬h¯çÕ³÷È<#÷.rÈ£»Ú‡Žšg®á¼î[ó[Zö÷ʨ =×oý©yjA#éï#ðˆÜ¸È _Ü/é®V[ö—te׃†žWÏ^ÞW“<"÷.rȑڟþû€Á¸‰¯fÎk=§N—ýPÖƒ¢gŸüäëæÖEjúüe?€Ìû¹ä‚ÛäóöqÏUÞä³òzÐÐH4ž~µ6à¹p‘ @àö¶uÜxÇSvÀwÞoKäa“ª¦æÿm—>Ôh{_ú€Gä>ÀE.Á:r´ûþG_º¤ºFéå×N_Qÿn‚žl=hh„§VcÖÈ5þ@"È}€‹\´pŶˆLÑáYU]óà”5Ç»N&ûøiÔƒ¢qj´UgkØO ™¢W‘ì㨹p‘ @h67¶~ö+›k/¿q÷’öiÀE.ÞyiÃ’Y=x&åÆ8ú…ܸÈÀ#Ë4dY)-œ _È}€‹\¼ð¾Œ{öõ ¡Wª×k^¸¶€¶CÆ ŽÜ¸È c=§NO~òõK¯™¤CoÀàÉÓçoô2 _õ QûÓ×k×´j漦mâe@‘û¹dé¥Wß¿rX­º?ûÜcßþþÏwvù‰ßzPôÚµ´4 mm_# …Ü¸È -­¿xëOÍu’CGÍÛ¹«Ýïx¼×ƒ†¶ƒ¶†Ù,×}k¾¶’ßñÑ#÷.rH›ûEØŸñ_ù",zÐÐ6Ñ– ákS zä>ÀE.©š³xó§¾ð‡å&ÎZß}¢Ç÷ˆþ ¨zP´e´}Ìm•ÚbÚn¾GĉÜ¸È %n#Í[ï[Z#ÍÐêAC[é¶¿ÖcÛU zä>ÀE.‰ÛÛÖ1âΧíB{Ûwìó=¢ ³4´Å첌ڒY.ËDÜ¸È AÇ»NÞÿèK—T×è°8tÚ²_¾í{Dr=h,ámC RÛS[UÛÖ÷ˆ€û¹$eáŠm¦~©ª®ypÊšÀë—ðëÁ3gëkmɪ?Ö×Ú¾Gä¹p‘ @å¶ïØ÷7?n¯olkÿØ÷ˆú–‹zÐÐöüê‹ÍæýìWóú[ /È}€‹\*Ñ~ sÔ½Km©²¹±Õ÷ˆJ•£zÐжÕ6›ZÛ\[Þ÷ˆ€\"÷.r(O÷‰žš±Î\Êø©!Sr·>BîêAã“õ;†L1åjû‡³~ä>ÀE.eXQÿîå×N7ë§ßÿèKGŽvûQ¿å´mmmsmy_ï‚Þ ß#ò„ܸȠ_vîjÿ«Qÿj®ZüÒíOµ´ô=¢2å·4´åµýÍñ—ßøW½/¾Gä¹p‘ @‰u»}Üs¦¹rXmÞ—JÏ{=hè]ø¿‡Í0oŠÞ½G¾G„ŽÜ¸È O=§NOŸ¿qÀàÉ:Xô»þ¬¿ñ=¨JÅQž‰ôÝÒCî\äл5¯ÿêÊaµæ¨¿ý‡•‡;»|(ÑÔƒ†Þ—¿¿Ò~{ûò†fß#Eî\äp1îjCGÍ‹ìµÈêACï‘Þ©îîÒCî\äp¾#G»ï}ø—¶ƒåªÕM¾G”¼(ëAã¯ì°Ý_ïþǺiÿÑ^ħˆ ¹p‘ ˆÃ‘£Ý÷?úÒ%Õ5¦KäŠúw}(tÔƒ%Ò¾d:ÓjïÒ>FgZä¹p‘ ˆÀ¿.ù³Š\UuÍÃÓײŠ\)¨K§=JûUÕÙO´§=ùÌß#ÊGî\ärmscëg¿ò¸¹¢oÔ½KÛtúQnPö—ö.ícfgÓ^§}Ï÷ˆ€rû¹€œÒäü–»ÛÉùÖ·÷úQÎP–G{šýâ«w.æ#ä¹p‘ Èã]'œ²Æ\¼÷_ÿjêÂÛ|(—¨+¡½Nûž¹DY{£öIß#JEî\äòeEý»‡N£¹Gå¨+ä¶0Ò>I #ä¹p‘ È‹í;ö}þkO˜ëô¾òw‹ö¶uøQ¾Q&Bû¡öF³[jÿÔ^ê{D@È}€‹\@øÜÅÁ?}ãOX<Ôƒ Ò>©=Óì¢ÚWµÇúpQä>%%Bc"häBÖ}¢gâ¬õ—^3I{é€Á“ç,Þì{Dñ LœöOí¥ÚªÚcµß²î ÂDî#TCÅñÙÚ¦¾¢#î‰õôC°Èë¥Wß¿rX­öÏ?ûÜcßþþÏwvùQT¨Ó ½TûªöXm[í½Ú‡}8¹À©nRõ¤½T•”ï±$@/瞇êÌæ3lâ£Bˆ\@€~ýášg®¾ÓZZúQ„¨Ó£=ÖÝ›[öûðŸÈ}Kµ’*&Ó5N5T[ûǾG”˜Æ¦}ÃG/Ôë<òÉú øð'È…¯W2C=˜6¾àF˜È}„IU’j%휪›b½ánù ï\}ÓL½Æ‘cŸá£B„ƒ\@8f-jpo¿ê9uÚ÷ˆbF=˜íÃî °?yj“ïä>‚£ÊHõ‘vKÕJKë¶ûNºŽížôÄk— ™RU]3aÒê8î‘DÞ‘ í³G=˜ä"(ä>¡ӣj"UFOV•Tœ5…[ZŽÿ¼ŽÄ˯¾àÙ7ù~‘ ðko[‡¹¢žåÛ2F=˜1wMíó,  _È}„@ê UCÚU³Q@ö=×}k¾¹Óœ á¹_Ží¾ÿÑ—.©®ÑøßþzÚŠúw}¨X¨½Ð~®½][^{¾öÿâ|ŽpûðNµiº¥ßUùŽOª‹­|ëŠë?¹Ù|ô÷V³.†wä¼X¸bÛùË©Ú÷ªªkœ²æx×Iß#*êA_´·kŸ¯:ûIˆŽ ¾G„b!÷á‘êU=ÚU©â:Iãpg×ÃÓךëf©]Gÿ1dŒ\@Æ67¶~ö+›«æ¾öퟱ<«/Ôƒ~iÏ×þo:.|EAîà Õ8ªtTï¨êùÁÔW(yÎ×ܲÿÖû–¤¯‚B. 3šºw)à@P†ÀýxDG ä>²§êƬ³ z‡uz§cÓ¬»1ì¶[¶ÿÆ÷pPä2Ð}¢ç§¾b.ûÔ)ó—oõ="PDG„Ž sù´Ž/¾G„˜‘ûÈ’*Õ5fö5¯ÿÊ÷pòA)0wÉÓl瞇êè?†´‘ HÛŠúwÍ9A¡ ŠÛ^IÇ í•rÙP£ZÆœÓTÝðIW8tô‰õÚ€— ™2uîtZ@zȤgç®vs̓~}éö§öüö÷¾G„ÿD= #:RÌ!£cGGï!Bä>Ò¦ÊEõËeg/{PEÕð•x¯ù£‘cŸÑ–4böªÕM¾‡ƒ8‘ H p‡z0X:^tÔ˜ÃGÇ‘Ž&ß#BTÈ}¤J5‹*íc·ÜµXµŒïáDÂnÕ›Ç<ÍVEâÈ$«çÔé©s߸ôšIÚ¯ ž<}þFºI‡‰z0d:jtìèÒ{¤£IÇÇ’Bî#%ªST­ðMVJŽwœ±`ߺ" äôÒ«ï_9¬Ö|¯qׄUt“õ`øt}ûû?7”Ž,_¾G„ûHœj{§Ûôù¹Ó-=ö®ÌC§qW&’B. -­M1ý:j÷=…z0/t4é˜2—Ž2k¾G„|#÷‘ Ó Sµ 0³ÔØ´Ïvm­ßðïá ÷ÈTÈ|…ñgŸ{Ìôûå¿íô="”„z0_^zõ}Ó§WÇšŽ8¾|GÙÈ}$E•ˆ])ïÍwöúNá°ª#’B. so6ë¦]zͤ‰³ÖsÝBŽP掎/eææ\w:ú|¹Dî£rª>TƒhGR=¢ªÄ÷pŠëÈÑîGg¾:`ðäªêš “VóQ!ÊC. m¦£ŸÿÚÛwìó="”ƒz0×tÜéè3‡¡ŽGîÙAéÈ}”GU†j UÚT}p/sh^ßÜbn6×ï·~è{8Èr¥;Þurüc/_R]c[-\±Í÷ˆP>êÁ,^ÕhÚ8è¨Ô±IO?”‚ÜGT_ØZƒ5…ƒEÍŽò (‘ª?;ó|pÊfžyG=‰:«ø”%#÷Ñ/öZÄ˯εˆ¹p¨ã˜½¦÷Çoàš^ô‰\@Ÿ¶ïØ÷ÿŒ˜Í•i‘¡Œ‰{·ŽV®âF/È}”Hu„ª Û«DU†ï¡š[ö››Íéùƒ>‘ èEûÎQ÷.5“LO67¶úC=¡ÿ}ø,sÀêÈÕñë{D¹Rص ¾q÷Ö2È/»&Èw<ÕØÄG…¸0rd:Û›‹Ðèl%êÁXÙU`tü² ÎGî£wªT;°Öy4”ÊsËÏ=Õq•ÎG.à|+êßµ+_ßûð/¹òMŠIûÎ&Ö›7wÆ‚Mt€‹\€kç®vÓ@L¿¾tûSt¦Šõ`ôtüê(6‡³ŽkݾG„ û8ŸªÕæ+$U \m«÷š?>z¡ÞåA#f×­Ýá{8¹ãpg×ß<°ÂL¯V»æõ_ùÒE=X:½ëˆ6‡¶Žqé¾GÏÈ}œCuÁ ³]ãT)¼½³Í÷pºU«›Ì;>rì3ª}þ‘ è9uzúüOÖž ßõgºIõ`qpŒÃEîÃR- ŠÀ|[¤Á÷pã]''=ñÚego6`b=Íc Ž\(8÷»ƒÛÇ=Ç ¡8¨‹æpg—Žq{ §ýÂ"÷qæìuæn2Uª hPLöŽÑ˯>wÉî-,r¡°Ü{‹þjÔ¿roQÑP÷ƒÜ/8Íù5ó7]ãÆ>ø ºM¢aÛža·-0e×7ìö=x@.Б£ÝÿO/Ò{°à¨‹Ìí!¬³_  ¹_dší›Õè4ÿWà{8ÈÒºíWÝ0CûÆ­÷-gÅÉ¢!ŠÆ]›ìŸf¬ãڀ¢,8Ö-,r¿˜4Ã×<_oý××jæï{8ÑáήGj× ß#‚Ôƒ°tN0½ÇõKç î'й_šÉk>¯Y½¹û…Qºõ »ÍÍæ\Z\äBÜŽw|pÊsIØÀ¡Ó®Øæ{Dõ ΡóƒYZg 7töð="¤‚Ü/Û$D³zš„  =§NÏ[¶ÕÜl>füó{~û{ß#BZÈ…ˆ=óóF3»»¤ºæþG_bvõ Χ³Ä?üøåKþø ’Î!¾G„ä‘ûÑÓ¼]³w»ˆ×û¡‡:ŽM˜´ºªº†¥I"F.DiûŽ}ŸÿÚ\ý…^PâbÜ+Ìu&á óÈûÓ\Ý,2®Ù»æð¬)Œ¤ìÜÕ>rì3:u\}ÓLúÒLJ\ˆŒNþÿã;ËÌDîÓ7þ„KDp1ÔƒèÝë›[t1'U˜XFƒÜ•féš«ëÍÕ¼ý½æ|ªßðY¯døè…M|Tr!¦{ü¥×Lú¤{ü&Ó=½£D)ì 5:·è à 5 ÷㣙¹æçz[«o™£»ïá fÇ»NÎX°ÉÜŽôݾ@³ú8 qxéÕ÷ÿ¯ëþŬ.ýíïÿœnÒèõ J¤ó‰Î*:·h‡ÑyFgß#BEÈý˜h6®9¹¹áW³t ÚñÆýèEv¼h y·sW»i¬__¼õ§t“F‰¨Ñ/:·˜^…¦]¡Î<¾G„2‘ûqàkxÇÓÑ òËýÐþÊaµ|h~¡DtžÑÙ†KrÜ€æÞšsB°ju7®æ¹G=§NOŸ¿qÀàÉæ¦žÉO¾N7iôõ Ê£³ÍÔ¹o˜[•uÒ¹ˆóO¾û¹¦ù6mÛæ¹;ëvÛ¦·{Žƒå¡D%tæÑù‡VÆyDîçËÀ!p{Û:Xø2§È…ÙóÛßßxÇSvQ°¦æÿí{DÈ1êATnç®v»Ô©ÎN:GùúFîçŽæÕš]kŽ­7Nóm4„¬aÛs³ùÐQóø¨0/È…\8r´ûþG_º¤ºÆ|êÂ%"¨õ ’¢3’™©ê¥3_[ŽÜÏͨM×8ͱ5Óö= $‹V¾uÅõŸÜl~ë}Ëiu>r!| ž}Ó¬ÿUU]óà”54õE"¨‘ î=:;UýÌJç+µ|Eîç…fÑšKëÍÒ¼Z³k®¾C¾îìz¤vÝ€Á“õK ÿXÈÈ…mnlýìW7×b}ãî%t“F‚¨‘8£FݻԜ²tîÒÌ÷ˆpä~øìDºªº†‰4r­¹e¿ýXciÝvßÃÁ…‘ aÒ´Ê4cZ…”P"%îY:ñAVhÈýÀiÎl/´Ó\Ú÷p€¬oØ=xä“\ö,r!4Ç»NÚË®.2eáŠm¾G„8Q"U:wý—¿œÊ…î"÷ƒeqhæL#D¦ûDm‹4öÁ_ìmëð="ü'r!(+êßý?ÿš¶ Èõ Òæ6ÂÒ™FX ÷¤¹±fȶQ¿fξG¤âPDZ&Ö›¯ÔYÑ÷ˆ „Ü÷E³\ÍuÍW!šýÒ(p56í»ñާLÝú øN± Yr?ÿó/þ ŒÃ#êAxÇe^û^h~kÖ_ÓŒWó^ßõ´nûÕ7ÍÔ‘ò»—°þffÈ…ÌÌY¼ÙÞ83qÖz¾ ‡_Ôƒ΄:ÚÛ¨užô=¢ø‘ûÓœV3[msÍr5×õ= tGŽvÿøñ J„ªêš “VÓ,äBÜÆz·ýý³ìØõ ÂA›å,‘û™ÑŽ­Ù¬æ´šÙj~ËRk@éZZŽÿ¼Y”sÑÊ·è?–*r!U{Û:¾òw‹Xx ¢DhÜeXuæäûÐÜU3XÍcµ©5§åY <·~hn6×ï|T˜r!%GŽvßÿèK—TטvIË_xÇ÷ˆ€?A=ˆ0­¨×4ÜÐùSgQ¾RI¹Ÿ6ÍZí V³YßÃòÍ|ºrÅõµ|º’r! Wl3ó™ªê𧬡›4D=ˆ`霩3gÕ?OÓÕ÷ˆ¢Bî§Ç^ᦹ+W¸ :ÜÙe¯¾~¤v&‹\H–]aV¿¾zçâ¶ö}¸0êA®ý@§Î¢ætªóªÎ®¾G r? šjŽj;`Ð,HCsËþ[ï[Nw¦Ä‘ IqW˜ôÄk›[}è õ rAçRQÍ:ÇêLë{D¹Gî'ÎvÈ×L•ù@Úìê-Ãn[ðæ;{}'äBåXayD=ˆÑyUgWó›Î·¬×S r?Aš‹jFÊ Ú@Æ”s—laîr¡B¬0‹œ¢Dîè«3-sï ‘û‰p?£Ð¼”Ï(€ìÙkó.2eúüôë(¹P6V˜E®Q"§ìµy:sm^Èý iΩ™§æŸ\à „à½ænó´ŽÇA#f¯ZÝä{8¹D.”fêAä—κ:÷ÚÞ:'ûQžû•ÐlSsNm@Í?5 õ=`Í[îẔÙ_äB¿°Â,¢A=ˆ¼³½ýuN¦·éÈýòh†©y&ßAÁ:ÞurêÜ7øî¾ äBéXa1¡Dt6¶gf¥}'ÈýþrïQÒl“{”€Ù{{/¿v:÷ö–ˆ\(+Ì">Ôƒˆ†¹rCçg®Ü(¹_:ÓÃÐ\DC G¶lÿíý»æõ_ùNèÈ…Þ±Â,bE=ˆÈèülïìÖy›;»/†Ü/‘æv3Í-}@¿±6h‰È…^°!bÔƒˆ’ÎÕ:cÓù¹ä~ŸØ‹€hîì²ßìü`ê+|³sAä±Â,¢G=ˆˆÙ•au&×ùÜ÷pÂBî÷BsEÍí·ÌL8´´ý½Üùu1äÂ9XaA=ˆ¸™;¿t&çίsûäÞ…ªy#w¡ñq;C6lÛã{8!,V˜E¡P¢ÜÎ:ÃÓò ¹!šÒ¥(‚žS§<û&+ǃ\0XaEC=ˆâÐY]çvVŽ3È}—»Š¥f‰\EÁ¡Žc¶ÿؤ'^£ÿ¹À ³(&êAýÜOçü"îGîšjhû‡k~è{D2ÕܲäØgèu¦Ø¹À ³(2êAÎó:Ûü¾€"ç¾eû‡k6Hÿp Èlÿ±á£66íó=?Š™ ¬0 P¢°lß0¥@û†3÷-Í÷4ë£8K)0cÁ&Û¬­ýcß#ÊZsf3Ôƒ(<ÿíºBÊßÃÉNsßÐÏö×ܯhŸè½nМ" uÝ`¡rf‹z8ã\7¨t(Èuƒ…Ê}Có:ûáa¯P { Á ³_\÷¾ïád¤ ¹À ³À9¨C‰ \0}E”ÑDArßÒŒÎô*òÍAúeÕê¦Ï|y–¹Å¸ýÇ¢ÏV˜.ˆzp)”:(”Jˆ×ˆ>÷-ÍâLó@Íëè _L bÓlüc/ÇÝ‚8î\`…Yàb¨ó))lj(A|'q羡™›æo¦8‹‹(ÛÞ¶Ž»&¬Š¾ÿX¬¹À ³@ï¨ R^(5LjåH|W•Äšû†Û?\³8ú‡¨\ö=¦ÿدÏò ¦ørfRP½Pv(AÌ]ç‘}Á_î[š§i¶fú‡Çúõ._~¶ªÑÜ€_ÿ±ÈrfQ}RŽ˜ÐbêJYfkš³ù€8Ùþc‘5¨Œ&XaèêA Dʳjm *£É}#Öé€`ýúÃßÙ ­|Ë÷pA.°Â,PêA tJ»€G¹ã{Då‹ ÷-Û?\s3ÍÐ|@Øþc\ žë\`…Y lÔƒ@)e”5öãGeï•#×¹oÙöôà‹ÛÀjÌøçóÛÀ*¿¹À ³@%¨òØÛ”AJ"ßÃé·ü澡—íqûwyaúåz›<æ+Ì•£*¡ôQ™öeJ%ßÃé‡<æ¾á.MÿpA±åÉÕ7ÍÌ]y’¯\`…Y )Ôƒ@…ÜòDÙ”—ò$_¹oi~eû‡ç«Põ>Èãå‹yÉV˜’E=$By¤TÊÑå‹yÉ}˽@—þáç¶7÷£sÑÞ$¹À ³@â¨Ùö&J«ÀÛ›ä"÷ Í£4›Ê{¤Ó—»üA৯Àsf”P‰SNÙå”_¾‡saç¾á~À®9U.>`€säeyô`sfTQi?¼‚Í}K³&Írw\ÐòÞ±·?ïÜÕî{8f.°Â,6êA =J.{q‹Í÷pþD˜¹oh¦dôiå{8 Û¬ªº&ÀöÈ¡å+ÌÙ Ò¦S–…vó{h¹o˜¼4S¢8€Xµ´´Ë§Î[¶µçÔiß#úƒprf,Qp›c+ãBhŽNîši^d7‘æK¾G)jضçºoÍê˯rfìQ™1_~²xn¹oÙ¯P5; ç+THUÏ©Óöæ¸ÛÇ=çýs0ï¹À ³€Ôƒ@Æ”qöæ8eŸ¯axÏ}CóÍ‚ì-–á\7Ù8ÜÙõðôµUÕ5ÞûyÌV˜<¢¼PÞ)õ<6Ïô^Ú¬ši.` VÈŒ]\ïªf,­Ûîe ^rfï¨_ÜÅõ”†/®ç·ÔlGsžÀ—h€ŒéœlÖÙñÒ,ã\`…Y Ôƒ€_J@å`öúªmÿpÍy¼_­ ¡qû)²ì?–e.°Â,êA öÖ åc6·Nd_jVc*_ú‡@ï:úÀÄzÛ,› ³É…æ–ý¬0 …z‡’ѶVÛ¹«=ÕçʲÔLÆö× Góœ žòÎö4bvýÇÒÎV˜ÂD=Å.½¤ÄLué¥ÌêAÍaLçú‡@ìYtøè…©žEÓË…žS§<û&+Ìa¢¤¬TbšK+ç-ÛšÆ* Ôƒš·ØþáWÖ€¼3­WìU)µ^I)Xaõ ,å¦ÒSG¨’Tyšìƒ§Zj®bï|¡8$ÂÞ…=pè´9‹7'~vâ¹ÐÒzpô÷V°Â,8êA dJOe¨’TÇéíãžKð›”êAÍO4K±ýóìŒEÐØ´ÏviN¶ÿX‚¹À ³@ŽPáS’*O•ªÊV%l"ÁšF=hû‡k®BÿpHÏÒºí¦ÿØ7¿³,©U\“Ê;6V˜rzÈ ¥ª²UìU7ÌPÚVøhÉÖƒ›æ$¦xåcôéÈÑîGg¾j¾ƒK¤ÿXå¹°eûoXaÈêA _”°ö;¸JnÌOª´ýÃ5'ÑÌ„þá%Û¬ò{ô*ÉV˜ò‹zÈå¬ÒÖ4î.û½ÊëA÷ÞFú‡€G¯on1=<õ»þ\Þƒ”— Ç»NNû+ÌùE=ä”2×öðœôÄkýíáYa=˜ÈÜ”Ê?£+#Xaˆõ kÊ_¥pkü•]&xm Y•\Ã߯\PúÜ<æiV˜"@=DÀ~B;|ôÂ?¡-£L¼w åõø*1Xaˆ õ %²rÙÞÁ¡¼îýß÷·L£·9 =ý]¨Ï\0w¯³Â,êA &¶Ã›òzÎâͽtx+½Loíc@ª”Ê‚+¸ÞsfXQñ)¥‚+¥,½º«Ä+`û‹jž@QˆRÝÚ[aöœõç-ÛjZ±þ 7êA zvýA%»ò½÷õ5C`ýAˆOŸ+ÌžŸ ¦ÿXUuYŠèÈÑî Ç #Ôƒ@Ä”ÝfÑáªóú‡_°44O0ŸkæpΧǀÜÑÉ¿”f/– ;wµ›Bòê›f.áôÇ SÔƒ@¬”ÚÊnSÖ)ÍÏù¿½ÔƒgÎÞ]b IswÉCGÓ/ aýZa¶÷\¨ßðÁà‘Oš Mé?Ä„zˆ’Ú\ö©ìV‚_ðßôžû†í>§¹„fšW¤3^@òÖ7ì6\‰+Ìö™ n#¥ƒmD ר˜(mÿðÞÛ”RšEh.aªËRþ=À¯æ–ý·Þ·\çí«n˜±´n{‰?Ub.(hÆýèÅR‚@.Pqp?¶UR÷ù±méõ ¡…æúÍ14Ó¨x¼€äîìz¤v]UuÍ€Á“õ‡~-+߯\°¢ 1ûb¢ÈêA ÊbÛ?¼ÄÛ:ú[žùã4Cs Í4ž¾¶_Ó @ªÜfo÷\+D”‘ «V7ÙÕé?äõ k¶¸¹_+D”‘û†æšièg5ëÐÜì^ðÈ^ØoV˜-ïAÊËÛÈZ?{N#k¹@=ä”YÊöïï²Pe׃†æšuè®ûÖüRÚÒ°ç·¿?…ÙòT’ {Û:ì0è?ä õ ;nÿpåoïýÃ/¦ÂzðÌÙk“4÷°Ã(ãÚ$@ÙzYa¶<•çB"_SÈõ /ö‹¹û‡_Lå¹o˜¯)5)ïkJ@VÔ¿ÛË ³åI*ìmŒ·Þ·ü×þ.‘±Hõ JUÓ?ÜܸWá£%•û†f#ö6Æå/¼“ÈcÎWÊ ³åI0lÿ±2ÚœÈõ ¾4‚5ÙzÐÐÌĬ}\z›S@‰Út~÷‡/¤·ð_â¹`—A¼âúÚŸ­jLêa$‹zœ2Ô^x“àÂiÔƒgþtÄ{ªësD@Ÿú»ÂlyRÊ…õ »‡|}nå·9H õ ,{c¾’4ñóSÊ}CsÍXÒûŠ£~ÃÕ·ÌÉàÒ‹ôrÁmƒvׄUåµAêA @ÊJ%fª»S­ {“Ë ³“½ÉŠ ìfË“v.ê86þ±—Ë^& @J¨ ¸ û*7Ó[Ø7ƒzÐÐÆ6ÁÓÜ&í§€xiÝœM.Ø"÷3_ž•A‘  OÔƒ@8”ŒÊÇlJ§ÌêÁ3Zä&²HĪçÔéÊW˜-O–¹ðâº÷˜Mÿ1 Ôƒ@ÜK+•’_Ãðžû†¶†½Dêg«ý2“ê ³å !Lÿ±ƒ'WU×Ð Èõ Û?\Iç}é¥rßÒ\H3"_- K{Û:Æ>ø‹›k…“ -­mÿ±ϾÙsê´ï1£2 ,S¢ÙþáJ:ß# (÷ ͈l‹õ»&¬Ê²Å:d#³fËZ.4lÛcº­Ò Hõ 6Û?\¿‡óåWh¹ohv¤9’–åÌU«›ÌŠ{¬0[žs¡çÔiÛlô÷V„ði*êA =J.å—íÔ/æ¾¥™’¹Åò3_ž¥”ïá@EÞÞÙ–ñ ³å 6wvý`ê+æn ú‰£Ò`›g*¿”b†W°¹oiÖd>K÷Õ‚*äk…Ùòž ¶ÿ˜ßnl@|¨ÄÙŽÙ!ô¿˜ÀsßÐÜÉ.Ѩ9•fV¾G%é>Ñ3kQƒ¯fË“‹\Xóú¯ÌjMÃn[°eûo|ˆõ e“é®´RfùNor‘û†æQšMÙØÃéÅä}…Ùòä%ÜþcJú¢¡<25KhýÃ/&/¹oiNenÀÑ,Ks-ßÀ hnÙÿ»—äôšÆ|傽÷²!S¦Î}#ðkqQR)‰Lÿð]Ó˜¯Ü·ìµ¸#Ç>쵸 (¨fË“Ç\x¯ù£[îZlzõÐ (õ P Û?\yfÿð‹Écîf/Ó«G³¯ÐðP4fM„ V˜-O~sÁfñÍcžÎW! Ê£ÄQîä÷3Éü澡—æ]æÝϾÔZŠ#ÌfË“ë\8Þurúü¹»Võ Ð_î= JŸœÞ³ëÜ·4û²31ÍÊ|@ØO¥\a¶<䂽—àÐi¹¸—õ P:ÓÓÌöÏuO³rß0Wji>¦—3ú{+ò{¥€¼8r´;ðfËM.¼ùÎ^Ûë›þc@Ÿ¨ÙþáJeïáT*šÜ74Ó¬ÌtrÐ<-šé€Ðäb…ÙòD– ¿S@²¨>)G”&9í~1‘å¾å; î·N¯0[žørÁý&w¤Õ|T\õ Ð e‡í®LÉcÿð‹‰/÷-ÍÓì7¹[¶ÿÆ÷pä^îV˜-O¬¹ßž@²¨ rïJËuÿð‹‰5÷ s§§iÿž÷;=xT¨®•qç‚Û vãÖ}õ p>%Eô]+ãÎ}Ãí;uî9í À—ü®0[žès!š•"dQ.wU»¸¯*‰>÷-Íâ4—ËïJ‘²WÌóFAráPÇ1{'ÈßÓ @y¨C‰ \°w+/|(]É}Ë~Î󘧋ð9?€òıÂly • Í-û¿q÷úg¨³lWj¥CAºR*÷BÝ ¿¸ï¸€¹`W’ºñާ›öùàõ Nç¥@W­-`î¶OàÀ¡Ó"î _ܾĬ0[žbæ‚R`Ö¢%Ba?¨QXn] ,(Z]PÌÜ·ÜuÄ õ9€s°n©Uä\°× kJ0cÁ¦B]' P¢€tž×ÙÞ|XØë‹œû–½NX³Á‚\' À:ÜÙõƒ©¯D¹ÂlyÈ…·w¶ ½Ðôª[»Ã÷p€ŒP¢h^\÷¾é+¢s¾Îü¾‡ã ¹oh¨y í#¤ù¡ïH]ô+Ì–‡\0lÿ±‘cŸ¡ÿŠ€zÅ¡³ºÎíEë~1ä¾Ë®3¢ùaÜëŒhض'úfËC.XGŽvOzâ5Û,ú–ã(8êAÎäã{Ùôמ‹‚Îû¢™¡%nÜú¡ïáHXqV˜-¹p޽mcü…Ùaè?†ˆQ"nnÿpÕéf‘ûd®"3; W‘Ñ0_÷g…Ùò Ô°mí?Æʈõ "¦óö¯Ï5ýÃu>÷=œ°û½Ð\Q3FÓeâÇoà e × ¸ÂlyÈ…^h/27œÒ ñ¡D”lÿp½ Þ?übÈý>i/Òì‘.ô@~56í3í"YY¦äBïwvÙþcúýÇ êADÆž®MÿpN×Cî—HsH³Jõw<¥¹¥ïá(I[ûÇE^a¶<äB)ZZÚœ¹ q DLlÿp«¹ó«wä~é4“Ô|Ò,X©&w¡!c…Ù²‘ ¥³ýǸ! DìíÞô/¹ß_šUjni¾nÐlSsNß#p.V˜­¹Ð/=§NÛ†ucÆ?¿ç·¿÷=" LԃȻ½m¶¸ÎÌ\¹Q"r¿<šašÛ‘4ç¬[»Ã÷pü+ÌVŽ\(ƒí?Æ‚VÈ/êAä—].–þáe ÷+¡Ù¦ùBóOÍB}(4V˜M ¹P6ûqÄÕ7Í\Qÿ®ïáýC=ˆœÒ„ÜôgB^r¿BöãsGÙc…Ùd‘ ªßðAõ-sÌåÊôCŽP"wlÿpué^6r?šjj/W¦‡!V˜M¹P9·ÑwøíŒ ÔƒÈWÇýèEz$‚ÜOmg4xä“´3ÒÆ ³)!’¢éŠŠA¦+È êAä¸%ŽÜOœæ¥v¹ÍW}ˆ+̦Š\H—3!/¨>» 8ä'ˆÜOƒ¬VU×0Y’Å ³i#Ò°¢þ]Ú pÔƒÙÎ]í4ìJ ¹ŸÍTíÅlšÁ² P!V˜Í¹Ú¡#pÔƒ ú¤ÜO›f­š»Òì¨+Ìf‰\HÕžßþža¢Dht†œ·l«é®3§ÎŸ¾G'r?Ú™m3|vf _øJ%{äBø²¢DPøJ%3ä~fø²è/V˜õ‚\ÈFÏ©ÓÜ ‹ P":Þ>î9n¹Ê ¹Ÿ1ÍiíͰšëú(Z2zD.dÉô«ª®¡Y.¼£„w´dô‚Ü÷Bó[Íri– œf½#²Çbšõ üÒÙïªf°d[öÈ}_ÜÅ45ûe1M€fA.ø²¾a·YW‹›eàõ |±·TëÈ-ÕÙ#÷ýÒŒWó^¾ Xa6ä‚GÝ'zlÿ±±þbo[‡ï¡@¨‘=åîy¨Î¶\Ö9Ð÷ˆŠˆÜ½UJóan•BѰÂlhÈïu{`b½Þú!KÔƒÈÒñ®“¦¸ö:ñèî¹Í„m+EÍ}HMwÃD.Âö4b6ýÇêAdFç4Ùèr?(,µ†‚`…Ù‘ A©[»ÃÌš†^øöÎ6ßÃĄ‘Uæ¢8Ùt~ó=|‚ÜæÆš!›K©5gfÕD†fG.„ÆmµôÀÄzZ-!%ÔƒH•Î]æJxšf„†Ü–mµ¤™3­–V˜Ír!L¶ë‚¦R³5Ðu‰£DJt¾š³x³ùPKç1:e…†Ü™fËš3kæ¬÷H³hÍ¥}(“»ÂìÃÓײÂlÈÈ…56í»ñާè?†4P" ¶¸Î]ô¹>3‘Ö,Zsiý‰4r‡fó…\ŸŽ)Óìw/á˜BR¨‘,¾ùe¦¸ÎZ¾‡ƒ‹"÷óBÇ”æÒz³4¯æ˜B^¸+ÌržÉ r!ŽíþñãÌwîôC"¨‘Û?\ç(©è8r?_Ö7ì6ß¹Óˆc…Ùü"r¤¥õ í?Æ=¹¨õ *çÞ뤳÷:幟;šWkvmõsO.tÎ ³õ="ô¹;·~hzöÒ • D…^ßÜbÏE:/ùJEîçÔ¡Žc¦g¯YÈ›ž½+ÌF€\È#>“Gå¨Q6{­ýÃóˆÜÏ5Í·5ë6kzjî{8(4w…YöÆ\#òëpg—½gç‘Úuܳƒ~¡Dtžytæ«ö^fÚæ¹ºµ;Ì72šó ²gW˜½lÈV˜¹w¶ÿ=ýÐ/Ôƒè/Ûë˜þá¹FîÇA3pÍÃÍBŸš™k~î{D(V˜¹»æ×°Û¼ùÎ^ßÃAP¢tMûlÿpÖBÍ;r?&¶££æçš¥ÓÑ©rg›¬0r!¦ÿŸØ DÔƒ(…;Û¤xÈýøhf~ãOñ‰ Òà ³q#"ã^Ñ=}þF®èÆÅP¢wæj4Û?œ«Ñ¢AîÇÊ^Ñ­y;Wt#)î ³Î|•nQ"¢ô^óG7yšŽOèõ zaû‡ëLB·ŠÈûÓ\ýÇo°Ÿ4“÷="äÝ싃\ˆ˜ÑÝr×bft8õ .ˆnöÑ#÷£ÇŠ0¨œ»Â¬þì{8H¹·ã]'§Î}ƒ+¾p>êAœãÀ¡£öjs7¸Ú8¢ÿXô¨‹`ù ï˜~Â:®é' ƒÜÇùTLû†½›Lµƒï!1¬0‹>‘ 8Ÿí?6|ôBúÅŠz0n:ruüÒ?ç#÷q1¶Û¤jUt›Œ€»Â,m"p1ä.H)0cÁ&Û¬­ýcß#B¨cÕ~ Óö×QÌŒç ÷Ñ»-ÛcW£c?É/»âäU7ÌàŠ/ôŽ\@/lÿ13±äjó˜PÆÇô7ãÐ?C ÌÕæª)¸Ú<_XaýE. Oö³A#f¿¸î}ßÃA2¨#S¿áÛ?œË¼Ñ r%R¡jB5…* Õ”ásW˜½}ÜstŒG‰È”hÕê¦Ï|yýÇ¢A= Û?\G(ýÃÑ'rý¢šbô÷VhŸQ•¡ZƒÕj‚Å ³(¹€ÒÙÆõÚgÆ?ö2ësz0f™Û?œebP reP}¡*C{Ž*Ú’„Æ]avÞ²­Ôìè/rýµ·­ã® «è?–wÔƒ¹æö×ñHÿp”ŽÜGyTe,xöMsÚQõÁµˆ!`…Y$‚\@y¶í1ýdž|}.—%äõ`~ÙêéŽ2û¨„¹,AÕ—%xç®0»sW»ïá ÇÈTâg«ÍmËôËêÁ<úõ‡¿3ýÃuÜéèó=ä¹Ê)ñÍm˪GT•øNá°Â,’E. B¶ÿmó…z0_8ÐrIQ%bÖ:§­qfÎYa–…Àr‰p¿¶X´ò-ßÃAߨsÄý"^Çšïá ßÈ}$¨ûD]öTu Ëž¦Ç]avÜ^dS#AäÄmM9B=˜ öF]ú‡#)ä>§Úä‰õ|i•V˜EªÈ$Ëm{8füó´= õ`àhä‹”ûH‰½©M• 7µ%Å®0{õM3Ya)!–E õ`°Ü…>éŽÄ‘ûH•j–Ï|y–iz©ZÆ÷prŒ©2C. =|¨2êÁ01•BÚÈ}¤µ*Ä¥Vȹ€´qÑ{˜¨CÃ¥VȹlpÑ{yhÅ€ì‘ ÈM±D=Z1 Kä>²DS¬ÒѪ¾ È ‹æ…z0´jGöÈ}dEszÇ ³ð‹\@ÆìEqƒG>ÉEqQzÇRÎð‚܇”<ãËÍ-û}ED.À‹å/¼sõM3MÓŒ»Ú}§ˆ¨=RâÛVK:|ÅBîÃ#÷’HÕA¾‡ã™½˜vÈ×çr1-<"à‹í?VU]Cÿ±ìQzaú‡kŸ§8|!÷á-Sh¶ƒ  ð«¥õà˜ñÏ›Sâ¼e[{Nö=¢¢ ̘öíϾiû‡kÏ÷="¹¸K*¨2*Î’ îbã{™Ãr!hضçºoͧÿX–¨³d? ×~^ÌÃrá(Ú’ë¬0‹0‘ DϩӋV¾en©¾}Üs|{’6êÁlhOý½¶8߀Ã;r¡Qedn©V­¤ŠÉ÷pRá®0ûâº÷}øä‚r¸³ëáék«ªkè?–6êÁ´ÙfzÚŸµW³3#ä>ÂT¿áÕJñµ\f…Y„\@€š[ö›þcWÝ0ciÝvßÉõ`ª´ßšºôGhÈ}Kµ’]’U5TK²þ`ê+f…Ù¶ö}¸0rÁÒniVg+lÿ±TQ¦dËöߘþáÚ{9µ"@ä>§2PÕ“öRUR¾Ç’€CÇbúºQ"2·ÿ˜Ò¡8ýÇ2@=˜8íŸfCÿp„ŒÜG.¨†¢÷& rá;p訹öÞôãÚûDP&HûäÔ¹o˜þáÚWµÇúpQä>ÀE. /lÿ±A#fÇÚ,KÔƒIÑÞhz Ð?¹@î\äòÅν‡^Èܻԃ•Óxó˜§ùŒùBî\ärÇô³×æÅÑ,{Ôƒ•°ýõÒ?ùBî\ärÊöî8tڜśéÝÑ_Ôƒå1=ŽL;tz!È}€‹\@®56í³½ýë7|à{8yB=Xícv ú‡#§È}€‹\@ìÚßßüÎ2Öþ.õ`¿h¿ºõ¾åÚbÚÓ´¿ùP>rà"‡#G»ùê€Á“«ªk&LZÍ¢E}¢,ÑáÎ.íQÚ¯´wiÓžæ{D@EÈ}€‹\@LZZŽÿ¼vé+®¯]´ò­žS§}(\Ôƒ}Òþ£½Hû’6”ö+í]¾G$€Ü¸ÈÄçõÍ-CGÍÓŽ­ß7nýÐ÷pE=Ø;í9v/Òå{8@bÈ}€‹\@”øf§OÔƒ÷̈¹p‘ ˆØ¡Žcöί?¾;¿\ÔƒçÓ¢ý„»P7rà"½æ–ýßüÎ2:Cžƒzðt©EAû¹€‚°+ÇÝxÇS¬w†zСýA{«X¢ È}€‹\@qtŸè™³xóÀ¡Ó´ÏßóPÝÞ¶ß#ò‰zP´hOÐvÐ^¡}C{ˆï©#÷.rEÓ~ ó‰õ¦˜±`Óñ®“¾GäGÁëA½ïz÷͇Ú´Wørà"PLï54|ôBíüƒFÌ®[»Ã÷p<(r=¨w\ï»^¾öí ¾‡dŠÜ¸ÈÙªÕM¦.9ö™¢ÕŬõ.ë½6ŸèÝ÷=Àrà"PpÇ»NNzâµË†L1× g‰¢ÕƒzgÍuÂz¯õŽö:a€Ü¸ÈàŒÓWäòk§Ï]²¥}EŠSêÝÔ{ªw–>BÀrð§ÈÀjضgØm ̺ëvûNº Rê}4ëŒèÕûë{8€ä>ÀE.çXZ·ýªf踸õ¾å¯K}=¨÷Nï ^ã××ê=õ= ä>ÀE.ç;ÜÙõHíºƒ'WU×èúOß#J^Äõ yûôÞéŒõíÊFî\äp1-­o÷œù‚iÑÊ·zNö=¢$EYê=Ò;¥÷Ë|½«wÐ÷ˆ€àû¹ôn}Ãî¡£æÅwZ|õ ½ýSïWô·e#÷.rèSÏ©Óó–m5 *ÇŒ~Ïoï{D ˆ©Ô;¢÷Ŷ‡ì›\ Yä>ÀE.%:Ôql¤ÕUÕ5f»#G»}¨"qÔƒzÌò‘z_ôîgùH lä>ÀE.ý²sWûȱÏ訹ú¦™+êßõ=œòEPjûë]ЫÐ;ò^óG¾‡ä¹p‘ @ê7|`Vµ>zacÓ>ßÃ)G®ëAmsmy¿ú–9z/|Èrà"€òï:9cÁ¦C§éúî_h?Ðé{Dý“ÓzPÛY[[#×–×ö×»à{D@Îû¹TBåɸ½˜Çò$wõ`Þ p ä>ÀE.•Ëãå‹ùªµUµms}.rà"€¤¬ZÝ”£ö&y©µ%ãhà‚Ü¸È A9Zþ üz0²>€@û¹$no[GøË£‡\j‹i»iëi„Ú’{~û{ß#âAî\ä’†m{†Ý¶@Ç×ÐQóÖ7ìö=œs[j[i‹ilÚzÚ†¾‡ĆÜ¸È U‹V¾uÅõµ:Ên½oyKëAßÃùOÖƒÚ>ÚJ•¶˜¶[˜ß«yGî\ä¶Ã]Ô®0x²~éúOß#úDPõ ÝDUÕ5ál" Jä>ÀE.ÙhnÙo¿üZZ·Ý÷pªµ5ìW¨ÚJ¾‡DŽÜ¸È KëvùúÜnŽ ¡´·Xùd€·XQ"÷.rÈX÷‰ÛHéYÒ®5r_OqãOé¥ô,ú‹Ü¸È LKë¶_}ÓLžß¸{I«´§Wj´³\ã׫HüñT‚Ü¸È Xfi†ƒ'WU×L˜´:Ù¥Ò¨5BS£Õ˜üø†ìÑÐ'rà"€Àµ´3þy³tû¢•oõœ:ÈÃ&[jT›F¨ÇÔh5æD@âÈ}€‹\r¡aÛž¡£æéhÕïëvWþ€ ÖƒÛÆ­Vþ€ÒCî\äæ;¸+®¯Mä;¸DêAûÝ¥F•àw—ÒCî\ä/‡;»~0õsÞ#µëʾG¯ÂzPÏ«g·÷6jTå=€Œ‘û¹äQsËþ[ï[^IÏJêAÛûTcH£÷)€ôû¹äך×eÖøvÛ‚7ßÙÛ¯Ÿ-¯Ô³è¹Ò^@zÈ}€‹\r­ûDÏÜ%[LcÏ{ªÛÛÖQâö·Ô#ëñõ#‡NÓ3êyË2ŸÈ}€‹\"Ð~ ó‰õ:–/2eúüÇ»Nöù#¥×ƒz4=¦Yÿ^Ï¢çJbÈü ÷.rˆÆ{ÍÝr×bуFÌ^µº©÷\b=¨ÇÑ£é_Þ<æi=~rƒà¹p‘ @dl§Ú°— ®Ïz°_Õ%€¼ ÷.rˆO)WxöRºWŸNûF)WŸÈ rà"€XÙ0—_;ýü0¬ËîN /È}€‹\âæ®±æõ_Ù¿?¿tW¯Ø²ý7> uä>ÀE.Epþ òn=Xùêöò‚ܸȠ Ží~¤vÝ€Á“«ªk~0õ•~|½Ž}ý®?ëoô÷ú¿‡;»|@ºÈ}€‹\ ¥¥õà˜ñÏ›^1ö÷Ñß[¡¿÷=4Y ÷.r( 9‹7_zÍ$ûú]ö=Ù!÷.r(ûýà§¾0ù“ßÏ~?¨¿áûA  È}€‹\ âÈÑîIO¼fîœ0iõÄYŸÜ?¨ßõgsÿ þ¯þïaH¹p‘ @Øþ¢#Ç>sÁþ¢ß¸{ ýE" ÷.rˆ[cӾᣚõë7|`ÿþüõõÍúƒú÷ú)ƒ:rà"€Xµµ|ÏCu:À6cÁ¦î=îÿ=¿ý›Y‹ôïõ¿ô³z„l‡ uä>ÀE.ñ9ÞuR )ë˜Xß~ óüsÁzÐп×OÙBR–þd„Ü¸È 2/®{ЈÙ}^öÙK=h¼½³Í\hªGÓc¦3XY#÷.rˆÆ{ÍûŒŽèÏ|yÖªÕM½ÿã>ëACcªK=²?¹ÁðƒÜ¸È ‡:ŽìeË— ™Râ²%Öƒgþ¸PÅegW*Գ蹒2?È}€‹\r­ûDÏÜ%[.¿vºä»&¬ÚÛÖQâ–^zä±þB?¢çÒ3žÓ@^û¹ä×ú†ÝC¾>W‡ð°Û4lÛÓ¯Ÿío=hèYô\úA=¯ž½_? ä>ÀE.yÔܲÿÖû–ëà½âúÚŸ­j,ãÊ«¥uÛõ¼úqÁ¬n /È}€‹\òåpg×#µë ž¬_úƒþ³¼Ç©¤Lp2Fî\ä#‹V¾e¿˜ûõ‡¿«ä¡*¬–ÖƒökJ­’‡ rà"€\°7î 5/‘÷© G£*ï6F#÷.rÜÞ¶Ž1ãŸO¼±g‚õ ôœ:mÛœj´¥·91rà"€`¹ ÿM˜´:Ù…ÿ’­ P㬪®)}D#÷.rÓªÕMWß4S‡çȱϼ×üQâŸF=hh´³\ã׫HüñT‚Ü¸È 4Mû†^¨sЈÙõ>HéYÒ« ¼ú–9z ½½¢”ž@‘û¹„£ý@總¨CràÐi3l:Þu2½çJ»_¯B¯EO¤×¥W—Þs(¹p‘ @ÜÒ鞇ê2(2¨ ½–ïþð…lŠ\}"÷.rð®~ÃG>™ñ¥•™Õƒ†½V¯4½‹`ô‰Ü¸ÈÀ£»Úmë•å/¼“åSg\+êßµMrôÚ³|j¹p‘ €Þ—fðRžqÑÐkO| }"÷.rÈXÏ©Óó–mµK··´ô2 _õ ±ç·¿×k×´´5´M¼ ( rà"€,­oØ=tÔ<t×}k~ö=Gâ·4´†Ý¶@ÃÐ6Ñ–ñ8 8È}€‹\²ÑÒzðöqÏép»âúÚE+ßòþXõà™³ß–jkh›h0Ú>¾¾-ŠƒÜ¸È m‡;»©]7`ðäªêš‡§¯ÕúÑ'© ³‰´}´•ô‡@6%rà"€T-­Û~Õ 3t”Ýzßòæ–ý¾‡óŸ‚ª mm%J[LÛÍ÷p€8‘û¹¤ÄÞ7xä“bÖƒÆú†Ýf5Fm=¿·XQ"÷.rHÜÞ¶Ž{ª3Í3ç.ÙÒ}¢Ç÷ˆ. ØzP´Å´ÝL VmImOß#âAî\ä ã]'Íâz:¬˜XàÐQß#º¨ëAãPÇ1mC Ò,Ѩmë{D@ È}€‹\’²juÓ ³u@ûÌ{ÍùN¯ mImO UÛV[Ø÷p€Ü#÷.r¨œj–á£æ«fÉK=hÔ­Ýajmmçðkm dä>ÀE.•h?Ði¯iœ±`SŽ®iÌW=xæìµ¸Ú‡N3×âjËûKä>ÀE.åé>Ñ3gñfSžä±çIîêAÃöêÑ–×ö³W2rà"€2ÔoøÀ®‰ÐØ´Ï÷pÊ‘ÓzÐÐ6¿ñާÌZz/|Èrà"€~inÙÿÍï,ÓQsõM3s½fz®ëACÛ_ï‚^…Þ½/¾‡ä¹p‘ @‰u›0iuUuÍ€Á“ùꑣݾGT‘êAÑ»ðãÇ7èÑû¢wGï‘ï¡#÷.rèSϩӋV¾uÅõµ:XÆŒ¾¥õ ï% ŽzÐÐ;¢÷E/Gï‘Þ)½_¾G„‹Ü¸È w¯on:jžý®?ûNbbª[?Œò’Eî\äp1që_=x&Òord‘û¹œïÈÑîGg¾÷]iQÖƒÆáή˜îô’Eî\äpŽ‚t­Œ¸4ôÞÝzßò:ÁÉ"÷.r°›ö »mAAVµ‹¾4"X)H¹p‘ €ìmë¸ç¡: ‡N›³xs÷‰ß#J]AêAÑ»©÷Tï¬^¯Þe½×¾GøDî\ä îx×É 6]6dŠ„&Ö·èô=¢Œ§4ôÎêýÕKÖ{­w\ï»ï~û¹€"[µºiЈÙ:†^ø^óG¾‡“©¢Õƒ†Þe½×zázßõîûà¹p‘ (&Õ#Ç>S亠˜õ a?Ð>P´Ïrà"P4µ× NzâµÂ^7XäzðÌÙë„õîÛ넵Wørà"PÝ'zæ.ÙrùµÓé+r¦ðõ aûi¯Ð¾Q„>B¹p‘ (íäv݆m{|Ç?êAKûƒ]g„“!¢Gî\ä¢g×%¿ê†¬KnQžCû†ömí-Úg|H ¹p‘ ˆØáή‡§¯­ª®0xò#µëôŸ¾GêÁóiÑ~¢½EûŒövD‰Ü¸ÈD©çÔéE+ߺâúZíÞ·{®¥õ ï‡zðb´·hŸÑÆÑþ£½Hû’ïI"÷.rñiضçºoÍ׎=tÔ¼õ »}'PÔƒ½Óž£ýG›Hû7œ"&ä>ÀE. &-­ÇŒÞ´‹œ·l+ßìô‚z°OÚ´™†´Ú¯ø–q ÷.rq8r´Û,'WU]3aÒêCÇ|(tÔƒ%Ò¾¤=Jû•Y°R{šï!÷.rXþÂ;Wß4S{òȱÏìÜÕî{8ù@=Ø/Ú¯´wi‹iOÓþæ{8@ùÈ}€‹\@®56í>z¡Y9®~þ‡“'ÔƒeÐ>fV±Ô^§}Ï÷p€rû¹€œj?ÐyÏCuÚ{6cÁ¦ã]'}(g¨Ë£=Mû›ö:m=íÚ}èrà";î„|Ü^dB^êÁJh¯Ó¾ÇÇÈ#rà"/õ>4b6ìUŽz°röreí“\®Œ¼ ÷.ryñ^óG¶¡ÇªÕM¾‡“{ÔƒIÑÞhÛi/õ= ä>Àu¸³ëímúÝ÷@€‹2 ÿ5¡á‚¨d—;Ñ&e¹ŽÜyÑ}¢gî’-vAð½m¾GêÁÄiÿÔ^ª­ª=Vû­ö^ß#òj}Ãî¡£æiv=ì¶ ÛöøNl¨S¢}U{¬¶­ö^íþ‡ä̯?üÝ­÷-׌úŠëk­|Ë÷pâD=˜*í·Ú{µ…µ'kö= wv=R»nÀàÉú¥?p‡Kz¨ÓÆÎ ”îg«íW*Í-û}'rÔƒÙОl¿ìÖî{8@pì-WC¾>—[®²A=˜%íÕÚ·¹pímë¸kÂ*Z2fz0cn³\íó4Ë@‘¹K¶ìe–lËõ Úϵ·³˜&ŠlÕê¦Ï|y–fÅ#Ç>ó^óG¾‡SDÔƒiŸ×ž¯í¯£@Ç‚ïáilÚ7|ôBÍ„˜ýâº÷}§¸¨½Óþ¯£@¾‡¤¨ý@çë5û8tÚŒ›Žwô=¢B£ Ž :"ô^èèÐ1â{D@ºOôØIï=Õµµì{D  ˆŽö£º* õ><òI.Š õ`hì¥Ô:^tÔøP‘æ–ý¦iÆÕ7Í\Z·Ý÷pð'¨ä#EÇ‹iµ¤#È÷p€~;Ôql¤ÕUÕ5O¦©~˜¨ƒe–bѱ£#HÇK± /zN^ðì›fÑí1ãŸoi=è{D¸0êÁÀéØÑ¤÷HG“Ž)Y¾Gôf}Ãî¡£æi«ß¶íñ=ô†z0tÙcJÇ—ïáÐÒzpô÷VhÖzÅõµ‹V¾Åwá£Ì M:¦tdéýÒQÆwîÇáήGj×™{~0õý§ï¡$Ôƒù¢#KÇ—¹'WG¼³½o½o9½ó…z0t”éX£g/üÚ²ý7Ãn[`ÖJ[óú¯|ýF=˜_:âÌšž:u$ú do[Ç=Õ™¶‡s—lé>Ñã{D(õ`®é¸ÓÑgùêxÔQé{DÀÿÏÞýÇX]ßùâÿßÄ?¾ 1!鄤±»¹Ða`°ÁÚ[®7Ü–»«©á†˜RÙ-ß~±¤´½vÍ®iÅ@lmKh¨´«­»E²Ü6³Üµ,të:©±‚íB]¸]HaY!ÈÂÂŽÈ£÷ûÂco3ó>ç¼2Lß3œ÷ûùzÎù|€wzèÜCk~vCïƒ1‚.~ ÿÈÑÁÚ+âêéƒ ö`ìÄøsŒ]{3vhíЙ6nÞ5iö£1yÞ~÷÷vî9\{9\+}°cÄ~Œ]š±CcŸÖ^%¦ÍÍÿ®i³Ã胦ùŒMìVÏØpíÊW£=üíg¼­“èƒ'vhìS¯èà5®V1¡o¥«Ut*}°S5¯øûן¸RýÛv7¯fÿ‹_¬½F…>ØÙbç6ï;ºörhîv‡>˜AìâØËñû:vwíåТN-]¾y\÷²ñ=+î_µåÕSgj¯ˆÑ¥&{9vtìëØÝ±Çc§×^-døõ7ÖoØ>qÖªhó—<µïÀ±Ú+b,胩ľŽÝâ±Óc¿Ç®¯½"ê{æùßöÍ]Sbü¸u`oíå0vôÁ„b7÷{ìýÚË šæß|ইý}ABú`N×Ä®÷z€œ^=uæ+_ßÖ|?Ññ¯Õ^胙Ůo¾_8NïH¢y½ÁOÜó„ë f¦'@œ®' ÁŽ]/ßr×wÜŒ}†æýFã|ˆS¢öraXxߦ˜÷&ô­üÚú3g‡k¯ˆúôAšâLˆ“!·xHÄY'Fí0N[½îÙÆ˜·øþ#Gk¯ˆV¡ò.q>Ä)Ñxâ(Î8=j¯€«·éé_OšýhLw·Í{ì—/ª½Z‹>ÈÅY'F<6âôˆ3¤ör¸b;÷ž³àñÆD·qó®ÚË¡éƒ\Bœg“â$‰ó¤ör¸,ÇO¼ÖxÅ× ½.ÿæO]Fž‹Ñ¹´8=â ‰“¤ñjs7¦hegίyâ¹Æm¦|ñ¯]‚KÓ¹q’Äy•8[â„q5*€´u`oãŠñ7ß¹nà…ýµ—Cй|qªÄÙÒ¸[Mœ6µ—À[öì{åŽEOÆœ6qÖ*w”æòéƒ\©8a✉‡Mœ9qòÔ^@j'‡î_µe\÷²ñ=+âƒøiíÑNôA®BãØ‰3'NÇ@￱~Ãöæõû«½"Ú>ÈU‹3§ù²„8‹âDª½"€,šoäé›»Öy¸jú ×(Ο8…¼m`lìÿן¿ä©æ…þ<'ϵйvq 5/k§SœQµWК7×½léòÍnƵÓ)q"ʧ“ÛžŒ¸öÿã·>£ûœïÜs¸örèú #+N§8£âAçUœZµ—Ðövìzù¶yÅ|Õ}û7ú·í®½:Š>Èhˆ“*ΫxhÅÙ'Xíå´¥#G?ó§?Š™jBßÊÕëž==t®öŠè4ú £$Ϋ8µâìŠXœcqšÕ^@Û0J16ôAF•'µ®”—Z1fôAÆ€½\—b`ŒéƒŒÅ¸—j§ }±ä¦9ïâVÎT¤2ö┋³.xqîÅég`íÔ±u`oßܵ1Ý|çºö×^éèƒÔ'^œ{ñð‹30NÂÚËSû»cÑ“1 Mœµjý†íž!§ }ŠâÜ‹Ó/ÎÀxÆy§b팺“ƒC÷¯Ú2¾gŸîeñAü´öŠÈK¤ºÆ‘çaœŠŽD ³}Ó‹Í'Ã÷ì{¥örÈN¤EÄyØ|ÉDœ“µ—0šo–é™ó-o–¡E胴”8ã„ô–j “Hë‹S´ñÜZœ«qºÖ^ÀE9:ØxÓ„¾•«×={zè\íÁ¥èƒ´…8KãDsµñÚû8ik¯àΜþÚúƸ²ð¾M®@[Ði#q®ÆéÚxÂ-Î[׿ZDÿ¶Ýk¤ßr×wvìz¹öràr郴8cã¤mÜ»'ÎÞÚËRÛ³ï•OÜóDL&7Þúˆ{(ÓvôAÚTœ·qêÆ£7Nà8‡k/Hçø‰×–.ß<®{Ùøž_ùú6—C§郴¯8uãì8Îá8ÝÐ￱~ÃöÆí’ç/yjßcµWWI¤ÝÅ çp<ŒãLŽ“9ÎçÚ+:ÙÖ½}sׯì?>óüok/®‰>HgˆÓ¸y2Ç)]{9@j> =qÖ*ÏBÓôA:Fã•q>{å0²^=uæþU[šïR998T{E02ôA:LœÏÍwvǹíÝÀ5j^ÅîŽEOºŠF¤#ÅY'¶+?×â¿:xóëÜ劦ÒÁšw†“<ÎóÚËÚÆÁC'Þ·)¦ˆ }+×<ñÜ™³ÃµW£B¤³Åégxœäñ8S=ÎöÚ+ZÚé¡sû™zŒáañýGŽÖ^Œ"} â$ó<êq¶Ç ç|í­hãæ]“f?3ÃÇæwçžÃµ—£N$8Õãl|œóqÚ×^ÐBbN¸ýîï™ÈF$›æó~qæ{Þ(_GôКŸy©èƒ$ç|œöÞÉ5®3ð›vÒÒI«yݰH× €lþ÷ßÿŸæuÈŸ{ñ_j/êÐI.Îÿæ}…"j/uîS Mú „È‚H„Ø ‘‘µ—ŒŠ“ƒC_zèoÇu/ß³âþU[â§µW•éƒÐ‰¹éI!  “ ¿þÆú Û'ÎZ£ï¼{¸ïÀ±Ú+‚– B)Ò!2"6EäE¤FdGí×jà…ý}s×F¾Ç[öÖ^´}Þ+’¢™‘ µ—\¥}ŽÍ_òTãòqëþòžé…wÑá‚"/"5 Žñªh/¯ž:³ü›?m¼déòÍÇO¼V{EЊôA¸„ÈŽHÆ»Î#S"Yj¯xÍ+ÅÍYð¸+ÅÁ%èƒð¾"G"M\•Zߎ]/ß6ï±Æ¤ú·í®½huú \¦È”Æ]k#e"kj/x‡CGþcá}›"©'ô­\½îÙ3g‡k¯Ú€>—/’%ò%R&vM$NäNíÿ÷ôйf@/~ ÿÈÑÁÚ+‚¶¡Â•Š”‰¬i>ýT{E×·üÓ¤Ùz\}®Nóí ‘A‘Dµ—éìÜs¸ñÿßÿè×6nÞU{9ЖôA¸‘>‘AË—E*Õ^¤püÄkK¾ú7‘¿7ô>èàp-ôA¸FÛEÅVŠlr{#=gίyâ¹Æ ‚ï^ºñࡵWíM„y©»)*rÊ5Í`ÄmØÛûñ5‘¶7ß¹nà…ýµ—@„Ù {*Ò*2«ör CìÙ÷Ê‹žŒ„8kÕ_lÜQ{9Ð9ôAq‘S‘V±³"¹"¿j/ÚØÉÁ¡ûWmß³"þ‰â§µWE„Ñ ¼àÚ­ß°½ùë?ÿößj/:>£'’«ùâ–H´ÚË€¶Ñ| Fßܵނ£G„Ñ)YæÍïp9:1ÉS.ÑcC„1P^;2Îűà½Ê[8-]¾Ù-œ` èƒ0f"×"ÝÜ<Þkãæ]7ÞúH¤äœïÜs¸ör }ÆXd\$]ì»H½È¾ÚË€Êvìzù¶yE2Nšýhÿ¶Ýµ—¹èƒPEä]¤^ì¾HÀÈÁÚË€ ŽüìŸý8ÒpBßÊÕëž==t®öŠ }j‰Ô‹ì‹Œ=i™X{E0FÊ\xß&!µèƒPW$`ä §FÈ£Ûîž9ßò"hú ´‚æ['"½u€Nµgß+Í7Ñ?ù£_Õ^ B ‰dl^Zí¥ß©½1‹lë^æ"ÛÐRôAh)Í[/Ebºõ`øõ7Öýå/š7áÝwàXíoÓ¡EVFbÆÞŒô\ûƒç#Ik¯®ÆÖ½}s×F¢}ä¾=ðÂþÚËÞM„–¹é;4’4ò´örà ì;plÞ½?Œ›8kÕú Û=· ­I„VéIûô“Ÿý+¯± õºÕ–ñ=+Æu/ûòÃOÇOk¯¸(}Z_$iäi¤jdk$¬` e}Ó‹k£Ý±èÉ=û^©½à}èƒÐ."U#[cÃ~ðVGÚÖ^¼Ãs/þËÍw®kÜ;é'ÿð›ÚË.‹>í%¶qßÈ\oÌ ¼KÌ gcrðì1@»;~âµæ+@–ó§^”ôAà½bZˆ™!&‡Æ»KŽ?U{E\±3g‡×<ñÜnzØ;ċыi^}.f‰˜(\} lØÛ¼‚ôÀ ûk/hQú pi1EÄ,Ѹ;ÕOþá7µ—Àûسï•;=çöÿ`µ;Ì—¦—#&Š˜+⸈#&ÚËàNÝ¿j˸îeã{VÄñÓÚ+Z>\¦Æ˜3FL_~øic@ë~ýõ¶Oœµ*æºO~ö¯ö8V{E@{Ð+3FLqnÄÔ³GL µW]ó…ý}s×nØ[{9@;Ñ«óFLqz|ä¾í2µìÿן¿ä©Æ…¿ÖþàyÏÑWJ®NL1{4.cÓˆ×&Œ¥WOiÜh\÷²¥Ë7?ñZímI®EL 1‡Ä4Ò¸ÍqÌ'µWÐù~Øÿ7ÞúHŒps<þÒoŽÔ^ÐÆôAàÚÅ43I&1Ÿ<ù£_Õ^@ÇÚ±ëåÛæ=Ö¸Pÿ¶Ýµ—´=})1™4î}³JL,µ—ÐQŽüÌŸþ(ÎØ }+W¯{öôйÚ+:>Œ ˜ObJ‰Y%–…÷mŠé¥öŠÚ^y´~öÏ~ìhF>Œ¸˜Ubbñ$6Àµëß¶»ûöoxé0JôA`”4ßä2iö£Þäp¥vî9Ü|köÆÍ»j/èLú 0ªb†i^/f›ÚËh.Ý Œ}mÍ›dÅiã&Y—0üúkžx®yk׃‡NÔ^ÐáôA`lÄT³M81çÄ´sæìpí´–­{ûæ®sòæ;× ¼°¿ör€ôA`,Å„sN;1óÄäS{9-aßcw,z2ÎÆ‰³V­ß°½ör€DôA`ìÅ´3O>1ÿüóoÿ­örª998tÿª-ã{VÄ?ñAü´öŠ€\ôA  #À÷7½Ø|rlϾWj/ÈH*Šù§ù©¿Ø¸£örÆHóÅó½_ãÅó@Eú P]ÌB1¹„ÁÁC'|ñ¯]\ hú Ð b"j^býî¥]bè<åÍw–|õoÜ|hú Ð:b:Š)%·`:ÌÆÍ»&Í~4η9 ß¹çpíå¼EZMLJ1/ÅÑôûýZLPµ—pM~ùÒ¡Ûæ=gZôÁoù§ÚËx}hM155žK9jÇ®—k/àŠ9:¸øþ8Ç&ô­\½îÙÓCçj¯àÝôA eÅìTÌQqLÅL“Uí\–3g‡¿¶~ q|-¼oÓ¡#ÿQ{E¦-.樘¦šO°»Ðâú·íî™ó-/oÚ‚>´…˜©oÀ‰)+f­Ú˸€=û^ùÄ=OÄIuã­|Ó‹µ—ðþôA Ä|SVã}1wÕ^À[ŽŸxméòÍ㺗ïYáòÈ@ÑöÒ¸WL\1wÅôå^@]￱~ÃöÆíSç/yjßcµWpôA ÅÄsW_1ƒ­ûË_Ät˜˜Ów‚ŽÉí¹ÿ¥ör€¶wðЉ…÷mj\ÀjÍÏ9;\{E#F:OLk1³5.ÿS\ÌrµW´¥ÓCçþö37ô>‡Éâú¬½"€¦*&·˜ß∋Yî¡5?‹¹®öŠ€v²qó®I³3äö»¿·sÏáÚËú ÐÙbŠ‹Y.º˜ëbº«½  87€<ôA ƒæóü›ÿ]ÏóS¾®àáo?ãu@ÇÓ$¼¸ï;rÒTš× œÐ·Òu†òºÄ¿øÕÁÚË;ú Py±þm»k/¨Æ}KäôA ­˜ýbŒ30¦Á˜ k/S'‡¾ôÐߎë^6¾gÅý«¶¼zêLíT ™Ås`Lƒ1.]¾9æÃÚ+FÝðëo¬ß°}â¬U1Í_òÔ¾Çj¯ } ¦Á˜ ã0Œù0¦Ä˜k¯-/ìï›»6ö{ü¸u`oíåT¦4ÄdØœŸyþ·µ—Œ°æ3?¸éaÏü4èƒMW‘5.8ïUdÐ1^=ufù7Ú|eøñ¯Õ^@«ÐÞ%fŘW™øÊ×·¹Ê´µæ•£>qÏ®ð.ú ÀÅÜÓ£«ÐCûÚ±ëåÛæ=æÎ2— \BÌ»Tßr×wb¶¬½à²:ò ïÛ;wBßʯ­8sv¸öŠZ”>pi1IÆ<Seœ–1a0–bÊY7&Þ8{cú¸öŠ ²rS|æOdSŒ%}`ìÅÄs¯¿ þm»{æ|Ë_šÔ¢ÔÒ|«TÌÃÞ*E6/ýæHóMµ?ìÿÇÚËHJ¨+&áæ¥cB®½u.º Ð:ôA€êÜj$†_cížwSN€Ö¡´ˆ˜cBŽ39¦å˜™cr®½"I[ööÍ]ð›ï\7ðÂþÚËà<} ¥ÄœÓrœÌ19Çü\{90ö8öÉÏþU<ª'ÎZµ~ÃvÏu´} ÕÄ´3sLÎq>dztíÁU:98tÿª-ã{VŒë^öå‡ŸŽŸÖ^ï ´¦Æ StÌÒñAš¶óýM/~ðVǘqÇ¢'÷ì{¥ör¸} •ųtÔ1WÇt]{9pYš/{î™ó-3@+ÓZßÖ½{v»-îà¡ ïÛÔ¸,Òš'ž;sv¸öЏ} -Ä\ÓuãBý1oÇÔ]{Eð§‡Î5n›ÑÅô=~ªöŠxú @9~ⵘ´ãÜnÜÈ;&ðÚ+‚ó6nÞ5iö£ñÈœ³àñ{×^—Kh;1oÇÔ§wLà1‡×^©Å£ñ¶yy4´)} Mmzú׿‘‰iÜßÈ0öŽlþmõêuÏúÛj€v¤´¯˜ÀcŸÐ·²ñŽ­˜Ïk¯ˆΜþÆ÷~Þxày7+@[ÓÚ]óŠŽ1ŸÇ”Œªþm»›W»Ý±ëåÚËàšèƒ!&ó[îúNãŽo1±×^hϾWþûŸü c7Þúˆ»at} “Ä”³zì1·Çô^{9tˆã'^[º|ó¸îeã{Vüù#÷ê©3µWÀÈÐ:LÌê_ùú¶˜Ûcz>&ùÚ+¢ ¿þÆú Û'ÎZÓÂü%Oí;p¬öŠIú @Gй=¦÷8ác’y>¦úÚ+¢ýüýÏ÷õÍ]¢ø1>®½Fž>ÐÁžyþ·æy®‚ç’Ð:›×ûqE^=uæÏù;¯7HBÈàäàëð¾\ } ˜ðïXô¤ûð^;v½|óëܯ } ÷§tðЉ…÷mŠÇľ•ßøÞÏÏœ®½"ÆŽ>PÌükžx.æÿˆ€èÑj¯ˆ N[½îÙzŒ‡Áâú¬½"Æš>VÌÿÑ"¢D/ˆvP{EŒ›wMšýhüéß6ï±{×^uèƒÉEøØüïFD;ˆŽP{9ŒºøŸ³àqâü_}€75ÿ¶(š‚¿-êTGŸjþðòoþÔß Ðíà¡5?k¾›,ºCí1bïýÀM{Ç(%}€Rój“Ñ¢A¸Údˆ”o^Qvà…ýµ—@ Ñx¯ç^ü—æÝèdDûjÞqòƒ°Ú'x/}€‹‰qã­DLD§ˆfQ{9\“ƒC_~øéqÝËÆ÷¬¸Õ–øiíЊôA.!zD´‰èÑ,¢_¨­oøõ7ÖoØ>qÖªÈ÷O~ö¯ö8V{E´.}€÷bÞ½?Œ¼ˆ–]#Gíqa/ìÿÈ};þ¤úæ®Ý:°·örhuú —)úE´ŒHh.KÒj¢³Ï_òTãB@kð¼ÎÀåи|Ñ2Öýå/·-ˆöᵈ­àÕSg–ó§7ô>8®{ÙÒ囟x­öŠhú W*GôŽhÛšG©½¢¼žüѯ×ü™³àñ—~s¤örh3ú WgϾW¢ƒDˆD‰VR{9éìØõòmókܤÛîÚË -éƒ\‹h"{G7‰†R{9)9:¸ð¾Mñ=ŸÐ·rõºgO«½"Ú•>À5:sv8ZIt“”è)ÑVj¯¨cEõk~«?ûg?ö­à郌ˆè&‹è÷—V£§ÛîI³õW±Œ }€Ô|S[4oj);÷n¾Usãæ]µ—@çÐqÑY~ÿ£_k\ô2ºLí崱ƥ\ã;éR®Œ}€Ñм)^¤Œ›â]…3g‡×<ñ\óV¨½":>Àè‰s÷Ò4Ñk¢ÝDÇ©½¢ö°u`oßܵñ}»ùÎu/쯽:–>Àh‹F½&â&:N4ÚËiiÿüÛ»cÑ“ñ½š8kÕú Ûk/€§06þbãŽè8:Ñw¢õÔ^NË998tÿª-ã{VÄ?ñAü´öŠè|ú cF幘²,ïÙ÷Jíå…>À+_=¨ör*k¾˜¶÷ãk¼˜€1¦P…K¦¸ØÕéƒÔRÞR!šQž[*”7ãXòÕ¿q3jѨ+Û-×7nÞõûýZ|½s<¾sÏáÚË 5}€VÍ(úQDRt¥hLµ—3*vìzù¶yÅ×8iö£?ÞòOµ—ú -¤ÛîèJLÑ›¢=Õ^Έ9rtpñýñuMè[¹zݳ§‡ÎÕ^œ§ÐR¢+EcŠÞñ*šTí€/=ô·ñå,¼oÓ¡#ÿQ{-ð6}€50ÚS$T4©ÚkÇO¼ÖIÝ @ÇÐhYÑ¡\{F>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>“>@üà¾÷ž~ê Ÿºþº»þËõ×}ð–Û{ïŽÏüá§–~aá篿îã×_×Ýu×ÿ<ÿã'â‡É3gNÒ;£+>˜>mF÷ôø »§wêÌiç?èî™9uj|0¥ïüGç?øÝ/î1µwÚÌ®»>uþ÷éžÜÓÓÕýæÿîúòõ×Mš2¥orßÔÞ©]3¦÷NžÞÓÓ×µøúë¦öœÿ×§÷tõõõÆÿ;mFלë¯ë1sòÔ)ÓûÞþ•ç?ÙÝ7yÆÌž™]Óº{&OÑ×sþ“Í}Êô)“§Léy󓓦õMžÖ=µï¿òÿùøìÇwâîßòù/|tѧ¿°ès÷~êó_îºéüç>4iJ|5Ý3fNÿ½®ÿÑ>¿èÞ?éúЭ·ÞòéOqñ~î Ÿ:ÿ‹¯ë?ÿ¥9ÿÃõ×MyóÛ÷Å·¿SŠ/¾¹ÎÞéÓ&O™:cæ;¿ö©3&Ç·yæùM™<³¯{æô®é3ãûÑ7cÆ;¾Êæ¿}±OÆ×3­7¾ú)S¦¼ý;\ì?uÁßá½ÿzã·}Ϻ¿ù¹3göýîsSßZÿ›Ÿ›Ö3urÏôK¬ÿB_è¿¶§»{òôîéÓÎÿ‡‹š:å­ßuúŒ·WÚüäå|«š¿çå|«Þ÷›}Á4?Y~S.öM½àÃâBßÁw~núŒ‹~UWôP¹óúëfv}è÷ºîúä{¾“û¦õLé9¿©gt÷öõMm<˜ßÞó=ñõÌ8.Ìh|æüžoþwfÌœ6¹gjßôó_N|®¯'7ýü¦žÚwñïæÔ™“{{ã¹Ð/lþ†—Ú³Ý]¾ýÞ/t}è–Û§tw}ús‹—|î‹÷ÞÓµô3ŸZ²°kñçîYøÎýúžÿÞûþÙ÷ôôLž9µ·ïíÕNŸÞ5mÚÌÉÝSßüæ'¿åŒÞ‹}]#ô%¼û[û»ïvï´w¬àwŸ+—zÁ/ê‚_þþüFhù—xø½7ÿî\Ÿ2­kÆÔi±¦O¹Àšû¦Yqá_X&Í}%ïùï½÷±Ô÷ÎoûÔiS'Ç#cÆE“­ùÉÆïÙ;ýb_×} ïýæ..’´\Äãõ‚_Ø¿üS¹GÔùCjÆùèúVô¾Á÷\Ýôß=ÔæÜúöø3çS_^øùI“ÞúÄ­ ÿdѽo~ª‘ßSš>¥kjooœBçÿéîê=ÿ©9 ®¿îC»ýcÿ9–µäË¿×5çÞ‹} ¾ë¿Í¹óövÝÔõ毿»ñë?Òø¢îŽ!þÏw~Ý]·ünK¼sŽèîú¯ñÑÿŸûŸ]Óºþ[×ÿ˜ßÝuÏõñÿýá[_ÂÇý o*¿œß xñÅÇo8ûúë>üÑ…_Zôé…8ûÖ®»bêûçg¼ˆ–8*'ü[?™ÔSß”žó{¥/Rz~×”©Ý±–™Sß\Êg®à_|óû×ü—ßþ¨¯«§«û­ïqNç],üƒo®úü zS¤åù_=-&ÖÛ¯«=?ÀÛNýò¥Cñcí…£NîPúÉ?üæÿ™üÕø±öB€Q'÷(ÉÈCîP’ ‡Ü $ ¹@I.@r€’\€<ä>%¹yÈ}Jròû”ää!÷(ÉÈCîP’ ‡Ü $ ¹@I.@r€’\€<ä>%¹yÈ}Jròû”ää!÷(ÉÈCîP’ ‡Ü $ ¹@I.@r€’\€<ä>%¹yÈ}Jròû”ää!÷(ÉÈCîP’ ‡Ü $ ¹@I.@r€’\€<ä>%¹yÈ}Jròû”ää!÷(ÉÈCîP’ ‡Ü $ ¹@I.@r€’\€<ä>%¹yÈ}Jròû”ää!÷(ÉÈCîP’ ‡Ü $ ¹@I.@r€’\€<ä>%¹yÈ}Jròû”ää!÷(ÉÈCîP’ ‡Ü $ ¹@I.@r€’\€<ä>%¹yÈ}Jròû”ää!÷(ÉÈCîP’ ‡Ü $ ¹@I.@r€’\€<ä>%¹yÈ}Jròû”ää!÷(ÉÈCîP’ ‡Ü $ ¹@I.@r€’\€<ä>%¹yÈ}Jròû”ää!÷(ÉÈCîP’ ‡Ü $ ¹@I.@r€’\€<ä>%¹yÈ}Jròû”ää!÷(ÉÈCîP’ ‡Ü $ ¹@I.@r€’\€<ä>%¹yÈ}Jròû”ää!÷(ÉÈCîP’ ‡Ü $ ¹@I.@r€’\€<ä>%¹yÈ}Jròû”ää!÷(ÉÈCîP’ ‡Ü $ ¹@I.@r€’\€<ä>%¹yÈ}Jròû”ää!÷(ÉÈCîP’ ‡Ü $ ¹@I.@r€’\€<ä>%¹yÈ}Jròû”ää!÷(ÉÈCîP’ ‡Ü $ ¹@I.@r€’\€<ä>%¹yÈ}Jròû”ää!÷(ÉÈCîP’ ‡Ü $ ¹@I.@r€’\€<ä>%¹yÈ}Jròû”ää!÷(ÉÈCîP’ ‡Ü $ ¹@I.@r€’\€<ä>%¹yÈ}Jròû”ää!÷(ÉÈCîP’ ‡Ü $ ¹@I.@r€’\€<ä>%¹yÈ}Jròû”ää!÷(ÉÈCîP’ ‡Ü $ ¹@I.@r€’\€<ä>%¹yÈ}Jròû”ää!÷(ÉÈCîP’ ‡Ü $ ¹@I.@r€’\€<ä>%¹yÈ}Jròû”ää!÷(ÉÈCîP’ ‡Ü $ ¹@I.@r€’\€<ä>%¹yÈ}Jròû”ää!÷(ÉÈCîP’ ‡Ü $ ¹@I.@r€’\€<ä>%¹yÈ}Jròû”ää!÷(ÉÈCîP’ ‡Ü $ ¹@I.@r€’\€<ä>%¹yÈ}Jròû”ää!÷(ÉÈCîP’ ‡Ü $ ¹@I.@r€’\€<ä>%¹yÈ}Jròû”ää!÷(ÉÈCîP’ ‡Ü $ §“ƒC¿|éPüX{!À˜’û”äädïCNö>%¹9Ùû“½@I.@Nö>ädïP’ “½9Ùû”äädïCNö>%¹9Ùû“½@I.@Nö>ädïP’ “½9Ùû”äädïCNö>%¹9Ùû“½@I.@Nö>ädïP’ “½9Ùû”äädïCNö>%¹9Ùû“½@I.@Nö>ädïP’ “½9Ùû”äädïCNö>%¹9Ùû“½@I.@Nö>ädïP’ “½9Ùû”äädïCNö>%¹9Ùû“½@I.@Nö>ädïP’ “½9Ùû”äädïCNö>%¹9Ùû“½@I.@Nö>ädïP’ “½9Ùû”äädïCNö>%¹9Ùû“½@I.@Nö>ädïP’ “½9Ùû”äädïCNö>%¹9Ùû“½@I.@Nö>ädïP’ “½9Ùû”äädïCNö>%¹9Ùû“½@I.@Nö>ädïP’ “½9Ùû”äädïCNö>%¹9Ùû“½@I.@Nö>ädïP’ “½9Ùû”äädïCNö>%¹9Ùû“½@I.@Nö>ädïP’ “½9Ùû”äädïCNö>%¹9Ùû“½ÀÿÏÞÝxWQÞûßÿj¼‘óãw<ïÖÕöG¦ô¤Z¨J-Çeî6žÂÂò;è’U´Véᾑ––VNMÂCƒ (…† åIØT‰A AåÕTÂCJÉ‘”~BCÃCî\v:òvöž™kf®÷k±XAaç›Ùó½>×Ìž¹Æ\ÜDïn¢÷~äà&zp½ð#7Ñû€›è}€¹¸‰ÞÜDïüÈÀMô>à&zàG.n¢÷7Ñû?rp½¸‰Þø‘ €›è}ÀMô>À\ÜDïn¢÷~äà&zp½ð#7Ñû€›è}€¹¸‰ÞÜDïüÈÀMô>à&zàG.n¢÷7Ñû?rp½¸‰Þø‘ €›è}ÀMô>À\ÜDïn¢÷~äà&zp½ð#7Ñû€›è}€¹¸‰ÞÜDïüÈÀMô>à&zàG.n¢÷7Ñû?rp½¸‰Þø‘ €›è}ÀMô>À\ÜDïn¢÷~äà&zp½ð#7Ñû€›è}€¹¸‰ÞÜDïüÈÀMô>à&zàG.n¢÷7Ñû?rp½¸‰Þø‘ €›è}ÀMô>À\ÜDïn¢÷~äà&zp½ð#7Ñû€›è}€¹¸‰ÞÜDïüÈÀMô>à&zàG.n¢÷7Ñû?rp½¸‰Þø‘ €›è}ÀMô>À\ÜDïn¢÷~äà&zp½ð#7Ñû€›è}€¹¸‰ÞÜDïüÈÀMô>à&zàG.n¢÷7Ñû?rp½¸‰Þø‘ €›è}ÀMô>À\ÜDïn¢÷~äà&zp½ð#7Ñû€›è}€¹¸‰ÞÜDïüÈÀMô>à&zàG.n¢÷7Ñû?rp½¸‰Þø‘ €›è}ÀMô>À\ÜDïn¢÷~äà&zp½ð#7Ñû€›è}€¹¸‰ÞÜDïüÈÀMô>à&zàG.n¢÷7Ñû?rp½¸‰Þø‘ €›è}ÀMô>À\ÜDïn¢÷~äà&zp½ð#7Ñû€›è}€¹¸‰ÞÜDïüÈÀMô>à&zàG.n¢÷7Ñû?rp½¸‰Þø‘ €›è}ÀMô>À\ÜDïn¢÷~äà&zp½ð#7Ñû€›è}€¹¸‰ÞÜDïüÈÀMô>à&zàG.n¢÷7Ñû?rp½¸‰Þø‘ €›è}ÀMô>À\ñŽSMmWô†ÞG"h,Õˆj»ŠT¡÷~äB~0ýumÕñSkÚtÚ®¸2z1§ñS£¨öR¨¶kIzàG.„AÓ˜q“«µaΘU±¹ûL튀KÑûˆ-™95~jÕXÚÖþWÛ¥ ½ð#ÂÓØtpØèJmÞ‚¢çk6î±]ð ô>âI£¥ÆLíœ?¹ð> ô>À\ÛÊWÞ¿ùîÙÚÈEc—6·¶]ð1zq£Rã¤vK™Ë«·Û.'µè}€¹'»KŸ{³ÿàiyù%KkYq@ï#>4*jlÔÙ¯ L£¥ÆLÛ¥½ð#"ÓÒztÌ„5ÚÚ7Þ>³âÅw{η]œFï#4j<Ô¨¨½Q#¤ÆIÛ¥½ð#"Vß°ÿŽo-Ô6/,^PW¿Ïv9p½ë4j$4ã¡ÆFÛ市Þø‘ Ñë9w~ñêm‡”kËþþ*·à ziÜÓè§=P#¡ÆC®—ˆ½ð#l9ÞÙõ£™o˜ûe¦”¯×mW·Ðû°BcF<{ý~0ýu†¾èÑû?rÁ®æ–Ã#[Ézzˆ½èi”3ë-kÜc½e[è}€¹Úþæy[CGVlÝþGÛåÀ ô>¢¤‘Mã›y뺷~o»§Ñû?r!&ºÏôÌ_¶Õ,²7nrõ¶Û!åè}DC£™Æ4³´²F9u¶+r½ð#båȱ“ã§Öèé?xÚôùoŸî:k»"¤½°iÓ8¦ÑL{šF¶ö#¶+ÂGè}€¹C;š]ª÷eÐð¹UµM¶ËA:Ñû•Æ.`ÚÇî}h‰Æ4Ûåàïè}€¹[Þlêëc^`6…ÀÑû‰Æ+ZœÑŠ-zàG.ÄÙ鮳³*6sµÂ@ï#p£¼+Þg.ÜÄïñDïüÈ…øóVcP8ƒÕz2+biŒbE¬ø£÷~äBR46ôVk¯Ù¸Çv9HÀ\Hœ'»Ÿš½¡_AY^~ÉÄÒÚã]¶+B"ÑûÈ…F?…4M)_¯qÉvEȽð#ª¥õè˜ kôÞ R¾xõ¶žsçmW„„¡÷‘6s4òhÿÑ(¤±ÈvEèzàG.$Ú[[Z ‹èÔï›ÞùÐv9HzYÐ8ã9uõûl—ƒlÐû?r!é8WìÐûèïš„oŸÉ5 ‰FïüÈ…t8ÖqÊ»—çgÏnä^\½ i<Ѩâݳ¬ÑÆvEÈ ½ð#Ò¤¹åðý®`­?d‚ÞG&¼5¿ùe¬iœô>À\HïY`w=°¨±é írSô>z§ÑCcÏ.\|T¹ª\#ƒÆUãzàG.¸Æ[)âÆÛgÎ_¶••"œEï;N½¯@ã€vƒ±“~ͪSî ÷~ä‚›êöYaV’¯«ßg»X@ï»L]ožJ£q@£ír)zàG.¸lyõöOu–v€­äIÓ®¡÷ݤNW¿ë­8¤\#€ír`½ð#w¼³kJùú~eyù%úB´]"Bï»Æ4»:]ýN³»ŒÞø‘ –Ö££É|d°xõ¶žsçmW„ÐÑûîPG«¯ÕÝæbõ»íŠ`½ð#à©«ßWX¼€[ŠAï;»YXÝÍ͸@ï>‰\€_Ϲó V¼c–3aÍþ?ýÅvE ½Ÿzê_u±·˜0Ÿûà÷~ä.w¬ãÔÄÒÚ¼üI–bô~Š©gÍÃFÕÅêe6 ?zàG.àjvím/»T»ÇÍwÏ^Uóír0z?­Ô­êY½¹êß͇l—ƒØ¡÷~äzW³qyNÙ°Ñ•Mm—ƒÀÐûé£UŸêmÍ¿wž:×v9ˆ)zàG.àšNwU±y@á í*ßýñ+íG:mW„Ðûi¢®Toê UŸª[Õ³¶+B|Ñû?rÒ„óñŸ¾Ê„35èýtàt úŠÞø‘ è.HK z?ÔƒêD.çFŸÐû?rY¨ªmbÁФ£÷M}ÇrOȽð#´O:z?¡x rDïüÈäâ@[¼N(z?qÔ_ê2õšÞ8õÝþ?ýÅvEH$zàG. wõ û‡Ž¬ÐŽTX¼ ®~Ÿírz?YÔYê/½eê5uœír`ô>À\@P¯Þ6pH¹v§­li=j»\½Ÿê&õ”Þ,õ—ºŒOá‘#zàG. @Ç;»¦”¯ïWP¦_úB´]®ŠÞ?¯¡òòKh(…Þø‘ \sËaïãŒåÕÛm—ƒ+£÷cN½ã}ஞ²]ÒƒÞø‘ I]ý¾‚¢ç¹Ý)¶èýØònÈUqC.GïüÈ„§ûL·âØI¿>ÐÖa»"ü½CêuŠ·`¯:ÈvEH!zàG. lÇ:NŸZ£ÝŒÇ¥Å ½+Þ=õ¦¨_x 'ÂCïüÈDcGó¡¢±Kµ³ >·ª¶Év9 ÷cD¡¾ÐÛ¡Q§Ø.)GïüÈD©úfÞ;ltå{»Úl—ã4z?ÔêsžDÝa»8Þø‘ ˆØé®³³*6(œa®‹k?Òi»"GÑûviÏ7×Q«Ôê ÛÁô>À\€Ú:ÆM®6“á9‹ëY7#zô¾-Ú۵ϛS"êÖYBÄè}€¹‹›ÞõÀ"³®~ÍÆ=¶Ëq ½o…ösóíùÚÿm—Ñû?rÖ-¯Þ~óݳµ~ó;ËxîvdèýˆißÖ®m®½]û¼írà.zàG. NœìþÙ³û”åå—L,­e±ýÐû‘Ñþ¬½Zû¶öpíçÀ\@ ™OU)çS•ðÐûáñ>éÖ>Ì'݈zàG. ¶Žwvyw]M)_Ï]WÁ¢÷à½Tûªw'¬öaÛ—¢÷~äb®¹åðˆÇV²*càèýÀy+åje¥\Ľð#ÞSÛ†Ž¬x÷ý¶ËIz?@Ú'µgò$M$½ð#Ýgzæ/Û: p†öØq“«´uØ®(Ùèý@h?ÔÞ¨-©=Sû§öRÛ×@ïüÈ$Kû‘ÎñSk´ÓöÀ\@¢î:;}þÛ\³—z¿¯ü×*k¯ãZe$½ð#Þš7Þ>“5=2Dïgάe¤½‹µŒô>À\@jlÝþGoÍÿuoýÞv9qGïgHû’÷¬íc¶ËrEïüȤ ÏϽMÚ´i+iÒ~e» ô>À\@úïìšR¾¾_AY^~ɦ¿®?Ú®(Žèý^hŸÑž£ýG{‘ö%v!¤ ½ð#V-­GG•vïCʯÞÖsî¼íŠâ…Þ¿"í'Ú[´ÏhãhÿÑ^d»" `ô>À\@ºÕÕï+,^ \¿×7ì·]NŒÐû—Óâí-Úsl—„‚Þø‘ H½žsç+^|×,9fÂ>ñ1è}?íÚ7̵Ú[ø4)FïüÈ8âXÇ©‰¥µæŽ°ÒçÞÙÖ´®7’îÞ×»¦÷Nï ~F½›zOmWÄEº{ÐWäpEõ û‡Ž¬Pw þÆüºú}¶Ë ^Š{_ï—Þ5ýtzõ>Ú.ˆ—÷> äЋ_U5R®ñØÊ”=¯<•½¯÷Hï”~.½kzïl—ÄQ*{5rèÝñή)åëû”é—¾ÐmWŒ”õ~Zß& p)ë}@ŽÈ øðÏÞO‹Wo³]NÒÔûzG¼qõNÙ.ˆµ4õ> w乺ú}…Å ÒqcZ:zß»ÍSïK*oó—ŽÞ…\úÄ¿på˜ k’»peÒ{_[^Û?õËÀKzï‚E.Y8Öqjbim¢l—ÜÞ÷?&RïBº .¹½¹dmGó¡¢±KÕA7ß=»ª¶Év9}“ÐÞ×vÖÖVåÚòÚþ¶Ë’'¡½ ¹ä¨fãžAÃ窆®ll:h»œL%®÷µmµ…U³¶¶¶¹ír€¤J\ïBE.¹;ÝuvVÅæ…3ÔMÿôÕö#¶+º¶õ¾¶§¶ªªÕÖvÖÖ¶]` ê}@È (:l7¹:)‡-‰è}ÿ¶¶m"´˜KDï"C.Áò.k,(z>Η5Æ¿÷µõ´ w!.sñï}@”È +_yß[öd×ÞvÛå\Aœ{_[Ì[¨G[Òv9@ªÄ¹÷Ñ#€xEÈË/‰ácâÙûæAÚbÉ}sñì}€-䪖֣ÞcÓ¬x§çÜyÛ},n½¯-£í£­¤ª´Å´ÝlW¤SÜz`¹D ¾aÿßZ¨^+,^PW¿Ïv9‰Uïk›h˨m%m+Ûåi«ÞXG.Ñè9w~ñêm‡”«ãF=þ’õÏ¿bÒûÚÚªD[FÛ'>ŸŸi“ÞĹDéxg×f¾‘—_Ò¯ lJùzýÑV%Ö{_?»¶€¶ƒ¶†¶‰ÅM8Åzïb…\¢×ÜrxÄc+ÕzŸþê¬åÕÛ­Ô`·÷õSëgWÚÚVjÜDîüÈÀõy¾ÞБÑß4g«÷õ“êç5Ïgdä¢GîüÈÀ¢î3=ó—m5‹jŽ›\} ­#²o}ïë§ÓÏh–ZÕO­Ÿ=²o ÀCîüÈÀº#ÇNŽŸZ£N4Ý;Ýu6‚oeïë'2bÔwÔOªŸ7‚o àŠÈ}€¹ÄÄŽæCEc—ª Ÿ[UÛö·‹¬÷õ³è'Ò÷ÒO§Ÿ1ìo wä>À\bÅ;z6º2Ô£§z_õ마ì@&È}€¹ÄÍ鮳³*6{WW¶é 㻄ÚûªÙ»V?K4WÀȹð#€xòV_P8cÞ’-¯¾Rï«NU«š£_!@&È}€¹ÄYcÓAïé 5÷øÊaô¾*ôž ¡Ê|eA!÷~äË«·ß|÷lµêý®êéíÁö¾ªRmzAÕ©jyMa ÷~ä'Nv?5{C¿‚²¼ü’‰¥µÇ:Nåø‚Aõ¾*Q=ªJµ©Bՙ㠹ð#€ii=:fÂõìÀ!å‹Woë9w>ë—ʽ÷õÝUƒ*Ñë¨*Õ–õKˆ ¹ð#€ÄykKKañu®~××Ù½H޽H ¢GîüÈ ‰rÿl.ëÞð3JÑ#÷~ä\¹Ü»—Eï~#€è‘û?rHºìÖöìkÆ)€è‘û?rH‡¾>û/óÞGîüÈ 5ºÏôÌ[²e@á 5õ¸ÉÕÚ:zùË™ô¾^A¯£¿¦×Ô+ëõƒ.@ÔÈ}€¹¤Lû‘ÎñSkÔ×ýO›U±ùt×Ù+þµÞ{_ÿJÿV¯ ¿£WÓk†Y2€èû?rH¥͇†®Tw>·ª¶éò¿ÐKïëïë_éÿêô:á :ä>À\RÌ;²+»ô’#»+ö¾þŽþf/G‘’ŽÜø‘ @ºî:[úܛޕŸGŽ4ÿý’Þ×÷®2Õß¿ÚU¦’ŽÜø‘ € ¼•an¼}æüe[»Ïôx½¯¯õ_ôß3Y…@Ò‘û?rpG}Ã~ïÉ3~ñ¶¾ÐïÞS*ôm tä>À\\³¼zû§¿:Ko~éëÌŸb éÈ}€¹¸æxg×ÿWRû©[>:ÔïúZÿÅvQ"BîüÈÀ=çÎ/^½màruýÝß®ô~×Ñ×ÿµ] €Ð‘û?rpD}Ãþ;¾µPý^X¼ ®~Ÿ×ûúZÿE_ëÿr !zä>À\R¯¥õè˜ kÌ⢠V¼c>ô÷¾þ‹þ»YbTSßvÉÂBîüÈ ÅNœì6ÌË/™XZ{¬ã”÷¿.ï}ý_ýýMóBý[%¹ð#€´ZùÊû7ß=[ ^4v鮽í—üß«õ¾þ¦þ¾þ—þ­^!ªbD„Üø‘ @ú466ºÒràG. e¡þÍîñÙõ¾÷ ýÛK` È}€¹$N÷™žù˶z?ÐÖ‘Å‹äÒûúŽÞîU‰êÉâEXAîüÈ Yêê÷/PÛYQß°?ë×ɽ÷õÝUƒ^Dõ¨ª¬_@”È}€¹$Å>üóˆÇVªa)_¼z[ޝTï«Õ£—Rmª0ÇW6ràG.ñw¼³kJùú~eú¥/ôÇÜ_3ÀÞ£<!!÷~äs¿ªjô>€kn9ÔËÞûªÍûøR5õ²‚EîüÈ ¶¼ôc~à7è…ÔûªSÕæ~{#€û?rˆ¡mM¬ uÏðzß¿ü©~Šì–?ràG.±âÀß„§_ ïa÷¾*WýY?@HÈ}€¹ÄGUmÓç¾6G-Y4véŽæC¡~¯hz_?…~}#ý\úéBý^2AîüÈ ›]©f4|î«ëwGð£ì}ýDú¹ôíô3ê'à;¸ràG.vµé?µFm8 pƬŠÍ§»ÎFó}#î}ý\úéô3ê›êçÕOÍ÷p ràG.¶tŸéñ‘ÆM®nkÿk”ßÝJïëgÔOêü†±N€Þ‘û?r°¢fãž‚¢ç-^Bi±÷½‹cµ´¢/p¹ð#€ˆ5·6K¬Ü|÷ìåÕÛm•a½÷õ³k ˜Ås´Ml•¸Æzïb…\"s¬ãÔÄÒÚ¼ü’~eÖÁ‡Þ7×ÐÖÐ6Ñ– ïá È luõû ‹¨Ñô{}Ã~Ûå|,n½¯-ãm%m1Ûå©·ÞØE.áii=:úû«Ôb‡”/^½-VŸ|Ű÷µ}´•´­T˜¶[>EÒ'†½°ˆ\Âp¼³kJùzsgܦ¿®?Ú®èR±í}m+m1s—¥¶a 7h±í}€ä8oåÌ­ŒíÊ™1ï}m7m=ë«°éóÞDŒ\´uû‡Ž¬0OÖ[÷Öïm—Ó›Dô¾¶¡yJ£¶ª¶­ír€4HDï"C.8ÐÖ1nrµY$sþ²­ÝgzlWt Ié}mImO³4«¶°¶³íŠ€dKJï¢A.9:Ýuvúü·ûž¦V?µ¦ýH§íŠ2’¬Þ×VÕ¶UÁÚÎÚÚÚæ¶+’*Y½¹ä¢ª¶iÐð¹j¢{Z²£ùírú ‰½¯-¬í¬²µÍµåm—$R{rÈŽŽM¾>æ…ä›$·÷½cpmÿdƒqÜÞ„\úÊíâÌ…›zíb¢{_Û\[>q×èqèÞŽ\2gÖ6P8#k›¤ ÷½5|ôŽ$b  RÐû€‘ @†j6îñž}ðîûl—“«Ôô¾Þ ïzl—Ä]jzr¸¦T>=e½¯÷EïŽ~"½Sz¿l—ÄWÊzÈÐÄÒÚã]¶«âˆ\z¡ìP‚äå—ô+(›R¾þÄÉnÛ&}½¯wGï‘Þ)½_ä>p5éë} Úí)_¼z[Ϲó¶kâ…\®Hy¡ÔPv¨AÆLXÓÒzÔvEKkïëÒûEîW“ÖÞzWW¿¯°xv~ý¾ém—Ĺ\NI᥆Äv9¡Hwï“ûÀÕ¤»÷^˜3½7Þ>3­gzì €Ÿ÷é’ò"ÝŸ.¥¾÷É}àŠRßû@ïŽuœòîùÙ³Ót'r0”Êïî3å…íŠÂåHï“ûÀ%é} wÍ-‡¿ùe)[)ȹ\ð­N©tpduJ§zŸÜÐ;ïIRw=°¨±é ír;È8Nã¿RÀÁ§×9Øûä>pÁÉÞzÑ}¦gÎâú…3Ôã&Whë°]5rÎÒ˜¯‘_û¿R@Y D°]Q¤Üì}rp³÷Þµé?µÆL fUl>ÝuÖvE@tÈ8Hã¼F{sP ñ_)`»" \î}r.s¹÷ᬠÇù÷vµ ]©4|nõ;î ˆ r®yuýnóÚí5ækä·]Ž5ô>¹7ÑûpÉýÌÿ~Um“™']º£ùPx…1A.ÀÕ5¶›ù¿F{ÛåXFïä>\CïÃþÜïÓ?Ò-ðܯoØ?td…Y‡¼®~_ E±B. Å4nþÆ|íáÉ5žÛ.'^èý+"÷‘zô>R,¼Ü_^½}àr½òˆÇV:òœb¸ƒ\@*i¬Öˆ­}[£7Ï¿"z¿ä>RŒÞG*EûÇ;»¦”¯ïWP–—_¢/ôÇ0¾ =r)ã ×úÅpÝ z¿wä>ÒŠÞGÊDœû-­G½ÏÅ«·õœ;ê·"@. M42{ëhĶ]N¬Ñû™ ÷‘>ô>ÒÄVî×Õï+,^À )HréàÝö¥ñ™Û¾2AïgŽÜGšÐûHë¹ßsî¼·p͘ köÿé/Ñׂ\@ÒhëÐ8ì- É'8¢÷û„ÜGjÐûHºXåþ±ŽSKkóòKx ’‹\@ryÓ8¬Ñ˜ÇÆõ ½Ÿr)@ï#¹b›ûÞƒïo¾{öªšl—ô ¹€„ªªmÒ¨«½W#°ÆaÛå$½Ÿ5r‰Fï#¡âŸû5÷äß;O]ÙØtÐv9@¦È$ŽÆX´Úo5êjìµ]NRÑû9"÷‘Pô>'A¹ºë쬊Í g¨Úïþø•ö#¶+®\@‚h\}ü§¯jÕH«ñV£®íŠŒÞϹ$¢÷‘ Í}•­P0e—>÷æ–ÆVÛ½!L¼GïÅŸû š®ÀYô>AÇP:’Jtî{kêWñ#Ë“ø#Àäâ¯fãž‚¢ç¹0/Xô~°t9Gï#ætܤ£'s•‚ܯxñÝOÓÏ’—_2iÚºî3=¶+.E. ÎvímgáŽÐûaÐ^óåz±¥c¥N]ÇMÚEu µpå;¶+ Ɖ“ÝO<µöº‹?×·Ïd>ƒ¸!O,ì6z?$±]0è}ēޒÌ3^uܤ£§ôåþþ?ýå®™Ï=o»ï¹]{ÛmW|Œ\@Üôœ;¿`Å;<ø;lô~¨´ßÆçqÉ€½¸Ñ‘‘¹+D¿îµ(ݹ_W¿ï3w=c~ØQ¿Ä9CĹ€XÑ8YX¼@ûäБõ ûm—“fô~´kOÖvÖ^­}Ûv9ÀGè}ćކtLdŽt”äÈ8ÙsîüÌ…›ú”é§¾þÖÒéóßæœ!ì"-­GM( R¾xõ6ÆÆ°ÑûÑО¬ýY{µ¶öˆÇVj?·]\Gï#46ê8HGCÚud¤ã#×rÿxg×ÃO¾ü©[>:¾ihùÚ »mWw‘ °NCâ”òõŠƒ¼ü}¡?Ú®È ô~”ÌN®=\û9;9ì¢÷aŽ}td>Ô1‘ËCâ®½íæ²(seç a¹»–WoÿôWg™Nš[Û.Ç!ô~ô´‡k?7‚kÏ·]EïÃ"èÍ…ô¬©bèùŸîø¹¶É§nqýV °Å»µª èyGnˆzßíífån’…ô>¬ð_yãí3¹<òÝgz¦Î©3ÐÞ0xÚ¼%[lW‡ ˆÞ¶Žq“«½¥y6«ô¾EÚçµç›EtÇNúµ:ÂvEp½èéèÆ<“]Ç;:ê!÷¯æXÇ©{t…·ÀÎ[[ZlW' ˆÒ鮳æÑlÚëÆO­a™e‹è}ë´ÿ« ô.ðMD‰ÞG”ÞþÝ{W¸ÿÑä~&¶ïÛå ©è}äBG߿ʀèH„ɺžsçg.ÜÔ¯ Lïˆ~×ל3D_‘ Èš÷™ÅÀ!å|f‘8ô~ñYú„uK‡u~ÐWä2רtpèÈ ž‰–ô~:xÏúTo¾ûþÛå è}dˆç$ÏAŸ ÈĶŽq“«µ« (œ1ÙVžšô~j¨Õ•êM½¡êSu«íŠkô>2ÁsÏS ýHgñ#ËÍg»Ÿ6gKc«íŠSäzwºë쬊Íý/†Âø©5[lW„`Ðû)£ÞT‡ê=U·Î\¸Ik»"ĽÞé¨AÇæ BGä~Òmßyð Ãçš7tøƒ/pΗ#ЋªÚ¦AǯyaGó!Ûå Hô~*©OÕ­zgÕ¹ê_Ûå Žè}\Žt¼`4†è8ÂvELåªsI^~ɤië8g?rW¤YeÑØ¥Ì*SŒÞO1ïLν-áL.Aïãr::Ð1‚¹ÝLG :v°]‚§wyÂÓ¯]÷·wyIU£íŠä.qäØI荒éóßæ RZÑûé¦ÎUÿr¥7.GïãK_n4ŸéHá?~ö¹ŸnþOo»ï9>Ær>fU ³F1«R¤½ïo%(õ5+AÁ ÷áѱ€Ž¸³ÌAoÿî¿?s×3æ­¿ÿÑÇ:NÙ®6‘ 0´x«ÖoÝþGÛå tô¾;ÔÑÞ“bÖ½õ{ÛåÀ2z¢ùÿ¿=ºÂè¸à­--¶+‚Þ*²×ßZÊ*².#ÀS­ÝDï»FÝ­×›®~W×Û.ÖÐûŽ3O¦ÓüŸ'ÓAŽwv=üäËÞS&×nØm»"X@.¸LƒÀf¾‘—_Ò¯ lJùzýÑvEˆ½ï õ¸:]ý®®ÿÁô×iy7Ñû.ÓlÿŸîø¹vÍÿuÀ £¥õ¨¹ŒD¿ ‹ìÚÛn»"DŠ\pSϹó‹Wo8¤\ïþèï¯Ò8`»"DÞw–ú]]¯w_#€Æ¶+B¤è}7i†¯y¾™ðkæOîãrk7ì¾ih¹ÙI8]àrÁAõ ûïøÖBs ¨®~Ÿír`½ï8õ¾™êw ¶ËAtè}×ø/ÔlŸ Ñ‹žsç§ÏÛ\Nܯ læÂMœ3t¹à”–Ö£c&¬1—ˆW¼ø.=î2z4˜%…52ðy#è}w¨Ç5Ÿ×¬Þ,¢y>¹Lë85êñ—¼å†øì õÈGœ8Ù]úÜ›ýOËË/™XZË ÷ah4И`î#Ö(¡±ÂvE½ïÍá½ hnOvím7+Ïë×£íÿÓ_lW„° .XùÊûf]Á¢±KYW½? XgØô~êiÞ~׋¼޳6r±ªæsÉuù%O<µ–s†©D.¤[cÓÁa£+ÍsÇj6î±]b„ÞÇå4J˜³Á74zØ.¡ ÷SLsuÍØ5o77†h&o»"¤A÷™žN=ïâ~uÃài W¾c»"Œ\H«ö#ã&WëÍP8cVÅfž1ŠKÐû¸"14nh÷ÐÒÖþWÛ!`ô~ZU¼ø®y¶¸æí“¦­#÷,M,‹Yn>wþü=Ïnilµ]C.¤Ï鮳ÞtnüÔõ¯íŠGô>z¡qC£‡wBI£ŠíŠz?}43×üÜLÔ5c'÷ÿÎvßÿbgKr!ej6î4|.—{ášè}\“wÁ¹F•W׳F}JÐûi¢Ù¸¹ó—l¥ÊU ÿð¥éއќ3L:r!5v42¡ð¹¯Í©ªm²]âŽÞG†4žhT1 Riœ±]rE遼fàš‡›[º43×üÜvEp‹ÿfÕÿùåܬšhäB ˜åâõ>ö<åâ‘!z™óX£}fÂÓ¯±p}¢Ñû) ¹÷?~™%aß¶s‰YÌvûN®LK$r!ѺÏôÌ_¶Õ¬üÐÄ*u¥íŠô>úJ#ŒÆ³n¡FV«H(z?Ñ4ßÖ¬ÛL¿ïþv%¹8àa—IG.$—º¯°xÞ¾¡#+êöÛ. Cï#;m4æhçüù…l—ƒ>£÷JslÍ´Í”[soºq3gq}¿‚2íŸ×ßZ:uN]Ϲó¶+B¦È…$úÇñØJ½q‡”ÿªªÑv9H$z¹ÐÈ£ñG»Æ¢æ–öËAÐû‰£yõ>[§9¶Þ8Í·ŸY´ÙvEÀ•ïìzøÉ—?uËGg-nZ¾v ‘%¹,j´)åëú¥/ôGÛ!©è}äˆá(¡èýdÑŒZój½ešck¦M£!þþðáŸÍlú¥/ZZÚ®×@.$ˆÿ„¼zÍv9H6zð_®°xõ6ÛåàÚèý¤Ð,úË÷ÿ}RÍñHNe$¹Þ ;Jn@ è}ˆÛ™„Þ?.ºC:tŸé™:çï—:Ï[²ÅvE¸2r!æXÐ!¡÷,ÿrÇc&¬aÙÃØ¢÷cNsfÿ¢ä>’Ž¥â\ˆ-ÿ¿&–Ö²x/‚Eï# <5þèýØbÑ~¤˜ÿQ)÷üûbÎÆ ¹OUµMŸûÚ½5Ec—îh>d»¤½ðhÔÒØ¥ìæ»gk4³]>Þ!Í5Cæ¡ÞH½U5 (œ¡ýüºü’'žZË9Ø ⦱éà°Ñ•zS Ÿ[³qírZô>¦Lã˜v3iÙl—ƒÑû±¢ù°fÅšëMÑ"£1M#'»b‚Þƒ†þ¤9°™ kVLîÃM[[½F(~d9` ¹`]ÍÆ=EÏsI"Fï#bÞÅðñ¸Þ"zß.Íx5ïõ>Ñ|ØvE€eÏ/ÝzÃÅåóòK~4ó ÖÔ¹`QsËaoÉ…•¯¼o»¸…Þ‡ë4â™Å²vím·]Ž‹è}[4ËýqùoÍmSšýjl»" .ü7ÒÞxûLn¤¹`…Y’]¡À’ì°…Þ‡-ÞÃt4ò0èÑûVh~kžÎɲŠÀÕ´´½sÔ"óéù‹žçœadÈ…ˆõœ;_ñâ»Þ#›µçÛ®Ž¢÷a—F?æTð‚ïhl´]‘+èýˆiNûÅÿg¾™âj®K«ß÷é¯ÎâAœQ"¢¤=¼°x6øßZXß°ßv9p½8ÐH¨ñP»¢ÆF¶Ëq½Íc5›5ÓZÍoÙà õœ;?sá¦~eêëo-Õל3 ¹–Ö££¿¿J›zàòÅ«·±WÃ:z1¡ñP£¢ÆFs*˜OOÂFïGÀÌfÿ¯ÛJµ©5§e6 dáxg׃ÿïsF妡åk7ì¶]Qj‘ aÓÎ<¥|½âÀ,š¤?Ú®ø½XÑØ¨Rã¤FK™ •á¡÷æY«æ®f«Ù,;3‹]{ÛÍÅu\qr!TË«·›•ôF<¶²¹å°ír€¿£÷C'5Zš‹ë4~Ú.'èýðøWÃÐ –Õ0€ üæ·»Ì⟺å釟|™™‚E.„dëö?Yaž´ÅæE Ñûˆ-í–æ©¬E¹Õ:pô~4;;éך©š%’4wµ]6Ýgz¦Î©»þÖRóÄ–yK¶Ø®(=È…Àhë7¹Ú$Âüe[yª&â‰ÞGœiäÔøiÎkDÕ¸j»¢ô ÷§y©yš¶fªš¯’û@xŽ;YüÈró)ügîzf3ç ƒ@.èt×Ùéóßî1ÆO­Ñk»"àª~óÛ]ÚQ9‰8Ó(ª±T;ªyT«ÆXÛ¥¹ ÍEÍ]!ú¥9*¹Dcû΃·Ý÷œi½á¾À9Ñ A©ªm4|®6fÑØ¥;šÙ.¸†¿x[»«~·]p Q5®jwÕ«‘Öv9‰GîBóOÍBÍtTóRÍNmW8§rUÀÂêÁëòK&–ÖrÎ0käBî4Wùú˜˜« Y8D²xç܆®äœ[.ÈýiΩ™§æŸÚŒš‹jFj»"À]êÇIÓÖÑ9"rÑ~¤Ó»–iVÅfÎK A8DâhŒÕHë]“¯ØvE‰DîçÂÿy„f¡ä>þÏëoù×y|^ßWäBvÌZ&XëIÄñ Ê[³K#ð¼%[X»£¯Èýìh†™ï<îWbkKc«ÿ~^ÎfŽ\ÈBÍÆ=ÞZèMœ‚@"q<ˆDÓØë=ÓGc²ír’„Üï+Í*½õ 5ÛÔœÓvE®Šõ~³@.ô‰÷¬d%ÏJF¢q<ˆÐ8lÎßÿè ϶ËIr?s<ï H¢'»¿óÃjïy ,îqMäB†ŽwvM,­ÍË/éWPöÔì ÚÓlWä„ãA¤ƒFcÉ™ó.®/w¬ã”íŠâŽÜÏЯ_ßiž€©Y¥æ–ä>,-­GïµÈ|²_X¼`×ÞvÛŹpM=çÎ/^½màrm¨1Öhï²]Ž‘&™5>k—ÖX­[ã¶íŠâ‹Ü¿&Í5{4ÓHÍ'É} ¹^ÛØ|ÓÐrÓÎÿ>aõñÎ.ÛŹлMï|hBA¿¿µ¥Åv9@`8Dúh”öFl޶ˉ)r¿š+jÆh¦ŽšCj&i»"¹ê9w~æÂMý ÊÔ×ú]_sÎðäÂÕp¶éÆñ R‰+:®‰Ü¿"fŒ@ºë85êñ—ÌÙžÿ{謺ú}¶+Šrár'NvÿìÙÜ‚tãx)¦qÛ»ã[ã9w~ù‘û—ÓÌPóC3QÔŒ‘ÜÒj×Þö/}ó\ ~ rá¬VGp<ˆÔÓ®‘œ¡/AîûùWœÐ,‘'¬ªùÀ[-ꉧÖrÎ\ð46¼ëE<Í ŽàxŽðž«ž'Æ^ ÷ÿF3@ͽé5?´]€ètŸéùɬõyù%ϳ[[mWd‡ã¹pºë쬊Íf’0~jö Ûáx®Ñ¯qÞœúÓȯñßvEv8žûšïiÖg¦š’û¶ï<è ÿúà’¶ö¿Ú®(j.çBõ; Ÿ«ØèÊ͇l—DŠãA¸I£½Æ|íüÿ•¶Ë±ÀÙÜ×O3=ïƒÍmW F*W5˜OˆòòK&M[çÔ9C7sAó¢±KÍ| ª¶Év9€ÂeùÍù@ekçÌ}Íë4»37 i¾§YŸíŠÄ‘ÆŠ'žZ{Ý߯Е¯¼o»¢ˆ¸– Ç:N™ë…úžVúÜ›Nû~Âqÿ•ý/ÞD¦\pç®å¾ft朿æxšé‘ûzw ­cøƒ/˜k n»ï9®%p'ºÏôÌ_¶Õ¬.ËzǃÀßzbJe„ 늸“ûšÅi.g&ušÝ‘û2WW¿ï3w=c‘ß{1Ýç ɽ§f½ñ¡#+êöÛ.°ãAÀ£\P:˜ç )/l—.r_37ÍßÌDN3ºÔ¿§BòÑZÄ_,ÓHrý­¥SçÔ¥õœaês¡¹åðˆÇVêg8¤œçŽK(#>ýÕYê ¥†²Ãv9aIwîk¶¦9›fnúû”9þL1¹;ÞÙõð“/›g•þóW~¾vÃnÛ/Ź ·oJùGšT"è ýÑvE@Œp<\·RCÙ‘ÖàHqîkž¦Ùš~:ÍÜ4KåÛÀŠ–Ö£w|k¡¹ê °xÁ®½í¶+ R*s¡çÜùÅ«· RnNóê´];W£ÔõøKæÂ¥‰2ÅvEAJeîkn¦š™ª}ùþä>€0¬Ý°û¦¡åé;锾\ðnQ4pËp5½S‚˜CŒ”Ýxž²Ü÷_Ê¥yZ*/å=çΗÌ{Ó»(½ü—ÿe»¢¤)öÿé/c&¬ñ–‰KÙ] XפY°â³0µòE)c»¢¤)÷5Ó|Ì,õðŸÏÖ‘û¢q¬ã”¹Œ$‹V¥#Nœì6‘ÊË/™XZ›î%a@p<dH™¢dQ¾˜×*qlW”“tä¾)xÍÊÈ}Ñ{w›÷P›»X”܇ڤ VÕ|póݳõS]º£ùír€dàxè“]{Û•2ê%ŽrÇv9ÙKzîkÆ¥y—SŠgJsÉuù%O<µ6‰ç  M‡®Týù÷ΫٸÇv9@’p<dAYcžf«ôQÙ.'ÉÍ}Ͳ4×ÒŒKõÿã—g&ú¨@šœî:;iÚº¼‹£SÿÁÓ*W5Ø®¨oš íG:¿ûãWTù€Â³*6ë]°]0ÙQâ(w”>ê %‘òÈvE}“ÐÜ×üJ³,U®—æ]ä>€¸Q|ó;ËÌÕ Ÿ¿çÙ-­¶+ÊTâr!éA Äǃ@.”>ÿôÕ$ž–L\îkN¥™•™b]Jîˆ3ÿ¥ÃÃD YÉÊ…š{òï—è u€˜àxÈ]o[HPî'÷d;ÇU®j¸!9—4$%v4JÇü@Lp<¥ª¶)AËš%"÷ý7ãhNUñâ»¶+€¾ñßò|ãí±¾å9þ¹²…¾˜àxP‚{ÿÜOÁb}`\²$rSóÿ±]ÑÄ9zΟ¿lkÊ Äǃ@à”ûJ+s*XùÏÇ£Ç9÷5Sò?Ì‹Ü1djlsAÛ­°xj:²¢¾a¿ír€´áx‰2KÉ¥þRŠ)Ël—s©xæ¾fGš#™É’fM1Ün£™ 7õ+(Ó(wý­¥eÏ¿Ÿs†1Ì…–Ö£#[©ª)_¼z[|¶&¡R~)ÅÔeJ4åšírþ.n¹¯”×¼H³#U¥™’æKä>€´:ÞÙõð“/ê–Î}Ý4´|í†Ý¶+úH¬rA›hJùzÅA^~‰¾ÐmW¤ǃ@ؼPÓ¯ø„Z¬r_s!͈TfGš#Åd@¨vím7—Aê×WFüÒú9ÃøäÂòêíÞ©Ôæ–öËRŽãA J4ï¢%írâ’ûšÿhd¦Cšivd·ˆØÚ »ÿù+?à ±8ä‚w«EAÑóÜ2DƒãA JJ·Áߘ‡›â­ç¾ÿr©ºãç1¹\ ¢×}¦gêœ:sÁü _,›·d‹•2ìæÂ¶Ž±“~í-Ŧmb¥ ÀASÆy‹f+û”€Vʰ›ûšíhÎc–SÐ,ˆÜ€c§Ìe$¶Ô²• Þ£šôÝÇO­‰Û²«@êq<X¡¼›ðôkê>[Õµ•ûþåÖÿíÑä>ømßyÐ{àÎð_ˆòœ¡•\¨ªm4|®¾oÑØ¥;šEù­)û”€êA¥¡21Êo}îkV£¹÷8fÍy"ûÖ,+~óÞ€Â-¯Ë/y⩵§»ÎFðM#Î…÷vµ ]i°úÑ|S—ãx°îÕõ»ÍÙQ%£ò1šoeîk&£ùŒf5úŽšá,}¹1‚o ‰¦‘sÒ´uy9+W5„ý#Ë…ö#ã§Ö˜ŸkVÅæhŽv\ ǃ@( •‰æl°RRYöwŒ,÷5‡1?—f5šÛû¹¶ö¿zWVü¯¯?ê•äB÷™ž9‹ëM(Œ›\mëz~ñ¡ÜW>šS¦JÌPWY‰ ÷5oÑìÅÊ]0&[[?ÏÇÃiñ#ËC:gv.ÔlÜSPô¼¾Å],jlâ– .8âF)in©Pn*=Cú.¡æ¾æ*š±˜©Ëg‡ÍÑL&ŒïNùheæ‹‹pæå—üdÖúÀφ— Í-‡¿ùezñ›ïž‡'ððãxˆ'%¦rSí© U’þú!徿'š¥˜^4o±õ-H¥'»Ÿxj­yrë·Ï\UóA€/F.ë85±´V¡Ð¯ ìgÏnŒ~1m×Äñ [æ‘LÊP%©ò4ØG3„‘ûš™˜ç*j®ò½Ÿ¼Jî@ZZÞ9j‘¹ã_бko{ /l.ôœ;¿xõ6 c&¬Qͼ,€Àq<Äœ2TIjN+[•°¼l°¹¯Ùˆæ$fr¢Y ¹a««ßwÓÐr3ðŽzü¥ÜϘ ª­°x^M¿ozçÃÜ_@x8¡¾a¿—­ÊÙÜ_0¨Ü× Dó3!ÑÌ$úÜ€³zΟ¹pS¿‚2Àú]_çrÎ0\ðÎaRà9LááxH sí6korÏý`ç!€ìïìúßÿ±Ú;/·î­ßg÷:9æÂ‰“ÝSÊ×{÷8¨ªì^@Ä8’E ûƒé¯›{ó•¼Yߣ—cîk¾á]§ôíñ«È}°k×ÞvsIÖ×íç’ Þh#[ÆhÂÃñ DJ[en.kwgûþu 4÷j@îªj›¼u½ùÑoútÎ0»\x÷ýCGV„ýŒ$ááxH®uoýÞ<ÛWY¬DîÓ¿Í"÷5¯Ðì"¤uÎè>Ó3uNÝõ·–öõ¹?}Í…mã&WëŸ (œ1ÙÖÀŸ‡ ‰¦üU ›³ÁÊe¥s†ÿ°¯¹ï²fä>ÄYû‘ÎâG–›k9n¾{ö–ÆÖkþ“Ìsát×Ù™ 7õ¿ ã§Öè{Q2;8R@Y¬DV/+•ÑJêkþ“Ìs_³sWˆ~ivAî@Rlßyð–gðá¾Ðû9à s¡ª¶iÐð¹ú›_óÂŽæCÖ ÀŽÔP.ßûÐu´’ZyÝû_Î$÷5sÐüÁL$¾0|®æÖ ˆB媆…34’_—_2iÚº«3¼f.ô)e$ǃ@Êxgn•Ú½œ¹í=÷5[МA3scˆæ¡Õ Fõ‰¥µ½ê½ä‚ÿ*”éóßÎä*IÁñ >™ÜÙÑKîûÏ$Oxú5rÒÁÕÇm÷=wÉUWÌ…¬ïRiå­ü¦¿|å·+æ¾æš!dx§ ‰67ìÿÌ]Ϙ¡þþGW9vÒü÷ËsÁ¿ŠõÖí´T/€pq<¤›ÿÉPJvï¿_’ûšhV`¦š'¼ý»ÿ¶T/ ÞªÑ×ßZjVöçBîO¹.Pš›5B•ïJù ¾ãÁ¬ŸTH´'»~òe全ÿùl¾øÍowý`úëyù%ý ʦ”¯?ÞÙe»Láâxp„r_É®|WÊ+ë•øê}¥¿¹+DóÍ È}pMKëÑ;G-2ׇè×ÿø—éú}ô÷Wé¿Û. @8œ¢|3a—øæ×Бä>¸ìç¿ü/³ú¨YžšÓƒ€;8\£”72+ˆj`»"€5ÞyÂøÒGç ó.ö+(›¹pSϹó¶«:Žw(Ù•ïJy/ñͧ„š ðù ¸æÄÉîÒçÞ4÷L,­ýõë;•ú}Ôã/}¼¼ØÏÔÕï³]&€pq<8B™®d7¯¬÷r_s³n€fšØ.o±¢±K/YgL_ïÚÛþÅ‹OšÐ¯;G-âœ!b©ç_+  èy¥ü…Oæ¾fßüÎ2Ö466ºÒ$BÍÆ=Þ¿üùƒ«j>0kŽ]—_òÄSk9g¤ǃ@Š)»•àf‰eº’Ýû_—ç¾fæ¹Ãš'h¶`£^@ˆÚÚÿ:nrµÆù…3fUlî>Óãÿ¿—ç‚èïühææƒOûŲßE[2€Ðq<¤•RÛT4v©FòÏ}mNUmSïùš¹`T®j0kSçå—Lš¶Žs†@Òq<¤ƒY¹lnñø‡/MW^÷þ÷3Ì}ÍÌYeÍ(4¯®^@ˆŽuœšðôk½ûž–áòÑæÂ…OÞœ> p†ÿæt‰Ãñ ÊbsWHæKÀõ)÷5—èñVDÍ.4Ç¢d@(ºÏôÌ_¶Õ¬ úÐĪmþÃÌsÁÐ+ßóï‹Í)·Ý÷Üö,D$ǃ@¢)•Â&އ® 5÷ÇNúµY§T3KV§ÄA]ý¾Áߘ¯±zèÈŠú†ý}ú·}Íï;~殿?Ü–s†@âp<$”2WÉk"XY¬DîÓ?Ï.÷5»ÐCÿPó¾~G@xš[xl¥ÆçCÊUÕ˜Å+d— Ƽ%[ú”éŸ_kéÔ9uœ3„ãA q”³J[e®šWù;gq}/’Kî/¯Þ®ù†þ¹æšdñ € ïìšR¾^q _úBÌîurÉSÆÃO¾ü©[>:KyÓÐòµXˆ HŽdQÂ*gÕ¶Ê\%¯ÅÜdúÈÅâÕÛ¼tøðϹ¼T޹`´´-,^`®]Ñ9– I¡T 0dƒÊ}ïò$ÍIry)@Ÿxð+¹€?\0‚:u ñÆE8æ¾æ!æ@5‹å }u ­cÌ„5/ð`.HϹó¹ßÚ 1§ ã&ýÀsß[Þ\³”Ì—9dÎÿ ‰¥µÁ.æl.9.} ±ê"Þ!徿'yù%™?þ¡ªÚ¦›ïž­¡»hìÒ͇ý0rÁÈúÑH"Àñ CÊJ%f¨ù /÷5KÑ\E/®y‹f/¿>¸¦±é  …AÃçÖlÜÒw /ŒU5üÏ/Ïз¸.¿ä‰§ÖrΈ ŽXQ>*%••jÌ…3”ž!}£°s_3–ü{ç™SÁšÉ„ô] ÝÚt>þÓWM"̪Ø|ºëlxß+ì\Õ?iÚº¼‹÷_š^¹ª!¼ï Cñ¡dT>ª%••JÌä¾f/šÃèi>£YMxß RÆ?„Ž›\ÁA.úYî{øWæ˜Ïßóì–ÆÖ°¿#€^p<ÄÒP™hÂñÞ‡–¤,÷¿ûãW¢9¹ éP³qOAÑó_bY.þà+~d9ç [8ìR*£?Mqî{7¿h†ÞÍ/t»ö¶{·`¯|åý(¿uĹ`,\ùÎ —KÍË/ùáô׃ZC@æ8lQê)ûÌmJÃ_,û]”ßÝJùÀ[Osž(¿5Äœõ%š­äÂ…OÞ8ãí3ûqÀq<X¡¼3O복̚ÅÜ7ÏÒœ'ð‡g@õœ;¿`Å;Þ#\[ZZ)ÃV.ûÿô—;G-2WË=Ï9C 2SÆ™»BôKÙçlîkÎcNk¤¹•2Àººú}…Å 4Þñ­…õ û-Vb7ŒP¼ àŠ8"£\Sº™˜ûÌÏ(õ,‡Ü×ÌgèÈ •¡¹Ý­Ñki=jBaàòÅ«·Y?3‡\¸pñÓÒ™ 7õ+(S1×ßZ:}þÛÖ· nP–)Ñ”kj7eœ’ÎzºÅ'÷5 Ò\Èœ ¶õi)Déxg×”òõŠƒ¼ü’Í|C´]ÑGb’ †¶ÉÃO¾lΠÞ4´|í†Ý¶+R‹ãA lJ1e™ µ‡&V‘û—3S#Í‹4;Ò1ÙD†åÕÛ?ýÕYG<¶²¹å°írþ.V¹`ìÚÛn.¦Õ¯¡#+8g„ãA ¦Gs3ÍÐ4O³]€4{kK‹ ý®¯m—˜4å‚¡Ÿå¦¡å&¾¿=~ÕñÎ.ÛqÄñ Ð e‡ÄD‰2eÝ[¿·]Q`Ò—û›Þù0•34ñ‘î³OéË… ?ɹpS¿‚2ýhú]_§ì]rÇñ pE©O´æ~ú®à'Nv?5{Cº¯NOe.Ç;»F=þ’wv7•?#5ŽËù¯0Q‚ûÉ¢ÜOÓ ¬sdõªç‚‘Ê»?€Üq<øùï@ÿ—â_¤øôÔç¾æl#[™‚àXÔØtpèÈ Gžn“ú\0ü«Ã}ï'¯rÎàx0”ÊwV¨v$÷Sð„hVhë7¹Z£Ç€Âó–lqáIvŽäÂ…‹Oúɬõéxz;Ž Ÿ|‚­2‚ÜO½›z5£ÓÏ«Ùæx¶+k§»ÎΪØÜÿb(ŒŸZÓ~¤ÓvEq' ½³Å,7W}vØœ-­¶+ìàxŽÓø¯0q \ ÷ÓJï¬æuú‘5ÇÓLOó=Ûˆ£ªÚ¦AÃçj¬6ºrGó!ÛåDʵ\0¶ï<ø¿¾þ¬™ ðÎÂAÂYó5ò›P(lW)7s_³;Íñôƒk¾§YŸírĈƇ¢±K]ÜÌ£rUƒ¹Œ$/¿dÒ´uœ3„S8„ƒ4Îk´77hüW خȗsß;ÿ¯¹Ÿkçÿ\îȱ“Þõ¥Ï½é챀˹páâÜà‰§Ö^÷·¹ÁÒ—mWD„ãA¸fÅoÞ3ç5ækä'÷mb‡ÞwÍú¼ûƒ4´] ºÏôÌ_¶Õ¬6ÉýÅŽç‚á¿vè¶ûžsíÚ!¸‰ãA¸C£ºÆvî0Èý ¾õ5ԜЅu„x4zë×7ì·]Ž}ä‚§®~ßgîzÆLþíÑ©| 1àáx.ÐHnE§_á5ÎÛ®È>rߣy ÷|16àïù¤Ÿþê,žOê!.ñÑÚã_,Ó6¹þÖÒ©sê8gˆ´âxé¦Ñ[c¸Fòž1ôÅ2ž1ä!÷/¡9¡f†Ú&š%j®h»¡8ÞÙõ£™oäå—ô+(›R¾^´]QŒ —Óòð“/›gÿÓ?_»a·íŠ€àq<ˆÓ¸ýÏ_ù¹öpäÏÉ}?rÿrÚC4?Ô,QsEÍÙa€4é9w~ñêm‡”kèõøK-­GmW;äÂÕhoùʈ_š«Œ ‹ìÚÛn»" H"•4VkÄ6C·ÆprÿräþÕhoÑ\QGóFÍ5‡´]€\Õ7ì¿ã[ Ídž[®†\èÝÚ »oZÎIf¤ǃHÿ¥·¹´ãjÈýÞiÆhN)hÉB@rµ´3aY6jÁŠw8ÃÓ ráš´ÿ”=ÿ–¹ ¥_AÙÌ…›Ø£"M42k|6·~kÄf”î¹MÚ4{4 Ñk>ɧÌ@²œ8Ùm+“—_2±´–%"¯‰\Èö%s ‹Ô!8D:ø—†Ö(Mî_¹Ÿ!íKšIj>iT­¦íŠ\ÛÊWÞ¿ùîÙåŠÆ.ån¯ ‘ }ÒÔü¼‡XÝõÀ¢ýú‹íŠ€,q<ˆ¤;ÐÖ¡qØ{t¬ÆgÛ%¹ß'šOjV©-¦¦æ™¶ËpUM‡®4O©Ù¸Çv9IB.daUÍæ2’ëòKžxj-ç ‘D"¹4êjìÕln јl»¢$!÷³ ¹¥yzµf›šsÚ.À'´é7¹Z: pƬŠÍ§»ÎÚ®(aÈ…ìhO›4m]ÞÅÙÈ ƒ§U¼ø®íŠ€¾áx U¹ªA£®ö^À‡Éý¾"÷³£=MóLÍ6µõ4óÔüÓvE>јÿôU3;äB.´×}ó;ËÌÕJŸ¿çÙ-­¶+2Åñ Gc¬FZ3äjì%÷³CîçB{æœ| ÄAÍÆ=ƒ†ÏåƒûÜ‘ ¹óOQŠÆ.eŠ‚Dàx ÂÉ·‘û¹ónSÒ\”Û”€èíh>äÝØ[UÛd»œÄ#‚R¹ª¡?—0!98D"ø/Î׫‘ÖvE‰GîE³PoCÍNm—8Á,ük…ƒB.È¿ÄÁ?~™%k"þX¼+ ä~€¼Çœi“ò˜3 TÝgzæ/Ûê=ô@[‡íŠÒƒ\Ü%K oßÉṏ#Žgïïnó?܇ܹ8ퟚšÕn5_Õ¬ÕvE@ÚÔÕï+,^ .:²¢¾a¿írÒ†\ HFÌq<ˆxÒh©1Ó žE5–Ú®(mÈýhŽª™ª¶­f­ì·@PþðáŸG<¶R5pHùâÕÛl—“NäB¨Êù_ý Ê´…¯¿µô?Ÿ­ë9wÞvEÀÇ8DÜh„,™÷¦FKí™95~Ú®(ÈýPi¾ªY«¶°f°šÇÚ.H°ã]SÊ×+ôK_è¶+J-r!lÚ{~òåOÝòѹ–¯Ý°ÛvEÀG8D¬hlÔ©}R£¥ÆLr?<ä~ؘĹûUU£wj¥¹å°írRŽ\ˆÆ®½íæ²gýúòý ZZÚ®®ãx1¡ñðŽo-4ãÆI–¶+J9r?šÁz¹ifk» 1¼K¯c>—^Gƒ\ˆÒÚ »ÿù+?ç8â€ãAXç¿|Bc#—ODƒÜ’f³šÓ²‰mM¬bi¦è‘ Ó¾=uNwƒÌ¼%[lWGq<»4úÝðÅo¯Ö¨HîG†Ü˜‘|ÍuY,¸œÿÑ-ž~e#F.X¡ý|ä÷^d=XÄñ lñ/¿¬‘ܹo…ösÍryˆ6p¹ªÚ¦Ï}mŽº£hìÒ͇l—ã"rÁ¢í;zغçßsÎQâxÑÓ(7üÁx<«]ä¾EšëjÆ«í¯Ù¯æÀ¶Ë,kl:8lt¥:bÐ𹯮ç–kÈëV¾òþ€Âz®Ë/y⩵œ3D48D”NwÕø¦QN{F<{¶+r¹o潚ýê]ÐLXóaÛå´é?µÆ$¬ŠÍÊÛ9\ˆuÁ¤iëòþ6Sª\Õ`»"¤ǃøÿÙ»ﮪ;ßÿÿC‰Cë½Þѱ®©ãm”ÒR[Q¤JýÊŒôV–)ºd©­E;ÌBZ­-Œ†_iP¥P~HÑ J•Z~¨ Y0ˆA‘Rj®¤Hœ@¡Áð#ß—l»ç!|~œsö>û<‹Å¢’Ï9g¿öûó9ç½S£9ͼë¥YNs¹ï¹ï]Z›ëB«b­]HIÇ‘N{òßyÿ¢æ–O\ä‚GtE|çÖ¹æNªK®²~ãG®G„Q"6ïÒlf¦5Íoä¾È}èŠÐzØ~DBW%¯nåû½>Á‡ã¾!|³¦¡É.ŸÝ5÷ ‘êA$Js—f0û—f6×#ÂgÈ}ߨG¨´NÖjÙõp€DlkÜmž½øšGç-Úàz8ørÁOŸvb?Ùt·¢²êç5¿ç=CÄŽz Ñ|õ‹IËÌ ðšÇØUÇ7侟´BÖ:Ù´XÔÊÙõp€Øìk=4rì…BÏ^ãh®ë'rÁ[º^î½ØìÔ|þÕµu]A¡D4S™}Ö4wÑ ËOä¾·ÌlZ3kå¬õ3[± ë:Ÿùì[&†Žx¾±i¯ë¡kä‚çtí\=x–¹çê«ÿ4mËö×#B ¨/ÍN_»ñ×f²Ò¬Eî{‹Ü÷œ®­œÍ[ÁZKkEízD@)VÔÐgÐtÉú½~ý×ÃAwÈ…LÐ5õ÷}'™…ÖàáÏñž!ÊG=ˆ¸hFÒ¼d&(ÍTš¯\Ý!÷3Aëg»–æšB¶46íò“Z½\Y3gÁÛ¼§á?r!+t5UÏXÕ³×8¯¿¹|¬þÌõ…rP¢|ÑyI¿3/e¹Ÿºš´–ÖŠZÇK«k>s‡ÿö·µ?X³ÌÜóüÓ ¯êº B.d‹®¬ŒX`Þ‡¿°oÍâå[]YE=ˆ2½²r›f!3i^"÷³‚ÜÏ]YZW›^Zis¡Á[¶'ÒMwϧ'R¶ Y´e{‹¹„çtP2êA”,ú\³æ"žkÎr?‹´ºÖ›^ýðÓÚ ê{óL³gÊÒ7þàz8(¹]/¾ºÙöñ6êEúø¡(Ôƒ(æ™;~¶Èö=Ö,äzD(¹Ÿ]Zi›½¼µöÖ Üõp€;›[1I„iO¯e´Œ"2M×ݘÉ+ιl,û|¡XÔƒ(–ÝUsŽfr?£ÈýLÓu§U·y7Xëp­Æ]9u¸ýè„iož{2îSײ§ÍõˆP:r!ºÝ5ÏÜ»uñ5®¦©/ @=ˆÂ­ih2O…è—fr?ÓÈýèÔ \ÇQ«q­Éµ2w="äËÂ%›.ð˜ÎÀëo›ûÞ¶]å"‚±aó®Êë§šÛ€[Ÿä=Ctz…ÐL¢ùÄL,ša4ϸÊEîCëp­Æu4µ2×úÜõp :ë®ú$g]`È…ÀÌ®]^Ÿ‰:¦=*«FŽ]Â{†8êAtO³Ç¨ñK5“è<Ѭ¢¹Åõˆr?0ö“­Òù¤ɉ~*]=c+Ì áѪJUºG=ˆnðÎRÀÈýðè Õúœ'¹óÔª žZ ¹*îòB÷¨Ñ%Í—ßð8wžŒÜ•íô¨u;—º•ïÛ®¶o½»Óõpr!l«×ï  ºD=ˆSìÙwÎTy@î‡M+v»œVò®‡ƒ c×Ëü ò€.ñ8õ ,v®Ér?´z7ïk=¯U½ëá cö·µ»¤¢²ªg¯qÖ,c‡ëà‘ 9¡kyبÙEõ Œßý~‹ÙËLóƒf r?xä~NèZÖJ^ëùŠ“Ok…ïzDÈ€ÎcÇç,xû‚+k4K ñ|cÓ^×#BÈ…\Ñu}õàYæ~°>ƒ¦oÙÞâzDp†zš4˜ A3¹Ÿä~®èºÖª^G\+|­óµÚw="økÕºM(è÷õ¸ÒC.äÐâå[/ì[c?±€÷ ó‰z0ÏtÕßúoÏ›I@³æ×#BzÈýÒÚÞ®óµæw=xǾopþÕ¼oCäB>éJ¯ž±êo.ÿôq¡ž½ÆéÏ\ûyC=˜OæÚ×U¯£¯€k?‡Èý|2÷š›Ã¹ÖƒMYiï+Þ×zÈõˆà¹gºêÎ|Fð÷}'qo@®Pæ®ñ‹®šd.y]ûä~>‘ûy¦«Þö QÀóÂ9gûÝxÇÓôÊ3r[¶·|õŸ¦ñ QÞPæJôÙa]ï<;œgä>´ò×úŸ}ò¬aÓ®~·Ìb_äŒÚº¶Çà=£óžað¨sBײ®è•UæÁ]é®GÇÈ}vŸqÕª\)ÙÙÜzçý‹tÜÏë3qòœzö à rš~^óûŠ“ëFö õ`<ñÔZ³÷¨®k]Ýä>NûˆÐœ Š@uN Õª\ :Ü~tÒÌÕæpß;¦®eO›ëÁäN¡ùaÐ]óÌ}e—\;eMC“ë!ÔƒaÓ•«ë×\Ⱥ¢É}Xä>N¡ùAÕùÀHõ‚ª×#Bü½¶ùÒé(÷2û-Í®‡¿ èÒúÙÅäwnÛÜò‰ë!fÔƒ¡ÒÒN׬}KGײëÁ/ä>º¤A•‚Î U ª\±yoÛLJ=eŽìÂ%›\>"ÐÙµëÍ}•U£Æ/å=ÃP†GW¨®SsË·®\]¿®G‘ûè†êó)’*Õ®‡ƒ²ìk=d>ù=·÷ø±¿Nkœ ¹€îE›Qh…9ÿ¥w]ñ  LmÝFóî®VZB¡ä>º§ÙCµÃ¹'=V5ÁÆ4YÔq¤sÚÓkMŸÀa£^äÉPt\@!4“\ûƒ9æ´Ëox|Ãf‘eõ`0t=êª4—§®SrÝ#÷QÍ$ª#L_bUt£Êõ˜Î±}ožY¿~‡ëá ÈN3Ì—ú=b–7ÿøYÞ3Ì4êÁè<ü9sIêÚÔêzDÈr…S5¡šÂìRÇ ã¿m»oº{¾Ž×WÖ°³$ G. XSç®éÙkœN›s.;fò Þ3Ì(êÁLÓu§«O× ¢®Gv‡AáÈ}K•…ê 6ª5Tq¸º°¿­ýÁše•UJýAÿÓõˆ%äJ yæöû^øÂW>ýTâï¾õ«ÅË·ºŠF=˜]ºâ.ìûéÚL× ®DrE!÷QSn¨ÖPÅA¹á•ÎcÇç,xÛìM{]ÙC. dšs¾ñÝéæ^µ>ƒ¦oÙÞâzD(õ`mkÜ­kÍ\tºúÈ}”€ÜGÉ4çØÛUƒ¨q=¢¼³7ô*¸¡%#P&>ªÈ(êÁl‰~(¯+ŽåQ2reRÝaÞ˜¢]‰C;>úËÐÏÛ†?Ôæ(¹€òiú÷)ÿý(SÍoþÃõˆpvÔƒòȬÕö¡]]kä>ÊAî£|š…ìvªJT›¸QŽØ A**«FŽ]Bs?”\@\hu˜-Ôƒ™mê«ë‹ÜGùÈ}ÄE3’êU%lwžšÚº_ó¨.áÞzoÛÇ®‡ƒ@ ˆWt+´~·Ìb+4oQzN×Î5ߟͦŸˆ¹x©*Qm¢“JuŠª×à Væ]ý‡| •×O­[ù¾ëá (ä’ Dø_ßøô6’•U÷Œ^Ì{†¢ô–®]5ºvt€t±¾B¼È}$AŠêZªYT¹¸NPZö´ýèç/éµ=¯ÏÄI3Wn?êzD ¹€„h¾5~iÅÉ5í¹½ÇÏ®]ïzDøêA?éJùÛ¯MСѵ£+ˆÜGìÈ}$Dó•ªÕ,:ÁT¿¨Šq=¢Ìã%E:È$Js—¹D¿.¹vÊš†&×#Âg¨}£«C׈¹XtÕûH¹DñaV\øÈ©!‚èB÷Æ;žf¡ëêAèŠt×<Þ6A:È}¤€‡ÝÊÁ#™H¹€ÔÌ|ö­/öÏpž ôAÇ‘N{[µ®]#®G„ð‘ûH Í0‹EËV8A. MÑFç_A£ —¨Óùovï¢íÒDî#Ml–W ¶t„CäÒ§Y®ß-³l#ýMÛþËõˆòˆzС-Û[¢Û²ûH¹ôi–ScÞ VÕ£ÚÇõˆü²¢þƒ>ƒ¦ëõé{óÌúõ;\¹C.À6Úv‹zÐ ç:ÛÍi¯ó_Wë!wÈ}¸¢JGõŽN?Õ>Ì~FcÓޛ×ä‚+kæ,x›JN pHó^õŒU={ÓIxÎecÇ=ñ3aj¨S¦s{´7užëe×9¯3Ÿ³NûpHóžªÕ>: U©r="gö·µ?X³LqPQY¥?èºò‹\€sšo¿ï…/|åÓOL.ì[³xùV×#ÊêÁ4é¬Ö¹­\ç¹Îvr‘ûpΔBªƒT 峚·hƒ-Š·5îv=ä¹OlÙÞbnž×¯oÝô›<¿g˜êÁ endstream endobj 145 0 obj <>stream tèL6÷G™[¤tž»òŽÜ‡'TÙ[%U¹NJìM³½>ÁM³ð¹¯,^¾õóW|Œ’êÁ¤E?øÖYÍß𹯨&Re”‡V*;›[‡zÑ6Õé8ÒézDÀgÈøF3ä˜É+ÌcV_ü긩s׸Q˜¨¥óÖì¶©3Yç3¹ûðfH»Õ‚*&ÕM®G3»é†~À{ÇÔÑ@¾!à'Í–ÿ÷‡ÏІ19Ôƒ ycM£mœ«s˜Ü‡oÈ}øI³¥j%œmžpɦK<¦Ÿkà°§ÞÛö±ëá] à³ ›wÙmÚÜúdxï:D=;Ÿ:KíÆš:{]蹟©bRݤST5”*)×Ã)Ë;[šû™m~–E¯mv=àŒÈøï©Îë3Q'jʪ{F/>Ü~ÔõˆB@=#“ÿúÐ+:?õ’ê\ÕëzDÀ‘ûðŸª'ó™šê)UU®‡S´–=mæ³N%¤™«Y·Àsä2Asé¨ñK+þºÞž]»Þõˆ2z0.:Íû:?u–’ûð¹LÐ\ªJÊÌ®ª­Ta¹QA:ŽtNžSo†}çý‹¸¯ ™@. C¢÷ãýãuS¸¯ÔƒåÓhÞÁæ~fd¹ ѼªªÊ¼¬:ËóÞ\u+ß7½RûÝ2«aKd¹€ÌYÓÐôý'›Eø »æeå=CßP–CgÎ=sêlÔ9ézD@¡È}dŽj+UXfÏ>Õ\®‡Ó…m»o¼ãiðâkÍÏ^й€Œ²ýü+*«~1i™çïzˆz°4f?së²Î@öCAæûÈ(ÕYª¶töªòRýåz8ŸÙ×zhäØ% …ž½Æ=4ee0mQ‘+ä²K³îñ²Ùïûü+ªkë6ºQ–P–@ç˜Ù!KgÎ=rYDî#»4ëªæRå¥úKU˜Û }:Ÿ³àm CG<ߨ´×á`€r È:ÍÀWžeîÜûú _oÙÞâzDÙ@=XW}M7§™Î7rÙEî#ë4«þ2o«"S]–þVÔ`BA¿¯Z÷aúbD. :‡/ì[c–냇?Ç&àgE=X ýmí:£Ì©¥sŒÙYGî# ªÂlE¦ê,µïk«Ñ ®¬qUñ" ÍÉÕ3Võì5N§´~ן™¥»A=xVœQ¹`˜;6U—¥sÇæƒÖ,³w«îokOôÛ©!ÍÏß¿·–OsΊz°{ÑOœuF‘û¹Àh~¶]T¯%ôd·ífsÓÝóýéfÄ‚\@xÚ묨Ï$úDªÎ"žHE`È}I5š*µ$v|xëÝ}ožéón@™È,Ú òG?‰nQÔƒ§Ó¢ó„޵¹€ÙáUÁ©Ž+ó«íln½óþEújçõ™8íéµìl…P‘ »Å õà)¢;Zêœ!÷*raÓì­ÚMœÎsUsªéJø"‡ÛVÏXuîÉP¸wL]Ëž¶ØÇ øƒ\@h&t×è¬0§‡Îra#÷‘šÉUÇéTWM§ÊNõ]áÿvá’M—xLÿöº¡O¾·íãä x‚\@~lؼëÿœœáõkÀ­O–öža0¨Oœ¼Hg‚9%tnè q=" qä>òCÕœj:ðªï üû×ß6×ü}U…Ið¹€¼™]»ÞÜFRQY5jüÒ¢Þ3 IÎëAw}s#±Î®G¤„ÜGÞ˜Ïûºÿ;ÑÏ'L{3·kä¹€ÒWòó†@¦‘ ȭ轂—ßðxÞîÌg=¨£¬cÍ=ÃÈ3r°–¾ñÛtí†?¹à¹€œ{ó?ÿß—ú=b „ïþð™}­‡\(%y«udu|ÍÖ×qw="À r8‘ä~…@æ À‰È^ç\66'{ ä§4{ŽèȲçp‚ÜGîíokÿé„W+*«zö÷`Í2ýO×##C‰pû}/ؽÈ/ßêzDÉÊI=¨ãhž Ñ‘Õñ%÷r¹Õyìøœo_pe.!?©mlÚëzD€È JéÐ÷æ™æ®Â>ƒ¦oÙÞâzDI ¾Ô±Ó4‡RÇ”Ü rùT¿~‡ ý¾¢þ×ÃÐ%rE.gµe{‹ÙŸH¿® Š\ŠÕ²§mÐ]óÌ݉—\;eMC“ë•"Óõ ^s½òæèX舸ä> Š\J-In¸ý·™+I2ZêuÖ«õbpˆÜD‘ @9f×®ÿÛ¯M°·,n?êzD…Ê\=¨×V¯°¹YW¯¹^y×#2‰ÜD‘ @™¢-Mþç7&f¥¥I¶êA½ªzmƒiæ8Dî¢È ;›[û™m·<ذy—ëEVêA½’z=Í {Í÷gëuv=" ÛÈ}@¹Ä(C[¢û_êÕÓkh^L½ªzm]¹ˆ"€ØMžSß³×8]Yç\6vÌäÇŽ»Q|®õŠéuÓ«§ê•|dÖj×#ÂAî¢È ûÛÚo¿ï…/|åÓ϶.ì[³xùV×#:•·õ ^+½b›^=½†z%] ¹ˆ"€äüñÃ?÷4ÝÜñ¨?46íu=¢ÿæa=¨×'úrmkÜízD@€È}@¹$Íϼ¼ªýÿ8¹ˆ"€téŒ>7uî×#ò¨Ô«}ÜR¯•ë!#÷Qä¯fúPf¨+ rE.)‹n¨wíæ¸ÚPÏm=¨ŸZ?{†¶k‚Aî¢ÈÀ‰Úºçõ™¨«¯GeÕ=£8Ø‘ò\ÕƒúIõóê§Öw×+ ×!å9Gî¢ÈÀ•ÃíGG_Zq²2ú_Ÿ0»v}šßÝI=¨ŸQ?©¾¯~jýìzÒüîNû€Ï#·Zö´]Û\sçä%×NY÷ÎÎt¾oÊõ ~.ýtæÇüέsõS§ó}œ‚ÜD‘ €Ö44ÙriÐ]óR(—R«õ³è'²¯~Ò¤¿#€nû€(rðǯŸþÏ/öon§| úµDw^H¡Ôø^ó{sC¬~®'žZ›Ü÷P rE.^‰¶[9ÿŠêäÚ­$]jä¿Ã†9ºDî¢ÈÀCM{¯<ËÜcùÕOlÙÞû·H®Ôh¿úOÓÌàõSèg‰ý[(¹ˆ"o}º]ûÕImמD=¨jœfÀ]5Iãñ‹ˆ¹ˆ"Ÿu;^=cUÏ^ãtžsÙXýYÿ%–¯o=hÆù7—Õ×Ôhc'€x‘û€(rðßþ¶öÛF.4Ÿ»]Ø·fñò­åÍëAG£2ûõßž×hËÿšBî¢È +¶loé3hz\ÏåÅRFŸsÔØ’xÎ@¼È}@¹dËï~¿ÅôíüÂW¾ý¾JîÛYf=¨ï;lÔ‹ƒéƒªQ•öu¤ŒÜD‘ @æté3yÅ9—5ûúM»¦„/RN=¨ïhöIÔ4’D÷I/rE.µgßÁïþðs¯æ—ú=²zýŽ¢þyiõ ¾ËÅ× Š\³¦¡)Úõ¥eOÛé§›zP_ÿÊüs}}µä‡ %ä> Š\BÕý®]Öƒ±ìdÀgä> Š\và`Ç]üÎî¿pÉ&û^¾øêf»Óý?[TòN÷|Fî¢È xM{¯<ËÜÿÙgÐô-Û[N|¾ÔÑ7ASßõ$…ÜD‘ @N,}ãö­1Eß¿ü낟²BÐï?±ÀüGý¿¯¬Üæz˜’Eî¢È ?:¯ž±ªg¯qºê+NîLa~×Ñ×ÿëz€Gî¢È oöµê?d¶ùLP¿ôgý׃rE.¹}–Ðþâ™A ?È}@¹äă÷Œ^l{šÇ‡ŽxÞöÕÿKOQ xä> Š\òÀîEXQYõ‹IË:ŽtÚþ¢ú³þ‹y=à‘û€(rÛš†¦K®bî t×¼–=m濟²ÿ þ»þ_ó×ô÷õ¯Ü @‚È}@¹„ª¹å“ïÜ:×–x6ïŠþ¿§ïG/ú;ÿxÝgÅã€[ŸÔWHwÈGî¢È <‡ÛŽ¿ÔÜz^Ÿ‰³kןþwº¬ ý}ý+ss©¾Ž¾ZòCrE.™ÿÒ»¦šëQYuÏèÅgªæº©Oœ¬(õo{üµ¢|æwï$9dé!÷QäŒ ›w]~ÃãönÏÍ­ÝüåîëAC_A_Ç|A}åSî8Eä> Š\°¯õÐÍ?~Ön_ê÷ÈŠúÎúO © }5}MóÅoº{>›×™Fî¢È Ó:ŽtŽ™¼âœËÆ~º[ÄWǾ[Dáõ ñéŽ_§¢ï¥ï¨ï[ê¸Dî¢È »/ßúwßú•ÙMþöû^ØßÖ^ø¿-¶}}}³£½¾¯¾{ñC่"€,Ú²½¥Ï éæÎo~oFcÓÞb¿B õ ¡ïõ­›~c¾µÆ ‘û8Dî¢È [¢Ò]Ø·¦äéJ® }_}÷Ò>šà¹ˆ"€ ©ùÍôìõÙC|US_ï Š\œsÒ†%µzðDÂq…ÜD‘ €C·iH³4Ú8@QÈ}@¹8á|÷ôëAC?©~^óƒëÐëò€œ#÷Qä²ÎcÇÇ=ñÆ9—ե׳׸ꫜ ÃU=hÔüæ?ô³kzª¦¾®×ÄÉ0€"÷Qä¦ÅË·^Ø·Fݾòðí÷½°¿­ÝÕHÜÖƒ¢Ÿ]¯€^ C¯‰^W#r…ÜD‘ @:›ö~ë¦ß˜û$û š¾e{‹Ûñ8¯ ½z5ÌËòÍïÍЫäv<@ðÈ}@¹$-úAØß}ëWž|æI=hè5Ñ+ãÃǦ@ðÈ}@¹$jêÜ5_üêgÊ™¼¢ãH§ë}Æ«zPôÊèõ1UêÓëæzD@˜È}@¹$$ÚHó¦»çûÖHÓ·zÐЫtóŸuØv¹ˆ"€Øílnpë“v£½ ›w¹Qü¬ ½bv[F½’inËÜD‘ @Œ·½gôâ•Uº¬Îë3ñ™ß½ãzDgäs=hÌé]½†¤^O½ªzm]¹ˆ"€¸Ì®]oꗊʪQã—z^¿ø_ž8Y_땬øk}­WØõˆ€Ì#÷QäP¾ ›wýãuSìýÍ-Ÿ¸ÑÙe¢4ôz~çÖ¹æå½äÚ)~Þ d¹ˆ"€r´ìit×<[ª¬ihr=¢Be¨4ôÚê6/µ^s½ò®Gd¹ˆ"€ÒtéüŤeæVÆ/öŸ¹ý2WŸîßÑ{¼¹)W¯¿?ûwYAî¢È µuÏ¿¢ÚìŸ~ÏèÅv¸QÑ2ZŠ^m½æzå5~ ×#²„ÜD‘ @Q¶loùú _›»¯<«±i¯ë•(»õ ¡W^¯¿9_»ñ×:.®Gd¹ˆ"€ík=4xøs¦¹°oMÖ·JÏz=hè(ü}ßIæ èèè¹à;rE.gÕyìxõŒU={ÓÅ¢ßõgý׃*Wõà‰@rE.Ý[úÆ.ì[c>ú—]°¿­ÝõˆâL=hè¸ü`Äûéí++·¹à)rE.g}B­Ï é=¡X=hèéHðt'rE.§;p°ã®~g;X.\²Éõˆâd=h¼øêfÛýõŽŸ-Êb÷W 9ä> Š\Naw¸;ç²±c&¯u‡»€ëÁ'w‡Ô±ÓÌèî@rÈ}@¹Xkš.¾æQs·á »æµìis=¢…]:‚:Žæ€êÈêøºà¹ˆ"ÙÙÜ:àÖ'Máð•ïLݰy—ë%.õ ¡£©cj®Ž²Žµë.‘û€(r9w¸ýè¨ñK{TVéB8¯ÏÄÙµë](%ù© Y_ýÈ:Ö:â:î®G¸Aî¢ÈäY´F9vI®j„¼Õƒ'NÖþ:Ê9¬ý(rE. Ÿ6lÞuù çùÂÖƒFôÞ`y¸7ˆ"÷QäòfϾƒßýá3¦øR¿GV¯ßázDnä¶4tÜuômï ®G¤„ÜD‘ Èö ˆÊy=hädo ŠÜD‘ ȉßý~‹Ý£üöû^`rêACg‚Îz5t†è Š\@ð¶loé3hº¹3ðêÁ³›öº‘¨£tVèÜ0'‰Î3®G$…ÜD‘ Øþ¶öÛF.4‹ü ûÖ,^¾Õõˆ¢ì†Î9æºèªI:£\ˆ ¹ˆ"’èS`_øOuƒzð¬tþè,âÉS†ÜD‘ Ã÷Œ^Ü£²Êt‰¬­ÛèzD¾£,Î%Ó™Vg—Î1:Ó"ëÈ}@¹€üúéÿ4»ÈUTV=Pý»È‚z°p:£t^Uœ|·AgÚO­u=" tä> Š\@¦­ihºäÚ)掾AwÍkÙÓæzD™A=X,]:ÇÌɦ³Nçžë¥ ÷Qä2J‹óëo›kçëÞÙézDC=Xiö-ˆïÜ:—· 9ä> Š\@æn?:jüRsóÞÿøú„Ùµë](“¨Ë¡³Nçž¹EYg£ÎI×# Eî¢ÈdKmÝÆóúL¤¹Gù¨Ëma¤s’FÈ rE. +6lÞuù ›ûô®ýÁœÍ­®G”mÔƒ±Ðy¨³Ñœ–:?u–ºpä> Š\€ÿ¢›ƒ©ß#l êÁéœÔ™iNQ«:c]8#rH“¡aoÂkä|Öq¤sÌäç\6VgiÏ^ã¦Î]ãzDá ŒÎO¥zUuÆê¼eßø‰ÜG&¨† ã½µŸNxUWܽcêè?o‘ ðÖâå[/ì[£óó _yøöû^ØßÖîzDA¡L‚ÎR«:cõÚêìÕ9ìzDÀ©È}xNu“ª'¥ª¤\%úqyÒ|ÒÌÕ¼U‘ ðÐ?üsŸAÓÍÝwúCcÓ^×# õ`rtÆFOàm»]øoä>¼¥ZI“駪¹å×#ŠMæ]ý‡ÌÖÏÕkàu+ßw=àsÈx…WRC=˜4>à†ŸÈ}øIU’j%œª›B}ànþKï^|Í£ú{Š· árþ˜<§>úøUç±ã®G2êÁèŽ>ûȬծGûðŽ*#ÕG:-U+Í[´Áõp’uà`ÇØÇ_?·÷øŠÊª‘c—„ñŒ$²Ž\€hϘ>êÁÔÐ ^!÷áMª‰Tõì5NUR~önlÚ;tÄóºÏ¿¢zæ³oñ8Ü"àÖÎæVsG=Û·¥Œz0eÑ 4uγ&\!÷áU@ªƒT élTe”ÏFõëw|ó{3Ì“æ¼U‡È¸rà`Ç=£÷¨¬Òø?¿1±¶n£ëå õ :Ïu¶ë•×™¯ó??o†Ãä>œSícšnéwÕD®‡ã’êâ9 Þ¾àÊO6ò“Ú|ÖÅpŽ\€³k×ÿí×&èÜ«¨¬5~éáö£®G”;Ôƒ®èl×9_qò]º\ùBîÃ!Õ;ªztªRÄ}’Æþ¶öª_3÷Í>X³ŒþcH¹€”­ihºäÚ)殹nÿ-Û³ºB=è–Î|ÿæBСëÂõˆä>œP£JGõŽªžŸNx•’çtÛwßt÷üœôÕWȤF àAwÍcì êADßÑÕÁÛ#H¹ô©º1û,¨ÞaŸ…îéÚ4ûnô½yæÚ r=ä¹€téüÙ„WÍ r_ì=~Æüu®GêAèŠÐuanŸÖ•¢ëÅõˆ2riRE£ºÆìþô?¸N6(¦=½Ö4Û¹óþEôCÒÈ$­¶n£™Óh áêA¯DÛ+éz¡½’Cî#ªbT˘9MÕ ïtkϾƒ÷Ž©Ó xnïñ¦½I§$‡\@r¶lo1÷<è×Õƒgíøè/®G„ÿF=è!]#ºRÌ%£kGWë!@ä>’¦ÊEõ˹'o{PEÃðåxoÛLJ=¥WòÒ-\²Éõp&rI`nÿQzK׋®sùè:ÒÕäzD ¹D©fQå¢sìúÛæª–q=œ@ØWõº¡Oòª"väâÕyìø„iožsÙXW={«ž±ŠnÒ~¢ô™®];º‚tŒt5éšâ:B\È}$DuŠª>ÉJÈáö£“f®æSW$\@Œ/ßzaßó¹Æm#ÒMÚgÔƒþÓtû}/˜ JW–®/×#BÈ}ÄNµ‰}Ò­zÆ*žtKŽ}*ó¼>y*q!‹Æ¦½¦˜~õ4çžüG=˜ºštM™‹KW™®5×#B¶‘ûˆ‘é„©Ú„N˜ijØ´Ëvm­[ù¾ëá óÈ”É|„ñ…¯½ºÖtÅñá;JFî#.ªDìNyo½»Óõpr‡]rå˜:wÙ7íœËÆŽ™¼‚û2„z0st}é*3çêºÓÕçzDÈ$råSõ¡D'’êU%®‡“_vŒ~tyÏ^ã**«FŽ]Â[…( ¹€Ò¼ùŸÿ϶@üîŸÙ³ï ë¡8Ôƒµ¯õ®8Û¼WW¢ë!cÈ}”C‡êUªA¬YÆžÂ>hlÚ;tÄóº®/¸²f΂·é?†b‘ (ÖÎæÖ·>i–£—ßðø†Í»\¥ Ì4]wºúÌe¨ë‘gvP8r¥Q•¡ZC‡ÎU<Ëì›7Ö4š‡Íõûªuº²„\@á·ñð+=*«Lc«Ùµë]¥£ ÀÜ… ¦ƒ®J]›ôôC!È}”@õ…­5ØSØ[Ôì( ¹€©ú³+ÏQã—²òÌ:êÁ0èJÔõXÁ»4(¹¢Ø{Ï¿¢š{3a_ë!{OïCSVrO/Ί\ÀYmؼëÿ xŒ;ÓC=’è]ܺZ¹‹Ý ÷Q Õª&l¯U®G„"lkÜm6§çΊ\@7Zö´ ºkžYdj>YÓÐäzDˆ õ`xt…þCÿÉæ‚Õ•«ë×õˆà#r…°{ÜxÇÓìe]vO~·ÌjØÄ[…è¹€.™Îöæ&4:Û‰z0Tv]¿ìƒÓ‘û螪Õìu ¥€rÁ<òsçý‹¸Ë §#pºÚºvçë»øwž‰z0`ºfôó—týšG~tE»ƒ¦óVaV ™pà`Ç=£÷¨¬2ïºp‹ÊG=ˆ¸hF2+UÍQ𩸨Âsä~¶hEmºÆi­•¶ëᙳàí ®üôaó›îžO«Cÿ‘ þ›ùì[fÿ¯ŠÊªQã—ÒÔ± DŒ:Žtjvª8ùž•æ+ÍZ®G„3"÷³B«h­¥u°´®Öêš»ï-ûÛÚ¬YÖ³×8ýÒè?æ3rÁgkš.¹vйëÆ;ž¦›4bD=ˆØiŽt×<3eiîÒ æzDè¹ï?»®¨¬b!LÛÖ¸Û¾­1oÑ×ÃA×È?iYeˆ±¬BB¨‘èYšÇx#Ë7ä¾ç´f¶7Úi-íz8@ VÔÐkàÜöì-rÁ7‡ÛÚÛ®Îí=~víz×#B˜¨‘(Í]ûµ Üèî!rß[¶‡VÎ4â@`:ŽtÚ¶HÃF½¸³¹ÕõˆðßȯÔÖmü_ß -Ò@=ˆ¤Eaif£–'È}im¬²mÔ¯•³ë‰Ø×zèÞ1uæ#¶Mñ¹à‰ ›wEÛ¶ó¶ ’F=ˆth6»æû³íF9šë\(ïÈ}¯Ø¼uP´NfOaäÁ{Û>6OE]:à±…K6¹È÷ØÖNP"MšÙ4¿™‰N3‹^‡È}h%¬õ°yÒV+d×ÃRµèµÍæüï?dö;[š]'×ȇ:ÿ÷)+ιl¬AÏ^ãj~ó®G„¡Dú™µZsN<Í{šýèŸï¹ï­~µ6ŸhUìz8€‡ÛNš¹ú¼>Íçãôs…\peñò­öý´Ø¾òðí÷½@7i¤ŒzNh®ÓŒ§yO§Ÿæ@Í„®G”;ä¾[Zñšç§´ÖJ˜VKÀÎæÖ;ï_d.ŠÉsêy~6}äBú›ö~ã»ÓÍ}S}Mß²½ÅõˆGÔƒph[ãnÍ~fÔ|¨YÑõˆr„ÜwE«\­uÍG!ZýÒ(ˆjØ´«ß-³Lݺ•ï»N¾ iо1þwßúoŒÃ!êA8ÇmNûNh}kö_ÓŠWë^×Ã<5oц‹¯yTWÊw<Íþ›©!R3uîûà̘É+ø4nQš 5ÚǨ5OºQøÈý”iM«•­^s­rµÖu=Àwv<4e¥¡¢²jäØ%ôK¹‚hc½›ü,'6|@=Ðf9Mä~jtbk5«5­V¶Zß²ÕP¸Æ¦½CG‡z~ª­ÛhnhþÔ,ÊG*±#÷“¦U«]Áj5ëz8@¶™wW.¸²†wW’C.$avíz³ž©¨¬5~)ݤá!êAxKs¦fΊ¿¾Ÿ¦Õõˆ‚Bî'ÇÞᦵ+w¸1ÚßÖnï¾~°foÆ‹\ˆ—ÝaV¿¾sëÜæ–O\èõ <ײ§M³¨™N5¯jvu=¢@ûIÐêTkTÛƒf¹@¶5î¾éîùtgй—è³c}MC“ëÝ¡D&h.ÕŒjî¸Ð«™Öõˆ2Üí¯•*ò¤ÙÝ[úÞ<ó­wwºNÈ…ò±Ã,²ˆz¢yU³«yÃMó-ûõ”ƒÜ‘Ö¢Z‘²ƒ62¥À´§×²öŽ ¹P&v˜EFQ"s4Çj¦eí]&r?Ñ÷(´.å= }öÞ¼s{¯ž±Š~%#JƳÈ4êAd”½7O30÷æ•€Ü/“ÖœZyjýÉ=Ì€ÞÛöñuCŸÔõxé€Ç.Ùäz8™D.”€fêAd—f]ͽ¶w‡æd×#Êr¿ZmjÍ©PëO­B]Àgìµyýms¹6‹E.…f êAdíí¯9™Þþ…#÷K£¦Ö™|xëpûÑ ÓÞä³û …c‡Y„„zaÐllgfÍÒ®‡“ä~±¢Ï(iµÉ3J€Ïì³½ç_Qͳ½" Á³õ ‚aîÜÐüÌ… ÷ gzš›‚èadÈÚ ²½—¾ñ×Ãñ¹Ð=v˜E¨¨ÍÏöÉnÍÛ<Ù}&ä~´†´{œiméz8ŠÆÞ "ºÁY„€Q"Hš«5cÓù¹äþYqÁØßÖn?Ùùé„Wùd§KäB—ØaÁ£DÀìΰšÉ5Ÿ»Ž_Èýnh­¨£ý”™¥#†Æ¦½C~RË“_gB.œ‚f‘Ôƒ›yòK39O~‚ÜïRô)T­y O´3dýú®‡ãrÁb‡Yä õ ò ÚR3óÙ·Ø9îä‚Á³ÈêAä‡fuÍíìgûQÑ],µJä.2 öµ²ýÇÆ>þ:ýÇÈv˜E>Q"oìû~šóóü¾¹oh¨u í®õ¡ëHÕ¶ÆÝ‡=Eç¨ùÎv˜EžQ"‡4Ïk¶ÏùsyÎ}Ëö×jþá@žÙþcý‡ÌnØ´ËõpÜÈg.°Ã,@=ˆÜ²}Ô9ì–ÏÜ·´ÞÓªþá,¥À¤™«mÿ±æ–O\(m9Ìv˜NP"÷4ÿÛ}…” ®‡“ž澡5ží®µ_ÞÞÐ={ß ™"ruß`®rf‹z8¹oPé“ûs•û†ÖuöÍÿÜÞ'  ö‚K<öò²­®‡“’œä;̧  %‚rÁôQR9É}K+:ÓG(Ï(ÊÂ%›¾üíÉæã<ô >Øaèõ ¥tPFè¢P^(5Þw øÜ·´Š3͵®£8€¢˜Ħÿ؈‡_ »qعÀ³À™P§SRØÔP‚¸N"ÂÎ}C+7­ßLÿp6P²Í­·\|ÿ±PsfîQ]R^(5LjåHxw•„šûF´¸VqôP¾úõ;Lÿ±Þÿ<-ȘÂËv˜ A=tCÙ¡1OöSx¹oi¦ÕšéêÇ»\ùíÂóZxýÇËv˜ D=œ•rÄ<€RWêÀrß°ýõZÓšÍõp„Éö ¬Ae0¹À³@Q¨)SÌ®µa4¨ &÷P—g¼õÇÿl߀š³àm×ÉA¹À³@ ¨Â)YìvJåŽë•.€Ü·lÿp­Í´Bs=9bûpƒz¦sf’QÅRÊ(kìÛÊ ×#*E¦sß²íèÀ•h«¡#žÏn«ìæ;Ìå JcOP)‰\§hÙÍ}C+.Û?<àöï²ÂôËô7YÌv˜ÊG=”Cé£ 2íË”J®‡S„,æ¾Ýšþá¼bË“‹¯y4såI¶rf¸PeŠ–'ʦ¬”'ÙÊ}Kë+Û?<[8€ü¨[ù~o_ÌJ.°Ã,/êA Ê#¥R†n_ÌJî[ÑtéÀsÑö&Ãùr&Ú›d"Øaˆõ #ÛÞDiåy{“L価u”VSYoà ‡4}E·?ð|úò<ØaHõ ;å”Ýþ@ùåz8]ó<÷èìZSeâ v8EV¶G÷6ØaHõ ÿÃËÛÜ·´jÒÚ)sà@—æ¿ô®}üyËö×Ã邟¹À³@Ò¨ä(¹ìÍ-J4×Ãù?sßÐJÉ6èÓ Êõp ¶ÿXEe•‡í‘}Ëv˜ÒA=$M)¦,óíáwßrß0xi¥Dÿp¡jlÚk·Oþ̺ÎcÇ]è3þä;Ìi¢RmŽ­Œó¡9¶?¹ohE¤u‘}‰´^r="HPýúßüÞ ¯>üò!ØaHõ óá—'›çúû–ýU«#>B€Du;nŽ<ü9çïƒ9Ïv˜œ R¦Œ³Ç)û\ ÃyîZÿhd±ôç¾)HÇþ¶öª_«¨¬rÞÌa.°Ã,àõ à„òN©ç°y¦ózж`Õ*Hk![°@jìæz]5iÞ¢ NÆà$ØapŽzp%º¹žÒ0åÍõÜÖƒZíhÍãù2ÍÉfŸ'ýÇRÎv˜:¡|LçщôëA­jLåKÿpèÞž}ïSgû¥óVa:¹°­q7;Ì^¡ü¡d´­Õ¶loIô{¥Yj%cû‡k…£uN ß²Îö»tÀc)ôK:Øaðõ à»õ’3Ñ­—R«µ†1sè%°³hÿ!³E“Ë…ÎcÇg>û;Ì~¢<¤¬Tbš[+§?³.‰]R¨µn±ýÃî¬YgZ¯Ø»,j½’P.°Ã,à9êAÀ[ÊM¥§®P%©ò4Þ/žh=¨µŠ}ò…þá ûöy}&N»&ö§°cυƦ½C~R˳€ç¨Ÿ)=•¡JR]§ƒ‡?ã=6 ÕƒZŸh•bû‡§Ùò aÓ.Û¥9Þþc1æ;ÌB=øOIªÉ³@¨Øwhû™]à;´%Ôƒ±÷.$¡´_æ;Ì¡ DV.Û'8”×ÝÿýbëÁ$z›’Sì@gÍóô:;Ì¡Bb;¼)¯§Î]ÓM‡·ÂëÁäö>$J) ,(°‚ë>Øaõ žB*¸BêÁ«K€· ¼ÃóL¹`w¿e‡Y HÔƒ@¨º¿Ã³ûz°Ø»Ož{oÛÇý‡Ìî¦Ìé¹°¿­fàQë¦L7õ` Ýi™ÐÍÑ\`‡Y ?¨àu¹CD—õ`É»W²âpûѱ¿~úò6V­ûfü râ”äO©ËÜÝ-ö ñ󯨞öôÚŽ#&Ì®‚ì0 äõ ÑûLâ+ýMÿp­èyS¿~‡é?vÙÿ÷øõ·ÍÕz°Ã,3Ôƒ@Þ(å•õJ|]ûß¹u®Ö¦¸V®‡pàÇ¿xÙ„‚~M˜ÆšÈêA ŸÆ?ñ†‰~­´p=€ ›võ»e–ù|ðÛÿ2Ç„ÂÕ¯íokw=4)¡òF)¯¬7o+ýíçƒì/ ùqú³æùÁk¾?›ç\¡ò#úü I|óü VZðü äÙaÖLûÑfmŸ±õ˜þcßüÞ %‚G=ä„2]Énú‹*ëOé/ªõ€í/ªuýE H‹^Û|¦fOÙpú3ëL«1öÂF=Ïî?¨dW¾w¿ÿ Vì?á9ë³§ç‚é?VQYe¶":p°#ÅñH õ 0e·Ùt¸â´þá]Öƒ†Ö æÝc­Ny÷9šü ÙaöL¹°e{‹)$/¾æÑù/½›üx¤Šz•R[ÙmÊ:¥ù)ÿo7õà‰“O—˜BÒ<]²gßÁäÇ ˆYQ;ÌvŸ u+ßï5ð s£)ýÇ€PáQR›Û>•ÝJð.ÿN÷¹oØîsZKhE¡uE2ãÄoEý¦‚+p‡Ù³æB´ÒÁ6¢iÔƒ@H”ζx÷ma © ­"´–0Õe!àÖ¶ÆÝ7Ý=_óöEWMš·hCÿªÀ\PÐ ÿåË… €L Â}ÛVI}Ö·m ¯ ­(´®Ð?ÑC+²Ç ˆßþ¶ök–UTVõì5N(j[ù¢rÁÞˆré€ÇÎt# €L  ,¶ýà |¬£ØzðÄ_—Zch¥ñ@õkE-3‰Šî0;xøs%ìQB.,\²É>¨Nÿ1 £¨L³ýÕÈEíQBîZch¥¡«U‡Öf÷ €CöÆ~³Ãli_¤´\°¬õoOid ¨Œ2ÛBÙþáÅn Ur=hh½¡U‡¾Â7¿7£6€$ìøè/§ï0[šrrags«ýÇ€l¡2'Ú?\ùÛ}ÿð3)³ÆxÓÝóÿøáŸc€äPY¡T5ýÃ̓{e~µ¸rßÐjÄ>Æ8ÿ¥wcùš€Ó²ÃlibÌÛ¬„6§RF=ø/‰`·4´21{ÞæP –=m?úùKÉmü{.Øm/¸²æ· âú²âE=xNjo¼‰qã¿$êÁŸßñÎûuDÀY»ÃliÊ…õôþçiå?æ !Ôƒ€·ìƒùJÒØÌO(÷ ­U´bIîMlȺ•ïW^?5…[/’Ë…h´ÛF.,­ €„PRV*1mÜh=h؇\.ðX¼¹@”¼Ãli’Î…}­‡F<üJÉÛ$Hõ à•èÆ¾ÊÍä6öM¡4´†±Mð´¶IúÛ@œ´nN'l‘ûåoON¡ÈpVÔƒ€?”ŒÊÇtJ§ÔêÁŸ/rcÙ$ BÕyìxù;Ì–&Í\xyÙÖKô?ÏsßÐÚÉnѨ5•VV®Gé8Ò9yN½«fK“‰\XúÆÌnM}ož¹vß\õ #e“é®´Rf¹Nw2‘û†ÖQZMÙ7ØýéÅ]r¾Ãli²’ ÑþcJúe¢b¡<25‹oýÃÏ$+¹oiMeÀÑ*Kk-×À.lkÜ}ãOgôžÆl傽÷ÜÞã'L{Óó{qŸQeR)‰Lÿð ÝÓ˜­Ü·ì½¸‡=åí½¸rÈ«fK“Å\xoÛÇ×ß6×ôê¡ÿPêA ¶¸òÈÏþág’ÅÜ7Ì^¦WV_¾mà oÌž^í0[šìæ‚Íâë†>™­,|@=”F‰£ÜÉî{’ÙÍ}C+.­»Ì º3Ÿ}Ë«½<䇟;Ì–&Ó¹p¸ýhõŒU™»Wðõ P¬è3 JŸŒ>³éÜ·´ú²+1­Ê\@ŽØw¥<Üa¶4ä‚}–ÿ¼>3ñ,?àêA p¦§™ížéžfä¾aîÔÒzL?ΟÔf÷N-Yqà`‡ç;Ì–&˜\xëݶ×7ýÇ€³¢ dû‡+e”5®‡S®`rßÐzL«2ÓÉAë´`–g|“‰fKX.|¤€xQg¥Qšd´ø™–ûFG €'¢Ÿ:y¾ÃliÂË…è'¹#Ç.á­B KÔƒ@7”¶¸2%‹ýÃÏ$¼Ü·´N³Ÿä®Ýð'×Ãy™Ûa¶4¡æBxOzñ¢º}*-ÓýÃÏ$ÔÜ7Ì“ž¦ý{ÖŸôàP®ºV† ÑN°«Ö}èz8€G¨Ó))‚ïZvîÑN°¦½™ÑN°\Éî³¥ >‚Ù)ˆõ ÝÕ.ì»J‚Ï}K«8­å²»S$€ôåsÞÈI.ìk=dŸyhÊÊžJC=Jå‚}ê\yázDÉÊIî[ö}þë†>™‡÷ù”&ŒfK“«\ØÖ¸ûÆ;ž¦ÿp‚z8Év¥V:ä¤+u®rßÈÕs@ŠÅsÇ9Ì»“T¿[f5lÚåz8€ÔƒÈ9ÍÿJîZ›ÃÜ7lŸÀóúL ¸O €¢Dû°Ãliò™ JÉsꕹ} DnEëeAÞê‚|æ¾ÝG,Wï8û–ZyÎ{Ÿ°–“f®ÎÕ}Âõ rHó¼f{óf`nïÌsî[ö>a­srŸ0k[ûO'¼ä³¥!ÞÙÒÜÈlÓGhÑk›]H õ òæåe[M_Íùšù]ÇrßÐ Pë@ÛGHëC×#¸àw˜- ¹`Øþc‡=Eÿ1äõ òC³ºæö¼õ?r?Êî3¢õaØûŒ¨_¿#øfKC.XvŒ}üuÛ,ø–ãÈ9êAäfò¿bú‡k†ç¦ ä~W´2´«ÄUë>t=1Ëϳ¥!N±³¹uبÍ Cÿ1Œza‹ö׬Nß0‹Üï’¹‹Ìœ0ÜEÃ|Ü“ŸfKC.t©~ýÛŒ”$êALóvïžfú‡k>w=¿ûÝÐZQ+FÓeâ¡)+ù@È´î0[r¡:‹Ì§ôCx¨$Û?\³wÎû‡Ÿ ¹V:‹´z¤ =] ›v™v‘ì,Sr¡{ûÛÚmÿ1ýþcõ c§kÓ?œéúLÈýi iv©îwË,­-]@Aš[>Éó³¥! ÑØ´×¾áÌS¨õ Bbû‡k®æÉ¯î‘û…ÓJRëI³a¥V˜<… øŒfKF.Îöã€za°{Ó?¼@ä~±´ªÔÚÒ|Ü Õ¦Öœ®GàTì0[r¡(ÇŽÛ†uCG<¿ã£¿¸P"êAdÝÎæVÛ?\33wnˆÜ/V˜æq$­9½¶Ùõp|†fËG.”ÀöcC+dõ ²ËnKÿðûåÐjÓ|¡õ§V¡®‡ä;ÌÆ…\(™};ââk­­Ûèz8@q¨‘QZ›þá,ÈKCî—ɾažQâí }ì0/r¡Lu+߯¼~ª¹]™þcÈêAdŽí®Y—þá%#÷c¡õ§V¡övez©a‡ÙØ‘ å‹¶3úÑÏ_¢2z¢yuø/_¦¡G,ÈýÙvF½>A;# iì0›r!.Z®¨d¹‚¬ D&ð†[ìÈýØi]j·;ÑzÕõp€±Ãl¢È…xq;²‚zþ³‚sC~ŒÈý$ØÅjEe‹U ^ì0›4r! µuiwÏQÂg[¶·Ð°+!ä~r´Rµ7³iË(@™Øa6äBBh‡ÏQÂOlè“4r?iZµjíJ³  ì0›&r!Q;>ú '3üD=ßh†œþÌ:Ó?\3§æO×# ¹Ÿ̶>'3P>RI¹>솇¨á>RI ¹Ÿ>ìŠÅ³N éè6Ó„¨á–f¿‹®šÄ–mé#÷]‰n¦©Õ/›iì0ë rÁ•õ˜}µxXNPÂûHµæ@©N¹ï–V¼Z÷òQÀ³þ ê8Òiû õâÎæV×#BŽP"}šåm¹¬9ÐõˆòˆÜ÷}TJëa•BްìoÈçöµºwLŽýÇ&êA¤épûQÓ?\gf<ú‡;DîûC+aÛJQ+d×ÃGÓ]?‘ ž°ýÇ.ðýÇêA¤Fsšf6ú‡{‚Ü÷ [­!'ØaÖgä‚W½¶Ù¬šú™ýΖf×ÃAȨ‘Uæ¦8Ílšß\Ÿ"÷=¤µ±VÈæVj­™Ùua‡YÏ‘ ¾‰¶ZºwL­–êA$Js—¹ž¦¾!÷½e[-iåL«%„f3\ð“íº ¥Ôä9õt]@쨑ÍWSç®1oji£S–oÈ}Ÿiµ¬5³VÎ:FZEk-ízD@‰¢;Ì>Pý;ÌúŒ\ðYæ]ýn™Eÿ1$zI°ýÃ5wÑ?ÜOä¾ÿÌBZ«h­¥õÒÈv˜ÍrÁº¦Lÿ±ïxšk q¡D¼4;}÷‡Ï˜þášµ\gDîg…®)­¥u°´®æšBVDw˜ežÉ r!ìxhÊJó™;ýÇ êAÄÅö×¥™Šþáž#÷³eEýæ3wqÀsì0›]äB†46íµýÇx&e¢Dù¢Ï:ivâY§L ÷3Gëj­®M£~žÉ…‡NÙavϾƒ®G„â ™³j݇¦g/ýÇPêA”é5v.Ò¼äz8(¹ŸQûZ™ž½f#ozöÂì0r!‹xOå£DÉì½ ôÏ"r?Ó´ÞÖªÛìé©u¸ëá ×¢;Ìr6f¹]ûÛÚí3;Ö,ã™…z%Ð<3úÑåöYfÚf¹€E¯m6ŸÈh5Î'2HŸÝaöÜÞãÙa6äBÖÙþcôôCQ¨Q,Ûë˜þá™Fî‡A+p­ÃÍFŸZ™k}îzDÈv˜ ¹»çWß›g¾õîN×ÃAP¢p ›vÙþáì…šuä~HlGG­ÏµJ§£#]m²ÃlHÈ…`˜þc¼cƒQ¢ÑÕ&ýÃÃ@î‡G+ó~·Ìâ$‡fÃF.&zGwõŒUÜÑ3¡D÷ÌÝh¶8w£ƒÜ•½£[ëvîèF\¢;ÌŽ~t9Ý*‚D.é½m_7ôI:>¡Ôƒè†í®™„n!÷¦µúCSVÚŽOZÉ»2ŒnöùA.̮访m.+:œ‚z]¢›}ðÈýà±# ÊÝaVv=$‹\Ûáö£¦½É_8õ N±gßA{·¹æ î6¹Ÿ«Ö}Èz%àý„"òÀv„8ÿŠj:BÀ „eºQi~ UûùÁý~(Ê);Ìr¿q~ ù±vßlÇø¥oüÁõpàõ Íÿ¶¸f ×ÃAâÈý¼ÙßÖN?œýˆòŒ\Èv”†A=Íšèž7ä~>q½ãLØaäBíok°f™¹à§^Õÿt="8@=˜gºê¨~Í|^ Ù€I WÈý`‡YÄ‚\@iê×ï0ýÇzÿó4nKÈ"êÁì²oÔÓ?% ÷Qs[‚ªnKp.ºÃì–í-®‡ƒ #PŽß.l0-Ó,s¨³èþÙô×u§«ÏõpIä>ʧÄ7-«QUâz8¹Ã³ˆ¹€2Ùþc´5ÎêÁláBC\È}ÄE•ˆÙ뜶Ʃ9e‡Y6C,ÈÄ"ú±Åœo»ÎŽz0C¢ÄëZs=d¹ué´ÛžªNaÛÓäDw˜þË—y©#r1ⱦ ¡Ìû .ýÃr±Smrï˜:>´J;Ì"Qäâm{8tÄó´=ôõ çhä‹„ûHˆ}¨M• µÅÅî0{ñ5²Ã,B. l‹æ?êAoE7ú¤8bGî#QªY¾üíɦé¥j×ÃÉ0–RH ¹€äð¦–ϨýÄR I#÷‘4ÞÔ*·Z!eä’ÆMï~¢ô ·Z!ä>ÒÁM率ÒG. 4Åòõ ?hÅ€4‘ûHM± G«v¸B. 5lšãêAЪé#÷‘>6Íé;ÌÂ-r)³7Åõø7Å9D=è[9à rNPòœI´XÞÖ¸ÛõpG䜘ÿÒ»_ó¨iš±e{‹ëáäõ CJ|ÛjIׂëá _È}8½%Ruëá8fo¦íýÏÓ¸™‘ pÅö«¨¬¢ÿXú¨0ýÃuÎÓ?®ûpŽ–)4ÛWÈ¸ÕØ´wèˆçÍ”8ý™uÇŽ»Q^P¦LçöÌgß²ýÃuæ»rŠÜ‡¢[*¨2ÊÏ– ÑÍ8F<ü o†Ãä|P¿~Ç7¿7ƒþci¢L“}3\çy>ß ‡?È}ø#o[®³Ã,üD.ÀÇŽÏYð¶y¤zððçøô$iÔƒéЙ<ä'µ¶8Ÿ€Ã9r¾Qed©V­¤ŠÉõpÝaöåe[]ør^ÙßÖþ@õk•UôKõ`Òl3=Ï:«9™á r~ª[ù¾j¥ðZ.³Ã,üG.ÀCÛw›þc]5iÞ¢ ®‡&êÁDé¼5téßûð–j%»%«j¨0¶dýé„WͳÍ-Ÿ¸ Ð5rÞÒiivgËmÿ±DQ&dí†?™þá:{™Zá!ržS¨êIg©*)×c‰Á¾ÖC!}܉ ‘ ðY´ÿ˜Ò!?ýÇR@=;Ÿf CÿpøŒÜG&¨†¢÷&rþ۳÷ÞôãÞûXPÆHçä„iošþá:WuƺpFä> Š\@VØþc—x,Ôþci¢Œ‹ÎFÓþáÈrE. [ìÚ»ÿÙ¬½ËA=X>× }’÷(-ä> Š\@æ˜þcöÞ¼0ú¥z°¶¸ÎCú‡#[È}@¹€Œ²½;Îë3qêÜ5ôî(õ`iL#ÓGÈ"rE. Ó6í²½ýëV¾ïz8YB=Xcvú‡#£È}@¹€Ø½¿¿ûÃgØû»@ÔƒEÑyuÓÝóõŠéLÓùæz8@éÈ}@¹€08Ø1úÑå={«¨¬9v ›õ`ö·µëŒÒy¥³Kç˜Î4×#ÊBî¢È„¤±iïÐÏ딾àÊš9 ÞëÄÖï«Ö}èz8ž¢ìžÎ{éŒr= 6ä> Š\@ød笨Ï„O™6rE. `ûZÙ'¿š²’'¿¢¨O§3Dç O¡"lä> Š\@ð¶5îþ3ä)¨OA—Z么"vç¸~·Ìbç¸Ôƒ:tV°‹%r‚ÜD‘ ÈŽ#Sç®9¯ÏDówÞ¿hgs«ë¹D=(:t&èuÐY¡sCgˆë‰#÷Qäò¦eOÛ½cêL 0iæêÃíG]Ȝ׃:î:úæÍ:+\H ¹ˆ"Oïmû¸ÿÙ:ù/ðØ¢×6»Žy®uÄuÜõãëЙàz8@ªÈ}@¹€<[¸d“© {*ouA>ëAekó>€Ž¾ëáû€(r9w¸ýèØÇ_?·÷xsß`~¶È[=¨#kîÖ±ÖÏí}¹ˆ"€‘¾"ç_Q=íéµyè+’ŸzPGSÇTG–>BÀ rðyä`Õ¯ßÑ÷æ™fßõ¸N²rRê8š}Ftdu|]pÜD‘ À)æ-ÚpÑU“t]Üt÷ü€÷%¾Ô±ÓÔÏxÁ•5:¦®‡ø‚ÜD‘ Àéö·µ?X³¬g¯q•Uúƒþ§ëÅ/àzÐ>;ÁPP2rE.gÒØ´wððçÌLs¼Ýyì¸ëÅ)ÈzPÇHGJÇË|¼«#èzD€wÈ}@¹toEý}Mï´ðêAûø§ŽWð%#÷QäpVÇŽOfiP9tÄó;>ú‹ëÅ ¤zPGDÇŶ‡ ì“\ ^ä> Š\ ´¯õÐȱK**«Ìvv¸QY¨uÌö‘:.::ùÙ>(¹ˆ"€¢lÙÞ2pØSºj.¾æÑÚº®‡SºêA½þ: ú)tDÞÛö±ëáÙ@î¢È u+ß7»Úõ2»aÓ.×Ã)E¦ëA½æzå5þÊë§êX¸%ä> Š\Js¸ý褙«Ïë3QWÐ~þRËž6×#*NFëA½Îzµ5r½òzýu\ÈrE.åPy2ü—/g±<É\=˜õð¹ˆ"€òýÿìÝŒ•w7üÿMü'Ÿ3\\åÇÌ|Ï9×ëu{ÏWçœó9×ïçû>?®«?¾Ø\y0Öj¬Û¦þ€.4}€"}&Êæ­{šèô&Í’cM¶Æ | Aèûé 0šèòŸ[ìÐ ô}Šô˜p‡ŸlüË£7rŒ5ë-Ö^TkòÀþwꊠuèûé 0Iú_8pËâøª-X¿½êr.Ö°y0ÖU¬±¨-Ö^¬ÃÔå@«Ñ÷(Ò`RmÜ´sæœ5q”Ý~÷“§.ç‚̃±~b-EU±Æb½5æûªÐìô}Šô˜l§‡î[³mzuUü/~‰¦®¨®¡ò`¾Š¦UV4Î*‚–¤ïP¤/ÀÔØ7ðJþæ×w·¼˜ºœʃ±6ò·Pc-¥.Zœ¾@‘¾Si{ÿþ®­k„/Ç5BÌ¿bYÿüŠ%´$}€"}¦Øð™‘ü䙋?ÿÃC‡O&)#mŒgÏ=?k¬“$e@ éûé ĉ“¯/ûÊãèKuq½Ty0¿Dc<úÒûûùÐ’ô}ŠôHh÷¾#ó?Çà¬ynÞºg*:IŒçÏ47žu<÷©|h £ïP¤/@rOoû]–’n[øØ¯_:<5:Åy0žW<»,ùnyæ·Só À¥ô}Šôh§‡Î®ÝðìŒÚêìS”G Nö#NYŒçÏ(+ž]<Çx¦“ýˆÀèûé Ð8ýÓ’{·dÑé‘ý“z–•)ȃQ<‹,äÆóJuæ Hß H_€F³kÏËÙG+«ó¿Ñ·cï$=ÊdçÁ¨<ꇸõÎoÅ3š¤G®•¾@‘¾é»[^¼yîÃqx~øOLÆUÚ'/FµQsÜyÔÏbÂï¸ú>Eú4¬ìÒ Ó««¦UV,_¹ub/Í0y0*Œ:£Ú¨ùË_Ý1õÑÞ’¾@‘¾ nààñEËžÊ.ݾqÓΑ7Þœ»Ø<UEmQaÜgT5OÈÝNß H_€¦ÐÿÂÚ‚õq´ÆÏíýûoü'0F=ym¿xþ7~‡ÀäÑ÷(Ò YdïÁÍœ³fBÞƒ›<˜¿wUMà{—ÀäÑ÷(Ò ¹œúƒ?ɾ£wßšm×ý½̃ñ¸ñèùw£ªë»`Šéûé ÐŒö ¼rûÝOÞÈ9&ãܧÀäÑ÷(Ò yýÓÏþ=»Æß-wløÕo]Óm¯/Æ£ÄcMöµÉ£ïP¤/@S>3²î‰ç²{.¹wË¡Ã'¯ò†×šãžãþã&3j«ããq¯·d %}€"}ZÀÑcƒKïï‹cù¦®úæ/N}Ë›\}Œ{‹ûŒ{Ž¿G‰Çšˆ’4ô}Šôh»÷ùà]߉#zÖ¼G7oÝså?¾Ê<÷÷ùEߎûŸ¸b4ô}Šôh1y‚‹lx…÷–yðšÒ%Ð,ô}Šôh=Wó Ï+äÁâ§O\÷ó«ùô)Ð,ô}ŠôhUù`Þñž‡.≠yðºÏN4 }€"}Z[ñ ÿô³Ï—_š‹W¯xîÅ?¦(˜tú>Eú”Á¥W/æÁ¿º=Ð,ô}Šô(‰W_¾oͶéÕUÓ*+¾ðàOþ¿¯nc?~Æï±$–Ç=58”ºL`réûé P*/ZöTv®˜üçÂ{~ËS—L}€"}JèkßùåÿÖ¾2Žýø¿§.˜:ú>Eú”JþþàÿÞ¹ªþsôýÁXâýA( }€"}JâÕ׆W~ý§Ù÷—¯Üzÿ#õïÆÏø=ûþ`ü×ø›Ôe“Kß H_€2ÈÏ/:ñããž_ôßxÂùE¡ ô}Šôhm»ö¼|ÛÂDzëöíØ›/¿ôúƒñ_³ëÆßÇ­R L:}€"}ZÕá£Zrï–8ÀgÔV¯Ýðìð™‘â½4†ø›G6öÇßÇŠÛÆ=LmÉÀ¤Ó÷(Ò õœ:0‹uKïï;zlðÒ¿7fâïãVyŒ{›ü’)¢ïP¤/@‹yzÛïfÍ{ô-?öy…<˜ùõK‡³šÆ½Å}NN±ÀTÓ÷(Ò eìÞwdþâÇãˆ~÷ûÙ¼uÏ•ÿø-ó`&î'K—qÏqÿW,†¾@‘¾-àÄÉ×—}åÇq,ßÔõÀU^6â*óàŸÏ_¨â¦Ñ+Æ£ÄcMDÉ@ú>Eú4µá3#ëžxîïy(ä»–o>tøäUÞðêó`&îyñç7‰ÇŠG¼èì4@³Ð÷(Ò ymïßßõ¡uqßrdžþ\Óm¯5fâQâ±â†ñ¸ñè×t[ èûé ÐŒö ¼rûÝOÆÁ;sΚؼë:îáúò`æ»[^ŒÇ›G ÙÕíf¡ïP¤/@s958tßšmÓ««âñKüóúîçFòà–L1}€"}šÈÆM;ó7æþãÿu#wuƒy03pðxþ6eÔv#wL }€"}šBþŽڂõòŽ Ƀ™¨'ªº¾¯1SLß H_€wèðÉEËžšð{N` #o¼™Ÿæ4ª½úÓœSLß H_€†U¼ðßò•['ö›3QaÔ9­²âê/ƒL1}€"}Óæ­{nžûpžó?¾{ß‘ ¿ÿÉȃ™¨6jŽ;úãYLøý7Bß H_€F³kÏË·-|,ÌYóíÛ±w’eòò`&*¯|ðkññ\âMÒ£×Jß H_€ÆqôØà§¿ôt’3j«×nxöôÐÙÉ{¬É΃!êgÏ%(žW<»É{,à*éûé ЊÑiɽ[¦ :MAÌÄsùÔßýhjB.ð–ô}ŠôH®oÇÞêüoLñG+§,fòÁÆ3¼ÁoIß H_€„^úýÑüÔ+Oþè7SùÐSœ3?èû·ü$9ñܧò¡Œ¾@‘¾I$¿4C’<øçÂE4â¹OøE4€·¤ïP¤/ÀyãÍõß{>¿tûÀÁãIÊH•3þó¿ã¹G±bmÄ:IR”¾@‘¾Si{ÿþÚ‚õqн÷#ßìá@ÂJÒæÁL¬[îØeÄ:‰5“°(}€"}¦ÆÀÁãýô÷ãp›9gÍÆM;“¿#ÖyðÏ£ï–ÆÚˆuÅÄúIõn)”‡¾@‘¾“íÔàÐ}k¶M¯®šVYñŇž‰¦®¨®Aò`&[E±~b-Å/ ²Š %éûé 0©¾»åÅw¾ome·ßýä¾WR—sACåÁL¬ŸXKQU¬±Xo©ËÖ¤ïP¤/À$É¿Wÿ<Ä0f¶÷ïÏ®Æk/íW,¡%éûé 0á>¹äÞ-ÙÉ3×=ñÜð™‘Ô£aó`ˆ5ë-;k¬ÉXŸ©+‚Ö¡ïP¤/À:=t6»¸^VKïï;vâµÔ]V#çÁ̉“¯Ç:Œ"³K4ƺM]´}€"}&Êæ­{fÍ{4¨ù‹ß½ïHêrÞBãçÁL¬ÉXŸQj¬ÛXé˦§ïP¤/À‹ÌrÛÂÇš+³4KÌlyæ·YÖŽõÜøY™¾@‘¾7âè±Áü3k7<ÛDŸil®<øçÑÏâÆžQ[}7Ö|ꊠ)éûé p}†ÏŒ|í;¿ÌâI3žó¤éò`&?WO¬ùXÿy®hdú>Eú\‡¾{ók"ìÚórêr®G“æÁL¬ó[ïüVv-Ø©Ëf¢ïP¤/À5Ù7ðÊ_}ò{qÔÜ<÷ᦾfzSçÁL¬ÿØ ñ,b‹ÄvI]4}€"}®Ò‰“¯/_¹uZeÅô꪿ø_^}m8uE7¤ò`ˆ­ðå¯îˆ-Û%¶Nl£ÔA£Ó÷(Òà-¼ñæÆM;gÎYË¢eO <žº¢ Ðy0[$¶K<ØF±¥b{¥®—¾@‘¾Wö³_Ô¬Ã$~Æï©Ë™0­”3¿xþ-¹¥`béûé p9­ý®SëåÁ?·è;¹0±ô}Šô¸Ô«¯ ÿýÃÿÒÚßJkÉ<˜958ÔJßô„‰¥ïP¤/ÀEJrÖÊ΃™Øv·ßýd œ &–¾@‘¾¹]{^¾åŽ %¹ª]ËçÁL \)&–¾@‘¾áÐá“KîÝÇÂŒÚê¯}ç—ÃgFRW4éJ’ClÍØ¦±eãùÆVŽmº"HIß H_ äN]»áÙ›ºˆaéý}G ¦®hŠ”'fbËÆö§Û:¶xl÷ÔAú>Eúe¶yëžYóCà¶…íÞw$u9Sªly0[9¶u<ñØî±õS— èûé ”Sä‚ù‹/s.(gÌä¯Ä>P¶×@ß H_ lŽx-ÿÜàʯÿ´´Ÿ,süóèç„cëçŸ޽"uE0Eô}ŠôÊcøÌȺ'ž{Ç{r^‘?—>fòóÅ^ûFÎ#ú>Eú%;y~Ýþ¤.'=y0ûC~ƒ!-Oß H_ åå×%çûÖº.yN¼H챇Ä:‰½%ö™ÔåÀdÑ÷(Òha§‡¾øÐ3Ó*+¦WWÝ·f[ü3uE D¼Tì!±ŸÄÞûLì9vZ’¾@‘¾@KyãÍ›vΜ³&vï~úû§®¨áȃ—{Kì3±rbÿ‰½(ö¥ÔÁDÒ÷(Òh=ý/xïG¾;vmÁúíýûS—Ó äÁ+‹='öŸXE±/ùÂ)­Dß H_ • <¾hÙSÙé"×ïyïì\<ø–bÿ‰½(;!mìWÞe¦5èûé ´†W_Î.'7­²bùÊ­'N¾žº¢F'^¥Ø—bŠý*»`eìi©+‚¢ïP¤/ОüÑonžûpìÉó?þÒï¦.§9ȃ×$ö«Ø»bÅžû[êràúéûé 4µ]{^¾mácÙ•ãúvìM]N3‘¯CìcÙU,c¯‹}/u9p=ô}ŠôšÔÑcƒKîÝ{ïŒÚ굞==t6uEMF¼>±§Åþ{]¬½Øc?L]\}€"}¦SœúKO›_yðFÄ^ûž—#hFú>EúÍ¥oÇÞYóõ½'Þ¸üãʱOú¸2ÍBß H_ YìÞw$?¡Çæ­{R—ÓôäÁ‰{c~:£ØKS—oAß èÔàЯ_:?S—•ð?&0Nø?äÁ ”_î$V©ËÐàô} Y ŸY÷ÄsùÁ>™º¢Ö!N¸Ø?c/µ{lì·±÷¦®šÕöþýµëcv}Ëú_8ºœV#N’ØWcu{oìéË€&óø¯Ûï~2fÔ3ç¬Ù¸igêrZ“<8©b¿½7Öpìɱ?§.šÀ©Á¡ûÖl›^]ÿ‹_|Ãeòȃ“ÍÎ Wï6ïÊßRÙ7ðJêrZœ<85bOÎßìŽ=öüXÿqıº˜"»ö¼|ÛÂÇb&PN¯¾6üå¯îÈ¿Otâäë©+"y°Ìâ¨Ï¿/£ï ”D~¾Áâ ç,3ybp>a€2صçå[ïü–ë‘‘‘Éä×ñ!F‰Ôå0Á>¹äÞ-1ß›Q[ýÈÆþá3#©+"=y\Œ 12Äø»DŒ1b¤®€ pzèìÚ ÏfÓ¼¥÷÷=6˜º"…<ÈEb|ˆQ"{á(Æ=RWÀõÛòÌogÍ{4fw·-|ì×/N]Ed\1VĈûFŒ1†¤.€k¶{ß‘ù‹Ïft›·îI]Hä bÜÈ^MŠ‘$Æ“ÔåpUNœ|=ûÄ×M]¬üúOFžË‘¹²=b ‰‘$û´¹ Ó4²á3#ëžx.»ÌôâÏÿÐ!¸2y«#IŒ'±«ÄØ#Œ³Q4 íýû³3Æßrdžþ¤.‡& rõbT‰±%»ZMŒ6©Ëàœ}¯Ü~÷“1O›9g+JsõäA®UŒ01ÎÄncNŒ<©Ë(µSƒC÷­Ù6­²bzuUüÿL]ÍDä:dÃNŒ91òv’yãÍ›væ/Ô<žº"š<Èu‹1'ÿXBŒE1"¥® ,ò/òÔ¬÷E®›<È Šñ'F!_[˜þó¿-{*?ÑŸ×ä¹ò 7.F¡ü´Æ1:Å•º"€”_lZeÅò•[]Œ'2QbDŠq)F'—=˜p?èû·›ç>S÷ù‹ß½ïHêrhò +F§£b§Šñ*F­Ôå4½]{^¾mác1¿ª|ðk};ö¦.‡–"2b¤Šñ*v­»bK]@S:zlðS÷£˜Sͨ­^»áÙÓCgSWD«‘™$1^ŨcWì`1ŽÅh–º"€¦a*ÅÔ™T^Ô¸V>jÅ”‘™>ôp5œŠ)&2eœ àrœª$äA¦’‹æ\Ä¥œIHdêÅ(c]ìx1îÅèc`êŠÒØÞ¿¿¶`}Ì‹n¹cCÿ R—Céȃ¤#^Œ{±ûÅ#aêr¦ÔÀÁã·ßýdÌ…fÎY³qÓN¯“„3’º"8G¤ÑÄ™Ÿr9FÎ?SWpò‹mÅÄféý}.¶E£‘iL1ZƘ;§K²MjóÖ=³æ=ó™ù‹ß½ïHêr`ò ,FÎ?c±4FÔÔå\•_¿tø¶…es˜-Ïü6u9pYò /FÑìµµWctM]Àe=6˜}ÆiFmõÚ Ïž:›º"¸y¦ciŒ¨1®fŸ½‘6uEc Ÿydc6]Yrïç@ )ȃ4‘WctÍ^p‹ñÖ¹¹€Ñ·covŽô[ïüÖ®=/§.®–ûä0±^}mø¾5Ûòo©œJ]L yãsþÍî·}³¸AùYìn¿ûIg±£Åȃ´¤«cÄvægàFüê7‡n¹cƒ«\ÑÂäAZX~eØÉc¹äÞ-1‹˜Q[½î‰ç†ÏŒ¤®&…ÆùÔhóÖ=³æ=s†,úöî}GR—“N¤ÝÄY© ñíÚóòm Ë®$Õ·coêr ÑɃp•¢§dW­.½&u9À‡þiɽ[¢SϨ­^»áÙá3#©+‚& ÂÕ‹Îý%ºL5Ñq¢ï¤®øó顳yƒ^zßÑcƒ©+‚¦!µŠ.½&ù1zPꊠ¼žÞö»Yóõ¸>ò \Ÿüë у¢¥.Jg÷¾#ÙüßýþG6oÝ“ºhJò ܈è>у²Ó—EWJ]”‰“¯/ûÊ£ÿÞÔõ€€Ãáe—7Š~‡Rô&—7€É3|fdÝÏe¾kùæC‡O¦®š›<"úQt¥8š¢CEŸrN3˜pÛû÷w}h]tÛ[îØÐÿÂÔå@+aEoŠÇTt«èY©Ë€±oà•Ûï~2:ìÌ9kþaó®Ôå@ëaÂEŸŠnGVt®è_©Ë€&vjpè¾5Û¦WWÅÿâ—øgꊠ¥Èƒ04/¸q7íÌ_bý?üWêr Ƀ0y¢sån‰Ž–ºhùW0j Öû Ly&[t±èe¾üWãÐá“‹–=åm05äA˜Å“cGsrl¸TñNËWnu '˜ò L™èkÑÝ\<.µyëž›ç>]rþâÇwï;’º( y¦Xô¸ètqÜE׋ޗºHlמ—o[øXtÆYóíÛ±7u9P.ò $ý.º^}Ñ£¦.8zlðÓ_z:ºáŒÚ굞==t6uEP:ò ¤]/z_tÀ8£FOL]L‘b\rïMR‘!­è€Ñ½4 @yôíØ[ÿ ’F B#È¿:ýÑW'hUû^É¿Dÿä~“º@„1?µÚK¿?šº˜0ÙI¶§UV8É64yJ~é¥è˜.½@ yãÍ ÿø«ü"¼§®¸@„½2:f›Ñ=×ïù褩+€ë±½mÁúèhïýÈ7û_8ºàbò 4¬è›Ñ=ãNý4u9p _xÏ¢‹Íœ³fã¦^Û„Æ$B#‹î=4:i§ýô÷}Æ€Æwjpè¾5Û¦WWM«¬øâCÏÄ?SW\–</:iôÓèªÑ[£Ãj¬4¬ïny1;7Úíw?¹oà•ÔåoA„f]5zk°ï|ßÚè¶©Ë€1ž{ñ·Ü±!»vÒ?ÿëïS—\yšKtØì¾Ñs}1€FpèðÉ%÷nÉNƒ¶î‰ç†ÏŒ¤®¸Zò 4è³Ñm³wGÿ.œº"JêôÐÙ×ýü¦®¢%-½¿ï؉×RW\yšTôÜè¼qüföŽœº"ÊeóÖ=³æ=hþâÇwï;’ºàzȃÐÔ¢ÿFŽ£8:rôåÔåP Ñ}>°èÛº´yZ@þ ím ó -“çè±ÁüÓ)k7<ëÓ)ÐìäAh Ñ‘£/çßàˆ~º"ZJöíõµÕ¾½­D„V’Ÿá-úõ×¾óKgx`BôíØ›ŸÝzמ—S—LyZOtêü PÑÁS—@˯~{ó܇]ýZ<­*ºvôî8Àÿê“ß‹nžºšÌ©Á¡å+·N«¬˜^]õ÷ÿË«¯ §®˜xò ´°èÝÑÁ£G7ž~âäë©+  Œ¼ñæÆM;gÎY³ÄEËž8xzLy˜$ù—\fÍ{Ô—\®Õî}Gò¯foÞº'u9@k’Is˜ü$x1·I]@pêf`ÊȃÀdË/’£‹d\ÁÈo®{â¹üÒ®‡ŸL]ÐâäA`jĬ&æ61àÄ<'f;ÃgFRWÐX¶÷ï¯-Xãä-wlèá@êr€R©3œ˜çİsž˜ù¤. ! <~ûÝOÆØ8sΚ›v¦.(y˜z1Û‰9O >1ÿù?üWêr’958tßšmÓ««âñKü3uE@¹Èƒ@¦@ßÝòbþâØ¾WR—”‘<$óŸü#Rÿ°yWêr¦Hþáù®­óáy !yH.æB1#r   >¹øó?tr- Aȃ@#ˆQ~Šõ»–ovŠu õ/¾³ì+?vñ ȃ@ãˆÙQÌ‘bPr f ÅlÞºgÖ¼Gc|›¿øñÝûޤ.àyh41SŠùR Mï~ÿ#1ƒJ]À ùõK‡o[øXŒi‘ŸÞö»ÔåŒ!)fMÙké1ÚµçåÔå\³£Ç—ÞßãØŒÚ굞==t6uE“†s§˜AÅ<*†©˜SÅÌ*uEWeøÌÈ#û³ákɽ[ýSêŠÆ' .æQ1›Ê_`w.> ÁõíØ[ÿ oš‚<4…˜Se_À‰YV̵R—0Ž}¯|øOÄHuó܇¿»åÅÔå¼5yh"1¿ŠYVv‚¾˜w¥.àœ'__¾rë´ÊŠéÕUN 4yh.Ù¼bÆó®˜}¹€ÖÈonÜ´3»|ê¢eO <žº"€k Í(f\1ïŠá+æ`þñW1K]PFÛû÷׬±(~ö¿p u9×LšW̾ò™XÌÊR—”HþªÔÌ9k6nÚéU) IɃ@SË>©ó±ÊÞóŸÔ&Û«¯ ß·f[ö©õ/<ø“SƒC©+¸~ò Ðb>³²ìL1O3=&I~V«Ûï~ÒY­€ -#æf1Cs¦w`2üê7‡n¹cCvÕ›úÙ¿§.`bȃ@‹‰yZv%蘹=÷âS—4½C‡O.¹wKv«uO<7|f$uEFZOÌÖbΖþ=fq1—K]ДN}蛿¸©ëL–ÞßwôØ`êŠ&˜<´ª˜¹Åü-†¸˜Ë=¸îç1¯K]ÐL6oÝ3kÞ£1†|ð®ïìÞw$u9“BZ[Ìâb.]Ìëbv—º  7€ò2È_çÿÀ¢o{¸œâç úæ/|®hyò P¾\ïå$¥’Ÿ'pFmµó™ây‰õ›C©Ë˜:ò PBÅëˆõíØ›º ×-JNJ+æ~1Œ10fƒ1'L]0¥N }áÁŸL«¬˜^]ußšm¯¾6œº"€äA ÌbóÀ˜ ÆœpùÊ­1?L]0éFÞxsã¦3笉)ТeO <žº"€däA€˜ Æœ0ØÆ,1抩+&Kÿ j ÖÇñ?·÷ïO]@bò @&f†ù,ñÏÿ!u9ÀË_ùyÇ{òÊ@FÈeŸ"ËN8ïSdÐ2^}mxåך2üÄÉ×SWÐ(äA€‹Ä\1fŒÙY&¾üÕÎ2M-?sÔ‡?ñ„3G\DWÌcöè,ôмvíyù¶…¹² ÀȃWsÈì*Õ·Þù­˜[¦.¸*‡þiɽ[âÈQ[ýÈÆþá3#©+hPò À•ÅL2æ“1«ŒÑ2f˜‡ŸL]pY§‡Î®ÝðlvÀ.½¿ïè±ÁÔ44yàjĬ2æ–ÙÛ 1ÛŒ9gꊀ‹=½íw³æ=Çém ûõK‡S—ÐäA€«3ÌìëH1çÜòÌoS—œ³{ß‘ù‹ÏŽÍÍ[÷¤. iȃ×*f›Ù{1ÿŒYhêr ÔNœ|}ÙW~ÇãM]¬üúOàšÈƒ×!»œYÌ?³ï(¹œL½á3#ëžx.»`èâÏÿÐw{®ƒ<pÝbþ³ÐEcFóRç0„)³½ׇÖÅÑwËú_8º€fõ¿þù¥KãgêBšUÌEcFš]ã,権Ë·oà•Ûï~2ޏ™sÖ¸6(À úçý}Œ¨ñ3u!Í-æ¥1;5fª1_M]´ SƒC÷­Ù6½º*þ¿Ä?SWÐôäA€‰’OV§UV˜¬ÂÄÚ¸igþ’ËÀÁã©Ëhò ÀÄŠ™jþa¶˜Á޼ñfꊠ¹åÉ®-Xï#ÙK˜ 1k¹«“]À8tøä¢eOå§lòê À„“&IÌ]ó“áÇœöÀþwꊠiä—t™VY±|åV—t˜$ò À¤ŠylÌfcNëbÙp•6oÝsó܇c~2ñã»÷I]@+“¦@ÌicfãmÌrc®›ºhP»ö¼|ÛÂÇâH©|ðk};ö¦. õɃS&æ·1ËQ7f¼1ïM]4£Ç?ý¥§ãè˜Q[½vó§‡Î¦® äA€©³Ü˜ëÆŒ7ÆÞ˜ýÆ8uEXñ øÔßýÈA0•äA€©3Þ˜÷z+úvì­Îÿ†7ÍR‘RÉ¿*óa_•¢l^úýÑüKµ?èû·Ôå””<VÌ„óS)Æ 9u90éœt qȃɹÔ%1òÆ›ë¿÷¼‹r4y AÄÜ8fÈ1&Çl9æÌ1sN]L¤íýûk ÖÇ~Ëú_8ºêäA€†óä˜-ÇÈ3ç˜?§.&ÀÀÁãýô÷c¯ž9gÍÆM;½ÖÐ8äA€F³å˜3ÇÌ9Æç˜EÇ\:uEpN Ý·fÛôêªi•_|è™øgêŠChLÙD:fÑ1—Ž_L¤i:ßÝòâ;ß·6¦·ßýä¾WR—À8äA€F³è˜KÇ@óê˜]§.®Jþ±çêüo˜c42y ñmïߟ]³Û‰8hp‡Ÿ\rï–ì´HëžxnøÌHꊸy )ļ:f×Ù‰úc¾³îÔÁ§‡Îf—M‰]téý}ÇN¼–º"Þš<ÐDNœ|=fÚ1ngòŽxꊠnóÖ=³æ={æüÅïÞw$u9\-y éÄ|;fÝ1zÇ <æá©Ë¡Ôbo¼mácöF€&%4©-Ïü6{G&fãÞ‘aê=6˜¿[½vóޭhFò @óŠxÌÃgÔVgߨŠùyêŠ(…á3#_ûÎ/³Ï·Yšš<Ðìò3:Æüö¢ø¿§.€‰'´°_<ÿóy®ƒ×JBhm>ïÇ5yõµá¿ø_|Þ $äA€2858ä| ¼%ç#(y ÷±úÿEÛÿQÿÓ÷ÖÔŸq{áé¶Ïîíéí­µu÷vÍ®Õz:Æ<ÙZGÏìX¯½õ :»j³;Û;Ú/üeqagµcvµ»»gÌ“­V*³»+Ýõ…ç§ø‡—<öÄ>Ñùs/ì9ó?öÅ%Ÿ5ëÜ‚¹K>y÷=£‹²ÕÑž¯’Ú¹ÿ[iëªÿ˜¿øío{×è¶õþEÛü{.WÜ_Þù?æßñÁ÷·½§-ûë»â¯ßÛö®[?Ø^¹+þ<þÓÅÛàÖxúmwþmý×úÏÏOâ]iû¿ã·ÿ7žãß¶u¶ý¶ÿgQ¥íoÿö?‹›ºÛ £³§¾ýÏí‚Õžs»`guÌfíêîœÝÞ‘íÙÞÞUÿ/ó;½Ò†­´ýåïù\¶²Ú>þ7K—ýÍçïùDÛòO}lÙ’¶¥ó‰%c×Ü¥¸ô2¥{ÌuUj³{z«½m•ê쎞Úx {«oqp_ôt'虳֗^n8˜ÕÇ]¥£6¦â‹Öª—] 㮯ñ·ú=¹;Þþ¶Þ¶wýEÛÝ×oø¹^y‹÷»I}ZWÞ‹eŒô4ÄŽwiiKox»úãlÜ39{Ý%¯Véí>ß}FG¾ñ:RÔW«vu¶uvöήtô\Åî×ÓÛ9»ÚQë>×ãÆ>ÊÄ=»¬ù¶·yã1n¹½³»ºº»Ç<±+tùâMòÎ7Þ*»,›TŒ;Ó¸èy»ð [qrv½K7ËÒñ÷ñ7Õx`Ü-=%»Ö¸;ýõm‚)ßßn䨿ê]pÜ55‰#Aqg»ºYo{aÖÛÞ6«þK{Wuôÿ3õ –}ñÚæ¿we7yËIp6ýmÏæÃ·.˧Á=½•ú ·»§ÖYmý¥ÒU«ÕçÅ•Xµù@þ±‹‡õ+Ív{ººgwwwÔŸpG{ìb]Ù¬£ûâ¥ó‹KÛ;êM/kkùŒ»°xû¿>÷üâ~âè¬v¶Íêèè˜Ý[­>fOwoaÁüs Ú+ÑóÇ?w»ñ—o`Oì·í]µ‹ªèš]í­õf ã™eO·3nÞ=Ú0ª±ñã)wÅ“¨Ïd² Ï%s¹…5ó¯§rnêwþ‰]ºptë´Ï®Åf/V{a+Ÿë¹…ŵ2î=þõØÝ±>ôövÔzÚºk½³kcöžžJ}ØíÉ’T<\ô›Ú…¿¼üÂ8G«î®WßÓyÙ…ö³Î®Ù•îlªÙQVƒø˜?áŵ_na}špþÕ͹ŸÊÐÑS†¶zsDÑ™Mj½Ý]—Ÿ2´·Ek­Tâ/Îÿßü?ÀÎÙµîØ5ë­;゚/>÷ÞÞ†Îí±–*q VͬcìZе]‹£/{ž1xE¥—ùËó÷yaŽô¡%Û6ïü“ýÈß~ìsÿT[{¥>MªôôÔGõsÓ¤h¤1S¹ÒsŽÞWW £í½íçŸsG[GOw½øz=1-Œ%ÅYR­­ÖÞ[ËÖÅånÚÓ6«§«>KªôŒ™$]ӃνÆ-¬­13¤ Âê;FG}¸©õÔÇòj>„uwôŽîç'CvÆ_öôd cªÛ^OV1ÉŽ…ÕÞ+,¼ø.·ð­w‡öZw{oýXˆ¿ÖÞÙ1z Īë¾d§ˆégo­kt¦>»Z‰™Ü¬ŽúP[‹_:£Ô:»Ûªí1õteãh4¸Ñ}¢'zñì®ZäÜY•Ø ÕØãÜvVwO}ãUbïì‰>ÕCÍè6ºžÇ{õ[®×Ó]©…]ñç1C˜ð£#öÖö‹ö‹K–Õ‡ÍZl±›zœEõ´^ù˜'_XØÍÆ{Œ·Þ#ª1Ä÷Ô÷ˆöÎú,©VŸ|×::ê3“KƉöX­Ýq˜Íê–ÜÑQO{Ñ}ª1¸wvÄлSµ½cvµ'WwW,iï9—¦z*íõVc;tÄŸŽfˆKnÛSß§crßÙÖY‹ ÛÞÙ™ ×ó¨s¯úQ;zc¤¨Ô_'‰%ÑI'~(ö䋦‹ïþü5¦µÑICo¤Âî˜ tf¯+^X‡L­vn&;Aµ=æÏã/ûÑû¯VºF—DÕÙýwvÕG¯Z”òÜu÷´÷Ž.ëh?÷˜±ÙjÙ’ÞjýžªQuç…ÏVlìÞ]ž[ÛµJ„–ÂM»²S¸ûØ=ê)"v¢®îöb©ùŽ–?Â’ÑgýññvÒó/˜¾¿¸íkõ eï³FWh5vá¹›f¼û;UF¸Ö=»Ví¸°+Nº"¯wVÇîtùÂâãF¿ïŠ”}™…cn^bªµË,,n˜ú+¯£‘o̘Ãu·k}Éè+…¶V,鳩bAO=^ØTçŸm¾¥ ò uñ*¹¸ÆãutÖ™X#1‘ÍGaaì¶õYg-æêõž\¥§»½K¢ŠöÎlI{oÄÛúƒÅžz‰õ/n3úW]í=õ{ꬿòŸ-©vvõ\X2z»„»FïìÜÂùcÖß«ëÍ^Љ›W:G q6GïxÛ½¾°¸1ë ºj燤ѱ¦¾$¿³ócM,ìŒa·0ÖôÖÛžZa¬é­¿pG˜±¦·sôU³ CMo= žû«l¨).ɇš|aq¨).̶xýîkÝÅ¢E*½còXM¨½°w>Éö F_¡3ÔÄzíèê½hŽ…Ý•Þâm{ê 8’Å’Ø6Ýc‹¨e¯{J=¿›]x:…%ù|É.Zj.lús½giqañ@Îw§qž¿ùgÆ»Ïq†šÈú³Û»ë{D­wv¹=Ùìîü˜™VjѰêKªõý?Ô³`ýß=õfqî߯ß(¦"£Ý7ÿ›žsCÝ…{9¿äüƒ»]¾°³Vÿ°k~O±¤Z&¸ó >ž9ZRñò§rîŽ.~r?7¥í¹¨©yÒ…­pvBÅç~f¼û¼xšY‹éGGmìcÖßm쪿W|Ì|aa WGãxGõ2 Çܼ+{‘bü…ÅçÑ^}¯vɲXu…¨^xl½ÂQW_R­Tjÿ?so²kYŽlÎèbªÁõÚìÉiP@gT Ps×Ëѽ H€êï‹Ë:÷æñðÈç‘©œdÜå‡Ñ¶ÑhýglÎÊ) kÁúYlˆ~OºÜè6µÎ+–]Ü@R#áJñrj$ò®F,Wsj$9§F ¹íj$í’W#è¾°¹–o=·öt›O»0G É´FÈvB&‡o²` Ãé‘@®Ò S~¯u×#Ö–œ dþáôÈ Qá¾@'Ü7·ý÷æYRgá&“¼ôåU^Ž?lâ^vtv±ë‘c Í72ÎôÕýøVGÊû$†h6ÕÅiº?¸Ô ÷µùNt û —Á¥G>ûÜ.cd¸úÏÿñ?Ô70ÿ>@æ#ÍC¸åò[¸m±sô ¾`A¼¾AOŸ]MÒ· ¸AªÍ…¬áä› ÍïÁÔ¡;Âg•p÷cßuÂ5(Â|;ÅYèÜçiBØ áð“`ó§!} íÚû “_úmp|OøÔü,OØGÇ'Ð/Ü@G¡ÓlæÄ?¦ÜŠp±Ô×ý‡0é¦zëñ1¶3OI5åjñ[)‘LÖ™ŒMwÈ©í`™È I“b“«‰ìW Dâ0ùû*²«M„‘çó6 0¬Ñ6Fíþsž|³‡:œfý÷£U,8·¦{kÑœaè#"hÞ§#¸¬EeÃ#í}³9p†\GpY‹ž}ÊXók©!ïf7½aȺ=‚ÞZôìs?×?â5|oôå¨yÛ¿s¸´Z;B>z”Õ­öŽ’ tD[½AGÉGŸ±%܈¦ÝÁ’>o”œÜÊhKæhæ™xÅrÆïýéÒ¦ò1ʸ‘Ñ@G±ÕÁôd¼÷©cÁë>êŒnÓnàNÆ{Ÿ;ó·H:•£¢Až`×ñ~Æï½ÙñS¦ÝH¸°E¬Õú„-ú=ú“al>‹zŠy:i—'Ì“îÑßëG†_|ùW}E5ö $Hˆ=/m¶ì-`ɱ,HKÁ©â@Æ•ú¦±ãŒ£æMc_ SÎ?Rý6µŠú\Ê9š—Qâ¬1;k !EUqhì@šõ&;ÔQ¯ŒP€v`;dk€à5v€óê[–Æ$·ì4ö Q}Ncß@Z>õ_å¢Fj0M#Çà•ešl y©Ô¼Êîtq"Y¯²ÓvõÑ6•vµ÷êÛÎozͲϩԱÏb²QªÑÏÕXÍÖãUÙŸlêTöµûNewàÒΛÁ¥²?û<Øc !´vÛ/ÅS¤Ý2a˜vžïWºúpk='H;uý¾ÌqZ¬á¦nÖDÒÆ ˜Ÿ¶½š‹›šiu{e˵½òˆíÕƒ*÷#‰À½mæß $ó/Üb\æ_ S+›ù Å›ý÷cޮ歽@æ‡í,ÂßùÜ© Ægÿuà2õ¢yÉ$‡Ž Û”pØ{`µ;»ÏG@¸\ÊNâ±ÎTâÀ ÔRr'¨Ì5‰3‘Ålhg‚tóZg"}²NâxÄ$Ž^âxwý_ÕÙ€äžöo}b±¦è¸ «„¾®Ër8“°)Ý|MCŠÉ7wÊ+V›Äd"/ÍÖbb,ü`Q/nÖÎ/óïý×lÜtù÷ÙçIÜðÅ'oæßªáv"1Ô´ì½óC¦88gžb¢¶EJmZýâ ²HvÛÕ“Úv×xμfe?óËá® ü.WÔËYû±ÿØVþ´²9/ð³Ïâ“…Ò(eö¸ÐwÁf˜Ûâùy´ëzƒ¹¶S.Ðþˆ¹à~M¡¬>†5¢¡ûÜÈ-V6»¤FîøµUêçàý¤Ø)5ΜHÛX¤ÇHœe*šþs ·¹SC‡A¯.í1À„DÆuÑ a¸.´¦¥;ÎW¨±nª£aîsšm#,°ä}x>ŽæD8€RÓ&Á'V£þ|¹–´äw€ 6íâ{bôý™ôÐÀ²ÞPÙm˜Ý££ë‘ÝþÀv ×vÕaeÙ+ óÒKíIÈ\Çîr†³ n ;¯¯®'\צ¨£\Nd/VÒE8@YôÁƒN^Û;ípaë ]|t–jøèïõ'¹7{nT;îEö[6ß~«¹\4ØEÖÝ„ÿ‘]· v ñ˜mªZW¢%¸™k¡p×À³*ðÔ&X(èwœS*ÔÝ)9Ç¢ümÓ£ýwGì1ïwàÏd¹ÔnY.äqø×o¢råmÊ2*Ä‹ý‡ýÓúê„ñîy.öƒ1[aSU¡˜±R(y%‹)hõ!͹è•Àù•¨=¾~ÞÿÑ—Ê)#=®”‘Ò.™x£`‹àS\¦‚2›© â®ð¶åGëA¸E>ÇŸg=.9<Hû3¿Ÿ‡ âmþög§fýåáíF¹0¯/È; ³Sd[)0º#º.-áÆ`žGâÅyœŠÄ wIB¢Uþxèø‡ó'Ó`¯Bé(“Í8¥¤5I)I0FNÒ"$T”4˜T‘»…ï*#«½Á¸ülû1¿-šBù-RoQGNô<9? rþNMÂ'~¢b&¦ %ñ2ZपŸœn…'¼„JÙ3Á ¿œJ S?®}g§Hâ¬úÆ$g⼦ZãožEOý!;ýéšÎÉ,¡VIH™ŒE )pý]S­ð”¹˜ì9…)Ÿ}Î »sò:5žóß:Å*̦S1ÏR’ÆÛ q?·´€?1. ™?n£ýTSwH>äON7r 1žÊÌ7Üþ—N¿!U¿v¾™…9G ôçA`ŽàrÏW\”BKýF3}¬±#ã½?YÚjíȸ@G1ëó„9">z|Œäˆ¨àF/éõ„m$|ôx#áéãyÑ0G|Øy*ào@GÄ{< H’JÙSÁè¶:8‚‹ŒÏ>…ŒSPÒW<ÜH¦ÝÁ>wBâ ¥XdGÈ…yšáÒ•F.B>zBNÕ³ÝȨТ—k|oýé(6¡EB=µ¬Ó#èIøìóõ#Ç+´ÎPÉH¸ÌfHv3 jg™áŒîbyì–3€5Gg:’Kr¶3 bý[Æ3Xz»õlÎTVêTœzÌï@g#¨d˜éOBÿ$$gC’{ÚÝ é30+0²3£¹®=R2—î¬fGÒBp†´ QKÚ)miõÔLΘF³È»„¬-5;s-²Uç;2o}»A »ÅeZœE `µø¶ƒ‹¹þô«Í¨F\”»³ª9NÓõxDíjO.u†µµùβæ@gü^\v—qíÙçëéÁ¿å˜÷ðl00'Ìy®3ÐÜ&iKIo@ß F{uýÎÌòª58³=}±MÚ,|Õ#nÑÙDêœ{m­×6Ë#¶Y²ÜOCÉüöŽ× $Ç+©–ŒåxR.J^[ŽW€‘ëÄñ $$ù©Gg Õ*óŽW¨³’첯\>V4¯iÔw 7Kž6`hŽ@æ ÎEgb½©ÈU)ø,?8¤æ¸èl T’e“90ÓÔ⢳ÉÛU}–߆˜Ì1ÐËʶ#0zl¬1¸ÈÍÆ@¯W±­Ò§‰Ii÷¼‚²½ÄÝóŠM½ŠÏò£¯>ËHî{–qÑå³ü§ÙrïC-‡xò©ñ÷ò¶éG¿bAlÅðN5ˆ·?ÍyÕ~Ü Û”1¿ÚLÏÈú—8ÖêYÎožrıFɤ`¢Œ˜—È]ÔáŒô¯Ù*£(Öò«=±û0ïÀ¾[­DHˆ>Y¼ÍãÈüj VlvTu«òöt«qé[Ät$ü¼[möçýjä¶ÏâZúò«ýátáV£Ê@ׂÚþ¯ª³o¬tÇ^ì>C²ã4 <·ÏóÛ=gÆø ÜiQüi­üZ(‹7U£ d8Za_ ¸§p?ùÓ kÌéÌšKèS*,šyÅúÏ »Üi?j[ìÈS/m¹¶÷ÏOw¬†tce¿ÚJ…BsÞ肨02Àz2XvGK-ý¶) \Û÷+Z ëÇ®ÍèJ‰éY©—ÈÇažíº²ýÿ‡þƒÓ·Nt}*›_Ì0¥( Wj*2Yµ ¾ddSq‚ðjg —»y©!o¿¬(n»ÜÖåIÓýiœ’‰˜Ùh4u´(÷H¤$ĉöÿú@¤?ržËlùÙÍCžPžbï"Ï×Üçª>Oñ†Akþyêóµ;ɪïÀÒüµbOxm=Aiþyêóµ;É ?)¸@\&cÛ}ïgP›žú|äF ïRÞ©& '¶Þ(yïñµ;¯7B.ÐÑÌ:=aŽŒ#92è)¦½ž0OÄGwÇ€¸„7†TÐÂ\âGp#ã£Ï×î)÷tt £Ùêá.J>û|ížò’zªY·GÐÓòÑçëì)÷´4p#›:Œ §å³Ï—w–o”Th‘̵>‚ŽŽ·þ^»³ÜSqŽ`«Ó#è¨øìóõSÎòyãdƒß×ÂfIâ,Ò(ÃQå@ˆÆÞY0‘—³œr>¨³Üï,7ðåÁÚ¹ é˹1߀kÈJsr–?@8Ë 4g96»©³œyLz_9a)Æå+OTi#ó•hðL{_9ÀA.Dõwc]ô• ö¾òÔ?,ñº\÷U}å@¦4ËW¤ÍmÎòD!¿­,gy"§+4Au–âåŠKÎr×Vœå®q–oÓPoùšíb5]‘GháßOlú:xËñäJøÚÀI”ãÎQgPšžú|ýÀ[nÌä½åÛèVÇøôÍÕ1~ýÖ°·ü‘·|í–zË×n©·|Û-u—¯Ý²ÛnyÄvëA—û©(ŽÈT‘v«§¢9EÝå@8üCÝ剢;ÛØÜå9’DÝå@j¤#q—âÝå¾6°°~ôrŽÌ7 Û”qÚ}u—/¡£îò%tÔ]î…ŽzË—ÐQoù:ê-ߤŽzË—ÔQ÷’:1©c —:”]o¹ã ñ–ï $îòÅgê._¼(îòM註|ccu—»¦â.wÝ‹»|›…úË×dÕlA16~°éëà/·sÈûË·/Ú8êjóÏSŸ¡cÎàÔd“¿n ”Ï4ò,šÛï1ß~&’Ϻrè]æCíã·­«‹rˆüˆ„x—¹û™›¼tu_ãÍeîîú±ûä\‹…Üœü<õù:»Ì·1Õ;¾i ÛhóŽŸÁmÊâ?ƒ~ê2¿ƒä27Ð\æö}˜ËÜæ3·ïc-Y¿ ÑïãI™×ÙgîuKŠni>sÓ-ÍgîuKó™›ni>sSÍgîuKó\zÝrîS3wæÐmK<í¿úÌ 4Ÿ¹‰yó™;1o.sóæ271¯.s/åÍenRÞÜÞ&å7D¥ü”ß@Þtu™/Æ—ùÆ>ê3_\¦>óʼnê3÷RÞ|æ«ÏܵŸ¹ë_|æû4Äiî&kœf rˆqñƒK_§¹W-è>éÅeGp©–Ï>_Òingç9?Ì`ip%ºDï³q5‹…õo))Ä—¹ß[z|Iu¾Æ’p¦zY_H–A)ŽgAiþyêSÆJ•+éá œƒVÜ4°ð—¶u{¥ùç©Ï]‚}à›@!:£$é\ˆn#Ú@®õ"ä£GYÝjï(¹@G´ÕÃt”|ôyËSrŽhÖít”|ôy£$Jî ˜gÉ…-Z\\‰/¿%ï=*KJ-½% t4[AÏ’÷>•‘kéí„4ÐÑ̺=ƒž÷>wB&)Lç踠E1Tˆ(·¯}aFÄ{o"ú ×Óó$\Ø"Öj}ÂýýÉ0:G½…-:Y—Gl‘îÑß-_øö©ðNFJÅüºój2j•ëó‘NЩð^åZQ@ˆ¶ß¹!Õç£s¶þÕ磳o'¡ú|†H-:ª‘fàkçè½K±Æ…ÓÞ€…/žÒœêóÝAªÏg !Ä@ªÔÏkÖÛhCgHõùœ*ýŒêóÑŨ’Ûkp}>º ‹¦êó$窱„ÌV2ÅsÔ† R|O*À ¤åSÿtR œ>gîŸêóÉæO嬀Ւ’¬Æ€VXá$‚¡>Ÿ!²¥TŸÏÀƒTŸÏµ­\ŸÏõ_¹>ß6‹ÊõùÜ\•ÕÖzBËþ~bS§ž¸ÝŸw)8_¿¡¤\ó?¶V‚¾xNeÊ2¢kZ¹±#*Ä ¾"¥øø;íð×}“Ï;‚ž8¢þjÊŸ…â_À ŸC°4Øù¢'¬j-8Â2?µ÷»òûU«üso¼e„M·-|ƒJìWvĦ,HùFª:šžFùE4xUxï© ጮsáV±,×#X¿˜_”ůFß1ô—|ÿˆ0ÎÖùß™s… KYóÐ3{±_òŠ/Yï¿ÜGÿu„K(‰……Ï{‘™AÖ€H еßfQù1]ç4¯‹Á0.Y \“âü:â`ññèø«TØ„h™yßÚVöi{^sÛ|ÝFúå*è sêóv’Äçen~’1Ïãt^Lv*S,7y•~þ ¶æ~ù„Åi^È"‚]2|>ƒÆj´3òÂ7ÞP§éöÃ#ø˜û;ð_’î>CaÁ{¸£³DÙ|1¡®–Ú\À<€ô±åÕW[WÄ÷0ÞüRû|ýEu•5ˆcŽ2÷ØÁ¹Õ'—ö[ȇ§,kn:‡ýh#QRZØ*+çŸÍ—VþaÄ'Ô-ügf‡–JÕ_žm‘¦ „òè#ñ—8uØí Ê)^üåÀ0êž0ˆ›üÿ¢—Þ‚Þ¿: ¼dɯñ(gHI\Í{%_=s^çG¾(4ž³Àç!‰÷pÚ_ˆ3ime×ÎÙÜ)üÔ¸–þGítÃ̧ÿä„ñ2;¥ŽÇ„<ý¿¢¼rD™Ý>?£¡ ÉæÊ³MŽ ÎzÌóž‚“žú òÁ³äƒ÷C>xD­¨óñšKès¶$ަF•¸ä2õ§æRNµŽ[¬xäIÝTU`Ë’Ö=òÏŒêÒÁÜpžòe .—2ÑÿöóÓÅl¯J/ÒàáŒöT©ø•å•ñæ{¸ äÌ Ë×â]ñBŒ4%9ç·¿¥ùç©OÖwRB6.Ô¨©d¶¿<Èaòd½öpµùç©O+bÕGLáHͯ œÊÉ%¹¯±Ž 4ÿ<õùÚ£”Z‚¼H£ÆœŒaÝȶÀE!×ÜÑòѧ¬oõàhi '›õp=-}ÞÇò´\ #Ûë:Z>ú¼Ñ2#|ªÞørŽ–5q²ÝÐÑòѧ¬ï Õc£¥žlÖÃô´|ô©´‘²ÓÒ@G¶5Öô´¼÷y£eEVL;-èÈ6ÏÌÖGx:Z>ú”õõy¹Ê–z²YGÐÓòÑ§Ž¥ó´\ #Ûë:Z>ú\´<ÈÚyј‡Ä>ÞÌ\)bTx “PJIZ¹èb‹ vƒC¾4¤öD¶ÂÕ߀ XU62¾%EÐŽžuM@Á—¯Á3#p  Ö¬sþ‘4NóØ‚ˆë6k*„à5ûDOî4n¨é6ç&þ”vˆ×qcÂÏ(W¾àkêw˜¥Ã|g)L¦y€‰äCÒRÍ ë†àiÇÞÔÌ0È :è~^²¡Œ š Œ`'$Ƴ犗$vÑ"Ñ,H¦ü“Ȧ1Dv“÷\Áƒ¹aW¬-†ŠWsÝã?ø7nà ”³›«q™­Ç#´ìï'}-ß©í=%µÈdòØ®3AiýyèqEä+…ÒãpŒDz@šzS,;ËèÇG~u¼·æ×m  ôû2J°0ÜAúúl¯&@õˆÖ^%èäyì{•Ésu·W¶bÛ+Ø^=s?Û·šqCšW«”+B{¬K@PÚ…ž8Äy‡êBŒ‡c¼°¼‹âæbrå )@(%ï‰ßù¢[–¯ D ŽVÎp3µôs;2Zcx‚ójç¤ ,W½ 'm€$1›š´™`WuÒ&#('mæ¥hô«ìÒf‚­”á¤ÍD„´*m<¢ÒÆ0/m<È;Žî[(Ž+²¼ˆ·1&»ó­2x>Ì™kNmò&WNéßX8ãIÈãÕ–óõ]÷M4±mˆ›'›l{,¨ÝÖýýÄ¢^ܬÝë´4ÐÎÆOGP›žú ÞÈõ¦O‚…èò³æjÇŒ­Ç!ÆÂõ^÷Þ듆¹¯yqØtúä½Çí:öÇyÿˆ37 vB™ü5‡^ø¾P²þÖx—ÂŽÌ@OÖÍéÓ/kÿ¼ò[¯‰íÙ/׺¡˜X¦Ù6…÷5÷cÿå}ðׯóxÂy ÿÌÀû{°)¹Ã…¯˜íËk!EÀ&eîE›Xb7­åG&—uŠâÈËI½óüE 눳ÝVuCh[ —<ð3]èש §È³Ã»õZö0p\öà.®AÍâ.ÑËA^¢°_¾)ag^5{«™úÔzDA#þ,c)(P´ýðˆ=¦þü«¸ù·Iàà®Ñÿ°rŸ^b?üÝëÈœ¨ø-H²p ¹buÕº®Ô%þë©ùгœç_J—¯_ì¾EüoŒ  h°È¿Ôß•ÀÜQ%¡”Í};9øóèLpƼkŠ—qêSÁ^Mó'ªdù3£.·ìO¶CÔZÚæÏý©é#ó¯w¿•y²§Ù]¬BˆÐ£sg@_“¢=áí¢Îb«PøB› ÜOüöð>Ð;ðúsQ‹Ù øekxA–I‘E6ÏÖ UYá–G) Ò øäÙ¡ ûe¥M= R~Ö¡í2ñF~˃jÊKËð{Í¥¤;„yü̸`‹ŸiW2ÅŽÏb•çrn¾p"“O~ÀV +Ú/g(°l@ñ©¡ Iê¹ù}^ù=›œAïc9J.ÐQÍz=aŽ’ÏwJæù¡A•ö,i˜§£¦žAGÇG²4X§ iod\࢘upÄ=ÊH±q©¨ˆ.‚Y§È“ðÑß„ 9•†:z•4ÏÊÒÐñÑ'Yèb>oŸžŠt³Îà¢ã³OË&æè¸@G4ëõ„9J>{|ýЋ ›8l‰Aý*Ni(Þ˜ý:¨ k"ÄǸÁ7›usÄ1%sŸ§Fébè§nÔLÿ}î¿!äþAiãîÀ—á®9¨wìÌoÀÄÕ©yŸ'ìõSi@"t5Bà=r•©qöš‘žÁ.#=¹ñ3*T–(Ÿ„¦—¥Ü'U`ÓÒ¦îË Ë·>ÕÚ ‚8¿áo²ôáo” [W6­J#ñøA¼$rÅÀ6!¤ä¢oø¥PF-¦Pˆ(pªª2÷4H§’y‰™L²Ä5R ^!$üøb' ±Õj:7=Àu¼zoàÝ&‚ö¶æjlfëYˆ,ûû‰E½ÙÍv~œe&¿<ˆ÷`߸éjóÏSŸ¯ƒ_…¢%Ì‚5x`ŠãL;Ç)æ‡msÁˆR<ƒ¾5^.‹µ¾ýÆÀ¦ŒpÈ„ýûjn·zdI´v †TзÝ";û”‰k·lÁ¶[ q»õ ËM’Ï Ì¨óÓèóŠ£&« ¤*€Ô²Áhƒ‡3ª S¤‘“¼Fæý)jØï›aÓS­Bùì@®I×… !l^¥æ¾6:§zg\¯à&8ƒn‘*8Ü~wIe†eªóú7¦ÈJ/nøŸMÜ¡ò©&nò¼A3ðÒfîG&ˆ´Áߤ›ˆ´q/i³@'m(ûM}·Idã Ì€ÈîY¥Ûªq­ß‘q!¨PSÞå ¨ÚVè8ÛGd_m©]Í®2Ú„ºO#F.¿fk\f+ZÈâà'‡:yãv^ŽŸ/ºÏyqÓÔæŸ§>òÙí$ØÇ%é‰_˜'ˆXÜ¢Çÿ…Š 1ÓC0^ C°Æ‚wd ¬ŸA @Ï\]"#JC#¶ƒs-¥«yUo­ø¡†61ýÙš¼võXãwÑkeP/kíÇÛçf g!k®àç©Ï›œBÊ%7ö>ncè7þÆ<ΘoÜÆÔr{úU ‘"¦Fïέ£O\y¸cH0ÖöqP¿íS¶õÚDZ÷q<Ȳ“­ÀÄ“ M9}rIŸBy}¦O–Ø¿ÑéåÔÉ‚‡.|ªNOÌÔħ¾3jÛ´É‚£Þm¯M.Ð}e•ÃIã#¸ÖXȧXž … ¤]Åi“…¼Œ¤q.ñ0üSñŽ\*ÞKè\'ÌË÷Bq‡µª|/šÕ"òÝý½äû|w l8õ g´1&uuïì©8£%zm´Žäsâ[E›á9à`ÖÚ66Ý»î;?/°ÍT³SP—Ù‚²8øÉ¡N¼¯­wêäÝǼØé:uòÙçëO:rÿLs½¾‘ëÉ'S>ÁRŽqåß`ÐWcêÂSXc ü–Âykâªl>Wô£ œ¢Èá)ìþ=Nè‚Œñ´Ïþ¾¤ÊŠTnÝ¢æœõ~_¥ö=@HÓG9´må†9 &ówNà.Ñ’H©‚×üÏ&¡$õbù¨ñ[ïMB¤4ª¶¥\gv_~Tä|õ°ÿÕT÷÷e6sýô*g>ñc^OP×È+qÊ@ŸbE%ñ„5âèˆ!0M©e¤4aÈÅz‹¥Õ˜òd]z¦# ¡ÆSŽVÇå1õ¿ P°.D(#PPâ0†èÐ*7?~•èŒe‹ŠôÇ##Õ¶SV&ôíÁ ÔŠa’xòñ嚟0mûyèï¥%s; ”!$ˆyhaÈCæ­aNX±Çýí§7* â™# ™FÙKà µ°E”ÕvïÑŸX­ù"žaŽPÖü„9â=ú» ㈷°E¨5Ì [Ä{ôwÓçWxÎ[Ø"@Å#µc¼Áñý‰É°¯tw%žaŽPÖü„9â=úâ!Ajžx†-B­aN˜#Þ½¿x(—ÛþÙ.lª£>ièo°E¼G<ž8‰·ÏÖ0G(k~Âñýñ06#G¼…-B­aNØ"Þ£¿×lºÐ$;Ëiø0¿¹e|é£°Ê ! RFú»® í““mRTÐŽª2RD%×ñükéu\°pÀ)mØËcg‡¾¨ïˆØÍ#†8ÆÆµÉƒ3ïX‰ma84šªTÓ³£¹f¿$t™º#8Ɉ‚xQ‚àñÞ*ÿ]Ò&Z‰C¼Y „î«TÕ\ÚTl–¬,"#‘ô‘•Ñïˆy…$RÑÁá¢yºôÌ{$[G¤ùÒÄ@I•uý[JI°QE5ÒG®]çŠa«gyðm^ñ[s²E¬¿¿ºrc:§S¯ÍNÓðå0çFm£œ0mûyèï`-I‘CóŒI(»gjH(+Ìd˜3]ü”Êsm#0r:cn P¨KP¶Ã¦¢Ñ–:­?¶L ŲsÅÄ”ê´+¶JÝȾ<(q;´àʼnœ¼’‹˜³FZtF}4JRÁWs¡DÖÔLÀ¨–¡©·A!¿¤&&ܵóȃ™3—‰6à;,í{y¬r 2ìð¥ez‰¼>0’vŠˆ!/‰Aì¡ncbtp˜È˜Er™Ì˜@ ¡8™* ]ÒhØÆøvk2ÃM,¶‚,™á!Ú×Ù/=¦m;¡kØ?Ú ‹¹Š°V…0c2ø5PŠÌ ŒjU=n܉»¢$Ø[\BV×I¹ â²Éq§±‘­ÂÂösröW‰/‡¹oÓØå„iÛÏC¹Q ‡k!•d$yYÒ°y=@iç‚:T•c2 4¥hÖ¢03à%_úõG(•DÓÔn ±¸•aå«—Èî˜5”ßi‚2Ÿõ#[õr_›Um0'$í§îûYÍ‹¬‰ öyèï¦â ~.·šÉר›æö“* ÕvÆ|Û"iÄ'ÌMA¥=°>¢;bñjjgPËÆõˆ3-Ñq½­R¹ÞÂõJì„ê”ùéõ7CDƒŠ©þÖ#?´îõ·‰áJm Þ`nMH¬e<°Ü¡à*ß™0SÞ„1ôì‘–,nx~6/Q<ÿNýòê›>«j¢¯Âð`¢ØMÛ0²D±‡h;Ño N}Ë…éÚjL¯÷Å8XRÊŽµ:ž·­NÂ~' ÎÃvl<9÷ˆs›¬!>ñâÔ·Ž7ÿÊ~€=n`sTþÑE¸¿…%o<çÄðÚ쥾æ>Gc”æÔ·G¯ZCÿð54âÔÚ(·‘5½ršK¯·ì– …HÉ&B÷¨Ý8„ˆ¶ÛN4ü|öµ†Pm¡ív!Dæ„Ýt‚¤á糯›M¨±ïÛ›„ÿ{³þ iøùìëlR:8û‰#A‹ÖpQëÞ×n¢qÔ2h‘ÆÚ E­{_7#ТÖ2i–Ué -jÝû:Ûo´­–ž´¨uïk7ý8j´HcmТֽ¯›ÕÇQK¡EšeFzBŽZ·¾ÎG-ƒiÔðq‚µî}í¶G-ƒi¬íZÔº÷u3ó,j-[”‘fٞТֽ¯Ÿ±ðÐ32šÊ&Eb©}gnÊ€ëHí;é[§_3ï$ä-ã2biGþt†AÜͦ’Ž8ê¯ Ê¥^Å,6¨«zÚ2i[l>Ò®¨P7[l>ð@4 r‹ÁFÿvö…Ü]û#ÚÃ!zÕ>@nMj«¹A ‚Bj©1I –/ ÔRc¢@-5& ÔRãeÚjL¨ÕÅdNd²À!´›jªÑÝVKã5Ô(˨FYJÍ4N¨•Æ1¢i¬•Øh¬W6ÑøqÅBcS®±©¯¿-LlgµƒuF…½3θ/OyãIÃÏg_?0Ì z²ïv<.Y&d¾ «©DÿvFû‰X,¬‹õ7â,2x„/-ƒ ê«Î£;sŒû ÏSz¸­d·Å8q§?tŸ‡µ]l`óèóÙ×Ù ãFR‹‹k Û8µ· ßP¬-ÈÍZí/;Dæ…Ôú¢ü,ÆÇÏj{Q~Ö•)?»¿…Ÿïk?Ú]œVeÇ·‹ÕEµ*µº8­JŒ.¢V©ÉE´&6¸,¥JoÇK©RÄ}z]>@nji¹A)¬P;‹‰Rµ³xQ*v“¤bg1Aªv/HÕÒb‚Tm&&Hp‚Ô ¤¡ÝSC‹î®ÚYˆ™E9D­,ÊAjdqrTm,ŽïÔÄb­Ä¢½ªÅ«öš°‰Î|ý)lwc¬ƒqÅ)U¶áë33¶xBN©º÷õc»ÊO<à•Á˜I5céc¥AûAJFµ˜1.,¿{q$X`E»Ä˜õ‡Ò¥¨S’’ ?#±©ÿå>òë—UËÀöËí{ ¨ük V‚{…FƇš†BÁˆxéM߀GfÀ§Ibàõìþ ýªW•l3VóÚ ~[ް×áwo°¿û½lV-õ½~ûû“–_4Æø3SùáþpgwbÞ‰þüè;Ÿý¼ÌE¼JeŸ/]ôÈÈkóCÝiöùìéµÜPì ¡ÛÑ—ƒ2?pëº;AÒðóÙ×~/ƒ'O˜0 ÄS®´ˆbÀ¢€5ZtÚûy™{ˆZ.*d4±†OdQéÞÓÞ¿£’A‹$ÚÝ ZTº÷µS)'©¹¸É ]pãåXTº÷ó2×½W½èdQÅš>‘E§{O/s<•ºq“A‹(ÚÝ rtºõµÓ‰^¬.ÕÓÉ %KOrq‹N÷~^êtšúËF'ƒŒ*Öô‰,:Ý{z©Ë‰£8 ZDÑîNТӽ¯íÂxr95:çÓ5JSŸC ©’¯y£\8ª8 OœŒ.êÔ˜ÿF~$ªÔIŽ'¼ãý-S½Vò<Í ëßêzBâº@¯<8'u Žò@.ªà•—ë©ä†g¦ #çÓµ<ä{bÖ‚£˜ï‰ÜF±\£5v>‘$±íÎ'¶“D2¤¨ó 5òPh5ÒÙ3I£z¤òwk¼¹žpï§Læ—GÈJž§@FöC̆å©+õæØ*Œ²äwJô7Û÷àwbký­Ž§¼~ÂÄ„_Àu®EhÂïò6îà²]21á›öú›öýÉ_¯Ýót‘­?¶øáK,"ÓžŒ)ž6ü|öµËõ<Õ—ˆë)^iãÅÜ€p4åq„|Kxš½íöÄÕéAQñ>-¨_qý ާ܆í¼O8[ÝNÀûTu#tmºîo݈ÇòoÇÌä18.?Ø¥Õý$Xnä¶)\Ôî'rsâí$·Âý”ðá‹û 6¸Ÿä<)²») ÿ=l¨€8 ‚ûÍkAQúy‘Gš ¿,ö6{[X¦Œ½eGÅß©MÀ£3/2KÀEÎ.‘xò§õ´É8 ¦"¾ä\I™<Ö"pÁ %D{šõ.ÚqøŸbž#rd1¨LC+ Á˜ þ'ö"«H€û)m¼‰âa08[›Â6ërŠm³6,Þ_(Mç%XÍÉÙM‘÷_ X_ž°ÅáFŸ÷^²Ÿ™ós¾6(ãM9¸{2Î :JìéßìCJ#Öõd#ײºXÓ(âv"HJðX ø„ÿ¯MÃ~À³Ôö·…,¯Sô‡¤[Ÿÿ(¬õb› @Ÿ‡ÞnŠÞO-i¬â]¼KBÅÜÆáÉó–ŽÐÖ²à!vÄÜÔ甽C’ª¨©É?!v†ó)²sUÙ¹"R¢èÑ«‹Svv+;?Ö¿“§Sh‘ׯ aõªG~¥QÕ+8&ð £S¯: °G‰Ô+ø6Jé¦;ÁýáþdTJuxíJ¡õUÀ³pµâ×÷K¯ýác€–Ï•.jê›4…*$'M Ôç±Ä)ÜPùñ–8…ÿ¨µ°Äië\ÇÄÄ©Nœ´Ä©ƒh'Ñïˆ]ö#—¸‰Sò‘õucI(°¯¼G\¯ÙËS”{/mx„seü­U„·h Ôù‘t70"*3nÑi¯?•ÿn æ„©î¦S°lË×g|ñ„œ‚uïk»TüDtïæ”ÂKÊô¾)"b WcÀSŸ£¡bÉüW‘°d|ýÝ[l®¾ãPŸR1ŒñÓ1`ÁœŒf¯B—¦Nûá »Oú ö/zºJÖd£ªdÏ÷ •ºä¬þâWTÊÛ@×RïY…ûÊ6¾ø)è+±äñ;îíõ×<=U„ÃkÉg÷Vâé膇w-ëo=ä,¯f·G'/üñ`îèþWس@ÿprAú¼M¯v 2¢JÙ?çÝ)„©±(z9ìcÐ ¸l~—çâÈ:«×švä öÏû™ÞêL òösb??¥œÔ}zû™ß EjØó'Þ~ÞÆýo?W„7À?€·ÚþöóóÅÓÏT‹qÞ:qOùK~¾PÎóÑ#á ']/{œ°)H.ªUíùMAϘ‡AþO>ÓQy*5°ø¬'Ÿk·ÐÊ&·Ó“Ïó §U¤Êw-þ™GŸ÷qÿÄ£Ï×à9ò»Í??až/Â?qµ¨óügÖò_o~TÃB¤Úd"Õ‚ +Ãm®@¦àGx5~Ñ.PvTE‚L…âˆó;%ägÎýÖþ)·)SPW( Ê3Ê¡!¿q³xžäΜ0¡:ŒzPÔõÿ?ôä<Ž|n‡ÛñÔ¶NÊ IÜcÝBÇ$&üiŽ 21³»A ÇXØ0:LPîÎo„b~ÃþA% Äü¸S³5ç­¦^”!v &™vÛÅ#èÿ?Mê-äK¶€¢¦¨9:86FêUpkÎ#HêÕ:fuà¡Ä†'÷Ã.dô=ž”ןfºÙ od# gnS.öÿúK×-q£ÐŸv—Îëéd‰Ê—ÚÄ.«ûYRõ2³Î“¶Ÿ‡þøª‚çT¹æuäÒ/_ÃEV¬¿ÚúIËÏCo2Éö‹¨,5· Éš{jý j÷ùèi·) ªsÁ‹J *Ž™ =y [¤XmÉîýÉj¬¹#™a‹>Öú9’Ý{» ²HfÈ¢öw‚Œd{O7’eÒåë¸Ì0G2<³žZ9cŽd÷þd5x$=íL¦Ð¢Žµ=@Ž`·¾”^HŸ–tO¡—"‹8ÚÝ ZôÚzºÑ y¸âF/ÃmúÔ?®šÎ˜£×½?Y >½o3l‘ÇZ G±{o:ˆÌg‘ÌEíïÉöž^?ò¬Ò{è0ýL>.¾t;,ÈD/.¡<Õ{ÔÉà·³!kæMñÒR/SôL!æ|£ wƒ¹SÉ/€^Q­àï#¦ìå0¼63çâ:39HØ…Øè.Ç>^ ïãÊÉ@™¸c'~½Rg1¼ìH³›Çž Uƒ!€J¹‚ A÷üpy¾(•‹L˜Y›…F^›Šg«ýŒ–~ÑËCôt¹!ƒTiH` Ô/yí{aì5CïÆbOÅP÷?H(™tDúìwMÞ}/ËM/Ã÷±y^éñ7»`Šò|ërù]ü}ZÏTrö6:ØEŒÓ…ŸGgë¢ùý@Ëü~àCg!´F|\â@»Å}?ã0mûyèïuðÃÎ3›Þ}7–¡“8²áac.ý¨”»WÆÛ#ó÷zú@‘6\ nXÊi™méát±ãòî ¦3·¶íNÂkb¥ØöèJm{`Ûó Çýàjü:)Üe¹×¤/y(X(OH†¬‚o–|@ðeÁ7ÛZ†Áò”hx|ÎYÊE¤ç´/BÅ5ݾÊXµÃÓf°9(øò <“L/ŠôÁm/ôð;˜½Œ! 8i‚¿/êÊI\Ñð&¸I„ÁVr «8A@wäÄ ž4#8q‚{ÉE=©8Yˆ' zqâ0ÞmôžøC"vÀûÖŒe`Š,lÿg¾¢·Þ]t½´’ËÊ6’lô,‹w8òU]éSöÚ\ד!r¾ßøÑ\›£0ÖZÄŒe,éEŠîµž'_s­rÏ“¶Ÿ‡þN"}ã@nÐÁbÌay 6 ~æ:Ø]ÛùmôáQK›Õ _?B\§J7  ±¨•b‰ß„YÝÀm;üXÈX¥m¾k#ýrô„9õy˾*åh=HñŽ”X T"¥Módú·yÅõ˷༓T*c8óP8Áï «Q­ÿÊki8¸© ³ûå|Lþø3¶â-0!N%”¼õSgE>Õ¼õs‡&}äÿ vŸ ^ÿºê#*ÁÑxžƒ7‰c¾¬x¨ë«q  Ñ£ñÛCç_jŸ¯º ÃõïO‡!àÐä#‚©sõ x¿(©ò¾é¾¨\ßþÊùŸôozP£Ö/wóÍMŠ&©)B,„ÛûÒûâ* 9 Tñ2sPô{ð>Ð;ðÙáß‚W2¹åQ[¤ñC$‚æ×O0 ÌÏ4Ç+"Ð~<›~LÒ ­ QÄxkêéìˆýFýÛOZºä¾Ä4Ný+Rè9S¼9·1Å$™™Ø ¶mõ„ü‡õÎs`›†ùc–øóÑ£ `°fÿzå¢@¸•¹¯eÎbêså#AѦªò-#ümn^¹*u<·6ðˆ *mANXdÅ?2îß~~Ü©ƒÍsÙ #óaú¿ô£á“sñæX£×"êa~m ¬½|4Öב<%s¥ùç©OÖ'*Rœp-À‰›¥ŒÀá Ö‡ ¬‡#¨Í?O}ÊXWãW)ðnD{‡çnö`¸±Ž 4ÿ<õ¹ßi+´dzZA)„1‰iÊjŠ-ú¸ÆŽ’euÖ#¤bždÖþz:Þ{¼ ä©h˜£×è:"Þ{¼ÑœÒçøqŽˆå’òþgÐQñѧ, é€õd4ГÌz8‚žŽ>e¬yL$D+l”\ £Úë:R>ú¼Ñ²H­– tdkQJFŸAGËGŸ²>d”û·m '›õp=-}ÊX61OË:²­±Ž £å£Ï×—uÞn3Jy£ y‘Rb£wÐm HFj ä ¤2㑟(„Xéˆ*x¥©H)¼0i H¸¢)B Q]¬;ðåAÔöFì± ~?ÁN¹jÚœ^¿ƒ©K½y «€D¡B@,r2ÃÛ ¨N(+Œ4ô+Ê™@£‡÷P½r]-€å"+Â`«.b7 d Ú*‘* „»WÞUÛÀU‡ú‡a‘ CáYÀ²HuÂÂ-³—‡ZÈmOKìŸ`è¨ß i ‘ýŒRÄ¿K•oÚQ”ÙsMF'M¥ûɰïs˜<Ô[p3.[kY­øû=ukm; žã¡½¯ Ì>+Aiþyêóõô@Ì+Ô·’‹c-:L`M}ç7ýÀH½¥hŸ#è›»§7 ß• =7°–ê~ d\úÔíjЗqãÜ>e'h«lÁ¶W±ÍzÐå~$fÎÐâ7h¸^ôÂ$VH»ú B×2b ”ÁÏÃä›?¾sT­Báõø¢©t`ÏŠ!ßùüa™©àk+‡ë˜ä¥3èv½éz‚mxbRD°°¨¯Å&jàà.òü ‹¤Ðû.&k`6}“5éâÇÕ—¬™…£/Yã“5zYãAÞsôŸDú[P\\¹}çÌEß¹!ƒ!Œ^ô46Lß0Ù¤Í$mÓrŒ…'(O]Y[z¡úþ'è›kx“XxŸ'«Œ¶Öããá;z³6_Ÿ/ú¯ÙêjóÏSŸ'woü„L½8uéa ¬FEdVORéô¼‘"Xb.üxûYA½„æ»r( ŒÆ®+ªÄëdà;OT¦µ~d3—~î ü.Š­Žè%­ýØn«Ç=kÂ~žú¼+›Š/îcR‰¬÷1 ô»Œ´^„£Á­9òëÚ;Я£4Š~€ Uæ×§Gt¹ÍŸ†ºz·Oc‚äÈ·OÃVlŸ†GìÓxæF¸ä! ¯Kz•ÉoVÉN™œHº¸)“pÖŽètIÑk¸˜.‰Œ[ÚUÉ:¾á¢æI¼ÆØ¨Tå[Ðí•´ù "@~ÉvJ>ÎÑÉö*²z“í¨™½h¯WµD{•òw›h‡}¯Ëã9,Ú[ßš“ì0Á®˜—ëã½®ÈîÊc±fPõé2e\aÈ3c¼…Öæù¯ºÏï;´‘íͳ-¶ñ*î—´Ó2>÷ ~¸zß'¶©Âî4Mã,[‰GŒk\é%ºm¹W!è¾`å«äÔÇG¯úHá<‚æë…7¹¾‹ùta‹¼Xÿjˆo8bÒöóÐß²j…Àåð)ýìËcìÚgÅY›Ÿ0iûyèo´Èٰڔ̞Å.8­l]1iûyèïiË")£DÃÏ¥6”J±E”ÕÖïÞß²/qsG<á¬ù sÄ»÷wÆÏ0G(íòˆ9âÝû{±R©yã<ÃñàP*©œ1G¼{j¿ªìM÷Ä3ÌÊšŸ0G¼{jºB1’7âæ¥]1G¼{wEËQ V¨SEmGe1.ºxMªB¾ÒÒq4SȾ!È(C˜Ñw–ÂŒ®‘ÿÚ±†À!r‘ïôƒ÷‰j|R,w1 Pø)ë)ЬJ\…¬“¡U,=s€ü•ñr¥ÊYN…2?"¶’ð¾<ÉôXÔîqµ˜Îà¶°·ävyLU”À†Ô¨ŠˆŠª}ÇU—(I§q-%°útŠÇTY’.ŠZÝeIBEâ,I0IRW*Kñ²Ä0'KÆû¨jj_ã””*3¶Ia½âD¼…†¼„YÖ(ÛI$P@ǶÈÿ(¥¹†bI\]O® 7Ôýø™obk’Â]k 0¶½³åÍÞDû쑨­oVùçqÃÏg_G+Ó<&ñ|Ðf÷µc%Ì{€ë%bæé‹ zÈL±øPýƒõ£"ÙÖÍì)ÃD[XÝ :Æ”îk,¾ó yBö#²us[ײ-Ñp›èÔßn_“uàxÄ&+Øç©Ç§e)V*ËæFDÔþ¸ê>¢‚nOQ/;Ôx‚ö¦H#o@¿‚Ò82à†¥¶d8þæW”ñ YÆÆøsY!IQ@b|]§1¾ŒñÄxZ“J¥hã¥ñ-L4¾áwå¥ñ5MÕvRP-\>˜%Õ´…·v\Ö½Â7µ`ªLå>Åœv7›RUû´mÌ'5ÀèE7™ƒ:'<‰”&Q/»”†ŠÿÝ’Ò0â SR)Mvžº éÚØ%¼„tm¼ô%¤ñBÚ0'¤Æ›ŒÎk]\ 1ižUjçã',/ºO‹,dUžRdJHtœ:1ÊM³†Øå«69ÊüøàªQ¬“T޲U8ÀXõΊ7 í¶WùŒ)Ö§j¬ó„¼ÊwïígÌGËt„pX²f"4 F¾/ŠR%˜Šl¿£<ú»‡^ó•aU¦°¶®„ââ#+—þ‡·_ÇäcÀ]¤ÂS¥F”•ø¸ìÇEÒ"Œ=ïBsçW>5äù‘Èÿ­@×’˜=gµ‡"ÿªX}*£P¾ \”E—nõöøZˆøK¶¾8N?\TÅÔ*¯<Æxƒý9:—tEI¹ìevDdN|Éù1™ëúÿ¡Û_Hè RÆúŽ÷æo·Ê5‹É=íó{tèîOДä+%^$ÅCãÕyÿ€¤ÃþÿFÒr&é–È€›0Ó»J?öÁR½?á­ˆPÔ|Å#F÷<)¹Ê 1 ®4 ²(cÒÿðˆÝ&ýûç§/¨”l‡B@ÿÃSVk*"²˜JwºZ‰«›USdઇßýLMÅ_´ÐyÚ‡¢Šœ>Ø]õ¾å‚q‘Ù8~>iá6è#gáý‹Š%"¤š+ò®"w$µ‘¶I5éœ$æ‹×•†Èìy¿qUîÎØm7Ø?#U!Jä?…‡7Öq¶j‰(Ä0JÒ¬*ól+É ™^êÍÛC~”¬ð£qÿöóã"]ýãQÕC$ÉPRªgˆ;F¢1’~í·ùáÀ-kc=†øç¤)$‰ø”.@·*>ˆêÊ+M.@’Æ”¦Ê¼\d¤{“æÿÃ4…û·Ÿ·`åà¤Ú…Ðþii Ï ×sѳØ$‹8 $JI^óuññ÷B)¸Ê!VGКžúä«BìRú" ŽžûÚ°dk¹Ž ·þ<ô(µÌ¾ù4uÒ^ª,JÁÞ-+suzµùç©ÏÝ&€³éòFªn˜¸¸ÎF3=y¬ùFÈGŸ²¾ÕÃ"äÂÍV¯GpòÞãc GH=ͬÓ#è ùèóNÈ:OSè$ž#ô”Hxa‘KGp'ä½O3]óOøk!æifA#ä£G%ä‘`OH7ši§Gp#ä½Ï •BP>ÓÒÀfqðËíGÐòÙ§2V§ñ„\Ø¢™ëà.BÞ{ÔlV‹ t4[AGÈgŸ¯ù{ç͇ ET³#pIº ¤¢Á@®Ž·É`ý¡ˆÒÆD**g±s0Š›"¡2’ðR¥!Ô.Š PÁ—a©ÒÈ-sPÓpê;’‘æ•‚bnàTlFñbm ݸø#™”ùC˜7$r%ª½Š”“†[JÀ'ñd¾¨éâÍ+üM¹ ‰b¿ˆ ¡„ iÆ iøº´vêo\i”gÐ"ß·v,³'+æ\¼Užk¡?é-3üɳ+"›aŒ7PHqÅtm³ÔÙYg.°Ï¡°[ÄM՘̖ãZõ÷ƒ:£àÚyØ«žŒ­xÇ`G>û{=7Pè±.ã!:ø W3ؘÍ@?(*_@—<ƒ[óôüÛoÅìž|©w°B}_û3‘>rqû3WÀe–ýþt)“°öÇjûãÛŸ=î'àü>p{Iȑœ_7p Ïù |X'ÐQ)Öw4þ=z¬ä;7$;IªY²©¼+ˆE©™ÍJ8_ÈQeÈw.L¥t |m`áÔ9ž(°ô èvdœv ÄÆ’1@ Z–Œ™HÐÞLÆLx^2f@Äf'b&€2t»ˆò0’ÉÜýJeŒGLÆèeŒyÓ«¢gŒ‘9zãʮɱYš*T”™"ȼ˜•îrÆ;îš6NjrÝ7Ž]Ýg!ù¶n²ÊikA1.~p©—2kóû*Ðo ÿ¡Ž 6ÿ<õy5 ‰9,gsjaÎaÌæHèxùè'&Ò‚úEç¡“wý¬©´³®RÙ'µa”³zjCŽP‘ïÇÈuk¤"¯ÃzT>5´íÓ ª¨eŸ†-X¿ è‡ñ Êhqðô^}Ü@R”Ôœú$Á)ãõG€`¦?&-½bŠ!FUzþ˜"¼éa×è¾04Ïœo@·#ñ´õ³“혶HB>V.Ìëe;ÀžŠÓ•XÊN2ÏÑ]‡‰öD%§rZ¢}CT´/Љö äýž=õ½Xb"\>ÏsNÔ _ã/¬±8ÍdØeýw&kmmW R\ƒk;ðä×ðÝÎÜg1DX“56³9Ä8øÁ¢N´¯­7ÒAîK^vU¼÷÷úSnåtè‹¿Í.&²\á/~~àubvœ=g¿…™<™Ê²sxµŽpúHÍ9 FÇ;’Û/þ¥¾eÌÛ–+êîå_ïòL©qötž*rË•wߨ0`_OãFš©Ê%†"0bzóëXV¸2l¥…øåø¯ô/3±Û_GìÉm|õÄ~‚rÍEJ‘£¡ãv¥ÿ‚Ü>ûû'¹˜ÿ${S IÝ0¥E†ÔJÚ?{Øqb¯zý¦ÃÂ~ùìüä'{ü8Aﮑ;D²% xÚxïsþÅžædÿoÿà$gæÄ軳yý¢OE£°†ji žýBÜ©Tñà"âaÈ=þRû|ý½Î0—ÌÉÏMª’Êêßòë¿õ0:çA¿k:åwkˆEÆ…à'ÝÎÏQÿö'G ‹\¿Ü­”ð‚~2v6÷¤‚ž,`Ž˜² z§€¦wJi—×¢à_½Ê{ì>Ì;ðŸì~Æå"¡@/‰Å(å§â’¸²ÃÇTƒOQðÿóè\¯.—*öÆŸô??þÛÏ 7uÂ[yrHEY´8Gox¸À3Æ$É9(ŸØm÷ ƒ-Fž}èí8È_à†AÜÁq<=º‰ÞÂÅ»x’=Ïé²úB¨gpGzý'|É(LÌɹv¼ÀšsCÿÉqÿöóã’5—Œ(&œñÿ7ôÿ6» ÿ÷¿ýÏÿŽf÷ÿûû·ûþËþ¯èˆþœÛÿñ_þó¿ýOþ¯ÿþ_ÿÛÿgÀèתÛ\¯4øÑf-Î /n¤øä…=Ï_z|áþp†‡ßþßÿ“õTöx)_‚¢ÌDq•Ã몗&ÂÔðÆÍ…ì<îJü¿ÿÇÿàцƒ:þvƒè·ATøFÚ^y~Œ"¡Ÿ¡Ñµ;Üðžsþ]ÌBñ[|”x‘Åd^L¯ß®Šë+´s”’¦²­ ¡.¨_É&gÏÑF@IžšL™¹»Dî• Q´-A”+m3Lž<2^c‘¤;ÈËßsþÝl\#%Ì1ª¸®[Ô%­:ȃCÕa‚¨è6ý$è†ü;7¥¹ J济j¤™ÛÒ[öô«@+¦î”ó|Æ£‡Ô¶ð"’~2Ü„$€– Ø‚'4B\€“8Óšsæô ˜)Ž{BIÜd°R*WÈëw¦w7åy¨á(&€+h¦Õd6I Ç'”êi¢*Ð K7~«ƒ¦‘¥p-A34_¶œ£¼Z‚· öoÔ@B-5uÎpJ¯Mb'f\t…(‡KôÆ/¸Ð¢Dœ [Es–K¬Û´;%1”mÊ›ÝCdúúM·wvªÞ‘|€°¸Ò›3Ä=ßVÙpãŠÂ/æò”¡d⇕ÎZ,·cm€"ÿ‰(Š™lÙ™T YQñ*µ•ñªšÀ$}ýbnñ^)•È\¹&r "&™¯ª;[ÏÁ´±ÈWÁ=2l¹H½š(½ ¨_Q  ëœÏKdnâS wtòA §ª[YFôçÄÆt(0X²;z…‰ 0"ÿ”Mr&Ù]:0hŒ9yù¨1Fåw'T9hC>¡(ókL@ú`Xá)êXËEÙ.èdBæ&ß3é D÷ÄìX›!   ¥ÌT^ÔœE$";VMH¯™…=dÇS³¯b‡NÊùCEI«*²à÷!á~w ü5 ÿèl_"M.Ö¦êK6^ü!Ë—^ù´-l—»i…£ÄÍâ–%?os™X ‰n@ëû*]tªùÄ,H:½}ê&v/þЕŒWÒÃ¥m›¥-…M¹¦Û Æ‚TC”¤zðâ²*™.£ŠD‘B˜¡#Ò…Yï¯$ôø²ZdÊeŽ)ç/‹.ÏB² ¡È\/méšD?DÖ/íVnÊô¬WÕo|r—ÌWiY ss"ˆú E¦Ëa#É¢–foã*2¾‰T½Ñ›.ò…ëw5å#"¥má~ÈÌT9Ý— SݨàÿÖÒ–ê0ªm3k×h{eYíÎÄz)š'dÂx—„ ñ«œrVN:ç¢>r[˜õ0´~è¥ËQÆùg˜ùhzT‘t)!·µ”Úõ£bý¼r>˵™!]åb{Îaôôñ]¢(ùÊêç /@¿ï’xÞNCàa)ì‰Qå@U%"+›´¥ã¾» ´…R•¼ ý ]5ß§S5Ô¥p•w³ô”¾|ÔÍ!¨×%¢É^ÀÊZ µ2DÞsåsÊOö­lõSöå³R_ˆQE\W~óùJ Eo˜~yéØQdxÝ´r}Íè¿‚‰Â<Ã{Dkð¥2ç¬Hà«D… E‹@€@c»Ê.~”XÄæ¶W—ï(\_¤©Lí.ž‚<ÔËŸÄÍo(ƒÐ¥Âßå$\ŸV¸(„š[’‹ ÷*Zžˆu<˜˜DžVÓ­P„²ˆlç ºôN@¥FhÆWÖóì#W:yÊÅÖ þàÕ+“\U%‡Vae#H¤•|Yó’Eq&A¬l4Rþ哤"4()Ó¤0‰f‘¸¤»/A“ŽÕn–ÈW,Ë¥ìŠ*¼*[’ÔÞ òLÖJa4,\‰.ø[Uà‹Âv%5@;ÉæLé”JPíãí¬¸i8Mg<'¬bm|rß“;l̃73TõWºápYŠwÉJÎxÆÍlx³©¹i[Js&”ßmR(f±ãPDÊÇ®Ùv~¨–Û±ŸñŸ_[$Žç¦1 –§Êá-zUç2 Ü[+ ñ”¯°F ºÞºöMuÂæ)1âtGZ ÞÌK”o(‡Î,J… ¸åµßê¡/@]ÖO#™.Yè³*Âi•/Yƒ«‰ñÉ!BŠ jBöˬgü .Ùº.ùÎn ¡âV…X³7æh:½éR8®ÑL£’õMë%ã ô¹Ðm!‘­Q(¤Gñ —”Éà–|–˜}ïF2%ñwY¢ŒÊÆL¨y|ƒ\û¹h§Z_C¹tñ½mv'"#q€¬ÛîÄ'“Û/TFÉ¥RN3ÜâÂ\›©õï1бY„kæH77ê>a2N³ºÊjhç¸g‚è–A¹´·f¯Îu„R˜"ÌGQe0O_R@…Z™´ñ^x4á’e~UM·d˜ä™ähŒv¥àj™ÄY-5-Z<7ÜFõsŒMç§6ºÁ6:(Y,ƒz¿­ÌFºµ9ÊB Źͩ¨â‘¹À—?®ð‘ª‰hÐ-ˆùŒBØ&BWæŠ^ÚvZ%ŒÒ´¶!lQȸ‚#×”L“ eÈ`!2üŠI>VÇ7û ½¡| µ4Â)¬f3(ZRV†ˆªü3k“ØU¬H ÔA³^è>C2¤W™]àÃo°l–©­QÙÄ!ð-ïCpBÄeÕ\‡í£IÚ¡n’\š§˜9éW04wúU•26_b©$1'ÊŸêô˜@VˈØYÁ•¥Jß+jгj|¬wÂÏ&j³VZkàõ’VÀmÙ™`Ê0 ]1ç4ÊìÀ2X®æÉ[úÔ*USjʉ+&Æd&IœßYÿ†¥U×Zƒô&¾ÒƉû¬öp8ÐCÚ®÷S¦.æªLþÅ(äã‰û$_«øc]dN¬M^±p½’'Svaù#®ñCJ³©^&’¡©¯Èˆb8„@׫Y7:D5s CVÄ¢T&!Ä"ôlu1Aù]–/þᦫJfIo| lM)hAšÒ½3ß³3ËÓÇKg…ó B:ä°|&â¬èzM„Á‘­AoÞÝ‚ŠAz³E|9+Ý]½áYù3áo‡P ÷Õfsi7µ gå=<¬Ã,Ô ¸„&Ý)hI,M-™ý|B©>¶q'ÝÍ"“u¨K. V ÕÓØô{1ìFfSál´õÊu´ò·HîëœdµSÛÄþWr}tÈT¸›\З`WQÛ¤o™Ô•>8ü ªauKwXÔÄe›ù³²ªî•«­€OJ¾Àò¤*/” J2"Å»I« GsV{:.‚æJ,¿>õß-O‚ñŠ<²'!Ùd½f³Ï*ð¡üÁ—êÈj¹fû)޲zoÅeÔÈHŒ„åKnṂÚ"˜•AÎ;»‚ºùCk‹ãÙ´gáÛÌÇF0ãSã#” 1ƒx5cè+³càÒÞ<ŽË‚0B(ÒÌ¥­ªË$¤i"r\›dXîÌîÒR-»]ƒ7ÙxÊN‰# £Î×,ÑŸï”EÈRKѾX½$žC¯'"|²¨á(ØóƒΠ\£vv9KSªæEGŸØ §´ÏôÃyºÐ•Ë_ð"Ç¢©¸ r“w§ÜèùÚFù¤èýïU ·KÓkl7rbï ùÖ:Ýä¦gdsò=Ï8üØ›TjÕÀ—*þ ø:­ŸSÒSZ&f‡Bµ˜?=pà'ÑÔ®¤žê®ñELÎ è)n¼‹ä޶â¨@€¬2'5:“."QE"16¥eýðZŸÂãX÷âHÌKU9ò+J[‘ôø!Xà—ì§FfõDn›’Õ„Ma¯yæxÞ&RÖ°ÐßT<ߪ»'·«¬ny"œˆ0¹‡ï¤ÊìÓ‚>$¼xp´lÌáå`„’wTÃàØPhÑü»d>³!–h‹”ª5¥P1B¹Àz»ºüP¼ð#;ÖÆAU÷8Xõ1ue(C¬ãk𪟌\r'}pY‘ ‹½n¡ƒC;í¨gy;XrWNŽE«·ll^ÂR®kÑV„vû`»Íf¬O§tÌd~1«Rtõ¼ÑØ]rhI~8²„‚eqšÁo™ùJK2¥ò h“ 4ì·ÆÛõÞTy "3ÚPœKÑëúUsQ‰;˜{ˆÚ|ºPMDµKÄœyBŠ„*)3WÔ\U­á/*òuô¦ŠM)¢º&9bx ÐQÔÅD1Ü#Žxó«F[DýäI¯éi›²œêÚÖ|ØvªWÑ ÅmOÇúP÷*…xè!yéœã%v§¨žsªŽòÔ%DÉ€éY",E»ûkñPzY7ÅsjPûAãÃëwµÈ‘Mñ¾lß4w7*’&´ÝTNT7V¿EnQUÏ؃¢Î5wîvó[´å¤("B×dOú<"7mËoA¦n«®J*2À¤Rüì¦|w+ä/¦J¹$FC༻»³ endstream endobj 146 0 obj <>stream $’[¢Æqu5ðAÇaO~WãðZ®×ËqþŠ‚¤ÄåÃ’Ì»aâósÙWˆ"ª¸².±ÍÚ²×"¢ *Ö¶ÉgÏUxàá¹T1“€úÙµÚ2š¼Mš´Ðl"jPJy™Ù,rað^¹°î¢%2V„RKs.G$3rµßÁ'ÔnïXwo¡°>ò†‰òmsª‚‘’s¤ÙS\©úEu¡Î²Þ-‰´©\¬À†]+õRùÜ;±ÈqlºjÐÒVC7ûèke³-—‘:üª=,´¦±ƒŠºK¦¦Gi[-Hc}Cƒ½%üCöM â¶èÊ¥øOh¨zX$·¼\¥ Äj<¥”Þ‘²§¼’b'¡J I‚µéE ^tØ-Ì~)‰OþûųE°t5Î?†ýÝb›$Í {Z›†6I¬~­QœAE»êKëíl5›„š=º*èÅ}ê⥽»¦£~PôQÈ|4PnˆïÒêÎHÞ¾[9ô—Ó¬˜|œ¯qsíßè¡]FXÉÊPÐ׃ÚP]ˆ¬µ¢vÐ¥bÏ)2ŸT~„5“ÜL7[¸<™ƒ™ rWûëW_9íb©º÷¯•¨êù¥HBDµ°ÇÄ&Ö³›Ø±ôºàý˜‰ R²ŽÎ÷ðÌߺÜÃtyû¸ËÇjŰ4¤—u]Íû8óΦQ>Í ãì-^Že qîøF¢,¼bdR÷Èn™Êf3çâ5—Ø#y+î1Ȧœ[ËJl²´´L}•<ÊÈïàNÈ´Êue…m¦fEö–£¢PW3FæÛQÓŒ&óïÕÊñ[jO`óA5óVÈn¤~ŠDL HʬÅ4Êçß©Y ŠßºªÇË̵º˜ê á ø›hQTóÒôÐÈ×szG†rðªÜt.v’Ljf6S çÝŽ>ŒQe;2¸Ù,иRÈÃ¥¤ËÝ ÍYƒu°ú žŽBÙ2³Ù º¡É— ÖfThâ0 j@YãÊ£2.½-L(—#jãÞÔ)Çèßì¾Ñ"Š~|ѬóUƒÍ&]ÅöøûÎeÙ^‚„d‰JZ[+^ôïj¶áÅ&Õk.Í#M`·w¸Ô“CQ?µšB4t…TئV¿7 ¨pö_EŒ—¶LœbZ“^¢.M¡–ìwôì¾›Ùö2ßQçzÓ8ƒGò>öH€KR_0NUáQ¬2 t¦¬"V©´ú;нá8úÝ1©P uƳ•yé˜Bó¤i>óA’Òy±‘„v†"¨m¾ÃG=P)¾¸¢;ÄXÐÔºìŸ2_ÑI%þeŸXÕÈ=Lƒ†`B•4@r#ÀŒ£,¶°ƒ¾JÀ¡kô,È`$ˆ3¯«„ 0³ Ø”Åq¡hÒTX[B0ˆP]hœùõ»VmèIѰ%3±iP1]Ís¢[læpH|$°Ò—}œk2wì òÍe1+ЗR€HÆG-Jº®©µº³ßÑ´ó½™Ù ö÷ä&’,sqúÆwV#p.vcÔÕïJyqè±»KA“¨IÈnYt"u~s6ƒŠÀˆúN.f"STs–„»_æhðªãÅJ;+4¥‰!WJDu ú¸ŸšWö¤vE£Ù²æÜÕ"‘ÄæUÂFÀ“(–åÆù®¤Y¾(ÑÇ©ÇѾy?ýÌ«¥¯^ꛂÁóq£Ý\l’!Jsز ¥Xô§ß±œÊÅlÉy]Ë!Kôç´B²²Ž!9È tKæAmxµÛt*ÃÈ?ÄÔiżÔõ’o-ª‹Zíuò|-«À*ß%óºJܶ?¼Ûš«”1;sŠ¢E’c׃¸[.‰¦w®Z’bQ‘™øÀd+aÍê]\u'2ôð úµU5°‰•bE#‰$ÈÉ:k[Ó/U£.®A%ŒÅ…Y"{*$§^ÍììÈÅ5pŠùE¸ª¢b¢Zc£é@zNÇÂÖI½>d½ñ'výÓ°´'jîn*›ò¡pª¸Ýv-WÔ 9öÛŠ;¼Ø©Ãå,(^ ñQ%^ÀÙØ/ ‰ïtÙY ª_·§‹sx?ü¥…˜»iŒÛÖ..¸L]©—Œ«ûMÓ¸ìˆwW§Â]Ý>W½'‰ªI;(º{çz’Y¢Å.ˆøQ-š Jº½r˜œ5Mn,P"K‰÷ãý~Jï¥Õ’uVˆeC¾#In‘g¨W¬svJ*Ñw1š.Â{Þ8¦Dô6ÃqÊŠºÝ¨!TÈKô$‘ÍUïÿP¦¸¤ŠE…%Ž}ÿ›é0©‡§jö4 )r Q8iå„Vͺ¯ÜŒx²K~ÆÅ‰ý˜õZ¡?Aµ ͹oÚNŒ¼+vgé%\ECu\¹W5@ªš_*œÙ° ¦ƒÈ…‹+)Ë2•Ò¾øñïÕTöEOý´´®Š);|`gª*ÈŸ") ÚÆôØô«;š5­°ñ º4Á{‘7k]›*^&¨Q\GÀ/•"¦d©dd”}OÕ\ƒ™kC¸ŒD@.#Q¬ðtÝ|é*ÇbÓ®ÙPêJœa›Ê埗V¶JJ³ šš´”ËFÕÀQ@ÌÑ+vz´³Ÿræ²ê> õÿ‘òǽB²,!e„¹.ÍùxÏ9û8•Mä«iJûÖ¥BV ´å&¸(¤)¹Vkµ` äÔI¸DÔ4µ·Á¨(¥É¥ëQ¬ÄàäB\Ó»Ô LM¡c›|×Þk­}Öyg3ïûîóžõ<±&3‹ó±ÎÞû·{¯½>òOë_v=€–qk†=Òw/œõgËþ½óܸ}oümÓÃ.‚S#|MlCžÏæ}·òÔ¬œ;®õ4ïû˜v· ËÔÇ4]pOÓ£™v\cê-_œÛþŸãå8¶³4aœ‚{Ò;ÍgñŠ£2±L éªr»ÌvEéêkuL•7ÿíÍÆ87 ÅAÛ;q>÷.Å 6ûþSkmB;ñéÞº“;h¤á(«ã¢Ÿt#‡ÁÕ©=/]¼õ3Íâ¼OñìÏ«*OãCüt’ÊW–“UNrÚÉþڒ¾ôr•ƺ!<íVOƒüº‹QìÚ›æÇ)®ƒ»~²‹| ‡÷´]l—k_ÚŽOÝÉMÝÅRÚ³¹k’ÝŠÝ>ÂÌÊ¡’íÇ宋íáÓÿ²Ø;`¼ºŸä¦óÕù~ÕìÐõãM»'uØï7ù’9 §\N¬ÝÅôC¬Ú8j›Ó£Õòs#³›×>ž×§©kvšUdm DzÏó}§³¶ûÂx×§íúÚS‰ûæôv¡¡¶U¡Ÿ¨;Ñ/¦¹[Ã,h^Ls“gŸ¿Ú•aú¦øYž¸e1ÍÜgñZ¶+ï¤q-©çdûÞ¾—ÜNœ‰¬{a>º“©ºª¤.!i†ª¶ÎíˆËt¯™ž‘·‹µíänñŠ£›òw[áÓ3¦v9Ì~гÜQ¨[u'wœ-‹6ÚÊû†PÐulÊ÷+ñ²¾]vgœz¤Ryžá¢×Éb§¸9ë[ªÛo×4“nØB¬\“&È›ÄÁ/‹ÔÝ0Ýœ-ãóñÅ#ÎRšÛ‚›xÏ–'%šäemËÎÎz+ò²˜·f’;!´UÉýæÒóevÙ÷þEËYk3ŠO»‘ZÌ»…E»¢ô¬}uËÞÄ[¼´wºuOcõâTs“<ñÂ|™ûÚ÷w¢‹QÑSc’[tÚ•Þck{Ú±~q Aß(°Œ¹5PM¿+ùkcðŒr·ú~;-Fñ‘rþÖîa1Ê£&¹r»«sP¤1G‹ô0.?ˆ£ÔÛ5,â˜ÔCr‘ž—o–ñB~xo3ÛÚMswÐeªÜ"?IÙa1Ž]Kóñ¿“*;üóŒJÝa¸LƒÄâ@´Ej¦IïL×o«¯HÝãWijÓ*rÆq1ºüSé÷7ñ*¹™µÈùgÕi¶-Ú™­ZqbçˆE?®|œ'Pj'Ž;û.Âí[ÎW¹vâIf}Åú5i«¤™ú.‹I1¶dÛÙ»ÒtL´MUýoË=ŽS¦v©¶ñªåiÜ×9 èÇÄ\<äÞ¯‹Iœ‡*µPÌfË´©Æ¹Ùx<ÍÑÓ?4HÒãÀÔ¢ûntˤÖõ<ž4õ“éÚ–Ó¥Uz”Þ:ꛣº.mQ+9‹¿¿knŽ ­î€ÚÂ4ûÏ<ͼÒãFót"ïŠRÍ&6P§öët'²ŒOÚ’Ôl¼H]`Û¢yìJÛ.É×/îÕž5fi÷ta×F>Ë ¹k/~mÎÑéצŽN‹i€ð§)å§¶ð´‰iln«_t­4méd°ÓбöÖE[øbOœùñ ¸Hm±hœ. ºgñã›|ñ0Y= IÏØ»Òôü&] ·EíõkW”bqºö&u[Lã•_÷Sc“çb{ýõ‹i?ò§+mFéKºyŒâÇ-æ»Þûß;<®U0> \¤é&Þø÷öÛ%u¿éŸé-úÉÿFy”@[ÔÏÏ;ÊÚK­8X©o|n¯úÚ'CEu»ËÒ$ñ!^úe£ô4m/ÿy@}ÛÌØ5 û66\çßÚ%òøTo™ŽÎî2¨hT_LâEUß’Ÿ_Ø·¾§föR3ŸÒÌâR3>ÖÊŸ8Ÿ§C*޶笸î\ÿ¼ª=ßÍVÏ!çó“ü !öœï>kkz Ó†Sÿ Í¿Ò~ZÓ=ç Q7Ï'Ô®SwÚvÖósuqÞå6ôOðâdXíÉ.?«K·íǵ7ç}øŒÒ{ûhOÃNÛ$ÕÞ=Ui¯df«ýšZ­â޹rÎîàtߣ81ÅzÐv é×6©quØò[WW2Ý™'_u¹¿8Q´oÏÖž%.ã…t»ô¤³é.ªº/gØ&>Ž-.âм…c'íö…íƒø”¯Ic“å®3Û(NØtu:ˆç9íÄÉTÛ¡éŠ5u+V>™ÃKº3[s“Fž-¦«î “Ø—oí†gœ›ã»%!šØßLGùB>Mɹ=­Á•Þ;MG“›5Æy:ŽE“;ýóíH:ÅåÔ'AiKû,é×öרã<ÇD.ÊW2«Ò8ºm­h’.<‹¢Ñ¬ßTg~ái>îôß»ªà´,ú?Ò ãXév»Äñr“üˆo1ÏÓÐõS”/æñ Ÿ?¥/éÛlú)eÛ»ÈØy§»•èvåb§ïÍ¿ˆ´÷}yÂÔ1³»LSǾ|ó•n·ç©z}§“Pg))‹ò)uý½iœõ¢olm3GéPKýŽOi"È-ïûÇéVì¢×LVÓ¤Å+ê\:J{+vÖhƫۉî!G[NVqˆX—¯›qnÂçõMºè¯š¦ëîXó{cM›q ‹º×rG µc¡ïœæY¤\EQŽáÓ]§9üO$§¦ø¨ªåYªÆyò¦fœ§jϧŽnËåh˜ô›i™‡ˆ¥çôí&]2CÑ¬ß ýsìq¾\kKó]|êlÔ½w'mâõýziZ7¢Ýíís´~xò(NæÚ.HÓnÏÔí6u}hš|Ò^CÒ S[I?Þ±YÄn×)F±¿iÓΔF§ÞôsOâŽïŠV™&¹Mª}a¾EŸÅ.M»`^‘î›E1þ­ðѾ7ß?Ï☧¦YÝÉæõ âÜOý w†n–yTh{ߨž›e~¢ÐŸÇ›&^¯ä]™¶8Oçâ4ÛA[“Qê7–—Th⤰é½i*Úf±º‡Ì_2OK,®ZFšyì>žê¼ŒîÛæY;ÒÀðf^lù´{±-!í¢Ø± é'ÁHÒº¢4³Lß±£]+"uéšÌâE@»Þsü¹}/¹fgu·˜®•ši<¥Ÿ›¦èkúÙ\óÍq3Íôó›4“xOœÓÇt‘çyÞCéÖµé§+=ÝAÿÑqš:}°¥qúÍ$÷Šç¶–ö{ã\#}KEÓ^‹~ï¦ÁœÍ$6þÇþÝ%I3Í—}†oÒ]J~o|„Üìä^å£<ª¦éû6ö}ÞÚÞ^’¦Ë™4Â¥="û&ÂIw4/Gyòñ¾÷G“îvsðÆñFÍru¤^ªÍ²›aÛ¢¾Åa»Ä§÷Îó14M/œŒòÂ+ë'œ|bJý…ºÆ…ÚÓ¼p¸ð]wšÅê:k´W2é×`õ‡×<¶ ç='nf«Åù´°³j¸Jíû–žõ=¬qävùD¼‰C Ò¡œ;­4±GCìR1Oy”ç/ï–q‰ïí/kvúá3Mš=~'BjKâ•X?L¥=ò“¾§kšJµÝ‘ã´(@žÕ¨É“Y¯¦7q€gŠ <:>ìŒƒÅÆùp$â‚-óåj.Ÿtk¾‰ë‰ gˆþ¡ô8Î#kæ®4¨§y¬YÛÖ”/ÚÓ}ÕÚྃlûÌ$ÞÓ¾ q’ÏfÓ<ömíÉJšÌ76zNÒjw;ùÉB?µP>û¤éÿòUÝ4Vy’ïݦé9âb’[Ÿúã{×[ÓÌmíÃ¥Yš5 üÎTãiŸØN>²“¾v5!Ä4ÏÕÚ¶ÀÆ'nÓ|ÓÜ=öH3¬ª\¾wšzLVs—¤ùVcƒî4N³\Í65Šg¶…/Í>˜&–\Lòù¾Ÿá hÈîjÑäÆèÔM!7:MOYäo‘æùÊ7q± IwÉ‘.D›ü°$ 8îo•sÃ~zkZú {TÆ“­®iÒáÐ?ÏN7q¹GÃ$öÎë~~ÄÞ¶=Ç+ÃÕŽ)Ÿ+Nó¼…‹qî¼0Í‹o„H2®6Ô¸;æãa’›·c¿þÜÞ-ƒ=ZK)kQwr£ïbœGÏòâZ]<¤ehb×6”–«éVӔ΋qÄ5ëvpü¬8)@¿ÂAû°´èß8ÎŒç©ï,®wX”äŽ0koLÓ8,Æq`k÷q‰Àöu±r¿¢EÑÚûm.ò“ëQªî¼ÿ´Ü!lõ­«·¶K%LÒ™d’WZ„cÑO`×÷]Û«ó<OÄ„°žtV·+ù¶!=æÏÜco¾Å$_”îÄñZé…³µ!ÛmÑdg5ó[êÙ4ͳäMó@ó¶ãPUØOͲ؉K€äSWzXÝ÷’›ô§Ð<ÙFßÁ¦}Ê9Y OI#!»Ç¡ËÔB˜xX–MüåÒöl»“ÎýBriõÓî”™¦ìÙµ­âF,×ÃýGy(B»èlûD*v„j[ÓÌ«ÂŲ;ë¬,rŸ‚œú—ñÁãÕé©Sʲ›S¯+‰ûd·R×y =loíûi3¤F€®h”¾²ë69Y.ò„¨¹¨{뢿;)_'½Î Þ»ŠÚéüÞUi·2}÷q©¾]Û®dÙ%©ÂãØ©jõº&Âë>l™zEÄ Ê\”Þ›ŸÚ/œÏ»>­iFËÝ_ÛNoßš^ØvvžæúÅÎ-£xöû¯}v™šÖÒ ¡‹elpëFéÄ•$VÏ(Ê¢ö&*½5Žó¨ëQêÙ>+¥gìóØš&*ÍÏ'Ç}Ëb2NÙsKg7–º{Ö; ä¢ôkSf[½°‰Ó˜Å¢Ük%NmRw­´‘gÓezowÍÒm÷¸ªð$N^VìŸ\”Þš&Ï)_·,éfJŸ?îߺjríJ»¢xº.+’×7NE9â’Õ yÒ§ÕÇ­µi9È«Òöbq?¹9¹+‰‹ä¢üµ±CßÚ ãóó®hŸŸ§µr;t÷˜yÛÒönª+ŠSì6iú‰xR˜æÖ³¢#P:ñ´³6‹#k%}ô%yöÍSÏX?³êíÜíöx­Ü¤ÁŽ×­—¦^]Ñ,níqIÝäI›ÔA<Hq¾³®¢©ç@±’›»¢ØÔ¤+¿ôÞԘФu}º¾X±­{z›î&ñ¾9•\œO&ë/ËOƹ?å(ϨÑV­_6t”ÏÍ86ZÅò9|wRïšT2Š÷r¹ñ=NãbÛ•&þ¬Q1Ì=usYö÷×]GŒY⟧Ô}Îè&vÁç!ÉEi#å]¼pžÏr³|ü¥í»H³üôûfšÒF×ý®Ø¯mQÕUQw£uõÚ1±H ­<Ý…ÏzQÛ¤séi²ŸÙÝ·½Ÿm´=¶ç‰¾:·÷ý+Òx¶h”žÖ¦q Ý^í?-9†Ò’åëÒPY´š®vU:Š žR:­·irkÅ87uEãâIy.íŸhEÓñî¢r*‘ü‹GÝpžõš¤É ÖŠNý!‹ÔŸïè)¥qV;¿;€šÜ8¿XEy³¦¾MÅ Ó0ˆõ¢þ˜*Íòsð4cw3?¥hTÌFÛ_–y*–fwÑd~ê;»©4„kÚ;±Ãt¾.ˆyæó]EieÌ⚢xLX¾0´Ì—Eë%éòi½p'õðMC‘òÅXW´Ìg†|Õ«ÒÌv½0_•φ¦©§u¾TŒ?óØirÿëÔ”´L39ûñÕÕi,ͽ%ùaïª(Ï’’Jr~¹tí­9²Žî.í7ݪhž£rg¾žýº²ØY¬égiçö œL»ßŸY7>¢ßÉY7¶Ð¤™RWI<>^ÏõÅV_{Ùdœ¿5N¤´V”.1v•6©óvz>”¯Xº¢Ý«K›®ÆÓñx× SŸ¯òãÒj.J[>u¬Î×^10úk›UQù¢ôµóy³ëeiHFù­i¢ˆ®h¶Ší”ÎÓÍî8öˆû1¯p²ë,i?gvšà)Ÿ’Ò°óÕ±6›§ÉDgãUjJ³ÓÎâü‹e‘Ô'ýð—e^`’/Lº£y2Û]Ôžîò{ûÒ&ÞâOòCé¶(6e¶£Dò r5´|Ò÷ñ*^˜Ç^-WƒR_µŽIÞMmm⣔¶(É|4ϳö/—ÅVÉïÝéO$ót«ÜMW¼:í**Çìô¥Ó&7%Æ)§Ú¢Eš¾)ìY=Ë ®^Øÿ¸þãÒÚV]Qžš«Ü¨©Á*Ío²ª`lû\»çLß›VJYþÛ_L׊Þ(™”ÏÊwå«Ô.3î{áíJa³Ù¬(íÝIN³4}Õ®ƒùêþ!{zפ&¦Ü=`Þß@ÆîW“8j4]D¤™­¦qò¬îêcÑo…®!5–ÎrÛJ~]ê:‰Ù6ÍGýDiK7í M‹É‘]E1?­õ}{ÖJã ìIîÛžïó”#i i.Z®µÎsÓº´kEmUv½wÔÏ –;‹Œòã«N_£ØòßÚäë£ØHÙGj3ZíË¢¨ý9ë!Ý&¸eÚÊéxnFù–¡ø‚WïîÜê¢Î[ˆÉ©·“ÓÞBäÓ²{÷î!¶éb”²À$ÏYÚ mG£t'±õ§qÙ„I\x4MúÁæã> ŒWW¸ù¦¥¡åóܸßÔÎ<-9—3xê±;Ϋ¬RsQ”Û碴ÓÄ•«¦ïEyTͩ㠷Z©°Ú¶ËÜËzÔôh›Øï$혮$>~îJæy´ùÎ)Ç[{(÷OÒOq¨æ‹®Yœ©¨xöPÜZ”/LKü¬-û®Ý£ya—º7¬‚z’ŸÇ¶û1OaW»¶(Íæ‹¢|¤ì:¤Ö¯;Ü»ºwÝ“{×éÎZÑ]ÅœùrçÔ‹¢õ»×f§(u÷êîÕÝë w¯®XÞðŠå4Wƒ§¿jŒ}Í\±|¯+–ÕxÐØ™v”k»3éG‚.úkü¼Tßt¾èB^ú5ã¹÷êôÞ¾´ïŸG‘æ äº¢Ü ¦½Êïíå8un[ÎÒ1¶Wpm{ÍæÚ¥÷¦[ÓµöGq ZuWaý{ûÒ<YQ´Ü‰]ÝÒwíÖÜY}ïlTn„¸Í|Zìínt@;W;ù{õÂþ6lœW¢+‹VçÕ²4 rØ)6sê­¦lIs¹ªrœú¢I+FM¿#^‚¶'ùYµ—ºìµ½œboоh±,–¥ýjt‹¾C[Z›5M‹¿*Ê¡ïÛпpgšR¿ÀvTÃ2¿·É›;y¶¯UëÉNì©P^|íĽµë‚q'‡éÚ ËòJkWÑdµãŠÒTÁyýÇK%«Ëã²0žßÚ‰ÿr‡¸&^i¶Í‹¢üÖqn¢Y½°ÿ±ýЄâª|g´ªð(_ñ-òB0«m—Z?wŠkÙUÃM;5ßN¾|Ï îä*§Pëg—ÏEé¸X ²Ï!9oò¾˜Ov—¬~l_ÚöŸiÒH…U»dšg'÷oÒ¤e©Âiõ“&õÕ=š6Aß#'­¤µÓj¹xQ_´j¥+KgyÄW:º®LiUÎÕhýÀ¿.¤µzÒúM?Çû4ŽI]¥­æŸ*_˜/ûð»OáW¯MûjçzuÍg×í.M±S¥æ³Yžu­mžç<[e®vbÒY>—Ó2ôi2®µ´yn¥\5 Íól«–±yž>¡lA›çÊ×M'£¼uwÒÌËEQß‚¶VºHóOGký»¯¯åŸ;ïÏÓñ…³òj#~Ü,G\k›õ—>Å gk­t]7ïŪe¬éç‰Í)¨|á¸ïM›ÐÖŠúŸ»V·Ë,žÀÊ­7ë3Z¹™gýÍWñÂÔeµÓfy@æÚÞý•Õö§µÚóR¬Ìò)oí šå ÎÊ£oUÔ£«¢î`ÞõÞÔn|t­´o_.KR#ô,OʺvÒkK'ýÝoU8_=^¦zwr³ÁÎ|5»ï,åè[ÒgEyjoï÷íZÃü,¯>³öÂQßÚïf׊úœ´VŸô{|•gy¸þÚSˆ|D–¯kúžÐ)öÇw.ÊÇ÷Îd½ £—ÕÇÍóRÌk_ÛÎÄ3Yîzaw¡Qþе¢þ箕î¤Ií'Å#‘&Ve2Ê»qµ™ÛÚ,»^8î»a¦½ÖÎî—ëäçó<´tÑwgÈ&o¼YŽ–e39%ög×òØ[õ£”Ò)¸|rÊügv⛼G›Éš<ðpUÚ§¼&/`Òô^Òd/÷2¯ŽïM ûµ¥ñæ±É«ZtEiuš0,¥÷¦ð._7Ïí iØóZQ“ç·^+׿M¾Piúi8›48*—¤·æI ú×õs¦wŸ¶׆HCrQ÷Þv­Óþ>=¿0-fZ~\œjíkãÜfë/ËóŒô¿a­¨ÿ±k¥q«,óª{«m·ÌÓJ­mãekW¾pÚ7Þ¤]¶Ìs†­íÛeßÕ|ÔͯçŒï¬)¡(]µ-\M¿¡Æ‹ÉLV¥í¼Hé…ÓÜL—ÚZñ!N¼ k‡ò¤÷æ'ô©²É‹Eu·M³x`ïŒrsæjÑ&/]¾p1îoDæi©ï4_“¦WOïM+µßÛ¤œ´Ê™M^9aU”çÞ?MrÝ•}Û‰fãyñCó²D³~°K7áP·RÑ´¼Cì¦NˆSb榶«ã{óˆšI:ìÚE¦kú¢µ úôÖ4¶tíu˾Aª›‡c½(ß5¬—6i©÷´dO2åþåÝJûCâå CÉZWna†~²®|“Ô–NúÛ†üÂ4«Îêæ§8gÕk¡é/ïâ…ͬlÞUÒß$­•î¤üÛ¬š9óZiስ›¤µÊä.Wwqy§¦ý]g±wóIe'YëŠâ)¿;>—ó]EÝÛüÞ¾m¨;-Ý]—™n‹f“µ¸¶¨éÛÕrrh7þh¹ëu“´ÊA>å·Gî(ŸËú{Õ!ÞU&­å‘[ÿG©¹c<Ž3iÄsH“&Ç—³JÅYàÆí¼ùÞ.>¢OÒúMš5¯{ë¤e;JÝÚÂ~ŒTד­-š¬?m¿"-/±ŒwBéG«;¹îê<Î Ãö©«-š.vß³ûùíÖ^¸ºë& Y/j´å÷ŽÖe¯I¼'j‹šQY”ê\ìòøÂI\¢§¸k‹v–å}\zï´Y+m‹ÒšXåÇÍgkýÚÒ{ç}Nï_¸(º¬u?c­¨ÿ½k¥qôϷ¦ë›¯}€²v{–¿7.Ö²öÂU·½\4[ö·£óüÎnP{,ëòF[4Ïý,|«¢îö,¿7M˜7ŽO®—æ6½¶h'Ÿ:c»\[@ËEyÛ/ó£þ…i'u§¿YüãØþóUÞçýã»nnÁvÅž8ÇK{¥=YÄ#7Åù3R¨6“Õ¬¥)­î5âä£kaÞÏ’rj~[%ÀnäÞèÈû~êû¿ožÊ—ƒæGGþVø£n¬mFu³©‡/u³´‡FÛ”ŠÚ¿„WŒg‹Óüå}ïl;ÙüïGÆGþÏ#Ýb"áûÇGþn·ÂuË•£#?õýqʳY×>1J3„,¼X4ùZ5—†øáóÚV±p½?gÖþÔô9Ëö Bb1›Å~}åÇô…ý§ÌÚk½ø)á¹6áô® CІä|{õ)íøå¾0~ÊêÕÓÉ<>ð(_ݦï<òÎî-£¸ÖöxÒÄc?½¥»àî ã[Fí[Fa ŽÚ-ØÖ6ÖrÑ]‚L§q-„ðM¸Y„7ÿ¥ÿËG~(|Ý"N}¾O¨ù•}ÁîW6³øÀ3¿0ÿ{÷ë–óÉú'ö«W}×÷ß¾óݳ÷ÿµüÔÑŸü…k~öâ‹SÁ»®ùû×~ +j·Jü¿ö`lÿÿ$\…3zøßèȬ-ÔIìP’ Nbê$ö(É P'±uû”䨓؇:‰}JòÔIìCÄ>%yê$ö¡Nb€’¼uûP'±@I^€:‰}¨“Ø $/@Ä>ÔIìP’ Nbê$ö(É P'±uû”䨓؇:‰}JòÔIìCÄ>%yê$ö¡Nb€’¼uûP'±@I^€:‰}¨“Ø $/@Ä>ÔIìP’ Nbê$ö(É P'±uû”䨓؇:‰}JòÔIìCÄ>%yê$ö¡Nb€’¼uûP'±@I^€:‰}¨“Ø $/@Ä>ÔIìP’ Nbê$ö(É P'±uû”䨓؇:‰}JòÔIìCÄ>%yê$ö¡Nb€’¼uûP'±@I^€:‰}¨“Ø $/@Ä>ÔIìP’ Nbê$ö(É P'±uû”䨓؇:‰}JòÔIìCÄ>%yê$ö¡Nb€’¼uûP'±@I^€:‰}¨“Ø $/@Ä>ÔIìP’ Nbê$ö(É P'±uû”䨓؇:‰}JòÔIìCÄ>%yê$ö¡Nb€’¼uûP'±@I^€:‰}¨“Ø $/@Ä>ÔIìP’ Nbê$ö(É P'±uû”䨓؇:‰}JòÔIìCÄ>%yê$ö¡Nb€’¼uûP'±@I^€:‰}¨“Ø $/@Ä>ÔIìP’ Nbê$ö(É P'±uû”䨓؇:‰}JòÔIìCÄ>%yê$ö¡Nb€’¼uûP'±@I^€:‰}¨“Ø $/@Ä>ÔIìP’ Nbê$ö(É P'±uû”䨓؇:‰}JòÔIìCÄ>%yê$ö¡Nb€’¼uûP'±@I^€:‰}¨“Ø $/@Ä>ÔIìP’ Nbê$ö(É P'±uû”䨓؇:‰}JòÔIìCÄ>%yê$ö¡Nb€’¼uûP'±@I^€:‰}¨“Ø $/@Ä>ÔIìP’ Nbê$ö(É P'±uû”䨓؇:‰}JòÔIìCÄ>%yê$ö¡Nb€’¼uûP'±@I^€:‰}¨“Ø $/@Ä>ÔIìP’ Nbê$ö(É P'±uû”䨓؇:‰}JòÔIìCÄ>%yê$ö¡Nb€’¼uûP'±@I^€:‰}¨“Ø $/@Ä>ÔIìP’ Nbê$ö(É P'±uû”䨓؇:‰}JòÔIìCÄ>%yê$ö¡Nb€’¼uûP'±@I^€:‰}¨“Ø $/@Ä>ÔIìP’ Nbê$ö(É P'±uû”䨓؇:‰}JòÔIìCÄ>%yê$ö¡Nb€’¼uûP'±@I^€:‰}¨“Ø $/@Ä>ÔIìP’ Nbê$ö(É P'±uû”䨓؇:‰}JòÔIìCÄ>%yê$ö¡Nb€’¼uûP'±@I^€:‰}¨“Ø $/@Ä>ÔIìP’ Nbê$ö(É P'±uû”䨓؇:‰}JòÔIìCÄ>%yê$ö¡Nb€’¼uûP'±@I^€:‰}¨“Ø $/ì‡ç_øÎ#}}èZÀ™ˆ}…p. gÔ¡k±UÄ>%ya?üüG;lÕë>t߳Ϻ.pzbŸ Οá,ŽÒpFº.[EìP’öC¸Œ¹æÆ{ƽ°¹å¶;?ÿò+'‡®ì&öÙXáœΜáüÑp.}úÙÿ9t¶ŠØ $/ìŸGûú¥W|2lÞéÑ_¹ï¡¯ ]X#öÙLálΙáà çOï÷ƒØ $/ì·Ïþ柾í]ùèUŸzüÉo ]HÄ>›&œ!Ãy2–áœù™{¿4tu¶–Ø $/€o}ûå›ùwß:ûÈ£›n¸ù~s#° Ä>›#œù1œ!ß2ýp8[†sæÐ5Úfb€’¼p`žüÚ7¯¼þsakÿÀÛ?vç¿ù㓯½>t¨šØg„3a8†³b8Ã2œ'‡®Ñöû”ä…vì‹_ý‘ŸøÕ°Í›ËïxðØCW‡z‰}ÎáLχáÜ8tuj!ö(É ïäk¯ßu÷Ã]rkØòW|à7´‡3±Ï€Ây/œýÂ΄á|¨¿ÄAû”ä…¡¼xüÄ/|ìwâx™Þú@øçÐ5¢.bŸA„s]8ã…ó^8ûýüGÛ©ïà‰}Jò°òï¹ö³æÓãà‰}^8ËÅù–ÃyÏ|ËCû”ä…M¶\oëï½ó _ú¯CW‡*ˆ}R8³…ó[\õ?üÞº:Uû”ä… ñò+'oÿôâ${×ÜxïSO¿0tØrbŸƒÎfᜧVg¹p®ºFµû”ä…òÜóß¾îC÷…=òÖÙG>zûï¿tâÕ¡kÄÖûì·p ç±p6 GZ8³=ûÜñ¡kDKìP’6У?sôªO…ýrñeŸ¸çþdž®ÛI쳯¹+œÁÂ1öî÷ÿZ8§ ]VÄ>%yacõWS?vå¿r5Åžûì“p¾ g--ZKìP’6ÙK'^½íÎÏëmÅ~ûì¹pŽê{¼ìWÿ@÷Í$ö(É ›¯ŸáÂæ³1°WÄ>{(ΈÎQfÄÚ|b€’¼pX<òØ×ûÙÚï{è+CW‡COì³W©_1çÿô©¡«Ã÷ ö(É ‡‹ÕœÙ+bŸóÎBá\¤p^ g§¡«ÃYû”ä…Cç[ß~ùŸ~ü?¾eúá F7Ýpóý/?1t8”Ä>ç#œyÂù'œ…¹胷>ÎKC׈³%ö(É ‡Ô“_ûæ•×.컋.¹õ®»>ùÚëC׈CFìsnÂÙ&œs™'?á,ÎEC׈7GìP’µßûÃ'›Ëï{0üùôCW‡ÃDìsÂy¦?çÃûôÂ9!œb«Q8W ]ö—Ø $/Ô㥯ÞüË¿ûÖÙGbO0“ÆWNìóÝn©šØ«<œÂùÁR55û”ä…Úô3EüÀÛ?vû§¿`¦ˆj‰ýÊ…Øg€p‡ÁUÿèß™uªb€’¼P§c_üê;Þ{gœIþÁcO ] ök¢>®JÎál0tu8Pb€’¼P³ÏÜû¥ü«·…à=×~ÖJÓµûu ‘â=ìú‹.¹5œ†®û”ä…ʽxüÄo}à-Ó_0º)ü%üsèq@Ä~mb°‡Hñ.Øk&ö(É O~í›û§ÿm|dp×ÝŸ|íõ¡kľûõâ:Dwì â}è1$±@I^ ÷à±'šËï0¤¨b¿ý`áÝ ó]±À:yÒÉ×^¿ã×ÿ(N9xåõŸûêûC׈ý"ö·^ˆßÅýdžû‰}Jò§zþ…ïÜpóýŒn²$Ùû[,Äl\l4Dqˆe‹Rû”äÞÈ—ÿüÙ£W}*o{×Çã¾ÿoèê°ÇÄþ¶ Ñb6ìÜ¿>þÌÐÕaãˆ}JògvßC_‰ë”]zÅ'yìëCW‡=#ö·OˆÐ§a·ŽÞýK!r‡®JìP’øž^:ñêmw~þÂæ–p¨üƒÿë7Ÿ}îøÐ5bˆým¢2ÄfØ¡!NC´†˜ºFl.±@I^à,… Οþ'¿å‚skˆýí ¹†7KìP’xStHÛb „ ‘¨;7oŠØ $/pî¹ÿ1VvbÿP qgº'ÎØ $/pnLh؉ýCÊr0œ'±@I^à|<õô ¼>¤Äþ¡â+DYˆµ°ãBÜ}õ¿ý¡kÄ¡$ö(É œ¿c_üê;Þ{g8šËïxðØCW‡³"ö—Y!¾Â. ±"nèêpˆ‰}Jò{å®»¾è’[Ãáôžk?ûä×¾9tuøÄþa¢)ÄTØY!¾B”y Ïyû”äöЋÇO|ðÖÞ2ýpø_øKøçÐ5â ‰ýÍ×Ô£›{EìP’Øs?ùþqÆgîýÒÐÕáôÄþ† ±Ó?p15tuØb€’¼À>yðØÓ£¿b¸ÓÆû«"È€\öœØ $/°^~åd?âUÿèß=õô C׈±¿BŒ„Hé'ì 4tØBb€’¼À~{þ…ï\÷¡ûÂaf¹´"ö7J¿ gØ)!^,èÉþû”䯣?sôªO…ƒíâË>qÏý ]Äþ â"ìŽ#!R†®[NìP’8H÷þΟÅëÞK¯øäŸ|ùé¡«S5±¿ B„Xˆí$!:†®Uû”äØK'^½íÎÏ_ØÜûÅ=ûÜñ¡kT)±?¬päÇ~Ô!BD„¸ºFÔBìP’ÄSO¿pÍ÷Æ‹á_¼ë˜y3žØJ8ÚÃ1›DB˜g‰&ö(É è‘ǾþÎ÷ýË8¯þ}}eèêÔEì"çq–pä‡ãèêP#±@I^`pŸ¹÷Ko{×ÇÃqø7~êÓÖÝ>0bÿ€…c;áa›‡£=óCW‡z‰}Jò›à[ß~ùŸý‹‡Þ2ýð£›n¸ù~“í±`ÂñŽêpl‡#<ç–\aXb€’¼Àæxòkß¼òúÏÅŸïºûᓯ½>t¶™Ø?áGr8žÃ¦Çv8‡®ˆ}ÖÈ lš?ø£¿h.¿#–áÏ=1tu¶–ØßoáèíäpT]HÄ>%y Ÿª\tÉ­žªì±¿ú'Ýáö¤›M#ö(É l¬ŸèG]}ðÖŒºÚ[b?„£4«ýHØp ]#ØMìP’Øp?ù÷\ûY³2î9±¿çú™rÃk¦\6–Ø $/p(ô«¶½ã½wþñŸ>5tu¶ØßCᘠG¦•49Ä>%yÃâåWNÞþé/\ØÜŽØkn¼÷©§_ºF‡›Øßá8 GcØ’áÈ Çg8J‡®|b€’¼ÀáòìsǯûÐ}á }ëì#ûÕ?xéÄ«C×è°ûç){á Ça،ᘠGæÐ5‚³"ö(É F>þÌ]ù¯Â¡{ñeŸ¸çþdž®Î¡$öÏG8ê±6`8ÃÑ8tuàMû”ä¯þšüÝïÿ5×äo–Ø?7áH Ç›¶/±@I^àP{éÄ«½ý÷õÙ;bÿÍ*û*‡£N_e)±@I^` ôszüÀÛ?fN³$öÏ^œË(]æ2b ˆ}Jò[ã _ú¯ýœÿÿá÷þóÐÕÙtbÿ,…c©_ë$cCWΗØ $/°e¬ ~–Äþ÷ŽŸp…­ލp\ ]Øb€’¼Àöyñø‰ÞúÀ[¦¾`tÓÏô·Ã?‡®Ñ&ûgŽ™pä„ã'EáXr±MÄ>%ymõä×¾yÅ~#Þ]rë]w?|òµ×‡®Ñfû§Ž“p´„c&lœpü„£hèÁû”ä¶ÛƒÇžh.¿#äáÏc_üêÐÕÙ bÿTáé–pä ]Øb€’¼ÀÖ;ùÚëwþ›?Ž“C^yýç<ñ‰Ä~)áØˆSÔ†£ÅÓd¶˜Ø $/P‰ç_øÎ 7ßG„ÝüË¿û­o¿g /@ßuðâË>ñ[ü§¡«s@j‹ý°gÃþ­¼“0|·¾ØàÌäˆî¹ÿ±úÑ_ŒS‹<úø3CWgßÕûaoÆI„Âþ {yèêÀÀê‰}Ά¼½¸ôÀ[g Aqý?ÿ÷Û½ô@ ±ö`Øág†}j‘ˆjˆ}Ξ¼»<õô ï¿áž¸4ùíŸþ¶Î7²Ý±öZØwa†ßöfاC×6ÅvÇ>o–¼§uì‹_}Ç{ï Ñ1ûñÛ<öÄÐÕÙ{[ûa…½~]؃a?]Ø,[ûœyÎà_ßóÈE—Übä=×~vËÖ+ßÊØû(ì©ð»Â^ ûnèêÀ&ÚÊØàœÉ pf/?ñÁ[xËôÃáá/áŸC×holYìoën‚=·e±Ày’àlü—¿øïýƒ§»î~xèêìmŠý°GúǸaO ]ØhÛûœ?yÎރǞh.¿c;¦mGì÷Ã<Ã~ÙÊaž°ç¶#öØ+ò¼)åÄ•W^ÿ¹Ã;qåaý°åÃößúi`aÏöØ`oÉ pžá;7Ü|ÿ¡^ØîðÆ~¹LdØ Û½L$ì¹ÃûìyÎÙ£?sôªO…zÛ»>~Ïý ]7çÆ~ØÎak‡š‡-¶ÿÐÕÃçÆ>ûD^€ótßC_¹ø²O„8ºôŠO>òØ×‡®ÎÙ:t±¶mØÂ¡Îak‡m>tuà°:t±À¾’àü½tâÕÛîüü…Í-!š~úŸüֳϺFßÛ!Šý°=ÃV µ [8lç°µ‡®b‡(ö8òì•pÛrÍ÷–Û–Cûåvض‡âF6Ü¡ˆ}Œ¼{«ïÖ8=ú+›Ü­qóc?l½° ]G\Øp›û$yöÃgóOûiO¾üçÏ]ÓØäØ[¬Ÿ¨'lÉ¡«[e“c€ƒ'/À>é—E¸`tÓ.‹°™±ò[ìð.än3c€¡È °¯žüÚ7ûeÓïøõ?:ùÚëC×(Ù´Ø[&lŸ°•B­Â ÛmèÁvÚ´Ø`Xò€c_üêüį†Xk.¿ãÁcO ]ÖFÅ~Ø&aË„ú„­¶ÕÐÕm¶Q±Ààä8'_{ý®»¾è’[CÄýíŸþ·ƒ?ÿÚØÛ!lP“°eÂöٜ称­6$öØò¤Ÿø…ýΣ›Þ2ýðo} üs¨š ûá·‡-¶CØa› ¸) *ƒÇ>E^€ƒ÷ø“ßxϵŸ ¡÷ƒõ¶ÏÜû¥Aê0lì‡_~{¨@Øak R¨“¼@I^€¡„¸‹ëë½ã½wü ¹¡b?üÒð{ãúŒÎ%y6Ä£?sôªO…x¼ø²OÜsÿcûýuûá·„_¾+üºð÷ûë€3“÷(É °Qú»§K¯øä¾Þ=@ì‡ú‡_q`w¸ÀÙ÷(É °i^:ñêmw~¾ï]ùìsÇ÷ã[ö5öCû°á·LXàlÈû”äØLýì+6·üÒ¯ýážÏ¾²O±êjê|ð3ägCÞ $/À&{䱯÷«3Ü÷ÐWöð“÷#öC û4BÍ÷ð“½"ïP’`ó}æÞ/½í]¡ú7ÿþ¯ïÕêí{û¡V¡náC=Cm÷ä3ý ïP’àPøÖ·_þ§ÿo™~ø‚ÑM7Ü|ÿó/|ç%y‘'¿öÍ+¯ÿ\ˆÙ‹.¹õ®»>ùÚëçüQçûáÛCBMÂç„Z…ºóGFÞ $/À¡ó{ødsù!rßáïçö!çû{RààÉû”ä8ŒÎÿÙÜ9Çþ>£ž¼@I^€Ãë|ÆîCìïùFààÉû”ä8ìÎmnÏ7ûû1Ç)pðä}Jòl‡7»ößÙÇþþ­›ØŸ>'¼,|føäðù{]eà Éû”äØ2Ï>wüºÝâú­³Üvçç_:ñêi_væØï ï Ÿ^>-|æ~V88ò>%y¶Ò£?séŸ Ñ}ñeŸ¸çþÇN}Áb?¼>¼+ü×ð ásö¿²ÀÁ‘÷(É °Åú;»£W}j×Ýic?¼&¼ò w‘Àa'ïP’`»½tâÕ›ùwûžŸÏ=ÿíX¾+öCyßË4¼þz™‡¼@I^€ô3ÃüÀÛ?vû§¿ðò+'ûØ%¡ülf¡;y€’¼õ8öůö+GÜòÿ~øKø³_¥"üס+ì;y€’¼µù̽_úÁ¿z[üø¿ð÷³_Å8ìä}JòÔæÅã'~ö¦ûÿ×noßáï¡dèJDÞ $/@=N¾öú]w?|Ñ%·†¨×ßùdÿg( åá¿]A`ßÉû”ä¨Ä±/~õG~âWC¼7—ßñà±'úØ%áïá¿B[OÞ $/ÀÖ{òkß¼òúÏÅÉEïøõ?ŠÏËØ%¡û›ú¶w}<øÑ«>õå?v×}£Ø¯ ¯ÿ)¼7|ÂAU8 ò>%y¶Ï#}ýÒ+>׼œö5gŽýð®¸.aøœðiûYYà@Éû”äØ&Ï>wüšï A}asËmw~þ¥¯¾Ñ+¿gì‡÷†OŸ^>3|òþT8Pò>%y¶CyûöÓÿä·¾çíÛYÆ~øœðigsƒ  ò>%y¶À}}åâË>ñ¦ºw¾©Øï; †oy£¨À¡ ïP’àP{ôñgúé_î¹ÿ±³ã9Ä~øü~‚šð½o¾²Àðä}JòRqyˆ¿ç¶<ĹÅ~¿€Exï®,€CAÞ $/À¡óò+'oÿôúåãŸzú…søó‰ýðý÷¡&¡>çð!À ä}Jò.{¢¹ü޶ïxïǾøÕsþœóýðí¡áCB}B­Îùs€ƒ$ïP’à°ø/ñßßsígCÀ^tÉ­wÝýðy~Ú^Å~¨I¨Oø¨P·PÃóü4`¿Éû”äØ|/?ñÁ[xËôÃáá/áŸçÿ™{ûûQ=`ŸÈû”äØpÿúžGúp?ù½úØ=ýP·þñe¨ó^},°·ä}Jòl¬~€ÞìÇoßózûû¡ž¡¶ç?¼Ø'ò>%y6ÐSO¿ðþîÙ× <÷/öËéOï8·éO}"ïP’`£” ü]ÿÏÿýþ-ð·ß±jêÎË#ûDÞ $/Àæ¸çþÇ~èG1„äÑ«>õèãÏìëwLì‡_~Kø¢ð»Â¯Û×ïΆ¼@I^€MðÈc_¿ôŠO†`¼ø²OüÖÿé¾ñ c?ü¢ð»Â×…ß~é|#ðFä}Jò ëÙçŽ_÷¡ûB^ØÜrÛŸéÄ«ó½ûáw…_~cøÒð{ï>˜ïv‘÷(É 0”—_9Ùß"]sã½O?û?òÛ‰ýðÃ/ío~÷cžàÌä}Jò ⾇¾2=ú+v¡0öûαa „ípð€šÉû”ä8`?ù8ÅÊÛÞõñÏÜû¥¡ª1xì‡ß¶@œ<'l“¡ªµ<öØ(ò˜ç_øÎ 7ßÁ覷L?<ø ›ûqq°5Â6 [fÿ×z›ûlyÀÉ×^¿óßüq\¢ýÊë?÷ä×¾9t6(öÃÖÛ$T&lŸ°•¶ºF°Í6'öØòì·=Ñ\~G´ðç±/~uèê$›ûaËô[)l±¡«[kÓb€aÉ °žüÚ7¯øÀo„»è’[ïºûázòµ±¶OØJa[…Š…í¶ OQaûl`ì0 yöËÇO|ðÖâȸŸÿèo‡]£Ý66öö [,޲ Ûp7jû B^€=×Ïœùžk?»±3gnxì‡í¶Þà³°ÂöÙðØà€É °‡¾ð¥ÿúŽ÷ÞWÖû¿÷Ÿ‡®Î™ŠØÛ0®Ò¶jضCW¶Á¡ˆ}Œ¼{â©§_¸æÆ{ã$™·ú /¿rrè}‡%öÖ Û3NͶpØÎC×·Ãû yÎÓK'^ýèí¿ÿÖÙGB(]÷¡ûž}îøÐ5:+‡+öÃV Û6T8lç°µÃ6ºFpX®Ø`¿É p>î¹ÿ±‹/ûD¢w¿ÿ×}ü™¡«ó&ÆØ[8lçPí°ÍÖº:p(ÆØ`ÿÈ pn½É]ù¯ï½ÉáýþûA^€7«ì»ø±_ýƒCÚwñPÇ~Øæa˺>º° uì°çä8{qn“ ›[¶`n“-ˆý~Ÿ°GÅ>° ¶ öØCòœ¥ûúJ¿öÁÿéSCWç|mMì‡}ѯñöÑÐÕM·5±Àžà{Úʵѷ,öÃ~ {'ü¢°§Âþº:°¹¶,öá,Ýpóý/?1t-`É p!w„ rÁ覷L?üÁ[øÖ·_ºF{fûb?ì°Âž ûKÞ‡7²}±g#ö]rë]w?|òµ×‡® lyN+ä‹5BîråõŸ{òkߺF{l[c?ì©°¿ä}x#Ûûpf{¢¹üŽpð‡?ÿàþbèêÀ‘àT!SôY#d¡«³/¶;öå}x#Ûûp±¥÷Þþ±mmé…s#/@©ºòÅv?]ÚúØ—÷á´¶>öáÌžá;ýHö/Ú¦‘ pnäˆBFy¡}òÅÐ5Ú_•ľ¼»Tûpf?ù¿ñSŸÞ²™âàÜÈ ðÝbvÊ*™²ªØ—÷¡WUìÙõ+I½ó}ÿò‘Ǿ>tu`ò• çÿ*\½®ÂØ—÷á»UÆ>œÁ˯œüÅ»Ž]ØÜââšï}ê醮4yj…s~8ó‡ã?d BFºFªÎØ—÷¡Î؇3{ö¹ã×}è¾xIpÛŸéÄ«C×޼@…Ây>œíãMA8ÿ‡,0tPsìËûÔ¬æØ§Zgyžÿ“/?}éŸ rñeŸ¸÷wþl¿kB^ 6¿õÀ çùp؇s~8ó]Áˆ}yŸ:‰}jóþÙ¿þžû‹× G¯úÔ£?³ƒ !/PpVçöxýÎöCWg`b?’÷©Ø§eÞSoüÖ·_¾ù—÷­³Ä~Dÿ?{wã]Uuçü0h‡ß8…©®Žc FÚT%Š.™1Naa™Š –b­Ø2 imí@k C¢A5´ª”¬PA1SJF2”8‘BCÃC~²í鑇psï9gŸ‡÷k±\¨|sïÙû³¿çž³Oì·G‘ HÍäSC‡ºævÍðuÚ×o€\@œhfv>ÖÑŒm»œPcì§‚ÜGü0ö'¶r¿ºfOnþ"nHA< ˆç¶/ÍÏÜö• Æ~êÈ}Ä cñ`=÷»Ov6®¹gêË{ÿøçàk¢+´¹ï<øþê[Ÿª¨Úa» oÈDÔšõ šuuôjÖ_Ž_^ß°ßv9@ªÈDŽæXÍ´:n5ëjîµ]NT1ö3Dî#¢ûˆœåþñΓsʶÌ­j¿ÿ³×ÚtØ®¸4r¢yõ¡ÿ~]G¬fZÍ·šumWaŒýÌ‘ûˆ"Æ>"$¢¹¯² ¦ìÂg~S[ßb»" 7ä"…·çû^qç~„–+H,Æ>"A=”:©Hç¾ó±¦~åO^Å A. üª6œ3zæy‹±ï­]΄„cì#äÔ7©{2mT r¿ìÅ÷.Z¬Ÿ%+»`zñ†®ݶ+ÎE. Ìw·±q‡Oû~ÐQòíÆ>BK½ÒOf½©¾I‡¨z¨Å«Þµ]‘7Žíš2£²_ÏÏuå%¬g6ä‰ýýÆØ÷Ih·C Æ>ÂI]’yÆ«ú&uOñËý½üóð»—˜Ï=¯¿ã™ÆÝm¶+>G. lºO^ô»<øÛoŒ}_é¸ Ïã’7Æ>ÂF‘¹+D¿n·$Þ¹_]³çªáOšvÜC/qÎa@. T4Oææ/Ò1™7¶¬¦n¯ír⌱Ã:’õ:ë¨Ö±m»à,Æ>ÂCÝz"Ó©KJÈ<Ù}êtÉâ-rŠôS÷R8ká;œ3„]äB¢¹å  …AÃJ—®~Ÿ¹ÑoŒý`èHÖñ¬£Z¯ö˜Wé8·]’ޱ0Ðܨ>HÝŽFuFê’–û‡;:'>²ö²ëÎöƒóJ+7í²]’‹\€uš+ݨ8ÈÊ.Ðoô¯¶+JÆ~ÌA®#\Ç99ìbìÃ:õ>ê€Ìǂꉒ<%6în3—E™+£8g+ÈصrÝö¯|kŽù褩ù3Ûå$c?x:Âuœ›ÁuäÛ. ÅØ‡EêwÌUôæBzöT1Ô ÿãMOè5¹ìº¤7Ȱ‚\€-έU9£$ä–PaìÛ¢£ÝìœÀM²°‚±+Ü—G^yc —Gž£ëD÷Ì¹ÕæÚˇÏ_Vk»"$¹€àíkm¿ÿÑuÎÖ‹<›Õ ƾE:æuä›Mt'ME#ÂvEHÆ>‚§îÆ<“]ýŽºrÿbµû^p6Øy»¶ÙvEHrA:ÞyÒ<šMGÝÃ3«ØfÙ"ƾu:þ5 ô.ðM‰± ½ó»ÿq¯p×/û©Ø¾sÿõwþ†ºiêh–­©·]QT镜^¼!믯dyEíŠOä|Õv Ã\§ylNÙVÎn…c?l4:4FÌÙ`Û!žûð•z3©‹Q/CîgÎýIëµ£žæ“VxŽ\€OºNtÏ_VkBáþG×qõ{Ø0öÃÉÙmIcgîÒv]€çûð‰ú”¯õ\çÀ]o~¨­oùꈹæåÍŸ¼’s†ð¹?TmþØì¨?üî%õ œÈ #Æ~˜iÔh옧±h4Ù.±Â؇çÔ›¨C1­Šzu.¶+Š-g§Ö¬ìvj…WÈx«©ù³»z¶J¾úÖ§xâv˜1öÃO#HãHoÓ÷­ÐȲ]b‚±™§æ™Üxj^0ŽíúÁÏ_wžäXQµÃvEˆ³ˆÆ~ñY<2ÇØGzè;ÂŒ>™ †#G»f<µÉ¹§‰ë¢ˆ±]qνº•näžô ciàºÄHà:^¤‡\@_9{Žyp{Fc?ê4ú4ÙË}ÅØGŸ°oIä°ÏúŠ\@êêöç-ã™hñÀØçYŸ›ï}¸Ïv9ˆÆ>RÄs ¢‹ç€ OȤb_kûý®Ó¡20wöÂÛxþi 0öcCãQ£RcSo¨Æ©F«íŠjŒ}¤‚çžÇ@ÛŽüÉ+Íg»_1·¶¾ÅvE)r½;ÞyrNÙÖ+zBáá™Uš[lWo0öcFcS#Tï©FkÉâ-¹¶+BH1öÑ;u êL¡n‚ܺí;÷mÔÓæ 5áyÎâ|äz±f}õ=sÈ·ïyþ£¦Om—/1öcIãT£Uï¬F®Æ¯írFŒ}\Œ:õ ¦qТ>ÂvEðLyE¹Œ$+»`zñÎÂ\ÀiU9zÒrV•1ÆØ1çLÎí÷.ãLÎÁØÇùÔ¨G0·›©kPï`»"xOïòÔÇßè÷×wyÙšzÛ!,ÈœãÀ¡£ÎUg³¾Ã¤¸bìÇ›F®Æ/Wzã|Œ}œcùÚzóÉ‘:…ýò r?ÞÜŸ_Ç3| Œ3ä\Ì®fbv¥ˆ=Æ~8;Ai\³ Æ>êÔpgY½ó»ÿ¹jø“æ­¿ëµ³]l"`èpv­ß¶ým—ß1ö“C#ÚyR̆·o»XÆØ‡hýÿ¼`Úõo×6Û®8»ÈöRÈ.²IF.€§Z'c?i4º5Æõ¦k¼kÔÛ.Ö0öÎ<™NëžL9ÜÑ9ñ‘µÎS&+7í²], ’L“ÀOKÞÊÊ.SôXéFý«íŠÆ~iŒk¤k¼kÔÿxÖ› ùdbì'™VûÿxÓ:´þWÀ$£¹å ¹ŒD¿ró5în³]E.$S÷©ÓKW¿?hX©Þýñ?¬Ð<`»"±ŸXïõz÷5hÐl`»"бŸLZákoüZù“û8_å¦]ƒóJÍAÂé‚D!¨¦nïMßYlNU×ì±]ì`ì'œÆ¾YꟚl—ƒà0ö“Æ}A Vû\ˆ^tŸ:=ká;ærâ9E%‹·pÎ0 È…Din9xÏÔ—Í%âe/¾ÇO2Æ>4h0[ kfàó‚„`ì'‡Æ¸ÖóZÕ› C´Î'÷‘ŠCíÇÆ=ô’³ÝŸÄ¹GŽv>ó›+†geL+\ÏÆÂ`ìÃÐl 9ÁÜG¬YBs…íŠà/Æ~Bh ï4û Žž´œ}a0öᦙAóû 'c?ö´n~÷çãì ‚LTTí0—‘ôË.˜2£’s†±D.Ä[}ÃþãËÍsǪ6l»„cçÓ,aÎkÞÐìa»ø‚±cZ«kÅ®u»¹1D+yÛ!ºNtÿdÖ›Y=ÇÕåC‹¯z×vEð¹Wm:îtÞܹ³ç”må£8c¤¹B3†æ šCZÛþb»"xŒ±We/¾gž-®uûôâ ä>¼¥…eþ䕿sçkFΫ­o±].ɹà\³ÊëÙ£>&ûq¢Õ¸¹ó—l¤òŠº/}}–óa4ç £Ž\ˆš>5¡ðÏÿ:wÍúÛå ìûH‘æÍ*fC*Í3¶ËA¦ûñ ¸Öáæ–.­Ìµ>·]’Å}³êÿûælnV4r!Ìvñz¯ZÌvñHc©sX£cfêão°q}¤1öc@kïø&[>¾}­íæ2³™íö\™IäB¤uè^¸b›ÙøÞik4*mW„È`죯4Ãhž1ûjæa·ŠˆbìGšÖÛZu›å÷­ß-'÷<ì2êÈ…èÒèËÍ_¤·/olYMÝ^Ûå bûHfÍ9:x†þûBÍB¶ËAŸ1ö#Jkl­´Í’[koFÂfîÒš9E:>û)œ9·ºûÔiÛ!UäBýá“?yp•Þ¸AÃJµ¦Þv9ˆ$Æ>2¡™Gó!ÍEMÍŸÙ.}ÀØ­«1¯Zkl½qZo?¹d«íŠ€ ;ÜÑ9ñ‘µ—]wö¬Åà¼ÒÊMlD äB´h =VºQq _úþÕvEˆ*Æ>2ÄtQŒýhÑŠZëj½eZck¥Í@Cøýá“?™ ØôK¿in9h»"\¹!îòk¶ËA´1öá ÷å KW¿o»\c?*´Šþæ][TóA<¢…SB.D‚sÃŽ[à Æ><ÄíÌÂØ?.ºClq¦£9‡é±o…Ö·æéœl«\LsËÁ[Æ-1Ÿžß0zç C.¬ûÔé²ßsÙ¬#ßvEH(Æ>ìÒì§9М ^ô»šmW”Œý€iM{ÿ-4K\­uÉ} wÕ5{¾ò­9<ˆ3HäBt„çæ/Ò ~Ów×Ôíµ]±0ÐL¨ùP‡¢æFͶËIÆ~`´ŽÕjÖ,kµ¾åRÔ}êtÉâ-rŠ4vú)Ôï9gè+r!Í-Çÿ°B/õ a¥KW¿ÏQ ëû ͇š57šSÁ|zâ7Æ~Ìjöï®/ÔK­5-«Y ‡;:'ü×ËæŒÊà¼ÒÊM»lW[ä‚ßt0?VºQq`6MÒ¿Ú®8‹±PÑܨRó¤fKÍ™L•þaìûM«V­]Í"V«Yf »ÛÌÅu\qírÁW+×m7;éypUSóg¶Ëþ†±Ò<©ÙÒ\\§ùÓv9ñÄØ÷{7 ­`Ù ðÊ«¿n4›o\vÝãYËŽLÞ"|²mûÿæ-3OÚâåE1öZ:,ÍSY5‹r«µçû~ÐêtÒôW´R5[$iíj»" nºNtÏœ[ÝH¡ybËüeµ¶+ŠrÁsûZÛïtI„…+¶ñTM„ca¦™Só§9¬UóªíŠâƒ±ï9­KÍÓ´µRÕz•ÜüsàÐÑüÉ+ͧðW r+ç ½@.xèxçÉY ß¹¢'žY¥#ÖvEÀE½úëF¨œÄF˜iÕ\ªÕ<ªUs¬íŠâ€Ü÷Ö¢æ®ýÒ•Ü‚±}çþëïxÆ ½Qžçœa†È¯¬Yßpí¨§õbŽž´ü£¦Om—\ÂìgßÑáªÚ.¸ͨšWu¸jŽÕLk»œÈ#÷=¡õ§V¡f9ªu©V§¶+§¼¢n`îlÁ~ÙÓ ×sÎ0mäBæ´Vùö=ϳVA´Ð"Zœsn#Æ—sÎ-ä~†´æÔÊSëO½ŒZ‹jEj»" ¹4§o`îÏ믻m>Ÿ×÷¹³× ö:@Ñ"¢œ=»4Ï_VËÞ}Eî§G+ÌìÛçs¿Zµõ-îûy9g˜:r! U›?vöB¯oà"‰~‘¦¹×y¦ædÛåD ¹ßWZU:ûjµ©5§íŠ\ûý¦\èçYÉJž•ŒH£D h6gƒïzàÍ϶ˉr?u<ï ˆ¢#G»îûÉ:çy lîqIäBŠwtN+\Ÿ•]0 §hÆS›t¤Ù®Èý âA³±ædÍÌY=ûËj?f»¢°#÷SôÊ›;Í0µªÔÚ’Ü¢¥¹åà-ã–˜Oösó5în³]Qx‘ —Ô}êôÒÕïVªêž©/ëè²]àúAĉffÍÏ:¤5WkÆÖ¼m»¢ð"÷/IëF­Í2RëIrˆ®767 Î+5Ãù{SWîè´]Q‘ ½Ûòî'&ôÏ·k›m—x†~ñ£YÚ™±5{Û.'¤Èý^h­¨£Y:j ©•¤íŠdªûÔé’Å[äi\ëŸú=ç ÏA.\ g›oôƒˆ%®è¸$rÿ‚X1ñv¨ýظ‡^2g{þ)oNuÍÛ…¹p¾#G»~9o3w£ Þècš·;¾5Ÿsç—¹>­ µ>4 E­É} ®w·}ýÎg¹üäÂ9Ø­ A?ˆØÓ®™œ¡ÏAwœÐ*‘'€$¨¨Úáì5eF%ç ÉG}Ãþáw/áiVHúA$„óÄXÍð<1ö ¹ÿWZjèìH¯õ¡íЧëD÷ÏçlÌÊ.ài2gÈ…ûZÛït^‡¹³u<ðäJ$ý ’C³ºævÍð:æ5Ûkη]‘Mäþ׫µÔšÜ’©í@Gþ䕿 kFΫ­o±]‘ Ï…ã'ç”m5‹„‡gV騰]úA$fxÍóæÔŸf~Íÿ¶+²#ṯõžV}fù§u ¹`ûÎýδpÛ„e­m±]QÐ’œ ëÞÚyí¨§õã_þQÓ§¶ËE?ˆdÒl¯9_¿æ¥€ír,Hlîk§•žóA€V€¶+"åu梬ì‚éÅuÎ0™¹ õÀèIËÍz`ÍúÛåÐ"É4ó›óÊ‚¤L`îk]§Õ¹QHë=­úlW Œ4WL™QÙï¯sŪ×>´]Q@’– ‡Ú™ë…®Z\øÌoÕûnôƒH8ÍÿJ+zn"S.$çIË}­èÌ9­ñ´Ò#÷ôn_kû¨ Ï›k ®¿ã™$\Kœ\è:ѽpÅ6³»,û ôƒÀ×~bJeDöINîk§µœYÔiuGîH]uÍž«†?i&±?x1Þç ’ zOÍ~ãycËjêöÚ.°~p(”æyCÊ Ûåø+ ¹¯•›Öof!§]ìßS>9»ñ EšIú)œ9·:®ç cŸ MÍŸyp•~ÆAÃJy1à ΡŒøÊ·æh\(5”¶ËñK¼s_«5­Ù´rÓÏ8 §(áϹÃYkžUú囟¨Ü´ËvEÞ‹q.èí{¬ôìƒ&•úþÕvE@ˆÐç3Á¡ÔPvÄ58bœûZ§iµ¦ŸN+7­ßbùö°¢¹åàMßYl®:ÈÍ_Ô¸»ÍvE^Še.tŸ:½tõûƒ†•šÓ¼zmW„ý p1Jq½d.,Qš(SlWä¥Xæ¾ÖfZ¡™¥Ú7ïZDîðCå¦]ƒóJãwÒ)~¹àÜ¢hà–àbèÞ)AL‹³Ïc–ûîK¹´N‹å¥\£ûÔé‚ù¿q.J/}î·¶+ò@œraïÿ|ÏÔ—mâbvFðý pIÊ‘E/¼k6¦V¾(elWä8å¾VbZ™­~1¯šÜŒCíÇÌe$ñØ´*¹päh—yŒTVvÁ´ÂõñÞðý "eŠ’Eùb\«Ä±]QFâ‘ûî­àµ*#÷ïÃ]­ÎCm†ß½$ºµ‰A.TTí¸úÖ§ôSŒž´ü£¦Om—Dý Ð'»Û”25JåŽírÒõÜ׊Kë®D=*@˜)Ìe$ý² ¦Ì¨Œâ9ÃHçB}ÃþãËUöíó«6l» Jè4(kÌÓl•>Ê Ûå¤#º¹¯U–ÖZZq©þøfI¤»rqr¼óäôâ Y=³ÓC‹Ë+êlWÔ7Í…¶ßÿÙkª|`îì9e[õ.Ø®ˆúA =JåŽÒG#HI¤<²]QßD4÷µ¾Ò*K•kÅ¥u¹ lwÞ·Â\½pÍÈyµõ-¶+JUär!êA „ý ¥ÏCÿýzOKF.÷µ¦ÒÊÊ,±FOZNî3÷”¥ö0SV´r¡jóÇÙ·Ïô…:@HЙ‹âm Êýèžlpåu—Gç’†¨äÂGMŸÆãF~ $诬Yß¡mÍ"‘ûî›q´¦*{ñ=Û@߸oy¾òÆPßòþ\ˆÙFß@HЊÐcŸû1جŒs¶Dnhú?Û]@˜s¡ûÔé…+¶ÅìAÀ@HОSî+­Ì©`åW8æÜ×JÉý0/r@<„ü‘©¡Í½n¹ù‹T[ÞØ²šº½¶Ëâ†~ð‰2KÉ¥ñ¥S–Ù.ç\áÌ}­Ž´F2‹%­šBøº@†JoS¤Y®ÿ¢o‡çœas¡¹åà˜W©ªAÃJ—®~?<¯'ôƒ€¯”_J12%šrÍv9¶ÜWÊk]¤Õ‘ªÒJIë%r@\îèœøÈÚË®;{îkp^iå¦]¶+:+T¹ —è±ÒŠƒ¬ìýFÿj»" ¶è¿9¡¦_á µPå¾ÖBZ©­Ž´F ÉK¾jÜÝf.ƒÔ¯›Ç% •2ìæ¾V;Zó˜í´ "÷àPû1s‰­ µlå‚ó¨&}÷‡gV…mÛU öè+”wSC£ÏÖCumå¾{»õÿxàrܶïÜïæO^éÓ9C¿s¡jóÇ9£è[ ¿{I}· aA?„RÒÜR¡ÜTzúô]|Í}­U´b1K—¯Ž˜«•ŒßåìÎÌ=›pfeü|ÎFÏÏú— MÍŸÝyß }ñ«o}* OààF?„“S¹©á© U’zþõ}Ê}­O´J17¼hÝbë)ZKGŽvM™QižÜzå%U;<üâ~ä¡öcÓ ×+äýrÞæà7ÓpIôƒ@h™G2)C•¤ÊSoÍàGîkebž«¨µÊ~þ:¹~hn9x˸%æŒoä?Û¸»Í“/ëm.tŸ:½tõû&î™ú²jöäËðý rÊP%©9¬lUÂzòe½Í}­F´&1‹­RÈ}ð[uÍžÁy¥fâ÷ÐK™Ÿ3ô0T[nþ"}5ýsË»Ÿdþø‡~ˆ„šº½N¶*g3ÿ‚^å¾V Z‡˜‰V&Á?à«ûÔé’Å[äiÖ?õûLÎz’ Î9ÌAÃJ=<‡ À?ôƒ@T˜ko”°ž\{“yî{»¤çpGçþhµs^nÃÛ¿Oïëd˜ GŽv=VºÑ¹ÇAU¥÷uŒ~ˆ%ìg½iîÍWò¦}^†¹¯õ†sÒw® ÷À®ÆÝmæ2’´¯ÛÏ$œ=ÐÆ<¸Ê=Ðø‡~ˆ"¥­27“½»ÓÎ}÷>Z{xµ skÖ78ûzMþé«}:g˜^.¼÷á¾¼±e~?# €èèÚðöïͳ}•ÅJä>ýÝ4r_ë ­.|Úçà‰®Ý3çV÷RØ×çþô5öµ¶ßÿè:ý•¹³®Øæùóƒ~ˆ4å¯RØœ V.+Sü‹}Í}÷sµÒ ÷ ÌÚtäO^i®å¸úÖ§jë[.ùWRÏ…ã'Ko¹¢'žY¥ïåEÉì b@Y¬DÖXV:+£•Ô—ü+©ç¾Væ®ýÒê‚Ü€¨Ø¾sÿu·Í7ø¨ Ï÷~Î0Å\X³¾áÚQOëO~ûžç?júÔÓzX@?Ćrùö{—iD+©•×½ÿáTr_+­ÌBâk£žÖºÂÓzA(¯¨˜;[3y¿ì‚éÅ.vÎð’¹Ð§”ôƒ@Ì8gn•Ú½œ¹í=÷µZКA+scˆÖ¾Õ ðfõi…ë{ŸÕ{É÷U(³¾“ÊU(¢‚~ˆŸTîìè%÷Ýg’§>þ¹ñà¾êãú;ž9çª æBÚw©ˆ úA ®œß”ãçïüvÁÜ×Ú@+„ï4DÑÖº½W ÒLõw=ðÂCGÍ??Ü»XoÛþ¿–êà/úA ÞÜO†R²;ÿýœÜ×z@«³<Ð:áßý¥zApvî?¤ÐìíÎ…ÌŸr *è$Pš›=B•ïJù3®~0í'U"íÈÑ®‰¬už*û‹yÕúÍ«¿nüñ¬7³² ä=VºñpG§í2ø‹~Hå¾’]ù®”WÖ+ñ5ö•þæ®­´* ÷ iš[Þ2n‰¹>D¿þþ³ôÏñ?¬Ð·]€ Љ¢|¿gêËNâ›_ycËÈ}H²'žû­Ù}ÔlOÍéA 9è¤QÊ›H™Dµ°]Àç<á—¾~öcú}ãî¶zž4¡_·Œ[Â9C ÆèØsï3zRþÌs_+;ï[Á¾âõ ûGŒ/7‰Pµùc翟ÿüÁŠªfϱ~ÙSfTrΈ%úA Æ”ÝJp³E€2]Éîü¯ós_«óÜa­´Z°Q/ÀG­m¹ÿÑušçæÎžS¶µëD·ûÿžŸ ¢?óÓ’·Ì-—-~vÅï‚-€ïè¸Rj›g +Ç2ëÍsîÒ­ô¿´fÐÊ!Ø’¾8ÞyR  ™ÞžYÕv ãü?sÁ\0ôçó'¯4×™\3r^m}‹ÿ%ý ?Jjåµ n%x¹¯Õ‚sY«ÿKøåõ»®õô%/ÿè%Œw?Øç„Ëí÷.»`¸ˆúA N”Îγ$z?…{ÉÜÿ ±ÕÜ`¢U„ÖþÔ ðÑGMŸŽž´\3ù?ÿëÜ5ëzÿ×Ì£¼¢ÎìM•]0½xç ¨£âA‰¬\6·x|éë³”×½ÿùs_ësVY+ ­+¼«à£CíǦ>þ†fï+†§¸}tйpæ‹7§Ìí¾9@äÐ1 ,6w…¤¾\Ÿr_k‰+znEÔêBk /Jø¢ëD÷ÂÛ̾ ÷N[³¯µ=Å¿˜z.úÊ#¿·Ô\‘rýÏlßÉFd@$Ñ‘¦üU ›81¾Ü×ÜŸ4ý³O©VçìNƒêš=Cÿ}¡æê¼±e5u{ûôwûš Îw¼jøßnË9C rèˆRæ*yM+‹•È}úëéå¾VZcè/j½Ñ×ïðOSógc\¥ùyаÒ_­©Oã+¤— ÆüeµrŠô×û)œ9·šs†@„Б£œUÚ*s5x•¿s—Ö¤ñE2Éý•ë¶k½¡¿®µ‡V i|€Wwt>VºQq _úþ5½¯“I.˜2&>²ö²ëΞ¥œWZ¹‰È€h ¢E «œÕ°Uæ*y-æ¾'Ë@&–®~ß9A÷‡Oþ”É—Ê0Œæ–ƒ¹ù‹Ìµ+úM†%ý JUCÖ«Üw.OÒš$“/èç~%‚'ð{’ †W§.€~??.Âñ0÷µ1jÛúj_kû=S_ö|ƒ/sAºOÎüÖ BNêÇMúžç¾³½¹V)©os Hû@Ó ×{»™§·¹`d¸õ€Ð¡åë&Þ>å¾Ö'YÙ©?þ¢5뮾õ)MÝ£'-ÿ¨éSÏ¿¾¹`¤ýh$ BHY©Äôõ!¿þå¾V)Z«è‹kÝ¢Õ‹ç_’¦¾a¿ …kG=]µùcŸ¾‹¹`TTíøßœ­oÑ/»`ÊŒJÎ!A?„ŠòQ)©¬ÔÀ˜;[ééÓ7ò;÷µbɾ}¾9¬•ŒOßâ­í@ÇCÿýºI„9e[wžôï{ù ¢ú§oÈêɸ/}}VyEß @ŠèðP2*5$••JÌä¾V/ZÃèi=£Uß bÆ=…Þÿ躦ÐrÁÐÏrÇÄ_™k`®9¯¶¾Åïï ôƒ@( •‰&o¿wYÌrÿû?{-˜“ÛU›?ν àK,ËÃ|ù“Wrΰ…~°K ¨ þ4iÀ¹ïÜü¢Ž7¿@Ô5însnÁ^õÚ‡A~ë€sÁX¼êÝË{¶KÍÊ.øÉ¬7½ÚC@êè[”zÊ>s…ÒðÙ¿ ò»[ÉýŠªÎæxZóù­ ä¬oÑl%Î|ñÆù+o,ñïÆyD?X¡¼3O복͚ÅÜ7ÏÒšÇó‡g@uŸ:½è…wG¸6·´R†­\0öþñÏ·Œ[b®–ɽ€s†@`è€)ãÌ]!ú¥ìKlîkÍcNk¤µ•2Àºêš=¹ù‹4ÞôÅ5u{-Vb7 _¼ à‚èÀ(×”n&殺åI¥žÅbÂûZùä-SZ Ù}5 xÍ-M( VºtõûÖÏŒ…!Îô|ZZ²xË€œ"ÓHᬅïXe€x£ ,S¢)×4Ü”qJ:ëéžÜ×*Hk!s*ØÖ§¥¤Ã•nTdeü´ä-ý«íŠÎ I.zM&>²ÖœAœWZ¹i—튀آü¦S–™P»wÚrÿ|fi¤u‘VGúMH^"ðÃÊuÛ¿ò­9šÇ<¸ª©ù3ÛåüM¨rÁhÜÝf.¦Õ¯¼±eœ3ü@?øGÉe®‡4—D†êîøæ¾ÖEZ©*­”´^²]x̹H>gô‚PM¿FsÁ¨Ü´Ël¶sÙuO|d-ç oÑ~0º(¹Ì–)¯þºÑvEç mîW×ì1ûíhÕdwkðʾÖöû]gaáŠmá|Ê^hsáLÏšfέ6·]\>´xþ²ZÛñA?xN9ež®«äR~‘û}¥WLë%s6X+(­£lWi:ÞyÒ ÷îp?øùëœ3èC‰ \HÎÕ ÉýÁVAîljÞM½¿ZÑéçÕêNk<Ûµã'ç”m½¢'žYÕv ÃvEIN.zgó'¯4W}uÄÜÚúÛvÐ"á4ÿ+L(Èý¸Ò;«u~d­ñ´ÒÓzÏvEÂhÍú†kG=­¹bÄøòš>µ]N ’– ÆöûÿåÛóÌ2`Ô„ç9gˆ¢DbiÎ×Ìo"@Y D°]Q ’™ûZÝi§\ë=­úl— D4?Œž´<ÉóC2sÁ(¯¨3—‘deL/ÞÀ9C$ ý Hó¼f{sã€æ¥€íŠ,Hrî;çÿµöKÚùç;pè¨sý@á3¿Il/ä\8Ó³6˜2£²ß_×Ë×ÖÛ®ý ’æ…W?0ç5çkæ'÷mb‡Þw­úœûƒ´´] ºNt/\±Íì6ÉýÅ ÏÃ}íÐõw<“´k‡LôƒHÍêšÛ¹GÀ ÷ϸöÔjPkÂ$ì#À¡ ÐÙ¸¦n¯írì#Õ5{®þ¤Y0üÇ/Äò1Ä€ƒ~I ™Ü<ŠN¿4Ãkž·]‘}ä¾Cë@çùb¼ @8Ï'ýÊ·æð|R¹p޳{ßP¤×¤ÿ™s«9gˆ¸¢D¼iöÖ®™üì3†n(âCrÿZje¨×D«D­m—À‡;:ZòVVvÁ€œ¢ÇJ7ê_mW"äÂùt„L|d­y6ñ?ÞôDå¦]¶+¼G?ˆÓ¼ý囟Ю™\ó9¹ïFîŸOGˆÖ‡Z%j­¨# 'ݧN/]ýþ a¥šúÆ=ôRsËAÛ…¹p1:Znóœ¹Ê(7Qãî6Û^¢D,i®ÖŒm¦nÍáäþùÈý‹ÑÑ¢µ¢^­µzÔÒvE2US·÷¦ï,6‹yn¸r¡w•›v Î+å$3â‡~1ã¾´Có6—v\ ¹ß;­Í)­!Ùhˆ®æ–ƒ÷L}Ùlµè…w9ÃÓ rá’tü-xÛÜ„2 §¨dñŽ(Äý âD3³ægsë·flfé^û—¤ãG«G³½Ö“|Ê DË‘£]æ±2YÙÓ ×³Eä%‘ )Ò±d.#a“:Äý âÁ½5´firÿ’ÈýéXÒJRëIó j­0mWàÒV½öáÕ·>¥Ynô¤åÜí•"r¡OšþÏyˆÕð»—ìýãŸmW¤‰~Q·¯µ]ó°óèXÍ϶+Šr¿O´žÔªR¯˜V˜ZgÚ.ÀEÕ7ì1¾ÜjúÔ¹±wÍúÛåD¹à•òŠº+¸„ ÑA?ˆHp_œ¯9V3­íŠ"Ü÷ŠV¡Î6†ZÚ.H³ñ¯I6þõ ¹à!÷ÿðM¶8@¨Ñ"üؼË侇œÇœé%å1g€¯ºNt/\±Íy0è¾ÖvÛŹà¹s¶@ß¾“ë™Fôƒ³wµºîCî{ˆÜ÷œŽO­NÍn·Z¯jÕj»" nªköäæ/Ò(ËS·×v9qC.ø„G$#äèNš-5gšÉS³¨æRÛÅ ¹ï­QµRÕk«U+Ç-à•?|ò§1®ÒÈ4¬téê÷m—O䂯JŸû퀜"½Âý‡þb^u÷©Ó¶+>G?ˆ°Ñ Y0ÿ7š-udjæÔüi»¢x"÷}¥õªV­z…µ‚Õ:Öv9@„îè|¬t£â@¿ôý«íŠb‹\ð›ŽÞ‰¬½ìº³çºç•VnÚe»"à,úA„ŠæFÍ:&5[jÎ$÷ýCîûE,¹_­©wN­45f»œ˜#‚Ѹ»Í\ö¬_ß¼kQsËAÛ!éèšoúÎb3=jžÔli»¢˜#÷ƒ¡¬s‘›V¶¶Ë"ùôzè¿/äÒë` AªÜ´ëË7?Á p„ý ¬s_>¡¹‘Ë'‚AîI«Y­iÙHžÖö{§­ak¦à‘ Ó±=snµsƒÌüeµ¶+BBÑÂ.Í~—ßðùíÕšÉýÀûso’¯µ.›åçs?ºeêão° cÀÈ+tœýÁ‹l ‹èa‹{ûeÍ„ä~ÀÈ}+tœk•ËC´ó­YßðÏÿ:W£cô¤å5}j»œ$",Ú¾s¿ó€­‘ß[Ê9C‰~ÁÓ,7jÂó<žÕ.rß"­uµâÕë¯Õ¯ÖÀ¶Ë,«oØ?b|¹Fĵ£ž~}#· XC.X·êµæÎÖ»Ð/»`ÊŒJÎ"ôƒÒñΓšß4Ëé¨ÓŒ§yÏvEÉEî[§u¯V¿z´ÖzØv9€m:žYeaNÙVe„íŠ\‚éŲþºR*¯¨³]â~ÑœfÎzi–Ó\GîÛEî‡FÖÀf\hU¬µ±íŠ€€tèvþû]×ÚöÛ\ˆÛ&,3WR]3r^ÝŽ?Ú®qF?ˆlß¹_³™™Ö4¿‘ûa@F„ÖÃÎG$쪄ثÚüqÎè|86äBØÔÖ·8˧üÉ+9gŸÐÂWš»4ƒ9'¸4³Ù®Ÿ#÷ÃÆ¹…Jëd­–m—ø¢©ù3sóìÕ·>µrÝvÛåà È…p:»{Ϧ»YÙ?+ý5ç á9úAøDóÕÏçl4Àkã©:aCVÈZ'›-µr¶]à™CíǦ®W( È)bsÝp"BKãeÊŒJó¤æ+o,©¨Úa»"Ä ý ü ™ÊsGøîè|¬t£¹æùdzÞÔ¿Ú®)!¢E#ë{SW›óðƒóJ+7í²]¢Š~zcs“f!3i^"÷£‚Ü,­«Í^Zi3ÐZΞHc\ÅžHÑB.DQãî6s ÷é môƒH›û¾fÍEÜ×-ä~iu­56{õ#œ¶mÿß¼±eæ™)Þþ½írÐgäBt½òæNg¿IÓ_a?ô ý Ò y澟¬sö=Ö,d»"ô¹]Zi›gykí­¸ír€3ûZÛïtI„…+¶ñ|´ˆ""MãnæÜêþC yÎúŠ~}å<UsŽfr?¢ÈýHÓ¸ÓªÛœ Ö:\«qÛ!¡Žwžœµð+zBáá™Um:lW„ô‘ 1 1˜?y¥¹vëê[ŸÚʦ¾Hý RW[ßbî Ñ/Í6ä~¤‘û1 1¨¸ÞG­Æµ&×ÊÜvEH–5ë®õ´ŽÀÛï]öQÓ§¶ËA¦È…ØØ¾söíóÍ‚mÔ„ç9gˆÞÑ"šI4Ÿ˜‰E3ŒæÛ!Sä~lh®Õ¸ÞM­Ìµ>·]AGÝ·ïyž£.fÈ…˜)¯¨˜;[ïi¿ì‚i…ë9gˆ‹¡Dï4{L/Þ ™DljfÍ-¶+‚7Èý˜q>©Ñ*Ojà÷§Ò%‹·°ÂŒr!~4BÕ ²ŠCïèÑ Î,Ź?¡ZŸs'|bîZ5¡À]«±D.ÄWy¡wôƒ¸ Í×ßñ WžÇ¹WÎNZ·³Ó#¼RµùcgWÛ÷>Üg»ø‚\ˆ·­u{ÙD?ˆs8t”©’€Ü7­Ø'Ái%o»DO½Lr! Ø%磄ƒ'×$ ¹ŸZ½›³ÁZÏkUo»DÌáŽÎi…ë³² ä=Vº‘'\ǹ˓¦¿ÂS¤á „ñê¯ͳÌ4?h– ÷cÜOe­äµžÏê¹ X+|Û!ºO^ºúýAÃJ5KÜ3õåæ–ƒ¶+BÈ…DѸ¾eÜs=Xnþ¢ÆÝm¶+‚5ôƒÐ  yÀLšÈý„ ÷EãZ«z½ãZák¯Õ¾íŠ^[ÞýÄ„‚þY]³Çv9¹@•›v Î+5‹ÀïM]Í9Ãd¢L2ú ÿõ²™4hN°]‚Cî'ÖöÎ:_k~Ûå tœóWÞXÂyƒ"’I#½dñ–¿»þìíBrŠô{Æ~ÒÐ&“ûõz÷50öˆÜO&s ¹8œëá8r´ë—ó6;×j?f»"X@.$™Fý¸‡^2ŸüSÞ® HúÁÒÿÊ·æ˜!¯±Oî'¹ŸdõÎ>!ê¸_8áœ}‡î¼oû%¹€ÆÝm7üÛBî!JúÁDqß;¬ñνÃIFîC+­ÿyŽ@’Õ7ì~÷žKƒ\€QQµÃÙcpÊŒJÎÆý`Bh,kD÷Ë.07†h¤Û®–‘û0œçŒ«/Pw`»d_kûý®Óû>0wöÜ¥5<ƒ gȸhNøY鯳zÖ<ƒ,öè“`ÁòmæÙ£×Ýä>ÎûpÑœ Ž@} õêlWï<9§l«y»žYÕv ÃvE rçÐü?y¥¹®ìš‘ójë[lW_ÐÆ›F®Æ¯ÈÑä>ä>ΡùAÝùÀHý‚ºÛÁ{ëÞÚyí¨§õ._þAc«ír.ä.¨nÇÅäm–µ¶ýÅvEðý`\ii§1ëœÒÑX¶]Â…ÜÇ©GP§ cC]ƒzÛåÀ35}:zÒróήYß`»„¹€^”WÔ™ë ²² ¦oàœaœÐÆF¨Æ©¹ä[#Wã×vE#r½P¿`>ER¡>Âv9ÈÈ¡öcæ“ß+†>ó¶†ÀÅ è{3 ­0W½ö¡íŠà úÁ˜©¨ÚaÎÞh´²%zAî£wš=Ô;\Ñs뱺 LE]'º®Øfö œ4ýî EïȤB3ÉÈï-5W ]Ç3Ûw²YäÑƆƣF¥ž§ä>zGî#šIÔG˜}‰ÕY°U„T×ì1;Çæ-«©Ûk»D¹€Ôi†¹jø“fÙ9ö/rÎ0Òèc@cpÜC/™!©±©j»"D¹Ô©›POažRÇ ~MÍŸyp•Þ¯AÃJy²$RG. ¯æ/«S¤Ã¦ÿ™s«9gQôƒ‘¦q§Ñ§1¨7Qã‘§Ã uä>úJ…ú 6ê5ÔqØ.p¸£ó±ÒYÙJýFÿj»"D ¹€4hž™øÈÚË®;û©Ä—o~¢rÓ.Û¡Ïè£K#npÞÙµ™Æ F"¹>!÷‘Ón¨×PÇA»*ݧN/]ý¾Ó°7·´]¢‡\@Ú4ç|ó®EæZµÜüE»ÛlW„> Œ¢¦æÏ4ÖÌ Óè#÷‘riÓœã\ލDˆíŠ’Î¹ WÑÀ½H¹€ ñQEDÑF‹ûCy8>”GÚÈ}dH}‡91Åv%íýãŸï™ú²³á½92A. sš…~1ïo·2•>÷[ÛáÒè#äÉ%[›v5ÖÈ}d‚ÜGæ4 93PW¢ÞÄvE â<$+»`Záz6÷CæÈx…­£…~0Ü›új|‘ûȹ¯hFR?¢®„Ǧ¢jÇÕ·>¥!µ]b‚\€·ÜB~÷…Zôƒ!§±sëwËyè'E‡–zu.¶Ë‰•¶ßÿÙkzmæÎžS¶õxçIÛ!nÈøDóÕôâ Y=kÚ+†—WÔÙ®_@?N)_úú,½5;Aä>2¬ `‘æ½’Å[äé ì?¤°hÁÛÌ„¡ ˜ŽíY ßÑq®—]ǼŽ|ŽvXAîÃ"Í{êzÔûè T¤nÈvEÖîè|¬t£â +»@¿Ñ¿Ú®ÉE.À:ÍY{Ùug?1œWZ¹i—íŠ~0H:ªulë×q®£Ü‡Eä>¬3­ú uCÉl…V®Ûî4ÅMÍŸÙ.IG. $w·™‹çõëæ1Ï%ùœa0胡#Ù\e.‘Òqn»"$¹Pä\*©þÈv9q.šÍ½€‹fäB¥rÓ®¼é >F ý ßÜ|ë¨æƒo„¹PQO¤Î( [©ìkmŸ4ýgS®ݶ+>G. l4CΜ[mn³ºü†¢ùËjmWOôƒ¾Òqkž¶©#YÇ3¹ð ÷6š!G-¨cRßd»"9ÝÐøðÌ*6ÐCØ 'Í–ÿñÀ lÃèúAŸ¼]Ûìlœ«c˜ÜGØû'Í–ê•tpÆìQìkÖ7\;êiý\£'-ÿ¨éSÛå@. ̶ïÜï<¦mÔ„çãwÎÐ"úAÏéøÔQêSS?¥®Êv9}Öv Ã|Ö©D˜S¶•u BŽ\@$h.^¼!ë¯ëíòŠ:ÛEý Wt4šó:>u”’û9r‘ ¹T”™]Õ[©Ã²]QJºNtÏ]ZcʾÿÑu\ׄH !îëñþåÛó¸/ôƒ™ÓhÎ`s=3"„ÜG„h^UWeN«Ï ùÞ\U›?6{¥¿{I}KD¹€È©­oùꈹfž?yeTΆ ý`&tÔéØ3¡ŽF“¶+REî#rÔ[©Ã2ÏìSÏe»œ hjþìÎûV¨Â«o}*9ÏRDl ˆ(g?ÿ¬ì‚ŸÏÙòs†!D?˜ó<s鲎@ž‡‚È!÷Qê³ÔméèUç¥þËv9Ÿ;Ô~lZáz…€œ¢_ÎÛ›mQ‘(ä¢K³î~þºyÞ÷•7–TTí°]Q”ЦAǘyB–Ž:{ä>¢ˆÜGtiÖUÏ¥ÎKý—º0»ôé>uzéê÷M(Ü3õåæ–ƒ‹2A. ê4ß2n‰¹rïùÏ6în³]Q4Ðö‰Ž«ÜüEæ0ÓñFî#ºÈ}Df`õ_æT°:2õeÁ×P]³Ç„‚þ¹åÝO‚/ð¹€xÐ1<8¯Ô,×Ç=ô¿$úÁîèÔe-cÌ–ˆ:rñ .ÌéÈÔö}ntаR[Ý(à-r±¡9¹dñ–9E:¤õOýžYºôƒ—Ä…X"÷æŠMõeÁ\±yäh×c¥«Uwtúúí€À ˆÍÏß}¸‚Os.‰~°wîOœuD‘ûˆ r1£ùÙÙÑEýšOwv;»ÙŒypUxv³.ﶯµýþG×é« Ì½pÅ6žl…¸"o<-îbèÏá~¢¥ŽrqEî#Þ4{«wS§ã\Ýœzº4¾ÈñΓ%‹·\Ñ Ϭj;Ðáy@x HÍäù“Wš+¿:bnm}‹íŠì£tèxÐQa'ä>âÜGh&W§C]=:;õw©ÿÝ5ë®õ´þî·ïyþ£¦Oý+ rɱ}çþ¯õÌðú5jÂóé3Œ úÁ3=×éH0‡„Ž !¶+|Gî#9ÔÍ©§Ó¯þ.Å?û½ËÌŸWWèwy@H HšòŠ:sIVvÁôâ }:g' ïõ¾ëÝ7ëxÐQa»" ä>’Æ|Þ×ûŸqž8ká;‰] ™È$æù©¿ÑﯽÀ²5õ¶+² Éý ÞqsN@Ç€Žr‰Bî#z™çÍý†f÷¹´ï7"\@b¹¯¼þŽg’v­`2ûA½Ëz¯¹fIFîŽ oÿÞÙtÛöÿµ]`¹€„{çwÿsÕð'Mƒp×/j?f»¢€$­Ô;«÷×¼ÑzÇõ¾Û®°ƒÜÎøù¼B rÈàŒëYý‡&äYÉéÍ3GôÎòÌà ¹Ä;ÜÑùãYofe È)z¬t£þÕvE€eä`(&>²Öyyå¦]¶+òWBúA½æ®½³zÉ}€ÜGbuŸ:½tõûƒ†•jŒÿaEsËAÛ¡@.nJ‡¼±eæªÂÜüE»ÛlWä—Ø÷ƒzïôš·Rï)¹ä>’©¦n¯ ý³ºfír€!€óUnÚ58¯Ô´qýP)Æý ù¨×¼}zcÿQ/Ð'ä>’É\üSöâ{ݧNÛ®r¸ åŬ…Îä•,Þ³‰e?¨÷Hï”Þ/s+¨ÞÁ˜½k@æÈ}$Ó´ÂõÉÙ2èrè…²cÜC/9›RÆé “øõƒzwœ­bõ®‘ûÀ‘û7r¸¤ÆÝmæùDúu˸%{ÿøgÛy Ný Þ½/Σ$c|×'9ràF.)ª¨Úavªì—]0eFå‘£]¶+ÊH<úA½ z/ôŽ˜CôÙ®;ràF.©ë:Ñý“ž‡™'Ù-^õ®íŠÒƒ~P¯¿yj¤Þ‘éÅ’ðÔH sä>À\úªí@Gþ䕿êÄkFΫ­o±]Q:"Ýê5×+oÞ½zGlWD¹p#€ô¸[’;&þ*r-IDûA½Îzµ£ÞŒ‘û7rÈDyEÝ—¾>˹dñxçIÛ¥*rý ^[½Âæb]½æzåmWD¹p#€ ¹·4ùßœ•-M¢ÕêUÕk›Í|‹È}€¹xb_kûˆñåÎ#¶ïÜo»¢KˆJ?¨WR¯§yaoýn¹^gÛÑFîÜÈÀCz$zøûA½zz Í‹©WU¯­íŠ€8 ÷nä๹KkäidõR8snu÷©Ó¶+º€0÷ƒzÅôºéÕS…z%Ÿ\²ÕvE@|û7rðÃáŽÎ‰¬½ìº³Ÿm Î+­Ü´ËvEç m?¨×J¯˜jÓ«§×P¯¤íŠ€X!÷näàŸ?|ò§ÜüEæŠGý¦¹å íŠþ&„ý ^÷ËÕÔü™íŠ€"÷näà·p~àª~0ü§±AîÜÈ ]'ºÝ7ÄÍ_Vk»¢õƒz5Ü·[êµ²]gä>À\ª 3ÃÐFh;V 6È}€¹Ìý@½‘ß[jëzvûAýÔúÙ#ô¸F 6È}€¹XQQµc`îl¾~ÙSfT9Úp¶úAý¤úyõSë»ëÐëp@‘û7r°åxçÉéŲz:£¿ÿƬòŠº ¿»•~P?£~R}_ýÔúÙõ ùÝœ!÷_D.vµè¸ýÞeæÊÉkFÎ{÷ƒ}Á|߀ûAý\úéÌyÛ„eú©ƒù¾ÎAîÜÈ jë[œv)òÊÚ¥ÀúAý,ú‰œ†W?©ßß@/È}€¹„dz+~wùÐbs9åOKÞòõÉ ôƒªÿg¥¿6ÄêçZ°|›ß @ŠÈ}€¹„Š{»•+o,ño»¿ûAU®ú-n˜à‚È}€¹„PsËÁ[Æ-1×XÞ0zAãî6Ï¿…ý ª½áßšâõSègñü[H¹p#€Ð:û¸ö[üz\»ý *T¦à¯|kŽê÷ð‹ð¹p#€0ë>uºdñ–9E§ý‡ê÷ú/ž|eoûASçß]_¨¯©j=¬€·È}€¹„ßáŽÎ{§­1Ÿ» Î+­Ü´+ó¯éa?¨zT•)o½¬j3ÿš|BîÜÈ *w·åæ/òê¾ñ‘µiïÛ™a?¨ï;iú+ªÁ샪ªÒû:FîÜÈ rºNtÏœ[ÝH¡y®ßüeµi|‘LúA}GóœDÕ J|}N"o‘û7rˆ¨‡ŽÞõÀ æZÍ«†?¹µnoŸþzzý ¾ËÕ·>e¾iþ䕪¡O€uä>À\"mûÎý×ßñŒiÐFMx~_k{б¯ý ¾²¾¾ùFúŽú¾é– À&ràF.1P^Q70w¶Ær¿ì‚i…ëwž¼ä_I½ÔWÓ×ÔWÖŸ×wÑ÷ò¢dvû7rˆumÓ‹7¤Þµ¥Øº;M}ýT:MaFîÜÈ NÜWu^wÛü^®ê¼d?¨¿›}ûü4®Dfä>À\â§¶¾Å½ëKÛŽóÿL/ý þ¼þ–ùëú:újþ— ä>À\âª÷§B\°ôäIŒܸ‘ @Œ9Ú5ù§¯:O_³¾Áù_ç÷ƒ¯¼¹ÓyÒý}?Y—ö“p#€Økn9x˸%æúÏÜüE»ÛÎ|±ÔÑ7@RÞvÉüBîÜÈ !6¼ýûÁy¥¦éûÏ­þżjýFÿüÞÔÕæ?êÿ¾±¹Év™üEîÜÈ 9ºO.Y¼e@N‘F}VÏ“)Ì?õ_ôßõmÀwä>À\’æPû±ãËÍg‚ú¥ßë¿Ø. @@È}€¹$Šû^Bç÷ ÉAîÜÈ !Žíš2£ÒÙkÔÜ6xÏÔ—=EõÙSˆ=ràF.Ià<‹0+»àçs6vèvöÕïõ_Ì„À\¦¶¾åš‘ó̵—wÞ·¢í@‡ßŧ~ÐPͪÜüúYôùñ]¤Ü¸‘ @xÙFùÚÁ4¶ú„ܸ‘ @™eý á÷…¯ú„ܸ‘ €uV¶a ¬<ãóÆ8ú„ܸ‘ €EÓd?høôà }BîÜÈÀ ëq¾4ô“êç5?¸^½$¹p#€€uŸ:]´àíþC 5ôä•,Þb¥ [ý QúÜoõ³«½ó£×ÄJ@‘û7rRå¦]ƒóJ5è.»îñ‰¬=ÜÑi«»ý èg×+ ×Aeè5Ñ+c« QÈ}€¹£¹åàÍcž3×Iææ/jÜÝf·ëý ¡×A¯†yYnúÎb½Jvëbܸ‘ €ßÜ„}ùæ'BòAXHúAC¯‰^™0|l Ĺp#_Í_V{ù Ÿß(7snu׉nÛ}.Tý è•Ñëcn«Ô+¦×ÍvE@<‘û7rð‰{#Í1® ÛFšaë ½Jcð¢ÅmWØ#÷näà¹}­í£&<ïÀ\À\Îá<á®ÿ™s«ãú„»÷ƒgzž©÷Nï`DŸ ø‡Ü¸‘ €£¶¾åê[Ÿ2WæO^Ùv ÃvE>Šw?hèÔûhÞP½³zmWØGîÜÈ@öµ¶šð¼i®»mþöûmWä»$ôƒ†ÞM½§æÍÕ»¬÷ÚvE€Mä>À\@Âï<9½xC¿ì „¹³Ë+êlWäôƒ†ÞY½¿ú‘õ^ë×ûn»"ÀràF. ÉÜ=´Âõ‰ê’Öžééýõ.'°÷ÜÈ}€¹€dÚ¾sÿõw<“äkØîkƒu $áÚ`Àܸ‘ Hš‡ŽÞõÀ ¦¸jø“[ëöڮȎÄöƒ†Þw½ûÎÞA:*lW„ܸ‘ HžAà–ð~ÐHȳE7ràF. !^ýu£óŒò‰¬ååôƒ†Ž:*ôjèÑqb»"À_ä>À\@ì5înËÍ_d® ¼eÜ’æ–ƒ¶+ úA7:6ÌA¢£Enj튿û7r1v¸£óÞikÌ"p^iå¦]¶+ úÁóéÑqb˜ ÿõ²ŽÛÞ#÷näb©ûÔé’Å[ä™[Ãô{ýÛE… ýà™#ÇÜdªã‡#ñCîÜÈÄOuÍž«nù|ëÈq½t¨ý˜íŠÂˆ~°:ftä˜Cè+ßš£#ÊvE€gÈ}€¹€8qßvÃèÜÖ úÁKÒñ££ˆ;O3ä>À\@<9Ú5eFe¿ì³KdEÕÛ…ý`Št,™iutécgZD¹p#Ï®øyŠ\VvÁOKÞâ)r© LŽ(WY=gt¤-X¾ÍvE@úÈ}€¹€H«­o¹fäÀ\@´TTí˜;›Í=2G?˜!÷F:&ÙÂQAîÜÈDÅöû¯¿ãsÞÈï-Ý×Ún»¢h£ô„ŽCæ°Ôñ©£ÔvEÀ%û7ráç~8øUßäáàž ôŽI™æÕ±ª#ÖvEÀE‘û@”õ œ*D¨‘ ³®Ý3çV÷R¨£t@NÑüeµ¶+ŠúAÏéøÔQªWUG¬Ž[ž{‚p"÷ ê¡âqnídzÞÔˆ{xfû!´È„Vå¦]ƒóJu|^vÝãY{¸£ÓvE±B?è¥:VuÄêµÕÑ«cØvEÀ¹È}„œú&uO:JÕIÙ®Åúqît¹Ó|NÙVN"„È„Ð>ùSnþ"sõ~ÓÜrÐvE1D?è±î¸©ù3ÛCî#´Ô+©c2»Æ©‡jmû‹íŠ^ ý ßø€áDî#œÔ%©WÒÁ©¾)®7Ü­zíëo}J?ãèIË9Uˆð s—Ö¸o¿ê>uÚvEqF?Ãî`Ÿ\²ÕvE¹ÐQg¤þèÿ³w?ÞYUùžçÿ‡®Ô¢íE3Ü帺z˜Nušž\m°•ºÒÎe•Ô.½éáº.KªŠËÅf-®·¤5üìÐ j:‚ äVZ*Fi•& !¨D$e‘ˆ„  ?0Ÿr×Ýu’P¤:HÕŽFUFùlмÿø½?^ež4çR!"àÊ…‹}ó쯿S^­#ðŸþéâMŸ¸Q¾P:¡ã\G»^yù:þós1þ ÷áœjÓtK¿ª&r=—T¯Ù|`ÔØß?l^õä¦|ÖÅpŽ\€«7íÿ'ÿz‘޽²òê§¾}¹÷ªëåõ +:ÚuÌ—}s%DgÎ×#B¾ûpHõŽªª€TqŸ¤q¾§÷™%ÛÌ}³sk¶Ó )#²=-ÿüÏ^0wÍýù_ý’íY]¡tKG¾Žs"èŒÐyázDÈ rN¨ÆQ¥£zGUÏÓ‹Þ¡ä¹U[ûéÉÓ7椯¼B. 5ZOúÉÀž ôAôòˆÎ. ä>Ò§êÆì³ z‡}§sÓì»1½¿p=ä¹€ô]éÿ¿½cnûÇc®Ú¸Ïõˆ@=è:/ÌíÓ:St¾¸BFî#MªhTט}Øß~ÿ7®‡“ JÚõ{M³isè?†¤‘ HÚ¦ÆOÌœF ¯Pz%Ú^Iç í•réP£ZÆÌiªn¸Ò5\gÎ]œ9¯Q/àc.ªý€N H¹€äþ¼ËÜó þí£¯ÿò+×#ÂQzHçˆÎsÊèÜÑäzD¹¤©rQýrÇ7·=¨¢áNøRj;5qê:½’£'¬¨oju=„‰\@Ø€ÛÔƒÞÒù¢³Æœ>:t6¹‚Bî#QªYT¹è{èñµªe\'öU}pÊ«¼ªˆ¹€xõ_»¾¨öƒï~¾Ž« –¬ÚE7i?QúLgÎAzt6éœâÉJÈåÞ«Këvó©+’@. F¿~÷³?Wc>×x|v=ݤ}F=è?Aõ·oN(Y:¿\! ÷;Õ&öI·%«vñ¤[rìS™#+óT&âB. ígM1ýS9i%Ï=ùz0+t6éœ2'—Î2k®G„l#÷#Ó Sµ 0ÓÔÒzÒvmmÜyÄõpyäJd>ÂøGÿâyÓCì¿þ·Ã®G„‚Pf˯ßýÌôéÕ¹¦3ŽßQ4rqQ%bwÊûð㮇“;ìꈸ (Å‹k÷˜}Ó¾ûýùó–ï྅ ¡Ì_:ËÌù:ïtö¹2‰ÜGéT}¨ѤzDU‰ëáä×…‹}Ï.{wDÅ‚²òêÙó›¸Tˆâ (ÎÿÏÿk[ þ觯9wÑõˆ0<Ôƒu®û’Î8Û¼Wg¢ë!cÈ}”B‡êUªAæÖlgOa´wœ2k‹ÎëQckÖl>@ÿ1 ¹€á:ÑÙ=á/_5ËÑùç/üô¤ë¡Ôƒ™¦óNgŸ9 u>òÌ Gî£8ª2Tk¨âÐñ£êƒg™}óþžvó°¹~ݵï˜ëá KÈîrïÕYÏ¿õòjÓØjõ¦ý®G„âQ`m}‹iã ³Rç&=ýPrEP}ak öö5;ŠC. @ªþìÊó©…o³òÌ:êÁ0èLÔùXÆUŒÜǰØ{ï¼g ÷"f¹îKöžÞç^ØÉ=½¹€!üôäÿ:aw¦†z0$Ñ»¸u¶r7Aî£@ª#TMØ^%ª2\ÃÐÖ~ÚHÔƒ¡²»ÀèüeÜŠÜÇàT5¨v`¯ó`(” 摟is¸Ë ·"p«MŸØ¯òÌåÎó QLçìÏ~þ¦Î_óÈÎh×#‚GÈ} D•‚êó0òò5Í\M I×™ž™óÍ›»´n7] E. êðç]¦˜þù·¾Bgª€QOç¯Îbs:ë¼ÖÙízDð¹[©:P`>BRÕÀÝæ¡:Ôvj|Õj½Ë£'¬hØö©ëáÀäŒó=½1s“Y:þɸš·ßÿë!YÔƒ9¡é]g´9µuŽëLw="8Fîã&ª FÓ5N•ÂG‡;]‰«oj5ïøÄ©ëT!ºÜ#Ðíú’U»FT,Б _õ{ºIçõ`~pŽ#ŠÜ‡¥Z@ù´H5‚ëá =—{¯Îé½;¾yØ|æ¼FšÇæ¹sÑÏñB~PæÍùž^ãö¦ýÜ"÷qã›-êÌÓdªTÐ( Ÿì£wÞ³¤vý^žÍ-r!·¢Ïýo“þož-ÊêÁ|âaû9§5¿Vþ¦kÜÔ§~E·I4ï?>î‘:ÓQvGóQ×ÃäB]¸Ø÷×·•Þƒ9G=˜gÑš øh WÈý<ÓjßìF§õ¿ª×ÃG64¼ë¾¥:6&OßÈŽ“yC.äMto²¿[º{r‹z0çØc4·Èý|Ò _ë|½õ£ÆÖhåïz8ðÑùžÞ¹5ÛGT,P4è7ôËr!?ö´tü³ñËÍ}b“~²nÒ9G=ˆßìH¥ÙÀL š4K¸GîçYäk…¯u>‹| ©½ã¬yØ|ÔØš5›Ð,È…<8ÑÙ=á/_5K¾ÿåÁ~zÒõˆàõ ,Í ¦÷¸þÑ\ÁóDa#÷óC+y­çµª77ò¼0 ·£ù¨yØœ[‹ó€\ÛåÞ«O-|ÛÜ6²rñêMû]¾ ÄM4?˜Ý¨5chÞÐìázDH¹Ÿ¶IˆVõ4 Aú¯]_ùÚ>ó°ù”Y[Žù•ë!)äBÀÖý}‹YÝ}§¼úožý5«;DQâVš%þÃso}ç® iq="ÄÜžÖíZ½ÛM¸ß¥8×}iöü¦²òj¶& ¹¤ƒŸžü—þwaÔƒHôsÍ$Üar?`Z«›MƵzמ=…—ßwMœºNSÇÝ,£/}xÈ…Àhòÿ?~úšYÈýÏ÷ÿgnÁ@¨1¸÷÷´k1“‰f–Á ÷C¥UºÖêzsµn?ÔvÊõp ÆGÌ~%ã«V·´r©0äB0L÷øï~þï»Çÿ«tÇà¨Q»CæÍ0ìPr?ݤ1\Ôƒ(Žf›Eµ˜G•5 i.bþÉr?Ó´Þ¦Í#|CcÛ¬#2gGóQÛôïÑopÒ¡8Ôƒ(…fÍ?´2Î"r?£Øž;ÑÙÍÆ—E.dÈñ/¿ºÿ±Wì¦`­mÿŸë!èQºÃŸwÙ­N5;iŽr=" ÜÏ­«µºÖ[oœÖÛœhðYóþãæaóÊI+¹T˜äB&\¸Ø÷7Ïþú;åÕæª ·ˆ tÔƒˆ‹f$³RÕ¥™Š-¢bþÑoè?æ3rÁg{Z:þùŸ½`îÅzø‰õt“FŒ¨;ÍQ“~²ÁLYš»4ƒ¹nƒÜ÷Ÿ]H—•W³F¦µµŸ¶—564t=ܹà'-«L1–UHõ ½¥yŒ Y¾!÷=§5³½ÑNki×Ãb°£ùhÅÄ—¹íÙ[ä‚o.÷^µ·]Ý1fáêMû]a¢D¢4wý“½ˆÝ=Dî{Ë6âÐÊ™FLß•~ÛiêS¿:ÑÙízDø#rÁ+›?ùþ”¶ Hõ ’m„¥™FXž ÷=¤µ±VȶQ¿VήG$â\÷¥™óÍGl›ârÁ?=mÛÎe$zéÐlöÀ_¬¶åh®s=¢¼#÷½b7òÖ›¢u2{ #µ2OEž°¢¾©Õõp@.¸Ç¶Îp‚ziÒ̦ùÍLtšñXô:DîûC+a­‡Í“¶Z!»ª†mŸšã|ÕêwºN®‘ õ_»þ_ØñÝïÏ×[0¢bAÍùï®G„¡Dúþó+»5×éÀÓ¼§ÙþùNû>ÐêWk`óùˆVÅ®‡¸q¹÷êÒºÝ#+›ÏÇé?æ ¹àʯßýìOÆý¾Ø?úÏÿÕßþ=ݤ‘2êA8¡¹N3žæ=~š5ºQîûniÅkžŸÒX+aZ-':»§Íi0'Åò5Ír!}ígÿôG+Í}S•“Vþ¼ËõˆGÔƒp¨­ý´f?3 j>Ô¬èzD9BU®Öºæ£­~iDµ´ž¼ÿ±WLÝÆG\'_È…4E/ŒÿOÿæ?qaQÂ9n“p‚ÜwBë[³ÿšV¼Z÷ºà© ï~`™Î”‡ŸXÏþ›©!RóâÚ=öÁ™yËwði8Ü¢„4j>´Qkžt=¢ð‘û)ÓšV+[½æZåj­ëz8€ï.\ì{î…J„²òêÙó›è?–r!ÑÆzüõëØðõ üA›å4‘û©Ñ­Õ¬Ö´ZÙj}ËVk@áÚ;ÎN™µÅlʹfóú%Š\HÔ‰Îî?û?×°ñ£¤Õ&Ï(>³ÏöÞyÏží-¹Pv˜Ex¨ sç†ægîÜ(¹_8ÓÃÐÜDC CöüÂöþ}ûý߸ŽïÈ…Á±Ã,BE=ˆÀh~¶OvkÞæÉîûÒÒîq¦µ¥ëá6ö-¹0Ž"ŒzAÒ\­›Îσ ÷‡ÄQã|O¯ýdçéEïðÉÎm‘ ·Å³õ fw†ÕL®ùÜõpüBîBkE­í§Ì,0´wœ­zrO~ „\¸ ;Ì"'¨6óä—fržüº ¹[ѧPµnä)T <ÑÎÍû»ŽGÈ‹f‘+ԃȃhgHÍðt†¼AîߎV†t©ò ÿÚõº×?d縛 ;Ì"o¨‘šÕ5·³sœAîGEw±Ô*‘»È€<8×}Éö›ÿÒ{ô#ØaùD=ˆ¼±×ý4ççùº¹oh¨u í®õ¡ëHU[ûé‰S×Ñ9êF¾sf‘gÔƒÈ!Íóšísþ\@žsß²ýõ¤8g¶ÿØøªÕ-­']Ç|æ;ÌÔƒÈ-Û7L)þaùÌ}Kë=­úèÀR ,­Ûmûuv}ízDiËa.°Ã,pƒz¹§ùßî+¤\p=œôä0÷ ­ñlÿp­ýòvÀàì}ƒfŠÈÕ}ƒ¹Êv˜,êAàFä¾A¥CNîÌUîZ×Ù‹ÿ¹½O@!ì-£'¬Øºý3×ÃIINrf›P†A¹`úŠ()‚ˆœä¾¥é#”燃 K}Së÷~°Ü÷-­âLó@­ëè`XL bÓlÖóo…Ý‚8ì\`‡Y` ÔƒÀ­”65” ®‡“ˆ°sßÐÊMë7Ó?œÍÅíDg÷ã³ëƒï?j.°Ã,08êAà¶”J Ó€Z9Þ]%¡æ¾í®UýÔ®yÿqÓlÌkƒü€)¼\`‡Y ÔƒÀ ”JóÔy`0…—û–ÖiZ­™þá¡~¼ À•_Ö·˜ÐÂë?X.°Ã,P êA`HÊóZH]©Ë}Ãö×jMk6×Ã&Û,°•Áä;ÌÃB=H™bv­ £Ae0¹o„º<à­ßû½µfó×ÉA¹À³@¨Â)YìvJåŽë/€Ü·lÿp­Í´Bs=9bûpƒz¦sf¢QÃ¥”QÖØËÊ ×#*F¦sß²íèÀ•h«)³¶d·UvsfRPű'(ƒ”D®‡3lÙÍ}C+.Û?<àöï²ÂôËô7YÌv˜JG=”Bé£ 2íË”J®‡3 YÌ}#º=4ýÃxÅ–'w?°,såI¶rf¸P%Š–'ʦ¬”'ÙÊ}Kë+Û?<[8€ühÜy$‹·/f%Øaˆõ  å‘R)C·/f%÷­è ºôà¹h{“¿Øš‰ö&™Èv˜bG=Äȶ7QZyÞÞ$¹oh¥ÕTÖøÈ!M_Ñí<Ÿ¾<Ïv˜B=ÄN9e·?P~¹ÎíyžûFô»ÖT™¸À7ÉÊöèÞæ;̉¢’àxy›û–VMZ;eo~l>üy—ëá܆Ÿ¹À³@Ò¨ä(¹ìÍ-J4×Ãù?sßÐJÉ6èÓ Êõp ¶ÿXYyµ‡í‘}Ëv˜ÒA=$M)¦,óíáwßrß0xi¥Dÿp¡jï8k·O]ùÚ¾þk×]èüÉv˜ÒD=¤ Ú[çCslrßЊHë"ûi½äzD æýÇïýñ*¯>üò!ØaHõ óá—'›çúû–ýU«#>B€Dõ_»nŽ{tÆίƒ9Ïv˜œ R¦Œ³Ç)û\ ÃyîZÿhd±ôç¾)HÇùžÞg–l++¯vÞÌa.°Ã,àõ à„òN©ç°y¦ózж`Õ*Hk![°@jìæzwÝ·tCÃA'cp’ ì0 8G=¸Ý\Oi˜òæznëA­v´æñ|‹FH™æd³ÏŽ“þc)ç;Ìž ÜR*Ó¿4ꪴýõæq~·*ø&ÚLéfÿ±4sfP>°N(Óyt"ýzP«SùÒ?wæÜÅ™ómÿ±t.¦“ mí§Ùað õ à%£m­vøó®D¿Wšõ V2¶¸V8Zç¤ðM ëlÿ±ÑV¤Ð,é\`‡YÀOÔƒ€WìÖKJÌD·^J­ÔÆtΡ8Á΢ã«V':‹&— ý×®×½þ!;Ì~¢<¤¬Tbš[+W¾¶/‰]R¨µn±ýÃî¬YgZ¯Ø»,j½’P.°Ã,à9êAÀ[ÊM¥§ÎP%©ò4Þ/žh=¨µŠ}ò…þá ûöÈÊÅ/®ÝûSرçB{ÇÙª'7±Ã,à9êAÀgJOe¨’Tçé£3Þˆñ›„êA­O´J±ýÃÓìŒyÐÒzÒviŽ·ÿXŒ¹À³@†PþS’*O•ªÊV%l,ÁšD=hû‡k­BÿpHΆ†ƒ¦ÿØ~úZ\»¸Æ• vlì0 dõ JUe«NØ»î[ª´-ñ«Å[jlZ“˜þᥠ0¤ ûž]ö®ù .–þc¥çÂÞƒ_°Ã,9Ôƒ@¶(aígp¥<˜W=hû‡kM¢• ýà M¶ÿXéÏè•’ ì0 dõ 9ÊY¥­iÜ]ô3z¥×ƒÑg齿§ÝôðÔ¯ú}q_¤¸\¸Ü{uQíì0 dõ QÊ\ÛÃsþKï ·‡g‰õ`,k@\J¿FWD.°Ã,êA Ó”¿Já"öø+ºŒñÞ$@¼J¹‡X¹ ôypÊ«ì0 €z€½B;¾juWh‹¨cï]HBq=¾ Ìv˜C=„A‰¬\¶Op(¯ÿóí“èmHÎp÷2ÌÓëì0 †z‰íð¦¼~qížA:¼^&·÷1 QJeAÜà¹À³@¨¨ðRÁR^]¼Uàžå‚Ýý–f Q¡üÏÁëÁáÞ} ðÜ¡¶Sã«VÒæÖ\8ßÓ˳@𨀠Òfz°ˆî4€Ld‡ˆh.°Ã,Ôƒ@ðn»CÄmëÁ¢w¯dÅåÞ«ó_zïÖäm.ìÚwŒfü râ¦äoªKÜÝ-ö ñ;ïYR»~oß•~“ fWAv˜òƒzÈèý?&ñ•þ¦¸Öô€¼iÞÜôûþÿþÒC¯Õo¾Ã³@ÎPy£”WÖ+ñuîÿ»¿\«5€é®Uë¡øë¿ÛjBAÿ,ªeMä õ O _~ßD¿ÖZ ¸À–Ö“÷?öŠù|ðÿ~ …g–l;ßÓëzhRB=äR^Yo.+ýíçƒì/ ùqë³æùÁþb5ϹB=äGôùA“øæùA­´àùAȳì™ö£;ÌÚ>c;ššþc÷þxÁ£rB™®d7ýE•õ7õÕzÀöÕ:þ¢¤†mŸ´ÃìMû®|mŸi5Æþƒ@بàÙý•ìÊ÷Á÷Ô ý  |½µR)™ÂwL3÷ ­j´¶Iô&XÈ´¸v˜-Nʹm’3s^#ýÇW¨·”€ÊÁô[¯¤_¶IŽÖ<±7É€Œjï8ã³Åq’ ]_O›Ó`CK…@ú¨W”zÑ­”‰i~wWõ ¡ÕŽÝDã·Ç~çd à¶nw˜ ö&™Š‰/Ó Hõ à„ó­ÛÝÖƒ7|Z€+&±Ãlqœç‚^ ÛÌù«äõ 2eœí®ìs5 ç¹oèÕ°·Hý²¾Åí` 5‰î0[rÁôQ± ¬¼šþc@:¨ÔØþáJ:ç[/ùû–ÖBZ¹j¡i:ÑÙ=õ©_yØ\ËŸ\hï8kûÕ½þaÿµë®G„ŒzH²L‰fû‡+é\È£Ü7´"²-ÖŸ]Ÿf‹uHGj;ÌÇ·\hÞÜt[¥ÿ(êA i¶¸~õçÃ/ßrßÐêHk$ ,Í-˜ õM­fǽv˜-އ¹Ðíºí?Võä&®¦á¡’£äR~Ùþá^Ýñâaî[Z)™G,¿÷ƒåZA¹”ä£Ã)ï0[osá|OïÓ‹Þ1O[Ð ˆõ Û³éÜ·´ú²+1­Ê\@ŽØ«Rî0[œrÁ>Ë?²rq&žå|@=Îô4³ýÃ3ÝÓ,€Ü7ÌZZéÇ©zrSvïÔ.öy¾Ãlq‚É…?>a{}Ó õ P Û?\)£¬q=œR“û†ÖcZ•™NZ§³<à›Lì0[œÀr!àw ˆõ 0$åˆÒ$£ýÃXîA¾S<ýÔÉóf‹^.D?É=¿‰K…ÀmQƒPvØþáÊ”,öHx¹oif?ÉÝ{ð ×Ãy™Ûa¶8¡æBxOzñ¢n+úTZ¦û‡$ÔÜ7Ì“ž¦ý{ÖŸôàP®ºV† ÑN°»ös=À#ÔƒÀ­”Áw­ ;÷h'ØEµd´,W²»Ãlq‚Ï…`vŠâE=DEwµ û®’àsßÒ*Nk¹ìî }ùœ7r’ çº/Ù'Až{agHO‚Å¡ %‚rÁ>u®¼p=¢då$÷-{ÿÁ)¯æá:?€â„±Ãlqr• mí§~b=ýÇ€ÔƒÀ7lWj¥CNºRç*÷\=`¸xî8‡¹`w’ºÿ±WZZOºàõ rNó¿R ‡»Öæ0÷ Û'pdåâ€û–h_âv˜-N>sA)°|M³!·×êAäV´.Pä­.Ègî[Ñ}ÄruÀMØ·ÔÊs.Øû„µ$XZ·;W÷ ÔƒÈ!ÍóšíÍÅÀÜÞ7˜çÜ·ì}ÂZ æä>aÖùžÞ§½ä³Å!>:Ü9¾jµé#Ô°íS×ÃRB=ˆ¼Ùºý3ÓWDs¾f~×Ãq†Ü7´Ô:ÐöÒúÐõˆ$.øf‹C.¶ÿØÄ©ëè?†< D~hV×Üž·þá!÷£ì>#Z†½Ï€æýǃßa¶8ä‚uábßü—Þ³ýÇ‚o9Žœ£Dh&Ÿõü[¦¸fxn ºAîߎV†v•¸kß1×óüì0[rá&':»§>õ+sÀÐ £DØ¢ýÃ5«Ó7Ì"÷oËÜEfî"‚a>îÉϳÅ!n«yÿqÛŒ”$êALóö˜ÖšþášÏ]Ç/äþ ´VÔŠÑt™xî…|  dZw˜-¹0EæSú!<Ôƒ’í®Ù;çýÃBîIG‘Vt¡²«¥õ¤iÉÎ2… w¾§×öÓoè?†`P"0vº6ýÙ®BîHkH³Kõý½¢µ¥ëá(Hg××yÞa¶8äB!Ú;ÎÚ Î<…Š0P"$¶¸æjžü¹_8­$µž4Vj…ÉS¨€ÏØa¶häBálÿ1HA¨û¸7ýà Dî—V•Z[š´ÚÔšÓõˆÜŒfKA. Kÿµë¶aÝ”Y[Žù•ëE¢DÖèì¶ýÃ53sçFÈýâh…iGÒš³aÛ§®‡àØa¶täBlÿ16´BvQ"»ìv±ô/¹_ ­6ÍgZjêz8@®±Ãl\È…¢ÙËw?°lSã'®‡ õ 2J rÓ?œyqÈýÙËæ%.Géc‡Ùx‘ %jÜy¤ü¡ÍíÊôC†P"slÿpͺô/¹ ­?µ µ·+ÓÃH ;ÌÆŽ\(]´ÑÏ~þ&íŒ ÔƒÈÍ«3~±•†± ÷cdÛUL|™vF@ÒØa6!äB\´\Q1ÈrYA=ˆLà‚[ìÈýØi]j·;ÑzÕõp€±Ãl¢È…xq;²‚zþ³‚sC~ŒÈý$ØÅjYy5‹U ^ì0›4r! ›?¡Ý:ã ¹J ¹Ÿ2­iíðZëºà)Z2:D.¤Éô++¯¦Y.œ£„s´dt‚ÜwBë[­ri– ÜŠf#ÒÇfšðõ ÜÒìw×}KÙ²-}ä¾+ÑÍ4µúe3M€f=A.¸²£ù¨ÙW‹‡eàõ \±Tkä‘êô‘ûniÅ«u/…ì0ërÁ¡¾+ý¶ÿØÔ§~u¢³Ûõˆ#ÔƒHŸf¹islËeÍ®G”Gä¾ì£RZó¨ò†f}C.8w®ûÒÌyzè?†4Q"M—{¯šþá:ê4ãÑ?Ü!rßZ ÛVŠZ!»8šîú‰\ð„í?6z ú!ÔƒHæ4Ílô÷¹ï¶ZCN°Ã¬Ïȯ4lûÔ¬šÆW­þèp§ëá dÔƒHª?sSœf6Ío®‡ƒß#÷=¤µ±VÈæVj­™Ùua‡YÏ‘ ¾‰¶Zš9¯‘VKHõ ¥¹ËÜ OÓ ßûÞ²­–´r¦ÕÂÀ³™@.øÉv]ÐRjùšfº. vÔƒHˆæ«×î1µ4Ñ)Ë7ä¾Ï´ZÖšY+g½GZEk-ízD@‘¢;Ì>³d;ÌúŒ\ðYKëÉû{…þcHõ ’`û‡kŸÈ}ÿ™…´VÑZKë7,¤‘9ì0›-ä‚ÿtN™þc?±žs q¡D¼4;ý觯™þášµ\"÷³Bç”ÖÒz³´®æœBVDw˜ežÉ r!.\ì{î…æ3wú!Ôƒˆ‹í®9J3ýÃ=GîgËŽæ£æ3wqÀsì0›]äB†´wœµýÇx&%¢Dé¢Ï:ivâY§L ÷3Gëj­®M£~žÉ…‡nÚaö̹‹®G„á!2g×¾c¦g/ýÇP êA”èý=ív.Ò¼äz8(¹ŸQçº/™ž½f#ozöÂì0r!‹¸&ÒQ¢hö^ú‡g¹ŸiZokÕmöôÔ:ÜõpkÑf93\È®ó=½ö™¹5ÛyfÃB=ˆ"hžyvÙ»öYfÚf¹€†mŸšOd´ç¤Ïî0{ǘ…ì0r!ëlÿ1zúaX¨1\¶×1ýÃ3܃VàZ‡›>µ2×úÜõˆ ì0$r! vϯqÔ}øñ ×ÃAP¢p-­'mÿpöBÍ:r?$¶££ÖçZ¥ÓÑ‰Š®6Ùa6$äB0Lÿ1®Ø @Ôƒ(DtµIÿð0ûáÑÊüþÇ^አ’óa#½£{ɪ]ÜÑPbpæn4Û?œ»Ñ‚Aî‡ÊÞÑ­u;wt#.ÑfŸ]ö.Ý*‚D.éPÛ©§¼JÇ' ‚zƒ°ýÃ5“Э"0ä~À´Vî…¶ã“Vò®G„ £›}~ ³+º‡_ËŠ7¡ÄmÑÍ>xä~ðØ¥‹î0«ß»’E.„írïÕEµpÇnE=ˆ›œ9wÑÞm®yƒ»ÍCEîçÄ®}ÇXÏ£\OÈ!r!lGˆ;ïYBGÔƒ°L7*Ít£Êr??¸ßÃrÓ³ÜoœäB~ì=ø…íÿöû¿q=8F=Có¿í®YÂõp8r?oÎ÷ôÒC¢Qž‘ yÃŽÒ0¨¡@óýÃó†ÜÏ'Îw „fA.äÐùžÞ¹5ÛÍýO/zGÿêzDp€z0ÏtÖ?³d›ù¼@³“@®ûyÆ~∊î0ûâÚ=EŸ'Ò ÀóD9Dîçœy^XëžÎ3v˜E¹s;šÚþcÍû»ÒC=˜C:Çïýñ*s¾ëÜw=¸AîC´þ·ý„UÐO8Wì~dã«V³n øæó‚º×?4­é?–Ôƒ¹bû‡ëL×ùÎýyFîÃR-ðà”WÙo4?Øa·E.À8×}Éö›ÿÒ{ô õ`Nè\Ö}ǘ…ô‡Aîã&öÓ"U |Zªè³ >F¹€¨¶öÓæÂýÇ‚G=˜ßüØôÖyM?aä>n¥ê`Qíöi2Õ®G„ذÃ,†D.àV¶ÿØøªÕô õ`Øtæêü¥8nEîc ¶Û¤jUt› @t‡YÚD` änK)°´n·í?ÖÙõµë!fÔƒ¡ê:Ócû‡ë,fE‡›ûÜÞƒ_ØÝè8N²Ëî8y×}K¹ã ƒ#0ÛÌ,,¹Û<$Ôƒá1ýÃÍeú‡c ä> ¡ ÂÜm®š‚»Í³…f1\ä†do<=aÅÖퟹâA=˜ÆGlÿpnóÆ È}Hu„ª Õª,T_PVø/ºÃì£3Þ c< D. @õM­ßûÁrúƒz0¶¸ÎPú‡cHä>†E5EÕ“›t̨ÊP­Án5Þb‡Y\@álãz3³ž‹Æõ™F=³MŒíÎ61(¹"¨¾P•¡#GmI|Ýavåkû¨Ù1\ä†ëDg÷ã³ëé?–uÔƒ™í®ó‘þá(¹â¨Ê¨{ýC3í¨úà^D°Ã,bA. 8Íû›þcc~XËm YD=˜]öB=ýÃQr¥0·%¨úà¶ç¢;Ìþ¼ËõpaäJñËúóØ2ýÇ2‡z0‹~{ìw¦¸Î;}®‡ƒL"÷Q:%¾ylYõˆª×ÃÉv˜E¼È”Èö£­q¶Pf 'âBî#.ªDÌ^ç´5NÍM;̲bA. Ñ-Öl>àz8õ`†D?ˆ×¹æz8È6r1ê»Òo·=U¶§É‰î0;ã[y©#r1ⱦ ¡Ìû .ýÃr±Sm2s^#Z%‡f‘(rñж=œ2k m½E=è9ù"!ä>bjSåÂCmq±;ÌÞýÀ2v˜EBÈ$mÑüG=è­èFŸôGìÈ}$J5Ë÷~°Ü4½T-ãz8ÆR ©!.jùŒzÐO,¥4rIã¢V‰¸Õ )#4nz÷õ o¸Õ é ÷‘nz/­>r) )–‡¨ýA+¤‰ÜGšhŠU8ZµÃr©aÓ¯Pú€VíH¹ô±iÎàØan‘ H™½)®bâËÜçõ slå 'È}8AÉ3h±ÜÖ~ÚõpGäœØøæÇw?°Ì4Í8üy—ëáäõ CJ|ÛjIç‚ëá _È}8½%Ruëá8fo¦óÃZn¦…Cä\±ýÇÊÊ«é?–>êA'Lÿpóô‡+ä>œ£e Ívàrnµwœ2k‹™W¾¶¯ÿÚu×#Ê êÁ”騮{ýCÛ?\G¾ë!§È}ø º¥‚*£ül©ÝŒcÖóoq1> àƒæýÇïýñ*ú¥‰z0Möb¸Žó|^ ‡?È}ø#o[®³Ã,üD.Àý×®¯Ù|À2A5½7t ðß™sͽ÷¦ÿ÷ÞÇ‚z0F:&Õ~`ú‡ëXÕëzDÀ€È}@¹€¬°ýÇFOXjÿ±4QÆEG£é@ÿpd¹ˆ"-ví=¾j5kïRP–NGàƒS^å²…ÜD‘ ÈÓÌÞ›Fÿ±ôQ–Âö×qHÿpd ¹ˆ"Q¶wÇÈÊÅ/®ÝCïŽá¢,ŽéqdÚ¡ÓãYDî¢ÈdZKëIÛÛ¿qç×ÃÉêÁ"è³{ Ð?Eî¢ÈÀîýý£Ÿ¾ÆÞߢW“§oÔ+¦#MÇ›ëáÅ#÷QäÂpábß³ËÞQ± ¬¼zöü&6-õ`Î÷ôêˆÒq¥£KǘŽ4×#JBî¢È„¤½ãì”Y[tH[³fóþk×]È_ÔƒCÒñ££HÇ’^(W:º\ˆ¹ˆ"ž÷÷´WNZ©[¿îÚwÌõp Š\@ðÚÚOÿ觯Ñò&Ôƒ7¡K-r‚ÜD‘ È »sÜý½ÂÎq7¨#t<è¨`K么"}Wú_\»gdåbóÓæ4œèìv="—¨EÇ€Ž½:*tlèq=" qä> Š\@Þté™9¯Ñ”Këv_î½êzDnä¼Ôû®wß\Ðñ £Âõˆ€”û€(rùt¨íÔøªÕ:øGOXѰíS×Ãq Ïõ Þq½ïúñu èHp= Uä> Š\@žÕ7µšº`âÔuy« òYê]Ö{m®èÝw=ÀrE. ç.÷^ÿÒ{wŒYhîÌÏy«õΚû„õ^ëÏí}¹ˆ"€‘¾"wÞ³¤výÞ<ôÉO=¨wSï©ÞYú7È}À·‘ €Õ¼ÿø¸Gê̾;šºN²rRê}4ûŒèÕûëz8€{ä> Š\n²¡áà]÷-Õy1yúÆ€÷%¾Ô{§wP?㨱5zO]ð¹ˆ"€[ïé[³}DÅ‚²òjýFÿêzDñ ¸4oŸÞ;½ƒ¡¾}@ÑÈ}@¹ ¤½ãì£3Þ00­Ù| ÿÚu×#ŠSõ Þ#½Sz¿ÌÇ»z]ð¹ˆ"€Áíh>Z9iex …WÚÇ?õ~ÿø'P4rE.Cê¿v}åkûLƒÊ)³¶ÿò+×#ŠAHõ Þ½/¶=l`Ÿäñ"÷QäP sÝ—fÏo*+¯6Ø]¸ØçzD% £Ô»`¶Ôû¢w'?ÛGE#÷Qä0,‡?ïš8uΚ»X¶©ñ×Ã)^õ ^½ ú)ôŽj;åz8@6û€(r(BãÎ#fW»ñU«[ZOºN12]ê5×+¯ñ—?ô¢Þ ×ò„ÜD‘ @q.÷^]Z·{dåbA?ûù›]gz\hx2ZêuÖ«­‘ë•×ë¯wÁõˆ€Œ!÷QäP •'3~±5‹åIæêÁ¬à€'È}@¹”.‹·/f«Ô«ª×6Ó7èž ÷Qä—ú¦Ö µ7ÉJ=¨W2Œ>€'È}@¹Ä(CÛø_¶Áà rE.±;ÑÙíÿöè>׃zÅôºéÕÓõJÿò+×#ÂAî¢È !Íû{¤NçW夕;šºÎͼ­õZéÓØôêé5t= 4ä> Š\µfóQckt–Mž¾±½ã¬ëáü‘‡õ ^½J•^1½n~~® d¹ˆ"€¤ïé[³}DÅý£ßè_]è÷¼ªíKTV^íÏK‰ÜD‘ @:ÚÚOÛ¿64t=êA½ö#T½J®‡ŽÜD‘ @šv4óÃZŽó¡´XVL|ÙÃG, ‘û€(rHYß•~ÛM相¹ˆ"\´n÷ÈÊÅæ.Ê®3=IÇÔêAý,ú‰ô½ôÓégÔOšôw0rE.þèìúzÚœS:-_Óœh—•êA_?…)rõs¹êœ ŠÜD‘ €oZZOš[++&¾Ü¸óHBß%ézP#×øõ-îìýD }ÃEî¢ÈÀOÞýÀ2ž?±>‰]Ú“«5ZY_\ã×Oû×P rE.Þ2[3Œ¨XPV^={~S¼[3$Qj„§F«1?÷ÂÎô7Ñ0$rE.žkï8;eÖ³uûšÍú¯]åËÆ[jT›F¨¯©Ñj̱|Y±#÷Qä ÍûWNZ©³U¿îh>ZúŒ±ÔxìØví;VúrE.Ya>ƒ5¶&–Ïàb©íg—UŒŸ]H¹ˆ"€l9ßÓûô¢wÌ3zsk¶ýŒ^‰õ ¾¯¾»}¶Q£*îëH¹ˆ"€,jk?=yúÆRzx–RÚÞ§C½O$‡ÜD‘ @v½ýþoÌã©ûðãÃú»ÅÕƒú.ú^Iï 9ä> Š\2­ïJíú½¦±ç´9 ':» ü‹Ã­õ•õõõWFV.ÖwÔ÷-vÈ\"÷Q䀮3=3ç5ê\¾cÌÂ%«v]î½:ä_)¼ÔWÓ×ÔWÖŸ×wÑ÷ŠcÈÜ ÷QäŒCm§z|­ÎèÑVÔ7µþ‡ ¬õuôÕô'œòª¾~|ƒà¹ˆ"€ÀØ Nµá Üõà°ªKYAî¢È <…Üá9H=½ûtQí…Ü} +È}@¹„Êv€¹óž%·v€¹m=XtwYAî¢È lÑ"Þ~ÿ7ö¿ßZFw¯Ø{ð ƒ8rE.ypëòÑz°ôÝíd¹ˆ"€œ¸p±onÍö ÊÊ«Ÿ^ôÎ|a‡Î}ýªßë¿è¿ëÿžïéu=LÉ"÷Qä+íg§ÌÚbzÅØ_«žÜ¤ÿîzhÒ@î¢È ‡^\»ç»ßŸ¯s_¿ê÷®‡ =ä> Š\rÅ~>øÿÕ‚ßÿúÍçƒú/|>么"€œ¸p±oþKï™çgÏoš·ü÷ÏêWýÞ Š\ÂÖÒzr|Õj³ÿ`ãÎ#ö¿ßºÿ þ¯ÙP^ËÅ`$ŽÜD‘ @¨:»¾ž6§A'øÈÊÅKëv÷]éþß[ëAÑŸY¾¦Y^ÿKW_!Ý!H¹ˆ"€ð\Дu3ç5vé¹õÏܶ4ôçõ·l!©¯–ü¤„ÜD‘ @`¶nÿlô„CÞö9H=h|t¸ÓÜhª¯¦¯™Ì`¤ÜD‘ @0µš8uÎèïý`y}SëàxÈzÐÐ×1Õ¥¾²¾~|ƒà¹ˆ"€œë¾4ëù·t.ß1faÛFXÞø‡*îøf§B}}¯8† À rE.™Öw¥¿výÞ;ïY¢ùñÙõ':» ü‹…׃†¾òÔ§~¥¿¢ï¥ïxSwYAî¢È »v4óÃZÂã©kÞ|Xw¸õ ¡ï¢ï¥¿¨ï«ï>¬¿ Àä> Š\²¨­ýôäéuòŽ[óËú–"¾Bqõ ±¡á ¾¯þºÆ`v·ä> Š\²å|OïÜší#*èýFÿZÜ×)¥ŒqRFî¢È CÖl>`?˜ûí±ß•ò¥J¬ö޳öcJ­”/ ä> Š\2Á>¸W9ie,îÅRFUÜcŒRFî¢ÈÀs':»§ÌÚ{cÏëAé¿vݶ9Õh os eä> Š\¼Ýøoöü¦x7þ‹·44B³¬¼ºðm¤ŒÜD‘ €Ÿê›Zï~`™NωS×j;û×O¢44ZY_\ã×Oû×P rE.¾ii=9¾jµNÌÑV4î<’ÐwI®44òò‡^Ô·ÐÏ¢Ÿ(¡ï`¸È}@¹ø£ëLÏŒ_lÕ)9²rñҺݗ{¯&÷½’®Eã×O¡ŸEßH?—~ºä¾€‘û€(rðA´tš6§!…Ò)…zÐÐÏò³Ÿ¿™N‘ `Hä> Š\œkÜy¤bâË)ßZ™Z=hØ›`õ“&w,€!‘û€(rpèðç]¶õÊÆ7?Nó[§\›?±Mrô³§ù­ä> Š\œp¾5ƒ“zðFd ýì±o¢`Hä> Š\RÖíúÊ×öÙ­ÛÛ;Î:†«zÐ8þåWúÙ5½z5ôš8Cä> Š\Ò´£ùh夕:éîýñªæýÇŽÄm=hè÷H†¡×D¯ŒÃ‘ùAî¢È ígñ†N·QckÖl>àü1êÁß|ZªWC¯‰£×ÇÕ§¥@~û€(rHÚùžÞ¹5ÛGT,(+¯~fÉ6ý«ëýž'õ a^"½>z•ôO^" Hä> Š\µ¡áà]÷-ÕY6yúƶöÓ®‡óG^Õƒ†^½J•^1½n®‡„‰ÜD‘ @BìÃq_öðó°4v45»1êÕsûˆ%$rE.±;ÑÙ=mNƒižY»~oß•~×#º oëAÑ+¦×Í´`Õ+©×Óõˆ€pû€(rˆÑåÞ«fs=V3ç5ž9wÑõˆäs=hœë¾¤×Pƒ4[4êµu=" ä> Š\âRßÔ:z P§®;ÔvÊõp†à=hè•Ôë©¡êµÕ+ìz8@æ‘û€(r(j–ñU«³U³d¥4¶}jjm½Îþ×Ú€ÏÈ}@¹”¢ëL½§qiÝî ÝÓ˜­zðÆ7÷âêY¹ØÜ‹«WÞõˆ€L"÷QäPœ¾+ý/®ÝcÊ“,ö<É\=hØ^=zåõúûÙ«ð¹ˆ"€"4î Š\@ðì¾äwÝ·”}É-êÁ›èØÐ¢×DG‹Ž×Ã’Bî¢Èì|Oï3K¶••W¨X0·f»þÕõˆêz8ž¢œŽ?z‰t,ñÀ)BBî¢È„¤½ãì”Y[L»È•¯íã“APIÇŽ"ÓVÇŸ2# ä> Š\@.\ì3ÛÉ••WÏžßt®û’ëùŽz°@:–tDé¸2VêHs=" $ä> Š\@6¾ùñÝ,Ó‘ Š\@¦µ´ž_µÚì׸óˆëád õ`tŒ™],uÔéØs= ä> Š\@Fué™6§AGïÈÊÅKëv_î½êzDC=Xi:ÞtÔéÕÓ¨ãÐõˆ€á!÷Qä2'º Ÿñ‹­,È‹C=X u:ö¸,"÷Qä²¥qç‘ÑVpÃ^é¨KgoWÖ1ÉíÊÈ rE. +µ² =ê›Z]'ó¨㢣Ѷ3ÒQêz8ÀÈ}@ÔùžÞwêW×dþkCÃÿQÆÈnw¢—”íNà9rdEß•þÚõ{í†à':»](Ôƒ±Óñ©£T¯ªŽX·:z]ȪÍG+'­ÔêzÜ#uÍû»Nh¨¢cUG¬^[½:†]ȘßûÝäéµ¢5¶fÍæ®‡&êÁDé¸ÕÑ«WXG²Žg×Ã2à|OïÜší#*èý†'\’C=˜4f p¿¬o±©´µŸv=œÀQ¦CG²ý°[G¸ëáÞ±\ùa-\¥ƒz0M:ªuló0,u¢³ûñÙõ´dLõ`Ê¢ÍruÌÓ,yݲmÖóo±e[ʨÐq®£Í4gõM­ßûÁr­Š'N]w¨í”ëáäõ C:æuäëõ×Y sÁõp€”´´ž_µZ+áÑVlÝþ™ëáäõ s:þuè]СóÂõp€ué™9¯Q«ß‘•‹—Öí¾Ü{ÕõˆrzÐ: t.èŒÐ{¡³Cçˆë1ë»Òo½Óæ4tv}ízD ôˆÎöR ]•ŒÆG*&¾ÌMq¾¡ô½•Zç‹Î×ÃJÒÖ~Ú4͸ûeº¾…zÐO:St¾˜VK:ƒ\¶sÝ—fÏo*+¯Q±€¦ú~¢ô–ÙŠEçŽÎ GlÅ€¬è¿v½îõͦÛSfmiï8ëzD¸=êAÏéÜѤ÷Hg“Î)Y®G fGóÑÊI+µ‚Õ¯Íû»C=˜ :ì9¥óËõp€Ûhï8[õä&­ZG­Y³ùŸeøz0+t6éœÒ™¥÷KgŸ¹Àç{zçÖl7Ï:=½èý«ë¡ Ôƒ endstream endobj 147 0 obj <>stream Ù¢3Kç—y&Wg'œ³½'OßH/Äl¡Ì"e:×èÙ ·öübÜ#uf¯´·ßÿëá`ب³KgœÙÓSç ÎD×Ã@Žœèìž6§Á´=¬]¿·ïJ¿ë¡Ôƒ™¦óNgŸiä«óQg¥ë p—{¯.ªýàŽ1 µ9¯±ëLë¡xÔƒÐ9¨3Qï£ÎJ›:C]aªoj=a…Vž=¾öPÛ)×ÃA©¨ƒ¡óQg¥ÞM¡:O]AÑjóÁ)¯²Ú õ``ì­\±@é¢w£-Yµ‹»ÑBB=¡:O¹£%2Ý*FV.¦[E¨¨Ce;>éü¥ã†«qçÛÍþÃO¸A=6¹vGÑ®‡€ `·ëü ÌÅ:—õFë¼ÖÙíz8ðÔùžÞÙó›ÊÊ«GT,˜[³ýÂÅ>×#B²¨sBç²Îh×:»uŽëLw="x¤ÿÚõ5›Œ[£ê`ʬ-íg]i Ì×:»õŽëL×ù®³ÞõˆàÞ®}Ç*'­Ô*Q¿îh>êz8Hõ`é·ç»Î}×À3öó‚;ïYÂç9D=˜Oæ~õÜO.ö=÷ÂNû<ѹîK®G¨óLg½}^X³Ï ä„í7øðëé7˜gԃР y€~ÂyÐÒzòþÇ^a?2Ôƒ0ì~£š4K¸bv¢³{Úœ­÷FV.^¾¦¹ïJ¿ëÁ=êAXš43h~Ð!¡¹B3†ë —{¯.­Ûm–y3ç5véq="ø‚z7Ñü YÂ\8Ò¼¡ÙÃõˆP¼†mŸŽž°B«»ñU«?:Üéz8ð õ nKs…f š=4‡¸†íPÛ©‰S×™]}S«ëáÀGÔƒ„æ s5I3‰æ×Ã@AÎu_2w|Ý1fáü—Þ£<B=ˆÁiöТ™ÄÜmÎÆ4>ë»Ò_»~¯ÙfzêS¿¢#G=ˆBh&Ñ|¢CEs‹fºQxhGóQÓ1~Ü#uÍû»2€z…Ó¬¢¹ÅìV£ÙÆõpðmí§'OߨuÚ¨±5ì(ÂQb¸4ÃhžÑa£9G3ëáäÚùžÞ¹5ÛËÊ«GT,Ðoô¯®G„,¡DÌ´£9G3Ó€ý×®¯Ù|À^¨oï8ëzDÈêAMs޽-As‘f$×#È û O夕<ȃ¢Q¢Dš4 ñØ2@:ŽùÕ”Y[l£?®É£Ôƒ(f!ÛÖX³“æ(×#ݬ¬¼zöü&6Cé¨ÍHš—4;±í)@ì65~r÷Ë´tŸ8uÝ¡¶S®‡ƒ@P"^š4Gé Ò|¥YËõp2¯¥õäøªÕZ_•?ôbãÎ#®‡ƒ P" š©4_éÐÒÜ¥Ìõp2©ëLÏÏ~þ¦ÖT#+/­Û}¹÷ªë!4ÔƒHˆæ+ÍZš»t€iÓlæzD™ÁR é D¢¸¨0\Üj…ÔP"ÜôPZ1 eÔƒH M±B«v8A=ˆ4±iÀMØÊQ"}šå4×éÀÓ¼§ÙOs ë¸±£ùh夕Z{¤®yÿq×ÃAîPÂÍxš÷tøiÔLèz8©jï8;yúF­…F­Y³ùWÈáõ Ò¼§ÙOs B͇š] qç{zçÖlQ± ¬¼Z¿Ñ¿ºò‹zΙ)Qó¡fE¦D¶ íÅð¶öÓ®‡ƒ¼£„'4Ú[&4Oº@ÌìÃ2_æax‚z^Ñܨ’Gª@HNtvO}êW¶™^ß•~×#þ€z¾Ñ i[.kæÔüézDE²›mia3s^#›mÁ7Ôƒð“fKÍ™:8Ù’dT}Sëè +´ž™8uÝ¡¶S®‡Üõ |¦™Só§QÍ¥šQ]  î_µÚ¬a¶}êz8À€¨á?Í¢æÚšæUÍ®®‡0 ®3=æ§‘•‹—Öí¾Ü{Õõˆ€ÁP"4—jFÕ¼jî½×LëzDßÒw¥ùšf³\™6§ÈêAdˆæUͮ悛æ[zsO4îÙ­y›'»@‰l»ÉÓ7ÒÅ¡D4WkƦó3(ŇŸ÷H»\!`Ôƒ˜ÝV3¹æs×Ùq¢³{Úœ­"FV.®]¿·ïJ¿ë‰ DØ4{k×L®ã\³ºæv×#^»Ü{uɪ]wŒY¨ÅÃÌy]gz\Hõ ò@3¹æsêšÛ5Ãkžw="à£ú¦ÖÑVhÍðà”Wµr= qÔƒÈÍêšÛuÀkž×lïz8À#Z'<ôøZÖ ÈêAä½î§9Ÿë~ zÑ¢Ú¸¹B=ˆÒ<¯ÙžçÈ9ÓgàÎ{–Ðg¹E=ˆÜ²}Ôô  oÞ~ÿ7¶ùÞƒ_¸àõ rNó¿ÝWH¹àz8 qìS XÔƒ€( ”:”Ê×É8ßÓûô¢wÊÊ«GT,˜[³]ÿêzD€cÔƒ€¡DP.(”J €ô_»¾fóQck´ô­zrS{ÇY×#¼@=D)”:)”J e‡ë€R5ï?^9i¥ò]¿îh>êz8€G¨[))lj(A\©½ãì”Y[Lû¸º×?äJ/pêAà¶”J Ó€Z9Â]%dË…‹}ó_zÏ< 2{~Ó¹îK®Gøˆz„²C bž:W¦(Y\ ÍvŠ›8uâ€APCRŽ(MèJ €ÿZZOޝZmv’jÜyÄõpßQR¦˜]k•2Ê×ÃßÒÙõõ´9 Jê‘•‹—Öíî»ÒïzD@P…S²(_”2:k”8Ê×#7.÷^µ=s^c×™×#2ƒz.¥Œ²Æ^~T¹ùµuûg£'¬à 8Ôƒ@qìã Ê %‘ëá;‡ÚN™ü¿÷ƒåõM­®‡dõ P ¥2È´/S*¹¹p®ûÒ¬çßRþÞ1f! ÀRP%2Û)t*)›ØÞ€äô]é¯]¿×lüøìúÝ®Gdõ  å‘RIg“J9EO3b·£ùè˜Ö*mÇ=R×¼ÿ¸ëá! b¤lRBéœRZ)³\€@´µŸž<}£vÔØš_Ö·¸êA vÊ)¥•Î,%—òËõpȰó=½sk¶¨X ôý«ëA¡’@xPº5›ØK¬¿=ö;×ÃD=$GÉeonQ¢¹™aÁ¨œ´’G0€äPISŠ)Ëxø€Bœèìž2k -Ú€tP)ˆ6ÇVÆÑ€[E·pš=¿‰-œ€P©Q®)ÝØ<€[Õ7µÞýÀ2¥äÄ©ëµr= /¨”)ã”t:ï”zÊ>×ÃÀ±–Ö“ã«V+GOXѸóˆëáùB=8¡¼SêéìS*]ºÎôÌøÅV¥áÈÊÅKëv_î½êzD@îP®(õ”}J@ƒJCe¢ë’hN›Ó@®Pn)•ƒ\äGãÎ#_æ&ÀÔƒ€ì£ÊG„ª­ý´}ˆ~ã›»êAÀ#JFÛZíðç]®‡@lL“í²òjšl^¡¼b·^Rb²õ ý×®×½þ¡Ý„·½ã¬ëø#êAÀCÊJ%¦ÎM¥çÊ×ö)I]€bìh>Z9i¥íÞ¯jÞÜõpÜŒzð–rSé©3TIªNy•ô@=À^¡_µš+´€äté±w§,­ÛÍÝ)@ÖQaP"+—íÊk×#Å<½>²r1O¯!¡Bb;¼)¯_\»‡o€X4îÍdçwfæ<çû=/ÏÀzóÜà7¿½Ûë !}²‰[yûPeÿ1ÈL„œâ?n÷íÙžã·Ýó=çAfú dæ|a€œŽè[°t{¬ÿ“:W>óý_^*=P†>ÉEˆ$y –‚È‘JOÀº0piõú=•eÑc]§N÷—ž(IBäH±ÜÔþxä„H ¥'`ômá7Sï\«ý¬¹öž,=Pž>TE6ˆ„kB¤…m;zJÀ¨‰~öüMVxà=ôAà="'Tî=ŽäàÞc€zw¦ï|õ ËŸ}Ñ3@€‘ôAàý"-DfˆäPyuÉé3çJOÀU¼8´vóÞ}âI¯>Œ>|˜êîs‘%"QØ} Žìê>\ÝAº{ßÑÒã5J./RDd‰ÊéT?ÿÇWKÀGè=òú] ·Äº}ó§V;a¸<}¸‘("WÄr#’Féqøgû]µsBó²‰m+âøc鉀Z§W¨3"cDÒxäÉÄ €Ú1ôÖÛ·îŸ2sUäº/>ð£#¯½Qz" >èƒÀU‰ŒI#ÖH‘="”ž »êû;ç¬ÛÕ}¸ô8@=Ñky#RG¬ŸüÂwmSPÊÑÿÏ{?WÙøkÝ_rpµôAàÚDêˆìQÙÆ<Òˆç&Œ§7Ï VšÐ¼lÉògúΗž¨Kú p="D‰4R9æ8òIé‰ß»þù–ÛŸŠ7{þ¦W^=Uz ŽéƒÀõ‹4™$“È'[~òëÒã4¬=ÇgÍÝP9¨k÷¡ÒãuOFK$“ÊÙÇ‘U"±” ¡œ:Ýÿ•¿øI¬±“:W®^¿çÂÀ¥Ò@FQä“H)‘UbaY°t{¤—ÒÔ½‘KëßxÞÒ Œ"}u‘U"±¸àúuí>Ôü™g<õ#ú 0Fª/r™zç/r¸Z{OV_š½mGOéq€Æ¤c*2Lu¼È6¥Ç¨¶nÆ>Œµê!Y±Ú8$ à2†Þz{íæ½Õ£]è+=ÐàôA`|Dª‰l NäœH;ƒ‡JOP[vu.ÖÉ[ï^ß½ïhéq€ôA`¥Ç¨ G^{ã®…[bmœ2sÕÆ­ûK$¢ã/ÒNdžX|"ÿüëïþ£ô8ÅœíxtÕΉm+âßx'þXz" }(BøÁö—«wŽõy½ô8@Fú PPäŸêS¤þzÛÒ㌓ê“çÛ?»Ö“ç‚ôA ¸ÈB‘ˆl¡dpìDßü¯ý­Íµ€¡µ Qu‹õû–l³Å:ÐxF¾³ø[?uøP ôA vD:ŠŒ‹’#˜³mGÏÔ;×Äú6{þ¦ƒ½'KðGú Pk")E^Š¥éãw< ªô8×åŸ^91kî†XÓ¢>¿ó·¥Çx}¨M‘š*÷¥GŽ:Ðs¼ô8WíÔéþEuÅ:6©såêõ{. \*=À{éƒ@ÍŠì *rT,S‘©"Y•žàŠ ^zzcweùZ°tû‰S¿/=ÀÓ9*ÒTõv{ñ5®k÷¡¶Ùßñô .èƒ@]ˆLUyN¤¬ÈZ¥Çø½G^ÿÜ—7ÇJuËíOý`ûË¥Çøhú PG"_Eʪlй«ô8t¦ïü’å;&4/›Ø¶ÂöÈ@ÑúR9À+Wä®H_ðÊzëí[÷WŽO½wñsG^{£ôDWAêQ$®È]±|E[ÿ7¿ŠøcÏÔÆÚ›ç]µ³ò¬õ¯?ñ³³ý¥'¸vú Ð"E*«ìä9M<ÆHuW«»n±«ÐôA aD6‹„f§w`,üê×Çn½{}åÔ›ÿû÷ÿRz€Ñ¡ &rZå$èHn{_þ·ÒãuïØ‰¾K·W6°Z»yïàšҌ}h<‘Ö"³U¶Y®ôD@]º0péÉïþâ¦öÇc1YôXשÓý¥'eú Ш"¹E~‹%.²Ükÿ!r]鉀z²mGÏÔ;×Äò™û¾°÷déqÆ„>4¶Hq‘åb¡‹\é®ô8@°nyèƒ@Õûù?}ï_¹Ÿø0#ŸWðäwáy@ÃÓ$¼¸ ¯;rÒTªûNê\iŸ@ bä¾Ä¿úõ±ÒãŒ}Hhä9b]»•(ƹ¥@rú Vd¿H€±FŒLXz`\íøú?›Ð¼lbÛŠGWí|óÜ`é‰ ÐÌ"FŒ4™pÉò‘KOŒ¹¡·ÞÞ¸uÿ”™«"Ý»ø¹#¯½Qz"€bôA€Hƒ‘ c1Œ|)1²b鉀±Ò½ïhçœuq}·»º— 0} "’a5%þâ¥ß•eÕ{~>ö‰'ÝóP¡TUžEVÙp޳Ƞa¼ynpù³/VŸ~¦ï|é‰j…>ð‘#1Vv™øæ·wÛeêZuç¨Ï}y³£ÞCø@‘#=Ú…ê×žã³ænp² Àe胗²rJõm÷|/²eéq€+râÔï,Ý×ÜI+ŸÞØ=xq¨ôD5J¸¼H’‘'#UÆj 󨉾ÒêÂÀ¥Õë÷T®°‹ë:uº¿ôD5M¸‘*#[Vnˆ´™³ôDÀ{=¿ó·Sï\×ÓYs7üÓ+'JPôA€+ ³òr¤ÈœÛ_øMéq€?:Ø{röüM•ëæ¶=¥Ç¨ú ÀÕŠ´Yy "òg¤ÐÒã@jgúÎ/þÖOãúxSûãËŸ}цÀWE¸•ãÌ"V^£ä83ƒ‡ÖnÞ[90tþ×þÖk{®>pÍ"F U4iäR{¸ÙÕ}¸ý³kãÚwëÝë»÷-=@½ú??%ÖÒx[z€zY4i匳Ȩ¥Ç×{äõ»n‰kÜ”™«œ p~þ¯ÆŠoKPß"—F:5’jäÕÒã@:Û?ðèªÛVÄ¿ñNü±ôDuO-Õ°:¡y™° £kãÖýÕ»\޼öFéq„>0º"©VŸÌ vè­·KOõ­ú”ìÎ9ë<%`téƒc!RkdW›]Àõ8v¢ïÞÅÏU·lrï À¨ÓÆHd×êfø‘iþû–žêFõH— ÍË–,ßáH€1¢Œ©È±‘f#Ó:,®Ð¶=·ÜþTä“Ùó7ì=Yz€F¦ŒƒÈ´‘lc½”Y·ô8P£ôŸ5wC\Sš?óL×îC¥Çh|ú À¸‰|)7VÝH¼‘{K5äÔéþ¾ñ|\;&u®\½~Ï…K¥'HAO‘r#ëFâµ7ÒodàÒAa#¯_ù‹Ÿ¸RŒ'}`üEâÜë¡èÚ}¨möwPJõ¥R‘‡½TŠl^yõTõEµ?îúçÒã$¥”I¸º•b$äÒãÀ˜³é.@íЊsÔI ½õöº¾äPN€Ú¡ÔˆÈÆ‘cMŽ´™9’sé‰`4íê>Ü9g]ü†ßz÷úî}GKÀ0} ¦DNŽ´+s$çÈÏ¥ÇQpäµ7¾øÀâ·zÊÌU·îw_@íÐjM¤åÈÌ‘œc}ŽYºôDpÎö<ºjçĶš—=òä ñÇÒð.ú @mªéHÑ‘¥ãAšºóƒí/ßü©Õ3îZ¸¥÷Èë¥Çà胵,RtdéX¨#WGº.=\‘êÓžÛfGƨeú @íÛÕ}¸rf·8¨qÇNô-Xº½²-ÒÚÍ{/•ž€ËÑêBäêHוú#oGê.=¼Ë…K•cSâWtÑc]§Ïœ+=M¨#gúÎGÒŽu»rw$ðÒÁ°m;z¦Þ¹&~3gÏßt°÷déq¸Rú @݉¼©;VïHà‘ÃKCjñÛ8kî¿uJ¨SÛ_øMå™Hã‘aü:Ý_}´zõú=­¨Gú @ýŠ9|RçÊÊ+¶"Ÿ—žˆ/=óý_V~ñ¼š ®éƒõ®º£cäóHévtdLuí>TÝíö@ÏñÒãp]ôA€ÆÉü¶{¾W9ñ-{éqh@½G^ÿ÷ÿ0~Çn¹ý)§a4} ‘DJ¬ {äöHï¥Ç¡Aœé;¿dùŽ ÍË&¶­øË§þîÍsƒ¥'`tèƒ &²ú7¿½;r{¤÷Èð‘äKODzëí[÷O™¹*Ò½‹Ÿ;òÚ¥'`4éƒ )r{¤÷Xá#ÉGžT_z"êÏßÿòHçœuñ[oãýÒã0úôA€ö‹—~'Ïs ÜŸ„>ÐØ<ß«òæ¹Á¿|êï<ß } ƒ³ýöá#Ù } Høw-Üâ¼Þï@Ïñ[ï^ï¼€lôA€lœ'ÎHÇNô-Xº=~&u®|æû¿¼8Tz"Æ>Pdþµ›÷Fþ›€èÑJOD.­^¿ç¦öÇã×`Ñc]§N÷—ž€ñ¦¤ù?Z@Ü D#ˆ^í ôDŒŸm;z¦Þ¹&~ú³æn8Ø{²ô8”¡$]àÓ÷þUÜD;ˆŽPzÆ\üÄgÏßä'ÀÿÓøƒê£EÑñ¤WŒ0’>ÀHÕÝ&£;Dƒ°Ûdˆ[ùꎲÝûŽ–€¢ð~{_þ·êitn#êWõÄÉ›?µÚ‰“¼Ÿ>À‡‰qËíOÅÍDtŠh¥Çá*œíxäÉ&4/›Ø¶âÑU;ã¥' éƒ\FôˆhÑ)¢YD¿P+jßÐ[ooܺÊÌUqûþÅ~täµ7JO@íÒøHÑ)æ>øã¸½ˆ–]#G鉸`ÝûŽ~ò ߟTçœu»º—€Z§p…¢_Dˈ[h¶%©5ÑÙï]ü\e# u?|IgàJèƒ\¹hëÿæW•c ¢}x.b-xóÜàòg_¼©ýñ ÍË–,ßq¦ï|鉨ú W+GôŽh•cÍ£”ž(¯-?ùueÏŸÙó7½òê©ÒãPgôA®Mï‘×£ƒÄHô‘h%¥ÇIç@ÏñYs7TÎéÚ}¨ô8Ô%}€ëM¤rÖyt“h(¥ÇIáÔéþK·Ç÷|RçÊÕë÷\¸Tz"ê•>Àu¼8­$ºIÜ DO‰¶Rz¢†Õ¯ú­~àÏûVpôAFEt“EuyÐjìtí>4õÎ5Š`郌¢ê‹Ú¢¹xQÛh9Ø{²úRÍm;zJ@ãÐuÑY>~ÇÓ•M/£Ë”§ŽU¶r來\ ú c¡z(^ÜÊ8ï ^Z»yoõ¨Çc'úJO@Ò;Ñbî[²-nh¢×D»‰ŽSz¢ú°«ûpçœuñ}»õîõÝûŽ–€†¥0Ö¢ÑD¯‰››è8ÑtJSÓþõwÿq×Â-ñ½š2sÕÆ­ûK@ƒÓ½í@tœ¸Ñ‰¾­§ô85çlÿÀ£«vNl[ÿÆ;ñÇÒÐøôAÆÊóaF–åÞ#¯—€,ôAÆÙȧDF*=NaÕ'Ó¶v­'Ó0ÎôAаeŠÍv(N ”‘G*D3Ês¤ÂÈÃ8ë§ã }€²²¹¾mGÏÇïx:.ïìù›öž,=©éƒÔ‚hFÑâ&)ºR4¦Ò㌉=ÇgÍÝ—qêkžßùÛÒã€>@ éÚ}(ºRÜ0EoŠöTzœQsêtÿ¢ÇºârMê\¹zýž —JOÃôAjJt¥hLÑ›âæ):T4©Ò‚¯?ñ³¸8 –n?qê÷¥g€wèƒÔ ¨Ñžâ*šTéYFÁ™¾óôp' C fE‡²÷&Œ} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '} '}€{ã Í“?ošfÌhmiŸ>9Þé˜6½¹#Þinko1møæ¶­­ñNKçð{Ãïü×'·OomŸ6cò=ó†ÿ?ÍMmm“›ÿðÏ=ÜxÃÔ––ΦÎÖöÖÉÓ;Ú›:ÚÚ:'/ºñ†Ö¶á¿ÞÑ6yFÇô¦–i--“gßxCûôM­-ï|æÈ¶u´6u´6ÿá3«½¥£¥©¥%¾àì‘_iä§~À×þÏø&Ü÷g·=ôð ¿ôð¯>8ï¡G&bøc2µ%.Nóô:ùϾððC ¼òŸÜ~ûm_úÒ×}þ«Ïþä?ü߆?õ“Ão†/qˈ‹ÛÒ4cúŒ“;f´7uvNo}×…ílÞß×ÃLkïlšÖÒÚòÎgŽüà´¶Ö¦¶ŽŽéﺰmÍÍMÍÓ†?ø__gä'¾ïköýüõÿŠÜ6ò‡×<£¥©­=~ø#¿ImM3š+?Ñ/įµµ£©mF[Ë.}{KGÇð'wtv4Méðwtzüç?~ö‡\ÔÖ¦æÓÚf´_é%}ç‹Vÿÿ#¿hu’Qý¢³oçŠ9{Þ# š:5>póœy÷/¸ë¡y ÿ×ðõþ%ó¾¾`ò¼þ?,Xÿiòý-XòðWZ0yÉW¾ú¿‡?2ü—ª!®øŸûô7üv¦Úò endstream endobj 264 0 obj <> endobj xref 0 272 0000000003 65535 f 0000000016 00000 n 0000023208 00000 n 0000000004 00000 f 0000000006 00000 f 0000027163 00000 n 0000000007 00000 f 0000000008 00000 f 0000000009 00000 f 0000000010 00000 f 0000000011 00000 f 0000000012 00000 f 0000000013 00000 f 0000000014 00000 f 0000000015 00000 f 0000000016 00000 f 0000000035 00001 f 0000023259 00000 n 0000026948 00000 n 0000026979 00000 n 0000023339 00000 n 0000026832 00000 n 0000026863 00000 n 0000023407 00000 n 0000026716 00000 n 0000026747 00000 n 0000023475 00000 n 0000026600 00000 n 0000026631 00000 n 0000023543 00000 n 0000026484 00000 n 0000026515 00000 n 0000023611 00000 n 0000026368 00000 n 0000026399 00000 n 0000000036 00000 f 0000000037 00000 f 0000000038 00000 f 0000000039 00000 f 0000000040 00000 f 0000000041 00000 f 0000000042 00000 f 0000000043 00000 f 0000000050 00000 f 0000023679 00000 n 0000026252 00000 n 0000026283 00000 n 0000023752 00000 n 0000026136 00000 n 0000026167 00000 n 0000000051 00000 f 0000000052 00000 f 0000000053 00000 f 0000000054 00000 f 0000000055 00000 f 0000000056 00000 f 0000000057 00000 f 0000000058 00000 f 0000000059 00000 f 0000000060 00000 f 0000000061 00000 f 0000000062 00000 f 0000000063 00000 f 0000000064 00000 f 0000000065 00000 f 0000000066 00000 f 0000000067 00000 f 0000000068 00000 f 0000000069 00000 f 0000000070 00000 f 0000000071 00000 f 0000000072 00000 f 0000000073 00000 f 0000000074 00000 f 0000000075 00000 f 0000000076 00000 f 0000000077 00000 f 0000000078 00000 f 0000000079 00000 f 0000000080 00000 f 0000000081 00000 f 0000000082 00000 f 0000000083 00000 f 0000000084 00000 f 0000000085 00000 f 0000000086 00000 f 0000000087 00000 f 0000000088 00000 f 0000000089 00000 f 0000000090 00000 f 0000000091 00000 f 0000000092 00000 f 0000000096 00000 f 0000023823 00000 n 0000026020 00000 n 0000026051 00000 n 0000000097 00000 f 0000000098 00000 f 0000000099 00000 f 0000000100 00000 f 0000000101 00000 f 0000000102 00000 f 0000000103 00000 f 0000000104 00000 f 0000000105 00000 f 0000000106 00000 f 0000000107 00000 f 0000000108 00000 f 0000000109 00000 f 0000000110 00000 f 0000000111 00000 f 0000000112 00000 f 0000000113 00000 f 0000000114 00000 f 0000000115 00000 f 0000000116 00000 f 0000000117 00000 f 0000000118 00000 f 0000000119 00000 f 0000000120 00000 f 0000000124 00000 f 0000023899 00000 n 0000025902 00000 n 0000025934 00000 n 0000000125 00000 f 0000000126 00000 f 0000000127 00000 f 0000000128 00000 f 0000000129 00000 f 0000000130 00000 f 0000000131 00000 f 0000000132 00001 f 0000000133 00000 f 0000000134 00000 f 0000000135 00000 f 0000000136 00000 f 0000000137 00000 f 0000000138 00000 f 0000000148 00000 f 0000071191 00000 n 0000071267 00000 n 0000071537 00000 n 0000072597 00000 n 0000078540 00000 n 0000144130 00000 n 0000209720 00000 n 0000275310 00000 n 0000340900 00000 n 0000000168 00001 f 0000027064 00000 n 0000023977 00000 n 0000025784 00000 n 0000025816 00000 n 0000024060 00000 n 0000025666 00000 n 0000025698 00000 n 0000024131 00000 n 0000025548 00000 n 0000025580 00000 n 0000024202 00000 n 0000025430 00000 n 0000025462 00000 n 0000024273 00000 n 0000025312 00000 n 0000025344 00000 n 0000024344 00000 n 0000025194 00000 n 0000025226 00000 n 0000000169 00001 f 0000000172 00001 f 0000057699 00000 n 0000070562 00000 n 0000000183 00001 f 0000057823 00000 n 0000062085 00000 n 0000062122 00000 n 0000067555 00000 n 0000024415 00000 n 0000025076 00000 n 0000025108 00000 n 0000024491 00000 n 0000024958 00000 n 0000024990 00000 n 0000000184 00001 f 0000000185 00001 f 0000000187 00001 f 0000070498 00000 n 0000000188 00001 f 0000000190 00001 f 0000067939 00000 n 0000000191 00001 f 0000000192 00001 f 0000000194 00001 f 0000070434 00000 n 0000000195 00001 f 0000000197 00001 f 0000068290 00000 n 0000000198 00001 f 0000000199 00001 f 0000000201 00001 f 0000070370 00000 n 0000000202 00001 f 0000000204 00001 f 0000068678 00000 n 0000000205 00001 f 0000000206 00001 f 0000000208 00001 f 0000070306 00000 n 0000000209 00001 f 0000000211 00001 f 0000069060 00000 n 0000000212 00001 f 0000000213 00001 f 0000000215 00001 f 0000070242 00000 n 0000000216 00001 f 0000000218 00001 f 0000069421 00000 n 0000000219 00001 f 0000000220 00001 f 0000000222 00001 f 0000070178 00000 n 0000000223 00001 f 0000000225 00001 f 0000069787 00000 n 0000000229 00001 f 0000024565 00000 n 0000024840 00000 n 0000024872 00000 n 0000000231 00001 f 0000065673 00000 n 0000000000 00001 f 0000064773 00000 n 0000067352 00000 n 0000067449 00000 n 0000064919 00000 n 0000067002 00000 n 0000067123 00000 n 0000067243 00000 n 0000065073 00000 n 0000066783 00000 n 0000066880 00000 n 0000065219 00000 n 0000066426 00000 n 0000066542 00000 n 0000066659 00000 n 0000065373 00000 n 0000066069 00000 n 0000066185 00000 n 0000066309 00000 n 0000065519 00000 n 0000065710 00000 n 0000065831 00000 n 0000065952 00000 n 0000024644 00000 n 0000024722 00000 n 0000024754 00000 n 0000057937 00000 n 0000061059 00000 n 0000058120 00000 n 0000059917 00000 n 0000058352 00000 n 0000058639 00000 n 0000027915 00000 n 0000351555 00000 n 0000061324 00000 n 0000060179 00000 n 0000058899 00000 n 0000070626 00000 n 0000070676 00000 n 0000056356 00000 n 0000000443 00000 n trailer <]>> startxref 351711 %%EOF fifengine-0.4.2/doc/logo/fife_logo.jpg000066400000000000000000012710311341615052600176170ustar00rootroot00000000000000ÿØÿàJFIF––ÿáRExifMM*bj(1r2އi¤Ðã`'ã`'Adobe Photoshop CS3 Windows2008:07:18 17:57:34  ë  a&(.HHÿØÿàJFIFHHÿí Adobe_CMÿîAdobed€ÿÛ„            ÿÀ k"ÿÝÿÄ?   3!1AQa"q2‘¡±B#$RÁb34r‚ÑC%’Sðáñcs5¢²ƒ&D“TdE£t6ÒUâeò³„ÃÓuãóF'”¤…´•ÄÔäô¥µÅÕåõVfv†–¦¶ÆÖæö7GWgw‡—§·Ç×ç÷5!1AQaq"2‘¡±B#ÁRÑð3$bár‚’CScs4ñ%¢²ƒ&5ÂÒD“T£dEU6teâò³„ÃÓuãóF”¤…´•ÄÔäô¥µÅÕåõVfv†–¦¶ÆÖæö'7GWgw‡—§·ÇÿÚ ?õT’I%)$–7Ö.£‘Óñ­È¬:ÆUW¨)cƒò³o¬à}?¦ÔèDÊB#ª%.nµ—UYï .Ñ Lé£R®ê­ŸMáÑÈQñ^Y‘õÂÇØFXu-$ƒYu`‘ù—dOÚ¯þÅ´Wÿ–7×™`Ù ¢‹ žAýÊs?¤Uÿ_vSÏô~JßV·Þã{ïO«$²zuùØõä?sk¶–Z+ysMƒvÃc~žÕ—ÔnúÓ‘Ö²qºVEŒÅ®ÊêsØÌKI}tØ÷ÚÛï¯-Û=__g§ÿ©Ê&$ƒÑ³X·ªIrS©u³”ì>”]2_[i¬b–W‰mk2¯«è[{îwøÓ ôU^±ÕºçHÁÀ9½Lcää›_`µ¸U8)ÙAõ²= = ïý.3ÿ?ô‰©{T–WÕœ×çtŠò_œÎ¢÷¹Û®cXÐÓ?ÑÿWu”½Ô7êÖïÒ-T”¤’I%?ÿÐõT’I%)dýeƳ#¦Úʘl±ÕZƱ¢I%Žs^µ¬£elµ†»æ;S¡. vD…‚$úÉÓë¯*¼üRÛ°rÜ×8Fꬬ¸zŒ{“îoúZ-ÿGbÕì"ÿW¨eÚqÚâÀkÏ¡M5·ÛºÇ쮺ëý%¶ÿÂ.×ëÕ§[Eÿgx­÷ïp&§¼¬9u³ÜË¿îí¥ÿMö放®ýYmTû꾡¥ mcLmx¨ýååÙúÅŸðuþ…šz‡µÅ~ªáú4=‰ßèÝø»ØØ ­í-{]d#Ó­ŒÿªÜ—õ…Øôõ«~Îތז¶Òif[˜_éí§gªÖû}ûâ×®¶VÀÆÖ´@#]d8‚ôÄv›}ß½í 2Râ‘=Ûñh³ªîêÔtáP‹±—ênÔm}Uz~žßwó¿Îzˆuç[oF¨Òßò¾;ï.ú•Õ~Ö³k½]Þ·úF-#C²+É,ê˜úëpË oµƒúûmLWX-!¢X!š ƒu5->‘ÔR¢ë^ˆ«"üvê\(±øþ¨qmOÓÿÔ–+ÉšÖ´C@h’`i©;œ´äé)I$’JÿÑõMÚÄa6ý&Â’ÀÌëQýK?¬ljú]uÝ“cƒ6ÚËmiªŠ@ý }—d_“G¥úOÑ_餧wv¼c„·yÇ‘õ_ë>°aßÚØÏ³^ìw>« µ<µµÛêQm•cXêöÜß§CÊJbâ××4dD‚i‚¬½oÿì?ü¶³þÙoþ•Kÿì?ü¶³þÙoþ•IO’$½oÿì?ü¶³þÙoþ•Kÿì?ü¶³þÙoþ•IO›cœ³×êSŽ÷íÚç:ÛZéuƒôk=Ÿ£«ØÏOþ6ÏYSÌ4œ«]ŽÑ].quuµÅá­>æ×ê<5ïôþ†õê¿øÇaÿ嵟öËôª_øÇaÿ嵟öËôªJ|‘%ëøÇaÿ嵟öËôª_øÇaÿ嵟öËôªJ|£ÓûEfÖ‡V ÚâZÒÐ}ÍsÙïnïä+÷~Îû=­P-Ù5ØË­$8¿y>›ÃšïÑ3ÑenýÿVË,^‘ÿŒvþ[Yÿl·ÿJ¥ÿŒvþ[Yÿl·ÿJ¤§É^·ÿŒvþ[Yÿl·ÿJ¥ÿŒvþ[Yÿl·ÿJ¤§ÿÕôì캰p²3n5bÔû¬ íµ´Øýüçmjç³>¹äôü*ú·P釥\Dã“IÊ!ÍõjwØœYCýOwèqóò2àMel¶·W`ÜÇ‚×4ðAปÅþVgQéuu¦_Ò:pÄ FE•ÍG%»}ý™´zveÕïʧü 7~°’ž®Þ§éÜê~ËòÛ[\Æ×€íìqsEVïÓZïcpskÎÆ5±õ±ÅÍ µ»íqf¬?Gè§8•›}]ö»qo¨ý§G7nÍÛv~“èÿQNš[K65Ïpñ{œóÄ}+ œ’’*½K¨ãtÌ7æånÕË\DéôZ­ åãW•C¨³èº5¡på×âùoZì‰]ߣ•Ѿ¶ô®³m”â›*i{†ÒFÑü±íÝü„{:õUSëY‰–֊ů‘–‡81•¹»¿vïæÿ1ŸÎ*ÿW¾«ctZnc^^û‹ýÍöC\}­nß~æ±µ·éÿQj}†½Il z¯Ð‚÷iîÝþÿ=§æöøÏ·|+qñðúþdéÓ5¡­ @’IÓùE:{Ô~¹tΟ˜ìKYa²£?Ñîþ{û @uŠU7WMöU}n¹¯md†´FßS÷l·wè«þqgõªµõúso¥¸‡lÕû®öWô–¯ìúE,¥Ž²¶×_¤Í–9°]\ûNÝþ嶺á÷ýÉûŸ Ûåÿ‡ülžÏx/ŒüÌpº•y–ÙSiº—ÒÚÞñs6:7±£S¹íÿ þ\B¯•ØëžK»9îsGEŽ;[ôQU†ÿÖ?þ>8?ùUoý¼ßý&—þ>8?ùUoýºßý&¼‘Œ}mu´½ï!­kD’NkZ»¾§ýemeçÂö´=øÍ-vKIkm»§±ÎΦ¯oó–ãìIO¢ããƒÿ•VÿÛÍÿÒiããƒÿ•VÿÛ­ÿÒkÉÛð×6§¹®’ÒH;~–ßê¨>·Öv½¥†& Áø¤§ÖÿññÁÿÊ«íæÿé4¿ññÁÿÊ«íÖÿé5äiÚ×8†´À”€'AªŸ[ÿÇÇÿ*­ÿ·›ÿ¤ÒÿÇÇÿ*­ÿ·[ÿ¤×”äaeâ¸3&‹)s€!¶4´~‰÷&û&T‘èÙ €FÓ¡<7„LLMH|T;jú¿þ>8?ùUoý¼ßý&—þ>8?ùUoýºßý&¼$úçþ>8?ùUoý¼ßý&—þ>8?ùUoýºßý&¼®žŸ‘[­£Ë+`—9­$„(¹Áŵ¸†èOÑÜ€ Øh“E¾³ÿŽþU[ÿo7ÿI¥ÿŽþU[ÿn·ÿI¯&²›ªþv·3R=ÀGÒ¨"‡ÿ×ó Ë0s±³ªþwÖ\ÏëVácé5wý7;ê§DWëC_VmÙõ:-nƒ‘U–m»ÜW¹ÿg»ßCÖÎþkìÿÑ/·×û2ó”’S¡_Tux¢–ߔ͵:¦µ¶Å{^àë*k6þŽ‹w_ê×þħœìü·d½öØ÷ûœó´lfç5µýÚÆ*©$¥+2Œ¥FNEfêïÒÖ ÓívÇ~kÿqSI:0Þ&Ð@ ƒ±ÑÝêýWÚ1ñèuÙeÆÛr^aÛ4ÓPw«±ßJË?áâÐ+ëÙXË™•˜,u¤›&×0Vë·9ŽÞ÷ïÈo¿üÉI;6ieŸ´è‚!ð…Ý´¸–‚'h:˜óú)’IF¹êúÖ™Ó©«(Ù]˜®&ưÀ¹‡V7úßàÿ¨±«êÑu¯ß‘K-¸[²‡†´Aéí;­®§[é?üÍIE 1„¥!w6\™¥8Æ'hþ-ÌÞ¥n^=4ÛmÖš]c›ê¼<k½KK=»÷Xï}›ŸôÕ4’R±?ÿÐòïNÏ÷Ézvx¸wZŸfj_fjJrý;<Ü;%éÙà>å©öf¥öf¤§/ežÇ€›Ó³Àxpµ~ÌÔÿfjJrÅV¸èÙ:˜p»þŠoNÏ÷®Êƒ7mй¥„Ïg}%³5%9~žîÒôìðw‚Ôû3Rû3RS—éÙà>áÝ/NÏ÷©öf¥öf¤§/Ó³À}Él³Àxð§Ùš—Ùš’ŸÿÙÿíÎPhotoshop 3.08BIM$FIFE 2d isometric engine8BIM%°º£Ö­-Da<¦Á¤œR÷×8BIM/J‚HHÐ@dÀ°'ift+Ctr8BIMí––8BIM&?€8BIM x8BIM8BIMó 8BIM 8BIM' 8BIMõH/fflff/ff¡™š2Z5-8BIMøpÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿè8BIM8BIM8BIM08BIM-8BIM@@8BIM8BIMe aëFIFE 2d isometric engineë anullboundsObjcRct1Top longLeftlongBtomlong aRghtlongëslicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlong aRghtlongëurlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM( ?ð8BIM8BIM 8k DÊ€ÿØÿàJFIFHHÿí Adobe_CMÿîAdobed€ÿÛ„            ÿÀ k"ÿÝÿÄ?   3!1AQa"q2‘¡±B#$RÁb34r‚ÑC%’Sðáñcs5¢²ƒ&D“TdE£t6ÒUâeò³„ÃÓuãóF'”¤…´•ÄÔäô¥µÅÕåõVfv†–¦¶ÆÖæö7GWgw‡—§·Ç×ç÷5!1AQaq"2‘¡±B#ÁRÑð3$bár‚’CScs4ñ%¢²ƒ&5ÂÒD“T£dEU6teâò³„ÃÓuãóF”¤…´•ÄÔäô¥µÅÕåõVfv†–¦¶ÆÖæö'7GWgw‡—§·ÇÿÚ ?õT’I%)$–7Ö.£‘Óñ­È¬:ÆUW¨)cƒò³o¬à}?¦ÔèDÊB#ª%.nµ—UYï .Ñ Lé£R®ê­ŸMáÑÈQñ^Y‘õÂÇØFXu-$ƒYu`‘ù—dOÚ¯þÅ´Wÿ–7×™`Ù ¢‹ žAýÊs?¤Uÿ_vSÏô~JßV·Þã{ïO«$²zuùØõä?sk¶–Z+ysMƒvÃc~žÕ—ÔnúÓ‘Ö²qºVEŒÅ®ÊêsØÌKI}tØ÷ÚÛï¯-Û=__g§ÿ©Ê&$ƒÑ³X·ªIrS©u³”ì>”]2_[i¬b–W‰mk2¯«è[{îwøÓ ôU^±ÕºçHÁÀ9½Lcää›_`µ¸U8)ÙAõ²= = ïý.3ÿ?ô‰©{T–WÕœ×çtŠò_œÎ¢÷¹Û®cXÐÓ?ÑÿWu”½Ô7êÖïÒ-T”¤’I%?ÿÐõT’I%)dýeƳ#¦Úʘl±ÕZƱ¢I%Žs^µ¬£elµ†»æ;S¡. vD…‚$úÉÓë¯*¼üRÛ°rÜ×8Fꬬ¸zŒ{“îoúZ-ÿGbÕì"ÿW¨eÚqÚâÀkÏ¡M5·ÛºÇ쮺ëý%¶ÿÂ.×ëÕ§[Eÿgx­÷ïp&§¼¬9u³ÜË¿îí¥ÿMö放®ýYmTû꾡¥ mcLmx¨ýååÙúÅŸðuþ…šz‡µÅ~ªáú4=‰ßèÝø»ØØ ­í-{]d#Ó­ŒÿªÜ—õ…Øôõ«~Îތז¶Òif[˜_éí§gªÖû}ûâ×®¶VÀÆÖ´@#]d8‚ôÄv›}ß½í 2Râ‘=Ûñh³ªîêÔtáP‹±—ênÔm}Uz~žßwó¿Îzˆuç[oF¨Òßò¾;ï.ú•Õ~Ö³k½]Þ·úF-#C²+É,ê˜úëpË oµƒúûmLWX-!¢X!š ƒu5->‘ÔR¢ë^ˆ«"üvê\(±øþ¨qmOÓÿÔ–+ÉšÖ´C@h’`i©;œ´äé)I$’JÿÑõMÚÄa6ý&Â’ÀÌëQýK?¬ljú]uÝ“cƒ6ÚËmiªŠ@ý }—d_“G¥úOÑ_餧wv¼c„·yÇ‘õ_ë>°aßÚØÏ³^ìw>« µ<µµÛêQm•cXêöÜß§CÊJbâ××4dD‚i‚¬½oÿì?ü¶³þÙoþ•Kÿì?ü¶³þÙoþ•IO’$½oÿì?ü¶³þÙoþ•Kÿì?ü¶³þÙoþ•IO›cœ³×êSŽ÷íÚç:ÛZéuƒôk=Ÿ£«ØÏOþ6ÏYSÌ4œ«]ŽÑ].quuµÅá­>æ×ê<5ïôþ†õê¿øÇaÿ嵟öËôª_øÇaÿ嵟öËôªJ|‘%ëøÇaÿ嵟öËôª_øÇaÿ嵟öËôªJ|£ÓûEfÖ‡V ÚâZÒÐ}ÍsÙïnïä+÷~Îû=­P-Ù5ØË­$8¿y>›ÃšïÑ3ÑenýÿVË,^‘ÿŒvþ[Yÿl·ÿJ¥ÿŒvþ[Yÿl·ÿJ¤§É^·ÿŒvþ[Yÿl·ÿJ¥ÿŒvþ[Yÿl·ÿJ¤§ÿÕôì캰p²3n5bÔû¬ íµ´Øýüçmjç³>¹äôü*ú·P釥\Dã“IÊ!ÍõjwØœYCýOwèqóò2àMel¶·W`ÜÇ‚×4ðAปÅþVgQéuu¦_Ò:pÄ FE•ÍG%»}ý™´zveÕïʧü 7~°’ž®Þ§éÜê~ËòÛ[\Æ×€íìqsEVïÓZïcpskÎÆ5±õ±ÅÍ µ»íqf¬?Gè§8•›}]ö»qo¨ý§G7nÍÛv~“èÿQNš[K65Ïpñ{œóÄ}+ œ’’*½K¨ãtÌ7æånÕË\DéôZ­ åãW•C¨³èº5¡på×âùoZì‰]ߣ•Ѿ¶ô®³m”â›*i{†ÒFÑü±íÝü„{:õUSëY‰–֊ů‘–‡81•¹»¿vïæÿ1ŸÎ*ÿW¾«ctZnc^^û‹ýÍöC\}­nß~æ±µ·éÿQj}†½Il z¯Ð‚÷iîÝþÿ=§æöøÏ·|+qñðúþdéÓ5¡­ @’IÓùE:{Ô~¹tΟ˜ìKYa²£?Ñîþ{û @uŠU7WMöU}n¹¯md†´FßS÷l·wè«þqgõªµõúso¥¸‡lÕû®öWô–¯ìúE,¥Ž²¶×_¤Í–9°]\ûNÝþ嶺á÷ýÉûŸ Ûåÿ‡ülžÏx/ŒüÌpº•y–ÙSiº—ÒÚÞñs6:7±£S¹íÿ þ\B¯•ØëžK»9îsGEŽ;[ôQU†ÿÖ?þ>8?ùUoý¼ßý&—þ>8?ùUoýºßý&¼‘Œ}mu´½ï!­kD’NkZ»¾§ýemeçÂö´=øÍ-vKIkm»§±ÎΦ¯oó–ãìIO¢ããƒÿ•VÿÛÍÿÒiããƒÿ•VÿÛ­ÿÒkÉÛð×6§¹®’ÒH;~–ßê¨>·Öv½¥†& Áø¤§ÖÿññÁÿÊ«íæÿé4¿ññÁÿÊ«íÖÿé5äiÚ×8†´À”€'AªŸ[ÿÇÇÿ*­ÿ·›ÿ¤ÒÿÇÇÿ*­ÿ·[ÿ¤×”äaeâ¸3&‹)s€!¶4´~‰÷&û&T‘èÙ €FÓ¡<7„LLMH|T;jú¿þ>8?ùUoý¼ßý&—þ>8?ùUoýºßý&¼$úçþ>8?ùUoý¼ßý&—þ>8?ùUoýºßý&¼®žŸ‘[­£Ë+`—9­$„(¹Áŵ¸†èOÑÜ€ Øh“E¾³ÿŽþU[ÿo7ÿI¥ÿŽþU[ÿn·ÿI¯&²›ªþv·3R=ÀGÒ¨"‡ÿ×ó Ë0s±³ªþwÖ\ÏëVácé5wý7;ê§DWëC_VmÙõ:-nƒ‘U–m»ÜW¹ÿg»ßCÖÎþkìÿÑ/·×û2ó”’S¡_Tux¢–ߔ͵:¦µ¶Å{^àë*k6þŽ‹w_ê×þħœìü·d½öØ÷ûœó´lfç5µýÚÆ*©$¥+2Œ¥FNEfêïÒÖ ÓívÇ~kÿqSI:0Þ&Ð@ ƒ±ÑÝêýWÚ1ñèuÙeÆÛr^aÛ4ÓPw«±ßJË?áâÐ+ëÙXË™•˜,u¤›&×0Vë·9ŽÞ÷ïÈo¿üÉI;6ieŸ´è‚!ð…Ý´¸–‚'h:˜óú)’IF¹êúÖ™Ó©«(Ù]˜®&ưÀ¹‡V7úßàÿ¨±«êÑu¯ß‘K-¸[²‡†´Aéí;­®§[é?üÍIE 1„¥!w6\™¥8Æ'hþ-ÌÞ¥n^=4ÛmÖš]c›ê¼<k½KK=»÷Xï}›ŸôÕ4’R±?ÿÐòïNÏ÷Ézvx¸wZŸfj_fjJrý;<Ü;%éÙà>å©öf¥öf¤§/ežÇ€›Ó³Àxpµ~ÌÔÿfjJrÅV¸èÙ:˜p»þŠoNÏ÷®Êƒ7mй¥„Ïg}%³5%9~žîÒôìðw‚Ôû3Rû3RS—éÙà>áÝ/NÏ÷©öf¥öf¤§/Ó³À}Él³Àxð§Ùš—Ùš’ŸÿÙ8BIM!UAdobe PhotoshopAdobe Photoshop CS38BIMÿáñhttp://ns.adobe.com/xap/1.0/ FIFE 2d isometric engine Cyan Magenta Yellow Black ÿâ XICC_PROFILE HLinomntrRGB XYZ Î 1acspMSFTIEC sRGBöÖÓ-HP cprtP3desc„lwtptðbkptrXYZgXYZ,bXYZ@dmndTpdmddĈvuedL†viewÔ$lumiømeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ óQÌXYZ XYZ o¢8õXYZ b™·…ÚXYZ $ „¶ÏdescIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view¤þ_.ÏíÌ \žXYZ L VPWçmeassig CRT curv #(-27;@EJOTY^chmrw|†‹•šŸ¤©®²·¼ÁÆËÐÕÛàåëðöû %+28>ELRY`gnu|ƒ‹’š¡©±¹ÁÉÑÙáéòú &/8AKT]gqz„Ž˜¢¬¶ÁËÕàëõ !-8COZfr~Š–¢®ºÇÓàìù -;HUcq~Œš¨¶ÄÓáðþ +:IXgw†–¦µÅÕåö'7HYj{Œ¯ÀÑãõ+=Oat†™¬¿Òåø 2FZn‚–ª¾Òçû  % : O d y ¤ º Ï å û  ' = T j ˜ ® Å Ü ó " 9 Q i € ˜ ° È á ù  * C \ u Ž § À Ù ó & @ Z t Ž © Ã Þ ø.Id›¶Òî %A^z–³Ïì &Ca~›¹×õ1OmŒªÉè&Ed„£Ãã#Ccƒ¤Åå'Ij‹­Îð4Vx›½à&Il²ÖúAe‰®Ò÷@eНÕú Ek‘·Ý*QwžÅì;cвÚ*R{£ÌõGp™Ãì@j”¾é>i”¿ê  A l ˜ Ä ð!!H!u!¡!Î!û"'"U"‚"¯"Ý# #8#f#”#Â#ð$$M$|$«$Ú% %8%h%—%Ç%÷&'&W&‡&·&è''I'z'«'Ü( (?(q(¢(Ô))8)k))Ð**5*h*›*Ï++6+i++Ñ,,9,n,¢,×- -A-v-«-á..L.‚.·.î/$/Z/‘/Ç/þ050l0¤0Û11J1‚1º1ò2*2c2›2Ô3 3F33¸3ñ4+4e4ž4Ø55M5‡5Â5ý676r6®6é7$7`7œ7×88P8Œ8È99B99¼9ù:6:t:²:ï;-;k;ª;è<' >`> >à?!?a?¢?â@#@d@¦@çA)AjA¬AîB0BrBµB÷C:C}CÀDDGDŠDÎEEUEšEÞF"FgF«FðG5G{GÀHHKH‘H×IIcI©IðJ7J}JÄK KSKšKâL*LrLºMMJM“MÜN%NnN·OOIO“OÝP'PqP»QQPQ›QæR1R|RÇSS_SªSöTBTTÛU(UuUÂVV\V©V÷WDW’WàX/X}XËYYiY¸ZZVZ¦Zõ[E[•[å\5\†\Ö]']x]É^^l^½__a_³``W`ª`üaOa¢aõbIbœbðcCc—cëd@d”dée=e’eçf=f’fèg=g“géh?h–hìiCišiñjHjŸj÷kOk§kÿlWl¯mm`m¹nnknÄooxoÑp+p†pàq:q•qðrKr¦ss]s¸ttptÌu(u…uáv>v›vøwVw³xxnxÌy*y‰yçzFz¥{{c{Â|!||á}A}¡~~b~Â#„å€G€¨ kÍ‚0‚’‚ôƒWƒº„„€„ã…G…«††r†×‡;‡ŸˆˆiˆÎ‰3‰™‰þŠdŠÊ‹0‹–‹üŒcŒÊ1˜ÿŽfŽÎ6žnÖ‘?‘¨’’z’ã“M“¶” ”Š”ô•_•É–4–Ÿ— —u—à˜L˜¸™$™™üšhšÕ›B›¯œœ‰œ÷dÒž@ž®ŸŸ‹Ÿú i Ø¡G¡¶¢&¢–££v£æ¤V¤Ç¥8¥©¦¦‹¦ý§n§à¨R¨Ä©7©©ªª««u«é¬\¬Ð­D­¸®-®¡¯¯‹°°u°ê±`±Ö²K²Â³8³®´%´œµµŠ¶¶y¶ð·h·à¸Y¸Ñ¹J¹Âº;ºµ».»§¼!¼›½½¾ ¾„¾ÿ¿z¿õÀpÀìÁgÁãÂ_ÂÛÃXÃÔÄQÄÎÅKÅÈÆFÆÃÇAÇ¿È=ȼÉ:ɹÊ8Ê·Ë6˶Ì5̵Í5͵Î6ζÏ7ϸÐ9кÑ<ѾÒ?ÒÁÓDÓÆÔIÔËÕNÕÑÖUÖØ×\×àØdØèÙlÙñÚvÚûÛ€ÜÜŠÝÝ–ÞÞ¢ß)߯à6à½áDáÌâSâÛãcãëäsäü儿 æ–çç©è2è¼éFéÐê[êåëpëûì†ííœî(î´ï@ïÌðXðåñrñÿòŒóó§ô4ôÂõPõÞömöû÷Šøø¨ù8ùÇúWúçûwüü˜ý)ýºþKþÜÿmÿÿÿîAdobed@ÿÛ„       ÿÀ aëÿÝÞÿÄ¢  s!1AQa"q2‘¡±B#ÁRÑá3bð$r‚ñ%C4S’¢²csÂ5D'“£³6TdtÃÒâ&ƒ „”EF¤´VÓU(òãóÄÔäôeu…•¥µÅÕåõfv†–¦¶ÆÖæö7GWgw‡—§·Ç×ç÷8HXhxˆ˜¨¸ÈØèø)9IYiy‰™©¹ÉÙéù*:JZjzŠšªºÊÚêúm!1AQa"q‘2¡±ðÁÑá#BRbrñ3$4C‚’S%¢c²ÂsÒ5âDƒT“ &6E'dtU7ò£³Ã()Óã󄔤´ÄÔäôeu…•¥µÅÕåõFVfv†–¦¶ÆÖæöGWgw‡—§·Ç×ç÷8HXhxˆ˜¨¸ÈØèø9IYiy‰™©¹ÉÙéù*:JZjzŠšªºÊÚêúÿÚ ?ûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WÿÐûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WÿÑûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WÿÒûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WÿÓûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WÿÔûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WÿÕûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WÿÖûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wÿ×ûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WÿÐûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WÿÑûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WÿÒûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WÿÓûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š¤ÚŸ˜tíWQ¸HÛùkVÿ?†]‹O<¿HiÉžþ¢œå-É0ó›õ§ÒÚæ4ºŒ…1¹âjEv­ØöË¿/>*Ù§ó¾Ý9Ê[Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š¿ÿÔûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±T³QÖ¬t…ç©\G€cñ’ÏÐ2Üx%“éד4qýFžuªþkZCXôˆvìò| ÷nOá›]“#õuù{R#éó}WÏzΫTyÌ1؃àÚ?IÍ–-<}/ß»®Ë­É“­{˜%‰f5'rNf8¯³ó‹z÷˾{ÿŽõïúëÿÔè?ºޝ5®þðþ: t¿4êš=ˈÇû­$ÿ5èË2éa—ê 1jg‘zF—ù³Ò=fÛç$þ5cÿf³/dÿ0üÿ[°ÅÚŸÎ'£é~jÒµš-Êû­¾ûš•ú3[—I<_PvµPÉȲÇrŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WÿÕûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*¾Ôí4Äõu ã…{s`+òOÑ–cÅ,›D[ äŒ7‘§žjŸšš}µSL‰î_³?‹ð±ÅÙS—Ôkíuù{N1úwûoª~`ë:QfñÙ€q?ð[·ã›,]K÷ºüºü“ë^æîÒ±’BYŽä“Rs4 pɵ˜PìUØ«í âžÁòïžÿã½{þºÿÄu:î‡ã«Ík¿¼?ŽŒG3Gb®ÅY>•ç_H¢ÚܳF?Ýr|kôW§ÑLÅˣǓ˜ùläâÕÏ#ózF•ù±Ò=fØ¡þxMGü Ü}ç5¹{$ üÝŽ.Ôê'£i~cÓu‘þã®RFþJñøCøf·.šx¾ ì1ê!“é)ÞPÜìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WÿÖûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®ÅP·wÖö ë_JÇâì~98c34±œÄ7&ž}ª~hi–uM=^êAÜ| ÷þá› ]—9}[8{JúwyÆ©ù¬jHmb=¢?Ö5?u3e‹³qÞþ÷]—´2O–Þæ 4Ò\9šwgsÕ˜’OÒs8D ƒ„I;•,’Š»v*ìUØ«í âžÁòïžÿã½{þºÿÄu:î‡ã«Ík¿¼?ŽŒG3Gb®Å]Š»l G\ eºWž5&‰Á–1û|cï?úbeÐãÉÌW»g+·&>FýïGÒÿ5íe¤z¼ <ýÆ„~9­ËÙ2A¿{°ÅÚ€ýB½ÏFÓuË ]yi·Ë߈?ù©¡HÍn\Çõ vóG'Òm5Ê›]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å_ÿ×ûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUت…ÅÔ6hg»‘"Œug`£ï9(ÀÈÐÝŒ¤#¹Ùj¿™zM…c´çu ÿ}Š-Ö?ÀÏÅÙ™'Ïg/h·yÆ«ù™«_U,øZFroø#üÍ–.ÌÇ{ºü½¥9rÙ\ÝMxæ{¹YVv,~ó›ÀDPÙÁ”ŒÐù&.Å]Š»v*ìUØ«±Wb¯´3Š{˾{ÿŽõïúëÿÔè?ºޝ5®þðþ:1ÌqŠ»v*ìUØ«±Wb«•Ùt$0ܱ´ƒLÏKóþ³¦Q=o¬F?fqËþfüs /gãÉҽߊrñk²C­ûÞ¥þjØ\Q5HžÝû²üiø|_Ín^Ê”~“c±ÅÚq?P¯µè–­ž¨ž®7ûȧá›,]—ý[ýŽ¿/iN_NÏ>¼¿¹Ô_׿™æ“ÅØ±ú+›cNæfl›BdØ;v*ìUØ«±Wb®Å]Š»v*ìUö†qO`ùwÏñÞ½ÿ]â:÷CñÕæµßÞÇF#™Ž#±Wb®Å]Š»v*ìUØ«±Wbª‘Jð0–(ã£)¡HÀ@;ƒ\™Æ—ù¬iÔI¤1ŽÓ Ÿø!C÷×02ön9òÛÜæâí 翽èú_掛wDÔQí\÷ûi÷ÿás[—²§§°» ]§ }[}¯A³Ô-µõ¬&I“Å7ßL×Ï jBœødÜFd»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ÿÿÑûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb«]Ö%2HB¨Ü’h-Ó Õ04m2ª³}bQû0_ðÛ/㙸»?&N•ïq2ëñíûžqªþj_ÜÖ=.$¶_æoÿ‡ð9²ÅÙQÔoìuÙ{NRúE}¯<¿Õo5Gõuä™»sb@ùƒèÍŽ¡¥(FØqäöîxšõ%{ñ¶k³{,1ư]%úÿ_ͧ&cñèåÿæß”?4­þ»äM^Úþ‹ÉáVã¶»‚õör$±žŒŒ}ã5ò‰¢)Όķ¢2,Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb¯ÿÒûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìU¢BŠ€êqV#ªyçFÒª²\ ¤±Æ~ñð¤æf-L+ß³‰—[[÷<ãTüÖºš±é0$+Ùä<ÛæÀ~9²ÅÙ1Q·_—µ$~‘O9Ôu»ý\òÔn$—¿?ù(Ø}6XðGÒ)×äÍ,ŸQ´¯-jv*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb¯)üÇüîòWåDFO:êÐ[ÜR«h‡Õ¹zô¤)V¡þbø‘™š]]OÐ/ϧÍ@?;ÿ3ÿçàÚΧêiß•jé°…¾¿ 5Á+¬HÖ2Œé´žÍF;å7ä6>sQËÜøÍ~m×¼õzÚÏœuJôÖ’\ÊÏÄZ(;*ø*€£°ÎžE@<šÌÕ<¥äÏ—Ë¢ù3MºÔïZŸ»¶‰Ÿˆ&œœE_bw8æÏ "æ@le”G›íÝþ}ÇçÝOF}WWÔ´Í;V 4:|ŒòWmijF £ª$å Ñäö“e@;ÿPþÇë@/“2?#<ëùM9·óÞqgn)r’ÚO3'$$øWî;›[R=üºü›áœO‘y¾wy£\Ç©éËky Šh£‘t*ÊAÜÉœÅa°MöŸå‡üçWž¼™ééþsHüǦ­)Ï¥v«í2‚Ç÷ˆÌ˜f‡Wìî,»ÃÒ~cåú™Œ¯ÑoÊÿùÊ¿ËßÍ/JÏOÔF«IAõFHXöF$Ç!=‚1juQœÆ¯±ói·"Çxßö†Ñ0_Gæ­“±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»EZ_\XIëØÊðÉüÈÅOáœÅlá3`Ó?Ò¿3õK*& ©wþaÁÿà†ßx9¯ËÙp—Ó³‹´§«w¤i_™F¡D¸vµö”|?ðB£ï¦krönHrßÜìqv„'Ïo{:‚x®PMlë$g£!¤f¢c±sD„· ¸ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb¯ÿÓûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»bú§œ´"©sr­ ÿuÅñµ| 6I•‹E“'!óÙÆË«†>gäóSóbW¬z=°AÙæ5?ð#a÷œÙbì>³òuÙ{PŸ¤|Þq©ù‹RÖ ý#s$Šb´OøAøfËš¾ëòj'“ê).^ÒìUØ«±Wb®Å]Š»v*ìUØ«±Wb®ÅZf 1 ’qWË_™¿ó˜—Ÿ—>¥”§[ÕR [i¥dP݃Í_MwØÐ³äÍÆ“°ój7®ÞW6Èó¿ó;þsSóϾ¥—å_.éoP#±cõ‚¿å\0>ñˆó§Òv;ËÔ|ù|¿]´K1/‘§3^J÷WnÒÍ#wv,ÌORIܜްi3zßåÏä'4[Êz\¯dM ìÿ¹¶]èxô Ná97¶bjuøôÿQß»™jžqoПËùÀŸ-h†=GóBùõ‹‘BlíKAjpÎ)+ ^àç=ªíùËlb¼Îçõ}îõ„ò}éå­Eòm’è¾S°¶Ó¬Sq ¬K×Ä…¤÷'sß9ü²–Sr$Ÿ7S2æŸþ“÷Êü4Zî{}B,¯ãIíåR’E*‡FSÔ2š‚Ø› ÄøÏóCþp«òÿÏ&MCÊèÞ\ÔÞ¦¶`5©cüÖ䀣Ú6Œ{fëKÛYpí/PóçóýväCW(óÝùáù™ÿ8™çßËRðÙ _KJŸ­éÜ¥|^* ƒ©âP9ÎKÚØ³ít{ëäæCU>g{r6#|Ù¹o ?,ç&ÿ0*½;MRkÝ*0°Ô+NäQïÛñlŽR¡ÿ–_ó¾Kóg§§ùæ|½¨5É!3Z1ö•@d¯ùhœõÎ_Wìî\[ÃÔ>Gäß ¾ÕÓ5[-nÖ=SF¹†îÊeåöò,‘¸ñWRA#š ÀÀÔ…6Ô~E]Š»v*ìUØ«±Wb®Å]Š»v*ìUت:ÇS»ÓÕÓæ’ïÁˆ¯Ìwúr¼˜£“i l†ICxšz•ù§¨ZÑ58Òé?˜|ø ~®ËÙP—Ó·Úçâí9GêßìzF•ù…£jtG”ÛJfqÄÁn¿y­ËÙÙ1ô¿s°Å¯Ç>µïf±È“(’& ‡pÊjÓ˜DW70ä¿]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š¿ÿÔûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb©­æ/D&=BáVQþë_‰÷éðŠ‘ôæF,òý#âÑ—S _Qy¶©ù³Ö=Ûå$çþ5SÿfËdÿ<ü¿[®ËÚŸÍ7›êžiÕ5Š‹ë—1Ÿ÷Zž)ÿ(Ó›t:Ofòdß!áÜÏꚥ˜OÏO̯ùÈ/>~m‡ÍZ¤‹§1$XZ~âØŠjôìd.GŽuNËÃ¥úýçsû>4²’ñè-gX¡RîÄ*ªŠ’NÀÜœØ5¾›ü»ÿœOó§ý;ÍJÑ4Ö¡õ¯‘þDã'ý~ {6kµ©ÃÔ|¿[‹“Wù¾òü¹ÿœVòÌwº…±Öõ4¡õ¯ÀhÁÿ"ðö\ÈìÙ¡Ôö¦\ÛHòýnõR—“ꯒXa#@UE`ÍY…´q*~“÷Áá­»ôŸ¾>Û¿Iûãá­»ôŸ¾>Û¿Iûãá­»ôŸ¾>ÛÄ¿1¿#<ùŸÎãÌjC¨¿üYÒŠø³(£ŸøÈ­™Úmn\IÛ¸î?æØg”9> üÄÿœ.ó€d¾ò-ÄzÍ©µ!ºQס<ž!=“7Ú~Ù„ö˜£óf=`<ö|}«è7ÚËéšÕ¬Ö—qš<3ÆÑºüÕ€9·Œ„Ńn\r_&Gäo̯5þY]~ò6«s§¹`ÏmX¤#ýùUý’œÇÔèñêdýÿ>mÑÈCï¿Ë/ùø'÷ZoæÖ—NŠu 4móxý,QÿÕ¶s:¿fzá?úÿ_ÍÈŽ~÷è‘¿3<­ù“kúGÈú­¶£u‰é,uÿ~DÔtÿd£9­F“&œÔÁŽþMÂ@ògYŽ—b®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìU3Óµ›í%¹é×CÜ…o„üÇCôŒ«&äú…¶ãÍ,I§¢i_š×R=Z>û·ðÍv^ɉúM}®~.Ôú…½#JóÞªÑFSû|¿?²~üÖeÐdÇÒýÎÇ»Nµïf9†å»v*ìUØ«±Wb®Å]Š»yޱùÙùwåëÙ´]ÍÚŽ¡lÜ&¶¹Õ-"–6þWG2Ÿb1T»þ†ò³þ§,ÿÜfËþªâ®ÿ¡„ü¬ÿ©ãË?÷²ÿª¸«¿èa?+?êxòÏýÆl¿ê®*ïúOÊÏúž<³ÿq›/ú«Š»þ†ò³þ§,ÿÜfËþªâ®ÿ¡„ü¬ÿ©ãË?÷²ÿª¸«¿èa?+?êxòÏýÆl¿ê®*ïúOÊÏúž<³ÿq›/ú«Š»þ†ò³þ§,ÿÜfËþªâ®ÿ¡„ü¬ÿ©ãË?÷²ÿª¸«¿èa?+?êxòÏýÆl¿ê®*ïúOÊÏúž<³ÿq›/ú«Š²,þkù#ΗgGòw™tmZüFÒ›{ BÞâPŠ@-Â'fâ 4¦ãgø«±V æŸÌÿ'yâ=?ξaÒ4{©£õc‹P¿·¶wJ‘ÉVWRV ŠªÅXÏý 'ågýOYÿ¸Í—ýUÅ]ÿC ùYÿSÇ–î3eÿUqW©éÚ®¯k­¤ÏÕÔI<Àë$rÇ"†GGRU•”‚¬ ŒUб4ùÛ˾F·P󮯧èö³IéG.¡u²;О*Ò²‚ÔÐo@N*Áÿèa?+?êxòÏýÆl¿ê®*ïúOÊÏúž<³ÿq›/ú«Š»þ†ò³þ§,ÿÜfËþªâ®ÿ¡„ü¬ÿ©ãË?÷²ÿª¸«¿èa?+?êxòÏýÆl¿ê®*ïúOÊÏúž<³ÿq›/ú«Š»þ†ò³þ§,ÿÜfËþªâ®ÿ¡„ü¬ÿ©ãË?÷²ÿª¸«¿èa?+?êxòÏýÆl¿ê®*ïúOÊÏúž<³ÿq›/ú«Š»þ†ò³þ§,ÿÜfËþªâ®ÿ¡„ü¬ÿ©ãË?÷²ÿª¸«¿èa?+?êxòÏýÆl¿ê®*õ›{ˆ¯"ŽîÒE– U^9ƒ++ †R6 Áª¶*ÆüÑç-É©«yÓU±Ñìd”@“ê1[FÒ2–VU,UX…­h¤ö8«ÿ¡„ü¬ÿ©ãË?÷²ÿª¸«¿èa?+?êxòÏýÆl¿ê®*ïúOÊÏúž<³ÿq›/ú«Š»þ†ò³þ§,ÿÜfËþªâ®ÿ¡„ü¬ÿ©ãË?÷²ÿª¸«¿èa?+?êxòÏýÆl¿ê®*ïúOÊÏúž<³ÿq›/ú«Š»þ†ò³þ§,ÿÜfËþªâ®ÿ¡„ü¬ÿ©ãË?÷²ÿª¸«¿èa?+?êxòÏýÆl¿ê®*ïúOÊÏúž<³ÿq›/ú«Š»þ†ò³þ§,ÿÜfËþªâ®ÿ¡„ü¬ÿ©ãË?÷²ÿª¸«ÔôíF×WµƒVÒgŠêÆê$ž àu’9c‘C#£©*ÊÊAV‚ F*ŒÅ]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š¿ÿÕûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb¯ÿ4lþ¯«‹6žb}Ö«ú€Î‹²§x븺Ó…NûÃÍóf늻v*ìUØ«±Wb®Å]Š»v*ìUØ«±W™~aþqù7ò®¬yãW·³”¯$¶åÎâAþD)W#·*qÈÌ­6‡.¤ú>}>h&Ÿžß™ßóðmBûÔÓ)tÁgªCQI~i’Š| ´•îƒ:}³ o”ßåóç÷4Ë7sàß6ùßÌ_˜7Ÿ¥üé©\êW[ñk‰ *Ô"}”ÊöΓš@îqå;Bè>ZÔ¼Çrºni5åÓtŽ.iâiÐ{²ÙÌ@Y4Ñ<‚;—ÖþCÿœBÕ5ž|¼M:Bm­È–r;‚ßݧÌzŸ,ÖæíA /ϧãäàä×ôîû[È¿–>RüºP|±§EÐ7RVsãûÆ©P{…â¾Ù¦ÏŸ&o¨ü:8SÎgÍ韤ýóÃj·~“÷ÇÃ[wé?||5·~“÷ÇÃ[wé?||5·~“÷ÇÃ[wé?||5·~“÷ÇÃ[wé?||5·~“÷ÇÃ[wé?||5¶-æ¯.h>x¶ýæË/¡ãê¯Ä•êQÅOºrÜR–#q4Î9 y>6óçüáõ¤Üï//ÌM¹w¿ü–UÁ•½ØfßjžSúœÌzïç>5óåϘ<7Õ|Ña-­MB9DÿêȵSò¾#6سG.ñ.~<Â|‹Óuíê=[C¹šÎöÊ9íähäC⬤÷ä§ŒLT…7"3}¡ùgÿ9ßç?)ôï>A˜tõ¢ú¬D7j:x £Ð:rcÕóŸÕû9‹.øý'æ?Šr#™ú!ùaÿ9?ù}ù­éÚhššÚj²P}BþNIì•%$>Ñ»g/«ìœÚmä,wÇìø· ‚ú 5¬Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Tç˶_Õ--ª¼ÉËýPj £S>äݧ‡Àó}oœ‹Õ;v*ìUØ«±Wb®Å]Š»_óŸŸúÐߘ_öÚ“þ ˜«ä UØ«±Wb®Å]Š»v*ìUØ«±Wb¯ÕïùóoþO»Ÿüuù?mŠ¿©ìUØ«ù¡ÿŸÚäÓòŸþ#þ£gÅ_Œ8«±Wöûÿ8ÿ’CòÓÿÏ/Ý:Uïø«ñ‡þiÿ’³Êøú‚Ÿ48«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š¿»ÏÊoùAü³ÿl];þ¡“z*üÿŸÕÿäÐ?ð3±ÿºuþ*þ`qWb®Å]Š»v*ìUØ«±Wb®Å]Š»o¿ó‰ßù$?-?ð ò÷ýÓ¡Å^ÿŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»ÿÖûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb¯ üÛ´åøý‡xû!Qÿ9¸ì‰îcñü|ÝOjÃ`~Íë¥v*ìUØ«±Wb®Å]Š»v*ìUØ«D€*v|Ãù¥ÿ9yùuù_êYK¨ _VBWêZaY™Xv’JˆÒ‡b sÈsk¤ìlÚê‡yÛö š~tþfÿÎsyûÏ>¥‡• ~[Ó  B^è©þk†ƒàcXϹΟIìþ,;ÏÔ|ù|¿]µË#ãùæ¸Ôg{ÝBY'¹•¹I,¬]ØžìÆ¤Ÿžo£A¢RgÞNü³óœ/—¬d’ÐÎÿ+ãWj ¼O¶C&hãæ\LÚ˜ãæ_\ù'þqgK°áyç‹¶½”nm­‰Ž“?Ûaòášü½ NÑÙÖeí~—ÕZ¥ù^Øi¾^´†ÎØSà…Ôø±±÷59­Ìܸ2Èe¹N¿I{äxÛ¿I{ãÀ¶ïÒ^øð-»ô—¾< ný%ïÛ¿I{ãÀ¶ïÒ^øð-»ô—¾< ný%ïÛ¿I{ãÀ¶ïÒ^øð-»ô—¾< ný%ïÛ¿I{ãÀ¶ïÒ^øð-¡îç‚þ³¾&·qxäPÈÃÀ©¨#nJŸ7yßþq·ÊÞdçuåâÚEëoH‡8 ÷Œ‘Oö  )ÌüZéÃêßïs1k¥{¾Bó¯äoš|Î{‹O®Y-OÖm+"âËNkîJÓß68µPÉåïvXuŸZ÷¼VXr÷:2}ùgÿ9aùùZc´³ÔN©¥!êZ•g@£²9"DÛ Vãâ§5Z¾ÆÃ¨ÜŠ=ãoØß¿D¿+¿ç;ü‰çOONó -êE­Áõ-ûN qÿžŠŠ?˜ç/«ö.áê\þ_©¸Jßjiú…®­o£¥ÏͤËÊ9¡uxÜx«) ‘Í¢bhì”fv*ìUØ«±Wb®Å]Š»v*ìUثп,¬þ³­,ÄTAÉô‘Äij]ÚsáÇ]ä~·?³aÅ’û‡ì}œÛлv*ìUØ«±Wb®Å]Š»_óŸŸúÐߘ_öÚ“þ ˜«ä UØ«±Wb®Å]Š»v*ìUØ«±Wb¯ÕïùóoþO»Ÿüuù?mŠ¿©ìUØ«ù¡ÿŸÚäÓòŸþ#þ£gÅ_Œ8«±Wöûÿ8ÿ’CòÓÿÏ/Ý:Uïø«ñ‡þiÿ’³Êøú‚Ÿ48«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š¿»ÏÊoùAü³ÿl];þ¡“z*üÿŸÕÿäÐ?ð3±ÿºuþ*þ`qWb®Å]Š»v*ìUØ«±Wb®Å]Š»o¿ó‰ßù$?-?ð ò÷ýÓ¡Å^ÿŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»ÿ×ûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb¬#óÓëzÁj"’¡€?9ÙÓáÊ<öpµðâÆ|·|Í;Î;v*ìUØ«±Wb®Å]Š»Ju½{MòÕœšÏ˜¯-ì,!’âæUŠ5ìä’†3ÔEŸ$¾üÒÿŸƒù3ÊÆ]7òæÚ_1_­TO½½šžŸm‡¨ôÿ%·gï›ý'³¹2oð™ü~)4üâüÎÿœ›üÄüÝõ-¼Éª½¾—'ý+ì+ooO yH?ã#?¶túNÊæÞ"ÏyÜþσ^#ˆU'`lše'¸y?ò7Ìžfã<ð>ͨ}[ª©#ü˜þÑö¨øåSÎ#æë3öŒ1õ³äú¯Éß‘~VòÇE©x´<î@ôÁöˆ|4ÿ[žbdÏ)rÙÔfí äå·ã½î‘^¤°ÂF *ªŠ@é˜Ü •ª~’÷Áá­»ô—¾>Û¿I{ãá­»ô—¾>Û¿I{ãá­»ô—¾>Û¿I{ãá­»ô—¾>Û¿I{ãá­»ô—¾>Û¿I{ãá­»ô—¾>Û¿I{ãá­»ô—¾>Û¿I{ãá­»ô—¾>Û¿I{ãá­»ô—¾>Û¿I{ãá­»ô—¾>ÛË|ãù]åo:òŸQ´^6ææÚ‘ÈO‹lU¿Ù)9~<²‡''²xù|«çùÇ]kHåsåÉS¶nDdý ü®ÿŸZMé韜S[¾Êu 0޾/žJ;’ŽþÈ3šÕû6FøÀþ¶uoÐï#þdy_ó*ËôÇ‘5[]NÚƒ‘êé^‚HͳªŸlæóé§€ÔÁ E3l¥Å]Š»v*ìUØ«±Wb®Å^ÕùIgðÞ_°êR%?y?Ã4¯>Q÷—sÙPç/ƒÙ³JíÝŠ»v*ìUØ«±Wb®Å]Ф·[Ò.äk›« YesVw‚6b|I"§Qÿ èõl²ÿ¤xÿæœUßá=þ­–_ôüÓŠ»ü'¡ÿÕ²Ëþ‘ãÿšqW„ô?ú¶YÒ<óN*ïðž‡ÿVË/úGþiÅ]þÐÿêÙeÿHñÿÍ8«¿Âzý[,¿é?ù§wøOCÿ«e—ý#Çÿ4â®ÿ èõl²ÿ¤xÿæœUßá=þ­–_ôüÓŠ»ü'¡ÿÕ²Ëþ‘ãÿšqW„ô?ú¶YÒ<óN*‹²Ð´Ý:O¬iövðKB¼â‰¨{U@4ÅS\UتY}¢éÚ›‰u+K{‡QÄ4±#:ÐlUþÐÿêÙeÿHñÿÍ8«¿Âzý[,¿é?ù§O!…-Ñ`U"E ª   Ø1ULU}¦Újh"Ô­â¸E<‚ÊŠà•ßK?Âzý[,¿é?ù§wøOCÿ«e—ý#Çÿ4â®ÿ èõl²ÿ¤xÿæœUßá=þ­–_ôüÓŠ»ü'¡ÿÕ²Ëþ‘ãÿšqW„ô?ú¶YÒ<óN*ïðž‡ÿVË/úGþiÅ]þÐÿêÙeÿHñÿÍ8«¿Âzý[,¿é?ù§wøOCÿ«e—ý#Çÿ4â®ÿ èõl²ÿ¤xÿæœUßá=þ­–_ôüÓŠ»ü'¡ÿÕ²Ëþ‘ãÿšqTùcQ`*¨(†*»AÞéÖºš5"¸ˆ7 ²¢¸ VŒ­ ÅR¿ðž‡ÿVË/úGþiÅ]þÐÿêÙeÿHñÿÍ8«¿Âzý[,¿é?ù§wøOCÿ«e—ý#Çÿ4â®ÿ èõl²ÿ¤xÿæœUßá=þ­–_ôüÓŠ»ü'¡ÿÕ²Ëþ‘ãÿšqW„ô?ú¶YÒ<óN*ïðž‡ÿVË/úGþiÅ]þÐÿêÙeÿHñÿÍ8«¿Âzý[,¿é?ù§wøOCÿ«e—ý#Çÿ4â®ÿ èõl²ÿ¤xÿæœU<†·E‚T‰*ª€€(`ÅU1Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb¯ÿÐûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb¨ VÓëöW_ïèÍ”Œ³ø$q 2ÇŽ$w‡ÇäSc‹É5Š»v*ìUØ«±Wb¯5üÅüâògå5·×ÿ0u›]80ä‘;ržAÿ¤š©¾diô™5  û¾|™F\Ÿ›?šŸóòyî}M/òoHôSuŽª?…c·CÄx‚îÞñŽ™Òi=›òŸ€ý{hÅ\ßž^vüÊó_æ}çé?j×Z¥À'‡®ÿ»Ž½Dq­1슣:M>–@§d—JÒnµY–ÏM‚K‰Û¢D¥›îãeÊ .Fƒè)þ@jÜ.|Ï:ØÂw1GI&#ÀþÊýíî2&uÉÑj{j1ÚýϦ<«ä.ù8+èö‰õ?Þ‰y/Ì1û5ÿ$(öÊeræé3ëg›ê?ŒóôŸ¾CÃqmߤýñðÖÝúOß mߤýñðÖÝúOß mߤýñðÖÝúOß mߤýñðÖÝúOß mߤýñðÖÝúOß mߤýñðÖÝúOß mߤýñðÖÝúOß mߤýñðÖÝúOß mߤýñðÖÝúOß mߤýñðÖÝúOß mߤýñðÖÝúOß mߤýñðÖÝúOß myƒFÒ<ÕÕ¼ÁiÊÒœQ×ýWeúÉDònŨ–#q4ù¿ÍŸó‘¿+Ÿ(]ûý^äþ p#ý–\'Þî4ýµ[dúŸ6yÊz¯–¥ú¾¹i%»V˜UýVSôÛ¿Óꡘ\M¤š>¹ªyZö=kËW·:~¡÷w²¼2/Ƀøåy1Ç ©G››û§ò¯þ~'ç/*ôßÌËH¼Å§‚¸N6÷ŠÍ{œìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»ÿÑûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å_$ùŽÏê¥å¥(gâ?É&£ð9×i§Ç|žWQ‘æ’åí.Å]Š»v*ìUø±ÿ9Yÿ9§ù¥y·\ü«òƒÃ Xi—Ohnm‡;¹”tUª#ä FªËәο²û 2KÔH¿';Õ—çî£{®]KªëW3^^ÎÅåžâF’GcÔ³±,O¹9ÒB"†Áœ2¯-ù;Vó+„Ñ­^T­ Ÿf1ósAôV¹`ºí^»Ÿë5å×äú3Êÿ‘V–Ün<Ósë·Sª|‹Ÿˆý~y`ƒÌê½ 2Û¯3Ïåý¯~Ñìôýg¢ÛÅmqПv=I÷$œx]D²›‘%6ý$|pxmvïÒGÇ mߤŽ>Û¿I|5·~’>8økný$|qðÖÝúHøãá­»ô‘ñÇÃ[wé#ㆶïÒGÇ mߤŽ>Û¿I|5·~’>8økný$|qðÖÝúHøãá­»ô‘ñÇÃ[wé#ㆶïÒGÇ mߤŽ>Û¿I|5·~’>8økný$|qðÖÝúHøãá­»ô‘ñÇÃ[wé#ㆶïÒGÇ mߤŽ>Û¿I|5·~’>8økh{©á¾‰­ocI¡qFI2‘îØx†&Á§‰ù£ò_DÖ9\hŽÚ}Áߊüqþ©5A ðÇÜé{w&=§ê"ùÇÍ_–šï–yKwoë[ ýx*éOµWý›GÚ¸µG¸ìoÁåÓ!£b2ÜD¾¥ü¨ÿœØüÏü¦ô¬¡úsFo©j¼¦â¾ÍQ*SöG"ƒù3Q«ìl9÷ª=ãõrIÿ¡}úMSN´Ôî"ô%¸·Šg‹—. è­v­ ¥{ç8ð’y™äPìUØ«±Wb®Å_]èVPÓ­lÈ¡ŽVùñüsÏ>9“æ^¯8 ’k•6»v*ìUØ«±Wb®Å]Š»2?ó—¿óð¯ùÈÊïÎO9~_ùÍÿQÐ4­Míìí¿Eirúq„Rœ¶®í¹;³pÿ¢£ÿÎNÿÔóÿr]þÈñWÑQÿç'êyÿ¹.ÿdx«¿è¨ÿó“¿õ<ÿÜ—Gÿ²,uÜOëyþÒ…d¾ñû{›^ìUØ«±Wb®Å_Ï'üçv‰ú+ó¯_™#½ŽÆéGúÖ±£w=Yöð¥3¾ì9ñiãåcí.~z_)An¤yKκ·•HM>^V¤Õ ’¥ìŸqô×'ê5ÝŸUõ ûÇ?ÚúGËŸ™>` ?W»?î©SþKt?ö̘HIä5—“O¿1Þ?HèÍ?H³…Ö»ôñÇ…]ú@øã®ý |qáW~>8ð«¿HxUߤŽ<*ïÒÇwéã »ôñÇ…]ú@øã®ý |qáW~>8ð«¿HxUߤŽ<*ïÒÇwéã »ôñÇ…]ú@øã®ý |qáW~>8ð«¿HxUߤŽ<*ïÒÇwéã »ôñÇ…]ú@øã®ý |qáW~>8ð«¿HxUߤŽ<*‘k~s²Ð#õ5 ~2*±®îß!üMFU+M¢É¨5ñèùëÍÿ™Ú®¾ÎÍ‘¨)øÜ”Þƒƹ9ÛÖh;#T½GÏ÷OTô*Þ]ј5­;API¾¼·¶uýì6§Ï*Ë.“Ü o§õvƒ`3Ëkx«±Wb®Å]Цz-§×õ [*TK2)ùü2¬óà=À¶á‡€ó}{œ{Õ»v*ìUØ«±Wb®Å]Š»v*þ0¿ç??õ¡¿0¿íµ'üA1WÈ«±Wb®Å]Š»v*ìUØ« òŸüw4Ïù·ÿ“‹Š¿½ÌUØ«±Wb®Å_ÍüþÓÿ&Ÿ”ÿðõ>*üaÅ]Š¿·ßùÄïü’–Ÿøy{þéÐâ¯Å_Œ?óûOü•žSÿÀ˜Ôø«ù¡Å]Š»v*ìUØ«±Wb®Å]Š¿§ïùò§þI ÿ;ïû§Xb¯×ìUØ«±Wb¯Èùý_þI ÿ;û§_â¯æv*ìUØ«±Wb®Å]Š»v*þ¿çÈ_ò„yãþÛ6Ÿõ qWíö*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb¯ÿÓûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å^5ù·iU²¿‹ÆÇçB?QÍ×dOœ}ÅÔv¬9ƒÅ3v銻v*ìUØ«ñþ~S¢›_Ì'XQHï48TŸ†â`áY3´önwˆŽé~€åa;>müòö—ænï@óº\[Ïa!@Û2ÈŽ„20 ƒN]7ú+›ùšu=³šx 'DÐYwž? oü¾Ï{åvkë1Sé0º£gú(ÉÉÆVài{j96ɱïéû- äR®¦„Bñc³”­èúœotð°]“<aÈü@{ÿ#øeÑÈC¦Õvt2oØôûr A=Kg¯Š˜|Æ\%n.–XÍwÖýðÛW†ï­ûãká»ë~øÚønúß¾6¾¾·ï¯†ï­ûãká»ë~øÚønúß¾6¾¾·ï¯†ï­ûãká»ë~øÚønúß¾6¾¾·ï¯†ï­ûãká»ë~øÚønúß¾6¾¾·ï¯†ï­ûãká»ë~øÚønúß¾6¾¾·ï¯†ï­ûãká»ë~øÚønúß¾6¾¾·ï¯†ï­ûãká»ë~øÚøj3êQÛ!–wƒ¹ÀM2Ž#Açúמ&``ÒGÐÈÃâúo§ðÊ¥“¹Ûé»0 ç¿“Ê/çvšv/#–cR~då%ßc"ƒ7òå±çYÙ~§§š<ªjÃü„Ø·Ïe÷ÈN6§µa§Û™î¤³ÎËíÈ>Y°²Ò!åyqyÊK™~)\$mQ^еað¨a]År°lµöN·&§)2;˧7ŸÎ7蟧5¼aÇÕœì:Õmäìv¢oíá×0ûJ|f¢~ÝžËbþ—3ÍÜ7b®Å]Š»v*Ï?-í>µ®E!#Ê~î#ña˜¥>G΃ÙðâÈ<·})œËÑ;v*ìUØ«±Wb®Å]Š»v*üâüÖÿŸ\~Mþqù»WüÏólúúëÕɺº×ÐÇrøÀÄ »±Å^}ÿDmü„ÿ–Ÿ3ÜFû&Å]ÿDmü„ÿ–Ÿ3ÜFû&Å]ÿDmü„ÿ–Ÿ3ÜFû&Å]ÿDmü„ÿ–Ÿ3ÜFû&Å]ÿDmü„ÿ–Ÿ3ÜFû&Å]ÿDmü„ÿ–Ÿ3ÜFû&Å]ÿDmü„ÿ–Ÿ3ÜFû&Å]ÿDmü„ÿ–Ÿ3ÜFû&Å]ÿDmü„ÿ–Ÿ3ÜFû&ÅQvóç¯È:êBÞç̾¬$©ËP€ŽHC ÿ£ô¨Å_ªx«±Wb®Å]о/ÿœ–ÿœü¶ÿœ¬×l<ãùŸ.¯þeõFŸu)éz/Ä) nNw¨Ú›b¯œ迟òÓæoûˆÁÿdØ«¿è¿ŸòÓæoûˆÁÿdØ«ôËÈ^M°ü¹ò΋ù{åó+iz›i¥ÚØ4† HVù°⃑Tö«,Å_8ÿÎKÎ.y7þr³B°òwæ|š„vuï×á:|é ú¾›ÅñI^.v Þ›â¯‹ÿ迟òÓæoûˆÁÿdØ«¿è¿ŸòÓæoûˆÁÿdØ«¿è¿ŸòÓæoûˆÁÿdØ«¿è¿ŸòÓæoûˆÁÿdØ«¿è¿ŸòÓæoûˆÁÿdØ«¿è¿ŸòÓæoûˆÁÿdØ«¿è¿ŸòÓæoûˆÁÿdØ«¿è¿ŸòÓæoûˆÁÿdØ«¿è¿ŸòÓæoûˆÁÿdØ«¿è¿ŸòÓæoûˆÁÿdØ«í¿ùÆÏùÆ(ÿÎ+ùfïò÷òÉï¤Òï5)uI¡2M'¯,1BÔdHÀ^0¥:×}öUô*ìUØ«±WÏŸó’óQÿœ¨òͧåïækßG¥ÙêQj‘>d†O^(e…jÎ’¼fzŠu¦ûn«âOú#oä'ü´ù›þâ0Ù6*ïú#oä'ü´ù›þâ0Ù6*ïú#oä'ü´ù›þâ0Ù6*ïú#oä'ü´ù›þâ0Ù6*ïú#oä'ü´ù›þâ0Ù6*ïú#oä'ü´ù›þâ0Ù6*ïú#oä'ü´ù›þâ0Ù6*ïú#oä'ü´ù›þâ0Ù6*ïú#oä'ü´ù›þâ0Ù6*ïú#oä'ü´ù›þâ0Ù6*ûþq›þq?É?óŠf§åïÊù5-uk˜î®£:LÁãN‰Hã §±Å_Lâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ÿÿÔûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®ÅXæM§Öt9d¦ #}üOàٟٳáÊ<ì8=£,~íß6gLó®Å]Š»v*ìUù;ÿ?9ÑjÞNók½5YŸñ…ã§úýOÈuίىýq÷½»|/ÿ8óqõO<é¨Maq ²…Èÿ†:Œ¿K­íˆña?½ú©ZuÛ*Ç'‡!âžsò™æ>S]EéÝSiãÙöé^Ì>E3.Ü>¶x9»Ÿ8kžG¿òë‘}k`v•oò‡Qú½òÞwƒ´!›nG¹*µåŒ•aÐŒ!žMù²ûMVBÜoþPþ91'_“虋°w®JÚ<6þ´ïÒ„ÿœÑJ~sh— ¼’Êë–+i#Sô3ƒóÍonχO/:kÒÈìþ€3€hv*ìUØ«±Wb¯dü¤´«Þߞʑ¯ÒI?¨f—µç°¼»~ʇ3ð{fi˱Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«ÿÕûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®ÅR­rÓëúuÕ*d…Ô|øš~9n ðL0Õšq#Éò&v(ìUØ«±Wb®Å_žóò]þ_iºŠÉi­Ä„ø$ÖóWþW:fçYHïé à_”•7_£üݡܔjÊÇÁ^@­ø¦Aé..¸qcò/Õ=JÓ®ÙŽO CÔ­:홸äÖCÔ­:‚37šˆy&³å+yXÍh2x🣷і˜[›ƒ](í-ÇÚÃ_O–ͽ9ÖžýŽB©Ø ¢bÂ2(C -r•,žÊd᫯€ë‰ ŽPy¥&꛹úß¾6¾¾·ï¯†ï­ûãká»ë~øÚønúß¾6¾¾·ï¯†ï­ûãká»ë~øÚønúß¾6¾¾·ï¯†ï­ûãká»ë~øÚønúß¾6¾¾·ï¯†ï­ûãká»ë~øÚønúß¾6¾¾·ï¯†ï­ûãká»ë~øÚøi…­¼÷#˜cþcü%#ü¦‘Ûõ–éù=gbF±ßyýOkÿŸoèßYüÁÖ5—[MHdzÍq_åF¡ëì3Gí,ëòûwr;?i³Škv*ìUØ«±Wb¯£,m>¯¢‰ÈÞy]þðÿƹÍö¤ø²Wp­è{6ŽûÏìzkœ÷b®Å]Š»v*ìUØ«±Wb®Å_’ŸßóöŸ)~Hùï]ü§Õ<£ªß]èWmi%Ì70,rPy(aP7³þ‹{äú‘õŸúK¶þ˜«)ò/üþOɾzó&ä›O&jðO¬j6šts=Õ¹XÚæeˆ3*B–©¦*ý•Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUùíÿ9ÿ?ò÷üâ™4Ï$ùË×úÄúžœ5šÒx£T_YââCîMPŸ§|•ÿE½òGýHúÏý%ÛLUßô[ß$Ô¬ÿÒ]·ôÅ_°ß–^xƒó7ÉÞ^üɱím¼Ã¤ØjÑA! ñ%åºN¨ÄlJ‡¡#jŒUœb¯’¿ç/ÿç-tŸùÄ-éžvó‘u¬A©ê#NHm%HÙÑyyûD#éÅ_žßô[ß$Ô¬ÿÒ]·ôÅ]ÿE½òGýHúÏý%ÛLUúeÿ8µÿ9§ÎRyÍM¸Ò­&»¹´×2$’Z©µ vÅ_Fb®Å]Š»v*ìUØ«±Wb®Å]Š»|±ÿ9wÿ9O¥Î"ù:Çó'ÌzUÖ±m}«C¤¬’$n¯-¼ó‡%ö NµaŠ¿:?è·¾Hÿ©Yÿ¤»o銻þ‹{äú‘õŸúK¶þ˜«¿è·¾Hÿ©Yÿ¤»o銻þ‹{äú‘õŸúK¶þ˜«¿è·¾Hÿ©Yÿ¤»o銻þ‹{äú‘õŸúK¶þ˜«¿è·¾Hÿ©Yÿ¤»o銻þ‹{äú‘õŸúK¶þ˜«¿è·¾Hÿ©Yÿ¤»o銻þ‹{äú‘õŸúK¶þ˜«¿è·¾Hÿ©Yÿ¤»o銻þ‹{äú‘õŸúK¶þ˜«¿è·¾Hÿ©Yÿ¤»o銿a¿,¼ñæo“¼½ù“cÚÛy‡I°Õ¢‚BâKËtQˆØ•BFÕ«8Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š¿ÿÖûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]оCÖìþ¡¨]YAΣäÓðÎÃøàx)š#Í+ËZŠ»v*ìUòGüç‘úWò{[•E^Î[•+˜Ñ»ŽŠäÿm3oØSáÔGÎÇØR„ºEÃX]A|‚­ ‰ êAþè$[VMÅ?g/ YTKª°sM <,ƒÔ­:æf95Àu+N¹›ŽMd0FÖ•ÌÈI¬°ûËpà« |™ ØçLuíÄ'n™sø‘öè7CTËWž_·ÔÅ\p—³¯_¤wį׮X¼ÇsϵûG¬³';~Ò¦ãéðúr©D‡o§ÕC6ÃcÜÇ>·ï·3ÃwÖýñµðÝõ¿|m|7}oß_ ß[÷Æ×ÃwÖýñµðÝõ¿|m|7}oß_ ß[÷Æ×ÃwÖýñµðÝõ¿|m|7}oß_ ß[÷Æ×ÃwÖýñµðÝõ¿|m|7}oß_ ß[÷Æ×ÃM4» Íaý+ËÓí7E_™Â,´æÉ"ä^§ùR$¼>´ßð£ä;ý?v\!N›6¼äÚ;µ1ž:a-1)IŒJxŽ˜î“‹;Uì d€qòNÙE”ˆÄšqI¶o§ZôÌYÉ ëN¶é¶aÎM€3½:צaÎM€?8ÿç!î¾¹ç½P)ªCèB¿ì!JÿÃW3´ãп³!ñûßpÏ´tn+æý}×í6Ÿm|½gqø¦rþÓÏè¼ýÎÌ—ê†rˆv*ìUØ«±Wb¯­|·iõ*ÎÖ”+ råSøœäu3ã™>oU§‡òNò†çb®Å]Š»v*ìUØ«±Wb®Å_Æüççþ´7æý¶¤ÿˆ&*ùzÿüãßþM?#ÿàM£ÔlX«ûÅ]Š»v*ìUØ«±Wb®Å]Š»v*ìUüÐÿÏí?òiùOÿ‘ÿQ³â¯ÆUØ«û}ÿœNÿÉ!ùiÿ€g—¿î*÷üUøÃÿ?´ÿÉYå?ü ‡ýAOŠ¿šUØ«ú½ÿŸCë<ÙÛkTÿ‰®*ý?Å]Š»v*ìUØ«±Wb®Å]Š»v*üÿŸÕÿäÐ?ð3±ÿºuþ*þ`qWb®Å]Š»v*ìUØ«±Wb®Å]Š»o¿ó‰ßù$?-?ð ò÷ýÓ¡Å^ÿŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»ÿ×ûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]оküȳú®¹,€PN‰(û¸ŸÅNt½›>,CÊÃÎöŒ8r=Ølb®Å]Š»xÏüäN‘úoòÃͶy7è{É•hI-fUõQO|ÍìÙðgþûvWó£禆©—ì×”æý/åT¯#q§ZÊO»D¤×®õëš æ^7áüöü×üàó‡æ/’t+[ WÔžæÒgÔ­"gŒ¢€J<—qÐŒUó·ýþrKþ¥Ë/û‹ØÿÕ\Uè¿”óìùÈO(ùóÊþk×<¿g›¦kzmíÓ®©dåa‚å$…YI$*“@*{b¯êcv*ìUØ«±Wb®Å]Š»v*ìUØ«±Wâgüüçþp»ó[þr[Ïššÿ(´«{ý6ÃDS¼·¶öåfú̲P,®¤Ž. @¦*üÕÿ¢OÿÎIÔ¹eÿq{ú«Š»þ‰?ÿ9%ÿRå—ýÅìê®*þ  <§©y ò¿É>Fó4k±¢ùkGÓobWW qkgR¨e%XR* ¨Ûzæ*üÕÿŸœÿÎ8yïþr[Èz•?(¬b¿Ô¬5±{:Ks ¸X~­,u +('“@kŠ¿?è“ÿó’_õ.YÜ^Çþªâ®ÿ¢OÿÎIÔ¹eÿq{ú«Š¿~?çÞ’>nÿœ}üŸ¶üºüÑ´ŽË]R¾¹hbž9ÔG3‚‡œL˸+¶*û—v*ìUØ«±Wb®Å]Š»v*ìUØ«ó³þ~gÿ8÷çùÉ?Êý'Èß”–Q_ëžeµÔ¥Š[ˆ­À·ŽÎî&nR²©!åA@k½zŠ¿ è“ÿó’_õ.YÜ^Çþªâ®ÿ¢OÿÎIÔ¹eÿq{ú«Š»þ‰?ÿ9%ÿRå—ýÅìê®*ïú$ÿüä—ýK–_÷±ÿª¸«¿è“ÿó’_õ.YÜ^Çþªâ®ÿ¢OÿÎIÔ¹eÿq{ú«Š»þ‰?ÿ9%ÿRå—ýÅìê®*ïú$ÿüä—ýK–_÷±ÿª¸«¿è“ÿó’_õ.YÜ^Çþªâ®ÿ¢OÿÎIÔ¹eÿq{ú«Š»þ‰?ÿ9%ÿRå—ýÅìê®*ïú$ÿüä—ýK–_÷±ÿª¸«¿è“ÿó’_õ.YÜ^Çþªâ¯êòÊz—¿+ü“äo3F°ë/–´}6ö%up—¶qE*†RU€u" z±W®b®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å_ÿÐûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]мSónÎg~;‡‰¾ŠúÎnû"|ãñtÝ«Gàñ¬Ý:‡b®Å]Š»I¼Å¥.»¤ßèB·–³[šô¤¨Sz×ÇÃ'Š|î «ù… ž, ЃÛ=\8ó/ׯȋҿ—ZÉ5+nðŸoFWŒ¹sŸÕzr—ÖÆ²W©ZuÛ%ŽN R´ë¶fc“Q R´ë¶fã“Y R´ë¶fã“Q 2î TeÌá&7u\s1ÉÝC×"\ÜrDék¾òûŒúÖìNv§ù'ªþ¯l ²i£—È÷½óÊ>qÒüÇHm¤ôîûÁ%ÿ±ìÃåô˜ó:ìÚYbç˽é:ž·lÚv­wÒ}¤‘j>~Äv#qÛ1e*aŽg¸š/›¼ùÿ8Ós¾§ù!•EXÙLßöŽC±ù5ùG%O{Ði;\²|Ç铵+{½æM7U†Kk¨ŠU(Ê}Áß2¯“¾€7­ûá¶^¾·ï¯†ï­ûãká»ë~øÚønúß¾6¾¾·ï¯†ï­ûãká»ë~øÚønúß¾6¾kr\…Z–&€øÚ8G~_ÿÎ<ëÞfTÔüÌJÓ›p®¿éd?`{¾ÿä‘”OP'S«í8bÚ;Ÿ±õž…ä]#ɶßRÐm–*ŽCñHÿë9ÜüºÀeC!—7›Ôj'˜ÜêI|Í­éþ^‹ë¬Ë?ez»ª£sú¼s"µcÃ,†¢nse¶!ø±ªÜ5õÄײý¹¤yæÆ§: +g°Ç°§îüá>“ú/òƒC€íïnZŸå]H«ÿ «ú³Ï;v|Z‰yPû”Væ¡.Å]Š»v*Í¿/lþ·®[’*±”ÿ±SOÄŒÁíðâ>{9ºqd[¾šÎaèÝŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š¿ÿÑûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]мóó:Ïë:)œ à•$úÁÿfDzçÃ’»Çíp;JXï¸þÇÎYÒ<ó±Wb®Å]Š»5ߘšGè/7ëúZµõ½AéNéü3Ôô“ãÇw€~ÇoÒOùÄ›ŸÒ?—‚ùcÔ.`ûÂKáÿ{ÿ Óv—§/¼ž×_Áíº•§\§q R´ë™¸äÖCÔ­:æf95À5+N¹›ŽMd0=BÛ‰'3"m‡&)u\%È„˜åÔ=rÌÇ&7u\‰sqÉN #%]MA„Üds!+zß’ÿ<ïü¼Écætkë!Aêƒûô3³ý4?åf.LÉ£7gG&ñØý³¼æ}#ÎÃPòíÔw1Šs hèOgSºŸ˜ùf·,Lyº¬˜%ˆÔ…#<åùSåßÌ›_©y¦Íd‘A\GðO‘Æôÿ$ÕOu9DsroÓj§€ÜOãóÿó[þqSÍ>CYuŸ-ÖôT™ Oôˆ”¿",ý¤¯BYPfvlg±Ø½>µ!›izOÙó|¢n¨hzæe» ¯­ûãká»ë~øÚønúß¾6¾¾·ï¯†ï­ûãká»ë~øÚøooü¬üˆówæÃ-Ölm´ŠÑõ  Rº„Ú²eöŠæ>mTqóçÜàjõ¸ôÜÍžáÏö?Eÿ.¿çü±ùb©w ¤5•›ë••¿â¤Ýc«ö.s_=T²{ž[YÚ3ÔmÈwÓÞϵ˻M"ÞMCTš;{hÅ^IX*™;a…žN¸@ÈÐ|}çŸÏø¥gÓ¼>ªo&Zœhw?6ÿÍž-?{²ÃÙ½gòýožç¼ºÕgkíJWžáþÓÈI'û=³2"œÒ “KhºdÃ92h²aÜ™¬Y áÎLŠÒ 2N$³=:צÙ9( ëO¶é˜““` ëOµé¶aÎM€3½>Û¦aÎM€"<ë7è¯*ëz—C›vãæ!j¤åýSÌ98#rÌ?gÒ—©D:OèOËo*iäQ†e#–%‘‡SÝðÏ1íñæ™þ‘ûܰõÜÂK±Wb®Å]н{ò’Ï•ÅåùýˆÖ1þÌÔÿÄFiû^{ü7mÙPÜËà÷,Ñ;§b®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb¯ÿÒûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Фžd³úþ—yhYá~#ü *?—é§Á0|ÚuãO’³®yWb®Å]Š»v*þ¿ç(ôŸÐÿ›>i´¥9Þ‹ÿåâ$›þ7ÏIìyñéà|«äiÆËÍõüàõßÖt=H­M½Ý¼ôðõ£eÿ™y…Û"¥ä~Ïít} 7õÆ¥i×l×㓬!€êVvÌÜrk!€jVvÌÜrj!€êVvÌÌrk!€êVvÌÜrj!„^[ñ$fO5‰¦3u\‰f91˨zä ™ŽLnê¹æã“º‡ \ÌrAéºÎ¥å›´Õ´ ™m.ãû2DÔ4ð=ˆ=Á¨=ÆW8 .OÈ*BÃìÏÊïùËKI=ó:!m.ʺ„ Lmï,b¥}Ùj?ÉQš­F„ó‡É×gì“ÏËõ>÷Ðolõ›hµ="x®¬æPÑÍ ‡G¸e¨9¦É`ÑuF&ŽÏüÝÿœJò‡æêË©Ãè0½[ëöˆ)#÷ô[,•îß ÿ—M²Ì:ùaÛ˜îvš.Ôɧۘî? ¿'ÿ8ÿç<ïù%3Iæ›#6Ž[ŒZ­d¶zšÍJÆÇùd Iû<†ù¹Óë!Ÿ‘ß»«Öi5¸õ#Òwî<Þ õ“™Vçp;ë'^}dãkÀÏÿ.ÿ-üÓù­© Èzl÷÷;"‰OíK!¢"û±è*vʳgŽ!r4Ñ¨Í ŠfŸª“¿ó‚š“Zçæ|©®k Fˆ²‰¼ 4Äì?â³×4¹ûPÏhl>ߨòÚÞÚ–M±úG_ÙøÝö<ÖpÙÄ ("Pªªª¨À˜±•ºnøïó_þr{ËžP2é>V)¬êëU>“£DÝ>9Ú#ùR¾—6º}§¹Ø9Ú~Ì–Må°û_ù·Ïú÷æ××¼ÍtÒ€k ðÃúˆ63V=ÉÍÆ,C'm Â*!)µ‹¦\§&EkL˜pç&CmH8““!µ‹&9É‘ZÅÓ$IÉ•X[TŒŒäÐ7g:u·LÄœ›gZu¯LÜ›gzu¯M³rliÖ½6Ì9É´ùÿr4¯Ëvàš†(G‰õfD4éØŸ£«(üts4‘¹‡ä‘´¬"‰K;@©$ôgJ^Šé›DÓWFÓ¬ôˆéÂÒÞ()û³É²OŽD÷›sSLŠ»v*ìUØ«èÊÛ?CHk’7žf`}”ý`ç;Ú³¼•ÜÿfB¡}åé9¬v.Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å_ÿÓûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]ЏŠìqWǺ¥§Ô/.,NÞŒ¯ü Ž)ñÄðòy!Á";Š,kv*ìUØ«±Wâgüç^“ú;óV{ÊSëúuÍi׈hkÓþ*÷ÎûÙÙñi븑úK››6ÿœ½¦·¯èÕþþÆŠxú2ñ¯^Þ¯‡öË·¦'ÏïþÇO®èN¥i×lÒc“«!€jVvÌÌrj!€êVvÌÜrk!€êVvÌÜrj!€jVvÌÜrk!€ê6´®Ù™ 5–#u\°¶ÂLnê¹æã“º‡®@¹˜äÆî¡ë‘!ÌÇ&9u\sqÉÝC× \Ìreÿ—Ÿ›þjü¥¼¾Q¼)nÌk9ªöÒÓù’¢‡ü¥*Þ ˜ÙôÑÌ=M™tÐÔ øõ~¤~HÿÎaù?ó¡ÐüÊË yè¢+—W™º~êc@ =ø¶ôRýsÕötñn7k¤ÔöTñoÇÛò}ÀtË}J ,5cžÚd)$R¨tuaB¬¦ ‚:ƒšs:Ü:ø’7ÏÏÏOù÷…æåŸÌ“&‰«5\éÓ62·RŠ´ûs¢„A¾lô½¶a¶MÇ_Úô>Û”6ɸïëû_’þjü”ó×’¼Åå÷˜´ øuùØ­½ªBҵŠ+’Ê¿å!aï=V<‘ãWÝïîz=ÿœå¼ú¶åí&¿ïEÕÌôÿŒ(‹ÿ33gØ‚å#ä>ßìv¹|©ÿ8³¥~˜üÙò½¡ð»{ÿåÞ›þ4ÌîÙŸžgʾdu‡›÷Ï<ÙÌv*ìUØ«±TM•±¼¸ŠÍ>Ô²,cæÆ™ Ë„ÜÎâ w¾ÅE¡Q@ Ã8Òmë@¥Ø«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WÿÕûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»xwæÝ§‹;ñûq¼dÿªj?âG7½‘=Œ~?“¥íXnÁä¸u.Å]Š»v*üâÿŸ‹i^®‹år›ÛÞ][×þ3ÆãÿxoSì´êsxäkNq³ãùÅGô_æ—–n+NwmoÿI<>ùÿÚë'jG‹½×ò6ë5â_¸Z•§\áñÉÔÀu+N»fn95À5+N»fn95Àu+N»ff95Àu+N»fn95À5+N»fn95Àu+N»fn95Ã.à¥F\ÎcwPõÈ—3˜ÝÔ9æc“º‡ \ÜrcwPõÈ3˜ÝÔ=r$9¸äÇ.¡ë.f91»¨zä ™ŽJžU»¹Òµí6ÿNšK{˜®àhå‰Ê:0qº²AùeYb H=ÎDªQ ÷?®¥¼ ¥sÍx?·ó«ÿ? ºš÷ó»WŽiâ†ÓOX•˜€Û# ô’vîIÎß±#X¼ýï_Ùa½ñÍ´Y¸TäÈm¢é“$äÈ­¢Érd6ÑdÇ92h²AÄœ™´=2aÜ™ ´]2AÄœ™ ´90áÎLšÊß‘ÈÓŒM³}:× ÌYÉ ëN¶é¶aä“` ëNµé˜s“` ïNµé¶aä“h ëNµé¶aä“` ëNµé˜y$Øó³þsÂþ¾`дjïŸ%Å?ã4¥kÿ$³ØCÑ#ç÷Úìôcfÿ8)¥þüÒKºô2òãþ „?ó3#íøtõÞ@ý?¡Û`¿j3rÝŠ»v*ìU˜y Óëšå¢‘ðÆÍ!ÿ`¤Æ™…¯Ÿ#òrô0âÈ>o¨3—zWb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å_ÿÖûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»y·æ•§¯¤-ÈÁ2±>Ì þ²3eÙS¬•ÞwiÂá}ÅóÆtnØ«±Wb®Å_ÿÎyé¤?,EÝú«iqÿ²Cÿ33}ìäøs×x#î?¡«0ÙùAù[ªÍþ_ÖIZj¶3’zR9Ñ~ìî5PãÇ!ÞÜ벋è»R´ë¶y¶9:‚¥i×lÍÇ&¢¥i×lÍÇ&²¥i×lÍÇ&¢¥i×lÌÇ&²¥i×lÍÇ&²¥i×lÍÇ&¢¡mBvÌÈ›aÉŠ]C× r!&9u\s1ÉÝC×"\ÈIÝC× \Ürc—PõÈ3˜ÝÔ=r%ÍÇ&9u\s1ɤÃMRÈÿËÌ?ñ1•dä\®-‹ú¸»uÏ<àx ?óž¾üéÖdñ¶Óÿê<ì»VñûÞ»²¥û‘ñûß)ÛE›`äÎLŠÚ.™ áÎL†Ö.™0áÎL†Ö,q'&CkL8s“"¶‹¦H8““!¶‹&9É‘ZÃZ “‰93 >Û¦S90iö½3rliö½3rméÖÝ6Ì9ɰu§ÚôÌ9ɰu§ÛtÌIɰw§ÚôÛ0ç&À’ó›¼üʸ²¿Q±´·§‡$3S¯üY^Ý~“Õö$k ÷“ú¿C´ÒŠ‹Ô?çݺW­æ/2k”?èööÕ§O^Rô­?â¯ìÖ{Q:„cÞIùÚítáú¿œc’ìUØ«±Wb¯Xü¦´õ/n¯ˆÚ(‚}.ÕÿsQÚó¨Þ~ïív½— ‘>_ö=ã4.íØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±V7©ùË@ÑnãÒ5VÆÒþ^>¼÷1G+ò4^(ÌÔì(78«$Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wÿ×ûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»cþk´úö{oJ“ 0éñÄfF’|óhÕC‹O“ó­ygb®Å]Š»|íÿ9e¤þ™ü¦ó5°^M¼W#mÇÕçŽRzÊ~ŽàfÓ±gÁ¨ó¯˜!†AaøAk#FÊñ’H ƒBÏHuÓNv7K®évZÜ`p¼¶†àS¥%@ùññ?<òÂ8$cÜiÔÈ1JÓ®ec“Q R´ë™˜äÖCÔ­:æn95Àu+N¹›ŽMd0JÓ®fc“Q R´ë™¸äÖCÔ­:æn95Â/-èHÌžkLfê¹å㓺‡®@‡7˜ÝÔ=r%ÌÇ&7u@¹¸äÇ.¡È2cwPõÈ—3:dTÔ¬Ïü¼EÿTÆÅËÙý; ß|àøß…󛿾üßÕäñ·°ÿ¨dη²…b½ë;._¹½ó%´Y³ ó“"µ‹&9ÉÛEÓ$IÉÛE“äÈm¢ÉrdVÑdÇ92hºdƒ‡92{ z‘‚Fš9³:Û¦Ù‰93iÖ½3$›gzu¯M³rliÖ½3rléÖ½6Ì9ɰu§ZôÛ0ç&ÐÖmÓlÜ›~ÿÎPê¥4|ÍsZð½ú¾ÿòïÃÿgsÙqáÁuü÷vÚqQµÿçÝš_¥ y—\ãþô_ÛÛò ßЈ½>WñÎkÚ‰ÜãàOÌþÇg€lýÎ]¹Ø«±Wb®Å_@þUZz:d×l>)¦4?ä¨~5Î{µ§s¸;îË…@žòôüÕ»'b®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å_Ì'üäoüûþrÍÿš~eóO—´ûmIÖõ‹Ûè53©ÛEÆå2F²Çq*J +âŠàq¢’¼N*þ‡¿ ¼‘­þZþ[ù[Èu¾–»£é–W—JÅ•åŠ0¤+0 Ê´â¬À3€$â¯]Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«ÿÐûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»ZêJ8ª‘B=Ž Ò‘oŽï­ÄÖmÖ)3_òM3²„¸€=ï%8ð’;¹6Å]Š»`šúOéß$ùF§#u¤_D£ü¦Â‘î Ìø2Æ]Òz%ÉüçÀÙênºaý%~@ê_âË)êòs£YÄÍâÐÄ#c÷©Ï1íøyæ?¤~Ón¯ ܲýJÓ®CšH`:•§\ÍÇ&¢¥i×31ɬ†©ZuÛ3qɨ†©ZuÛ3qɬ†©ZuÛ31ɨ†©ZuÛ3qɬ†¨ÚÒ¹› 5–!u\°¶ÂLnê¹æc“º‡®@¹¸äÆî¡ë‘.d$Æî¡ë.n91˨zä ™ŽIvŸ5 SÿÅÿ\ÆÎP–ÏèÐ^ûçÀñ6üZÿœÆý÷æ¶«'Œ_õ™Óv`¬Cã÷½OfK÷#ã÷¾w¶‹6!ºrdVÑdÉ92XºdÇ92h²AÜ™¬Y0âNL†Ú.™ áÎLŠÒ2N$³=:צÙ9( ëN¶é˜s“` ïN¶é¶bNM€3­:צaÎM€3½:צaÎM 3­:צه96δë^™‡96δûn™‡96þr?2õoÓžj×u j/5;ÛŠÿÆYÙ¼€ùg¤é¡ÁŽ1î}Žã ýiÿœÒÿGþW­å)õýRòãçÄ$>?ñ_·ñÎÚ9ñj+¸úK±Â6}ŸšÇb®Å]Š»}SäËO©h¶PÒ„Ä$?9/㜦¶|y óû¶z}8qå÷îÉóÉv*ìUØ«±Wb®Å]Š»v*ìUØ«±W†þ|ÎG~_ÿÎ6hcÍŸ›z¼z|3[Kd[«§P*°B¿Ò£“l‰Pdu¸«óÕÿçõ?‘êÅWAó“HXéÔ>â·àâ¨í'þ=ù©^Ccy¦y³O‚W ÷W6m@þÓˆ/%þDlÞØ«ôûÈ^òçæŽ…gçŸËíJßVÐoÓÔ·»¶nHÀze «#ÊÀ«A«0Å]Š»v*ìUØ«óSó³þ~ùQù ç}_ò“Íú?š.uX⸖ÆÒÉíØÉJ84—‘¹\T]ëÛ|UåŸôZ¿Éú°yÏþtïû/ÅYw‘ÿçð¾pաе$ó—ã‚ ÝZÆl¬Æƒ›ZÜ\:ŠõbœW«08«õÆúÛS¶‡RÓfŽâÒâ4š¡pñÉŽJèËPÊÀ‚4#qŠ¢±Wb®Å]Š»v*øçþrKþs·ò›þqnát?ÌBâóÌN‹(Ñô˜–âñc}ÃÈ㊠FàI"3 Ô0ß|ÿE«üÿ«œÿéNÿ²üUŸþ[ÏÜ¿!¿0µ˜|µ|ú×–Ã,qÝë–Gj]¶¤·¸¸ôÅz´PV¥€© ¿N ž;¨ÒæÙÖHdPèèC++ ‚Ø‚:UWv*ìUØ«±Wb¯ÊO9Ïàÿ&¼‘¯ê¾KÕ´?7I}£ß\éó¼Z{FÒ[JÑ9B×ÊÅK)âJ©§P:b¯Ñ?ÊÍ +ó«Éº7æ§•¡º·ÒuËQwmê"N¨I‘cy»;|U髱Wb®Å]ФþaÖàòÖ•}æ;åw¶Óíf»•c¹HP»€Ij+Üb¯ÉŸú-_ä‡ýX<çÿH:wý—â®ÿ¢ÕþHÕƒÎôƒ§Ù~*úþqóþ~Iù3ÿ9­Çä.]ßèž`¸n–Zì[µÓ,/³DÎ{!píû*qWß«±Wb®Å]Š»v*üÖüÞÿŸ­~E~Rk“ù?×Õ¼Éyjí̺´ÛÅ"2zÓÏ9¼E×üªâ¯*ÿ¢ÕþHÕƒÎôƒ§Ù~*úwþqËþ~ù?ÿ95©(ù6öóKó#†h4½j·žp –ôZ9%‰ÈQÈ¢ÉÏŽühоáÅ]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»ÿÑûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ù϶ŸS×.”}™ Ê?Ù¨'ñ®u ñb'š×C‡!ù°üÍqŠ»v*§4)qÁ0å©V Šˆ4¯ærúÉô›Û.sY-¦’ùÆÅOB|צaÎM€3­:צaÎM€3½>צaÎM€'ú­àÐ4{ýu¨ÊÒ{’OOÝF_»1â8ä#Þ@mˆ·ópäÔÉÏRwÞ¿ùÅ=/ô?å?•í§;G¸ßþ^&’oøß<×¶gǨ™ó¯ØC“èLÖ²v*ìUتµ¼-s*[Çö¤eAó&™K„[(Ž#O±¡‰` dE >@Pg#fÞ´ ©.Å]Š»v*ìUØ«±Wb®Å]Š»v*þb¿çõ·s?çG—l^F6ñù>ÒDŒ“Å^MBô;РžüG†*òŸùÁ?ùÀ ?þsB׼˩yž}´kèm8l–äH$‹Ÿ"ZXéN”¡Å^ÿ9­ÿ8Çkÿ8™ùƒånŸ¬I­Å&—m¨ýj[qnÀÍ$©Ã‚»ŠNµ¯~˜«ö«þ|q,Ÿ•i¶y¢ÌîQ ªZÊß‘ ­|iŠ¿f1Wb®Å]Š»v*þ8¿çä?úÒ^~ÿ˜ÛOúƒ}oÿ8£ÿ>«Ò¿ç$+4Λß9Ýi3k?^åeš“,U½šÔRC:ÈEËìŠV«Š¿3¿ç!¿*¢üüÇóå5­ëj1hWÍh·o‰¥  ò(‚õéÈâ¯ê‡þ}‡y=÷üã/‘'½•å‘cÕb ìX„‹U»§²¢…QÙ@aоöÅ]Š»v*ìUØ«ø¦ÿœÛ•æüüüÆy™‡™u‰&‹1Uö<Ø«ôWþqçþ}¤~x~\ysófëÏZtºíŠÝµ¢i‘ʱÄqgRÝ:ñ«ò/ó{ÈÉùaç¿4~ZÁrבy{[Ô´…¹d™…•ËÀ$( ,•*iZTâ¯ìþp6îkßùÇÏËÉï$idýrrIâ…‘EOePð˜«ë|UØ«±Wb®Å]Š¿†/ùÈOüš~xÿÀ›Yÿ¨ÙqWõ½ÿ8ÿ¬óù{ÿlhÿäã⯯ñWb®Å]Š»yÿæÏü þfÿ¶.£ÿPÏŠ¿„F†êßÊü±J†ŒŽš|̬¤t ŠƒŠ¿‰¿(hkæ}wKòÔ’WQ¾¶´2È šUN@TV•­+Š¿n?7¿çÎZ?凑<Ñù•Ÿ.ï%òö‰©jëlÚTq‰•³Î#..¨bœkCJÖ‡~7~LÞÜi¿˜UÔtù˜5Ý2H¤CFW[” ‚:qW÷gŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ÿÿÒûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ðÍ›ONöÖøt–&O¥¿ñ¶o»"w;ßýŽ“µ!RËîþדfÝÕ;v*ìUØ«ùÙüïÓ?Aþcy«M§Mfùx$“3§ü+ ôþΟè¹ÃÈ7~²ϸuqyùwªi,k%žµ+à’ÛÂGü2¶r~ӳ߸—W©¿AŽ'9ÇŠjVvÌŒr`CÔ­:홸äÔCÔ­:æn95Àu+N¹™ŽMD0JÓ®fã“Y R´ë™¸äÔCÔ­:æn95Àu+N¹™ŽMd0»¸)Q—²„˜ÝÔ=r%ÌÇ&7u\s1ÉÝC× C›ŽLrê¹æc’Uk /mÏü]üHd$6rĶ~Ø}wß9®·åÇüäÏïÿ0õ Bÿ”#ÏöÙ´ÿ¨cоÿŸÉäû¶ÿÀgNÿ“÷8«ôþ|—ÿ’³ÍŸøú‚ƒ~Ïb®Å]Š»v*ìUüqÏÈõ¤¼ýÿ1¶Ÿõ*þ‡¿ç×úÌ^Fÿ·×ýÖ/1Wóƒÿ9ùÿ­ ù…ÿm©?â Š¿£ïùõÇþ³‘¿íõÿu‹ÌU÷þ*ìUØ«±Wb®Å_Åüæ·þO¿Ìü µ?ù>Ø«úžÿœÿÖyü½ÿ¶4òqñWòƒÿ9cÿ“¿ó/ÿ?0ÿÝFlUý_Îÿë<þ^ÿÛ?ù8ø«ëüUØ«±Wb®Å]Š¿†/ùÈOüš~xÿÀ›Yÿ¨ÙqWõ½ÿ8ÿ¬óù{ÿlhÿäã⯯ñWb®Å]Š»yÿæÏü þfÿ¶.£ÿPÏŠ¿„ÿœ±ÿÉ!ù—ÿ€g˜î6*þ0)ÿå7ò×ý¶tïú‰LUýÞâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š¿ÿÓûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*óÍ[?[KŠìŠ…ÕpAüi›NÊLŽðë{N{‹çìè] ±Wb®Å]Š¿ç24¿Ñ?›úÿÆ;Ÿª\§¿;Xùƒö÷\ôNŸž>V>Òãå¾ËÿŸdk\—Íþ_‘º:ê5¯¬’WýNƒæzf§Ú˜}÷¹ÕêÇ'êæròQk“‰¤Áµ+N¹—ŽMd0JÓ®fã“Q R´ë™¸äÖCÔ­:æf95Àu+N¹›ŽMD0JÓ®fã“Y R´ë¶fã“Q Pµ¡'2á+käÅ.¡É"c—PõÈ—7˜ÝÔ=rÌ„˜ÝÔ=rÌÇ$¢iwÿ‹Sþ$2X–ÏÖß®ûæ‹åmùÓÿ9ûï=_Iã·üš\ÚéEAè´ýÐøýï/µ‹2ƒ9ÉÛC’$äÈmbé“äÈ­bé’äÈmaé“$äËtûn‡+œšÃ:Óíºm˜s“` ëOµé˜s“` ïO¶é¶aÎM€3­>Û¦aÎM€3­>Û¦Ù‡96€Îôûn™‡96δûn›fäØ:Óí©Bsrlò÷üçN¯ú+òsZO½šÆÙH¯ü´¤„}*„|³iØâÔÇÊÏØ\8¹?´»ÖuM*󻸊§ZÈáE>üïòO€Ü´újŽ5…€T@@èØ òrmÌ_Š»v*ìUê•~®£=áCór)øš®Ö@ó÷;>Ë…Ìžà÷ÜçÝë±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»0?óú¿üúþ–?÷Q¿Å_`Ï¿åóÇý¶m?ê⯇ÿçò_ù>í¿ðÓ¿äýÎ*ýÿŸ%ÿä¬ógþÇþ  Å_³Ø«±Wb®Å]Š»_óòýi/?Ìm§ý@ÁŠ¿¡ïùõÇþ³‘¿íõÿu‹ÌUüàÿÎ~ëC~aÛjOø‚b¯èûþ}qÿ¬Åäoû}Ýbó}ÿŠ»v*ìUØ«±WñEÿ9­ÿ“ïóÿmOþO¶*þ§¿çÿõž/íüœ|Uü ÿÎXÿäïüËÿÀÏÌ?÷Q›Wßó€úÏ?—¿öÆþN>*úÿv*ìUØ«±Wb¯á‹þrÿ&Ÿž?ð&Öê6\UýoÎÿë<þ^ÿÛ?ù8ø«ëüUØ«±Wb®Å^ù³ÿ(?™¿í‹¨ÿÔ3â¯áwŸ›?òƒù›þغýC>*þñW÷ùŠ»v*ìUØ«±W€ÎXÿäüËÿÀ3Ì?÷N›?”ÿò›ùkþÛ:wýD¦*þÏ¿ç,òH~eÿàæû§MŠ¿ŒÊùMüµÿm;þ¢Sw¸«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb¯ÿÔûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*Æ|ågõíöTˆŒƒçåü3+E> €ùýû8Ú¸qc#ËîÝò®uo0ìUØ«±Wb¯Æ/ùøF—õÌ{IÃ{£@Äø¼sL‡þ.w>ÍNð‘Ý#÷¬˜ϵõƒmù…«hìiÞ‰+âðÜCOøVlÓBðƒÝ/¼[¬?l³†uÍ]Ž*ǵZÔÓ/„˜Àµ+N»ff95À5+N»fn95Àu+N»fn95Àu+N»ff95À5+N»fn95Àu+N»fn95Àu+N»fn95Áï-ø“™#u‰¦3u\‰rñÉÝC× \Ürc—PäK™ $ÑÃK˜üXŸ¬er\e³ô¯ë¾ùªày‹|/ù×ûÿ8ÞIãòis?¨½†_º½[EÓ29ÉÛE“äÈm¢ÉrdVÐäÉ92[z‘Œ8Çvo§ZôÛ1g&@3½:Û¦aÎM€3­:Û¦aÎM€3­:צaÎM 3½:Û¦Ù‡96δë^™‡’M€3­:Û¦Ù‡96δë^™‡96ËáÓZf16ØüóÿŸ“ëTü¾Ò4t4k½j9ºCo-GOæu=GOs³¼¤÷Gï!ÊÒ “òòLý7ù•å=:•VÖl¤qâ‘L²0ê:ªŸíΫ´§Á†gú'îvÐè·<ÉÈv*ìUØ«±W½þSÙúV¤PÍ0Qî«Ðv´î@w½Þö\*$÷Ÿ¹ê¹©vnÅ]Š»v*ìUØ«±Wb®Å]Š»v*ìUüÀÿÏêÿòwèøXÿÝFÿ}ÿ>Bÿ”#ÏöÙ´ÿ¨cоÿŸÉäû¶ÿÀgNÿ“÷8«ôþ|—ÿ’³ÍŸøú‚ƒ~Ïb®Å]Š»v*ìUüqÏÈõ¤¼ýÿ1¶Ÿõ*þ‡¿ç×úÌ^Fÿ·×ýÖ/1Wóƒÿ9ùÿ­ ù…ÿm©?â Š¿£ïùõÇþ³‘¿íõÿu‹ÌU÷þ*ìUØ«±Wb®Å_Åüæ·þO¿Ìü µ?ù>Ø«úžÿœÿÖyü½ÿ¶4òqñWòƒÿ9cÿ“¿ó/ÿ?0ÿÝFlUý_Îÿë<þ^ÿÛ?ù8ø«ëüUØ«±Wb®Å]Š¿†/ùÈOüš~xÿÀ›Yÿ¨ÙqWõ½ÿ8ÿ¬óù{ÿlhÿäã⯯ñWb®Å]Š»yÿæÏü þfÿ¶.£ÿPÏŠ¿„ÿœ±ÿÉ!ù—ÿ€g˜î6*þ0)ÿå7ò×ý¶tïú‰LUýÞâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š¿ÿÕûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*§4KצaÎM€3­:צه96€Î´ë^›fäØ;Ó­zm˜s“` ëN¶é˜s“` ëNµé˜s“` ëN¶é˜““h æÆßˆæË` ®V—äüüóÌ<þQòÌ2)–$¿»š0À°aHÉ@<^•ëÛ¦uþËã¡9{‡ßûýy—ÈŸó…ZKkœñ-š^Ý=+°[iOÐì¹´íìœ:yyÐûC¶€~ógž³v*ìUØ«±WÔ~F³ú–‡f„Q §ý™,?3•×Ï‹)ù|ž›Ecçóe¹ˆå;v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wóÿ?«ÿÉß àcÿuüUöüù þP<ÛfÓþ¡Ž*øþ%ÿ“îÛÿ;þOÜâ¯Ðùò_þJÏ6àLê Uû=Š»v*ìUØ«±WñÅÿ?!ÿÖ’ó÷üÆÚÔ «úÿŸ\ë1yþß_÷X¼Å_Îüççþ´7æý¶¤ÿˆ&*þ¿ç×úÌ^Fÿ·×ýÖ/1Wßø«±Wb®Å]Š»_óšßù>ÿ1ÿð&Ôÿäûb¯ê{þpÿYçò÷þØÑÿÉÇÅ_ÊüåþNÿÌ¿ü üÃÿu±Wõ}ÿ8ÿ¬óù{ÿlhÿäã⯯ñWb®Å]Š»v*þ¿ç!?òiùãÿmgþ£eÅ_Ö÷üàþ³Ïåïý±£ÿ“о¿Å]Š»v*ìUçÿ›?òƒù›þغýC>*þñW÷yù³ÿ(?™¿í‹¨ÿÔ3â¯á˜«±Wb®Å]Š»xüåþIÌ¿ü<Ãÿté±WñƒùOÿ)¿–¿í³§ÔJb¯ìûþrÇÿ$‡æ_þžaÿºtØ«øÁü§ÿ”ßË_öÙÓ¿ê%1W÷{Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ÿÿÖûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUò×ìþ¥®^GÙäõGüô¿YΫC>,cåòÙæu°áÈ~6)™n+±TE­¤×²­µœm,­ÑPOÝ‘œÄ™F&FƒØ<»ù]ön¼ÄÞâÏüI‡ê_¿4ÚžÔéçú¶Ÿ³:Ïäùgþ~ÿ8ÝæÎïËý6×ò²ÒõO/^½è² #y h™$Xj8´•âÁX¯ _жËÙ^؆99‰© ¾ã{_—ã“‘­ÒñÀ]ͼ¶÷z5Ü–„RÚßZÊÑ˪ÑˈhÊÊhÊÊE4 ç°ÆBbÆàý¯58ÓôÛþq—þsÎ÷Ë"ßÉrË}¤1Á«ï%͸èãv•óï"÷õ6ãÍöŸ` ž¼;æô>îï»Üë3éox¿`ô}bÇÌPkZÌWš}Ê ¸Ä‘ȇ¡VZ‚3œ  …ÑÀ"“,‚›ûn@°Ë!&$0=JÓ®fã“Y R´ë™˜äÖCÔ­:æn95Àu+N¹›ŽMd0 JÓ®fc“Q R´ë™¸äÖCÔ­:æn95Á/­¸“™q6Äb÷PõĹXäÆî¡È3’†’¡ÿ(~¼\e³ê®ûå<‚ß;yû÷úôòx¬ñ–DS¼ÑË÷câ“ÛE“ 92XºdÉ92hºdƒ‡92‹ zpHÓÍœéÖ½3rliÖ½3rliÖ½6Ì9ɰw§ZôÛ0ç&ÀÖŸmÓ0ç&ÀÖkÓlÄœ›@gzu¯LÜ›gZu¯M³rl”¨®û×1Ù¿9ÿç%¿ç;tÏ"‹&þOɧæÊ9µ¤µµn„'Q4ƒþE©ê_âLé;3°%—×—aÝÔþ¡ö¹xtÜ[—㙼˩ù«P¸ó™.æ¾Ô®œÉ5Äî]݉>`:°Û;¼ÿœjóv…æ ÿ>|åaõ/Üé3Yé‰sðÏpóÉzËzhà3qçÈäµ9çžÚvÆ,|fä$ « v¾û¯wWÙºbåO×O1~ZYê<®tr-nü)û¶úÙú6öÎ+MÚr†ÓÜ}¿µÈÔvtg¼v?cĵm÷D—êÚ”M~Éê­îØæïxåé²á–#R V\ÔìU|q´®± «1s€šÝ [ì[[u´‚;Tû1" ù(¦q³—'½ëcHŒ‹'b®Å]Š»v*ìUØ«±Wb®Å]Š»v*þ`çõù;ôü,î£м;þp¿þsÿPÿœ9Ñu¯-i¾Xƒ^]fò+¶’kÖ¶1˜ãáÄŠJ×­j1W‹Î^ÎN]ÎYùæ?Í-CGD–=6ßNú¬WáH…ä~|ÙÔú”¥;uÅ_¸¿óå ›Ê_2ÞÜC"[ÜyšC Œ¤,,àV*Nı§}ºâ¯Ù¸ÿÖbò7ý¾¿î±yоÿÅ]Š»v*ìUØ«ø¢ÿœÖÿÉ÷ùÿ6§ÿ'ÛSßó€úÏ?—¿öÆþN>*þPç,òwþeÿàgæû¨ÍŠ¿«ïùÀ?ýgŸËßûcGÿ'}Š»v*ìUØ«±WðÅÿ9 ÿ“OÏøk?õ.*þ·¿çÿõž/íüœ|Uõþ*ìUØ«±Wb¯?üÙÿ”ÌßöÅÔêñWð‡Š¿»ÏÍŸùAüÍÿl]Gþ¡Ÿx«ûüÅ]Š»v*ìUØ«À?ç,òH~eÿàæû§MŠ¿Š+kåkMó,q‰›N¼·»“Ä9†@üI¡¥iJÓ~Â~iÿÏãuÌÿ%ùòÖ!ÚYÅæPÒåuY$0‹Ûw€ÈÛ¨b¡ùR¢´¥F*ü¯üÑï|Áù‰å=Eîo®uÝ68¢ŒU™Ê¶IØ ÎØ«ûªÅ]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»ÿ×ûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUà_šö~–£àMóBkødÎàGqûÝjB¦xyhØfÕÖ=Ë¿—Ú¯N¶–ÇzûÆÊz|ÏÜs[©í(ãÚ;Ÿ±Øéû>Y7–Ãí{Ž XèQú:lA+öœîÍó=†h³j%˜Ü‹¹Ã‚8…D,Ö¼Åa Gêê2…b>Æîß!üzaÁ§–cQ©sj#ˆ\‹Ã|Åù‹«ò¶°­­©ÚŠ~6íÛä>ó›Ý7gGòÜýŽ—QÚɰØ}¯†¿ç ?ç<³ùã êÀ 3ÍH”‹Q‰¼  [„õ°o¶»PñOMÙݯ=®qîý]θ‹~.~d~Vù—ò‡Wo,ùâÍ­çÜÃ2Õ §8ž€2ý̽Tíæ“Y Tx oïö‰Åë_ó“žkü‡¼ ¤Ho¼¿+òºÒ§sé=z´gs”ý¥;sW ÇíËǬí.’ý}áÃÍ„Mû¥ù=ùáå_Îý$kžKº 4a~µe-æÙi§cû.µFÞ† Ákt4’á˜÷…×NÞ¶êPæ+©ZuÛ21É R´ë¶fã“Q R´ë¶fc“Y R´ë¶fã“Q R´ë¶fã“Y R´ë¶fã“Q R´ë¶fc“Y R´ë¶fã“Y .î Te鄘ÕÔ=r%ÌÇ$‚Xhêʯ C™löO®ûä¸%¼›Ìÿ¾Õ%“Ä'üDd§s¤—îÇÅFÚ,YÉÚÅÓ$9É‘ÚCRIÄ™¶g§ZôÛ1ç%iÖ½3rliÖÝ3rléÖ½3rliÖÝ3rmiÖÝ6Ì<’léÖ½6Ì9ɰu§[tÛ0ç&À1y¯Dü¿ÒfóOœoaÓôËqWšf ©èª:³Šª 1Ø”ãÅ,òဲ[cäüjÿœ–ÿœÙÖ4¾±åËã6“åFªHõãux½¨Aø#?ïµ;¶MxŽ×²û :o^MåöÖ|݆?å𦑢ê>h¿ƒAòí¬·ºÓˆá‚.îÇÀ¤ôs¶o2åŽ1Å#@9Ñ‹õ£þqÏþpNòQƒÎ_›I£¯­$‡OÚK[Vê õÈ?äZžœÈWWiöñÍèŰïêPû\ˆÆŸ¦>_ó†£åâÙýKnðɺýÁù}5ÎGQ£†n|ûÜ̹aå˹îÞ^ó¶æ"FônÏXd;“þIè߯Û4: ðïÌw»½>²9¶ä{™5å¾£ZßF²ÄÝUÅGû~ù ˜œ™ÀLQÝã~bü¯xù]yy¹¯_AÎÿìXõù¼æçMÚ—¶O›¨Ôvmo“Èî-å´‘­î‘£•MXGÐso ªQ14Sï'Ú}{Z²ƒ°˜9ù'ÆVcë'ÁŽGËïÙ¿I,€yýÛ¾¬ÎQéÝŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wóÿ?«ÿÉß àcÿuüUGþ}·ÿ8;ùuÿ9_å¿2ù‡óB]V;­'Q‚ÖÜi×1Â¥$‡™ä)*kî1W龑ÿ>|ÿœÓ/!¾»M~þ(˜3[\êJ"Ùs QÉCþK©÷Å_¥žSòžä]ÏÊN±·Ó4]>!­¥¬b8¢AÙTxš’z’I$’N*ÈqWb®Å]Š»v*þ8¿çä?úÒ^~ÿ˜ÛOúƒCßóëýf/#Ûëþ똫ùÁÿœüÿÖ†üÂÿ¶ÔŸñÅ_Ñ÷üúãÿY‹ÈßöúÿºÅæ*ûÿv*ìUØ«±Wb¯â‹þs[ÿ'ßæ?þÚŸüŸlUýOÎÿë<þ^ÿÛ?ù8ø«ùAÿœ±ÿÉßù—ÿŸ˜î£6*þ¯¿çÿõž/íüœ|Uõþ*ìUØ«±Wb®Å_Ãüä'þM?<àM¬ÿÔl¸«úÞÿœÿÖyü½ÿ¶4òqñW×ø«±Wb®Å]мÿógþP3ÛQÿ¨gÅ_Â*þï?6åó7ý±uú†|Uü!â¯ïóv*ìUØ«±Wb¯ÿœ±ÿÉ!ù—ÿ€g˜î6*þ+<‹£[ùÌš7—µÂÖÿQ´µ”¡£pšeFâH44;mŠ¿§Oú#oä'ü´ù›þâ0Ù6*úgþqãþpCòƒþq–ùüËù{¤ËqæVuMRo­\ÆZ¬[,qT¥£Ev_…˜ŒUö.*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«ÿÐûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìU‚ùãÊóyš;Xí⑹3ôÃsï¸f~‡T0}C…­ÓàR'ËÞHÓ¼¿I‘}{¡þînù#¢þ¿|†£]<ÛrÌ´ú(áß™ïd÷—°iñ5Õô‹K՜з˜°™¡»“9ˆ ;o"¸¹–îF¸ºv’V5fbI?IÍÄb"(:©HÈÙPÉ1v*¼ÿùwåÿÌý"_+ùÖÊ;Ë7^[Ú´4ÈNMAœéö½6Ì9ɘ ïO¶é¶aÎM€3­>Û¦bNM 3­>צaÎM€3½>צه96δû^™‡96δûn™‡96óÎ_ùÈo+~DXzºÜŸ\×%NVº\ =i<Îâ8ëÕØo¿r)—h»7&°úvOOÚ\ŒXŒßŠ_œßž¾iüìÕ?LyÂëý"ßT±†«on§²'v?´íWnæ€Ûè´ô‘¨yêÎË!H/ÊÈï4þwj_£<© ˜ ½B`E¼ø·í9e¬zìµawhãÒFçÏ êîT!oÚÉ?ùÇß+~GX}[ËÐýgV•»ÔçPg”÷ þû޽véȳ|YÁkûK&°Ü¶ä?Yór„iîy¯K±VÁ ÔuÀ—¤ywó"÷KãmªVêØmRx£Øž¿#÷æ·Sٱɼv?c°Óö„¡´·kÛô}zÇ]‹×ÓeO´½~c¨ý^£Í‚XMH;¬Yã”\JžµåÛ ~?KRˆ3ðÈ»:üð;{aÁ©–q?©´ñÊ=A…ùgÈrù{W7æEšÐDâ6èቄ|«¸ü37U¯±ðÕpôÚ†wÌSÔ3V슻v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wóÿ?«ÿÉß àcÿuüUôçüù{ÎZ–<—çX<ɪØéòK¬Z4kws%€· •À‘_ Uû•¢y‡Jó, }åËë]BÙÆÒÚL“ p*Y €A§Z㊧«±Wb®Å]Š»v*þ8¿çä?úÒ^~ÿ˜ÛOúƒCßóëýf/#Ûëþ똫ùÁÿœüÿÖ†üÂÿ¶ÔŸñÅ_Ñ÷üúãÿY‹ÈßöúÿºÅæ*ûÿv*ìUØ«±Wb¯â‹þs[ÿ'ßæ?þÚŸüŸlUý5Î þdyKIüò›ªëúUµÜ:À¡9þÔíèàôcÞ]ýë?ƒÜåcÅÞýtò×–4¯'iÐywÊöpØé¶ËÆ(!^*¤ü¡ó—ä·å.³åoÍMëCÕ®<Ów{µÚ€íØÙF² ±hÜ|Ôâ¯Ó|UØ«±Wb®Å]Š».ÿóó‡_?˜ÿžÞró·‘¼—ªjzýÕ³ÚÝÀˆc•VÒ%I`ve#èÅ_·?óï_ y‡ò»þqÿÊEüÀÓ¦ÒµûÒ¿Y³¸I«ª]Jœ€$|HêÃ~„b¯ÂÏùÌÏùÃ?Îß?~vùÛÎ^MòN«¨hº†ªóZÝBˆc–2Š),6Û~éÿϽ|æÊïùÇÿ(yóN›J×ìJýfÎà$~®©u*r‘ñ#« úоÏÅ]Š»v*ìUØ«ùÔÿœöÿŸe~ckÞ|Ö9ÿ# ÿiºýÄÚîŸëEå­Ä‡”¡FEš65(ú‚¼ e_¿ô óßùou¯ùŸó^*ùcÌ:£å=VûÊÞc·{M[MºšÊòÚAG†xÇ$mNêÊA÷«û%ÿœÿÖyü½ÿ¶4òqñW×ø«±Wb®Å]Š»"ŸóƒŸ>aüÄóv¿¢ùW¹ÓïµýRæÚd8É·r::ü]H#Jó†^PÖ|ƒù%äŸ&ùÊÎ]?ZÓô¤†êÖ`‘H‘ZUôæ*ìUØ«±Wb¬/ó#O¸Õ¼¥¯éZlm5ÝΕ} 1¯W’HUG¹$ Uü{ÐÿÎCå½Ö¿äZÍx«û üÈÓî5o)kúV›Mws¥_C kÕä’UQîIßô óßùou¯ùŸó^*þÏqWb®Å]Š»v*Å|õäûÌ/-ë>A×ùþŒ×4ë½2ëÓ<_Ñ»…¡“‰¡¡âƆqWò¡ùÏÿ>³üóü´Öîl|Ÿ¢7›|½ë³Ô´É"ç$f¥}[vq,nøþŒ6Ë#lqT§òOþpoóçËߘžQ×õ¯!êöÚ}Ž¿¥ÜÜÌñ§âŠî7wo‹¢¨$â¯ë¿v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«ÿÒûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUتO­èvšý¹²Ô£ª°ûH|Aÿ:÷˰g–qj͆9EIóg™|¯wå©ý+‘Î?»˜…‡ð>#:]6ª9ÅŽ}CÎê4ÒÂwåÞÆ³)Æv*ìUØ«±Wb®Å_7þ{ÿÎ3ùkóºÜÞܧy–4㥠IJL»z‰á¸eý– í;;µ§£47wêîaÛ¦aÎM€3­>Û¦aÎM '×™4$i’ùÍWqÙiðŠISÙT ÙePIì2ˆã–YpÄYm„ æçÇüåv¯ù’&òÇ”½M/˪ê ..‡üZÊ~?ïµ4þrÛS¥ÐvLpz§¼¾ÁîýnÏŸ‡sÍò®ƒ êžmÔ`ò÷–me½Ôn[„PB¼™ð©'`7$ ÙåËQâ‘ ØÂ߬ßó_ó†:_ý6þf¬ZŸ˜‡"µ =­«u‡i$Ì~?dçÚ½,þŒ[G¿©ýĂ*æû»9Ö×b®Å]Š»v*ìU0Ó4»báltøÌ’·aÐ{ ¯.QˆqI³#Ô_GùSÉöÞZ‹™¤·®>9Héì¾õ÷ðÎkW¬9Ïpîz.a罘æ–ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å_ÄüåþNÿÌ¿ü üÃÿu±Wõ}ÿ8ÿ¬óù{ÿlhÿäã⯯ñWb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ÿÿÓûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Tý…¾§Ù_ ’*Xð>'!Æn<ØNb‹çO7y*ãËŽn`¬¶ ~î•èúô?†tz=hÎ(ìžW£8w† ™î±Wb®Å]Š»v*ļíä] óI›Êþr²Ž÷O›rŽ>$`6tañ#ŠìÊAú Ë´ú‰éåÅE[ñßþrþq+^ü 3y—ËFM[Ê@–3¬ö«á:¨¡QþýQÇù‚TÝvgmÃUé–Òû»õ}î.LTù£ÊžoÕ¼™©Aæ?+^Kc©[·(æ…¨Gˆ#£)èUVFnrâŽXðÈX.,ñß7ëä_üåÞ‘ù–!ò·Ÿ}-/Ì­DŽZñ¶»nƒ‰?ÝÈ‘ýƒRrzîÇ–T7Ú?XuÙ´æ;‡Ô•§]³]ŽN R´ë¶fã“Q R´ë¶fã“Y R´ë¶fc“Q R´ë¶fã“Y R´ë™¸äÔCÔ­ø†>Ç2¢mؼoë[¾àf:"ú°+ø“úòȺíI©3K+z‘†Fœ»8Ó­zm˜³“ ÖkÓ0ç&ÀÖkÓ0ç&ÀÞkÓ0ç&ÐÖkÓlÜ›aš_ž_üŸµã~ß[Ö¤NPXDÙ¯FïÁ=ÎçöAÞ’Óh¥©;l;ܬ8Gå—æ_æÏ˜?4µ«y¦äº!?W¶Ž« {"~¶5fîNtºm,4â¢>=K¶Å„@lþMþDù£ó¿PúŸ–áô4¸X ½F`DޤçztEß¡n+ñ }icÑ‹—>ƒ©ýCÍʆ.'ìÿäçäG•ÿ%4ÿ©ybWQ•@ºÔ'Ï1ëJþÂW¢.ÿ&« ]Ú95†åË è?îd`"öŒÀdìUØ«±Wb®Å]Чº—®üÅp-lWáÉ!û(­õ_ÄwñÍþ‹´OLùýÿµÑë4>ª<¾ç—æÕÖ;v*ìUØ«±Wb«]E(à2°¡pAÅ_œÿóßó„–ÚáŸÎ?“QÇi¨šÉ>“PJz“;FßäÝŸÙáJ7QÙ~Ðz3n?Ô{ûýüýí3Å|Ÿ–šæ‰w6‘¬A%­í»˜æ†d(èèe4 çe ‰‹‰°\YAö§äWüåõÿ”Ö*~e´ºŽˆ´Ho>ÝͰèWycãQöK4úîÈ=Xö=Ýê.}'ñ~ŒZêz™¬b×<¿så…ÂóŠhX2°ùŽã¡pv49¡£Rغ©ÄÇbÅõ+N¹•ŽMD0JÓ®fc“Q R´ë™¸äÖCÔ­:æn95óÍ^Ö‘¹ÿ$þ¬Ì„˜»åÿ¬bôÜSòšú¶Q·‹7ëË¡ÉÑëö™LÓ­ºm•ÎN ëNµé˜s“` ëN¶é˜s“h ïNµé˜s“` æÂÜ(æÔ I=Ì9ɰÊÿœ?ó•úËåŸË'K‹áT—R h¢=)5ßå€vçÛ;KÙ¼~¬œ»¿[³Óè‰Þ_'çÖ§«Ýj·2êZœÒ\]LÅä–V,ìÇ©$îNnâEkW'Üó_ó…úŸžý7þi¬Úg—Ú’Cd> «¥ê Wx£>'ãaöB‚¯œçjvüpú1o.þƒõŸ³îra‡½úÓåÿ/ižTÓàòÿ–í"²Ó­—„P@¡QGÈu$îIÜÉ$ç—,²ž)'«’'9v*ìUØ«±Wb®ÅYw•|¡sæYy-c³CûÉHÿ…_ú»æ¯Y¼÷9z]!Ì|»ßHéZU¶n¶:z‰~ò{’{“œÖ\²Êx¤ô8± b¢˜åmŽÅ]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«óËóþ}ƒùùŸæm[óÍVš³ëÕä××m¢ñ¡–f,ÅT.§aЦ¿–óìÿÈʽjßÍúO—¤Ôu;I[fÕn庎)Õ\BÄDÌê]‰Ýh@8«ïŒUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»ÿÕûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]мkΗœùê¾_O‹íIn½ýÓþiû¼3u¢íôÏçúÝF³AüPù~§ŠA¡ë›§NÖ;v*ìUØ«±Wb¯ž?=ç¼³ùáhfÔê>a‰8Ûjp¨æ)Ñ%]½Dö&£öYw®Ï³»Vz3¶ñê?Wqc( ?¿5(<Ñù3ª~ƒó¥©$,m®ã«[Ü(ý¨ßÇ¥TÑÖ£’ŠŒï4züz¸ñ@ûÇPãK&”ßÞaü¤½úÆ…/­§JÀÜØLI†Qâ?‘éÑ×KðäµZHjüú6˜d¿R?/?6ü¹ù¹cõß.ÍéÞÆ ÜØÊ@š#òý¥¯G]¼hßç³i¥§5/›¤Ï§–#ºu©ZuÛ'ŽN) R´ë¶fc“Q R´ë¶fã“Y:Ö­i¦Ÿ²ß«3qÉ€¾ úÆ[o[À÷¯Ëøým.)?Êø‘ËAÙæûD~ôü>ç°éö½3rqgz}·M³rliöÝ3rl:ÕüÃ¥y7O}wÌ—)kgV~¬{*¨Ý˜ö˜Ü'! ß‹Èh>üÝÿœŠÕ|ÿêèz=?Ëæªb’ÎØìUØ«±Wb®Å]Š»z'“¼‹6ºË¨ž Gf’—ÛÄýÞÚÝf¼aôÇs÷; &ˆåÞ[½ô-­¬VQ%­¢âAEUg=).ú1ò,Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å_ÿÖûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»y§œ¼…²RÒ€Žû«/E“çàÞýûøæÏE¯8½2å÷:íf„dõGŸÞùþx$µ‘­î¤¨J²°¡xŒè#!!aÑJ&&Š–I‹±Wb®Å]Š»v*Åüãä½óJŸÊþp²ŠûM¸RŽ„teaB¬;2ñËpg– q@ÑR-øÛÿ9ÿ8}®þR™üÓäß[Wò’ÕÝÀåsh½|ª>$ýÚ¢ƒöÂl[¸ìÎÜŽ§Ó=¥öwêj”#h^dÔ<·{µ ÜÉi}rŽXšŒñ¡b6;fîqwiž!!Eú7ùAÿ9A¦ùÝbòïžÚ; pÑ#¸ÙmîA×hÜø„Ÿ²A!sK¨Ðœ{Çqö‡Iªìó ã¸} ©ZuÛ)Ç'RCÔ­:홸äÖCÎuÛZA1§ì7êÌÌr`ïάf]½Ÿê_ʘým <^_ø™Élòݨ+)ø}ÏsÓ­zm˜³“„:Ó­ºm˜y$ØüÄüáÑ, 0LEÞ²ëX¬Ñ·èÒØ_øcØR¤W '/¹Øi4RÏ¿!ÞüøóÏæ.³ùƒ|u_1Üs+Q)ðÅŸÙEíîMXþÑ9²Çˆcš8…Eè_’ó~jüô¾ô´þ©£Dánµ9Ôú1øªŒ’Söør* s _ÚxôcÕ¹è:þÀäÆÚÿÉßÈÏ+þIiŸ¢ü§oÊòU[¿˜qpÃù›²ƒöQh£®íV<»´2jås;tã½´ {a%Ø«±Wb®Å]Š»v*õß&~^›®®¾…aÙ£€ì[ݼ·~ûuÓë{G‡Ó}ÿ©Ûhô^©ü¿[ÜUBˆP(Ø3DM» )v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUÿ×ûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ÂüÙäËo2FfJE|£à’›7ù-â=úÃ3tšÓ€×1Ýúœ=VŒfÈ÷þ·Î:Ž›q¤Îö7ñ˜æN ÷ ÷Ç:LyAqyü˜Î3E–5»v*ìUØ«±Wb® C¸8«ó›þr?þprËÍ^¿œÿ&ãŠÇY5’}*¢;kƒÔ˜NË ‡ùv‰¶þïrÝ/fvùÇè͸ïê=ýãí÷ ‡ä~¯¦ßùvö}]¶–ÏPµsÐN…$FC+PŒì¡L\M‚ƒÓŸ“ßó“wÞRyoÎæKýQ#›íOn;PŸ¶ƒùOģ욹‡ŸF%¼v.«YÙƒ'ª°¾ìµÔ´ÿ2ÙG­h7ÝÙL9G,MU>#ØŽ„ÁØŠæn&‹ÍåÆ`jB‹ ó­-§?ñ[þ£™˜äÔïÊO_6÷<´?%bõ¼µm'Œ“ÉÑ”žGµ…f?¹ô ”+ú’¨ –$Ð:’srpb;~fÿÎFŦ¬šåó,—¤—äUÄDÌË?€=A† ÞNÿEÙ$ú²|¿[ãK½B{ùžîîGšâV,îìY™‰Ü’w$æ_' Ž06ÐùÇ/ùÁýKÎ?Wó—æòK§hmI!ÓwK«•ê áŒøxò 1æ»O·†/F-ÏAîï?c>뮇¡iÞY°ƒBòý¬VZ}²á‚ˆ£°ññ;óÉäîç«æ¥Ú;v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUÿÐûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUy‹ËVždƒê÷cŒ«_NP>%?ÄxŒÈÓje€Øø‡Q¦ŽaGæù¯]Ð.ü½plï×cº8û.móG”®¼³7ï?yhç÷s±ö>õöΗK«ŽqçÔ<î§K,'˽Šf[ŠìUØ«±Wb®Å]Š»c^nòv‹çÝ*ãÊþo²ŠÿK¹^2C2Ô{0=U‡Ue!”îË0æ–q@Ñ ŸŠŸó“ó„Úçå?Ö<ãùx&Õü¤µ’D§+«5ê}@ï#ïŶ¢œiÙ½·G¦{Kì?·É¾𮟬\éS¥þ›3ÁsªIa]ŽãÄl}³zwgšY›é=A´òý¸³°Zww?iω?àÎk>¢YÉè°`ŽA:ÊŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WÿÓûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb«]E1È+" ƒØá”‹xWœÿ/šÇž«¡)kµ$#ržëâ¾ÝG˦÷EÚ~™óïïtšÍª»žM›wTìUØ«±Wb®Å]Š»v*µË+kúÝu½Êë^ÓA[KÙaVš |ŠìwZý’IZrØj'˜@<Ã!23\©‹±Wb®Å]Š»v*ìUØ«5ò—“.<É žJÅb§â’›·²xŸ~ƒðÌ^´`Ì÷~·7K£9òÿ©ôvŸ§[éP-•„b8S ¬žçÜç7“!Èn\Þƒ1ŒTQ¹nÅ]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WÿÔûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š¼ÎŸ—ËwÏUÐP,û´ ƒø•ð>Ýþ}vú.ÑáôÏ—B굚/T9÷<5Ñ£c€«) ‚(AŽoA·JE-‡b®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«Ó<›ä5Ž:–¬ v=U:4ŸÑ}ûöñÍ^·´/LyýÎËG¡9=Rå÷½þ#¶`·P‘ ¢ªŠ=†sò‘‘²ïDDE\ v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»ÿÕûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»yçœ|‹¼­}aH¯Àù,žÍà|ßí±ÑëÎL·s«Ñ »Çc÷¾zºµšÊW´»CÈhÊ„è¡11aÐJ&&Š$ÅØ«±Wb®Å]Š»v*ìUØ«±Wb®Å[» UìÞKü¼¯ WÌ ¶Í»~Çük÷øf—[Ú?ÃâWëw=ñOåúÿSÚPliÃx«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WÿÖûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ļÓå_2ÅV¤wˆ?w0ü›Ä~®Þùz]d°ñÜâê´ƒ0óï|ݪé7Z-ÃXêRUû˜v ÷:\Y£”qEçrâ8ÍI-ËZÝŠ»v*ìUØ«±Wb®Å]Š»T†¸u‚/#ªª*I= YH°{ï“<ƒ“ÃSÕÀ{ÝŠ'Uú·¿AÛÇ9ýohž˜rûÿc½ÑèF?T¹ýßµéù«vNÅ]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»ÿ×ûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìU#×¼¿iæ+ª_®ãt‘~ÒXï—éõÂn-9ðG0¢ù¯Ì>\»òåÇÕ¯Ecjúr²ãÛßÄgM§ÔÇ8±òyÝFžXM›̇Ø«±Wb®Å]Š»v*ìUa§Üj“¥•ŒfIœÐ(ýgÀç!“ Æ.\™Ã™ ú7Ê>K·òÚ ‰©-ûŠNË^¡}½úŸÃ9½f´ç46ŽoA¤ÑŒ;Ïã“7Ì5Ø«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å_ÿÐûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUتRÓ-µ{v±ÔI ö=AìAìFY‹)Æx¢Ã&1TŸ8y¯É×>Z“Ô–ÉÏÁ(?ÉoøÀtšM`Î;wêyíVá=㽆æk†ìUØ«±Wb®Å]Ч&…w¯Ü ==*z³Ÿ²ƒÅù×¶QŸ‹k¡[­–žœPnIûL|X÷9ÍfÍ,¦äô8pǨ¦¹Sk±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ÿÿÒûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb­2†XTˆ8«Ä¼éùzbç«h Tݤ·G‰Ooò~ï¼Ñvúgð?¯õºmf‚½Pù~§ŽæåÔ;v*Ï<¡ä‰üÂÂîê±iêwÚzv_âz|ó_¬× ; ÏÝïs´š#›s°ûßEYYA§B–vQ¬p ¢ªóßÄç;9™›;— „VA“±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUÿÓûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]м³Î—é©òÕ4U wÕâ '¸ìð?=ók¢íÓ>]ýß±Ök4~¨sîïx,‘¼.ÑL¥]I ¬(AˆÍø7¸tdVÅê^Lü¿mK†©­©K]™"èÒx࿉ùf«[Ú˜sïîý®ÏG ãõO—wì{Äq¤(±D¡Q@  P:3BMî]ذ_.Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb¯ÿÔûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»H/|¯¦ê‘ê·p+\Gß³S§!Þ«™ÕNáf‰é¡9qº˜íîÅ]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š¿ÿÕûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WÿÖûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wÿ×ûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WÿÐûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WÿÑûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WÿÒûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WÿÓûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WÿÔûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WÿÕûùŠ»S–TyØ$h 31 nI' « ÿ•¡äÏú˜´úO·ÿšñWÊÐògýLZGý'ÛÿÍx«¿åhy3þ¦-#þ“íÿæ¼UèÞcÒ|Æ?—¯ío㌅vµ& Nà„ÐüñTçv*‘k^hѼ·éÿˆµ;[—§õ«ˆáçÆ•ãÌŠÒ¢´ñÅR/ùZLÿ©‹Hÿ¤ûù¯wü­&ÔŤÒ}¿ü׊¶?4<šM˜´‚Oü¿ÛÿÍx«9Å]Š»a2þeùBh'ó’’!*Ê×ÐØ‚ ìF*§ÿ+CÉŸõ1iôŸoÿ5â®ÿ•¡äÏú˜´úO·ÿšñTïEóf‰æF’?/jVWïAkqÅAèX#WµqTÿv*”ëö™åèVó_½¶±·f²]L‘!b È &žØ«ÿ•¡äÏú˜´úO·ÿšñWÊÐògýLZGý'ÛÿÍx«¿åhy3þ¦-#þ“íÿæ¼Uš[ÜEywv’,°JªñÈŒYXT2‘±nÅU±Wb¬BûóÊÚ]Äš~§®i–÷Q2E5ä(è|Y犡?åhy3þ¦-#þ“íÿæ¼Ußò´<™ÿS‘ÿIöÿó^*™é>vòî¿?Ô4-^Âöç‰JÚê)_ˆêx£A㊲|UتRÕ,´kwÔµ‹˜m-#§9§‘cjh*Ì@&ƒ~¸«ÿ•¡äÏú˜´úO·ÿšñWÊÐògýLZGý'ÛÿÍx«¿åhy3þ¦-#þ“íÿæ¼U–éú•¦¯o£¥OÕ¤ ˜æÖHØCÅ”wØâ¨ÜUØ«Õ|ñåÍ àéúÞ±§ÙÝ( a¸»Š'î W`h{b©oü­&ÔŤÒ}¿ü׊»þV‡“?êbÒ?é>ßþkÅQºŸü±«ÜG§iZÞ›uw)"8`¼†ISÅU‰; ì1V[Š»CÝÝÁa —·Ò¤6ñ)y$‘‚¢(%˜Ð;“аßùZLÿ©‹Hÿ¤ûù¯wü­&ÔŤÒ}¿ü׊»þV‡“?êbÒ?é>ßþkÅY6‘®iÞ`€ßh7–÷¶ÁŠm¥ISê9!"¢£lU4Å]бígÍÚ—$K0ê–Vȼ‘.®c…™kJ€ì ßò´<™ÿS‘ÿIöÿó^*ïùZLÿ©‹Hÿ¤ûù¯U·üÉòÔ©kk¯éRM#DK虘ÐÔ’vb¬×v*Ó0PYܓаoùZLÿ©‹Hÿ¤ûù¯wü­&ÔŤÒ}¿ü׊»þV‡“?êbÒ?é>ßþkÅSýÌÚ?™Gòî¡i~±$6³Ç0BÝ9p&•¡¥qTïv*’k^fÑü¶±¿˜µ K”‘ºž8C•ëÇ™¥EiФò´<™ÿS‘ÿIöÿó^*ïùZLÿ©‹Hÿ¤ûù¯wü­&ÔŤÒ}¿ü׊³„uu„" Á]Š»aW™>Qµ•ínµý*9£bŽ}²²šAz‚ÄUKþV‡“?êbÒ?é>ßþkÅ]ÿ+CÉŸõ1iôŸoÿ5â©Æç ÌRµ¯—õKù‘yºZÜÅ3*Ö•!*i\U‘b®ÅR½_\Ó¼¿¾×¯-ì­‹ÜÊ‘'#ÐrrMØ«ÿ•¡äÏú˜´úO·ÿšñWÊÐògýLZGý'ÛÿÍx«¿åhy3þ¦-#þ“íÿæ¼U™Z]Á w¶2¤Öò¨xäƒ#©XT{Š¢1Wb¬KPóÿ–4‹‰4íW[Ómnâ I ÷Ç"’*9+0#c]Æ*‚ÿ•¡äÏú˜´úO·ÿšñWÊÐògýLZGý'ÛÿÍxªe¥yãËšíÀÓôMcO¼º`XCow®@ܨÄÐwÅYF*ìU¨jVšE¼šŽ«ßþkÅY^™ªÙkVé¨è×0ÝÚI^[ȲFÔ44e$ºâ¨üUØ«Õüëåï/Î,uíZÂÊä¨qÍÔQ?Ðñv†‡|U+ÿ•¡äÏú˜´úO·ÿšñWÊÐògýLZGý'ÛÿÍxª*Çó ʺœñØiºæ™qu+Ž(¯awv=•U‰'Øb¬Ãv*£qqœR]ÝȱA³É#°UUQRÌNÀ¹'aò´<™ÿS‘ÿIöÿó^*ïùZLÿ©‹Hÿ¤ûù¯wü­&ÔŤÒ}¿ü׊²M^Ó<à ^h¶×ÖêÅKY’T %K!"´ ÓßM±Wb©µæÍËm~aÔ¬¬PLbêâ8KÔ¨v§zb©'ü­&ÔŤÒ}¿ü׊»þV‡“?êbÒ?é>ßþkÅU"üËò„î°Aæ %ärUo $“°ÜœU›b®Å]аfüÏòr’­æ ±þßþkÅZÿ•¡äÏú˜´úO·ÿšñWÊÐògýLZGý'ÛÿÍxª{¢ù£Fó'©þÔlïý>§Õn#›‡*Ó—iZWÃOqWb©>³æ-+Ë‘¥Ï˜o­l"‘¸#ÝL«5+@\€M;b¬wþV‡“?êbÒ?é>ßþkÅ]ÿ+CÉŸõ1iôŸoÿ5â®ÿ•¡äÏú˜´úO·ÿšñVm©:,ð0xÜVSPAÜGPqULUØ« ºüÆòŒÒYÞëÚ\71I#’öte4*Ê^ ƒ±Pÿ•¡äÏú˜´úO·ÿšñWÊÐògýLZGý'ÛÿÍxªm£ùËËþa™¬ô VÆúáT»Gks® F&• Wßd˜«±T·UÖtýÜêåÜV …2Üʱ ' ää žØ«ÿ•¡äÏú˜´úO·ÿšñWÊÐògýLZGý'ÛÿÍx«¿åhy3þ¦-#þ“íÿæ¼U—ØßÛj–ñêdÑÜZÊ9G,.x«) –*‹Å]бMKÏžYÑ®MÖ5­:Òî:s†{¸c‘j**¬ÀŠƒQ·LUÿ+CÉŸõ1iôŸoÿ5â®ÿ•¡äÏú˜´úO·ÿšñT~›çÏ,ë7 ¦èúÖww%xCÜ2HÔ4UbM©Û¦*ÊñWb¨Këûm.ÞMCSš;{X‡)%™Â"f óÅX‡ü­&ÔŤÒ}¿ü׊»þV‡“?êbÒ?é>ßþkÅ]ÿ+CÉŸõ1iôŸoÿ5⬧KÕì5ËuÔtK¨/-³[Ȳ¡ ЀÊHØõßLqWb¬oXó——ü½2Ùëú­Ã(uŽêæ(œ©$ ì *¯¶*”ÿÊÐògýLZGý'ÛÿÍx«¿åhy3þ¦-#þ“íÿæ¼Uiù‹åMBxìl5Ý.{™˜$qE{»³U I$ôfX«±U9eH§‚F€³3ä’zаŸùZLÿ©‹Hÿ¤ûù¯wü­&ÔŤÒ}¿ü׊»þV‡“?êbÒ?é>ßþkÅYæ-+Ìq½Ï—¯­oâ¸;ÚÌ“*µ+BP ;b©Æ*ìU"ּѣyoÓÿj6v·/OëWÃÏ+Ç™¥Ei㊤_ò´<™ÿS‘ÿIöÿó^*ïùZLÿ©‹Hÿ¤ûù¯m3üœÄ*ù‡H$ì¿·ÿšñVsŠ»v*Â$üÌò|.ÑKæ %]IVV¾€FÄ_b1UŸò´<™ÿS‘ÿIöÿó^*ïùZLÿ©‹Hÿ¤ûù¯Nô_5èždi˺•ûDZÜG1@Ý9pcJÐÒ¸ªŠ»JuLòô+wæ Ûk¸,—S$JZ• .@&ƒ¦*Æÿåhy3þ¦-#þ“íÿæ¼Ußò´<™ÿS‘ÿIöÿó^*ïùZLÿ©‹Hÿ¤ûù¯f¶÷]D—V®²C"‡GBYXTFĸ#UÅ]аûïÌ/*é“Éa©kše½ÔLVH¥½…vefcŠ¡åhy3þ¦-#þ“íÿæ¼Ußò´<™ÿS‘ÿIöÿó^*šiuò÷˜'6:­a{r¹ŠÚê)_ˆêx£AQ¾*ɱWb©~©«Xè–Í©k70ÚZ%Íq"Çò4f “A¿\UŠÿÊÐògýLZGý'ÛÿÍx«¿åhy3þ¦-#þ“íÿæ¼Ußò´<™ÿS‘ÿIöÿó^*ËtýJÓW·QÒ§ŠêÒPLs@ë$l¡âÊH;ŠlqTn*ìUŠêžzòÞ‡pÚvµ¬éÖwhhn.áŽ@TUY±T¿þV‡“?êbÒ?é>ßþkÅ]ÿ+CÉŸõ1iôŸoÿ5â¨Ý?ÏþXÕî#Ó´­oMº»”‘0^C$Œ@©âªÄ…v«-Å]Š¡¯/môè$¾Ô%Ž hT¼’ÊÁu,Æ€âqVÿ+CÉŸõ1iôŸoÿ5â®ÿ•¡äÏú˜´úO·ÿšñWÊÐògýLZGý'ÛÿÍx«&Ò5Í;ÌíòÞöØ1C-´©*rG$$TTmЦ˜«±V;¬ùÃAòì«kæ RÆÂg^h—W1B̵¥@vŠŠWIÿåhy3þ¦-#þ“íÿæ¼Ußò´<™ÿS‘ÿIöÿó^*ÿÿÖûùŠ»C^ÙÁ¨Û˧ßF³[OE,n*®Ž(ÊGpA¡Å^'ÿBÍù[ÿR½‡ü ÍX«¿èY¿+êW°ÿoù«wý 7åoýJöð-ÿ5b¯@ògåÏ–.âžÛÉ:e¾›Ë+Ì Zs*Z’I4©§Ìøâ¬×v*ÀüéùaåOÌF·;i6Ú“Z4êI@ôä Uƒг~VÿÔ¯aÿßóV*ïúoÊßú•ì?à[þjÅ[óŒß•À×ü/§ÿÀ7üÕŠ½ÉbQ`*((ªìUØ«Ä.?ç,n¥{™ü±§™$bìx0©cS°4ÅTèY¿+êW°ÿoù«wý 7åoýJöð-ÿ5b¬ËÉ¿”þPü½žkÿ%höºuÅÂ¥’!™¯I;W|Uèx«±V#ç!ùóÒ=+Κt¤R‰£Žu¨W¯!JhHÅ^qÿBÍù[ÿR½‡ü ÍX«¿èY¿+êW°ÿoù«wý 7åoýJöð-ÿ5b¯eÒ´«= ÊßFÑáK{X’!ŒQR4UÀЦ«±Wk_óÿ—~b¾¸×5¿.Ù\_ÝHÒÏ3«rwn¬hFç¾*•ÿг~VÿÔ¯aÿßóV*ïúoÊßú•ì?à[þjÅY'•?%|ä}Auÿ)èv–:Š#"ÏžA\Q€$ž£zŽ*ìUù£ÊºG4é<½æ«H¯´ÙŠ4L*¬Qƒ)ÚyWý 7åoýJöð-ÿ5b®ÿ¡fü­ÿ©^Ãþ¿æ¬Ußô,ß•¿õ+ØÀ·üÕŠ½cË^YÒüŸ¦ÁåÏ,ZÇe¦[sô`ˆQ›—j|Ù‰>çOqWb¯+óG䇑<é¨Éæ4è6wº”ÁIåSÍ‚(U©VŠù Uг~VÿÔ¯aÿßóV*ïúoÊßú•ì?à[þjÅSòò÷Êú„þåë+]BÕ¹Ã2)äJTT÷Å^»Š»K5­ÇÌV7¹]X]FÑO ‚ªèÝA«ÇèY¿+êW°ÿoù«wý 7åoýJöð-ÿ5b®ÿ¡fü­ÿ©^Ãþ¿æ¬Ué~PòFƒä &Ñ|›abò´í Ei,z’HUðeX«±WœùÇò‹É¿˜7qj¾tÑ­uÈbÇ,ÊKà PFÀ±?IÅX‡ý 7åoýJöð-ÿ5b®ÿ¡fü­ÿ©^Ãþ¿æ¬Ueÿ8ãùg§ÜEg回 XÛƒ,† Ð’6#¾*ö¼UتÄÝDö·(²C"”taUeaB=AqWˆг~VÿÔ¯aÿßóV*ïúoÊßú•ì?à[þjÅ]ÿBÍù[ÿR½‡ü ÍX«=ò_å§•ÿ.–å<‘¥Ûé¢ì¡ŸÐR žxr$’xòj|ÏŽ*Î1Wb¬Ο–žWüÅ[dó¾—o© Bæ]I1ú”çÄ‚åÅkò«ÿ¡fü­ÿ©^Ãþ¿æ¬Ußô,ß•¿õ+ØÀ·üÕŠ»þ…›ò·þ¥{øÿš±W·ÛÁ¬Ikl‹1¨DEUUÐÓVÅ]мR÷þqÇòÏP¸–þóË6<ò4²7™ÍI  nOlU ÿBÍù[ÿR½‡ü ÍX«¿èY¿+êW°ÿoù«eÞNü¡òoåõÜš·“4k]:òhŒ4*CË+RNĨ${ Uèø«±V+æÿ$h>²]ÎVj6)*αNµU‘APáa_qWšг~VÿÔ¯aÿßóV*ïúoÊßú•ì?à[þjÅ]ÿBÍù[ÿR½‡ü ÍX«ØtMÃË–ú…o®ŸkŠbTQÐЦ˜«±W‘kÿŸ—¾hÔ'×õÿ/Y]jMÎi'jSBh1TŸþ…›ò·þ¥{øÿš±Wг~VÿÔ¯aÿßóV*È<±ùä?&j1y‹ÊÚ –¥qñ)æ¡Ô«P’iU$|‰Å^«Š»I<Çå½/Íútþ]ó5¬WºmÈQ5¼Â¨üX:Ô{0x*ò_úoÊßú•ì?à[þjÅ]ÿBÍù[ÿR½‡ü ÍX«¿èY¿+êW°ÿoù«zŸ•¼¥£ù'OO/ùNÎ+ :6gXaPÎjÇÆ¤â¬‹v*ó6~KùÏWç]óv‡i¨XÌÒ©äU~È$Ò¸«ÿ¡fü­ÿ©^Ãþ¿æ¬Ußô,ß•¿õ+ØÀ·üÕŠ¦z?üãïå×—ï­õÍ˶V÷ö’,ÐLŠÜ‘ÔÕXTõqн‹v*€Õ4ËMnÎãFÕ¢[‹+¸ž âqUxäR¬¤xH8«ÆèY¿+êW°ÿoù«wý 7åoýJöð-ÿ5b®ÿ¡fü­ÿ©^Ãþ¿æ¬UèÞMò—¿/­eÒü—§Á§ZÍ/­$p?¼IÞ€ U—â®Å^yç/Ê(~aO ÿt{]FâÝ QI2’ʄ׈ «¾*ÃèY¿+êW°ÿoù«wý 7åoýJöð-ÿ5bª°Î6~X[H—ùbÁdƒ)àÆ„ާ{†*ìUk¢º”p ‘BàƒŠ¼4ÿÎ3~W_ð¾ŸÿßóV*×ý 7åoýJöð-ÿ5b®ÿ¡fü­ÿ©^Ãþ¿æ¬Uœù/òÃÊŸ—mpþIÒm´Ö»'h‚á+ÄI48«<Å]а¯9þ\ùgó(-¼í¦[êQÛ3<"u¯À¡Z ü‡†*óÿúoÊßú•ì?à[þjÅ]ÿBÍù[ÿR½‡ü ÍX«¿èY¿+êW°ÿoù«{e•œu¼Z}Œk ´¬QF‚Šˆ‚Š v UŠ»x¾¥ÿ8íùm«ÝϪê>Z°–îæWši YÜ–f4 T“\UÿBÍù[ÿR½‡ü ÍX«¿èY¿+êW°ÿoù«e^PüòWo[Zòv‰i§ß/ùvÚ;=:ÕxCBˆ€’M¹$Ÿ|U8Å]м›Ì‘>@óv£7˜|Éåû+½J䩚yòrªB7 HÿèY¿+êW°ÿoù«wý 7åoýJöð-ÿ5b©ç—?"|åF0ùoËöVš•±c ñ¡ä…”©"¤ïBF*õœUتO¯èwštùü¿æ+hï4ë¥á4Š£€AÄ=ñW‘г~VÿÔ¯aÿßóV*ïúoÊßú•ì?à[þjÅ]ÿBÍù[ÿR½‡ü ÍX«Óü§äÝȶBò…Œ:}€v—Ñ„Qy·V>$Ðb¬›v*óO7þNù+Ï׫­yÇD´Ô/’%„M2ž\’ Š€IÅX¯ý 7åoýJöð-ÿ5b®ÿ¡fü­ÿ©^Ãþ¿æ¬U¦ÿÎ;þ[h÷pjÚo–ìb»µ•&†@ŒJHŒXT‘P@8«ÙñWb¨[Û(5+y´ëøÖ[kˆÞ)cqUtqÅ” *ñOúoÊßú•ì?à[þjÅ]ÿBÍù[ÿR½‡ü ÍX«¿èY¿+êW°ÿoù«z“?.¼µùyö¾IÓ-ôØ®Y^a‘Í”PI'`vÅY¦*ìUyÓò»ÊŸ˜o/´«}Ií¬pI@ôäëAаúoÊßú•ì?à[þjÅ]ÿBÍù[ÿR½‡ü ÍX«cþq›ò¸ÿ…ôÿøÿš±Wºb®Å]м:_ùÆ¯Ë ¦—ËÜ–cÁ·'sûXªŸý 7åoýJöð-ÿ5b®ÿ¡fü­ÿ©^Ãþ¿æ¬Ušù3ò«Ê_—’Ïwä"ÛNšåU&x‚ʦ IÚ¸«Ð1Wb¬;Î_—þ\ü·‹Oó®£ož¬I:׋ЭE=*ó¿úoÊßú•ì?à[þjÅ]ÿBÍù[ÿR½‡ü ÍX«¿èY¿+êW°ÿoù«{F›§Zèöi:\I¬IÆ(±Ç…UQØ(Š£qWb¯Õÿç?.uëëoWòåŒ÷×r¼ÓÊÈy<ŽjÌhF䚟|U.ÿ¡fü­ÿ©^Ãþ¿æ¬Ußô,ß•¿õ+ØÀ·üÕŠ²)þLy#È·ÿ§|£¡ÚXj6ˆMžAZœ€$šV˜«Ó±Wb¬sÍ^QѼ茶æË(oô÷ev†eªòCU> ƒáм·þ…›ò·þ¥{øÿš±Wг~VÿÔ¯aÿßóV*ïúoÊßú•ì?à[þjÅ^µåÏ-é~PÓ òï–mb²ÓmƒmáDäÅڃ݉'Ä’qTïv*òŸ3þGy ÎzŒ¾bóFƒg{©NKq"oÁB/"­=€ªAÿBÍù[ÿR½‡ü ÍX«¿èY¿+êW°ÿoù«N4ÈOËß+êkú—¬­u Vç ȇ’5¨©"´8«×qWb©^·¢XyŽÂãB×mãºÓî£1M ¢ªêz‚1Wг~VÿÔ¯aÿßóV*ïúoÊßú•ì?à[þjÅ]ÿBÍù[ÿR½‡ü ÍX«Òü¡äÈM¢ù6 :ÅåiÚ(ŠÒ0 Xõ$ª+à*ʱWb¯8óå“0nãÕ¼ç£Zê7Ä I¦RXF°Z‚6‰Üøâ¬Gþ…›ò·þ¥{øÿš±Wг~VÿÔ¯aÿßóV*ÿÿ×ûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WÿÐûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WÿÑûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WÿÒûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WÿÓûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WÿÔûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WÿÕûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WÿÖûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wÿ×ûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WÿÐûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WÿÑûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ù“Í:/“l$×üß©YéZd_Þ]_ÜGo wø¤ªŽÎ*üÙüáÿŸ·~Gþ[ú¶Nž÷Î:¢UBipúv¡¿Ê¹Ÿ‚•ÿ*%˜~4UùAùÅÿ?|üèüÂiþ@K&i’T/Ô£WœOPׂ ø4pÄñÅ^÷ùù•æï1Î~mùó^×µKÏ2§š“S¸½šKµ*šM8ÌÌ\R¦”m»b¯’¿&¿çêžÿ•޳ªÃæí)h ú¦¹[¤)9cã#È£¯¸«õƒòkþ#ùQçQ‡æÆŸ¨y;Pjš‡P±ðþòOc:¾*ý@ü¿üÒò澟ú{òÓ]ÓµÛ@Òé÷1Α^.’þKÃÃg¸«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å_ÿÒûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®ÅRÝ_YÓü¿i.±¯]Ácaò–âæUŠ$,îBó8«ó¿óþ~§ùùTÒéú6©?›µXþCAŒM.Õº¤|LO)ËŠ¿(8ÿçò›>til?*tý?ÉÚsl“…õ:o,Ê!ë´—³ž¸«ò÷Ïß™þnüÓÔ_üÈ×5sP$‘6¡s$åAìœÉ¾  (LU‚â®Å_³ßóŽ¿üïÍßü Ÿþ!¤b¯ÆUت}å¿4ë^M¿_ò†¥y¥jqwuaq%¼Éßá’2¬:v8«ôòoþ~Õùßùf"Ó¼ß=Ÿœ´´Ø®­K ¿äÝCʼnÿ*U›õQWêÿäçüýûòcób±üÃKÿ%ê³}r3weÈô sn¥©âÒCUúeäï<ùsóNÌ~CÕ¬u­*_±u§ÜÇq>ãfÇQßeX«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUë>jÒ<¾ Õï"…€¯ÕsòAV?vj{G·t½ž?’1ò»—úQrû½6ƒ.£è‰>}>|žA­þ{ZÃÊ//Ú<͸Nx/Ì(©#æW<ÿ´¿à¡Ž4ØÌ¿¥?HÿJ,Ÿ‰‹Ðé½–‘ß,«Èn~Ú¿üÅÕ,¼£§y¹V»¹»xäR‡@e°7®d꽯Ôáì¼ZÐ"g<†2xxo&Ã{Hê׋±ñOU<Ј#}ïÓúËZçž›wHµËy-»§ïæh {3þ º|»j"`{Ç®?¢CäWUì¾HoŒ‰yêûC×4­N×ÕÒ.¢¸TˆØ>c¨úFwÚÕÓë…àœeî;xæ>!çóé2`58‘ïMó=Çv*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®ÅVI"B¦IX* Ë1 N/’ ®l'TüÄÑ´Ú¤r›™ìÂ*?àî'3±vvIô¯{‡—_ŽoÜÀfüÏ¿¿¹ŠÞÆ(íâyI?П·á™ã²áLíîpOiJd·Úy¯Ï‡—uv´·Ëmé£puéQ½¡ûë”é40ÍŽÎÅ»U­–Ðä™išeåPWµõ$sO¼o÷Œ«/eÎ?NÿalÅÚP—Õ³Ð,ïíµõìeI£ñF~¯ž3RçÂbbÁ´^A“±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ÿÿÓûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUتòòßN‚KíBXඉKÉ,¬GRÌh'|ùËÿ?4ü…ü2XþŸÿj±×ý˪·›ôÞã’Û ö#Õ,?—~OþrÏçÿ1¼ÎeÓÿ&4K+Y„»»¦¡{ìÚ­ºW¯ŠZ7НË?Ìßο>~s^þ—üÓó¥®Üä‚òáž8ÏüWDqú"¨Å^_Š»v*ú‡ò#þp×ósþr6HåüµòíÃéÔm^÷ýÁ@4$O%œOUˆHãùqWí·äüù£ÈþRô5¿Ï½Zo4jBŒÚu‰{M=[o…œq0Ù€ÐÆqWë6ƒùSä¿+ùq¿.<½åí.ÏÊÎŒ’ipÙ¶²7©.Zƒ‘`KubN*üáüýÿŸF~RþhzúÏå‹ÍäuêÁl××ӿʵv<£$j7<â¯ÄoÏÏù÷gç_䯩jÚk¾^Чô®‡ÎîASÊX‰¢}¦x°vÅ_ â®Å]вß&yûÌß—Z‚ùƒÈÆ¡¢jK@.të©m¤¥kBѲ’=ŽÇ~›~NÿÏàÿ9<€!Ó¿1`Óüç¦Æ–ºO©Þ•¸xº³Á#¥«Zªý_üžÿŸ³~F~eúV>j»¼ò~¨ô=^Vżæhü©D?.•UúAåÿ2im±‹^ò­ý®§¦N+Õ”ñÏ ’2Ê~ƒŠ§X«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±T›Wó™ §©¬]En)P‡#ò^§è®×ö¶Ÿ@/<ãyÜû‡3ðNŸG“PkIüwòy¹ùé§Úò‹A¶’éú $>š|ÀÝÒ8Óÿ‚v ^4 Ï|½1ùo#ñz /²ù'¾B#ä7?«ïxö·ù£æ-s’=Ѷ„ÿºí¿v)þ·Ú?KgŸv—¶úývÆ|ºŸ·êùÉèt½‡ƒðÙï–ÿg/±çîí#rY‰©$Ô“œœ¤dl»p+’Ü {N¹ÿ’×Gÿ˜çÿ‰\g£öŸüãúøiûó<Ö—þ42T}Ðx¶yÃÒªÃ<–Î&·vŽEÜ2ù“Ç–XÏIuÍŒ¢$(îô­ósÌ:=#ža{ý›É¿àÅ¿2~YÙvg·ÚíÒ—ˆ;§¹ÿL*_2}ΗUìþ Û£ú¹=‡CüïÑïé³–27÷‘ýê9Âý9è=™ÿ­.}³ƒŒ÷ýqùÅþÇâóÚ¯frãßûÛ·Úõ7W²Ö#úÆ•qÄ}ÌnžÆÏ;Í¿²a1̶—b®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±V™‚Î@rN Z°íSϺ6—TiýyGì@9þ?gñÌÜZ ™:W¿ñn]v<}oÜó}SóVözÇ¥B–éÙßãŸeqÍ–.ɈúýŽ¿/jHý"žw¨j÷º«zšŒòLz€Í°ùƒèÍŽ<1ÇôŠuù2Ë'Ôm-ËZѺoû×oÿSþ$2¼¿I÷xþ¡ïfŸ™¿ñÛøÅêÌ.Ìþïâ\ÎÒþóà}›^Þêk7ÚHñH:21S÷ŒŒ $(îÊ21ÜlÏt¿ÌÍZƉwÂê1þüj¬?ˆ9¯ËÙ˜çËg;hÎ<÷zF—ù™¤ßQ/9ÚÈœUkþ²ÿ3[—³2C–îÃhÂ\ög¶÷PÞ žÒD–3Ñ‘ƒ¼f bhìçFB[Õò,Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ÿÿÔûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«øíÿŸ‚ùóóûó—Î_—¾ó§©iV³qú:Æâáþ­¬§Ö· ¤`¬Nƒ˜^MJ’qW¸«±WbªöÖ³^Ì–vq¼ÓÊÁ#Ž5,ÌÇ` É=€Å_¤Ÿ_óêÿÎÎS«æ‹5ò_—ä*MδŒ·L‡©ŽÈRZ¸ú*ÝŸ~Ûþ@ϯ¿%¿$D®³§Ÿ8yŽ*1½ÖÕd…\wŠÌ~å@"«ê ]OI1Wè´0¥º,*¤H¡UT@*©Š»v*ìUñwç÷üàäÇüäG­¨ù§B]/Ì’ÇXѸÚ]–=ZJ)Šb|fÛÀŒUøùùÿ>üÒü¹õµ¯Ê+˜<ë£ gô#×QEšÀìc’ƒaéÈ]H‡LUùMæ-êÞRÔ'ò÷š¬n´ÝRÙŠOiy Á4l;Óÿ‚^—Úxœ‡¿èÚ8¿Ø{Ði}˜Ë“|„Gí?«íxö¹ùµæf©âη aÄÿÁš·ÜGË<û´ý¼×kvðÇt6ÿe¼¾D{ž‡KØ0nGþ–ÿg'›Ë4—f™äcRÌI$û“œ~L’Èx¤I'©Ü»˜ÄDPÙO ÉØ«ó/›4_&Ù¶¯æ»û}>ÍÝ—2*|¦¬|©>‘¦ÒdÔˇLp äø«Î¿ó›PÝÜŸ-þHè—:þ©!áóE"ÄOb§ï¤?KéÎËEìYˆñ5sP¿Œ¤²o޲bòyÃþrÏK²‹Ì÷ΗÚPSô y%™H‚:H+ê7ØÌzIöFork»3Q€h ˆ„MÄîöxˆþ”¹ŽöèÓ.30=Gb~_¨=ò÷þsk˺´£DüϱŸËz²ž;«Km˦ä(’2OfB«Ýûç9ÚÆeÆ8ôò#ò—ê?ðm–9nû+HÖ´ÿ0ZǪèWP^ÙJ+Öò,‘°öe$ãóa–pÌGB(´IžV®ÅQ·sØÈ.,¥xe6*Ãé9n DðK‹ŒOx$˜a/×MsÊ"ùßPÖ?;ÿ?‰]nñ|©å¹kX!nYÔ* žJŽ¡ÙcnÔ­3w‹I¦Ñòrï;þÁ÷º¼ý¤ÃìzŸåÏüã—å÷‘=;ÍFßôÞ¤”&kð ßäAöÿ_™Í•êu¹rì=#Ëõÿc¬É­”üŸSEçJ¤hª¨ l ª:[qüEOñ·ùxþQxÞ%ùù]äOÍRãÌzlqê2TýzÖÜWÅ™EÿÆ@Ù›¦Í—Oô»Žãñîm†ªPä_3Áùiù›ù+_þIy…ï´°ÅÎ1P=k „ÄÆYJ9ìl',:ͳFíæì0öözß‘¿ç:­­nWË¿Ú4ú ´\ÛÇ#D‹Àÿ½Aþ©—5:¯fÍqaz²Ï“µmJÌÒ²[J¯Ä‘Z8«x«Ã¸Îw6 á<37 dùR»v*°Õ.ô·õ´ùžïÁˆæ:§+ÉŠ96¶Èe”7‰§¹~_y§QóÏo©pt…úx±,v›t°Íhéa„®ëA©ž[èôüÕ»'b®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«ÿÖûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«ðþäaq¡yó*£Z__i¸ý¡sO?êú‘þ±Å_Îþ*Í?-üÂ<£æÝÍd€4ÍVÆö§ ô'I7¨?Ë኿¼ŒUØ«±Wb®Å]Š»v*ìUØ«±T—Ì^dÒ|£§\yÍWÖÚn•h†K‹»¹RbAÝÝÈP>g~ii¿óóo,~gþqykþqûòÄ뺦 Ð_ë·aâ·ÃË/Õ"ød”F¤’pPw *šâ¯Âùø÷™?Åó‘þ|¿Wæ_[Ø®õ õ;HmØ OŠ3_zÔQо"Å_¯óæ?#þŸüçÕ|ã©Ù™|\—û6,_4ŽrÇu‰L²¨ –bhI8jùKó?þs#òûòïÔ±Óª¥GÕô⯷ƒÎv<l;®u=™ì†«Y¼‡{åÏá:m°Àdù?Wüàüëüö&. òŸ—e&’FÍ Œ‡¥g#ÖsM«¢žùÕáìŽÏì­çûÙŽýÇú_¤œIo£4ãÉóŽÞXòë GÌÎúÖ¢O7iþy“RxK{óf­2­ooæÍéÇè\þ}>‘‘/¤¬ïíôøRÎÂ8à·ŒqHâPˆ£À( 9Ùã37-Ï›]"Mûä|áwé¿||áwé¿||áwé¿||áwé¿||áKµW±×-ÛNÖmỵµÈ®§èjï–bÄx H=ãeª|ÉæÏùÇM.k¯~\ßÏ¡j±7© ¢°èUÁF}Ájv\é4¾ÐL ñ‰ç°¿ˆä[ûÕ4_ùÈïÍïÉ2¶_™ºzù“BŒñúà4(ج"ŸŸï“›0ÈæöwCÚ{éåáË»§úSþôÓ†2å³ìŸË/ùÊËßÍNÏNÔFŸªÉAõFH[Á““Ø#–§UÇö—²ú­òÇǨøŠqç„ÅôfsÍnÅ^™ùEaõï3Z¹[u’cô)þŒìý€Òøý£Ò"Rù i“Ú ¾š^t>ßÔfçÑOœ;v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]бï5Ú}{G½·¤Â̺|Cñ‘¤Ÿ@|Ü}T8±‘äùC:×—v*Á¼÷ù™å_Ë+/Ó~Õ­4»b Cq %:ˆãyù(¬}²ìiç5K(ÄË“à?ÏÂÆ¥;ùò'B›Rº? ß_£ÿÖKt<ȧí;GNèFtzOfÉß)¯!úÿµŽYG¹;j:žÿ8.Uüêóí ëc/ÿV4¤1š~ÐVoæß:<LzaXâŸíæè5]µ´7óèöo'h>Xò*«y~Î5¹{™?y1ñøÛì×Áxlrc–Nn“6²y~¢ô/ñ¯ùyO壿KXo"Þžª‚Ë^¼X|J}ÔŒœ0rgQ(‰§Ï7ß•—>W½ÿþPëwZF¢€ñA3&Ýx‰R‡‰þW s—Î(áÈßMÛ\;L|CÖ<¥ÿ9Ëç¯ËycÒ?<4OÒ–@…ý!hÈî~ÜJ}‡¥îsC«ör߯#¸ýcíz6¦è#ñäûçò³þr3òûó‰V?%k0¾ EZÂã÷kãû§¡`;²s_ò³šÕv~]7Ö6ïæ>nL CÛó ƒ±W¾~SÚzZ}Åé2ÍÄ{„_êÇ9þÖÌá÷»ÞË…DžòõLÕ;7b®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«ÿ×ûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«ó§þ~§äQç_ùÇ_0ÝÆœît› ^ÿçXe?D3H~ŒUüŒâ®Å_Ý×å'™?Æ>FòÇ›ƒúƒUÑtëîu¯/¬[$•¨-Zòñ?3н v*ìUØ«±Wb®Å]Š»~cÿÎTÏÑ?-? …Ç•üŠñùÇΑòCmc0ú•¬ƒoô›¥ä¤©ë\Þ «˜ª9¿óÿó–™ó“Ú—é?Í]ä°ŽBöšM­a°¶¯ûîMX ½I ÊFÅÈÅ_OϤ¼»úkþr/GÔ©_Ñ^«{_væÖ½GûÿÀü»…_ÎFùˆù·ó_Ï>gfä/üË«Ü)ßd{É Zì€{b¯Å_Ñ÷üùÈÿPòO1¤ŽªjöºbHz•°€Êh<+u¹H§ìì«öûv*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb¯‘;,>«æ­µÕ¼rWÝj‡ðQžÿ/…®ãþ|"~"ã÷D>ƒìÖ^<?Í$~ŸÒò ó÷¡|¹ÿ9™§½÷å&ºð’ݬæ 4¨1«¸Û‹On•ΛØüœ:è_^!þĶà>§åW‘mµOË8,üû¨èPjº-ò¬‰x£›ÀCPКˆØ~ÒŠ•óÔµ²†´œ1™Œ‡N@þ¿ŸÁÍ;ìû'˘úoš­ÅÞ‘?#J´OðÈŸë/ñ9GgÏ©F,“ôßùYà-;ôßùXø Ný7þV>Ó¿Mÿ•€´ïÓåcà-;ôßùXø Ný7þV>Ó¿Mÿ•€´ïÓåcà-0¯7þki^P›QË9¼TgoŸeçè®fi{.zƒéØw”ð¾*ókÖ’~dÍ¢ÛèzCÈÅ)¦g© ƒ‘ $¿R:Tça¡Í RðÌåÌõªür²YƒÑû…ù`úgå畬æbÒ®bÎI©äð«Zž„Ó³ïJ$ÿ-/´ÏÎß%éÚÄn侇ThâŒ~‰y€ j¾•~‡c¶i;V|8&|«ç³Ùhõ‘ÏŒ˜Ý ·ëú~oèS<é]о¤ò5§Ôô;8éBèe>üÉaøœ®º|YOËäôÚ(pã?›,ÌG)Ø«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ÿÿÐûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUث˿;üŒ?3/<ÕùyÇ“ëz&¡aÕ¤“Ûº#ub÷«øU ©*„lAÅZÅ_ÚüàW˜Ïšçÿ/52Üý- ÿÌ 5­;ôô©ôb¯®qWb®Å]Š»v*ìUò¯üäüæ_å‡üâå“?æ&¨%×?RÛE±ã5ôÕû'Ó¨¡ÿ~JQ:Г¶*þq?ç*?ç埙ÿó‘¦çËZ4íåO$JY™§JÂkˆÎÔ»¹^JŠÕGŒŒ@lUùÑŠ»~ÇÿÏšíâѼíçßÌ«´å‡åIÏÅ@%¸Iˆ¨„‹cØž´qWã½ÕÌ·³IytÜæ•ÚGcݘԼN*¡Š¿°OùöO‘Ç‘ÿç< ’!K­Y.õiê)ËëWÑ7ËÐ|úûb¯¾1Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ùïóîÕ¾ª(ûI õÀeð§<›þ z[†,ÝÆQ?ÿr^»ÙLµ)ÃÈ–Çïš³ÆÞÑä_ŸºWé¯Ë5XÉŽ‘y*Š#"½Fm» /…«Å/éÄ|Í~–xÍH>ÿœqeÕ¿., p[MunÀïÖVz¡þìíý ýÞ¨žðÙ_¡ËŸ4§Ì¿”Ö0\WËè@òãÑ“ìÙú6öËtý©"8gêoíH6€´mJ?ôkÑY—¿ðË$cÌ'й­›T’ÙÌS‚Ž;6Ùdq nµ/Ó~ø|ð»ôß¾>ð»ôß¾>ð»ôß¾>ð»ôß¾>ð¢-µ ®Û…²³‘Ö¾~ã惷5;ÈõKÓõ;é±Ùž´§Óý7ÈÆP–¾+äÈ|¡ùW¥ØÎº¦¢‚öú¼ƒÌ*ª|UME}ÍO…3WÚsáŽÃɱùË7hü¹¤hðŠÉu¨óU[Ó‰–Ÿ|ƒ2½–ß,¤zGï#õ.>oÖ-*Át«+m./±m p¯^ˆ¡GZžÙå9rx’2=I?7›L2 úçòKOú§—áÕÄŽŠ­~*sßàm¤ð´<ÏœÀT~ð_>ö›7~æ€>{þö ôžv*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ù϶ŸS×.Ô†FYû5þ5ΣA>,CäóZèpä?6™®#óWþ~9§˜ôÿ&ù­­§ê71œÉ”ëÿø£¿Oì̽Sxgö¬·‰ìwÎþ\‚þYcY`VŒ*;޹Ôis>{+±±|©ªyMt‰™¬K"WìúõͨC“ ažÓù¥XÞp3Yþôª>×Ñ㉶9au-˜»ë’ªÀЃ±!Äç -­ý?ï(ïÓþøñ¯åúß5ü£¿OûãÆ¿”wéÿ|x×òŒ‹O·¾¿AsÄÇâ•ÿϦHYq3JÍs)„Z+jL"w>—zu8xm¦ZŸp7{×ü§m§€¶‘-NMMÛæzœÄÔdäáK,²›‘Nÿ$´±ªÿÎK,àThútÒáÊÐD|;ÎG»§?ÛS­1ó#ï¿Ðö}8pß{õÇ8g`¾8ÚWXU˜€¹ÀMn-ö5¬ k v±ý˜ÑP|”S8ÙKˆß{ÖÆ<"•ò,Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb¯ÿÑûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wðõÿ9AäSùiù»ç#„៯ê n:£¼Ìðv¬L‡xF*þ³?çÒ^bý5ÿ8é¤iµ¯èSU²§‡;ƒuNƒýÿâ~}‚¯Ó UØ«±Wb®ÅXŸž¼ñ¢~ZyQóï®ÖÇBÒmÞêòå•ÜGu9'¹•‚GJYÙ@T“œ¶©R)ô^ù1s¤Ù0þfÜ®—iÕm¹U»€Çp þUäßêœç3öØÉ/L8OÇ™¡ïq¥žöŽê7šýœƒôo•­…½’šsañ7½7ûÉ'åŒ4Òú²›(úÉ2Ò,‹[rr¦’õMǦ٪͑¨—~~ØoÏ?—¾R‰µ(‹¨þY®aJ‘¾À+oM…swØy<-6|Ñ?ddJbhýPÏ/pоðòFŸú/@Ó¬©F[tfå8æß‰9õ³ZOÊè±cþ€'ß/QûI|¯´óx¹ç/3ölNob®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb¯üÙ´ôïmo@ÚXŠ}(Õÿ³}Ù¸‘Ü~ÿìt© >_wö¼›6î©ñ'üçæúOò½o)_¨jÖ—ð ²Cÿ33}ìäøs×x#î?¡Œù1-6Ìk^Tѵp+õ6ÒSßw…I÷®tÉÃ2;‰xL*Dy—ÏþpЊ`3}¦Ën¾B¼.÷ë\¿Y³n,;uæ3&[9øŒr ’kmwå?>SKóˆý©Ÿ†;Ô!PžÕcµ=ŸaÙ9…”Ê;‡7 2i÷ÇêßÐó¿ÌÉo5~_DúÂÄu- _]µRÁÆT)óÝ?Ê®ÙL5Q–Ü‹»Ñêqê6ä{èïx?éïò²î7eùG~žÿ+5ü£Ñ/üæÌÛƒmå+'š MrÿWùä;W¿V=”åy5‡2âêN=8¹Ÿ‡WÐ7OòŸå?îu둬ù@>„`p‰¿ÕÜ/Íþ.…Tc‹$²n9:¹²j~ŸL{ûÿLn]bïÌ3z³UøbNƒæzŸóÛ3¢àËpòçÞô_-iFW]¶Éd—u³—}=äýìíáš-VfèE(ÿœG²ý#ùÍçÏ1®ëk Ö!Út tÛqÙ§ö‚U‚ï7ö~×´Ð Æ“ô×95’ù>ÓëºÕ”@”9ù'Çü3Y> r>_~ÎN’Yóû·}Wœ£Ó»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š¿ÿÒûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wòÿ?uò1òŸüäö¼©Æ/2i:v¦¤}’ÑÆlÛé­µHë¿#öªU~ab¯éSþ|“æ/­~Zù¿Ê|ªl|—¼|ݤqü÷6çü늿j1Wb®Å]Š»|ÿ9ùÿ¬óù…ÿli?äâb¯ã v*ìUØ«±Wì·åQEÿŸ|yûW[¯2y•!‰º†{j$ŠRûÇâ¯ÆœUô¯üáÇ‘ÿåc~wù ÊN¡á›^³¸OF‚Ñþ³0úc†*þÙñWb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìU(×ì?Ji—šm*g·–1óe ~9Úº_Íiòbþt$>$r4™|,‘Ÿqí~~çÊ/­;~kÎ3Ù ÍŸ˜P"‚ÛQ`ŠÀCq=ñÛ©9Œðoõÿœ(óTz¼Öúæ©ekå¸ÕmL5KG¹Ú"AVír`ƒ³½3c/j±p“#ü>~ÿÕ¿d{B5°7ÜˤüÏü¾ü’†O/þJÙ&¯­ñ1ͬ\žjOCG.?É„]-šÙv^§´Ïª\1éúº{ÍÉòï=‡sõ1ku½:¿™®¤º¸biËe@{"Š*`3oMKb‡ã™ê䈊 ¿G±é¶aæÈÀ—ªèö=6ÍViµõ]Ǧ٪Í6¢^æ 1®ÿÎByGJ¥RÊÙe ƒD“ÜWqì¿M;æïü.ËË.ó_3¦êúAžvâ£ô«#©ÞÛiÉö®&Ž!þÍ€þ9•¡ÓNhbÅ(Çý1§>_ }ÀŸ~„*„Q@ õ”@ˆ ù!6» Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]мÃóVÓÖÓ"»â†aSþKãLÚvLêdw‡[Úp¸Ü_?gBè_:ÎZi?¦)¼ËmJ´vðÜoBâ9Iè{)ú<3iسàÔ@ù×ÌÇ''‘þGÃú{ò³Ë·ÿh­¬oBgŠŸræûU> òx·“ÖCÖXGœô·ðøæ×K™Öd‹åŸ3i'aM·Íì%ıO€¼C]Ó~ÖÙ ¥Ìšþ_þ|y«òŠe†Å×PÑøôû²Z>'¯¦ßj3òª×ršíVŽ9|{µ:Hj9ì{ÇãwÐ0~TþNÎ^£Ëù_|žLüÄe.ÚeÀ Ãõ4ŒçƒâQñƒÎyß;v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š¿ÿÓûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wà7üÿÈäÇäÌ›tÙ[QÒnd§óçkôLqWóùŠ¿w¿çÇ~cô5ÏÌ/(³WëVZUò©=>­$ñ±½ýu¯Âz ‘°*¿¡ìUØ«±Wb®Å_ Î~ë<þaÛOù8˜«øÂÅ]Š»v*ìUû+ùÛÿ:Güàå—–Ö¢ç^ó Ý͹£ioî¥HØz"þÕÅ_X«õsþ|ëä_ñ?ç´žk–:Ãå½úñd#ìÍpRÑ@÷hæ—èSŠ¿ª UØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*øÍv¢õ›û(±ÜÊý^D¯áLù_·t¿•ÕåÇÝ9Wºöû)õm_ eß÷nÇóTæ?>/ 'üä/œ´7 –ÒLùRˆ.ïÙ›û:g}¯—‹Ùx§Ü@ùqGô92Þõµ§õÛ9¬9ò]kOë¶mðäm‰y&µ§õÛ6ør6‚òMkOë¶mðdnäºÖŸ×lÛaÈÛûÏSO'ü㟖ái–¼‰¬~$Y'¢Ÿ((=‡†sz9å)ûÝýùüw>GÑìzmi¹Ä½WG±é¶jsM¨—ªhö=6ÍViµõ]Ǧ٪͑¨—ªèö=6ÍNiµù³È1 sþrCWº]×LÓœ¯·`€ø~ԇǯ†ùÑkÏ…Ù0Η锿C9íè.p.3Ñ?*´ÿÒf²U!/3°RGü53®öKùŽÑÇÝ‘ÿ4ÿeNŸ·²øziyÐùŸÕoµsè÷Í]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»cs´úî‹{ *DFAóŒòþ•¢Ÿ@|þýœmd8±‘å÷nù[:·˜yÿæÎ•úsÉdÑéSs¤_ĵìÍ…?A¡Ìø2Æ]Òz$,>`ÿœ*?§)„_kê¥å·Ê«Þño¿ð΋¶O£ÞûÇèy­d}L»ÎzÛø|rí.gW’/“<ç Ó‘:M.gq|߯i”,Í„…¹Z\ÔñwMû[eG¥ÌÇÿ.­ ·Ÿ¼¯p»õÍ5ù\¡Ì\o½Çîw¾5ã—¸ýÏ©ÿçáò[ór ’kMÍGÑ,Çøæ³°¡Ã‹âC‰ÙY+Äþ‡Ëz&ŸÓlßÄ8ú¬Ï`Ñ4þ›eñ=ªÌ÷+iVV¦G4øC§'ˆ¾¢ò~‰övðÍ«3‘½ãTƒô•u­lü"ÏL¼¸¯‡¥?jøfŒÏ$cÞ@û\ì0²gÿ8¥‹/Ë‹›ò>+Ý^æZÿ’‘Å Pýç)ö–|Yëº#ô—¬À=/¶³Ÿn{·å-Ÿ K«ò7’UŒdÿ³CÚó¹÷¿ûßeB¢OŸÝý¯ZÍCµv*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»ÿÔûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wægüý·É?âßùÇOWDç/—uM7UZ À2›F#ä·$Ÿa\Uü›b¯×ùó§ucùß©ÚC²Z^ùbò ™Œq²ÜÛÊŒälµàÊ¥»µçQx«±Wb®Å]о@ÿœüÿÖyüÂÿ¶4Ÿòq1Wñ…Š»v*ìUr#HÂ8ÁfbT’{ UûIÿ?(Ò/¼ùùù{5´ñ­¦‹[âñº¬WIcf¼«ð»3LBj©ê~,â¯è‡þ|ƒä_«è>{üÌš:›Ëë" éõXšy”^"~KŠ¿vñWb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«ãßÎm?ê^d’p(.¡Šo¸p?ñùóþºO´ ¿ŸËýçû×Ðý›Ëǧù¤Óú^Qœ+¿| æ6]ÿœÒ§ñVÓ——jò¶šêGíÄ¿íçw§7cÈ6_é9x>ËÖl* lä0äiäºÖŸ×lÛaÈÝò]kOë¶mðdm‰y&µ§õÛ6ø26ļ“ZÓúí›|¢_KyÉ~Cyz׺ޡ§û9óœÑÏýsÉý_ÑÞŸÇsæíǦÙÐæ›”KÕt{›f«6F’^«£ØôÛ5Y¦ÔKÕt{›f«4Ú‰z®cÓlÔæ›Q/‘¿çOéßÍ?ÌO3©ä‘\<FãŒ×RÜ}˜Fu~ÒþëEƒx¿”EÿºmË´@}õœ#Ž÷¯Èm?Ô¿¾ÕÚ }äjÿÆ™ê_ð-ÒqgÉ›ù±ÿLoýãÊ{U–¡w’~Cö¾ŸÏkx‡b®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®ÅTæ‰gà“tu*~DPባh"Å>9¸…­¥{y>ÔlÈ~`Ó;(ˈ[ÉHpšBÍ \FðL9FêU‡ˆ"„d¦/…¿çÝdÇ£yËÉW²éº¤,Ý:Èv¯S îs¨öú¡1Ô~ßÒèu‘ÝõOœô·ðøæ—3«ÉÉ~sÐ>ßÃã&“3…’/”|Ù¢˜™˜ ³¢Ã“ˆ8Àð—„kºoÚÛ% î´¹˜_•lý6èSÓìj¶M÷N‡0õ¸ŸqwÑÍè>ã÷=ËþsÿJþbÅuÖš]²ýÒK˜=™†æÑÙÙ+Äþ‡ŽèšM³oâj²½@ÓK•P2îAçõ,¾ò~‰ö6ðÍV«3 q}Säýìíœî«3™Ž)÷üä)]ü¡óV¤ÔØ‹zŸùy•!ÿó_ —‰¨€ó¿·a§…È ÿçô¿Ñ_”¾]‡Ç4w7,|}k™{ŸÙ s¶çǨ—À|€zlBƒé<Õ3}=ä ?©èv Š@ÒŸöLiøS9~ПSå³ÒèaÃŒ|Ù–a9nÅ]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb¯ÿÕûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WŠÿÎGùÿ3¿*üçä XÌ·z®ƒ¨Û[ RÄÜ4 `¢É… wÅ_Ïä÷üû6+è‹ùÇÿ9½æ|‡ä¸x?èã* ùÉÝcvøÄLÀm,³¶ëÂ6ÅSÌùù†‹ùK¥ÊoùÀ-ZyKËvòUõ›»T–îé”ý±¾¥KC%É–VJ11Wé/üáWüüÓÊó‘+iùùžmü¹ùŒübŽ2Ålu;VÙÜž1ÿt;$I¤Ü*¯Ô¼UØ«±Wb¯?ç??õž0¿í'üœLUüab®Å]нò»ò§ÍŸaµòå–—q«kwgà†ÙŠIÑckñ;£¹Å_±Ú7åÿäÇüûO·ó‡æûÛy÷óúX–{ Ù«m¦³ ¬•e>˜¥Ä©ê·ü{ Hø«Ë|‰ÿ?ló>»©y{þr‹ËšWœ/u©[ÖÓa´Š9,â$Q!WªN‹Ô,çÔ-Cõ…¦*È|íÿ>þü´ÿœ–Ñî?5çß¾e·»d¥ß”u)ÊO?±ÌD°šŠ*Ür÷e¹â*¿Z?çÛ?“zÇään•å¯:XO¦yŠòÿQ¿Ô,H× =áŠ6¡ ‘оôÅ]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb¯œÿ?4ý´íUGûò?s/ümžCÿ='÷Y‡ô¢~Ã÷Ïaì¦o®ãúè|åž@öOÏŸùÉ©?ßœ–þj'ŠO46®ßäGv¼ûÙœ÷ú~ûÙ±ãh5û?8šÿräbÞ$>ü¹„L…O\á"i¡æÚÖŸ×lÙaÈÎ%äºÖŸ×lÛaÈÜ É5­?®Ù·Ã‘´’kZ]³o‡#lKÔ<ÇqêþWiWûîåM?ÙKýsU¦kg//ÔÕ¬¼»G±é¶msM¸—ªèö=6ÍVlD½WG±é¶j³M¨—ªèö=6ÍNiµôx==:ÚKéöŽ$gc좧ðÍl®f‡V®oˆç#’ÿHóGšç½ö©LÛš´Qú‡s×ûï×ïí=º"ÇŒ Iùšÿzߨè~gã¾±ü°ú¶‡5óŠæåˆ>*Š~<³Ýÿàg¥ðôrÈŽgåßÄð>ÓåâÌ#Ü>Ó¿ÝOhÏFy·b®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]оYóµŸÔµ»È‡F“ÔóÐýg:­ ø±ƒðùló:Èpä?ŽlW2ÜWÀÿó‡s‡ÿ:ÿ4|—R¢Yç¼D?Éãq4¯e¸Ó¿Q]ú~×ýæ—ü€û?c©×Æ·~Šy“KqÞ›ç?ƒ' uSùcÎzÛø|s¢ÒfpòEò_œô·ðøçK¥Ìád‹æ/0éF6e#6÷Äiòpšy¶Ÿgèkºlôû¶í÷H§1òÆÁw¸óz¸ýÌïóáÿJù¹.ºÿ¡B¿s>céaÃc¢ËX¾%èšM³>!ÁÕf{¿”ôbåXŒ§Q’ƒ¬›}Mäýìmáœö«3•¾©ò~‰ö6ÎwU™Ì„^;ÿ9ù©.ù=5€ CR²¶ëJñ-=:ïý׿ñÉû>8õÜ ý¥Ùi#rzß䯕úÈ>WÒ˜qx4kqþ_ …ÿ᫚½tøóLÿHýîü MU.B¨©&€f!Ù“ì; Qek ’ô†4Œ±g’\r'¼½l#ÂîEä;v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š¿ÿÖûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb¯Ã?ùú'üàÇž¿3o%üýü²Ô5/0­¤]ùnidí£@9I¦Ç¿ÂiÊHråÉÓŸ. «ùÐ ©*„lAÅ\ RMÜŠ¿kç ç뚯å÷Õ?,ç%æŸVòÊñ†×_£M}d½¹­qþqYÐWûáÅUWôaå4iuÒ­<×åë}KF¿ˆMkwk"˨z2²’ð5qŠ§Ø«±WÈóŸŸúÏ?˜_öÆ“þN&*þ0±Wb¯µççüõÿ9Qvum=F‰äKG#Pó ê‘ÝÒJúÒÔ?ÝŽ•ZªûOó;þs+òÓþp÷Ë·_óv°Üë2KXó¼ê³¼²¨¡03 Nà׋Ð[GþéŽN|ÕWã^·­ê>e¿¹ó˜®ç¿Ôï%iîn®¤if–G5gwrY˜ž¤šœU+Å_±?óí/ùÁ=y÷]Óç µÍCRò—”,¤ÙMe#ÛÞê´;¤DVÔÒ’HÀ‰îã¬ñªþœñWb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±W•~réÿ]òÔ³Vµš)‡ÒxÁ³†ÿ‚&“Æìó/æJ2ûxß;ïg3pjþp#ôþ‡ÏþTü´Õ|ÎãªiÝMÄ€]‹|ö_|òžÂö7SÚž³û¼Ï—wôGñ{ö›Ökûk—ÓõKù£ôžŸ“æoùÍ/ùÇýóSDÒ-¿,uO7ùvy®`¹’† Ì¡9Fd`ƒ”d{=~Òõµ{/°Çåðqd2Û$Æàóø¾QÚ¿ˆ–}ŸS)æD£Ô~:Þïšÿ(ç)¯lµùVóvçFó5¹ ÉTG§ õið©n¢EýÓõE+ íof#(~cDxàwá‘îê}ÇÔ<Ýìñu‹ìNÕgOV:2°¨#psÅ:4ÒU­iývͶ±/$Ö´þ»fÛFÐ^I­iýv;  ©ê7¯—ítªÿw(4ú[úãŠ5˜ËËõ1Ô³G±é¶K4Ù’õMǦ٪Í6¢^«£ØôÛ59¦ÔKÓ-¾ßê$Сy%‘‚¢*Š’ÌvxœÖNæxc¹<€j/‹?3?ç!<Åù½¨KùAÿ8ãj÷>º´Wš©^*"? •-´qÓc#|MÒ5¯Ýfö.ΈÕkVñ‡ŸOyò­ÑÆ#¼Ÿ}Î(~BùOò×Èq~[êZ“4Ku-õÅáP¼Òª'Á?*¢Ì«±©Ûý›í7£!8s £#È‹4?šyòôÊùkµ5zœ|H,u˨óïûÃÒ¼Õä-[ÊNN¡;Rh·U£?>ê}=«œgn{-ªìƒûØÜzN;ÇãüÓäkÊÜ­jâÖI£Üyþ߃ë_ËëѾ\Ómˆ¡0,¤{ËñŸø–{ϲz_Ëh1Cú"_éýïžµòøº‰Ÿ:ùmúŽt.¹Ø«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb¯ üÎÒ¦ŸU¶’Î6’Kˆx…@I,„×aìFo»/(7Ðýî“´±1]BÇÈÖšÎÞ¦ÕfeŽ/ª|Ÿ¡ý³Õfs1Åè>|üÜòŸä>‹þ"óµÈYOÕ,¢£\ܸíTl?iÚˆ»TÔ€ux´™5’á€÷žÏÈ˓áôÌ_ùÎ]NÛÌ2ywò¶Úq5­œ;<ÀTrˆºþòB¤¯Ö}4«zqŸ3o“6ɉŽ?VB7=Þþáý¿ywº]0ǹ~ÅYù[ËÞa´ŠÛÊr +¨"XÅ´”„Z ‡°ê»’3ϧ.œþðXï¿æô=Fð4{¿¡"Ó<³{e®YéÚœ,„Ì­Sº²¡ähz‡õÌœº¨Ë”OGšQÈ#!ÕôærïHìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUÿ×ûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å_ÿóŸ_óì›Îyù¿ùmŸç“Ê{ý)xÅmª6Õt$„†ã©'ìLßo‹“#*þiuÿË×׿k5–¥i+ÁqmsE,R!£#£ÊÀìAª[оÅÿœMÿœÙó÷üâ^«êyZoÒ^T¹”>¡ Ý»}^jÐ4‘Ì3S¤Š(h¾¢HªTßóŸó•~@ÿœ¦ÐG™?-oÇ×aUúþ“rB^Ù¹í$u5B~̈Z6èe ¾‘Å_ Î~ë<þaÛOù8˜«øÆ†¸u‚g•Ø*ª‚KhrIÅ_®ŸŸó€~]üµòôó‘óž·¿áŸ'CÆKO.JΗ÷ÏNJ“"~õ9Gûöܹ…TòUã¿ó–ßóð={óÎÌ~SþTYÿƒ(ìÐ[[höaa’êÙ>³éQBSqnŸ»SöŒ¬ªáWçN*؈U'`*ýÚÿœÿŸ]Éæ¨þuÎLؘô£éÜé^[~+€hÉ5òŸ³ínhÏþí ŸŠ¿¡»{x¬âŽÒÒ5Š•R8ÑBªªŠP6 €ª¶*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*¥4Ü¡‚áHÛª¸˜9 ˜£pÈB,|™FF&ÆÏ”ÿ6u/2ÅxÚ~°Þž˜ä˜H£§#Ô°îN”9á~Þk;B9N,江£ƒhHyõ2ï—AT^ï°0éÌ8±ï.·Ì{¼¼ÃÅóÎ^•ä¿›?’ÞZüâÓÆŸæ›~7qõ[èh·ü­MÔ÷Fªž´åB6½•Û9»:\XÎÇœOÒoŸ6p™'Ç:gœ<÷ÿ8¡y•1#“\ò$éÚ_ERb^Á €ë šmû¶¥Nuù4šn߉Ƀї¬O_õ‡Ä72n9¾»Ó<Á£ùëMÌ^UºŽòÂa³¡ÜêÊwVÕ€#9<˜2igÁQ»Ã]±aZÖŸ×lÏÁ‘°’kZ]³m‡#lKÉÅÇ«¨>•þûÞŸwõͧ G‰#›Ò´{›f¿6E%êº=M³UšmD§~gó΃ùg¦sÍw÷D¿³0ý˜Ó¹ñ;(ý¢cé´Y5³àÆ/¼ôòÀ.O™ìôÏ>ÿÎ\] .ZO/þ\Å&ÁkYøŸÙž³ÿ”G¥`XÝò齟Žß¼Ì~Ïø‘åõs2F?2ûËòÿòãËÿ–:Zy{ÉÖ‰mn(d~²Ìãöå~¬ß=‡Emœ.¿´rë§Ç”ÙûiHË›9Ì$>‰ü¡¾ó§[;ŠO ()!¹©·ÙŒÏ¸5P<6Ï\öS¯Ôþî^¬cÇ¿ù°=|Á¸Üjøÿhqiñz†Ù:pýòý|ËèäEDq€¨  tg°F""†À®]XdO7ÊÚïéy"kÆCv¦êݩڞÛÃ:¼>ŽO1Ÿ‹‹×Í'Ëš_*~{ÿÎ,蟛|Óå×/œ¢!ã¿„I7_\.õÚUýâíöÂ…ÍÏföÄô¾™z£ÝÝîý\šòbygåÿüå˜./×ò‡þršÚX.ã-5²¼„‰Z+LWiPôõ’¬Ò¯.l6Y».ãiO¾?«¸ù|6£HG'ÒgÓmõ+uÔ4é#žÖdE,LT2°¨ Á|ÇÓe14]FH>Tóžöþèô¹œ,‘|¯æ},Ú3IM–§îÍô%ıš4Ä,Sëòúýz»$7r2Ÿ SÝ<£¢ò*HÌ=NZq -õG“ôO±·†sº¬Î\"~fÎKX~]J<•ùyn5ï9ÌÞ‚Ci"‚C° y$®Þ’o_´ÊGƒ³Ž^Cÿõ7k¦Ò™î¥ù[ÿ8«©y«Tšßó’·-«ëÓ•’=2F @n¢n? ãÚ¤KÐóŠâk»hB>˜T{úŸwë;»ì:qûÖ8ÒXaP‘  ª¢€°€g4M¹*ñWV„‘ #‰^µíJwÀ|Ò<ŸOy>XY+ù‘ƒË±ˆ0ýâŠSã>;üÇsØrúË÷ïƒÒiøyðïø²ìÃrÝŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š¿ÿÐûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š¿9?ç9?çßZÿœ©°—ÍþWh¿™vñ~ãP Æà‹E†ð(«l¤À#˜«ùUüÅü·ó/å/˜/|ƒù‹¦Ï¥kÚ|†9í§£Á•*èÃtt,Ž¿±â¬#fß—Ÿ˜þfü§×­<õùu©Üi:í“r†æÙ¸°ñV«£td`U†ÌÅ_Ó7üá?üüóË?Ÿ‚Óòëó€Ûù{ó¸Å •ác©?Aé3éLßï§4cýÛ1<WÚ_ó—^AÖÿ4¿'|ßùyä›qw®êúqµ´„È‘†‘äJUÜ…PI$ì1WãF›åoÉ_ùõÍ„zÿŸ^×ÏÿóÏ ÉkaV×KgZ†ô€ÿ:ýbAOF8‘œâ¯ÉŸÏ¿ùȯ=ÎIùŽO;~jjOw8ä¶¶©Tµ´ˆšúvñT„^•;»Ò®ÌÛâ¯ÅQúV•{®^Ûèº-¼·z…Ü©½¼ÒK,²0TDE³1 IÅ_ÒüàüûËò¤Y~rÎA[E{çQÂãNÑÛŒ–úaÙ–Iz‰.”ô¡1Âwß‹¢¯ÙÌUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb©f±£ÙëÖ¯¦j±,°H7¨=ˆ=ˆìFav‡gâ×ã8³(Ÿ³ÌwзéõÓÈNˆ|çÏË»¿'Ln#¬úcµ#š›©=éÐûô=¼ÏÞÔû#—±¥Ä=XÉÚ]ßÑ—qóå.Ãл+¶!­væ?HülóœäÊY¬è¶a²›E×m¢»±¸R’Ã2‡FS؃øxufÒÃ!8äBƒOÏï;þFù»òþoÌ/Èif½ÑOÇ{£½eeA½Ö³ íOß'bß÷EÛx;Z#°/áŸ-ýÿÂØŸ'&9ö“;üµüîò÷æý·£fEž¸‹Y¬%`[n­mÍ|h/í(Øœ.Ñì\½œlï’§¸þÊ)Þµ§õÛ+Ñ”Kå-.ãÕüÁÔ4¯÷ÜdÓýŠ\ê2F´Ñ—ã«kéǦÙÎfÈÖKüÈüùÓ?/[ü7娯«æ™HŽ;XuÛeqܱ=#_ˆ÷ãPN_göõŸ¼Ÿ¦ìõWÓÌíï@‡gù_ÿ8ϬyÚý?2¿ç"%{«Ç£Ûé Ê/UøB޾ŠP¿ %“)í?i1é£àhE³ÿ‰ÿŠ?…„òÖÑ}ãmm œIiiEJ#E ª PÀÐ á¥##gr\u| õÿËÏÊùüÌSVÖCC¥ƒUoeð_ïÑ|G {%ìLûLŒÙî8ºt9=ÝÑï—^Qïïköät¾Œ{Ëì¿ÏËæúÆÎÎ >²²b‚1ÅÃ=ßO§†ž0#°` &Id&R6OTN\ÁØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]б¯2y^Ó̰z7#„ê?w0Ÿâ r>ÜOÕ[ðnŒj3'K¬ž–\P5÷z%.oÎýSMüÃÿœ9¸ úždü±š^´5¶æ{õô§¯÷2ÙÏÃÖaÔaí1üÜŸëûíÔèDÞϧù³Ëßš:_øƒÉ×+<&‚Xš‹4,GÙ‘:©ûÔõRFù(FX žwQ€ã4_=~cè¾…ÜôûÈßr“›Ý.kp£ ÷‡ˆ~YÛRÜÏÔ X}Àfiþч ëÉõ–…ž‹jÚ¦­,vÖp/9%•‚ªÜ“šmFC#A«3#A€¿æ/œ?=uü¸ü·– 8Qoµy+T;T½?t‡zûç§ÂÄ3,q鉘ïÒ?Žpz-'fÖò}¿ùÿ8Ùå¿É;qyl?Hù’Tãq©Ì€>ýR©ôÓÆ„³~Ó@9^ÑílšÃGhô¯½ÝÃè¬Õ³V··–îU¶µF’W4UQRNFRYF&Fƒè?&ù- .¡©…’üîUåâÞÿw‰çµºó—Ó‡Þï´š‹Õ.sÑóZ슻v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»ÿÑûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»|‰ÿ9qÿ8mä¿ùË/~ŠóDbÃÌÖq·è­nS=»nB?ûöcWˆ‘Ý‘‘þ,Uü—Î@Î=yÏþq«ÍSþ^þfÙ{¥å%¥ÔukkÈ9Y zHÔèhè~Um±W‡â®Å_¢^GÿŸŸþwùòòãòŽËSŠî^) †¹x†mFÊÞ„4i#®zzo"»Æ*?»ôÕ~~jš­î¹y>³­ÜÍy¨]HÓ\\\HÒË,ŽjÎîij3RI$ž¸ªf_—ÿ—ÞcüÓ×켇ù}§OªëÚ„ž½­ºòf4©bz*(«;± Š 1Š¿ª_ùÁù÷Ÿ—¿ç,âó¯œ ׿mÄDK| µ½‚¸£CfR˜€î*ª +*ý%Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUت…Õ¬7±=¥Ú,°È¥]T{r¬Ø#ž&‚(ƒ¸!”&`x¢hޝ”1?+fòá}cC .—ö:¼??ð=GíxŸ ö»Ø‰vuçÓܱs#œ±þ¸ùóÅÞ{ÞÇíÁ©¬y6—Ù/ÛåòîxÞyãÑ»|qùëÿ8açÛ†óÏå´ãAó”më "&8n$‚ü7ŽJïꨩ?mXžC¯ì?j¥¤qÇ–û˜+æ?¢~Ý7Ç“ço)~{ê~]ÔåŸçõ«iZôF·²(Xä®Êdãð€Ý¥Bcn¿ 9‡UØÍÌhOðŽcÝ×üÓê æ¼X‰¨ÁkùɯË{4qØÃhÒ´®À _NȱڛõÌüØÌ´¡¹5]yÉŸDúÿó;Í_œZ£~[ÿÎ?[HTíuªc 4.ÿt~#ûÆé†§*!ÙØ{:>´û¡ÎÏuòä:šb@Žò}«ùÿ8Ååïɸ×Y»#Uó\ŠLڌ˴e¾ÒÀ¦¼bßm·© x/·=¥ËÚG„zaÒ#¯õ»ý܇ÚãdÊfúk9¶§b¯ ¿.)M×§®ùª2!Ù¢µn­àÒÃüž§¾ÛWöCØ?µÁ·8ã=|çåýg®ÛG¶;‚ñá;õ—w»ÏÏäúUT €€ €=–10›]…Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±T«XÑm5Ûse¨§$;«´§ÅOc–áÏ,&âÕ› rŠ“æÏ3yVïËSpœs¶cû¹€Ù½öû³¦ÒêãœmϨyÝN–XNü»Ø¾e8È{»H/á’Êú$šÞdhäŠE ެ(U”ÔFÄ ˜› üÞüáÿœJ×<…¨Iù¡ÿ8Ñ+Á:Uît@Õ ½XAÊ¡Ôÿ¾_þy·ÙAÔè;pd£á/×úþm9tñÊ*Oó·KüÀÐõM^‹ôOšmí.–[9ªÝ#n^Ÿ*Àãoˆ•Bs ÇŒã Ç{Ïçì©a˜#xØß»~¯'ü­óþ‰äÏ+>³¯ËYZêQ ºPË) ½aâÇaó ÌÌ„ƒ-wgÏ>zˆè,ôÞñùiù)çùÊ9àó?ž]òý=¼)-ÂøÄ¬7¨ÿw8ãþûVÜ ¿µ¡£¸ÃÕ?°{ÿS·Òö|4ãmÏ{õOÉ>Eп.´˜|¯äË(¬tèFÉÝ›»»³¹îÌI>9ÆgÔO<¸¦l¹ S-ÊU0Ó4»báltøÌ’·aÐ{ ¯.Xã&ÌxÎCQ}åO'[yj?PÒ[ÖyHéì¾õ÷ðÎkW¬–sÜ;¿[Ðétƒï=ìÇ0Ü·b®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š¿ÿÒûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ñÏïùÇÏ%ÿÎIùVËßÌû!qhõ{[˜è·6sñ!f·ƒÅÅzU‡ÂêÊHÅ_ÉoüåÏüá¯?ç<Áú/Íý˲8Òµ¸ˆ.T„oéNwˆŸŒéñb¯ñWb®Å^Õù ÿ8ÿçOùÉ4Áù{ù_`×W²Qî.’ÛZCZ®%„Aò,ÍDEg!J¯ë?þqþp¿Éó‰Ô|º‹¨ù®ò5¦¹4`M9¾œkVô¡SÒ5?H]€!WØx«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìU¢¬*Q€‹WÍÿ˜¿”¦>zç”ãªnÒÚ/Qïðñ_ø ñïký‚á½FˆmÎXÇßÓô½ÏeØý¿u1÷Kþ+õüß;ôØç’={±KÊ?6&|±ùÍ¥ÎÀÍ?V¼Š‹qnǺ=Ǻ£mQPÚvWlfìÙñâ>øŸ¦^ñúy†P™‡'ç>‰ÿ8æ‰|Õ.•æ-J$òœAOéz××h’IG —¬k±S%)ž…›Û¼#”"|Cü'”Oy—QîÜõ§(êy¿N|ùuåÿË&?,ù.É,ìÓv#y%zP¼®wv>' ØQ@͵ý¡—]?)³ö :R2ܳlÂB¤0½Ã¬)y…UQRIØ|žÎ:y'þqŸÊÐùòÆÄAÂ÷—’Q®¯f†Yä ,Ûž*(ˆU]±Wºâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]мKóòª=sž·ååXõ ÚHº,Þã°oÁ»Ðïžmí°Ñ×^£JÉÌÇŸê—Ù.´wznÇíケåÞ=Xþ±÷}–'‚KYÚå9P•dpC)A¡ÏËŠX¤c0Av ÷÷Q˜±¸*YNÅ]Š£´Ý6ëW¹OÓbi®$4TQ¹þ€w'a™:=MfA‹2‘äã—yä³fŽ™LЮ¿/ÿ-m¼¥¿¾ã>ªÃwê±×ª¥ê}†{ﲞÆãìˆø™*YO^òé—3ä>ínÚ–°ðÇhwwûÿSÔs·tnÅ]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*²HÒdh¥PÈÀ†R*=AA­Â½‹Á¼çù~úo=SDRö›³ÅÕ£÷+ø–o´]¡ÇéŸ>þÿÚé5šT9ww~Ç•æÙÕ»v*ìU—yWÊ>e—’Ö;4?¼”øUñ?«¾aêõ‘À;Ïs—¥ÒÇ˽ôŽ•¥[hÖëc§ H—ï'¹'¹9ÍeË,§ŠOC‹Æ*)ŽVØìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å_ÿÔûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUت]«é:ý•Ɖ®ÛCy§]ÆÐÜ[\F²E,n(ÈèÀ«)E1WâŸÿçÌ:.·ù™m¬ù#\ýù_tÍq§O}lT¯î-$`ÊÉ%[‹ËñBë6Ø«öWò×òÏË?”]²ü¿ü¹Ó`Ò´+ÂCoÒ§öÛí<ŽwwbYÛv$â¬ïv*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±W™yÿòÞ×Íñ›Ë^0j¨>i´”è¯OÁºq¶q~Õ{¶#âB£”r—IyOôK˜ó;¾Éí™hÏ ·ww˜ýOµM.ëF¹};S‰¡¸ŒÑ•¿X==ˆØç€kt9tY,Ñ1æãqÜFÅôãž"p6 1[“Ï/yrûÌ÷k¦é1óîÌvT_=‡ëè7ÍŸdöFnÔÊ1azž‘ò=ßÈnâêõÒÇŽgõŸsì%ùÇÉ–þ°õo$½¸añ7°ð_o¾¹ô7³žÌaì\u æ~©žgÈwGËçov—jO[+;È~9–m#¬v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]м{Ο—¢nz¶€”“v’û^%=ÿÉïÛÀît]£^™üëu:Íú¡òýOe*J°¡svéšÂ‡¢y;ȳk¬·ú€1iàÔvi)Ù}¼OÝí­ÖkÆLw?s°ÒhŽ]å°ûßBÚÚÅeZÚ Ž$UQ@sÒ‘‘²ï£A_"ÉØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»ÿÕûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Vç/$XyÊÛѼÒèÜ(ø”øñus¾Ñ{5‡¶qðÏi¦c˜òóxùQÝÙvwiÏE+Žàóíó|ÑcùM®\êÍ¡ÜGéEîNñð'fSûDÓeëãMóÆtÞÁë2ꎞC„ ÌùÇ¡ó‰é}õ»Úeíü1Åâdò[óî÷ü­õW–ü±aå[EÓ´¨ø¯Ws»»x±ïú‡l÷.Æì\=•‹ÂÂ+¼ÿ|à ­ÖÏW>9Ÿpè=̃6Î#±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WœyËÈqkµ 0,wãr:,Ÿ?÷ûüFËE¯8½2Ü}οW¡}Qç÷±o'þ]<¬51!HÔüç«Ýü·—\­giW§Ïõ8ºNÏ¿Tþ_­íÊ¡D(l£&Ýлv*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š¿ÿÖûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wÿ×ûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WÿÐûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WÿÑûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WÿÒûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WÿÓûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±T£zše¬úŒáŒVñ<¬„ŠXÒ´ ñÅ_‘¿ôZ¿Éú°yÏþtïû/Å]ÿE«üÿ«œÿéNÿ²üUßôZ¿Éú°yÏþtïû/Å]ÿE«üÿ«œÿéNÿ²üUúUùù½£þTy Rüæóshº]ŠêCj‘µËFÜvEwD-ñ ‹ïоXÿœhÿŸŒ~[ÎTy¹ÿ,¿/t¿0Ùê‘ØÍ¨5KkH ôátF¡º™¹  áN»Žê»þr_þ~1ùmÿ8¯æäü²üÂÒüÃyªIc $Òí­%ƒÓ™Ýršêä f£…:n{*ùóþ‹Wù!ÿV9ÿÒÿeø«¿èµ’õ`óŸý éßö_Š»þ‹Wù!ÿV9ÿÒÿeø«î?ùÅÏùÊß)Î[h‡?.,µ[+6ûô|É«CR4ž’KUM:•âãrÀÖ»wÅ_+þhÏÚ?()|Ý­~YyEó\ú¦ƒ}>Ÿs%¥ƒ@Ò@åÆÏzŒT‘±dSâ*Á?èµ’õ`óŸý éßö_Š»þ‹Wù!ÿV9ÿÒÿeø«¿èµ’õ`óŸý éßö_Š¿M¿(?44¯Î¯&èßšžV†êßI×-EÝ´W¨‰:¡$REäPvìì=ñW¤b®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±W›þoþhi_’¾MÖ5<Ó ÕÆ“¡Ú›»˜¬‘v@@¤k#ƤïÝÔ{â¯ÌŸú-_ä‡ýX<çÿH:wý—â®ÿ¢ÕþHÕƒÎôƒ§Ù~*ïú-_ä‡ýX<çÿH:wý—⬿ò÷þ~íù=ù•æ­òçBÑ<Û¥¯êvZU¬—6v My2ÃHÉzì3‚ÅUˆ¢“¶*û3þr_þrOË?óŠþQOÌßÌ+MJóK’úýÿ+/OÖ¯¿Ä_^ú§èˆ-¥áõ/GÔõ}{ˆ)_]8ñåZ5xíU_ Ñjÿ$?êÁç?úAÓ¿ì¿wý¯òCþ¬sÿ¤;þËñWÑjÿ$?êÁç?úAÓ¿ì¿}Oÿ8±ÿ9áäùË­WUòçå¶®ØÜé±ÝÎÚµ½¬HÉ#ð 3’kÖ¡E;â¬oþr_þ~1ùmÿ8¯æäü²üÂÒüÃyªIc $Òí­%ƒÓ™Ýršêä f£…:n{*ú?Ê_Ÿœ¿+£ÿœˆÒí¯£òäš=ƶ-æŽ!yè[£»)E‘£õCAêñ­*Ã~vÿÑjÿ$?êÁç?úAÓ¿ì¿wý¯òCþ¬sÿ¤;þËñWÑjÿ$?êÁç?úAÓ¿ì¿Mü½ÿ?ü—ó.«cåË Î s¨]CiIe§„3„RÄ_'ziØâ¯»ÿç#ç!¼¹ÿ8ÃäÙ5<ýk¨]é1]AhÑi‘Å$üç$) 4°­7øëà*üùÿ¢ÕþHÕƒÎôƒ§Ù~*ïú-_ä‡ýX<çÿH:wý—â®ÿ¢ÕþHÕƒÎôƒ§Ù~*õÿÈOùúågüäOžôŸÉÏ%ifµÖµ­zj¶QÛ¯Õ­¤¹~mä®*‘0Z#|DAR~â®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å_ÿÔûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±T%ý¼7v³Z^ÿ¼òÆé%M>6ý¶ïŠ¿*ÿèŸó†ßÍeÿ…<¿öQŠ»þ‰ñÿ8müÖ_øSËÿe«¿èŸó†ßÍeÿ…<¿öQг-7þ}gÿ8ìÛG©èú$÷vr‚cš jòHÜBU–bàŽ*û‹ó+È~Uó—’uËßÌ«å»1ix$¸0Ó¬Á”¯Añr«æOùÇ_ùÅ/ùÇ¿É5?›ÿ"Üù‘¬¦µoKZ{Öú¼ŒŒÿºi\Rª¿6ñßwüäWüâ—üãßçGš“Íÿžín<ȶPÚ¯«­=“}^6vOÝ,¨)VoŠ›øíмþ‰ñÿ8müÖ_øSËÿe«¿èŸó†ßÍeÿ…<¿öQЧZ'üûSþq3ÌÒ½§–ì—Pž5æñÚy†æfU­9“’HÅ_h~BÎ8yþq§H¼ò§åŒ¶mýß×gInf¸-7¦±Ô4¬Ä(¦*ù3ó+þp‡þqWÎþjÖ<ßçö´dÔ¯fºÔyù†Hë1i+BþÍ<1VÿDøÿœ6þk/ü)åÿ²ŒUßôOùÃoæ²ÿž_û(ÅYF‰ÿ>ÀÿœYó, }åÍ)õ dsKi®ÝÌÀ©d˜€@ Ó­ñÅ_ ?——º'åG–tÏ˯$ÀÖÚ‘¶´…äyY# ¹,Û“¹8«6Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb¯=ü×òw–0|£«ù/ó/ˆò¾£l`Ô9Îm×Ò$YC)MÀÞ£~qÑ>?ç ¿šËÿ yì£wýãþpÛù¬¿ð§—þÊ1WÑ>?ç ¿šËÿ yì£{’?çÚ?óžJ×4Ì)hwI©é¶º¥„ÿ¥o%A5´‹4/ÄÊU€e†ªÃ®Ø«èoùȯÊ_˯Î*§”?=ÌcËk{ Òú·Íd¿X]S÷ªèkFo†»ømаŸùÆùǿɯÈÓŸô.ÆúWê¤ýQïÿÞ[Я)$áýä´¥9{ñÙWŽ~rÎÿÎ1~eùËUóÇæ³Z5êF÷þ¦¿%«sX‘°‰”'À«·ãßy—ýãþpÛù¬¿ð§—þÊ1WÑ>?ç ¿šËÿ yì£dZüû'þqOÌë$žZÓN¢°$6šõÔÁ V¸NiZW}ëùGùOå¿Èï)éÿ•ß—6ÏiåÝ/×ú¬Ló2ýbwžJ¼…˜ÖIîv­Ã~tÑ>?ç ¿šËÿ yì£wýãþpÛù¬¿ð§—þÊ1WÑ>?ç ¿šËÿ yì£fWüú×þqƒ\µUÑ4Y¯,¥åéÏo­ÞKqb§‹¬ÄA¡Ø‚1Wé5¤VñXÚŽ0ÃÆ€šÑTPn}†*‰Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ùCþrþqïòkóßôý I„~ŠúçèÏ[T{÷£ÑõéÆHùÿwk^>Ü·UòýãþpÛù¬¿ð§—þÊ1WÑ>?ç ¿šËÿ yì£L4¯ù÷üâ&¹u•¢A åì¼½8-üÇ<²7,x¢ÎI š €'}]ùÿ8sù[ÿ8ͨjïå—=…æ§[]4×·£Fæ  ]€ß¸Å^uÿ9ÿ8¥ÿ8÷ùÑæ¤óç»[2-”6«êëOdßW“÷K* U›â¦þ;b¯ ü­ùkämòÑ?*ü¸cÿ•~šLúz‘vdO©J޲¤&œY¾>[u®Ø«à?ú'Çüá·óYáO/ý”b®ÿ¢|Î5—þòÿÙF*ïú'Çüá·óYáO/ý”b¯HòÏüûþqºÎâÃ;[Ñ.%h%†òÒâ=bòXÙ£`èà‰J°¨¸8«êŸùÈ/Êß ~pùFO%þxÇ•Þæ ßÕ¼k5õc$ÇûÕt#~Õß|ÿDøÿœ6þk/ü)åÿ²ŒUßôOùÃoæ²ÿž_û(ÅU!ÿŸyÎÜ:ÁÕW`ª«æi‰bM\T’qWП”óïÉ/Èï6iÿš?—:-Õ§˜´¿_ê³É¨ÝL«õˆ *’HÊkŒ7V£qо×Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š¿ÿÕûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±T·Y±mOO»Óc`­q°†=u+Sò®*þtÿèˆ~xÿ©ãEÿ¤KŸëŠ»þˆ‡çúž4_úD¹þ¸«¿èˆ~xÿ©ãEÿ¤KŸëŠ¿p?ç?'¯? +|¹ùA¬^C¨^hM —P+$r.$”VÜP8øb©—üäwåe×çwå§™)ô«¸¬nõÛ´ŽæefŽ2YO& ¹vÅ_ž_óƒ¿óí¿2ÿÎ(~bËù¡æ2éÚµ¬šMΜ-í`š7 4‘8j¾Ô™ûñWÎq϶üËÿ9_ù‹懗¼Ë§i6±é6Úq·º‚i´2J媛PúƒîÅ_ÑüñÿSÆ‹ÿH—?×wýÏõœUú«Š¿ÿ>çÑoüÝüÅóG憛æý&Î×_Õ®µ­å¶ž5žBáX©¡"»Óy/ýÏõÆÚѤP@c J…€;Б\Uò÷üçüã6§ÿ9_ùuå—µ;m&ê=ZÛQ7Q¼ˆVåB´Mê}A÷b¯%ÿŸ}ÿÎëŸó†ßâïñ6¹e¬ÿˆÿEú_S†Hý/¨ýg—.}yzâ”þSо^ÿœ£ÿŸRy³óûóKÌ›ú?›4½>Ï[ž£µžÚw’1¼qÌ»”'oUà?ôD?<Ôñ¢ÿÒ%ÏõÅ]ÿDCóÇýO/ý"\ÿ\Uúcÿ8ÿ8_­ÎéþgÓ|Ë­Yë-¯Oe4mi‘ˆÅ²Ê¤7>µõ)኿CqWóƒÿDCóÇýO/ý"\ÿ\UßôD?<Ôñ¢ÿÒ%ÏõÅ]ÿDCóÇýO/ý"\ÿ\Uû_ÿ8ù!}ÿ8ãùOåÿÉnúJ÷Fú÷©unŒ‘Éõ«éîGmÇ(S^à⯣ñWb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»~pÏÁ?çuÏùÌŸðøg\²Ñ¿ÃŸ¥=_®C$ž¯×¾­Çœ}Zÿ0Å_œôD?<Ôñ¢ÿÒ%ÏõÅ]ÿDCóÇýO/ý"\ÿ\Uô‡üâ?üúËÍ_óŽ?›_üçÖüÕ¦jVZ7×½K[{y’I>µc=°âͰâe kØUû]Š¿!¿ç8¿çÛ~eÿœ¯üÅ‹óCËÞeÓ´›Xô›m8ÛÝA4ŽZ%rÕM¨}A÷b¯µÿ/? µ%þBÃÿ8ãu¨A>¥–ï43|ˆÂ%ÄRF$â~. ¸$uÛ~1ÿÑüñÿSÆ‹ÿH—?×wýÏõœª.¡nm®Düš¾¬%ƒR›q_–*÷ìUØ«±Wó•ÿ9ù¿ÿ9±£þhy»Kü®´ó³ùFßY¼Jk/-=ʵYˆÅ(³~iÆ”nMQÜâ¯ÿ•áÿ?ÿ–/Ìü$ßþÈqWÊðÿŸ€ÿËæþoÿd8«¿åxÏÀå‹óÿ 7ÿ²UýÎ-j¾p×?)ü©«~o­âyÎ}9T]BÜÛ\‰ù5}XJ'¥6â¿,UïØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUà?󔺯œ4?Ê5êß” xþsƒNwÒ×O·77&~KOJÍ©]¸·Ë~cϽÿ2¿ç*<Ùù¡6—ÿ91m樼¢4k¹µ ¬-þ´²B#SmÇĽ–â»mŠ¿mñWb®Å_ ÿÏÂ<Ïù±å?ÊøuOùÆxµi|Üu›HÝtkqõVŽc!1¥ø9«qØÓ}ñW‹Ï´<ñÿ9ç?ñ¯ý t`‡êß¡ÿCþÒ[N¯?­ýgѬú”ã?µÇáéËu_!ÿÎ_~lÎdyóƒÍ:?䕯œ¤òD 1´ß.=Ý©CmNai qê©æÔ5©Š¿}´).%ÓlåÔy ¶·ˆÍÌqne*¨kZŒU5Å]Š»,?ò¼?çà?òÅùÿ„›ÿÙ*ïù^óðùbüÀÿÂMÿì‡wü¯ùøü±~`á&ÿöCŠ»þW‡üüþX¿0?ð“û!Å_ÔN…%ĺmœº!vÖñ¹Ž-Ì åQµ kQЦ¸«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å_–óòÿ<Î@y3üÿB£˜&úÏéÓ ´–ÔiÃêŸVõ©ÞyMÃìòøºñÙW´ÿϽüÏù±æÏÊùµOùɈµh¼Ü5›¸Ñu›aqõUŽ¢ø9£qÜ×}±WÜØ«±Wb¯ÄùøGæWüåG”ÿ4!Òÿçí¼Õ/”Ni#¶¡5ý¿ÖšI„€Ê-¥øø„ªòØSmñWß–`üȽÿœpƒÌžmR_Í#å[éÝ'³1ßþ‘Xe1mé©õy„➞惉®*üÚÿœüÑÿœ¸ó?ç‘£ÿÎBÛyº/$Io~nÛVòûYZ‡[g0ò˜ÚÄúxŽb¦ƒ~˜«÷‡v*ìUñwü翘ÿ4<«ùOs«Î8ǪKç1¨Ù$k£Ø›ëŸA˜ú´„G-V”äxíâ1Wá—ü¯ùøü±~`á&ÿöCŠ»þW‡üüþX¿0?ð“û!Å]ÿ+Ãþ~ÿ,_˜øI¿ý⯪?ç 5?ç0<ÉùÏåóî×ÎùoÒ?¤[TòóYÚ:}ÃCêNmc ûñŒr~+½hU~ûb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å_ÿ×ûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WÿÐûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WÿÑûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb¯ÇÄÿŸ¯N_ü['å– ?,¿Äÿá_ñÕà3}s‡«Çê^ˆ<ý/Þqõ¸SoS–Ø«öKõkïÑv7:ŸSêÐÉ7 Ó—-JÐÒ´ëLUùùiÿ?TÕ<ãqåMOÍ•÷Z7“|Ý­¦e­C®ExÛH±‘õsm …ÁsÉ~ñävÅ_°xªMæ=n,é7þc½W{}>Ö{¹:d… °Z*@Ú¤ ÷Å_–ß”¿óóKó^òmž¹ùgy£yGÏz¬Ú>‹® f“$ñJ"nVÂÙB3ß±Ï~±b¯<üÝÔí4O"ùŸYÕí ý¦‰¨Ü\Z,ÍngŠ;ggˆL•h˨+Í~%¯!¸Å^ ÿ8æ/ùÇò#Ê>`ò†þZÐ%Žþ+]*Kù5·X5 ˆZ·2ª<œÙ÷P—øTb¯¯qWå×ç‡üüKÌ•_™tü¤òŸåœžf´ò.Ÿmªêºœzìvœ,å´‚áå0=«íœ%Gf§* Ð*ýü£üŵüÝòVù¡¥[Ëii¯é¶ÚŒvó2D'Œ?+±+ZTuë¶*ôLUùùÙÿ?Ö¿,üãçO$ù+òÖëÌÚOåüV“yƒUý3 ’Û¥ÌjêË A+:î@£r$nª7Å_¡_–ÞwµüÌòŽù‘¥Ã%½Ÿ˜4«Zf§©w$êÄ‘ÉC€hH¯LUšâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Vù‹ç[?Ë_*k¿˜ÚÄrÍa iwº­ÄPdx¬àiP1‘T!j@¯R1Wæ÷äßüü§SüÇóg’¼©æÿËk¯.è_˜rš®5˜oÿWbŒÍ‚"Šqj½A?a¾*ýSÅ^?ùýù¯ÿ*7òóÌ?›Pý)úɯ>¥ëý_Ö£ÇÕá'½x7Ë|Uùÿ? Õ6|ûå_ÊŸ?~]]yM¼ï¥M«èÃW‹PŽâÞ8%Ÿ›¢Á FŒ¸S»r (ä~šâ¯üýüà²ü‚ü¿×7õ›I¯í4;e­`eW•žE‰3l »Šµ MìU|uÿ8÷ÿ9ýªþnyÿ@ü üÃü½ºò…çšôó&‡súZ-B;›åŽVU†È‘¿ò~J"ƒP«ô—|ÿ9íæ_.ùGòÍÚ÷æ„þeòüI§Çu¥G¨K§4âmBÞ%¥ÌJîœÖM”‡ãÁ‡8«ß?(µ;MoȾXÖt‹Cacw¢i×ö3\"’Ù"3=BŠBóo‰©ÈîqW¡â¯Ç_1ÏÕõŸ-Ýy›T¸ü«¸¸òW”üÃ/—µ-jß^ˆ²Ê³]¸ó>½æ}U43O†é-æp)ÎgY8Ô•Uø¤îT â©Wüâoüå­Ïüä÷œ|£æo)ÜyCÍ^H¼¶³Ôì%¾Žù\‚…™#Ь­‡(>¬Õ4Uöf*øþrãþrëWÿœjÖüä¿(ù5¼å­yæâúÒÎÙ5EÓÙfµ6ʈ Á2±ÜSrx÷岬“þq#þr©ç(tÏ0OåÛ,kÞXÕ_HÔ´ù®’íRdð™>T`Êß¡}qо*ÿœ©ÿœº¾ÿœz×¼£ùsäß'ÜyË;q’å,,£¿ŽÁ?ÑøTdŽPY‹ì8@jÃ`Udßóˆ¿ó”ÿÎTùoUó#hSùsTÐõi´}BÂk”º *þx#¿å ÿœQÿÍ®ÝB,Uý/b¯ ÿœ„ÿÉYçüuŸú‚—|¿ÿ>¸ÿÖbò7ý¾¿î±yоÿÅ_€??ù=¿ç+?óYÃÿtÝ;~¯ÿÎÿä„ü¸ÿÀgLÿ“ оŸÅ_€›ò“ÿÎbÛ@ÿ“#~ÀÎ'äü´ÿÀ3Ëß÷N‡{þ*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»xüåþIÌ¿ü<Ãÿté±WâåGüt?ç¿íýÿQçGØ«äùÏÏýgŸÌ/ûcIÿ'~`~KäöÿœSÿÍg7ýÓuUûýо ÿŸÿë6ùûþ`­?ê: UðäÏþ´—üã—þhÍþ o±Wîö*øþ~ÿ¬ÅçŸûrÿÝbÏ}Aÿ8÷ÿ’³Èÿø èßõ*õüUü°þ`ÿä•üýÿͳýDOŠ¿§ï)ÿÇLÿ˜+ù6¸« Å_Ê¿õš2?ósú„“WØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š¿(?ççñÜüÿÍcÿ'!Å[ÿœÿÉ÷ÿ91ÿ6›ÿ'õ?ò}ÿÎ3ÿàM©Éý3kþ}ÿÏÏüØßòrlUú¿Š¿(?ç2¿õ¨¿ç?æ7Týpâ®ÿŸQÿÇóGÿ6¥ÿ&ãÅ_«ø«òƒþroÿ['ò'þ`µoù5>*ý_Å_ÏÈõ›|ýÿ0VŸõ*øògÿZKþqËÿ4fÿP7Ø«÷{|ÿ?GÿÖbóÏý¹î±gо@ü”ÿÖ®ü±ÿÍ3¤ÿÔ+b¯ÛìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«ÿÓûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb¯æ«þpóþqÍ¿ó•>GÔ¬¥ó²hÿ—ZGæEΡ>ˆº\SÍ-ýµ´®ë’È¥ ›ÒKD¤z…±Wô«Š±ÿ6ÇSÿ˜+ù6Ø«ùü¾ÿÉ+ùÿ›foúˆƒSØ«Ïÿ6åó7ý±uú†|UüðþGÊÿ8£ÿ›\ÿº„X«ú^Å^Aÿ9 ÿ’³Ïø ë?õ.*ùþ}qÿ¬Åäoû}Ýbó}ÿŠ¿:ò{ÎV泇þéºv*ý_ÿœ)ÿÉ ùqÿ€Î™ÿ&}?Š¿µ¯Èo<ÿÎDÿÎBÎ@~\þ_yÂ*é©¢A­Å6›ï× ’ÕLhʼ\ ±å)n[±Wíßå‘âü±òo—-­.î/iLw¡U²·H²‚@,¤µqVuŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å^ÿ9cÿ’Có/ÿÏ0ÿÝ:lUùQÿ8!ÿ8‰æïÌ]ò‹þrÎ~wIü¯å4¾¹Ðôô¸’Kq%ĪñµÒ²³‡•}BÒ+°ñ­B¯ÝlUòüççþ³Ïæý±¤ÿ“‰Š¿0?%¿ò{Î)ÿæ³›þ麎*ýþÅ_ÏÈõ›|ýÿ0VŸõ*øògÿZKþqËÿ4fÿP7Ø«÷{|ÿ?GÿÖbóÏý¹î±gо ÿœ{ÿÉYäütoú‚‹zþ*þX0òJþ~ÿæÙ‡þ¢'Å_Ó÷”ÿ㇦Ì¿ü›\Ub¯æ«þqËþqÍ¿ó–Ú7Ÿ<©“Aü¿¶ü»¸¾ÒF—ij]D?¿K‚É"JN9ëñ'J¸«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š¿!çë¶zŽ¡'äõ‡–ÏçX"³¼h–Qo;˜ÄR˜ÛápŽCq;5(v8«éïùÄ?ùÅ wþqÛVóÇž¿0<Ö¾kóGžïm/oîc°KÕíÌíÈFŒW“µÃ’"¨ z⯷1WåüçÇþO¿ùÆü µ/ù?¦b­ϱÿã¹ùáÿ›ûþNMŠ¿WñWåüæWþµüãÇüÆêŸ®Ußóê?øáþhÿæÀÔ¿äÜx«õ~PÎMÿëdþDÿÌ­ÿ&§Å_«ø«âùùþ³oŸ¿æ Óþ£ Å_~LÿëIÎ9æŒÑ¿êû~ïb¯€?çèÿúÌ^yÿ·/ýÖ,ñW”ÎÿÎ"y·Hó'•?ç)?4¼ìža¹K±Ó4«t¸­>¯i4ÐÅ$‘µ$£2ò)ÍØògøhU~«b®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å_ÿÔûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb¯–ÿ+¿ç ¿)?%üë{ù½ùi¡¶—æø§†fK»‡ƒ…ëÈ‘2ƒE/EvÅ_Rb¨kËH¯í屺¡š6À4ª°¡Ü{Uòf›ÿ81ù?¤è>\òEŽ‘pºG•5–×ô¨ÍýÉ1_3+f/ÉÅP|,Jûb¯¯1T%ý…¾©k6™¨Æ³Z\ÆðÍŠ«£‚¬¤xH8«ù÷üÏü›üŠüœÿœ›ü«ü¶ÿœtµ¸·ó–Ÿæ»Y|ɧóÔ.¼-½Õ±W¸å_MىܪÿxA«úÅRO2ùzÇÍÚF¡åMq ºn§i=•Ò+- ñ˜ä–„¬EA¨íб/Ê?Ê-þGyOOü®ü¹¶{O.é~¿Õ`’g™—ë¼òUä,ƲHÇsµh6«Ò1WÎ÷üâå·™<Ãç>êúlÒk>{ÒWE×esªÏf±EE@Ácz°µµò«åùüãvtÉ]$U–Ù …P©Ô»ƒ³oŠ¿]ñWŽy³òɾvóÏ—¿:<Ãg$¾kò´sG¥Ü-Ĩ‘,Á•ùF¬êý iн`š?–^_üäò¶£ùiçëwºÐ5XÒ;¸c•âfT‘dZ¿ 7]:pãC§4ÊY|G%¨Ú£Kÿè¯?óßòÛ£Ü.?ù«wýçþrþ[toû…Çÿ5b«—þ~óÿ9 QÎ÷F+]ÀÓ#Ÿ:œU?çì¿›4ÞkŠÿÆ{û$Å]ÿEeüØÿ\ÒE¿ý’b®ÿ¢²þl¿®?é"ßþÉ1T<ÿó÷Ïj êÕ¾ß×à†èÔtàV8x†®Ý;ª†ÿ¢¼ÿÎCËnÿp¸ÿæ¬UßôWŸùÈoùmÑ¿îüÕŠ¢ ÿŸ¸þyÜšíÕ£Ä7O¨ÛÃjÕÿ)š9j=¨>xª'þŠËù±þþ¸ÿ¤‹û$Å]ÿEeüØÿ\ÒE¿ý’b®ÿ¢²þl¿®?é"ßþÉ1TÏÞ?ç Á"Ý FÂMšªÕ>&‚¾ªßú+Ïüä7ü¶èß÷ þjÅ]ÿEyÿœ†ÿ–ÝþáqÿÍXª=?çí?œ¨“PšäÞw·†"ÉClåG·&ù⫿謿›ïëúH·ÿ²LUßôV_Í÷õÇý$[ÿÙ&*¥7üý³ó¢Ýyè—¥ÇJÞ¬1Ó¿À°Dkày}ªþŠóÿ9 ÿ-º7ýÂãÿš±WÑ^ç!¿å·Fÿ¸\óV*«üýÓóòfj—škZŸ¶-l¢‚_n2 ]úüm½ñTgý—ócýýqÿIÿöIŠ»þŠËù±þþ¸ÿ¤‹û$Å]ÿEeüØÿ\ÒE¿ý’b¨9çp·¥¤ÝéÉj>Ⱥ²ŠywÜòÁß§À((=ñU/ú+Ïüä7ü¶èß÷ þjÅ]ÿEyÿœ†ÿ–ÝþáqÿÍXª2ùûgçMÂóÖî#yÆÀÙ,Ññ÷F†RO¿/ ±U_ú+/æÇûúãþ’-ÿì“wý—ócýýqÿIÿöIŠ­ùûGæü@Éc; …Þ3;ÛË!Óš d,¾ 2×Äb¨ú+Ïüä7ü¶èß÷ þjÅ]ÿEyÿœ†ÿ–ÝþáqÿÍXªåÿŸ¼ÎB·º9JüAtØÔÓ½ M½ËGùû/æÏy®?é"ßþÉ1WÑY6?ß×ô‘oÿd˜«¿è¬¿›ïëúH·ÿ²LUqÿ?püò·¢è7Vˆ‡wúõ¼7LOn%c‡ˆö¡ùâ¨oú+Ïüä7ü¶èß÷ þjÅ]ÿEyÿœ†ÿ–ÝþáqÿÍXª&ßþ~áùåsU×®­]éõ!µ`{ò-܇€ úqTGý—ócýýqÿIÿöIŠ»þŠËù±þþ¸ÿ¤‹û$Å\çì¿›=¦¸ÿ¤‹û$ÅP ÿ?yÿœ„©ô¯tp•øCi±’jšŠŸzb«è¯?óßòÛ£Ü.?ù«wýçþrþ[toû…Çÿ5b¨ôÿŸ´~oÈ¢KÙÜÜ6ò$·Š>]ø!¶b«à95Áº0OûQ‹xËmÓâ;â¨/ú+Ïüä7ü¶èß÷ þjÅ]ÿEyÿœ†ÿ–ÝþáqÿÍXªôÿŸ»Î@;¼¼ÒŒ ³ˆtøã“‰ëÅÏ ­àxšxb¨ïú+/æÇûúãþ’-ÿì“wý—ócýýqÿIÿöIŠ»þŠËù±þþ¸ÿ¤‹û$ÅP³ÿÏÜ¿=­ÛÓÑ.ìRß©¶±\É˿Ʃ§€ãã¾*¡ÿEyÿœ†ÿ–ÝþáqÿÍX«¿è¯?óßòÛ£Ü.?ù«EAÿ?nüî¹ë×0;±õ¡µïÈ4Sr>ŠbªÿôV_Í÷õÇý$[ÿÙ&*ïú+/æÇûúãþ’-ÿì“qÿŸ³~m¨-ÓgœÖìµíQõQQâ*+Š¥ßôWŸùÈoùmÑ¿îüÕŠ»þŠóÿ9 ÿ-º7ýÂãÿš±WÑ^ç!¿å·Fÿ¸\óV*˜ùû7æÛÒÍ1sö¸Mn«^ôU4¦˜«¿è¬¿›ïëúH·ÿ²LUßôV_Í÷õÇý$[ÿÙ&*¡?üý»óºØ ÜÀŒ~ß×â†èS·±CÄøîkŠ¡è¯?óßòÛ£Ü.?ù«wýçþrþ[toû…Çÿ5bªðÏÜ¿=®ÓÖîì^ߨV±[IË·ÆÉ(§ˆãá¾*Šÿ¢²þl¿®?é"ßþÉ1WÑY6?ß×ô‘oÿd˜«¿è¬¿›ïëúH·ÿ²LUÿó÷oùÈb–wšPvA6Ÿ’q98â¼O_ Ugýçþrþ[toû…Çÿ5b®ÿ¢¼ÿÎCËnÿp¸ÿæ¬Uüý«ó’eê·®Û6¦"ÛaÆ3o!]ºüF§|USþŠËù±þþ¸ÿ¤‹û$Å]ÿEeüØÿ\ÒE¿ý’bªrÿÏÚ¿9`_WH¸ r>É»ô."¡ëXżdû|b‡Ç¦*‚ÿ¢¼ÿÎCËnÿp¸ÿæ¬UßôWŸùÈoùmÑ¿îüÕŠ¯þ~íùÿ#ïï4¶·;8‚Â(¤§ù.y…>üOËGÑY6?ß×ô‘oÿd˜«¿è¬¿›ïëúH·ÿ²LUßôV_Í÷õÇý$[ÿÙ&*„›þ~åùñzz-Ý‚[uòÒ+™kß÷б x;xœUGþŠóÿ9 ÿ-º7ýÂãÿš±WÑ^ç!¿å·Fÿ¸\óV*Šƒþ~ÝùÙr k×0<ƒdúŒpÚ­?ÊV†^Gޣ劫ÿÑY6?ß×ô‘oÿd˜«¿è¬¿›ïëúH·ÿ²LU¦ÿŸ³þn -o4¢Qº%·t¯nKõQQâ*+㊥ÿôWŸùÈoùmÑ¿îüÕŠ»þŠóÿ9 ÿ-º7ýÂãÿš±VÇüýçþr»ÞèÔÿ¶\óV*˜ùû/æÕ9§-܉íÀ¯°ú¦Ø«¿è¬¿›ïëúH·ÿ²LUßôV_Í÷õÇý$[ÿÙ&*ïú+/æÇûúãþ’-ÿì“ÿÑüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUÿÒüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUÿÓüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUÿÔüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUÿÕüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUÿÖüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUÿ×üÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUÿÐüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»zoå¯äÇžÿ8¯?E~WywS×g ÅͳÉg¯ïeÓŒ{»(é¾*ýIüšÿŸ1~dù±aÔÿ8õ«*Y½ ÙÛÓP¾©VôÙmÖ½9 ¤§R½Š¨?Ê?ùöw–¿8|ÿù¹ùI§y—QÒåò ö•i¦^Ë7+0»K“)¸‰}"Ma^8‚jlU㟜¿óêŸÏoÊÆš÷Ëúd>oÒ#« NsñíÊÒNñ, 6*üíÖô-KËW³h~c³¸Óõ+vá5µÜO Ñ·ƒÆà2Ÿb1T«v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*î» @µw¾4®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å_ÿÑüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb¬çÈ–^nüÒ¿徇¨ëº¥aÓ­d¸e»ð*ø³P¤â¯ÓÏÉŸùóŸæßž„Zæí‡“4ç¡1HÂþû‰Þ¢D>M:°î±Wêÿä×üú£ò'ò¬E}æ 68jñÑŒúäœà MÂÚF¾U”æÅ_¢z&…¦ùjÊË–vú~›n¼!¶´‰!†5ðHÐQì*šâ¯ÌùÂßýhoùÉ?ûlùþMßb¯ÓìUæ_™_“Düâ³ýù£åÝ3]€/7ÖÉ$‘Ž¿º”R3®ø«ò×óþ|Åùoæ³6¥ù;­jT¼z²Z\Ò#z…Pì— NM4”Øñ=Õ~Oþqϱ¿>ÿ(Œ×‘hÌúLU?[òó›²G½± sZniQüÇ| {cs¦\I§êPÉou –)P££ в°ÜU Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®ÅS]3CÔ5–ôô»i&5¡*¿ù·Aôœ§6¦~²“§ÒdÔ„Iû¾|ž¡£þMßÜÒM^d;¤ü«°Žióöô#´ûö¯îwúof2K|„!¹ý_{Ô4ŸË-#K£¤´£öæ<ÏÝö Ógíl¹z×»oÚô:nÃÁƒq=òßö}Œ'ÉZ-¾£­ù‚Îî–$¸aÅÔ?zã¡Í‡hg–ª—Ø/SìÞ›Ââ~cä[ËuÊÝoL¬–è·qñŠŸêšº¹¸ÁÛ8²l}'Ïõ¼ö§Ùìøwˆâ\þ_ªÞ}=¼¶®`¹FŽEꮥHúm#!!cwI8£æ£’bìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®ÅSÛ-j:J¡ý§øGã¹ú3y¡ösU¬Þ0 wËÒ>ÝÏÀ.·>gäÍôÿ˵}BRÇùcØ}çsøge¡öß<ÉòŽÃæw? ë2öÇóGÍ—Cå»[›ê°ª§zTôñ;çYƒ²0hà|(±ß¯/çþ×_-l²QbÞFÓcÔ4ÉD讟XaFas˜ö+M ú9G !Ø‹þ÷¹Ý©˜ãÈ(Öߤ£oüi=Z×”íñ/Ü̽w±:lûã¸-ãò? †¼]­(óÝ„ßù'Q³«D¢tÈwûð®qÚïc5Z}áSÑçò?¢Ý–.ÓÇ>{{Øœ°ÉçVGCÜs–ˆX Á¸Š?k°Œ„· yZ]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«ÿÒüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìU“ùGÉ>aóþ£—<‹¥_k:¬»¥®Ÿm%ÌÄx„Y¨;šPb¯ÒÏÉŸùôGçOæ1ŠÿÏßRò^”à1k÷7…Ou¶ŠË$L<1WêÿäÏüú?òOò×ÓÔ|ïçœõTâKjrz6Šã©KX ‚òÌó UúOåo'è>FÓãòÿ’´»-#K‹û»[ xíá]©²Fª£îÅY*ìUy§Íº‘ôÙ¼Ëç=JÏIÒmÅf»¾ž8!AþSÈUGߊ¿&ÿ??çñ_–ÞCõô_Ék8êëUoÊÓMFÜW›¯­-ôXÕ}™{â¯Ê¯ÈùùOœ¿'?1¼áù¹¨èZ^ªž|»µºÖ¬£2Ûq6¾ ê²“Ó •ÁõZíÒ˜«÷‡òþ~Kù)ùò ÒâÖ–üÇ5ôfºVسšmÅLTì 8‘¿ßb¸«ï€CÊjàŒU¼UØ«Æÿ5ç¿-;à6¿šÞWÓ5¦+Ág¸EÊ/„w ÆhÿØ:â¯ÊŸÎ/ùò·“u±6¥ù#æ[Ý è‚Écª¨½µ-ÙVUá4kîÞ¹ûöUùAùÅÿ>æüùü˜^êÞX—ZÒa›ýü\GV1  nYá@õØÑWÃòFð»E*•u%YXP‚6 ƒÐŒUf*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUe¦ÝjOéXBó7ù M>g·Ó•äÍbä@nçžcPûƒÒtÊmJú¨È–ÈiðþáAøæ£?mÂH'샿Ó{3–{ä"?iý_k×´?Ê­O£É ¹”~ÔçÿÙ~ñšMGlåÉֽ߯›Ðé»Èâ?Òßìåö=NÓHX”GP(f¢yorî£â-/Û*9R5t¿lˆšxOå~žÏæ4«)]¿FÄzÒt·µ²õGÜo±°Ê:ŒÄ‚‘­¹ú¥Éî/¥ûg<2=' _6—í– ˆ¦/«ùfÓSC¡s'ƒ¨4ùßFdáÕK¸’|úhf0½äçäý„Õ“J‘í_²Ÿ>ã¿ãôfïOÛ³ÖûêûUìÎ)Ÿ˜ýkÉõËÝcJ«…Äcö¡<üÇðÍÖÕÅ—­{ÿ_'žÔö|;Ä?£¿ÙÍ…¯âhì>ó›}aju›ã®óé3Ïám95Ç̳M7ÈfJ5ü§ýXÿ©þ™Øè}ƒóÏáø£únnÕ¯¤|Þ‡¥y^ÎÆ†Ú ?hŠ·ÞwÎËCØzm÷p÷åó;ü>}tòs,º ;Û6à:ùfLãÓ}°ÓIÌ©>›û™ ?a¿VC4n'ÜXÃ6áçß•ÚTÑéS-Ômýiié¦ûç'ìV“&ŸM(䉉ã&ˆ­¸bíûs89Eôþ’ô'Ó}³°§P3%óiÞÙnŽf?¨hݯ§uȾ Ì]N‹¤päˆóåáÕn <óSò³Õ¬Ù¡o´¿ŽÿŽr:ïaôùwÄLúhý»ý®ßjÈ}[°[ï+ßYT„¯ŠoøuÎ7]쎯M¸c¾;Ÿô¼þVí1k¡?/{e(x¸ Ž ç58£Ü\°mnE.Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š¿ÿÓüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»zå/Oæ§|¿ùh—±éÒkú®™ÜÈ]"{™HÌ ‚G&•«úMüšÿŸ<~Py ¡Ô¿3.õ9ê)BÑÎßR±äQ êû<î§`V•ª¯ÓŸ#þ]yWòÏOåÞ‹§èzp§î4ëX­Ñˆ„j97‹5IÜ“Sг}×ô>~VIõ_Ì=&IlÁâ·‘€Q¼)*U •¸·Žoôù´Úñx%G»¯ÈïúÁrEizþ“¯Q,¦ 9ÿuKð?ȱú Á—ñs×,d#.´Ïl„r5Ư4î»eñÈÀ†){§õÛ2a60oËÖº€+{ IàHÜ|Q™ø52Çôšq5LyÅLøïæòmWÈZÂFˆÿ+|KýG㛬­/âö<þ§Ù¸K|d#¸ý{½òÆ¡cRbõ~Ôá×ðÍž-~GÔ?_Ú]¦=Q<ÒY´Ùáß!â»ÿnrßeµZ]øx‡|wû>¯±ÉŽhÉE6=sž”LMÖ°+±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUÿÔüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»O¼­æŸ)kZošôݯ4ËË{Øw§ï H»üÔb¯ï'BÖm|ǦÙù‡KnvWöñ]@Ǽs t?H#MqWb¯†¿?¿çâ_’¿óÞ¾—¬kk®yŠ©Òt>7S+ŠŽ2ÈC í,’ Ü!Å_ˆÿŸßó÷OÍŸÍ[Fü¯Ž$hoU hßXÔ]ʺu:Tz1ÆËZslUùg¬ëZ‡˜ïg×<Ãwq©\¹’{›©^i¥sÕžG%˜û“\U,Å]Š»v*ìUØ«±Wª~U~wù÷òCQý?ùOæýíˆ2 YHŠZtBÕŠP?–Da튿eÿ çô·–¦ þrCËâê-”ë: (íYm$`â͉@>˜â¯Ú_ÉÏùÈÏËoÏû/ÒŸ”žc±Õø¨ym£sÔ#oïm¤ 2 šU)= Å^ÙŠ»~aÿÏÜüõþÿœ|¾Ð£“„ÞdÕ´í-BŸˆª9¼~›Ò–Ônßö¨U'ø«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š¢¬Š-ÄFp?QyЊï•å¾\è·iˆâÅû­ïÁºúV訃²€᜔¦dlîúvÅÍ ù§èÊDeÔE¶FòHíüíu®Ü#Èzt××M²±F?HEÞžìVòéhãˆqfñÕÈk›Ù|³ÿ8Ûæ?6²_þeê_S¶'—Õ!"IÐ?vŸ?ŒøŒÓê}¢Å§ôàžó°ýgìeÄ#Éõב¿-¼£ùvü·§Ä.ÔSës~ösòvû5îˆöÎS[Ú9õŸÞH×pØ|¿]µH’õÓåf³ÀcÂïÓåcà/ ”ú¤w1µ½ÀY"pU‘À*AìAØŒ1Äbl/ æß>Î9y3Íüîô˜¿C_¶áíôI÷‡eýNÑh} Ôiö‘ã|ÿÓ~»lŒÈ|Áæ?ËÌËŽRÚ¨×4¤¯Å)X/ºí"íáÉŽtÚ~ÓÒë9ú%ç·ÛÈý…•FLÇóJÔOÕõlnz.é_gÿš‚ætô†ñÜysù0–9&÷v‹*ú‘È¡¨#Øå1•8ä0ÍBˮٕ µÁµ>»fd$ÖC‘ '2¶ KͰۋ .$ ß £* #¿^™±ìéKĺºNÝÇ„È{zóï÷<‡:7‚v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»FéÅ~°À ÔoòÍ÷³&#W067½ûi«7ÒËóÚ]z>Îf§$VIÓ3°´é¶X­Ë‘™XÙôÉ€ë²ädJöö@}aÀ?ËÔýÙ>NŸ&gå_,y‹ÎïèùGO‘â­â@5ù»Qö©>Ù^Lñ‡6œ‘†/¬üVyþqwJÓPüÇÔþQ¹µµfH¾M!£‘þ¨Ožjóëäv€¯2âO_[@Sì_,K¡ù.ÔižT²·°¶Ú«äGv=Xû±'ß5qK)¹\9f2æÉ?Æ¿åå_”Gˆïñ¯ùxþQ|E+6ÅwÚÝ–«£€ÊÀõˆÂ4µ¸_òÿŸÿç<ç÷º,gDÔ~v€z$ûÂh£ýOzæÏ¯&=ŽãÏŸÍÉÇ®”yîùΓ^qòO9–ÕôåÿwZÕØò“íºš2æÍ¶-dgåïrá—_è—µýµÁàçÒ“§ÛŸLʰ\Ÿ QóJ¯lú‘€†üY}ý§]²²Ž,Œ.þ×®VC²Å‘‘CC‘rÒ=kˆD‰ëMèp^ÝG#.u½Dr¾u¸r´ÜØöy£–ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»ÿÕüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*þÐ?ç|õÿ+þqûÈ:ûIêK™+V禳YžUÞ§Ñ­OZòï\Uõæ*ü’ÿŸÈjžaÐÿ&ôGʺ텴Þa†ÇQŽÒâHVâÞ{K†á0BÇÎ5øZ¢¤mŠ¿— UØ«±Wb®Å]Š»v*ìUØ«±Wb¯Wµòæ‘ü»§þ{ÚYê:6‡& ¶zf²ŽÖ­%Ϧï[fd`ªY#ª)K4Å_ÛGå\ö¾Jòݶ¿q-Þ§§¥ÝÄì^Yf[t;±,K3T±,I&µ=qV{Š¿ŸïùþžªþBü³·“`5 ^æ:øúp[µ>‰Æ*üÅ]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«ßô¹Mí¼õ/±ù‘¾rãÁ";‰}CI—ÅÇw€~Æw¦ÚôÌ’rÀe3_Zè »òB“ÅBŠ’zÐncÇÊj-øñ™r]£\ù«ÏNm<§ºÁ^-ràq_›µmÛÃXáÒïš[÷~Îndpó{”¿ç- «ªþcê2j&„Á2Çòiãaþ¨Jxæ—Uí«‡xGyçòå÷¶qW'Õ>_´Ò|«l4ï.ZCgoµV ÈŽìz±÷$œæ3ÊyÏÉ'ͬ‹OMûå>8]úoßx]úoßx]úoßx]úoßx]úoßx]úoßx^eçË¿*yýYõû$l?Þ¨)Õñ,>Õ;s =³c¢×æÒ}nã¸ýŸ d •µÿÈ/3yAžóòûPö›·Õ¥"9>\Xúo·z©ð\éðvæFÙ£Â{Æãõµ‘©sy\ÞošÊvÒüÛe-•âlÀ£ {”oˆ•k›1¤XÈ#ñÕ¦z~äMýºÈ¾¢n¬*±Êá*p¤£oÄ’32j!å¾{Ÿ¼ÃöÜ·ü§ñÍßdÂäO—ßý1í6Z„aÞoä?k̳zñ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wbª‘?¦ë'ò~ìÉÑçð2Ç'ódÈÚ$,S:y{ðÝÕL¯O·é–àæ›${Øt°¾°fv¯Ãß'tá G/'£ySɾaóŠ%Õ¸K 9÷HiÈ’Ä~€¾eÖjõ˜4¦ª]ߟHùGò³ÊÞ\ãsªª]Ë\PE_hÅAÿd[!(HºGlO.ÃÒ<¿[Ýáó|vѬüc‰UE P@Ø §òŽ´åµOñ·ùŽ?”Gˆïñ·ùŽ?”_ßãoòÿ(¾#¿Æßåþ8þQ|G¿Ëüqü¢øŽÿ—øãùEñþ6ÿ/ñÇò‹â<ïÍÞ_òÇCI¬Ú ºoøù†‘Ë_Ãfÿd,†G“•ƒ´'‡é?š<ËùEªèÜ®<¥v·ÖÃBJ$€{xŸ ©ðhÝéûc]²Š=ïŸT"à麔/ÐL©f­(GQ¾'{qDØæ”jÝp߆l*ò. \¨»¥*‘õ‹Ÿîím”þÔó½6Üy·DV;b¯èþqcþ}1äÊ/«ù¯ó­¡óŸš“‹­´‘ŸÑVÎ;,/½ÁÍ8àvýÊ‘\Uæ_óøhã×çü¢ü¡³ gZº€øUM­²QTÔW×`´^Æ„R…WíØ@U`*Þ*þN?çíþxÿÎCjZ:0h¼¹¥iºR‘Ò­¼o¤5ÉåNØ«ó+v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb¯rò ýkOŒÌlÈ~úÀç/Ú±áÈ|÷}°2ñฑúKÙôË~™£É'z^{³®Œ%û¹‘¾ðWøä´3ýåy9šm‹×tŸË5ù/KÓ¼ïùY~÷VWÖ–÷W|Ôë$jÍE¨W¡$mÆAöAmóW—´°êg,ZˆÑ‰ Hy÷´{œ®+æô¯,~jǬ¡ë5†¢‡‹Å%Bò4 û0Nkõ™áïÄ;Ö™÷é¿|Áð…ߦýñð…ߦýñð…ߦýñð…ߦýñð…ߦýñð…ߦýñð…ߦýñð…FãÌqZÆg¹$kÔ± ÉGNe°Zy·ùæ?3LÚå•£<çf»‘Eà7¾Åúÿ-sg‡A‹ãÎvîïý?/šìñÍßÊÛŸ$Ùiº§˜u50êÓÈ%bIEXÕv¾65a¹ ¦ÁG}Ïev˜ÔÊQ„xa+ãö_µ"VÔ-kÁFÀP}T%n®O>Ôíúæn2ÔCçŸ=MÊýmÇHã{U3ªì¨T/¼¼/´™x³÷¿ðVmyØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUثдßLJºŒ÷nÆÏãé±Ï¾"ýãcö‡Q¨ô’ƒ§CÓ6à:ŒÒN®¬¡’âÁ¯W•¸VAZU ·¨ìû >nk¥ã:´S ™OŽf ۯˠàå¸L¿Oÿ•øáâiü«¿Oÿ•øãÄ¿•wéÿò¿x—ò®ý?þWãþUß§ÿÊüqâ_Ê»ôÿù_ŽÏSJ«öëv*þç%|ð?25üë稛”ž¿¨Ïnk_Üzì!ïHÂŒUâ8«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»{åTüþµf{}5õ çûrÃ/x{eòØ”=Çô¸>Òá霶Bõá2óuŸ¯åëÐêŠÿð.ðÈé'YC“‡bû;òEÿKþ]h7gr-Þù+Çÿç!Û#ÃÕLyßÌú[¥±@ù·ÉÖ:»®¢q²Ê¢Ž>žãØåš]\¡°;w3 ÛF’ØýI¥Û¢1þ™›,×½&ÌPºµ®¡£Vò3è’®éôžÇØå¸g »¿wVq’Aúoß2<|.ý7.ý7.ý7-h± ¦¤ìÁà­3 }P1}nýM¼T¨³£·Ó÷fõºŽåªY †O+¦±(7ÌÍè€õú{dŽ ãsE¯eòÖ‡o§D¶Ö1,QÙAAó÷>ù¨Ôæ36M±%ó'üån|Íå] ý”W˜iePó¢ögl9gðùúÖ'bÁuHzæn2à—j‘uÌìe¨¾Kó=ÇÖu[¹; J’|?Ã; 81Dy_ÏwÌ»W/‰žgξ[~„‡2{±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±W ùQ½X8÷F#øÿõßbµ&“‡ù²#çêý.£^*OUÓcéˆtYŠ}©Ûs´V§Ùu?Ç&FÎ& Ô¾ÔûÒÚM–«JýfÖëÿ7ñÍf ¼&ž?Q†Dy¾kóO—cYšb€?ó¿Ó㛨 ׇ1†Ý7è˜o›êé'£sÑkП—ôß æ ò†õa‰kö§–È:œ,!cE™w¿Ùv>Ƈ)2§g§0Î=?.¬kôÿ¾úëUl´ØÞyÛ¢F žÝ¼Nœ²¨[­B_Þß]ÞiØr"»„^1©û¸«ßñWb®Å_ˆÚ°xÿŸŽØÛ¸ç•41̃–’ò/P:=â¹oߨ ¿nqW“~|ùà~Z~[y»ó™ŽMCÔobe4oV+whŸæ.r1W𹊻v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb¯Dü°ºô5µ·='‰Óéð9©í˜qb¾â?WéwÞÎeàÏ_Î~ŸÐúóKN™Åd/¡[¨YýoI½¶îöÓ(ù”4Ìlrá˜>cïoÇÍôÏüâ‹þü»H:ýRúæ¼,¾åûç7í@àÕ_|AûÇènɱz~µ§õÛ5Ør&%äºÖŸ×lÛaÈÚ S¥yÒç˯õmF¾Ó›áx¤¥xž´&µù–[›CûÄð˼,± rÙ”?å—¿5-äÔÿ*oã´ÕUy˦Ü#è²oÜr°ã˜£µòöyáÔÆãÒCñ¿ØXŒ§Òù¾Zóf­ùù´_6YÍev»…|.?™U]}Ô‘^“.=TxñG—éîø¹P˜°Æ?Mÿ•™>:{Wå—äÿšÿ4¼Òà6ºE~+ûV"_Luÿ«µ~Ó Òö§kàÐm#rþhçñîø´dÍ{ÞÇwþ üª®›åò5Ï0/Ã%É ¢7zUZx%[³6icùžÐõOÑî§ôŸŽÝÁ¦¥“žÁ„>¥{æ þµ¨½w¨EEùâw÷ÌáŠ8EGö³äÎô{›fi±%êº=M³UšmD¾*üú¤?5ì-z‹+Ðû|2J?9Øö£E#ß#úèOð±]R>¹“Œ¸…æZì‹m·/öcVsò¹±Á"{š|2=üŸÉ#Jí+îÌK™ÏB…>M)=VabìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìU›y._ÞËî‡Ñ±ýc=Ø-EK&>ð$>¼:ÎÒŽÀ½¯M^™éæ³Y<>¥œƒÀ÷rÂ6uð•L?Tÿ.-Lþ]ùzø ÿ¸èaÿ‘#ÒðËœäçÁ–CÍÒk!ë>÷“ùÏA§#Ç7Z\βq|á¯i¥Km¸Í„…¹ZlªæMÏ—+¦ù†ÝuM!Ç "”á|j†ä·Ê£12ã¾NÊ:HäõGÒY-ßä7—ÿ6m%׿#u8ãÔyͤ]1ZZ´{ì+Ê2~˪Œ×OU,&¦>.Ƕxq·ó‡ã½ñ×›´wÈZƒùÎ63éÚ„{˜§N59)èÊ{2’§±Ì¨fnÿ8åP6ÜzÓJËUgb¨Ü’z2|m¿•}äùÅï0j?ãÍ)‡–|¿‰]—,‡Å[héY>*ÿºÍs zñ|0ܺ]^¾<8Çòåû~4ûSüÂòß•âo-þQÙ(Œ|2j)-!Ç/‰½‹PÉLËÃŽGy:ŒšY嵿=2ÒþûGÒíçÓ¦¹…eki^~-$\àåvä> *Üâ¯é“v*ìUØ«±Wâ/üâ!ÿÿÎpþsyÙÿy•k}¦ü²Åwmj:ÑmhAûÀÅ_·X«óƒþ~·çðoüã®»až•Æ¿{§i1ç”ââEëE€ûW¾*þH±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìU>ò½çèý^Êìš*Îù,h˜ÚÌ~&9"æöv_ 4%æ>\‹î(tÏ;Èú z6š‚EôÛ£ §0f[CÛ?ç ÔÐuí ZÖö)ðõP¥~ŸK4žØŠË ÷‚>Fÿß7fæúOZÓúíœöˆ‰y&µ§õÛ6Ø26ļ—ZÓúí›|b^atn´›„Ôt¹¤·º‰¹G,LQÔŽá…ͤ8rAè[FüÞçåÿùÉ-;Ì6cÉ?ó:\Z¾’爿HÇ­nl«CQüñp?eÎjr{=,2ñtr1?ͽãºV=Î4ô¦>¬fs6Ô*¿&ÿ%míÿ35ùnõËP,ú-Œ©ê#£"¸øhÀ f!B ³îjhk{@œ0¨í9 ¼¼ëüß4Ç>\Ç„m\ÏãôÓæåbÓG™aÚ=M³'4Û z¦cÓlÕfÈÔKÕt{›f§4Ú‰z®cÓlÕfÈÔKóÛÏòSók_º«nžö1$qSð9ßhŠ¿™%œ¾”‡Urün,žù™wõ-ò@wtô‡üô!OàNo;'Xüþ[º~ÚËáéä{Å|ö|…ËæŽÅ]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]в?*Oèê1©ØH? þ±G±ú YüàcöXû@põñâÆ|ŸAi½³ÚÉffð§©o"x£Ã,²F¤=ïÕŸùÅ„×å>œ‚„ÙÜ^[Ÿ¦f—¢Lä{F\Ϙì¯Ðàëcê.óžöþÎÒfuY"ùGÍš)‰™€Û:,3â0<%àúî›ö¶ÉH;­.g–½Ö£å»Øõæk;è”sÀåO±?1ß¾bäÆ$(½ ‰Š;‡Ø—ó”þ[üÔŠÓòþr£A‹Wµº•-­u{h‚Í’S‹#JÉ _9Ïê»>xo&UÓñú[gËï0︽kó&ÉÏùÀ{¸ô&èw>aüÿ·7Ö·“+‹[ydxÐú¡B¥ :z®õ$PTæ”æí-äj#mºŸÇ~Ì#âöˆ¹ˆØ×Søï| çÍ6þqj¥|ízÒ bÐÚD vÐ×´qÔnLYÈûLs¥Óic„TGël8a§ñêŒÑ4þ›f|C¦Õe{ƒ¦—* eÃgŸÔd·ÑþOÑ>ÆÞ«Õfk„_Tù?Cû†sš¬Îd"ül¿½ý+¨jzÍkõ»¹e¯6-à?›:ÜQáˆó&Ô<˜^¥ßæax¿Ÿ'ánޝ'àõ¦p¾Ýj84ñ‡ó¥öDÓOIÙQ¹ÜWžPï]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å_ÿÒüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUý®ÿÎùãþV/äW<ÒÒzÓ>…ii<Úk%ú¬¤û™"jû⯧ñWñƒÿ9÷åßð¿üä7æšW‡«­I}JSýîDº¯A×Õ¯ñ=J¯qWb®Å]Š»~ßÿÏ¿å7óÇý±­?ê$â¯è÷v*ìUØ«±Wâ7üú@7yÇó«ójoô¶¹oèÊw¯­qyq.õ לgf?¨â¯ÛœUø7ÿ?ÀóÇ£¤y òÚ úÍÖ¡«\GÜ}^8à…ÏÖ˜‘Å_Ï>*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]ж £b1WÞ¾W¾…µúôš(äÿ‚PsÍõXü9÷[Òåña÷€~aêÚStÍf@凱ÿÎMèy³Í¾]­±‹€¾")ʃOa/‡¿Mí„o)÷ùøëvn@¾ÔÖ´þ»g‡#TKÉ5­?®Ù·Ã‘º%äºÖŸ×lÛàÈÚ É5­?®Ù¶Ã‘¶%äšÖŸ×lÛàÈÝú³þrWòïòÎ?äÒâôéoœçaäÿ ÏýcþêN—iËßúKæýǦټÍ7,—ªèö=6ÍViµõ]Ǧ٩Í6¢^«£ØôÛ5Y¦ÔKÕt{›f«4Ú‰~UÃwú_Îk×*H–þb§ÚI¤`^€ùê Pþˆûnɰ £uÃÅ/˜ÿ:ï½;{hfœ±÷»þ,3©öÌ˸}ÿØò¾ÔeáÅ÷Ÿ¸~Ðù»:džv*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUa?Õ®a¸ì’+;æogj?/ž?› ~¿Ø×–Ó˜èrÐêsê¯üûþAªy\ÑXò{=\ËNáf‚5úV3Û­zçí£4O|~â[^²6míþsÐ>ßÃã•és:¬‘|—ç=íü>9Òés8Y"ù‹Ì:Q™Hͽñ e§ÉÂiâºî›ö¶Êd‹K™è6>—™tyiöuC÷L¹‰ž>“î.ÿoI÷ןóðÉ?K~giW=xùvÕ>뻣üsSؘøqŸë¸8}“’°Ÿë¸>XÑ4þ›fú!§U•ì&ŸÓlȈyíVgºùOF22±V£'ucÔ_Sy?Dû;xg=ªÌåc‹ÞµFƒå}g\`²Óo.I=½(Yÿ†hÌøæ#Þ@û\ì0²ü'´ømIþfcü?†w¡ÙäÞLgR~¹æáóåÇ;¸­ÇDBßKìÏ*öóQÅšÿ›ÓøëÖvT*$ù°\àÝ£±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«ÿÓüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUýKÏ›¼ð|ÇùuåIܼ»¯Þ[GwX.R;•cà ’Jú§~³b¯äãþ~ãåÑ¢ÎEjš^?¦4*ú¿Íª×þHSèÅ_™X«±Wb®Å]Š¿oÿçÈ_ò›ùãþØÖŸõqWô{Š»v*ìUƒþfùˆùCÉÞaó`%N—¤ßÞò„}^Ý䨧ú¸«ò×þ|µåÏÑß“Zï˜dP%Ô¼ÏpÓs½¥º®ô¯Ûi;‘á¹8«ö *¿óøO;Ÿ3~~7–‘ë—4=>Ä ; 'xĎĬè>@b¯ÊÜUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ûò—PúÞƒj «B^#þÅ?áHζ±pf>tÒ;7‰§•‘ýT÷í.^™Ïäô=/þqƒPýùÍub6[ý>hÇ¿ÁÇñŒæ·Úl|z›!÷‘ú[ç¼¥Úň`X ³Î0äqÁy6µ§õÛ6Ø26‚òMkOë¶mðänäºÕ‡]³o‡#lKÉ5­?®Ù¶Ã‘¸Пžn¼ä uëŸ?ôþÏö#SœÿHÿº“ƒiKÞñǦٻÍ6ò^«£ØôÛ59¦ÔKÕt{›f«4Ú‰z®cÓlÕfÈÔKѦ—e>§(ø-¡’fÈ¥êÍiýä„GRͬîücü¹‘¥²¾Ô%5y®H,{•P[g±kÅHG¸7æLõIzåXÃŒ_~rßzú¬@ÔC#ì]ð;^ÁÇXÌ»ÏÜð^ÔeâË÷¼þÀñü޼˱Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å_Cyvïë°MÝ£R~tß=ÿ²µ>žïˆùÖÿkÈk1ðÈ7¥iÓtÍ t¹¢ý:ÿŸjj jsò䆫*XÜ¢øzo21úy¯Ü3‘ö¦B^d}ÍZ°/ÐO9h † lsE¥Ìë²Eò_œô·ðøçK¥Ìád‹äï8èE 03£Óe·B‹ç½wMû[fLƒ±Òæy½•¥­éòSìÞ[ŸºEÌ\ÑØ½,Þ“î{×üåä¿¥üõas׎}ן㘛†ßúOfä¬GÞ~àñýOé¶m¢]VW²ù{K22¨a&¢Îþ[¹úx\ƒðq…¤cØŸ¼×=£šEȱJ^¹ì0Åó§™®>³©Nâƒýˆ¡üsÃý©ÔxÚÉžâ#þ”QûmìtPáÆçܧb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WÿÔüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUû¡ÿ>AóÁµóGž¿-¤j­þ›e«F¤ý“g3@äò¾²•ÿTb¯Ù/ùÈoù˯Ë_ùÆ{1/æ&§êkS-lôK'ÔnXý‚8†;¢WnUÛ~ÎcþIÿÎAÿÎa«ÎV]þ_þ‚ÑôÝ:>ÇD¼ºÌº|rÍ8¸{bb­+UG/^1HªdÅ_NäYIBìqU¸«±Wb®Å_·ÿóä/ùMüñÿlkOú‰8«ú=Å]Š»Sšd·FžvT‰³3€*I'`Å_Šó—ŸóžW3j?óˆó‡:[yÃ\ó ½Î•©j¶ãÔ¶KyÅp–Æ¡Xpb$ºvX#_‰Kך*‚ÿœüÒó×üûcËöŸ“ßó”>PoùWïu%Å·›ü¾^òeºnMÚІâ”ß:à]h>åÿŸ{yãMÑ¿4îì¯/ ŽßVÒæ´žEU{‘4.¨¤õcÁÔ-w>&ƒ9Îß­N<~ %ÌoÊÁåÜy´êpÊ07ÛýZÅoa*FàgŽ|%ÖH[æ¯9èoáñÍö—3‰’/’¼ç }¿‡:].g $_,yŸG1; m›èKˆ5c—y –>–¡m%>ÌñŸ¹†W’;;¼9½'ÜÎ;%ý/æ[kž¼l#OºYOñÌ}>>JÆ}ÿ $ÚŸÓl͈pµY^ýå±RFbêrÓo©üŸ¡ý³Õfs!Õ>OÑ>ÎÙÎê³9˜âð?ùøšì|¹ùQ?•žæ$¿Õ®í#ŽÜ¸I2‰‚V¥T¢ÔÒ€:‘—û=ˆÏ?lßß³²ÑÂäü@ÑOlm"ÈBÕH" P³»Çš9EÀ‚9lo“—áÈØ¦#©\… ÄÐ “‚rz; 0|ã<¦y^vêìXý&¹óƧ1Í9Lÿ'æmìa–RÉØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUÿÕüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìU쑟œ>eü”ó2ù›ÈzÌž_»½·}2çRŠÝn$·´¹e£'§nð0$Ôî#a¹ïš®ÖÓK<ˆ³nó°u‘Ód&f‰ýUtó\éžE„ÚZWŒ—²ì@ö;…ÿcÉ»Šf h0èÇsg¤Gãw.Òϯ<aó?¾}ÏBòïäîmi(¾»žãT¸<Úé˜Ð?²½{–$ŸšÝWlÏ$…":y{ÿS½ìäõs¾_/ÓÍõäÏüäǘ(%ƒÉš‚]KË›Gmz¿°(Øqc» îñ¨û$€ò]±ìÞ.Ð.ž£>±èQóäz÷»‰@Opý%³Õô¿8i±yƒËwQ^é÷ Ê9¡nJ|G±4 ì@9çSÅ=4Ì2è\z¦­iývÌü9y&µ§õÛ6ør7D¼—ZÓúí›|9bR­R¯Aei×ÐN?ð  žðJG½æSíǦÙNi©/UÑìzmš¬Ù‰z®cÓlÕf›Q)oæWç7–ÿ&4ÿ®ù‚O_Q‘I¶°…‡­)ìOò%z»{ñ ßO³»/iN¡°ë#È~³å÷"03~fùïÍ^lüýÔ]óäíi¡DÅ­4øª¨ªzqSÜŽ²5Yº-€zF‡Iƒ²cÁ„\9!·Å»ˆcØ<+Ì–÷Þ_¼“Ì—7²[ÌÛÉk#òW§`Z õÿXgC¥íHfˆÇ¨ˆ#¡?ãäòzîˡ>žgˆóóütæ‘Ú~h†fÓ|ÝX_ ÜÐðo¿u¯n£ü¬·/cÿÅ·öþ6kÓöðƒP8$>Gõ}Þoš®gk©¤¹“íHìçæÆ¹ÖÂ< ç…É>9¦ÔrLŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ʼ¹­Å¤¤ßX©©Rª;ëü3³ö_·±ön<ƒ-îAˆN÷ä:8Í1ÌE2¸WWó_îåse§7P+ɇàOÓAóÍØÇ®íï«÷8N²a?‘pdqi7©}ß›ÕôËK¶[KhÊy ܼ|>êggÙ—AÂÇuænÏÜ>CªÕÏ,¸¥ò~›ÿÎ7Îsj^L6þGüì’[ýR;}\’âÐ º´Èîãö{vLB{Çäý:Õ?Gù£O‡Ì_¸ŠóN»ŒI ð8xÝOuaPs™Ã#Ž\2؇_’˜¼ç }¿‡Ç:.g $_%ùÏ@§2tš\Îâù×VÓÌ3+Óup~ã›-¿]© ¯±ÔõîzB«÷3テ›tóà…yþ¦må­(Êë¶ØÎ\!œ¸‹éß'èŸgo Ñê³6Â/ª|Ÿ¡ý³Õfs!›þyÿÎ_hŸ“Ëå?$,ZÇœ¨Q”VÖmÿ?÷Ò·æË°a¡ìiêÏöÚ}Þ^nË Üò~?yÓÌºÏæ©qæÏ?ßK©j·_nI[ ìª¨¯Âª¯ìŒìqi¡†<<¿üÜøä­¡³ç­KË:Í}åIÙA5hªÈû-ýóŠÔû7ŸA3›A2;àO?‰Øÿ¿ôž‡º9Çañ»äǯ|Ön-¦µ¾ »àW "›wOߘÚkDðdÅš'^*EmÔwïó.f- ‰°ó¬ó'pìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUÿÖüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«ì¿ùÃïùÍO9Î#ëßYѵ/'ÞÊ­ªhsHD2–¸Šà(  0dVP¼UY¿‘Ÿ^Lÿœ‹òµ·æ/åuúÞió|ÂÅŬàÐOT‘kî¬(èÌŒ¬U{&*ùóþr'þqÈ_ó“Þ^o(þgéâWŒ1²Ô ¢^YÈÃíÃ- NHÁ£zJh(«ù]ÿœºÿœóçüâf¤×ÔgVòeļ,uÛXȉ«öc¸]ÌÓöX•o÷[µ |QŠ»~ßÿÏ¿å7óÇý±­?ê$â¯è÷|#ÿ9ÿ9ïäùÅKFÑ*ºïŸçŒMÚAÉ †K§ôPõ†I?aiWU_ ~SÎþhÎiù†ÛþrþsºöêÓBþóKòœ|­›ÐcÈ#F6šÃýê—¬ Ì«öçË^YÒ|›¥Úy[ÊvVúncÃkikÅ Q¯EDPÇ~¸ªyŠ¿:?ç9?çàžZÿœTÓäòŸ–½kó*êÛéÜ뒸÷źÆNoÐOËßÍï.~pØ}s@“ÑÔ#Pn,%#ÖŒ÷#ùÒ½}¹o‡8dåìéT÷$9Ô|¾ö£mkOë¶8r2‰y.µ§õÛ6ør7D¼oCŸëÚ•í§_BFZ²#øfÛ0áˆ=ìƒÙô{›f£4Ø’õ]Ǧ٪͑¤—…þjÎL[y]ŸÊ_–u}«\( ߈é#øïÊ…suÙ~Íœÿ¼Ïéw"PûOÚ˜ã½Ëå o/\_^Iæ<\6¡¬LÞ£z­Ì+{“öˆíû+Û 9ÕK8„| ]Âþ¿×ÙöWgËâ‘Üôý~oÛ«Qà€âëðî{Ëóró®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*« Í‹4t䦢¢¹v›Q-<ÆHóÅ‹&2¢õ¿/y†;ðü¯ÚOâ=³Ù» Ú}¥úf9ÇôǼ}Ý{Ï?¬Ò~ç¤XÞtÎO—*·¹IWÓ”§¨90\ ÀÃß?%ÿç |ÓùtN‡)¿òìÍÊëK¦Þ,‡sÓöÔo·5`)šífCV7Øô#Ÿí $MŽÅú‰åOÌß+þué'\òtõ™}fÎZ-Å»νÁìëUnÆ ÌKO=$¸gð= ­Ï„Ûɼç }¿‡Ç7\ο$_'yÇG6þ¤ týÙÑaÉÄhì^g¡¯éõFô<ñËbåjw³è'è•âi˜¬®,"úcD†ÏC´}_Xš;[+tç,Ò°TEÉ;g?žff†åÍÅ Ø>Nüãÿœ³¿óMäÿÊg’ÇJ5Ž}KtžaЈûćÇûÆÈ*f²-&;PJžNz±êsyÉÈÞl~ú÷®ù\¼XØ>¯ªGiOpÜPaku¸ô92ñC¼ù;=>3AâÚάڬ¾¡P±®Ê;ÓÜçŒöÿnÓÉuQG¿âG!ö½.›OàŠIóBä;v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»ÿ×üÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±W½ÿÎ;ÎHùÛþq‹Í1ùóòÆóÒ‘¸Ç{c7&´½„úSƨÜñ`C¡5FS\UýkÎ(ÿÎ^y+þrÓËâ&KõMrÑPjº,î Í›¶ÕÚž¤LAôåQF0G Š«ê¼U)×t7ÍuÏ—|Éiþ—{CskuË ±°£+£¬«ùßÿœÚÿŸO_ùGëšó‹ÐM¨hƒ”×~[«Kul:–³cVž1þúbf_Ø2Öˆ«ðòHÞh¥R®¤«+ FÄzŠ¿mçÉ—PÙyÇÏ—·²$6ðèvÒI$Œà–fc°nIØ UõüäGüüCÌ¿š~b?óŽó6RkÞfºf†çÌP x!PhíkÌz|¿ܤD¿î°ü–@«Úÿç?çܺä•âþmþt\¯œ?5n$7O{rZk{9œòf‡Õø¥š»›‰*ÿv±üE•~›â®Å_ŽßóŸóóM?òd^þOþC\C¨yôr‚ûRIm¥(UkðËr?—xâoï98h¯æZÖµ1ßÜëþ`ºžûS¼•繺¹‘¥ši\ÕÝÉff&¤“SŠ¥˜«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb«â•áuš+"ÊÊhA8QLdbls}#ù{ùž·Å4y‚]ì±ÍÑdìðoÀüúò§Ù¯.£»ö=ÇcöðÍXòí.‡¿öýï¢lµ›ç58=H,®ÓQé¾cK0XÎ¥åÛ‹K´óG‘®OÖ oQ}&཈û$÷ý–èz“™ó‰GÃÌ8¢{÷ü}íñÉо”ü¬ÿœ´ó<‹äÿÌàºg˜ˆÖáÀŽÛ·.ѹÿ€oÙ+P¹ÎvŸ³RÁûÝ?ªÜÈýcíjN:Ü=ÓZÓúíš\9%òoåœÿ^óg™í:ú’/Ý4ƒøgUÚ1áÃŒ÷÷ÒúZ}OMòµŒšç˜.#´²„UåÐ{Ü“Ø Ïlç9ç—“ѨîùÏ_žzçæ´²ùcÈ ú—á=Ë|2J½ù‘ÐÒ55?´i°êô=‰@LÞ©ô»õŸƒ*ܤº&‹cå˜};1Îv¼™¾ÓAì?¾_›4³ùw4ÎvëÍG®ø#¢XFµ­Áa ——²,pÆ*ÌÇa™¸p‡†"ÉhÍš8¢e#@u|“çÌ3»YYr‹Nìôi)ݽ¼ßíÚvwe0â–òû½ß­óþÖí©jÏ 6Ú}ÿ©æÙ¶tNÅ]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUت¤R¼.%…Šºš‚:Œ³iaœ r!ˆ¢õO-ù©nékvBÜvðo—¿·Ýžµìïµ1×V,»dû'îî>_.á¡Öè87/¹é–—Ý7ÎÈK“%µÔ=ò@¸SÄÈt1j~TÔ"ó'”.ä±Ô¡5W‰©Pz©=Ô‚­Üd2âŽQRs-ÃïË?ùÉ+ó5Ëžqé¾e E?f –ÿ Ÿ°çù ßöIû#G—DpŽãí¿W¡1QÜ/üÅÐý+K©)öbýÊs?K™Ôz‡½óGäõ¿é[Y'ëÆá—þOñÍŒ²T\žÔÇÃ/Ò_HêÞuп,4ñªyŽ_Þ°>…´t2ÊGòŽÃÅŽÃçAš¬‚YM:M$³Íñ¿ææÎ»ù¥8}^Ck£ÄÕ·±ˆƒÁ›ùšŸ´Ø…2ôúXâåϽßcã¹ïyÌ·‹úqÑTv•l£ŒÊAwZï%Ëlj„ëzô:tfYÛsöTucíš®Õíl]!÷²>_¤òÏK¤9 ‹jš´ú´¾µÁ¢²ƒ¢óïž5Úý³—´§Å=€å‘ýg¼þž“áÌÔ·»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ÿÿÐüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb¬ûòËóCÌÿ“žc²üÂü·ÔfÒõë- ÄDn£#©ªº0Ù‘VF*þ­ç¿ç?¼¯ÿ9c§/–õ‹ùk+½(½#¹U´öE‰gJ ¼g÷‘o^IIWèN*ìUù—ÿ9§ÿ>Øò‡üä¼w>yò'Õü·ùC9¼T+i¨7^7ˆ€äíõ„A_eUU~;þ@ÿÏ»¿ç |׿]{òŸVŠ÷É^W2Ckæ-BrÂÚê(ÛÔHàôȀך„oD&GVà1Wôsÿ8íÿ8Çä/ùÆ//”,4ñÈÞêÑï/$Qöæ–‚£¯P±¥O5Uô*²Iie`¨ ³3ä’zŠ¿Ÿ_ùÏÏùúCÞýwòcþq†ÿ·Å§ækv£?NQX8;/UyúŸ÷M$e_‚$–%˜ÔÉ8«X«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»{—4^Ȧ‘æ'&–+ƒÕ|žãü®ÝöÜs½¥Øü~¼\úÕúž³±û‚±æ;t—w¿ËÏæú^ÓT #TPA뜤±ÓÚFVÈ-õ?|¢XÙ‚–ù‹DÓüÕ§~¼gQHæ_¶¿Ô{Àï–éóËÛ—sl2¦ÿ—ÿÚ÷åL‘y[ÏbMKË„ð‚á~)a^Ü ûJ;ÆÆ£öM64ëû¿÷˜}3ê:ë T÷ /’¿7´O%y‡Î>h”½Üw÷’I§Å*f <¬ ,>£IÙIÛ.ÖvVMN,XùpÄ{¶6f6-RóÌ›—«¯yîv‡MBMµ”uTU?ʽ«ÝÍ]¾T¥ø¡‹³ãÁ„Yë/ÇÝɪY6 Ú  Ó [;X AEE0¤ ÍËŒei}Î¥ï–GXG˜¼Õk¡Û=ö¡'ÆÀ´ÇÁGrÏlÍÒé%ž\1&¯Y 4xæh}þAòW›üçyæÉùLLvˆk ì=Ï‹~®ÙÚètÒ·=Oã£ç¥Ú“ÖË}¢9Ò|Øvgº·b®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±VÁ ÔlFkp¯Cò÷šÍVÓQo‹¢È{û7¿¾z_³žÖø•‡Rwä'ßå/?>½wÜéõzâ‡Éé¶ú‡¾z.–xS˜u|•¸ÒˆžHî×ã4qöXuØ@=«Ê¿ó‘–§Må?s¿°’ !¶¼Ñ„(b~Úüþ5ñaA˜’À"n-»*9=î¿8ÓÉún—Ö5»‹¹2ã÷q¡cÝA¢ôîOcl½[3ÕöO”NF¢÷Ë ¼Õo5«·ÖüÇp÷wòš³HkO@`(a–F"-¦"#†‚„Ú¾NÑ)=Æ£ï‘%Ȇ®ù–=9iöæ?eüO€Î·;fG}æyGôžá÷ôvZ]È|žG{{6¡)¸ºnN~à<xæ¿_“[äÊlŸÀtAÆ(!3 ±Ø«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb¯ÿÑüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®ÅS}_Ô¼«¨ÚùËWsØj¶R¬ö×VÒ4rÅ"«#©{ŒUý5ÿÎÏÌ4ÏÏ$³ü¥üòž 7ó†Òý¸Åm«7@X®[ýö(’·÷T$D~½b®Å]Š»I|Çæ=+Ê]ßš<ÓyŸ¤XBÓÝ]ÜȱÅh*ÌîÄ*þb¿ç>?çåZŸçó]þSþLÉ>™ùr¢ºº Çs«wæ>ÔvÆŸ [4‹¼Ô¯¤Š¿$±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±W¦y'ó /ÓõÒéõ îÑü¼G·Ýàu£Ùc?ª;KïzÉí¹i}Þ?l}Þ^_'Ò–ÜWq¥Í´Šñ8ª²š‚3’É€ÀÑØ½Þ<£ ≰z§QjžùIÆÛj—PÞÄÖ·j²D⌭¸8#a1m3Ë:n™r× H5_pŸÔøú÷Ìœš™ÌW.ÿ6Ùj …2×Õ=óch´¾mSß&1¢ØO™üékåø ×-ÊVÓˆ‰ð'3ôz j ]Os¯íÒ†Ž7.}Sû<ß/ëþa¼óɼÔ½B û(<þ=Nv:],tñáϽóÍnºz¹qLû‡@‘æK†ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±VU¢ù‰í)mvI‹¢·uþÌî}œö¬é« Üy u‘ïÚ=ܰ5:1=ãÍèpja€e5pFz„2 €A°yQ< ”z—¾Ym' «Þ¤Êc–Œ§¨8ÛˆÄØPµxlô êNçïÄlË 3æ¬ú—¾6Äa@Ë©{à¶ØábZÏ™¨0ÁñL~åùç'í´ðЫ'ÙŸpùùì4Ú.=Ï'Ë+ÎæY˜³¶äœòLùçžFs$“Ì—qˆŠ yR]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUÿÒüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]НŽG…ÖX˜«© ¬¦„¸ Ž„b¯ßßùÀ/ùú1scù)ÿ99}¿Ám¥ùžá÷'eHoØþ$øzÝåÅ_¿1È“"ËF•”ÔwÔU~*ó¯Í_Í*~Jynóóó3R‡KÑ,–¯,§âw¡+H>)%z( ³vqWòÿ9µÿ9ïæ¯ùË-Qô-<Í£~\ÚMÊËHW§(O‹Â»<„n©S]“r‘Õ|Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*Ë<³æË¯.ÉÁI’ÑÇ?Šøט:Ýu¸÷þ·kÙ«=®qê?HóûÞû¦ùŠ Fº´4m÷ƒàGcœ®m4±¿Óꡨ „ÕuO|§Ãr-yÕ}ðxkÄ¢ú§¾KÃE°¿2ùÞ- QRK¶ WaîÞÞÝÿØh»8ç6vÿ©ÔvŸkÇF(o.ƒôŸÆï¿Ô.59ÚòùÌ’·RPðÙÔâÅC†"ƒÀçÔK<¸æl”XÒìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®ÅSM?T’ÌðbL^,ê;ÚIöqàŸ«wXùÇõr÷4eÀ'¿V_ ùuªžã=kO©†¢x̓ȇ_,UÍ/›/¶fý±µð”ÚõÎ HÆþ£¬²Ösñt-áòÎÚ/jÆç7.F]#ä?¥çÈ{ùeáÓu,`’MNäç™ÊFFÏ79¬ ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å_ÿÓüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ý{ÿœÿŸ˜j_‘ÍgùIùå<ú—åõVMA¹Íu¤®Á@“Kj¿ï° Ä?ºªUûÓùåÿ9mùqù äX7<Ë«Ay¦êúš42$ÒêlÉÉÚ†…H ´„úh, _ÉÿüåGüå¿¿ç,|È|Ëçy¾«£Û3®—£@ìm¬ã$ÓÃÔ”·3ÏÐ@¨ª¾[Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìU5Òu{"_ZØü'í¡èÃúøÇÔi£œQù¹º|ô’âÄt?Ž÷±iZÌZ´^½³n>Òª}ÿ®sz4°š?7¿Ñk¡«>#¨M=FñÌzsg˜|Ô,+gbCÜô'¨OêÌæÏG ñ}Rå÷¼ÿjöÐÓú1ï/²?·ð^U,¯3™fbÎÆ¤“RNtˆˆ ñ3™™³¹+0±v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š£-/Ѫ»¡ê¹ºìnÜÉÙ³¸ïÎ=»¸ùüÚòcePN— êDj?V{göŽ=tt–æÝa³S¬?xõéþ¯õÿo5Ø{0FW-ÇOÚïµ~ÐË$`8Iæâ_ö°bk¹Í«Í;v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*¯opöÍêF~c±Í‡föž]øñŸxèGqŠc8 («ÍEî‡S¸ñÍ¿mûO“´GG :‹æ|ÏwpøŸ*ñáK³˜nv*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»ÿÕüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUÿÖüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUÿ×üÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUÿÐüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUÿÑüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUÿÒüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUigq(µ±ŠI¦j‘©f4Üì*qTßü'®Õ²÷þ‘äÿšqW„õÏú¶^ÿÒ<ŸóN*ïðž¹ÿVËßúG“þiÅP÷^^Õlbk«Û¨aZry!uQSAR@¤ÓBØé—š›4zm¼× ¢¬!œâxƒLUmîu¦8ƒQ‚[yJò *2 ¥hÀTU1ÊúÌȲŧ^20 ¬¶òAÜ@ÜUøO\ÿ«eïý#Éÿ4â®ÿ ëŸõl½ÿ¤y?æœUßá=sþ­—¿ô'üÓŠ¥ÎágúƒE ºçéú\O>dÓµ®Ô늦ÿá=sþ­—¿ô'üÓŠ»ü'®Õ²÷þ‘äÿšqW„õÏú¶^ÿÒ<ŸóN*µü«­F¦I4ÛÅU’mäÜü8ªCŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]о¼ÿœüŽòïüä_ç‘ùSçö»MúÞþYZÊUŠnVöÏ*Q™\ÉE~˜«÷‹þˆÛù ÿ->fÿ¸ŒöMŠ»þˆÛù ÿ->fÿ¸ŒöMŠ»þˆÛù ÿ->fÿ¸ŒöMоlÿœ¾ÿŸbþOþFþOù§ó[ÉsëÏ­höðKl·w±I i.bˆóUI\ôa¾*øgþ}·ÿ8ŸäŸùÊÿ2y—Ëßšj1Úé:tVçN!bòMÀò/•öªUÿ?ÿœ\òoüâŸô/'~XI¨Ia¨èÂþc¨N“?«õ‰bøJ$`/Pï]ñWé×ä_üúòSóòÛÉߘ^`¸ó êš÷—´RìA Æ'»´Ži8)·$/'ã̆êÃN»ºˆ>¡ ^pÂμ€·˜¼UØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å_¥ÿóîßùÂ_*ÿÎbÿŒ?Ç:¶§¥ÿ‡?E}_ôq‡÷Ÿ]ú×>~¬oö}ãJu5®Ø«ô¿þˆ—ùYÿSg™¾û/ú¡Š»þˆ—ùYÿSg™¾û/ú¡Š»þˆ—ùYÿSg™¾û/ú¡Š¿=¿çáó^PÿœAò÷—¼ÉägVÔçÖ/ç´•5Xâæ úQ¡©>$â¬ãþpCþ}ÃäùÊÏËi3üã®ë:uüz½Öž!°6þ—c‰Ã~ö'nDÈk½6b¯‡?1ÿ!4&Î@Íÿ8éayw.‰™¬´Aw'§õŸFâhãgÙBsÍ>tÛ~ÚÑÿ+?êló7ßeÿT1WÑÿ+?êló7ßeÿT1WÑÿ+?êló7ßeÿT1V3çOùó7å–|½«yŽÓÍ>d’}>Âêî4sgÅš™Àj@ Ðâ¯ÈOùÁÿùÇ}þr‡óBßò§Í×ך~Ÿ5…åÙžÇÓõC@ ¨¢ºÐ×}±Wíý/ò³þ¦Ï3}ö_õCwý/ò³þ¦Ï3}ö_õCwý/ò³þ¦Ï3}ö_õC|Ïÿ9…ÿ>¸òüãŸå˜¿9|¯ævûSѾ¡èÛÞ_Eþ³}³rôáVÙe$Q‡ÄvÛ~â®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å_ÿÓüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUõŸüáçÆÿ8Ùù·¤þmùæÚúïG°·¾ŠX´Øâ’à›‹g‰x¬²D„`M\mÒ§lUû—ÿE«üÿ«œÿéNÿ²üUßôZ¿Éú°yÏþtïû/Å]ÿE«üÿ«œÿéNÿ²üUòÿüægüýò³þr'òwÌŸ“žJÒ<Ík­k£ý µ [(í×ê×ð\¿6ŠòWH˜-¾" © ¾8ÿŸtÿÎ]ù;þqÌ~cóæMŽ­}m¬iðZ@ºL6òº¼ró%ÄóÀ§J5튱ùø_üå•ç,ÿ1tÏÌoË›=NËM²òý¶•$z¬PÅ1š+»©™•ašeáÆe–¡¾P•_ª•Ÿóø?ɯ$y/ËžKÕ´?7I}£èú~Ÿ;Áe§´m%µºDå _+,§‰*¦@銳Ïú-_ä‡ýX<çÿH:wý—â®ÿ¢ÕþHÕƒÎôƒ§Ù~*ïú-_ä‡ýX<çÿH:wý—â¯ÃMcóã@Ô?ç$“þrNkáå•óÅ·™M³G×~«ú\²pý^ @_W‡-¹Ó|Uû—ÿE«üÿ«œÿéNÿ²üUßôZ¿Éú°yÏþtïû/Å]ÿE«üÿ«œÿéNÿ²üU‹ùßþ!ù/æ_.jþ\±Ð¼à—:†ŸuiIe§„4LŠX‹â@ï@M;UüÔâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb¯lÿœ{ü‡×ÿç$üïeùIäk›Mbþ+‰b—R’XíÀ·‰¥nMr¸%TD;õ ß~‰Ñ?;ÿêÿäÏúNÔìƒwýSó¿þ¯þLÿ¤íGþÈ1T£ÿ>aüìÓ-gÔg×¼œb·‰å`·º‰$"–4­€ ñÅ_‘¸«êùÅùÄO8ÿÎ]jº¯—?-¯´›Ö;¹ÛVšâ$d‘ø†'$×­BŠwÅPó”óŠ^mÿœI×ôÿ%þcÞéW·Ú•é_IšycXýWŠŒg† ÉÁH¥7튾´ü½ÿŸDþpþeyWCüÆÐµ¿)E¦ëúe–«kÍåúÌÞB³F²*Y:‡ à0V` hÄoвÿú"§çý_ü™ÿIÚýb®ÿ¢*~wÿÕÿÉŸô¨ÿÙ*øþr_þq³ÌßóŠþnOË/Ì+½6óT’Æ@I¥Ë4°zs;¢ŽSE r3QÂ7=•y“|¯uç}Jò^’ñG}¬_[ið<å–5’æU‰ • ÁC0äB±§@zb¯Õ¯ú"§çý_ü™ÿIÚýb®ÿ¢*~wÿÕÿÉŸô¨ÿÙ*ïú"§çý_ü™ÿIÚýb¯ËßÍËÍGò—ÍÚ×嗘巟TÐo§Óîd´ghH£ÙÕ©#b餀 Uâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ûþqGþq¿óþrô÷ý õçÕ?D}Gô—û’{_Yõ½²G:zRuû5ÿ+}ÿDßÿœ¾ÿ«Ïþ’ÿ\UßôMÿùËïú¼ÿáÉ/õÅ^_ùÍÿ8{ÿ99ù äíKó_ó\š=Jú¿ÖZßÌK úÅÄvéÅ~9¾§¶*üô×<å¯ù#ƒÌš­ö¡LZ5»¹–`¤Š¡Ø€iኾ×ÿœhÿœBüýüòò‹ùÓò?Pú¯—VúkFôÃÙÿ¤FˆÎ}5 teø»ý«ç6þWy×Ë¿šR~Qù†~~}MbßMi¾´dÿM•Ñco¬öf_·^Ø«ôOþ‰¿ÿ9}ÿWŸü9%þ¸«¿è›ÿó—ßõyÿÃ’_늻þ‰¿ÿ9}ÿWŸü9%þ¸«ó»ó'XüÉü·ó±ùiç/0ê‡TÒ.§Óï£MNâXŒ‘1GPyÑ—¯mÆ*Šÿœqü¥óßç_œ¢ò7äµÇÕ¼Ë%¬ó¤Ÿ[k?ÝDz«B*Nø«ôþ‰¿ÿ9}ÿWŸü9%þ¸«¿è›ÿó—ßõyÿÃ’_능zçüûÛþr×ËÚu濨ë,-,m幘¯˜å$Gj îhØ«óUüÃóV¹k&•­ëšå”¼}H./f–6âÁ‡$f ЀEFÄаüUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«ÿÔüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUõŸüá/ÿ3?6ôŸ(~{MN¸·¾{™.o~£xíâ¬üÓ\-/‹§|Uû—ÿBIÿ85ÿW]ÿ ÿeX«¿èI?ç¿êë£á`ì«JõÏù¯ùÂ]:òæÃTÑÌvò¼@y¸±æ¨JÐ}g}ûb¯æW~‹ÿϺ'ÿ&ÿ8<Çæ=7þrZæÒÛL³Óà–ÀÝê¿£A™¥âá_Ô™ãÚ¦qV/ÿ? ü­ü©ü£üÅÓ<·ÿ8ßqkså©ü¿mwpöš—éwtŽ ¾¤œO¦‘|ØQ©ñn«õOò³þpãþpÃ]ò_—5¿6êzBk—š>Ÿq~¯æ³ ™mѦ ÖGš­”«<ÿ¡$ÿœÿ«®ÿ…ÿ²¬Ußô$Ÿóƒ_õuÑ¿ð°?öUŠ¿?ç>ÿ-?,?*3aò¿üãÄö×VmÖáž×Pý ŸYy%[œ›ñTøymÖ›â¯?$4M Ìߘ¾PòßžÝ#òÖ¡æ *ÓTy&ôlæ»'--WÓ2ÕzŽ#⨦*þ‹¿èI?ç¿êë£á`ì«wý 'üà×ý]toü,ý•b®ÿ¡$ÿœÿ«®ÿ…ÿ²¬Uüèþwèš–1|ßå¿":Iå­?Ì­¦–ñÍë£YÃw"@VZ·¨ ahõ<‡ÅS\Uåø«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«Û?çüýùùgç{/7þDÃ<þq·Šá-£¶²úô…$‰’ZAÁùQ TñøzöÅ_tù«þ~+ÿ9äX¢»ó´—:<±H¤Ô|µ²ÈÀTª™mÔô« ÿ¢°ÎIÔÇeÿp‹ú¥Š¡¯?çê¿ó‘·öòØÝyŠÍ¡š6ÀÒl…U…â/Š¿:qWÔÿ󋜜Ÿ“ú®«©Î4Û]Üêw–±Å~-4¯ÒDB¯É '§'˽zb¨?ùÊ?ÍŸÍßÍíOÖÿç$í®­µËk«Ù­Þ™ú9·ªíQ§!Í›â¡ð®Ø«êï"ÿÎdÎaù;Ê6äë PyOJÒm-ô釕ÖX…¼ °¸œÛéé*ŸP±ä>*ž¸«ÿ¢°ÎIÔÇeÿp‹ú¥Š»þŠÁÿ9%ÿS—ýÂ,ê–*ùóÇóçÎ_ó‘~b_?þk^G}­%¤VK,Vñ[¯£3(áªÔmé\U€y7UÕt-JÖü¤¬úåõµÅ‚¤~«˜¥V„,t<Ép(´<ºPâ¯Õ¯ú¿ùÎ_úµk?øGû%Å]ÿC·ÿ9ËÿV­gÿñÿd¸«¿èvÿç9êÕ¬ÿá?ì—|ù‹ùuùËçýwWüÊóÏ”<Äúž§q>¡¨\êýI y…ˆ"/Sµ«çœUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å__ÿÎ)ÎYþeÿÎ.þžÿ•3ce{úsê?^úå”×\>©ëz\}7N5õžµ­h)JUõUïüþþrN“êú…‡—`–¸K¥Ü#P÷£\LU ÿE’üûÿ–o,ÿÜ:û)Å^Qùáÿ?-üÜÿœòN©ùEç¸4$Ðõ«}a¬ì¥ŠaõkˆîS‹´ÎÇ×á5Z|Uùñоûÿœhÿœëüãÿœrò‹þ_þSiºuÞˆ÷Ó^´—Zt÷ëJˆ¬9Ç* QjW|áæßÎ_5y«óFOÏ-jÞó„šÅ¾¬Ð$ýjGEô‹âJ-W•OŽ*ý »ÿŸ¹ÎGØDn¯´ V€¼šEÒ¨®Ãs8ªQÿE’üûÿ–o,ÿÜ:û)Å]ÿE’üûÿ–o,ÿÜ:û)Å_›™^Ôÿ5<Õ¬~dyœBº¶¹{5ýзB‘ fbÍÁIb§`Iùâ¯Aÿœrüðóüãßœ¢üÆü¬¶·º×¢µžÙc¹·{ˆý9€xFÈÕlk¶*ýÿ¢²ÿÎKÕFÿ¸5ßýWÅ]ÿEeÿœ–ÿ«ÿpk¿ú¯Š¥Z÷üý3þr?Ìzeï—µ H·öÓZÊSG» Âd(ÜI˜ÐÐí¶*ü®ºòö«c]^ØÝC Ó“É ªŠš ’&˜ªOŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»ÿÕüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUïßóŒ¿Z‡üäÏæ‡å…¨A¦^_Ãu2Ý\£^ó§–t}CÌ“ù×G–=>Ò{¶m.a eÊ‚M*@¦*ü\Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å_UÎ~}éó?šÚWæïšìîïôÛ {Øž /OÖcqnñ)£"ÐÔôÅ_UÿÏÂ?ç=|¡ÿ9}åï/yoÉ:6­¦O£ßÏw+ê".²EÀô¤sP|@Å_•X«±Wb¯ÐŸù÷¿üåÿ–ÿç|Ãæ1ùÛLÔu85‹-!M8CÉ9y’Þ« ¡â©güüþrÇË¿ó—^qÑ|ëä­7PÓ-tÍ iòG¨¹³ýbIy/¤î8ÑÀÜÖµÛ}íä¯ùûåß–'4ŸÉK¿.kòjš”­|½%Ê OA§†ÁmL‹Yƒp,**¼¸ö®Ø«ðOv*ìUœþXy¦ßÈÞqò÷uäš×GÕì5 cŠœÝ-®VU©‘ ARzœUýÿÑm?+?êSó7ÝeÿUñWÑm?+?êSó7ÝeÿUñWÑm?+?êSó7ÝeÿUñV3çOùüÏ噼½«yrÓÊÞdŽ}BÂêÒ7qgÅZh™jNM;Ðb¯çv*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wéÿüû{þsWÈÿó‡ßã?ùYz~µ}þ"ýõOÑ[KÃê_Zõ=_^â W×Nuˆ<ßù·«Ë­kÖ‰cıÅ[t‘äT¤H‹@ò9©øºÒ˜«Ú-ç=?>ì´ü‰kçK´Ðb±]5-EµŸj±zB:˜yP'ÃZ×Þ¸«äUòëë|¯Kv‚ÆYƒžE€øUºïLUæØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUÿÐüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìU5Ðô-KÌ÷öþ_òÝÆ¡ª]È"·´´‰æžW=8Ðf=€â¯KüÂÿœ}üÌü§³‹ZüËò–µ¡éÓIèÇsc40™$'¨Ê‘µ©ÐlqWâ¬ËÈŸ—žfüÏÕWÊ¿—zM浬™y«ë7Dˆlì {‰ßˆ©â‘‚Ä &”vÅYWæ/䯟¿(¸üÐòέ  Î_VmJÎ[t”¥9ÙÔ+¨ä$TW¨Å^cо‰ÿœhüºÑ?2üÇ©hÞnÐ¼Õæ +mòñ-ü¡^C24ió ‡«£=$#pÌETªùÛU‚ .dKku/,ŒEIf4qW½ù§þqKó“É:]Ç™ü×ä?1Xihe¹º›M¸CŠ—‘¸Ñ¬ÔQÜ⯟ñVÀ,B¨©;1W¸y‡þq›óoÊzùãÌÞGó†k,··:eÌpÇtypSüÍA¸ßqм;v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»}Cÿ8[ùg ~q~uùCòßÏÖíwåýNòU»$xŒ‰´²…æ„0ăJÐŽ¸«ô;þròWò_Vü”üÈüÈü²ò,~Q×ÿ/|ÿqäø§·Ôîn…âZ\A Ìé-«5Dtf”RVŒUø¡Š¾àÿŸv~Wy[ó“óËDòæ^« ]ZêRMi#Ȋͤ’!å#lÀŽ*úwþrÃò›ò‡VüƒŸ?”þI_&kV>u¹òÛÇ¥qx“ÙŸÖ ŒjʆNœØUùоíÿŸr~LùGóÛó§Oò7æ‰Ô´a}xöž´‘,’B€§6‰•ø‚k@´ªµWºÿÎ[þWþSj¿óžYÿœ“ü¢òbù/U¼óuח糃Q¸½ŽH"[ÀYš`£—+Ueâ‹Ä;+Ø…_“¸«ôKþ}‹ù9äßÏ/Î ü—ù­¥G¬h© ÞÝ­´²K‰£–W¬LP‡ZoŠ¿;qWb¯éoó+þqSþqæëÎsÿœ|Ñÿ.aÓ/ô"Kæ›}~ÛU¼õRS#Ä‘¬ÅAFPü™Ý[ì4tÅ_Í&*šèVQê:•žŸq_J{ˆ¢~&‡‹¸SOzUý ~uÎ1Î?é‹ù¯ù?åËÈôÝcÈž@—ÌöZújײM%À¶–HÕ¡v+ð´c‘gpà‘Åzâ¯çcv*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wè_üûÿòòÿó’óÏ~büç²»Ôô'ùjme,m.ZØÌñÕ](Õâ„(äZ­Zb©Ÿüç_ägå—å×”¿*¿6¿#tËíOóö—}}=…åãÝzB´x¨ÎYƒRáƒüEOâõUùÊ¿Jç%+¿0¼“ù³ù¡ùé¢Ýk–¾DÓ´ÝFÚÞÒökG+"^¼Ê l –ôœ«Æ›u8ªEÿ?ü‡ü¿üœ»ò'˜¿&,¯4Í#Î[‡Y{»¦¹ôZN, ;Õ«ÅÀoˆŠŠ­1Wçž*ý'ÿœ(üü¬ó‡å׿oç箓®Úy& °²½{NK7¨\òB¤¿À U¸Ëá$‚cóðÏÈO"þEy«Êßò§­.¬4_2yj×Yk;«–¹0É,Ž´Wzµ ªÔoŠ´  _Ÿ˜«ôò3òCÊ~qÿœjüØüß×mç2ùnëMO•.¦Ž%Y$Œ78U„r}¶§54®Ø«óó}Aÿ8_ùeåÿÎOΟ)þZyúÝî´ Væâ;¸c•âfTµ–E£ÆC‰Øâ¯½?ç%ÿç#`ü›üÁüÑüšòþ§ kž@óÌÞP‘®5)n£»{Yá†Y8HÎl' €qp˹¥AUø×о¬ÿœ!üŸòÿç×çg•*|ü³¾©É|÷Io'¥#­­Œ÷JÀ%C4J¬E‰mÿÉ÷sÿ€Î£ÿ'í±Wå*ìUý_yÛÿZ[ó#ÿ4Éÿ¨¹1WòƒŠ²)ÿÇsLÿ˜Ûù8¸«úfüï´?2?ç#¯'ïù6ê²< w5º1WòóŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«õþ}ÿ?Ïü×÷ßònlU¯ùÏüŸóŒÿø ê_òcLÅ_”8«õ{þpÿ$'üäÇþ:oü˜ÔñVÿççñÃüÿÍcÿ&áÅ_”«õþp×ÿYwþrþ`´¿Õ6*ïùúçüw?+¿ó_é¿òrLUùAŠ¿Wÿç?õ¿=¿æ7Iÿ“°b¯Ê Uöÿüû{ÿZKÈ?ówÿP3⯿ÿ9¿õ›ç#óyë?õcŠ¿qWßÿóëýiß#Ûëþè÷˜«ìοýeÌïüÜÚ·ýE.*ü@Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š¿ÿÒüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUöÿüû{ÿZKÈ?ówÿP3⯷ÿç,`òå/äGæå`óÇ–µÿ4ù“óFïÌQiÚ6¡ÍÅ´3ÃEqüqÉ…„œ€PÔ^E¶Å_ˆ8«ôÿþ} ÿ­ eÿl]Sþ ¸«?ü÷ÿÖò‡þlÝGõêØ«ò~¯Ï›ò}Üÿà3¨ÿÉûlUß¿úÁÿ“_økõ©â¯ÊUú½ÿ>€ÿɧç/ü×ú·ýFØâ¯ÊUyOþ;šgüÆÛÿÉÅÅ_Ó÷æþN¯ÏßüÔÐÿÔ<ø«ùaÅ^ùMÿ)Ç–íµ§ÔJb¯é?þr^çÉß”ú¯ü䜼áço.A©ùÛÈÐé—þ¾Ÿ¥–â=.h#köé3J… ‚8žmÅwÅ_ˆ*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*û7þ}鬨hó‘CÕ5˨lìÒþti®$Xã -¤Ñ ,ÄYÙUw݈sо€ÿŸþp~zÇæÍgò“óOÌ1Ü~_j¥æ© ØYþ(Új^J¶^«Ú ‘Š¢­wgaË|UùeŠ¿E¿çÕW–öó‘¾]º¾–8a[=X‘‚¨­” nh1W¾~wjV’ÿÎ_ÙEq\ÍmNAu/ÀËuFãZÓߦ*ümÅ_¥óé½sNпç ôÙµ»¸,ãŸJÔ ‰®%XÃÈÑK ¤ÔÐ⯤¿ç0ÿ-5ßÊOùÃ)ù3ÎqÁ§æ5ÍÃ-½ÄWúwê’ÆD‘3)%XTV ìwÅ_ˆX«õOþ|õk§~{ÜÜjG_á­AyÊá¦{}ªÄ â¯ÊÌUØ«ú¨ó¦¿¦7üä—æ5ÒÞÛ_òpÆ®&N,ÿ[“á´'Û®*þUñTïËSÇm¬i÷7 (îàwf4V@I'À UûÃÿ?Oüéüèò´÷6þIó5²~JyžÊ (Cbút²\I4×]®Ö9O1)ãѨU~â®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ýŠÿŸB^jQjß™ö~PMæ‰|¤í¥ZÌÑÒk”vôÔ¬ŒªWÔ(‘ |Dо.ÿœÃüéüÞüËóZy'þr8ÛÛkP3XǦYÅlZ<¼^&ܺ1p‘Õƒ°¢¨¦*ù~¯Îÿä„ÿœ˜ÿÀgMÿ“ž*ßüüãþ8‘ÿù¯ìäÜ8«òƒ~ÄÿϽ¼•¬~hþB~{~Zy¾ó6«m¥EgeëEHÄOOŠWDQ±ø™‚ûâ©/üýËKºÐüÕùo¢j‘úW¶~F±·ž>JÜdŠiUÖªH4 Š‚GÅ_’«õþq“ÿXÛóÛþctŸù;*ü Å_oÿÏ·¿õ¤¼ƒÿ1·õ>*ûÿó›ÿY·þr7ÿ7ž³ÿQÖ8«ð‡}óÿ>¿¸Š×þroȲÜȱ¡m];ŸI»UZžìÄ(ÉoнKþ~9ùÑùí˜/¿!:b´Ò|¯5üÚî•ee 7vFæxm.&’ÝäbH¾*܇'Jð8«òÓv*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ÿÿÓüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUïÿó‹?œ6?_š¾YüÞ×-&¿Óô[§–âÞÙ•ehå…ábœè¥”? ©Ç’×U6ÿœ¨ó‡ågŸüé?? m|ÃicªµÅö¨žaú°ß\\I+˜¼’(‹‹-7*×犾jÅ_cÿÎ ÿÎCysþq‡óRßóSÏÖº…Þ“ŸyhÑi‘Å$üçP…šXV‚›üuðe™ó”Uó—üㆃÿ8ߥÙêqù—Kó…ߘ&¸š(E›[Lo¸¢:ÌÒÖR ÄgøÍ%_b¯²¿çÿç%ôùÅ?ÌôüÌóvw©ii×:mÄv&?¬F³4n$E‘‘ƒK¦Äž[Pªûsþs&o"ÜÎþUMù­’O™µÑñë¦~). &õ½h÷›Ô)ÄŸÝñ¯Å\Uø³Š¾Ûÿœÿœ“òÏüâÿ5ÿ:yúÓR¼±Õ|¯}¢@šdPÉ"Ïqqm*³‰¥…DaajŪVŠw!WĘªi¡Þ¦™¨Ùê3†1[ÜE+¡$#†4­hÛš'%™˜ß|…Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å_ÿÕüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUÿÖüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUÿ×üÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUÿÐüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUÿÑüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUÿÒüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUÿÓüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUÿÔüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUÿÕð©ÿ>Ëü÷Ð$[mw@‘%uæ¢ÍdÔi»Ú,¨¦£ì± Þ”#K?è?œŸõcÔ?î¨Õ UßôNŸÎOú±ê÷ Ô?ê†*©üû‹ó¢æE··Ð¯L²0Dõ4ûØ×‘4á ¢½YˆQÔ1VWÿDŸÿœ’ÿ©rËþâö?õWwýþrKþ¥Ë/û‹ØÿÕ\UÇþ}Aÿ9"7>\²ÿ¸µýUÅX‰ÿŸsþr©âÚýFÆšeù¡ŠµÿDéüäÿ«¡ÿp½Cþ¨b®ÿ¢tþrÕPÿ¸^¡ÿT1TßJÿŸb~}y‡Ÿè/³úTõ>ºNŸN]8ýpEÏ¡¯ ñÛ•*1Tãþ‰?ÿ9%ÿRå—ýÅìê®*ïú$ÿüä—ýK–_÷±ÿª¸ªYªϯ?ç 4Öç]òú¤.x©³™oß—]ã´õ]E?i€^Õ©ÅR?ú'Oç'ýXõû…êõCwý§ó“þ¬z‡ýÂõú¡Š»þ‰ÓùÉÿV=Cþáz‡ýPÅYT?óêoùÈÛ¨Òæ×˶¦:5+Hœ« ŽQÉ"ºuVPËÑ€;bª¿ôIÿùÉ/ú—,¿î/cÿUqWÑ'ÿç$¿ê\²ÿ¸½ýUÅXÍçüûkó·L™ì5-énb<\[Ú]\Ç_òf‚'Ǻ1øªþ‰ÓùÉÿV=Cþáz‡ýPÅ]ÿDéüäÿ«¡ÿp½Cþ¨b¨í;þ}¥ùå­Ì,4mv¹ °pOe_ß\¤qƒà Tö®*Èè“ÿó’_õ.YÜ^Çþªâ®ÿ¢OÿÎIÔ¹eÿq{ú«Š¡oçÕßó‘\©yv¶ˆUͽõ½Ô”éðÃ<®kÙTžý8«ÿ¢tþrÕPÿ¸^¡ÿT1WÑ:9?êǨÜ/Pÿª«¿è?œŸõcÔ?î¨Õ UéÿóëOùÈMj£ùz&µbB›«¨¬¤¨45†å£oЕ¡ê*1TwýþrKþ¥Ë/û‹ØÿÕ\UßôIÿùÉ/ú—,¿î/cÿUqT‹TÿŸf~{h‹Ms@•'eæ¢Í$¿N5¦òZ,¨ AøKrïJURßú'Oç'ýXõû…êõCwý§ó“þ¬z‡ýÂõú¡ŠªCÿ>áü麑m­t+Ó4„* ,/bBÇaÊI!TA^¬Ä(êH«+ÿ¢OÿÎIÔ¹eÿq{ú«Š»þ‰?ÿ9%ÿRå—ýÅìê®*µ¿çÔ?ó’ ·—,øSMVȽ„„ŸÅX™ÿŸt~rOÐz‡ýÃ/ÿê†*×ý§ó“þ¬z‡ýÂõú¡Š»þ‰ÓùÉÿV=Cþáz‡ýPÅS}+þ}‡ù÷æ |¾\EOSë¬túW§®¹ô5áËíR¢ª§ôIÿùÉ/ú—,¿î/cÿUqWÑ'ÿç$¿ê\²ÿ¸½ýUÅR½Sþ}ùýåôYõß/„ŽCÅ>§ Ô½~$´õYGùLíZâ©'ý§ó“þ¬z‡ýÂõú¡Š»þ‰ÓùÉÿV=Cþáz‡ýPÅ]ÿDéüäÿ«¡ÿp½Cþ¨b¬®ùõ/üäuÌiqoåËSŠ9êv‘·*9#ÈM:«Ã¡âªŸôIÿùÉ/ú—,¿î/cÿUqWÑ'ÿç$¿ê\²ÿ¸½ýUÅXÅ×üûsó³O™ìoô+±qAewqa׌°ÄѸÿ)”ö'CÿÑ:9?êǨÜ/Pÿª«¿è?œŸõcÔ?î¨Õ U§Ï´<õÉ…Ž‹ N÷$¥Ü3XÇA×÷·Iuð^U=†*È?è“ÿó’_õ.YÜ^Çþªâ®ÿ¢OÿÎIÔ¹eÿq{ú«Š¡/¿çÖ?óúD ¨j¾^…mc§3myÜ›š0Û´’¶çöTÐnh8«ÿ¢tþrÕPÿ¸^¡ÿT1WÑ:9?êǨÜ/Pÿª«¿è?œŸõcÔ?î¨Õ U‘iÿóë?ùÈ]f¤yv&µbB›«¸läÛcXnZ9W~•Q^£lUÿDŸÿœ’ÿ©rËþâö?õWwýþrKþ¥Ë/û‹ØÿÕ\U!ÔÿçÙÿžš¢Ï[Ð&K‚g·ÉÄô¬¶©,`ÿ“Ëî7ª]ÿDéüäÿ«¡ÿp½Cþ¨b®ÿ¢tþrÕPÿ¸^¡ÿT1UkùöÿçUì©ie Þ5Ĭ1-äXì9K,K õgeQÕˆ«)ÿ¢OÿÎIÔ¹eÿq{ú«Š»þ‰?ÿ9%ÿRå—ýÅìê®*²Oùõüä|JÒËåË@Š 7RÍÍZ*ÈXŸ` =…qV'ÿDéüäÿ«¡ÿp½Cþ¨b®ÿ¢tþrÕPÿ¸^¡ÿT1WÑ:9?êǨÜ/Pÿªªs¥ϰ?|ÂMËüÒ"ýuÿGšžœVóÒ.Áüýòú¤š÷—ø,¤„ú“þ$޼–ÌJPx =«CФßôNŸÎOú±ê÷ Ô?ê†*ïú'Oç'ýXõû…êõCwý§ó“þ¬z‡ýÂõú¡Š²ÈÿçÔó‘ó"Ë—-80 ¼µK44;Š«HbÆ*¿þ‰?ÿ9%ÿRå—ýÅìê®*ïú$ÿüä—ýK–_÷±ÿª¸«¸ÿŸoþuYJöwºàž&) ŠÆòt 6<¿f´4U'ÿ¢tþrÕPÿ¸^¡ÿT1WÑ:9?êǨÜ/Pÿª«cþ}ÑùÈM?Aê÷ ¿ÿª«,Oùõü䄊|¹gFŠê¶@ïâ  ‘ÅWÑ'ÿç$¿ê\²ÿ¸½ýUÅ]ÿDŸÿœ’ÿ©rËþâö?õWb³ÿϸ:mdkk­ ôM*â; ÙSØñ‘!(â½ISÔbª_ôNŸÎOú±ê÷ Ô?ê†*ïú'Oç'ýXõû…êõCL´Ïùöoç¶½)´Ð´ ^e^l/KãÓi.Ö$cR>ŻҀª{ÿDŸÿœ’ÿ©rËþâö?õWwýþrKþ¥Ë/û‹ØÿÕ\U¨ÿÏ­ç!4HMþ³åèÖØ¤ÚÝE{%OJCjdƒ¹ÅX÷ý§ó“þ¬z‡ýÂõú¡Š»þ‰ÓùÉÿV=Cþáz‡ýPÅ]ÿDéüäÿ«¡ÿp½Cþ¨b¬–Ëþ}_ÿ9ª@—úo—`kiEPÜ_[ÚÉJÓâ†vIPû2ƒß¡ª+þ‰?ÿ9%ÿRå—ýÅìê®*ïú$ÿüä—ýK–_÷±ÿª¸«ÔçÚž:,æÃXÐg[•‘k÷±Ðî)5´rDM:€Äކ‡lUÿDéüäÿ«¡ÿp½Cþ¨b®ÿ¢tþrÕPÿ¸^¡ÿT1TMŸüûkó·S™,4Ýé®e¼¾Quï/²jcú‘mB´ëÈÙ‰Bv§*W·LU)ÿ¢tþrÕPÿ¸^¡ÿT1WÑ:9?êǨÜ/Pÿª«cþ}ÏùÊÇŠèwõ; é—à}þ†*ËGüúƒþrD€Ö{ÿÚÚÇþªâ­ÿÑ'ÿç$¿ê\²ÿ¸½ýUÅ]ÿDŸÿœ’ÿ©rËþâö?õWbrÿϸÿ: v‚} øH„«pÓ¯¤Za*ÃÁ”zƒLUgý§ó“þ¬z‡ýÂõú¡Š»þ‰ÓùÉÿV=Cþáz‡ýPÅS=/þ}•ùïæ ßBÐ$yQy¿×ôõãZ|/v±+þÊ’ÝéLU<ÿ¢OÿÎIÔ¹eÿq{ú«Š»þ‰?ÿ9%ÿRå—ýÅìê®*—ê_óëùÈ-¯k^^D·ä¶—ßIÈôýÕ©–Jx·#¹Üb©ý§ó“þ¬z‡ýÂõú¡Š»þ‰ÓùÉÿV=Cþáz‡ýPÅ]ÿDéüäÿ«¡ÿp½Cþ¨b¬šÏþ}Yÿ9©B—Ú—mÍ´£”f{ûkiÿ*)$CþK¨>ت'þ‰?ÿ9%ÿRå—ýÅìê®*ïú$ÿüä—ýK–_÷±ÿª¸«¿ÿŸk~xhó¶Ÿ«h7 t”ä-m®/#ÜTRkx䉶ëÅÆ„Š ÿè?œŸõcÔ?î¨Õ UßôNŸÎOú±ê÷ Ô?ê†*вÿŸl~wê³-†— ÜµÔ†ˆ.-nm#ÛsÊkˆÒ$Ûù˜W§Sв_ú$ÿüä—ýK–_÷±ÿª¸«¿è“ÿó’_õ.YÜ^Çþªâª?óê¯ùÈ»žò÷˶ÂÞ ZC¡m;…xżŽ|±ì1V/ÿDéüäÿ«¡ÿp½Cþ¨b®ÿ¢tþrÕPÿ¸^¡ÿT1WÑ:9?êǨÜ/Pÿªª{¦Ï®¿ç uèÞ‡åå{unÞN–ÈniÙŠB(Gĉè A¢©—ýþrKþ¥Ë/û‹ØÿÕ\UßôIÿùÉ/ú—,¿î/cÿUqT—UÿŸd~|ù}’-{@tydú}@PuäÖ‹*¡ð A=…1T«þ‰ÓùÉÿV=Cþáz‡ýPÅ]ÿDéüäÿ«¡ÿp½Cþ¨b«—þ}ÍùÍ!Ç¡_—cAËM¾QSÒ¬as°ÅYoýþrKþ¥Ë/û‹ØÿÕ\UßôIÿùÉ/ú—,¿î/cÿUqWÑ'ÿç$¿ê\²ÿ¸½ýUÅX“ÿϹ¿9£cšÿ%$:mû Ðq±ÅVÿÑ:9?êǨÜ/Pÿª«¿è?œŸõcÔ?î¨Õ U5ÒÿçÙŸ>`w‹Aòû»Æ?×Cià°â×k¹ñ IÆ*Ñ'ÿç$¿ê\²ÿ¸½ýUÅ]ÿDŸÿœ’ÿ©rËþâö?õWKµ?ùõ×ü䃼×<¼©0@lçK÷äwŠÐÊàPˆ¨QК‘URú'Oç'ýXõû…êõCwý§ó“þ¬z‡ýÂõú¡Š»þ‰ÓùÉÿV=Cþáz‡ýPÅYE¯üú«þr.þ$¼²òí±·”rŒÍ¨ZÀåONQJë"u ;ŒU_þ‰?ÿ9%ÿRå—ýÅìê®*ïú$ÿüä—ýK–_÷±ÿª¸«¾ÿŸl~wéS5†© Ü­Ô{8¶µ¹»ŒWqÆh#xßoåcC·QŠ¡?è?œŸõcÔ?î¨Õ UßôNŸÎOú±ê÷ Ô?ê†*Œ°ÿŸk~xj󮟤è7-tõâ.m®,ãØTÖk˜ã‰véÉ…z ’*Èÿè“ÿó’_õ.YÜ^Çþªâ®ÿ¢OÿÎIÔ¹eÿq{ú«Š¡®ÿçÕŸó‘Zt/}¨yvÝm¢¤0_Û\ÉAü±Bï#ŸòQIöÅXÏý§ó“þ¬z‡ýÂõú¡Š»þ‰ÓùÉÿV=Cþáz‡ýPÅ]ÿDéüäÿ«¡ÿp½Cþ¨b©þ›ÿ>¸ÿœƒ×aúö‹åäknE+wqŒœ‡_Ý]¤¦û7'±Øâ©‡ýþrKþ¥Ë/û‹ØÿÕ\UßôIÿùÉ/ú—,¿î/cÿUqT“TÿŸe~{ù}Öß]Ð$I]y ³WÔiñ=¢ÊŠkû,Cw¥)Š¥ôNŸÎOú±ê÷ Ô?ê†*ïú'Oç'ýXõû…êõC_üûó¢wX ЯŒŽB¯=:ú5©ØUÚª£ ÜÙÕìãf⦒Gɉ-éII$×zÏäÏüþ³Ë:¿§¦~{ybçG¸{{Ù¼R¤ê%…ƒ¡èÊjÒ3‚6.h7ÉS]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*¡su œfâòDŠ%êò0U2vʳg†ñLˆÔ̲„ ÍDYòy~·ùÇåý*±Ù»ÞÌ;B¿ }ݨ>îYÅv—ü´:] NCý·úcCåÄï4ÞÎç˼ª#ÏŸÈ~šxþ·ù×®j<¢Ó;täÿ‚m¾åçÝ¥ÿf§l@c^©¦–ß(‡¢Ó{5‡ó¹ùÖÌ|ïæ½[EÐü¹©é·RGs=²´¬hÞ¡1FjÁªäõ·Ú^ÝÕh´zL¸¦D¥dyñP6äóuÝ™ ÅŸ6hN -ºVç•rKt?Ï{ˆ¸ÅæE”w–ÜñoøØŸ¥s³?à¡8Tu8Ä¿¥ úS±ùÅ»Uì´Nø¥^G·ö°è˜º¿Åm/9›ýÕ?îÞ¾–Çý‰9è=™ív‡´(C ù²ôËíØÿšKÎê»>ŸêŽñ¸ü{Ù¿]Æt®±Ø«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«ÿÐûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»a|üËòŸånœ|Ãù‘­éúš*úÌvêÄ~Ês#“x*ÕaŠ¿0¿9¿çñ”žEõtÿÊË+ÿ9ê+ÉD‘©°±¨Ûy§C)ß¡HM6jPâ¯ÊÎoùú¿ç¯æ¡–ÃËú”OÒª Ðã)9^Ü®ä/0aãˆåÅ_𿽩ùšö]oÌ—·:†£;r–æîgši‹;’Ì~gJqW¿ÿÎ'äïü´ÿÀÏËß÷Q‡}Aÿ?`ÿÖ’óüÁiõ*üàÅUí®¦²™/,äxg‰ƒÇ$lU•†à©‚;оîü™ÿŸ”þ|þLˆ¬­üÄÞbÒb >aV½^#`Å–å@³ËŠ¿X?&¿çô^Aó ‹MüìÐo¼µzh¯{`~¿eÓwe'@OET›ýlUúŸù[ùëù}ù×gúSò«Ìšn¹^N–³©š1·÷°µ%Œî6tSнcv*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUŒêžpÒ4Š­ÕÊ4ƒýׯÕð éôÓ2±hòdä>{8ÙupÇ̼ßTüØ‘ëlvyOüÛñ9²ÅÙ#øÏÉ×åíCü#æóOÌšž±Q¨\Èèb¼SþP~²Å¦†/¤:üš‰äúŠI—´;z§–¿åÕ¿×?ñÍN«ûø~;ݦŸû‰~;žW›gVìU0°Õo4·õtéä…«SÁˆæ:§+ÉŠ96¶Èe”>“ODÒÿ5o­èš¬IpÙ~ü>Àf·/eF_I¯µØbí9¨_Øô/Ïú6©Dõ¾¯!ý™Çøm×ñÍn^ÏÉ¥û¿ì1k±Ï­{Ù’º¸„;‚70ˆ§0]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±U9fŽÝ Ó²¤j*Yˆrr2Gâ‘§`˜ÄÈÐÝæÚßæß—´nQÅ9¼˜~Ͱä?àÍî'8îÒö÷C£°%âèn?Óm‘.ëKìþ|Û‘Â?¥ú¹¼{[üðÕïyG£E”g£êI÷Ÿ‡þéÏ>í/ø%ê³ØÁãÿ\¾ßOû‹Ðé}˜Å ò#ò¯íy.¥¬_k}cU¸–âNÆG-O•z}Áë;C6²\Y§)é~]߇O " ÷»0ÛÝŠ½Ëó3þQŸ+ÿÌ"ɘóÓ}³ÿŒíü,¸ƒËö/øÎoë÷Rxny“Ô;eZ'õ¿/qM.òE‰zDÇœð-P>Šfó³}¥ÖvvØrðŸTÒÊÀøS©ìÌ:Ÿ®"ûù˜{‰ùðG¼Åe_mühÇþ6ú3Ð{7þ =5Xÿ·üL¿â¾;©öW®)|%úÇê{‰ç­ ÌWN½ŒÊß€V¡?EsÐ{7Ú}hm‹ ¿æŸL¾R«ø[Ïj{/6Ÿë‰®ñ¸ùÒ˳~ëÝŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WÿÑûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb¬kÍžsÐ<‡§Iæ?;ê–Z>•÷—W÷Û¿7ª×Ú¸«óKó—þ~íù+ùt³XyÞùÓVJª­„fÞÌ0ì×3€Hðh¢˜UùAùÍÿ?qüìüÉé¾H{/&iNHMÖ¼({5Ôá¨GóC'~kù§Î÷žu <Áç]R÷WÕ%þòêþâK‰›zîò31ûñV9Š»U‚ .¤Kkdi&‘‚" ,ÌÌhrIè1WèÇäüúëó«ó¯ÐÕu½=|åéhÆó\VŽvO¬Çï‰î=A0Ü>*ýÅÿœoÿŸb~QÎ?]Xy¶ö+4ùÂÂH®aÔµ3Æ(."`ë%½ªM ²†C!šDaU“zOüä§üàOå7üåòù‡Î¶Xy©âH†µ¦Ké\‘ñA"°h¥P|h[ˆâ®¢˜«ðÏóûþ}ù³ù_ëk?•ïô4«´_«ê(¿åZ»ýh=$f¥x.*ü³Öt]CË—³è~a´¸°Ô­œÇ=µÔO Ñ8ꯀÊ}ˆ®*–b®ÅQú^«{¢]E«h·3Yß@ÜâžÞFŽDou!÷~„~MÏÒ>)V?QÖ"óf“Õ¼Á¸—CK¥d¸& É öNàªý_üšÿŸÊþVùÅaÓÿ7tÍCÊ:ƒP=Â)Ô,kãÎ%­OoA‚÷s×~¢þ^~ly3ókO÷åž½§k¶$ÒX\Ç1JŠÒERZ6ñW øÅ^ƒŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUتAªy£KÑê·÷(²÷ZžOÿµ#éÌŒZYåúCF]L1ó/7Õ?6@¬z5µ|$œÿÆ«ÿ5fËdÿ<ü¿[®ËÚŸÍ7œjžkÕuŠ­íËúgýÖ‡‚}ËJý5Í–-$1r¿.ªy9–;™.;±Wb¯8üÀüÜò‡å|ZóÆ­odÅy$‹Ï ÿ"«°¯p´ÈÌ­6‹&¤Ö0OÝóä‰Ho‰µßùÌ?9þfÝÉåùÇ,\M)!MýÜbF@v éƒéD+Ñ¥‘—ÅFt»Ũ—À~,ü“U¥kÿ8“ùÉæà|ÿæï??8ÇW³'œ¬\¾ÒúЕX?Õ†7C–)é±ú#ŽãÔÐû?‰!í0 Kíç!?8ÿ ¥]+óßAmgGVºœUˆØ'ˆ\Óp®©!?i‡a.ÉÓë7Á.Ýûÿxr1ë#7ן–_ó’Bü×ôí¼»©¤œ”£ïiÏ/åUcÆCÿÙóG«ì¬Ú]ä6ïÙñr£1'ºæ¹“±Wb©®›®_é ËM¸’.üAøOÍMAúFS—r}BÛqæ–?¤ÓÑ´¯Í{¨©¯Ì¿ÏÀßH5ðÍv^ɉú {݆.Ô#êîzF•çV¢Åp"þÄßûÎÇè9¬Ë¡É˜¿vîÇ·NF½û2ÀAƒ˜ŽSx«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUkºÆ¥Ü…P*I4`”„E”|ž{®~iy{C¬msõ™‡û®ØzŸðÛ(ÿ‚®r]§í¾‡C±ŸíúÙ[·Òö|ûÕùmösû?®~yê7U‹A·ŽÖ>ÒIûÉ>`l£äCgŸvŸü³åÛMÞ}Rý)=—Ù|pß!2ò×÷<‹V󥮿­«ÝKpÕ¨Ljù/Aô àuý«¨×ž,ó”½çaî‡À=ŸIN*Ýúù¤ù¯r]Š»xæGüä¿ÿ,ýKMKPÚœuÇO¤ò†œ‚³²Ÿc›ÞÎöoS­Þ1áó¥°øu?ÙFO•/?:¿:?>œØþQéC˺’ ûX¯Mî$P¿D(]˜õΦÙý•¾¦^$¿›ÿïy7 q‡=Ðcþq¿ó‹Èów¼í%þ½%%¼¶’iÊà· ñϰQY•6Ã/Ÿµ=pðuªhž|#—(ÑŽßÍ´ @ô¦Yå¯ùÌMÉ—Iå¯Ïÿ.Oer>®ZFSr0¹£ÈþT혟dqjcâh²?šOûáËÜG¼©Àñ/´|“ù“åÌko¯ù/T·¿@9:FÔ•ùq5?Ù(Î;[ÙÙ´g‡,L~ãî<À¸ò‰6q˜Hv*ìU™èŸ˜:þÅl¯$hGûªoÞ%<j‘þÄŒèû7ÚÍogí!#ù²õGíåþi·SÙ5TE÷Ùú^â~{Ã%"ó ™Œ÷–Üòð ¸ÿ‚9è=›ÿËmV:þ”7éNÿì‹Îê}–#|R¿)~±úƒØ4_8hÞa Òo"–Cþë'ŒŸð Fü3Ð;7Ú 'hÿs’$÷r—úSRû{SÙÙ´ß\Hóæ>cfK›— Ø«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb¯ÿÒûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wç‡üü×ósóòGò…<õù1© .øjöÖw÷å‘m.#”V3"¸FõDkÊ•£iŠ¿”_<~bù«ó3P:ÿæ&µ¨kš‰¯ïõ©nA5!LŒx¯‚­ØAаÌUØ«±V_äËÿ3~ej‘y_òûH¾Öµi¾Åµ…¼“ÉOæ!¢Žìhª7$ Uúõùÿ>gó¯›= sóûV‹ËsqfÓl ]ê ½Õ¤·„‘Ѓ=?i*ý³ü‡ÿœ6ü¤ÿœqŽ9?-<»nšº¯Õ¯ÒoßjëIS=Ö!åÅ_Pb®Å]Š»x—ç/üã—å¿üäè¯Í¯.ÙjÅP¤W.žÜ ×û«˜øÊ‚¦´WâOPqWâ×ççüùföÔÍ®Î8ùn£«0ÑõÂ@:ñŠî5àÞ ²F”╎*ühüÕü‘óçä~¤<½ù³åûý ñ«é}j""˜/S ËX¥QÝ£v«Š¼³v*ìU:òÿ™5)_E¯yVþëLÔà5ŠêÊy ™ŠÉVAÅ_Ò·üúOóÿóWóÛNój~në“kZ>ƒú:ßN–ê(½s,âf”4ê¡äⱡ¬…›ãû^ ¿c1Wb®Å_Èטçç¿ó“:­õ•¯ž8à ÔÑ¢þ†ÑÍ\€*m 4¾*“ÿÑQÿç'êyÿ¹.ÿdx«¿è¨ÿó“¿õ<ÿÜ—Gÿ²ÜcŠfTZµ¡&€RIñ8«ÿ¢£ÿÎNÿÔóÿr]þÈñWÑQÿç'êyÿ¹.ÿdx«¿è¨ÿó“¿õ<ÿÜ—Gÿ²Ôeí K–ϯ4mgNòå¢i:¼VQýˆmãXÐ|•@¨ž3rÜù¸‡)<ÓOñ·ùŽGòˆñ§ótWQ½µÏ!‘Jº8 ¬Äv áZä¾#å¯Ì?ùÇO!ùؽî‘è=E‰oRÈD“üÐ-?Ô)óͦŸ[—ÇÔ<ùüÿµÉÇ­”<Þy¦y³ó»ò „²¹_6yn/÷TÜî  ðÜOJ{‚Ú6³§¼¶ý‡ïv˜;J2Øý¯¤¿-?ç7¼‰ç2šw›Yüµªš+-ër¶-Þ—£ÞEŒ{æ‹Wìþl;ÇÔ<¹ü¿U»He}‰iy¡ w¶¤öò¨x䉃£)èU…AÄfŽQ14[Ø«±TóJ󧤺mĈ+ö>ÒŸö&£ðÊ2éá“ê øµÇô—Õð œÖN#‘4ß9)Uìõ庮»~qÏË?ç&|ïÿ8½ämÍß•2ÚèjбœÝÛ‰ÔÅõid RE$â¯Åïú+Ïüä7ü¶èß÷ þjÅ]ÿEyÿœ†ÿ–ÝþáqÿÍX«¿è¯?óßòÛ£Ü.?ù«wýçþrþ[toû…Çÿ5b¯ßŸùÀßί3ÎA~Mèÿš?˜²A.»{s¨E3[B!Œ¬OQ@øTWÇ~PÎcÿÏÉ¿:%?9<Õù]äk­.= H¹‚+UžÁ%+ÚÅ)ääÔüNqWíüâ—æ>³ù»ùGå/̯94O­kr\Ý41ˆã2`x Ø ˜«ùÅÿ¢¼ÿÎCËnÿp¸ÿæ¬UßôWŸùÈoùmÑ¿îüÕŠ»þŠóÿ9 ÿ-º7ýÂãÿš±WÑ^ç!¿å·Fÿ¸\óV*ûsþ}ùÿ?üÜÿœ‹üܶüµüʹӥÑeÓ¯®Ym¬R=HPøÁ&•;ŒUõüüËþr—Ïó‹~YòÆ¿ùO5¤7z®£qmrní–pcŽcˆ$P×¾*ütÿ¢¼ÿÎCËnÿp¸ÿæ¬UßôWŸùÈoùmÑ¿îüÕŠ»þŠóÿ9 ÿ-º7ýÂãÿš±WÑ^ç!¿å·Fÿ¸\óV*þƒÿç¿7¼Åùóù'åÍ̆MUý%õ–·ˆEú¾£qnœPT‚5¯‰©ïо¯Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®ÅRÝfKˆ¬.¥ÓÍ.’ "E~0¤®Ý÷Ì>Ñ”á‚gÔ##¾  mïnÓ™ÄK•‹÷^ï…õŸ4êÞanZÅܳ ×4AòAEv|ÇÚ=¹©íyç)y]Gý(¨ý¨é´8´ßÝÄ¿çÍ ÍS–ìUت QÔ­4‹i5-Zâ+[HT´“Nëh£©fbääñã–CÃI<€Ü¨ø÷ó þscÉþ]‘ôŸ"E/™5:ðScµ Òž©¿üóFSüã:îÏö3>aŘŒqóÞ_.Ÿ=ÍÑÀO=ž#x9ÿ=ê<Ñz<³åézÚÂHzƒ>³íÚWT=©›¨Ïì¯îlj1Ôïöý#üÑm FoUòüã×’<‘éÝ\[~•Ô‡Ö½òbûÄr Ãù³Y®íýF«`xGt_?»ÜÆS%ôBk ˆã¢ª€aœùÃmt»ôß¾>ð¤úä:g™m[Kó ¬¶Ö)ãWZøÐƒCàFùn<ŠƒÞ $ |©æ¿ùÆ ,\{ò¿R¸Ðµ8Éh”K!EnÜ$SêÇó«û ê4¾ÒN¸5]…üGÒ~ÆÑ“½ §þ~kþK0³üÑÓG˜4T¢‹Ô!d >º)Sò•Ÿæ,ƒ¢í-ôòà—óz¥;ÿ¥5䃊2äú·òÛþrkÈ™Æ;-'RZ¤„c¨R ‹*JHO‚;3–ífõZå󣏸õeˆÅïù¡kv*ìU°JÊhGCˆ4‡´~Vy³]ºÖ­t6¼’[7ædI:*¡m‹TŽ”9èÞÃöî·.®sÊìKÕ°ìNã•l^o·ta†Y8@ª­·'ËgÖîïìUØ«ðwþ~ÿ?üÜÿœtüܹüµüµ¹Ó¢ÑbÓ¬nUnlRi=I—øÉ• Uñýçþrþ[toû…Çÿ5b®ÿ¢¼ÿÎCËnÿp¸ÿæ¬UßôWŸùÈoùmÑ¿îüÕŠ»þŠóÿ9 ÿ-º7ýÂãÿš±Wõ%úbãü3ú~«õ¿Ñ¿Y­6õ=}<+Û3>BÿŸ°þy‡ÌÚ.¨ÞèæÒûQ´¶˜.š€˜å™Q¨ylhNø«÷þs‡ó{Ì_ß’~gü×ü¿xc×ô¯Ñ¿Vkˆ„±¬j6öïÉ ø$jxØ«ùðÿ¢¼ÿÎCËnÿp¸ÿæ¬UßôWŸùÈoùmÑ¿îüÕŠ»þŠóÿ9 ÿ-º7ýÂãÿš±WÑ^ç!¿å·Fÿ¸\óV*ýuÿŸcÿÎXùÿþrŸLó}ÿæÌÖsK£\éñZ}RÙmÀYÒbü€&»¢ÓÃ|ùÿ?ÿœ÷üØÿœküÔ‡òïòÂçN‹G}Îø­Õ’Îþ¬²Ì¬y6¢.Ø«àßú+Ïüä7ü¶èß÷ þjÅ]ÿEyÿœ†ÿ–ÝþáqÿÍX«¿è¯?óßòÛ£Ü.?ù«wýçþrþ[toû…Çÿ5b¯êKÈZÅǘ|³¢ëú‘Sw}¦ÙÜÌTP%…]¨; “¶*Ë1Wb®Å]Š»v*ìUØ«±Wb®Å]Š»ÿÓûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WÈóŸ^Gÿ•ƒÿ8ûçí cõeƒH}N0>×-5ÖóáïZBEÚû=ñWñ…Š»}ùÿ8µùŸÿ9tÖŸ”ž_¹Ômb—ѸÔÙ@Ô D—Œ0R€-!qCQŠ¿lÿ ?çËþ\Ðýsþr/[}nèfÒ4†{{@vªÉrxÏ(ê?v ?åUûùuùWäÿÊ=-|³ùe¡ØhzjÒ°ØÀ‘s+Ѥ`9HÛý§,ǹÅYþ*ìUØ«±Wb®Å]Š»cÞiò–‡ç6o-yÏM³Õ´›I­/ Žx\”’S÷b¯É¿ÏÏùó¯å·Ÿ=}kòZúãÉÚ»U…£ò»Ó]·4àíëESµVFEf.Ø«ñþr þpsóƒþq°M©yÿByü½ úkL&êÆ…‚©wPL@tŒ’@Ôb¯‘±Wb¯ê—þ|ñäaåŸÈcæ‡B&ó&¹zŠV+~j£Ä‚Cófú~«â®Å]о»ÿŸžÿÎ3ØÏ-•מ8Í ´n¿¡µƒFSB*-4#¶*‡ÿ¢£ÿÎ1Ôóÿr]cþÈñWÑQÿç¿êyÿ¹.±ÿdx«0òüü+þqÿóGÌ:wåÿ‘|ßõíU˜[ÙÛ~ŠÕ"õ$ ¼åµD]ݘ|Uö~*òÎOÏ$ÿÎ?h ç¿ÍÝSôF†÷QÙ­ÇÕ®.k4ªÌ‹ÂÚ9_p¿"›ž˜«Î?%?ç3?'ç"uË%~Ny“ôƵkdú„Ð~¿¶ão‘ÄÏÎæÑåAÄ1oŠ PN?<ç+¿+?ç§Ó¬¿:uïÐÓjÉ4–KõÛ¯Qa*$5µ†P´.¿j•®Õßx?ýþq‹þ§Ÿû’ëöGŠ»þŠÿ8ÅÿSÏýÉuû#Å]ÿEGÿœbÿ©çþäºÇý‘⯯ÿ+4¼±ùÓå‹Ì¿ËKïÒ^[Ô½oª]ú3Aêz<~îtŽEã$n¿ Ò¢ªA*½|!«ÏÌ¿ç4;ëTó·¥{g4–óÇúWn2DÅ]j¶„EA#Àâ©ýþq‹þ§Ÿû’ëöGŠ»þŠÿ8ÅÿSÏýÉuû#ÅYG’çâŸó˜ºþ›äO&ùÃëšæ¯u•¿èV/Vi[Š/9mU¤õfUÎ*û_v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å_;~hYý_Xm<(äû­WõeÎñ×qý®ƒ´¡Y/¼<ã6N¹©jVš5¤ú¶¯rÙò_™<õù¿ùîXyÛVý JMl-C@…OcŸRAí3ûŒéô½•‹M¼cg¼îgÁÒj»g=£ê>\¾©“ù7òïÊ>Oáp–âúñwõ®èô>*Ÿ`{½«YÛPÓ¡aþJšŸÀf>ª|ÉòoÓCŠ`y¾³ÎIê]Š»x¿çoæå—åΕiª~}^iVzD÷^«êÑ,±›Ž ÔPÊôn·§J⯚?èhÿçêûäÏúB‹þ¨â®ÿ¡£ÿœAÿ«ï“?é /ú£Š»þ†þqþ¯¾Lÿ¤(¿êŽ*÷ßËEü™üãÒÍ¿–]Ö´uíÕ­„±…,›Æ7”ý8«Ü4OÐ-—LЭ ²³BJÃmÅ,jHT ÎØ«äŸÌùÈùÆ¿(ù’ÿËŸš:·•íüÓjè·Ñ_ZÆ÷ å—›˜“À­7;S}1ä Ë~hòîæË™mgòÕÜ"K l”$ $€¯aо0ÿ¡£ÿœAÿ«ï“?é /ú£Š»þ†þqþ¯¾Lÿ¤(¿êŽ*ïú?ùÄú¾ù3þ¢ÿª8«/òç'üã掻iä_ËûÏ)jºý÷«õk;{L’zQ4¯Ä€øQŽýÅ_RhþBòÏ—®¥ hºmØR¢kk8bÔrE‡¾ø«Îÿ;ÿ2?+?.,lo?/4›; ™ž;&Õ¡YQ¥U« Cǯ¶*ùÃþ†þqþ¯¾Lÿ¤(¿êŽ*ïú?ùÄú¾ù3þ¢ÿª8«¿èhÿçêûäÏúB‹þ¨â¯ ÿ.-'7teó—å®åÝcEyd…n­´ûs’3G]ã õÅ^Ù¥i6:¬zV‰m ”\½8-ãX£^LXñE ’I Ü’qTÃv*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»w]Ž*üû×l?EêWzm)èO,cä¬@Ï”;SKù]FL_Í”£ò$>µ¥ËâãŒûÀ?0•f Ä<ëçï/~\éç_ó¾¡cË‚¼ÄÕÞ„ñDPYÚ€ž*  ;f^‹A—Y. 12>_¤ò̦12äøGΟó7ZåÃùwò/A›P»j¨¼¼ˆ¹,šÓ¸i@ý¤¦w/b!Ǭ˜ˆî‰ÿ|~à‘r#§ïxÔ¿•Þ{üÛ¹MgóËÌ3´@ò[[‡²¢gÝUëß71í-7gŽ &1ýcúϨüHnAô/“<‘å  Z±Ž)éCpÿÇÇãj‘_ öͳY›Wýá$wr&ËÐMÿ•˜~›ÿ+x]úoü¬|áwé¿ò±ð…ߦÿÊÇÀ^~›ÿ+xV>°²)ŽJ2° ƒ¸ ö8F^‚yëò+Éþtq¢ï›ZÌBÊ‹ì~[Ký/_>æ‰éÈå»í+{ˆ®âK«WYa•C£¡ ¬¬*#bÜœl¢bhóhVÀ¯qü‰Óý}ZïRaU··àƒHŸ‚œôÏøi8õ3ËüØWÆGõD¼¿µ9¸qFçî´>¨ÏqxWb®Å_(~oyãþqÇAóéÿžW^J‹Í"™×\ŽÅ®ý"?wS2—ãO³ÛÃyü­/ùÃùnü³ÿ‘:_üÑŠ»þV—üáü·~YÿÈ/þhÅ]ÿ+KþpÇþ[¿,ÿäN—ÿ4b¯¤t¯ÈÿÊ rÊÛZÑü›å[› Èc¸·ž-"Å’H¥PÈêÂ*e ƒÜb¯cm­­]nigd8`ÔnéÄ¢˜«á½'ó7þpú{ëh4KïËs¨¼Ñ­°‚3Ô2–8qJòåN4Þ½1WÕÿšZ¯“4_,_jœri‘y>/GëϬ,Md9L‹ª&?½)Æ£íñ¦ôÅ_ ÊÒÿœ1ÿ–ïË?ù¥ÿÍ«¿åiÎÿËwåŸü‰ÒÿæŒUßò´¿ç å»òÏþDéóF*ô¿Ë3þq¯ó~K»oÊÝ3Èšü¶+Ý.a§NbY \$fŠšW­*úʾAòÇ‘h¼‘¢éº2\•i×N³†ÔHR¡Kˆ•ySJô©Å^ ùÉçoùÇ/ëëaùõsäØ|Êmcu]z;&ºú¹fàAKð¨n=«Zb¯'ÿ•¥ÿ8cÿ-ß–ò'Kÿš1WÊÒÿœ1ÿ–ïË?ù¥ÿÍ«¿åiÎÿËwåŸü‰ÒÿæŒUôf‡ù+ù9æ]:ÏÌ~_ò‡•/4½BÞ+»K˜4‹Žh&@ñÈŒ"¡WRHê qW¶ÛÛÅgv–‘¬PDª‘ÆŠUTP*°lÅU±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»ÿÔûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±T«]Ñ­|ǦÞy{T^vWöòÚΣ¼s!GH'žgÐ.|©¬jWÔ[Í6î{9"H$1°#¶êvÅR·j±×éú·áŠ¿m1Wb®Å]Š»v*ìUØ«±Wb®Å^ ùïÿ9/ùuÿ8ݤŸ0~lk0س£5µŠ~òöèŽÐÀ¿o·#HÔý·Q¾*üÒÿœºÿœ¤‡óûþpÛ^üÏÒtétk1kVúMŒ3L²NðÛj(Åܧ­ ù æÕjÃâÅ_ÍN*ìUý¶Îy~\~IyÊ%xÍe4ê)=ÔbâaôI#oß®*úCv*ìUø#«ÏÿJ_\êò³ý?¬Í$Ü?ÕãÍ‹R¿¤i^´ÅRÿú!þeü6ÿïcŠ»þˆcÿ™Gÿ ¿ûØâ¯`üÿŸCÿÊüÃò÷æßü¬/ÒŸ oVóê_ ¾¯ëqR8ú¿^“‡^¼势g±WÊó™?óŒô6ÞBò³ôçøÓÔíõ®}Oë•ôDáéúÐuõ+ËžÔèk²¯›ÿç ¿çÛßô'ÞxÔ?2ÿÆâ/¯h³éTýõ.­Í¼þ¯©õ©ëOC¼«Ëá¡U˜ÎqÿÎÿÐæßywSÿÿ†ÿ@CyÑŸ^õ¾²Ñµkõ˜8qôúQ«^ÔÝWÂôCüÊ?ømÿÞÇwýÇÿ2þ÷±Å]ÿD1ÿÌ£ÿ†ßýìqWëÿüâçä_ý _内ù)úSô×è_®ÿ§ý[꾯֯&ºþçÔ—W‡÷^<¶­¯Å_„>lÿŸ'Š5ÍOÌßò³=Ò7·ž—øwŸZF~<¿H Ò´­|*Çÿè†?ù”ðÛÿ½Ž*ïú!þeü6ÿïcнCòSþ|óÿ*{Ͼ\üÓÿ•‰úGü?©Ûj?SýèzÞƒ‡áê}zN©N\ž~×b®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUثǿ6ìùCg¨ö]â'ýaQÿ9¹ì‰îcñu=« „¾Íã¥`¿š:7øÉžbòñúEý­<}kwOãâ>yvš|#.âÚÊ&¿žŸÊï!k·:DžyòeÂýrÚáí¥¶`dPNƼ©CN›ç¨FtiÖö¶«—…”lEßqÝêú_æò±²Ö£kKÔ<]X+ôî>GïÌÈÈo3¨ìÞàxƒ$ÿ·óäöp.[ÿ¿óãA.]þ#çÆ‚þ\»üFÿÏü¹wøÿŸ ùrïñÿ>4òåßâ7þ|h/åË¿ÄoüøÐ_Ë—ˆßùñ ¿—)6©çÅÓ”„-,ß²‹ãî{`$'gË)îìÍRó/œt‹Ï5ù¢Ae¦ØBóAnWâfè£QS±f5ðZÄÉ;wýŸŸšc?Q&‰ü~›õƒþpCýù5¤\ůî¯îˆ¥ûÒñvD`Ž»S~ÃÏ»v|Z‚;€eþ—¡Ë+/²óNÔô_Ë O¬k>¹A ½}ÍõšÞÔc®óû]‡fÂò_pý¢óœzb®Å_ ÎzÿÎ%jÿó—ÞPѼ“å½^×GŸLÕ†¢òÝÇ$ŠëèIpjàý«ò«þˆ‡çúž4_úD¹þ¸«¿èˆ~xÿ©ãEÿ¤KŸëŠ»þˆ‡çúž4_úD¹þ¸«õçþpwþq›SÿœPüº—ò¿Ì:¶­u&­s¨‹‹XÞ4 4q Z>õ™ûñWظ«ðÿþrþ}IæÏÏïÍ/1þoèþlÒôû=nxfŽÖ{iÞHÄvñÄC2ìjP¼qWê§üãåe×äå§–¿)õ[¸¯®ô+´’æeŽB% ¸÷Å_…¿ôD?<Ôñ¢ÿÒ%ÏõÅ]ÿDCóÇýO/ý"\ÿ\UßôD?<Ôñ¢ÿÒ%ÏõÅ_HÎ#ÿϬ¼Õÿ8ãù±åÿÎ}oÍZf¥e£}{Ôµ··™$“ëV3Û,Û&PƽÅ_µØ«àOùϯùÃÍcþs @òÿ–ü·¬Úhòè÷Ó]É%ÜRH$EÀ*„Üwß~^ÑüñÿSÆ‹ÿH—?×wýÏõ§Ãž]ò÷ž?*tË/3ùP®±åÍFÚ Ù­Âñú±‡5QVœ”°îÊ3·Ôj4úùœy=3‰1¡£_€~ʰ^áåoÍ+4Ħ0]Sâ‚]˜cчË3M©ìÙ`;î;Â8Y—é¿ò³À^~›ÿ+x]úoü¬|áwé¿ò±ð…ߦÿÊÇÀ^~›ÿ+x]úoü¬|áwé¿ò±ð…kkª€»° I'a€¼/%óOçÂIúÈ–©ê²|(B“Ÿ Ú÷ :òͦ›²Ay ~ߨ >vüÕü¿ó&›Ÿšüõt“kš¼þ’Û'UzZ‚@¢‚£ùŽo»3_ŠdãÂ*1}ÿ§çòe?|4«Ò¬­´¸wŽÚáSìŠu'ÃÇ<'.OFG©'æëI´~A_T~Déþ†“w©0£\\pÅcQOÅŽ{ü 4œiåþtëáúä^ÚœÜYcá÷ŸØ㞘óÅ]Š¿ÿç8?çÚ~yÿœ¡üиüÖò޽¢éú|Öv‚ ãsê†Hb}8hk¶ø«äú"_æŸýMžYûïê†*ïú"_æŸýMžYûïê†*ïú"_æŸýMžYûïê†*þ‰,<­qäo'y{ÉZ„‘Íu£é|²E^öÖé2ÔÄ•¨¨F*ɵ«Ôôë½6"î-å‰KtШ&·Å_Î×’ÿçÌß™ÞYó“æ;¿4ùnH4ûû[¹ ç&XeW!k mSŠ¿hç0¿$µ_ùÈÏÊ/1~My^îÖÇSÖ~¡èÜ^sôSê×Ð\·/MY·XˆSñ]·Å_‡ôD¿Í?ú›<³÷ÞÿÕ UßôD¿Í?ú›<³÷ÞÿÕ UßôD¿Í?ú›<³÷ÞÿÕ Uú9ÿ>òÿœógüáî£æKÎú¾—©¦»ocN3Õ ³ÊÌ_Õ6> ¥+Ðâ¯Ô,Uøåÿ9ßÿ>áó¿üågæL_™þN×tm:Â="×O0ß›Wœ2Jå¿u¯$Þ»±WÅßôD¿Í?ú›<³÷ÞÿÕ UßôD¿Í?ú›<³÷ÞÿÕ UßôD¿Í?ú›<³÷ÞÿÕ Uý ~Ky&ëòÏò÷Ê—´±\_yAÒô™æƒ—§$–v±À윀n,ÈJÔN b¯LÅ]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«ÿÕûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb¯ãCþ~äqäùÈ>èñ-"ºÔÿJ¡€þ’‰/Ÿ'•—æ*øË~çÿϼÅõo4ùÿÊuÚ÷LÓoiãõI¥Ž½?åãÄ|e_Ñn*ìUØ«±Wb®Å]Š»v*żçç/þ]h÷>oóæ§i¤h¶‹Ê{»Ù–(—Àrb*Äìª*ÌhiŠ¿ ?ç*?çñ¤›'Î+ZÐoù—R‡¥¬ƒî{â=Š¿ |áç={óV¸ógž5+­[Y»bóÝÞLÓJçݘ“AØ €Ø1Wë‡üäé>Jÿœü™ò2|ªjgUa¿Å‹yr{‹]#uð `«ñ§g•ÞM“óÎ~]ü¿·þó\Õì4Å=(n§H«ôrÅ_ÝäGm[[¨H£Pˆª(¨ xŠªâ®Å]Š¿‘¯0ÿÏÏç&,u[ë+_¢¥¬²(õ!¶IŒª~)Ò¸«úVÅ]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«üųúÞ‡; ÚIGÐhs;³§Ã”yìáv„8±Ÿ-ß4gNó2‡¤PƒÐŒUø›ÿ8ç¢;ü[åm3PTâzìÒÆzøzb»g¥O.Ñ—xyÞÞ˜Ÿzeç¿(ÛÝ1’xuèàQ‡Ó›<¼ô3KÙãO¥êìå{+eü.`ÔqoI.­i¨i õ‰Ð½¿ûõ*>~NBV½<á›aϹŽ~ž÷ÁÄåþUß§½ñâ_Ê»ô÷¾nü©–ÖCPÖ…ŒæîÜN¦/«K%’(y ßxüû7þsSó/þr“ÌÞgÐ?6'±šÓJÓmîm…¥¢ÀD7È‚j)Û~Åâ®Å]Š»;ó˜ÿóòoΟÉOÎO5~WyëKBÒ.`ŠÕg°Id ö±Jy95?œUûAÿ8¥ù¬þnþQùKó+ÎMëZÆœ—7M b8Ì…Ø(6ƒ¦*þvôùûoüä¡©ÙX\ÞèÆ)îa‰é¦Fp /Š¿ªŒUØ«±Wb¯ÌÏùù—üå/žÿçü³åòžkHnõ]FâÚäÝÛ,àÇ<ÇH¡¯|UøéÿEyÿœ†ÿ–ÝþáqÿÍX«¿è¯?óßòÛ£Ü.?ù«wýçþrþ[toû…Çÿ5b®ÿ¢¼ÿÎCËnÿp¸ÿæ¬UýÿÎ~oy‹óçòOËšÿ˜ šþ«úKë-oŠ3õ}FâÝ8 ¨k_Sß}_Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»|Ñù÷aÆçOÕûqÉ õaÿ9ã?ðSÒÖLY»Ä¢Í ÷Eí=”Ëqœ;ˆ?=¿@|ûžPõÏ›¿ç.t¯Òÿ”¾c„ ¼1Ap§ÃѸÉÿgEìž_]Œ÷’>q!³ ©ÏŸ’¯ú_òïA¼ëKf‡þDÈÑxåÿo®t=±û½TÇüÀ?¥É–Åù·òïN¿™µc÷„ò2F)Èø°èO¿_|ÉÒëåÂw ¶5k§ÞÅþ‰,œœl 5¯Ó×2e–<ÓÅ\ÐWóÝiŽ#¾FŒŸ²OCò=[ŒG&ñlK’ôßùYg€Ë…ߦÿÊÇÀ^~›ÿ+x]úoü¬|áwé¿ò±ð…=²·¾½ëJ… "¡Û`~^?«1òN05Õ®R /—g×[ê÷¶®ázŸá÷áp7c¹zÏ“ü¥a¡'§¦@±–§7¥]¾mÔüºxf«Wª–_¨±%äßÖ‡Yóÿåç””TK¨Ä\“5Ì(I§`öñÍŸcOÃÓgËÝöFGô¬NÄ¿YsÊœb¯·¿,ôÿÑÞZÓâ"$~±÷õIqøŸJû¤ü·gâñâÿNL‡ØCæ=µ›ÅÔL÷ùlÎó¨unÅ]Š¿ ÿç=ÿç⟚Ÿó›?–—p诣ŧY])¾³–YyΤµYfAM¶øqWè‡üàÇ瘿ç"ÿ'ôÍo?­¢kW×ñJ¶Q4Pñ·¹x’ŠÌä*+ñuÅ_^b®Å]Š¥Zíìšv›y¨[ÓÕ‚ÞYS¨äˆXWÚ£4EÿŸ¼þyùÌš7—µ -‹[ýFÒÖRš|Á¸M2£q&àÐÐí¶*ýÍÿœÖüä×ÿç¿&<Íù»äEµ}sHýõu¼¥„ýgP·¶~H¬„üµ>!F¡öÅ_˜¿óƒóòÍùȿΠ#ò§Ïð艢ß[ßË+YYËÜ­ížT£4Î䢿LUûÊ»v*ìUø‘ÿ?ÿŸ„~hÎ0þhCùoùoŒúKèÖ—äßÚI4¾¬ÒL­ñ,È8Ñÿå›Ë?÷ŸþÊqWÑd¿>ÿå›Ë?÷ŸþÊqWÑd¿>ÿå›Ë?÷ŸþÊqWÑd¿>ÿå›Ë?÷ŸþÊqWôéä]fãÌ~ZѼèWúu¥Ô¡œÐ«·I ©Û|U•b®Å]Š»v*ìUØ«±Wb®Å]Š»v*ÿÿÖûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb¯æ_þSäÐßšž\óä*sAî{´ö3¸cÿ"æˆ}«ñ¯~¬ÏœüÂ4_ÏÙ4Æj~—òæ£f¦å$‚ç蠟ê®*þ©1Wb®Å]Š»v*ìUd’$(ÒÊÁQAff4 É$ô~OÎSÿÏØ?/¿'>µå?É᜼Û(̱9ýlãoÞN¦³üž'¡•*þvÿ=ç$ÿ1?ç#õñæÖµ> cf6Öj};;Pß³ D]¶-C#9»ñW…â®Å_²ßóô¡þü¾ü†ü¨Aé¾åviÒÖÚÊ& ƒ•ßzî+LUøÓоüÿŸbùüuÿ9å!,~¥¦Žnõyö¯ªÛ¹‰¾‰Ú,Uý€b®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»Kõk?Ò76=å‰Ð|Ê2Ì3à=ů,8âGx|‹É»~P~\éCJüêüÅòÀ^+4×Wª½ r®(()>Þß~wc%éñËȳö:NØïfÞsÐ>ßÃã™ú\Ï1’/—<ɤ˜™”³wÄ០avj½ò¼¼YêÏ£C'‡~-½>šl«$mÙÇOÛò=ì?,ü­ù½Oùw|šW˜–m>…Ž¿©ü¨ù(×äÍ,_W'?§&›lƒŠ=ÿÓó|Åç¯+y“òÚ÷ôWœìf²•«é» Å(ãUXxÐÔwå˜óÇ&à»ý8†qp6ÁÿOÿ•–q7þU9ÐTóUôZ–íf¾¿˜Ñ!·Bî|M@;“°“LŒ²ˆ‹,2aŽ1Å-ƒë=7òËÈVqù‹ó«PŽÙ˜V=6«±²Ì»±ñì?ž™Wˆj7CŸ\r#ãøý?$«TóÐÕÓ<­jº~–Ÿ r?Øì¿EOùYŸŠ$su²Òˆú¦l¢ô=<¹TœÉ8Œ¢<Ÿ¢}³_ªÌãÂ)üå: ;ÉV6Cf¸ÔPŸuŽ) üJæ’\S>ç{Ù1©ß“õƒÊzOè LЀ§Ô¬­í©áéF©â|[=gÇóÝfšìUتK­ùoHó4IiæK ]BÛšGws*µ)ÈBEqT.‡äÝË$þ[Ò¬tùeP²5¥´P–Ô( ‘_U’b®Å]Š»aº—å×”õ›™5=cBÒîï% É4öPI#( 3!'`çdÚ~k¤ÛǦéPEmi ñŽQc‚ª€ù U†§åO’ca$~[Ñ•”‚ÓíÁw*ϱWb®Å]Фzç–43¤py“O´Ô"‰‹F·pG0RE Pà€i኱¿ùTÞGÿ©gEÿ¸u·üÑŠ»þU7‘ÿêYÑîmÿ4b®ÿ•Mäú–t_û‡[Í«¿åSyþ¥þáÖßóF*Ì4­&ÇCµJÑ-¡³²‹—§¼kkÉ‹( RI4’N*˜b®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å^?ùÛaõ¯/‹°>+[ˆÜŸj¡üHÏ>ÿ‚N—ÅÐñÿ2q?qûÈzfrðgáþp#å¿è/‘³ÀßAyÏç•úsȾeÒ«\h÷èŸë˜‰ê:5\ØvF_ SŽ]ÓÞ@щ¿çëÿ—QA×ê—·0ü«Æ_øß;_iý¢{À?£ô9Y9½3ZÓúíšü9%äºÅ‰RYv#pFm°ÎÛABéÞo‚Ð/Ͷ¢÷Nm‰ .¾ô=iãPírY4F^¬G„ýŸ±X£õoÈÁæ‹'ó'å ìz„w²w¤ŠzñVjoþLœOùG!‡·| xz¨ðŸçVß1òXçáÚo—õI¯tK©t½bmo!n2C2u>Z„gQŠ1Ë(AäFáÊî¦ýòÏ<,óÈžNóæE×Ô|§fóª%œü0Å^ï!Øm½7cû æ¿Y‹C,¦»‡Sî€Ã$Ä9¾ƒ¸òO•)Ô/šn—WóýV!T©QðžŸëI¹ªg;n~ÑþèpC¼ó?/‰q¸å“–ÁŠ]ë×~c—œ C~“ ç¿êö̸i£€m¹ïd "Ë4{›f.i —ªhö=6ÍViµð­RÃô÷üäO”tÊU,m„¬;sÜW¡ÿ'ðèwÍÎ<žee—ó|ÌcúÔš~œgš¸Š°B×%¼B¯#QîMO3’B#™ ‹HDYèý ²µ[+x¬¢ûƱ¯ÉE}i§Â0B8Ç(€ÀSäY'Ç##ÔßÍ—0v*ìUç¾cü¤ò7œoNµæï,hº® Ê¨no´ëk‰J¯ÙRò#5a]±VOåï-iQ±MÊš}¦™¦ÄY’ÖÊà…KžLDq…PI$š ÎøªwŠ»v*²HÒdh¥PÈÀ«+ ‚ÄzƒŠ¼¢ßòòÆÒT»´òW–âž&WŽDÒ,Õ•”Ô2‘ApF*ô-ËÚWš¬%Ð<Ñck©i“ñõ­o!Iᓃ^QÈ[‹(aQ³Fãb^^ü ò”o“\ò§•ôM3Rˆ2¥Õ–›mÊq`$€ hwb¯EÅ]Š»v*À<ÍùQä:]cÎ>ZѵkñÄ./ôû{‰B)$/9Q›ˆ$ÐV›œUÿнþVÔåŸûƒYÕ,Ußô/•Ÿõ#ùgþàÖ_õKwý ßågýHþYÿ¸5—ýRÅ]ÿB÷ùYÿR?–î eÿT±W¬ÛÛÅgv–‘¬PDª‘ÆŠUTP*°lÅU±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»ÿ×ûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb¯Åßùý‡‘¿K~ZyWó$ 6‹®½›7t‡P·fcòço>äb¯æ—}Ãÿ>Ýó!ò¿üä‘/KñK‹Ë›Ð7ÖìæAÜWâu#ü  )Š¿±¼UØ«±Wb®Å]о6ÿœ¡ÿœèü±ÿœV¬|ãzÚšÚ0ðh:yY.Ø0ª´¤Fv<¤!ˆÞ4’”Å_ÍÏüå'üü+óKþr}çÑ5 ¯ðÿ“•] L‘–9µZ—g¸=*ŒU–$5Å_ b®Å]в)èOæsLòÌ5j7¶öjGZÍ" ¦ÇÇÀâ¯ÕOùüÞ»ççF‹å«>+m¤yZÎ/M@$–æáÈtŸ§µÝLUùŠ¿pçȾEúÿœüëù“,u]/IµÒãr6å9•¸ö¨¢´Üÿ+u_ÑÞ*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb¯‘üÃgõ NîÒ” 3…ÿTšÃ:í<øà“Êç‡ÈóIòö—æÍ͘Òç)5 U.³§£åbŒ|z´öþ½†ž\Zšß~×SÚq¸½«ÎzÛø|rz\Ï7’/’üå Ð± .—5¸S>t×´Úrflƒ›¥ÌñýRÞk)VîÍÞâ`ñÉea¸ ÁˆÌyÆÞM–ö/ |‡ÿ9aÕ?À_óÚL~fòļQ® j×1ö Êh$*Ì J:òfÍ&«³Íñb4~Ç'ù;~<'„ýŸ±ëÿó‚•Ÿ˜Ð¯æïåßžÒÏòÊ0òj"R­%©@¬Ñ‰¥+éQ[] Æ ’$åšÉv¾\GÜ.]<þ~Gò¦\~‰ÆåÓÏáú˜g™?ç$?/ÿ(ì¥òüâ¦à¸×¯#fiˆý¥~òC]Á“ŒjkÆ"¤fnŸE“1âÎ~¢z™Ïsþhü~;ß,ͪêžl¾}oÌ—RÞßJjòÌÅÈvv€v½ÅŒ@PjÌcŒTvDÑ4þ›fTC Õe{‡•´ƒ#)##š|!ÔÄ_Qù?DûxfƒU™É„^eÿ99¦þ‘×<ƒäÈÅZûR!—ÇÔš“§Í»|»å:,• “î —{Ù‘Üüª9Á½±W×Ú=ŸèûkPÅ !ù…üsŽÍ>9Þ^³ 8"pL²¶Çb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«óÆŸúO@ÔléRmÝ”x²køš?itŸšÑe‡ô øú‡ÚÙ™|,ð—˜ûv/„3åçÕ.mÒî-fŽTdaì‡ eÂltWçüá¼O‰æ-\{c¨#8ðgB‡oœ^úz/µä˜òâÜoýó—›¾ˆÖ´þ»fƒF ¼—ZÓúí›|9Ay&µ§õÛ6ør7D°[=sWòmòë^X»–ÎñÏØSUaìÀlΞ z˜ðd?Æßf"B‹Ýí9ü‹ùÃm•¿?´ä³¿QéÛë6 ¯v©aV}È!â'vUf¤v>~ÎyüÌó(¾òÌ…_O†Á®ƒ/5£f2Ttô¸‚>.J»e‡·µ:¿Ý`…Oø‰þŸ/¹€ÖO'¦#~¬[ÍŸó’wz…°ò—åE’yw˱N3ªÜ:øŽ;E_òjõßžôÇOììc/R|Iùý?·ã·“n=-o=ËÉt»W™ÌÒ’îij3’Nä’{œÙå•lÉzŽcÓlÕf›Q/UÑìzmš¬Ój%êº=M³S›#Q/üµ·ßüäv¯yJ®™¦ÈWÛŒP@|;È~ÿ Þö”¼.Ê€þt‡ß)~„Ïh?D3Ïœfeù{§þ’ómJ:Ê~Q|gþ#²ZOÌëñCúB_é=ï]okåð´ó>UóÛô¾çϦß/v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«ÿÐûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb¯ˆÿçã^EÿÿÎ;yãOŽ>w}Šjñ*Sô|És#ùä’þI8«øßÅ^×ÿ8׿å?Í¿"y–¤%™´yÞÑ/#.6îµ;â¯îGv*ìUØ«±Wb¯ä‹þ~Áÿ­%æ?ù‚Ò?ê,UùÁŠ»v*ìUôŸüáÇ—‡š?<ÿ.ôv£>fÒç‘OFK{…™ÁÜuT#{üýÌGÌ?ó’~pUnPX 6Æ-ÎÂ+ ޤxÏÒžâµÅ_Ÿ¸«ú‡ÿŸ3yü?ù/©yÆu"0k÷2#v6ö‘G}Ò ·þ˜«õ×v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb¯óÇæ7›üµç_,y+Ë~J»×<¹­†§¯ÃyQi|>É’RÒë³'‚so‡{^*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å_8~fYý[[y©´ñG'Ü8ƹÒvdø±×q?­ç»F9/¼~ÇŸfÅÀ~{~uF4?ùÈï ëbŠ—ð[ÙOWyæ„õ>¨§ñΧ³${‰?`?¡À×FÃë¯9èoáñÌ=.g›ÉÉ^sÐ>ßÃã.—3‡’/•<Õ£6΃øƒÀ^®é¿kldÞ—3Æ5Ý7ím˜òI¥Ìû¯ò&ªÿÎ,~béŸïÝNðÓçmd?†sšÌw«òyaªÉz˜{‡Þ_Ÿú&ŸÓl袭Vg°hšM²ø‡žÕe{¦—* e܃ÏçÉfŸHù?Cûxf«U™„"ú§ÉúÙÛ9ÍVg3^ ù­f5ùÈO ùiG%³‚ÞðŽY§&”=Jkú©\žðèòK¾ÇÜ?K¾ìØýïÑìãÚo ÙýR´³=$™|«¿á”ê'Á|‹vqÌ7×9È=S±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»Aê7Ock=ì0ÉrðÄò,ÓÔª’995(*@¯R1W—~IþeêßšþZ_6y›Êº·“¯Mİ3YU[Ž1Ò’€¿°ÕÚ ƒµ(J¯]Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®ÅVº £Š«ö8%!E ÖïÏ}VÈé··:s}«y¤ˆÿ°b¿Ã>M×i¿-šxðÊQÿJH}o_}à˜@f+sóãþqÎÜhÿ™Ÿ˜¾RQÅ>·4è½>îœ&ÔìÊ;|¶ÎûÚxš=>_ >&"þع9>_PëZ]³šÃ‘€/%Ö´þ»fßFØ—’kZ]³o‡#h/$Ö´þ»fßFà^K­iýv; ¾Àÿœ„‹Õü«ü¹‹ùl¬ÿê<æ;'ø^yÿt\(¬’øýï–´{›gAšna/UÑìzmšœÓj%êº=M³UšmD½WG±é¶j³M¨—ªèö=6ÍNiµù—þqm?M~fþayhR9Ú þÌ×22޾ÙÑûN|= ~WòˆÿŠg›h€ûï8Gí?‘¶XÖæ¾aU·¶jv~³Ñÿàe¥ñ5’ÈyBç"û8žkÚŒ¼8D{åöÀ}ažìðNÅ]Š»v*ìUØ«±Wb®Å]Š»v*ìU応ߙ­ù=åïÌе2ý¡Û}fòA$Š…’:ŠªæçöQI튳o,kG̺>Ÿæ7³ºÓÛP´‚ìÙßGé][™£éOO R¼]jx°"§O1Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š¿ÿÑûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb¬gξX¶ó¿—µo&j_ï¯au§ÍµwsD߃UüjºmÆ‹{s£ê)éÝZM$!ý—аú8ª…¥Ô¶3Å{jÜf…ÖDjFSPhj ½íW‹Ìe–½iýÅõ´71ÿ«*‡cኦث±Wb®Å]Š¿’/ùûþ´—˜ÿæ Hÿ¨±Wç*ìUØ«±WègüúÇËÿ§ç$ü§3¯(´èµK×þ̈́Ȇ ŠRGSïЊUó÷üåï˜Å?ÿ˜zÐ$£ùŸUŽ2z˜á¹x£;O…ݺb¯1WöŸÿ85äsùyùùå©„§D‚þE¥ ɨ¼u#Ä4Ä|Uõn*ìUØ«±Wòíæ]WÏÿšIÿ9ù»ªþay²ÊûòëX¶M*ÎÇTš FŽëR¹¶ôÚ4 "Ư êZ¸«÷·þpÇÍúÇŸ$<æï8^K¨k7ºNó³¾Tóžöþèô¹œ,‘|—ç=íü>9Òis8Y"ùŸÌYBÊFmNá·O–<[]Ó~ÖÙLƒÑis>“ü­Ÿê¿ÞsÒÿß·×&Ÿ8-‡ðÍ6£ç‰òýlóåÿ‡¸}åò~‰§ôÛ6ñ ú¬¯`Ñ4þ›eñ=ªÊ÷)hÜÙXŒ§Q’ƒ¬—ÔÞOÐþÆÞÏj³9P‹ê'èclç5YœÈEñì(ºßüåâ¯Äš&š8ŸlcFðèÓ°ï÷f~Ypöxþ‘ÿ|SÐh#Aú œ³²gÿ––ZÖã” ä?wÿÍiχw?KŸÙÐâÉ}Ϥsšzb®Å]Š¿9çèÿ›>nüœü•ÿþYj·6­u­ÙX½Ý© 0†HævTz„”_‰hÔ¨®ç|¥ÿ8ëæÍ?Ë_ùÉŸ(~Ny¿ó[ó~æO(~œ¹‡Tbȯ=¬Ó**»ÉCÄ´u*Ì*Ä‚«÷v*þ`®¼ûù׿ËïÍ¿Ïë?Í3Ø"yŽ>ÛIŽêVŠhîõ·¼õÉP¡4ÛCófÔ¼ëùUäo9yšsu¬jÞXÑoïg*ªe¸¹²ŠY\…G'bh» b¯bÅ_”_óò?Ì/>èþpü™ü¢ü±óMÿ•-¼ó¯Üiº…æšxÌ\X[ÄüV"1s#pªæœºJ?ç|áù‡¦~vþj~B~cyËTó†—åxíŭƨܤõœK¯"앨T9S@zâ¯×LU„þeÞÜižPó¥§ÈÐÝ[é7ÒÅ*2:@쬤t ŠƒŠ¾ ÿŸV~ey«óSòb3þdkºæ¬¾`¾·Wó4Òˆ’ §&$ñ‰Üâ¯ÒŒUù¯ÿ?SüÊóWå_äÄgü·Ö/t=Y¼Ácnn¬&he1<3–NJAâJ‚G°Å_%þBùÓó_ò¯þr‡È?’¾küÄÖ|ßåï6ùaµ{ÈuV,¨fÓ®®‘Yäâc’Ý)"•fRÊE Å_»˜«±Wó9æÍOοÌoù_ŸšvŸ™þ`Ñ`ü´ÕàŠËJ°•£¶š­BâÕ#B$…w ÅÉ%jJ¯ÝùÃÿ=k™’þJó×nMé0ËwrUTË %K -Oš¾ø«é,UØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WÅ_šºèÿ3^€(“™Ù¨'þ¹ó·:OËöŽNéT‡ùÀ_û+}+°³xšhùXùÕO;ÎIÜ>òƒ/ÎMù‡MZõ;W¦üíà¼i‡ð=Þ¬xÝ‘Ž_Í—Üe¸¹x>ÌÖl* lä0äiäºÖŸ×lÛ`ÈÛò]kOë¶mðdn‰y&µ§õÛ6ø26ļ“ZÓúí›|¢_Lþxq¸ü¹òºîc´µè´Aœ×bH^yÿt\\N_ޝŸ4{›fÿ4Ü‚^«£ØôÛ5Y¦ÔKÕt{›f«4ÚÉz®cÓlÔæÈÒKÓ,£ŽÊ¼¸Ú(Q¤sàª* Öd&F‡V²_#ÿÎÀ÷z?™¼Ñ0øïuD‰›}Ú(ýC×þ3x÷ίۉäÇŒtüͽmÔs÷ŽpÎ;êÈkKO¾ÔÈÞiÖ }£ZÿÆùíð-ÒðàÉ—ùÒÿJ/ýûÃûU–òFÂþgö=ç=Iå]Š»v*üxÿœÎüÉüÕ×ç%|…ÿ8½ùWçk¯%èúþ„/e»³¶IÜ\<·¼™Ô´lã…ª*¯¨¡K3nN*Ì¿çØ?_˜™ð~aùKóo_›ÌrùWZ†ÎÎöæ4IŠ¿¬Ž ^ªL!”1b¼ˆäE(«õW|Çÿ9›æýgÈ?’^vó—“o%Óõ­?Jy­n¡ IÔrRA¡Å_ŽžGüÛü÷üºÖÿç<ñæÌíCÌZOæÎ¯ºEÝœKµ¿×--匹wõK¥É*á"1²‚+]•Dø«±Wá‡çÏæ_ç7æOüäמÿ#|ù‡{äß/ùGËK¬Z¥•¤s =>ÖêDqÎ2ZI.÷…›‚…*û þ}ùÏæÿÏ/É…óWæ–¢Ú¶³i¬Þéëw""ÊðÆ‘Hž¡@0õåJjw*¿CqWÂßóñïÌ3~T~Dë¾vüºÔçÒ5Ûk­5!»¶ H‹-Ühàø”qWÐ?óúþ£æÏÊ_!y§Ìww«j^VÑ/o.d5y§žÆ)$‘©Ý™‰>ç{F*ü|ÿœþüÅü˳üëü®ü—ü§ó•÷”m<Ü¿T¹žÑP²Kt"´D¯2 ýžk_Ч_óîŸÍÏÌŸ1~`þmþJþmy¢5ÁäWê6w×p¤R³Cusm#€¤•Y*Þ™wàz7RU~´â¯<üÝóï“ü‹æ6茩¨éz&£}lΡ”Molò!*v 2ŠŽø«ù»Õ¿ç ÿç"<ù?åùËvüÔÔoÛ^óΜÚöPú õf˜–i9tF†1 q ³|#Pø«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»ÿÒûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å_ÅŸüçO‘åßçïŸü¹ÇŒo­Ï¨F)@#Ô@¼@=‚Ìùb¯“ñWöñÿ8—æ/ñ_ä§åîºÏÎI¼±¤¬­Pk,v© ýµmºŽ‡|Uô&*ìUØ«±Wb¯ä‹þ~Áÿ­%æ?ù‚Ò?ê,UùÁŠ»v*ìUú÷ÿ>cÑ£—óÌ>m¾øm4*Ý1z溷“CþëY6ê{V‡~NùX“ÌZµÿ˜.6–úê{§­>Ô®\ôu=€ÅQ¾KòÅϼäù3Mÿ{5{û]>ÿ¼¹•b_ņ*þòtÝ:ßH´·ÒtäZZÄCôTBª`ª7v*ìUØ«ùò·ü ?ó˜ÿöÙÒî·}Š¿oÿçÿõž/íüœ|Uõþ*üaÿŸ¥äÓÿœvÿÀšïþ£tœUÎ6ërþtÿÛÛõXb¯×ìUù³þ8zŸüÁ\ɶÅ_Êÿ¬+«æÙOû£ÁŠ¿©ßÊoùAü³ÿl];þ¡“z*üaÿœæÿÖ²ü€ÿ˜Ûú\Uû=Š»8:ü§ó˜¿öÅÖ¿ê&LUúÿ>¸ÿÖbò7ý¾¿î±yоÿÅ_?óú¿ü’þv?÷N¿ÅZÿå†à™ÿ21Wëþ*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]аÌ»O¬è’J:Á$r~<ãlØvdørWx#ô¸=£,~çÍÙÒ¼ëàŸùø^™ëùLÕÐvzÔ@štI`”éüÁ}¿ è½™f#¾?¤0È,?D¼¡ª3ysJ×òö·5ñõbW¯ãš,ÑðæGq#íy¹ 4óŸ9è5äxæÃK™ÆÉÉ~sÐ>ßÃã.“3…’/“¼ß¡˜Ù˜ èôùlSˆ}&Þ®é¿kl¾AÚis3¿(Ïõ_Ë_0iïÛ™M>qÂ?†kòc¹‚ääËy£îýo Ñ4þ›flCf«+Ù¼»¥™E2Éèrψ¾™ò~‰ö6ðÍ6«3(EõG“ôO³·†sš¬Îf8¾ òΖ-£0éÓ9ýFK.dó{þqæoñ'üäæwš–Œ–ÒÝX«±Sxi¿B-ëÓîï¾í_F“=Çìý¯C¤D{Ÿ¡™Ì9Ogü¤³ÞóPaü‘)ûË Òv¼ùGâî;*åð{Ni]ñWb®Å_”?óù/ü–ßøißòbçxÿ–?õµ?+óYZÝ>ë~ßb®Å_̃ÿ¬Åÿ9/ÿž—ÿu‹|Uûÿÿ8ÿ’CòÓÿÏ/Ý:Uïø«òþ~;ÿ“¿þqÿ7ÿºŽ‘еÿ8}ÿ­}ùõÿ*üáÿŸ6ÿ䄹ÿÀ›Qÿ“Ø«õ{~PÿÏä¿òB[àM§É‹œUóýþ·ä¿þkûû¢ê8«÷{v*þ`|­ÿ(üæ?ý¶tŸû­ßb¯ÛÿùÀ?ýgŸËßûcGÿ'}Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ùƒóçOô¯ìu@6šˆŸxÚ¿©óÅ?।áÏ7ó¢cþßû÷·öW5ÂPî üÇìx.ykÕ¿=ÿ3$ÿ ÿÎMyKUé£ad“±yŵ7>~ÿï»4xý‘–?Í‘û8eúܘoûúæ2=s„‰§æÚÖŸ×lÙaÈÎ%äºÖŸ×lÛaÈÜ É5­?®Ù·Ã‘´’kZ]³o‡#lKÓ?1î>»å?,Ùuô „SåŒÕölxså=äýå«ÔXcÓlØf›i/UÑìzmš¬Ù‰z®cÓlÕfÈÔKÕt{›f§6F¢U?4¯Ç—|‰æ=X/‘zèËôü52=™SŽ=óÞÃrðïùÁ½;ê–_ÒŸ_Ôo.+N¼Ya¯ü’Íß¶Ù8µ„61ï¿K=Aõ>ÂÎE¥ö·å]‡Ô<±b¤Qå3{óbGü-3éa´¿—ìì}ò¹ó‰#ý>iÛ¹|ML¼¨|‡ëzu®¡Ø«±Wb¯ÆùȯþHåþ)ÿÕñWϤ¿ã·ùÕÿ4òró~Ïb¯?ç??õž0¿í'üœLUùæøäÎÿÛhÝWKÅ_Ñö*ìUøC}ÿ­ÁùÑÿšþãþèºv*úþ|Ûÿ’çÿmGþL[b¯ÕìUùÁÿ?`ÿÖmóüÆéõ*úƒþq;ÿ$‡å§þž^ÿºt8«ßñWãüç7þµ—äüÆÛÿÔzâ®ÿŸuÿëEÿÎHàMuÿuküUû=мƒþrÿ%gž?ðÖê \UüÐ~jë ~Xàgªþ»ÌUý_b®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUÿÓûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å_Î×üüÏþq/Ïßœ_óZ\¿“úÆ«&½ Z=ÔѨH –Úi f¸™©(ŒEBÍVû* R;þqŸþqßþp.Ö4ÿÎ[jðùçó%Qg¶òžž¶ñ9“Ô…ŠúŠß—^œL ã Už~MÏçc›Îhÿ›YµÑ¿/&1ç¾”$–ãMGõ—¤éN¾”q2°öqWîߢy÷G´ó’ïíõMþ15µÝ¬‚H¤CÜ0îÄuR F*ÈñWb®Å]Š¿’/ùûþ´—˜ÿæ Hÿ¨±Wç*ìUØ«îùÄùÁ9ÿÎPL|ÍtßáßË›2Ïæ ÕãH÷‘m•ЉY@<š¢(÷.õ¢²¯¶üÕÿ9õùiÿ8m¿äïüྦྷêÖ–wsÌZw“E³¬rFcyIÜ ‰¦â™ ¾*Š:üãüüj³y^EüªüêºäÆÍÂ}RþsSðéÅ9cÕ£ô.I«4rº¯)ÿœlÿœ üÏüÿœ™òF‡ù¥¢1Ñ,õ 58õ›NSéÒýB¸Œ¬À¬eD9$­;â¯êv*ìUØ«±WóKÿ8Õÿ8¥'üå_æçÇ–n|ã­ùgG´ó([Û-.Cõ}DO~È.¢,A CXùâ]ˆ¡Å_пå7妓ù7äíò»Ê­3éZœvp=Õ ÝÈrcV4jh  Uèx«ñ‡þ~•ÿ“OþqÛÿk¿úÒqVAÿ8Ùÿ­ËùÓÿlkoÕaŠ¿_±V?æÏøáêóqÿ&Û(Z7þ°®­ÿ›e?î*þ§)¿åòÏý±tïú†LUè«ñ‡þs›ÿZËòþcmÿê=qWìö*ìUüàéÿòœÎbÿÛZÿ¨™1WéÿüúãÿY‹ÈßöúÿºÅæ*ûÿ~@ÿÏêÿòHhøØÿÝ:ÿ{÷äüàM§äÏæ+~{ù›Ï>c󧚟&ŸÚÜÂVXä <¤rò7Eäjv;QWè*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š¥:õ§×ôÛ»1¹’üøš~9vž|Ì5g‡òx‡ä½E>¿ª0²±‘y6b=¥¹§Ó›üý¡ú“¢Á¡”÷–ÃÍ‚þxy#ÉšQ½üªºµ’k;¢ŽoQÊK±¤ˆß´Tö#Ó?ÊAËû3.|FbháéG§ã6YòãŒx /ÏñýÌ­Ο™_óƒ÷ñyÍë'™¿+¥—…½ÄuånôŒ±>“÷ô\úO¿“ÜâÃÚâãéÉÝßúÇŸ>÷ŸÔéD·ÒO+ùãËŸœ ~kò=ìwÖR 7ž7¥Lr!ø‘ÇpG¸¨ žw& égÃ1GñÉÓäŽyÏ@ûŽn4¹œ,‘|—ç=íü>9Òé38Y"ùo̺A‰˜SlÝÆ\A†)ð–;i1µÐ¯´ÎÒÈÆŸ0£ødL/w.Y/$OãªCÓþÎÙ8…Ôå}å ¥I‰©ËN¾§ò~‰ö> çuYœ¸Eô¶¶]±—\×®"³ÓíPÉ<ó¸HãQÔ³5Ïæ‘™áŽä¹¸áoŒ¿1ç%<ãÿ9©IùGÿ8¹Öúe8_kÏÊôÎŕȬè¿~ˆªA ²ÁÙ¸ô1ñu'~‘çý§ìãM¤½ËëùÅÉ_,Î:iÚF¤ªêZÙõ=Aª hyðXã'áE29¨<Úµb~^k·uy{BBQ<<7CßÎÏÀy=“,1ƒ‹«ê OÈ)w Õ|¡:ÞZý:ükì:VžóÍ6.Ðá<9Eþù4¿ç‡ü\UúÿмÿógþP3ÛQÿ¨gÅ_œ?óæßü—?øj?òbÛ~¯b¯Êùü—þHKoü ´ïù1sо±ÿÖàü—ÿÍoÿt]G~ïb®Å_̇üãÿü⯘ç+<ýùíå-Ï—žOРó(]ZÊÞÍ®¢ÔÖ[û÷ˆJ¢â=…ŠÔ>òµ>%_Ñ'äçå†ù-ä ò«ËóMq§èVQÙÅ5Á¤œ:»qÌI 1W¥â®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]м{ó£EŸVÒ-䰉渊å@DRÌUÔƒ@=øçŸÁ³g«ÒÀ㉔£1°j@ŽCÏ…è½›ÔŒ9H‘ c×Ëð^i¥~XZh.·ùt––ýVÙZ®ÞÄŠšÿ’•>ã8ͱX´PüÇjLB= ¨ù?ÜÂϘwYûrYåáécÄÐ~;ÏÉñßüåçäÏ—ç"¢Óî¼¥ÐuÍ 4ëå&Ž¥¹ð•ì9 ‡RdRyU‡Á’ÍíÎ R´øDpˆå)y×/Ÿ=Hv½§Ë¥³–\F\ÇAî?Ø<Ÿ)~\ÿÎFy“ò¯SOÊÏùÉKya¸Ž‹m¬Ì:VŠÒ0ÚT?ïÕø‡I—"0{CÙìZø~c@AaÜ|¿š¢vþiªwRÆ%¼_mÜý[U¶QÓ¤Ií¦@ñËFS¸*ÃbˆÎ27ŒðËb:³Ìµ­?®Ù´Ã‘¶%äšÖŸ×lÛaÈÚ É5­?®Ù·Á‘´>³sõÛ+ *×ÐUù pG†r=ÿ­Œ9”ÇG±é¶C4Ùõ]Ǧ٪͑¨—ªèö=6ÍNlD§lóï—ÿ+4¦óœnD ˆ£Z4³8b4رû€êÄ ò.‡.¾~!g©è<Éüy02Ø>*’?Ì?ùÌëßMKùsòÊ)w;“qÁºž¼•ÐÆGwd—Ù¸ÿªf#ý-ÿ¹ì¥îåvؼËõ·ò‹Aü¾ò·”4¯Ê?©6›g¤ÂðÚÝú…Ø´’4®òHwäò;9ÁcÄ"ÑEÚ~ÞìþÜ€ÃÚçÈe/‰Üt¸£ÖÃÉëpj°ä9±KˆÌOËaîî£ïM¼Ïù[ªhCëºu5 9¨VhH§%ûÅWÜf“¶ýˆÔ艋÷¸Ï)Gøïó0ß¡íÌzL½î? þŽo¯´Ë1§YÛééö`†8‡ÉáŸ@h´ãMЇðÄGý(óÜùÃÌ­®ùˆù“]óN —×—+j-c_L?©ÍÉfi™ªáBŽ5e_oâ¯?ç??õž0¿í'üœLUùæøäÎÿÛhÝWKÅ_Ñö*ìUøC}ÿ­ÁùÑÿšþãþèºv*úþ|Ûÿ’çÿmGþL[b¯ÕìUùÁÿ?`ÿÖmóüÆéõ*úƒþq;ÿ$‡å§þž^ÿºt8«ßñWãüç7þµ—äüÆÛÿÔzâ®ÿŸuÿëEÿÎHàMuÿuküUû=мƒþrÿ%gž?ðÖê \Uø%ÿ8§ÿ8-ç/ùËÉ*Iæ?Ìcùmm«^]CåôÓRI!’;‰b™ã¸æ§”•zr «Ëìšb¯é3v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb¯ÿÔûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å^Kùåä¿4~`ù#WòŸå—˜æò§™nà+gª@ˆæ7ñnJ̪ÿež:J€òCÈPªþ/¿=¿*|õù7ç-GÉßœÖ×y”HÓË=ôÂí].c™¿½I$=kZ†£†P«Ç±W×_óŠóšÿœLÖ>·äë¯ùjæ@ú†ƒw#}Vã .L3PPJ‚»(‘dAÃTßóŒ¿ó–ß—ÿó•ZéÏ˫ޭ¼jÚ†rUolØíñ ?dý™R¨Ý*ª}9Š»v*þH¿çìúÒ^cÿ˜-#þ bÅ_œª½­¬×³GeeÍq3¬qÇ–wv4UU’NÀ ÉÅ_°Ÿ‘ßó¾Qüòä_ó‘ßóŸ·‹¢èQÒM;Ê„Ÿ®^KNH—§™c×êÉñ½ÃÄ‹"b¯œÿç-¿ç>|Íÿ9þ]y*Ù|¥ùSb-ËŒ~´QvnŒtV¥XRǶÎê$*¾ÅY/“ü£®y÷Z²ò’ln5-rþe†ÒÖÙ É$Œv êXÐ(«1Š¿²/ùÂÿÊOÌoɿ˛?,~zy¢ãÌ~`n2,S2̺t\E-RàV~?´îì£dˆ^N«ë\UØ«±Wb®Å_XÿÎ~Ni?™‰ÿ9 ¢é—V^kMEõ_ÜÞIõcw!f’OE¹͘±U!? ¶*ûGv*ù÷óŸþq›É?ŸZו<ÝùƒÔš‡“/ûI6÷%Yd’ ‘@<Ç+xö>þ8ª+Ê?óŽ^MòOæG˜?ô(®—;g·KmE䜴-zTá(§÷I½||qW¼bªsB—ÐNªñ:•e``E ìA«ù¹ÿŸ“ÿÎ%þ@ÿÎ=ùSô—åTñiþ}¹Õ-[ô#êþ´±ØN³‘-$v˜Eͨû<±WôùP ù#ËJ„hÚx ÿÌ2b¬ÿ|ûù‘ÿ8ÍäŸÍ_^ü†òv›ùQù~“G i_Xú²ÜJe}bâK‡äæ„ür5<lUê«Æ¿= ü•ÿ9å“ùyù±`×úJÜ%ä>œÒC$7«¢K¡0WuÞªCTŒU ùÿ8ûåùƯ,¿åßå„w1hïy-ñ[©Ìïêʨ¬y6¢.ث۱Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUثǿ2t=Rä~’·•ç±AV€ºéÕ¨>Ðñ'qòé¹ìÌð¤Š=ýî§´pN^ lww-G2/Íq¡õôÙ[í•@Ɯ׹_¶›ÔÍzŽÎžŒß8ô?­Ñê4æ?9èoáñÌÝ&g[’/“<å Ð±:].kp§|ó©«Ü}Dì^†Ÿ3ý™œ\¬#Š<]ÌãË:Oªë¶Ù’á,åÄ_Oy?DûfU™ºzÇ™?1<·ùA¦ gͳ…‘”ý^Ò:4ó°ì‹^ž,h£¹­Ó 3ÔÊ£óè† &|ž ¤ùGóþsîoÎ//—?-b“Ô¶µˆžSÞ0ÀzŒFÞ»Ž S顸—,ͪÃÙc†¬Ow¿»Ü7ïwúm ô7ÈÞBÐ-ô˜¼±äË(ì¬"ߊ ³µ(^G?¹îÌIíМ¦£S=D¸¦l»)˜e z/4=Ròèj½­ªI(èôýÍôŠžÙ­í ðŒxd,÷wy» ÈñC½ô^s@ìUØ«±Wb¯üøü†òü䔿ü´ü϶–ãH–hîQ­åhfŠh«ÂHÜVŒ0øƒ)‚*•ÿÎ;ÿÎ;ykþq›Ëw>AòÎ¥u¦Üßɨ³j—"âU’Hb„ª°D´ZlKçv*ø’×þpòÊÏÉ>tü¢Šmcôžõ5MYÔ~°ž „¹_Eý*"óAPU¾Š÷Å_Wù ɶ—>YÑ/|¾em/AÓm4»C;Ái Ã6ÜPr žÃe˜«åOùÊÏùÆËùÈ-ÏTüòž]6ÓÊæ{Û}^å±6Há ìÒÉX•‰ A^¸«ócþ}¡åß,yKþrówË–zŸéŸ+YÚ[E§ê[Žóë‰Áõˆþ 7¯Ä»b¯Ý,U)×ôk1é—¾^Ô [ûi­e(hÜ&BÄhhvÛxïüã¯ü㯕ç|ªÿ–ÿ–ïzúKÞÍ~MüË4¾¬ÊŠß¢4AAOñW¼b¯ÿœŠÿœuò¯üä÷•Sòßó!ïSIKØoÁ°™a—Õ…]WâdqÆŽj)á¾*ÄâÿœBò,_™¾[ÿœ„Y5/ñG•´”ѬÜ'Õº[Ml ‘ú|™øNû‡Qʆ›Pªú“v*ø‹HÿŸ~Uùsó<ÿÎAùgô¾æÔŸV–ÖÞøýFK™ 3³ÂèÍFgfà*“D »b¯·qWb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š´Â €hOqÛ¡ñ§æg–µ½"ý¯µ¹¤½·”Ò+£Òx6B<Þéó¿¶}«Ñç959#/¦ïHåä6îë^غÜ9¡ÃŒ‘Î?§ÏßϽæYÅ»¶ ùƒùoåÿÍ -ü»çE¹·5h¤ °½>ÜOÕX}Ç£µ íºñâ4z÷ÜGQø ŒŒy>’ÓÏÿóˆWLñ—óåIJoÔ9Úú/þP¬Rw£/n'¥ö†?êy€ùÿÅöCÜäXËä_Sù[Ïž_üÐÓ?OyFäOÂX›á–?³"uÀý–ꤌæ5:ºðeÜzqk11æ‘kZ]³'FÀ^I­iývͶ±/"Òn~»¨ÜÙuô…>LFmrG† ÷¤lö Ǧ٪Í4õ]Ǧ٩͑¨– ùŸùû¤þYÐ:* SÍ‘ÚGVXݶ_SŽõ'¤kñòjföoaO]럦Iëîý|‘q$—ŸóúçæF¤Ÿ™Ÿó‘s=ÄÏG¶ÑÉ D­TLdQ×Ñ_ùèkÉ Ý¡í=?/¡ß?øžóý#ðèVYDv‹îûKH,!ŽÊÆ$†ÞXãŽ5 ˆª(TPÀ áå33gry—‘WÕ”YÖô¨N¡ªO$2ŠÇfÛÖ¿¶AûÀPžûu÷øö.³K4Œ`~œG¯ôˆ?GO]¹ðžÐëpå<0Ès—èóý㞘óÅ]Š»v*ø‹þr{þpGÉó”bÒ¿1õÍ[[Ð<Ó¤Z}Bíå"f·ò*0‘…ZY8²4vÈqâ«ëÏ(ùy<¥¡ižTŠâk´Ó,­¬–âá¹M(‚5Œ<„R®Üjǹ'd8«Ì9¿+tÿÎÏ$k•:ýÄöš~¹jÖ“OmÇÕE$§0Ë]»ƒŠ¾d½ÿœ ò…õ·å-„šÎ¬ò‚ëëzI Ý·Ö-î)sû¾œ­”~ï†ÌÝéE_tâ®Å_—ó™_ó‚ÿ—wÕ5ïùÈýWÌú¿•<Ës¦êjÐ]½K™® ÃÁ¸ò™‡ÄXÐ ë\UõF*’ù“Ëö^lÒ/ü«®!—NÔíg²¹Œ1RÐÏÔ¸ª±ŒUñ§üãüà–ç<Éyæ¿#y“Ì7ö767éZÌRZ@³OæDHã÷€ÅÇ•7 ÕÜ⯹qWb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ÿÿÕûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]оqÿœ™ÿœ\òGüåG–É¿˜¶Ün¡æún©êÆfç~Ò¹ÆÕGTTeUü“ÿÎOÿÎ*ùßþqOÌíåÌ WOœ»iš´ßT¾‰OTcödPG©<ã$}¤dvUóN*Ì<…ùæ?ÊývÓÏ—ºÎ‘®Ø¿;{»Wàê{ƒÙ‘†ÎŒ :’¬¥I«ú\ÿœ'ÿŸ¢ùoóÄZ~\~w5·—|øÜa‚ì°OÔŸ àÌiíÓÒcÁÛû¦äÂ%Uúኻ$_óöýi/1ÿÌ‘ÿP1b¯Ž?&$<éùÿæ8<ƒùW¥Í©ê’Ѥ*8ÃohežSðÇÿ3ÍC9U*¿`ËòSþ}k`·Æ×ó þr*Hy"÷“Ji¨ú*ûGý*aöDH@UùùÛùóçoùÈo1Ëç¯Í]RMBýù,1}›{hɨŠÞ!ðƃÀnÇârÍV*¼{z§ä×ä¿›¿?<Ñiùsùa§¾¡«ÝMO†("šy:GTrc쪙Tªþ±ç ç¼£ÿ8£}f߆­ç»ØBêZÔ‰BâZ `wŽÂ¿Ï!øœìªŠ¾ãÅ]Š»v*ìUØ«±Wb®Å]Š»v*ìUá¾{ÿœhü­üÏóüÃò¦™¬ëöÑÅWW°ú¤$LY«)bhTõÅ^âPEØŠ·Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»x÷œÿ/DÜõ_/¥$ݤ·^‡Ä§¿ù?wÜè»F½3ø×úÝN³A~¨|¿SÄYJ’¬(FÄݺf°¡òGç¿üâž“ù™+yËÉrα°™.âªE<‹º™‚n¯^’§Æ:°z7}›ÛRÓz'ê‡ww»õ}ÍY1 ¾oòßüä³åKþU_üä}«éúÄ4Hµ7QÂE;+JWáe4 ™*§öÀ!Ÿ7ß”†QâéÍŽïÇÜ]&«³ˆÞ?'¡ù·FŽæ?¬[•’)::U”Š‚Ø‚:ÈÒæ§A’ø{ÎðýSÍÖZpÛÕŸ7qü3{ŽwNV ¸‘ó?¡ô“ôO³¶cj²ºèEçÏ _'LžOò¿é¯6NÂá…L©°&îõÿu¯û")C¬ðÐíÀ‡§Ø;©÷~¾oG‡L ",J#ŒE*@èÎd›rWb¯Kòo¤ÖJêZ¨hìzªôi?¢û÷íãšÍn¼bôÇŸÜìtz“Õ._{è ŽÖ5··@‘ ª¢€à3ž”Œ—}ˆŠ ¸ìUØ«±Wb®Å]Š»v*ìUØ«±V9æÿ)i}Ñ/ü—æëU½ÑuKy-/-™VXe] B¬›qW›þOÿÎ9þZþA%Ü”\³ÐÚÿ‡Ö¤€;Ë(JñV–Vw*µ$/. ’@Å^׊»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±T%ý…¾§Øj¬Öò :8¨#1õZ\z¨y@”O0y6bË,R‰¢:¾HüÂü²¸ò£6¥¦òŸJ'íÚ*öoúý|ÚÏbçÙ$åÅrÅßÖRòî—ÀïWßöGmÇWèžÓû%îýO(Îߨ\ÛCyÚ]Æ’Á*”xÝC+) ƒ±u dbllUðWæoüã>·ä=E¿2ÿçæ{k¨êóé ß ¯V†øYOûåÿØñ\î»7ÚLz¸~_\,tŸüWqþøõ.D2ƒ´›ü²ÿœÒ2ü5æ(Æ‘æ¸ØÅ%œÕE–EÙ„|· Q¼mñܨNÒìè¿yTö::éæ6÷2”8Yîµ§õÛ0ðäLKäßË»Ÿ®ù¿Ì6U¯¡q0§ÊvÔëã¼¹´¾¦²H,!{Ûéx”¼’HÁQTnI'`Žs&f†äµð]góÌ?šZ¡ü¶ÿœ¶’iá¹Õ(QQ:V?Ý þvøÉÙ´å»ÅÙ8´0ñõ¦»£Þ{¼Ï—.ôðˆï'Õß’?óZ'å@]{Taªù­Á2ßJ X‹}¡·Ùð.~6ßpå{kÚ<šÿD}8úDuþ·êä>ÖŒ™LŸKg8Ô©O;¬+<ŽBª¨$’zRrXñœ„F ’vnI",ìP~\þT&•Ã\ó2 /vh ;¬^»öè¾ç§¶{!ì ÒV£V.|ãó=òû#æypý±ÛÇ5ãôzžÿw—ßî{®z{Ë»v*ìUØ«±Wb®Å]Š»v*ìUØ«Çÿ:ÿ!<‰ÿ9¡Ûù+óIý1¢ÚÞ¦¡ Z¹¶ãqrD¯ÎÚHœÑ%qı_ФTN?*(¼ŸùåØ?/ÿ*´¨t}ÝÞT·‰¤™$5gy%g’G;NÌÔkE*ôŒUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»ÿÖûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»y—æïä÷”¿=<³wùuù§G©h·ƒum¤ŠAöe†AñG"þË)¯Pj¤‚«ù?ÿœÒÿœóoüâN®uõu ^JWOÖR=КRµ]£”VŠ~Ä rJHоÅ]Š¿aÿç çéÚ÷äÿÕ?-??¤¹×¼”¼a¶Ôêe¿Ó“ µ7/ò“êÆ¿Ý³*¬X«úMògtÌ]ÓÎ~EÔmµ]þ1-µÝ¤‚HÝ{î:ve4e`U€`F*ü=ÿœ£ÿœóOüä×üä—™¼ñ®Ü/–?,,-4Ç¿×ï8ªºCc•-ƒ•V+BV"(¨y32úl«çÏÎOùÎ$ÿÎ;ùroùÇoù÷õ¢iÚzþïTóƒ¯;»É@âï¸ ìwXqÅA"Ú4A˜«ñîþþëU¹›SÕ&’æòâF–i¦ròHîjÌìÄ–bw$š“Š¡1WÒÿóŒóŠ~wÿœ¬ó2ùOòþßÒÓíÙSÕ§Vú­ŒLz»µ#}8—âr?eºªþ¶?çÿç|‘ÿ8±åtògåݯ+©‚>¥ªNº¾™GÛ‘‡E<#_@X³2¯£qWb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å^qç/!Å­†ÔtÀ#¿‘Ñeùø7¿ßâ6Z-yÅé–ãîuú½Ëê?½óåż¶’5µÊåCFV çC †Q14TrL^cù«ùAåŸÎM ùwÎÖ‚U^FÞæ:-Å»‘öâ’†‡¥AZƒ’°Ì­&¶zYq@ûÇCïR-ùyæï/yÿþq çêšÒ¿˜-¦—Œ7H `ävµôd¯ì’b“öX1n=–“]]ËÓ>ïÇ?½ÀÕöluÆÇñÍá¾xóææ>è^`Òo#:SÚDÒÈ燤D“rYû,6÷T›|$ÄnàbÐN'7³^{OEѵß8þ|êMùùk$ZzÑouY+"ªÒS÷jw •û/Q˜š½N=0ãÈ}ÿñòmÐö0Ä8²sîè?[ô¿òþqŸË?‘–‚æÐ G̲§Rt÷ê®þ”~À–oÛf §Ú«=aßhô¯¼»€)ô~kìUì¾Lü¼çÃUó|?j;vïîÿóOßáš]ohצ?Ôî4zâŸËõ½¨Àf‘Ü7Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±U’F²«E*†FYXTz‚23€˜£¸;z¤ ‡Ì_˜ß”ï¦úšï–½¦í-¸Ý£ñ)â¾#ªûŽž+í°‡Mz ¸s”:ÇÎ=ñïãæ9výÛã-cÍϤ»ýþ¿ŸÏ.z§b¯˜>çü¿ùËkVDi>lA‡P…v¯ÙYÔS˜ìí¦Ô%GÒö´Ù{4ðV>±=?«Ýîä~ÖÜyLišÞiüžÔ×ò×þrÚUá´Õ÷:@ÅÀýê–?x½$RkǰËÙ˜{F˜ÑçT}ßÂ|¹ŽG–ñy7¿0ô?(yÇÎ~dÖn•ìZêàÛz$HÓò¹r¢*5Fà×7$ Úë´51B#z{W¤sü[a§å/"yóþrÒå/µ2þ^üºŠJ­+Êã‰ý€iê¿nd“~ °*uz½~›°G÷™ûóG—Ô}Ír˜Çï~—~^þ[y{ò·JO-ù.Í-mV#}©%ç‘ÎìÇß§@Û<ß´;G.º~&Sgì@tq%#-Ë;Ì(Ý;N¹Õ®#ÓôèÚ[‰OEŸègjÍš8be3@>¸ü¾ü´¶òš.¡¨qŸUa»Ò«zª{ø·~Ô}÷Ù?c1öHrÔ²ž½!å>ùs=(sóþÖí©jÏ v‡ßïýOTÎáÑ;v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb¯ÿ×ûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*y§Êº?ô›Ï)y¾ÆßRѯâh.­.£E,mÔ2¶ÇÄw„n1Wòûÿ9éÿ>ÚÖ?çåºüÐü¥Ž}[òÕ˜¼Ñï%Ö“_Ù˜õ’ ý™º¯Ù›zI"¯ÊLUØ«ê¯ùÅÏùÌ/?ÿÎ(ë_¥|‰uõâEmGDºf6—@lM?ÝröeOˆlšU ¯RÿœÁÿŸ„y÷þr¶gò𯗼„Ž-Öfc9]ÃÞJ™˜Õ8¬IðÑ Pªøv*ûÃþp·þpCÍßó–º°ÔœK£þ_ÙËÂÿZxþÙ˜-m,½±!ž¤ª:¯ëòòÊ_‘žY´ü»ü°ÓbÓ4[@HD«<²7Ú–Y ZI»1' PU阫±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]аï5ù:Û̱z‚‘^ ø%§_fñ«·ÌÒkÞ;¿S‰ªÒ ø÷¾oÔôË"á¬uÌr¯cÐ{Œéqe^{&3ŒÔcZQÓ­5{Y´½VîlÛó~€yÈZå¶‘•<“c†™øcˆnÍÝÝÄî{³OŽhsç–iqLÙh&Ù~T…Ha{‡X Rò9 ª¢¤“Ø €,¤ Ø=óÉž@M+ާ¬¨{ΩUú·à;xç?­í“Ó_ìwº=‡ê—?¹ê«vNÅ]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å^ ù‹ùLº‡©®y]]nÒÛ –Nå“Á½ºŸ_,ö¿Ø1¨½FŒT¹Ê%çéyr>þ}_cöùÇXóºK»ßåçÓîó$‘´LÑJ¥]IVV Ž ŒñyÀÀÑØˆ=ØE…™°Ÿ?þ]yó;I“Ë>t²KË7ÝIÚHž”чˆê65RAÍÐv†] üLFØ|ˆêîþ^ÿÎy{Ë~aŸ[ó…ûkZD2†°²dôãëDlüNÜWе96Ìc~¿Û¬¹±bˆõKŸúNïyÜtïo– ‘³ï«{x­"K[TX¡‰B" ªª(`Øœ$¤dlóqÕ°*wåÿ/_yšítÍ&>r¶ìÇeEîÌ{ý‚§6]“Ù»O(Å„YêzDwÈôØ,¸º½d4°ã™¡öŸ ûÉ^D±òe¿–ö@=k†ö_öûëŸBû7ìÆÅÇQõLýS<Ïî—Îß:í.Ôž¶[íÈ~¾òÎ3¦uŽÅ]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WÿÐûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUFâÞ+Ȥ´»e‚Ud’7PÊÊÂ…Xˆ#b*þx¿ç?ç×ryp^þtÿÎ2Ø´ºPçqªyn«ÛÙæ±Q»D?jVN±U>Õ~T•aB6 â­b®Å]Š¿W?çÿçÛZ¿üäL–ßš?›iq¤þ[#‚1Xîuj³ ØÇóMJ·Ø‹~RF«úò·•t$i6~Rò…¾›£XD°ZÚZÆ#Š(× U]‡‰îMIÜâ©þ*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Фaò姘íþ­z´u¯§*ý¤>ÞÞ#24ú™`6>M¢9…Åçsà–E#̆‡b®ÅQ–œéeb†IœÐ(ýgÀxœ†Lƒ¹rgš¢ü£ä«. ¹ž’ß°øŸ²W¨_ëÔþÍë5§9¡°üsz &ŒaÜîYÎ`¹®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»y7æ忚Uµ=,,¨z,´ìÞÁ¾ƒ·NÚÏbáÚ æÃQËöOÊ^}Òø¹oû#¶å¤ôOx}±÷yy|Ÿ%_XÜi“ÉcEqâèâ„óûóÁu:Yé¦qä2yþ>÷¿Å–9b%`õBe ŽÅ]вÿ'ù.ÿÎ7_V±-ÐZv âOaú†ùÐ{?ìænÙÉÁhªg”YîpÝ×viCE—>ƒ©ýžo²<³å{*Z ;JJ Œ’6ï#x±ýC íŸCv7baìœ^ï'ê‘ï‘üÑó­nºz¹ñLû‡AîdY·pÝŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å_ÿÑûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WãüççüûËó[ëßœŸó¶ÑYyÐó¸Ô4t㾦۳ÉAÓ½i§và䳪þkõ]*÷C½¸Ñu«ym5 I^ ‹yÑ£–)cb®ŽŒVR ŠƒŠ @,B¨©;1Wî×üàüúîO0}Gó«þrfÄÇ¥NçJòÜëñ\FI¯”ý˜ksF÷hTø$Uý ÛÛÅgv–‘¬PDª‘ÆŠUTP*°lÅU±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±T»UÒ­u«v±ÔöK˜ÎC±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»`~xò —œà¬”†þ1H®ßýVñ_ÕÛ½yoi}•ÃÛPßÓ}3ýïÝÓ­í{3µg¢–ÛÄó¤wÇZîƒ{åË·Ó5hŒs/CÕXv*{ƒþ{çÏ}§Ùy»7)ŘQ";Áê?wÑ4º¸jcÇcî÷¤ù¯r^“ä/Ë›¿8Ê.§å–†57r?e+Ôøžƒç¶v>Ë{!—¶eÇ+Ž!Î]eåóÞy3³¥í^ØŽˆPÞ]w™ünúÿJÒm4KXôÝ.%†Þ1EQø’z’{“Ÿ@èt´8Æ, F#yï=åóÜú‰g‘œÍ’˜æ[K±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WÿÒûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb¯ÍùÎù÷——ç),¥ó·“/æm¼TŠôŽ0_ª†° šÓd˜è(:UUâóóì ?Éù-6ÿç!mà¿ó¼L²éúHtž×Me ¬²2Õ&¹R>¥¢‹ª—~.Š¿e±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š¡î­a½‰í.ÐI Š2°¨#% ˜ e!E⺇ådæýSN >BIg?cŸµíøøæïjŽW?½ÓäìÃÅéå÷=sFÑm4qe§§³´ÇÅsþc5³Ë1¹;\8cˆTSl¥µØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ƼÑåK6Ú Q>!S«öãcÝOëi»o°°v¾/0þ¬‡ÕÞ?Hä\ݾz9qCâ:‡ywòFuÔ]¼Ç"¶ |3¼ã¯mÐx÷ì?›<ϲ?àk1œþhƒŽ'n¾OÓß× þsÓë=¦‰Æ··ŠÒ$µµEŽÔ*"Š@{,1ÃØñ³™™³¹*Ùcb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å_ÿÓûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WÿÔûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WÿÕûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WÿÖûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wÿ×ûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WÿÐûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WÿÑûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WÿÒûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WÿÓûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WÿÔûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WÿÕûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WÿÖûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wÿ×ûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WÿÐûùŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WÿÑùë7üü¯ó÷U"O2ù¦æöD ¦œw,º?ÍÕ˜t­6ÅTè¢ßœŸõ|Ô?î)¨Õ|UßôQoÎOú¾j÷Ô?ê¾*ïú(Çç2üQë·áÇBu+öíPg¡ùb¨ÿú*?üäïýO?÷%Ñÿìwýþrwþ§Ÿû’èÿöGŠ»þŠÿ9;ÿSÏýÉtû#ÅPôQÎfø¤×oËž¤jWê+Þ€OAòÅ]ÿEüäÿ«æ¡ÿqMCþ«â®ÿ¢‹~rÕóPÿ¸¦¡ÿUñUhç基Q2ykÍ76R8¤=5ð ~.>hªÇ¥i¶*‰ÿ¢£ÿÎNÿÔóÿr]þÈñWÑQÿç'êyÿ¹.ÿdxªŒßóóOùÈP<Çæé¯-ä© µ¶žÁ»VÂ;y¥~b‡¯…!T7ý[ó“þ¯š‡ýÅ5ú¯Š»þŠ-ùÉÿWÍCþ⚇ýWÅ]ÿEüäÿ«æ¡ÿqMCþ«â¨Èÿççÿó’–Š-´ß:´6¨8ÇéºmÃ*Ž€Ëqo$®Ê‘ÙsНÿ¢£ÿÎNÿÔóÿr]þÈñWÑQÿç'êyÿ¹.ÿdxªOùùçë­cÌw—¼’Åu=¢±é´6Ï)·dGzTœUgý[ó“þ¯š‡ýÅ5ú¯Š»þŠ-ùÉÿWÍCþ⚇ýWÅWÇÿ?"üó°au¢y’òÚñ~IJÜMx«]`»yaj¾8ÚEFÑQÿç'êyÿ¹.ÿdx«¿è¨ÿó“¿õ<ÿÜ—Gÿ²ô¨ÅPôQoÎOú¾j÷Ô?ê¾*ïú(·ç'ý_5ûŠjõ_wý[ó“þ¯š‡ýÅ5ú¯Š¢aÿŸ›ÎEiŠm¼½æùlíIåéÍkk~ÜSêßEq.û|!¡A,JªßôTùÉßúžîK£ÿÙ*ïú*?üäïýO?÷%ÑÿìBÍÿ?*üûÕ[Öó/š.o'QÅú8ëC‡Õãc_Úd/Û— *¥ÿEüäÿ«æ¡ÿqMCþ«â®ÿ¢‹~rÕóPÿ¸¦¡ÿUñWùøÏçD¼·×¯ÖUݵç‡BU¦*½˜zLUÿEGÿœÿ©çþäº?ý‘â®ÿ¢£ÿÎNÿÔóÿr]þÈñWùú7üäáÙ¼óQßýÃhãñ•ÅPôQÎS»k·õïMNü»×Å]ÿEüäÿ«æ¡ÿqMCþ«â®ÿ¢‹~rÕóPÿ¸¦¡ÿUñUh?ç忟úQ-åŸ5\Y3í!œ&£È”€¸T§Š'¹ UÿEGÿœÿ©çþäº?ý‘â®ÿ¢£ÿÎNÿÔóÿr]þÈñUÿçæŸóÚ¨y“ͳ^@§’,[éì¥}KíÝ…ÙfeïJ€qT7ý[ó“þ¯š‡ýÅ5ú¯Š»þŠ-ùÉÿWÍCþ⚇ýWÅ]ÿEüäÿ«æ¡ÿqMCþ«â¨ÔÿŸ ÎK[(·±ó³ElƒŒq¶—¦NUG@ežÚI\ûR;»uf'|Uwýþrwþ§Ÿû’èÿöGŠ»þŠÿ9;ÿSÏýÉtû#ÅPrÏÈ?;ïÝjÞb¼ží÷’H®î-Uˆ†ÞHáO”h«à*³þŠ-ùÉÿWÍCþ⚇ýWÅ]ÿEüäÿ«æ¡ÿqMCþ«âª‘ÏÉ?=4öz™.íoìË4òÞ¨cû›Æš¨Ú­qê´`UÿEGÿœÿ©çþäº?ý‘â®ÿ¢£ÿÎNÿÔóÿr]þÈñU’ÏÏç$oTÚêþs{‹7ÚH£Óì-‡´Ö°C2ïT‘| TUAÿÑE¿9?êù¨ÜSPÿªø«¿è¢ßœŸõ|Ô?î)¨Õ|UßôQoÎOú¾j÷Ô?ê¾*Їþ~oÿ9¦¯Õ´8KiiZˆæ´´¾jž¤Í} óøsâ;½UUÿ¢£ÿÎNÿÔóÿr]þÈñWÑQÿç'êyÿ¹.ÿdxªoùùOçÖ¨Â1ùžæòáG’:x Ö†+«ÄMIøŠ= Tè¢ßœŸõ|Ô?î)¨Õ|UßôQoÎOú¾j÷Ô?ê¾*ØÿŸþuBDÖšýòN‡”nú…䪬7Ç$¬Žý—VSÑb¨ïú*?üäïýO?÷%Ñÿìwýþrwþ§Ÿû’èÿöGŠ»þŠÿ96v“Ï”õ¡ô…¨ðªÚ>`ƒàqTÿŸ‹~rw×uûŠjõ_wý[ó“þ¯š‡ýÅ5ú¯Š»þŠ-ùÉÿWÍCþ⚇ýWÅUàÿŸ—Î@é5ÿ ù®âËŸ÷¾ºG¨ò§J~[€”ßû¾¿k•Š¢?è¨ÿó“¿õ<ÿÜ—Gÿ²`ó-ÕÕßC,2½‚•£d`†£ù„`ŸÚ$ÑE¿9?êù¨ÜSPÿªø«¿è¢ßœŸõ|Ô?î)¨Õ|UrÿÏÇ¿;mX\é¾a½†éh¤’öêáU‡BbžG‰éü²#!èÊÃlUÿEGÿœÿ©çþäº?ý‘â®ÿ¢£ÿÎNÿÔóÿr]þÈñV›þ~‡ÿ9101]yØÉ .ƒIÒâ,§¨ªH•´Ž®½U”Ðâ¨ú(·ç'ý_5ûŠjõ_wý[ó“þ¯š‡ýÅ5ú¯Š»þŠ-ùÉÿWÍCþ⚇ýWÅQÏÌç!4ªÇå¯6Ïeï"Ï :‰fmA.;!PzOEUÿè¨ÿó“¿õ<ÿÜ—Gÿ²fóUÅë%}3¦Ä =mÕú  WöH©ÅT?è¢ßœŸõ|Ô?î)¨Õ|UßôQoÎOú¾j÷Ô?ê¾*ïú(¿ç(ÝuÛúö®§~GÝëâ¨ñÿ?Fÿœœ/žh;¸mþ&Ò¸«¿è¨ÿó“¿õ<ÿÜ—Gÿ²Ö¿iªÄ’ªŸý[ó“þ¯š‡ýÅ5ú¯Š»þŠ-ùÉÿWÍCþ⚇ýWÅWÇÿ?!üñ²au£ùŽòÞñ7ŽYn§»U=7†åå…öìñ°ïJŠ£?è¨ÿó“¿õ<ÿÜ—Gÿ²p·ò‘üÃùù½ææ»Õ4PÔ!ÓôH}8ÖÖÏ*¹¸Ý (ä1=²¬;ò[þ}M¥ÎB~Lycóɾi¸ÑüÏ«ZO-Å­ô qdòGs,@#GéÉ*€’}mëAC@«ãßÎ/ù÷/çÏäÏ­w©ybmoIЧëú7ñ•XÄ€\ r^wØÑWÃÓBöîÐN¬’£e`AR  î8ªž*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*« \0ŽgsÐ($þnÌx` =ÀYûÊB;™M“5 ª4ÀB‡ù·?pþ4ΧCìf«Q¼êÏsò¤‡/ic‡-Ý'––-RÈÄIbÔ­ôú0äöjõ°Òq%L¨s©]Þ‘úÔkoÉ\êU¾òEõ½ZÔ¬Ëà>ûŽßŽ[®ö#Q‡|DL¥—Èíö±ÅÚp—=˜¥Å¤ÖéÝFÑ·ƒ3“Ôi2iH˜Ÿ1N|2 î ¡ó›±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»M´Í PÖ[†™m$ÛЕ_„|Øì>“”fÔÃÖ@rtú<š¢$ýß>OIÒ¿(o§MZe’1;“°EsQŸ·a /ß°ü|þ›Ù‰Ë|„!¹ý_zMå¯"2}z8§h¤µ”"’¼^žÙ™¾Òü¿ "ì_Üâöc_ŒM½ÿ©«~\ëzU\Aõˆ‡íAñø›ðË0v®,½kßúù5j{ > ëˆG³›xÚ&1Ê¥\Eú3b î9‰‰¢³ Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š¿ÿÖüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]о™üÿœ9üäüøôn-ü¥¨\é³P®£r‚ÒȩߒÜNR7 ÞˆYºPŒUú¿ù;ÿ>L‘Ä:ç×›‚ Œšw—£©ñ¡»¸ZØn}Ÿ~°~OÎ~K~EúW?—þQÓÓRŠ…uÔ7·»²Íp]£'Â> 튾¤Å^Aÿ9 ÿ’³Ïø ë?õ.*ùÿþ}½ÿ¬Ûäù‚»ÿ¨éñWÛø«À7?ç¿)ÿ=QÿåiùOMÔîxýwÒô/ìÔ%&xs§¶*ü¤üáÿŸ'hwþ®£ùæË>cRš~»¸„“Ø\ÀÑGjÅ3xœUù?ùÅÿ8ùåù &¼óg”îîô˜AfÔtš_Û¶æOûÊ‘þ#|yŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUzFÒ°HÔ³€ œžŸùI™ÿKßíuYû^GéÙžÙhpÚ/¥mƾ ηM£Ç§8â"<…:¬º£3dÚhšo¶dÓŽs<âúÒžs³‚`cÿ &pš±þ½cþ¡ÿs7s‹'øŸéIm7Û;ºtÃ2]u£Ç:˜ç]f¸å9´ðÌ8fÄXû[±ê MƒLSü¿²¸«ÛÿÉÝ~ãü)œ®¿Ø½.£x\–ãý)ý;L­8óÝjI¿³«@t˱ûð'8Ýw±zœã©-Èþ‚]®Ó„ùìÅ&‚KvôçFG˜ås`žÃ0b{ˆ£ö¹ñ–ãu,©“±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìU0Óô«ÍUý6 &nü>g úr¬¹ãˆ\ˆ ø4ÓÎjŸsÓ´_ÉýJö’j²¥ªÙ_Þ?àx¼æ£QÛ°‡Ð/ì­ßé}™É=ò´þ¯µëºåN¦QÞs(ý¹þ/ø]—ðÍ&£¶råëCËõóz/`àÃÓˆ÷˳—Øô›}bQH@ P£5RË{—sŠåÒý²"iâ?“¶~¼úè§ÙºQø¾t¹*ÿ«úžcÙÁêËýoÖö‡Òý³@2==1­cÊÂðÔ­£›jeø‡É†ãè9•ƒ[o"Öÿ&-ž²hÓ¼ ü’kòb?á³u§íù ¦/ݱü|žUì¼%¾2G‘Ü~¿½å¿u­––ÜÍý¸>1÷}¡ôŒÝ`í¤Ë™eÖ¶Ùš¯žTþßOöÉ€âO2s톜yfC\]ZÚüú’tâ›ïóé‰ 3†9OËÞË­¿ç?25¸×óZÇÊZ‹ÙÛ T<‘£eaÉ $K"ÄóHÙzoœîQ¤:¡šDx€PÜÐE7ø=Ý„uB8Î-ìýLB;¨YÚÚíÞá«$‚”`hAð øÓ: \ â”yn‹“Or]ÁÉSPÌ”ÜiÞÙˆfHn´ÿl‰T2±]GIŠáJOºø0®bê4˜õ‡$D‡˜·? Ç‘yî£å+sV¶åð¸ÿ\äµÞÄéóoŒ˜ôÑùþ×o‡´%×vu¢Ü[ÇŠÿLãµÞÈj´ûÄ èóÿJwù[±Ç©Œ’¦R‡‹Îg&9c<2ã±r¶² ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìU^ÞÖk¶ô­£iÁA9 ä#M¸°Ë)¨O“5Ò¿/ïïˆk¦[t>?}ÃoÇ5¹ûZúwû¼Ó{9—&ó"#æ~ÏÖõ]ò×K´"KˆÍÌž2š¯ü ûëšmGkäŸ#^ïÖô:_gðbÜŽ#çú¹|íëzv‘±@Šˆ:*€úi²e26]Ü1ˆ ƒ+µÓ}³Y@OíôÏl¢YйK]2/¬ê¤1Úv}ê}²1¹šˆ¶B6Àç󬚕Êè¾GÓ§Õ/å×Ï{³¿½—èÞiÑõà#†_Fàÿº¦ø¾Ç¡úaæÓO1c¼9ÄC ŸLöÌq‘¬„’çMöË£‘‰ nïNë¶_Œyö»å-?T©¾¶Gç¥þPþ9°Óëg‹é$}ß'SÙøµ\Aóëóæò còÅ—Òæ)þD‚£þoøÞ`í£ücäóÚŸf"wÅ*ò?¯û^uåÍCN'ׄ²ÚOˆ~>œÛbÖãËÈüöyýOdæÁõFÇxÜ~=ée:çb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»ÿÐüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìU÷'üà‡üâ.›ÿ9ƒæíOÉÚߘ$ÐáÒlWQt‚Ùgšæ/TDêŒÎ«VtøŠÉö©ÇF“_óî/ÈÉqÖå¨õÝZ*Ò`+}) lDL¢Ý;‚«ßaE_qÁv±¥µ²,pÆ¡UU°tª®*ìU¢B‚ÌhäœUð_çÿüü‡òSòÖÒîuæ?1DY?FhE.]T4Ü„PìÊ\È?ßf˜«ñóóþ~×ùÁù­ëhÿ—f#èRrP4æ2ê ‡ùï¤v0$,?˜â¯ËýSU½×.æÕõ«™¯/®É5ÅÄ$²9êÎìK1>$×@b®ÅU!™íÝg™%F ¬¤‚¤‚ÜqWè¯äüýó«òKÐÒµE|ß娍¦Ë\f–eAM¢»ÖSAEõ ±¨é*ý¸ü‚ÿŸ¨~Kþrˆt¯4^7’üÁ Pmµ§Uµg=Dw¢‘P—Ñf옫ô’ÚêØRòÎDš TR²üÇó¦·£êV7º¬:JC§›Qd– § }X‘x…Þµ#n¸«ÿœGÿœógü榹©y#WÒôÄÐ¥µŠq¨™êæåde)éFûLÖ´ê1WØ_ôD¿Í?ú›<³÷ÞÿÕ UßôD¿Í?ú›<³÷ÞÿÕ UßôD¿Í?ú›<³÷ÞÿÕ UßôD¿Í?ú›<³÷ÞÿÕ Uù[ùÉù_ù-çmoò«^¸‚ïPЮÚÎyí¹zNʪs Ô߸H¤oÔ]7þ|³ù£©Ú[êQy«ËJ—$ªÞÔPÀA×| FÿÑÿ4ÿêlòÏß{ÿT1WÑÿ4ÿêlòÏß{ÿT1WÑÿ4ÿêlòÏß{ÿT1W‘þ{ÿÏ«?0 |‡¬þoy“ÌZ ų[Ú¯Yij$ '8Uv. ©W‚iù{.Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìU?µÒceYebÁ€4uÏGìŸc°ä„rå‘—¡éï¹Üü©Äž ‚q ´q|0¨¯ïÎÏIÙ¸t‚±DGÜ7ùó?7S'›#±´­*3`‡—#1±³é¶X­Ë‘—ÙYW¶L_“+&‚Õ"_RRGrh2`8RÈNÁ1°3j— ¦yzÖkëÉ 8Q˜“ì$ýØ%DYcàžr4úcÈÿóŠ>eóW Ï>^G¢Ø6椷ª§Š×ü¦,;¯lÕj;V1ÚþÀÖu0Çô‹ó}ÕùiùAùùWéÜù{MŽ}N:§ÞÒ{ŠŽêHãÿŒj™ Õj2ê6‘Û¸l?oÅÇžªSæ÷ñ·ùy¯ü£Oˆò/ÌËÿ#þj£7œ´¸&¼"‹yô®WÃ÷©BÔì’ûff›&]?Ðvîéòl†¤Ã‘|%ç¯ùÄMSA/}ùc© BÔU…ÙXæÁ¶Ï¹ôþY¿Óvµí1^c—ëûÜ‘«ŽO¬|_,ë6—þ\¹m+ͶØ]¯U’6ZQàEAͼ2ÆbÆíƒïiD°Gp¾¤ |FN­”fbh±»Ë*Wl‰f<¬FöÏ®VC°Å‘‡_ZuÛ+!ØâÈÆ'·Gø%Pß1˜z-H¬‘÷‹ùw9Ñ™’™´x›x‰C÷ŒäõÞÄàɾ)²Û¿ÚßAØÞyqÙÍvv*û þqþpÏÌÿó˜Wzæ›äSMÓBŠÖY΢f£‹–‘T'¤¸ôÍkN£}¹ÿDKüÓÿ©³Ë?}ïýPÅ]ÿDKüÓÿ©³Ë?}ïýPÅ]ÿDKüÓÿ©³Ë?}ïýPÅ]ÿDKüÓÿ©³Ë?}ïýPÅ_—Ÿžß”—äžõŸÊ/1Ý[ÞjZ,±Å4öœý2B’‚œÕZ€8¾*ýü¨ÿŸGþc~ny7BüÏÑ|Ëåûk {O·Ô †àÝú¨“ uWã / ô${â¯Î/;~]ÞùÏ¿å6¡<3j:>µu¢K<\½šÚå­ÙÖ 7ËQP :Šâ¯Õßú"_æŸýMžYûïê†*ïú"_æŸýMžYûïê†*ïú"_æŸýMžYûïê†*ïú"_æŸýMžYûïê†*ùûþrgþ}§çŸùÅï$Kù­æí{EÔ4øn­í &çÕ-9!Hõ"E ¦ûâ¯ÿœJÿœ@ó'üåö­«ùsÉ:ž¦O£ÚÅw3ê&n.²?ÒG5Ä U÷Oý/óOþ¦Ï,ý÷¿õCwý/óOþ¦Ï,ý÷¿õCwý/óOþ¦Ï,ý÷¿õCwý/óOþ¦Ï,ý÷¿õC~kÎGþBjÿó>{¾ü¢ó]å¥þ¥a´¯=—©è°¸…eP=EF¨ ¨ëм+v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»FiöŸ_¹ŽÏOQ¸ò"´Ê³dðâeΜ& …Õš·¨Yy:ÆÖ?)ßü­—îƹ¢ËÚsŸ-žÏMìþ[Êä|ù|¿]³ $JG* è? ×dÈNçwu`* å³6Óìºm˜s›x ÚÂæى9¶Ìl´þ›f,æÌUþ³¥è þä§U’•/Å!ÿb7úM¾až_¤|z6Ç(-÷Í>~˜Ø~]éR²W‹\:‚¿ÌÍHÓý‘9,ÑäYä=ßËw†#ÍïþNÿœH[ÙSWüÕÕ^ê]‰µµcO4¬:v*Š=Ÿ4:ÏjøGž5æWë?µÉöG“üµåß Û~ò~Ÿoa1‰~7§óÈjîÖ'9 ^£.¬ñe‘—¿—Àr™YæË_XYÇ%XAÜ{Äi/œ0ç|‰ç¿Rî A¤ê/SëØ€ŠX÷x¾Áßs@¬›:-´:.Äñé~ƒÏïM‘ÈCå1þH~`þ\r›Au×t”© ,áGŒDó(Ëêtýµ¦Öm?D¼ù|ù|é²ã.o:´óå„îlõ¸žÂåOSØŠÒ£ýñÍŒ´RÀñ2Äz'Ó[Er‚{fY#aUd ƒò#1Ĉ4Z Xµõ‡]³&k!…ߨõÛ2¡6²Eý§H™ 0!ˆ^è–WõúÔ*_ù‡ÂßxÌÜZ©ãúK¯ÔvvG×}üÌ00y^-.{o+ *w>"Ÿ«6ú=yÍ.>//Ú‹,¢óÈòoüäN‡a3úpy‚ÇPÒ$nÕhMÄ`ÿ­,£ÜŒUýmâ®ÅXÿš<Ù¢y'M›ÌžrÔm4­&ÙyMw}:A ¿ÈB¿~Oþ~ÿÏáÿ-<€gÑ?&,§ó–®•QtyZi¨Ýï}YiþDaöe¡®*üEüûÿœîüåÿœŠõ¬<ëæ ,ôª?Cé5´²âeÕI’aß÷ï&ý)о=Å]Š»v*ìUØ«±Wb¯¥?"ÿç/?6?çæ_ùUþc¹¶ÓCó“K¹?Y°“ƶòUT·vƒÿ•°Å_¶?óùß(ù“ÐÑç!4i<»|ÔVÕ4µ’êÀªÏÅqë²ý`ûâ¯Ø þdùWóOJÍ?—ÍŽ·¥I@.,.d Jñn$”qÝŒ§bÅY¶*ìUüÏÏë<õúgó?Ë—ðÉÎ B7N ý‰ïçn`û˜àˆüˆÅ_Œ˜«±Wb¯×-;þ=ùÙ¦ZÁ§A ù8ÅoD¥¬µHE +Kð+Aኣ?èµÿõ`ògý ê?ö_Š»þ‹WùßÿV&Ò£ÿeø«¿èµÿõ`ògý ê?ö_мƒóïþ~ù§ÿ9äM[òsκG–mt]cê¾¼Ú}­ìw õk˜îSƒKy* ¼J¨ß PÐ…_1ÿÎ4ÎIù›þq_ÍÏù›ù{i¦Þj’Xͧ˜õH¦–NgGcÆan@Æ(yӮDz¯lÿœ ÿŸ…þbÿÎYùVÏòçóLòý–›e©ÅªÇ&•mwÆh¡šVi®¦^fb@Pjâ¥AUÿÎ*ÿÎqùïþq×ZÓ¿-týú-v[inN¯Ì¥Mºº§§è\@"C^A»RÕ}gÿE«üïÿ«“?éQÿ²üUßôZ¿Îÿú°y3þuû/Å]ÿE«üïÿ«“?éQÿ²üUßôZ¿Îÿú°y3þuû/Å_˜ß›Ÿ™Ú¯ç?œuŸÍ?4Åm­®]½åÌVhé»)»ÈÁvÛ“±÷ÂM  ~–éßóùïÎÍ2Ö : ÉÆ+x’%-e¨’B(QZ_Z FÑjÿ;ÿêÁäÏúAÔì¿wý¯ó¿þ¬Lÿ¤GþËñWÑjÿ;ÿêÁäÏúAÔì¿yOçüý/ó_óóÉ¿å›ô,ZèúÔqGq5…¥ê\(Šd˜pio%AV@ Q¶­(hAE¿5ð%Ø«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]вÝ5ùÛ§ˆ¨û³Ù½•Ïâèáåqù¾Êuù…I<³‡›TçF\’¦i§ÚôÛ,Öå›*Š[{ åÂøçèäù82Œ§È2Ï/Xëj“êÞU±’jX‹ócEIú0”âæŒ0ï’_Æï£ü¥ùlY/¼û¨4î(~­jh£ØÈE~aT{6cÏ4'U—µ@Û¯7ÔþZ}ÉÐ}KËpYÄEÓ_‰©üÎjÌ}ØœÁɆY>­Ýlõ{’ÉÆ¿åþ9Ê0ñþ5ÿ/ñÇò‹â;ükþ_ãåÄwø×ü¿ÇÊ/ˆïñ¯ùŽ?”_'Öõ]3̶ÇN×íá¼¶?±2øŠô>ã|”4æÆÉŽcaò÷›ÿ ô‹¶{ï#Þ>Ÿ9ÜA3‹äí¨ùóÌìy¤9»=©ÒbÃæÏ3è:ÿ“ا™l™­ëAqû%øwðèš÷‘Cír±‹!…ç„»'b®Å_RÎ1ÿÎ^yçþq2ëXÔ?+cÓd—[ŽÞ+¯Ò6ï0 n]“‡ #¡«šÖ½±W×_ôY/Ï¿ùfòÏýçÿ²œUßôY/Ï¿ùfòÏýçÿ²œUßôY/Ï¿ùfòÏýçÿ²œUßôY/Ï¿ùfòÏýçÿ²œUùÝùÇù±­þyyËUüÖó¢Û¦µ¬I·+iŽÑı ÌÄ(:±ß}·ùkÿ?Süçü«ò®ùoåˆ<¾ÚN‡e …©¸±™å1B¡W› Ԡ܀>X«àï7yÿSó§œ5?Í-`B5[V¹ÖnHVqq;\8U$œØÐr&›W¾*ý'ÿ¢É~}ÿË7–î?ý”â®ÿ¢É~}ÿË7–î?ý”â®ÿ¢É~}ÿË7–î?ý”â®ÿ¢É~}ÿË7–î?ý”â¯ÿœÿŸŠ~jÎJyF_ËÌHtTÑ幂霱KÎJÑšg߇y?üã7ü凿ç5=OÌ?•ñéÒ]jÖÑÚÜ F™BFüÇ’GC_sоÅÿ¢É~}ÿË7–î?ý”â®ÿ¢É~}ÿË7–î?ý”â®ÿ¢É~}ÿË7–î?ý”â®ÿ¢É~}ÿË7–î?ý”â¯?><|Åÿ9ç+ÏÍo?­¢kWÑÛÅ*ÙDÑCÆÞ%‰(¬ÎA⢿\U㘫±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUت"Òsm-â›é#Î7ù_Ë…o|Êï¬_}£êÕ! þ 5oöLAþQœö·ÚÙ¶Çè\þ¨)™/¦,ï­ôèRËOŽ8-ãHâPˆ£À( ç'ŒÌÜ·>mt‰ý7ïðúoßiߦýñðúoßiߦýñð˜œü“åŸ?!_2ØÅ,ô¢Ü'Á2øQÖ„Ó°j¯¶gèõ™´‡÷r ws&@ù3ÍóŽ:ç–Ýõ/ÊýLÍy}RvçÚ§÷oþÈ&u:oh1æôê#^cqúÇÚψK›Æ®<ã¨hW¢<ù¦Íet:·µ÷âÝGº’<m㤎Qņ@Çãv¹`¾Hÿ­YêÑ™´éRUïÄî>c¨úr³ c5!N,àcÍŠj6vÌŒri!ƒÝÃéµs2&ÚËÎ|÷qÆ-Gí¹øO㛎ɅÈËËïþÇ™ö›-B0ï7òþ×™fõã]Š»~‰~NÏο8?#|›¥~Tù. ô]9"¶k»)d˜¬’´§›,ê ä碱W¦Ñd¿>ÿå›Ë?÷ŸþÊqWÑd¿>ÿå›Ë?÷ŸþÊqWÑd¿>ÿå›Ë?÷ŸþÊqT«^ÿŸ¼þyùL½òö¡oå±km5¬¥4ùƒp™ 7n Ûb¯ÎßË_?ê•~jÑÿ2<°!m[C½†þÔ\!xŒ°°eæ ©+Q¸|ñWÜßšßóôÎOÎ?(êÿ–mƒ@]Z¶6·FÚÆhåH?Ø·u8«å¯ùÇ_ùȯ5Î0ù©ÿ2?-ÒÉõg²šÀ‹øZh½)™¾t<ª‚†¾;b¯¹¿è²_ŸòÍåŸû‡Oÿe8«¿è²_ŸòÍåŸû‡Oÿe8«¿è²_ŸòÍåŸû‡Oÿe8«¿è²_ŸòÍåŸû‡Oÿe8«âOùÉ?ùÉ7ÎTyšÓó ó5,cÕ,ôØ´¸ÆŸ áÒ̵Wy nS=MzSm·Uô'äüü·ósþqûÉ:_å‘ ПCÒ>³õv¼²–YÖn$¹~N³ ?­O„Qh=ñW«ÿÑd¿>ÿå›Ë?÷ŸþÊqWÑd¿>ÿå›Ë?÷ŸþÊqWÑd¿>ÿå›Ë?÷ŸþÊqT%ÿüþóßQµ›O¸¶ò×¥Çt8«±WòÕÿ?m^×óÆÞÃP½º—JŸ@±½³µ’iy<Ð9Š2ÅS“BKq S¹©Üªü˜Å]Š»v*ìUØ«±Wb®Å]Š»Gišeæµw‘£[Íws"ý¼m$²ÈæŠˆŠ 3°TœUúKÿ8KùSùƒù?ÿ9?ä?Ëß7%÷—µmAN¥w`—9Ím'¹ܤnıÑ>à.œª˜«úÉÅ]Š¿ŸùøŸžŸÿç"<õ©+ò†ÃP]"5ôtIjà|äØÿ”N*ø§v*ìUý€ywÌ¿ó‡ë¤Ø-î¡ùN.¬ ’}Ÿ>—*šÖ½k½r\E‡‡àœÿ‰ÿçêáùIÿ#ôë_=Áßâùßú¸~RÈýúãÄWÃp|Õÿ9‰¯ÿÎ/]~KùÎßòÚ÷òÖO3¾–âÁ4™´f½2óZzê¥~Æø8ŠDèþ^ð2~ˆϱï.ì?7çŸóÖm-þ½ Þd{E³úÁ–ºGêS—Ú§*w €y¾àÿŸ¦kz‡åNäב§óóE£N¾Y—L{±iõ+ÀåÅ¡2z^¡•~|+¿I% ry§üúUü–Ó´Ÿ:¯üä%Ï“à¸{­7ôxóDšz9@“ú¾‡×$W>W{b $Äo×Oñ?üáÏý\?)?ä~ýpñ>{ƒ¿Äÿó‡?õpü¤ÿ‘úõLj¯‡àïñ?üáÏý\?)?ä~ýqâ+áǸ?šùÏ›¿'_~|ù¶çò†M&_)3i¿R} ÀÖšm°—Ñ6ÿº?½Ëíò¯Å\dm`(|þ÷ǹoëÿË~dÿœ?M&Á.ïÿ)ÄâÖ yôÁ‚ ò©­kÖ¸x‹ wëüOÿ8sÿWÊOù \@¾ü³“̡ޮžº\Ú+^ƒ ŸSÔ¯Ùáñxb$Q(Èw}ïå›"ØìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]в-¹+ÅàÀýÿíg¦{ žñÏqý0¯÷®¤ugút3¾Ôæ“1Kvú¼¾‘!ý6âGPi¶YN¸ÏÔ/½<ò^‹.™^qÖô£©hîí”±!$R+ÈJî(Q»Œ½ÚûC/âÇ.}ãñÝÉõ¦‰ç›;»d]¤p Dª€ðâ:}fPÇðÚ>LrõüùßÅ9ÿIüߎ8ü%ßâÉ?›ñÇ Â]þ,“ù¿| ¼%ßâÉ?›ñÇ Â]þ,“ù¿| ¼%ßâÉ?›ñÇ Â]þ,“ù¿| ¼%ßâÉ?›ñÇ Â]þ,“ù¿| ¼%¨yÞ8ZMBEA ¿/jwùbqÄ6âÃ<†¢7|¯çM5|Ô.uÿ+hÿSÓìÔ½ÅÊüw|5 NʵmêsuÑí{;$°T2ψžCöó?kµŒM1,äRjzš~ŽNfI3LgQƒ®@‡7 Ø´}(J3üsöÏ?‡¤áþt€ÿ}ú¶›rÅ3ÈÜ÷b®Å_¬ßóê¿3~OùoUó›ÿÎDÏå¸mæµÓFþ"KfRêóú¾Ö¡^\}«Š¿eÿåiÎÿËwåŸü‰ÒÿæŒUßò´¿ç å»òÏþDéóF*ïùZ_ó†?òÝùgÿ"t¿ù£;?óð_Ⱥççnµ©~JɤËå7µÓ…³h« Ù—[Xļ %yוÚ­wÅ_b¯êþq{óþqGNü£òU‡æ çåúy– Å5Ô"ÓиPLdBüëö¹o^¸«ùòüã½òýßçGšµ+µ›yV_8jrص¨Ahl[P‘¢1ø=/Jœh8ð¥6Å_Ô/ü­/ùÃùnü³ÿ‘:_üÑŠ»þV—üáü·~YÿÈ/þhÅ]ÿ+KþpÇþ[¿,ÿäN—ÿ4b¯?ç=|ýÿ8Ë­~Dù¯Lüœ»ò4¾p—ôgÔSGŠÁoOJÙ¥ôŒ*û ü¨~Ç*í\Uüàâ¯Ôÿùõ—™?)|·æŸ5Oÿ97—¡Ó¥Ó-ÖÄù…-š3(˜–ô¾°åÇ­7¦*ý®ÿ•¥ÿ8cÿ-ß–ò'Kÿš1WÊÒÿœ1ÿ–ïË?ù¥ÿÍ«¿åiÎÿËwåŸü‰ÒÿæŒUøÿ?-×?.<Áù¹ÿä,º,ÞZ’3h+Úý`K70D':åÞ”®*üøÅ]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»}å–úí¼çrcP~ccøç!¬Èó}7³²x¸c/!úž¡¦ÛtÍfI;„Ÿã’+f™cge` ÔTTwèrÝEÍÒóz'åíÞ—ùW¨®‘ù“åÿ«êLÅ¡ÔLÊW±Qñ-~ÜU=ˆï˜øÏ],±Ö<¿oÂNQß“ìû?3Á¨B·–3$Ð8ªº0e?HÎFzcDSOé¿|€´ïÓ~øø Ný7ïÓ~øø Ný7ïÓ~øø Ný7ïÓ~øø Ný7ò¯ÌßÌ_+éV/aæ¨bÔœŠ­Ÿ‘«ØšìŸëTå®lû;³óNWŒ˜ùòþÔˆ¾ó¨é×VšàÓdÑlõI_ê0úŽ\*•œ©OŒQˆ¿gaž ð˜0âã1£óøtøudjž©[uÍn9:¢}©ÛÒ¹›ŽMD<Îóó¾HHãù’Oê¦u• …÷—†ö/aá÷þ Í›Ï;v*þ•¿ç ¿0?ç´É/(鿚÷~CÍ‘ZÜ õÕ¢°kÀæêR¾©•K×Zr?f±WÔÿò´¿ç å»òÏþDéóF*ïùZ_ó†?òÝùgÿ"t¿ù£IüÃùŸÿ8q&•|–Wß–¦á­fp‡LåÌ¡ãÆ‰Zצ*þF±W¼Î/^ùNüÜòUÿæ Y§–¡×l_Qm@!µâQê„•Nû\¶§\Uûíÿ9{ù‡ÿ8±ª~MùËOü³¼ò ži—LuÓ×L‹OfnkODÆ¡ùR¿g|Uù1ÿ>Ò×?.<¿ù¹=ÿçÔº,>Z:ê+kËZý`Ëà§:ãÞ•¦*ýöÿ•¥ÿ8cÿ-ß–ò'Kÿš1WÊÒÿœ1ÿ–ïË?ù¥ÿÍ«¿åiÎÿËwåŸü‰ÒÿæŒUø£ÿ?Mó'å/™<ÓåYÿç&òôÚtZeÂß/%²Æ%3¾¯ÕÀ¸ô®ôÅ_–«ú>ÿœ ó÷üã.‹ùåM3óŽïÈÑyÂ/Ò^Mb+½µ+–‹Õ3)îŠq©ûiµ1W×ÿò´¿ç å»òÏþDéóF*ïùZ_ó†?òÝùgÿ"t¿ù£wü­/ùÃùnü³ÿ‘:_üÑŠ¿‘¯0¼2j·ÏeÄÛµÔÆ.ãÀ¹ãÆ›R1TŸv*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb¯ÿÓüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«ûÿœmó·ü¬ÊŸ%ù埜ڞ§O9­~mÐL+í aôb¯lÅ_Î?üþûˆ×Î^Eóo í"úÇŸÔîJ}YññWb®Å]Š»v*ìUØ«±Wb¯ÐùÅù÷æ‡üä·ÕüÇqòÇ’eâÿ¥õ(˜4ñžö–ÿ ÍQÑÉHi Å_ÑÿüãOüáGåüâÝ¢?ôÁuæ&…Æ»~ké `@!CZˆ "œù‘Ë~}þ\Ÿñ÷üüWͺ´_¼ƒËZ#ð?ÉéØZY¿CþýÇÓ㊿n±T·YÕ­´>ï\Ô›…”ÜÌßËJ]ÐÅ_Á¿›üÉsç-{Tó~¥þöj·×7Óo_Þ\JÒ6ý÷cбÜUØ«±Wìn›ÿ>ZüÔÔí-õ(|Óå…Žâ$•C=í@u ¥¿]ò[0¹y|ÿcñË"ÍØ«±Wb¯£ççµïùÊ¿8ÉùcäËë;PŽÂ}@ͨD\!tB¿ºGnDÈ)µ6;á7Ñîó•Ÿóîÿ;Î$ùJÏóÎúÖ©XÞê°é)œ×Q,°M8cêÅñ CZ‘·Z&/«ÿœIÿœówüæ ¦¹©yVÒ´Èô)m¢œjM8.nUÙJzQɰôÍkN£“}ÏüåŸü♿çµm#ËžyÔ´íJ}bÖ[¸_N3EøÞ¬qš“Ò€âT_WÉxìUØ«±Wìn™ÿ>ZüÕÔìíõ(üÑå…Kˆ£˜){Ú€êþï‡f|¾±ÿDLü×ÿ©«Êÿðw¿öO‡e¹wŸìwý3ó_þ¦¯+ÿÁÞÿÙ>;-˸|ÿc¿è‰Ÿšÿõ5y_þ÷þÉñÙn]ÃçûIùíÿ>­üÃü‚ò&³ù½æo0èšf‹RÍ›]œK2Bs…Wbàš°Ú¸Ð^"9þ>ÇæE›±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»NôÿIôÏí)ûÆv^ÄgàÔ˜:'æ?u¸º±é·­éÑtÏZƒ4™å„ÇЊe€:¬³§Ößó6cQò~£¦L¡ý ÷ª‘QÆHSåU9‡’|Ÿ·Eäߥ'ó_åÕ¾Ÿp׺0ú³Ô’‹²}·Ñ·¶l1zƒ¬‡hHzg¸ûXˆŠðd¼rÝÛ8 “O«Élæ€QÇPÛ“8°¥ú{ü¬x™~Uß§¿Êlj*ïÓßåcÄ¿•wéïò±â_Ê»ô÷ùXñ/åWÇ­´¬#Ьç`äã㦭Êt#¼ ƒ‹‹ß%»‹Å‰Þ‡ädÕîãY&a]£©ãôÿAøäd(Ya=y§ÞoBüá°‹Cü¼¼¶¶E‰%{xPqzªä)ÙNkøø¥NOcƒ,ÂG~gì|dÖÞ•´QøF¿«2ièxîDù°íJ.¹ì°ÉäÞf…¬³DÍG-"¨OIqéšÖF*ïùËùÃ?3ÿÎÝèzoõM7S}v+©`:qšˆ-š5`þª&çÔ¥zUñî*ìUØ«±Wê÷åGüú?óósɺæ~‹æ_/ÛXkÚ}¾¡7ïÕDª¿Yyw¡#ß~qyÛòî÷ÈÞxÕÿ)µ á›QÑõ«­Yâåè¼Ö×-nε¸ZŠ€iÔW~¢y“þ|Íùå&ÿÌw~iòÜiö³ÝȈo92Â…ÈZÀHTâ¯Ç¬UØ«±Wb¯­ç¿ç<Éÿ9}«jþ\òN§§i“èö±]Ìú‰›‹¬Àô‘ÍAñ}ÓÿDKüÓÿ©³Ë?}ïýPÅ]ÿDKüÓÿ©³Ë?}ïýPÅ]ÿDKüÓÿ©³Ë?}ïýPÅ]ÿDKüÓÿ©³Ë?}ïýPÅ_šßó‘ÿš¿üãOžï¿(¼×yi©XEm+Ïeêz,.!YTQQªj:⯠Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]нãòÒO¬iþ‘묿A£åûb<9/¼~ǽös/ î$~ŸÒ÷m2™Ïä/D?0ìùèb`?ºž6ûÁ_ã“ìùþò»ÁrôüßzÙ躞<¡¤K­[ÇuÖŸi1YhÏ ’A©*§pjð»ôßùXø ¯¥-Á"ZiÛç‚XÄy±;%׃XÕɱÒÏ¢§f–´§Óý7Ão-Øq[-òGå&‘¤Nº­ôb÷Q¯/ZaP­âªj÷5oq˜ºÞÕžAÂ6Á¼wþrTýcξ[ÑH­–âŸëÌÕÿ“Y¶öwm>I÷šû?j?„°}N¹—Œ¸<ïT‡®gc-D>Tó$ÿXÔû‡øgm¢‡8/¿wÌûW/‰žgξ[~„“2{±Wb¯ÔOÈŸùõWæçç‘4oÍß.y‹A³Óu¨¤–.Í׬‚9ž"„,µ% رWÁ?œß•º‡äŸõ¿Ê~â ½CCºkI§¶åé; S˜V¦ýÀÅ^cŠ»v*ôÊË»ßÍÏ9h_–,ðÛ_ëÚ…¾Ÿ×½$yÜ"³ñ ÜA;Ð튿D?9¿çÓ¿˜Ÿ’žIÖÿ5µÿ1èz~‡j×sAlnýWP@¢s…V»÷#|yÿ8¹ÿ8Ó®ÿÎVyÊOË'_Ùi×ñéóêkÿSÒá ¢ýÒ;r&AM©±ß{¯üåoüû¿ÎŸó‰>R²üÇó¦·£êV7º¬:JC§›Qd– § }X‘x…Þµ#n¸«óóv*ìUØ«ôßþqëþ}qçïùÈÏËý#ó—ÊþaЬtÍgë^½áºõ“ê×RÛ7/N]Ú"Eü$W}±W³ÿÑÿ4ÿêlòÏß{ÿT1WÑÿ4ÿêlòÏß{ÿT1WÑÿ4ÿêlòÏß{ÿT1T¥ÿ>YüÑÓ-.5)|Õå¦KxžV ojB)b`ë¶*ünÅ]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«ÿÔüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«úÊÿŸIùÜy·þqãKÒùËåÝORÒž¦§y~¶£äå@ö«ôË~Ïï|º.|•äo6•«Yk–!¨6vâB+JïõoÓ¡ì«ùÄÅ]Š»v*ìUØ«±Wb¯¡ÿ ?ç?2ç&u?Ðÿ•:4—VÑ8[­JzÃak_÷ìäq­7¼¥a^(ÔÅ_Ñüâ¿üúÇòßò$Ûù¯óGç?9GÆE–î 4ûYãжj‡e=$˜±¨ ‰Å_¨ TP €«x«ñþ}ê¿ç(?>¿3@/½õÖŸ†¤ˆ®5) b»T´r§Ã° |*¿n1WÉ?óþz—ó~K£M¦ÄGQ&¢Ëf¤{ƒ5}©^Ø«ø¹Å]Š»v*ýrÓ¿çóßše¬t“ŒVñ$JZËQ$„P¢´¿´«ò7v*ìUØ«è?ùÆùÉ?3Î+ù¹ÿ3/m4ÛÍRK´ó©ÒÁéÌèìxÃ,-ÈÅ:uØöUíŸó”óð¿Ì_ùË?*Ùþ\þciž_²Ólµ8µXäÒ­®â˜Í3BªÍ5ÔËÃŒÌH BüT¨*±¿ùÅ_ùÎ?=ÿÎ ÚëZw実¢_E®Ëm-ÉÕ๔©·WTôý ˆHkÈ7jSº¬oþrŸþrïÎ?ó—Z®•æ?Ì›&ÆçGµ’ÒÒa¸‰$~d¸žyÉ5éB¢±WË«±Wb®Å_®Zwüþ{ó³LµƒNƒAòqŠÞ$‰KYj$ŠV—àVƒÃFÑjÿ;ÿêÁäÏúAÔì¿wý¯ó¿þ¬Lÿ¤GþËñWÑjÿ;ÿêÁäÏúAÔì¿yWçwüý3ó[óïÉ¿åœ4+ÛhúÔqEq-…¥ê\(Šd˜pi/$@y ¨ÛW¾øA¤oÍl v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb©†•'¥y žœÀûöþ9·ì þ¯¿¤úoOéjÏ{¦š3݃Ëf/@ÓS¦ZNbúÿþq/ZO3èí¿ûÍ2­*žÞëß5} xH>÷_ÚƒŠ1>_©ë¾sÐ>ßÃã™\Ï=’/šµ»¶rÑÕYNÄfמí˜'Ð¥vú¾¨ÓJó¤Œì·( Pøšn>ŠL£!%ÎÅ‚XÏ#ðJ¼Ùù)­éöŸâ%¿é­!”¸6ôi•|x®Î=ÓòFb~`Ggo¥ÖÃ!á˜á?gìø¾x}q£c•VRAbìrÞ'oùU¿§ÿÊÃÄ¿”wéÿò±â_Ê=ßÈ¿“ždól\ÔÐéZ/XºYÖ•ª!¡"Ÿ´ÜV›‚ze2Ô€hnë5z¬x6žàÊîo|½åªé^OO®\†KÇ<>͵ØÑ{ï™8‰æé²âÉ›|†‡pü~ÖôÈ%»q,䳜Éi {ò†‰R¤ŒÂÔåq -"ÿœ£‹ê^OÓ´õÙ®uo˜Ž'þ,3_¥—Ϲßv@©“äøÇPˆ(â:LÚe†VÀu$ë•—m„¼;Ìrs¾uü+üsÆ}°ÔxºÉæ²þò^ŸF*"Î]Êv*ìUõŸüâ¯üæG?çnµ­GòÖÃG¾—]ŠÚ+‘«Ãq(QnÎÉéúÀA&C^E»RÕwüåWüæG?ç/®´]Gó*ÃG±—BŠæ+a¤CqapÈÏêzóÎI1N%{Ö½•|™Š»v*ìUú‡ù_ÿ?hüÞü¥òŽ‹ùeåÍÊ“éz Œ}´—vwí;GS#%ê)båQG€«óãÎ_˜züéªþkêÑ[Ç«ëÅηM)q+p¡Ø«±Wé_äŸüý;ó_òÉGå'”4+Üèú,REo-õ¥ëÜ0’W”óhï#By9ˆ»S¾ø«áÏÍÿÍ Wó«ÎZÏæ§šaµ·ÕµË£ws’:@®@dy »»|Uæø«±Wb¬óò¿óQü¥óv‹ù›åÈ­çÕ4è5 hîÕÚ’¢EFF*HÜ+©ð#}÷ù½ÿ?[üÚüéòn³ùWæÊÖúN¹jÖ—2ÙZ_$ꄃXÚKÙ»£lUò_üãGü䟙¿çüÜÿ™¿—¶šmæ©%ŒÚyTŠi`ôætv>ƒäáÄO²ÔAÔ©¥oÈ­†*üÅ]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«ÿÕüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«úÿŸyâ±yûòÚâCð¶«[GÛâÁpß„ý¡Š¿~1Wå§üþ ËÃZÿœ}—R Ñö™{¿n~¥®ÛÿÅþÿÇ)Ø«±Wb®Å]Š»f>Cü¾ó/憵oäÏËÍ*ïXÖî"µ³‰¤r*cM•¿± £v b¯ÞùÅùó­ž›õo8ÿÎRÝ-ÝÐ+"ysO˜ú+ßÕÊP¹ìRþ-piŠ¿q|¯å]É:U¯•|Ÿam¥èöQˆ­­,âXa‰GeD ÷>'s¾*Ÿâ®ÅP×—qX[Ë}txà m#+EQS°ö«ñ_þ|»g.« þd~dÝ-'Öµûh¤=Ihb’r Ú´7GïÅ_¶8«òþ;ç‘ ~Mé>K…éq¯ëðsOæ·³†I_î”Ê¿—üUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb­«!—b FJ216:)úGq4i*ôe >‘ŸCi²ŒÐŒÇPÌ[Èj !èšhé™aÓæ}wÿ8rày÷SÒßìÝéR•.’Dß«–j;ghæ>ââj‡1øï}ç=íü>9…¤Ìé2Eòw›ô33Ÿ/q¤ÛÀ5Ý7ím—È;].f7åÏ?ù‡òÎóô‡–.JF[”–ÒUà“ýdñÿ(Q¼agÀ2 .î8áœT¾}_CÚj“ßó”|t¯:‘äÏ>H8Ç|¥Vßµ]¸¤•4ødá'ìÇ!Í.Q›I¼}QîoÅÚ=ãëwwêømäòýSþ}ëùÅgæHü¯§ZÚÞi“rtÖVp–‹=e÷¨Û€#¿aYƒÛÂcdïÝ×õ;Hö¶#±îëúž±qåÉÿùÄïÜë—+ç_ÌX…} a¶”v+ñ$T=ߜߴª¹Yskw˜ýÿ¯îu¹rfÖòôGí?¯îx?7|Ëù«r_[”A§ò¬v6õX”våÝÛ݉ßì…é›>š8¹|ÜËÃN=<û×èšM³:!Ôê²½¯ËI•×m°ä—t²—}AäýìmášVfèEáßó˜ô†O+è˱ÿJdz4J¿©±ì£Äd}ߥÝè d|ŸjC®nK™…çúë•m…ó¥ôßX¸–~ÌìGÊ»gÏÝ£¨üÆyäï‘? Ûì{ QáˆH\Âlv*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]гßËKϪëÐ!4YÕâ?H¨ü@ÍgkããÂ|¨»¯gòøz€;Á§ï³´µéœ&GÑÃ.¿µúÞ“{mÝí¥Qó(i˜ØåÃ0|ÇÞßo©ÿçäý#ùtuú¥õÌxY|?Ë÷þËûR85Wß~ñú2ì^¥­iývÍn ‹òMkOë¶mðdm‰y&µ§õÛ6ør7D²o%~zëžA¢µh×XЙLokrjʇbÈ;Sn,i°®ck{ ¯ÕD¹Øïó¤Qa<{‹-Ô¿&ü‡ùçºßä–£“®…/.sð%{Ñ7dåGÎ>Ô\¯jj{4ˆj£Å“¯¯Æ‹W,;LXïy÷’¿çüáª]O?Ÿž//h¶L~±s<‘»2¦ìc ÜxÓöÙ•GQÊ„fËYí&qã‘äý¿¨oîlÉ®ˆúw/KŸó[È¿“öòyoòBÅ5 HN}bæ¬ø†ÙŸ~Ê.ëË4Dzu¢xõráHÆß—¹€Å<›Ïo'ˆÝë:§›o­æ+™.®[öœì£ÁTP(ö ÜC 4ÑáÆ(~>n@ˆŽÁ›èö=6ÌÙÉz®cÓlÕf›Y/UÑìzmš¬Ói%ùßæ‡Ÿæ—™oëQÉo_xÙ"ü8þ”phñŽú?;?¥œþ–j‹×,Æ\Y<7ó*ëêZ-ä€ÐºÇ¿2þæó²¡Ç–??–î›¶òøzyñ_=Ÿ$gpù«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å_ÿÖüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«ôûþ}çƒå?ùÈ;- äá˜ôGL`zâû[jïÄ}ª_Õö*ø·þ~%åÿñ7üã—æÇ—§¦Å{MÿãÊê+šìGOJ¿¬¶*þ5qWb®Å]Š»v*þ°çÒ>YÒ4ÏùÇý'Ìzu…¬¶§{¨ývî8Qg¸ônåHIJÉÂ(¢†'ˆéŠ¿NñWb®Å]мOþrWÌáOÊO=ù7²òƱzògåÔoÉt­çRu`÷óú`~6 ÐïC_ÚÅ_ˆØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»eú?åïš|ãßùÇ@Ðõ;íJ§é FÚÎimmk¸õæE1Ç^ÜØb¬Cv*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb¯qòmǯa=T?ìMážßì¶£ÆÑÀ÷ô¤öSÌvŒ8f^³¦·LèàÌQÿÎ(^ýKó{B…Í"½ŠêÝýù[KÄu¶«þÝ3YÛQ¼=Ô~ÐâÈ^3ï~¦ùÏ@ûŽs:LΫ$_%ùÏ@ûŽtº\ÎH¾[ó.bffî2â 1O„¼G]Ó~ÖÙ  ÒæxÆ»¦ý­³Aé4¹Ÿ¥¿•^ó¯üâ?š¥MZùu ;É-lîÄž¬z–ËéÆõ䨘R @Î[S¦‰ÖGa]~×8‰ÕGaDY÷îüÉѬKïRÄÔ“Ôœê"ÝNW¯èšM²ø‡žÕe{…§*ËÆÏ=¨Éo¢üŸ¢}³[ªÊÓ¾©ò~‡övÎwU™Ì„_ÿÎh\óþ™¤¡øm4˜‹y%cÿ Ç6}†/=äýÁÛà8ËãIºæä¹8CÌüÇqõkYçU6üsYÚºËàžNè’=õ·Úîôpâož3ç÷¯v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wbª°A%Ô‰ml$Ò0DD™™nI=*Èüßä1þ_j-åÏ?i†‡«*,g©ÚËi8GÝXÇ2«Q»PöÅX¾*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*™è—¿£µ [úÐC4n~A… §QÄx.F“/…’3î ý¯¾t³Ó<ß#ë1z6š¯ÜCò9ƒ“fؽëþpŽO[A󆯝i{ „xz¨SþefƒÛAYa>ø‘ò7ú[³ó§5­?®ÙÎaÈÀ’ëZ]³o‡#h/$Ö´þ»fÛFØ—’kZ]³o‡#tKÌnZïH¹SÒ¦’ÚòйGF ²Ðƒòͤ*c†BÁè[6;Û_óš:¥üÑy[L[™…ŬÒÏvÉ"ú\YÖ´b*hOJšg+ì°ä• {†î¿³â—Èš=M³¢Í7<—ªèö=6ÍViµõ]Ǧ٩Í6¢^«£ØôÛ5Y¦ÔKÕ4{›f«4Ú‰~UèW_¥µß1ëÄ×ë7®àøó’G;ïâ;ç¨f‡;‡ÜmËÈڡ냋'ÌW¾•µ43LXû„_êÃ:žÀÇs2îö<§µxqÆ=çîµóŽuoìUØ«±Wb®Å]Š»v*ìUØ«±Wb®ÅYo“|ƒæÌkçп/t]K^Ô£…®×K³šîe…VÇ »”"€°Üb¬L‚¤« ±kv*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«ÿ×üÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«Þ?ç¼ò-¿7|‘ç~a!°×ô÷¸bh>®ó¬sŠö¬L½|UýÂb¯#üÿòçø¿òÃΞT Yµ/.jöj©å5¤ˆ(&µ;P^˜«ø_Å]Š»v*ìUØ«úÝÿŸOÿë6ùsþcuúŽ—~â®Å]Š»|9ÿ?$óòÏüãžïC÷–¶*+Bß[½†q_…ØŸ`M 1Tgüû£Ë¿áùÇ éÄeÓç½5'ë·s\ƒ¿´›{{b¯µñWñíÿ?2ó·øßþr3Î3Dü­t¹mt˜EkÇê–Ѥ£þGz‡éÅ_b®Å]Š»~Øù#þ}uùqq¤y ßó#ó&ëNóæŸõí'O¶ÓCG# hîe–¯¢’¯&vŸìÓÌM¿)?<ÿ+.?$|ÿæÊkë´¾—A¿–ÏëQ¡A2©ª?OÊA+Vâj95*C'”â¯ÐùÁ¯ùÿ+ÿÎRi¾zóæ˜îü»¦ù2ÞÂîY­ I†tºy]ÃoHÖÚ£ˆ$Ôûa7Ñÿ9{ÿ8Wå_È!ù[óÇòŸÎy§Êžg¹6°4öW}ãyT5ÝHVEe4?? T_WçN£tÛÔîíô؈W¸•"RÝv §mñWî©ÿŸH~[Cæ¿%î4.ÇæTÚ7é…²Pô¸ÃëΞŸª¥xú¼ö®;—᧘4i¼¹ª_yzñ‘ç°¹šÖF޼KBå Z€hHÚ bE$”`KôËþq£òCZó·üãoæ—æV™çmoDÒ´ssõ­ÅÊÙjÞÒ9‡Ö!^\¸·QCQ¶H0™!ù›‘fìUûCùuÿ>Úüª×<•ùyç/Ì/Ì-CEÖ0íìÆ›d¶)"Éyq¿¡iNB…ø|–Ì ßìý¯ÍoùÉÏÉ ?ç3|Áù1> º¡Ñe· x±½Xîm£¹Œ”%¸°I@aÈŽ@Б€ŠeoÀ—Úóƒ¿ó‰?ô8w¼ò=Ö³úNÓ4æÔ®§H=yD©Ž5,ª /RÌ~>Ëb¯gÿœŽÿœòå÷äý·üäÇä_žæó_—$ÔSOqqb`rvˆ´lx°)"ed£P”biˆ¾¯ÌŒ Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±W©þ_ÜÖmÏì8o¡‡ög©û¨âÃ<Í•ÿ¦ñÒè»ZƒäöÍ6N™ß™Í¹~Ijÿ¡2ü›©“DÍ”nGòI2#±۾bvœ8ðÌDýÎ4Ećô1"³¨ØçžésS®œ_'yÏ@ûŽtš\ÎH¾Kó–ƒBÄ é4¹­Âœ_9ëÚm93:AÌÒæxÆ»¦ý­³Aé4¹ŸVyCþq»ÍOûòýÍ?祷ôÍ&lw©‰òýiË—ü&'Ëõ¾@Ñ4þ›fê!·U•ì:&ŸÓl¾!çµY^ååMÔeb2çÂOÔ_Ry?Dûxg?ªÌäÂ/ª<Ÿ¢}¼3Õfs!äÏü寡õßÎz5ŽÊ+Ktöãm!ÔþÛ7‡ß\êû Vžû?iv‘Œ{ß+jRuÍ¡rp‡yêëÒ°tduOÆ¿Ã9lõŒç·‹ýëÑv\.~ç‹ç½#±Wb®Å_eÎÎ(Cÿ9kæÍWÊzž»þÓ´m&]Væåm~²ì©"FSš»ò,IÙh“P«Óÿç#¿ç üùaùM¦ÿÎGþNyûücå«í[ôU_M{:±ÈYÉø&V ‚µ·UùÍŠ»~íê_óè¯Ëí?Í–¿”RþkÜEç=CO—R³°}¥íãb­/!?!”‚ †ÛlUø—ço+\yÌZ¿’µ #šëGÔ.´ùdмí¥h™– $­E@4ê1V1оïÿœ?ÿœ<Ñ¿ç#t9~cyûÍ£Ê~Wòd0Myp¶MvåeYœ¨t⑬Dšf'`)º«ÿç0ç4?ùÇ//ù3óÈnÿygÎpÏ-¤ïbm,K«€]ÉWYFÄ#)벯ƒqVWä=>m[̺6•gs%œ÷Z¤1ÜÅöái&U-øžCq¸ëоÂÿŸˆþTkß“¿šÉå:ù¿Ró¶¥6gvuMP8GyQb¡’O…8T|_´vñUð–*úëþp§þqŽ×þrÏó_ÊÝCX“DŠ=.çQúÔVâቆH“‡t>¥k^Ý1WÒžóïß&ùòÌó¿”_˜Ÿâ­?Ë:”zf¡o&–ö¿¾k¨­dDs!<ãyŸƒ‹-hÕ*¿-qWb¯ØïËßùö'’µo,~^ëߘÿ™­£yƒó"ÊÞóGÓaÒevžÝ.+/ªdŽEäÌyT-@©Uù¯ÿ9 ù=qùù‹æÉûëÔÔdÐî„î8ÌbdxÖXß-Ä”uä¼›‹Ta¹Uã8«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb¯º¼“¨~Òì¯+¼F[ýn"¿ŽyÖ¿‡’Qî%õnÏÍâ⌻Àû·{—'LÔäÀ=³þpªð[ù¿ÍÞ[&‚hÅÀ_h§*Ð%ðï÷é=³…àÅ“¸×ÌÇ[sr÷Nµ§õÛ8œ9y&µ§õÛ6ø26‚ò]kOë¶m°äm‰y&µ§õÛ6ør7D¼“ZÓúí›|9A}_ÿ9mÖdò­7ãg8ÿ“YËû)“l¾ñú\MÖùÛG±é¶oóMÉ%êº=M³SšmD½SG±é¶j³MªEêº=M³U›#Q,æúOк=þ±Óê–“Ï_øÇoá˜&HǼó-|Ëò òåxéw7¬—,>…Uþ5Ï[ןXMÙ¹£uI:åxÃŒ_þrßzú¬@Õa‡—É3µìuŒË¼ýÏíF^,±pûÏì ÍëÌ»v*ìUú‰ÿ8ùÿ81ùuçOÊ=?þr+óßÏÓù_IÖ5I4«(m¬LÀJ’ÖÚ<“*2Âò«"rfôÖ­AÓ–*üìÿœ™üŸþqÃó3_ü—¼¿MMôY` x‘˜„±\ÛÇs%¸· T2ò` 1â¯Å_¡ÿóíÊM_ó—óCUò×–<߬ù*îÛËwW§QÐäôî$E»µˆÀÆ£÷ldGó"žØ«àMrÓêå‡6“и–>mÕ¸9>昪WŠ¿Pç?ç ?-¿4¿&5/ùÉ?Î:_yWGÒõi4ë—†Õg‰”ÄÆœ—’u]”ÓcÒ¸«Å¿ç6ÿçl?çuí ËËóyƒ@ó&˜5;‰mý •9RŽ ‚ ²°âw  ¥YWÄø«Ö"*æüïüÀò÷å5¥âiòk×ñÙýmÐÈ!V©gàäBƒEªÔÐQ¸Uúµç¿ùõçåžçÛË/Ì{­GΗº×µm>ëO lm乎7eãOY"~,†N´LUø™Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WÿÐüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«`•!”ÐÁ«û«ü’ó¿ü¬¿Ëß*þaWÖôM;P“ÚK‹twÜ1 ü±W¦M \#A:«ÄêU•€! ƒ±b¯àŸÍšù_\Ôü³1&M:öâ͉ëX$d5Øxx Uâ®Å]Š»v*þ·çÓÿú;\ÿ˜Ý_þ£¥Å_£ø«±Wb®Å_”Ÿóøï1þ…ü„‡JV êþcӬʃÕR)îwµÿÉYÿ9ÿ€Í§ýAjØ«ó—úÄß’?óýC]b¯Æ UyOþ;šgüÆÛÿÉÅÅ_Õέÿ­×¦æ§û«Í’=G™÷þ€þX¿4ÿå4óý¶5úˆ|eÍqòæ‘fýºÿœ'ÿÖ0üòÿ[Rÿºl9(°Ÿ/ˆû߈¹nÅ_ÑÖ£ÿ(_üáÇý¶4ú‡‹%Ñçð?¡ùÿ?BÿÖœó×úÚ?ýÒ-1’×Äýï2,ß³ßóä¿üš~lÿÀdÿÔl«zÏÿ#ŸIÿÀ™ÿî¥>*ü`Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Vg䋟Fõá=+ô©þÓ¿°šŽ D¡üèý±?¨—[Úp¸_q{Î7Lõ^W4Ym¾ªÚE͆³÷–—1̽:¡ :ÔvðÇ,x…w¸¸£¹Oê"d‹S¶Dy$ŠÄQžMÂ]aŸ¼ç }¿‡Ç7Z\Î6H¾Jóžöþét™œ,‘|§æ½Äì@Û:3â!–«+Ù<¿¦zŒª[|!ÐgÉÄ_Jy?Dûf§U™‹ê'èclçuYœÈEõ'•t l3Ôå·2>?ú×é¿Ìß9ê€ÕN³{ü‘Îè¿ðª6ÏEìÈpa€þˆûœ£Qˆxv£?\Ì.V¼?Ï×\š aâÎPþ9æÞßj6Çß#öú^Ÿ²aV^užnv*ý~ÿŸ<Êoçïü.¿ê&UÞrÿäyùOÿ9¿äýö*üÅ]Š¿­ï=ÿëlùÿ5þ¥ÿQ3b¯æþrÿ&Ÿž?ð&Öê6\Uä«õûþpCÿY§þr/þØÑÔ%Ö*ïùÎÿýfŸùÇOûcKÿP–¸«òzå7ü§Yÿ¶ÖÿQ)Š¿G¿çò_ù>í¿ðÓ¿äýÎ*ü¡Å_«ßóæßüŸw?ø ê?ò~Û}}ÿ¬?ùÑÿ›ãþëZv*ü Å]Š¿¥ícû¯ùÂßù‚±ÿº5ž*ü€ÿŸÿëIyûþcm?ê Uñ*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«ëÉÝGëp½¼²F~“Ìij‹íÌ\9‰ïþÐú³™xôà4‘úKè}2~™ÎdB‘ÿ8»©~‹ü뺰SEÔ4é£ÿ»ŽcøÆs[í>?³Ä¿›!÷‘ú\‰ïê~£j&Bîy†9SŒY­iývÍ® ±/$Ö´þ»fßFØ—’ëZ]³m‡#lKÉ5­?®Ù·Á‘º%íŸ×?¥dÐ{úVÒ¿‡ôÍ'³ñðÆO2?KFŸkyžcÓlÙæ›i/UÑìzmš¬Ù‰z®cÓlÕf›Q/UÑìzmš¬Ój%'üö½埙ïIâ[Lž ÿÆuô½úóË;.³þ?-ÿB1ï ü£ò1ô¼½lç¬+Ÿø2àzž·|§á÷6f;¨ê“õÇq‹áÿ>ß}_¾›²Ééùæþ±žƒÙ˜ø0Äy_ÏwÌ{g/‰¨™î5òÙˆfs¬v*ìUØ«özoý`ÿ æÀOú‹¼Å^ÿ?’ÿÉ÷mÿ€Îÿ'îqWå*ý?ÿŸCëCYÛTÿˆ.*úþ/ýe/ùÉ_üÙšçýEi¸«ðv*þ‡µøáÿÎÿÌmü›³Å_œóôýiß<ÿÛ—þèöx«à Uúýÿ>TÿÉ߯ÿà}ÿu UùCæÏøîjóqÿ'cø«ö{òÓÿ‘Ïù…ÿ5·ýÔ´¼U ÿŸ²ÿå!ÿÀ2/ù—Š¿ 1WØó€úÐß—¿öÙþM¾*ý¾ò·ü§ßó˜ÿöÆÒî‰}Š¿˜UØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š¿ÿÑüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WõÍÿ>®óÐó—üã§—­§~W Åþ“3øªvš1òXeŒ}«œóð}M×òƒþq—H›ó7ó&@Ê-t£ËOµ*hZæé~ÓCÅ~Ì’ÄqWàŸüå×üá_çGå·?™úeœö^`ºŸRÔgÑç·Óî®æi £šŠõxú(•›ª¯1Wb®Å]Š»[¿óéÿýfß.Ìn¯ÿQÒâ¯ÑüUØ«±Wœþj~myKòOË·>üÏÕ`ÒtKQñM1%È%c‰¯$CÅ3 Ž*ü üÚó7æçüýŸWWüœÐaп*¼¹s-ÄŽ®Lb[¡"™¥A%dej,+ˆƒò•Ûá`«ï¯Ë_ùÏ‹ŸËV×òoþsk˯ùy怫 ¦¬ª_B¾T¢óŽ`\D:~Ô‘/íÉø1WÓ_󗿘öÞOü„óÇŸ´›¨ä†O.ÝGeu‡F’ú?«ÛÈŽ¦„• h{Wø«±Wb®Å]Š¿ªÏ5/åß–­?ç8ÿ7<ñeåOð—¥žÎÆîÙ¤ý'õ½.ÎBÊ®=/Gà'à“—0>W[ùÛÿœ³üÃÑ¿5ÿ8|åù‰äÉZ}UÕfšÎgFŒÉUø° ¡¸Ô¨wíŠ_;â¯Ùïùõ¯þJÏùÈŸüm?ê VÅ[ÿœ¸ÿÖ&ü‘ÿ˜Ø¿êë~0b¬ƒÊñÜÓ?æ6ßþN.*þ®uoýn½3ÿ5;ÿÝ^l‘èÂ<Ï¿ôòÅù§ÿ)§˜ÿí±¨ÔCã.k÷0<‹7í×üá?þ±‡ç—úÚ—ýÓaÉE„ù|GÞüEȳv*þ޵ùBÿç?í±£ÿÔ 7fù ö.Ðí|=Ÿ,²®áÎGÜ?ÍæÆ’YD;G×u4Ü/Õ­„P¯Ç!¡cØ×¿È xœÓvOlê»K7qðáßsÌ÷?tvï’ê4¸´‘ÜÜü¿Éûgÿ8Ãÿ9Ïc¨CeùqùÑééÚ„(–öº°¢ÛÊQ?hÛü±û³û\;ÓÚ½(““ã™_‡»Ÿ½çó`þ(ò~†ù“LKè~±XT¸5î3ŸÁ“„Ó8Ûå9èoáñ΋K™ÃÉÉ~sÐ>ßÃã.—3…’/™¼Á¥”fR3kÌ3Óåá4£i?¡å;í'ýù)4ÿdŸÓ)8ìÛ–r~ø/Ö‘hšM²Ø„j²½ëÊZ7"¬FQ¨ÉNº"Ëêo'èŸcáÎwU™Ë„_Tù?Cûxg;ªÌæB/ÿœŒÿœÔÑ¿)£›É–ž–±æÐ rH;[6èyy þE4SöØÀävoaËRxòm´þ¡æìpéø·;á›|Áæ :ú]vh–î§y®ÊÐ1‘س5;“Ðö´í­~«³¥â‡0=UÏõŠ}C¾žƒIƒ¤p“Réøþ”Ûù¦Ï[NV¯I)¼o³ëôfgeööÑ»;õ‰ÚCõûŶOC<Õóèò_6\}bý—´j«üŽy¯¶šVcüØþûýó¿ÐC†ö5œ›šìUØ«±WìGüùªî0<óms(†)<¡:<¤T"›¨Ab6­øª‡üäï?)¿/?缿ÿ8»ùaçÛ_<ëVžcmHÜÙYÉn¢79u/"§2 ¡gêÑWãö*ìUýoyïÿ[gÈßù¯õ/ú‰›0óŸù4üñÿ6³ÿQ²â¯ Å_¯ßó‚úÍ?ó‘öÆ‹þ¡.±WÎwÿë4ÿÎ:Û_ú„µÅ_8«Ð?)¿å8òÏý¶´ïú‰LUú=ÿ?’ÿÉ÷mÿ€Îÿ'îqWå*ý^ÿŸ6ÿäû¹ÿÀgQÿ“öØ«èïýaÿÎüØ÷ZÓ±Wá*ìUýJ\ÙùJòüã'æ—æÏ¬ü¥”ô2úÒÞîÝ¥‹>“h¯È}.)-ÆJòè1Wàwüæ¯æNù½ùÛçÌO!Ü5Þ¨ßFm.6ÕHmㄸW‚³!+ÈÆ„€vÅ_.b®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]н×ò[PôÞ÷Ocþû•GÞøg7í+á—¼~>ׯöW/×qýô=w\üÖÓ|±þ‰l ö¢O·„ôoméò·¶iôÝ=FçÓóúà;­wncÓzGª]ÃôŸí(¿"kŸ˜^\Öí¿8ൂ-VÉɆا#è´m+EÖ…”ü^¦õH+í>“63¥²byŸ;¾~ð:pûÝdgÍ›üÀá³·»ÝÓâoÜý{üÿœòççMªÚÂÃOó /ïôéœr4´-·¨¿@eý¥¥ ò>Úöw/fJϪ$?ßw°ôsrb1zγaZ3U‡#^K­iýv;Ñ/%Ö´þ»fßFÐ^I­iývͶ ¦¾u¹ý+%J6é”h#á‰y–¶µMǦØsM‘/UÑìzmš¬Ù‰z®cÓlÕfÈÔKÐÅÕ–g.³­Ï­²&šfˆ£¹'lÖ˜Ë4„ 'ÚÎïÍÏùÈoùÉK¿ÎX®?++íéåé>¹:•i„nxƒýÜ|”ÿxô¥rVô_gýœf‘¨Ô_ðÄt±_GÜ<ù·Â—Å0yóZü½uò÷ž,Oèå%mîíþ!Æ» ìþÀêw³qkG zºÄþ6ûCÊfí¬º\¤j!é$ð‘¾ß§ì>LÊo1YjV§TÓçI­‚–,†´ ©uØïšïÊϸ$(»xjá–q6<Ÿ\Î×SIs'Û‘ÙÏÍNz #Â*É39¦ÔrLŠ»v*ýüüò/”|ÿÿ8OäÍ3ó?ÎÞHÑí|Û=ðÔî­MÒ<°Ý݃€’*.Fœ~ÉÅ_ÏÎ?9ü¡ùåùÎÞjü­ÔWVÑ­4k-=®ãGXžhÞYÓ.e ©BA¥FåWç–*ý?ÿŸCëCYÛTÿˆ.*úþ/ýe/ùÉ_üÙšçýEi¸«ðv*þ‡µøáÿÎÿÌmü›³Å_œóôýiß<ÿÛ—þèöx«à Uúýÿ>TÿÉ߯ÿà}ÿu UùCæÏøîjóqÿ'cø«ö{òÓÿ‘Ïù…ÿ5·ýÔ´¼U ÿŸ²ÿå!ÿÀ2/ù—Š¿ 1WØó€úÐß—¿öÙþM¾*ý·üâóÿåüãž±ÿ9­ù‡ÏÖ·žmóþ™oj<·œ‚êÎæ 6h!‹š»‰}o¬+r+Æ>Ñ#p«ùˆÅ]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«ÿÒüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WÛó‰w²óÔ_óß›žÕ<—ùM­ßµõúiâ8㺼tŽÍÃÜÂé‚î²Â¬ªdŒxŠ¿¬ÉŸÈÿ!~DèQùWò‡F´Ò´Æ îðrܵ6’iØ™%b:3³Pl´Z UêWöº­´Úf© w6w´SC2ŽDqFWV2‘±PŒUøÿ9¯ÿ>—.nÿ3¿ç`<¦¼ò¹`‹5ƒ±ÿ§v>Ñ7Ù‹~êuÖ‘u6•ªÁ-­í´ ðN‘ȆŒŽŒVR(A®*ƒÅ]Š»[¿óéÿýfß.Ìn¯ÿQÒâ¯ÑüUØ«áßùËïùÎÿ"Î'X¶™~ãZóÝÄ|¬´Yr —.zÕßýÖŒ2ªøòŸþpçóOþs‡ÌVßóóœ×—Z–+êé>U„½³Xò éT›X`Õ&ê`*«öïÊžSÑ|‹¤ÚyKɶúfc†ÚÒÒ5Ž(ÐvUZrz“RjN*”~aþZù[ógDŸÉ™:E¦µ¢ÜÞ[^DA¥¡ûHë_…Ы©ÝXUü´Înê>^üƒ¾Õÿç¿ç¼ùªêÞ@Ô$kž\¸uº±Ón fHmîX’XHµ‘QU¢¬ÒÌü„j¿4±Wb®Å]Š»~±ÎAÿÎTþEÿÎE~LyOʾd³ó5—æG’tÑÚRB¶ÿ£ÍÓEo4œ‹¼l-Õ–ŠŒ*Am½¿'p%Ø«ôCþpŸþrÉ¿ó¾HüÚòwžãÔÿÎÚ4Y³%A,v÷ÑX³¡Uåqà6ܶÛu]ùóÿ9GäßÌŸùÇËùÇÿ/G¨/™ü©p’ê <–ÅVÐúRfcYª/|Uùߊ¦M÷è»ëmO‡©õi£›…i˃¥hiZu¦*þ¦ç?ç&¿$ç+¿=-ÿ2<‹oæKOÌ{o(˦´7ñÛÇb–1܉œ~íäf”I5¯a†Ð?™/Í?ùM<ÇÿmCþ¢ ¹±ÇÈ{˜E›ô‹þqÇþr»É_•_óŽÿ™¾gQo2ù´Þ=­àG·µœp¯ªæEeø”ÖŠÛa˜È_ØüÝÀÉØ«õÚïþsƒòî.ÿÎ>h «õŸËCO¹×I¶‹%¼Q£ý\ú¿¼5SNA0ÞÌk{|]ÿ9§ùÇ þþsy›ósÈ«rš®tón·‘¬S«ØAnü‘YÀøãj|GjlIµˆ¯µòÖOÐù÷_üå_–?ç¼ýªy·óÎúçHÕt‡Ó‹éê’K ž´r«Ý2žMPhqWÍŸ¿ò«?ÄëÿBßúkü%õH¹~žô¾µõžMêuðð§=ë\P'Š]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±UÊÅ:05Üd¡3%ˆÜ{¶wå›;;æúåë‹€jË'Aôwý^ÙèÞÌvv›_ûü²92uþí¿‹Þvé@º½nIã1Øy=¢Âèè3Ñã³ÍeÆÊ¢hî”G0¯î>Yg7@ÀØ}—ÿ8óÿ9w¯þL|§æïSYò]B,dÖâÑ|`f4â?ßLxÿ#&õÑvŸbGSë†Òû¿õýíS€ÉËbý;ƒ_Ð?2ôxü×ä›ÈïôÙÁ£ÇÕZ•(êhÈ⻫~‚3™Œg§—Å]—7Ï~sÐ>ßÃã›ý&g$_'yÃC(ÌÀgG¦ËbœCé6ñ‹¯Ý°þsZŸË2K— ýL·ËšWªÊ)‚Rá6YqÓ^OÐþÎÞ¤Õfl„_JiGOòÕŒšî¿qžŸlœæžf Š=Éñ;Ô†ùÏæ‘Èxc¹.n8_'Äž_ó˜:§œcŸÉ”Í.™ c¸Ô7K›•èB÷Š3à?xÃí“6ºÅçÃŒ#´R#ÝV=Noù7‹Ÿ67}w×|.n,oóM…„u¿Sõ{ŠÔöä~^>ã8Oiû+KŠ'=øsècüRþ¯˜ªæ^‡C–gÓÌy¼ÞY^f2ÊK9êO|òüùåšFs6O2]Ôb"()åIv*ìUØ«ïÿù÷‡üäÇ“ÿçüï­kšß6‡¯h’é-5„k+ÂÏ,rrdfRT„"«É#á"´Uówüä¿å}·›¤‹þqÆ}RãÉŸV€ÆúÀçסõA¢§ÃZqÛxŽ*ìUûñæùøäþ­ÿ9+åÏ‹;­HùSJòîræÅÄÂæi¤u jVŒ*Ø«ñ'óoÌv^qóÏ™üÝ¢–m?UÖµëbëÅŒW/"^Ç‹ ŽØ«ÏqWéOüà¯üä·å‡åO”¿0ÿ&?£ÕbÐ<ókóJdtDŽhäBêÄJ 0WUWÑŸóó˜ü¯äŸäd_•Ïu/”VÎìiO{µÃZýZ×Ò2Ð+°ß~%b¬³ÈZÅ¿—¼Í¢ëú‘aic©YÜÌTTˆâ™]¨;š¶*ûþ~)ÿ9åùÉOÍH1?,%¹—GMÎĵÔõb–faÄ“µwÅ_b¯¼çÝó>QÿœküÔ›óó>[˜´wÑo,CZÀgVYaeAQ|Uë?ó–>@—þq—óò &¼ÿy›Í’ë|VoE­ŸR³¹ä­½8_áñ ïŠ¿-±Wb¯×?Í?ùÉÿÈoϯùÇ¿)þ[ùèyƒOüÄò—›¤Ahm&¾†Ò+e’InQIè£P„d«/Å@ÅWäf*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±T~{-œ„C<–é(Êñý®‚{ŠôéQ^™V\bcp n/½¿cŒìLobGsêïËï/èšL1êZ8[‰]Þ–£6ý@þ_p({ã;KU—)1žÞ_Žo¡vVƒ‰ãõ_ñuýžï›Ý4ûÞ›æ†pw`¡5O*-äé¯ùrca¬ÄÂD–&(Æà’»«Wö†þ5Ë1êxGÇNÔc|2VÅõ¿äïüåsJñùó¨}WQZ$:›©'aëSa_÷âü'ö¸îÇ’íe«÷ÚMÇXõÕý\û‘<]bú»U´IÐM€ÊÊj;‚êrø§[¼£ZÓúí›l9b^I­iýv;  ¼ÿL¹ý+!Þ¾™§ßþÖfÎ>Xìõ=Ǧ٭Í4õMǦ٪Í6¢Q~tüÊò÷åVŸúSÌóÒVR`µŽ†iˆì«Øx±¢Ðô}—_>cÞzÇw6"&\ŸŸ¾{óïš>®Vç]é¾W‰ù[ÙDOàÛý·§û±…ü Œït: =”*©žr?‡ø–ͱòæ—Goi£[‹65Šì:“âOR}ÎXe,†å»D¥l?Zhob{[ÄIaqFG”pv̼$ÀØØ´e€È8d,…òGžll<¯tÑùjæHe™JÍl¬J„`zš÷즧¾ÛggÙÙ'©åÈùþ:¼káÇ¢•a‘óˆåGÏôïÙåÙ¹y×b®Å]Š»~®~MÎNþBëóšoüâßüä…¯š"]+WŸTYô$·"RòJéG‘ê8‰™YJv7P~Qâ®Å_hÿÎ~ygþq«óbÛó?ó/G‹N½µacË/9Ô¢³ ¦ÛüX«ß“þs'ÈKùùÅù2cÔÿOùïÎZ–½¥7ÕÓз3Yº ŸÔª= z¨VáÜ×e_–«±WïwüãOüä÷äç5·äoå?Ÿm<ËiùƒäkË;-#ê‹°’ò±D’M!nf'ôЕ଄²Õ…ªøCþ~ÿ­;çŸûrÿÝÏ|оûÿŸsÿÎKùGþq_ó'TüÂüÍKé4»Ï/\éq>šO^[»Y–ªï Æ©¯Zm¾Ê¾×ocÔu+ÍBÞ¾”÷Êœ…r¾ô8ªUŠ¿D<ÿ9GäÝþqÍó‹WÑêÎZÖ³ ý«¤mIye1ç/0Á¸Û¾ÁüwßeR¯ùίùÉ(ÿÎF€¿å_¥ò†¼½—{õØR*μ+éñwä¿ ÜÓ劾Å^Ýÿ8Ýù§gù%ùŸåoÍmfÖkÛ QŠêâ r¢WŒU_‡*)` BË^AWÑóž?›“ž^iÿ•­ù ¾`O2kK®®¯1Û…Ž¢ƒêë1ˆÜù1íLUðN*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å_ÿÓüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb¯×ùÀùù~§ùÖ”¿óO©þ^’!´¾<¥ºÒG@´¶Ãý÷öâÅP¢&Uý6èþ›æ­:×Ì~Z»‚ÿJ½‰g¶º¶‘dŠXÜUYIÜb©¾*üüÿœÉÿŸ|y#þr®Ö_1ÙôÌ(ã¤Ä7E;ØÖžªÐ{¥ "úl«ùmüóÿœóÏü㟘äò7æ¾—%…è«ÛÌ>;k¨§«o0ødCµz2…Õ ¼cv*þ·çÓÿú;\ÿ˜Ý_þ£¥Å_£SϬosrë1©ww!UUEI$ìN*üjÿœÿŸŠëߘ`?óŽ_óöOæO8^3A>½n‚H g6œé ûWR‘nƒuæ‘Uz×üâ/üû‡Eü¡¾OÎ/Ï{¿ñ—æ½Ì†îK«¶k‹k9Øò/«VšpÛ›‰7†4B9²¯Ô UFââ+8¤»»‘b‚%g’G`ªª¢¥˜€rN*þzç?çè²ë^ü•ÿœf½h´ïŽÛTó, G›ª¼6,>Ìg½À<ŸýÕE¤Ž«ð€’ij“¹'kv*ìUØ«±Wb®Å]Š»v*ìUØ«ôþpûþsSÈ_óŠCjþ]có…Ü]ý(öêÖó²²ÂÐúr(U(µ r4ê1Wç¶¿¬Mæ-N÷̪«q}s5ÔŠ€…+—`+SJ·ÂM  ”àK±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUت½½Ì–’ íØ«¯B3#K«ž–c&3Duütc8 Š/[òç™SP)K€7^ÇÜg°v´í!Ã/LÇ1ßçÕÌ}¯?¬Ñ{ŽOG³¾é¾uºl˜™EµèaÅ·±É‚àÏÑ?.ÿ3<ÅùO©ˆ]ï¾¾›P”Ü\µXô€ðã]£ÚYuù ;óg«ÒK¸d?kèš=d5Q㿼y¤Xßôß5Óƒš ?SÓl|ÇÕu©bEÙÐøƒü:†<’Ân-±'@üçó/ät‰£káõo(3QE~(A=c'ìžþ› û%I-”kûiŽ8zr}þþÿ6Òùs}Ë£ùŸEóþšž`ò¥Ò]Z>ÇŽÌÝ]NêÃÀüÅEqYtÙ4“àÈ(ýþc½®«›Ö´þ»fn‘/š¿(îJ˨÷ôåA÷òþ™Ñv¤|1s>O¨t{›g5šmd¼·ó;þr'Nò)o-y9SSóãŠéF§Ûqüƒ§íÐì»7Ùùê¿y—Ó´þ¡çòQ ܾ]‹F¿óóù¯óá¯u)/NFä«à¶Ý”|#ß·LrÇ |<€ü~4K%lëËðÀeƒA,Búÿ®ù•0%ó¿ææbØ—Ò4&uºÉ(Ýcì@ñoÀ|út½™Ù'¯'.ƒ¿ö<¯lvèÃxño.§»öýÏœä‘æv–V,ìIf&¤“Ô“P )<ÖaC±Wb®Å]Š»v*ìUØ«±Wb®Å_aÎ ~þ_ÿδ„ð|Uúñÿ8ßÿ8µäùÅ¿/+~YX¹™Tßê—^öõ×£M áñBÆ•‡¤ÿT¼¹ΓY áõG—Üô«]C¦ùÛ‚ég‰>·Ô}ò@¸“ÂK¹!š=KM™í¯¡`ñÍeeÜFྠ.lb8v;‡×Ÿ—?ó“QkK•5 ÛßP$:•Ç'a벟òÇÃüÁhIÖÏIᛇËõ:ý_eØãÅ¿“óÊ*þii–É5¼n¤‚ ÈA=33OM´cÅþ #çú™=l¼˜­ y8%´¿jõØx}‘ûGªågˆwäeŽ<›´¾Z½Õ.õ{¹5¿0Ü=Þ¡1äòHy|¾îàèeB""ƒ¸ Â}Gß )†ŠçP÷È’åC Ï¼Åæ”°(÷tì¾çúg+í´°ìáÁVNî‘ó—èýÎßG¡97<žKqq%Ô=ÑI9ä:Lõ392'™.þr†NÅ]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìU=òÿ˜¯|µt/ôÇ¡èè~ËæGlÆÕic¨ ¿hrôZÙé%Åï½õÏ“|óiæh=kSÂt§« ‰Oñ±þ9Äë»>ZcG—CÞú/gvœ5‘¸ìzŽ£öy½6×R÷Í\±»0S±yÌmor«$N(Ê ƒØƒ•p˜› „˜=¬zÿå–¢|Ûùarè?ÝömWWA¹R§í¯·Û^ªk¸ÌŸ…­‡¨éw~£öw¹È%´ŸaþYþx蟛0 Ã̧ղ‘¾Ýí ´;‘ö—zŠG’íÅÉ 7õC¤¿â»¾ãö$Ã…àÿóŽzÅ­œ>eÕu©ÒÞÎÖâ#$²°UQûΤþ=3yí##Ž0H;ƒdÒß>þ|ë?˜Éå/ÊÐözOظ¿j¤’)ÛcÖ4>Þ0þQUË4=‡HQ~úõ…wü”~Èÿ2s'Q¨–sÜ;š'—‰6¹Ô«ß)Ž6¢XÍî¦33£rIí™Çl%*|Éçÿͽ/¤yuȇu’áz·ˆOoò»öÛsÖvgcðzòsè?_êx®Øíþ;Ç„íÖ]þï/?“ó¢y7b®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUÿÕüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]оªÿœRÿœ¼ó·üâg˜ÿÄJ—ëzÛ Õt[†o«^F»WoîæPO§*Š©Ùƒ¡de_Ö·üã§üä—’ç'ü­Ÿ?,ï=E^1ßXÍEº²œŠúS &‡¯£€J1¡¢¯|ÅT.­a½†K+ØÒky‘£’92:0£+)Ø‚6 ìF*ü ÿœÚÿŸMA©ýoóGþq^Ý-îþ)¯<­P±IÝšÁ‰3ßêíð‘2QbeXüáßüú÷Í_˜–z?šç,f¿Óü¡¥ú¥yJYdŽvÈes2ÔT‘É/;þÑŠ‚ª¿ ¿.ùsJò†™kå*Ù[éÚEŒK ­¥¬K1F½@ >CN±Wšþm~nùOò;Ë7Ÿ˜Ÿ™º”Zn‹f¿»ÈçìÅŠI쨠žûHUü ÎjÎxù·þr×Um.WGü½³›†Œ¯¼…vÝ•4’_åb x¥O)WÁ˜«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]г Í [öÛ¢ÈS_¿=ÙÏkj°êO™û¥ÿóïuz­ ú£òz4MóÑÄ­ÓÏ k¥ï’¶‰aUšâ;´ô¦Üv=ÇË 6Æ006†ŸS[ˆŒwRqŠ3Rú†±ÆkTÔˆì6Üå|.UÀÇqðï)¥¬‘Y'ºž¬zœ˜ÙƘ3;ºMKßQ…,›Q÷ÀKtp°-wÍ&*ÚØšËÑŸ²ü½ó…öÚ±¦¼:ssäeÒ>C¾_`÷»m.†÷—'³%Ü’ÄÔ“ÔœòéÌÌ™HÙ<Ë·–äRìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»GiڕΓp—ú|†)ÐÔ0ýGÄã+ËŠ9cÃ!a»y`œ ú‡É_˜y…¼ô†ýGÅf§tööê?ã»C²ÎœØÞ=ÿ­ôÊíˆë¥ÔwùÆÏQƒS÷ÍAÆîMbÕ=ò³•±?0y~ RAªéŽm5HØ:M+V‚HÜz0ßç™x5á–ñîü}ÍØóðìy0}Êš…ãIm¬K$6>¯©"¯¨â£+B~#âiÔænmT#¼EšùÇFùç“×lä¶Òà[+X¡^Š¿¬øŸsš™ÜÍ—S'šœÚ§¾#cúŽ·¤Osu Ž$fc@dcÀfhnZ²eÁ”ùϘ“ù…›OÓKE§ô=š_Ÿ€öûü]ÙÝ–0z¥¼¾ïÛæð}¯ÛrÕz!´~Ù~Ï/›ÌspóîÅ]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WÿÖüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»{äg翜ç|Õmùù_~ÖzŒ4I¢oŠ ¨ ðO@xÚ‚£fSFFWU`«úÌÿœ<ÿœÖòwü寂'Ñ™tß8ÙD­ªh’¸2ÆGÓ@zËnXÐ=SE‘T•ä«ììUØ«±Wb¯ç%¿ç'ü“ÿ8³åwó¯æ5Õg—šiÚdMÕôÊÁ’(«Pd‘¨ˆ©äUYWòOÿ9Eÿ9]çoùÊï35ùúGN·.ºf‘7Õl£jT ?iÚ€É#|N•¢ªù—v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®ÅSý/[’ÎNKEØ÷_ìÎËÙïje£¬Y·‡CÖ®>]:w8™ô¢{ŽlÖL0 ¦ ô9ê˜óG$D¢lD:Ù`F®¥ï–[Q©úKß £ÁXÚ—¾ H„“R÷Àe[–Á…ˆjºûÍ[{SEèXwùg›{EíaáÓ¹÷ùGËú]zm¹Ø`Ò¼˜¾yûœìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUت¤3Inë< RD «)¡w¢$(²„Ì ˆ{דÿ0Æ OÕ˜%ßE~‹'ôoný¼3˜×öW‡ê‡/»ö=ÇdöàÏèÉ´º’ý¿ÜõõO|ÓoGÄŠ]Sß"q­®:§¾ x”T÷É ki&©æ84ØZîò@‘¯ÞO€Î_‡M,§†!ÇÔê¡§Íξió…×™dàÄÇf§àˆ¾íâWãf‹A0ï=ÿ©à;Oµ§¬5Ê#ý'Ïîbžê]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å_ÿ×üÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*Ë|‹ç¿0~Yë¶>zò¡>—¯iÒ‰­níÚŽŒ|0hß™°Eñ[r o©_Š[NF¼è <²Š²@Ü~™â®Å_ÎeÿÎqù?þq#E0ÞÕ¼õ{ }7DŽ@† OrFñ@;Ó”„Œl슿“Îoο8~y¢ëóóCQ}CV¹À”kb©S™(ZÎsEIʲæŽ(™ÌÐÉHÆoµqX¢Ú?Äç•{Aí<µ×‹ˆ}³÷÷/ŸpÍ҇sÍ+ÎE½Ø«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å\ 7qW¦yoήl5WöIIüúýþ9¤ÖöoñCâ?WêzÎÉíÞXót¿_ëù½)oÛ®i8²ÛúûãÀ›J5o1G¥Eëܶçì êÇÛúæFŸHs·_ $x§ðKŵjçZ›×»o„}„eG·¿‰Î›M¦ŽQøž÷€×kç«—¾ üw¥á;v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»ÿÐüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìU¦êWz5ܶ‘q-­õ¬‰4;G,R!䮎¤2² ‚ãHŸó€óóÛOÌ¡gù7ÿ9wŸ›~4írR±Á¨žÑÜl+Ž[d˜íðÉA"¯bÿœïÿŸŽèó°\~[þY=¾±ù—"u¨’ÛK¦qJ†˜lRJ/‘Wòåç/9kŸ˜ZÕï<í>§®j34÷Ww.^I¼O@ÙTQU@U@«Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»EZݽ«rMÔõŽm»#¶rölø¡¸<ãÐþ£ÜFÌ2cdÉ} Åëò¢Ž õÃ=_´|˜<~*˜?P=ÕßÝ\܈ƒLvòùîÍ:F:ëžeÛžÐdí)W(Qý2ï?wN÷3!sí®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Veåï45‡;òZÛ¢·RŸÔ{}Þ¬ÖhOTyýÿµè{+¶ŽFMãßÖ?³ð;™¦±æ;m2ñ°–Y±ªš‚r|3Y¦ÑK)£°Þ‡_ÚØôѱ¹<€ûÏ“É/o¦Ôe77MÉÏÜ€ö΋!ˆpÅá5:™ê%Ç3gñÉ –4;v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ÿÿÑüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Uk‹‰o%’îîF–yYžI‹33–bw$É8ªŽ*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb¯ÿÒüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUÿÓüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUÿÔüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUÿÕüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUÿÖüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUÿ×üÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUÿÐüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUÿÑüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUÿÒüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUÿÓüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUÿÔüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUÿÕüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUÿÖüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUÿ×üÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUÿÐüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUÿÑüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUÿÒüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUÿÓüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUÿÔüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUÿÕüÿâ©Ï—´Ÿ3jhziŒ\Ü ê¸>,jͰØmâvâ¯Wÿ¡}óWóXÒZb®ÿ¡}óWóXÒZb®ÿ¡}óWóXÒZb¯,ó/—nü©¨K¡ê¦3sÞ”‚Eø”0£cФX«±W©ygòƒ_ófŸ»¥5 ¶˜¸_Vå¾*j½Fã¿Ï¦*Ÿоù«ù¬?é-1Wоù«ù¬?é-1TÌŸ“Úÿ•téµÝQ¬þ­^•Ê;|lQFçsм¯v*žyoË×^iÔ!д³¹Ÿ—VAü*XÕ°Å^©ÿBûæ¯æ°ÿ¤´Å]ÿBûæ¯æ°ÿ¤´Å]ÿBûæ¯æ°ÿ¤´Å^SæëË„ú§é››r¡ý'¿†a±Ø—C¾*’â®Å^­åßÉÏ0y£O‡\ÓÌ[Oȧ©rŠß 5^ÛŒU:ÿ¡}óWóXÒZb®ÿ¡}óWóXÒZb©™¿(uï)iòkš«ZhŠô®QÛã`¢Š7;žß³nÜÓpëZWf¸ªSŠ»zÎù1æ1éðkz{Y‹k…,ž¥Ê+P7ºtÅSúß55‡ý%¦*ïúß55‡ý%¦*ǼÓùI®ùBÁµ½XÚdeCé\#µXÐQFçèÅ^aŠ»d>WòÍ盵Ñ4“¹uf´‹ÑENçõb¯Oÿ¡}óWóXÒZb®ÿ¡}óWóXÒZb®ÿ¡}óWóXÒZb¯#Öôyô ùôkò†âÙÌoé°u¨ða±ÅR¼UØ«Öô?É_1y‚ kOk/«Ü'4çtŠÔ÷¶*šÿоù«ù¬?é-1Wоù«ù¬?é-1V5æ¿Êsɶ?¦5ƒjmýE÷7íV­>¿nØ«Í1Wb¬“ÊžU¾óðÑ´s¸(Ò~úEh½w=÷銽3þ…÷Í_ÍaÿIiŠ»þ…÷Í_ÍaÿIiŠ»þ…÷Í_ÍaÿIiм‡XÒæÑ/n4‹Ò†{i71°uªš0Øâ©n*ìUëÚ7ä—˜õÛ}bŬ¾¯sÊœî‘[‹n*;lU2ÿ¡}óWóXÒZb®ÿ¡}óWóXÒZb¬[Íß•šß’¬×VÖM©åFá¹HøFôÛyÆ*ìU”yKÊ7þu½m#F0‰Ö&”úÒ¬kÅH…ºš‘°ùöÅ^‘ÿBûæ¯æ°ÿ¤´Å]ÿBûæ¯æ°ÿ¤´Å]ÿBûæ¯æ°ÿ¤´Å^=ªé³h÷—Mç^ÚW‰ø0e䆆Œ6#@b®Å^Á¤þGù“Z²·ÕìÚÈAsK;¤ ÅÅEGcN£·CЦô/¾jþkúKLUßô/¾jþkúKLU‰ùÃòÃYòE¤z–´Ö¦e¯£:ÈÜŠ–û#zPÿ®*ó¼UØ«+ò‡“µ;]¾—¢˜DÑÄfoZUŒq.Äõ5#z/ý ïš¿šÃþ’Ówý ïš¿šÃþ’Ówý ïš¿šÃþ’ÓxÞ¡c.™u>›uÇÖ·•â~ y#4a±×Aâ®Å^ɦþEù—T´ƒS¶kFâ$•9] <\*;UÿBûæ¯æ°ÿ¤´Å]ÿBûæ¯æ°ÿ¤´ÅX—œ?,µŸ#ÛE¨kmjbšOID3¬Ê„ý‘½(:ÿQмóv*Ë|Ÿä­GÎ÷2éú)€K~«zò¬b•jõ;â¯Cÿ¡}óWóXÒZb®ÿ¡}óWóXÒZb®ÿ¡}óWóXÒZb¯»µ{岞ž¤.Ñ·UM ØqŠ¡ñWb¯g²ü‡ó5ý¼7Ð5§4k"Öí+FûñTOý ïš¿šÃþ’Ówý ïš¿šÃþ’ÓaþqüµÖ<7šÙ¶1Îæ4ôgY @®àoOìÅ^Š»eþNòF£ç‹‰ltC’ýFõåXÅ+M«×zý ïš¿šÃþ’Ówý ïš¿šÃþ’Ówý ïš¿šÃþ’Óx¤ðµ¼o%9FÅO¨4؈ÅT±Wb¯j¶ü„ó=Ü1ÝDÖ$Eu­ÚtaQŠ«оù«ù¬?é-1Wоù«ù¬?é-1Vç/Ë_ȱÁ>¶mÊ\3*z¬†ª5~ýqVŠ»f^Nò&§ç™g¶ÐÌ­Õ]ýy–=˜ÐR½~ŒUŸоù«ù¬?é-1Wоù«ù¬?é-1WùÇß4ËXÒZb¯–&…Ú§$b¦„Pi±UOv*öØ¿ |Ñ2,¨ÖXéqËlUý ïš¿šÃþ’Ówý ïš¿šÃþ’Óarü¼Õ¼Š-Û\6ä\ó èL²}ŠV n:ŒUƒb®ÅY·“|ªyé®C0lÉë̱ýºÒ•Üô5§NýF*οè_|ÕüÖô–˜«¿è_|ÕüÖô–˜«üãïš@¯+úKLUâ 8’§¨Ûc\U¬UØ«ÛÓþqÿÍ.¡Õ¬(@#ý-;ü±Vÿè_|ÕüÖô–˜«¿è_|ÕüÖô–˜«ó—5O"µºk†nC˜ý –O±J֛ޢ•ëÛ¡ÅXN*ìUœù7òóVóиm ÛmÀ?¯2ÇöëJ¹èqVoÿBûæ¯æ°ÿ¤´Å]ÿBûæ¯æ°ÿ¤´ÅV¿üãÿšcRå¬( Ÿ÷®>ß=±Wˆâ®ÅW"—`‹ÔM:ûœUíÃþq÷Í$W•‡ý%¦*ïúß55‡ý%¦*ïúß55‡ý%¦*Àüåä=OȲA¸`-p¬ÉèL²l¤Ztë¶*ÂñWb¬óÉ¿—Z·ž’yt3lܪ¿¯:ÆjÕ¥Üô늳Oúß55‡ý%¦*ïúß55‡ý%¦*¥qùæ‹hžæF°ã³š]ÇÐ ÷Å^)Š»U‚¸‘ ŽœÝ‚ŠI ©;™Å^×ÿBûæ¯æ°ÿ¤´Å]ÿBûæ¯æ°ÿ¤´Å]ÿBûæ¯æ°ÿ¤´ÅXœ|‹©yhmu³yкz,›CZtÅXn*ìUŸy;òßWóÌSÜè†Ø%»*?­2Æj¢€õÅY—ý ïš¿šÃþ’Ówý ïš¿šÃþ’ÓC^þCùšÂÞkéÚÇÓ†6‘©v•¢Šš}Ø«Æ1Wb¨‹KW¾ž+()êLëò!EXÐT€÷8«Ú?è_|ÕüÖô–˜«¿è_|ÕüÖô–˜«¿è_|ÕüÖô–˜«Ï¼áäKÈ÷Xëf$Ñú‹èJ² TéÓ¦*Ä1Wb¯@òw妱çˆ&½Ñ °Ž·­:ÆjEvz{â¬Ãþ…÷Í_ÍaÿIiŠ»þ…÷Í_ÍaÿIiŠ¡5ȯ2é–³ê7-cé[Æò¿¤'ŠMs¶Ø«Æ±Wb¨» )5+¨tën>­Ä‰s`«ÉÈQRv§rzb¯eÿ¡}óWóXÒZb®ÿ¡}óWóXÒZb®ÿ¡}óWóXÒZb¯:ó“u$]ǦkF4‘ WÑ•dI#r:ŒUŠb®Å^‰äÿË gÎö²jZ)¶Å)‰½iÖ6ä6Êw¥ßúU–оù«ù¬?é-1Wоù«ù¬?é-1T§ùæM&Î}Rí¬} hžWãt„ñASAÜÐmмwv*Ól%Õníô»R¢k™RæÁW“°QRv§sнþ…÷Í_ÍaÿIiŠ»þ…÷Í_ÍaÿIiŠ»þ…÷Í_ÍaÿIiмß;Q¿òUêéÉ„ÎÑ,£Ñ•d^,H+ÐÔϾ*ÅñWb¯Gòåf·ç[6Õ´cj ILGÖ¸Dn@~½7ÅYOý ïš¿šÃþ’Ówý ïš¿šÃþ’ÓKõÉ2h¶W½ãYzÑ4²qºBÜTTÐw>©è7Å^?Š»GéZlÚÅ従gÇ×¹•"Nly9 «€Å^ÃÿBûæ¯æ°ÿ¤´Å]ÿBûæ¯æ°ÿ¤´Å]ÿBûæ¯æ°ÿ¤´Å^iæ¿*_y6ûô6°b7OÜÈ$Z5i¸ï·LUb®Å_ÿÖüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUÿ×üÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUÿÐüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUÿÑüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUÿÒüÿâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUÿÓøÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÿÔøÃw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÿÕø%Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÿÖø9Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw Uÿ×øKÃ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1T~•¼×¶Ðê­«ÍÊT€Bˆ'½0ª'Ì:3h:¥æ‹-yZÏ$5=HV ¤oФü0+¸b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*ÿÿÐø]Ç»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â¬«É:ó&»c£H+ ³7´IñHàAÅYWŸD:ö—¥yÚÙ8K8’Æèu%í¨#r{³FW‘ñUå|p+¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*ÿÿÑøoû†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b¯¦$ü«þ—˜^”ÖÒ\Ú^z„ŽQÍhÝCl îwS_™TÏó;É–ÖÖþ\Ò¥áicê^ÝË&â%H5EsvT¨Z×»8«å>Ü1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]ÃÿÒøƒÃ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*î«+ò‡•$ómëh¶íéÝÉ’[òVtø¨Ç°*üÔí\Uõoåµ”×%`ªÖbn¡d ÂXaέ¾Ì¦$‘[º6ÕÞ…[Öt-ùfÑôJ $† ®Tš+”i>Ð2°X×}Õ8×|[u'Ö¦’äª'¨ìÜQBªÔÖŠÀèpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÿÓø•Ç»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«êß( /'h~·›!Ôì¯ntû+¤Rï–0j£bÉWg¡PÖ•8Uèú'—aÌ:Ðk^áb‚âH7IêÑÏrVWZ“·Â¬G*QV9æý.ßÍ—W:o™µgea¼¸·µQÄ/oVRw¨¨^JrØâ¯5i’òîK¨-ÖÖ Ç ¥(½w;u=ÍO| –ñÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÿÔø§Ã]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]ÃV·ƒ×•!žl«Eêji·¾*ûÎþ[µóè³ÐŒM«i³ÛÜIopŸ «…‰ @Á•ß\aCÖ'“OÑ-á·º•`¶·N`Ë! XèµfbI£2õ=iоr“[½óž£s¦i: wî 4ìò­³”øRY… +5<¸«Ä<Ý©¬^Gur·s$œdBTE`«N*Ô”Ç8b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*ÿÿÕø»Ã]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]ÃeÞB³7^aÓ€PëÂLàš‘QÉù*“ïÓ{Å®½7š<Û=µä2@,f ДwHéÅ–AOŽ iÈš„ÀjáCÓæyTê« —ré¨míJPÊÌÊ$p¤‚¡D¯Äj•ëQмnêimôÛƒ«~‘yãF˜AszÓOðoÉÂÑ-ãR¿Þ½8¥;ªù»†»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b¯ÿÖøÍÃ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãzÿä•´Sù‰’áC/Õ&Øô߈?8¡>òM†¥äÿ0^G°º²µ¸0ÎÌ¿¼Š >‘ˆ­} ¤ÔlF늳G®·e ëÙ<°JÏu1¼‰œXòã ~¢ ¥xó” ¨cÓ ¼§ó+U‚Q“§ÜEé¡äÖ¶!VÖ!Ú¬  d=Kz¹À¯$áŠ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1Wÿ×øßÃ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãfÿ—ZÌ^_×í/辰-¬;,ŠV§Ø ùb¯£4;±]gH»vi¢ž y$¤31¸§íˆŽ¡áC ×nl¼Ÿu6¹{Åäå VÑ\0ž¦¥Gìs ‡.êp+ç‹Ë™¯ç’úñ‹Ï3—v=ÙIÅ(n«¸b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*ÿÿÐøñÇ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUí^F»ƒNòõÞ±¨´­½Ò–XÜ«±CUøä¨§JW¶*Á|Áæë1EõKÈ!Xb`mB-èP7V©å_‹|U‡ñÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ_ÿÑùÃ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ã]ÊTT‚(­~ŒU‘LQ5ÈŽ&ºŒG£ÓR ³;ÆœjU;x÷ßE\éñÅ3iñD¾“%ËÔˆ4o _ˆîÀ+C]÷ÅSK[+Yn^;uIGR­õi=5éñžCáoµQâF*…±Ò­®ì,þº¬ªþv1Ð;¬J¥EH;¬+½7ÅU®´Ë;Ø-"T–9¿FËp’UxÊÔqƬX/U_ˆÇTPµ!;I«Ï ÌAò¼P™>×Pj(Wâÿ[dVÒì­­®õ8>–Â9ãiáK¦„ýe¢j)P¼<ÇÛ_æ_+iI&©ªÝ,$&ÔA°TV3ÄhÌŒ °äWöEE:Uf¥ùua§Ïmc “]]4ëÇ,jÒrŒ·4ø¬7 áÞ£A¿”ü¾²jsF÷¯i§Éiñò‘¦fW ”ˆ q4ì|vU•y{ʶÚEý½«Raµ=½^4øZòÓT“T¿—«u;p^R1  ­ûlHùb­ÚjÚ…ÆêxJ§¦=9Yhœ‹qعiÒ¤œUEïn¥Y#’yY&`òä‡aа®äv'EÇ®ê‘ÄW×*!þî“8áQO‡}¶ÛlUeƱ¨ÝóúÕÝľ§üåvåÀ’µ©ß‰$ 튶5­H?¬/.ž¡›—ªõõ ñ/Zý¢6¯ZmŠ©¦«~Šˆ—S… hŒ«•ì 7z^‹¤_jžQÕ58ÚàÜ+³r<äŽ$£‚z‘ÅŽÞÄb¯1—Q¼Ÿ—­q3ó^ ÊF<–¼¨wÜWzxï×T“VÔ%ãêÝNÜA²6ÕO~ë·Ën˜ª™ÝV7f*€…ÔMM<7ßYÃw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WÿÓù)Ã"—pÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ã{¯”ïî“FÓl|¾=[©%•$F/é!Vgf“䌪¡»w^,`;Jr=:u튩ðÀ®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b®áŠ»†*b¯ÿÔù;Ç]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUV)d†¢då±âH¯Î˜ª›ij“¹'kŽ*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*î8«¸â®ãŠ»Ž*ÿÿÕùOÇ"ÉÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWÿÖùaÃ"ÉÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1WpÅ]Ãw UÜ1Wÿ×ùsÇ"ÉÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWqÅ]ÇwUÜqWÿÐùy‘dìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å_ÿÑùy‘dìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å_ÿÒùy‘dìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å_ÿÓùy‘dìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å_ÿÙfifengine-0.4.2/doc/logo/fife_logo.pdf000066400000000000000000015764631341615052600176310ustar00rootroot00000000000000%PDF-1.5 %âãÏÓ 1 0 obj <>/OCGs[334 0 R 337 0 R 340 0 R 343 0 R 346 0 R 349 0 R 359 0 R 362 0 R 408 0 R 435 0 R]>>/Type/Catalog>> endobj 452 0 obj <>stream application/pdf FIFE 2d isometric engine Adobe Illustrator CS3 2008-07-18T16:52:35+02:00 2008-07-18T16:52:35+02:00 2008-07-18T16:52:35+02:00 160 256 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAACgAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FUPeaha2a Brh+IavEUJJp8snCBlyYymI82L6z+Y2m2DCIECdxWOI1kmYDYlYY+TkDx6eOZePRGTjT1QCWRfmb NbsrajbvbQt1lmETR9T9p7d5fT27yUHvXLjoL5NMdaCebKbDzZpd3Gj8uCuAUkBDxkHoQy5hz00g 5UdRE89kRr/mby/5esBqGuahBptizrEtzcyLHGXYEqvJtqkKcx29KdN/ND8utTEh0/zHp90ImiST 0rhG4tPIIogaHq8jBV8TiqHT84fyskultU816Y1y7iJYRcx8i5PEKBXrXbFXP+cP5WR3TWr+a9MW 5RzE0JuY+QcHiVIr1rtirMMVdirsVdirsVdirsVdirsVdirsVdiqTeaoedgkgG8bip9mBH66ZkaY +qnH1A9L5P1+DW/L8KTw3Dsk6hp5WJdmlX4XZn3ZviB6knOwwGMo8uTz+X1ZCCWPR+ddeaSNDMQZ hyhCuH5LUry+GtByBG9PwOWDhJ5M56XhFkvZPyW06+N5eNdu5+ti1YR1ISrvLzbgPh5bCp6+Oart OQFV0tyNETIV5vaPOOgX2uafa2VrdyWardwy3csFzdWcpt1qJVjltJIX5kH4Qx416jOYd6hT5Nls tDGm6TqF7IxvYLt7jUdQvriXhHJGZI1nMvrcWSP+75cCSeQIJqqhfKf5fyaXNb6lqOq6ldatE0xk h/SmpT2BEhdU/wBGup5VNI2H2hs24ptirG7P8vPzMsfMI1W31uCWNJ3kS2utQ1yeEo5I4tbvdtAa K2w4UB6Yq9WxV2KuxV2KuxV2KuxV2KuxV2KuxV2KoXVLZrqwmgX7TL8PzBqP1ZPHLhkCwyRuJDxD zhocUumXGm38RjkE872l4a8H9eZ5RFJWvpyKX4gHZtqGvwjotJmogh0Gqwm7Dx/QPLCnzAsE6kC2 PpcQCzEl2k4qoqWJ59Bm2nIRiZNEskpgRfS35daBNBcNdSQ+ggK8YzQlUSPigZl258mZiASB45zO uzAinbaLDwp7590jXdVsNMg0eaSCWLVLOe7kjkMRFtFJylrRk5DxWu/gc1Ts0BLofms+aPNt5HLI thqGmwwaQPXIVblInDFU5fuzyb7VBiqn5M0/XpfLvkee9juEuLK3J1Nbsstwpe1aMCVZDzLciK13 xVKv8JefX8l3umfWZotTn18XUM31olksWu0kJDhwQqpyb069NqdsVenYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYqlWuaBaapA6ui+oylW5gFHUinFweoOXYcxgfJqy4hL3sP8r/ljpun6ndXaWrQSTP8A vpZGaR6UA4RFyeKUUdP4bZ2fXExAu3FxabflT0KGCKCJYolCRqKBRmsJJNlzgANgvwJdirsVdirs VdirsVdirsVdirsVca0NNz2B2xVT5XFD8CVoKDmaV7/s4q3Wav2VpXryNePj9nr7Yq0GuKbonKhq OZpXsPs4q7lcb/AnanxH/Zfs9u2Ktgz90WlT+0enb9nFWuVxT7CVp05n7Ven2envirdZq/YWlR+0 fs9z9nr7Yq1yuKD4ErQ1+M9e37OKuLXFNkStB+0evf8AZxVus1fsLSp/aP2ex+z19sVa5XFPsJWm 45nr4fZ6Yq3ynr9haVFPiPTv+z27Yq6s9R8C03r8R/2P7PfvirRa4psiVoNuZ69x9npirdZuX2F4 168jXj4049fbFWuVxT7CVoa/Eevb9nFVQVoK7HuBvirsVdirsVdirsVeb+aNT81Xn5gXOgLr3+H/ AC7YaRFrE89nbJLeToZpYp09ab1VjCekp+CIt8XXFUl/IX8zNb86an5gga/fVvLumLbnTdTu7SO0 vZWmeVSJVgb0WC+hsQincVA6Yq9ixV2KuxVi/n7zXfeXNNhubS1Fy0zsjVqeFFLcuIpWgB2rmt7R 1k8IHDXq6lzNHp45SQTyY7+Wn5o3vmrU5LB4VliiRne9VDEKqaFOHJ+lRmPotbmlkEJ0b+f6nJ1u ihjjxB6Vm6dU7FXYqw/8x/O175U05LuG0M8TBjLMo5mMLT4uFV5dRtXpmdotKM0qJpxNVqDjGwS/ 8qvzOk87peFbZkgs+IF2y+n6rMSCAnJ6caeO+T12iGGqPNGm1EpkgiiHoGa5zHYq7FXYq7FXYq7F XYqwj8zfKXljzFZol7qy6BrkEUg0zWI5kiuIklAWVSrMglhk+zJG3wn2NDiqK/LPyf5J8p+X10ny q8M8KFWvLtJElmmlK7PM6d+P2RsANlAGKstxV2KuxVKvMtrol1p31fV5o7eCRwsMskixESkHjwZi PipXbMbVaWOaHDJtw5pY5WEj/L/y55T0FJbbSr+G+v5ecs7pLG7lC+/wRmgUMadOuU6PQjD6ieKf f5N2q1csvkGY5nuI7FXYqkvmqy0G+shZ6tcRW3rcxbvJIqNXjRuIYjl8J+IeHXLcOaWOVhqzYY5B RQHkDQfKOhaWNM8v3MN0YVX6xJHKkrmtSpbgTSu5GT1OplmlckYcEcYoMpzHbnYq7FXYq7FXYq7F XYqxvzP5QGt3UUzNZmNRHHPDd2MF36kSM7tHzl3UFzGw8Cvvsqq+UfKv+H4bkNJayzXb+rcTWtlB Y+pJyb45BD9tuBRKn+WvfFU/xV2KuxVKfMWhtrEFrEJIIxb3AncXFtHdqy+m8bIqyfYJEn2xvSo6 E4qlXlbyTNo1/DfTz2U9wlkbKWS2063s5GrKJRSWL4hGvxUj6VPLrirK8VdirsVY/wCbPLFzraxt bXFrbzwwXEMb3VlDe0M/p7j1acV4xlWUbNXf7IxVb5a8opompajeI1pS+EKhbaxgtHCwRiNRLLF8 UvGnwcvsjYYqyLFXYq7FXYq7FWnUOvE1ofAkH7xQ4q+L/wA8Pzt/NTy9+a3mDR9G8wz2em2c8Ytr ZUhZUDQRuQC6MacmJ3OKsE/6GM/OulP8VXPSn93b9/8Anniqd6R+bP8Azklq9jJqNnrd3+i4jwl1 OdbS2s1cfsNdTpFCGP8ALzqcVU9d/OL/AJyP0Fojq+tX1rFPVra4aG3a3mH80M6RtFKvujEYqlH/ AEMZ+df/AFNVz0p/d2//AFTxVv8A6GN/Oytf8VXHUH+7t+3/ADzxVr/oY386/wDqarnv/uu37/8A PPFV8f8AzkP+eEzenF5nunY0ACxQE/hHgMgObKMDI0Batd/n9+fNnJxuvMV5A9a0eGBf1xZGGSMu RtlPFKH1CkN/0MZ+df8A1NVz3H93b9/+eeTa3f8AQxn51/8AU1XPb/ddv2/554q3/wBDG/nX/wBT Vcda/wB3b9/+eeKtx/8AOQ/53yEJH5ounY7ACKAn/k3lmPFOZqIJQSBzXz/85CfnnA5SfzNdxPtV WhgU7exiw5MM4fUCERkDyUv+hjfzr/6mq57/AO67fv8A888qZMx/J788PzW138zfLuj6t5iuLrTb 26WG6t2SFQ6FSackRWHTqDir7bxV2KuxV2Kvz2/5yR/8nb5p/wCM8P8A1DRYq80xVn/lqzn84+Wd I8q2jpLq2jahd3cGmu3CS6tb1Lb1I7YmgeSJrV3MdQxDfByNRirIv+ciPMHkt7/TvKfkyGC30XQp J5HiteJi9eeOCNgZFLeq6/V/ifk25pyJrirx7FXYq7FWXflfrOl6X5oik1OQw20qMgnXrHIQfTf6 G6+2a/tLDKeL07kOw7PzCEyD1Tz809ftbyzgtXvvr+peqzSSD7KQD7A37nrmN2ZgIkTXDH9Ll9p5 o8PAObzXNy6R2KuxVl/5aazpema3K1/O9oZoGjtL6P7UE5IKybb0+Hi1N6E9embjsnOIkwPVwdfi lKGzXn3Wk1GS39S8a/v92u7lzyIPRUDdwq0y7tjPGhjHMGyw0OIizVDoxHNC7F6B+QP/AJOTyn/z HL/xFsVfopirsVdirsVfnt/zkj/5O3zT/wAZ4f8AqGixV5pirMPJflnRdTsZrzUF1PlbyM5l0+ON 0SCAIZGYua8+UqBabb7kYqhvPHl/Q9Jk09tHe8eG6gDzi+RUdJqKxjHBQrBVdfiBNa4qxjFXYq7F WQ+StC07WNQuotQS8e2trY3Dmx9EyKBLGjOwmKgqqyE0G5NPc4qm/nLyj5f0jRpLiy/SaanbX4sr yG+W29JVMchBDQuzcy8LbUoAOtcVYPirsVdirK/I/lS08wfWEmivZphPbW9utl6FAZ/VZi/rMvRY TxC9e5GKqvnXyromkaRpV/pw1BX1Brj1FvxbhOEUpSMxNCzFiQp51Aodt+uKsPxV6B+QP/k5PKf/ ADHL/wARbFX6KYq7FXYq07FVqFLH+UUr+JAxV8k/nH/zjb+Z/mv8y9c8waRb2radfyxvbtLcojlU hSMkrQ03Q4qwz/oUT85f+WWx/wCktP6Yqvi/5xL/ADsir6UNpHUEHjeKNm6jYe2KtN/ziP8AnQ9O dvZNTYVvFP8ADFVv/Qon5y/8stj/ANJaf0xV3/Qof5y/8stj/wBJaf0xV3/Qof5y/wDLLY/9Jaf0 xV3/AEKJ+cv/ACy2P/SWn9MVbb/nEX852Ys1vZMzGrMbtCST3O2Ktf8AQon5y/8ALLY/9Jaf0xV3 /Qon5y/8stj/ANJaf0xV3/Qof5y/8stj/wBJaf0xVw/5xF/OdSGFtZAjcEXaVB+7FXf9Ch/nL/yy 2P8A0lp/TFXf9Ch/nL/yy2P/AElp/TFWV/lV/wA40fmn5Z/MPQdf1O1tRYadcia49K5R34hSPhXa p3xV9f4q7FXYq7FXYq07pGjSSMERAWd2NAANySTirD3/ADi/K9L02beZbHmriJ5xJW2WQ7+m10B9 XV9vsl64qyhdU0xkSRbuEpIgljcSIQyNuHBrup8cVVILq1n5ehMkvGnLgwalelaHviqrirsVQD+Y NDS6Fo99ALg0HpF1rU7j9WWDDOrph4sbq0TJfWUZAkuI0JXmAzqKr/NuemVs24Ly0uCRBPHKV+0E ZWpXxocVVcVWySxxIXkcIi9WYgAfScjKYiLJoJAJ2CX2vmby/d3L21tqEEs6GjRq4rWtP15jQ12G RoSF/jl3t0tNkAsxKKbUdPRmV7mJWU8WUuoIbwIr1zLaFWGeCdPUhkWVOnJCGFR7jFV+KuxV2Kux V2KuxVD6jY2+oafc2FwOVvdxPBMvikilGH3HFXy95y1Dz43lvyp+TegWM9jr9sn1TXrOOBFhvLS2 SNY7uK4I9P0JSGaRuQPKqtvsVXtSflytta6VYDSNJv7Wws7DTpJ7lZPrLW9sY45VrTiU9PmwQmha lRiqc+T/AC3caPPfTTWOn2TXqwGQacZgrSxeopqknwoqxlAvEeNegxVk2KuZQylTuCKEYq+dvNn5 Y+cLnztb2OnzXUOm3jyS3kcbkW/EMTUGooH5DkNtwe2dNg12MYrNWHRz0s+MiufXuereYfJb6hcq /wCi9Nvoja21nNLdNMtwYopJHljUpRQlXVgK/Ea8ui5zcjZJd3EUKRHk3yf+gtQ1C7FhYWLX6QCU ae9xwZ4lpQRSn0o0XcIEXpkUsrxVK/NGlSat5fv9Ojp6tzCyRljQcu2+YutwHLiMRz/UbbtPk4Ji ReM+S/InmKTz4Dc/WBpemSK5jnJCqaE0r+1tsPpzm9LgOSQjw0QRxfjzd7qdTAYrB3I2ehTeR5JN XhupNE0WSNb57ySdxM8xaS4nLyuGHGSQW5i4cqhHLcaKFzrnnE48i+XG8u+X4tL+rW9osTc1t7SW 4miUuqtJxa5LSbyl6e1O9cVZBirsVdirsVad0ReTsFUdSTQb7YqgLvzDoFnMYLvU7S3nX7UUs8aO K/5LMDiqj/i7yp/1erD/AKSYf+asVa/xZ5S5cv0zYcqU5fWYa0Pb7WKt/wCLvKn/AFerD/pJh/5q xV3+LvKn/V6sP+kmH/mrFXf4u8qf9Xqw/wCkmH/mrFXf4u8qf9Xqw/6SYf8AmrFXf4u8p9f01Yf9 JMP/ADVirv8AF3lT/q9WH/STD/zVirv8XeVP+r1Yf9JMP/NWKu/xd5U/6vVh/wBJMP8AzVirv8Xe VP8Aq9WH/STD/wA1Yq7/ABb5T/6vVhvv/vTD/wA1Yq7/ABd5U/6vVh/0kw/81Yq7/F3lT/q9WH/S TD/zViqrbeZPLt1KIrbVLOeUgkRxzxO1B1NFYnFUxxV2KuxV2KvhX/nLz/yctz/zA2n/ABE4q8Vx V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KvYP+cT/APyduj/8YLz/AKhpMVfemKuxV2KuxV8K/wDO Xn/k5bn/AJgbT/iJxV5BpMFlPqtlBfSNDZSzxJdTJTkkTOA7LXaoWpxV7D5Z/LvSfMHnTXvKum+V IjpXlp7hNX1O51KdNQUW0jRmRZFX6vyYxtxQWZG/xHoQqg7L8t/yvU6mdSuvMfoWOoajEt7ZWPr2 xs7Bm4s0yxlfWeNGc/sKAeRWm5AYkljv5oeTfKXl610eXQJNXM16bldQttYtXtngeL0jHGrekkUj cJav6buBt2IqkLE2wHAybFK79MIq91ehw/l/oSaNaNdTXh1TUIkntGijQ2/BlY8SeVTQr8TbUodj nSx7KxEV9t7/AKnVT10xI0BQQnlbyp5PvdPEuszawk6308M0un2X1i2S0t4o2Z/U6mYvLTh0AoWI qK89mgIzMRyBdnE2AVLz55Y8paTp+m3WgXOpyyXLzpewanatbNCY2pGoYL6TsRXlwkbidvfKmTC8 VRujWKX+qW1k7+mtxII+e23I0rvlWaZhAyHRu0+MTmInq9E80flp5e0/TLn6m92t/psRkvTMqiMg GlRQmnTpv881Gm7QySkL4eGXJ2+bs/GIE9yF03yd+XjaU13qE/mFJobGGeX0bBTC9zJEs8yxyOQB DDFNGzO9CQwKhgV5bx0THPzB0HQ9C8yzWGh3F3daaqKYri/t5LSdmFVlDQyJGV4SKy9+njsFWef8 4n/+Tt0f/jBef9Q0mKvvTFXYq7FXYq+Ff+cvP/Jy3P8AzA2n/ETirxXFXpGk/nXrGl6LfrZ2UUPm jUUS3uvMSMyvLAvI8pYB+7e4BbaY/NgXAcKsKt/M3mO2tZLSDVLuO0lWVZbZZ5BEwnRkl5JXieay MG23qcbRSnqeva5qvD9Kajc3/plmj+tTSTcWcKrFeZahYRqD8h4YrSAxS7FU8g85eYIdLTTUuW+r wh1gruY1k+2qE9A2bKHamSOPh697iz0eOUuIhAWutaxaRGG1vp4IWLloo5XVCZAA5Kg0PIItfGg8 M1pLlLLzVdUvVRLy8nuVQsyLNI8gVnNWIDE0LHriqFxVdHI8UiyRsVdCCrDqCMBFiimMiDYZHrX5 geYtX08WV3PVGVVuHH2peGy8jmHh0GPHLiA/Y5mbXTnHh+fmlK69ri27Ww1C5Fu6GNofVfgUKJEV 41pQxwon+qoHQZmuEoXt/fX07XF9cy3Vw1S007tI5LMWNWYk7sxPzxV6x/zif/5O3R/+MF5/1DSY q+9MVdirsVdir4W/5y6+P85briR8Njag7gUISvf2OKvF/TbxXt+0vf6cVd6TVpVetPtL2+nFWuDU rUdK9R/XFW/SatKr1p9pf64q7028R3P2h2+nFXem3ivb9pe/04q70mrSq9SPtL2+nFWvTalajpX7 Q/rirfpNWlV60+0v9cVd6beI6E/aHb6cVd6TeK9v2l7/AE4q702rSq9x9pe304q16bUrUdAftDv9 OKt+k1aVXrT7S/PxxV6h/wA406zpWifnBo99qt1HaWhS4i9aQ7epNC0ca7V3Z2AGKv0BBqK+OKux V2KuxV8T/wDOX9gr/m0kiKFMmmWxkIABZg8q1PiaADFXiH6OfFXfo58Vd+jnxV36OfFXfo58Vd+j nxV36OfFUXqXl+SxuFgLh2MaO1OxdQSv0YqhP0c+Ku/Rz4q79HPirv0c+Ku/Rz4q79HPiqa+VdPY eaNHPhfWx/5LLir9MsVdirsVdir5h/5yP/L7zdr/AOYMd9pOjXd/aiwhiM9vC0ic1eQlagdRyGKv LP8AlTn5jf8AUsaj/wBI0n9MCu/5U5+Y3/Usaj/0jSf0xV3/ACpz8xv+pY1H/pGk/pirv+VOfmN/ 1LGo/wDSNJ/TFXf8qc/Mb/qWNR/6RpP6Yq7/AJU5+Y3/AFLGo/8ASNJ/TFVZPyo/NCNAieXdTVR0 At5KfqwqtuPyk/My4k9Sby3qTvQCptn6D6MCqf8Aypz8xv8AqWNR/wCkaT+mKu/5U5+Y3/Usaj/0 jSf0xV3/ACpz8xv+pY1H/pGk/pirv+VOfmN/1LGo/wDSNJ/TFXf8qc/Mb/qWNR/6RpP6Yq7/AJU5 +Y3/AFLGo/8ASNJ/TFUfoH5RfmDBr2mzS+W9QSKK6hd3a3cBVWRSSTTtir7iwq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FX/2Q== uuid:DD67F312D854DD118B9382D307AB9C37 uuid:fa8227e6-2d2d-46a0-81c6-fc1dace5fe03 uuid:DC67F312D854DD118B9382D307AB9C37 uuid:DA67F312D854DD118B9382D307AB9C37 3 1 False False 29.999999 45.000001 Centimeters MyriadPro-Light Myriad Pro Light Open Type OTF 1.006;PS 001.000;Core 1.0.23;hotunix 1.28 False MyriadPro-Light.otf MyriadPro-Bold Myriad Pro Bold Open Type Version 2.007;PS 002.000;Core 1.0.38;makeotf.lib1.7.9032 False MyriadPro-Bold.otf MyriadPro-Regular Myriad Pro Regular Open Type Version 2.007;PS 002.000;Core 1.0.38;makeotf.lib1.7.9032 False MyriadPro-Regular.otf Cyan Magenta Yellow Black Default Swatch Group 0 R=46 G=49 B=146 RGB PROCESS 46 49 146 R=4 G=3 B=105 1 RGB PROCESS 4 3 105 R=24 G=103 B=195 1 RGB PROCESS 24 103 195 R=144 G=211 B=255 1 RGB PROCESS 144 211 255 R=175 G=238 B=255 1 RGB PROCESS 175 238 255 R=154 G=195 B=233 1 RGB PROCESS 154 195 233 R=120 G=25 B=15 1 RGB PROCESS 120 25 15 R=4 G=3 B=105 2 RGB PROCESS 4 3 105 R=24 G=103 B=195 2 RGB PROCESS 24 103 195 R=19 G=76 B=171 1 RGB PROCESS 19 76 171 Adobe PDF library 8.00 endstream endobj 2 0 obj <> endobj 334 0 obj <> endobj 337 0 obj <> endobj 340 0 obj <> endobj 343 0 obj <> endobj 346 0 obj <> endobj 349 0 obj <> endobj 359 0 obj <> endobj 362 0 obj <> endobj 408 0 obj <> endobj 435 0 obj <> endobj 436 0 obj [/View/Design] endobj 437 0 obj <>>> endobj 409 0 obj [/View/Design] endobj 410 0 obj <>>> endobj 363 0 obj [/View/Design] endobj 364 0 obj <>>> endobj 360 0 obj [/View/Design] endobj 361 0 obj <>>> endobj 350 0 obj [/View/Design] endobj 351 0 obj <>>> endobj 347 0 obj [/View/Design] endobj 348 0 obj <>>> endobj 344 0 obj [/View/Design] endobj 345 0 obj <>>> endobj 341 0 obj [/View/Design] endobj 342 0 obj <>>> endobj 338 0 obj [/View/Design] endobj 339 0 obj <>>> endobj 335 0 obj [/View/Design] endobj 336 0 obj <>>> endobj 333 0 obj [435 0 R 408 0 R 362 0 R 359 0 R 349 0 R 346 0 R 343 0 R 340 0 R 337 0 R 334 0 R] endobj 5 0 obj <>/ArtBox[0.0 0.0 850.394 1226.66]/MediaBox[0.0 0.0 850.394 1275.59]/Thumb 451 0 R/TrimBox[0.0 0.0 850.394 1275.59]/Resources<>/Shading<>/Font<>/ProcSet[/PDF/Text]/Properties<>/ExtGState<>>>/Type/Page/LastModified(D:20080718165234+02'00')>> endobj 444 0 obj <>stream H‰ÜWÍη¼ïSÌ ìˆÍ^-;9àC|ÿK)ä÷RÕä=;»F,ßß¶‹²HvõÏ»¼ßÞýüÞm?üø~»ýô3þ¼ë\!…ŠW(uèëÍmâKÚS“­&·‡·ûD¾ýëöÏíߘõî￸íãï·wûâ¶ÿsûpZ,_×/úð=;Hßá„ù'Xx‚Å'Xz‚åŽ}¸¹]ê†?Íão*aûö‘ó„ó¾n²9ü'8AÝ[•­‰ßS­m{ûrãÈ—ÛÝíÎqÚçæÔ„Ãù˜÷š ñ’pÜ {±H«{ŒàÓí7R›¥šö(òt§ËÇ÷ë÷ ‰Åïq¯ ÎÃVªÛ«Çk¬½¤µ=dÁÊ’vqºÛæ¹86ÊaOžú¸>#ÏÎ;9`Xvç[}ràû<1÷ n÷ºÖuø{nÓÞÝ…–v_åzŸO ?¼âïô›ËžO˜]ù÷Í­ kW¡S6pl·éçy ÑǶW2üM¥êæ€r K Pþ/e¯5û˜Šýé¶èñÒ!8W* ÖEjI<î¿nï~ùä¶ß?m?ýº©ä¶ü!..ém( ·7Ÿ Æ¢ÂôAÈ|]i䕺â·Ú ÛŠöNkˆø(V¯»ç\ôŠï G§¹ÃkÓÇîsïªO÷Yö‚™ñø–1G¸¾ácfÁÊkã€hGÇ€…«àî±¼t$îÅEZkDàù”wðD ë¼<ÙÐé©ÐM«Ùt“ÖØáSÀ%·­¹¼§˜° oÕ!ú5){VzÑá+<Á1‡ÔTËVKE¤Ô9ã+8)\"^4§fæ|2þãùÌÉg<Op7öXÊGÏ—•=åN5=HŒ}5|ñ\¾ðô!Áëàߪ ™ìÄ—‹²“]ðÈkΧ“w{ÙcN®‚¸ùéÈEFÁ@NrþL.y„2mà1¸Â~½Œr<™¸4È)B¯ê— -Šƒ6K’Èá]Z…Ke¼¯@5.{ ùü{ÍQ=JŽR¡ÔäSh¯ƒ©@u†ñÂç/;5;éEHFj²G8yL{„»dÜ{ƒˆÁOg~Ž Ý²†nܳ ÁkÏ×Ìì T*ÜÂG¬v‡w:"Ù†—#fâ˜È:J¨Ð B+Ä1/<†ŸÌ Ô Ç'é¦6È€£"PBxì;6Áõh‹T öµ4Úb1G'‹9XŒù‡9|pˆø”×xpÐùgP­„óEÇèd€PQ莧{0æø¤àV çk3 $wn>IèœÅbO N—Êks|²ˆ¢ú?±8‘øß PzFÀ+ÃÛ]bÀ…âºLÏÁxÁÛû.S¸pF B¤ÚHjC.NS&Ñ7ý!@qˆ˜f@æ ™k›6çãRZ™ÈgƒàÔÉ+2h^€ˆgF@EÖ £3ç 5qåjú¬6ÔÜm”"oú=A‘ñEFµGÕ€ÚÑõ‹”ˆ—¢H‹}†Hgéj>Ù^Ž=ˆð9|óƒæðdºfP3ñuS¡]òú™U$µ~ÐQ»ñ=P€ûM¯*»…ôË«Î~ã5ÅkꛆdvÕGOyò:œâ mmìMS²©1$ ,ñã5œ­mQQ[¹^×ðgCZZÛìÀÙÒiÐg¬ö§°2нøi9l¦ïaßYu é",ŸH6+jØ®quøKý·0#Ž#z)–‹ ªúІ >ápU<¿§  ÷ôxaJ@áEm—ió¨0Ñ€ü¦‹W)AtF’ªvŽMíó´ù…gj™Ègƒà©:p0½CCü$ë'Pæ ÐLmjJÍã{Õ‘觤húT§¤h»œ¤i÷Z”íRò””µ»¤dIÊ"ê›\³–廨U\³Þí5O÷×sÈ’ìrR.Êg+(1Û/°U³bÄK†Ó–xs †T÷‰EzÙKP¨ÒMÔ»3ƒέ¹ Ýω £ª£-  s ôb2b¡š…¹£›oººÔ¶ÆcOÇ×Óäêo7H­›ý±Å®îôiÍîc|pë_Ÿ¸¿£GL{fÁô§Ã‡<šß@Ò)€„¿@Jtlù:# +%£œp*º™’'2Rrƒié)f‘dS2Ôü+'ÃRWR†-q¥à7­HJJ6)OdæàÉôŠ#ÑÓàóŒ ‰>$+„Ў͆ Þ„Äkk+„ ã«ç$—¸BìTê !Æ!d &„DÕÈ5k]jeŸy!¬à‚Q¼ÄDØ6¦ô7Ñ.fE Þ ´£"°ó9ŠðáGâc,ÞË~––™<ž§¡5]9•ûX¯.Û4vEoÖTrP˜á$Eºœ˜†î™×òf—̲4rÔ¶‰X$â‹_3¸s…hVxÜAäÅàBññ  l9ð´—{Š,LHVèÝ|ñºRÕzµ{®ä´Ž—ÈAËkL?ÎëãëÁ:@Ò!~„x98Ú—Ø*„y’–²¹_NìO 1®AÕwÖGÐk¸œ€?ßÐwÙ«ˆN?éÌŸ'½h»æàÑïŠÐûÓ}® GÃSù`éšOäì½1Á×è"1çÍç>(’Omíuó)Ø*z~ spîÏÿºç›Ãs{L`áþ²ã“MéUÛ¹†'¨+åôšÂŸ‚ôÊÿ%‰F=ԿѤ¯1>³|£›¼&ÐskÜâÔÅ€”mæÓJ\0}^y«q÷lÒVE²uÑd­ )jò»#CU¶yéd‡2mZq¦+X¾Ù‚ÀhSŸìÜ*wáâuŒöT€ø‘©`&¿j]cö<5€•¦ À³p¹°ê\n—ªÉ¤SÚL'J~ež»ÙÅË“žx÷²¾ÌjCµÍ°©‰ïšWf¯~P5æ³¼„nX¿£à{Õ/ž~þ™~ñ/–{¨ñqàxÖ‹7ýâ1aõ‹"¸² «_´ûEÚI«áÞ/ÒZþý"$ûEnÒüêi—äM¿ÈàòB>d´‡‹éRá'.Ëüà¾à:eÊGícÕÄž© Ú= t ÑŽ£?ì"2:jˆ¦Ô8Edí®¢Y2²Ÿ@—l«7£Íc97‘2¤Fï׃Œ¢žÚ­ Šï*çbäD¤fûM<É“¶oí´+¯ÍÐên±h/{‰J|°ñM{F1M£°Ù-¶k´?ÚE¯GÛB.(­®¶‘@jÙŽ÷ q|¾ìÞÚY„½Ÿ]±Ún £% ã‹_ÿü|‚sï(ŽZþ?%.ü$”ÌÔ{L˜¹—ATùÉw!=ûҾ闦xoò/×l£—d¦]üê i'Ó'ò ÄžL^È‘sÓ+r„ŽHyø „K¢ñkÆÚ)ÛX$ÛX;ÚXÛFqÄ’ÈŠNV0‰¨ŽkZÁÄØ#˜ ă¨*¹f[‰P;)VÖ¬ÂB]ÂçIb[¶ .ýQbn6˜É6˜À®Å(>ìiϬ)c±ê~±X/{ÅÔìôODhüix‹oÒ t©ÛF/á%4§/G)ø.6†Bx»ë-Š&:–³UO3æß#U£ÝÜ‘ÀœñØN•„Ú&haÁ"šª™›#¤ mJ Unîž­cGp/ÿe½jråÌmàÞ§è ØÑ/%mäYdö½˜YéÔR÷”‡ÐKi‡¶4ð±Ð1Ñí¾_–Ƈ^P¢r½Ìê3áS7hZ+l|,8??˜<¿xKìýá@ò}c瀎ÿæç÷ ž7‡ ]Ii· ?Â!ñþ©‹äŸdh·òÎ"V”׸ÕdêÑôÛEùXfU&®š‚Z• sè®,Ó9q•en1b´ªKÜŠ«Ê­€uJweùXv6?ß ›7ðI0Þ߆8ŒH #È q‰žI ;.Ç$À♸ÜL‹JëÍ$Àì6I^L²,ŽIœE3²èKX²û»‰„Ê,¹¤çA<‘àÜžXžzUâhc^^÷D‚' âÈ 8uñ»òÕC;~­¨0·>D2ûHäø,ôlîØ „Ñ@‰teæÙ4vê©e5–7ææð5º-s>B3…çxéŒ\ÛËÄýêðü®²zH‡×c°³6(_mF5%U"L¾g{Z-í½Øï[eøâ\x #(RzAÿ3,ß ìÁQÒq³%eª£ÏzÊDIWõ±«ªß–Êž÷™-jªzq,ÛÒ”sãÕ¹ÕáÆAÞå Gœ¯ÿ=ç„ÌÛ±@Jfl†F‘ˆ[†¢þÌãiðØÞ|×îhäËãmY§¢ˆDf¶ö‰Ç_g“  ’ä(Pûð?ÝmÆ$Å0ŠnrUògþJgK xlDñìG€"xô@ªgO9ÇÑcŸõè«Ãw|0þ@=̶ß^FƒjŸ¹ï÷ßI"„nÍùÞjÒNÓ¯õû¶¥zËÞéÓ¥0šVÎu¢…ïlü'º™b²É¦Lc[íyZ„]Vóü’‡ª²Y£Fôs ˆ­'·Îû $¢óp'¨ƒ*úÇN‘ZÕ²ƒ…ó`>m 2÷DUÇ¿ÿüªTQ„¼œÓu%>Ò·¢Åû £pV-Ö œ±&Ñ.K«jÀÿ¸#Öû=i”ÐÐîBÝ9Ä‹qè—TíAÂQ±½Ü8£æ„Y–kþva› hKq®b>èüËfm¨÷=lÔ<ȸÙZ_®Á¹°Ç }†½¿†x;¡1w|Ð)lj=j>°Nÿ køx…ë]\ûkyA„VÑb¶|j‘d-Ÿˆ)N>ÑÂ_;¡šê°a åñL(³XBËŒM]³Yä²¢ŸÐ¦e¬Œ«ª±š~¸“ƒ8ç슗Õkv ÅG Õ3¤Å­9ƒõÚ•ÊBŽ[+*Ìë}JµÔ/ÞCü¥´ã[ëh[è2^šŠåc)pˆxèíàîA;\1÷bø©{4-gÆXx®ppTÎ?(…ö8 Pòø-&~~9NìÛɵÀ}ŠçM&)›ªü8™ÄWøWè¤^t’’N çÊ;X}ÞãVž©DspÕgo`&®±X&Ρ» ­B6D«ÐÜcÄh˜¸W [ý”î*ô±ì‚l޾Œ=ðM8%`[â8|RFŽOˆKô„K÷„往 p¹ Û8¶xÅáE(ÛrÅ,+5¹f·Äª7ŸP§%—û<‡çœÛóËS/K{ÌëëžOðhAG§.~W>|hæÖŽ‹í´aÏ'QÛ©8Ñ„àï-’moYËÆø&¹©`¼Ó[§°Çôó/™"Â4¦Þû„øäãràô gt{p,Ë…»O°áíAdïB=³\xk"»ÏôÉØ mŸp™¯à¶_ö{œߟÿÞ½T¼»»ÿ»A8Ãæ@Iдõsö¸¹€¶%åú>t0Ò`Ø@]@?+GA{™²Ç(]´ª†Òä6ä<€½-±Þ;¡È Jþ0”:y ƒÅ“LØ—ƒ„)Ÿ_:’)3|Cb—ðq|ÅìÑç%ÔÛÛ1Nù5PÞ€Òþ|ŒéÀRk -  t 9FFˆou—ôt0HšÞå®ã5‰Â ³ƒRÆœ®Ü~Kêý1p·¦Uv+¢»ñêÓô,¨°Á^uyž’ùyl6D êŇƒ?ˆS<¾K²ÅøllãÖV|T•3Ó‘ýäÓK‡xˆWõÝ)÷¾/<ý´ú¿~þˆúÿÉr‘nEYÙ%Kròß&Ì`$d¼ .¹q¥þbaí"®,'²âœæxFæ>õ ¦?-5‹›PöÈ%â†SlüTâÉr,ÇÒqÂÔÕ²]}·ìDáWAâ«%'³DÜØØéÂË&þõU²#YnïõùÙ#JÔv5à0|˜¹0=‡jÆÿ8‚Úør´á“Ñ@×#SKH"ƒÁµ†¥=-ž¢=adm­É¥=±í¢)Mwy{$Ñöì,òž¹gìi‡/ílýêˆnÚuæƒßN¡m§O-Z].ñ®J©.›èiÅÏI—ì¤{w{òݤ ñ1ONIŒn3ù/NÿKdÏ8»´4?œG­U€YÛÐ h¹¢ô¶íOÛ#÷r1 Ä\`™c‡Ïï¡Ä: ?«ßbØŸÄqP®§¸ê¨„ Õˆÿw:Q\é :ÙµwØÅ—’@StÕ×{X~i§Øwý¥'p˜«vɻӮ1ïK;çcs¨$W„gVÝõɱ¹C™!ñÑ“ÒauñÍ»¦‹gxŠgØêÙDù´êÙžÐäЉrf>tâìI'ËsèÄyæ¦I;wa'©'µ©ÂR;©Ïch?ÔÛÓËx-ÝÓ <ÅÓ ìVEñYÝŽyhÅ|Ì—ZЂm 嵐ŒYƒÄÞ]GV%ôW–.±ƒ¥­Rë}$ÇÞ‰ƒ ÿúˆèZ£1ÂÞ훓u5Ðsˆ=û&wfT´ þÚŽ{Ä.­M €ÞÁÁ8wOøäÕv’3Ä1˜ _ÎPÂÃËYع¢Z@pƒ³ã›ç¡ëÑdˆÔ=ÿ#õ˹¥u£ÿÅnÁà’ME0â7!Æ=`ç¥XØÉ“Ï·;Vz¼®Çû¼Üx=Žý&¯ï7¤×÷»N\¨¼ƒþ> ÇE査Héh÷x‘5#dÎçÞt_ãûuÞ¿éϾÄYãu÷çw?…ÂÜ(ýŽfŸ“1›Æ¢(évô$#+Çç gØ mÊWŽìªåí˜}gÈu¾Hô{H8óߦP Ò0{X( `¹{7®´eàJÙ¨ ™€Ú¿ÍÈÏÂÊ¢_zªnúb*äb¹´<ÊB›Geï(Æ’Ë{´HXØØ´åQwîÛÙOhEPS°‹ šE„"b i!ë猱ÑÍí›J´Ó(Jð]о…|£ò,6chÆ[˜‚ 8“³#òqõÈQD4ŠZç”ß? I¿ÅrAG:(æÏÅrLkü°~Þ îž)0!Œñâ‘”õî"ÖïC›”þpÉ¡Ø6ŒŠbÀ(ó7Q/8²ˆÇ³ìHF‰Œ!¿rl ìxCü+ (F¿ Ò,¦®ÙËÞa q²È˜¿ƒ˜ú¸h€Ä’CªÒòàQ¦ì¨jvbŒÀaØ‚ã}Z¼ÕBO³K ÏìeC;©n›3²õËóå<Åp|9¬ÏdCÖ9+µôèÑ3ÆìЇ]Åì˜ÇïEâÄ""Ã8B­31ÛÎÏÒ6~ÇuZjh­,äbÆ…k+½Íâ?f˜Çj™Q÷öTpâØDIåÜ¥ŽMy Øøž0íÚá!ŒU†Mq°ìñ,öpÓóe…,>sð7Š[;_»âñ“:\íw»œì±yÔ‚2{Sh©afçˆO$I(mµÂ¶öÁ¶¡ºþ ìK“Ù@n3XV “mél È®—A[qLMáâøÈIÆGÒ2ÏòªßÛ%ž•l_GV­3RÉŠ/\t`Ðvñ°ôßhfÖK˜ö°c6ô§M:<‰‰Mß(Rî$³YF–ýiD˜ Óóå<¡1›gA}öìªT—ñÑûI*Š©ÖNRÑNÕ'<©»¤‚C:I…ú:3yäìÊ\Z9Uü®™SΞ9µ<'§¶gÆ&׬rb—’*‰n¢jõÄ!°óv-—œÂmå˜}NUë Ý5U~ÖT+knS<½K`ëå`# ÁÄx¦¼ŸA¹:ÃÜêÂ#3uÁÚ2?.žÊÇbj¤6 mÖ§-oѶ~ž»í¹ÇæêŸÞ€ò,0kÀÚ`˜œ0¶_?pcúþç•EÐæ&± ó’Eòa‘üs,’¬¸ÏŸfùÙ$CÐ å„g“æjô°ktžkí=¬Ñ´M¿ÍM[jt5š«v6[³FÓ®VõF¦Å×h f9ºjôñ¬Š|°>{ypVÎòè‘3†¶®ØFš}614IŠtB{u²IB¥:¡cÑé„vN§D{{ÐÉöl:9ž‘—¶æI[š]|…&(©§BÛ1ä0í’™ð®T|¦gqM‘`²{/ÉwUÏ&öòᇠõ¶=›`†? Êa‘n~wé–ÐõÖ\™:¸P—nЯlo¬/a†Â-X#Ö’{£ªALC‹PB}­ñwa«Z8¦vhÃ↌´pÉŽò¥ ”‰<Ä>Ùä²= ‰* ª.wË×é¹g´uºÂ¨Ðç,Õ` Ú™k¡ */vÈêX_íŒ&¸€\V‹Ûxy6¸± »:t—xXÒƒ• ¶¡oˆa0H@ƒØ3ï&á–REåa5W‹ÖRøQø 9µÜDt ¨«ù¡_m–G-ð¹ñïîì13d’¯H ¤ÈB;íiº´§1ó&yQ¨-±/Ù›K‚¨¨b¨ÁªUΨ D0MmíàTQzDóå>Ã@¨]¢Ø$“"ÔN¡^2z{äX’Ÿ„ÓpçX˜p*’•MžÀ’ ñ´‰×PªñÎaTFi˜ˆ– RsZ¯ßnLBÄtM%RAéŒø7°cÆîx ˆ°Ñ`){¹Öá™à’ß¾³ èú¸FÁ«\¥ÿvCP=°»x°AC)#îÞÀFî@ %äÖ¤…ûö šˆÉÐ̘Áˆ8#ñìlÓPÐ{9”鑤sáÝ• ’ÀbB´‹%X(÷(¦*œÄv£¦<Ó¸ý¬>ÜQ-Àb˜óûGNè´˜P0Åq#6˜íZ`æ¤fØ`r¤‚?`æ” ˜LÙÿsl(^-=Þ‹:({Ä¢ÈG‹‘s/ ,¥dA‡ÅµƒÅX`PóMM<€I̱Á”À"®W0í†Ò=Pw ô‹^‡" yŒ×µ€™BO߯ÓSw'DÉ–ôâB^ŽŽ©µa&êD]`,5z¨ˆ2i.k f3dŽÙÈ„V¶)8ºJßž/ç –žgo2ð¾ruLÌ>òèJc­á¢#ZA £Gs,»@h Òôª&8B›kt,¦%¡¬Û>PLnLB_âpuvnpP”ÁÁEɘd.ð²Åí×ÕÕþÃ}•cÉn#A_§ÐªvçiCNË™û‘@.d±¾þ˜#§»2ˆ%äѧL;C¥ ÝL6ïëmÁ–ú€ƒ«ãg\@îëL r*3lÉxhéÔ6G˜†çÌË›½0Ÿ¼\öfTHj¨5v‚ð”‹C9w ÇBð$',Ì;Óà-¸ÜER¦´õ»½t (ö¿A)Ð]×2?ÜF~ ³!&Ð]Ô¢cŠF„Ï´joK¢T° té£Ñw¶k²7ô*øï )›r»$_ŸÒ0޲*ŒŽÐhf…¡p$„ûºB °W#×°ÁôvÈk¤)H: ¤0¨ŸŽÞ$-4MöÓC€”8 ËõáÐO„ ;SH~€,ß: X›w¨ô•²=7Ð[Öå9H„ïb9H ij3Á4ð3æ`¹™åô$ÐVn¯¼+ ò¼@Œ`YXøüŽqnN ò€–Q=UäPãôdâ±Gí1y³Æäó´”ã,4‹4⺈£^®{ŸÂÜ? ;A<»ÜîáOA‚ê®éÀPcW›’¤‡ü¡,ú Oml»€žâÃéÀ·ì”Ò ctk[ŵӷ»‡V'"ÅW‘ø¾Ó0ɼ±1꯮r?Ó÷¥€2öÛ‡r„DÔzÔÚ­Í7Û‹P¹üþ_ R¹¤r+Hõ Òýí«j;( ØcƒlºŽÈD6@3¯9‹ ŒŽø<ÈØ×A¦¢l€¨ŽõúÑÑËÎØÀ`I« `ß½}‚´ê $ÒYÆb6ˆÀLÝ >ÎPˆˆäÚ½‘­‚º ÑhýKd¨Õ!"5M¯Crt×·U‡.ÀªCyº@ÌbY¸‡:DgÒyᄎꅜ)rÞhÉ5Ö!¾CMg,D„Ϊßna]¾wé—½«Êlÿ4fìxâ ~£àÈò‘éœæ^’ü)}·p—ìCüg~á%¸—YVzUˆÁWELpÆ~™¢}~vЏ™KÕöÙƒW•3ú ÷ăá¼¹x?Ãݤšpà % ¯>…ÕO0¾Ê\µk¢t2­3]IÐŒù6ü[YÜÆ&¿¬›¥AŒ‡ýíàái^¹ÚI6‚vxâUårRŸGjv‚l¼ åÎVŸ€¬@Y@]»à²©¹çÉÀ°khmG£ÈË?1Ì5Í>£4 [±‡–ã!_ŒQ8Jå úÍ¿’er Ô…þŠH”I‡šV—Îʹ…^|î„~w' Ù^èŒí„}6/F•Ž¢^¬ñ'ÀÇÚ/.B?»¸ó~Õ°ïæ‰áý*úÅ‹‚p®ˆób1?l€ù¾öÑ ûl^°µù+/øêH­V‡h4̲vPÈg4—!WÁjæÜʉŽÙnÈ`ÿ€ &6ŽE³p ˜í[ÖÄVù̉ûoÈ¿“õv6'àEÑRù Yåè;À»ª{IÌ éÕ±sY6›#ìuxXëö¤¢8RÖˆ\ºØ9'2àLkûØ·äÄÀóÐ1r+Ú¤+´«\ÛÍfRQ/g?)¨o²&ü£Ý@©d×.æ(m»YÐO‰àAúÁ§=ŽiözÄ!ëþÆYéÆ5IgÆeW¡×àÖ sÛmìÞÉrGHårî÷À/äY}ñAù VÈ‹—b‡þfËPÔ?ððµ½”ºVáp·Ñ‹ì3ŒÑäcF‘3 ÷ÅçÅ!… Hœ%þèDZ~4<½rÈ =ÉØ‰‰EzJU6W™YvIJfàyãh¹÷ Âÿðˆº–û`C„=j{I ÝS€†ˆ¥™Ç²+pîÉ Rû[ •”ˆüAS%þÔÓ7À2i ŸóŽ„1bk>2·`¯£Xn™%äì^CnÁ®ù’[@ÒrkRß,·‚½sKÏ­€HbÍœBnqבc˜ˆ%Kžd„äÂý‘b†äÂuã’\|—’‹ÏÖš|ØtI.>ýÉ¥¡¡~Û“+“ðOD!^Qã\:~B5’¶ó÷9)%ÉÀ¥Y"î{[Úë¶¿e“žá#ö¦¶‚ÛÜãûˆ< ­›zÍöØö÷æE¡^®®ç¸ TÔ)4«Rþ•¥¤Õû|+-Ú³ý»6m2‰´[òjÚaÓ.é6¹›6ÍZ6í&=yõlÚ¥Ö‘i§Z6º4Ï -ÛíÐæç¢e„³Òw¤za!éa9ÐÂ"v«¡°-:«Ú#5+,´ë‘Ca! ¬……vjÍ K´›ÍÄ KD˜ ²æÌ–À´ÉÒ<Åůã°" '©ÍŠOº ïël¡®ðò,a Þ-°$ž{ö˦T"^W,0Ôí`{]IÔ;&™™ÿüÏ_&JË(~µE!o+A[p¶…Ú¢€#j Hݯ6©-‚Ú"8aÈöâY[/¶¶P/>k‹OaŸÍ‡­®7ñ®-‚[[\®âY[˜Ÿ´…û±ÅÃ'7ì³y±µÅ/¼ØÊ™ðQ[@ ¯GmA$ÕvAPE§k ÚÓ¤­ž‚´ P³K Ú%»´PÛ¥…".-`©%ñ𪢴¸!àŠ¨´»¹´ûˆÒBéÒ¢àbSwiAϤf“´ûÙ/ölQZðEj‰Ò‚HÏ.-hÓ¤ÍcFiQØ ºK Ú¹¹´PÛ¥…".-|Î’¾æ’q×%-Ü- uÛm죴XïñN6ý¾äÕ“´Ðˆu!QÕ-õRšK Úiº´(¹Ò‚À8\ZÐî‡K µ]Z(ò†5‚’x,“¶´¸!aŒJ Ë­--Bnmia¹µ¥…åÖ–!·¶´°ÜÚ2Ár+Ø;·ñÜ ˆé–Ä[Z„0ßÒÂaK K”--Brmi’kK Ÿ³¤…­¹¥EØuK óKCCý¶'—rx}…Ò¢€†G”¥"b‹K Ú-¹´PÛ¥…Ø›Ú j¯=\ZéÕ¥í:JØcÙ.-âõ{­p=Çiñ¯¨,JÀï¥å.-¼g+?ôžíÈêÙ*-VÏ^ÊÂ;¶* mÙª,´!oeá[u„wlC¬A››ˆVU7¤z]Qe¡uE•…×UZWTYh]QeáuE•…ÖU ZW¢=[T^W"ÂüTe¡ù«ÊÂ3\•…ÖUZ#TYx]ÙÊÂËŠ* Ÿ²”…/¹”EÜt) sËâb»ìPV˜STžb'ˆ VA‚ž †G*#pïÌ¡rE®¾ð09Ÿ+W8öÕ "Î3™­aÀJ€ØT® Dð[ü¶­]h4R­V®¥À«$ ²…d$Þ‹Y!CxîUUÊÛM·ÂûÅÌš6ñ” )šž&!Ÿc¸6T†jÏÛH½Ãöu²>Ø@üEýš~Cz›¿¿WßkΔžD"°OGÅ…žBo7»Vº_Õý./·{Ç»%{|º[=s A¢öÇ[¼GâºÅþ[·˜Ën±—ËÙýÒüÿÑ‘÷çüÝWK<…N’a—<̨¦¨fUD`OGÌÄ‚7%¹@‡Z¹ØÑyòÊÅõs‡1»ê˜=fJrìÙ¯†ãt‰Eˆ :oC’Ïÿ˜9•§ô½ÂA}^(DÇX«ªËÈ·éß6µ~/?9SsN{¢‹—ü°nâ¸"Lm¬Ö~‚•óŒ©ùC<Üïàõ¶§}V^p¡#,ô¶Õ›7·3Qglh Qˆ|‘—#=BØìs•Æ ÂÖÑ7È !¯äþ 4½âÊ×Dwã€ê_„ãA0V( &wòˆ'íðò䔸^×/^ $›úÕœP`û ÃÕýlŒŠ-«y°Æ_˜PAlÏîÁ>› Gÿb²^ï¡'l€y1É~®×P/^°ÿ ÓQ/öuÿ«ÒÆÉ¤>¹áÌ dG9Ưüೃ,Η{ä|Åâb À—s=òøêóX¤/ç ‚ccÚ­/›tœvº¾ÚÒdXu©#,æìËÌ!°{°9¡n>±GHó¤U˜«(Oú/íU’ãZr÷u ]@å™™Û|à ÷¾w/ô½°ï8‚ÌO*}¸öJ"_A&‡`ž»j¯Ïš·FåxæKˆeEYH”«RƒbB9¦Iû81 F˜´/錴9N†¡+ªØÀYá/·µ¡NrDŸ?.šOë‘cN“˜"õÒbÔ½ÛD X)LŠ–¢ÙQ'©3Qº,Ñ^¤Ôºæ;cûs^,'w¸Óˆ—ñê¥;L+*æ#Ó*£|®ÔVÄ-¸Áz‰ü4LÅ3LEí5 S‡§ô"ï *û¿œ–B[Ô—9Ý%ë4UtšŠÍ¦)×ÈmšbÌ‚Õ9EUp^ý“qȧÀÊjåšZhkd¾°RkÍ\1–…#iÅLLîñ¤ 1¢ÜIÞ!sÈ \•_£NØD Mf%FÄvDl×C[´‡œò—V+‹hÓ<œ¦èõU³3IÐN%?kÒ8¹¹sYÉE9wŸ] 8É%$ñ$äÄ:É%AòI.é6¯­är²%×Rœär T)ã2䜺uÂêõ$ƒÚw®47Ù%|ÕgòXráQtþ\ðfÑ%_U.éÌwOr0­¸X˜|’+vÄ@’í„`áñæÚº’U‰Œ(U»ÝÒÍÝ(0%Š/DY_tÊ_zyêY1ï\,Ñnøúðš2l…€ Y:W˜üõq@œ µpµâëZWšY¬ùÏ­+Åÿ½Ö•òêJûãu%„@è/ue·ì³`µì‡m¸–}4Ö²)wײ)Kì®eS“›¬–M1VÙ ™—Žy€µlXŒ‘¬¹–½5»Ao¨ßhV!¯½=k΃ÞTfú̲B¹Kqe…š¶Z ê åJÊ6ë å’«+Ô:bÖ•ÐÿDv]ñr³ S±ëŠ×0GõHúÌa½´&—åJáÂØu@ 9M›þ ¾iÓYöj³®ðUÂ8ëñd9»ãP¶ÆõB>»C´¢b!>ò©*˜¿>2jf$¥Ù,¤§HDiÕ+úÚÈilÆè£Àùµv·¤D\„ž§œ=‚(ŒE‡˜Üþ…ûÂí·X!9ÅT‡föÝɶÓ7c¨­¹DþG¦ÿòëí/ÿ=ßþóûí¯¿ÞþfèQ ‡Î²TXáÏ‹3XP ‘±Wh4Ûå´p£MRC§·Îß°E%6ÑÕãY:ÈÊÙ(ݨFðÉ~ “gd…†!00*I‚a¨µ:;æü„‘â"]¹Gº<ý?kòg޳(Ý‘?›ˆ¼ô;Àl=>£/¡E·‘Ëhußüã5‡˜f¢ìcá/ àZt&vÒ’·–&9͹êI Œ ív›4åkÈÿ&]êÄ ©mÖ›þÇ(¬ZÇRØÃQ«&ÂØÜÝfIOãœò‚9ÔørlO•D«A)5¿îœ<†I¨Wxeí¾5èż2’„ÜþýÛ8Ì'\RЄÑAîÙ˜;˜¡péúŠûµETš8˜ÕìrçãIx¤ö¦[°¹sÞÅ#–Æéàs ¤}R-¶üó£È0çêÚbß8¶fâX;Œý}ÃÀ{Uöð Ã6\P4´Â\ßûbß(º…¾x#:{Á†ÑHãÕrÁQɾÈ޹f9 †^øô, gÈY°0¦~Š£娓ÓeãtM9‚Zƒc-à—¢oÝ­Õ#¼G¼*8‹0œ†˜,(Ž”[2:VtRÔ€Óµ+)'19b¤œÌ° ÷­y jÚÓÒo4x¡©© õª¨g‰Ê“¯uR Œ±ï#T§(›óQ–d|-À­” ›¤„2wÄ9;1EµŽ„…ÓË2ÒÜ`öóAåQ鉋ÐÕawÖhü*yD[„.ÚŠQÛ"h43öq]5ÎäøÐ7ŠÃmhÒû<v^AÔâ¿òÊÉ3¯–fç•ShòÄ\O óÎ!>Ê*êè4ó€ÓÇØƒEÉÑå|¥Õ`çRâÙ€ÇëÍW4òü¬'ÉašQ±1ygVéàÒé:`©A®M+ÇûêÕúÜÒÀBØŒýIžBü’bå‰&ƒ­s}Ÿ7îíK¶ ¾>¼¦bÂ9 ËØ7ö &Ûa­8 í„«_ך2:ˆå75¥žšRÿ”šÒþ¿5¥¢x¤_jÊîÔgÁêÔä”٭ÚkØ«)×Tw¯¦œzv½šš ñj½š·ô´1EIÙµj²1|«ÞšÝ˜7Ôo4«‚p—B½jâYCÙ• e—jØ1VI¡{Ù%¥2•èJ 5-—UR(ªu³¤xÙJÊÖ¬’âLO=ñTB¸´M%mÒwP+â.›>Ø,(tTMñ*Z=b˜îŸçÅYVÏ|ó(ÒŽ‰‰ØÉ» àP„ nŠHDµŽ'פ'Ð(!™AÔbîrÉÆHC?‹²l È×ÈÌÿ L¾‡M(Ÿ }Êpª1œú9Ѥ¡O]áu+¸éI“PÑ)'ÒQvG0`ʦ ¹ ín¤2»Çm ÎàÓ'$‘Aòj’µIÛ…”w» /x÷ ±ûŸ¬RÜíCq˜íÆÚ=èG¶ ®{(ãîÚìjï«y8­CC&)5_q•4M<œ*Ͱq$e>=ñ‰Öæ¶ܸ…‰ â…ÙY±zެ¼1Ž8„¤8@¢¸gwø¡R¥ ±,ŸÎ’±†–;‡é«åRe©ûdhC,²ˆkµÈ"WdÁR«‹,`äE‹,ÊZ¹" ‰WebE‹¯Ð-²^‘µ-Y΢.Ê%³˜ sÓQ½“ÃQ¶0`Á8\h|…n«…+´`¹Ù¡N»5ù®ù -Xd8^Û36o‡-´ZC˜GÇãÖ•Ñ"ùÛº’MWòëÊð?o]©Oº/a©—°ô[XòÓ•—IéYWN¾ÞŸ-_®}œË×΢ù¸µjù¸²Âµ|=úL;_¦‚•¯±io'}s¼|IÕ¥ëOn>4_-GAFÕ¢åÉ"Õ4…8ÓàÖÄk ,’Ä4¸d§)À)¯)£ y&*À½5‡—¨l‹‰Š³hpmï,x¹«\¢ÂÒ-¹ÜÊ“ˆ•!^PpW­e/(|àr5¬ ·ž4\‚ÂG'(Û)gÃ&(pdüýöU‹ƒŒi© ðÆª£gù*»nœß³.7»Šˆ«N…äY¾-_%í®b€n Õ"¶að‰„Š·¬ò•{±|mÖU„Ô= žÇù~xËâ±glçû¡Q“Êæ¦1'\,$A†â÷oã|?,ZÖk½o#:g€Ñ€¶¡¼n£Ý<øhÉñÐ1∜‡ˆF@}"âxœï‡G‡¤!š/róȸ#\â?`c)™"5;•ý=ªÍ‚BKˆõ²`·:{‚Þ‹biC±”¬¸ôº*ØùRE„z0–¢80¦m<+ä\˱|šeÝìçáùjÇn ”¦³@ΡۢxNq–îPu…UVµÓRf-_KÒMѤiéÝ!L8МÆdUtD˜G‹ŒýqáçË‚÷È1+I³Ô0›’&–¾v…Žw8ÂÜU¯k ±Hóì>™4ò씢¾×Ľ«®{LËì(bôsàkµ¹5ñ¦ñÞ•JZ¯í›·ažì[E¬¡ìרO™¿Xæ/šéáú+Ó÷¼Ó}Êþ'3{–ùÅaËüŒËüøÏe~Í:–ùáÊšñ%”•úõ ­©H÷W`•ÙU€éê*tÄrÙÙC Qx[èRÄ̉õØ50Ô"P íl°HÍÚG…¸²üb?@YYø±Êÿ~,ŸÎ‚G®» ž\_-'šXm+×Ë-µMXs4ÀˆSôƾ‹0Öø½œÄ‘}„ÁRsµ.©X„9¼"l[,œE=•k2lOfã“÷uÐ Ò-xX,ZØ•æ# ו“0*SÄž²ú½³$_Vüž|úqÊj»Æfí°Åëuzñ~m+êötM^LÜï *ÓÛì*–ýé;Ñ µ*kQ«Àg½?¨GgÄÚq/°áÜàñæ-5Ía.TÓm‹‰oFb8œç×^ pò=Y©&+õIFÆ þYiO²’.Y‘?++¨'co·¬dŸ¯Ï€“°YPòö,aËJ؃‘kù0Žáó5ªþ+c³ªÍb)›A¶>«ä³OÙÛbzSý†åH«mIÏ–dc´Oèb¢²ú'*¬‹v"/³bgɵEE[ñ¢2Š>÷`=Þ‡—¨l‹‰Š³hxrM _6/é pЊݥm=ˆ û#I^Sp[zRX¤¹)¸ØèW\êêöÄËçäXmÏØ¬ ›¨üôöï7éÔðGé:»WAí½«¡8xÃÈŽ_4"ZZ_ú1pys­c³h©ˆëOìù÷aÏðþõ =®q H £øÃaNÄoø8i¡ÂL½±RBÀÿõç÷¿üý—úþŸ_ÞÿöóûOë{g¸C¤ôIÏ6'×Ì1¥_÷“57ÒKX*¡¤®¨Ý „Éi|“oÄÒž¯âÅW¹ÿß²{CÒš20)(ÿ…\wMŒ‚É¿'Ô=Ž|â$Ï}Yú(ÿã†Ô—¸Øfý5Æ‘cÁTâ¹ðÎcá µ´¶Ÿá‰JPÂ'ã–^=•‚…c„¨±¶-¡!éªÞdF_J_ò¼[ÈZ%[ Éù‰%·#&q–¤9 FìòôÛÆ02bÍ9…©MãL¾K¸Ž)©“̼L7‡î6¬ÁP!Î,í¾I÷ÒUû¸»„ª÷úéÀ·¾`™ÐÙ/á»d‘cSCHÁÏ{ ZÃ| 2*Y 7Àßo_ß ®¹Âc%@¬.ªÖTjŒµÏMké_ßJd=Žp¢’$Þ*®„Š«M§œXwóë[¦è"x…é)#Â!¨A JLùç[Ñ´Ú.ÃXœ¯‡Å¶lküæp>o…Úá ão‚•Æ}ŽÁþz Œ2œÿ¾Gá|?–,㾆x“€ÓtÉFBÇ‹óù°¨ð]ÔKßeq¾…Õh¾YÜ$ðæÌ: hEP’Lý¨ºÒr Б~…Â]BÒT_;ôx²4äbÜ'¡dˆ€ÊŠÉâ¡‹²ž %ë÷Òš"Ö0Ä9ÈÁ8ÕÐòk[>¥®ˆ3¢¯t¤#­YË“3ŽE1Þ¸À…‡6qI‹ ßZ-؇˜œˆk¨ŠCš+ŠVÇ ‰ž³Zzânž#(Ɇ«^þœ¡ÔY±eåi–¬»bM4LÄ•‡î*#×.ž,iA%4O¢ˆâFÔš/‚0݆yyÅ úbù,¦OZ“ÛNß¼¥CèøÄ"ì14‹1kuJD6Eš[/1åù´:±õÝêð'ß(ÏÎÅôt˜®åFve¶5ìYÃÿGSê¥)ùOj ”"åÒô`iõƒPÁ-M;‹¦iàš›åiàœ£ÏÓ••PÙy{ ÍS+O7).O—Š›nÑåi³œ¬|˜¾ZŽŠTÆI|¶”dºB¼ó2u¥f}§+°t¯+ÀÒªé ðÎ7KW`INVã(&+YÙ“gÉkÓŠ…/pMÕ8‹¶â$€ñ²‚ƒz™yèuIë^V`éÎÂg ^Vø°ñÚT4{VË1kÃ&*l7XwÈ¢v@A´ÞG™ÁØ0TäàN¥o_ÊÌ-äÃYnLG‰ZÎ:nVgÔô§*SSR4¶?æÄÑÐUÒ‚ª—š"¢ó4Lõj˜lgÈùJµ(èÒï¬W»Ž%Iõû+ÆœAº³ù~¸+á`7BÏeÖ“¯ç<"oU÷ì œîÊ[Y‘‘'NœðÇ,kûËé°@évþϰ1¡b²uÝ`fuõ_ô7cò¼û«uø+ßÿA\’qçdOX‘º¼{fÅwº~ùoÞý_¢I|ðœšPB¼|‹‡îñ’ñûµ~ßúȗë«Éñ§¾»@Á©—ŽÖnëø.ON„¼ÀŸ‚QŸÈï.6Øpffk±Dôó½ÂÝ™¯=wçPŠý=XÓ ”ÑQ‚ûþ˜Þ9‡bØ¥®r‹nù«ÁgMìª6}~!­*Ñ ²Rå·53Ñ[è%L_ÅËî÷Ö7 ‚{uôJΛ‰Ÿ”²Æ»çkÏÛ Òˆ^@ˆ¡}ßá$©ÐíÍù¼üu܈sø ð—Ý}d6öÚÎh BãßcƒSþ´gïË5WÝõï9 ‰P&J¦2\QÌç/h©ôâÇ×—¤~sÿûõo/?¼æ?Pb¼þõ˜HÉ…˜A‰C°Õp§×//KJëÓë?õeö—¿ûøÛ¯ŸíãŸþøó§ß¿þF¯Êyõã×Oëã_þýó?~Ò»_¿Þ… kwijaœe™?… Ø4w¸™Ð¾),6Ÿ©'0{ùyƒÍ½¢òhÌ ¥GÑ’ã“‹”})hª_1^oNïí¡& âz“U0Å¿R$RתŸÒªuÏD7æ¦Ê¿»èÃnµš×ô”@\£HèÒâ¯TaðþŽ{ˆú®• üL܃SÐÜèÀÒ_j(\¥ò—‚SI+Ÿ×fKçÞ™²üÅÔ®Ž€šek 5`Šá÷ÁçÕ†vQšÃ{)¶Š)Šõ1-ߨ2sšŽûò‰é‚î,P?1˜!yybÌ-äxª¦Æ5¦¦lÆ@B—7 ‚"‡3²>LÛ \Bœ0÷!JdÊÁ ^u·˜¡­9†Å (CYìµ+ˆÍ—‰4uÝ­²Z9O I{Ö¾bLY̓7îG(ß ¸VeÝê¾ðG9/D»Ip#ÔNËg'03ôÛ´8†*J½ª\”ê}¥ðš½êäÄoÕ/\O”•éUŠmm|ò—½ÁV^!Ýá m ÞK‘ëSžBꜜ8¿ìµ@ƒÇØ‚ÝþÌ/Ìç( nIÇ¢'%&Ëd›MùÞXš¾s6¨ÀàVT.Ìãòg¼ ¨  \;D¶îŽÇ©_úX±ÏaM+*XÈɪ;#CÁ!*èG#ç!èL*Iö;µX8ÎPÿ¢&‰õU€³E¨Õ3뫜8ÔrŒóëM—Ë[Õ?â@ß–e±LZ1úÿ2-MFLñžùÌ`O4b_%æVäœ îÖq ¾…ó¸rV5Àm`?èÌeÎç¥S»ê0ñÞòÊvLI RUuùª+*U,pŒh *’.¡æ°kðNŒI¯¹òÅ9©Ðd’ºžUH+èA†ãs>—V‚ÝpÄ4¶ESSÎóC¢,à¹p3Ê[tf}ˆh‰*á*¡dŠ2†­¦1Eçå¶iÁ¡Íy—_Ë]¢”´1oQ)×Ì3ØHêf¶ÁÍ7C<&b]|gbmUžÖu6Þ,öÁÓ¦ÝI‹ñ,l,V\}f^†ñz•°Î˜Ãô·ª".ÒÔvÙEÁj-Ì0U÷D~\Š|›¬çfS3ë Öqš4ÅK€$j Õâ@¡K ‰HÙU£0ðùòì3U™p£«Â¡‹ãÂ&#vÖ®6ikH]\YU$¶HbHC‹ÉqÇŒReë©íDú —“oš±—¶•hÐÌŒ}ÕŸE »yÛ}\Ý:¹+ç)Úr =ÊmD‡÷9Ñ,H㩪?l6옠-åÚU¢Ñ¥2è•EÆöÍ *”&N-¥âŠvV ‹ÍweºH4Eälª Yw/h‰Ö‰Î‡#w‚ÎžØ €½³¹Ô¦i‚¦ˆ­À%ÔI½²ÉAs’Ø­0pÔqå¹…}]™=aHKDænÕ¼QÜP[´7.v’E&ãFŒ#X ex!²ó( ºX´uÌB›ŸK6¹VÌ¥¹)¿Ã[¨UI´©79çG8ÒYŠIÀ÷xNLˇ¾•gâ,µÊgA0©¡VÑate+PvM¡©i@÷wUoò埽6û»®p­¤)$IbÅÌqЬúqg¯N^zóÏ­„Â0'L©)zµ“£¾i¨L!óUÑ,ßJïêlÖdÕ ¢Ísiœ'ú‰+ïáÆÚ<´rWÞ|kÚ«ÖU¹ZYµ§b3 |™íB·2™fŠ—Ç­§Kù6ñ³ z"*Õ¤=ë<’ŽŽYÇl à0ûô€Aã·;ÔݲË?ž:‹•¢wÓ;µO,¹R¹÷ÜBÕ2”EÑîÂzIo+§Ûù8ÙuÄèîtS'­BoSëC+³9c1«•2ŒTD e 1NS³¶ƒ­^hnQ?Ýéì*­âþ7Ç:pö~Í7ηzȲs婸¬öÜiBÂJ#XRû¹?HéÄÁQ?[5q±ðê6§.S$§¦uêŠ×#”‰BMhϯ›DE<Ïb‰>¸Íj¶å|i9X2zTc‰ø«E­Þ`" p—ðÞêQ¾ôæ©kÔã«óÖ$ß’ã«v³f¾d+G'cQï¦ÑBùT T>t[ã:ª6æÕ@kŠ˜ÇM™[ÊC3úœùr*åq¦µ3…¥Cõ-Ô¾»LYoª»:+s+– Ñt ±g4€³`4£y›'®h›v)p¥8Ç?*Š¥¡³SPxÌLMhš‚gb#®ÂâœE|}uõ#ÇZümòy•E’]‘lW¹òp ö©C²&!?"d9”oU‰RûÄô‘9£\¬¿w9’Cœ"ŒŠÂeUš)¨^9|ŽÐ ØÒLñ”“+ 3ÐÈлžbkÝÒæ†m’¤î|8|Ä[h…º Ýl«¦8ª‘W¹‚sS^š‘ºdDRŽjYNÇŸ_þþm'a®©°s¾Þ´¥ tXWíÍä·_bKZNƒÙöÚßfÅí·Yõ—¡Ë¨ç)Ïž²j­÷Ѳò!0æ±[X33lñÆ Ù%fòæ6ÓÊu 0'‘<øÍã)[³Z5%D¯gšÆ`µá/ê .Ò‹Ôü5Jõ²D˜Ñ>$0~#ÈS•ÐN, Y‰ìJƒ»8\È—N©¼Ï_ÜÄ¿›róxN_,›³×ò™AšTLdÁs¤™aqcuk¶Zç\øn¾Àt³5>&¤‹^šf—²m¨?Ž‘sSH-‘ ‡Mnü°uƒ9óÙ¦j¶á4¹báÂß®3ª.¦q—ÁE©ð%;E›´¿¥\WiÒõØ ‚]|l+¢ˆÇ‘eh‰K¶üÖ4$rZÉë}kSZÜÄÎKª)šSf¸äg•ÖÍu˘é&¤ÊM(«ý<(1]U™u˜9”Ðg‚*I7ÒãµÐ^Ïü¬”8.iøbG:6z{ŽÖŸ'ŽvñíòœGFÛƒU2Ã| >Yü[4ÄHïæãÈ#Eýàh+Îc¶™j1>ô¥{ ¬BÓŒrÓÒp8ŸÅÄpª‚(Oš7Ä0]œÜL:¥9ùðÑß*þ%⦲y„ïõ â ÊzÃß ÷ºø<[bWéýtehp[Ã. ›qkxü…ËÑ‹Ž…ÝZÌHÁTd¦®kÍ>E*´›ë`õÞô•Z–pôKÔ?û›]•ÛViGD.”æ ?+zgÿ”ÍUDµîåY²ªà]–Á¡ÒQs‹ƒS˜Ûª¤Ò$7©›a›¤5ŸÕu…û·†²Ü½O¹j®Œÿ°].9rä0Ý÷)z=@ D}Hés³ëÅÜ3Œ*« xc;]J¥>dÄ‹| Åaî‚<Z?8&4?¼Â#ѱ_]‚oYaÏ¡Q[`uKyl_ÛNùn×{|¿#BÔ³ðž~R˜f,P ƒ‰zðÖ‰%X§åŒ¢û¾é úšMêòP|8´)«qÝé4þ,Y#>.brÈæÐ[m]ݾf÷üà"´ M×Ûß¡tòwç*@Ò1-/£=»$|3FAhS˜YñT餑o˜N­œ³€ðc Íà¤p2lú4ä ÂuŠ4èè§Ù Ah q&jrk\I¬vêFÔtÂI°Ç[‹Š·]ðÎT@DxJy‹rÊÉÇ)V‡Â©‡˜qÆ#¦Œ(\û%Jc—b»ïóu`±¦4}“¥ü Ú®ŒvHqOÅÒÝk»éLéÝ!ñ•’šÑžzAAÊQå5€6+"';LÀF ®6B?Ð;GåN L›âVÈÝð*¨C%ìü)‚ZæM”ù  s«Ð[8„(—ž"W‚•zîÔ^ 熙Gg££@é¨><ßø;ÖxKjäBs)êËÿ.!ÞWÐ1K¢¼¼õY»ñ èù‡5‘5íY üîÈcŠìO%›Èw¿%Öñ‹Ú³ã•åv»SÓ©d‹´çÖ"—ªCj˜aÎ:uÔŸÓi8'±¤&YáÏa«gÝ%A?ÖÕ1Ž+j” tÖÄ é2e¢ƒ¡œbÛ(HDþBª@ŒSªü Õ-®c‘vú e¤ñ¯gqøM®ˆhŽ/C%¢/®¢Fu΂Xæº%Yš­ù–H¿™‚sÏý¹W£«ŽZ-ÑûÓÈYn£”ÍhýAoß}H>ÿiçsÔ–ÌÜŒÿí±¯¢F–ßmÐÀZ¸Ü%ràѹ``^û.¡i¹´ ö²àP¡KC¹DVj)WG•η<LØ¿«R@"±qŠŸ|rE´½ ùw]ñÍNh5ÚU`ê¥ñ6 °^b…°át¿&uÖ©wxêP¾EŰÞx©«—“ÉÞ`ž°¢Ý4þ'Ž^ÇGTF¼Ìø˜èª½³6¤v­ÊCر`1+ʆ=ÖÞi¡ª˜¶®qÁtϧéOËáë}R9ð¿¦2ÄÂ$}ñi’û&~CW.F‹èY9…*x$.äëAñÈ?_PWTÀ:ÅR(–`’ÂŒ‚èÐ5 'JÂ@ãY}“r9ø@UÐŽ?´s¦ÈºrXg{i‡–Í»‰`ˆÔ°å¡Ýy²ÞõqR÷£fL×ÍÇ-ùÌ¿ð Í›:y(5cÓoZ#Jäd‡Ä÷óKo¥…ú 8  ®ê•Ͳ,þX¹ü↘è±m~íÇæ¥qÔÓ.'µŽFÝ{T=_²–?.šx6Õ¦zÅ`¡Î‡3W9H`˜hô[±8Rã¨0|Vû¥®¾„.Pç99™ Ka™Œ0º‹IKABÁZçI›Ì °úõ¥»ÎK¦”Жx±³ñ®eŒí£b ïà‡®C3)â-µAÚ1oÏI–q®i-Œ7_g¾Î‰÷âFªß9õÜ®ƒ`{Lt6–€4ˆ4ªáM†ýðäêäKÇïxà÷€èlÑ /áòW¸:©Þ_•>gŸ4¸TfçÖsÐÀ÷0?¹+?À%0„×Læó&ç(Êb7°'GÊú£ƒZ’j ¢™Äy‹é¬AMìGBœeyŽyF‹Q›Ü¼I˜A`Æ}Jü¯¯ÿúúçë¿o‚çŸsM³PÒF Ö¿~¾ðË,õßÄÜ\[ár|höêX\w£Šµ$Z ÎÉn“íÅDdœ¤s üÃÊÚ÷ÌßiZŸ‹R:j³ O‰AË€%ßý: ÞrÅ4¿ù wÏûaÈÝ0]7Jâ^UKݪløHE>:é­…W:kS’mh,GŠËNBKbƃ~kZ펂ãúR[Ž[úrì§=™XÙ¹ƒ;L˜ý7ü]lýØÜË0ôêTlwî  AVÃyš±PžS‰¶1;yñi“ H×ÒÇà ÊxG®ŒÌ0´®Øí¤ö0Â.âÐc€ø¼ »ÑBE*αN^2+:è®ÛpÞ"²¢ÃCƒmºàA]h’„ej‹æz\³?ÈT5‰q0 Vz•Ö¶X™íQçN—qW Ú$m±ëÆ‚ZøÅ—·$Á8¤NYc$­©0ºO‹Î¯.¶±kBM1è(#F3˜P)WÁ[‡7×Ú”+\T¨ï‰nmâPíÛ)°jt©µ®èÞ8»š«Ñï9¬K•ß:TÙÛr ‡]@äÈsg»šO%9å (¡mZÃn˜¯G}w:|Á´G£T·(Ý)¨»Ii£VÏqoÐ}|; Bl4³ü÷íh°áG-²1‹-~xIݳè×­Êå x«$B͸^3žÅì*åÊËš·F!c“YDªc‹ñÒ…>Ï7åIù¨ÂÎàÑ,2~ã$ zê}K3öNÕá²ÂœúGªÇmcuVÐBc %`ó?…Ê+‚gè’E|·µÒH£º*Û!I ŽvÅp€• G[ÜäèümIl×Ãþ¤ùUh`ò è[ûÙ°ÎG ÏKï’¬~¨Ô°¶b'}Ø1§k„‹®{DÍfé„ÕA…#Îp6J ›–÷ñÍü,4¯yíq’â¦Âƪ„©°Aú…}àbl=¬þ6ÐîÅÚÚÈÉû[÷d¬1¶èê°Æ&?t‚Cb}‰Éú§£ÀÙ8@Ûi¥Y÷ óÉáGX›q¡Yø0ƒCy-ABÁö EV9ÒÍýý›¶þ4àÙ8c­?´™_ÀÿaA³"^ÎÍ?B>5 "OÇúIj|ƒœq£Šý'Ÿ yÝ)e”÷K/ÆF]h„PháKI![v»³–]bÑ‹a¬“qîËáuu›º­‚òMZfÇ#ˆW·/Â3ü–0r8ÅÇ|ö`§(ûó©]×ÖŒŠÊƒJÝPüù`lé˜ÓËAsàìBjå׫”ØûyÓÛyzÒêÙ1û<— ¤Ç䇽X <^¡âŸ…ŸÇ{Ç(n˜` ʽ«iª7%æä–Á[Ã|CíÉÛµ` FJ ¢Ø7¤ÅmïjåØt÷¡ÃYÕϬ´ú«Ã»¸™Cí\fóÅo³B)^uDCƒû©˜’çV«-ø[ÑÕï\-ú «;²ëWáåójê^!߆־j$ÚÞŽ‹Î]ƒ¯Út«ŽÛã ÈeÍ·`aµ)D¸7‹„x]”Ðç¥?‚ë¹€L4u4ú«‡vÇ×íÜê2± éL‘´B2‘&‰)'.²Ñí´ÚŠ˜«±Q¥,û!ÌO+“Ï«h œßØE¯‡†²-…j…ªgpÆÙÏíä»[ħ3GŒ%Á.<ííjMNšÂÙb%ŽõˆçÌšTHΤ=Oí‡ÙÇ]Ô·ì ñ°X«³K»´tÉ j[Šyð4¨j(Ç,»¸5+œPß#X.“ª9y–8`­ó,™lBƒ:…sôÃà«›Cçä÷¨Úð |c²u¶)5.±ub^×=¾õûÎÍ'yMìGû¶ŽÑX$ ¹‹úka>çiá[ŸÇáß*PÔ‹„ÌXcG:2Mó²ÛN³›ÕÊ5”$s6¥›%Åö¿ÕüRM2ôáÇ í73¼þ§»Zrí¸uàÜ«¸°!ŠÔo=2pö?}¬*ªOÛqào«ÙEÖGÐ)‘*°¯âiW{ìÏ|–ÊÏ•[VÝ&›êÄИï+îÖT6XIŠÖæƒQN)ÌÆ*(-MâÒ¬EsÍ™ç\‰Òo¿q^„mm ¢@5õК“&„ÏÉ ÞŽF/¤/¸ÂÓÙ,6è? å`w¸®u*ÞÅI… ! v|ä*¢üŸá2XçªßQýpPk7%YA]_Æ‘ŠwÖÂÅ…K¢Üd~ßðü9£;(äOÉnHðvРTµ;¥i`Dp/LíC©íÞ 6Ñt`€]KÄ—êÎp#{tÕyCüºÉuŒõQÉpiž«Ï{[b%ìb^&î”ݺ«3¡´a6±‹†‹ƒêW+Pi÷Ar7ç·±d õqSÀ·`óMDǨqe™€h£uÙùʸŠöñˆù6‘hº]R‡“éWC99¦4ÖiXs¸$Ô!ìq{šçje]›ëÊîÇíâJ]—·¸Ç•ÿ&E\qPüi(G®1$ôÛ§x¢çgæv6R6f9o›³Áu+Ìæñ2YÞ£íÎL820*ô Á];oÆñlæ¹Ò†€Ç&0í¥…s±©Ab6Š<¼ÃeTà¯A¤NìÖ9&iBšalÈÚ6¸wïÒï¯nÉáۀ׉’­Zd‹j´ÝUcÊ;ŸMâºöäjÅNLGènZxœ8Žßh3ü¾e–™qn]Ôq‚µ”»8g×Bªj¤QÞ¦þ–Ñh]ô1“Vÿ¶Ã„±b£J<Š)0 qKbÀ$‚(È`ÑÍC=wh J²A^ ”hÉQÂb}ªˆyæL3É åÌ3Ø$a-;$ödòI¢¾]4uÇ€T@ø˜ªiÞx)}ÎÒ¥}0vÖ˜pÓkN~v6(’GOmŠ ]‰ùgÙ¨\NbN¯êÈ¥¹ò;5ûŒº‘‰Ù¯V=@£>ûM®ã:è‰<GÎÉ´ˆ $_Í>Mˆšrƒ;"³›°p?$% TvuVªí[—Ì0jƒŽe´™ocy¦t0)ÁtÜüFþ1øYÔ~pÄk’‚Ò凥 î’û´ Eϵå?tz„ßAÁ$ȶ·¼q¹ã ÄÅ(aX¿_™†3Ã(£TAŠ@¾Õ¶¤® Ÿ— bq»,5¿/]rÓ-ÀuâµHŽ1´Aã[ÚEÈЬ Kè‹s„Buð¾Êèôm8]@Hj¬“o× B°…Qïâ¼AoÖÞ=¡º³{Õ –&!ã­Áû `Éä­5£&é-Z—“9 ¨ÒɉäŒp¤9ŽÜ!D× `ÊsO¬z` l÷R œb¡ÑÇe¥2Uð·ã{ÎMeDkä`jÐm ‚¸'Ö;ßT…BN¸}×Fÿúv]DnonnÌ9Ã! ¹®Ãbá9tÉÙ€!ÛÐe'Þh••pÄû¤©WoÿaòvÒ'äïÊMÂP<†“ýÅÿP¸†€ˆü—ž‘þþSÂìO.]°¯AnÊ£.l,´µ£—f<BC}­°šŸÅ­þ9&Êž¾0œÝúÙf­ä“GYÊFôèÄ£’f[¸½ú*^ú〗-`°õë MÙ¹ý&oH-ØUP¨=‰ìÙHÁ"$Nc|èɪ,Ý1cÃgM­³Çs8í7˜0N%-:ÏjºÎ^ˆ’ûQC8™7çÒ`ŽÎÆïÁÒgÄ̘ËüÝ0yh:ÐMtL’œó釲È!8&íasàiVü``Âìµ-DyÄFÉ´ªåßfl Æg FÝE-]Ósqéœì«Í¿6r…Ç-K;(‘7ÇÆe ÿ,mÕbç;ý˜ƒ·E»ð\ÍrP/¾ßçü Bžàe9êÕ\]íyÞLæ ú ?²Œ0q5æ ÀAa»ÅJ¸‹alœNY¾jŒ¢I°³L}ÉãâP~¥‡šàS )mÕ½„qyÁw›ÁŠ Fâ ‹$ãAmô>pˆ}ÙT¸æÆÞ0FP°NРØå¤‰ƒhFõÓ–e}±Brx0¹-H^Ø-äÙü=éêв–;èí‚6;1Ї%õ±ª¤·Z‘ä ziU ýà̹QøƒdÁ_ n JF]- :»‚q¯H 'F÷Á~uõû(.yš¿ Ê¡€¸©º?öWeŒâ/küH(ß:š²Sôõ^Ø÷5õºMÎÚØjé >•ž8¦¡Éc«×çµ´ÉžÙSLÈKl:…¨ q##oÕI\€„BB´‘°’¾Ì¨³¸;“\¿ öj†ÌBEœgKRÑS†}—>äÒ}¸S§™ÒO‹Ç)½«ïWK ŸŽå]ãn­nñî 0ºJk¸…E™#ÕT¢ø„$ªˆÄüM@4¾‰Õ±w1Tf5Ä‚‘êë¢üÑô9¶÷¥þwæ‘àº<ôóäA—ËHPtL-.Kà7ÙðíÔx_7Õ]í|©;wßè÷ÀDó)NŽ¿$Ά€BXðR°R…²° N¼’kûR+až:÷lcÒ,n«ó »-¥"­žMT \ÃáàêâE}¡ô=À‹?èÇ¿«œƒ¥fõÄá ó‰ÈˆÉ‘—¯€ž]¸½JŠœ¥ Õ\d‡j¢mÿ-4r8“goeS|؈SãÐZ”]»"×…œß¨ù§i@cP'î×P€;â6¥"Ç‘•ÔÚÉiZ£Œå0Î!h6s+Ò›šßÝ*­V°è2EÍðg1ѨïPèë1Zˆˆsjj©¡¬RVo4vô{(v‹ÃJÓ¹LêC¨¢6ÑIñ›´ éŒÍã¶IŠv]C6…wsVpîý@PÒ ²eƒ>6邎ô•Ñ Þ(µQjÛ/q~óvµŠO³ô}Å$AR%áJN”Î÷7V7OµHwÙ@Îÿƒ#ò7ÕM®gî>á^!€à"7êÒBY7~M×ÃÊH¢¥EFgPÂxñPðÙ"¥ú-»D=Uà|Œƒú vù*…!‚Ç(vCäØ+ÐOÿ<3ªZ0:•ø©@4Øî3`íª—¤}n¾Æ&Pd7¸V*ež„Ë=ŽÎ…oìEÂBý6Ž"Ö­SE³¾“ªj‰¤>ŸÙl¬ií9ÃŒ~ÊT¤žQ y¨*bÊm^ibE³Þ5ÃOa**í8_O»íw¤)ëóRôôE×W0öé²}½žŽ1^oÞ(*ï%`GíPd8ú¼‘š Jæy’½H¾«í*Q©/”0)“f±ÒÚ¥©¶š³¢!Rhõ¿ß0oƒà“§ 'Oo9)ìº/[Y`ÿÜ:x~žµ?@äQFPøù »]A ”•‘,m'Ìê×[[ñõ¤°ý úûkÏ~~Â.YÜÚÿ¯–Ën¸Ÿ¯¸?0±¨·¶ž ŒØKÃ+{a½÷ïG¬*ê¨=m ‹éQ]J:’H‹.9²ákV5&e-¡·uÔ5ôc}ÆÖ¦àfA£/—‰ÉQçZ×Xs™ºE'ô€£ HßJòùPhöÇVWh!è3Áæ¦ Ȩ̈i/Ñh–Ž;»æÃ·sÚ¼:óè÷·êbiHÒÒsC¡}åè ávúFG‘ЕÆªjì?2ÓJ tâ²örâ ’"÷…y²FS¨yZêx„V.k‰¤bŽ1S”)ωF†hz …’õǦ|£PMú zŽy“)ùy}ço‰›¿äùÚ—ß5®Œý½Rn9g‹ù—¡F”íÝ?˜|–M½`œÝÇ|àÜ. O}¬\¶|Z‘‹çk—-—pfBa?^´È™†‰UUPk¡H=²Ü¨g¸”ÆUß%BJ—Žþƒ+ÚÔ³j~,è&´‡©ÂŠ–ñpñ ÿÚÊBn¨Sc È'Jv2¤a°ÚVæDpÓKÌü¡ÏçÂ=»æ~ÃËçè]gY¾8[Ô˜)'*¼øAú  ícgÞÄýOÉÎH€q ßó2tôç£q)9&¶uÙ !(Ò “ k¥ö‡s”ŸG½ US«¾@Õê£ jVxñA’±ŽÒ3Íg5Vt‡že¯3άZ%yP—¥ÝÇwüÛ)Ÿ°“ª™d—ë;‚“¼v¤¥ èÅn[÷TëV."D°ÅÃxí3U¥‰ääÌc3ƒáÅÔtÀ(Y±ÃE”±Ÿ+²y,¹ á Un„ ¡r yjÏsWÏr,6³Þ‡ÝŸŽLàç6Xº*žã4'’”è´$Wþúé÷o’¾y ,Oú–Ó»¤÷’ôC«“õb>îòŽó.ŒŠyŒÐ<5V8õÇ„þ¡Ìk¨J‹s¬F¬P ¬€ôRGPÕ¹oÃâN¬úUMA+ãX¼Xó†š(þÕt¦lÜÒ-K}ZÀZæy2O ,§1¡9R´x¤_Â}”£.tÈ2ÊæÔ GG4®™Ït°¤HO+2šÌC)í×ÂkaÇêaEšÎ ÄNÏ{Žï¹» N²‚ÿ·5 Oà‘)ÄרS ÉŒ¾5¹&°pKö0€)&`fÏ…É~­±òqJ¡H¢-Aà F6ô{àîÝ“†JÌãwá!¿™£r ¸Ô0lœabE!A°ÃmJǶÂE@p{Æç 4ã¦ö.×þXŽtqzñŽ)²iÐGˆ¨ÃÂ$€©ÆàIH­²Ûå=|ØGP;ÒÃfÚ£Ã.'÷ßÞè^ýý ç dÁrúкq"aj°ES•Pvá[O®*¯fàÎŽh²Lõ/êR‹ò¶.«uÌ쉣3Ê›šž±§R­x*DŠ|Äcë7ëì@=EÿE¿”A6‰¬D 0j“xï¬S—GÒ„ï(in[å"ÑA Ž8ÏàAV¢«jLG€Ÿ×XÅw‰VScTh²æñ®½,×¶˜To+³¸Î9®ön?þׯë_Ÿ¡µè#  ­Ý^¦p-S/å “9[t“œjh‡ö…Þ˜)& ýMV­&À©å±¥ uÏWI½H]$G :Ô‹…¡¥ÛÌÅ<Ȳ½¢Œ4Ôf¶Ù±Ôôª œÐÎÂo@Þ¨·Ãé¸høÏ¦~«c’QY=ÍP›ýj“<¥¡eêט_'È`C.÷Ð¥LáØg¹Ž…߃-6bË'ù¡ùW›ìV+峕7a¡7};Æ8ÔlÚZ´~Ì÷ó}×±äYžqŽ+¿ÇÏlé)3ÔR<ëÌü¢±À¹ëßX—[%«1¦4Ä…¨ÍôH8ÎŒÁÉNTÕ’|®y<A]©[;xLž B¥“=ø ülêåùûã¿?<ð竾¾nûcÿûÏëgÛÍjÿ%½~{]÷¹f×/;|¶¹yÕ9·ê`;·ßá§ý¥½iÛ{ú>m­o6êÅë{~­±Ÿ`–{£>·>èï6Šzoßì4êΈý­QçΣqï4Ö^›ÏN,ÚI¶Ÿ¬ýŸ‹ö™]woJuyøÍ¢çòÿúúåõ黾¼¾ûúe½¾ÿçFøé¿Ÿþ'ÀJ ® endstream endobj 451 0 obj <>stream 8;Z\70m9Wn6$G[Jp>0E@V <9s7)pGo-?E5l?h5t$nfQM3P=8m]FX`W-!13,Q&3EPko8[DWgC)]D#ZR#J*Fk/lLC %ELK",o"dlpTp^.'AYrEDIem1Mi]KLl%X7.mad!88=?>GnqQ$lQ?LR/b+bL@4Rl.7 dE2$qe_6.?o+^V!N!#&E[4CI7kjloL,`Q+9$]lLU&gT[Q7t63]^pQBi$=E"UqD^u! S(=Urf#kr^ELFQ78=MQh*g5j"pn.)NPZ1 ?HVlim>r+g)`hF'^mFYNf,#lG5#!$5GDs,5_F(&3*0QBRQqp:Ho2#c%8(a/)Nt3VS \$*fb/<,S6BXq8Uf\KBMkM@`H(<>J7BJqV+%lO5Fd]K/IgG6#lk/2L-2d3I<]Jr<` )pd9ZDZ$tRHVh+2Cu#TF0"UcB::cQF>n'H^&Js_S0$D+S"*=iA,L[NYJ)_u_;+l>jO1;ajT(Khe.KH-4;Poa13_au\Tp3MZ%)r-2_TU^+=&gd Fc.TlhseXS"L_[S^T"_P)P,G\^.I"4'Y&c0Q.(;,V`nq0b>@XX_Gl,p>=>*KZ!`,f!H:(bu>O;T< !P!LKi`LL&DtjbtQH<#tADO(;mh/XVic")c>\O8Y$R+u(gEc@W_$5#K@ceD8Zk6^= 7\T8fnSOtDE8(tCPn8"*)a= endstream endobj 354 0 obj <> endobj 357 0 obj <> endobj 438 0 obj <> endobj 440 0 obj <> endobj 442 0 obj <> endobj 443 0 obj <> endobj 448 0 obj <>stream H‰|PmL[e¾—¶·c¶eÒ]†½[ï]D1ã¶CluÁ¬Š|,0:H»¹µÖI·–Y(»][©"¨ ö2‹kÌ8ª ˜|d’áPÖÌ ‰ fþã4fYÜ’sÙ[£·ðßóã¼çyŸó<çäà˜4Ãq¼ ¶ÚZû²­Äö{œ®F?§{‰óº² -P¸°]*ìTè94°SºöðŒ úó`äÑ;wäc98žœ­ä|¢ðÔëA¦¬´´”Íf³ñ+\Ü 7c ‚î¶S{ú$ç÷q~gÐíÒ3^/cÉÊŒÅpûÛ³ŸGôV=Ó(6œ2U£5î+ÓoîÅxŒ“ñ»OyD7¿ÛÅýN—»Íéoe¸fæ&í­±ûÜÌ>ÆånÆÄx«Áê°z¬³b¯`[Ä`fìNã6|ÿ#癜–áHJø+…‹¹(%‰H…ÞõÆL/h™D&øHkbÐ7$dAfPž!ŽoÔ`B"&„d¶BY¤‚ÜnÁaÀÁ’ü( С]`P?X {f–z~¢@ókrî:=?3±˜ÖüfY6jy¹ZX˜]úN“ö|åÓNÚ-çõÔ ågß?ICÉ“$?ü ?MÝžó³5µBuW”+!¯+”/ÊÁ N^HK¨†Yù?r.®ˆMÎS7“Mõ4úLlúRE/®—ÛÞ¶—P/tÿ C…ßÄ=¤Q1£í€`÷¦¡úJÖ ¢„úöPtˆk¿Žqy‰úx¸¯7AC‘œïêŽtPކ¶*?ý¡¾Òó» í x'ï¨Ô¨ÂPBxRØ/IûA‰:ybb|ìóñ)(sáLR@kŸœk{#Àµ =:R¨êJ¬?;„l Ø“HÅ3!Ô}ˆÆ2\b!vqP¾IOÀÞÄõD&8¸E¨‹¡úMz2–«mª~oä_E.H·û°çʨBãÛ…·ÈÿTeºÖ endstream endobj 441 0 obj <> endobj 447 0 obj <>stream H‰|PkHSq¿7Ý•-òv£vëîFï|¥C*%3ÃW9·’ Íífš5»›ŠQ0ÍÊ›s¢é]ZQ~1¡‘¢ÈFEIF2Ö)ï—ì çêPwõ½óáœßï<~çpH"zA’ä¢ÜlKnñž5Ûk…2›Ã$8×™ùÒª ›)r K* £•Å1 N¾ééé xç‚Þý© ±Ä ’ì¾™å¬TGKºQrbbâÚˆOACj¦ÃYÂ#K­ËÍv¡Ü#v§PélnÞ2+*92æBfÞÅ Õ‘ä®xK<2© GÜhkJjÊÚÔ´äø—¡2²!/-SÕÞÜ‚ÍÁ¶ ‡óúϦ„m–µ• ‡jbCpK¦!˜ÇÐÇ÷‹{Årî EZÆ4>*ÿÖƒÊQ ßC¦Vxßp ›n9¸«Â ÂÃj"œÉtúüÍÜóKú±“Á´Õ8jçæ„üÝý#Ç b‡(Iz]Ù•jeCÈ£î’Á#ÓoC d ºš»Z$.Ð5Ø7ÌŽ÷æ¥ð5úµ°!îNÎF‹uŸ‹)zðô˜&òÙ½%{ô:U&qÜSs5r4=Z0’ªÒÙìçžù†³þö³b»>?®¥GšO6xëXSqI^•á E÷6~ÔdP>«w¯Y¯óHSF?¶J ¤°»RòZqAkØ) ¶ö¶j¹+û³ë;ÇÌ|>Kž-·Ä̱ùÊ{æìmž endstream endobj 439 0 obj <> endobj 446 0 obj <>stream H‰|OmHSa¾wîCsNôz¶º{A!G¶Y‘‰´rÒÊåÜú@Akz¯s¥ÛºwBÂðOÂr¶I3ƒÂˆ>X‘äˆÒmTDÑÀ~V+()&*õG Þ;ßEÝéÿÎÃyÎsžçœƒcb†ãøF£Áj<Þ²ÍÔÇ:l´™umotØ»=YªŒWá|©˜ß,'[‘5¼*“lÁ°‡ï  ¯‹¾¦¥Å˜ǯ‡¸Ü‚ZPŠN ØYUUô´«ƒÖ>ÎÃôrÀèìt±nkó0´è{z€%;Î Ã1ìùló˜ÖªfaÀéõ §nÆI;œvíúaÀÁ`»CpdxXÍôÚØ3ÀÕõ¿mºëÑ>7öšé„(ÂlÓÚó˜ ÃæðîJ_œÿÇ…\Ïñ‰ùÁ´93(…~ôŠDupD¥ ç$Ì‚LP–‘¶¯Õ° XÊ?#³Ê"…7§"ø£8œ‰çÀ/ Kæ öCOõ ’"¼¬yը߿´uYu9BVš`>4úÕp_Ê— h )C+*D¥ðEøOq^Ëá ¥4;$›ŠJ` ܽ¸K”ɶe¤:hq36êÆiÉ­»Ñû …÷둸V‡ŒÈ n2Iœ²ìEó“Å‘87 ¯ÅÎÆˆ‘„þ´†,ÛÛ ±†-_ê‹2"Uc?q¤FYñCs!öó}l{£› †eÄb*r;ñBI$¿žE8E¤þÈIMóÛä°ú}ìõÂêwo¢C§¬mj®¤ˆä0?O.L˜Ìõ-'8õ®›ÖÉKŸsg¦_~§ÞPºzu\…;Bñ+™s#R8̸BO‚²u®=u¡X(ã æò‡¨1 ÐO÷yÔø)ÃÀØ_yÞä†h~tH^À_(áÈ k2: endstream endobj 413 0 obj <> endobj 416 0 obj <> endobj 420 0 obj <> endobj 423 0 obj <> endobj 427 0 obj <> endobj 431 0 obj <> endobj 412 0 obj /DeviceRGB endobj 432 0 obj <> endobj 433 0 obj <> endobj 434 0 obj <> endobj 428 0 obj <> endobj 429 0 obj <> endobj 430 0 obj <> endobj 424 0 obj <> endobj 425 0 obj <> endobj 426 0 obj <> endobj 421 0 obj <> endobj 422 0 obj <> endobj 417 0 obj <> endobj 418 0 obj <> endobj 419 0 obj <> endobj 414 0 obj <> endobj 415 0 obj <> endobj 358 0 obj <>>>/BBox[8.1748 1102.53 706.217 377.814]>>stream 0.18 0.192 0.573 rg 1 i /GS0 gs q 1 0 0 1 8.1748 982.335 cm 0 0 m 349.021 120.191 l 698.042 0 l 627.619 -362.355 l 349.021 -604.521 l 70.422 -362.355 l h f Q endstream endobj 371 0 obj <>>>/BBox[8.17627 1102.53 706.216 780.829]>>stream 0.18 0.192 0.573 rg 1 i /GS0 gs q 1 0 0 1 357.1963 1102.5259 cm 0 0 m -349.02 -120.19 l 0 -321.697 l 349.02 -120.19 l h f Q endstream endobj 378 0 obj <>>>/BBox[357.196 982.335 706.217 377.814]>>stream 0.18 0.192 0.573 rg 1 i /GS0 gs q 1 0 0 1 706.2158 982.3354 cm 0 0 m -349.02 -201.506 l -349.02 -604.521 l -70.422 -362.356 l -70.422 -362.355 l 0.001 0 l h f Q endstream endobj 385 0 obj <>>>/BBox[8.1748 982.335 357.196 377.814]>>stream 0.18 0.192 0.573 rg 1 i /GS0 gs q 1 0 0 1 8.1763 982.3354 cm 0 0 m -0.001 0 l 70.421 -362.355 l 70.421 -362.356 l 349.02 -604.521 l 349.02 -201.506 l h f Q endstream endobj 392 0 obj <>>>/BBox[8.1748 1102.53 357.196 619.98]>>stream 0.18 0.192 0.573 rg 1 i /GS0 gs q 1 0 0 1 8.1763 982.3354 cm 0 0 m -0.001 0 l 70.421 -362.355 l 349.02 -201.506 l 349.02 120.19 l h f Q endstream endobj 399 0 obj <>>>/BBox[357.196 1102.53 706.217 619.98]>>stream 0.18 0.192 0.573 rg 1 i /GS0 gs q 1 0 0 1 706.2158 982.3354 cm 0 0 m -349.02 120.19 l -349.02 -201.506 l -70.422 -362.355 l 0.001 0 l h f Q endstream endobj 406 0 obj <>>>/BBox[78.5972 780.829 635.794 377.814]>>stream 0.18 0.192 0.573 rg 1 i /GS0 gs q 1 0 0 1 357.1963 780.8291 cm 0 0 m -278.599 -160.849 l -278.599 -160.85 l 0 -403.015 l 278.598 -160.85 l 278.598 -160.849 l h f Q endstream endobj 403 0 obj <> endobj 396 0 obj <> endobj 389 0 obj <> endobj 382 0 obj <> endobj 375 0 obj <> endobj 368 0 obj <> endobj 355 0 obj <> endobj 449 0 obj [/Indexed/DeviceRGB 255 450 0 R] endobj 450 0 obj <>stream 8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn 6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 6 0 obj <> endobj 7 0 obj <> endobj 212 0 obj <>stream H‰ì×1€0A A$®Ò"3 ©`˜Û-¾þöæ€5ã¼¶ýxöë#¼J4éA€&=Фšô @“hÒƒMz I4éA€&=Фšô @“hÒƒMz Ið·K}Ï endstream endobj 213 0 obj <>stream H‰ì×1€0A A$®Ò"3RÜnñõ·7'°Ò¸Ÿã¼¾Ý}€_éA€&=Фšô @“hÒƒMz I4éA€&=Фšô @“hÒƒMz I4éA€ý^³µÏ endstream endobj 214 0 obj <>stream H‰ì×1€0Ä@ A$®º"3-CÍœûû9ÎëÛ¿°•hÒƒMz I4éA€&=Фšô @“hÒƒMz I4éA€&=Фšô @“VzüÏ endstream endobj 215 0 obj <>stream H‰ì×1 €@A A$®¾Ef<|$;S\}íÎÉ_óÚöãÙ¯ð*=Фšô @“hÒƒMz I4éA€&=Фšô @“hÒƒMz I4éA€&=Ф×Ý EË endstream endobj 216 0 obj <>stream H‰ì×1€0A A$®Ò"3)a˜Û-¾þöæøŸq^Û~<ûõ^¥šô @“hÒƒMz I4éA€&=Фšô @“hÒƒMz I4éA€&=Ф•[€îŠÏ endstream endobj 217 0 obj <>stream H‰ì×1€0A A$®h‘3 *`&·[|ýíÍ À®îgçõîßGø”hÒƒMz I4éA€&=Фšô @“hÒƒMz I4éA€&=Фšô @“ j 0VÑÏ endstream endobj 188 0 obj <>stream H‰ì×ÍKTq‡ñ¿!B‚6®Š`$PÈ 6. "pˆ´!\%¥¦¡H/Z0eRÖ¢‚Ù –e(QºÈ… e℉2åÛŒŽÙ¹”ùzõÜ{çù,f}ü̓gÎÒvÝ\r¡1Ü“W¿çà•òªèØø”õD.¸X÷\Nie$>öËz`u/Þ~V¥ú´ø›² 5«Ï‚Óáw¾Z4õ·»ô¶ú´$hzû¿©X½­êå_+<ˆ½Ó¨ëI•ê’²žÅ“‰Ù¾Që)€µ°àe©ùtËÃÞ}G®©Rm‡‘xÂz¢ààtú\þ £bխ굞X{¾ J—”õ@F`/ÀûÆ'gÊ«¢ 5ûðÕš[¯æ’ Ö÷ ‹Ôd]K—úÔ“ªUk=ð_ì}€{~ñiè{ѹÊõÀ‰Ï:¬Çñ=îA·¨F5©ÇTŸªÔz`ì}€{þ²òÛûØÙ{üöÞîÁíSÇKîëդʴØö>À‰½ß™K.4†»³_UºåUѱñ)ë‰|‰{p;TÚÓªCÕ¨&­'6нpb/À§Fâ‰ÒʈêÍÉ«¿ÙÖ“šO[Oä3܃[£ÒZöª:½ž T‡Ö›ÃÞ8±àk}£§Ãj8TÔí´ÇO¸·@©4½›ªS{Öã[ÁÞ8±í‘þÜÂ&•\\öh(öÃzàÜuuêüc½˜JSoÖã[ÇÞ8± Ó3©KM/÷†j³UWÔtL&f­'ò:îÁ ú9•TQêJu©1•f=°-ì}€{Až(¹ðTIïÏoh}ò1½øÛz"ïâ\—úQEjI¥®T—õD€ Øû'ö‚çuO,ïä…­Ï7ï¿XãQ܃kS9+©(ëq×°÷NìRzñwë“ûó”wÉ…§±á ë‰<‡{ðT‹šÑã¨U¤–¬'ÜÄÞ8±`“‰ÙŠšŽ¬CÕ{Cµ—¯wNϤ¬'òîÁ©u¢ZÔŒÊQ?ÖîcïœØ ¼¡Øâ²Gê<·°©=Òo=ŽWpþEm¨½‰jQ3Öã;…½pb/ CD;CEͪýè™»}£ÖãØã\¡T…^C…¨ëq€ÅÞ8±9Róé›m=9yõj¾´22OXOd‰{PÔ€JÐ;¨ µ¡B¬'v{àÄ^@¦Ÿ*¯Š.Ÿáî¹ä‚õD62üÔ÷®o_ èÔƒª°žØ%ì}ô+* endstream endobj 189 0 obj <>stream H‰ì×ÍK”aÆá¿!B„ \"ˆ .B˜E %ÚA"Aà&ŠrEò#Al¡%Y‚ƒP¡%H˜Z(¢`”‰Efø_Ý ÔCaê8zæ}çw-¤v÷{îy8œÍMàg/Gœº©¿ÖA€C582•ߨÿÉ3·ÛŸ¾³Žc ìÎ }¾þZ1 ÆÕ»>_¿ý¬ã‡Š½p±ÏÚ:†¶î‚`AS¼Ýñyªeu­Wïjß:`€½p±ç––WC5݉©¥z—n„gf­’x»Õ¬úÕ'«k5®Þ­6Øû{Ÿg/\i×[HJ/¯kî]ù¹fèÀÅÏ=¨6Õ©šÕ÷ªeum°ÄÞ¸Ø Ào=}™y z)ÁÚΞ1ë8+NîAõ¨6õ¥jVýZÇì±÷.öð—{íoOœ®Ô»È-lÿbç øþTwjPßx<£BZÇb{àb/ÿú1·|­âùÑ”[ ýCÿµN}>¾·êSwjЯõcï\ì`;ã¾+z r<£âîÃ7këÖ‰¢É—÷ :RSêKŸ–[Ø¢­1‡½p±€ÿëìK;[¯g’™×ÐÓ7a'jüwªu¤R_jÍ:£Øû{ØÑÚúFýý×Iéåz,ç/?šøôÝ:QøéT#êEŸ£Žêš{Õ—u" v±÷.ö°K3³‹Å¡Ž„@Ibji¨¦{~aÅ:ѾøãT êB¨µ£Ž¬±Ž½p±€=y?:,hÒ«IΪj XljœîAÍ_-è+ÔÈàÈ”uÀØû{ˆ@¸k8%X«·“ߨ?4i'ž¾5sM^ù9ÕêÂ:à%ì}€‹½Dfiyµ²áÕ±´2½ ‹WO³N´7½5gM[É5yÍ_-X'<†½p±€ýÐyRtý‰ÏÏ݃š­&¬9+¶NBMÞ:àIì}€‹½ì_ÿÐdv~£žR §:Ü5lgW¼ujªš­kΚ¶uÀÃØû{ˆ–¶Ž¡ä¬*=¨`AÓàÈ”uœxåÔ$5OEÕl[ÃÖqÏcï\ì ŠæVB5݉©¥ ’âPÇÌì¢u¢mÅþ=¨éi†š¤æ©©j¶Ö‰?`ï\~Û ¿Õ¶:B endstream endobj 190 0 obj <>stream H‰ì×ËK”QÇñ¿A$7­ AÊE) !¸‰Z¸"ZH^B1º &˜.R\h$„ %*]$4ƒì"áЈ5¡¡MyImÔ~5`‡’(æ}ßó:~?È˸9ç÷ÜÕuI©Ô1õ-¶±i;„˜ûspÛçÅÕó iYµúÓýk;Ѿڷ[”šYíŸI‰¹01oL†æŠË»ôÜ2ò:{ÇmÇñÑ>¨n¨' £þ¨K¶ãI޹01/ §²5ëÑå—´GÓøaTÔÅÈ*lRg,&öæ>ÀÄ\<¶¶kîIÏ­×Ó;yööL$j%†Ý}PU«vPÔ õÄJ `bîLÌÀŠ…èJ ê®^ß¾ì‹5ÃKËk°µªRÕ«ªu{EeŸúàq`cîLÌÀ¢ç“ OÞÔSÓ¿]qðp7öA%TN¥Uæ W‡”ßÁÃ8‚¹01Ÿ MÏ—zôNÓsëÛ»Çb›Žëì>¨Tʦ„:Si•Ù‘c8޹01€]!8Î)jÑkÕw08•øîƒÊ³íá“·‰À=Ì}€‰¹ì±Íö¼½Ù²@Ohz>‘ÓÙ•AItŽR)›&r0÷&æ°{|`¨ê=¿ endstream endobj 191 0 obj <>stream H‰ì×ÏKÓqÇñ¿!0LÀD.`yu³º1 »œãô¶tOíD÷Ž]rò÷ vÓžÚYõ:EgEˬAîLä1¾„~ܺӫ}ùæ“7CsGŸð=¨}´›*oT¼Ôþg×,kû¹d˜ƒœÞ†G¼àŽ}žêu ]û¹džè^K÷TŽÓ«Û]ÝX^Ý<\sÄ{PõZ¥¯Ú¡¹sR»%¿e)BîLä©"Kë•õ~]𼢖ξéØî¾ùõŸïAÕ¨Rõú¤µÚ!µ-H:r`"€Ì63).ëÑ5w¸:†'æ¿õU5šTýtð›ÍH:r`";è÷óKÚtÙK«Bá•øßïAÍh^U£J«›Dä>ÀD.6±µkhÍvx² šêšG<ÓÝרߚѼ¾nlF­n@r‘û¹ØJxq­¢fP·>Çé=Ëï¿Ö¼Õ­Hr`"zÚûéâU·î¾Fý¶º©CîLä`+áÅµŠšAÝúK×<¿G§W£f4oukRܘÈÀ&¶¶cîgﲞ¬‚¦Z÷Pcû˜î¾FýÖŒæõU5V· ¹È}€‰\ì ßÌ/iÓewÝ} ¯hÆ×5©¿õ[3·ïõé¯jTiu³’ˆÜ˜È ³}žû~½ü¹®¹ÃÕŸ?˜7߃è«j4©z­²¢YIGîLä©––VÖûuÁs }z>Äv÷ͯ‡ßƒ¢šöU¯OZ«RÛ2lí—MÖ=O endstream endobj 192 0 obj <>stream H‰ì×ßGÝqÇñ¿aŒ‰ˆnb4‘HÔEŒÌ.ê&fÆ2#2f3£µ”Ò´ÖF«‰mÇRZKeVtÑÚŽVZY“JkKÓÏSmíÅ÷æCV§s¾¿Nž9NÎ÷û~¿?/ï½=¸áÍ»ÉgÊõéõ _ €ãgsk§¶i 1³J·ûڮťÕýÏT=z«_õ¹ÿ'=¯·ô«*¨Žª9?2—û¹3=_Róëu¯óŠ›GBsÿ{ì€}Ðòql^ôŒª©¦3Ãp¹0‘ À±1:±PhÑ>}ö~°;tðÇîƒÕ±¶KUV}û†à r`"€c`ye£´üµîrBFeECÿÚzøÐW"ÜEÕTS•õ¼º¨—#ð¹0‘ @\ oï6¶%eUë"_* ÎίDøbäû E•×_éõRGõvd^"÷&rˆ_½ƒSçu…sŠš‡gŽôîQ÷A‹º¨—^T_u?Ò»ü€Ü˜È MLÿ(,iÓåMήy‰¢Btû åYûõÕëšA“DQ€WÈ}€‰\âËïÕ­[5=§ÒïéO_ôotubÙm€ËÈ}€‰\âÈ“ktg KÚ¾~ûK©÷AËô÷_šDu4•f‹¥wû¹Ä…Áᙜ¢&ÝÖÌ {§b/hË>hÑ<šJÕ4¡æŒ½ çû¹øÜìüÊÅÒ—º§IYÕ­Cáí][ÊÚ¸ÊšMª¦¦Õ̶”`;r`"ßZ[W4ô'dTê’–Ut/¯lØXÜÞ}Т 5çÉ´»šY“k~‹°¹0‘ €?»C)¹uºž–щÛë;±Z4­fVqͯSØ^@,È}€‰\üf$4—Wܬ‹™š_ßÕ7îPçöA‹&O;÷@-tÈ¡.ŽŠÜ˜ÈÀ?—V¯ÞîÔ•L̬ªmØÜÚq®—Óû h~BgQ#K§s®€‘û¹ø¹:]¾ÑîÂêäÂ>hÑY®ÜìpgÉp(r`"Ïuõ§<ÔMÌ+n ͹ÓÔµ}Тsétꨓê¼î4°¹0‘ €‡Æ& -ºƒ)¹umŸÜlíò>hyÞõY'U_Zgw³5 ¹ï áª:4 endstream endobj 193 0 obj <>stream H‰ì×ËKTqÆñ¿!D„ Z H‘Q-Ú¸0JŠ M mŠ ('Q”¨´Œ©ˆnD³ÁÊîC]$áRN^rj´ž8‹~‹®ã8ï9g¾ŸÅ`«žó¼üxy¿}ºrçÅœEûôk(.©ôÄöhwIEcYeS´ýÆØx¦ÀšÞÒÛ×oÿ_}©¾W_­oWê¡À€"ÇÞ¸Ø @e§¦;Ï=(_Ü¢§·±áRrhÄ$†Õ=è|ýQß®êAm¨“@bï\ì zUµztKÖK<4Lb{zÔ@u]L1Ô‰š1Lö>ÀÅ^ #94²në=·yK[O^|”š¶Íã‡{PÔƒÚP' £~Ô’m ôØû{˜mŸF'wµ^-ì/©hÜÙÒ£Z'úÁ'÷ Ç«Hý¨%ýᓊ€Pbï\ì`V?™¿¬M¯lí–óýÉ÷Öq~òÕ=èQ?jI©Ô˜z³Ž„{àb/³$ñp°º.¦÷©éðáóá=èéM ¨1eS{êÐ:6ì}€‹½äÝ«átýޏ^Vùâ–#gîg¾d­ý‚oïAQcêMí)¡šTŸÖ‰€ð`ï\ì >O~¶ß(«lÒ³Ú¶§ëCjÜ:Ñoùùô¤ÒêP!Õ§ZU·Ö‰€0`ï\ì _.w÷-\uHªfÓé§ýo­ãü…ÿïAšTŸŠªnÕ°u ðØû{˜9Ý,+7œÖÍ”{Ðïy¦nX=«më8@€±÷.ö0ï>ŒnÛÓ¥GTVÙÔ»ûyò«u¢¬{PÔ­ž[Õ¬Øê\Í['‰½p±€Üd¾dŸºç'õ;⯆ÓÖ‰þOàîAzVÛJ®æÕ¿¦`ö>ÀÅ^rÐuýy¤¦Co§º.ö¸ïuœ\ôô¨óåë+¿¦ YXÇ‚„½p±€ÿÒŸ|¿zó9½š+œ?±Ž“»@߃õ¯)è+4ÍÅ: ì}€‹½ü£Tzb{´»¤¢±4²÷kcãëD3‚{P4…½¯k"š‹¦£Y'ü޽p±€¿ÊNMŸ¼øhÞÒV=– —’C#Ö‰ò ÷ GÑ\ô9š‘&¥yY'ü‹½p±€?»y/YUÛ©g¢_ým'oÂtzn?xÊIùÅÞoßïÙ=º endstream endobj 194 0 obj <>stream H‰ì×ÍKTqÆñ¿!D!\ ˆQ-ÚÌ¢È7‚„„ ´)‚‚EQ„Ò2$ + †@„Þ‰’"4‰$’h ‘ e·QGíø‘ô>3çzï÷³pwî=Ïõáll`+»ÿìö]çõk=à9±±™ŠÚÛú@ ö4wõ%×Ö­'J§ÆËOõhúµ$´#mJûÒ£iwÚ õD€çÐû½l6¿°|¶õan¨>§¨îd¤6¾h=QúùòLù:—ÐÖ´;mP{Ô6­'<„Þ¸èà7¢Ã…e­ú.¿9›²'S||¦hwåÕ=zFmS;µð zࢀï^|Þ{¤S_D(ÜÞ÷ø½õ8™åû{0E{Ô6õ¤Ú¬ök=`Þ¸è@Æ'âU§¢ú¶—4^¼öby%i=QÆämS;Õfõ¼Ú²vm=`‰Þ¸èÜRbµ¥óy^qƒ>„šs}“ÓsÖeIpîÁmVûÕ#k×Ú¸ön=`ƒÞ¸èÙþ‘.èØìêÛÑ/ÖãdUÐîÁmY»ÖƒkïÚ¾õ8€zà¢Lº •ÝA¾ ‚y¦hãÚ»_P¬Ç²ŠÞ¸èÍôìB͹>Å>¯¸!Òöd)±j=‘ ߃¢½kûÊ€^‚ò TXOd ½pÑ Žå•ä¥ë/óK›”ùªSÑñ‰¸õD–~¦(J‚ÞƒR¡l(!ÖGï\ôB!…Û•ö½G:?Yc{ð;åA©ÐÛPBøgߣ÷.z¾7›*¯îQÎwìk¹¶Ç+¸ l(!z'J‹2c=)ô>ÀE/ÀǾÎ%N7ÝË)ªË ÕŸi~ ?­'òîÁÍ”åDiQf”_¢÷.z¾”\[ïê*ØÓ¬x=q+66c=‘çpþŒÒ¢Ìèå(?J‘²d=Nô>ÀE/À?í>|EÁ.9Øñhà£õ8Å=økJŽò£W¤,)QÖãiCï\ôü$66SQ{[‘Î/mê¸ù*¹¶n=‘wqþ–ò£)KzQÊ•Òe=ô>ÀE/Àæ–#mOòŠrŠêNFúgã‹Öy÷àR–”(åJéRÆ”4뉀ÿBï\ô| çî›Â²V%9\Ùýîäõ8[÷à_Q®”.½1%My³øwô>ÀE/üÚ7 ²9ø endstream endobj 18 0 obj <>stream H‰ìÕ¡Áh„"éê-eÐ̃Œ{Å0ÃíŠè¸;O€ÿp<_·û㳿>|î°t:t€¥ Сû,]€Ý`étè>K C÷XººÀÒèÐ}–.@‡î°t:t€¥ Сû,]€Ý`étè>K C÷XººÀÒèÐ}–.@‡î°t:t¸ò`‡›3 endstream endobj 195 0 obj <>stream H‰ì×ÏK`Çñ¿¡S‚à%ì"‚zh—ô2ˆ@ð ^„ˆ@L¥µ`,HÁC Y•È£”2d3d6l*Ø'ˆØE2Ýöݳ½_Ș·Ï>_žç{r‚‚‰Æ<¾À¥k]ÕÞáÐì²u—ô>}«sÓ§u—¨cjšÎM­S÷¬ãçñæÝguXŸÖA{ŽÚÜJ¶vN¨½åµ½þùƒÔ‘u"ǰžš¦¾©u:=5P=´Nüî}@&î8'óA~÷Á$òóa¼µNÝÓª‡j£:i8+î}@&î¸%4»\Õ8¨Òz|H4fÇa샧ª‡:FuRÍ´Žœ ÷> ÷\±´²ámU]¯\œŠZÇqû`¶¨ê¤SýTK­ãÿÀ½È´“L}ø×§uàTÛ‰ýŽî)=`Êjzº‡æv÷ÒÖ‰Šû`©“j¦ú©#UWÕXëDÀ©¸÷€+Ò‡Ç#c u}zfßnµOX'*ìƒY§~ª¥:U5V½U{­®š ¯ÖÞz¦×uC³?¼¸f§Ø°戺ªÆêlÕ^uØ:à˜/ß~4µëE]Yßÿüå{ë8ʼn}0§Ô[µW'¬&«ÏÖqì$S÷û§/W?ÒŸ¾è_ëDE‹}0×(3pv/‚‘Êú~-)Mmã+_¿[Ç)rìƒù¡&«Ï:ju[ ·ŽœðâZC³_oæš›#3áUë8%}0ŸÔju[®ž«íÖq€‚°OÜéê\Q×72¶><¶NT*ØóLÝVÃÕs»:¯æ['Ìì‡æÊjzô>stream H‰ìÕ1ÂA 1‚ȸ¢Ef’”o€¡¸Ýâëïîº(y¾Çë|ößG€ŸÓ}–.@‡î°t:t€¥ Сû,]€Ý`étè>K C÷XººÀÒèÐ}–.@‡î°t:t€¥ Сû,]€Ý`étè>K C÷XººÀÒèÐ}–.@‡î°j]¸*‹§ endstream endobj 196 0 obj <>stream H‰ì×ÏKÓqÇñ¿!D/;%ÂDЃAìÐA/‚† „àApþd D®B²H1Ò`—ad‚Ùˆ<¸ A&* eš›Nëu¡ó÷{ßïžÃ`·|xÂ÷]ØÚuoâ2ÃûÙo—«^(lõúzÃãsÖs€‰Æ–}7ŸèûÖSÑ3ŠXÏÁ_t êi¸3JQ/zµ£‚¬çGöcõgcÛhN‘?×ÛÞv÷õúFÊzþÅ=˜±Ô‹ªQ;*H©&ëEÀ¡¤wvûžNç—vëÖ¨i‰ÍÇ­a܃Ní¨ ½‘jRS*ËzpW“ŸK®ß׬~'ß}±žƒƒp:‚:ÚkJ}YÏö›Wßz¦¯Ö‚²@ÿðLzg×zþƒ{Ð)T“šRYz/U¦Ö¬¬%’ͱ\o{N‘ÿvçKýµ^„Cát•¥¾T™ZSq„sƒ¡ˆ§¢GgEeÝP4¶l=GÀ=èDªL­éáÔ곞€,5ùZ^Õ§ïR¯¯÷Å›OÖspd܃ΥâÔžO ªDë9È" ‹«µM!}‹æ—v¦R[iëE8îAGSwªO êÕ£ª´^—ÛLnw'òŠ;ô Zß^ZIX/Âñqº€T‰zGU©6U¨õ"¸ÓóÑÙKWïèËóÚǣ߭çस]C=ªJ½¦ U§Ösà*úÚ¼Róˆ¯M—átµ©Bõ¦ªUÍZÏ€ã-­$ê[ÂúÂÌ+îè~ðv3¹m½§†{Ð}T¨:U­zY•«~­À‘R[éàÀÔÅ’.}XÖ6…W­á”qº•jU³z\õ«ŠÕ²õ"8Ix|ÎëëÕ÷dyUßô‡ë98܃î¦rÕ¯žX-«hë9p€hl¹²nHßžŠžÁPÄzÎ÷`6PÅjY­®U·õd¨µD²±m4§ÈŸëmoŒ­o¤¬álqf µ¬¢ÕµêVã*Ýz2Hzg·x¦ , ë ¦a$6·^„óÀ=˜UÔµêÖ‹«tõ®ê­ƒß è>³§ endstream endobj 20 0 obj <>stream H‰ìÕ1ÂA A$®h#3 å;Ãí_wç ]ïãóx¾¾{÷~‚.@‡î°t:t€¥ Сû,]€Ý`étè>K C÷XººÀÒèÐ}–.@‡î°t:t€¥ Сû,]€Ý`étè>K C÷XººÀÒèÐ}–.@‡î°tþÇ%À*·3 endstream endobj 197 0 obj <>stream H‰ì×ÏKÓqÇñ¿!D^:Âd PºyPˆÀ‹ÔÁƒ HtrŠbô5aµƒŠvB„JÑ@B3È¢)Ö"C[8ÍÙ6{Áƒ”è´½÷uÏÇAôö?ß'ŸÏö6öôâÕÇŠšþgnéçxhÞzr§óÁsýßõÓzrGßøÎ÷®oßzÌDWê›Gu3tyºü#3ÉTÚzrŠ÷`aÒ—®ï]_½þû*€:`½9_Oܼ7Qìn/*kkñŽ­Æ6¬ÁïÁB¦¯^ß¾  ¨j‚õ"äÂP`öÔ¹;z\¼2Ž,[ÏÞƒPÔ5Ae°ž€ÿèõÜç³—êîç®î N|°žc¼‘¡¨ : êƒ*a=Gl)»z= ûÞɊλþPb+i½öxb‡š 2¨:j…Ša½Gàçæ¯Û¾—™k^Skðë·5ëEȼ±‹ú JèT¨ê†êa½Ù <}wúÂ}ÝîÎ_~ôæ}Ôzò ïAü•Z¡bèl¨jˆõØÛð—ê†ÌîñØœõä#ރ؃º¡z脨$ê‰õìËjl£©5¨[\Iy‡·g2¾ž°^„<Å{{S=Ô•DçDUQ[¬àŸ[ɾÁ)—§K—·†kO–¢1ëEÈk¼±*‰z¢£¢¶¨0êŒõ"ì6šwW÷êÎVUç M/XÏðÄþ©*j‹Œ:£ÚXÏÀáÈrmã°îi¥•ÝCYë9p Þƒ8(FѱQsTë9íÇÚæîgEemÅîvý¢?­ÁIx" ™ì¨9*Ù0‘L¥ý#3¥•ݺÏ×6GW¬Áyx"kjŽÊ£ó£ ©E*’õ"€Bš^¨ªóé&VQÓ?š·ž§â=ˆCRT!"I]²žpÌ-|ú^ß<ªÛ—ËÓÕ78•L¥­ÁÁxâðT!µHEÒYRÔ(ëEÇP|=áí™,)ï(*kkñŽ­Æ6¬Áñx⨨Hê’ê¤F©Tê•õ"àøû-À7½& endstream endobj 21 0 obj <>stream H‰ìÕ¡Áh„"éê-eÐ̃Œz ÌíŠè¸;O€kÇóu»?>ûí#ü]€Ý`étè>K C÷XººÀÒèÐ}–.@‡î°t:t€¥ Сû,]€Ý`étè>K C÷XººÀÒèÐ}–.@‡î°t:t€¥ Сû,]€Ý`éÿà-Àû'3 endstream endobj 22 0 obj <>stream H‰ìÕ± ÂÁX„!Ù*-c°L ô‘ˆôw…kwž\áxÏ×oÿ}€[ÐèÐ}–.@‡î°t:t€¥ Сû,]€Ý`étè>K C÷XººÀÒèÐ}–.@‡î°t:t€¥ Сû,]€Ý`étè>K C÷XººÀÒèÐ}–.@‡îßÓW€1¸‹§ endstream endobj 23 0 obj <>stream H‰ìÕ1ÂA A$®º"3…ñ ”¹2gûó¸Çñþ<ž¯ßÞ}¸œîPº;t€ÒØ¡û”.ÀÝ tvè>¥ °C÷(]€º@éìÐ}J`‡îPº;t€ÒØ¡û”.ÀÝ tvè>¥ °C÷(]€º@éìÐ}J`‡îPº;tø·¯žC3 endstream endobj 24 0 obj <>stream H‰ìÕ± ÂÁX„!Ù*-c°L ü>B ù®píîÏ“v<_·û㳿>|îPº;t€ÒØ¡û”.ÀÝ tvè>¥ °C÷(]€º@éìÐ}J`‡îPº;t€ÒØ¡û”.ÀÝ tvè>¥ °C÷(]€º@éìÐ}J`‡îPº;t€Ò…kÞ ‹§ endstream endobj 25 0 obj <>stream H‰ìÕ¡Áh„"éê-eÐ̃Œy ÌíŠè¸;OøÇóu»?>ûí#ü]€Ý`étè>K C÷XººÀÒèÐ}–.@‡î°t:t€¥ Сû,]€Ý`étè>K C÷XººÀÒèÐ}–.@‡î°t:t€¥ Сû,]€Ý`épå-ÀA_3 endstream endobj 26 0 obj <>stream H‰ìÕ1ÂA A$®h#3 å;Ãí_wç ü›÷ñy<_ß½û?A C÷XººÀÒèÐ}–.@‡î°t:t€¥ Сû,]€Ý`étè>K C÷XººÀÒèÐ}–.@‡î°t:t€¥ Сû,]€Ý`étè>K C÷Xº@Ñ%ÀÞ3 endstream endobj 27 0 obj <>stream H‰ìÕ1ÂA 1‚ȸ¢Ef’”ïfn·øú»»®¦÷ç{¼Îg}€¿  Сû,]€Ý`étè>K C÷XººÀÒèÐ}–.@‡î°t:t€¥ Сû,]€Ý`étè>K C÷XººÀÒèÐ}–.@‡î°t:t€¥ Сû,]€Ýo¸,‘‹§ endstream endobj 218 0 obj <>stream H‰ì×1€0A A$®h‘3 *`&·[|ýíÍ m÷3Žóz÷ï#|J4éA€&=Фšô @“hÒƒMz I4éA€&=Фšô @“hÒƒMz Iìg 0¿ Ï endstream endobj 219 0 obj <>stream H‰ì×1€0A A$®Ò"3é`˜Û-¾þöæXçµídz_àUz I4éA€&=Фšô @“hÒƒMz I4éA€&=Фšô @“hÒƒMzø“[€'PÏ endstream endobj 220 0 obj <>stream H‰ì×1€0A A$®Ò"3`æv‹¯¿½9Yeœ×¶Ï~}€WéA€&=Фšô @“hÒƒMz I4éA€&=Фšô @“hÒƒMz I4éA€&=ø?·ÊË endstream endobj 221 0 obj <>stream H‰ì×1€0Ä@ A$®º"3-CÍœëû9ÎëÛ¿°•hÒƒMz I4éA€&=Фšô @“hÒƒMz I4éA€&=Фšô @“vzùÞÏ endstream endobj 222 0 obj <>stream H‰ì×1€0A A$®Ò"3`æv‹¯¿½9ø‹q^Û~<ûõ^¥šô @“hÒƒMz I4éA€&=Фšô @“hÒƒMz I4éA€&=Ф`[€b%Ï endstream endobj 223 0 obj <>stream H‰ìWÉn\ÇÝà"P”‘~ªy°Wl(H´@†A Ð$%+PSMBÐ6•m>#?ãœ[õ†zÝÕ)‘ŠÞ#¹Õ>]u«îPwøõWƒÁ`0þ¿ð¯ÿçwÝ?ñù¿¾ƒÁ`0 ƒÁ`0¾*xd0 ƒÁ`0Œ‡ ž ƒÁ`0 ãa‚çAƒÁ`0 ƒÁx˜àyÁ`0 ƒÁ`0&xd0 ƒÁ`0Œ‡ ž ƒñpðèÑÎOŸ_ïïýiïÑá3÷Ìóã_.Ï.ö÷~Øß“â/øèRÒÊ/ÞéñE§“¥/Ò$­ñEEúF_†Å.hg“8:&9²3FÈüçèãþÞB©ØEí´ÞuÞ˜(Öû{ÚÐvoDò¡SV)±Úßs!uZù8­¬IãuçµÌ+ÇíÊ«N)¸ªOª—6Îû Fxùäðâò雓Ë7ïÎ/>Šo‰;X(¨#CòÅ“//Þœ¿ËåáÉÉÕúù»ËcZüXüž–~G¤±ªÔU] )Eá“ëb z¦lÔ¡ƒ]ÝÀºØY¥Õ´²&­Ññ>Ì”5Rv^zKäpN½pëì»Utµœ"guüñìb±è‰åÙë7ç™*æP£Ibÿ¯Ž>V?íïä…"=«ó]—{rôýêų§â[QV¿ÄêïÄÁá3%_b9~ÚôÁ!ÔGè+}^ÝcDKñg|ûtü ¬ø^üíïRœîã·çµ«#| m ÿ÷!hB‚ÖÌÜê¼í”.QQ¢ÝÅöÊQèuŽ•âɳóËb,qònýþÝÕù©øåçã÷gbýîôln¹í×;®Ö|sNÆ.$“„•¦Ó!¶Èd>ñ¸7Ô½#ÍV_ïJ ‹w'uœÝxƒŒf§šöj{ýŽ”{±¿—ÄÁcqô×ë_¬ëõ¯ãî^Õº>ëk´_Ïo"𶯶þâ»ù;kæ~¢n«òE™üP}rækU$Ü/g…µ©“:Ü üB²ÑÑ÷5n~ÊÝiWНR3 š—h^×êÔ9çýL±kª|}Ð=_Ëäs®4ÍNcC¯&yï'ô¶Ý²nÇFÛU-4=ýUB«ôŸç‚¯o_òêo‚MKÝc&¨ƒíf]¯ªº^%ôE9“ÿk´¾¸Áû·ë_–-Ÿl‚Kû«J?|ø~lƒƒM’:\¢5*‘.Fê‹%L;&òãÍ´~]·œï¼×¤°V1Wº¿É®jVi*z¥¬šd½ÿU¯äàu+Zë.™˜Ï >UĪ'”´(‹ãùý¾6[o^þDÆ;xq~~¼>;¯/ŽOßœ!zŒyL3‚—‰†‘h2ð.wƒçésù‚iºM¢Ók‘LÈ'•,i‹€q8õ;â·£õ°Ó¸„iQ…Κàvï‹ha# _ŠåÉç»¼í±Ž\ãºdñŽéØìœåò–qÐß;â£8?GOÈl˜ØUÍ:£ˆÅɽ€&Yï5L‡Wà ‘åqÜÃxÈ#ào¦H#`ù‹¨ ÖÑ»Ó8—ªOj¤ðìRŽZ˜Ï\•6RA¼)dBïQŠ8ÄÀFÓJ²FÐ^:ðX|(+‡í¹VË\Ú ºkñ}såüô»3›AR³Yú†¤œ4ËÄ­r:nÜÂu&ÅTHhVÔµØîsÁ0p>TvP‚:™Òðl³‹¼«Îdßú Šm“Ù;ª‹p{}ÛÉ‹µ®=Y[¥)ñÕ<)õ&ƒð1uÑZ=‹ž )í†2Iá8Ô›8­ÜMâ)æ[{º}°;É)άë¤/­¦6(ÕHâ³…mróî»Hjdÿf–?·[­Ñ2*®˜(libòÚín”@i•+†Çªh»èšTºÇê{UëžÒP°’ÄCÏ·G1Ós+ÁÚ¯¯è‰ä…›îX9Èœz¤Î>ˆ?Êþøáøòäg¡$µI2Êê}›„BŠNå:QÁ=—CUI :k¡ƒ§ËÓ=ÚB0u—ET)[ìÚÄ"8ê’d˜5I·:tyËC+kÍ:¤;IašÒM ”Ë͘¼N96†fh"-V†PH´ºŠ&+4Ù Mº†Ü…ÌŒ6’“¦Ý•!·$öÚMû+KNde´Ij“¬,¹%së¬Ê’93Ú ¶IÎ,¹%sÓ’¾³x[³¹ÊFÁOθdmÉ ‰å@CÓ¬×afÈŠ¬m6 h’“!·e†LS™¯ Ù“s›õb›äÜ›2熤²̵!'®¶ :v'9rKboHB႞r"'›UšdeÈ-™ýYÓµ&CŽdm³Ql“¬ ¹-s2d#ÁÒ ãP(¢¸3ÝÕzƒT„1Ö£è#-²dž€œ`z;Ÿ”øµ¹Ìê<H›o\a뻉ÉM‡¸H¹ªILÁÉ>yÚÎ`>ÙEôMI5‹î²ÉùX‘™É!J ,—™˜dϸ”Êuy …”e£—ª,Ãð`3c%†5ºšŒè6úZ‘@¢Òù¹!'ÆÄl’ŠqJšac!Q˜\’f¸ÿHfí³|#]fpë"ß:Ê^×@…ì…ù Ræ´êÏ„Ûba’!I·¶qR ‹ðvÙ[;J -ÕVWƘJ<ÂÃ8;¿‚ÈyU_u ´QŠÉZŸ´‚´Ä´OkßãGв'QÕ1ZÍã©MöÛß¶dγ‘ÌGßE£§PÊM€ëõÞyív³í—1qY;•‘oF¢‡óµ_‰Ñ!šÊ[`ÜÌU M£“«mGOUÄè¨M“lVCœ§-=Xl)‰°¥®3¢W§š ÆxÁàÊF%Œ·tÈ@W¤à޼ʩ@’ÐߨPc]˜˜¼IØea=¹š‘°aÄ#^•¤Í ¨IVîH-¿Y;“‡””s 1£°!×€´H»U®I”lC¬r éñf¹&áaS¥šDÃ`¿ª¤ššSÍHÖ©¦&‹ÇI<â« Edš¿rp(BªŠ®¬¤ªD°RÏS ìª]ÚˆhÖËTï 4Ô™ |ãç—@)cê«a6©S1co…hj&×÷µg]“õCéIÛß¶d6R‘¾Sž"⿬WÛŠ]Ç}7øöKÀ‚œã¾_’'`ñCè-LÎÈ–`F2Š‚Éßg­Þ}©Þ»O¤€,#FkvWW×eÕª”¯èܸ«»B™ª„EIJþpä¿#‡Eý÷‡ EÊôíßÄJuÃJCÚeõ\]Â<–€X ‚é×5à¶;Y\’õ§TCÇÇݪ¤‡¡>=Z4š°0JGx\Áç•Í£ÌL&Íwj¡÷z¾³ƒ"ÃVãµÁØ;àt“\¸Êwà¢Ò CèDÑqdOt«T’mA ^ ±0ÜÚbBZ[œãrˆT§2~–‘Xd¤5ô¥„Œ$µ›e$A¯¢‘Dàƒ‘D´‹³Œ¤ÐŽÞÍ2r€¢Ãð–kr1ÞERÌ*ûñ b»j$·>q;A£³Ð‘D”OBGB"»aÖ‘C´BGÁ?„ŽœFîä>{Úi?EY@r‘³¢€¸ÉXɾû+•¨O"Ý׌ÂĬ# š £< N(3}˜Ï×­›ÈU tWG¥µçH¤Wñ©J¹ä )@ÑУʖàБg›Ó2¦6µ½~úö›Ð–²Ã‚Öè_m?á/ŒÌŒ™‰ÂŽÉY]~@á$ü•Έ*^?~ûÍÅbGç·¹mÙÂcgÞ\´ºR§ÃBgLsƒB‚ˆ9H  Q±Wâ¡î>hµ#¶Ý`¹û¥ä„ât¦Ónsåó´çO>Õöª£šmjÔK:\Î~b«I/WØ%±ʇwPDhå ¿€·Œâí.—¤ìaG±!ep c*:»?íŸ"ýͦ}iˆq¿aoUÍ ó‡p¯”ïdñtw ¦SWC6Wï!¯_X}§ÕhÂÑ–ÎÆôX uØCŒˆ¡ªKØUÔ%Äõ­|M…ÚeSÁ@Þ÷±Ü1­MM£iöʘ|8÷H,¼þùÔ4G,A¤ÇUBÎj¦ë¤áû ¶¿´ëéç…ÅšpSf;ah;­ iЂ w²–`=þ¼²YïB·͸£dsô½§ å ³ÞMf—`?þ¼²9Ïõ‹QøhðÞ õ¡JÂdÐ:84N‹@ž,Ö×ó"’AV— ˆäÉæé.ÉNAkf—àÉ“ÍC$Q½Úç8•dÇD,4f"†Ôq<ÚkOƒøÈ>ÂØA±a` Ê0m¶» â"ÄôÆ Nkf—àÆ£Í9ŒîjЦQì ¦€?ôzÇFÖúøñ Ñ)„Á§W؈ßÉ^½¦û3¢×0§fr…ÉÐìMZãL‘Z¨ê•¦Ø'°(v"àa7{ÚÖ»I±ôÄC±‰V )NB,MŠsÐäà&Å>@!Î/6\¡*Â=pˆs÷Ù› Fv â›§b'»µªØË¤6me¤d RÔAWìäVM ;AƒŠˆ‹N(ö iŠ}€B±O`y~±ê¢VdpqÃ-ÅrqÖh7$õþÊ$´x ‡¬”ì%])ÇI²—¬¦äYd¾ôû°ñ!Ï^ Œ,Wšák/µþ4É~.S!ÙGö…dàPç¢Ì–àìg›3AN…ƒVƾ»f›çªk˜¼ó]Y•î€Ói8X2µe^pOÄ.uý»–, vªH¼r…ÇA™‘«þÜž+‰ô\¢r­ÐÒø=T‡Ku Ðk¨:".S ]_¨ÒÑÙ§r@Tâ*“ù™Åìð4…¨»¸#hì0Û>w‚Mf€™@¬4)ï’X“Ø -A‘½È=1,‚q4؉ÁÓ>"pÁÛÁßL´3}+ý×Ù[S9AÞhÜÝ1AÝ+/¦éìDþX=k4®)6 !Ç—9)4”y)Yt!›©D…0LPQP6‹@©I¨–BQ‚²G)µG •è©_÷ u8°Ñ¡£ŽV؆'{Ó‚¥6µ½~/´Eë°tíÿ>WÛOø x¬›•†‚¦TrNè:ü€!Xæ,ÿÛ^?‚L2 R'DH-eË“°ê ܘÃR¼òãÕj]¿ó;(wÁÁúî‡-æ¬×eÞŠB«íáÃÃÍûã÷ïøøéOïnŸÞ}xÿøñ?Ûˆ©íûßÚ¾ûáG­¶Û‡—_?üûýÓö¯·¿¾Ù^><½yµýžŸý‘á>kpš;àíâþ¨ý:,*{éO.Àg“ÝŽ!gÐÄt×ô?Gÿ32fʇ§Kî`_éMžWg´ |Ó+I!3 ßÒW‘>ùÒ N!Y˜üy.½`P­í8ß)EÍD¥‹(žd&;Œïî‚‘:e‚AÇ|lÕå|'‡PÚhþn‰ü¾>üsï>þyxËæÿîïïß?¾¼yÚ~ùøøôî ÒÒ+üö‚CÖFõ—Õ¦I=ä•rrÿûá(|Åÿ »MÆd1â‡þ«Ñuµð^Jèaâ¡tzÿ ƒØ|,ËŽXd&j òÑ*LAŠ$éhZ@¢A—-?lëÛñÞ¿¾ùmûs{ëß~{üt{»¹Wô6F}Im™Ü‚Ñ“0î?áu¬§®šÚ¦â/ª:Ήù½½~iç, † Ô w…»'/1qgKm7ÆIcÖsÉùü] í—|a0Jþ_×z@n"‡_…Ú0Ÿ‚Æú8Õ8;+·yf%c7á2@‡‘¨’ÝËB"C…€îRÞýðxÑ=𳃂9 JÍ'í°”5Ô±n0$!3°0 5V¡Ì.`Þ¬#Ö-g¹‚«Bb¥XÐë&ZÐ R¾rÆ`yËHÏùì½U\ð›ËE"æ=Eø1LÎ ZÏ›ÕÑÓµ¬‰/8†[,ˆ¶ÐKŽÚ”s_è.kö¬‡×É}ýròQCcašÊé:fiAÌÊ"Yƒ˜+Ðfn*¼Ê]]ôÙr²:¦ÈrKB1C  ž °xæ!ªR®ƒ Pƒ‡.BÖ¢°œ€Dó ŠâÇ¸Ä Z¶ðP„9|€Ø#œ“ju~èkrÔ˜8 aŽÂbŠ. Ùu¤{¤Ô3_po!™ÏôDŽ†Ú£Kvør‡!rAP¬(Ô÷£¯^PR(ô*7<0®ËŠ šV “©¨RjV]ÇnѦ”2üªõêêÀ똮Ûëú9c¼ÖÓÏ ‹»ºáöƒ bV0Ç— ´Wïv­! ,Ázüye³Þ…ÖGÝ'#@£¼ÙE¹ÉììÇŸW6Ç"Á¨{ð‡}ôððJÌ6 Eɘ5pħa<Ú«O§E("Öm®0Ä“ÅÓM"ˆ œâU­®°)„'‹‡fˆ;,kS-vLÄí Àï€"ˆG‹û… ‰õÔ"ˆ–àãÙf #ˆB½"ÃØÀ)dÍìœy²9’ƒÔqîŠ@LÆŒK—Íé8y²X éalÐY¯¶»Ž#úÈ?ì—€|Æ}¿$OÁ ’‡Ð[˜ì,ÁÉ(2&ŸUÕ·ê½ûdÆÁ–‘†5»«»n«Vx‰ÃKPñ`¯ÝÒ4BØA­nt ÊžmŽ.8•T§Ä`ˆ ˜ªµ>á;:Œ^U¾„pJÐP7ÀH¢nÇ1³Ò Ú®NB „!ÐPñp}!·AU9¨³³Œ`—qŒ)éš ý÷¹¼³hœ!ó±¨%Ä&‰@¼V¶,`b?lcð²÷lßXÃHV¡<_aŽoDKØ)Ûë1äcFóp2†Š`Ð3‚­/ ¤f“Õð]mÆî'Î"ñ Õ#ìgÒWzzU‘KI¼uTZóG"ìö¾ªÒRÔz{+“_"‚er òfô\Pk°^Ùœ‰HñÅø3N…4cÓ›ª®ƒòâˆÐz ՔǩÀ8WKPf¹3‚Ö"YÔ±±!œ,êêlÒ”, µæÏ[²º¿=YéÉ:…å8 !(u¤öò`‹TÇ¡½&zY’±Ø…ñŠ ˆÎ¦{9hr. 2¹|¦µ"S®,4k2:m |PICà» ôT¦ª`¹…— ÈI^%Ÿ@E<ÁåÒ­5ʨ41F§œ”é‡ (H€Ç3çtÁ'Á9‰6PººsŽD:çtPrŽkÚ3ÍÊ©4ò]Tfîv`xceÆ^ZÁ0„X+Øe/‘M`乊‘Tåm”G‘øÐbÞ€·½›AUD?§öJëîH¤Wñ©J%åŒä×!t• ìç^PK°^Ù\P õjBc‚÷W RÁ`y+³?ÑRíRhæd°Ó1hÄâ£BzÃNCÚuõ\] i–¨T,«ãv_CöòÎòªñ™p§š::¸We«~r\´›°0ÊG¼¹‚Ï+›µ©-ââÃ|§F!’Pœîì È2IÏì½¾NO†¯1Ú ôCSÑ«x> !!ÊÖ#$edoZ;;zcxÜzcBZoœs4({•È¢’¯m¢’«â,* ÔJ QŒ…ŒÖBTšEe0æÎº'Q9@ÑftÜ9ån"+f•~uñ ½Ÿ»„$†gÄéYT˜´¢’àëgÌð„8Ÿ'‚'Ì„ D%!:*!*'¤üÁO`É:ÙOJVÏñåC;±BS²Ö ýA‘™/ Þ* ¸Û˳WY/í;<+èù®Š‚ñÔ^hÝô">© ø‘{¡)(zÙšòlsÚÌÔ¦¶÷ø¬mh‡m­üÏS@m+á T€jD¥ œ<ƒ<•›Ù¦‰ªwÏ!‹/o‚ ÞÞœG&1ùnƒý" -æl%·„…})¿\ƒ§ÇßïÿUBCî?Pz¾ùǧO×§ÇíÇ/Ÿ>}ÝBzƒß^0´¬(¡KV›¦Aî5Ÿ,ßÿøûßÑWôŸÞ.ÒÉñCÿUñÎûm˜¡ﯜ+ظç< ÿ1§Œ EDˆ^$@ÓvŽTð`€ZPÍÇõ—Ífõ>ÿõé—í/Íß¿ÿòðuÿ°¹7ôâ5”žÚà³"ÆH0pÛi"“@ãJŒŠ¿þÂðÞUÞŽ}(:m¶÷×vÐBÑ&ðsí—›G/I¸A÷; Ã.Z¢·—o£¿êØÌEpÌý¯~^ëý.’ù‡~÷ý—¯o?î_?~þôðå?ÛŸSÛw? Òß|ÿƒVÛþùúÓçŸ?=nÿþððÓÓvýüøôfû–>û3ýEé¤Yw£çïbŽ®ôbÀ¸ÂDEäðÀ’ãZbü˜K5úÙ¡E ‘àmìxÍ-ðŪÁ´Ò™šµŸ´£p%ŒTÈÏcíhÐjÂNyAn¬B©]@œYƒÜ.„FELRÅbˆ„GT;Hdž1bÂ\?Ÿ½„èá@Æ¢ç¢BW@r‚Ï€W.à)óšk©&^qÍç ¸Á‘ÊÐXï_ý\KZO‰£°`Úüæµä£¦šKéˆ1-;üld}¬  ,Ò'ëm€²2w¼XF{m¤2BIƒ»:DÔ˜Ásâ ´ hÌ È]qPAôèŠ6Ä„í6FŽŒÇ2EæT*Qf,žž|<ÆCHkà9H\H`JÎ%ÝéäPðÙ«”^s-sË‹ç|F­9èŠm)•s¯{.íX1h¼ÖTlп}%Iqçé½% ¨V²"EAê;AH3kJ¡­6ÜŽÙ‡Û`wËe(û"™HehkR-ÞœoŠ”×(‚©<½±¤œ15å™QŒB[2±Ém©È˜ò Š)¯`K:ÛÏFHèÒl–?mÈ iY}tN¨ŽŒû×XäöPÚ€àA®õp¥«nßã\ÑŽá»4X‡•6dVñ©JÅ”_ÉÒR@ÑҫʶpI˳MõB3syýŸ—ÚáÕöEÜæòª-àŸ­¿×ož>yæ  ë/¼7‹­‡,ß9jæG²Nˆ=l«6Û‘Ÿ^E‘ecqp´u¸€˜rÙÖ~¶°/ØÙì{¹ˆ¼§EoYt· Ú‚3@bõ äÉb÷n­‘\PmYØBÉ“Íã^2’ Š M³{("y²yˆ¤…¨%©’\lÅÂpKK¸=\‘¹ðtµÙÙJBWú ]ŠmǘMªŸùäÛg™jLÁx¦±°ÁŽìÆŸ°º_í×›Äyßì[Oí_æñ ±–‹Á¹îe•TÁYfŠ[¤§´dÏ€÷ ¦Ì…·Ö"óµa—}H¨>q ä ‡•g¥¶ü¤º}Ý•©'"ûxKÙØ†Ý„Éß!…ªž6h,}ØÙÛ<@Y¤hEuÕ ‹ô¹¢+n°µ)±62y‹ÔJ®fh e>°G¢hO0Œ@¶$8UH¸S9‚c9Q9š®ÎI2stŠÈñòÃÜ‹™ûÅÝ™ŒÊxTð„ªfâQ%©”\IL¥‘ÈúÚ¢ô1ñgÈ)4S˜’©$.rm÷Mt™¼Wç¡j,¾ÇФØMÞ™ÅìĤ±(b㼘4L¦±1imrNL;gí˜4 bÑ“0‘!1i@² ELI椙PN [ÖÙ¾‰ATˆÏN÷8EG¢ÊØË@$ ±Éá0hXçÜ¡°­#'—ºã IÆ$}‘‰³Ì–3‚Ì>•¨3+óýæy”põò¬¥ Kvövc.‘sí•EÔ%£„k d£kÁá0𨅠Ø;çqñªxÎI;’ÔíÚºqâ*,¡$þKì×ɵžsœj|¶N>L¼6U97•óu~,mY…³ÎÜáÃΦŽ8Ïà‚Ú…mÖCm²™`üܱÎA•=‡G»$þoÍ(…œã΋Y´7g $Û€cœI\·ÓÃÑŒ.8…AG Ó;VB1JV£eQÈaèE‹bPrÑ&Èm—ZHìR!T ·´"ÇHQIÅÅV+a-Kþ[®Ù–Îs$BJ£›AˆNMnîrñàð1¸5·(9=¶ÁL6qMmÌ…’½ÚŒ™=™Ù’UÙtñ"ÿ–€Ödü,qI7öÌKÁ™O¢ôZê|,¤JÔòTQ ”D£š‹À%Lk¡1ªg)M'%zªA1§WŽ—œlö笘3RðdK=¦ÌÅ\^¿E›‰GÕÜæòª}À?[¯ß`h¤‚JðœÜ”»2wž#ì#·9µ7µíÉ5¿ìòßt÷0 Žîår–n%…þ̵¯õáióæÎ¿?ñéóo]?ÿõáý›Oÿ\~af.Ï_¾ÿ|ùñÅKk.×?|yÿöò÷Ÿo>þqyüðöŸ.?óg¿òOŸ†ÚÁãÕiy<Ší‚ÁS‹ž8JÈêÐäìr…&¤Ø=Ȭ|0W±zuÜe¾“K"-(d`Î\á=4áýîË[ðJlDÃøv³àý·Àw»À>*ˆgKÈo:í6Yÿ×QÅÿQïÚ/[Œg§*­ì͹£ †­fS¬ª,±Ü –TÕºÛç»–—¬$D™°íy7…¨ë@L˜envi¸1#ÎüŠ”ëèžòðU+ÌÞ€çÁq³jO¾u¯3|W/‚2.ƒ«³@õÜ2up:#7ªæ‹òÈ6ôØÎJ"|˜Â¡!ìLÛÇÂE¾ûn¼Ù“ÿ 0?Ã/ endstream endobj 224 0 obj <>stream H‰´WÛj]G}èúÅ`…œvWß;y²0 3óÌèÍœɶ@G2ŠLÈßϪî½{×¾œD”ÍRwÝkUõÙ«OF½yÿ¤^¿}OFŽß¾ß_«?¾î¿Ý¨ãÃõÍ…úùüìÕ§_ù×ù™QíÕWûó3r:ë”OE“¬:žŸíŠ!Àuð¤>HÌÉÉèCP>xc´'±¥’Øg¶òÍÛǧw·‡§Û‡ûýã_êÆ~ÐK|1VÁ’”½£úaBÎø(†J¤! €ó§Ó<+CàH‡èfžmbDÚùE¨&PÄtKË ÅàãùYQ¯/ÔÕO¯ÿmÇ(™K6®à#35vŽjÔlLºD8n­G´qÔ$>amÐ֦긅¿¶”ñdªž[—uŠø¶&ëLl'‡ë”½¦b}K@ŒrXœk¹À9ƒÂdÇ­‡9šRa(ÚÛ˜VD.°Ò@˜iL©˜Á‰¨C!Xt‡-®ž\+:¾gÖ¡1¢³sÏV`M l]ïcàÿÚÙ¢#§¨ô?‰6JðòXã—µåEœv^[ Lr 탥Y ÐÎøH©¹j —ʉ“£ÌÁøüï›?Õ¿Fûsÿtøªü[œP‹*Ì8ÅÚìíß8mIƒ>‹‚¢lG—¹Ðì`»Í\¹Q]Ç‹.$•)zˆÇ•W¡v—Š º°É僅ÚOÎùçhã?ë&BŒíüXÇ7Ǩ²m=—/B Õ–A¬LÊ%£—ÆŒµ¥RyL#á •¢ X¹uHÖÄßêLJr\):þcÙPŽ(?S‹?“ç€åB<»–ÅC`²¼Ú!9Π+w…PÈ;ï´Ï ›qÛ¡ó*]ÅPk'BÎfœ3Ìmi^ßÝE I0`æioÀ‹üWNœ)L‡» )8z–^®Šg݃Ӗ‡'QªŸi0LåŽ1Oóÿ£  ‹2ÚhVP+°r3ª5¶(“M猷i^z#8+Ò-EÿXPŽRN\Pä›#WøÓ§5FFDàv¼´®í Ü‘ò‘S`ÊÚ»ÄK \Ȱ¶Ò6*§S°óus (›Õåd#†)ïÁ.ÙçFG;4Tö(ú2 ˆàZ+Í<ç"¦|qqpÉåVPÏ4—­5±ð(Eýe¨ñ‚ú›ýõ§ï?¸î#Ѩ.^0îêÂrœ ¡µÀäèÅH§Àáúݖ̶ï8<<ñ…•Àû\wœ 䨴á9IØÇëw[2]–½.lxì,‡Æ/x'¦Ša†GÅHðMá]Yç¹—F„ïhs˜À4¥YVA|sÓmb¯Á†ñ²ÃØ_ƒËS+b°T$aGaĆÔ.b¥Ñ>|ºvŒ—v¦×bùÅÄǰôUl5bKÚ§+è‚õX -€¢˜#[ãp¯a–_f­`f ãݯŠÇ#«"!†Á Ÿ+¼³£õ-S¶>ÉÊà$_C û(K?!C6[ÎGðC}â¬ô»¬Êš$ÄóG;#¬à rÞ [{•u$RÝ>lUh+hRïDî KûØ@ÃÿÔy1mƒÃí» ‰s*2U«cÊ(¢êà°7Ù0/¹J½ù©Ärœ]7 E3P抙°k÷õ\À^L"WŽwr_æ¹èŒÉ"WÝãž+‰ô\­³ŠIGÏ/$<­œ© RF> (–Š4Ùγãî ØãÑŠ‡vѰ{À¢Mp/ Tq;ƒ‘–“8´T_Yü0ù†ož#)¹˜ÈFHŒ¼Ã-A<íÛ 9Á6Œ¸Ds¶芉‚m€XãH° E%›0g€)„"ØÈÚ‘m$2²MÇ$ÛH°eœÅ' ¢*`Ìróâacç5V½$Y‡@R¤4ç„aòó˜*Ow‘uc¥ø4lb3+PB„ $ŒM+‡ÒÂïÃV‰Jº™²_¦iÙAÙνž6ÁñúÝ–Ì-Æ ¨ìP86˜Èx/´ ¯ƒ`,kÊÄÏ™ŠX~11²¡ aCn3Â@Ha&©#ƒÂá^]ÁÓp’4üI߀Ô{ݬ~Lø3HZzxvÛQ§äÚ~X6Ü$AÔÏdòÞmÉ\ÐTÂÈ¡¸Ð‘žP¼ÐÙA™æˆ÷BÆèØg×1Ò)û ô#q‰&·ç“€‘˜BݤÀ™ywÀAÊI¶rw¹w‡Dzw¬"³ˆ\[]®“lë$öèíë$J4_'³Lïë$D¦ˆ}H aåìû$öí\8‚rŸì Üq†ýl‰œàr&¯ÁÊ1áøäå>ɈvÎÎðüèC¤2<“‡%¶1|6x¥Å> °³wcx Á9+^"#ÃwL2¼[ÊY|4rŸRhA­°•’“5ÆN’äh1˜Å>‰¸zZ™~×霳Ü'¹6|\ì“\Bõñ3ÙÚÇL÷G ½„W%* ~̽Ü';&ºyª°MPì“K‰³ç˜QF]]ŸŸEñ,9ߨÿà %{Œ~5å+H¦?VzÔ0Ô%79ÿ¨«=\)–‡¦S%Þ¶G•€µU¨‰“K@ˆ̯'cÛ…5èJP9"˜Yo'È\myäc~r©¼yüêÓ›·OïnO·÷ûÇ¿Ô/Œõæýý“zýö=ux8~{ø~­þøºÿv£Ž×7êg>ö+ÿ‚Â4ò–+ƒþ: …d¸‹C™[AAãA’‹Œ‰ÅÆæVp|àg’¯aYë9¾c9 Ï3¯HMK5` •–N ”~Ž ŒÈZàçZ‚e,=±”@áq¢WM.mgùÐ=(©Ÿ< ZÈ,xjæ„-' 6o‚£¢l±€¥Ö–6@&câà&¶2ýxù{k:þwù•»þõÇûûýñæZ}yÜ_ßÞ g1_à¯;tœs E½+Fœ"?¯¨Þl¿/¿œŸñ)þñj‡G²yúè­W Ô屆2.kË0£“R}v±dÿÇzµëJvÁ\€þá¤fÀ÷#]PraN6®m8˜Édè÷]Eò°›s8Ö5°°º§0Ý$‹Íêj銣Åå…¦j1“¤:(I÷Š"~óË‘rœ'þë?ÿ8~=Oû÷?~ûýóßGø ÷KãíM|Ù¬ßÙÉÝ ðÀ’w‚=Oœôö±wüQb<¾?Ï@´­£˜ŠÖ «ý>´g w•2üÍ·OY=•Â~eÕoÏÿ3.:4ݘUà·k'Íß>ÕÕþÑ‹èì¾rw¦[ˆ!z­ïTú¥Ð;ú‹ÇdkK—­¹§ê• ³BþàëBïÀ?­#[êÈUt(‚Ѿ^« © í„¿ÌRuƒº9íqÃïQ‘‰N ðùA¼lò¬¦lÐÔ]‚¦ÝàpoÑïbo‰Ë¡N§u·&‡vGŽj ®n6Ðo|i]–ÅWâbÀTÄçˆ2Ax¾}}¿ŽËÐõÔ@/Yâ/(–¬Õ­u›Rãò‹K™ìA´œLK«Ko‚K‘îúÓ‚ò6òŽE]I¬(çßä«>¼Q$FIaä2ÅSIÈ)¤Ìf˜Fø¦æ6#[Pôh\×§DQÅÑ ;‹Z±,ÌKp¦ $ µG4ø+8XͦPŽ^óKèÄnJó…@ øZX<*ÅäÒ#¿¸eøuØ;”$üÃ=ØÐ^UÚJè¿ÿÓ'C:÷j(é4´)›Xšu¥±µ£+ÓÀz]RykB—s½B¤‡Á«îž;a¨À„·ÏðÇ.g·@>€}Ô#^;ǹç¢øXì:Ãá]αV %Á4Ð÷Xk‚%áýšu‡Á]F™/H»GÙÀ**~°b0,‹äÒTüH¸fò’³¯)“ T¤Í {P˜¼æ|]K1) bmfÝaŠÉkƕɀ‡F+­KrbšGhz¢ÛƒŠÇKÆq4œ´9í…F…±™`‹)/ÇJ°Úè7/$NP›I7¦ð’ï…ÂLAöqåp‚НèÑ+‹õo@Mâ%g_3¢¡V‡éS³¨@ÅØÌ°…ÇkαÖܘâQ@EÚ̺Ó׌ÂäF\aMÙ"Ñ}3f°ÐuEPCwøŠð¬V4fÊGÅDÒëÑ¡?»¦¸ e.è±@q|=-oÐ}‰˜‚ûŸњЅø¡A\XוàžÞ‚°Ò¾–^ÐaÍô¶z‰8zµ†Ts"&Âq–„­ü¸íptnþ¬’W"¦´í…»ƒË‚îÑš‰dxßï¶ É9ørHíïZ}§»%Ç#¨ƒ•µiú)Ì0Bœ–; ‘TLn[ˆ‰ZpuaîÝÃ@6$ô#†à6m²)|vV1CUÕ¡—•„âÒmEegm°‹.›` ѽÉ^g™Íó2Žý¹+Ñ^ÑöøEß<'´²ôú=Á ~`nÖjÚ‚gøc—s#Ó†eÊTÆYH\¼x¿V܉ée3œSyêh¼˜ÕôÔS0i†Z^@L0Îdu[Åu%’ÛÂø™²}¹-/ÐbËmÍÏÛDÝÖ…—%ÇSžFÁˆ“ŒéJ®AKG$YÒ#ßbGQ1]oˆ9ÇbÄ܃¶šˆ Ù6Ä€WAhãÝÇüX@6t:Ó ÛþT‡ ´à!]A­`¬·Eä&X µRË Á˜\¹!‚A0ŠÜÌFtZmpg÷ìJ<Õ†ßÍ› µQߢ6*µQà¸ï–;ƒäYÜA£]—7Ú¦ÕYaí„|G³ ÉBòaÕ²š=O¨*˜××h—XŽ&•H‰6­Û@ÅÚ$íÜí¬²y"A¤‚¯ªôFÝüh?O ªç,Õ´ÏðÇ.çFo`:»°WC2SÓ€5ÏöoÐ,’9ÑB5K„gÄ i ýˆüŒ*@Ÿ)©&2Vt¼Žt¨T¥VH œ;&›?S]Îø9|íXTkíüñòÜ&¨Kh†Ÿàc—óE§ª=oJ­Y ÖÙuÍ ê‹†¨blÝc:8W¸ƒß€úµíüËÕ«ã†L¨êqT‚]ÀZ–§<Ï;‡ êq\hYi‹ë{º)å'°ùI"¶¢ì¦ŸŒnÝKÙɈ©CA;IIJñ61:øšòâ&#[…«yq“ªW]DxSã-(gŒÐ¡êâ,.¨fG$›¨Ü$‘˜šãy'h›þòÎ ¡7®SÞ£ÅF³ºI‚Þ¤tê{´ùlMßշ軀Jß8.¼åŽì9gQpS¦±«j‡`ñQ•X;¢v“äÚYWyçUµËÐL°vO;c3綬ÓÓÈf1wÁ JA©²y A¤‚¯ªä]®^ÙIÕc–rÚ‚ÊN^s.™9Ìñý?ÿ”Ôdvо9þ†((Z ½ÿ0yP‘ÆVÅ´ÿ¾ÿöóO·dà B<Æ?káùŸ;;¸y¶¢pÀÀWY»bµ3N,£ÆñƒÖRâ{µœvê,$‡²D¶ ¥€œhùx=çnC ä†6E˜½e÷àEŠÃŒ¶¤œíʺZ³ntݼ瀻ž|bŠ¡Ýf¸sOzà6îÊÚ¶á<. ›•5½@nÉÝKÉØ¡)˜Üº2±pέºÛïPÁpôëï˜(ù´f\»ÁùcÆ»uëÚ#îÀóŒ®`£QV©, ´cb׺¬åÉiMÙbè¡Úa\Cp‚Áÿ½Ç¼Ôqã}c`ÅUtp³õµçSÕ³a¢Á2 -ŲžËà*ÉvĽÃFìc“¯¯ è¸VÙÕvãã&ÑÔZ©á;ìŒ}lò QÂí׈w‚‡ÙÚÄScž³RZ—Ùa#ö±É·voO1®QH¡çõe¼ô“(Á„‰ò.ùúr.äML5Ãw˜"ï’ïeEž`B”,³Ã„¼K¾LjNnš2Hå &$ÈOƻD޼K¾¾\,w—a4ySDÍð¦È»ääÁÔVœq!obB”,³Ãy¯ùVòà^|Èë³Lˆ‚…öΖ7˜wÉ×—ƒ±îJ‘71EÔ ßaмK¾¾ÌÜ‘"O0!J–ÙaBÞ%ßâ .Ȩë´ÁÿŸ Á Åæ†ï6ôàD‚o‡¿ÛwŒ1Ó'Ñ}–†ø„±Ÿ9–¸ bÔ€1x5æwb3wCüÑrã3ì1C#hóˆmÓÜ+ÙINŒ€µ¨8…¥Í²ŒB÷òÎy:äLäo,œ.¿±(¾cóR pÍiÛÖ}CÚ¼ ¦“xYÈgLG\ó7C…'1©0*qò!ƒwmé€sm‹§»3‰QpƵý†H Ð$hÞäüî70% ÖYÅjUÅ$¿dæ$Æsêåqäè­Úã( yùæ9?/E§<µ\6ª8uO71$h†.”vÆ>6ùV%iÆÙ£®9Ì"Áš“+G4]LSkzÖd{LÅ:RüSW€5ðpÂ+£QÆM:Äkà]\«ØÉz»•yÊóZ40îåÂÄKÓBñ5_fX`§ž+Ö\482ÛË1 @ò†IñSÓøÙ¢|¡!–ùÖØTú’Çl )®‰û?ÏÖ*ºÚ؇Æ2ùî8Bàö˜-@ájJ¬©Ý‰p6ˆb(Ù¦E1€µÆ1%@ľD3xk£Ò ¦Ä*š¶Ð¦Û©èš1Ñ µ{E^…z\:ÙõÑKö”–O•‚Òk*‰U¢K*n©NÞœqJHx·B$5nˤuyIòª:gÍS(`Tç¥ü”nÌë=›ÄSaêmÎrÙagìc“o£1Þ] |†(ošnü—õjé±ó¶¡ûýwS :7’¨g» M€²õ®0®c4ÀŒ¤ö¢ÿ¾‡z‘Ò'çQ82£3")òP0¬ ”€/ÑVÀLÿÀS¹6ÞàfØþ¼¯Oq|„†ª›Cͺ­&51nå¢ÅÝ=¯ bªê`÷G>š·¨Zö[=“ÆT“œŸª÷#âR"âhÇ^ú6Š‡Š¯Û•21²LYE&¦òÓÝRLgLË¢÷ œ1å>lÄ.X.NX8l)©€JXªP NUý¼å¨z ôª¿Db Øž‰Nó·‰tþ–ñÓ[áo8'cVþÌs+g°YnÀø…¾eƒúan è›`òj²÷(_ÀÔ2ÿ9” FVeº£èžüÒŒ™g’^Œs4^Z1Δ¦o@lо0žŠ´b ¤!ÓiŪéd½É*úÀó›ÒUÁîå,…ÃW"¯J Q°1ªû¨İ-KM"G°¦0Î*î%ªÄÖIÀåA.Š£~Æ%Ô¹—äVsª K²…¾ML=ÇY('LÑ·‹¾e—17s{óOdì4Û~óY5ksûÿ«• s¼"ÆÿŠŸYGPˆÿ»ÙÛ›·•“ `NÜFÛ–9!,8©-”ØÆ¿ÏÔ_®ºÚ=§ÞTnVR[0'_mÛ%§ìê‚/W]=+ܧ¸–¶¶[NÈ£A5W†ºÔ_®ºÖFD±ÙqàŒ Ê1*4’8LA‰Ö®«Yš²­ Ih¦ì’híºV *Z’Ð u'H¢µëÚ¨4a…ÄKTµ5!¹tóOxå'H¢µëj–6Ÿ”²ŽÖ„$4SöI´v]=Z T7ÓÑ„f¨;A*Z›® „ÆÐT´&$¡A["gó’híºš%žn}‰’ÐLÙ$ÑÚu5 í Ih†º$ÑÚu-]Qw@ž-u„B"Sw¶‰Ø~€“çIÁlu|ÆÀ€û÷lB›õxùØ{ +¸ ;*Žc‰! ö#Ç@ÁäY‹¨´} b`þ¶=± BwÙ¡€-`@|¶¶ž½uxp|´UMØ¥îo™€’ ¦ YÇ ŸÀUAÑ튩2ÁCu0‹à‚À†0!V©ŒÛ Àbìã»Pƒ0¸œït ‘…"xŸ o5íQK–§wÉð;N`ˆ‹ò¾ÃáÃ<÷˜ë8Çœæ±%È3yP‹&ìBI+7)¸ž¶‹JdŵV'Óóyä«=.•¥xÀH%¶(íc§%÷mâϲ¸BCðåªë°‰á¥%ë¤L`Ž “P´ªr¤Ì“ÎäOtJO'Hêñ,ü¡ó„৉퓚œÉ…%÷äFk ÆÍFÔ¹'a¿û6gP]oà $½€]¿.ü@N,€è ^6€H Ȳ£fe8ðÎgs¨R0W°Ü¼¿—ÏÇùQû|í\zV"Ñ›£3ö©;y4Ó‚¿na@|ví•·N '—N,9ŠÒ ¸$½Y–^ÌäP¤xä'ù(½`ªLhö…ÔlB-x¹<86íò&EÛ{-¾SôòøPSPÕ ½³Ó…ÈÉâ`JñLAÓžZ‘q»(ŠHRˆ£j¦ër޳B–RSí`äs4ûWÉ˵q‚ºàËUס„pwÈåÍbÂel[¯ ¸ξDËçd0ô³n ýŒût]ÏOm|‚®›Ø—¡BÎÕJif'…ÛÔ€ÉQÓH??ª_Íù¤ùÙ5l7y4j×ͨv7>TÏcÊJLÿ:ôrÕµ/PÞd”¥ˆQcÊ"0 •¸˜î–b:AZ0Ü1aòêcH;”‹“‰?-%y%8S ºžÄञÇÍF=«s¯çýîkd@Á öQŪ&RYUF3òVXεŠ«Ê܀ˠU89Bÿì¬ Gã©Êæî-Æ·ª¨‡á|.GHÝ"ó„ e‡ÈJ"@aáµ"U xòK+ež[H:)αҷÞHq&Ävi¤ÀlŠT0žŠ4Ò¨F:¡ÙHR³Çj“R…³'³ Vö.çY!|!òRAˆâtEè •¢ë.³>+§Ð!U8G\KÛåB §k½L†çrìe·–ê¢#•ŠTÍ„Ë3›eq…©Úu-„¹™Û›wxj“½ÕÜ~hð?[ÿ½yûç?= »øJMa‹}{"4ÊÄì'¡¸bµñDÜ”H¾c,‚4¢œóãÃ.üÄ›˜G¹ºZ¦úËÕr»É_þõÍ·¿|úî§Ç§Ÿ>~xûËoÿ`ÌܾùþçÛ_¿ýÞšÛããëÏ?xwûÏ¿ßþüãíõã»ÿvû;öOþ‚ŽÄ%äû$–ßîÔŒ‹ÇZh±Ï4Õ–9Ë·L P–ºï®X~šµ <_ÕŸ¡¯tIFæIï%AÌ%:ö|øî Ø{Ët÷® ‡ öüû±÷×X¾.éqñ˜ÿËkU©¿ZÑëM’eÆè—âÙ±^ü9DU¬°u&U<Óß…Ê‚éZëëÀ’k ø \ äÖKÀŒÃ0îQ4Çﺺ¯÷ÖãÕ"ÂÚE5‡³±æÕš%CiEÅž@€œo…‚]<Ë(FÉ¿‚m6¾€}­Kþ¡ê œÕ°ÞÇj……Êòôµ^»`:JÓÑœC€ÃãÌ"xDvBÏ%—Rýffb8 ?œm·ƒ\`*½cð^0¬©¼¯gMBÄ|m>‘uUy0Üóƒ½Öó˜C+Ice‚ÉUã*ž…Éd @ˆ<-sòñégð}›Cè"±÷PLîͳ#ˆ¼g‘X@iÁŒ¹ˆ²HÌR†Òr·«‰¶‹ZðÙ Çz¥L·å\/ö¸ÖW2·ï$•¾~ìú¤iù¶ð€ÂRWh¾\u­½Á°9<¸È·™{¥ÎÐR9Sñ /GHKºÌÉ1u1û ÊÆÉWðÕøTf&p®³UeP¯˜RûK½ÛH„:D\®¿ÔÌí‰-ÚP³¡0ŸøÍÈäÑó_„B™LüðUŠÑa äþÀ~°.á6ØQjMàQû=B+г@ÿc½ÚZä<Žè»@ÿá{1X!3êku·ó¤E"~0½™Í¬°vv²ÆøßçT_«¿é‰6Á–‘ö;ÛתӧN™ºCÈ/"·€äµàòäfpÀŽÀC×þ¶!Mz ï# =à•z€o¢ô˜‚zà"§Ó„EèÐåœòºTHˆŒãËš¨%#øp,ƒ4ùFZwR!žŠ]óÄ.Ú‰›ÈžÑN&è0Öd‚5—Û‚/»ž«r¦Ÿz|7&^PMhBÍfÕûóÆË«´X eÒÃ~•… Ñ(ò‰ç ›ç r7Å·s\'\2Äß™@íñ(ÉÐÑ5¬^m‰ñw)S „â™À¶¾„e|lR>OùXå}@9e›¿»È©¸ºº‹”º6R>Š>{ °B‹ÕvÆ+ÁLy;mF‘ ʬ„ ‰£pTÁ.¡i¦ÇSÒa‰‰£cŸtÜAÑÐ`8ΪB’éŒo¼"’t„WÔJo»\£³ønt¾¸ÿžáA¢„¿êH±WøŒÌÖf¯ðM:i¯Ù@¾Û+|kËѼSÄYÅ'Ï`‰¢$ÝUƒÆ«À4Ra…È»À°¦Hñã.¦c hM]MñÉÆIMÊ 5àKCNX.ƒRN§,è!§.…²ßªrÚ!§r* œI^o­æ™wöf’S6ê*ŽÌWòn¼ ÄSErRO¾èC’ Dª°È %§ÒÚ!¨øöÉX¹1Â%ª'«liÇŸ;‚ 1mÙ«§|¼¸Î‹KH¬ýZSS¡6µ}ºÃShÍÅ®Ñ(ÿgåUÛ0E W4!7A°ÎY2 ÁÕ¸L%msãePÁ*ÓÇ]ÅpûÈEª¨SºŠµ=7ˆæ‹C }¶¨cà Ûú vó¯þsó…Sñý?oÏŸï¶_¾ÞÞÝ~|Þ(¾Áo`µ URL_Ò ÌÈ3Ëß7¿¼~Å£ø?.˜ d6Ní‡þ«r3ÖÀ’n·›sÎV¸É±Ñeg™ããlòÑU*ÍdÅý[T¶\‘O©ìr\Y­^ýÇçß·¿·KþôûíóéËæÞð1ñ„ùÍn¸¨B3‘+ÁÕ›æ Á+ä:;êü ³qöó© 4"À;|:·yäš1"º:“¶CÔ †N8øÍ‰C¤!-\øöfÕ—ŒçB=7ÿãát èÍIdﻟ߾ûúüþþô|ÿôxûõíÆÔööbüý»Zm§§ó¯O¿=Þmÿþrûëçíüt÷ùÍöWö7þ«$¥õ@8º>8P…Ø7…"EvHù¦<†ˆsB¸Ñ”ÆØÚš¶ßä öM®h!ñûÍ‘,ŽSDuaIÜ1GOlyȉU8îÁ ·àêy½z’Í@Ì(à /ÀIaÆ ”€ýhB0NyÜ5˜¸˜{ <‚j|UŠGrrPKàÚ0­·úEû2^4o›¸ØÃñyWžò ÏkpF¸wð)æ>åÏç÷ƺ‰G{,‹/Œ¬~¢Ç ƒ¨ˆeâ[%1›|“GVîøÀÇ>0²=¥"ˆØ…ôhqâÖFDP ×—Æ0@RÑè¡Ùc²9˜¨}ÑJH Yf‹3È/'Cxá¹£2P§‚ÉÙ90©¸Ë⠮Ƚdß,+/™ˆ¤ò˜ ®äËÄ—¸œ§Ýò~JÀYH…LÏa‹à2uÐ#ê,±:÷a±^iU,Ž'ŸŸl¢ò6ãF6³Pù°X­n’µ]å(ÃÍ%‚v¤¼¾Þ Êó.VíâúboåÎ$”áéØŘ+B¶_¯Þ¦O!ëØˆOŸ½€DÈö«í6!ëȈO[oõÍ+íB†7êø/YÖ12‚—²¨•KL„l¿^½ ÌY´3É4¢Óç. °ÝZ-^ ÎJ,âÕœ¶Ü ñšVÚÅ‹¹†òÈxuLÄ&Â(²kLÄk¿^½M„L§§€ul„§Ï^@"bûÕÚ&õ<#dñië­ ²y¥²…ÒY4±*¢LCÿäó„ézPè0ñpqNçoxEh :E…cœªD„%³t Y¨ÞÑMPä|xÔ¹¶b†0ã¨`é˜]È CQE§QË>&ç³_€ÜÁŒh›‘¤Ð¿XnÒ(/f¬v8e>Ê&Ç ÉW@†gYå ¿`Àñ|®‹–‡Öièxx8P,ÉW‡µw.`¤RPëÄ j±ˆ~ô㌅P·D¿áH¾œÉy¶‹]ëBÙô&¡ÌI>ð·c{Ï×G¿ë;p*áLdRÇ>–¤êì˜ÈYæ÷ÙWf*¨ÝîL˜vÀF§~äkž<,¬ÕÛ{‘h‡ÒnMáh'„ÆA´Ÿ‰³ÀÚ܇Åz³¨¨¼'j6,›”É•´ÉÕ@¹+»XBpÍ“A-­®€2Ö57P;Ì:<µž>¶e@t!LÙÁÍ4{¾–žvÓžôô\„c_¸ÂÑ[îâ°³‹Ðžó zÅ}+#޵ Eí ~Yîè|*¢à h§=Ø£‚ÉM#ÙT"Äm^ù4<>+š8À4ìïm-dh<Ù58åÓóö ““/Ô„¿U^J¨ ·h>Ä¡&rX†œ8ÎW^HÈ @Ò°ÙCN¸/Qy¥&'rÒ@)'+ÙæÕmyH™|„D~¢ ªÑÁ ^°)62@VP¶¦1k£¤,0BdÄDxÊHA, BpĦýYeg¬Ä—@§ì%¥¤´\·zr–˜x´=K¬Î}X¬·’O¥ Ј¦KEÆæ’Gj=äÞQb€7aÀ›d;ÀW– ñÁ©èÅ2È{åY C†•ŽÛX0IîUºW9PÔŽÜ—ÙÝëTMfÝnRÐ6vzN}A”~ØŠ=¬V܉P@’\¢yGBY Žæ(ÓJ±V²6OGËÚµå¿tö˜óãðwPÈXçP½ wþãbÆ@ÿÿÛE;ÿÐù]´àÉ‘ŸœßÀªóàwÝùáÛd»/œ0Å¿kÆ/‚FÙaü"SÇN¾8¥8Ù¾ I‡‡‰&h¿Ä¦ècn>÷¨¥t3⃲C§@]›u  vÈ4¾u´$d:rŽrÕ2 0”Ùdß{¨t„HWLjô€JvyåQ¯q¥J‘ïá–‚ ñÅØßvžáõ$Ð¥7ÚOü¼¤¥ˆµŠMÛƒ%¿qÄJ£qƒt~îù'å¹%Y:¾Nñ>g.!é÷ö«M‘ÚÔöéîõ+jÑ®Kjò­¶ñ Ì6s#ësn¡ PAÅYÅKaRK‡B*fÒ§Ûׯ¼÷GfÏfк°žïä½+ aŒÇ)ßÀ{غÃÉ D¬±¡±ÄŠÊÈ:]#–:¹\â|4ÅÎ#÷»—|÷óÛw_ŸßߟžïŸo¿þ±ýÀ˜ÚÞ~øíå¶bWn„áû@Þa]Ž!½Qé,r•&Mr¾íìvƽí!™a^?éXÒÒöLŒ3Íøðy©$U•ªþúôãñÝþLê¸~¾ÿðù§OoÇ>¾þðá¸~ûðîøö{þ¶“º¸hnÝõù.7tébuyââA§c¹®Ïϲ\•AS: ƒ‘®|yÚèüV7ãùÏ‘Ÿov‚5<ŠŸÒtÞHyÝ¥cv6ÿ9§¢‹œ|‘ð êE='ÓÈqU/èGz|ùb&ñ 86$³#ûöTKþbÐ?3 ܸ£Ÿ¿ÜÂÓáÁç”'É?Ϲ|÷÷OŸ^ïÞŽïÿýúö¯ŸÖïð¯OXm4DhRùz÷Hyaùõùûßþ†?âÿ° "ÿÔß:OéÇÒôùž}õÏùõ £¤"ÜØIä5Ÿº¥ÉIøÅ1•§ŠÚÐþËf³^×ýˇŸ?µ«þíçׯRïøÈUŒKM*Õ—×_º1]P_qE´»2?äÐ4^=<’"A»ïïm!‡#æ"ŒP_XúµÆxÍñ|ýÊMŸÿçM»·ž¯"Fß䩇•ÀÇÄÜ[#V\žÑ^{ËRB5£ê·s\¯X …ô¸nôþr:PÄ\È/þ‰du~p?%êKŠqOÄ"2õ }UóžEÁvãþUë(^?§D0­SC6ÿú}¡ÁÐwÐM ˆJ3ýæ‰!ûò"y´‚´¸Y™¬¡üáËU[á}Rmp, ‘¹è,¬EqsYdˆw‘Jkôoœ~ëòÛÎfÑžb ¸ãZE¹• ˆLóÖä®5,la[~ÛÙ¬{©p ,i¡“a¡´M-ž'æ½¶°.¿ílÎ3­g•LÚ ñž9iÜâµÆ†ÄbáÉ“Åz»n@8²1é²¾~ ¥W‹ËFÒ‹ ¶P8qµ¸øëF¦9Nt<ê@Ö>€Â‹'›õr¼07XéÆ¥Ëº…-”~<Ù¬{¡Mhöä€Âkc¯-®<Ù\|鸩åm(ÜðŒÑAáË“Íz?wèÖ·Ý¡t[·°…Ò—'›u¯~0éË…ÛÆ^[(|y²9|¹©±Ó­%R‡žyŸ™KP ò4ÆÄ¢{d¢œ-ß@€»ãZÊ ºËP)&.iè"tô&&ñˆÖH^è.è×¾H¨)¡ÄreMz9®/‡ì9Cy&k04ÖB<š lYzB²¸fþ,i{paM¬¸ø«à 2Iò8ε”_§RÌç%Ž“œnL Gr"–¥h]X †±.µbÞ¡f©“íkÞ„«Q>E„_¸„ÕÓ«òMÖ–+FžA¢÷:§•¤ÆS'=Xõµƒ’KÑLB]ZÍ#9t2ËC18iͲq—ò¯›ô,ÉLÇeØ ”ÁuîL%}¦TÚúü¶³9W"•7Æpæø€=‹r3Á¸…Ê6ç[‡rctú¤8[(—;›‹åʰ°S5O> ô΋/™@Q+Ü…\Zò…§Ï‰ª~á+Iz°N~Y[¢…ˆÆ1´òÒ¾tŽÎ ?¡ó&AAÛ1 8ëmÌÀ%øëZÖiž ­B½cÂS.£0¼yÌ ÃÝ ×ÒJÍlðe‚ÆBñ–[gè1t‰FaHÒ™¸ZXJ©a‚ée.5€Îy/J ”¾µ„¬us­Á¨ƒ/‰Z‚kyQk$鵦CYk$,1gû¦VŸœ|Šä–wh&‘b ž[ñHCÃe^…¹ÚÀµAišS0O%b-7=òÒ>òÃ$·ÃbÓšûå°-ÑÆ}é9¼æ¨,8#øµùÜ%”¯¹'Ô¶å·Í]ÁDQ1ðkÓ¯t)8&‡ÌgRd”68;\É$‹ÔFøŠÕ?äÞ?ÃânJ¼c]Ø¡æj,L¡ãs{p-­Çõ“W;ë¯Uضe¥íËç6,ˆì®ð¶³¹ŠM`òzÞÓ¡rt¦=;”Qv\ÇRx§åèÝ)<‚òØÈ&Ò'à=ñ4@R¨u»< ÜEë¸< @åÓè7îOC’þ4NŽYP³:‘ZRÂ"&AB`ÉÒÅ$ˆc¹8‰IÀ,>º–P’®%.Ì,%}ºð &…dER1b¥Ó¡ˆ¤{LÉž¡w™h«Em÷µVOµÐkYÚ¬©º²”vˆ4—vÈFVT½´ƒÄDe öÆd]¬ÄBx¤‘|oýœ4<Âh’*/èƒÌ?/žßµ84cç´å0*'¾Ì‘®ûËœ*Æùœ6¾¦{>fϬ~IzÖž²RVôr)!/¸åÕ ùx²7 _êPÇû7|&†°ŸDWÇ_ËGüCùçý+‹RtFw‰.q¸K†(¤PB ý´zÀêÚÛÆ^F!A‰¬9ЧRªÝ­3öq\Çò«ko{už‰F(a»KÆNp“É-«ko{KUÒ®T™æ”¬ÕHèÉQ §ŒµÂy«½z«¾\8¯3ᨾ|Ç„óV{Ë6Òy G5“[&œ·Ú[»¾ßÊÌëL8Ï)0ãöL8oµWoe=ª0fCé¼Î„£úòÎ[íÕmxWÇmT8¯3á¨frË„óV{«Àü¡Ñ%¤ó:Žâ …‚±gÂy«½z«Ü00Içu&Õ—ï˜pÞj¯nÓN$×™pT3¹eÂy«½©R&Q!³/UmR0JÆi19ƒƒr%ˆÑàäA¬0x‹~‹ª-&Ák)ËÀ\R±¬"øÀæhz(„ÁuW¹šÌ•½ÆB¥6W,Å“J;¤0+yS[š>C‹}Qª;ÌD'&ðTdñ•Ë µ³¸l9œ½Ž( uDå35¢²ðf=¯ØqèOä¡°Û:•täÁ ^åúš¯Î­9rQí]›¬/«3 v¤M«Ìá|1ïH J…•X$[Žàƒ>ЇÉµxÈ cU¬×3üwˆ2°ŸH¡y7p-Þi쥕ÈÈ…h .HËHZwg)äÄ kB; /zÝd¢”-Ö¬á}À=%èbŒ›çŒÚÊÛÆÚn2D{'§ìșܴSÑ’Sv5(6EƒæaïLæ…ð­[&CÀšK[»2íàÈt,þzXXóùb©‡wRZ‰¸´Kö¸ÐãròÄÚÊìÅZäÖ¶æZtŸ™¬ ªÐ¤Þ%T &*ZÑáÉå­ Ê™Å»y‚ȳ'¯51âq…XhñAòB*¾Ã 1èX“*„é ÍN¡Àò|‡$L!£”€H'QJ˜pžJ E)A»HÑZQK Ç,×)QK‘¿ZÔ«³©VK‘µ¤3QK+ñfã˜FFD"7¥ Ž®|Ož/HvÎú4UøÔhe¦´sαW…id弿-“Ø8dÍ®qzÚ®i)ËI‹wí&w‰Æ›mù³CeáílkWK,Ú$¡Û*wÐe?Áaîax¼(¬å @å7À—Kè,â#ÔqË¡èfÈ{åUUµ0Ìàu¡Ã‹½*¸––õÚ‘»™å^×ÿÒ^m­qMô] ÿ0/û#’û^ÝÉ“C0˜ä!ü6»Âèb“ÿêžî®ž™µ#ãX Õ÷õTõ©S³éœ·¤³Ž^S[@äH;ìŒÝn­¸4„pVÜÂ;z”³¤Â¸cEL½GÒ³Sž®9Êxh¸´Ä,u çïhÝßsɤ4$>®¥-?—šøõž-ñÐEÆ‚,øC´_ÇfÇG,~ÙÌÍŽ€NHéø æ©>|'l7|ÄÚõ`øà‚+¨4|îS‘Ï~ €©ùä+ÐHéfÄÅ`…J3b£Uš-zŒZ¨4•b*8RaéÀ~89!Ò@òÕ»HWDŠtÄH ¬™¡g¾'ãã*8¦Ž6ô|âëñ´¨åƒFƒQgÉ™ ,„ÔµmàûûýÝÕqúPƒ`˜ý¬Ö€ÐŽ"†:êíIÞõ•Sh-çw•íMÑ@û'É,7d™kîA\ÊÇVÉÑÀ rŽ¢²•†p­­qeµù§²Lq–)"bªÊ=“Á•Í—î‰BÀ½GZê¤E~!ôùØ™Kx*ïïê<‹<ŒðxIîK3/¢ã6Ñ ¤»Ã·mº{ö¦…©Ýá{ A…ùù"šh›bSò„ˆ!rG÷N` rÉ’C‹Å¡¿ÑÅÓØb“Ø×“æ­²Þ¤Kø“SŒ…U*àì)B‚.4,¡ ¥†' ÿ{qpïͳccÃʇ;åT øjØeø’ gH·~kîE à‹ÑÂeù%˜˜£ó-ûîþý¾>¢zÂëOÈ ”ûþ fS@)‘ ±Ä²4šì¯e˜7 .8J3¤Me~mlñõtÀl4pHxy¯ìÿ£1Ám˜&¶f£q’„Ý‘ÉÁÄ}ãc#—<"𻂠t‹!z_´ ΖûZD`T’³ëÉh a=š gÙÙ²óÏêð-ûîþý¾žoîÐÞT`•¾JȪ{êïbÅÿ÷©—-ÞïÏÏ ÷š«m‚ ¥|4Ð)UÊ"Žâv `lÓo·Ö,­‚“ÌtØä!X&oÕ1¼"S2S,° –Ù·+Î÷(Žaäœó¥*¹¯ ‹E7Á:ývkÍÞÿ0µ°Vx0Þ3qj9« ¤§Mˆ\­9߯¯Ð‰ì˜à¬¯º v"—+®6D6PrÖÝ%‘«5—DTSö$2#+(™@ƒ‚šžh‰\®Yö´ _)&I¤À$gmM°¹Z± ¹0–DVpà¬.º D.׉´ç¬ˆlàÀWì`í6(‰\¯9iÂ%‘u‘뜉6ÁNärźQ;U'²ƒ‚³¾è&(ˆ\¯Ù‰\èhNPò—:Z˜kè„A•+ê"@ÑÞ0¢"l€%xb؉%$râÓÌò¡È š¬Œù„"É€£ŠèP«Xä*’çÁ‘h«;øN‚¨rµRótôé¿“f Âô QÈ– ŒMÇ2s©  ¢ÂŒ8mêËC`¼ça™.FЀPF”!c$›ÊD}98®6< þÛæA%8"›t¨Ó óêHSUòæ»çÕ] ŒPŒåô*P“Ýñ|zÃÿ‹+ 3 å¬>…+Šù+qÐ9˜F³öTp¦Úq‹)æ"æfFæÅ‘ˆââ H b+ÚÚ’¬]G ùÖ‡­-ù¬§72òÄBY+ã Ñ¥±Ö¹´ æÉ·ëõF RyK˜çà”[åÂcEÊÉÖ@¹idóé8L·ëï2XÞE~ý 0°}ïñ“ó">¸ÖÁŒñh¹Eìñimñ‘H‹ÏŠeÄûàîÅÂ|z«l)„xâ$~X¬'ìQ5ÉãQD:ïÐË»qÃÂÊD[3Mb6Ž»·†ä‰Øòj3øn!˪¹<…ugI[Qge£k #,-]c€èºZÓ€ÊÖaYcK¬ DF‰èbÃýAÊ£ªÆH¤iL¥ÆH°ˆWF&2~ñ¾&¬H3¾¤'!*ŒX®HƒÌ€Yîå†,FLsÄÅT¼–HRÂ8=+÷p œÛÈÃÖLëHËâU–J•éÁ­Uí |È-¡6Á:ývkÍ ­A¡Ä-8%(a´/ŽN`%ͤd@t„CÕÈ8«ð& äÀAt®¼}UµkK „7Ìó†Ó𩝤”ˆ¶aEå¤å\}˜8û¼ÔↇÙÊÒ¢¢7ÏM,ÐóGyo·Ö\:L¼·ØRs"êQˆ;(‚l5.KÑŸ‡éxÕJÅ ¼†æ¤wfºèÄ#b$$ùôIš†§Á×C(¼B»p}¨cÅÊ‚4¸Íàôh0ÛGF¼%a±VëÁ?2È Öü£5ÃðŒP°£´Uôè;(^Ow,œ'@³zÐö 4·˜EÞpõq£d0Z/ü##œðŒ ŽŽþ‘A“š´óWœíÒ> UÚ;(¤}K¼Ø¼uK ÞøÑ>ææÅIíÍwôÂ2 £Ö ­h4 F¢$ç&$IHryäþZœ"Ív ¶¥Y»@Z¯RTH{}3/¹gØ&X är½¡÷R“šÞÏÏ‚èÁªÔ«é7–(LJp7X ¸Òy¢ >RWš£„.Ï1r6´†:b5.Qo³ <¾×¾”âqärs€»¿Ê±ùgwͤ½øõêóôËãþxsuÿ4ýþyÿt¸ž´y9](¼;Èy£"ÊpRÀ€õIç5Êï݇ó³<\妃+!Õãä6àw»»Ì%fïÎÏ~øóÕëǧ77‡§›‡ûýã?ÓOŒ©éÕ[êÅë·ZM‡‡»ŸîÓß×ûWÓÝÃñêåô#û™áÂo×À89Xdr¡D¿±G""9R+g „ްÀñë•×è#óŠ,÷eàj—Sàó¸Æ[0)‚.d´ÇJ™jp­þ Õ¡.ȦÿŽld[éA%Ùkpns¤Rp(²½òß!§ÍõžAk.?ɪŒ’ø}rª dÕÕP Ç&ˆ¼Ÿ}R¸iœ¹q¥X´‘§Aˆ)qÊzÂýI°odwŠ%‘qk nƒË³Ÿ7âðÇýýþîê8}¨±0„¬$RÇìãî)¬pŠ~X|ϾζÏöB9»9„à“¼{„ÑðÅaH¼Oÿ§½Ìyëº(üWTÐ ·!9­H›PÈ*m† ûßç›å>í¶#8•®ÎãpžÙ4¬/µ¶ÇQ‚‚L[ûˆÈªì /Ÿ<îLç_#^1âÙº#¤søÌÔlsß7|¶îÂSˆò,³gÒµ%f<Ä1“nÞ‚»*Júë¢Ôïµz‰…àêöZ¯þ£Öz®«ÛŸ]èÏ_¬,ÛËŽÝBÏ÷vr´>Î…>@ 4"âöT¦! P^Çžªy ü>ê¶è“ ÖQêhžn>ã„ú›òtY 埂x‰F­ýrtÛ|X.úlÙmˆq‚Á…|nmq°,fÃÆ‰ç—sñv{óuÖØò'z“â«WÜ;–¨9¡Žîÿ í«}DŒç WN Y›Ÿû%ˆ¦´ßés> Ú‹J¾O »½ŒÕš£5ë ´½æ«Êp?É«K=)#˜b¶ÑΞ8#¸m1µÆª2@ø«Q+V©Í:°ð_¨kû¹ð2fÖ-6#ЬA‹7é½úq½M­^°| øá=þ§Óâao~íûW®ªÝ}ùl ¸þ·Owwx÷Ñ.òil¿xw÷%??üôõ  èë›-¤tº€$ËÞ×>újÂG«@öÁ ¶®>nþ1&ÝüsªZáå]–ו(~ “UÔV¹fͲӄ,ZK¢öÌ„¦®‹k“½G—5êvñòîT­¦l¤@ CB Cë>®³ ï¹Í×þÄöƒ .«á¢tf„3{žÊ´õÕ¦s)3îb»*P‘ºRü»Ž‚O}KÔë™ArÄu}¸3ŒÖl­‘»ã,KiM_ayÑž×Y½¼xÁæÃ hïfã È³Š…3û„×2gØ6´í %ÕU4ꀒ-aÏÛÝ-j![ÚüTuýº#ôç%3d%^F/ƒÖiwÛs *ÍõBÕ‹ÛíÃ}Ôª&Êü7«‹Rê)Z1Òø©ÁºŽÄuÔ1ªÆEÓ!kÅŒê\ ”Ù%tR5É‚@Y6ÅÎ>JJc÷ˆ¦Ò·öŽ&i/Õ'B¬U]«œèB&âÕJ Wû†8.KȦfLÚv²*‹ ÖˆÜlÃoÛ»e„§0’¦Ú©j<÷òu¤Ô—j>öª)ì‹0Ñ-âe½[÷¸L¼XI_: *}Ö§¬`^]ñ<˜lC¦œÞkÍÝm¾¤}I¥Ù`–ÏC&Œ •Ð Fÿ U—zs Tžý·a³¶’\‘éa†"½d#ži\Çû²,áHìVþ³ñÉHC˜"¤¡—|§ûH*¢À#}ˆ·Eé„]‡¨ô•Zkt¡ž¹2÷ ‚&Ôf²yÈ’ ‰þõƒ½ïÌÑ¥˜L 2’R5ÍkÛ«)›¦!Òv(“sžkéŠ4 ÒÙÊŽ.ì4ÃJ3´LYͰ¯¹3z²6ƒŽm"+Èè¶§ì’ÌÓÃ׃Pû¸"7íé„åm–Ò6ŽÑâ1”¢’z5ßçIeŒ’ù‹¯l Š#’†\.{,/2g¢öfÿ@òI`ìj5!ËüLÎLhWïIˆç–l;dI·TËL·Y‰¦iUª\[Rv­¤`DÏLeò­ó|nD"ÕíI¥ÄF¾{Û®3‘ûBÅížZ(V¿tÏhè»DH¦æÎjÍÏËß…R’™ÄÁ(à@̢á%šv/[’ÊZâ粋m(šÐ*YÔ¦îv˜<K ÜldðQÓ¾²½¿°/4oubãÞÑ`ÆIB´G´W Œ£¿D ‹Ù¸,ò}Žƒ2èħ…ÞÏ endstream endobj 225 0 obj <>stream H‰lWM®œKªœ_éîÁã'u ’$Ç··ðV`©göþ›Ÿà«SÇX:ŽJ¾‚à0Ýÿâ½^|—þÒ—o²„èe¤ûÇÏ¿ÿ*Ô–4ªvO¼"8(êÖnœZ+~,Ûý¢µv z_rúœÜ•¦êýÝ„ôÐiˆeŸÿ´)/f ©¯™)lϹÉÚ«/XGu®Ý¤·Ñ½Ùë Ó: ™žüœ½HŒrÕÓ¶ö_Þ°œSb³}WAWN¶ùÅgݶ=/r€[Ë¿@"g EÜ^²0o~;Üó’ˆ=Q‰ƒtûŽp>¡&‘‹„ŒvŠó+ÿ´Ë þN`B|Y2© <át·ñ¤ùœÛÕe¹ÖWœc H½!bzHL¥Qå~ŸŠºÏß*íz\»¾ÆT}k”³¸*uý„GnüQRáÀ>eûŸ¿ÿâÿî Õê÷žm?~5ÊT%¨˜­ú²qûÉñòbí(+ê÷Jü¯Œ§Ð¯zÛîÕŽÆ3ëî -}ih=¦ÛW[†+]o›öE‹\î[+Ö‚Èùy!9Ó^{l¶.òaúqéS‚¤‚nAò ‰,Î8ØÅ”}uw1Å GPrqm4â c«a Û¤×?q—xs•QxÒÕ!ÚF%ÛÔÐÖÝo~HQgåö4z<#ÈI¼±î™``:¢õ{,QÓÓT‰VÖ^“Õy`!@ºŸ7çû4_³ø;ýaJ¬ià(x{§LÌQ’Ü×Ê4ß¶­€7Hتò§Ï%=fÒv¹´·Ã•ꃱ]ã M¦fx‚Nòæ/ã9v¹˜Q3d1±¾½ì<ù›Ÿ#$À}G—©ýø„؇’¿¹hT\»Íz´:Ÿ®6äö¦h§}½‡º|¿iùæòïå›C$úoÊ·gA²>’a ë Å›;¦Kâ#üÌš}hî^àð£] ñŠ9”þpk»óÿÿþû÷_Tƒƒc†û†&©·ùÕ¨sõk ‰ìŠ„ÔøQÁÑ É–ýM2J<~¶¶-9úˆ‰ÒßM±ø=Å9¾ÍÏÑZI_åß :ͯE c¾[‹³žp…ìd“tØ[ÈÐúÇð©=ÚêFî6¸½NˆÄF .xL:ó7˧l½gc¿Ï¦$6ic¨3¡Ò!&ìî/R"‡½Ñø½;úLgxbî¦<-6B¹,–¼L¸ÔnæLP1lõ¥#KW §é‚@yfgè\‡ÃkÈ«Ú4sæÌ„õ¨,ƒNè ˆ¤ø*ÈŽÊç’s¾”'ØI¾ ¥Úû}–â‡ÂñxkŸr°þjj<ª#\)ßïsNo?&ÛP}êƒ O’¥ ÆŸ¿^«ëÀãaÜGèÛHŠMéö­;Z¶Z’ÁÃ#ÿMÙ†ÃPkdl\rQôA-ý"!Hì»bˆk1ïÖèªøš]Ì,¨L6 Mü¾•'Ž~ºó­Qƒ#ÖŠCÇñãóäaÒ¨Ö²óC›à!‚Ð )—§5dÃ]G[mTšõ’tân¤´SU}çwæÚ"ôÙ·‚ºåŠ. s´*åú™PŒñºÇ ¤ …ÏK¡çØŸ@ÖÝH+MÞ’`=K"ï˜ÏŸI0ŒØqë5|îöù~o ‡¼ ¤½é½->ÊWjƒ|?·ôdšk@7:é–Ãp‰¤R?‚—Y(zÁÁkÒ¥ÜäŽèú¸õÓa»KÈЈL¦µe”#4_;‘ÒaØ^îµ5\)Hg8WAO‘žnðÝa”Ã[á_ ñæoÙ†·ÝºžB#á/¡LW§8Ü;«ót¥³©½N;®3þ5÷¹Æ´„xÐ9ïýÖºŒæiu!Ð\Ý#<â^£ó1®²IåŽÏ¹u)whµ’tUø>ÓJšajç¢,vî\5rŸ•êÒ‚­µ‡Ãi š¥åqö® cTyÞö¨¡œÂã03жtr]±Füwi§˜€ÄZà\ª³:Õ>Sâ︇ßmn†kï[i¬^þ¼ÂJ*~B:Êõ>ïø0í…_³ÓÔõfþ¤¯bV»×)KÎ['>RŒ¨šÂ¡nº¬½Ëµ„ìø#z¯HË?_ë΀œ¥uv ’²Ù“òê¹ÞÕr¾-ÈïSc  ª°/Ûj@Å“œ¶p®J¢¦˜¸bzÓBy·VõÞQ =û‹rDî •ÜD²§`)‡æbˆ1-ê´~h¡d•ÚYL£âê<è§*3AU©sj¶ ºT{ -gœ’LLWÞUhMÄ‚¤*?n…Æû •ð.Û(¡]ÂÔ ¸„(,A”Hȹ÷Gc½MèWoñqf¢„--È|0ÑÛ6ÞrÇ[ÅŽP…’ˆh¯r{Æ%=c”øLÉ@€ûRÛº è”Z„†ïTÏŸŸËê¨k¹%Ç›3äNĸ =î2k×FcçAf0¥Ò–>xÀ»¶ˆ ™áYÎ|ÿlÓZóšdRý¥'“2fqAeøeÁȃK| †`x"2Ín%> ëöÂ?±;_ä>¸‚æ Ójh½I'.ÛCw˜‚òZ Ä7 ÌR…gMYÇoǰđg¶k­?‰œÝ,©= `z¯âiokÃøÆJ‘[³#,lÝwvïÑeÃë4ª^è×öj(TÛ·û.&‹QaŽÁRÛyФ“eEG¶q6Ð’å5’{ Jë©©€<¶š¹÷<±øÏˆ' r˜xÕ]fâr7Ûex"Gæÿ¡!žXñµªïrc9ýƒj½Ä­“‚¥îNÊ&øÕhLwŒ˜MÞdGèÖ\ jµ òÝ‚©CYRàë{èÌÁâ!yÄnÐWÕ|½f!/e®ì1z72cBÄúnõ'ÿc»Ü‘¥Ùmœ»Ê{8±#½)Åö¼‚?¾¡÷oÕ=sn6Å‘Z/øèþ?òƒ±Æë¥Ñ³%_A"ÿÖñ÷líÔùf”£!|L­þöš}…9ÞigªxÃ+¦¿upFOÄ*ÔŒm"ì^¯q;ˆ±ƒ —ìlqðBè†øCbYå­ï„5î&dõû´>^tê9åB¶?·VÑì uãû»~­Û§åMíó±.î½õ»çºŽ^c»ÅçüÓœ{’•8ïk¾¸ˆ¹çžWíèb-z¨Œ®:®åÎ5v@+zOòèÑ¥ Nµ"+þ¿föKàh{dïx¢{³ÃÓ ":K‚ÜÑs$îÍTág.ž=VÎí¦Úޱ%­8 À9«Êš»ˆøÐÜÚmŸmþüM©S‚»fÕ̶¥Ð"+º‚ð{…)G¨FBå1½>ŽÌ³¯ÅkÏ™‰1Qñ¦€MS­7U_ôy1õdi Y;¿§î¡¼´ Øé¶›Ý‹_;å´oŒñ5ràb:º€¦4ôÆîb|tQAæš›¸"‘]_ex6¼™îš9k‚\¡ZÃ*ŽèŸÏý®6ž ÎÊ;yÔ9ó[Ä Ù–€<œˆ¹{¦€œÉ‰O)k¿WÅׯ¼Sj*'ÇAíG „»DËõnððçž\Vu²ÆLGY6*5Ê”†øij9S>§F«_¬ñ4utBhXz¤½ôÝLãÐ#rY©ÖªlªXPîùw«µ§Kkc×|’÷)¸áw‘šO=v?glÄäÎ)¯õJèNβ.Ê2ãë‚%g‘Óߊñ-ÏÀòˆ?˜E°´æ¡©Õ“(7Z»J%¥÷4,ð¢÷,f|Ϙñõ(®?ùTÁåaehÏÆKB¨Ž¼ÿ‹P²–¯§îj°tq’0ìä÷U²µå^çÐOñìfc "Xbòæš„ÑNeT ,2«vøZÉ âS™y™fu5HclÂÏ.[Û|ixƵõ{Ç5ѽ¢ÏÅ•“ ñØ×¡fɨÉñƒ&ÝV7t’¡Ÿ. ÕJ#q«§ÞbÔ«åô«£´Â¶ôˆï´ðE)U¼]‹­Ì©»ó·x½Ž“ÍyJgîÜL©Ú_ Ee;~59qŽ®­$3¯6­:(.°ÔmyS# ;Þ3ß{qÃ{oKxªÒ ;©Á®i$.kÌTÜÃì‰Û¦»¸zhØN3D›—iqU¸ôÁ¬Xc%Ö°¢ÛÑ/ƒ Ö¦î¹)ôçL¹kô£á$•¸²hñš[ú®‰5“©§’®ÙýcËrõœ+ìx¹úb\mýD•9°Û¸®] í¿Pý‹Î†S‹ñ‹%hXk]íEw'{B¿œ]|ßÈâVrߥ±³muì´âd4 Lrí5ÀèÄ&^äþZÇ]9p’l<ÃÅÜ[¢'t*B…õöÝswM5 ªÚе®©h V„Ö˜:Á²ÄB ´“sÙaÙd£"EEÜÜ{àëÙSÿ{§‡dÍ"Êδ­ht %R—BË$8ãDÙ'¼ûf£Ž³Š¨¶¾HSaν¦—_·žsKm’*”™ÅܼæM óP’BóÎ5•}é‹;NjÛ <õ®UÃjsf»zÛµã\õ8]Ÿ›zk&î%I›Ô=»ì‰¹½2´÷Òç†e‹cii.Ld\KÉ­„CyhÔ]‚[ê¼Ñé9ÓZ6ß„©„yÎú¡cÞd´c¬<³rå^S9õWe;%¦…ɳEŠº“!¾7¬ýOŒN ]H.·æ¿úCúEb’åLեʧeuµ‹YÁ¡ˆÍ1èi°;r^铘E Z0È|bV[áu òÐdÓãôiCÍzýhæaM>Ž.‰U{8Bæ©£R#4±¹;—yqµ‹)+§šÊHÙ«Vcܳ˽ÜN䨵½6>À ìk}¾ÆÊè9ˆ¾fhÙ9äµäÕy{é{æ9ˆßžÓM 'CÏÚ£#Y“]Ožv…®"º¬é¸çh+•œô¬»`¾º[+Z$ºË y3~ïƒ 8#¿?êÝñìÌŠ™Å×’ücµ²?l{êµû9ãiA§Î1ËbêE‹Ðø®§EQ»Õüáa‹ñ°=¹¦@ƒ˜Qø.ÍÖ§{ÇÅVÕ‚=Ú(×m(LóøZa÷Qp. R‡ÔäÌî15QøØ©#g¶ˆ”Zõùðƒ\´?c\µ±cà] wÑSF:RFð½­‰4xQ\ÛÒ6 î6BBD,j¥ÄTæÛ´¨„w´fq¡Šq·ÚW®©;ÇíÎÊÝF^Dho…FçÖ Þ빤²™sz/_C«®"×ck[×ÖZµÜoJtOÅ/·ÄºÐÃ#Ô+ˆd±{Ô `Öª»ò:ßqÓag·<—'\.{ïs¼X„ÆÒ\sb¨¼€y·¼ZŸ¯ë [!-!ÔuëºãÁ.J3͢׋hý¸”ÁËŽEO`.BÅæ=ìèS¿ëÑå§ßz¼ºU:š²›EÈà‘‚V’Suu°2x¾ìŸê?TM¨æùó™a‘>ꇞ ÞøÃeqñ" s3ŒÐf5y­!Ý"4(:O/Ú…IÝÆëžÜX˨ïÇ‹¶‘ª†T)Âwp&o8ÑSIå¨Lö/èXíši”µCNÄYgÙû²¯—¨ŒÌå¹nñH•Jz˘},bõJY»¤þDöîl&áÅ•Ô/k§ïWRÌ{çÑyý%érŽhÜE\ŸÁ”zŒ©»Ž^)ØÿãþcujLûy³ã#]ëõ(-šÅ¡Eí)rÕ¢ÛÆBNBh­zÝ€è[}Ì£{ÕžQ[wÕ6´jM}ÏhdzŒóa • ©¹#µ»öh°§ÍZëã±Â‘ åe§_ØXm¦dvf*¢‰Å˜B³ËËN}Í·fµ­­ #Y9… Ùù¡?áµfY©d!—ö!Í8N‘ÁÍ­Neä\#¹¹·™‹¨ä´±S\T®TãžfÎm-}ºÍkdû0˜wÑÖèÝÖä›h*r6¥z+àL¹Û>ÇNÈöÍ >¢­lòæÒËvâ9^¬m5<ŽåzØUnîl½¬í­þBÝFÙújZ"¹M‚fsÉ ËRTÇÙGã!Rký"r-þÕ:M~ê«\³OjÆ ŠÝ÷ì"ÆmL k[‘¨º M ’û¾&¯1u,ªRhðïõžÖÈ› ¶GÕoº¨E¹«ZÈsžÑKâ™s3Ù$Š·ô®(Y„oÿ?ãÕ®+Knsþ‡/°†Þ”bï/ذãlvCÿï"«ØÝ3gÖØlÀi‰â«ª¸{Llîc§¤HÄA—E:IØ i¼MÃÑGD9:Eõ£V1Â"KÑêâÅM åJ ‘â¦E'M Vˆì&@§yñ¹J¹NÖT+ Wå9du†Ç²Ë›.‰—ÕÔ¸VZeœ5Ÿk›ûÌΆDh[ D{«Â…B²ÂuWìÇÕûÕm:ªº$ãäh£~=…isÀó²ã™©{]‡×C%Ãç8™úNç>#Bš¼î_¯éð —0oÒy}Žùª 3Ô=Rú™¯;qÔASnÕIó’óì«6­&Þm‹ûrÓVÂ'Ý63i+yJÀTÛ 6ež‡*{u¢YN»é¤– •.ÙÑ“±¼; ä'Ž·ÚÕù31vû«ÚÖW­&?¡#å sÀôQZª’Òû†ÕÄ¡…Ó¯èÝå‹©:c%¥8DƒiÇy²Œ?PÉ ìöÛîõu·ØÝžÃl¢"s_n-¯³ÈdƒÎ2 ˆ;i&|Õ$ –jKAÜá _ûÈ’Õ U¨•àˆ£.®½©)¬G!¡‘K>9È?n)Ío.?γ^éc¦Îö‡Gt¬IG÷^9M§¹tTH¡;S„¢Óѳ®i÷i \–àöeÒh‚Tèo+ŽÖlÛÉ÷šM[‡G;¡y•wK¹d  3Y6©JìR+Õ×ÝS‹d¡âÖÍžò¾‰ùF"Okä¡RØCX ‹ãG lï‘8:æà‡ *î¥/Î,ë1_t›âm$øàô”nD‹ûÉ€·ÞZ‚T*KhAµž ²%íìÐí´¬­ƒç¦±Q;k1ûh)>¼Á¯AØ¿>u°[ÍRCKˆ½ç¼8…%¼[,©²Ãˆ `bW)Ïb#‚†Ãt ÜÀ½#‹»£k])ðº3pã=H<Ïfy§ÕM \-ô›œxÙb„s´Á?i}jÌÉÉÜ¥$øÙî96AÌÉM+iMb ÓŸÝöæöVBTAè*›·†l]ë•wU½u®&r”k01û7äÌéõÓt¶xSÐd:[‡±#»ÅàûYgoMÂ!˜kÐÒxÖôЧ´:|;òÍV®]sm“uŽÎ=AЦ]BιZ‹¦ãó¢³=VBs€è’ð'Êi>mϽ†ît˜û e½9ol1ºáT›“Õ¹iº—³FÉC¯Ô4hÎüîlãºñ_åÀRJA›žì¶2¡0ÕHÓ…0aA›®b×b·bÞð¡X¨æz†ëÌ $6“Ê(r5‘ 7mðšIÞ¨à¼+Çô‹™(]=U«¾.¦BMEÂpÛTVD(Í ñ8…ëè,8vU…7RŒ¹a<Ï<ÚºfÌ (Ê€Ìr£X×Äu"5ŒÖÔz–{æ*5r#B…‘ûNSŸ¸ÁEZDu†Lõì–'[éºnºìãeMv£eØÖË|yÒÉXDL’B¦©ôÅ‚%êo®xªNÄÍ}\×—<÷ØD‘¹î(&¿• €õ8쨒ўÕirk6Ô¾Jaé–ÃS(˜y‚i;÷§×nä¶ëvg½‡¢œ­ž(ã\Áî²gƒ¼ÐijÊi0‡©–|ïò t²qÍô×õ ttûÑãlfIì§ý’ºÕ]ñ!+„î"6G†X÷ø¶†~¼¦NúíváÃÔM.ˆN÷ä ¼Krâ·)þM•ÜR`[òOT+öO7¹ ÏÚœ¦'ǯÈÇÄ*eSEg¯id%IùöðxŠ+™y×µ+tLìNήÓ”«7Ý¿Z«oCbAÑîs$¼¢cŸ^o%È“Ê(¸ÿ~´Îgm\ŹαKPé¢*œaŽ-0ÿ´öµËáyô’aG±Ú–kç Ù¼q1Ö_jâ•´ScG 0)V(õóJX ¦AŠ5:žZ$&H(y¨íÛ˜×{᯾SŒ{–Â+ì?(ä{/Ün”½:ÛÕýà–- P¦Ph”TñA\R»qþ ypGC¯d)Ë —°¸·P{þ’b2íLhq=¥³‹k%¹vÈtpã¦Ã•¦åJAo>Æ:YØŽ™îÌ«¼Ø‚|÷P‰FÍ£.Ú¢”ø…þŽ­ ,黎Ÿ~Ñ­D¬áb7ÝŽ{[”VÚ8¤p!îdí‰;ðtwvxXsâqŸvÑG7µóÊ iu… ÿ?hú?˜Ž3ôyØ9iÌ2L-Ô·û=•Õ­¥é«ivUµ—ßí;D|¸B’ ^I‹á·¶”<»ï ×»:‡9ð·IÁ0z(-/¸KRÉ™¾Š†ÈÊ ¸„žüµžÂö‹fá*´µíæð¢ª´^}Ð*ß›¨‘u,™Îºt¬ÀÈ-Çêú°•ÀÖo€“Àôß¾s†ÑvMð“Ö¹– åÒYe„òôÆö'øWÙ^˜(å«‚#àiÛ\nnXèf#m.O8{¯T—ž€5ú€ Áëà×zûñáÍŒè—|c¦ _ÿ<_õ?«†^Lÿþöáüà÷®Ç7zO]°wMzO*Ÿ-ÙýôÿÇîŸdÀw±ð¦)~×62™ 4YÁÚòSÖÕ´|þýª×Ñㆽ¿Ã•IŠ@¢$J¬2U€ î¯Ë ¯þ µÚýì<@ââp‡9iEQ$gÆÕ¯C³ÀÞv³ yÌ]eÌš +̧²ÆËçîçfrz–90[ò%P/‰@mþDMÜѨ¤¾Z5¡ZkªHê†h‘ÄÞ‚€ôs¡ê>¥ÒÀ@ Véø"A'{Ð’B^íJD*Y]Xš¹Ê§Ì]|Šrð¡!½)¡`¦²b‡¹r…‹­]¼lëòÛÎt0æ›ÏUU 3ìšqðDW*Ú;ŽÕD-_è}ìÐèÎJ ‘ÀvUÔ¹wŒŽ… %dòTO(¶PÙ4D€C º×ÐZ1× PÚ@(Ì>W8²ë¾ïqßD5ËÃí€Y·§öBÝU±©ì(7›ÎÁ×tÚ ƒ8ÜÅO¹Y¸“«„\…¹:ÈËÜÎeW^Z~x5u´% Ã~; Ò§ŽlN¶Õ¨‹þÔ@SüÑX}dÊÍ«ŸÊùAýw›3L°A–E;µ‡â°¯í‘ÛæPŠ’ ƒ4($¹ÄãjÑ®\U·¬Ñ…ÜðäÍßVƒ$K%”˜vä%¦3lUBÃVħƨΌ$JtäаÏé¸Î*m×rhµ,åï%…Ðd.–ð8s9++Z»«³+¾E2ðÖ‚€YÇJ|ŠB¶CQÇ3ørדBÎÈØÚÇXO¡j< ‘³gÔ(ØùsªdUm­¡-\§ÛKWÚH‹~/ÍçCH¾Gßµx-*Ó{lÔx~Æå«}qñÁãâ,Eµr°ÐÇ¥íeLÖïºÛ“¨–8¡ÕÝîbc#Pr¶¶–ì•PšW‰[(Ä2sDA#Ú\°âÁ˜%ëu–š'KBíÞ›“¿6÷úìÄ;$C4dk –™¾Ê5³£Ô õàŒz‰vøªIÑ,¨4¯~Gk”·).@1Íš–þÌU-ïb¨¿Š¢9l¨ [Çë>}LëŽ=}z‹)½›~-hה糾[¹U }p¨?½'"nªICJDZ޶Ø[#ÕŠúœô´„\PH‡éz„|îÕàT-Õ™N$þv3“Ê7¦Ç4e¼à‰±bÞ·p•v ß5]‰tÔR9dC±³¹mÐZ²M\Ÿ[…@ˆ†QT„CrR¨(‡–ÒHnuFtT•ŒÀÛ¦¦A9hZ¬dÀ0q>ãâ犺Ѷ•(C(ÃëajP3.K3^Ê:êµ dÊ=QÕÇhÖá{]Ì9Û åF)Ö"ƒ7-|ÏE£óÇUéµ4ƒdµ•dÖìãÕ¶šÙ4Dâö¦6=s:•c'çMucg Ð…´uGÚ¤×\2Ej.90ëë¨T‡ULˆ±ë ËÄ:¿"\Þ_‹ù|žzmÕÛwÂ$¡¼W3ã_³Ò1hŒÅÏWU×S*öjBƒŸEœ¯2fÐRÊé:«—ø Žß8#øÙÏX-kw¯5 #…´1 49بÔÁ(&nrÎgƒFßï*ƒkî]!n@xQ\WZÎg¦ôPjK*kßâçN§w ÐÆ‡'´ôÿf^Rµ¥eŠ?¨þ§øÔ¹^ꎀúU )UÚpv´¹Wtè%‰7‘È’!E\Ĺ¯ ùu¨àÈÞ—}jFÝ]oÛœ {í QB¤v4÷^¨* X8o3~uDÖ `%!º­33Hy/ÓµAP&„½Ô}!ó||m­"ÏcUe¶ÜŠ…úD«e|ìÒªÄô÷+Ä©¼:öÊò Ò±2¼ õõiuz@f¢°5ÁVɿƼÎ ú öS™5§ŽêÊoƒùËj ‰ÓõRò3>1¨Š?DB¸-˜íZ¨ié>% 2Yè¹Syl$y4Á^×,žwì†ÌYÏ÷I[Ý[ÝFãž ί))ì²X>$u(ÆõH;ƒ²ªKŒk¡•Þ¨·ÏÝ £å,ä 5±xõ!6§¡Ö(c>ÊÜPiq ¼Y¡¾»Ìk¨¹)‡êB]H# °mVÆ ï·Á£¢ÂdÜ ÙM°òÓ×&ÖŸ>âêÛ/xöÐÊ«„}úrGµ~…âÓcD¶k°h@ŒV™±Ÿe° D”#µúôy!Ó ãs®ü°—uØ F?ÍUÑJ"âµO¥Ð… ôG#º/[*K³‘¦xǕ΀˜×î8ÌEûšÑ¬A­výîJj#%¼vn°…CÔîmq-=k6ò8D*&Ÿ{>ÄËc~–÷ʹo²U‘†pëë ¿îìë’,Ú®Èÿ}éƒTó"ê'„€³Î…•w,£=ȧ;hŠ&¾U3æ¾âUr2¤j‹PÖx,LU èw°ñzHE¿jËK¸¢tˆ)ß¶Ç·ú,ÙòP§N ÇvBËëF’_>ݶfgýúDwê.ˆ³+;ßÙϱÎIF“Ñf]#S¿ÿàdl°®£Ô“umu\½ÝAç0»æJ÷;2apݧ|ZVÒçà$:I_`w­9Gº×«5 {”nfb F隸ëXv5ÓxB6îrïF œ™zØÝ•Ò!ìå’ ½r‘ÜK5böà†ƒò™,¦°»ú‡pñ4HäÈJîí{Ä(4„Žô€læÞ¶5rïÈù8Ý®Ø }ÐŽ9¼îËíÏ éé×TŒEÑœIm2ð e­#@¯‚»çĹm=Æ¿µül7è[dr?øÊK.ˆNNVËZV7®ÓÒ¥¤˜¥/ÅüŽ*·c*dÐT’"Ç»ãBý µIŠˆÁµZFª¹³ÐGHaEG„ÓW®Ó~œvI°¸ô]ä‘iE¥Lz{@ÁO7È2óºWfEc¦À0¶ÆÌnwèÞ\·…œ1ë×^ å±Wѽn‹²ÅˆdöÌI»/ÇJ}dž÷èTƒò-È®soi#8A–QÏ…e8pd,í¹öQÏPA¢j* öR?@²VFÓÉѪ8Õ˜¨«0[khŠmu$–ìP²w—Î}…ͼ6 ˆ­-Ç!Ûµ’òZ »aI“c²1ŒžBï+#tòꈆÚy? aö©K‘„³×Öv¹ym´Ǖ܃%(‘ÓÉ›É$¾&(œ‰Ð$̦Ÿ²‡9åñ2¿!U\YiÒ] ]ê›_í²5W9ð©Ê“;ìTñõ~9Ç®à‹fÈ´lÆÞgANIå{àËC ëóSÃÜïHê¢êìcO2WÍE+r^ÖP,=Çí+ª¨H ÜKqW_‚ “˜ôÀÁgÓ¸¾1HLÃS H*>/i<¡^QòÅ~° NåAÂb t¾d}“ÚAæ´¹Ú¤Uy&oŒT+0@…,Ž*ƒžy¥p&ù{ß+Ń‘jURmïVTÞÎåR Cذ嚡IId¤«Ø¦Î…På2ÄÏlç )éZ\¥THÌOP€ª­›5,B- ˆ,E©‹_ N£KJsè)êÚ-EÖòp¤b o›'H¯›§ÙFµÁŸC(ä0@7f•>ƒ#iÜùk©höÏmÁZÐè蛆£²ëN(ǘÀÆèu´1Ì`Ã×à!À”4„ •5»ðàŒW˜B²Z¥¼©¨-*‡¬úNÈjô„z1/k÷Ž« %j)ù˜‘Î&ÊUéÍHPíhÂqÞ¬sY—5T´ƒähYWd é£Ðl­&UþšäV!|¸íèšr-O³d=iBÄ1ãg{¤£Àé™k\ü¤lÏVhõ­Ö7?„ÓÑžËù9|ô%ÞÚ_›mqìBc¼ÅÙu'”ã’•÷Ïè!ä4g˜é4¥,ŽT®HÖòQ¡lLà-,ôd;CV èkAµ«»ŽµwBZ JÁRÈO>Ëà?-_yœãN†™cŠ?Qky¡št¨¡ ¿ÞðÚ,³Óá¡Põs® ŠÚ¸”’µò¼G¿\e[|K^·ÅBð«[Šª]äd—PŽ }m‰1=„×ÓYÚêAc')CÈCZs‹WóU3Þ•o{€Ò2M•‚(0¬9_-PXÿB¿>úzÌPˆ%.P¬¥Ü^[jöLÒ#ÚFeyPyÉ3u¶iD¿’òæ¢i«š¡öL1UÍÚ¨¬êïLF±_AìÔÅL‡‚™4 œÔÓÕ«Áܘ£JAß_… Âä¦hÔs¢8ûÕ¾‰ƒf¼ ûFå'(ºÏ×l¢*©ßÌ¥ª¬šäú1Ä0@úª’ÍIêˆåcŒ L}†XcœÂH¿ýµØœ Ü‹ùP²¤‰H3ÞN’îDKm’c[!"U[«(„œÆº°áaDš gýàð ³ Ã'?Bº0¤Õ/8/PLr:pn28»…Õ¬kIÒ(\K<#í‹Þ²Ó@›Tޱ2Áeœ'' º ©‰V-ÀìXΓ$œïHÏïê¡êÒþX¥÷´Æ•Ø‚ðBï›3”)²VQ,÷ Ž1%™‡ú(Ö÷Í:"e—ìÈEÔ`oN½ŠK’·Ó*pa'Çt$VqÐwgŽÅÛ ÂÕ„Uì²NaÞ{][!ê¾UzÒÙ3kÊ+ÔêÉg›ëÒ}½Câõy¸è;E«\¢wjqœ JÍ©§*½áµÙ†$*;„p”UiÝuA“ —¥¹¬~Ì} >3C:5Ìh/*I7éCH?‰!Y‹:°,Žˆøc˜}‚ÔHÖ†`cƒ:ºÃø9|< [β¯k–Á±B¶y VƤ MÒk.ãDÔ¡:^Ö‡QÇvNqš´>-ÝÊ®’ –ÎDÝÑ3å÷úÄv0Cåš\hñjE{Ãímó ¢ò›ßµÅ/9 ”O•ë”ËlÖ9K¼&p‰×ZEºF¯Ê#!Ä, ŒlK/¬JzJ¢Ç¾k³]jà;Dó!¿,¸­B…]ú\ ˜ŠNl¥5hYÑ¡õ{H &ê… =¥ß&¹®þ=ñ LÃA±¬3¡~1:tŽb4æ-PHÕÖ3)±iž‰ÂkœyH9;T{^Øg1‚Rç8Yë„nžÊãí}³õts,çàÅט »ï„r`rqî0gºovauŒ©.4G³®L(Þë}ƒ ¬EZ|'ÔÇ3] Q °"·k­)´ÈJJÞ'ŽA ¾ ƾ%X%Iþ€ïásÐ}«ˆ~Bƒ4ÀŠé굑½“&CáÊ 1ŠŠiô´å©ÖàdŠàÉ•Ûf j\žy¥ä>ùl; þq‡;®__^äãÎÝãú÷kú»;^à\N=ØÖPìãôK$­‹Tƒj*Ó/èá¡|æ—ëG—þøíá?žÈ+ì—㇞Ô-?ºãõå}ŸõL*—XZc.¥ªVUø;ü¾ø†z‰¿tUùN#Ã'Q°}á¡ÇÏh_ÒzütÐÓ ½£6ÄG‹e‚o-Ÿ_ìœòWNïòƒ˜±&FoeÏãQ_‚ÇÌÈd>T®}YÒ·¼ÄчtA:-Ÿ²t #fßwÑRQ‹œ.¾óÝÝãn×=CKL¨êiÀêYI‚ÏÔõï«_Ëaþ¢§çÕãË‹/=‡—_¿}õêÓ›÷ï ðøÍß¾ïE…ÿ£b¤ÿ”@ÈèøÇ@àÕð‹Ïž?ûú¸ùù/ŸŽp÷¸zßyù壟¾½ùøöç÷¯>|:vìúÛ«ïŸ?=}ÅKZñW|uÜyôÜ»—¸ÿùîñrþŠ~XŒ¯¡³ÐO'§AìÓýt|+À{!—yöö§7Ç‹½xõ×t3|HøÁo./¾|úæïooÞ¼øæñqýÝåÅø@Žpø”û6ú—û8dÉ•uÄX Ï‚L@GùÓ°°ÇÒŸ¿aIJ”Þ%‘ü‹~ꧯ>¾zx`‡@ïtyqýüâÛ¶mÛ¶mÛ¶mÛ¶mÛ¶mÛ¶mÛ¶mÛ¶mÛ¶mÛ¶mÛ¶mÛ¶mÛ¶mÛ¶mÛ¶mÛ¶mÛ¶mÛ¶mÛ¶mÛ¶mÛ¶mÛ¶mÛ¶mÛ¶mÛ¶mÛ¶mÛ¶mÛ¶mÛ¶mÛÿ­ýscš endstream endobj 226 0 obj <>stream H‰ìÁ€ÿ«ë jw—ò endstream endobj 227 0 obj <>stream H‰ìÁ€ÿ«ë jw—ò endstream endobj 198 0 obj <>stream H‰ì×ÏKÓqÇñ¿!B/žŠ"èÁBØ¡ƒ^„.;åA¢K„\2Q„4 Æ:hf$Á"TÌBW¸ƒ‚Q:L²Åü±åÔ^a— £ÂíýÝ÷û|ƾ·×áÓÏçøàc±Åê¦þso‚ÃKÉ”õ¸DøþK*ýZK¨Nj”•z¥jYÏ(y ‰u[T÷+_ó@lzÙz\…÷ A¥R¯t´Ô.Ìz@IÚÜÊ\½ùLwªŠºp_dv?{`½nÃ{¢^©Zj—˜:¦šY/(\¥P¼QPj— ¦3¦š©i*›õ"§‹M/ûštƒò·EëÖsàf¼Qê˜j¦“¦²©oÖsj)™ ‡ukªnê‹-ZÏûñDѨi*›Î›*§ÖYÏpíôÞõÐd™¯«¼¶;48³³›³^Oà=ˆbRÙÔ7UN­SñÔ=ëEÆò‡GC#s•õ=º–_¹6¾öñ‹õ"xïAŸ*§Öéà©{ªŸh½ÀÆT|¥îòÝ‹[#ñù5ë9ðÞƒ°¢â©{:~j Jh= ¨VßniÕ]¨ª¡÷áãWùÃ#ëEð"Þƒ0¤î©~j ¡z¨*Z/(¸¯™ì­Þçkî”ùºôGŸÖ‹à]¼aî$‰ê¡ªH€»=šx]ÕЫxKûhrõ“õxïA8„z¨*ê4ªê¤õ€3Ÿ_klè¶S¸7_±žüÀ{Ž¢6ª:“ª¥ši=à |ØHo<Õ §²¾ghd.÷-o½ø‰÷ œF…T'UKL•Sý´^ðŸvvs¡Á™òÚn]l::cÛé=ëEÀ/x™TK5S‡SýTEÕRëEÿæÉdâÂ¥»ºÏ‚ÃKÉ”õà7xÂÉTNõSGT-UQ­çü•7ï6ümÑ“;ÌÄó·Ös€Sñ„ó©¢j©ªºªºZÏ8ÕæV¦£3¦{KE]¸/2»Ÿ=°^ü ïA”µTEUWu\ÕX•Öz À¾ 0Ù½* endstream endobj 199 0 obj <>stream H‰ì×ÏKÓqÇñ¿!D„.ž a"$ä¡„:(t‘.yð B¤ü9+˜† |/ÃIR¤°ypA#l´P1&ÓÜtj¯.]ÍÜ|ïûý>‡·×áãóûùî’ÝÏ=[,¯¼pùAK§“H¦¬'|2¯«_ë!ÀÉÔUÕU'V¥UoU]ëEDæV !ÝR®Þ~þaå»õà_ñ„먱*­Î­ª«öZϾ‹oܼÖͤ²~x‰ZÏN‡÷ \J½UuuzU`uØzðŸ©_½3%U=¥¾ûævv³Ö‹€Sã=÷RuÕ^XVÕdëEÀr‡GcS˵A]¤›Û§ãk[Ö‹€ÿÄ{n§«Ã:Æj²Ê¬>[/^öfñKÍ­§º{èwáÝWë9À™ð„7¨ÆˬJ[Ï_ÛjnŸÖ}ãâ•¡±©åÜá‘õ"à¬xÂ3Ôd•Y}Ö‘V«UlëEÀ#vv³]C³¥¾’ªžŽÞ™ítÆz¼á1ê³*­V«Øê¶êm½¸Û„­¬Ö¹±u2ß°žäïAx’Z­bël«Þj¸õàJï?&êšFu£4„"s«Ös€üã=S·Uop•\=·ž\#‘Lµt:ºE”× Ž„—²û9ëE@Að„·©Þj¸J®s®ª«íÖ‹@QÛËŸ-”U÷ëòÐÖYßL[/ ˆ÷ ü@%WÏuÔÕv^·^ŠÑË™•K×ëÎp­ùŧØë9@Áñ„¨êj»¼:¯Ú[ÏED÷„wƹ'ÀoxÂoTxu^Ç^ÍWù­çcë›é¶îˆîeÕý#ó{™ëEÀùá=RçU{5_‡_ý×WÀz0ÝÏ„—*jƒº´t:‰dÊzpÞx·Ô|•_ç__} ôE°^ÎÏ«·Ÿ !ÝêšF—¢ß¬ç6xÂçÔ}ô_ /‚¾ Ös@ÁÅâ­“úúWÖO8Që9€%Þƒ€è[ /‚þôuÐ7Âz(ˆítæÞÀë’ªžÒ@_×Ьþ4ò[€ƒJ¶ endstream endobj 200 0 obj <>stream H‰ì×ÏKÓqÇñ¿!$„]‚ † ÂÈp·×åÃsïT p†–‡¯NœkЧõÀØÚz¼>8’ëoÎÉo¼~û…¾Z/“ÜÙíê›ô‚úé[yíitnÅzà܃À¯T5BB½P5ÔëE ]á‰Ù²õ]Ÿ£áˆõÀA¸?©{ÕPA¬ç€#ŠÎ­TÕö«éyE­¡'o’;»Ö‹gáþJ½P5Ô=uD5±^ac3ÑÔ6–ëoÎÉo¬k^mY/œˆ{øµCQGT5Ee±^ö÷xðíéówõ+·´º{&ºl=p.îA`_êˆj¢—¢²¨/ÖsÀ?MM/”TvªÚþÒC/?XÏœŽ{8 5EeÑ{QeÔë9à7‹Kß®ÜT©O¶Ü ½Nl'­.À=œÊ¢¾¨2z5*Žºc½¤¾ÇìúêÍ¡¥/ëÖ‹×àK•QkôpÔÕG ²^ÀñõläýÙ‹÷Õå’ÊΩéë9€ËpG£â¨;z>jJd=€cçÝÌçÒênµøÌ…{ÃÓÖsWâÒ¡ú¨AzDꑪd=€ca5¶UÛð\ý=Yp«©mlc3a½p+îA MjJ¤é)©M*”õ"<+±lïÏ+jUv/× Ì/ƬîÆ=d„z¤*é5©Pê”je½¯ G .µ«¶Å¡ðĬõÀ ¸ R›T(½)ÕJͲž€GÌD—ËkzUX_ øh`Êzà܃@Æ©Sª•^–Ê¥~YÏÀÅÖÖãõÁ‘\³þô¾Z/<…{Èâ@úºú&} ~¬–×ô~üôÕzàA܃@ö¨\ê—ž˜Z¦¢YÏÀ5³Å!5´°¬c4±žx÷ mª˜Z¦‡¦®©nÖsp´ùÅXUm¿º™WÔÚÞ3žØNZ/¼,÷àO鸰 endstream endobj 201 0 obj <>stream H‰ì×ËK”q†á¿!B„ \‚bT ›Y0ÁEH!¸1"‚œÌADÍ ´ì  … T¤H R¦„C8Hš¨¨(GGíiUFá¡ôýÆï¾³{6?îïÝܰEt5VÛÜ›”é?rò¶·°ul"b½ÇYXŒúª»ÓK•Ë"_`.²d½8üÊîuëÅé×zpø©kª›^œJ§Þ©zÖ‹pж@09«R•ôä5 †&­çnÁ=05N¥Ó»SõÔ>ë9ëŽgç6¨Œ)9UCÖswáL¨wªž^Ÿ ¨ZÏÀÀÔÌ|Áͪ᱌²ŠúwË+kÖ‹×ᬨzjŸ ¨7¨ª‰Ö‹8 ¿F0¿¸V¸[* :¨g¨&ªŒê£õ"öWGçPš§FíËÎmèŽ[Ï\{pÕPMÔcTUIë9ì‹PxړפÞ%gU¶<ÿd=÷ à *£ú¨'©V~ž²žÀ3Y*òRKÓK}Õ] ‹QëE~àE}T%ÕJSÝT=­ðObëõ?$eúõÍé-l ÎZ/ð÷ à@j¥Š©·©zÖ=z¯’Z/`/Þô|É8_§¢ºp¿§oÄz€ßqŽ¥nªžz¡*©zj=€]Îæ^{ªŠ?]Þøìcl}Ãz€?àœLõTCUR½ÓËOÔVëElãÛüÊò×GÓî$¤–\÷¿Ô_ëEþŠ{p>•T=UUÕV–°ëaû@rV¥>//^i …§­çØ÷ /TUµUöÄÙ ÕÖz[ô|=s©^JóÔ¼z;l=ÀŽpñE…UgõlÕÜž¾ë9lŽMDò‹ÛÕ¦¤Lmsot5f½ÀNqqGUmÕ\=^õW¶^p©å•µ»µÝ‰é¥JÒÕ[3s‹Ö‹ì÷ §Ô\•WïWöUw©ÈÖ‹îÒ¦äT©Dž¼¦ÁФõ{Á=Ä5õWÖ+V‘Õeë9WP}ÎyPààv统ñ½Z endstream endobj 202 0 obj <>stream H‰ì×ÏKÓqÇñ¿!D/ž a(¤/;$$„à%é ^<)å e¤iÁR"µƒ »ŒAaöKQ"õàG4JDEEYøkÓ©½ è`$…›ïùÝóqøž_—ïçõzŸœ¤ Ñ@0¯¬ëʵû¥•}ó¡Uë8ÇZÛØ®mò«q² Ú:½ûÑCëDÎ¥ýñ;ýÑúZp.jdõ²ÚY´šZ}mà(±ƒxïÀtva»Š¦ºÁ·´±N ¸'Q;«£õS«¯»ŸM©»­œÀ?¾àr÷¨_Š+¼³Áeë8†{p5µúZ¿¶º[ np‰…Âë·î¾P§ä–x}sÖq$÷ àTjmu·~ðòš!µ¹uÀ%óc;ZßÈÈoÎtµ6zÆvvcÖ‰$÷ à`ên5¸z\m®NߊìY'\ñ£ãþᙜ¢­Äªº‘ðâ¦u"ÉÂ=8žz\m®?]Í®~WË['¤®÷¿Þ|¢ÖÐ÷íTØ:€äâÒ„:~œ!¼¸YU7¢¦È)ê螉['t܃@úP³«ßÕòúëÕøê}ëD€”°³»÷p<ÓÕš‘ß\ߨŠìY'pA¸t£–W׫ñÕûž1mëDKƒ¾¹ÜayÍP(¼nÀ…âÒ“_½¯ß_@KÀ:ÀÀlpùÆí§ê—»Ç?¾`€îA ©ýµôWxµ ¬ã.ÈÒJ¤ºÁ§÷?»°½ûÙTì n€ îA Íih hè)Ð6ÐB°NH¢ýèa§wâ׳_Ûä_ÛØ¶NÀ÷ ÑÐ*ÐkUЦ µ`x¾—ŸóʺôÚ—Vö͇V­ã°Ç=à7m-½ Z £ u@Âè…wßyÎ àîA§h'h-èeÐrÐ~°Ž8—­È^m“_¯zVA[Ë£7ûÑCëDR÷ €?i-h3h9è}ÐŠØØÚµNøo±ƒxïÀôÕëô˜W7ø–V"Ö‰¤îA£å ý 'B[B‹B»Â:à_½žüêr÷è /®ðN~ún@Šâp6­m =Ú¯>|±Žƒ¤ú)À_˶F endstream endobj 203 0 obj <>stream H‰ì×ÏKÓqÇñ¿!D!<ÄÐ@xRÁ‹4¼^*é’S”‰PV†(d6J1DQ DøƒJB)G“²ÐÒ¤5µtéСtúþþx>c»½NožŸ½=î7[, FŽº~âLSWߤõŽÖpç©Î…¾­‡p4…ºBçB¡Ò°žø‹Õµ­šðPJ 65«N?ô×z§ã=àýÎ 5†JãJã2œ#±³ÛÑ=ž‘V×]¨|›[²^Àxø/j •†î†ªCí¡±^~‹ç—¶é2ç·Gg­çpÞƒöA½¡êÐõ8}þ®:ÄzøTüã·òª]ãôÜÆÖ/;»Ö‹¸ ïAû£êP{¨@tCT#±¹%ëEà#ëÛ¡–Ñ´ìú”@muhpyeÓzWâ=à T êÕˆšDe¢>±^Þ÷hàUfA³®¨¢óÍÛë9\Œ÷ €ƒS¨ItLÔ'‘þ—ÖsÀ³&¦æ ËÚuo³Šn ŒL[Ïàz¼$‹ÊD}¢“¢VQ±XÏOYø²véj¿nìñœ†¦¶gß·~Z/à¼$‘úD•¢VÑa¹x¹Oõb½\ïÏÓZyí1§@ñtj‹n‹êE £’±^n5028wSµ°¬}bjÞz¯á=à¨[T/º0'ÏÞPÏXÏ—y=󹨢SW4³ ¹wpÊzoâ=àP©aT2º3ªµõpå•ÍêÐ`J 6-»>Ô2º¾±m½€gñpØT2êU® Gc½*±³{ûþóôÜFÌòªžŸV¬ð8ÞƒŽ†ªFm£ƒ£ÎQílÿHX/gŽÎæ·êNæ—¶EÇâÖsøïAGI…£ÎÑÙQó¨|¬ç€#Äæ–J‚ÝÆŒ¼pG÷¸õ>Â{ÀÑSí¨yt|Ô?ïÞµžfV×¶jÂC©Yuúè‡þZ/à/¼˜  «o2#/¬+ Ffb‹ÖsøïA†Ô?ª ]!Ñ½Þ ë9¼ì—d¸½m endstream endobj 204 0 obj <>stream H‰ì×ßGÝqÇñ¿aDbÄnb4‘H¬‹Ùv±n"‘u±‹&²‰]D¿¦¤Ú&e*›UÓÚHkÍѯMÙÖ(j©TJ[?Oj/–±IëÇÉû|Ïy>.>ׯ«·çgoϸû'âSjÏ]ʹVÓ峞 x•>ìÑ-Òk=@ðR ©ˆt‹TGj$ë9p†¦f–3î¾ÐÅ sÕ4öz¶¼Ö‹5þƒüŠH]¤:ÒEJÏiU/Y/[]óVu‡ÅëÐeç¿ZZ^·^üøÕ‘IGI½¤jR;Y/ßhí‰LªÔ}KÎhµžûøð7*%õ’NÓÅ+*(ë9p*?Ï$¦Öé¦é?ø²ó‹õø ÿAþIÕ¤vÒRG ŽL[Ï€c›[XÉÊk×;[ú öÃÆæ¶õ"øÿA~Kí¤‚RGéL©©TVÖ‹àH<[ÞŠz÷ïó•™Û63÷ÓzŒÿ ?§ŽRMéR©¬ô=TeY/€Ã´¿ý\­«•˜Z782m=À#¨©TVºWª,µ–õ8Àèøüõ[ºT åMmCÖsàÿøpõ•*KW+9£AÝe=ö--¯çv„D„FVu¯®y¬À‘ðà,ª,µ–ŠKÝ¥úRƒY/Ô¼;»õÍáq.UZvËøä¢õ"8þƒœHÅ¥îÒùRƒÕ>ëSY/ŒºÜc±7ééu÷OXÏ€cã?À¹T_JLUf=@Ÿ\LËnÑý¹p¹¬¾yÀ»³k½N‚ÿ GSƒ©ÄÔc:e©wž«Ð¬p«kžûe¡ÑE!Q÷JÞüXÙ´^'Ç@P©ÊÔf*4uyàŒ4µ E$”«nÞ~::>o=N‹ÿ €€¡6S¡é¦©ÖÔlÖs”¾OSñ)µº0ÑÉÕ¯ß}³ž¾Á@€Q§©ÖtÙTn½Cß­çp¼©™åÌÜ6]•ð8WMc¯gËk½|†ÿ €À£ZS³©ÜtßTqj9ëEicsÛõø}XL±ŽIV^ûÜŠõ"ð1þƒ•ÊMý¦§–+©éQ×Y/à$­#‘I•º!WÓŸ ÎZÏõK€îe¶L endstream endobj 205 0 obj <>stream H‰ì×OKTa†ñÏ"BW†0"¤B- B@rÑB¤ZH:šbX¢V˜)-Tˆi*$-IÊ,´Ò ¡DQQ¦ü;:j7.¤DE}f8×oqÖ÷æ<\ïÚ°;·^:R¢¯õØÃc'ÏßסKʬi÷ Zϸœƒ÷ 'PÑ©ëtîNäÜSéYÏ¡Æ'gò‹½ºq)å•wº—­Àþâ=À!Ôuª;5žŽžzOÕg½@ -…ë›{Ò*u"òŠ<£ õ"8¼8ŠO¥§»ŸZ¡öSZ/`ïé˯®¬:]†cgÞ~µž‡÷ Rï©útýT€ÞÎ!ë9Ì û'Î\|¨k˜^Ýâé·ž÷ ÇRû©uUƒjBë9Ô¯™ÅËמÅ$—ƺʮTuÌÎ…¬€ÞƒœL¨T ª Ý>õ¡õ"û.¼²ÚÔÚwøh•(§ Í?2e½ÌðÕ šPÇP}¨JT+Z/°_zÞýH=}[ÿ»¾/z¾YÏc¼`Êp£»ß|·ž`ùG¦r Úô'¤U6µö…WV­€=Þƒ°A}¨JT+ê0ªUÖ‹ìÙ¹»¶+ÖU“\ZèöMç­@¤à=›¨UŒêFÕãÕ›*IëEv¯ÅÓŸ˜^­Ú9u¡yØ?a=" ïAø'u£êQR%©ž´ž`ÇÞþÌÈnÔ_ìʪóvYÏ€HÄ{¶ †TIêN?wWmi=À¶ÆçyôçÆ§VÜhê -…­@„â=[SIª'U•º–*ÌÑ@Ðz€ÿZX\¾Þðzý‡Í/öŽOÎX/€ˆÆ{¶CU©¶ÔÁTgª6՜֋lö¸ãKRfþÓŒìÆŸÖs ð€íSaª3u6ÕœžçŸ¬çøk`x,+÷Áú¿Ùî´žQƒ÷ ì”jSÍ©ã©þT…ZÏm:8_PòDÿc\J¹»¶kv.d½¢ ïAØ5§ÊSý©š_ìU‘Z/'´®oîMH«Ôo˜{éÑh h½¢O4¼ÿ0׸ò endstream endobj 28 0 obj <>stream H‰ìÕ¡qÁh$EÒUl@ÅP@<ƒ‰#È'1„anW|ýÍ›»Ýóùu>|ï÷ÕO§û,]€Ý`étè>K C÷XººÀÒèÐ}–.@‡î°t:t€¥ Сû,]€Ý`é4]®¿§ïŸû}õ#À¿Ò}–.@“íC“í°tšlšl€¥ ÐdûÐdû,]€&Û‡&Û`é4Ù>4Ù>K Éö¡ÉöXºM¶M¶¼»?éžuª endstream endobj 206 0 obj <>stream H‰ì×ÏKÓqÇñ¿!„^¼Å`"èAOÁJ xñ”x¤CI—6¥±ðŠ0ô %¥Ñ/DHQ5PƒQDaâ°P'þHk›½‚ˆºÆ¶÷÷ûÝó w{öùðü\\€#mî$›n=¿tõ^qE¤whöü{ÊzP(¦âke×{uúªêcñ¹„õp«—KºKõi=ÜJ-ª"Õ]ö¨Q­ç·²þ¥®yX'®¤2úèÅë9ànoWu£êÓz¸›ºTuªU¥ª^µžxÐáÑY{tòr CúG_­€ëñ€lù«>ˆX²k`d¾¤2ªh©k^ߨ³žÁ{²K¥ª^ÕÕªvUÁ¦ÒëE€»ÅçUõ1©òÚ¾©øšõðÞƒ ªVµ«.Xu¬jÖzàJ›;ÉÆÖQ£âŠHïÐl*±^^Ã{rDíª‚UÇêšUÓ&¶¬®q|rîž)*ëôùCmáñýä©õ"ð&ÞƒSêXÕ¬šVe«¾UåZ/œîÙøbiu—ú$Ø4øiå³õð2ÞƒjZ•­î[U®Z×zàP ‹Û5 ý:)þkǦ—­ç€÷ñ€¼QߪruëªxÕ½ÖsÙýzÔr÷µNÇ•òûbï¾ý°^÷ ä“*W­«âÕÝ«úU[/Œý}(nÞyÅ¡€|â=ù§âU÷êúU«„ÕÃÖ‹cÓË`ÎBMCÿÂâ¶õ(8¼ÀŠêW ¬KX=¬*¶žäÕÒên°iP¿ÿÒê®§c­ç@â=¶TÂêa]Åjc²õ çö“§máqŸ?TTÖîž9>9·^…‹÷ ˜S«ŠÕÆ*du²jÙz©t¦ïñû⊈ڣ±u4±u`½ ïApµ± Yw²jYͬr¶^dÓT|­¼¶O¿ðªúX|.a=ð ïApu²jY7³ÊYýl=È‚õ½-Oô«.©ŒŒÌ§ÒëE€ßx€Ó¨–ÕÌ*gÝϪhµ´õ"à?µG'/:|þÐíÈ}µ^øïAÀÖO½Î endstream endobj 29 0 obj <>stream H‰ìÕ± ÂÁh„"éÊ)eÐŒ!¼,@Ú™àãOVwž\éx¾n÷Ççþúà«´MÚ`ÙhÒ>4i€e IûФ}–]€&íC“öXvš´MÚ`ÙhÒ>4i€e IûФ}–]€&íC“öXvš´MÚ`ÙhÒ>4i€e IûФ}–]€&íC“öXvš´MÚ`ÙhÒ>4i€e IûФ}–]€&íC“öXvš´MÚ`ÙhÒ>4i€eþË[€޾KÏ endstream endobj 207 0 obj <>stream H‰ì×ÏKÓqÇñ¿!D!<Â$ÐÈ]vHPˆÀK âA¼RþÀPF™¬DòÇ!ƒ]†P™E%J¤2pD£D4RN§öŠN•Úæ{ßïžÃ˜'߇ï=ßûûÀÁVV·n´=ÏÈkÌô4ë‹þ´ž8š¾ÀÔ™ í§ÎÝ*­…­ÇàÙ›OZÔú´pU´ZZ‹Z]­º¶8”Ñ÷_‹Êüz·o'©Œ{Rß‹ÑÏêj­k5¶JÛzàæ¢u½ÕÓçowõŽÇ¶ãÖþ†{A]­ºVcki«·UÝÖ¿ÙÜÚiº÷2+¿EO´º!¸Y·žðoÜƒà ‘è†J[{[Õ­öV[Oüôdhúìå»z™Þë>„¾Y8,îApõ¶ª[Û[®·iM¯ñÒµ‡¼Fp(îAp¨ÀÓ*pípÕ¸šÜz¤ïK«Õ A½À¬ü–vÿÛÍ­ë‰GÆ=Î¥W‡g´j“«ÌÕçÖ!-Ķã=c¿^E]`n!j=à˜¸ÀéTãjr-sõ¹*]­n=Ü,82ãñv꽕ù'§ç­ÇüîAp•ùÅ«´ÒÕê*vëqàB¡ðbIe¿ÞXn±¯/0e= ¸ÀMTéju-vu»êÝz¸D$ºQÛ4”‘טéi®÷ ¯­Ç¬'$÷ ¸ŒZýæu»ê] ¯’·žßÝë~<‘SئZ(¯ Ï.[OH$îAp%u»ê]^%¯žWÕ[Oçy5.¸r_¯HŸún= ñ¸ÀÅ^¿ûBÏã³Ëå5ƒz99…mÝ'â»{Ö’‚{ÜM%¯žWÕkÛ«ðÕùÖ!¥­­Çê}ٞ挼ÆÚ¦¡HtÃz"@q@:XYÝRÛ«ðÕùª}5¿õDHE}©ÜbŸÂ ¤²?^´t܃>Tø¥UZûj~•¿õ8H!“ÓóEe~½ ·382c=à„p@ºQí«ùµüÕÿº¬Ç±¹…hE]@ï!» µ£g,¶·žpr¸ ©ù»zÇÕÿú Ð- ‹ )ÿ懹…Ç endstream endobj 30 0 obj <>stream H‰ìÕ!ÃDA 5‘uUZ1“®‚üpøÈ{]pÏ÷|ïÿ}úàVÚ`ÙhÒ>4i€e IûФ}–]€&íC“öXvš´MÚ`ÙhÒ>4i€e IûФ}–]€&íC“öXvš´MÚ`ÙhÒ>4i€e IûФ}–]€&íC“öXvš´MÚ`ÙhÒ>4i€e IûФ}–]€&íC“öXvš´MÚ`ÙhÒ>4i€e é‰ö ¹KÏ endstream endobj 31 0 obj <>stream H‰ìÕ± ÂÁÜEº+RÊ Cx ig‚?YÝuw{¾ÞÇãüÞ»à/ØhÒ>4i€e IûФ}–]€&íC“öXvš´MÚ`ÙhÒ>4i€e IûФ}–]€&íC“öXvš´MÚ`ÙhÒ>4i€e IûФ}–]€&íC“öXvš´MÚ`ÙhÒ>4i€e IûФ}–]€&íC“öXvš´MÚ`ÙhÒ>4i€e Iûð[‚O[ endstream endobj 32 0 obj <>stream H‰ìÕ¡ÁH„ Éê-ã\ý¨é§ÏLíyþ‡ãùºÝŸûíGø vš´MÚ`ÙhÒ>4i€e IûФ}–]€&íC“öXvš´MÚ`ÙhÒ>4i€e IûФ}–]€&íC“öXvš´MÚ`ÙhÒ>4i€e IûФ}–]€&íC“öXvš´MÚ`ÙhÒ>4i€e IûФ}–]€&íC“öXvš´MÚ`ÙhÒ>4iŸ+Þ é!KÏ endstream endobj 33 0 obj <>stream H‰ìÕ1A A$®>EfÂ}PÅt_2µç ü«ãùºÝŸûëG€¯Ò>4i€e IûФ}–]€&íC“öXvš´MÚ`ÙhÒ>4i€e IûФ}–]€&íC“öXvš´MÚ`ÙhÒ>4i€e IûФ}–]€&íC“öXvš´MÚ`ÙhÒ>4i€e IûФ}–]€&íC“öXvš´MÚ`ÙhÒ>4i€e IûФ}€«·õ‘O[ endstream endobj 34 0 obj <>stream H‰ìÕ± ÂÁh„"éŠÔeÐŒMx‰ >þduçÙö>>çë{ýp+íC“öXvš´MÚ`ÙhÒ>4i€e IûФ}–]€&íC“öXvš´MÚ`ÙhÒ>4i€e IûФ}–]€&íC“öXvš´MÚ`ÙhÒ>4i€e IûФ}–]€&íC“öXvš´MÚ`ÙhÒ>4i€e IûФ}–]€&íC“öXvš´MÚ`Ù…ÿv 0”ëKÏ endstream endobj 35 0 obj <>stream H‰ìÖ±+¶aÀá¿Án·Y,fVQ¿U6eaÉ$‹Áúõ•A ó[Ê@ÊH¡$J‘â †C²=ßýzÎu ï|º{~ç¼ooð½ýÃó‘ñåøm=ð_i€Ì]€š´5i€Ì]€š´5i€Ì]€š´5i€Ì]€š´5i€Ì]€š´5i€Ì]€š´5i€Ì]€š´5i€Ì]€š´5i€Ì]€š´5i€Ì]€š´5i€Ì]€š´5i€Ì]€š´5i€Ì]€š´5i€Ì]èÂÝýÓàä²õðíó+Ä.ÚzŠ^Ñ>™»Ð……•½xÕ?K»×·­gïiŸ!û3¶h|¥±Q[ÏÒ+Ú sºcæÿÆÃŽN®®m=¿¼¶ž¾Ò>C+vflÎØŸñ‰Æ.½º~h=Q¯h€Ì]èÎàärzv+žwbfc÷à´õ8ð‰öN±-cgÆÇû3¶hëqzHûdîB×vþM­Ç#ÏÌmŸ]Ü´>ô¡ýwH÷± endstream endobj 36 0 obj <>stream H‰ìÖËK•Q†ñ¿!D'Ž á ˆ‘Eà@È&‚ƒ… „!ä-1„(Q “" ÎDìjK’Ì$r…‡2ÉPQ³ÔŽÖm¢ÈRÏú.Ïo 8[|{¯gŸ¯_$ñɼ¢Öm;O¥çÖ·E­Ç ¬[_ë#ë¯õ Oà]H€ K•çî¥dV'eT”VvÍÌ~²ž`÷á!ª¢Ú¨B&GªTK5Óz¢ c÷.Þ…„‰N–tèk§f×6_鯬ZO„Pc÷á*¡z¨*ê6ªê¤õDÁÇî\¼ Öûôí®ýMúæYùݽ#Öã ¼Ø}˜SUÂ=T­Ç vàâ]H¼øÊjKû@Úî:}ùƒG¯ÆF§­'B±û0¤î©~º*¡z¨*ZO"ì>ÀÅ»`en~ñxíͤŒŠäHUyÝmýk=…݇ µNÅS÷T¿c57H_â±ûï‚­áØdÁáË:‚ôÜú¶è õ8v‰§Ê©uºxêžêg=NH±ûï‚èûGòÎë r4÷ ¾³¡Àî#‘T6õMWN­»~ÿ•õ8¡Æî\¼ ±´o¸Ô—š]«ã(.‹ŽÏZO„€c÷‘ª™š¦Ë¦¾©rjõDaÇî\¼ ž25³päd§N$%³º¦áÁçÅ/Ö!°Ø}l5LSÍtÓT¶‰©yë‰ð»pñ.xЋáyE­:—{Ï^ë²ÁÄîcK©]*˜îؾCÕ4ëqð»pñ.xÖÚ¯©=…ø5…MÇîc‹¨Wª–n— ¦ŽYƒ_±ûï‚—}^ür¦ùQJfµÎèÈÉΉ©yë‰ì>6¥Ré^©ZµM=*˜õDø vàâ]ð¾±ñÙⲨŽi{Öé†K}KËqë‰ì>6‘º¤:©QºTꕪe=þˆÝ¸xüâÙÐûœÍ:¬HÞùλ/­Çï±ûØ,*’º¤ë¤Fõ?³Áî\¼ þÒLϭב¾<›´>ÆîcãT!µHI]R¬ÇÁº°ûï‚ï|\X:Q'9R•”QQZÙ57¿h=|‰ÝÇF¨<ê*¤•×ÝV—¬'Âz±ûï‚OÅF§ K:tvi»ëZÚâ+«ÖÁgØ}üÕFÍQytT!µÈz"üvàâ]ðµûcYù:AýíyòÆzø »ÿ Î¬5§»wÄzœ`û&ÀÞGN endstream endobj 37 0 obj <>stream H‰ì×ÍK”QÅñ¿!B!Z „`Q-Ú T`AIB""ZD9J2a¯XjQÍf*´E EdF/Ò •’¡M¤æèhäR½ÌÌïñy¾Ÿ…89pï9wüö-?nÝ}µlÍ1ýÌÓß,-¼ K]vn¾­«¿´2ªsÜ} ;õfÌ:–º¿¢mÑÂèΔT4is´<Ö‰ðè>ÀÅ»àã驃‘ž¢²ú塆£§ú&&3Ö‰àutH{¢UѶha´3ZëDø/tàâ]ð“djtÛÞË:ÐU›;cÖqàitBK¢=ÑUÙ²§C c9@÷.Þÿ‰÷½ …ÏéX7ì¼ðøù{ë8ð(ºßÓzhCtI´'Zë8Ⱥpñ.øRf&{æÒýkëpkêbo‡ÓÖ‰à9t¿¢ÅÐnèzhCN¶%´'Ö‰Ktàâ]ð±¿ì?_øRw¢õÞ×éYëDðºŸi%´Z Ý ­‡6Ä:rî\¼ ¾÷,9²i×Eòêͧc7_XÇWÐ}ü@û •ЭÐb<¶Žƒ|¡ûïB@\ïy¾ðM/\Ý®ÿ­ãÀÝÇ"m‚–A÷A+¡­°Žƒü¢ûïBp|žœ½S\Þ¨ß$>žž²NKt¢Ðè&h´“ëDÈ;ºpñ.ÍÛátM]L‡^RÑÔÒñ 3“µNt?àÔ}-€v@× úÐ -ƒu"ݸx‚)ñhhÝöV}(|®7ñÚ: Ðý SëÕ}]í€ÖÀ: Šî\¼ AÖX¹þ„.@Uí•djÔ: Šî“š®¾ëèK+£Zë80@÷.Þ…€ûüeúpôöòPCQY½~ÑGëD(º4 eWÓÕwÊdtàâ]€¤ÞŒíØwU7¡´2ÚÖÕŸ›·N„¼£ûÁ¡F«×j·N¼ªöŠún–è>ÀÅ»€E½‰×k·ž×}X·½5ñhÈ:ò‹î„º¬Fë¬ÕnuÜ:ìÑ}€‹w®ìÜüùËK*št+vèz÷É:ò…îûžú«ë”Õè–Žj·u"xݸxð³ñôÔÁHOQY}qycäì‰ÉŒu"äÝ÷1uVÍUÕbuY¶N¡ûï~eðÕ‡pu»®ÇªÍ×âO­ã Çè¾_©­ê¬Wý}–±ŽÏ¡ûð‚ï c6Jì endstream endobj 228 0 obj <>stream H‰ìÁ€ÿ«ë jw—ò endstream endobj 229 0 obj <>stream H‰ìÁ€ÿ«ë jw—ò endstream endobj 230 0 obj <>stream H‰ìÁ€ÿ«ë jw—ò endstream endobj 231 0 obj <>stream H‰ìÕ¡ ƒ`„ѺH‡ìVµ,P…a€z‚©äyBþ&÷ž8}îÛwþÙºý>ó÷ÜÑG€Ûé>é=-çëÜÑG€Ûé>I ‡îtzè>I ‡îtzè>I ‡îtzè>I ‡îtzè>I ‡îtzè>I ‡îtzè>I ‡îtzè>I ‡î_s0ÚY›ù endstream endobj 232 0 obj <>stream H‰ìÕ¡Áh„"éê-eÐ̃ŒyÉ0ÃíŠè¸;O€ÿr<_·û㳿>|î°t:t€¥ Сû,]€Ý`étè>K C÷XººÀÒèÐ}–.@‡î°t:t€¥ Сû,]€Ý`étè>K C÷XººÀÒèÐ}–.@‡î°t:t¸ò`…W3 endstream endobj 233 0 obj <>stream H‰ìÕ1ÂA 1‚ȸ¢Ef’”o€¡¸Ýâëïîº(z¾Çë|ößG€ŸÓ}–.@‡î°t:t€¥ Сû,]€Ý`étè>K C÷XººÀÒèÐ}–.@‡î°t:t€¥ Сû,]€Ý`étè>K C÷XººÀÒèÐ}–.@‡î°*]¸,F‹§ endstream endobj 234 0 obj <>stream H‰ìÕ1ÂA A$®h#3 å;Ìí_wç ¼ÏãùúîÝGø ººÀÒèÐ}–.@‡î°t:t€¥ Сû,]€Ý`étè>K C÷XººÀÒèÐ}–.@‡î°t:t€¥ Сû,]€Ý`étè>K C÷XººÀÒø—(s3 endstream endobj 235 0 obj <>stream H‰ìÕ¡ÂÁh„"é*–2h& OÆ‘™ß¯ßÝy\s¼?çë·ÿ>À-èìÐ}J`‡îPº;t€ÒØ¡û”.ÀÝ tvè>¥ °C÷(]€º@éìÐ}J`‡îPº;t€ÒØ¡û”.ÀÝ tvè>¥ °C÷(]€º@éìÐ}J¸³¯øã3 endstream endobj 236 0 obj <>stream H‰ìÕ± ÂÁX„!Ù*-c°L ô‘ˆôw…kwž\éxÏ×oÿ}€[ÐèÐ}–.@‡î°t:t€¥ Сû,]€Ý`étè>K C÷XººÀÒèÐ}–.@‡î°t:t€¥ Сû,]€Ý`étè>K C÷XººÀÒèÐ}–.@‡îßËW€KÔ‹§ endstream endobj 237 0 obj <>stream H‰ìÕ1ÂA A$®º"3…ñ ”¹2gûó¸×ñþ<ž¯ßÞ}¸œîPº;t€ÒØ¡û”.ÀÝ tvè>¥ °C÷(]€º@éìÐ}J`‡îPº;t€ÒØ¡û”.ÀÝ tvè>¥ °C÷(]€º@éìÐ}J`‡îPº;tø—¯›ÿ3 endstream endobj 38 0 obj <>stream H‰ì×ËK”aÇñ¿!B7­ At‘‹fÑB7B!HB"ˆ"„4Q”"/¢ ¡’¤„ u‘.Ì"-”P0Ì“lÂû½_õ…·Ñó¾ï|?ˆèîàs¾œq{€W¼|ýéÄ™Ûún=<*Ü3’jÐ’ä5OYƒ¸¡ýàQ¡êTÏšž_§r­ÇGÑ>ÀÅ]À®–WÖk›úR²ª´*—n<›™·žq@ûA¢*Õ¦TªV5k=¼‹ö.îöH8/ßzÎÎÀ ý`P‰êQUê5õ/¡:µž^Gûwû28<•WÔ¬Iϯ ÷ŒXƒƒ£ýPƒ*Qï¨*Õ¦õ8ðÚ¸¸ 8€Ž®áSgïjsBÅ­C£ÓÖãà hß×ÔêÓ ªÄGá÷ÖãÀOhàâ.à`W+ê{“3+“Ò˯VtÍÅ–¬'ÂþоO©5§îTŸT‰ÖÁghàâ.à0&£± Wžh…R³«Ûú76·¬'Â^Ѿï¨/U¦ÖôpênâËwë‰àK´pqpx‘‰ÜÂ&-RÖùÝ‘1ëq°'´ï/*K}éÉÔšŠ³>FûwñÒòøMZNÖ© ¤}üó7ëq° Ú÷ Õ¤¦ôXêK•mlnYO£}€‹»€8ú1¿r³æÕÉŒ;úÒúÕz"üí{ßï ’ÒË ñBûwq7:þµ ¤]{•–Só°ó­õ8ø7Ú÷8µ£‚ôFªIMYƒà }€‹»€#ÒË5h»r ›"Öãào´ïYêEÕèuT:²ACûwGgum£±­?5»Z;V|íéd4f=þ }R#*Eï¢jÔŽ ²žDûwGm.¶TZÖš%gVVÔ÷.,®ZO„_hßSÔ…êP#zõ¢j¬'B`Ñ>ÀÅ]Àñ·jÙNŸ»ßÑ5l=hßCT„ºÐs¨•b=Žö.îŽSç‹;Ÿ{óŠšß}ŒZ“Ðhß TZÐC¨ Õa=í\ܳå•õÚ¦¾”¬*-^iYxfvÞz¢Eû¶´ùÚ=ZPêÂz"$ Ú¸¸ 01]¼Þ¹óaø^KdumÃz¢„CûV´íÚym¾þþª@-XO„ÄBûp´~ 0Þ/N^ endstream endobj 39 0 obj <>stream H‰ìÖÍKTaÇñ¿!D„6® a$HÈEµPh#mráB„\Hù–R †Š f3X$I6D.œ¢!L2T e4Ç÷~‹°§utôÜ{çûY Ìîðð=œ»½í/Ï^}:qæ–~­A&z7þíüÕ*0TÒž°'³°û&Ô¹j×Ë«|õo=2»pq`®7Í+nW‡—¯÷Äâ³Öãd vÿ˜©m®7WíjÞzd.vàâ.À ––WoÞÎ5eå7Ô4þXøi=Qð±ûÇF=«jµ­ÂÕ¹j·žÝ¸¸ ðŽøä|yõ€‚Ì=ÛÚÝ?¶±¹e=Q±ûÇ@ «dõ¬§VÛ*Üz"€Ýü…»¯yó¥ðÊ=e©ßç¯?[XìþQS½;%«jëq€ßØ}€‹»ÚØÜêî;u®Mq–WÄ'ç­' vÿè¨Xu«çUÃ*Y=[OüÁî\ÜxÖb"YÓ8˜•ßjªkZZ^µž(PØý£ JÕªŠU·ªW [Oü‹Ý¸¸ ð¸X|¶´²O•æ·÷†£Ö㻟vêS•êUU¬ºµø?vàâ.À"á’µZTÖõöý”õ8AÀî§‘šT™zOUªV­ÇvÃî\ÜøÅêÚFgÏèÉÂÛ*¶¢6<5½`=‘¿±ûi¡U£^ReªOUj=°vàâ.À_fæUõE›SÐÜzd%¹n=‘_±û‡¤öT :Ô3ªI•i=°/ì>ÀÅ]€}ˆ}¿PþPéž¾x÷ñà¸õ8¾ÄS{z@u¨­ÇRÀî\Üø×Î7ù¥kø&O»0*M½ééÔž ´H»pqàk+Éõ–Η9Íʸª>23—°žÈ7ØýT©.5¦GSoªNíYO»pqSÓ µa•œ{¶µ³gtumÃz"`÷÷OE©+Õ¥SiêÍz"ààØ}€‹»€À~-*ëRÏ¡’Ž'/>Zãuìþ>©%¥·R]jÌzà°Ø}€‹»€€é GóŠÛUuie_,>k=Žw±û{R?ªH¯¤¢Ô•õ8@z°ûwÁ³˜HÖµ e‡š²òn´<Õ_뉼ˆÝß…šQ9êG©%B°ûw©ø%ÀHJ² endstream endobj 40 0 obj <>stream H‰ì×ÍK”aÆá¿!D7AP"ˆ ‹ ÚH¸Ð AÐÂE!¸ Z6J2Q„‰0(¤a¤‚æ"15 ¤¶H()%E4´”)?rlÔnd0üxgÎÌûü.Blçyïsshg'sLÍ,UÞzqêB]nQ°­k4¶µm=Qzyýö‹>Ž~Z’^´'ÚíŒ>ŽöG[d=à1ºˆÇ]€¿ †' ÊZ´äú™¶'ÐýÿiCö¶E›c=t»ß‹mm‡ž¿Ï)lÔªWÕtOÍ,YO”è~ wê{ó9¯ô‰6¿¤²ul|ÎzŽw_¹+}}m‚öÁz uï>`îÜÝŒ=½;Sp_ûãvïüÂoë‰RÍÙî+k%®·+}í€6Áz" ¥œí>à@ܸláÇÊÍ»}{ÿ5ø³ñ×z¢Ôq°ûÊW)+k=\¹+}ë‰vwŸ+©lUÎ_yürà“õ8)âZ÷•¬òÕ“•µ·0ãZ÷‰q€]=ýãç.?RJ¯·œøn=NÒ¹Ó}¥©LõXå«”­ÇŒ¹Ó}Àap€=«kÑ@ÓPv~ƒJQS÷j9²n=Q¹Ð}%¨õLeªd•¯õD€=º8<î°Ïì|äZmz‘SØØÜ1ÝŒYO”þî¾RSvJPoTšÊÔz" ]ø»û€£â. LW„ÔŽü«ÍƒáIëq¼çãî+/¥¦×)Aåh=^|Ü}À1p€žöŒåÕ‘òêΉ©Eëq¼äËî+#%¥w)5eg=Ž|Ù}À±q€Ä~­lÜ dåÕë~Ñ_­'ò†ÏºïטÏù¬û€â.‡ñõÛÏòêN•%·(ØÖ5j=ŽüÔ}%¢\ôe¤¤¬ÇÒšŸº89îpxƒáÉ‚²U¦¸"™¶çDüÑ}¥ ,ôå¢t¬Ç2€?ºð w8’èf¬¹c8§°QÅ©ªéžXOtL™Þ}}y}=AY(åb=2½ûoq€cXެ×úÕìü†@ÓÐêZÔz¢#ËÜîëkë›ëËk~¥ ,¼ú—ÿ 0Bí>stream H‰ì×ÏKUQÅñ¿!B„ ‚bT 'oTBÁAˆ41"„4IA4 ±–D R<„ŠtB„á#IPÂÄD1Ì|æ¯Vò+MïÙç^¿Ÿàij÷‚åænnÑ÷ì娡ã7ôÓz€¸ ÀŽ•´«A™ ]= ëqv'¤ÝWÎJ[“+yåo=>!í> Ü`â½#YEêQaqÛPbÊzœ ]÷•­ÖÌJ[™[„UèºwØ»åäj}kÿ‘¼[jSÙõ'3³‹Öý[ˆº¯<•ª¦UÂÊYi[O„Xˆºp€»ì}¶”Vt‡å³%ÝW†JRyjTe«„­'B/Ý8Ã]ö×Pbª°¸MµÊ‰5Ç{G¬Çù#ÿ»¯ô”¡†TžJÕz "üï>À%î„ÎÇï2 T®XIûû±ëq¶ás÷•˜rÓxÊPIZDŠÏݸÇ]òui¥º©/=·&-»êJuÏüÂ7ë‰~ãg÷•’²RbÊMé)C뉀¨ñ³û+Ü Pã“s/?RË2òk[î¿^[ß°žèߺ¯d”RÒTJL¹YOD“oÝØâ. Nœ8{G]Ë;Óòbàƒõ8?yÕ}e¢d4RRVÖãQæU÷æ¸ €këw¾9z²N»Pö`|rÎvOº¯”†&Q2ÊG)ÙÎDž'Ýx‚»¸ôe1yµöiZvÕ᜛×êžëW«IÌ»¯Ý•€rPÊÄ0 à@1ï>À+ÜÀ½ÑñÏç.uªzÇN×ßë~k2ƒm÷µµv×ÊAi˜ÌLÜ}@*î`E½Ë‰5«€§Î· N¸ݤûÚTûêiíÎÀ=î> w0´ò}ívÇ«ŒüZÕ°´¢ûã§gO»ï¾¶ÓŽzTûjkíîìi[¸û€TÜÀÜìüRye\MLÏ­©nê[N®:xÔe÷µ‘öÒvzQ›j_ØwŠ»xbxt:VÒ®>f5võ$‚~ÎY÷µ‹6Ò[ÚN;ý€¿ãîRq¯l}=·úõä ûš_[8û°Ü}@*îà›åäj}kznºY^Ÿ™] â•@»¯™5¹þ¾¶Ð.Ú(ˆWìÂ77N8 endstream endobj 42 0 obj <>stream H‰ì×ÏKÓqÇñ¿!D!<Â$pºì/—@< ‚—ò†2Ȭ`$Ró¢Â.c‡+*ìzȃ q‘âä¯éÔ^ È“µßï¾û~}>ˆñõ»Ï÷ý}uxóbggçÞ}úqãÎ}ž@/•j#™îFµžµMÃc“ ™£¬µómÚ}åTZeÖpå×ÿÂÚùJDïLôPÉ–V6ýma-©/0›_µp²»¯„Ê©±Ê¬äN`z`¢€Ê‰.×·„´ª­Sk‰-KfZ»ûJ¥l¨œJkÉLv ÷&zp…ݽLoh®Ú7XÕÐß3O¥÷KhÕî+‰ò(•²)¡r–8€­è}€‰^\$±¾ÓÞ=£­k™˜^Ìžœ=ªôÝ×Û•AI4G©”­èQʆÞ˜èÀu>,$š¾ÒæêS×Å )q÷-É üè}€‰^Ü({r:1½X×<¢ýmïžI¬ï:¡èÝ×»ôF=«·+ƒ’:€ƒè}€‰^Ü+•ÞïˆW5ôWû{Cs»{™üŸ-b÷5_oÑ»ôF½Wo/<2‡Ñû½¸ÝZb«µsJ‹\ߊD—ó|ªÐÝ×dÍ×#z—ÞXlX£÷&zð†Øüª/0®uö·…—V6ÿ{>ÿÝ×4ÍÔaÍ×[¬ À1ô>ÀD/ž‘9ÊŽM.Ô6 k©;‚Ñd:Çá|v_4GÇ4S“5ßêÈÊÞ˜èÀc~oÿéê‹i¯k‡F߯<–{÷õ”žÕÑ4Í´32€ò¡÷&zð¤ïk¿î?z­í¾ýàÙl|åß9v_çõ”¾Õͱ?,€ò¡÷&zð°‹_vÇo.ý²»r÷uF'süŠàvô>ÀD/Þvpx<ðü}Mã6½«/¶Ú;¿i÷u_ßêŽN꼞r.2Ñû½\ÉtG0ªe¿y÷é‹·_3GÙ‹Ý×µîè¾þÔt:,Ñû½\_¾ýô·…µò¾Àøð˺Ч®u¡ûúÖé€lGïLôpÝD¢Ë·îjñÏÿéZwœ Lè}xÑ_YÏPR endstream endobj 43 0 obj <>stream H‰ì×ËKTaÇñ¿¡B7®º€bŒ ]´‘ÒE‚¡…´‘ÜÑF'I&„01D!#*D!³(F5¡B$¡˜ÒDXØEFFMËK¿•¼]Ì™ssü~áxÞ÷}Þgóðãìî°êɳ¹#§Zõëw#<²’Ù¸Ò?zºU³¯_=ëßMð¹0‘ Àá±µ½Ó?4Y‰iê+/öíýêÞkÕ︎ܘÈàHN¤Î^¸«y/«éI$ç÷f_Ïz£g­jßmp¹0‘ @è-¼ÿÖÐ<¬I/,ïèyðrk{g÷÷Ù׽תÞh§öûÝ2·û¹„ØêÚf´k¼ ´ýØ™¶–h|9½¾·ô÷ìkU{´SûuJgýh€»È}€‰\ÂjðÑ«âÊN xuãÀ›¹¥?V÷›}íÔ~-é¬*xÕ,û¹„ÏÔôbU}ŸF»¤úÎèØÌ?÷üöuJgµAuTÍÍfxŠÜ˜È L–¾d.]}¨¡>QvóVïóï?÷Ûyàìë¬*¨Ž¶©¦*»Ó2O‘û¹„ƒùùvùúã?ß²œ}ÕQµl>0¹0‘ @ŒŽÍœÀD.³ùc«ûþ‹Âò oCóð‡i Eì̾nÔ½:®Ô‰ú±P€/È}€‰\‚%‘œ/«éÑØVÔõ&'R–ëØŸ}Ý®TDý¨+Ëux‰Ü˜È (Þ¾ûZÛ4¨-ŠÄú‡&mVsjöÕ‰úQ)õ¦mVà6r`"€ü·’Ù¸{z¼ä†þô í×tpöÝh€KÈ}€‰\òܽ‘©¢HLsZÛ48»ðÙ©²ŽÏ¾zS‡ª©nÕ³Se8‹Ü˜È o%'Ru½šÐÒó݉伳Å]š}õ©nUY«g‹°Ü€`ù%ÀâçX endstream endobj 9 0 obj <>stream %%BoundingBox: -306 -534 894 1386 %%HiResBoundingBox: -306 -533.8701 893.8496 1385.8896 %AI7_Thumbnail: 80 128 8 %%BeginData: 5734 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFD0EFF %AFAFA8AFA9FD4AFFA9AF847E5A8585AFA9FD44FF84A9847E535A5A855A5A %5A8584A9FFFFA87D52527DA87D7D527D7D7D527DFD32FFAF85542F5B365B %365B36362FA9A9FFFFA852527DFF7D7D5252A87D527DA8FD32FFA8852F30 %0730070E0730072F7EAFFFFF7D7DA8FFA87D52A8A8FF5252277DFD33FF84 %5A36300729072907303085A9FFFFFFA8FFFFFFA8A8FFFFFFA87DA87DFD32 %FFA9A95A610E0706290107305A7EAFFD43FFA985855B0D2929070E615AA9 %FFFFFFA87DFF7DFFA8A8FFA8FFA8A8FF7DFD33FFAF5A856030072907365A %7E84FFFFFF7D52FF52A87D52FF7DFF52A8A852FD33FFAF855A855A300736 %5A5A7EFD04FFA87DFF52FFA852FFA8FF7DA8FF7DFD34FFA8855A5A300E0D %5A7EA9A9FFFFFFA8FD05FF7DFD3CFFA9AF7E5A078585AFFD49FFA8A97E84 %84AFFD4BFFA9AF85FD4EFFA8FDFCFFFD86FFA8FD4DFF7D277D5252A8FD0F %FFCAC99FC9CAFD0FFFA8A984AFA9FD22FF527DFF7DF8A8FD0FFF9F749F74 %A0FD0FFF5A305A2FAFFD22FF7D7DA8F827A8FD0FFFA099446EA0FD0FFF5A %300130A9FD22FFA85252F87DFD10FFCF9E7598CFFD0FFFAF36307EFD24FF %A8277DFD12FFC998C9FD11FF855AFD75FF7DA87DA8FD10FFA8A87E7DA8FD %0FFF7DA87D7DA8FD22FFA8A87D7D7DFD10FFA87DA87DA8FD0FFFA87DA852 %FD24FF7DA87DA8A8FD0FFF7D7D7DA87DFD0FFFFD047DA8FD24FFA8FD13FF %A8FD13FFA8FD6DFFFD07A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8 %A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FF %A8A8A8FFA8A8A8FD10FFA8FD3EF8A8FD10FFA8FD3EF8A8FD10FFA8FD08F8 %27FD0452FD11F8264A26FD11F8280600FD09F8A8FD11FFFD08F87D52F852 %A827FD0FF84B99C1744BFD0FF829365B0728FD08F8A8FD10FFA8FD08F852 %F827FFA8FD10F84A9F4A754AFD0FF82F36013000FD08F8A8FD11FFFD08F8 %275227FF52FD10F82699997526FD0FF82836300D00FD08F87DFD10FFA8FD %09F827A852FD12F8204A26FD11F8060100FD09F8A8FD11FFFD3EF87DFD10 %FFA8FD08F8FD0527FD10F82752275227FD0FF827272752FD09F8A8FD10FF %A8FD08F82752527D52FD10F827FD0452FD0FF85252527D27FD08F8A8FD10 %FFA8FD08F82727522727FD10F82752272727FD0FF827522752FD09F8A8FD %11FFFD09F8272727FD11F827F827F827FD0FF827F827FD0AF8A8FD10FFA8 %FD3EF8A8FD11FF2752275227522752275227522752275227522752275227 %522752275227522752275227522752275227522752275227522752275227 %522752275227522752A8FD50FFA8FDFCFFFD0BFF5252527DA8FFFD04A8FD %0AFFA8A97EAFAFFFFD05A8FD07FFCFCFA0A0A0CFFD05A8FD1EFF7D52FFFF %F87DA8A87DA87DFD0AFF7F30362FFFA7A87D7D52FD09FF9F997499C8A87D %7D7D52A8FD1DFFA852FF27F87DFFFD05A8FD09FF84300130AFCA7DFD04A8 %FD08FFA0746F6EC9A8A87DA87DA8FD1EFF527D2727FFA8A87DA8A8FD0AFF %AF5A305AFFA8A87DA8A8FD09FFA79F6E9FCFFFFD05A8FD1EFFA82727A8FD %11FFA97EFD11FFA69FCAFDFCFFFD0FFFA8FFFFA87DA87DA87DA87DA87DA8 %7DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DFD12FF27FD3CF827FD %12FF27FD3DF8FD12FF27FD3CF827FD12FF52FD3DF8FD12FF27FD07F82727 %FD15F820FD1DF827FD12FF52FD05F8275252527D272EFD0452FD0AF80029 %2906F8FD042752FD09F8204A7520F8F85227522727FD04F827FD12FF27FD %05F8527DF827A87D52847D7DA827FD09F829305A30004BFD047D27FD08F8 %4A9F99992052527D52A827FD04F827FD12FF27FD05F82752F8A8FF27272E %282752FD0AF82936013000FD042752FD09F84B996E6E4AF8FD0527FD05F8 %FD12FF27FD06F87D27A8A827275927522E27FD09F828303007F82752FD04 %27FD08F8209F9975F82727522752FD05F827FD12FF27FD07F87D7D27FD11 %F80001FD11F8204AFD0DF8FD12FF27FD3CF827FD12FF52FD3DF8FD12FF27 %FD3CF827FD12FF52FD3CF827FD12FF27FD3CF827FD12FF27FD3DF852FD11 %FF27FD3DF827FD11FF52FD3DF852FD11FF52F8F827F827F827F827F827F8 %27F827F827F827F827F827F827F827F827F82727F8F827F827F827F827F8 %27F827F827F827F827F827F827F827F827F8F827FD11FF52F8F8F827F8F8 %F827F8F8F827F8F8F827F8F8F827F8F8F827F8F8F827F8272727F8F8F827 %F8F8F827F8F8F827F8F8F827F8F8F827F8F8F827F8F8F827F852FD11FF52 %27F8272727F8272727F8272727F8272727F8272727F8272727F8FD042752 %2727F8272727F8272727F8272727F8272727F8272727F8272727F8272727 %52FD11FF7DF827F8272627F8272627F8272627F8272627F8272627F82726 %27F827F827F8272627F8272627F8272627F8272627F8272627F8272627F8 %272627F827F852FD11FF52272727F8272727F8272727F8272727F8272727 %F8272727F8272727F8272727F8272727F8272727F8272727F8272727F827 %2727F8272727F8272727F82752FD11FFA87DA87D7D7DA87D7D7DA87D7D7D %A87D7D7DA87D7D7DA87D7D7DA87D7D7DA87D7D7DA87D7D7DA87D7D7DA87D %7D7DA87D7D7DA87D7D7DA87D7D7DA87D7D7DA8FDFCFFFDFCFFFDFCFFFDFC %FFFDFCFFFDFCFFFD5FFFFF %%EndData endstream endobj 44 0 obj <>stream H‰ì×ÍK”QÆá¿!D„6B`"ˆP $pÑ¢6B‚‹† „ÐBð31 Q Ä•¢Â,’²(A¨tá@MÑ@&**Šåçè¨Ý‹°IúМ÷œóŽ¿k10›9ÏsÃÍÃlo{ëÉËGNTéÓãwìÃøäBQyº™šÓÐÖ5YÆý ﺯi5³&×ïk í÷'ü7î> wpÊÒr¤¦e %«NÅ,«z8¿°âÑC^w_“k~=¡]´‘öòè!ûÂÝÄâ.îèé ?}]•,(î Myú–™îk í¢‡´—¶óô-{ÁÝÄâ..Näv¨ŒéùÍúßxÑd÷µ‘öÒsÚQ›xÀŸp÷±¸ €]Ó³‹¥•½ªáÑì«×Ú_­®m˜y×p÷µ—¶ÓŽzTûjk3ïØ…»ˆÅ]l‰¬Gwþ"•T&§¿™|ÝJ÷µ£6Õ»ÚZ»+“¯Øæî~Å]¬è}ö>³ UíË+ìN˜Àb÷µ¯¶ÖëJ@9˜8̸û€XÜÀ°Px¦ ¸S½KËmêŒØÃz÷µ»Ð JC™Ø8l¬wàî`ÌüÂJyM_RFurfmMËÀÒrÄâ0.t_ (¥¡L”Œò±8 pH¸Ð}€;¸ €ÑÍ­ö;¯SsT· e÷Ãcs¶'r¨ûJC™h壔”•퉀DæN÷.à.^{:ø)ûì MŸƒo>Ûç׺¯dvRRb¶Ç–kÝØÅ]¼›+¼tW;v²ñæ½·ÑÍ-Ûýä`÷•RRVL¹)=Û ÈÁî,â.^øº¸v¥±?9³6)£úrýc}µ=ÑnÎv_Y)1å¦ô”¡ƒÑ¾æl÷Vp€¸ëŒ¤å6©Yç.Þ…gló{Žw_¹)=M¨$•§íq€Äáx÷†q€8ùrê|»:•YÐúèùÛãü/º¯ •¤æTªÊÖö8@"ðE÷Æp€¸Ÿ\(©¨M©9 m]C‘õ¨í‰þÁ/ÝW’ÊS©jZ%¬œmOø›_º0ƒ»ÐêÚF}Û‹”¬:U©´²wzvÑöD{â¯î+Ue«•³ÒVæ¶'üÊ_Ýx»DO_0=¿Y%:Stk44e{œ}ðc÷•°rÖØÊ\ÉÛð%?vàîlú.À3Jª endstream endobj 10 0 obj <>stream H‰ÌWioãÈý.@ÿù0€Àj^MvA€æ5Q0>0¶7˜ ƒÛ³©å1³Î¯ÏënŠâx¼‰l‚eY]WWÕ+’ï~w}s&ŠæAžy+ÛZ.Þ½‹[™÷M{ni¶µ®ª¡ë[Å:ùxj9SRbÍîGÉdÛ•M}®×Ìj¦ôOÄþ±²núv(ªSëäT-Ü–}%±”­³Ôr «ìšìÛrcÉú©¬å*/O§ `4É{ˆ‡ÄaĵmfùçÔµ®/”HÔ uQÖOQóó¹uæÙuF=ßbÜG ,P"*?ÊîU9oÅBÛ0.|( ºbŒkµ¤Ù ;Y÷×m³‘]7UÓvçVüœ×ÖEþ„•Üú$«ªùjEU¾ùq®“5uÙ‹ç¶Ì 8ûP>m{%ñûó£|ª¼}ÉŽšª˜»”²Å¯aR¬é}VV…Ùå½Åu™ÄÚq¬ŠËa÷ Q2ß4ß»×›¾ë°[l\]k~x¿Þu#ûEPºÚßGóT«éä3b*uï ’;-ßÊݾBYu=\ÎVÔò]{å!ù/n ˆ[ ;öÊá³å‡~`Q€zC=)÷ÝQáX?ù¥”_ϭ˦–cDÛß”ÿÀ¦…î…–ã†ÚãÎéýÇ¡’í]]ªœûšÇM6.šBVˆâh)«rMÎñw”¸ÍÛ'Ù£›jè5B˜}XCÆ?äÏRõ•c^®ö²¾m~Ð!Ÿ±¯<Ýšâs)c–½ ‚ü8¶g9LûCx8y×çèEYTö®ÂPYP‡ªÛ5JyÕ–ÀÝù™ЕoÛÀåÀãc½ß·eq,wèZÌüè}®Øìä‡sÜ ’Ó÷²>$ ­_ÌÇ^]ܨ Òºˆ›*W§Q–©ÑMUó4®oôL ûåâóráqòÓÐô²ƒÅJZ< OmþE¢ Œ¤CÛÔöLâ!ï$yDËÚp‹Ã’Ë}WÂ=)ò§'ÙŽX'›²E/=Vòg²—m¿m†.¯ r³ÉÛ¦&OÀ޶]ÉÇž\¥èLjl+ìéëVÁur©E7féa·'².ònKäNÿõ€¥$O!wy‹CºNr#IÑ`¨v]©jG>¥l±ãÎ"Ý>ß O6CÛÊz󌛀<´Í²~P³Â 9È“M³m¶Å£Ü•5²å„.AþËM^ÕMO¶Ïû­¬I«‘ Å‚ìò iE‘ÈO hé¿6Ý€¤•MKúm+åt—o†^’Ý€þõˆæÔ_[ÛÈ¢¬ª–€ÙIíòn3T:"ÆÔâOCÞBG]nóêÑø™åp—Ý0%ŒG1«¦0ùÓî…Ú)‰ÇHªÕIª•a%©§“ÞÚH­‹õLf=ɤý–\j‡0se®ŒÂÕLáÊÄt5é톪/÷Õ3¹ê*Õw‡ Ýå»™òݤõÉ,Þn›Ý"1ðk´ZGrã8?ì'ŸiçÆu>Éu:rI6‡tH£.uyT†)9é•Fª4RåÌE9ÉH¤£6#Þbjf Í(2éå—R1L2£:OÃ7ñ “γYîu2žìåâ65#’þùþ¶ÃÓböðîõ IëM£ÞέûÞïÅŸÉKòRÇŒçÛ¿.µ̵ƒ}óžuû¼—ÿUDãsÿµ7o¢¹ä{ÍÿUdêÕã»7‘obR,òBáÍÑÏ÷å½Úëñs¹×kìþº°ø¾m†ýº~l–‹ó6{÷[¼´aÔvx%5 ­›m¾Wl%™Í$ß"ñ55ë ÍMë/²jö³L<‡­¿äíþMЪò³Y/L¶õdºÎ1í^L+Í;š¥jnÎ'ãÙÙrZQ=Ÿœï[õ´¯ûsëäR~µ·ÖÍ×¼ßlñU[¿´‚íZQ¡_Ãÿ°\ø©¦dFñŒ¢‘Ä«ÄGb#…>>NÔ¯LDõy ÃáéÓó]}*r@¶>m/Ó”Â×B‚ÿkŠ<¡O®‰j @¤Œ›ÃÕ„ï Ïv37uñ»‘>…ËõÉ@¡K Õ*êp\ÛÉ@©“€b'rNî0'UA;ÞrñGËŒ‚|¼ 5;Í@ (N£T¤šÓ ]¤Ã² ’ DÀ†UŠò» '°iJ±1SA9e4 ÍàQ—ÚÔö³±ç"ÕIS.åãÿj1ýj‰¦8‹4‰ ÅÈX(‚ÅýcºÈ×WÞØM¶¢ôp$cW2½ÅÑ[áØ_ªÃ¼Ô?äõ@©Žõ€%ÓÕPõgqP3 êÙˆgƒWG¡ˆÌ4Ñl y̹3¤%#¾¸ÆV Ñe°e•jTWøœ #²¶º<¢ŽãØŽ­`' ÐÈ  AˆŽ„!²\¨A2’;#gFÿÁqÈ%ú€" !R "CŽ À‰„”@NüpàH°x¼Y teÚQ)Áðò9].P‚&! 4 `221PÒL`“HŒ+0îP @³2Êl…ïX$Àz*2¤Ã)r— ULŒ˜ L™„h„Ycb a¢ IT©w1Pø(&‹ÚÜá˜6Q¬Ží…V].vG•“ÉW@ÆœÂÖ±%ŽÉ%0¿âDi’¥(fʯ:P÷b€®ÄÖÑ¡B¹þ'óÕ²#·‘ïô}`],>Ф±>¾ìÅØ“‚°#huØ9x ø÷7"2«XÝÍFaa&FC·§‹Q¬ÌxlKz—8oòé‚.ØÂŽÃ èŒF Ñ/ƒ˜™, ήwd@ó4è²,ߣïF)Á"}Ø[œú³–¶Puzňž±Á½£5:¼A§wèø?‚‘fL  ;Z(`>ÌIþêã Ù™ð0Ûw4ZÛ5‰#Õ«¬Ô ÞMîë;ÿgóéìýÜíÔ—|âvÞvÚ}>i;g;å:ŸoŸÞ% "7¶]µWã%‰Õ\±¢ª÷¼F øDª¥4£‹ÎÉjSíV>Xéqé2áuqlj¢Óu®V½jð½&Õ쵨V¯ÍkgÙXƒ‡*ßœ?®I—ÈJN S·DuŒUr æ&/¼R½ËöòîÃü»ìQõPõm.Õ0bÜ cÂÀ¤û0Ö];â7^z}wÕU0Z×ù®íÃ+—™ÿK$MÕ CÍ¿U?´.‡5Àê¼éùqSCÕp5ýuk‹”H^µ ‘ÌëaS“»ükZ?kMë÷@ÓÖ´û‰è¯ký[%1°»¥¸[Š»…ÂWÕæB’î¶jOåºPS§4RÅpaHÊA«]®ÒÐã—Çô¹+`†HVë!i“Я´F§qM”i„ èz£KŽO¢ÊZÍÏVO zÔ$5&bL´˜H”øöM¦D¢Ña„¡3" Rm1½Ù^8é‘ò(z$¼l_a¢äâщê2Ù]Ó€òîIïŠö²¤Í.i&h&gËÙ¤ FRç°KÈLÄ¢Œâ5g骵§Êhrh©Æ\C®>WÌÕåjsÁ0aÅäæR% Íý§Ä`µÝ¸½Òñ-ÒQð•~O¹Æ\C.¹Âìª÷œƒ[ZIYe;M*Íײ œAN+p ›§•2«4J+^åmZ‰žWêœXÖ G¥Ì2–© ®RËÄÜ’ö„æb~i”_,ÁlÊ0sÎ0=´ØrLí9f£}¹É2T3Wæ™Å 3M辶ñT³ËI¯rÒSá¤K/½·È›J8³õ(G1†tÔž{•vᨯˆ©‘bG)ó­W:wK³kææ:\¥‡P̘5ptÝ[ÜAmlΖæ9ÈGÕÑV”AÒˆJƒÈc€BwVz[䲬˜rë»)ò^©L˜[¯ãÂëE¹3ú³A e*ʨiU‚ɃvåÜr·g—6ºO»viæÔJŸvãÕäÔ‚¼‰ ë:‰Ý;¶3×vïÜ’w+Ü›&aÈþ\TVÐY"´xåÐÍŸó‡d°gwŽ1‘×.}pŸNžÊîé™[O3¾¥·§ÏØ»øè “¬2ÉËóÏv+±™%V2 ñ"ÿ5¶c‚}øÛ¸ ÷W_Xñ_7+&2NׂDqfH\í¬½â}D´}u*ô‡—8r¨YØÖ«“ð›ôʵ“[3)@&#`†¢uÿÞŸòÂÁ ÷ *å'0¸€  Ù×Ì×97es ¹ÍÖ@Ó‡ÉóiÓ¬É,ÊFAÌÙúÄ1qÖk0j¶8YÁ­MÁ¤9Ú5?ÙR¼L}Nµg:SÌÙ õçåêô¥òœéΙêœiŽôYóZqÎôæLm²ÖdE2¶3t÷øÎŤ"Û­.žá¼Gz‡_™6º2š.Þ*c%Ã$eiNè×AêÑÁ-:™Q©’•k¡Çôú„ž•)³Ã4˜‡PW°Y̬+&eÆÄŒ˜œP)K­¬zHoOz8ëy“ž9z^´'G=½ó„ÙE-$ÁFÚð¨DÊ@¶Ù,t“gÝA(ûŒ´ÚÖƒl-Ô¬JØ÷Œ.X´Y{ánFíˆ{êµ/Û÷ÖZ)¢‹WŠBà«#>¥5Š‹º}qSK_i£*-WUWÎå7&V$È:DeÜ® c w‡ü¥›¡n˜:;»¹‹ªß÷}fT|·o;EÛ®+ÆÝa€Gjm…Z~qß2îâëà#[¡nЫc‰ãÕk¦–Ò÷{~K7Ü n"~5=nø«Æž*LTÄ'¶Þpè• ÍŒ7ýÒ}ØžÿþûÇÇ/ŸžþðOæOŸ¿<¥Ï~¾üôO^Ò^~ýóãÿú÷¥}ÿöÍ3ÿOj.ó£zÃä„m”}¶Óö qŸR7‰{rÃEÞÏQ÷sÄ=Ęiù•ÄøuÒN”=\S6悾h¹¦lùó¤hЈ0‘àRDÐ_&òbCÌäP"&+‘âaÂI”H{’Éí…¯Måyž:bH†XˆÆ°Gp¤bCAnDÃ)œ,Nˆ$C È·ÆÛs¢3âíEeh,‘n¢Ü’tE¸ü ­"§ŒÊ©¦ÁÔF1/½N-ظþ²+&k‰±bº¯Ýn–ƳqãyØÏÂúéíU–>¿î.û²ÃŒJ™£'LæK4‹ûÌ&;ÍÁ½æ¢Ô¸ËoÖî8£<ç˜3ßv“ó"“š›->£ÙW¹Ð ƒYc@Sö³ä7ßd¿FžôH~9õaè,÷5r¨Qõ>ïÝf½"ç¥ö$lgèîñ!,0‚¨ e™N åÎ{¤wXß¾aË©Ô3é}•5EíEÔ)‡®žA‘B‹ô=wŽ€ù*m2o"r(S2MŽž&¤¨œ>iÂð4>¯Ó3ùÔ>?yÔÓùüY¶±° J6 È!k…Žø¢0å‘NB;Ûbë*Ô¬]Ø«Œ…”Òh­öÂÝDíˆ{´/Û÷ÆÝ-Ú!ö¨Ë³#ÊìL#Ò§ /&FAß{˜é“¥CSi£*O©W.ìo7iö\ß¼âl Ž@ßc/ÜSƒ½ðþÆ··¸àíð] '©/å>$¿Ô¾wÖTÔè5xõz^ôgvz§­¿_Ytï :`ÙýTV¡™€¦ÏhZ !–”?Súl”<7ôÞ$ÛÒ¡cí LÊ‚ù¡Q¡I¡EÙdOF¥Ê–ÆD¶dÉ™£ójÅG¶8ÒE‘uÔÐ׉‚Y‚ù©›wSx-éPr[ˆm%¹]%µƒ<}ç´ÿ}¹T¥=Ù™æ`!ôÒWèÀMàM;0Ë@Ü4 Dl&!(§${€ó—EH¸¯sHø6‹ð½{ò§v¹b®>×kÌ5åšsTsîZs9ÍxB#=T¹Ž«ÎÕäbÖƒ|ëw—+æês1)yOv…|ÂE8v=±Öʾÿ"?KxæNüÀKÝlë‹ý€koé Î]Á¹/8w8§ÕϸƒsP8*.8Â47©îµæšêJs¯8ý7&É:e:Ä»ÐÁeè62–v ¥âK8ËŽßüUË®cnÿ ¡¿ÄÆ6æÏœH{œbíÛ]ùÜï\€OÄÅ|Û⦮uyCÈm± ÜØÊ­ÝhÃ+—!’jõnú¥û°==¦äëŸÌŸ>yJŸý|ùéŸOOÿóéñòÙ?ºÔõû·oN?ÆÛn.ó£Î–¦ûúª¿RMYYJèJÌE[/Ô*»?1pQC×kð2¸½+ÌŒ”Ùºdên-]½•¹a»¾Ö¯ÔRV†@Â7‰—ušeÉÌêÍvMªQ5¨0Êéû ¶¢mÍp áßng°Ë UênëoWÜ[÷äÌ—¸orî[d+ÿ xp`™ŠÄƒbB¼±a­!³ŒdEfÄŽÆÆ‘‹P­~ ›ið#%oÂ1Ê*´ÅÁF?Z;V­x•?£ø•?GÍEÁncEÙîv=­M?[»Å÷ërh’£W¡w/Kƒó0sÓŠÅÉãÆäƒØÜ*qúJNÏÂô`)ô öu’œ+A_¤Bcò?œ¤®³Lx•ó4X°=Ô=Û—L¬nsÕm¦ÂСûËLnòÔýàIª÷Ì1iŠþ6ŽWÍè)Æ¥‹Ã‡ôþåÄ;Ï6}Îj³'™œcr’±§Xz‰9»Dw䨛œº4O,ÿç<òWXqAJ±\’I S¿ã2wD&Kwf/¿ “(?Ìjr¹gÅŠ‡gíÝïîIw}›;Îà“¼ßáþ²ÿcÎ6R—ÂföÛ ؉éŒãœ×ÜwÉÿaêÉI‡ÿk4íœwc‰Ùç=hÞmÚ{Mûâ^/ÈçEŸst]OqX5çtxœrÎ8§ü˜qº:RQ?޹ÿ- N9›é4åÓÍó)sáa´lÈtØbnk âËŽÁa¶L÷„9•#&¿Ãü7à K%Å3­›ÿÇ|µìXnÑ}ýwio¢HŠ’wzÞ Ye10<ƒÉ,Ò þýœsФîC™LßÛ «ÐÝêû XU¬óÈüFfë˜6PÄMœüä†máÀúÊ sòÐ]¢HÀ"OI-*Ÿ¹ðXl„Veâ HE]@7 èŠZPéÎÀ¾ã•€‡QâQ9GSƒ‘^QMlU£ÔÒ ÕŽÒ:ÛAÃñˆ¯(VOèÏTf[:ô,ˆøZô°!è £ JÁ4ÇXëŸ3/y—¬KÆ%ßšm͵dZòÌY"·œeͰ䗳«¹•ÌJ^{VÊ©äƒÜö|J6%dŽú–nÕ4BÕ#˜“ª ¡Tóã1Gvw“ª˜1c#f­ÇÌu˜½€)l1‹ ærű›qPFL,öˆÙí0ÅÓÜb®@5/E[ <ÀÖ€øúîv±îaÔ>í¥×~’ödaä.âíj¦J?F í ´Xµ÷Eû·˜£bPhH‘URf²‹Ê0(K¯LuaEÓÂ<'‚Cö«*°¨ ³*1©£*bÑ+’B`bâÕ2Ål Øòv \›LuBJVqQ%%Y2€ÂUVԕɸ›¥’ióŒÏyûö€\ÿ Ç×dÛöÕç{8®ÐÆ0pÇUù!>ÅÛm÷24¾;ßÍ£KÙŽ|Náe±è&ûbê:%14­üfõ´ûÞþÝG} ÷‡>/ë)»´Ód'×fdÒË\–×Cm® «¯¸K­ô¦~|Çõg\QÕkŒC4AצèAtmžŸ5A×úadÇo]×e (â:¬ýš€\Œî1Gô Ͳépþ„¡çè÷p -‚Ķ02L`%^<`ÆÉl€ž l €¤t`hoº‰w=êémWo­-úŠ_wö¶·GÝ­ý-ÕÛx­ˆE2d)ÉD6²%Ú¢íÞ¼‚>Ð\š<úÁåìZÔ™Yݱþ°CìQ¯>±SºÅ~õŒ]kKçÐi›:¸ª‹ìã¬^NYŠZG{u•}íÔ[v7¨ÃÞÜ©¹GöV¢Úš-ÇËÄõ¨îõ$žƒ¨³ÀÓà/´ª(E MIE)MévU‰,{e=áqLbE€þ¨+ F}T|æWÕ-÷å¯ï_±êíY$MŠRôƒÈy1{énRò,2¦òŽ¢à•,šÛ·7Å*-Yo‡Z™„ºŒ¹2vm:Gv¢Z…³ ˆ¹f œaÕÎbÈ1žE±E÷ý·.@MäG Hÿ‹ˆ¿í‘þ ÂÝ#$ À´t#Ùfy‹hÉÒ}ˆúùÓJ𠊘+Þ=§|]¬XèÚŸÑ»åkr' dÝ oJ:Ì™‡ùBúIÜ0ÏUÙ1‡˜0œl-ÅLÀJNX£Ï.$e/R"Ö5|¶Æ~!¬hêb«±æXjÌ5¦c¡åýÿ¦]XCõ*9]sê£ŒŠ“rÅ©bÔ»ùÔaž¾íùvÇWr*Ì(^¼fFãÅsfÜyñPçŒÈéPë«k^4µs¥wžŸ2+kž3Õsë_ÛŽ¶ˆNó¥qκÅß6Ñó šÌ“»µŽoü¢¹Wd3)wéRÍâ¾4CpŽV3ÐW¶¸I˜”¦³ïÆó§Þ¹Ÿî¸«baÛ&á–7Üp8K7¶òK°­ƒRwñðBÜÍ´`©ñ—øq}ýôsö¼ù•é󗯯嵟N?üíõõ×~þtú’_:¥ôãóÓá˨·?MŸÔ[] RÄH™wš0fkvO­ÜSÀ(šƒå¡ +=”Ãðzù(t¹ 8:õœŒF,p8`^®ªÓÁp'ÇlEoÕÊ]EÚ$5Êa­òXN.+àÀ6崌Œ‘ 7¢c‘‰C4Š”ŒÖ&bnEÍTzFÏ#rÑpn3…ÃÀzˆ˜ˆ-'Iœ”=´ˆ¡MHèÀF”M!8)œ" 4~é¯çE¤Bç)D‚Iœ­~H#]&’Q:…‚Pà‹fI$:‰:Až¢Ljé…g€âhœ’p˜$CðŒ€Qëú xµž;õÜú=Ié-êv«N÷ÍÈ}ÞÐßV½M‚• ³ª«ì)>ªŽ²Ÿì&{IQÏ>ŽÃ\«T‹Rí?F[· W)ØÕŸòZæ´?§¿}ÿU½F¼õXþêÖ]ÝrHfø©s¹`+Wu멲£ºd÷ç§GùýšÝq Éïñ~†/ÇOÎlÎŽlëäÀ|ñ]ò[‹\VñWI®*ÈMÉEÉ?Ñ9a0ä™Ì/urIYdep© Š2ØuÁM7Ñáî £G=½íêr£ ÐWtøº³·½=ênío©žLM®l©Œ¤¹ &b„~$)èS̳н˜“¡Ì7#!Š~p9»ufVw¬?£¼c¯HêT§nE¹(öŒ]kKçpZ›:¸ª‹‹Y\ô’ÝkG{u•}íÔ[v7¨Ãìq«>;ë5:¬Dµ5[Ž×¤Õý¡ž€¤SÀsuxü…ºBé v¸É:dà«/앵ùB8C9B:AsI~ŒÆ¯¾Õß~ïõý+–“¤Iѧ7á,“œW3iÙ(y;T%Š‚GTríúL¸=©v] >¬M«N[eê2æÊصéÙ‰jv΂"æš1p†U;‹!ÇxS‰ww—$,9‡ê {Ñÿ"âo@ûA¤?ˆðE÷HÇÉAF [/²'ÝOr’‹hÉQ?ZI^AóoŻ甯‹ ]û3z·|MîdÁƒ¬¡%uLè0g æ é'qÃB˜Íá$?˜Ø²yvž9œÄØ<;CRÏs­6;k³³ö7±æ´‚f%æ‹ä=Ì8DÃ`ÖÏŒŸZ„hùÚ‚hÌ 4n¦ÌÐd&Ã'·xÿ¼…lKð1k ü$ʈ˜‰û0tìÜ ES’­ÛˆýnîØZfðY<ì@­8»ÕÛÍìa5ÉîjõYOc°ËöÕnü(fþ‚Ù?ÈÆOWÑ,¸ ì3(#¸(kÓÊôuIš:'e I_§¤²cÒÚ!)nŸt·sõE ð_×á&©±+²-éò‘ÔyO½%¥^£^K±Íã¸BZSZœÓcšFf6Ù¡ð¥Éþ;¸,Ns$ÿI.‹1]è¬Àg*ÊŸ• y*RZÓ”ä§=„ßX­Lk¯]¦bCÛwjü)5þæ­OmiÐü·ÿ$à £H ”£iùê( àÀ¡% ÆÒìò@àˆ?$•öD±àE$ƒ¢1ˆC&‰G€Ìb”¥[}m¾ˆ ©ôÉ4XO$®V«óu¾ðx!@øOb„Å1:gˤi#˜œ¡ª]ªú!U;¶Û#¯£2é9ßÇËG‹ŸP“d‹Ç‚ÊÙPA¬VMµ ·×d7;…lw3!Ëe,踊Xå"–d ó”0¹˜¹”ermpIËDMÅÀDÍè †¿&pQâxôíš–GÑ«ìœàãÓÓg, =jÑ ´DªBµY¤IÐ*(‹MÉ–š.ò_SK)&Ô‡MK±éãÝ/1ð‡¾îÅ8¾VD0H3ë¨Õ®ÚžÇ€²¯Šƒþd‰&­V«óÕkðÛèŸ8A`@HÁΦ Ä’.œª5!bA%-p4€PÔûêùã êÛ„ê>tžw›zMX°¢8ޱ–rvÞq Š•½v¢APo±³jGBÁ¬>:Ô? )ž›>ÅÙs÷”˜>è³'çÏóÓçô’EYr‘w™9HøÇëÄ)͛ҴI³&MÄÓç–vwß_i‡Ù¥¤Üå}.–öyßém¯Ðø‹Óõ¹ø8+“&#DsF½Nš^*¸C%7˜n•P ª…_Që3j~ÂV±ô@‡^hÐ0‹æuC§,蘀αUŽ¥N¨^ǧ§y¸è÷fýfдŒ¿<è×{ÍÓN“µÑ"£«¥m?ZeìlÕÎíŽû Ú#w9¦öÚmg7kíš«ÒÞ´,hÁª8ÅÂh‚"bL£â²È[g$³.np(\Ñ A¯NûMVM¤}iÓ •2½R Zº]UÝý-½f=À6ÂfVuj†©ƒ~édjÚžÿi'ÍÕtþÞëéQqíØõøþ+j)Tt¼ÓFêì¯à…z;á—Cìýe ï¹í¤cºtä:a8ð§qÂ? "}­ÐG>±{à¹f{y縛yþÃü×þû·/ùÏO_~þúíÿdùú¯Ÿ¿ÅÏþüòÇ¿}ýõ%¾}ùû¯?ýòÏ¿4úüéÿÐ/-_”ys„D«.¡•AUD*s…D)‡¨„O„'b“AÓáÀ„± \"&-D$ÁQ#¢òº»!ƒB§ÄÀ˜]0bVž}Epécó;Bž~wñáFÇÛ '§4Ü6¡ä ‘ù€ó85&,Î]CŽˆ8h¼X”;b$öÂÀŠcêðø,ºÅckÈÖ¼Þ«bKÀ±{Co~<¾ÏßþþHßËÞ¡\ÿ½oñjÏwçQC"$>veЍô¯'ïX?¿pLJ÷¶óïÏ wŒÅ84oÃý6,ï£òqP2|ù LpÿœQ}/. SŽí{èò½ø¦É%Ƹs̨C0Ç>!ÐéuÄ:;¢áŽx×Én5yÂ<‚Q°ÜûüIÈgÐǾ$ø òšð( ‚DAÂ á €PÐEì‚%ñ8|A´ï£Q£“„Û€©¢¦WQåñìqÆ©Â1Ãïöcƒ1T r;WqÒ¾¶q¼V>ûxIS÷C8¯­^GN¼ú>»ßu›Uí[£ª}Uo8§±àj´½Ó@÷äÞ)wO-ý2M5!ûrP˜-ôP»¨¥o>j¥“êÌIÅ‘³ùÀ©å¦HßtTSæ©é»E~7/XŒj}Zd˜ŠŠËbƒ3„\ÄøbŒ‹ÅØ”Dêqz”³¼âê‘Æ8[E*ÇI‹±2Ú Ñ¶Iø[§ÉN\iGŸÎ7èà"‰N—e£Ÿ¡W?"ÍÎÙgç±8÷nÙqŽÌMCpÓJãS»¯ÀûLéÝ’¢îOSúÖ´dH1£n–4>~PQµŠ¡E)ŽR$)v­GãñdÑЫÜ#*Å”E%q¥ÈÒî÷[Å­”t 3ønâÀé ¬8P_·£zQéôO•"fÌ1jÆÍÈñ[uÄoO€Ï >…V>ŽÎ«ÒÓàóàá3±ìò©ð¹ðÉðÙðéà9ã ñŧ„çtŸïÊëxçLÿë*LU§âæ°6½nr:þ@KÔòu×ÿwÝæô¿KÿûGý/‚I Kž„.((°ë ]¨žz;ÇÒ…&C›QjbfÔðzÞÖ !YȽJ£¨_AºF4…Ä­±ˆ£ßÞ'!»öã<;?¹+"q££Jg¶ÚL!¡Lîñà~¢ËëäóF9½Ù½ÞžÜ^+¯7ÊíÍP“•ŽŽˆžÝŸ|ßèÎo‘÷Û×ä„ ßHß‘CläûägùÄz@¯XÉ-¶îÇcÅ<£´f“k¬ä1“}g–­þM~ßæ¢-Â5µ®ã•¸V õw Q ’MóÓ×Ѓ-Ú—¢jüð¥¦m”‘š*"Á›!âæèw} 5¿yˆßwý(Ãð–2 T†6'ÃÖéêÆUèß2+-Š1òÕ‘¥ £¸ÊÈÊØÊèjWET"I²$)‹œEÒ"k‘¶È[äÊ æš;X0æêkóʼnwÄe#™ÅÕju¾Î z8ˆÜFq*}Ìœ-#9g¹¸fdØÖ(66ÉUÜD®3æâfì [ÙèhñdšÌ:LÐ ü€ØÕ‚˜Váö÷Σ¤”då.-Q\Z‰¥4Ýe攬($&&¹àðØ3A!@œ’´Dq11yY7¥¦I ¶'9ág, =jĄ́E¼1™á×MXXl&%’É…d”L: aú;kQLÞýÂ?øõpÇÝW|­ˆ`@”-$´:E7<e_žuuZÍ9¡´NïÑ»»0/’3ØÄüØ.¯ÙôI†’ߺ¨ÂÝ?Êa¡õ Ðó§{Œžê¿Ä—[oÜÈ…ß è?ÌK€5•yi^zóDr8‹MLj_  CX)^ÞñÂP ì¿Ï©SÕ9–-É4à¡fLNwWõ9ß‘³ÍäÈs«©±³Ìˆ“g§M£äʼni~Ì´¨'.äD9e§¬Ãé’³%'KÎOÎÓÀstàùIVÖAsˆŽ98g« ³_t Qgt°öšZSàHÌП ;3P‘:ìTƒý‚»te‡9âèÌ þ©±§¦×µ-öØA×*ìxñ'†ÝËbØÖìÖóÛša6G*©Ì’ó\Ìrkžë™®æ /2®l·ØvE·§t ¾Ñá¢ç{LSÁp8 UdÝœvé68M¤Ý°{ôÑ¿7ð7=Ý2ürË_oè§ŽÎZq”2:Š2f6qf#g'óóœ£Ì²‹3m8[§«*ÎZFÁ¹âü1 ×1r-²ÏÉš:®KW&k“ÕÕ\¡½¼ r=…‹ö½š8”ô£ýžCx¿åPêw$ÿÚt¬TB_¡èŸ>%<- ÏßMݦìjÊ®¦ìj²î9lÆñj¶µÛamIpËôJ;ÀÅ.ÆkÓÕtUgWõƒù¥¤ž;j¸(ø`Ê}àïË3ªuÐjUjÌ•Vz*]…6:ۓʪ¨Ï}ÒgÒU•ç*’0‘Q‹**=âÔÎRLQé°&c!UèŽFñU¡[ŽÎ¸G™‡Ô£Ô’z0¨ç:R)÷õ@•wN‚•±ÎI°B˜Bl'çä±IBÓ9¦Ê2SËh°!ÃÇÑÇÑÅÑÆ‘˜2,4O¤ttØ©ŒÝWÌ‘æôÚÇ1Å!ù àÌ÷!G+” ø1r%=gÜpf•¡ÈÌ_ùœþË쨸e öù¥æ‰â±}šUåºm¢Û6ºm¤5äÔ¤ü3ݶÓÌPÅ  jjQÁ¤–¥&E‹ZHà[I¨.dɾ+š¾çEïêRb&ÞêòVIÌ,0¿Ÿ¤˜›¢ê$™Ÿw®‘;0{_ða=¤Ç1õzy¬|†#_tòöÀ;}F“ÏåI±™`5eË;š¢ôm©7ËŠ/zÜ&_êo^LáQ÷Ëo0’? ?5ïæãõŸ®®ooŽwöÉxóþö>ûa÷ÝË›û]øs÷úþêî—_wÝó‹gg¾à~׬¼x…úeG~Ýe£C×Çko9€®‰'fÅ«à²a ÑQÇäæ•ê—ÁõÑØ§Þ¹ôÑÌ=³ë¼09aðBo³¢SóYUtÄ6æaš9ø"]ÑE_Í%¿È­’aP˜œ÷˜`D›™ajºdã ›Ñ)s¯ÌÜÃãèÓ-é—H5a} omñ¿}tÖÿ·4omä¨E5 ! ¡ t&ÉC<ËD"]!ÕôÝ–®+Ùh‚ôP\ÉGuLHÞ2ÒLÏ­ˆ¥ð[ˆ­8®x-Œ2:mrÙÞ\–6÷È=Ç”1ŽáïÜpO<ñœƒ:sÏszÆGá‘Û^ºrStÒè—{sÌÜ33×\øfwfî ¿šGÐÜCóºtÒÜKá¦Ð£à§¹£æžšGRsÕ°¾ÿi¤}D mQ¿ÇÚµG»¬ƒÄw­Ã¨ì—òæèåñµå£O|¹=·Ôæwr7,©éò‹Žþ¸6¯ÇÜþ ¼«?ç]½xWyW–ó,”'¤*ËN§é*9†y žXäþBZ'¹0¦ ¸Ìˆ£åÕä{~•3-y†Ã‚¶¬d¥!C;¶ÖŠÒˆ¡ ¥ áýü$‰AA¡d€>$´I­ƒ#¹º‚¦Ípª Žåá^-ìVômÆéáuè2ø^Ã}-¹'{®3…[v$à|´<7Ú PAœT˜ ì)J¥&¦ˆõCöÛhäÈŸÉZJ2129 ‚¢’E’ÒSTZ– ¢2CPîíEN(&™/iêÉRPJF)-%ÍONÜ!½‚‹`2Ú±‘œ(¹Sò¬äd)Òñà-òž¼09drMúhÌ9jãcfä%­Ü‰•G#±ÅûhåÕ93±¦`è(eƒ¢v(®G™'”{–£*´C;´h‹UÐ$šeÞpâJ´O ŸkàwØmì’ç¾NÜ¿w©â~4\wÏÕ‡)¬)€—+˜ƒzA=3ðš"z•½U¿DªFÜ¢Ø+E« ÇvÎÀ*C+xϰ@«"ÀÕÅ3â•4Z!k–RÈJ˜Õ.<kÃoŸfŃ%Fq¬ ixú—ˆ‡x˜ŽôÂLR)v ¦´„QJΔ‘ÁÒLÑÑ1ÙÐü)2ä)E¨öY²hË;&ÒšâÄTÊ\*É”ÙÔ„j0÷”«-’åhqÔ‡GAL$l$xûª7!s”2Ñy•³}´ž‚æÊ:taè±*g(Œ‘ÿNv­,„+ðTÅî­U¡ÛgŠØš¬]%9[sQÎF5H]±AH”´AJ¤%ÈZÃbÔì#[‚ v¾ ² Ôlà èA>(@´*(6jŽ*ŽŒÍÖH±Ðé •ÞTè-}6uxåú¼PgÓæ-eŽºŒê8'*üDïTNNnÁ –¬¢Ô±f-Ù¹V´cU¥®žµè¥Rá‰Þ*užµÖ¨°Ð’5¯X÷š¾ìˆ -‡v@Ï.ðôqéé†iA.o™OkDH´MQú¶Ô€/< T¾Ô‹˜n³ˆúÈ'HJÅÝkpÇ%úRlqÙ÷اϰÄ{‰Ú] < òNŸÑ,&ñ”ÇèLœ,„·vr/d¸hñVw¸· k½,Zi~<žÏÈgò¤ÇÈLÆ=4üÔ¼›×?~ºº¾½9ÞÙ'ãÍûÛcøì‡Ýw/oîwáÏÝëû«»_~ÝùçÏÎ|Á߯YyÁÖÇ·%}:â«lEû’a§(CÙåØÛ˜Â€\Œ6–¨p·Ð›À×7âîtÑ«§›Ã­ˆØkjih÷ZAZdLCÚ´ÄYCÙé Æžm·‚XÒŽ`Ú˜ÖIä×€£H×(ºO Š6HêC7t Ÿ ?;È&ÑÈY جÀS¡³%äÔ'Ð9vö;¡-€p°4c¹¤_ð'tS„æ~<+ß U„¡«:EiÇþ‰‰Ž´O1Ð23ÐÁSðn"èÍÝ‚ÑSqWPq> B NAy½ÿ? í¼xŸO>ÝsGÌõ&Ú ÐJÃ7ÄZ=z²²ê .UÌs„\öbŒ¨› 7ÆöEÁžD¤jvAÂÛ6âížïYëún[©,jžàVj*•zJ5µ–ž§rm[CÛpâpÞ`“áÄ=¶M[ÅÚƒa­€í bÞ­Ð6ÛrkϽÂ^&}3ä %8ú&È‹3èý–È Üô>yÑ]:ÎS„ßuOAw…¹ r qO׉Sœî)Þ~eÝÐéŸ +__7Tç³aåkëQXD04tØ±Š±deÌ*Î.ÕY‚m‚[Å[\Ö-!®Bît vqÆw—È›°WÁ7 ¯ÂoÀßÀD`öQ¸Ì@XQx‰ÃK$NX¬`Иp¼ÆF”•Pk-ç]YöJ”0ïØ>ôDWoÒñSÀTRnu@J¹¡W~Q{_Öq ß@åB>p[|úô§=€©øäÝËÇWŸnw·Ç÷ߟãkþÍų—¿?ú¯ß Ÿî^ßýñáSzñ·ãÇû#ÿÚý ŽÏw/^^ýv³û3¾~}ûÛïnâ÷Åî²½mö&”¡<—È£éZ¹iº‹7WòFŒ7È_ÅÕ¿ñÙýÎíþ¾{ûs±»¾ÀwÿÔÿùüýâÕ³ûËų݋ýÍ¿äâtîoñùÕ>Üýüàì·KüÔegI¨ñ#cšÌyøš”çWÀ’ ŒYA®ì««7wÿå¾ÚvÛF’è>/°ÿÐÀ ˜Ð"uO)Nf=pbÁÊ\€Ì`Ð$[×›èn*–¿~«š‘oV¼³šyIdòT±ªºêÔiÅâ4ö3â¾ør¤Ty<øíR—à—',]ñÅ?þ¾pÐï4=º)œrOß¾ÒÆï¥-`b»ë)x8ÖCŠu½¸;‘ïߟó·æ`”xžCÔVõ]̼ÌNü¿Ÿ5æ;Ÿ×\ÔÌvÇÖIŽ­vÇý“÷ÇxZS<5,ª•5Ò×e6‡ ‡ôd®ñ´ºPÜ>Ö¶7ÌŠô„Ôƒ~F‰•æÎ^B£ÀgÉÙãcM|YèÌìiwÓ¼»>â0Ð^ÂÚÝ0í СHØfêÇ # pd óެ …8˜$1 “ÅÔ¦zåÁSpÔŸ”5Æà¤Ã´;žäxØîxt’ã“4>Éñ¸Ýñä$Ç“\;%KÜ*1­¤F¥¦„vˆwJÚ CݞИРØ%íNO tÚ¤z§±TïPƒT.LG8óhŸN6üHÙ»¬%ÒRX=œ ¬„y˜Šdëe™äànŠ1 »q²,bw©àKÓMÖWšî¼Gè X(îé"ŸoêêÄ…òÜÏœ¶^Ì´4‹ùaõg þyjîxAë‹r¢x4{ñËå~ks]ý-}ÎÊOë¾}Íh …¸¦Š¢È¾J HÃ?=¥ûäÁ/o?q—Õ¼~C.·~€WT)áÙ‘bò €gBÐ?ÔÍ }%‡s6žï $(‹\Ý@©²×øÚ‡,y}ñ¯@þ¾£B¾%¼„/ë"vGý(ã Y @F'¸$YüóO_*¸ï°.Uò¹óÀÜNeJ¡ßE‚¶¸°Ù%Iè™%SŸt6ÍÃ_²)¾½(fsQº•£¶Ï:MF—“þ¿7ÂóIáõ®;- ö<ót"©øö èïÚ¢¯%݆>à sؽSÿˆ¹€Î-ž¿Ö(ËÕ×3èï?“Kßsþ:4nNÍ)ܶÈÕ=£~CÖæ­7F0ƒž}›£þ¤ßšÝWÏU›NÉ%ȳÈíÕx2mÏí±Û°žKNÃ~ߘŒ{ƒÖ¼öòÚŸI^À;sΛò±¹qËVêNxp¥í”Þ±ÑÙÈ Í“K ‡Íy¸ç¡'`ÍE[¦¨ Bë‚™~s0ÿt¹mYÐßshý¨—¶öìfJB2A¤·|ŠV*B¨P6§Â%÷¹Hcøò‘¹^´%÷Lr?BÓß šÏÒ f7¦I®“ÏÐ`QH>À‡ à« Á$S$w4¡¡~/vŒ|fмw=EmÏ÷ÔþHäñWni°Žèš‘£01=²ÊT*&^혣¸ 6õià°ãjlx¤|/`DAlÑWA¥ü!›ë:´ã{!”•ý#l •m3 ÓBñ!”^ÉŠèM’6y¸óa‘µàYuj°œ/UŒ€ˆ\8Õ4–a/¥|l’LnȽ®£÷¤;)׉I¿W0¹‹T!´Y¹NT‚2¤0JÎB÷\hܧô FÃaXÛ¶Ä„¢Îص`Ù¼­5©[yÇ­Øg9Ìíðz,Y‹ dÉüSãΘ¸¹–úuõ²É°·Ü¡>jG|Æ[~º.Œ~&ZCêºåžÛRùPîrò#΢¾'óí¤+↞‘<$ .âåì†Ì"ų^ËÔKÊsïg‚ÑļcÕÅÈ0… @N.s+Ò&WŸ¸zÞû4¥«ƒ¸ú· ȧðhG”q!pLÉ:Ǩ•þäƒÚÀs—Íß (E2Œ°POMÏ@4änß+NrGÿl^Îo›>¤óéoJ~`;âš1¹ô²Õ,¨Üf²´E×m¤Áïšß%Ô|_ æüjÑØ¸Õ®~Šwʼ°S ÜÿÔõ0m¸ ™6Òglu‹ke&b+½%¬Úë`’÷‹å3Ö2¢*q ¾Köß²°ÿò‹qÝKãŸ]³Ø¬CÑÚ¦ôâXê”'§ÁªfËñ…±ó$޲€®ÁÅÚØtíÒBõja8œeÞZ»¦ð5*ô}ÏÄ 'eb(ƒ¨ºLXTÂõöÁjï7•Tƒ` 1· ä“7Ö4 …ñÕsUsåµaÞzÓ˜¢´pi¨Ô*P†ëû¡$#;«f¿*=iøÀØ~÷b{ØÙMU’FÀÖ4· kPZ@¾‰äLÕñL–€rCaÍär% …oÀä‘äa¡QÔñU¥ªí†èÁC‡·!dS4žuq*Ù·‰pT% œËNô¤á42uU-'4̉¤âÛ¦!ßæyìâGciŸ™ ËäŠK~½Xþ|·øõ’ì¬æ ÀO(øÊËFܪþ¬{æewÙ‹/×lE#_µÔåÓ”^\kG_Ê7ÜØ¥–™êi©)Ú%¹ÃêbºX??èWèvwŸßÁdjŒ*§ HÊÛ‚.úX¥Åƒf¬Êht8¶99¢œXcch5ãm®×@Ó|µ¹ÒNÔe\¥Üu™ôÖÍI:¤>l›G+» óݤÒöÔ–6‘bc( —:©< bYáª)\„fª®NÓõ V(ÀÚê…È톋§´aj`ZüÕHˆÒ§am”›ÔŒ,ÀlÇÑŠe„ž­ÜÁv1‚ÃSž:ô‚a +ç±0ð(œKJ¤:|¼øypkà ëôHˑŠrŸ › ÙTäƒì‚ ËÓG´jÖaE°(*­6x?ª¹ ñ[*d)òèCäÀùÈ;ÀËÌW#C±õÕ4ÎZ m‘%dËiƒöbª¤«´N«R3âˆvôí¬ ºîÄP¨Ãb‚Rpkl “é»d›&*Ît¥žŒµd®X.÷¥ƒ¥dbÇœí¾‘H®6™„¨¬<¬¦V… dù§ô9µû3Ï“iLꀅËË() —Ø{r-@ù‹69Ñò†\ÌnL“,puYŠ#מ“;Ñ9ç¾ZdvCî"…üF–ú0s\ û|Ü$]ZUNLò~±lñ’`ÊnÆãiáS?p›Ü…ØÎ’,½§4ù+ÌÂ­Š¼&WŸ¸ºg.T3‘©7¾iÚå‚|ƒdmÙ0ãâúÃïk©w>stream H‰ì×ÏKTaÆñ¿!$‚6®Š`$H¨ 7R-"p¹h!-$µP +R Ë ¥EJ1 %T‚ô;´R"©”ŠdB-Ǧì‰Òi¬;sî¼ï÷³p•ræžûœgšŸÏ_ƒ#Û*.®X_»®ôtW÷õ8ËvóÎK ¯ŸÖƒ,›ž¶ž¹†×ó׬ÇòLþf ô°\ï?NUÕÄœUEÇÏÝþ:ûÍz¢‘×Ù×3ד×ó×GÐ.´뉀¼‘×ÙŽ^2—˜K¶´¬.nPj*EÇÆãÖý;²¯ç¯-èSh#Ú‹¶c=È> @ô¡Xßp¤¬Yy))o½ÿtÌzœÿåLöµ mDŸEÛÑŽ¬ÇÂΙìA/52úa×þËJJá–¦Žècëq‚áXöµmGŸH›Ò¾¬ÇÂ˱ì:PßýyjÖz Œè u‡d冺‚ÈÑÃÇ{¦gÖƽìk;Ú‘6¥}ÑûÀRÜË> ½ök7o»ò0ùý‡õ,@¸Ð À¢Ôj u‡RQÝ9úö“õDs5ûÚ”öEïKq5û@z½ý¯ŠwžÕ˯Ÿ·ï½¶zø“šb¡5Ô Öãd…ÛÙ§÷¥¸} ä÷mW®ÙبTTw޾ýd= ôð+µƒ:B¡P_¨5ÔÖe‹óÙ§÷E9Ÿ} ½Éø—õÝ+7ÔDŽ9Õ7=“°ž0F/)jõ‚ÚA¡¦P_XO”]ždŸÞ~ãIöôFF?ìØ×®,niêˆ>¶°D/¢.P#( ju„õ8¹àUöé}`WÙÒ‹õ GÊš•ˆÍ»Ï?zg=`ƒ^€çtÿÕJA½`=Nîx˜}z˜÷2û@‰¹äɶþÕÅ ÊEå¡èØxÜz" ×èxK7_—_ï¿Z@] F°ž(§üÌ>½ø™} ½÷§ªjb©¯'Zï~ýf=;ô<¤;¯kŸúOî¿ZÀz">gŸÞ‡Ï|Î>¼•áò||ëž ÈºÒÓÑϲ=ô|s­ç…î¼^{Ý|]~ëqÌ}z~"ûðMª÷3ÿ÷]ÝC©ï e{/ ŽLdo0 $èøCW]·=õý_×Þzcd?…Þ‡oÈ>üñkï/ë§gõgn­*:¦ß­ª‰MÆ¿diB èø@—¼ºöº^uÝv]xÝyë‰ì‘ýô>¼Böáƒ@zl<¾÷àUý‘5[ÚsÉÀç€^€Ût½uÃuÉõžëªë¶[Odÿ7ô>>stream H‰œWYWâX~Ÿsæ?ÄFY–DY³AeQ\Ñ\ ÌÒ=ίŸº‰¬Ú‘žO¸·ª¾Z¾ªºÎºÚdꉿÿ:zŽ>´‘ª¹s¢‹lSwÍ4žŽ‰ôµ¡)¦ŠzŽ¥"š–ø¹²Ó\ƒ¢®DéYÒápe!9ò}¥ˆtÃp¾Vk›†©L-sŽDó—aËó…ŽÎ5C]ªæI"ÝE²¾«}J´‘=%º²í KûWÆžn8ý¡žÉä°ë–ü¾FmÌå âFæÏ¥ÛYò·Ø—®³pïÐélÁÔMK0ç H– *1;í)x”lðfÇ•uÍy_–¾?…º²…gŠeWw(¥Eµ‰_Sd¶ü3@6ˆ†®»¶cÉŽicMEsª9B€ª©¸sd8)âÚöLÂßmcï¦K,tP‚äëð훛ȚAh[@ ÀVªB*á˜Ø„‚ÍÁÂ2¡Ëpçòb¡kŠ_ÛU¦Ø½†!"[›k3>š%vÁ;s¼†×lÂ5fä9õ-ÿ38·`Z±´ÅFù£û)vÑDƒøÞ7† ¨aßÒæmÙšÙKÙ¦ËW4Ý– 6ÿ ±} ^‡Ä¶ÐØ f”ç|Ï‘ U¶Ô=— Yht£¡_{H_A ·°çý÷Å>ä^›³œ`û?-À¤î"˜é1éÊN-û…"ƒüï¹# »dN«î1ð`³®AÃc§7çe€–_W͘íS,šC– {#ÁX…ý=uxÓqÌù>5†ÑÕ0Ææž“ëËñ½;ÝmÞV^¶ì?k_¦ت÷cA‚q†úSw>2dM·÷à+ÌP¯%úš®,7EþÛò¨§ý»Úiß4pu¤m,… 8."k}Ú»}s±—ç¸Ú;ŽwþÖJÜfÇWZ$1öù,–dúÇù³Êo †=;ÞËÈú‰6VZÍß{‚¼½ÄkÈ6´é»¢k B1qÐÿìÓØ¿/ÆåxŒ‡¼º`Xþ2­ÙÆ´g~óøØÄµ¼wOò'RðöɰÕeü¹|P“áçÞÿ|¼ì¾˜¶_/T ìC>½Ô‚µ·‡Ï'ålà"øêû? ó¯,¿H†¤Ù]B4¤Þcö¾§læö& Ðÿ¨š³â“ó{0|ÙÐ-æ ý?r¯§Nn¯:}½Y‹DÄüÿm (¸¿®_š‡A`½"Íõ„Fã$/"\ï6W½ ?ÄKƒr¤(ß&šÙðe’g­ú|Z˜Mé šœ²éë³*°×õJ;W-´#mÖrFªeÚ'GT."I[|' ò-S1¶”Xج}žI [lXK©¦ÃOÎ:-¶”C=A+W1•ŠL>aµÔ;dDé¨ÀÜ×ñõ‰ÏÝ'ÜÜlÙ\£çLã:äJbîpÀ¿ê‘Àˆc²9úÒÚ!s:fn:\_HÝüuS®ðÄ–fÒ[°Só¸˜8r¥h]Œ—/éø'ŽŸ ¯³úmaÌOaÊÜS[y ‹ ÕzcKÕÈÀ7NÛÂp24á+ü&6ÔÆŸ)v3Ï÷‹)á åñ‰¸Ââ±ÔÅÚƒ·m°+÷++¢'‚ݹò|òœÀÑ€!ÎwGênjݠêã³¢gm ãÙØÍvú+Tïç2iØdo;¡žRßzT×Ùô…±w~"I±³JBï?î«k;ae‡~ z7`cªmlÓ» ¡B1SüÿÕŒmZNîZçé9Ê—³Ç¨Ù 7^°­]»Ã¶ÏÅ­à­]·§‘¡í‡ëÎÑrë™ê¡8Žl=Ç5°²ÑT×ö&7°¦"uv«IPÉY§ÅRÃR‹/ýx&Ï °±Â¨È–»M¤¡µ·uìJþT_ühš°Br0ʇ}µü¾Zü¾W`Éq]-5ŠêŒe^nžÚÁUc’Z8æT1!¬ƒß·¥—«¸1oKQQpg~=­ÉÖE~ÝçVk2˜”·ö%H_OÒ’™PTk¾G¯ó²IS¸íÍÈ0…­Yûo-¤‡I)âo\üÒïΪš‘Ì\Ý™ûöörÁU&ÐðºMÕͪ¢ûb‚˜ÚÔ€QO3ãÐ(`ÀkÄŠ©dÄ}£¦—¼Ú9•îF4 ´xëÁín`z*­,Ê9iî'ã Íç{”Ì)nùhõÞnÓâÞí0Ó„«ãI“—;ÞÙ%›;ì-…O¼ÿÛ®5U3ñ!Ðôfß¿ŽWÅ$Ë=+¬˜ß–[ãu¶Ÿ¯›ôÁt,4ƃv]ˆ"žŒPOË~Ÿ.iº -Ü|~ é$Œá)“ì8¢@Tã*"DlcMÊ—Æš•:_=ðØ„Ä!çüz¯Î°ñåöflÉ.¶ n踗_ñ&¬_•®el¶öÇ2ŽàysŠ¿Wrˆ Y?.ÚÿXƦ— 2^"B‹îÆ&)ò±>áÍôFžG“‹:ŸWì ½âfðÉw¨¦4íMFk·v+¦2æ*ãoœR„M†,]ø@kîgµµ¢Ï,‰´Š»[i;Ž˜‚þÃq¿âƒIæšRç"ø½øœ ”ž´×åù´ÖN»éšü·­gÐX»‘#µ(W¿DúîÖIðzHÙ4 ö!B‘o¶cœIt«¤\˜.™Ä‡h6¥öoÒãàe–ž‚<ÅS¾YÀÆMó\»r ³Øyö“üâP¯`AÚ*QúÁ—¥ªÕðO½o*L¾ì›0íF¼,ñ2¸|ûê…1ì@˜56î;¥–lxiW »ÒVꬽ³R…AõHûŸŸr1?~úÂ6ZÁQbõ—õ®acR=ê|J7È–aG'¿ƒ÷^‰Ìq H/-Ì1;[¯ Ÿ–páݧý`F:Mz;úEמvß…§•"aØÐG.ztÍÏm¶!H£ôÉL¢Þc’:üœvcW©xsïyy _IÌçÓã㕾ŸÑ}§˜[ +ñ_an·ÅC„ï¸bõæƒfn6\²%˜N>=û@ñðU¶%1ÇG‚ØN¹Uºzb¢ý‹Ì’ù\-÷žÕe#y7Tj5ðÅY«ÁE»ÄùýO›†I¨)ºJÙ ]ŠgM k@€ne2Y~ce~iE©Ä!‘´ò¦T9ˆ¬É‹=âÞ å~³ÉSÂ4Ø?ÜÊrõmqÉñÖÇ6G"ô…Ïõy .ÅSš? SÎã7‰ª72`%Éa¹¡L¶¨Û…ûi2¢s£¢¶äë×á –lbŽvdЍ§ñ>)æM—ú†ÌÐ +H,E·–ttÂm!L.ôò š _h—rûw>I—m°§IïY…Ie]4=7»ã‰§8Ï%.Ú³v éaÔù§X5ýwcÅb7J±뉰7 ÉìÑ|,ñ²³Ç"6Ø ú´a#Ž[j¢»×8³å^xnòš.׿ü|Kû {˜]4ýº²4º±Ú’÷“dU5¯e$&xkû5/Ó¥ ?õ¬ìteò“ÙÍÎ ^Û»;Ò ,w–R¢– ùr9T5ÑlûE!,»ÄÛ²^Qíº`HA2-²Ž´b|ñkchE›†²3j¡ÆàËEkµÎÛJJù.žÈ„Îc~7-_öÜúM@E&PÙ¸ÉnÄãr« (%QŸÐ0KsH8cê–׺AyHŠ®â–¥¿‡5›È7ªmÑ~ˆBŸé.–L„ëG¢ÔÔ|2t2àd©¶-ÇÂ_IùîçnÐ-GžšÂ-!òXl6…º¸Žà:MG¨§„ïó:ùú¨`ïµ›v…#ܲôÔFØYš³­]»Ìî¿ëójõ[ÉböëKá¯}=ƒö»€ÚÈF^ÿÕÎóöü(¤Q.¦ËçŠ8 0oXŸÀämº°†&™*¨§Lä;½èqûHPGQ;l̆ÝÍœÛ䂞½3?—R*s¬ôÄÁ—9Ò k¤;KˆIŸU0éG¦™Gùa.‹®rž6#)ÛÚÐÁ†mO²ºP¤uÉm­ñµI@1…ÃQ/OcÞ`7ÝHê‹J6ë ¶}é&ö÷«Ì1n OÜâ¤j§_«‚z"ÕBI«Î+¶ç˜_…FœÞgÂt_ðÿÃ=ÉÑ _“¢•Ûz¦™­3ͤI²µ€{EýΚ©bEFÏäx±¦iÜL×?ÎÑq9,¸è…ƒU(æýçeÖ¤ ŒÄñ÷­Úï0x¡"ˆŠÞŽ޷㨣8€Uû´Ÿ}t<¬?—f!K7‰öô|„Y6#lâ´ Ô…Ñ–ÎþÅkðHËk¹ºe¦[:ûËd×þ÷iø0€Éä.dˆ¸÷[H´V[\ÊË1ÏTN¤Á‘lítw‹u^eá‹@n‰%xF•yŽ )pIßö¥¢8þŸƒ®×CñÍ/¹zYžƒÒ±éß“"|^·Õt‰Ëþz˜ž« c!ęԶâ¤÷ݹÔÂG —Á3ºSî.Ñ×®H£—Åïƒá¡Ì´&.é@œ¯ÛÄQib|l€‡ž¥MÐCV%´è•<ï3Ð×Gñ‡¸]<ú·<ÏeFÂÚ K½©¹-̤©}Foûî‡p»ß`X’@58PÏ›¾-m¾ó+\P~ *§q_°z>ºìR®x†k BÚÃ<¼A€ˆ ’EÅåÙµ…E:..Úb<½Nù y|žÐt/òÊz­¸F.\J ~NæÕ&æµ\7ǧtm›ÔL Ô‘]ˆ;æ†4ó#ðRŒ„òE>ìîºøt’Vêò'êu@ÍZ˜´bŒgEp×f­Dn`g„þ •N¹Çtº;Î[]–©¦‰Äa”Ù&„ñåô¥Baûå¥âÉ)&V±$¸}XÜ¥¶aõY¬Öñ<ÉŽ8ô$7ªö&Çà[jµ¿—&Ü忳`ì4ýáç*òQÒõ“¹ÕŽÆ‡07ç4û¹•¶X4飡¯µÞi í2.ðA´L}{ÜØ,Q›Ö×%ÒDM3?×KM_­W×oV%§âq%hËóa}4!ÔúJQS~½ÙÛë™Æþƒ€†ÇO©‚k…‰ `íÕÚZËÆg ,×]$Uƒ _1£ðW$Æ6SÑ›¡yûeÒÑ\ÛäÁû¡¸—ÝŸ™9èÇûÙ›5‚e>éo$•3N °AA°ìžEµA }o-ȇ윒œïÇH"Ó÷[è8R4cFĨ‚ {ЂͲQž‰2 ~ŸIšgw+)O×]ÏÎSüéîü¬Úä8Ð0b¢Zpõ™ ¦…Ôúä(FmQA.q¼b¢žÿCTs“ö¦kö†ºZH¨Úœ¬FþOqó¤/³àB§Z)_NYFfÕ°¤ b]Q H ®ß–2\fù*®€?°B;92Cª G+IÏû¨Š¡ëi£ (!…$b­‹ûÆ F2»‘‰¶÷‘+e¡ë÷£ÒǤÁ‚•™³iEÄwW& ¦c~Ó;ð·ø¦÷…gêHWGM{j11‰§”Iø…ú§FŸxj lG¥·å¢×žÊ"~Ý ¼º=µAb®H*0vr 4TŨñoÿí‹öÔX¿GJd°úB… ì’V´dãš•”Úªà@¥ÝÞF‹ãœ¨3²èt ÆN®«ˆçQeîÙºv´›ÓWjE_N8š6VDäB´¨æêÚ¾>Ž”jxwmxËT  Æ´·€š°’#5þSw™—œö¾QçúÄçí:P¥%}Dé¨-ÕàÆÑêsË1mØ×쩬Ëo  ŸnGÕÏ3Êðç†c;*)%Eri·§ÕÕÓöÔXLJcùÓV«K2ÒÞ=ÑmÝ©0ÙÜÁÅйæHE×›|ÝA+BèÆ©áÔàÛ 7%xor‰î¡Ò­Ê¾{¡Š£½ô¤u'+C1~§>¥NÃ%ÿ‰½»IÛR«A}ëHÍï§Î: À€n¥Ö†­\W•WëiKmMsiGjm$—ø;FÚ¸@vÑcO­¸Ï­ÍbÅØR»Js¤L§Hœä–Éî)šw æ݉:ãl©jn¼S¡ožÁÓ)gªÔQŒ×Û{j­¾Ùõ6hG…¾›á¦£ÜCóõœ¨9mþ²öÔz> 9£`QæU®¸Ãi*##j¬\¨s—Y|¾<9ý¬cнPÆ`êît`r>L8£¿RgÁOÏ•ºO_*¬Öâ5‚fýò35¬›’Rq+Ò^sE%ŒŒÜ´¨yã-/Ž´ä…šó‹¡—F8©Ž^¨c3UºSr ƒ¥åL ‚‰÷¼Ø¡ðDÅ·TéüJÕ·¹À•šj†ŸµÊÞëc-*ÀDsJåI®{hÄä’oª–ô¹zfSÔÈ[®Ö¹Å±ƒy£ì‹õ¯Hë:Ï ýNeT²~ž#,©Œ0ÓÁŠf©¹ÑpÛY$ت#^Þ#ÀïA)/ŽtBòPÐú<Àú}ú«mvÖ£ž¨å¸eµ Ù4*;HØOW|H¾®ŠM«™.+%·ñb½w6er\Á°øÙ~z™žÖòÙ3ê`-5R‰.nkej `þÊk$ôžµHÏÍ¡ø»•öuæC1ë`eýÝ«æ-«Ý¡Uø êÑ·¼Ãt94-Ð푽µÊý‡õ*íJ]‡¢¿¥ŒŠŠ x™Š 2(J¯ÂåÉU&ùÿ/IÓ6 I[À/](åÌgï}jŸù˜c¾uŠvÓ|®Õÿç7ýÏ/m•ʾýZÌ’Óñ ÿ[ã¹ Üu‡IÁÏŸãöo~;XÜ[àÈùvØÏäÊqMX´qÿ¦öhù?WŸ'ÑÏË÷ÛðCçí^–nŠ‚¢-—ùAG»èÈ2|á`c»ó™Òe«Sú‚ßnàÑòÏàk%=G+Üoׯ9Hkñð¹ô*x!‹_<ćη…yì|n…sX…Ózè!™Zm—íãíØ9Ë-@ž¤R¼y––”J÷ARî_Àí9x»“äÇØ~jõ,%› ‘úÓcóg…ül ¹½@שë“ï(’êùþÝCjßÏm¯ÁÔùQ H¿@ÜC)D—L4ßNâc(4#Y¹Ô 4¾ÌchêN)-€c¯ÙØ“Øk ö’zUk¥£ãÕ”êÈ1ÍßÚÙ@àÕxqñªK‡b¯º¾4H- QéžÔƒ‹£õ“åUÿGz=—žI¯ÙÛYáÎE—ðú‰@æ8NœýëݼNàÌÍù^³†!ö¨}¨ôzBÇd‘Ái!ð .NpZŒD^‡ŒWà†*²šzE:E芔ž¨ÂŠyF Ó½Œ0­M+@€ ÿènÆÍúÍý=à¿Ú Žý˜ ´ò’÷–ëÁ4ìà†5ÐøG¯"³Äà犜(ÍV7æ€Oe( /Qm¬âÚ»¯·º Ì× ~ÕKX"ÙXóNv•Uºäbµ#+£eİ[¡æf…¹üvÇbð_JMÆ•0|möµ†=XK "z¬¤ã¥Ï|K3mؘ(ªaâ`²lŸÀŠê/·# ô Ä4;g'hµq£œêÁ©·ì*‰ÂH«5$J¯÷ÚàÏHØä›uÜ;¬•õ ?¦ÔÁœ‚fI ºÁV¨×,üÕÚ»ðèÑ53ŒÿU¹ÓÍ+'C”Íf’ø1ìWœ6òz¨ï﮽z¨\Ï€œ$:™¬$© ÏâîõòÑC8ÐfõÛïíê%žýžyØï±çÕK}.úîóå —9Ðâù𥇡hÝGõÝKobÚYjïê[õ­x¥Ç½ñ¬ƒB†òÍ¢Põ©<'=ØùCóoüw䥚®>¯tۆƯ¡ÞŒ`±Æ_ÏêSëGŠB½¨| ÌF…S>°²rµI¯'‰ãÜõŒ “ÓBgÍ+ÉÁÞÐùQÉ=]“CµŽ˜»$ŠD=“Öxüää‹ ¼ø3o(sš5¸)!7›-£RªPãnï#5îê¸}¡…<Ñ*ÓÍÓbÿÚ¼çä¿"â†=<w'\¬•…Ö„¦’fp”™± 8 \ùÈš»}ÔE"Öì· UªŠùÀýJógc¤œ–Ò“Æt>0$¶£Qî€ ×iဤ&³Dńܱ储2‹LéïiƒŸ¦R’9ê,ÁiËôdδü¼·t%="iM‡µ© ˜Š¯&ù¦Ó›!OÜm›<=YûUŽä tU¯‘ä^/˜aÊ=&4ÓÓ€0,'"¡Ö£bš]ØóÂÙ_o2Ñ­·¡6ë¨ûE@µÑKëùïá©NÌ^û[{0¬òL¡ÞlkÍë,Ù4å@'Ç=û{ÍKðma†Ý}‹F£ÛöE3™Ú·L©o$éë¶W¦êW9;²A'ïOÁD­Ë_†:Ó ¦9ê›/ ê7.i=?ê™çu©éu ÀN=;ãwó§Ærp¯ù¸ Möt-Þþò>ãL¡!Ȧ°BZ€þ[µy2‘àÃÃ#/<ðŒ„§:w*‹œÞ0÷ãH‹q9«Ôd·;‡TsÒäknÃêåÊÏvâFU¾²g$õ-D°(àPcIŸ: }„EÆ´Àv\Ÿ—¿läjdŸÂsk^†P§mYøÊ—z`&È|‡èá}^MÒ¿”aA7æ¶êôÞL~LØCõ=0„Ôõr_v^½‹oèzîQ/zÓó?hÓiö,¦káíÅõP}šÖ8i0›ŽˆÀ šœ¹×X ¿|éfÈ=FÜ›Í×÷Z(w!Äî5 èÑu·*­ïwJNvO Õ|܆‘óY©±ÁÔü¼"f^œ™7Qà«¡ŽWÓ‡=Sj¬i–Õxâ=ôfKO^«NYsÈ+ É7°6ƒ¥wmPH@Tç½|ðèc  PÈ-„2[+Þý¨´Ìn²2šGEóTÚ}Èu‚[•·-2"šÙ„7U² |ó&âEÌžìdl§’Ar¿±7M–·wT´\G¢ Q—ë¸{aM˜’” îĤ͛,î 04ó™…A# $?Ì…:ÞŠ—€Gén’_LFoNë¡O+¯þ-oÝ·kèM‘ Y„~ÇBIä‹/Ò´–ò¹7ðÁÈŽ5õº ªz±Þ‡½¬Împ éfCô±éŽ3¬¡W‘²‚ÏMG§íjÈ7ž\ˆ¬V;ÓjVéâ¢aè*è·ßìÙ ÿÇÃrƒ”ªb>𦿙etÀZ£.³éûž“ÿú·ðÉAXÍ;ŸÕ„ëIhS7t‹sЭçÝà¤¹Ë ¸#{£,œäÝVÓ4ϺÖhHòƒn«iæT\·}Q ç Û~(Ðó‹nö¤¹ÚÝz浆nϼhtK\gl+hÒ~z)l¯þEG!Ä´ýÕ?8Á¸ŒF…¾ùXŸ˜Br¤0¶ö k4 ŒC¿@k<õ¿ ­=l¯þyVÌØŸÜÉgãÓ ?º“#l†ëÌöü($ÇL4ßV`Ñh~ÿîù9Y~ääßwÈÑFr»[´ÒK+öãÑ@`/“լ&ì »™T È]ÊÉZS¸ä–꤭ùÚL"˜:D¦ˆû†o͇¨Eû»w´àjdêkãMSâ£p°„JÿAúäXø‹‰ÜVäfs2\E(sÆphÊ`hJx{z2:;]hJ)É i× z7Þ%0à×}TS¸dXuâ‘)õ§îÇS±îô•ú‹Koœ‘Á b‹ÿUÖ~¦®O¾£j*ß_/—ç’| ]½ŸÛ‘á’ãŒQ º:i§T²Òƒeò^…ºŠ†fsbÈ A- <4¾R«Ã‰< u§ÎÐ^³±'äÕP–cÓk ö’zUk¥£–ÀëQ0ô­ ¯¨7¦cã…—.öªK‡b¯º¾4l¯åõ¤\­Ÿê4ëÿè"?“^³·!ÂëIç¢Kx}‹D‚Ž×ÄÙ¿Þ ãÕ<–”¡æf"E^ÂÚ…@W…·#sGí™MŠq¾à3’2ùAL 1A7ža-…‚­ewåÜ€r?Vì·0ÇþÏzµ¿¥­Ñ¿EÀÖJ¯Ð!H¤E|øÄöÊU‘Çÿw7ÝMöà—|ýZ:3{fæÌ9Dšš¹ï; ðñ:֬š`obkcU/Vû<`”¥'¶† á„.¿;JÇŽ?¼û„)ãÏÁ·¬¸&šúT}ËmøBâø|Ñ?‡;ya^º7ÊÀ£t§PhiYŇÁ§@CלÜ{˜v lKj%Úqr ‚D>sÚÏk.G…´)âY9Ý=k<ª%úðÛ,=®6ÛË ¢>^Ù•ü8R@Á÷&¶C×û“FŠñQFq‡-Òsô¯²wY¶†%}èH»oî _–3W²Qšk£x­9‚0\êØÐÇë_¥.„‚“Ö¸;énÍEß&0¶V––mßžI3ttâ•økœ®Åk ‡o¬îQBËi1ºÚÎÖÓ¦-müxs˜á3ô¸fCžÙÅ׬,faÐ<¢gâõ$_ú½8]] ÿ&«9ôñ@›”34o–½FfQB¬ÿ@MÏàȱ‰"Ô¹©Æ˜}]rù× ÒõZ{«É`ÒîWb!îpðð{ ÂÒ)]gŸ­ Q§‹Wï^ª[áàšVõ.§¦ˆÌöÈFPEÿTƒöÉ{ˆÖsv’’áÐÌñ{ø¾Ïê!L£ØF/«ÿk"\Ãvù¾Í|áP4ëFbhb<әﴉ«‰ÚÓb— y·Y´99n£ãœþ9ø«Ú2¬Ó6”¹:†ù¸´¸> ½&X{nŒqJœ,’ƒ?xe¸ W¯êü%§ü‚,5†+æž3tõ€ MÄpZüTOy©ÅÅíæÀR[⃫K„¸ýÓ)N—³[%£ÆÖš5#RRþèÞøˆHg޼w<=Óa­;y¤L 0KËIžV˜gHa²P‡Þ“©0yý¸|ßSFÂK!9H—‰8”áìþën¶: Ô$!EôñY@Õ*­º·aÛIO(Kß TÅéøé:4!ï©<X5ùÞ“YÖ‹þ9T"YMå˜gMUȯÐ5!êT/ëhÚÐÞTr‚0êFñ}Ç(§NæÛGMÚñœ;i†M/eðzjŠÓ~^ã1têä3–Ó#ÉFÑU¼uiù^ެvð Ö¤ao·aëÛ?®^½èùr0êdáãF˜QFq‡-N%Ý5úWÙ»,[óšyÇ@ã?K;踨°7¢ Ú‡ ~ÜV_Œ„Ãj<íú¬r°Á‹7)gBèøÊôE Þ‘¦…ô÷uHH#N«^ì‰3¨ é¹M é2† þDÔ¯ q#ùÎÁÛ<6¼<¶¸¡ÞÇ›eÎírê›}NiþÄ‹wšQRþ½™Ûá3¸Áƒ®×6¢N鋞´_QP˜F´ÄvÄÎn°Ás¦ Ý=&6ðò±”( P©qwÒUhÎ&{oõþ“R'uZ×6Áߥ߸¯iŽŸ×/«ÿÆ]@q7)·GëPÆÉj}¼W[{k6`¨åê4ÁËå(ŒVÜÁ¤5n9iÃKô€ùÖ@”›Ù(¢eŒr m½Š(ÊÓ"%b ýùönKV¶˜ìšÜP§QÑhZ³.ßC·ýìpS> ¦áZ1-¶ôc…r' Ô«Blä1ã¢yÅB“Ý›}·É2e‘9@?©tR¯AškÈ f¨b±[sÓìÝ_Î$¤Ò‰äõ$vß8øÑ_^DC¯•T'‰áÁ‰É‰ÖßÛ \c}_6 RÒöòœÝŠG@1Ћþ9ŒUòž¬@R‘¯TŽ¿ŒøzŽºu?Я‹`Œrrv»Žìc¶W ºÿ½8]]ÃÞxwWEég²Œ}¼aíchQoäûš‘߯·Á4hì͇_«í£ùpÞ 9§q÷Ñ|pÛKu€ùûè›3GËH ¨ME÷1¶ÅEbï#ó¬Á@Ûï#ŒÂ9Ž¡c 7Z3ON5±ÚìPž÷ô¢¹úÚŸøÂlñY¿o’d$¤2ût’È〴¸¡!»…‹jm‰áÃ'?\‹K鑸Ñäâ'°QBýƒ¢•Sßìó *hó£mXËe†q¢—cE ÒÄ´‰z# TØÉ»ŠŠnMÈà–Søû‘=õ©÷¨Ú¤œaŸ°(¥ÆÝI—à`¢û¹Ø‘Ó^~ ÌÕ†´ÞÇj:ÙÇjZÒ Ö>†–Ñ%›áP´¤4Àg>æšà]¿Ãn•ß‘²™,Ëõ›«žìŽânÁ6*ÒÐBP¾4çV”Ã'÷è@Ÿ »šÄcÒ(œ‹Ê²’øÍ8?fOµ¯ ó…åQçøåþå¸u×¾¹ü^X5ÎAsñûôéôª53šB÷¶•œv/[õìåÕéÇ(ûüÉꃟêÍöð¡ý\Òk‰–{œ:£¤Níÿ) ×8üJÂ\~ýYøZÀ+æi‘OêfO_þ.“7NŸ@º–,ë x÷ ”úµS«6ï8-(ý®Ü,¢ßZ€÷Óâè úC!d¶ú±2ñ1¯v*X¢¢I#—XgÜØ&¶]QÂò¯!×sEÄ-€ö(¹õgÀ²­ð ÛYµî²À霔Ù^‰¡„ÐgàJóaÖf0+,‘ƒšðYS+ ÔÔ\kJRd´á@ó £z¿,G<>ûÈ{N[šË.löÛ,¾ G.0h=6¢kO¸V¶7¡a.5îNº¡P˜¡åÑ\ôá0NXYZ8´ÃÂá=ô81\‹×ØÈ]9ø¹G A.Qg´«€ÎÒ¦-m†¶Ìa†Ó×q»øRMß¹ší×EPQxÍÊbæTò™ßao¦«ëBDEPvÖ›e¯ÓÙ¨b|¶MŽM.ÙºZ@$‰ßϾò%®“%yüÞà߃I»_‰/ «É -ˆIý[܈êaRm´ÉÏ÷fâãY ¸™‚²Võ.G‰ýëÆ¯É4¿,þÍ” ²‡'©P1hq•+(ÿ}_µ‡þÞð²úo[OLãE‹HÅç+ª#ª3N4Gl‹b‚&‹ñ@{’أό(Ƙ ÍÉq/àôÈY^Õ˜|Dé4¸¨é`Å8kÿ§£,߃HÜÒ1Æ)½S×RX܃´ãÊp?’=_ÕÃ{ÎDðxÏZ_×™{Þ®${¦D+5œ„&³¸Òç¼øI¸×XC‡a©-ÅQ¡KÅérv+»7¾ÐakÍŽ `8°Š RRE„ ž¹`=ÅÖ•£g:ª‘ê<½ ËÚÖ#¢IK·Ø&º =.ÿHt%‚96 ˆÊ½° /Ò•¯g ¼AIãàÇÄd´à,ì8cË Br¼žÉZ è8Tš‚äPƒª\¿¹ê©Œ…·ž¨¤jCmZ+”¦ñÚV-KT“€<ï©\–ò5¢kò¨“.K¦ TkÂ.T‘lPMUÖØ#›Ï2壖é­K_ˆ²¤DóaÖf{Ï.´¸–Ô{f4ä=Ù 6qÇiï[¯—ÿg½Z»סèobyÊsJ©×‚"ˆ3¨#.g|€ ÿÿ&ii’6iRàKt¹ê>ï}öIÔt•wq¢¤¡;p;­Z‚sè[g—àPÒŠvŠ"‡@pÎ3ëAÏÙËô<0ËT\n4èQ¸Øì ïmöè!y:­Q<_Ój2ØAè±l•«vʉ£ +1”¸•Ë =¼ìš+÷j$ ôdèQ‚ øa-x'Ö ^¹1ø,¸‡Ç…ç‘ ›× ±€•êôq.ÅL_c¨)8jTvࡱ°iEΠ3ëÔ äÜp€ðny(§ùhž §N-B“ y²)zBÊ8 _Ü <<²Ãb>ÎVÿ4n1çñQ5>%¤K÷.ˆVÒ#.3n6ÿÍ2(›µ!ŽÍeU\0ÙÄ Í¬^4bI³¦¯Ð oö‡ºé4Áì_Ï#É –¶ðT'BûµnÚrÈ9Ô T9Q·;;³Àê¥I°Ï(´b=³ë•€P²ÂÊI¸Í¤Æ(²ÊS@­ ”žk'›^³šÝJ¾NË6SîÊ=éæeæh²ŒÁß²ÂûFr¯%æÑ7Œxßm?^ì<ÆhœÆÇñÂ7[Iu˜sæMQª@õµ´Ýç 0Ç(≋€¶£àZƒ@ù½ÄUÀ(¨6Ôèå´“~õY«ÿ¹ì BZýò ÌdŽcsl˜´ZøVãíÇ<×j¡=h^Ñ÷ i¸ª\þíÞó¬Þ…XµrG„ÕGUU°U`f¹ªi+ÏpÙ—äÊè¹SßXµ^© ÇS¤Õʶº\ßulÕá4Ò°v\ës¬V壺¾e[­Œ'\«À Hò[‰n¡= ¸VÕÎìù‘gu†­ºÛ3A6ÔÅÕˆoÕ¼˜XÜ 'ÞËõ)Ë*¬ 0|(-˜Q×>úÍm÷šäwußw›Eø´rÛ‘‚¬¤{ÎwîâìTrôÂ#›oíõ+Ú§W?ª'KîÎb­?ú¾ZÐvv§½CŒ>¹÷{ê<üt•[דV1Óü×&T‰- àãüº`˱žú[”ä ú´AìæíK/Br´ü:˜¼Q¹/)‚'­Ò¯uÓ¦O\Qª*sNª’1Ùò¹µá§ Ià-S…óä,izÑ“ßtw!&çV©yst¾Ÿ¹±fŸ<·Nw‚wЂwú<À[ãìÖf—Æo³hþZYךe«.™…7HÁåg¨¸UB¹šJš©5R¦-:lÑãÞ™inpåDÝîàà¸d#îV+w>ýÍ}Ãr¦0»Ÿ…q¥U»7Aáñ»Ió—L.¤–.ssÍzº ÌÐíyI”ŠqA„熙˜§Zꆾֶ¾j š¡O¸PÀŒ­’í“Jÿ¡4÷Ipu£–&›‡ÒZ4Æèúcð›SqIa nMãâb8Å@Ô•ùþ`2êÚöÑ)ÍÐþËûöPN3Ûí>Þ-qÃÌ?ϵÀ‚fµø¹ù´öA$Í’n¥¡ÎW øÍ‚¹1%D ª@§>stream H‰ì×ßkÕuÇñ¿¡Z˜‹ò®NÁ¶R¯¤»Ø0/ò"v!XI]¸ãtóÂ9&G½ÐµR )ÇŠlŽ~›t,ÇØ3ÒdÆædº¶:›½êȨ¨5ç9ß÷çóù>dóbç}¾¼ßï×yß½ ¸ç‹o†zz§þµ.(¾žÌHåKmêðš†t¦/WÄ¿ÜqêbyuJ¹¾±s({£ˆ0G. HÚÕÚØêmmoípër\Äì/‚ÜGÀ˜})‚Ü¿55³#ufEÅ®²D“~Я¥x zä³°®õb]/‚Ù_¹P1ûLĹŸ_8<œ¸Ÿ›/éÛ mfígµ´vµ6¶u9Ncö—‚ÜGx˜}„Ä*÷{2#Uuízßš†t¦/Ùû¥@. ÚÆÚÉjfígmiër<Àì/¹0ûƒyîççæÛŽ[µ¦E5lÞv2wõfô5EA.Àw?þ4©=¬6ÖNÖfÖ~¶®ÈÌþ}!÷ f¾s*÷'&§·'»ËM++›“­½·ïÌ,¹iëj÷jkkk'[WäfÈ}€Ù‡¿œÍýËC×k·Õd­^·ïx×%ër€ûC.ÀSuhëª{µµ‡­Ëñ³¿lä>¼ÆìÃSîç~×Ù+‰ ûUáúM‡û®Y—,¹ïhÇjÓªoµuµ{­Ëñ³ÿ€È}xŠÙ‡w<Êý_f~Û›þöñª=ªöµ·?ûyʺ"àÿ‘ ðˆöêÖw>UÇjÓjßjëZWä1fÿÁ‘ûð³xšû*[¡P(;ÙÚû]ÿ¨uEÀbÈx/ÞEÇìË_sߣ¯+ˆ-f^Ð ¥KÊëÜ︶~ÓaÕ¯WÝ«>~Ĺ÷u½RQ{@ª½ªíj]N ˜ýâZÈýĆýêXër€ÿÄìÃqº›t=Ψr?ýÁ÷U6ë³”%šÞlþlö×¼uEÀ?‘ pÙàðXí–£jÑÕëöïºd]NP˜ýRP—ªWõ`Õ·—‡®[—ü fÎÒ­ôÖîÏu7©EuCìÜ¡kH7Qá8Ò•“=™Ÿ›o9øõŠŠ]úÔ>›ÜÝö•þǺ(ĹGdGÇ ¡P^:râ»±Ô˜ýh¨“ÕÏêj=íúÆNõ¹uEˆ;f.ÐnÔ¤kHݨËH÷QÜrÿÖÔÌ+o|üð3;õž¨IþòëŠ_äÌi%îHQ”%šôƒ~µ®(˜ý(š\®>§Éa‹Ù‡9Ý>º€Ô‡zé&ŠóJ«ªk/<Šš†tvtܺ"Ĺ[§.>ùü^5a}cçPö†u91ÂìGO®>×c/¯N©ó­ËALkö`ò§/u endstream endobj 12 0 obj <>stream H‰¬W×Vòܽ?cœ‡BH PA!H/¡Òl”OExÿïêM4…¹Öš«Í¥2‰Â2.´&¶2í䘊6.™ y³¡„Å.öÿÿXžTnÔï'—ËÄ»JèÏ–¡wTf—‘©|$œg_ƒÝ¬ œ­%æ#= ñ„ÀVáoÃ"ßÅe^n3èG™dù½ÂŸå2ü*¿¹Kñf3™"øŽn¬!ÚÀ†a˜âDÅ ™ñ†¡»êæÄ=§\Ô¨¹o%†#3fnü87Æ%³ ½ÞS™6A 3ëàc>7Ü©Ÿ@x`Zàsk9Ç,æ?O¤ 4ØqÆù‚†ÝqÔkº Zlõ¾Ó¢Á°4oYbçòrnË_ZmÖím¯ÍVÆû0B9(è–s…Ê”G›³q ƒ·ÑÌœÏÈÉšÓè€sSß®¬åæ0¤™ì1$ètjëîÓó>WG•æä–êÑA\ UZªøgy…¦›ºUà"V´eÎ4¬É;ÚÏò7vF¬ñµZá ¡¢ïœ!Fº”åg}âJš’Ë"­\æ‡Õ§ÀqŸ ¯óãyòÚû Un3 ¸Eü Uì|:îu£qoâu°à¼ú¤ææˆ[oÄvèi°ó ˜nÅþˆª·TèÁÉ'`ælªçûdôÍ-1þäBU«ç<ÄãtÇ4²®·ÁcÞ(àG OnöæjÕ{ɹZ/7ÎÄÕ­]m®4ëž·£AcSXgjÊ,“US˜:s:õt‡ÖI ¹“¶ª¡±ª‡;úÅ¡­Á)}£±Æw^pBê®q$¸I¶%TH\œ©íÑÛSq•ëA×e ²¾EZÀ!egæË¶ÖÊŽNø7/—¶[ÕØ7Î7òÀ+1htn¬ëÝ…£yg1Ò  om z„V5ŸÝÛÕ<(Ì•mßôA›ºUÍ{®‹€Š =.p|pt£áåù <Ê¢WWÝJšsBƒ½–ÝFò¦ï뢇àÔ‚v®x¡—&êÉ*ÝÔÑUÔ %ž ç>KÇCBfŽ6±Ð ÄÛÁuÅÌÓö÷ÜØ§•Er@nàö<®ˆ!A|î!Y;¿5©®†«þˆ¦ý„UçÁ³ÐꇛÏvŒ*·W?l@S¾@iElÙt:ßøS4º¨—± ã¥6Tq{\Ê@4ö·•–WJ {\mœ®´aî@ýõÝ1£Щ5è̓>„%ð ±tÚ¿¾X(ó×ÍzÎ=‰æ*B•aÓý¶ïBøìÔâöx–ƒPèDð'Ò9ë6ØŒÁÁ2£Üؼ÷Èf@ɰ:Ž) 2Œ¾Ê$+ø§n¦'Cñ¨¶œaF‘¬4ÇÞ——ö¹t~ïsáÛ’µ1:,/ šxbŒ˜§€B#øÑ¬è‚ÖÆþ` ô¼ê{wiçÒ6“™s€äåà,wŒ°½ÛáïãÒ¾¾Ö~ díÇʤ&h(­;½†h8G’¹{ýH5x=ûYv¾ë1êÒu‘ùÚèÔû‘rèÇþùýhkFýà’ý}?ŸZ;§š‡Ñœßŧ¾‡²Í4×~,>|¿]¦}ÔŒ¿•êp­;õ£ EQ6§ÎíG‡#.úƒ~„(Z?žXk§ÜûQG9TýŽÃ¢å£ç£)PЏÖêFH¡³'ñ˜7õx|b£ÁféÃ#ìVdبåßÏ´§­Wñ£qê€ö[ñIÓÑbøu]üÕÑžp"\Ÿi^§ÖÔ× ÏŸ}ÀŒÐ Q€b:dY‡Í¹@žÏWè´vˆ³–³XSi­–ôU3‹‘NIƒ¹Âç’5Ó 6eŸÎI7hxa<õc*DÛš™I…N$Ãc?~tœifu`¬5ë>7± âzq•™i.º¸u#†ÉŸ Ó‚5CÐ57©PÜKÉÀ‹ŠÖ&7Ç<¶§›²’öø«³'Hh¹½òŠæ2ÇÚ¼îZÀ\§ã Eײ€¤VÅuPŒ£ãŠ忤hTó›r®¥b EÚË’žÉÜ'*Î+Á<<° Â\&«ÇuÚxOXÑBîhB¨X?Nš²á,dˆFAãêâ)¡åQÙÌä˜Ð¿oœÚ£'ç2Ì&ƒ|GKښˮàsñûÒ1Ê寛[ËÂqW¨ÊƲ.Äxô@»‰ñ#N+kBµ`Ò"* †²!bxrÉ@š#àÙÆ}Þ+¸‡”nÌÀ,SÛgZœî@´ŽÎHÐ2B+Sn”1­‘CË’FŒxe¢Ôz`Mw.Xè‘Üc†hDcb×¾eIâå[,ü.Ý1‘@*4·‰ J^T™õ~JTæWɰðˆ?ø°êŽÄnKÆ7z¹HáÝVZ`ù݉ùb¹èŠÛñåòU|Ï.'ÍE}ÞM&›O•m¿ËmêoÝÅÝÇW¯Ì4öýq™ ÇyŠü%>[«6uý¶¡²;)Ð ’Ã1ßz¾f,¾¸&Ä}HZ’j„2[|%²¯ï‚$ ©6~.70>×ú¢®ÿųl‰2lé~PbËþu“-·š Iú"Ò~‘!d‚nÎ`袃ºÎl‹TúªùÓ‚IR|+-ö/Ç’ü^ó³Lkî8œÔÜŒçyIÊÈ»ÂCéV,¥oÓÿx"ã+ O¢ŒœXDnÛ±ñ…Èfˆùï.zøVÊ~_4±A³NáÚcÝO¢x8¶ñ«ë¯\ Ý-׈I·šŽ'ƒ `°¶BAªžŠ‘K1ø jƒ*3²¯T`ÒÇ3h}4:`Õ´$«Ë›Ûhø2—Ò @᳜œ± -€È.‰TpÍÇ‹ƒÜ¶ŸevᕌϘ\‘¯dÁ³F-ûÖ»oÞV.&M*™H ¥$ÞyÍ?×ü+ŸQE¥´Ã· Ø„€OþU {`¦ªT«\ñ%u“ÿ˜2LÐwñßr›d™á2Â+¯4ËL·¸÷qþY^DàÏÁ M¯—1¡ç‹Â[B›óà?xTb™DœD·€´ìõM"E¡' ±;[p›(·ÏòœFÿÅð››IiL>ÖÙ·—ì{öZÄ$ày]qUñ“f¿'ú‹°ùE>0fôw´ù]{Õ_DÍ/ÞÓoú Öô"‚WÚ‹&‰båÊ¢oŠž)Û³I™¾/¿DÿéßGÌ/6)>cÔ ‘h‚ÛvpÅU.Äà&C±=Ë´³áÛÕZ”oëƒÁiíâ& >çPáнBà ø¤ÅÀÔÒ`ÁlqpÛãÐ/Àt]íÀícŒit—1ðÛ{ŠÊøoüð-,DW,3#ÀŒnx¢™™\Q™‹‡H™ÞSïßD¯tSŒêÓPTyxg^ðÚ–×Z[L¿ó‘öZË ÉÚÕ]òª\ÊóûBõ5i‹„6äJE¾qçŒðäר¯Ö÷h×CŸ3»¤Ú³ªMðz jyÖcÐQü7d¹™X%Qnfœ"Õ™Ù ŸIVù5øoCÿžÚöšn¯ô¥×´œùD˜{dÄÈ›fn™>ô[à W7ð¿¼ðE £·›|noc¯ÝVþc½J’èoá I9:0Ü !\"(‡È!è¨(bàÿouwN†qÝq¿ ¡CuÕ«WU¯Bü.ò‰Ë8c÷ 1$^bh°yöŽ£¡œ¯yZçñÒO H”‡ ){L2Ù.û[cA u½˜a5Ýd «±ðð#Oï‚…VBzr’€r/aeãd¤™$“¾®‹x#À"¿ÃàN1¦–  ɯú<™nÉK8Æþ å %0q4+–ÍÛ¹,çI ,´¸Õ„8­ÝDW|’¶pŸY»] 5sÓ¬Ï_«+¬Y6µMø½qÜl-@Z8î ¢¤©%p’Ï<%D3\7À~ÝÕÅ#áÀˆ6Ý=?êJ3S»€´¼•‡ŠeB ‹*¡¤å®JÆÕŸÅƒ±™}ÆSѪˆ›ÔrR/’Ï¡¹1=Cµq®}JbÏ}2oÞ®øçó\Ü”:(€ì "&½møæù.\¯†ág—{JhëÞ,mp~³qd#QVèz†§r±¹‘ê©ò]8\®˜d¶“kJ[Þ¯ú`˜ÂànÄ<ò:œ–Žl ‡ýªik¡Ò3ëÓšøgvÝ`ÒwÜ:U¦0Q ËéžTn“7"ýnjÍpû½³öÏö2Dâ4Â"zº¥Ò𲉛bQ&87…‡ó3\ža|6 Àg·N"Vxí–_#ÂÈ›"ÕMe[™LÁÏ” ŠÉw_n!OÍ…RÖ„q„7Ä[æm=¿¨ ï6h5®ãj§æT ¿ ˆlÂj ×\5×£Ox/ÂfÂÆA·®\î<…ÃäÜa!áaò©b-ààW|8ÔÇ«{ðÈCæ“àð|ÔB¥¾ÛÚ]ÀÆ¡Â꟎¸$·Ú’¦%ˆÃ)è–DnU3ç¯6è `Ð|8|AÉã÷0´• Âgm4ñ@`—ÑË»Sd ªsα>,cÅÐü¡þjà¾6àPàKüOHPö“Êà„o8×|éGò§ˆÄ€Ú¿"}× \7±!ÿ„ZØ€â€kþɆÀÕù×EŽ{Úu.ðÿ“þÍFþâÄ´pÄ­k#ùÓ@ÄS)%ƒ U»`YÛÆ¢r´ñmj¥®qmÈ?¬Aù+š´ |£F䨸ñŠÌ ›zà=‰÷Þ‹¾«…¾È‹7|Õ#Š= mº“!ù¸¤ã ÿÓ$ñ÷˜iÒ¿&Ù5 ŸJ-Ïo¢œbë7š‡iúaÉ ãÚ÷ ™ö•Õ-Òè²tâ¿(gÞ|Uûè§u+ 0M Þ Øœ]]ÃêªYdç’WñIýhA!(Œe£O‹b¬¬urOy½Â‡âpq[õšh÷4«Í϶Xª§ÃBUëäçž"?awÿ]}Ѓ#1öP6hÂåv:ÂŒ‡k¤ßk= {ÀY;9jÇëa‰—»÷e¹mj†ýÝb'¸‹"ÄŤþãfg»³¸¬yŽQ¦¹®âÕ&4ëpëå›ÌÚ²0YN ÙøC#Öäu_dd™%ê'WÑ øå‚Z¹Þ×Òû~tmNÇË—Ú&Éb¦IÃ×^Ï!a¶º ‹´èÛPËÆ$ƒØ•ž…n]~¬‹‚ÒÔÔYÔj¯Ø ¬–×J¸6«¡qÊÓ‰>¿ó«i[Ò"o Ä"8JâBµQ‚}zªÊíá’… gF]rrs-R+2%Ñ(RÄ*&…ÏüÓ{|Ð(©-•Ûñ~¿\ã-t´Z•sæð`>°4š²ÐTA™ÈnÀ/‡p âÆW!ãáu—Ãß\8ƒ«ñ2Û<ŽË~ìZ æõg xŸø9ûkÉ• =÷[E¨¯4¾Ùa(f{›{£s‘¼¯Ö²jö× ”¯WLá]+È7QB^RéÍrÅèãÆ˜ 0ÞpIì‡Aó%tœkÛ!¡nÕ&ü}cÆMÆ4BJèÔ•`p3îÌ“¨a ³l€óWšCh¯ Á­~ó¦®ðµ•î—_+#—é·^~e¥/ÈëÅ,ÔÊð¹3ˆ¦Õ¹Ñ7ƒ¼Ê=SeÔ¢ Æ_Ä09´ŽM¢ùÖ„¨Õ¦w¡vyÛZŸy;:È5G‡:ô¹*îi­{]y¸ ù1Õöœ.irÛÚ'hµà¤Ig[¶„f«¨Ls¸î狈‹¾)¸Ùµ­Õs+ó)x´DÓ}¾MA»Ù9 Í³‰ò¯tÒÎ%)€ˆÁ ¹Ñ4!µ×qy½°…Ꜳüø€€+r ÓíN7!èL)M­×4A]Œ6AŽDà9ÈÕÀýý©È(ÖZ@…–¨ rA=XuµZTiØÀV‰'H@’Öµ[4s—É"kvÓÅw-ýÞ&ʸC‘^uéòëDpSÍÞ*je“þîuP™Â$  …ódÞp…8vp‚AnËzÔ@œÂ^šYøù¤€¸ "»çð7ù"©ÌóüJzŽdtÜln‚Ô¾¼¿¥:mi,IΉG”ñkë5vïMyý²fåÇøNp ’‡Ò²ÎüÙt8«C³{1wÉ#B¸Æ©3Ò¦}hSŸ¬ƒ9Bàoªª2h€ÜF¤ÀË÷cˆP ÃpÐ2ð²EÉ a4/¬‚¨u " {Ž‚HÉíe©„ µÓ;A;á›PMº/PËÕ~.€° àþ ÅØ»ÈÁ5ßY" ! þvº6Â/ë7Ò€e)â|•&¥3xH{ņßÿð5,:©RÂåéÜçhSªÞU UqK†¥Ô¼e©*Ð…Ø¡Á6I³QŒû|±þ¼¬Þm†¯I4k®Ül’t O­ßIüs‘Ì6 qXÄqø`bô¿£¼“hÈ#@¯má1Ÿ u‰Û-1­%éãÔZ“YW£Åâ·éŽüx¯=i…nè<ïø\Uù}îðþƒzlIh³éþ³²r$úžJîì;HF[¿ƒGbUÌnxá~‡£ñ½oÞ‹îYÒð‘ÇÒ³çúžLZ²ÒüÕM6e0 d©¯ñÕ·mתvnog€a @ë74^]×H¥çÒ2‹ÇZZøù'¼u.áÔ *vQx(äj4÷¶‡Ç‰*]½ªXcÀ¸Ž#øº;#Â0u“äV¸_¶Ð{ î6Ô¯i-„mV¨§fôA·Ã\¨ —|ÔG/s!%Æ{öŒu®,°©ÙátXö˜wÁ¦ÒšÜ–!ñ…9ø¾™Ðc®•d%8*'h*j¡»bfð’šøwë´þJ!*àSE`#«4|…&Dbv­k©¿{†Â¿-|®ªR89·Éýbº¹ÞÌgó¥ Òêâ䓜*©js9Yå7Óéíôë.»ï_§Ë-j“S7™R)ÌNÇ«ÉÔæ¥—01Ý“vy½éùߨý>‹¯dŸ"…—âi#>Ì>)í€,p‚¿çDù¬Çp0Ä8áê>cþdƒ'‰óì£7œ·ÚÎr¢Rõ)r¼Ã›ƒiÝhÄú(I'ëûó×û˜8ȯB-¿29 apÌf£ÅG)ïúê¸çV c-)¿ºÜå6÷ ŒÞÛ|<“`Øí.‡ï9¬»äîæ÷è P•6ç½ëåÀüV›ãÅ¡=¼Äå‚Sþ8îêqÂ|¡qâ²þÈyÆRé“ÓÔë"µ¦Âd˜¤™´=88†bnèx}$ýZL'H–Á´D´f"é™V4Ó²ÈS–£ŽFE7¥¥OªÝK†Z²“‘$Ü‘Ì/™´dñªxÓÔ®2áù¨!ˆZžËö^-‰ÇX2˜Å*š!ËKŒ »ï% AE±ù‚¾ ìÑ…¤‡­ø=öôB^´B 1lB})Td½Z®¬4½±€1`Ÿaë&!ÒŠôºY+aÅ7`·7R¦V‘hâD¦ÖÀi~¤Â2ÁÇ6Õ y³”è IÐ p§DnŽÉ¨ú©@)c(ñ™ö„§Ìóyþ:½Ÿ†d’û%¼†h#~™ ž¨‰†ü–>8æÏU6•7ˆï ó*¯S·©eË¢ªhcaÜžcÅ­ßÙ€½äQÅË41ÚÖG ‰ö/$2ô×Ð~G{Dý†ôDa†„Æ b%Ë^:TÒ–üÓ% zD ÙOª€Y °ñXê.±¦Õ° 9¯¸}£8 Å!Ô>Zös)2ʺIÒ }³Öß‚‰;Øà¼"ïxLÙþÎ 0íwÚœ¿±M2•!Ã!°tV’>®&¹®>•f$´³xÍKâ%ÏÛ;‚QϨ‡pIBF~À wWe£ßê šz'×B‚•Æ”–aiqa4 µd…yVzc”•³—±•BêÙIUvM9§mÆP7ñP/ʘŽbÐm=ƒÎ…Å5(}™¸n’lo\&(T`zá‘R]DàÝP8r½ "»ÍÆ·­Ã%?ÅŒK®lqO„½ðž¾ì‡ËxÌ5ƒ*nÇoMµ¤­Ü)PL½*ç2»ÙÄW´ìXÍo³‰‰U(IÞ‹>>Òñ[-öÎO9gÚ‘5Œ] È1i™Ñ¡æÛÕ$ci= ±IkÁêRžkÍáˆ ÔØ»ûbìu6òüzé±H’L„Œ}Ýñ€ðˆéÁ‘ˆxb¯ %9´QpJ‹æ>Z¨Ð¥ý î#}m†cÜÉ–{éäɃŒ@«¶"2O<,¬ØPIîÁº~Û{¸‡½Š§ÚõSÇ×Uäv4§c]™û>stream H‰ì×ÿKUwÇñ¿aÍQAÐ(XôCé&8’¾üàfcá,f¶B´ ZLR“œ-§…VR6²/“Úͱ-[sÉm[éÖÊÒÝ&¢ÃÂ0ÔòªÕžëlƒÁª«÷zßçœûzpè§7çóy÷}=|(2f¡ŽÞŒ¥UÏÌ-äIËÞÓÖÞc=‘+|væ—ç_þw2)¹ð­÷NÜ鲞HË—ß¶sýøk=ˆ$œæ‹¿;K!5kWcó ëq޲o…ÛÎçåsÿIõ8’p”}1AÇ¡éÐw¸~ÓÓKi@Ö¹Kxx´ ¼ñ¹‹y?Sæ•TÖ­'’¢½ ñ×ÙÝ—»±ÞÙ»]àh=Q"Rö qç¹ùÜŽ`å†OI„õD’@”}‰?Ú ‡‹Gß¡õhï?Îí¾»¯åæEñ¼°ð£sÁõD’´$žî ïüz꣥_à»g=QâRöÍqÿI§@"ÈÅÀ`Øz"IʾÄÓ7ßýJ¯q Î’¼ÃÚû‘h½ÚõÒ+;—–¹â@gwŸõDâsÚ 7Ç®Ìɬà¾e­<øóõ?¬ÇItʾKÁY2b=ŽøŸ²/ñA‹¡Ë8¥†vCDZžÈcžh™–¶·÷lJÑ»[Nß±žH|K{Aâ€_¼‹ßÜçüâ­ÿâªõ8òeßUÈéàDHÊmÝÖ㈟)û2Ñh.ë OÓb¸i4ššã-ÖyorCÉçIÿ¼É}u­'Ò^ Õs«?¿ à|ǶWçËf=‘üMÙwÒAFH çBjÈŽõDâOʾL(:‹ó£ÅÐe´÷£×ÙÝ—¹â¯”gNfEëÕ.ë‰Äo´d‚„‡G+k‚ÎRÈÝXÏ×Ìz"ùeßH yáhÈNùþfrd=‘ø²/„ž27³Â©-ôíýØ ¶tÌ^\î¼ÞìUµ=·ú­'ÿÐ^‰8{-5kWkáÕ-Wº¬Ç‘ÿ¡ì»©!;9"MÖ㈯(ûstŠSUè,4ë‰|«²&8e^ ï9)¥¨ ¼1<D²¬ÇŸPö%†è#´º —ŠžB[±žÈÿÃk6Ÿš”\È;Ÿž^Z¸l=‘xžö‚ÄÊí¾»ë‹X “S·nùø,ß+ë‰äI”}O G¤‰L‘,òEʬ'ÏSö%Vh"ô®Ýdõ¦“Úûñêè]SÍËçIËÞÓÖÞc=‘x˜ö‚DoôþƒýG/͘_Æ]Z¾îß(ë‰äé”}!S$‹óâ§Y#qÖ‰‡)û=ÚÄ)#´í}+yfF™s9kÜ鲞H2ø~ÙWäÑz"ñe_Æ CËpêFÎÚ#ÚûîÔÖÞ“–½Ç9¦9Õ¡Ž^ë‰Ä´d¬jë[g-ÚÁµyýO®‡nZ#ã¤ì{é#ƒ"y$•Öãˆg(û2&t š…S1è4ë‰ä)ê—§§—r^“’ Wo:90¶žHÜN{A"×r¥+ci&5kWàì5ëq$*ʾ?DòÈQ’Í~ê´G<@Ù—Ñ#Öl>E§àÂÐ/hÖI¤ÂãåI)EœÝ”y%•5Aë‰ÄÕ´$Ý}¹ë¹*ÓÒ¶í>tïŒõD-eß7È#©$›(9%­Ö‰«)û =‚«B§ Yhï{QÏ­þìUµ"ÏìÅåÁ–ë‰Ä¥´äÉî l¯:?õÑRÈ/ðm±žHbCÙ÷²IB9SÒZº·‰äZO$.¥ìË“ÑèN‰ M$èÞÿS€âî endstream endobj 13 0 obj <>stream H‰ìÁ€ÿ«ë jw—ò endstream endobj 14 0 obj <>stream H‰ìÁ€ÿ«ë jw—ò endstream endobj 15 0 obj <>stream H‰ìÁ€ÿ«ë jw—ò endstream endobj 16 0 obj <>stream H‰ìÁ€ÿ«ë jw—ò endstream endobj 17 0 obj <>stream H‰ìÕ¡€0DÁh„"é K( ày1¸y$/âfÄêu¿VÈë-ßy=mg†Ó}¢ý¸—uk;û0œîéä¡ûDºyè~¿D9ø1 endstream endobj 238 0 obj <>stream H‰ìÕ± ÂÁX„!Ù*-c°L ü:BÈw…kwžüƒãùºÝŸýõàët€ÒØ¡û”.ÀÝ tvè>¥ °C÷(]€º@éìÐ}J`‡îPº;t€ÒØ¡û”.ÀÝ tvè>¥ °C÷(]€º@éìÐ}J`‡îPº;t€ÒØ¡û”.\ó`'‹§ endstream endobj 239 0 obj <>stream H‰ìÕ1A A$®¾EfÊÌæv‹Ôéî<àÿÏ×íþøì·ðt:t€¥ Сû,]€Ý`étè>K C÷XººÀÒèÐ}–.@‡î°t:t€¥ Сû,]€Ý`étè>K C÷XººÀÒèÐ}–.@‡î°t:t€¥ ÀÕ[€?3 endstream endobj 240 0 obj <>stream H‰ìÕ1ÂA A$®h#3 å;Ãí_wç ü«÷ñy<_ß½û?A C÷XººÀÒèÐ}–.@‡î°t:t€¥ Сû,]€Ý`étè>K C÷XººÀÒèÐ}–.@‡î°t:t€¥ Сû,]€Ý`étè>K C÷Xº@É%Àš3 endstream endobj 241 0 obj <>stream H‰ìÕ¡ƒPDÑh$EÒUlˆÂ¤€ø È­€ÏdÏO?³s÷½Ûóõ™óyG?À-èôÐ}’.@Ý éôÐ}’.@Ý éôÐ}’.@Ý éôÐ}’.@Ý éôÐ}’.@Ý éôÐ}’.@Ý éôÐ}’.@Ý éôÐ}’.@§ßº½—ïyG?\J÷Hºl:Ù>I “íC'Ûÿo‡äþƒÚ endstream endobj 242 0 obj <>stream H‰ìÕ¡ÁH„ Éê-ã\ûŠšnqúÌÔž'À5Çóu»?>÷×_¥}hÒ>Ë.@“ö¡Iû,»MÚ‡&í°ì4iš´À² Ф}hÒ>Ë.@“ö¡Iû,»MÚ‡&í°ì4iš´À² Ф}hÒ>Ë.@“ö¡Iû,»MÚ‡&í°ì4iš´À² Ф}hÒ>Ë.@“ö¡Iû,»MÚ‡&í°ì4iš´À² Ф}hÒ>Ë.@“ö¡IûÀ¿z 0Ð/O[ endstream endobj 243 0 obj <>stream H‰ìÕ1A A$®>EfÂ5ð@Õt_2µçÉŽçëv|JûФ}–]€&íC“öXvš´MÚ`ÙhÒ>4i€e IûФ}–]€&íC“öXvš´MÚ`ÙhÒ>4i€e IûФ}–]€&íC“öXvš´MÚ`ÙhÒ>4i€e IûФ}–]€&íC“öXvš´MÚ`ÙhÒ>4i€e IûФ}–]€&íC“öXvá?¼§¸KÏ endstream endobj 244 0 obj <>stream H‰ìÕ1QA A$®H‘™;ÂQð º*Øx“~s]pÖûó}<_¿ûïG€£´À² Ф}hÒ>Ë.@“ö¡Iû,»MÚ‡&í°ì4iš´À² Ф}hÒ>Ë.@“ö¡Iû,»MÚ‡&í°ì4iš´À² Ф}hÒ>Ë.@“ö¡Iû,»MÚ‡&í°ì4iš´À² Ф}hÒ>Ë.@“ö¡Iû,»MÚ‡&í°ì4iš´À² Ф}hÒ>Ë.@ÓÉöoÒKÏ endstream endobj 245 0 obj <>stream H‰ìÕ± ÂÁh„"éÊ)eÐŒ!¼,aig‚?YÝywq¼?çëwÿý·` IûФ}–]€&íC“öXvš´MÚ`ÙhÒ>4i€e IûФ}–]€&íC“öXvš´MÚ`ÙhÒ>4i€e IûФ}–]€&íC“öXvš´MÚ`ÙhÒ>4i€e IûФ}–]€&íC“öXvš´MÚ`ÙhÒ>4i€e IûФ}–]€&íÃ5¾ ~ŸO[ endstream endobj 246 0 obj <>stream H‰ìÕ¡ÁH„ Éê-ã\û ¨é§ÏLíyþ—ãùºÝŸûíGø vš´MÚ`ÙhÒ>4i€e IûФ}–]€&íC“öXvš´MÚ`ÙhÒ>4i€e IûФ}–]€&íC“öXvš´MÚ`ÙhÒ>4i€e IûФ}–]€&íC“öXvš´MÚ`ÙhÒ>4i€e IûФ}–]€&íC“öXvš´MÚ`ÙhÒ>4iŸ+Þ *KÏ endstream endobj 247 0 obj <>stream H‰ìÕ± ÂÁh„"éÊ)eÐŒArr€ÄβºóþÝñ|ÝîÏýõ#ÀWiš´À² Ф}hÒ>Ë.@“ö¡Iû,»MÚ‡&í°ì4iš´À² Ф}hÒ>Ë.@“ö¡Iû,»MÚ‡&í°ì4iš´À² Ф}hÒ>Ë.@“ö¡Iû,»MÚ‡&í°ì4iš´À² Ф}hÒ>Ë.@“ö¡Iû,»MÚ‡&í°ì4iš´À² Ф}hÒ>Àå-Àò+O[ endstream endobj 48 0 obj <>stream H‰ì—ýO•uÆÿ†§6‹V›n5a4ÄåB*Öà{q66mº™si¹©ek“xðDj†,†„‘bŽo–ïÓ’`)¾“¦8t†(jŸx–sjEzιŸçúìÙÙà§k»ï뺯ïµkž¡ñpÛ„”u÷MÈäK™]ÜÚÞe­H¸Ž¯¿=Îzðk-D¸‘òš¦ñƒò̬âCͧ­åˆP"ï{|Š[™,ÎÅ¿Ör„‘÷Å?ÁK÷‚óp CxGX+!£¨¬~LÂ*&“µ,PÛÛwÙZ‘pº â¶Ð*Óæ–¨UzyßÃàYœË|Ÿ}y#^¶–#Ü…¼/n…×o^ ì¯ÞÖŠDèaÊ‹3«‡ÿ=åå ÖŠ„[Ð]7q¶³gQF[1:>“¿—ô°V$‚¼ïmp.þÅÅLGwœí¶V$Ü‚¼/n¢dk¯¶‚—ÂëïTëî{›Öö®”ÙÅŒ›/65¯ñp›µ"aNÿ¥üOöG'Y‰yË+H kE"ŒÈû~ãe¯q7·V$ì‘÷Åux ð"pž¼t÷ýÃÞï›´Úýsó7wv]´V$,Ñ]ì@\Úz–aêŒÂý¿ZËaGÞ÷8_3n<^»çgk9Ây_ýÿùù›çï‚=ûZ¬ >ظoT|€1);cíÎþKÖŠ„ º ¢¹åÌ‹ JYƒqÓÖlªh´–#"„¼ï7p7gèø×[ËfÈû>‡ÎOó§ÿ³¼xX+–œïtë°‰™ìCtb°rÇQkEÂÝ?C¼ü**&kdÜÊ·s·ó§µ"9ä}‚Çq:~Çõoäl“åý‰¼ïghûMy— ÿó P‡–Sç¦Î(d1ø¦xäx‡µ"QtüÉÀ•«}öãÃOä2ýô×ÊÈkE"ÒÈû¾¿ãz¦O¤µ"Qä}Bçç;…Ÿæ¯»/n¥rÇÑG¦æ:K2géÖóÝ}ÖŠD„Ð]ð!uõ'§¼PÀÜ9 ;ëNXË6Èû>ï;å_2ÁZŽˆò¾ß ÕÓí‡Mü«äÓöéüÖŠ„{¸r5'ïˆIÙlËȸ•Á‚oøµ(vt|EË©s³ÎÄ£ƒ…[Èã~FÞ$9@° $ù`­HDyß?àqú<­ž‰Óðéùºûb(tv]œùꧬ ߨ¤Õ;ëNX+áEwÁ'\èéÏÎÛ=:>“µ$»§[+ÆÈûÂ4 HJ#)AVX+áEÞ÷ txš¼SééöºûâÿräxG\Úzg…žœ¹áäo¿[+áBwÁ”~ñÓ¸iktÚÜ’æ–3Ör„+÷Å ä+AVlªh´–#ˆ¼ïyèíI/mpj|lj­ÞZ‘¸‡)«:d—†Çd-\Qy¡§ßZ‘=º Þ¦¡©-9½ˆÇ¥­¯ÚuÌZŽpò¾¸R‚¬`1È ÒÃZŽ ò¾‡¡«ÓØé팘O“·V$¼@ÿ¥7s¶E îÕ¨ø@AéÖŠDˆÑ]ð*g»ç-¯`¸cV½Wø^¶V$Ü…¼/n YAb¬ÒÞñ‡µ"bä}¯R¸å]áÒÛ—ju÷Eh¡XNe Æ÷ØÓïïk8e­H„ ÝïÑÛwùz[”Q…­ 7"ï‹Ü =Ø’„n\¶Ô9kÙ¼î‚ǨÚul|Ê:fšœ^ÔÐÔf-G¸y_ü'dIž*_n?j-G„yßKÐÆÓæ–8圖NW·V$|AQYýýç°uQ1Y˵½}—­‰»BwÁ3j>í…GŸZ[^Ód-G¸y_ ò„Ta[HrÆZޏ[ä}o@§‡ÓÆ™&Íœ~n­Hø‹ =ý WTÜÀ&¯*«:h­HÜ9º  ³ëâ’ìæ8:>·‡Z+÷ò¾:¤ ÙB°3‹3«ÉkEâΑ÷=ÝûÁÉAæH§“ëî +ZÛ»’Ó‹XE¾ØÔ¼ÆÃmÖŠÄPøS€„ûö endstream endobj 49 0 obj <>stream H‰ìÖýk•uÆñ¿!u™J Eù0GËp¥&®X¤Œ$…™…1ƒLÒгÕ8ÎYÛ˜Ì ÊœN¢6 ŽBypØœe> Ýб¶ÐÜ82·vÖQ{Ï;m©›î|îûÜ׋ƒœùÓ‡óý~®ïuýúíöütæ‘gWñïuñ hO¬xKÍÈÉyâüìÊæÖˆõDâÚ}é/†œáÚ9$ùc=‘ „vßÓŽžh™8³ä3í­2½ûâ¡pØ©ùεÌÌÚÖ鲞HúGï‚w±}©%_ÚìÒpíyëqÄc´û20¤ ™ÃåIy½˜²GúM»ïQtlš¶S¹éÞÚ>q›‚òððäîgÒ„ÀÊ‚Pìê5ë‰ä~é]ð¢³ç.ÍZ´•ƒ5%¸©²Îzñ$í¾<’‡üá ‘Eõ­Ç‘~Ðî{½úÓu!:6GßÎßpÐz"‘¾]îè^°tçq«¸«£Ó‚UûNYO$÷Eï‚·°h˃{yøð…?­'¯ÒîËRy”vß[hÔôjŽŒŽMÓÖ¢‰û=w)5£„Kˇ/MmÖÉ=è]ðM•u£¦ô> ³me׬ÇoÓîËCA‘HÜ%Ò©|ûëqäÞ´û^A‹~þ[¥º¾ñ¢õD"ýPµïÔè´ÞÖ:dܪKw^îè¶žHþ—ÞOמO›]꼡pƒõ8’´ûò‘K¤7Ф"¯¬Ç‘»Ñî»Í™þL‹æ¤hÔôjë‰D"Ú[YJšà&OÎùrã!뉤oz\®¹52?»’399¯xK ›e=‘$í¾<\¤ERq¯æ.ÙAvYO$}Óî»™æÌÑ¢éÒz÷ÅëÚ#]™YÛ¸Ò|ÆLÍ…¬'’;é]p­+Ñ@á)¹Pv`Ûd=‘$í¾ ’мâj‘]$9f=‘ÜI»ïZôdÚ²S›éÏz÷%‘=Ñ2qf¡s½g¼]ÞܱžHnÑ»àN•»Ž?õrG“¾póoõX# H»/ƒ‡Ô"»¸`c§­%ͬǑÛh÷]ˆnLCvª2™æl=‘È ¨¨>öDêçÜó¡ãW/^Qu¥3j=‘ôÒ»à6uÇ[¦Ï)ãPžyå‹êý§­Ç‘„¥Ý—ÁF‚‘c\32d³Gþ¥Ýwú0­˜n̡ГiËÖ‰ ®¿ºÿþ0÷‡a7îüãÏ}VVQk=‘è]p‘ v¼·²ÚyÖ”d_¬'’D¦Ý—8 ÇH32Ë–õÉ÷¤œõD¢Ýwš°³tc²Þ}ñžƒWçmäòóyzƺÿ4[OäkzÜ Ú»Y™Þùè[U&‰í¾Ä ™F²qßH9²N¥×–vß jýNvÊ0­Xï¾øÓ¡º¦›‹ñîWZ+zÌUï?œ^Ä)LŸSVw¼Åzñ í¾ÄùFÊqëH\{Þzñ5í¾¸IHrÉFÒz_ÐîÇ =–6ëÔZú­n¸È}Š]½–·þÇáÉ9ìNÒ„ßùë¡™Þ…øhlj›ó~?õ¨)ÁòíGt«Åœv_\‚<$ÉF.$å™´´ž(Ái÷ãÀi³N ðSÓiÕfEàrG÷¼v°D|F§«ö²ž(aé]l\æåÁ½<ÃÆ¯^–·›?­'Jdÿ0½ endstream endobj 50 0 obj <>stream H‰ì×ÿK•wÆñ¿aΨ j›?mÚÄ!Bά 3(c‹UÄ8Z¬±‘ÌoKt¶YÖ苲,Ö—u‚œÛ¬ÜjÅ‘Q ›¹DvXNth(ŠZ³Ú»=ÐÆÊ4Ï9ÝÏóx½8HÛO7>Ÿë¾žÛ·eªêjì™|þZ"rÇàÐè%ßÇ'ÌN.ú°ô$ÿi=‘oéíÇÚ‰S¿-L/åù­z÷ˆ.³H$ZÛ{R³w9*#gO¨£Ïz"Ò^ˆ©š@sBf9'¼|ýÁ¶P¯õ8"ÿÒÛ"'IKnæ“Ï—‘ŸÖãø“Þ~ìÐTé«Nq¥ÁÒc­'ñ‰ãõ­óÓJxYq‰ùo¾÷õðHØz"_Ñ^ˆ‘Ææ?ÓWìæl“³vèxÅ…ôöŵ¸–$'÷“=áŠõ8~£· ´ÓÕ›ŽÑT9[Z+ÝÕz"¿ çm;=kQ!¯lNJqEuÐz"ÿÐ^ˆºÎî5›ÎF¨ÜßÈíµžHä>ôöÅÍHNò“å–’¨äªõDþ¡·uôRÚ)§JS¥¯jï‹ÄÎÕþ‘ìµ5<7~O-ùôÜ…+ÖùöB]½ñI噹ÿ,… yµÜXë‰D&t¼¾•‹Ê_ëAD&DŠ’¥\Trµpûd¬õD~ ½EtÑ„Ìr§šÒQµ÷EæK]Ͼ²ÝyzKWUuvXOämÚ Ñr´®å饟s˜Y«¿üµí/ëqD&±uç®+­™‰J®r]ÉX’ÖzÏÓÞ ú'-Ô©£ôRÚ©õD"3ÎÞCæ¥nå >žT°±°îúè 뉼J{!rt•WV©«ˆ·è{P¼…t%c¹´/¼¾—ÔµÇô÷#Dç¤yÒ?9Fº(Ôz"‘™‹÷¸©ø[½Çi/D¢çêІ¼ZpnJqÙîsÜIë‰D¦J߃â9d,IKÞruÉ^Øz"OÒÞm“ÎÉÒ?i¡Úû"nÐÙ=°tU“_âKÍ—º¬'òí…é Wîot–šÍî¡õD"G߃âQä-©Ëí%+ªƒ¤±õD£½?=4̤—+œÂIóÔÞq›`SGBf¹óH³×Öô\²žÈ3´¦¡¶árrÖÎ-}Å.ëqD¦C߃âid/ Ì&Édëq¼D{ÿaÑ*é–NɤmÒ9­'‘ UTç¤óZg-*ÌÛv:<6n=‘h/<”¶PïòõPh¶Gdúô=(>@“ÆÜäeëÏÖãxƒöþÔÑ$é“´JNŒ†IÏ´žHD&7<~ëý@\b>/w~ZÉѺë‰ÜN{aЇF7ÖÅ'ÌN.ÚR~Š›f=‘HDô=(þ@“É$3ùLJ÷\³žÈí´÷§èØw—h’œ­’n©½/â-¡Ž¾Œœ=>stream H‰ì—ÿkUuÇÿ†t¢ÂH2Ò¤¼ºs¥¡CL¼‘b Ù‚¤/.¼ó²µi¶i«µ›-Wʰ ¥tJè˜ÄÚP7uÈ„‰m²$›M÷]×KIé¾Ü{Ÿ{Îy¿8Œí·÷gç|ž×ûãc`p¸ ´>1%ç±g¶¯ßZuµ³Û:‘%?ž¼ÄÿŸÖA,á{˜–æÿ½Ÿ”/Ä:‘€®ë=+ߨÇ(à™³tw}ãëD6øÜ }ýCùŧœ’°)«†¯Â:‘1"çÓŸøìùiDˆÁ„gÎóÙ3ó™üÌëD6øÜûô=ZŸSÿèò¾¢©¥ãÁXxqmigן։bŸ½PõCËÓË>áøié%çZ¯YÇ"¦hþ„iÏÌçãgþcë8øÖût<šžSùè~4@ëDBˆ8¢¤²!1%‡ùm éë²N;üéú@0£Ìé7[ÇÂíƒÂÏ0ù™ÿ\\€¬ãÄzŸ^G»£ãqpú­Ï:‘"aVlÜV=ùïYQqèŒu¢á7/ÜèîÝ”Uѧ'‡³ OðÞ­ aƒöAás˜ÿXpðv°N#üæ}½Ž#Óñhzò¾âá\íì^¶ö+†Ïü…M-Ö‰¢Ž¼008¼·üôŒÔ\λ~kïÚ:‘–hbä¾÷1w;àLa(êøÇû´8ºœSêhwò¾bôÔÖµÍZ¼Ó «ßúæFw¯u¢(â/ðN“‚{8é¢ÕÅu íÖq„°Gû À Ø)ð…uœèâïÓÜèoN‘£Ñyþ !¢DAiý´gw0I¦ÌËÎú¸v`pØ:QTð¼Z/ÿ¶jCgœ¹0o_U“u!âíƒBü ñÔ ùÜ ¬;¬ãD o{Ÿ¶Fg£¹qÆ©I;èrÖ‰„îæfOÿºÍ'ÍÝÎTyâùª]°Ny<ì^ß{yG!ŒÀ/üiHˆ8Bû ÿÅÖÀ^‡‡½OO£­q:šýÍ“¯OaÂå+¿?÷ÊgŒž”•Eç/uY'Š$žôÂð»_~ûËÌ…ymÕ† Þ u"!âíƒBüXcMæ~.Á&8Å:Q$ñ¤÷éf44§ª-x¹HÞBDƒêcž\to¿˜4wûºÍoöô['Š ÞóB]Cû¢ÕÅ 5ÔÖµYÇ"NÑ>(ÄÃÁ ΊS0‹uœˆá1ïÓÇhet3EO£­Y'Bx™á;wC'¦ÌËfæLMÚ‘÷ùIëDÀK^hÿõ×ÞþŽãÌHÍÝ[~š÷eHˆøEû }ý3Ná²à,c(xÉû41úÇ¡›}¸»VÞBĆݽk2÷3|xf-ÞY[×fhBxà ·ndž˜žN„ÞÉ>Ì;²N$D¼£}PˆQ‚S0 ~Á2¸ãX'šÞð>í‹æ”1Z™¼/„ˆ=g.tÎ_Qè ¢Å¯~qµ³Û:Ñ8ñ€*kÎÎ^²‹S3Êε^³Ž#„;Ð>(Ę8© Ëpk0Þ±Ž3~Üî}½Ë)`4±¦–ëDB_ƒf¤æ2‘&B·Uߺ=`hÌ¸Ú Íié%ä,/¨9~Ñ:ŽnBû ã×$÷pw°²Ž3Üë}Z]‹ÆEþÇäÒÁ¬ !Ä=úú‡¶„$ÜŸNÓ“Ã%• ։ƆK½Ðu½çÍw‘<1%'¿øoÁ:‘.Cû ããàìà ÂDøÈ:ÑØp©÷éW´,’Ó¸è]ò¾"Þ@/½^Θ♳tw}ãëD£Åu^p»ˆ…ˆ´ 1°Oæßs‰ðVrÑzâ:ïÓ©hVNÅ f”ÉûBˆxæŸ#‹õÐ#Ë]^¨9~1°¼€Àié%ÍÖq„p1Ú…˜8˜q•p†²Ž3*\ä}zmÊ©Uô+Z–u"!„%• Ó’ÃÌ®„@hKøH_ÿu¢‡á/œk½Ì(#êì%»*kÎZÇÂõh"R8ÜŒ›¸Px [YÇyñêý¿ˆxó` endstream endobj 52 0 obj <>stream H‰ì×ÿOWUÇñ¿!ĉ[¥›­õ”XŒ”E®øAW¬ápnºéú276ekËé‚LDäuŠ$Ñ„p…HYŸá Å™@ÌÁ‚‘:èc(ò¥§]3+Ù,î½çòáõØg¬~9çíÝÎy½ÎÄÄ=nÝJÏ>™ùÐÓaÑÙÅ}7!"2­\¿1œº¥jÖ÷XxlNyõÓMꋯ/1$M2©þÀàF_ ¡07:Û—_Ï·5=‘H0ضç+Î>M" È&Šœ"­È,’ËôD“ò~îÓšèN I¢M)÷Edúêî įÜË…ÆoѲü‹m¿˜žè>¼œ £cã…‡ÎX¡°:íXçO¿šžH$xè=(b;rŸ´âd‘\ä)fz¢ûðrîÓ”èKVq¢A)÷E$8ÔùÛÄï´.·äõGúƒ¦'úÏæß-&±ˆÙâVû;M#lôq™Erq¾H1²Ìô8ÿäÍܧÑ‘¬²Dkòàw™¢œNωÊâ–›½Ð—UðåèØ¸é‰îð`.ttõ%¥”1Õ¼%¹ûŽžõη &zŠ8Šü"Å8e$¹fzœ¿x-÷Iyz툩hJô%很«kCk7U„DdpãÍË­:Ùjz¢Û<• |¢wrk‰ƒÐÈLþƒÿ5=‘HÐÒ{PÄiwCŸwBÍS¹O¢1툎ä‘O$"⨖K½1‰E\}ü'}ØÑÕgvïäBieÓ¼%·C!)¥¬­ãŠéqD‚œÞƒ"î ÑÈ5ŽGÒ™Ç+¹Oÿ¡Yuˆ^D;2;ˆˆËªN¶>ºx;w`HDÆÚM׆LMâ…\ð7vÆ­(fŒ¨åuþvƒ“ˆÌzЏ‰t‹~¹CGÞ‘z'1žûtšý‡1yn;ÈÔ$""f ŒnÍ«›½ÐÇ}öLÖî FÆ0› Ý=uéŸ0@xlNá¡3|#cˆÌ@zЏŒŒ#éÈ;ŽÙGÃlîÓvè< @ÿ¡)÷EDúƒI)e\ŒüÄï¬ó·»<€©\¸~cØ—_?7:›Ý7l­æ;¸<€È §÷ ˆä]ZÆgœ>$ ]ÀTîÓpè9VáyõÍÃÊ}‘{55_^´,ߺ$Öìïî ¸¶µ‘\ø¸æâS ï³ïòu¿oûÙÍ­EÄ¢÷ ˆAd È$ ÉD7·v?÷i5t«äÐvè<®m-"2½þôüÃ1Û¸-gEf¦n©º9tË…M]Î…ó-=KW•X Xùy³;›ŠÈ¿é=(bÜñÚVÒ“H2’îlêfîÓdè3´v¤á¬8ç¦""Ó7gzö‰Ð?oÎ’òF§wt-z¯lØZmý»vãÎkWD&£÷ ˆ†d"ÉÈy$%ÉJ§wt-÷é0Ö¿‹VC·Q<¸žÞßÖìç å÷äK»šš/;·— ¹0<2š·Ïo…ÂëoWv÷œÛKDÞƒ"ÞAî“I²’Ä$7Û˅ܧ·Ð^¬CŸQü? 纞xñÎušøFiïÕ'vq:ªOýµ¼€-âWî=wÑÁ‡­ˆü'zŠx )¹tU “Ü$=ÚÅÑܧ«ÐX¬êòøÒ<šŒ»ˆˆÌ(»4„Egs¯†FfnÞQ;<2jïúÎåB[Ç•W^;Äâ½ð^ie“íë‹ÈTè=(âM$&¹Éñ$CIRÛ×w(÷é'´º ‹Ó[h/ö®/"2“]¿1œº¥*$"ƒ;6<6§¼ú‚‹;‘ ýÁ¾BaNTÖ»»N1¿‹‹ˆ-ôñ,rÓ—_O†’¤ä)©jãâNä>Í„~²t•·6W8¡£«ïùä½\¶üžMÜÓr©×–eíͅѱñ}GÏZ¡°:í3Û²¬ˆØNïA#CIRÎ)©J¶’°¶,koîÓFè$V9¡¥(÷EDœVçoŸ—k]¼Éëô§¸ ¹Àl1‰E¬ÆßÓßþ8õEÄ9zŠL þÆÎ»ÙJÎN}A»rŸB± ÍÄ®¦HPú]€e!ô÷ endstream endobj 53 0 obj <>stream H‰ì×ÿK]uÇñ¿¡épk¡`þÔ¼Ël"$f„L¤…E[ŒÚ¬±dxýv“¹æ´L—’6r®d*—_ ­É–ÊTº‘‰†Š¡¨ÌëÜìÕˆ5w½_¼÷tï}>¸\®çÞsüürÎóýY^6ÒÒÝ{¶²Žˆ˜ÜGvfë]ŸuÄ㫵té:z÷fIöá©ôŒ:]ç±g ?¿ð³7ëàŸ´ëžÕ»Ù °UUmUauϪ¶j®7Wó¾û;‡<33»ðê;ô(Öëñ„¦¶AÏ®ãeææ' /+ákfN£VåÙuøûA °¨°Çó›U[5WåU=»Ž—Ý×¼¡©Ã?^9ZK÷À\ýCãq{?5ˉiöá)w¯àMjê{¢’Štú¾#çì\€YØHµUsu󪿪°Wð¸ûš14i#‡fM üw€/\l쌷éù¼):ûðû—ææ®ŸëY®ÞIH-׉1)% Wn¹¹^æc?®¦¶AõW·°Z¬"»u®Ý×\¡éB3†NÔ¼QÛpÓÍõ|α¸”uºuó®=«·ÄæWu¹x¢»]›>t¢^§l+(­îÖÿõtÉÌÄ~hê¯*¬Ý™nduYuvñDw»¯‰Bs…N ·X5iÐ}ø?ŸœÝ{¸Fm½¢’Šº®¯{Šë]¸½pÇVÖ±õ~Žf5èmÄ’˜ƒý ÔbY÷²ê¬F«Ôëžâz÷5Eh–0† MtEOßhô ÅÆ<ù@åÈØ´“»Ø…‹½O$ŸÑ/ŸO¯üeàÏ ]/°‚†º¼ç`•îh•Z½vþcWº¯ÉAóƒ1HìL>£¹bC× ð‡sµ×¶ÇèIf±¾—×t{áΚ?[· nU@ `?5Z¥Ö}­j«Ýû™óîkZÐÌ ÉA¿Ñ¡YÂgëøœžê™9ΟêNº0>9{4«AßnÍË/mØŽ@ b?•ÚVÖ¡jëîVÁÕñã¤ûš4-è[MÙßÑ}#cÓÉ*õx×ëÉÏöô®þvÍ.8—J«»#ãmúêЉz]Á¿Kàsì`¥j«ÝºÁÕqÕ\M_ýíšÝ×l  Á43Ð}>?\û}dz§ŒGýËo~9ù×¼qüÁ.4µ Ƥ”è`BjywÏ&­€o±‚ÛÕ#ê¸ns5]e_9þŸîkÐT`ŒšÚúͤõü¡¸ªkKlžžù›wådnu,.­î€}bß‘óú3*©¨¦¾ÇìÅð!öƒ@(PÍÕtÝìê»*¿¼j?¨@“€æý©Ù@‚Ù‹øÃܼãµw¿Þ­çd¼íÃ[õáRKÿñüæp‹5"&÷dáå™Ù³— À·Ø!BÝWÙÕwU^­Wñuï«þšôA󀦺¡Æ><•˜V¡¯m»óõ¾ÿX­Ž›½4þÀ~)ê{zFÝJñWBj9Ý€PöÑga«…=«ffÌ^?a?„U^­7¢¯úk0{EÓØ‡§Ò3êT„GŸÎ×{øý]aDL®­¬céî=³WÀçØ¡CeWßUù•âoÛýOý5 h0{u¿š›wäœý^QP2s¿iîSôžöÖWú ×ŽÄS­?þjö2øûA D¨é*»‘xµ~¥ûš4 hÐT ÙÀìeü¡¦¾'*©H!Hyý‹û„Ž´téO½ësÿÐøS)%F2Ó*ìÃSf¯€¯°‚ž:®šYI)Qå—ÿÝ}M/½Q­?5hB0{½ºÞ;úÜþsF®ÜZ9¾º †Ú†›‘ñ6 ³XßþàÛ¹y‡³ëþ-À~U¼ endstream endobj 54 0 obj <>stream H‰ì×ÿKÕWÇñ¿ae´Z#(h°hYbsABs¢ (Ù‚b¡ƒ dmcj~¡š•Ù@®ôÈÍË;ÛV£.µánQ¶Œ­X!­Ml~½êÖ^y@„J½÷žs¿õ|pó~>ïsúáóy½ÎãÇâQù_z£H?£½öõô ¶5LM.Öc>{iE÷ÚèW?\øMÔÏÑ¿xϵ¦dï×3r=þ–öhìàPǃÖo=©÷ü¬´ò]5ƒÃc¿}:D×|\ñ}ÒH޼œZzàÈO‘Ý2ç8‰J©­ìÖ®ÿ¨ì»Iæ~e­O=A_©3¨9DvË'ú†t4¯÷·{<ì~úšgæ‚¡ës6Õ·úÌ_±ç’ÿžû-ˆ΃@âQR+¯Mp+ÁCÈ}µ}«æ þ á~ËWN¹¹`å^½Õ3r=þ–öç]6N.?_m —̼ƒÏ q‡ó H”ÎÊhÖJm Ÿw儹õ×5]£¡.áf¿‡®ßºŸ½î°Þ䯿SYߨ2þÅæ‚á©k~åÍ2]™”\\Xzº`ÈÞ~DçA 1(‘•ËJg=Ñ3—”)¯Ç¿~’¹¯þ ó ®T£P¯°·_€C]}›Š¾ÕÛ{FjiIÕùžÞÀ„·L2DÓ ¶5LIœYiåuÞk6¶ :8 @Y¬DÖ³¬tVF[Ï}u 5 ]¯v¡ŽacË'ƒÃÕG.Ï^Z¡—vÞæú¶Ž®IÞ8ù\04yÅ{µºEŸÅYUWn´‡ºeÑÄyˆkÊ_¥°‰ãŒ\ÓÜ_WøµnQÇPÓPßuËWš|·Sß­Ö»:}u¯ùnP÷› £+Î[¾ÛÄКüã]}AÝ ê8qJ™«ä5¬,V"u{h¹¯v¡Ž¡Õ7‚]àέ;®ÚxLïç9Ëvª÷‡0!´\0ö¼4=e‡nŸ¶¨d{eS`p8„!¢‚ó w”³J[e®^åoe­/„!áäþÑ“WÔ7t»º‡H¶<êøtçÅ>úEÿ mN8¹`¶±vˉ) ‹4dnúΆ³7C› Â8ñE «œÕc«ÌUòF1÷­Ô@8j¿üeβ'¡°jã±ßÿø+œQaæ‚qçÞßi9_hŽ>ú%Ì-ˆÎƒ@¼PªZ Y[¹¯¢9j#ê$áŒÅ×|7}uI„&ßíðZÉ£áì͹éON©S­ÝrâQ÷@ø38Âyˆ}JRå©RUO«V9þL‹¹¯bªj&ê'ጣ­£ëýM_é­;{iEõ‘ËÁa+c-æ‚ ÿûßöʦi‹J4szÊŽÊZŸ•±¬ã<Ä8e¨’TÏ©RUÙ³¹¯N¢f¢™j)ê*VÆÆêé ”TŸ‘Zª—íæ’ÆÎ®>‹Ãíæ‚¡®É?®±úÌ[¾»ÉwÛâpVpb–rSéibTy¹¯~’”\¬®¢Æ¢Þbq8¼àê[^{ûs½º³×¾~ë¾õù.rÁ¸r£}qV•‰³Œ\O[G—õ%„Œó ƒ”•JLÊP%©õ%Üå¾ZŠºŠ†«·¨½XŸ/K» …+÷zϵ:ZÅ].uÞk¯¾U®%¦&lkèé 8Z@P81Eù¨”TVêÁœ•V®ôt´ëÜWcIÎܧ%ÔaÔd­‰íÁÃîüÏN™DØUs±`ÈÝZ®sA´ÿÂÒÓI#7sI™§®ÙÝZ&‰ó ;”ŒÊG=’ÊJ%fä¾Ú‹:ŒRŸQ«q·$˜±¯Ðõ[OFà\0ôÉZ{Hké3ÅžKþ{®W0΃@,P*M8fæL°Üÿà“o´–ZºÓC.$ï¹Ö”ìýzsfäzü-í‘Y4b¹`Œ ¾œ G#|@þ`Èýß endstream endobj 55 0 obj <>stream H‰ì×ÿKUwÇñ¿aeT0+ÆXÙDF.‹áóc‹FP£ ÚØ‚ Æjƒdj–Ø÷,C+)‹õ ‹\[- ÛĦ¬™%’Cq5n¢»a™Ú-÷¬Ï±/‘_Ïûœ{_.R?×=—s^¯OôÚ¸»ò•©Yüµ"£Bí]ËJy ù¼ùÞ¶êÚVo®{î§&®È_o.W[{΂½\11½ üÂMo.*"8 M¡ô%x[N™½åð©_½¼´Ç½àì9|eBR.×KÈþrý}/¯."ý:ŠØ¡õè>g6Ü}ð²—W7éý#å×X8\—µÃæñòÒ"">×î^•s†R˜˜”›³óâý½0éðM?_wzì³6ŒŸ‘GSx@$Æé<(b‚¾£õxúh@z0¦zŸÃÚaó°|Ø?ñ›Èã'…‡®¸RX¸òXsk‡I «^pZþøkÖübðIL/hh ™Ä‰A:ŠxŒŽ£é\åÑ}1Ûûl°XAl!“""æ*ªn%gò>|çƒ=U5-†Il{ÁánLNÝì*rþgßv†» ÈÄEé‡{²xõ òðy-%ÿôùÖ‰D¢–΃"££Ë\©}¼ê¸zÿ¿Ü4b±Žø‡On‘ˆÈh(-«{ýÝM¼?üôpcó]ë8Ïùªœ†¦PrF¡+ДyEÍ­Ö‰D¢Îƒ"£‡æ¢¿\‘Ñhôšu¢ç|Øûì"Ö©XJì%ë8""#¬ª¦Å•Bbz¯^¿Ž{Á9}þFüŒ<²™–µxõ‰{]=Ö‰D¢ŠÎƒ"£¶¢³h.ž/Zìä¹ëDÿæÛÞ¯¨ºÅR"«‰ídGDd´Ý /]Sæa×Á_zû"Ö‰þ‡o{ܱ̭ã¦çpBRjëD"ÑCçA‘GOÑVG’€ö‚S]ÛúÆœ­®”3–•†Ú»¬‰†Îƒ"ƒEËÐ5®t¦ÌÞBY'Š@÷>[+õ£bò³¾Ø`ÖqD$¦56ß»ük„Ò²:ë8Cè^pv”TOHÊå[Ä%dgn­èí‹X' EŽf¡_hž‡Þ±N4tQÐûì.Öß‚%ƳŽ#"1§3ܽ*ç ¥0>qýº-çï?èµN4,QÐ àWøä«Sc¦eñ]âgä)¿fHÄït :…fáy¡e–­=©Þ÷~…o¶]`‰±ÇXel3ëD""Ÿì;zuÒÌ|^¤ Wkní°N4¢£~‘Yó‹ù:|’3 šBÖ‰DüKçAù[€Ñù^ endstream endobj 56 0 obj <>stream H‰ì×ýk•uÆñ¿¡5Ñ`92‚ÊÙ’ÆtKò‡öÃ*e(˜˜ ‚F¢°'œÇ‡rË™:ÅœlÚX´1)·4k,ÄmQ>dc‡¢1ecc›nz6{ã—D\ºrçœÏ½û¾^ÛoŸûá|®ë{玌á|[gZvé/æò™—³7ÜÑe=Q|÷c—÷õ QÀY²æ(—3=#Tv¤92ûÚvvæ›+Ê/†¯Y+>Îç|[gZv© ÷y9{Ã]Ö‰x‚΃"÷#ȯdï";¬'Šßç>mÑÊÃ\#-Ž.g=ŽˆLH-g¯d.ÞÃ&IÍ*©ýþwëqbË÷¹àTÖþ:-½ˆ+M˜™ûÁ†oú†¬'1¦ó ˆC" ¤¿’‚¼°ž(¶’ûô7ZWJ££×Y#"Æå«=Ë×W³=¦¦mÞy ièVÄz¢˜ H.€§¹aëñÄ”<®wÊìBž¯õD"–tY@"ð[ È徟ð4y¾4:®—vGdzžHD<íæàí­{~Jº «7Õv^ﳞ(N‚“ O6ûýC\2Ÿçìhjé°žHĆ΃pìRÀŹ Ü÷+ž,½ŽK¦ãÑôè{Ö‰ˆ}Uwö……Ÿ±+¼»ï·‹YWA˧õÜ•ç_ÿÔÕ€…K÷_¾Úc=‘H¼é<(ÅÎgó» Hë‰â*˜¹O»£ãqáô=ZŸõ8"â!쇬÷y?3œ}•g¦¦mæòSò>*Ýh=Žˆ»Þ=°zS-;!iva~ñ‰Àž‚œ wîvƒ7Ö<ùO78XÕb=‘Hœè<(ASþõ/ìy^{v>›_¹o=ˆ ž;­îÇM Ò­'C·"Ÿùó´ô"VÁòõÕ—¯öXOd)à¹àð,\ºŸûÀç¥7Š[Ï]±žH$æt”à`«³ÛÝ’gÛ+÷•û¼4@îmNH3´žHD⇘šUÂÈ\¼§ñÌ%ëqì)îihlŸ1›+ o­(ïî¹a=‘H é<(AÀ&_´ò°[ìlxö¼õDö”û÷ÐiƒÜ š¡nˆH\ _s¡ðÌ«[U·ZãÊ…ì<Ð4ååîɤYù›v4 ÝŠXO$:Š¿±½ÙálrÞs¶:»Ýz"¯Pî?€NH3äžÐéŠÖãˆHLôö ~\ômbJÞäÔ‚OBÇù×z"Q.ŒÆ²l]UÂÌ\îÌSs¶ÔÔ_°žH$útco?=w o8›œ}®Ü¿Ÿr4Þú!-‘®HcÔ #â'‘ᑲ#ÍÓ3B¬¾œUáŽ.ë‰ ó ø ›™ýÌ+Í®fckK?‚rL¼?´G:$7Š>I«´žHDþ‡þ¡üâI³ SòÖæ×u÷ܰžÈë” ÿïRΪ îŸó·54¶[O$2.:Š?°ÙÉn9³¥•ûc Jîÿ-ÀŠ ñ? endstream endobj 57 0 obj <>stream H‰ì×ýk•uÆñ¿!¨ I …9]ƒ¹r0MüÁQFŽdô€R?˜ „)ÑŒíxpÍç“YóXM˜­&¡[Ò9B‡Bk¢cMš¬Í–µŽìñ¸•½õ.HÈhçésîs_/b¿Ä‡¯ßûú\ß;wb4)ñ5fd–ÏÌöûÍCÑXÿ"’x5G/Ì[ºó¡'Ê ÖU_éì·Ç¾>Ýɉñ§õ îêøiÑÊ'Æ/ÍH$JÛ>ø†kÌŸÖƒˆD©§/L;L2“ÏÖ¹ƒöþ¤Ð'i•œ “ži=ŽˆòÓ RU{?Ž´÷ãŽûI;åTiªôUZ«õD"馩¥+gÕ~¾²¼Âª–ÖnëqÒöB‚poçæïpÊÌ‹>XO$r½%5‘–d¦ž¤(Yj=QºÑÞO:*M•³¥µêÞŠÄË÷?ü²z} _Öœ%•?ÿÎzœô¤½P•žžµ•ž¶Ð÷îßÿ°žHä/zJª!!Ë÷6“–ÜL’“ü´ž(=iï'}•ÖÊ Ó`é±Ö㈸حÁ±·+O°øñþÓz¢´¥½hÜÞµ›ŽLYPÆ9?šWY²Ýz"‘»ô””B6’ÜIÒ’ÌÔÞOíýDS‰‰Ý§ums–Ü] «××t\ûÙzœ4§½W:ûsVíç¨ù-~~ÿµë¿ZO$^§÷ ¤òð©>t⑜$-­'JsÚûÉAƒ¥ÇrÔtZš­õ8"®ÑÒÚWXÅ·“ý쾦–.ëq=këÞOÎZO$¥÷ Ø"ýf<¹•KH’ŠÚûI£½ŸdÜmš-ý–c§ëÒx­'I9CÃ_ yf¶ŸÏdcÙWá뉼E{Á÷¼ðÜ<¿¹ù;šZº¬'ÏÑ{P¬x䞀$¡ö~’iï›àžÓr9y/½—ök=‘Hª¨k =öÌ.¾Ž‚uÕ—:nXãEÚ †Î_î]´2à”¢å/ìé [O$¢÷ $)·â•Ð#ýÈ@뉼H{ß]—ÆËùÓ~éÀÖãˆk õ.+ òEÌ_±ç؉vëq¼K{Á\ÍÑ ³r¶ñ¯05³¼¸´~h8b=‘x‚Þƒ’L£cãä)Ç­#ñÈ=뉼K{ß½—öË¿M˜>l=Žˆþ›ƒonip6Âöª3ìë‰>stream H‰ìÕ1A A$®>Ef>[PÅt_2µçÉåx¾n÷Ççþúà«´MÚ`ÙhÒ>4i€e IûФ}–]€&íC“öXvš´MÚ`ÙhÒ>4i€e IûФ}–]€&íC“öXvš´MÚ`ÙhÒ>4i€e IûФ}–]€&íC“öXvš´MÚ`ÙhÒ>4i€e IûФ}–]€&íC“öXvš´MÚ`ÙhÒ>4i€eþÓ[€­åKÏ endstream endobj 249 0 obj <>stream H‰ìÖËKUQÅñ¿!D„&Ž á"HQƒ"pTAÁA#Äh ä󢑒HTŒp .fEo¡R"Y$d¢¡¢XæãêU[QÔNÄ‘÷üŽç|?ÁÙbŸ½Ö¾ëëÀÖ¾ü¸kïEýµÀStàâ]H…™Ù…þÁ1ëÀVè>vm©Õ:E Ð}€‹w!Êj»uª¥ñ‰©9ë,Àæè>|Nû©Õ-Õ¢Zg ºpñ.¤‚~Æ””Çt°™yu ­=‰å¤u"`#ºßÒfj9µŸº¢ÚÒñ‰ïÖ‰…î\¼ ©Ó?8v¨ðªŽ7RÐòÞ:ðºÒZj3u9µŸZQë8D÷.Þ…Të¼÷6;¿Q‡\PÜ64ÀÅ»à±Þן÷oÑ™ç»ò¸÷“u„݇9m –ð÷j­ã„ݸx¼—\]»vûÍîõ:ùÂ3·†G¦­!Œè> i÷´~ºZBí¡VÑ:QˆÐ}€‹wÁÊ·¹¥óÑi9•é‘ê õô¯u"„ ݇ mO»§õ+«ífú¼G÷.Þ[CÓ'Nwêdç7vĬã Dè>¼§•ÓÖéâi÷´~ÖqBŠî\¼ ~ ó4éC<ÙÚ7ðÅ:BîÃKZ6í›®œ¶îþ³ÖqBî\¼ >‘XN6·÷eí‹ês””ÇFÇg­!àè>¼¡5Ó¦é²iß´rÚ:ëDaG÷.Þ_™š™/­ˆë‹däÖÔ6?_\Z±N„À¢ûH5-˜vLk¦›¦e›˜š³N„_è>ÀÅ»àC·é»ì9rén× uÝGJi»´`ºcGOÝЦYÇÁ?tàâ]ð­¿¿¦]ç×¶ÝGŠh¯´Zº]Z0í˜ulD÷.Þ?[\ZihíÉÈ­Ñ7*­ˆOLÍY'BpÐ}l;m”–J÷J«my¡³N„MÐ}€‹wÁÿFÇgKÊcúL™yuÍí}‰å¤u"ÁNîþOyÁc endstream endobj 250 0 obj <>stream H‰ì×ÍK”QÅñ¿!$!\ÂH`Q-ÚDà&’pBRj(#öf–Dš‹Šf#B/ZT¢Tf‘…’‘¡Lø::f¹–éèïyæù~ƒ³;pï9wœŸ‡ÇÄg—»2r«6l9SXŠY'Â’î?ý cÒ§u€'ð.øÅ«Þ/ÛÖë°Bùu-í}Öqà{tÉ¢EÒ.é:i£^¼´Žƒ ûï‚¿4Ez²wÕêÈ5÷G‡­ãÀÇè>VO+¤-ÒEÒ.i¬ã`Yè>ÀÅ»à;ãñSµÓC•i9åÅ­?Ʀ­Á—è>VCË£ýÑ i‹JôKÖ‰°\tàâ]ð©èç‘‚·uvYyá†[݉¹ŸÖ‰à3t+£µÑæhyt´BÚ"ëDø?tàâ]ðµÇÑÜ}Wt‚ú|òü£uø ÝÇ hg7§­cÀ:V‚î\¼ ~—˜ûÙp«;+/¬s,8q;úyÄ:üîã¿h[´0º3™Ûªµ9ZëDX!ºpñ.¤†ÑØdqEkZNyz¨òôùöñ‰¸u"xÝÇ2iO´*Ú-ŒvFkc«B÷.Þ…TÒÞì¦4{WmS¤Ç:<îc9´$Ú]•½Gµ0Öqtàâ]H=-í}¡ü:ëÎCW_õ~±Ž¢ûø;­‡6D—D{¢U±Žƒ¤¡ûïBJŠÏ$.^ïÌÈ­Òá–D‡bÖ‰à9tKÑbh7t=´!ç:´'Ö‰Ltàâ]Haß¾/kYøQWSÿljzÖ:<„îãOZ m…CwCë¡ ±N„ä£ûïBÊ{Ûÿu÷ák:åÍ{.Dî½³Ž¯ ûøöA+¡[¡Åxý~È:Ö Ý¸xâNkïÂ/½ü#7ô¢uØ£ûX¤MÐ2è>h%´Öq°¶è>ÀÅ»SÓ³—mÜzV'~¼¬e46i–è>D; 5ÐMÐ2hÆ'âÖ‰°æè>ÀÅ»4ƒC±Â’ˆ=s[õ寮øLÂ:lÐý€S÷µÚ]ƒ#'ïj¬aÐ}€‹w!˜:^~Ú~°^Gʯkë°Žt?ÈÔzu_@; 5°ŽƒuE÷.Þ… kŠôlÚQ£ p ¨¹?:lëŠî“š®¾ëè³òÂZë80@÷.Þ…€û16]~ªLË)×újë„îÍBÙÕtõ²{Ù/G_ endstream endobj 251 0 obj <>stream H‰ì×ËK”QÆñ¿!B7îb@t¡+Á… %ܸJÜÒ¦h“&‰á ‚èBKR£(ÄE¡.j@B TB…oX¨^Қў•*ó6Ãï}ß¾Dtåç|9ãñqr½y7íæ}OòßøïdqióVÕ3Ý„ôÜÆ®þ‰XüÈz’Žöÿ*Z]«nxIe¯z·^K´pñ.àÄpx!»¸]÷!¯´#<±žƒä¢ýÿ„ZVÑ:kÕ­Æ­çÀí\¼ pÅâGíO?¤å4èV”WDV¶­!Yh?ðÔ¯*Ö)«è¶ž1Õm½ž@ûïþ´ݯ©J Õ¦fÕ×µŒîîZ/BâÑ~€©Y•«~U±ZVÑÖ‹à!´pñ.à4Ÿæ7Š*ºu=2ò›ú§¬ç Áh?¨T«šÕáªßé¹uë9ðÚ¸xðoƒ#³™E­º$e“3«Ös0´<*TêXC…Í*×z<Šö.ÞœéÛÁÇïod?ÒU¹}÷ÕÆ—ëEHÚU©6u êTµªYëEð.Ú¸xpNúÀYuÿ58ƒöƒA%ªGU©ÓÔ¿„êÔz¼Žö.Þ\ÈäÌjAY§îL¨°ypdÖz.ö@ ªD£ªT›Ösà´pñ.àžÍdä7éæUtOÏ­[ÏÁeо¯©;Õ§T‰}ƒSÖsà'´pñ.àrv÷ëZFS³êSBµ5uC[Ñ}ëE¸Ú÷)µ¦âÔêSƒ*Ñz|†ö.Þ\ÅòZ´¼z@W(-§¡­g,?²^„ó¢}ßQ_ªL­éàÔ]deÛz|‰ö.Þ\]x<’WÚ¡‹”]Ü>^°žƒs¡}QYêKG¦ÖTœõøí\¼ H”®þ‰ôÜF]§’ÊÞÅ¥Më98íû…jRS:,õ¥Êbñ#ëEð7Ú¸x@_wî5¾½žùP_úA¿Z/©hßûN‚J Õ…ö.Þ$ÜÜâç’Ê^Ý«ôÜÆ'/?ZÏÁßѾǩ¤3RMjÊz‚ƒö.Þ$Épx!³¨U·+¯´#<±žƒßѾg©U£ÓQAêÈz‚†ö.Þ$Ïá÷X[ÏXZNƒîXÅËkQëEø…ö=H¨‹ªQ;*Èzˆöaé§.èJæ endstream endobj 252 0 obj <>stream H‰ìÖËK”q†á¿!D‚6® a$(È „ZD A䢅 ¸ZHy@1,É(,‹”*Ìf¨ÈÀ¢0 -¢!DRTÃãè¨=aØWDe:ó~‡ûZ¸~ù¼~³±Àm=û°gÿeýµ>¾53»XVQfYùu5ןÎ/$¬/Â7lßU´ ­CÑ?E{Ñj¬/‚o±}€ïÒc06^|î¾bË-jîŽYŸ¶ï"Z„v¡‡6¢¥XŸŸcû'Þ¤Søá»Íß½GÎÜyó~Ìúœ@cûn h úGhZ‡õ9¶pâ]@š--¯^i}ž]P¯ðʪ"SsÖÛ·¥òÕ¿þÚ‚¡]X_„ `û'Þ˜›-­ oþ¾ÚÖ—XIZ_8lߊjWó*_ß_+Ь/B°°}€ï ½ú|øôm*n‰ô [Ÿ,lß„:Wíúò*_ý[Ÿƒ bû'Þ˜ëä6©ÃãçÛcñIës‚‚í§™ÚVáúæª]Í[Ÿƒàbû'Þ¸ÁüBâÒµžÌPmF^uEMtfvÑú"ÿcûi£žUµÚVáê\µ[_„@cû'Þ¸G|dº¤¼KAî=ÐÐÖÙŸ\[·¾ÈÏØ~¨a•¬žõ©Õ¶ ·¾`û€Ÿð.Àmz_~*8qSYêÖçøÛO5Õ»U²ª¶>øŽíœxàBɵõ¶Îþ}gIyW|dÚú"bû©£bÕ­>¯VÉêÙú"à¶pâ]€k}™[®¨‰fäUg†j/6>ž_HX_ä+l?T©ZU±êVõªaë‹€_±}€ï\.Ÿ£šT™Öÿ„íœxàEƒ±ñ£%w•nnQswtÈúObû;¡êÔž> :TÖçÛÀöN¼ ð®­ßäÇÎÞã7ùv±ýÿ£ÒÔ›>ÚSÖçÛÆö 5¾ 0t…N6 endstream endobj 253 0 obj <>stream H‰ì×ÍK”aÆá¿!D„6BP"ˆ ÚH´Èࢅ!!´üL #T±…JQ B˜Eb5 dºH( M4TËÏÑQ»A'gÎø>¿k1àî¼Ï¹oîìœL¯ß?u¾\¿Öƒ‘X[߬iz—”^­•uÍÌ-YOtbÐý£Rº”1=šò¦Ô){Ö‘ û/î|`rz±°´SINάmjën„¬':è~ø”(åJéÒ‹)iÊ›õD@äè>À‹»ßèú‘•׬<§å6¾|ûÍzœxG÷ä,)Qz+¥K³ø_tàÅ]€Ï´w¥d×+ÕWo<›µ'~ÑýR~”"½’¥\Yºðâ.À~-­ß®ëIL«JH­¸UóJZOèþ!”%GùQŠ”%"?¡û/îüjlb>ÿæÅûÌ…º‡O?…¶¶­'Š/tÿ@ʉҢÌèq”¥Èz"à˜Ñ}€wþÖ͸ò@!×o``Üzœ8B÷ÿ¦„ì¥Eɱˆ ºðâ.À÷B[ÛÍ?&gÖ*ê׊ŸMÌ[Oè¾—R¡lèA”¥E™±žˆºðâ.À ‹«%•Ý ©‰iU• }Ë+A뉌Ñý]J‚ò T(Jˆrb=]tàÅ]€SFÆfs Z•ù”ìúöÎ!ëq,Ñ}Q”½ƒR¡lXÄÝxqà ®7_Ór•üœü–Áá)ëql8Þ}í]Û× ( ʃõ8@ì8Þ}À>ܸ)¸ºÛüátÆå¿°´szæ·õD±æl÷µkm\ß®í+J‚õD@L9Û}À¸ pÙÌÜRQY×Þ¿kë›ÖÅŽƒÝ×~µeíZ®½kûÖì>àÜ`px*'¿EE8wéþóž/ÖãĈkÝ×fµ_}²v­[˜q­û€Ãq€]ÝÃg/ÞSr Z?ü´'êÜé¾¶©êcµ_mÙzÀ˜;Ý„ƒ»ìY^ V6ô%¥W«Åå/W­'Š"º¯ júLíT›Õ~­'ì¹Ð}@ø¸ À>“Ó‹×K:Ô‹äÌÚ¦¶þàFÈz¢¨ðw÷µ5íNÔ7j›Ú©õD@¼ðw÷GÅ]ÏÊkV;Ò/7õF­Ç9~>î¾ö¥­éë´AíÑz ¾ø¸û€pŽ? ÐJª endstream endobj 254 0 obj <>stream H‰ì×ËKUQÅñ¿!D!‚bh ƒ&‚”@h"4'‚“Bšäƒä††(du ¢¡DÔ…5" Å””°Ð2 ­´|´‚=Ô{îùí}ü~ñŽ\{m–··÷©k·Ç² cŽ\(«ŠOÎ,ZÇ Òƒ‡S:—¾[ ’îH7¥séÖtwÖqErû€=ã]þíãÊZ]l =·Q_úA­#bÛê5‹ØöIâ]vâå«÷eUq%«0ÖÕ3j'QÚ¾nD÷¢ãèŽtSÖq§Eiû€äñ.;7˜˜Î?Ѯɕw$Ff­ã$%Û×-è.tÝ‹nÇ:àhlÞ`WÖ¿n\¹þ8³ YÃ9]ÓûúͲu¢=ò}ûj^ýëº ݈îÅ:àß·ï°–?×6ôk;yM ­Ã«ŸÖ­íš¿ÛWÛê\Í+¿nAwað‰¿Û¤ï°gÏ'ß–VvkAÙÅ-·ûÇ­ã쎧ÛWÏj[ÉÕ¼ú·ŽøÇÓíR„wHRßÐÄáã—µ£’ŠÎ±ñyë8;åÝöÕ­Vfµ­Î­ã¾ònû€”â]’÷eíÛ¥ŽGó/jMÕçï-¼[±Nôm_}ªU¥UÃêYm['<æÑö!à]‚¢[Μ½ãË¿-^l_ªIõ©¨êV ['¼çÅö¡á]‚56>_RÑ©Yå–¶õ MXÇù+÷·¯öÔ¡BªOµjˆ÷·ï ñ»Ï²‹[4®ÒÊîS ÖqþÀåí«1õ¦xêPMZÇ"ÅåíÂÇ»¤Èê§õ†Öጼ¦´œúÚ†þËŸ­ýÆÍí«%u¥ÆÔ›ÚS‡Ö‰€¨qsû+¼ @JÍÌ-®éÕÊ2 šÛo>ÙØÜ²Nô“kÛW3êG-)•SoÖ‰€hrmû[¼ @#³GO^ÕÖòO´&¦­ãüàÔöÕ‰šQµ¤®¬ãQæÔöæx€pllnuõŒfÆ´¸SÕ·fæ–ló8²}õ 6”Dͨµd›ˆ>stream H‰ì×½K›aÆá¿¡ H@(¸8Y„ HA\êà"¸ÄI\œê% µ‚"­.*d Dl¡Bº¨ƒ … "**JÀÏhÔÞ“è¯×A¾À]<”¹Ë~þöëõÛZÃîÈþaÚµÖîᆭӌjªy5µfw­5€gÜ}€‰»xîôüªw(ªM Ô|ú~s{ïBS7w_i.M§ŽšTóºÐÀ‹¸ûwð‰äQÛû¯ÚÇÚÖ©•XÂév®í¾fÑDê¥é4£ÓíäÆÝ˜¸ €¯<ÿzjéœuôד »¯üšÂµ_¸òÁݘ¸ €ßÜÜÞO†7õcÚÍÞ¡èñé…]Ý}eVrÕךE9Ñ€Ü}€‰»øÓþaº{ ¢õ¬jŸžgî²öÖwh÷•Si•YÅ•_SØ[@‘¸ûwð³­ÄASGXKl›‰®ïÚXÙ‰ÝWBåTYeVr+° w`â.þ·Ù®iiUÛ{“©[jÚ»ûJ¥l*¨œJkKMNàîLÜ $\^eCk•ÁÑŠºáþ‘ØyúºÈ‚ví¾’(R)›*g‘8Š»0q€’Ú;ëê[ÖÎV7NÌ-mf-—*~÷Õ]”Du”JÙ,—àî>ÀÄ]JÎxªáÝm®þêßÖŠ¹û¶dà>î>ÀÄ]JQöáqni³ºqBûÛÕ·œÚ;+´‚åÝW/uÔ·ê® JRhâîLÜ t§¯ûGbuÕÁÑÁÐÚåU&ÿo-ì¾ê«‹z©£úª{á‘xŒ»0q€R—L´÷,j‘kšC ‘í<¿*t÷UYõõ‰z©£Õ°<ÆÝ˜¸ @yˆ®ïÛf´ÎMá­ÄÁ?ßç¿ûª¦šz¬úêbGXžáîLÜ ldî²Óóñª†q-u÷@dÿ0ãq>»¯ ª£gª©ÊªowdnãîLÜ ÌŸ^ôEµ×ú±ÉðÆÍíý‹Ïrï¾¾Ò·ª 7ª¦šNFàî>ÀÄ]ÊÒNò¨¥sVÛ]Û:µKüý Çîë½¾Òÿª‚ê8€sþ0b N6 endstream endobj 256 0 obj <>stream H‰ì×ÏKTQÆñ¿¡h#B®¬@1*nfD‹7®"ܸ‰ ‡Á!DÍ[hµHAŠaAQ‚„ኢ"’LøsttzBަ93rïaî|?Èp=÷=ç¼›—‡›NôöÃÌ™Kô›€\y¯ýêYZ×[Û p¹0‘ @±y>üåâ6 þþŸžµb»).!÷&r(6¿W·î·DÏ^þû1¨_=kÅvS\BîLäPg¿1Ù×ùºE»t£îͽYö‘û¹¨•ÄFS0ªù-© ;ckëÉœ¶ç7ûºEwéFíÕíê!§í¬#÷&r(8ÉíT÷ÀXiuXÃ[ß88·ÈãÓ̾nÔ½Ú®Ô‰úÉãVûð’? 5³Z endstream endobj 257 0 obj <>stream H‰ì×ËK”aÆá¿!$7APƒ ‚.2h#áB7BB … Dà"ðPÉD& Ð#„0‰Ä\Ô@Ú"¡¤RBCKÑ<äØ¨Ý‹°O!0ç{êïB†™ÍûàæÁ ézþò㡵útÝ€鋿•´(¶…e±øÀØ®ßI?ûª®ôˆúQW»~€MÜ}@wØ+>}þ^ZÙ®ÀfDÛ:Ó|-¬ì«õ£§Ô›:Ló5¦q÷AÜÀó +5ÑÞÌHƒþôE?Ó3Äì›h€!Ü}@wðÜÝΡ삨rZZÙ>’˜ëÙг¯ÞÔ¡ÞT·ê9¬g„‹»â.ÞŠŒ–Å”ÐÜ3Í}ñÑp7”}õ©nõ²:Wÿá> }Ü}@wðЗɹsÕÊfV~cóý×ÉÕTè%Ìe_ݪgu®÷5…f ½€]ã €W—’õMý‡s¯*˜UµOgç– 2}u®þUB³h"Íe¨€ÿÂÝqtö ;uK‘,®¸÷nä«ÑZv²¯)4‹ i.Mg´€à €††'ŠÊ[Æã§o?é}o¡¢Íìk"Í¥ršQ“Z¨à_¸û€ îàÖÔ·… WºÃ#y×oÄ^ý\ùe§®åìk.M§UTójj;ulÃÝqW’«©Í‘Î_îšœúa³º“ìkFMªºšZ³k6«Øàî¶â.Nt¿ø)¾£ô•· OØoÀaö5¯¦Vum@{°ßpq÷AÜÀ²‘ÄtqÅ=åîèÉ›ºÞºjÃyö5»6 ´ íÄUÀAã<û¯pkfç–«ë{2rê2# õMý‹KI‡Íø}m@{Ð6´mFûqØ p@ø}€?¸ €©µõØÃ7YùŠÛ٪ljñ×y”}mC;Q3Ú¶¤]¹îØÏüÉ>ÀÜÀ´¾øh^I‹‚¦ÏøÀ˜ëvþð-ûÚÌæ–´1×íû–oÙ¸Å]ÌIŒÏ”_|¤ˆeDÛ:Skë®;úËÃìk?Ú’v¥Æ´7mÏuGÀ>äaöqæVj¢½™‘†ŒœºKמé§ë޶ó6ûÚ•6¦½i{Ú¡‡«ö4o³Øâ·‰:N8 endstream endobj 108 0 obj <>stream H‰ì×1€0A A$®Ò"3 ©`˜Û-¾þöæVŒóÚöãÙ¯ð*=Фšô @“hÒƒMz I4éA€&=Фšô @“hÒƒMz I4éA€&=ð·KÏ endstream endobj 109 0 obj <>stream H‰ì×1€0A A$®ÒFf"Rdæv‹/¿¿µöó½îçߟœO4éA€&=Фšô @“hÒƒMz I4éA€&=Фšô @“hÒƒMz I4éANó 0›ÎË endstream endobj 110 0 obj <>stream H‰ì×1€@Ä@ A$®h‘™TEfŠ­·ÍZÀ„ûyóúöï#ŒÒƒMz I4éA€&=Фšô @“hÒƒMz I4éA€&=Фšô @“hÒƒs¶-Ï endstream endobj 58 0 obj <>stream H‰ì×ïkÕeÆñ¿!›© ìA”ÓµBCeÒ¢=PIi)CK2¸ãtlÌšNeš#‡¥…çkЦ¥)¸þÓUŽƒ¿ÖƒÈ0/âõ•5¿ç^ý¬éâ_։϶î<ÍMã¯õ â³XsiÄù¦½ÚûáÁ‹ stc2=Ùz"‘Ôª;u%3owþ•å{/\ê°GîÑ^›† m÷ëS~am¼»Ïz"ñ“¾%¥È.,ˆ22d³žHîÑÞZ1ݘC¡'Ó–­ÇI‰–Ö®¼U_rÏÓs+j£1ëqdí…pª¬i˜™UÂѤe\v<1”´žH|£ïAIòê“òdŒ#ͬ'’´÷ɆLOæhèÌ4gëqD&MOïÍu‘z–ÂŒÌÍ‘í?ô$¬'’i/„ïåýOL›»‰š³ ô`ÝEë‰Ä+ú”T ©È+®ÙE‚iï‡ö~hñ^hËtfš3ý™m=‘È„$ïÜ­þê|°V¬ý¦µíºõDòpÚ !ÇÛY¸lgÄïÅ7«._[O$žÐ÷ L.Ò饷vaEjiö~ÈñvhΜ-š.M£¶žHd/Â!ÎÌ*©¬i°žHœ¡ïA+†œáÚ9$ö¾£´÷Æ»£uÓ½9Dz8mÜz"™¢n ÞÞRuzÖKaMQ]¼»Ïz"?íðó k9G~é¹g›®YO$Ð÷ <¾† mdK2¤ö¾Ó´÷=À¤sŽ´q:9ÍÜz"™Z¾­¿ôü¢Ï¹‹ß©ùµåoëqd¢´¼kîÈX\¶E+÷µwöZO$¡¦ïAy$ y CÎXO$¥½ï z8mœÓ¤™ÓÏ­Ç‘)[÷ÚŠ}ºužÑ^ðÌÞƒM³³·r¦Of¯‹Ôß¼m=‘„”¾et¤Çú’£$ ÷„T![¬'’É¡½ï:9Íœ3¥¥ÓÕ­ÇoÅ»ûÖÕqÓfe•”î>£†éíÿðBùT‹“Ñé{PFAnÜ’„<ÑÞ÷‰ö¾x¡ôsZ:'Kc§·[O$^I %«ö7K¡`C´½³×z"™dÚ ¾âµ.Z¹Ãå—±¸2ÖÜa=‘„‹¾å¡ÈŠùol¢ƒ ÑÞ÷ö¾¯x­tu—ÞN{§Ã[O$>¨;u%3o÷*giõù_Ú­Ç‘”Ð^ðÛÙ¦ké¹AµË/¬w÷YO$a¡ïAy@wÏ)ĹAzXO$)¡½ï7;½#¦ÃÓä­Ç‡µ´v-Y} صјõ8’BÚ SAeMÃ̬zú¼HѶ“‰¡¤õDbO߃r™@2\ ²‚İžHRH{* ½Óá9hú<­Þzq̾Áu‘ú´Œâ™›7–èHXO$©¶½ð¯‹ò÷ endstream endobj 111 0 obj <>stream H‰ì×1€0A A$®Ò"3`æv‹¯¿½9þcœ×¶Ï~}€WéA€&=Фšô @“hÒƒMz I4éA€&=Фšô @“hÒƒMz I4éA`…[€†eÏ endstream endobj 59 0 obj <>stream H‰ì—ÿk•uÅÿ†ælÂHûòCÔ¦KXC—RÑe*(˜ D‚Ö¾±u-Mg+u '¦3]±a5‘vQbÓ2±Ku±Ålk›îêÝìµ!6¶»Ýû~ž=çÅÃeûíÀç}Þç}îÜ1¡¯?¼*÷HBJÞ}Oæ%g”ù梵"aLñ'ß3 üZ Æ|Y×ÄN`Øl v…µ"[êNµðÜüZ ±/o KJ+LLÍ__p´§wÀZ‘ð‘Á¡òªÆ™ól‰å9‡Bm]ÖŠD(Øìg!°”û>A¹ï+ð5W=/Î…Ïϵo­H¸—“?þæ„¿õÁVk9"~(|HÍñK³2θ,§ª§wÀZ‘0@}ÐÏàúor–Û€`­HÄå¾á¶¹ó¹ù­å×jëZž3 É%åU‘Á!kE"®(ü N/ùôäýs xý¤´Bþ–÷ý†ú ?q¼ëy}6€¼ïC”ûþ§sçsíóú\þÜÿÖŠ„+èë¿¿í¡˜š¿¾àèõîÖŠ„Ê?ƒë³×`øÎÜRlµV$â‡ú Áã<³Å±<ÞWîû徟ÁõÜü\þÜÿ´º€µ"aɾês=û áå×+›CÖr„ÊÑÔÒñÔK;qAöîP[—µ"Ô}¾ÆÝŽÍñ;®·V$ÌPî .îÆ€.@#°–# 8{áÚÂW‡C!mqií‰_­åc” Âá`íù䌆!!%oí¦š¾þ°µ"[Ô}^ÆÑÓRóyn<ŽÓ­ c”ûÂ@`è´k9"N\iï~ãjÞ}FzñÖò`øVÄZ‘°G¹ F`'¼¨Küçn|`nÑöŠÓÖŠD Qô¥{Ïàe_ãn徸£Üÿ@# 0tš‚µ"CnÜÞ²ëç¹×m®íø£×Z‘p Êq쇬7÷1|/Úvúl›µ"Ô§68ÿ:FÆÑÊ}1‚r_ÜûvÀTÐè ´kEbò©þöâÏÌ+?÷ÚžŸšÚ­åw¡\÷¤áüÕ‘cò…íY+“ŒúàT…ÓÏ:æÅÅxÙZ‘pÊ}qOè4fƒÖ@w°–#&_š_¼j¯ó²_½`-G¸å‚…=f¤3!‰©ù¹E_߸m­HLêƒSŠOq+/‹sñ¯µ"áF”ûbè ´&„A°–#&Äõîë6×òšÎ-*Øñ]_ØZ‘p)Ê1:lµ›j¦ý{aîÿêgkEbrPœb¬=CySÜŠg•ûâÿPî‹Ña{ÐhÌ m‚Na­HŒ›ð­ÈÎÊ3É%<âªÜ#WÚ»­ W£\cM²hY9£Â7çÅç.^³V$&Šúà”?âJÇžøT¹/FG¹/Æ›„Á¨Ð)hô kEb¬Ô[Ó—òv™Kw.[Ë@¹ ÆæÑ…:gçÒ·>¿Þ}ÃZ‘ˆõÁ)Ì^sÀ±$Þġ֊„PC› S00ô m÷Óê\²z?ï5s~`_õ9k9Â3(ÄxÙ^q:)­±™>»`óÖú𭈵" ꃞßá><È#âG\i­Hxå¾/4 úcC× qXË÷ §w`càXbj>‰Àük­Hx 傈öÌÊ ‡Ròž‡æ}Psü’µ"1nÔ½ Ž›•9|›áAœ¨ÜãB¹/¢À©t ‡ê†«ˆ •W5Μ? KVïµuY+ÞC¹ ¢†óô+eÌ_zVYSK‡µ"1Ô½Hs¨¯9¦Ã}Ê}Ê}5ìóCû ƒÐD¬ù`ÃåÌ¥»œ3¬>Øj-Gx傘 5Ç/ÍÊ 0E )y+7îé°V$Æ„ú ·ÀYø —ñj8ßY+^E¹/&½ƒöÁÑDè#Ör|Êå«.Ï9Ä+$g”ì¬<²V$<ŒrAL¶Ð{Ûê§Ï.`–’Ò Ÿ²VäVþ`ßãô½ endstream endobj 112 0 obj <>stream H‰ì×1€0A A$®Ò"3)a˜Û-¾þöæàoÆymûñì×Gx•hÒƒMz I4éA€&=Фšô @“hÒƒMz I4éA€&=Фšô @“€µ[€îÏ endstream endobj 60 0 obj <>stream H‰ì×ÿkUuÇñ¿!·¡ É0Т¼j‹µR˜"1ÑGT¢‘ û¥@ËÝ]]6³ÍeÍUlfš™ÄÖ¤ò:-/²º©C6˜èfÎ+îÛuS{nÇ2¬~ðÞó>÷œ×ƒËÐßÞ÷Ü×çó>¯;w¼cóGGzr#­‘ÿW±óØÄÙeü^Y3Ãïl‹ŽÞºm=‘¤±~>O–øk=ˆ¤1n¡êúãSòÊÉÒò5ûº/]³ž(@úáªæìœHf¨tm¸©/>h=‘¤=íIn¤%«ö'>Óò+¢±Në‰ä¿¨¦Î§É9Vœ/í}ypÚû’,ÜHôZ Ý„†BO±žÈÿö6žš>o+G¸ ¸îtÇeëqÄ'´$¹N¶÷ÌZTå¼¾æ/Ýy±7n=‘ÜŸú Çqvæ½Të%Î'Ëz"ñ í}I.Z Ý„PÑSh+ÖãøVk[ÏüecK!´°²ñð9ëqÄW´$Ø6wKá³Ö‚ú ›H5Ùæ“sÒ®½/†´÷ÅœS…èA´¡`V¡]NN3¶ŠVîîèúÃz :íñˆ3ç¯äî |ž+ú¤ëÂUë‰|N}Ð$yîâ'Ø$œœ[O$A§½/A¢ ‘FšýÈz—ÄNt;KavÁöh¬Óz‘1Ú â) ‡Î>úì{drÂŒ+Öí¿~cØz"ßRL5ÒK†I2Ï™T“më‰DÆhЉhFd’–DW²'….öÆ‹K¾á›NÉ+¯®?ž¸9j=‘È]Ú â5Ü>ˆfÍ “ÌIO•U~Þb=‘?©¦¹”á “dò¬½/Þ¡½/^à I?¢%‘L½Éz¢$ëH„«š³Ç—ÂûâƒÖ‰ÜC{A¼‰ÛòÅ×¾ œ|¦åWDcÖùú`Šié"±Ntɰö¾xö¾x·%]‰pÒ›hOt(뉒ã릶'|È÷*(®;ÝqÙz‘ûÐ^/;ÙÞ3kQ•ój½àåÏ.öÆ­'òõÁ¤#Ÿ¤Ô‰+¹%½Ö‰Ü‡ö¾x‰ÞDDéP4)ëqÈogzç/«u¾ËïÛ­ÇùWÚ â}uû['çn&¨¡ÒÕ놆G¬'òõÁ$"“o¾ûùä‘’Uk=‘‰¿˜ð> endstream endobj 113 0 obj <>stream H‰ì×1€0A A$®Ò"3˜€n·øúÛ›þiœ×¶Ï~}€WéA€&=Фšô @“hÒƒMz I4éA€&=Фšô @“hÒƒMz I4éA€¦Õƒ·SÝÍu endstream endobj 61 0 obj <>stream H‰ì×ÿK]uÇñ¿¡%lAhÐä&‰$B²MØ%2hXÁì—\ßc 5t3Å5çÒm¨SÐ"kp)nJ %­¡Õ¦µ¦Ì$ ;™Üá׫Öz²SþPùýÞû¹Ÿs^.Ð{ßžóºŸ÷}Ý¿/6øâ«¡‡öólz‘ù?ïOöUÔ¬ë¿7=Ά'¦ ŠÌŸ˜^v¦öë¹ùEÓ‰¬F{A¬ÀYz¢´-!¥Ä9]ë[®›žÈze:¹˜<›Äz¤‘Lr1É')ÕÞ—8§½/Và,¥I9§+ÝŠ†ez¢u /,U^¾æŒ_虞HdmÚ bÎU_^‰åñØ¡s}ýc¦'²˜úàÖ‘Àd_•H’©½/VÐÞ‹p®ÒªH, ‹žEÛ2=Ñj·S³«™öÀóu½·ôE¬¡½ ÖéîÙ“Ué| Ï9Úœ˜2=‘•Ô·‚Ô‘='„¤‘LšžHd½´÷Å:t+¹¥mѹLó?‡ï<órî>x¶Ùßgz‘Ñ^KoìÞ‘VJzRJNž¹^X2=‘eÔ7‡¤U¶“:® $‡¦'Ùí}±=‹¶Ezi^ô/Óãüm24{üT+Ka{êé·ÏuLÏ„MO$²aÚ b/NÝ×O~ºm_1NÊ(o Ü4=‘MÔ7Œ‘4®©#{Úûb#í}±§.‹æEÿ¢…ÑÅ ³ôÇŸ—?ºá,…#Ç>¹kp‘­Ð^ÛqïÏ­#Æ<žÈ¹004=‘Ô7„\¥ç\tbFÞ´÷Å^Úûb;N`ú1¦‹ÑÈèe±Ÿ¡ýÚÏÎRà¹ëÛ_c?€Hi/ˆ;á]™Î×õÜ7>œ Íšž(Þ©®Ó½©yåD‹Œé´Ûiï‹;Жí,fï»ÜFy²ÂT‰,íq ÎäòK]ÛSOižùY§ô*ÔפD‰+iï‹kp&ÓÈèeDšŽFS‹êÛMτߪ¸Ê:HH)9~ªõÞÔ|TßN$f´Äe8Ÿ_(h!Õ¸ÒBfœð"²dz"‘HÒÞW¢£ÑÔÈ6­îÁWþî‡ÑÌõ¼rjvu ãv_Y$Nh/ˆ‹µn&e”“ðmûŠ_}ó“é™°é‰âˆúà‘rBZ¸2$‡ü˜žH$ò´÷ÅÅèk´6Nƒ£ÇmñÕFÇCù…~^-1½¬¦©'¼°‘!Eâö‚¸§wQe{BJ 9ß‘Vz¾±ÛôDñB}ð_È áš2£½/n¥½/îÆéMw£Á‘sÚn/27¿X~©k烥PPNLE|N‘ø¡½ ^ÀIžs´™¨óØ“UÙÝ;bz"óÔ—‘Ráăœhï‹»iï‹p’Óãˆ:ŽfG¿[ÿß^i½•ì«âoiøqð÷è )'´Ä;úúÇö>8áyøòFÇC¦'2I}d€$8‘ $ÄôD"Q§½/ÞA›£ÓxúÝ:ÿ©—ß§F{<‘8¡½ ^Sßr=1½ŒØ'¤”œ(m››_4=‘ïƒÜwî>à"Raz"‘ÑÞ¯¡Ù­ÙƒSE>;ÓJß©éôìwñ&íñ ÎùcÅŸ=üOh¼Òkz"¼Ü¹ãÜwþ}2@´÷ÅS´÷ŃV9çà K5M=Iå|.ò ý£ã¡X&´ij8ó}y äŸÇãO¿××?fz¢˜òfä.s¯›ÎÝ×ÞÒÞYÖöåO©ÙÕ|"2×öôýfz3´Äã:¿ùåÑï:áÙWÞŸ Íšž(F¼Ö¹³Ü_çFsǹï¦'1C{sþ`¤, ¥ endstream endobj 114 0 obj <>stream H‰ì×A€ ± !$­üÃ2bnk±¹žý~”üÓr| Éš| Éš| Éš| Éš| Éš| Éš| Éš| Éš|Û¦$Í endstream endobj 62 0 obj <>stream H‰ì×ËKTqÆñ¿¡TŒ „[¥IQBÒ…V¶pQHíÜ‘´Ikx1#»‘JXÒb"£œE—!è AI˜CIв»¨ÖCgÑ¡¬LgxÏ9óý0 ¶{ç}úñð~û†@yÚ¶»cÁŠŠe›·_|h=`éêÍ>½}[X:zæö¢Õ5z i9U‡šÂ“1뉮îÄuý^}[’pJS™*Yý^¥¬¬­',ÑûHr£cãûk¯¤fW¦çVl¸¦ZO£‡¡¸´káÊ ½ˆŒ¼úPO¯õD‰•$÷ rTšú¥JVùÒû½¤›šn»péú={;£ÃÖž@/nj‡üí§õ(ôY[xòIß õD‰ø{PÙ)A'JeJïzÉ)rï…S úGú­Ç<„^~êéÍÌopN‰âҮѱqë‰â/À÷ òRjN|ÊQiZOx½ä¤ÿöyõ§ÏÝMM[Ïx ½ÌH}Q{üzZN•Hznuý©k@ÞƒÊHI)/ý4e§–0ô>’Ó¾ªËïG>[Ox½ü…º£hÏy½}²66†#ýÖÅMðîA¥£Œœ°”½̈Þ¸Ñ À?=éÌÝzÌ946µ¼xõÁz¢8Ò=¨D”‹Ъ‚fåe=à]ô>À^f©óÒ£Œ¼z½—”ìÊ’òÐÇOÖÍK0îA¥ ,”ˆ~‹ÒQFÖ^GïÜè`ö&&cj¯¤þ¸>­®9ÕqÇz¢¹ À=¨ý+ý %RVÓ­t¬'|€Þ¸Ñ Àÿ|;V¸«]GŸå[ŽÜ~0`=Ñ\øúÔεy'e¡D¬'|ƒÞ¸Ñ ÀܸO’‚â³¾;I|zjÏÚ¶³ví_)XOø ½p£€ùhí¼·xM­QjveYM÷—ñ¯ÖÍ–ïîAíVÖž5¶v®Í[Oø½p£€yúøi¢¤<”òãNY²®®óÒ#ë‰fÅ_÷ ¶ªÝj`íYÛÖέ'üŠÞ¸Ñ @\¼|3²yg«^“>« š>~m=Ñ?øåÔ&µOg±›v´jÏÖþFïÜè ŽÂ‘þ¬ÎñR´çüû‘ÏÖý‘÷ïAmO;t–©­j·ÖA@ïÜè îšÚ"é¹ÕzYi9U‡šÂ±©ië‰fàå{PÓÞ´=M¨M6¶Ü²žzàF/‰0:6^\Úµpe…ÞWf~C¨§×z¢_yöÔ®´1ͦíi‡Ú¤õD@ Ðû7zHœgÏß­-<©'¦þˆ [Oô“ïAíǽ®§Ñ!뉀¢÷üê» oÛƒ endstream endobj 115 0 obj <>stream H‰ì×1€0A A$®Ò"3©a˜Û-¾þöæVÆymûñì×Gx•hÒƒMz I4éA€&=Фšô @“hÒƒMz I4éA€&=Фšô @“ø¯[€)Ï endstream endobj 63 0 obj <>stream H‰ì×ÍKTQÇñ¿!Ë \H¶2KI\”BQ­fE-la›(µHÐÉÌ ³°z¤Œ`„HšEoXAº‚D $CdzìWâÔ"ræÞ{îÌ|?\$‚9ç÷Û‰´ªê‰Â¨?ê’ze;͘ûsðÍØøT¨îº^œ¾â­ñÇo-† Â>¨¨NCÔõÇb G0÷&æà³—o>¬ÙzÆY‚ªw^þ8n%†Ý}PU«v§ ê†zb%ƒ˜ûs°¢«çõ²Šz} W7í?›L$}`kT¥ªWUëvu@}ð9ã˜ûs°åËô×úæ;‹~mFK׿ØõÜÏۭ샪Q•ê^U­ÚÕ?o0ÇÜü‰¹Ø5òibË¡¾•Õ§Ÿ½öç^Ÿ÷AÕ¥êœ27jîðæ>ÀÄ\‚ ïÅÐïu©¦öªë’oû jQE¿^Uêõþ¹01€à8wåiAy³žä¢ÕM‡#w“3³ÞÝåÃ>¨üGZzU‹.R]—Ÿxw€ÿÄܘ˜ @ L&’ûÆþÚ¡ +#]=¯=ºÈë}PÉ•_W¨U¤º<ºÀ¼0÷&æ@ï†F«Bz›úʶuôޏ~…wû Ò–m?ë„WªÅõ+¤Œ¹01€ÀŠ?~[\Õê,V¡ºëcãS.îÅ>¨„Êé^¾á¤ò»x8W0÷&æd³ß¾G.¨ JâDR6%Lç4>`îLÌ ³Üîí/¬ŒèÙæ•4î9Ô=™H¦vNšû îÝ[Ktˆò(Ujçðs`b.'93ÛÐÏ/ ëñ”7·GûR8$}P7ê^ý\”DyR8€Ì}€‰¹d¨Oc‰û®éýê+ÞØúèùûyý<µ}P·¬Øtʹ´¦öª2Ìëç¬cîLÙ>~0¬ûa endstream endobj 116 0 obj <>stream H‰ì×1€0A A$®Ò"3 )€™Û-¾þöæX7ÎkÛg¿>À«ô @“hÒƒMz I4éA€&=Фšô @“hÒƒMz I4éA€&=Фšô ðG·‘¹Ï endstream endobj 64 0 obj <>stream H‰ì×ÏKTQÆñ¿!5r!¸hѢȩÄEHQmÜ e³ WBBHaáØ0R”L`¢ ´(CÒ(Œ¬ÅlD š ƒ( bHj6jMONùkˆî\»óýpîœóžsÏæðð&“€§F'÷¿±mo£žrÇÄÔlš C­CZ¢ß4ëµ³ö7ÒõÝ¿=27=y9¦[¬_·ØÈÀÚ»‡ JBºË¹¾ÀÙ¦þÅÏË›.I¿ÔnÚS;«^_Ñ·þÅ‘¸ƒÜØÈÀÔµÕÒïÚÒìíNSû§ÓiØÊÈ}€\¼dbj¶Üß¡K­§¨"<\¯rÓ~Pk}ÇÂf+í©92€Œ"÷6rðžÈHlסk¦•«¬éŠOÏ­®Ù T½V™åÚG»9dBîläàUáÎH~qP|û¾¦‹×K+öìšý jT©zMi­vÈì‘8ŽÜØÈÀÃæ5ç{sŠuÍ K›ïõ¿IM­îï?ŽªFƒª?}îÖºqdÎ"÷6rð¼ñØLYU›nºž’Ê›oÇâÉßûAhܨRõn€SÈ}€\²ÄÀó÷;^1MßÉ3=—Zõ¢ßêº3¨ÙGÏÞ¹}LÎ"÷6rÈ+_¾6ßz±ãÀeÝú<_ õ«kÖíp¹°‘ @¶ù0ûéð‰v]|óè]#n @†û¹d•ñØLYU[ª4F4îöÑd¹°‘ @–˜_HÔ6ôå}o K›«ëzôrªî®Þõ¢qͪÆícp¹°‘ @6wFò‹ƒºìy¾À…«OK+¡Ö!ýÕ¯Þ5¢qýU*Ý>,‘û¹x[d$¶ûH‹®¹žÊš®øôœOõƒæ¯Æ5kÊT¯UÈ}€\¼j*þ±Âß™jñF£“öìý ¡š=G6åþíÙ#p¹°‘ €÷,~^®äùºÝ%¡öîáÕ5köƒ†êµJ³ÚAûh7ç CÈ}€\<æÎÃצ›ËõjúÖëæ6è“?:J­ÍýÕQÞî}åà‰d¹°‘ Àÿë›éÅö endstream endobj 117 0 obj <>stream H‰ì×ÍnÛFÀñ;ú{1`½äîÒ9ÙpœªPZÀEPA`¨¶’¨¨dÃQøÚ·êµÑ—IwI‰’*ÊIµ9ðÿs 0£%93"¹Üÿµ?ÿúû›ìðùµü¯X@7±€nb=ÝÄzº‰õ tëAè&ÖƒÐM¬ ›X@7±€nb=ÝÄzº‰õ tëAè&Öƒ€î88x:»9ÍGi2ü.MNûÅUˆ\ŽÞÍÇ÷iòCšH1ü? YYjU86lî¤ ÒºÌã†4¥ÖaCù¸7–ƒ §‹¼ÃQ<ŽÌŒ²ú>¤IO)Ÿy]hál‘Yc¼˜¦‰6qwk„÷Eø6wb&…+3­¬_ŒAé3WšRäÒdÚyƒÍîʪL)S{¹Ïr©ýÆÈ–Ó‡èëЉ«ãÓûùùäz>¹îÄIŒöT¨FºÒ‰ãŸæ÷“Ùqxvvz}ý~zy;ÅÁGâÛ8ôIüHUµïýªj­ø&ÏÂæ™Ò®Ü¬]»,´¹Œ©¬ô²´Â–¡Þ¹*›½wC=yªWJ­Ž°ëT­GØÞ½>ìV^Ó*æÊÒ/cz‘ËÎŒ}$ÿ¶B_¯5RfVÚ<ž¨NJ«ÅQ­[eÚ?§UÍ1?§UŸlvkMp½)»šÚzY´up3fÝΪ¾èRy‘&¥8<ß·/ßÌçF™xS;Yx¯ë‹yuÏ›P‹ÏWGâ=ߜǕyf´·±œó&$gãM­ýînê2+ŠðiØð±{VŠãþl.OûJŠëÛéÝíûÙx÷vt7ÓÛ›ñæýºu¾OþöƘ¬Ô…_ek­Èó2“ºn~¬éŠ]uí©„·vÙí"ßÈ`[Oµµ¨Öò[~¿=¥ÿÈå·=-L—Ïu• §óp?XÕ’³Ï׿Šöë3Íž*Ù:ßöµä7Û®s…+ÃíœÙš`}ÌÂîªkO%l7wº6“®'Ñ:½¶ÖÚ‚Ö_qWT|H¹8õêÅÔ[MÁ7ib——Úàlõú3=Œï{½Eàlüf2«Bõü­š9\ ]á)ÿIQÄÐà—49¼è_< iÝ=‰ÁlW ÇÃçƒýsq"ªñWõø'uQWa‡ðåfRœ.o‰Í÷)¾[¿†Ø‘‹çâå+)nÒðÝ墄‹Éoã“õr–/x¡øpÀgir|>þ}r=¾|v&†á­ïe|Ç SKxTÔOøÅz&¼õ)ïféWBir)u•ÊÛ/رê_³ójË #ä¢ÇááDžάã‹êI˜-ãè<¼±ö“¯ýþ ؇H^J endstream endobj 65 0 obj <>stream H‰ì×ÏKTaÆñ¿!®$7AŽšÁ,¢…‹‚ ]B›Ê¥n gh)4J1 ‚j®FB©i…R ¶i("™Ô±,{ê…xƒ2çÎ{ïä÷ÃeVsÏyÞ /‡³±ñ›§Ïß6¶íØÓ«çðÉë éÌÆß¿òPÓï&ÿQÕ1UYõ7ù3€’poú•n´~ýæðX̬œ8sÛ,nuáÉ™ù¾²•}ÐP5Õ4ÅŸ¾¥^nDàæ>ÀÆ\JÚÚçõs'+út‘«öFo<Úâ‹[ß UV}½¢^꨾N#ðs`c.¥+9‘Úuà‚®pY}oGרR6·õwóÝEõÕE½ô¢úª{þ‘øŒ¹°1€RôâÕû}G¯êòêÙløõ›ùVp°êuàøˆi­ J’o>bîlÌ ´,es]ceõ?Ö±Úƒýɉ”³:Ž÷AC}Õ]”Dy”ÊYcîlÌ „ôLïlŠêÎV6ôEï¯ýæ¸Tû ¨{ôò%Q¥ŠO9.À3Ì}€¹”„É™ùºð€n«ž¶³w3+,|4”DyL0%TÎ (*æ>ÀÆ\n! ·š…«±uh6•v¥¬[û ñìå;e3!•V™]) ÀuÌ}€¹Ö§åµÎždy(¢KZÓOŒÏ¹XÜÝ}ÐPBåTYeVråw±8W0÷6æL׫›cºž¡Hwìîjî‹»õ‹±Šr*mÅ϶ª9¦S¸[@˜ûsšGOÞì>tISÏ‘S7ßÈ£K‘öAC™•ÜAgщŠÑ€Ì}€¹‡—kTQ÷AÛÅ@^˜ûs‚ÕÜ—îØÝŠPD÷±ª9v-ñ¸Ø=Ø ¥º9¦^:Ψ“»#€M0÷6æà»Äø\MK\7±<éìI~Z^ó ©gû èD:WùÏmW'Õy=h à˜ûsðѳ—ï[‡tõ„ÛGÒÏZ{¹:Îh«SϦҞµð s`c.¾X̬´½c–£ºðÀä̼Ç¼ß Tç5×Ðwð8°Í1÷6æà±õ¯ß¢—T6ôéêílŠÆ‡§|‰á×>hôLëì  ï¼¯oâK `bîlÌÀKɉTíÁ~]º²úÞŽ®±¥lί$þ³ë è;(†¾‰¾Œ_IPßnðè¿ endstream endobj 66 0 obj <>stream H‰ì×ÛkÏqÇñ¿Á](irC¶a¬Ñâ‚)Vh´RRÅI‰2–9DSÑvá´åØœÂäv#§lbÙÅõK[cÌ~3æµ>ÒÇavúý¼¿ßoÏGß~ÉÕk¯wŸÞ½{z ×ï5Ž˜²C¿ÖAÀ^þ¦æ–ÙKŽè¹éËÎ/ohŒÙæÙ]vGIôkC=¨ WˬŇՒm òØû{H¶÷í+6žMIï=yÆÏÞSsó¹u¢^¹u¢f”G-©+5fˆ,ö>ÀÇ^’ª´².uú.½²Ñ™;·¨wu['ú!P÷ ¨õ£–”J©7ëD@4±÷>ö$µ÷_Mœ»_ïKß’Õ'[Û:¬ý"h÷ £––®9åJS{êÐ:5ì}€½$Üë·my…ºðУú7Ö‰þ"˜÷ £ÆÔ›+PMªOëD@t°÷>ö@Ÿ;¿¬ÛV32£HÏjlöî['êSïAçäÅ'êP!Õ§ZU·Ö‰€(`ï|ì QŽU=p÷˨Œ¢MÅW~¿ÿu¨&Õ§¢ª[5l=ö>ÀÇ^†ïQý›Éóê)éË+¬xû`¨¡¸õ¹ °ÒÕ;iÞAµm1ö>ÀÇ^†#ö®=ÕñŸ§JÝÃfëD¢{ÐQ·jØU­ÎÕ¼u" ”Øû{šxW÷Ö}7Feé¥f—VÖY'œÐ݃ŽzVÛJ®æÕ¿¦`ö>ÀÇ^† êÒÓq9%z;)é;Öm«ùø)nhÐBzŠÚVçj^ù5ÍÂ:&ì}€½ JCclf~™^¾9G›š[¬ QxïAGÍ«7ˆ‹Ê4ëD@8°÷>ö0@­mkO»$-woíýWÖ‰†%ì÷ £)LÈÝ熢éhFÖ‰€ cï|ì _Ý_¿•¾;fÚ.=ýêßúëPÃ{°'¢Ó’‡½ð±€»zûeZî^=}ËÖW¿oï´N”‘¹Íeù†j7&Íëò­Ö‰€€bï|ì /MÍ-s Žº#;¿¼¡1f(‘"v:š‘&åF¦Ùi‚Ö‰€Àaï|ìàO?ÅWm¹’Þ{VŒË)9så™u¢Ä‹ä=蜻V¯©é¯ÓWn>¯iZ'„½ð±€ß”VÖ¥fë]ŒÎܹý@m¼«Û:QRDøMM³Óõ7jšš©u" (ØûÁð]€Xûo endstream endobj 67 0 obj <>stream H‰ì×ÍK”aÆá¿¡R \D¶R+I\”¡Q‹iån¤-jæ¢Mš9”&(J$F’ä¢/¬@[HB" "Š¡ægÙ ÄEù5ž™y/"®îyÏ-gÎÒƶ×}›ö”ê§uÀ^G×À®#×õ¡'TÔ42:i(Š*k_êcê§u(Ò5G7PMVóµNØcï|ì@‡'ò îpHϯîî²NuA¸MS3uÃÕ”5këD€%ö>ÀÇ^@ÀÍÌ.”T´nÉ(Ó?ÂöìÊúæNëD$8÷ £Éj¾úÈšµ&®¹['l°÷>ö‚Ì¿ŠËŸêFÚ=(𝦬Yëƒkîš¾u"À{àc/ ˜º{†ö¿¥òëÉ 7 OX'Úh¼ÍZw£WÔëDÀ†bï|ìÍèøôÉÓ÷Ý9v¸êMçWëD6{:š»¦ïj*jR+¬„½ð±só‹—n´'g–«ó)YÕÖ‰,ütÔ5AïA­P7ÔëD@Ô±÷>öâI[ojNDmßœ^zêüã©é9ëDƸ5A}P+ô6ÔõÄ:]ì}€½€„×Û7’º­žëÉ-¨ë³N¸}j…ºáJ¢¶¨3Ö‰€haï|ì$°o“³…ÅÜ—ü¯¶¼øl(†pþI QO\aÂçª?Ö‰€õÇÞøØ HH‹?~Fî¼Úºï²êœY®ßõëP±…{ð¯\sÔ½õ‡æ ñ°÷>öOûÛ/i¹U*¶ž‚3Æ'¾['ŠE܃ÿ Î¨9®B;]S£¬놽ð±HúÆr êÜ×øý'jzûF¬Å.îÁÿRÔ"W'õJí²N¬ö>ÀÇ^@b˜šž;{±eKF™úœši~úÉ:Q¬ã\&uIÒ»R»Ô15Í:°&ì}€½€P{ï}JV…šœ”Qv!ò|n~Ñ:Qà\>5J½R»ôÆÔ´š»ï¬«ÇÞøØ ˆk]»ÞT‡õ„ŠšFF'­Å îÁ•R»Ô1W6µNݳN¬{àc/ NéËù±ÂÆß_Î?|´Ng¸WGMSß\ñòÃê¡u"`eØû{qgfv¡¤¢5)£LÕÝvàJ}s§u¢¸Ä=¸jº§¨ªê¤u"`¹Øû¢í—ÊšþÝ endstream endobj 258 0 obj <>stream H‰ì×ÍKTqÅñ¿!"‚6®Š`$HÈEµ(h#mráBÜ-¤M1¬@) Ìf0(’Þ)L"MÑ6d¨“éè˜$J¯£ÎÜg~÷~? ·y~s<¹²â‡Ï?ì:pI?}ú÷€苎—Uv¨Y§kûã‰ë8ë+òîënºžê’º§u 8мûŸ± @Ž®8Ó­NEª:Àì°Có KW»žî9Ô¢*Õ5ŦgÓÖ‰râV÷uUÝVug][7·N¸Ê­î ]vâþÐÄþã7U¢çî½µŽ³.v_Ö[7×å­ãNr±û€Âa€íÑß&Ǫïºû·‰»Ý×µus…×ýõ ÖqǸÛ}@!° ÀVMϦëšb*ΞC-m·ŸÍ/,Y'Ú§»¯›ëòº¿>‚ÞB/bp†ÓÝä»ä.³˜íê--oUkj£É©”u¢í @÷u½‚>…^Dï¢×±N8 Ýä»ä(6ü.RÕ©¾Tœé~õ&ig§Ó}½…^DŸE¯£7²Ž»Àtì°©xbætm¿šRVÙÑ·Ž“ë¾ÞE¯£O¤—Ò{YÇŠWÀºä¨áÊÐô‚u  ± €m‡¤äàåÝ‘æ í~Îe¬åMðº¯×Ñé¥ô^ì>°‘àuÈ…¾öûŽ´÷ Œe—[gŠ »¬K{¡ÕÐv¨ Õõƒ‰ÉoÖ‰ò,¨Ý×K齨}`#Aí>àíñÈÇòS·ôå×Ïg/?YÇŠ»üOK±¶Zë8ìî³ûÀF‚Ý}ÀCvùwÏÀØÞÃmª@uý`bò›u" (° Àß´Ú•B{¡ÕÐvX'*”ÀwŸÝÖøîÞ¾§~5\*9xyw¤ùâáŸsëD€1vX¥EÐ.h´Z í…u¢Â I÷Ù}à!é>à-ž˜9y¾W](«ì苎[Ç,± €h ´ê‚ÖAaÇ¡ê>»¬ U÷o±áw‘ªN5âèÙ;¯'¾XÇl° 9ýþ× ¨Zí‚uÿ„°ûì>°Êî2‹Ùë=#¥å­êEMc49•²Nø]@héw¾~óëû¯Ðh¬ù*œÝg÷pvð6=›®kŠ­þ—àZ÷‹ù…%ëD€ØXø#Àùpþ endstream endobj 259 0 obj <>stream H‰ì×ÍkTwÆñ¿¡Ѐpãªe „€.ÌB„¡¸¨›@7YEA¤P©‚™N ŠPc¨ é"Šâ Š:¦µ¢YÔ X›“Zƒ(D¬ ©4ŽäŌƗ‚ˆM'ñÞ9¿ßï~?QÐÉsÎóÌ}õÊÔÓéç{óW–6ìþè“]›wFÛÎcâç_îèíëWëA è'®Ÿ»Þ¾v@› }°ž¨ž$ß>«ÂœÿãÖpSs§äãÕß¾ðgÜSŽ 4g/þ¥œ×Ú+ó•üÖã˜áöé}$·¤)÷~åÿd÷@ùsB¦¥«p$¾ÁGÐ H¥º²½üù_io=Ž1n¿ŒÞGÒpûHŽ·{^ÿpb²”mï©Mçôo7ï,Œ§bšp½€$P’oÙu^«®lWÂ+ç­'²ÇíÏ¢÷‘(Ü>’ ’Þ0\lÙvJ/RרÖqèZéÙLäs. 6¥·2\I®=Wª+Û­'r·ÿz Áí#l‘÷~ï¡•ëòzµúÌK½w#p ½€€)·ÓŸvhÕäÊsëqÜÂí¿½àqûX|½øôïËVìÑ+¶áÈà½"|eÀ½€ )«•ØÚm¥·2Üzqûs ÷0nAªBï?ŸÞ¾çââúojR­úþÇwª^@`fãZ_Äõ¸ý¹Ñû·ÀT¹÷ïÝÿwöÁó‡ã¿Í¼xë·ª€^@H”ÌÊg­´²Z‰m=ŽÓ¸ýJÐû·Xõþ¥Þ» k¿×÷]¹.ß{c¨j߈½€0(•ÉZfå³RÚzpû•£÷na0ïý™/;]«klÓ Ÿo91ô÷ãêÏD‚^€ï •ÃZce²’Yùl=‘¸ýy¡÷ n¾sª÷ÇŠS[³Ý5©ÖÚt.ÛÞ31Y2XzþRê*{•ÀÊa¥±2Ùz"Ÿpû @ï#Ü>üålï÷ŽdZºtYËWí;V¸i=0?ô¼ÆíÃSî÷~áòíÔšýš°©¹³oà¡õ8@¥èxG«¤ÕÞ*u•½ÖãøŠÛÿ@ô><ÅíÃ;õþÓéç{óW–6ìÖ´ë¿:3úhÜz"àÿÑ ðˆruã×gµ±JZå­R×z"qûŽÞ‡¸}xÄÓÞר*…òØÙöž«}÷­'æB/À |ðŽ·•·{ߣ+H,n^Ð3”ž¤¼îý¾‡MÍš__k¿8ìã[@BÐ p_áòíúÌ-ªrUéj=N ¸ýhÍö~jÍ~m¬õ8Àâöá8=7éé©ü@ïçþº$Ó{©IµnËýXz6c=ð.z.»ug4ÓÒ¥]¾jß±ÂMëq‚ÂíÇA[ª]Õ¬ö¶pÄzà=¸}8KÏJ_~û“ž›´¢z†:xäºõDј˜,mÚqnÑ›÷UרÆç¸†^€›ÆŠS[³Ý*…Út.ÛÞ£,µž(4Ü~L´«¯åEÞ endstream endobj 260 0 obj <>stream H‰ì×ïOÕeÇñ¿!Å©[› —­*Êܘ ’|ÀÙ¦ÃÚtÓefæbS7W-& EG#‡‘©8•h«ÄŸ1Ì!4SÌ1OÉL:è8AÔÛ¾Öæ–åâœs}|^;cÀ£‹û¾>÷ÅUTv|â¬â¤”Â5EGú"¿‹¸É×§;ŸšVÀWëBDQÛx~ÒìšslJáÛº}gȺ¢»úËo™‹*ùùÌœWÖÑÙc]‘ÈCš â6Ñᑊš³ÎPXœWÏûi]‘?)ûqEßÒ½œ0¼mϺں"‘‡”}q6£ÔìrgQš“[éï¹ßÔ|eJæfçÍ]µ¿/2`]‘ˆæ‚¸ ïdZN=™±pGsëUërüLÙOz˜NæœéjzÛº‘”}q¶!v"g9bK È;)Ù~j|êFþêq3Š>Üv’ßX%¦¹ .îêu†Brz¨ªîœÞÆxSöƒN¦ŸéjN{ÁÊ}ô¹uEtʾ¸o#{ÛÝÈfÄ~´¹«péÚƒc¦p“3B‡Ž^²®H‚KsAÌñ$¾ú†q”RÈ7üh]Q (û‰ä49NŸ«ÉÅ–²/æØ}Ø€èC>ìDA~;:{Òr*œ£ÈX¸#ÜÕk]‘‘æ‚ØÚÛÐþì‹›hÂ+÷]ß°.'@”ýÄ£ÃésŽ=9=Dç[—#¥ì‹!ö¶gýab²®È½ôÌ s&c¦,]{ðVÿ uE,š b¥¹õª3R³Ë›š¯X—8ʾºžçðéR`]Ž޲/&ØqØtØwh¿I³KØ€¬+r—¡{ÑüÒ¦q3Š8Ÿ ³Š·V·XW$¢¹ ‰w­;²|}ƒ3¶í9Ãh]Q)û†èy:Ÿþç –­ûŒDXW$¢ìKâ±Ý°ãÐxì;l=šûÓxeE ÅgJææ-aëŠ$4$‘îÞ/*;>ñÏ¡°:¿‘wϺ¢àRöÍÑÿ¤€[ äâö!ëŠ$”}I¤“ßýÄ^ã,8óWÔhî?‰ö‹×gÎ+s-kÉ®kÝëŠÄç4$a¹05k ý–½l÷—µ.'è”}— $‚» dĺñ?e_ƒ-†]ÆYjØnØq¬+ò˜ÝÛžNûˆÓ›RøÎ†Ãwï[W$¾¥¹ À¼s_ÛéüÇÛðÕEëräeßUÈéàFHÊ÷ÝÖ刟)ûol.y‡Ùbè46šêmÖy'¹®øË¤¿Nrgm«uEâOš W=7ûWç7:ïØ¦ßò²YW$)ûnC:ÈIá^H Ù±®HüIÙ—¸bgqÞ1¶vÍýÑ»ÖÉZ²‹#å35kKûÅëÖ‰ßh.Hœ Ý‹n­nq†Âòõ ¼fÖÉ#”}w")ä…«!;¥UÍäȺ"ñe_â„=eZÖgmaÑÜ­–¶®çç–:Ç›óÆÞž›ýÖ‰h.H<4û15»œÖÊ\TÙváºu9ò”}7#5d‡ "G¤Éºñe_bŽÝ„ ÅYUØYØ\¬+ò­­Õ-fsÎI)…ù¥MC÷¢Ö‰h.Hl]ߘ¿¢†¦zî¥Oö6´[—#¥ì» "G\Ó˯ï!YÖåˆO(ûCì#l%ì&4{ ÛŠuEþwûÎÐ[ï1fzg>ivImãyëŠÄó4$Vú"kŠŽ0ƧnÜðé1Þ+ëŠäß(ûž@ŽH™"Yä‹”YW$ž§ìK¬°‰°ÐNì&o¾û¹æ~"…»zçäVrø|Òr*::{¬+Ó\Ñ‹TÕKNÑK‹óêy£¬+’ÿ¦ì{™"YÜÿz‘5g]‘x˜²/£ÇöÁâ,#l%šûVòäŒs¹«ößê´®H>stream H‰ì×ïO•uÇñ¿!Å¡›-7]ôŒábŠ[®É*å¦M733ÓMk–M x"q)L&C$)3Q+Å„rØ4˜æ/bž&4tP¢öλ\“2PιîsîÏk÷ðèÚ¾ßÏõ½®»wÅ›nßñ×ÇúÖ?19‹Ÿüά‹’¿\ïî{eyGÃ7!%ÿëo[¬+’HÂ…áæèÚȰôô׿9ˆIÈ^•s€.d]‘ ›²¹H¹#}dpmþ!òh]‘De_†-ÃY72–íÒ»ïNçZ:“Ò·:Ç4=£4ÐzÕº"‰ zd¸*ª›&¥pmæ,­l\¶.G‘²éHäÉ#©´.G"†²/ÃÂNÁfá¬ìlÖÉÿ¨ª9—ìç¼FÅg½þÞÞžÞ uEâvzdèÏ´§Ì-áÂøÒ kŽ\°.G‹²H"yä(Éæ‰SmÖåHPöeˆØ#Þxÿ v . û[†uE2TÁþÌMµ1 ÙœÝØÄÜÍe Ö‰«é]¡hëèZ¼¦š«2>iCÑŽãôëŠäq)ûQƒ<’J²É’SÒj]‘¸š²/CÁÁÁUa§`³Ð»‰:¯t§¿VÁ!ò==sSCc«uEâRzäánöÝú¨ä»q÷…å™5ôëŠdd(ûQ†l’PΔ´ú‹ëI®uEâRʾ<[»ƒ³D°MèÝtMgÛ'ÏúØ9ÐY ¶·utYW$®£wAb÷3ÏÜë!ÏÍßþcóoÖåÈHRö£9%­œ,É%¿Öåˆ)ûò_ØØœÅÂa]‘Œ˜mU'Ç'màdc²ßÎ=x³ï–uEâ"zä_1U¦-*×TÅ”ý(FfI.çûü«edÙºqe_c;`G`Sàn°5°;XW$#S^™µôß§\¶»Ñº"q ½ ò€+×z—gÖp+Æ%ææÕÑ=¬+’Pö£É%¿¤˜S&ÑWº­+·Pöåå{Ù¸l +>دw?ºµutÍZ°ãæ›:{KÓÙvëŠÄžÞ¹/Ø?P´ãx\²Ÿ+±xM5ú" !eß H1Yæ É5é&ãÖ‰=e_îc`#pVv½ûÞQ÷ýÏgltŽþ…%;¯uݰ®H,é]wÀ—VÈeH™[r¼éër$ä”}ï Ñäšã&ãþd]ŽSöÌÿ/.Ùé¬ìGÖ‰Íe cs¹c¦ädnª öXW$6ô.Hsàòœ¥•\ƒI©ÕMÖåH˜(û^CºÉ8‡NÞI½u9bFÙ÷8f~&æ®»uEbézwßÂÕ{FÅgqâ’ýûŸ·®H è]ð2šÀ»þ¯b²c}ë׿âOëŠ$|”}"ã$¼“úwò¾Tä½IÙ÷2¦ý'§}È`þg PG õjÊÜ._RúÖs-ÖIXé]ð¦Ûw>ù쇧žÍçôç½UE°®HÂMÙ÷,òNê9}:}€n`]‘„•²ïMLøÌùÎÀÏä¯w_Ûwøü„”|ç’,\½çzwŸuE&z<èØÉKÓ^*æÜyj]´.Gl(ûGöáŸôër$|”}¯aªg¶ÿçÏ´ÏÌo]‘¸×Àí;yEuc¦äp[b}ëýÅõüǺ( 9½ žh½:åçœx\²¿äÓʸ—)ûB Ð ¸ túƒuEʾwqæy¦zNœ Ÿ9_ï¾ Åµ®Ëvqmø&ÎØX{ì¢uEZz<¢§7˜³å›q‰¹1 Ù«rtëŠÄ˜²/º=ÎÀÐH— WXW$¡¥ì{3<“¼3Ò3ÛëÝ—á:×ÒéK+t®ÐôŒÒK¿þn]‘„ŠÞ/¨Ü{jRj¶¨¼9pÙºqe_þ‰Î@àJÐ+*ª›¬Ë‘Rö£sûŒ—K1~êì-LõÖI«ª9—ìç.NÈ~sݾžÞ uE2òô.D·Æ3í3çmãˆ}i…5G.X—#.¢ìË`t zƒ¾A÷°.GBBÙbÌêLìÌí13<“¼uEç5! endstream endobj 262 0 obj <>stream H‰ìÖÿK•wÆñ¿aeT[[PРhYâfABY4H†ƒ"&Û  *LÖË¡v2ªY3i¸eár3‚<³meý°$iî4Ê(YJ…ÓèËÄf_<êÖÞö Ûš+¿½Ÿç9׋CØo7<÷}}®Gä?"Ýlù6.>÷…×rÆ%>/=k=‘DÙ÷?üÂÇå_ëA$ÊnÞn_¹ñwBRþöâÓܲõDâ.º}éYAb¬Òrówë‰$Êtû~Uüåtu>.½=+pLï¾DÅ2mÕAŒß´…;Ï„¯[O$Q£wÁvtõÖ¹uÙ!î×z"q#ݾ<¹Az°!$ yBªXO$Q£Û÷š9ýÜ)ê4v½û2|þ¹l‹3ökÙüAï‚Ï„N^ž¾hß4%=®k¶GÜK·/ÏE†$ì ©rôø%ëq$:tû~BO]Qâ”sZ:]Ýz"‰ Á²Ú_ßÂÖÅÅçfŽ=ì貞H†Dï‚o\¨¿á< S”WÖY#n§Û—~"OH¶…„!g¬Ç‘¡Òíû œNçkÒÌéçÖIl¹w?²vSÅèÇøòìü²Ðyë‰dðô.ø@kۃ̼J¾ãøÄ@^á).Ôz"ñݾô©B¶0ìÌúœoÈë‰dðtû>@÷~eöV¾#mœN®w_¬4µ´¥¤YE~³ž»Øl=‘ †ÞO‹tv¨™8§çQXžYÎUZO$ž¡Û—"aÈÖ†Ì!yÈë‰d0tûžFߦu;õ{þ;A½ûâUÕ SæípÖrÙšC­m¬'’Ñ»à]\_RÚ>_òÒâêÚkÖãˆÇèöepH2‡åI|«ˆ²GL·ïQtlš¶S¹éÞº>q›‚½Õc6³ŸcfæeTuÿñ§õDÒ_z¼èÊÕ;KV—òá&Íݶ¿Ý¾WТg¿ý¤T×7Þ²žHd*N\šœÜÓZGÍÈÉØpøn{‡õDò¿ô.xBuíµä¥Å΋PUÝ`=Žøn_¢ˆ\"Ø(’м²GžE·ï~4gú3-š/E£¦W[O$2‘Îî삪13óØä± ›?ÛwÆz"é›Þ—kji[žYÎ7š8gkÑ.Ëz"ñ ݾDéDF‘TìÕ{ë¿&»¬'’¾éö]ŽÎLsæÑ¢éÒz÷ÅëZÛ,[sˆ•æ7eÞŽªêë‰äiz\ëÞýH^á©ñ‰>Pf^%×d=‘øŠn_†IE^±Zd FŽYO$OÓí»=™¶ìÔfú³Þ}ñ“s›g-.tÖ{á»{›ZÚ¬'’'ô.¸SyeÝÔ|šÔ%êoX#>¤Û—áCj‘],Ø«ó?%ͬǑÑí»ݘ†ìTe:3ÍÙz"‘aQ:?!)Ÿ=Ÿ»vSŽû뉤‡Þ· ×5§¤ù(Óí ¼l=Žø–n_† FޱfdÉf=ŽüM·ï*ôaZ1ݘBO¦-[O$2¼vteŽÅ=Þù—ÞØ,«µžHô.¸ÈÍÛíë²C΋°½ø4÷b=‘ø™n_F9Fš‘i,Ûš’rÖ‰nßEhÂÎuÐiÈz÷%vð¼ùþ>–Ÿß´…;ÏþÜd=QLÓ»à‘ÎîÞÊ´rãU&º}1dÉÆ¾‘rdJ¯-ݾÔžÿ•ì”aZ±Þ}‰MgÂ×{!mÕA‚½ æB'/'¤îæ+¤¤ÃuÍÖãH¬ÐíË#ßH9¶ŽÄ#÷¬Ç‰]º}[4^z¯S€iÂôaë‰DŒí.©—à"ââs?Üú]¤³Ûz"ßúK€φé endstream endobj 263 0 obj <>stream H‰ì×ïO•uÆñ¿!¤nmn:ãQ‰"£‰F[Ö¢–ŽÍ¥[.m®l6sYm²É‘d.„p¨0EK0±IT$š¦ƒÊ*¥ë,‰aCÃ!ÈÁƒöÎûAAÎÏ}ßçzíìÌO>ûîû½>×¹wïÁ~ìxìém|ñÿCíÁëYkpþI™E‡¿úÙzI,zûb‚¬#ñ¸{¤_[Gõ8‰HoßJh$üaaôä<Îfj~Éfë‰DÜâÖ`èí­'¦Þ³Ó ŽÔýb=QbÑ^0Ñ×?´)PÏR˜•šØ}šW`=‘$½}±Bâ‘{¤H’‡Ö%½}ô[Z.'Oã¥÷jï‹ü_°³wiÎ^ž ŸEY%m=Ö% í…8 Þ-ÿü'g)¬ÚXÃÍ·žH”Þ¾Ø"ýÈ@.!yXvèÙh=Q¢ÐÛ3:í¢—KŠK×ÕÞy¸ÆóÌ[²Óy29o}Ñ×?d=‘ÿi/Ä7<-»ŒæÕ=ç[®Z# Mo_Ü€$$¹Šd# i=NBÐÛz,mÖ©µô[Ýp‘ Þ-ØsvFÊvÞÎôþÌ¿XågÚ ñìì]ùÎŽzÎâÂýÕu«ÅœÞ¾¸yH*’\HÊ3ii=‘ÏéíÇÓf_à¨é´j³"“ps`xõ»5<">s3 OœüÍz"ßÒ^ˆ5.óG…ß³¦%ç}PðµžHä_zûâ*d# IN’–d¦¢2vôöcÖJwuJ,mV—Y$m=iÙe΃Zš³7ØÙk=‘i/ÄTUmkRf'¼|ýáöàuëqDþ£·/.DN’–ÜÌyKv’ŸÖãø“Þ~ìÐTé«Nq¥ÁÒc­'ñ‰ã m³Ó xYSæo{ý½/o †¬'òí…iný+cE9g›’U¢ãÒÛ×âZ’œÜORô|ËUëqüFo?h§k6£©r¶´Vº«õD"~ çîjœ¾ À+›™š_\Ùd=‘h/D]×µþµ[jPz°™Ûk=‘Èèí‹›‘œä')Ê-%QÉUë‰üCo?ê襴SN•¦J_ÕÞ‰}ƒÙëªxn|ž|ö“s-W­'òí…(º=|çãÒ3³î/… ¹uÜXë‰DÆt¼¡‹Ê·õ "c"EÉR.*¹Ø}šŒµžÈ´÷£ˆ.š”YäTS:ªö¾H|´^é^øÒnçé-[]Ñu­ßz"oÓ^ˆ–£õ—ŸZö)‡™µæÀ¯í[#2ŽŸáºòm=ˆÈ8HTr•ëJÆ’´Öãxžö~TÐ?i¡N¥—ÒN­'I8ûŽ´<‘¶ƒ7859oS þöð뉼J{!rt•çWU¨«ˆ·è÷ x éJÆriŸ[¹ÔµÇô÷#Dç¤yÒ?9Fº(Ôz"‘ÄÅ{ÜœÿÞc„´"Ñsc`Cn8+5gù9î¤õD"¥ßƒâ9d,IKÞruÉ^Øz"OÒÞm“ÎÉÒ?i¡Úû"nÐu­Ùê &Ÿù/·^é¶žÈc´&'4.=Øì,…µ[j¹‡Ö‰<ý"oI]n/ \\ÙD[Oä1Úû“CÃL~±Ø)œ4Oí}·iºÔ™”Yä<ÒìuU=7¬'ò í…I¨;õ{JV ç–±¢üÒånëqD&C¿ÅÓÈ^˜;L“ÉÖãx‰öþ£¢UÒ-’IÛ¤sZO$"c*®lš™šÏk¾ »«14¶žÈ´I{ðúòõ‡PUÛj=ŽÈäé÷ ø9Ls“_yóùl=Ž7hïOM’>I«äÄh˜ôLë‰Dd|·Co¼_;eþ6^îìô‚£õ—­'r;í… º90¼)P?-9oFÊö­E'¹iÖ‰DD¿ÅHc2™d&ŸIé¾þ!ë‰ÜN{‚Ž}{…&ÉYÑ*é–Úû"Þìì]š³—'Ì'-»¬­£Çz"÷Ò^Wxôîþê‹srP«6Öp»¬'‰ý?!™Ég®4YMb“ÛÖ¹—öþ¸è´G§FÒ'µ÷E¼ëëSís3 çüÚÆê›ÃÖ¹‘öÂýð§³øþ¡)h=ŽŒáÎÁüm endstream endobj 264 0 obj <>stream H‰ì×ÿOUuÇñ¿!¡››KKh%J4¢ °5Ûd — ×ÒM7k†nlÚæVÓâÛ ÐTÌ/1¿_r¬A´T 4†s(ó s°d$›t/ò¥§Åš¦YÞ{߇s^ÝÝ¡?½Ï=ç¼_¯ÏؘüWy[xìÙL¾­ šïÚâRJy°ù>~êgëq\êȉËüD|[âF7{ÞÎ8ÈïÃgFbÁ7µ-։ȣÍßv<*&‡÷šoþ欇råÂý´µßX’qˆgzBÁ®ƒ§õäˆÇè<(žÄ®fc³·y¼Ùálrë‰\G¹ÿÔE¼­;П–¾ŸœÏ“‰…5õ­Ö¹ˆrá^½}ƒÕ‘ÑYk²«y~¬' >ÅÃØÛlov8›œ}ÎV·žÈE”û÷¢Ò¢HcTî‹xÕÅË]Ï¿±ÕyÙ_IÛÑÖ~Ãz"WP.ÜeoEÓ¬y›øM¾»¯¥íºõ8"¡¢ó x;œMÎsÎVg·[ãÊý¿£ Ò rHK¤+ZO$"!w êÜ´ø|ÞúˆÙ™«ÖWöö ZOdL¹0îÌ…«I‹ï„BLòæªÚŸ¬Ç -Å'Øçlužv6<{Þz{Ê} Hä× Ò­'‘ðþ°ðhdt`rlnqYƒõD–” èè ¬XWÁï05.ç'Äz"‘ÓyPüƒ­ÎngÃó̳íÙùÖYRîƒçÈï@¤*÷Eü©ëמ”wö² ø<ýZQÙvë‰lø<n Ü.Üþ£SVo¨â©°žH$Lt¿aóçyìÙùl~ö¿õD6|žûô=ZŸSÿèÊ}ij¾:¾^_ZÖÙõ»õDáæç\¨ø®ù™ùŸqù¯¾µó|Ë5ëqDÂJçAñ'¶=;Ÿ‡ŸýO XcÀ·¹OÇ£é9•îG´žHD\dçÆ©qyì‡Èè¬÷s¿½5pÛz¢ðñg.Ð’—ïvúÀWÕ¬Ç1 ó ø›ŸýÏ+@Öã„•sŸ^G»£ãqáô=ZŸõD"âFìŠUë+ÿkW”}Öz¢0ñ[.túWo¨â’§Äæf—Ôqß­'±¡ó øûŸ xÈÒÁz¢0ñ[îÓèèu\2¦§Ü‘ëè Ì_úKƒÏÜ%MÍW­' 9ÿäÂàÐð–='§Åçs½+ÖUp¯­'±¤ó ÈØŸ¹O"ð.dIa=QÈù'÷iqt9§ÔÑî”û"òðjê[g&mtHê{_vú­' !Ÿä÷4&y3Wš˜º½¾ñŠõ8"ötG.¼$ya=Nhù!÷inô7§ÈÑè<OE$DŠË&?—Ã&™4'{ç5ƒCÃÖ…„çs¡¥íú¢•å\ãô„‚½MÖ㈸…΃"w!#žz¹÷‚Ô ;¬Ç oç>mÎFsã£brèrÖ‰ÈÄv³g`ÙÚó3Ù*O¼ôIå±KÖŸ‡sÛ÷AÁÑÈè,?ø§õD".¢ó È½œà 5ȯ‡‡sŸžF[ãêhnô7OÞ>1ÑÖ~ãÅ7·±^øÄ¥”^¼Üe=Q0y2†GFw<==¡€K[´²œ;h=‘ˆëè<(r?¤FZú~^r„4!S¬' &Oæ>ÝŒ†æTµ–*÷E$*]š‘xç|1;sÙÚÃ7{¬' ïåB}ã•ÄÔí\ÑPSßj=ŽˆKé<(ò`$ˆsÄ SHëq‚Æc¹O£•Ñ͸(zmÍz"ñ²á‘ѬâºIs²Ù9Q19ŸŸ°ž(¼” W~ùmIÆ!.gZ|þ–='¹_Ö‰¸—΃"ÿŠ)ÝwŠLáe!_H뉂ÀK¹O£q9t³Šj”û"Ýþ´ôý,>3“6ÖÔ·ZOôH¼‘ ½}ƒÙ%uSbs#£³ÖdWs¬'q;E™B²/¤ YCâXOôH¼‘û´/:˜SÆheÊ} ¿³—:ç.(qQÒâë‰þ'äªs³æmâ*’—ï>ßrÍz‘‰AçÁ‰ãKËù¶ endstream endobj 265 0 obj <>stream H‰ì—ýOUuÇÿ†—l.Ë6ý¡¯™²¡+ç`å.Ç–›¬VNÜÜ’­ÕÒ ðN|0 ÑiQ%7]*ÚƒL·œ‚Êl8â9é>€ öÒÓƒ• ÷|ι¼_;cðÓ÷}û~^ïÏœléJÏ*{àÉÜɳ6T„Ž[Ç>û¾oá-øid˜t„#© ¶ò <ÓÒŠš:­ !F5aÂô&R\ /{EõÅK}Ö‰†Œ¯½Pߨ9;³”ü¹…¡ƒ§­ãá'V¿÷-w‡ŸÖA„ð¸&1½˜»ƒ}puœáà_ïÓ²èZ4.ò?ôtÌ:‘BÜäJoNpoü­é”,­¨³N44|ê…®s=¯¿õ%ÉÇ'¯^Wr˜ÿ‚u"!|†öA!†ÆÁ;؇„‰ð‘u¢¡áSïÓ¯hY$§qÑ»ä}!„×@/¼RΘâyìÙMGêÏX',¾ó‚ßE,„GÐ>(Äý€}–¼³›K„°’ÖßyŸNE³r*VzV™¼/„ð2·,ÖC_Œ,y!tðt`n!gg–Ö7vZÇÂÇhâþÁDøˆ«„›0”uœAá#ïÓ£hSN­¢_Ѳ¬ !Ä (­¨—dvÅòr‚{¯ôö['º~ñ‰æ³éYeD(Ä‚›0žÂV8 sY'º+Þ÷>­‰îDHzmJÞBø—Žp$uÁVÏ´´¢ÆæŸ­Ý/{aàÚõÍåG)¼¼ì³öŸ~µN$Dì }Pˆïc+næÂ_XÌ:Ñð²÷iJô%§8Ñ ä}!DlPSÛ:)u½3Ü^ZòIwä²u¢àY/ðÝ’çm![Êü’Úºvë8BÄÚ…ˆ8 sq¿°.³Žóo¼é}ÚÉ)K´&~7!„¸O ÞÿîÁÄUL¹±SóW3píºu¢?ð ÚΜÏX¼“Tg®ÝöéÞùVBÄÚ…ˆ*ø ‹qË0^³Žó7^ó>–§ÑŽHES¢/ÉûBˆXåBOï¢å•c¦ä2ñMY[}à”u¢›xÊ |¢·×îGñ<~áOëDBÄ,Ú…ˆ6IÇ;Ró”÷éB4"òÐŽèHùDBUN¶t%ÏÛÂè㙑ñAÛ™ó¶y¼ã…ª&μ)…ŒÅ;›Û~±Ž#DŒ£}PwÀhxë†ã0u¯xŸþC r꽈vd›G!\¦úÀ©Gf¬aŽ™’»hyå…ž^«$^ðBm]{Êüb$¦×Ô¶&bô }P7ÁnIÏoæÒá;¬g˜ÄÜûtšý‡?³†Fd•D!lé»:°rcÍØ©ùÌÃqO­*üðˆI [/t„#Y9Ÿ`Âô‚ÍåGù&&1„…hÂep¦Ãw\=܇MbØzŸ¶Cç!ý‡$ï !DwärÆâ FžI©ëkj[]`å…‹—úò‹%$9}éÊßÁåBŒr´ a¾[–û·âAlèr+ïÓpè9Náyñµò¾BÜNCSç´´"gHÎY¸½#qíh/ìÚÓøÄœw97=«ìDóY7B8hÂ܇¹ƒØ'ºy´ûÞ§ÕÐmœ’CÛ¡ó¸v´Bø‹_Ÿ¼šiÈË^Q}¥·ß…C]ö±“áÙ™¥Ž«¾nrçP!ÄÑ>(„9»÷ŸÂ†ÜD̈Ý9ÔMïÓdè3´N¤á”UÖ»p¨Bø&gNpoüŸ“³´¢.Ú'ºæ…®s=KW†œ÷ZWrØmWq7´ á°!NÄŒÜG,‰+£}¢kÞ§Ã8ïE«¡ÛÈûB1xÂ]¿ÍY¸Êóøs›š:£w– ^è»:°q[­#…W߬êG¢w–bhÂ;à}üȕĕoFï,¼Oo¡½85†>soïÿ.À¹0êQ endstream endobj 266 0 obj <>stream H‰ì×ÿK]uÇñ¿!sè` 4H"š.‘DH6GY$d°a_p4cÕH°Æb#ËïKÓM榠t G™Ž‰¦ÖКó²åd*Y3ÑPQêæunö¤CšÓûå¯÷úzp¹è½÷¼Ïç—óy½>‹‹""²¼ö®Á§_(|l[:¯„äªÑñi+îrñ§~æónÅpÔ5߈ˆ/æ;_/ëê¶è."âªÜã­<˜¼{{!"òRr×›§x0ÉMÒÓ¢»Xšût‹Q]žÚU@“±â.""JQE{pd6ûj`xÆ‘/ó æÎ·.zÆ^}·’ᡱùUµvÓ狈'tYŸHLr“Ç“ %IMŸoQîÓOh)t†Ó[h/æÎÙÈff~ö}@X:{lH´­ºîš‰Ã­È…ɩ۩™õ„BPDÖ…ͬßÄá"b EÖ-r3óØd(IJž’ª&·"÷i&ôÆÒUÞ?òr_DÄ ƒ;ËØly=—p¼§Ô”±ææÂ½û§k®¡”r–5›2VDL§ó È:G†’¤<§¤*ÙJš2ÖÜܧÐIŒrBKQX­éÒï[còŒ7ñƒo&§n{8ÐÄ\`mQ '˜Æ{Û¯z>PD¬£ó ˆO¸ÔyóA¶’³ž4+÷i ô£ÐLÌ:`ŠˆÈªîÝ·•¶Ed±óÎß|âö4Sra`p")å,sžx>ïtÍOÖ#"kCçA_Aª’­$,Ï,iKæz2ÍóÜ7·‡ˆˆˆ{nMϽõQ [1¯­1y -}îÍñ0ff‡ó‰ƒÀðŒÔÌzVåÞYc:Šøö`ÎÒ–Ì%yÉ_÷æx˜ûô Z‡Q?Þ8P­Üñ®žþѨ„ƶ¼#±l`pÂÕ žäBU­=46ŸËwï?Ó;0æÆñE|iKæò𒿤°ÜÎ}:Mètˆw+œ«ï‰¶±?„¥'z~fÖáüµîåÂå«C1{NraD|q]ó ×+"Þ§ó ˆïjhé#y„ÉbÙ¥kÝÈ}z킎Á…ôêºk.®WDD,ç˜_H+hÚ´=“½:82»¨¢ÝÉ ]Í…¡‘©}‡j¹dKTnIe÷uwÉ"âM:Šø4ò—ætƃL.“ÎN^èjîÓ(è\žAÓP¬g£ãÓ ÉUlÚ¼BcóÛ»W½Äù\¸3w×VÚ¶ùßP8VǽÌX²ˆx‡Îƒ"~€,&‘y–Ig2š¤^õçsŸA—0JíB¹/"â+ìׇÃ^*26ð¸½åC#S+üØÉ\8WßýLÜQ~ùbRùo½›º^ñEü¹üòÛ<Ñ$5y½òÉ}šýÁ(ÛâŽÒ+L]¯ˆˆ¬…SÕ[¢rÙÉÏø$»áÎÜÝe¶j.¸”2"â+tñ3d4IÍsMj“ÝúÙʹO[ 3Ðø -‚.aÙzEDÄrìê©™õ+ïê+äÂèøô´:¾Ý™SÒú¨¥ˆø"EüIm+m#µyºIprüá߬ûôÚßÒRÒPø‡¡‘©¸½ål>}å˜ýúðÒo—ÍÇüBIeGH´¯öªeÂÚ.YD,§ó ˆ¿"µÉnprœ4'Ó—~»lîÓ hFU 3(÷EDüÏÏ7ŸÜù•±Õ¿öÞ×㓳ÆççBCK_D|1Æì9ÙaÿËKëké<(âß._"ÇyÌÉt’ýÁçÿË}ú­À¨ô„Ö_þðÒzEDd-U´Gf³çoÚž™VÐä˜_Xš ½c»÷ŸáßÐØüªZ»·+"ÒyPd# ÍÉtvò”_\r¤ÐèüK7 !x{±""²ffï|üm@X:ûH´íóÂ&þ8±ç`Î…ÀðŒ ˆ¬Ãy·¦ç¼½L±–΃"¹O²“ï¤>stream H‰ì×ÿKUwÇñ¿aY´¾€PÐ`cËæL ·#&[?$‚L¤ØQBÅ6 vóË\»Û¬¶™âR"§%LçÚÊbk—ÚpÍrѺ, ¶)6µ¼fµ—~àâ°Ô{î9÷x¯ÏÑ{Ïùøùåžçûóà0kù;{Ó2=öL¾y-I.ÔϬ·kô¾Û[ Eз^?ÝÞ€HPß³skƒÅ7¯ÔŒ2ºsÙ_œKØc¢°!§òÖÀ°Û;!œ¹F•WëMôUÍnïàgovn­Š°xu¡~Î?.LÜ[üù£÷;Žã<Ì*»ú®Ê‹¿$y¬þš4¸½;@D <¥ga‡§éø‰K*‚~fn;ª_ôZ‘¶¯ÙwÍímpçA`ŽPÓUv“xµ>Ø}Íš4h*Ðlàö6‘P]ßöÄ )é[_ñßÔ;ߟ½ª?õS¿_¾Úó\ú~“Œ´ÌCþÎ^·÷ À)œ˜§Ž«æ&ë‰éûUùÿï¾&W_¯ÒŸš 4!¸½_€ƒZÛ»Öe•›"4žþ=øþÄ.5ã×ë͸„=Ûw7 ÜØ/gqb˜Ú­‚«ãúš«é*{ð£ÉÝ×T Ù@ojNдàÆ~êîù÷wëõœ_šRôaÙO‘щŸNî‚èš÷Š¿›?Þ‘Ç“ VýÙ-pçA V©Új·¾àêø;…'fØ}o…Os‚>ÒÌ É!²[8âÎð]Íãý­¼Æž¿&_óÐ.º~ã›ÕúT¯§Ö|®µÓù-ˆ΃@ìQ©ÕknÜB÷5-èSMš4E8¿e€S¾>ÙñôKŸè©¾.«¼µ½ëQ—MÑã— 7‚qÙSùиˆ:œX¢:«Ñ&Öª¶†ºrÚî_¸Ü­ÉA×hŠÐ,áÌ~úíÊ_é[ëIþä‹Þº¦ö©/ž¶ FyMË’äB]9?aÏ®‚oï ßµo¿\Àyˆ *²º¬:ë½xu¡z=õõ3ì¾æu¥& Íöíà ¾þÛ¹ùßèé½(©ÀSzfp(0í-3ì‚hµí»âÆ‹³4¥¨¦ñ¢[à΃@ P‹Ud}—Ug5Úöîk–ÐD¡ë5]hưcËGFFT_S¬‡vÎŽºÝý3¼qæ]0´òú×*t‹^Ͼ\Úv©Ëê–¸‰ó ÕÔ_UØäx]V¹£Ýß²ë¸nÑŒ¡ICó†Õ-œÒì»–ôÊ=«S3Ê|-×Cº7Ô.ÿãŠç÷™ en;Ú×;¤Û¸Žó ¥Ô\•×$X-V‘CºÝZ÷5]hÆÐš7Býç\ñßÜ´õˆžÏËÖ–|Y×jak]0>­<·0q¯n_°Ê“çmŒŒZX€+8QGUmÕ\}yÕ_o…ÏÂ"át¿º¾Mó†n×ì¡ Ä »Ü~¿ä¤r —~ÑŸÖÖ § f›w›·2_‹,O-i8ÕamÆyˆ.*¬:«¯­š«òºØ}[Æ@8*¾úuÙÚ±(lÚzä?ÿ g©0»`ø;{S6~¦uôÒ/an @p¢…ªjcdíê¾&­£iD3I8KBâk¹žšQfŠÐì»þ‚¶tÁh8Õ±>stream H‰ìÁ€ÿ«ë jw—ò endstream endobj 119 0 obj <>stream H‰ìÁ€ÿ«ë jw—ò endstream endobj 68 0 obj <>stream H‰ì×ÿkÕuÇñ¿!7Y†!$Ì¢œ^Œe$©XÄöàb0’˜`›dfx÷•5­Ô”93“µU2bCWy+Ñ¡”md3[¶K®µÅ\®»î¦»ónö”O¤-+ƒ{ïùÜÏçõà"úÛÙÛ×Ù¹¯«W%|tìÜm÷náOëADnIKûéù¹5„6#'XZÖ6>³ž(]Õ¼q”gäOëAÒÙ#äg$“$Óz"‘[¢»/""7Ò]tÑ}fpiÞvâÊgÍ“{†"Ö¥7õÁ„ ‡¤Ñ‰%ù$¥Ö‰üÝ}¹‘ßhäRaI³ó•;{e}¨³Ïz"/PL 2I2ˆ’Uk=‘È?ÒÝI%.BWÏ õ"ÿFwAÜ,6/ß𻤂”f*_ßwÂz"ïPL8òIJyUKnI¯õD"7¡»/iE“²ž"6Uw°qÊÛ‡G¢Ö³ˆÜœî‚¸VÛ‘³ WÔ‘Ï9‹·o<8´žÈSÔ“”’UËÛ’^2l=‘Èlºûârô&Ú)¥IYÏ’ü8ë7·òãÌÏ­y¥áxl*n=‘Èlº âBßÿðKnÁ.’ɇ¿„û/ZOäAêƒÉCbo poø‚õD"×éî‹kÑ•hLô&"J‡þÍz¢„éê\]ÔÈÏÈßÑþÉ·Öãˆü…ÊXt²xãÁ9‹¯}‘^¸¢®íÈY뉳žH®Qtö‚í`GøOa_Øë‰Ä³t÷%5h1tçw톎c=QšØPÞÎÎ[VU½óèåÉ+Ö‰gé.Hò|sn8¿ƒ€ñy¨pÏùŸ~µžH®St!v„MqV†Ýaƒ¬'ÒÝ—d£¹Ð_h1$F3<µž(}Ýûsþºý¼ä=¼öþ¡ëqÄ›t$F#— Kš¯µÙ+ëC}ÖÉlꃮž°5Îú°Gl“õDâ)ºû’Ttš {ô©}tëq<âÏW}xí›zUI8Ý…ÿçw€Ø/U endstream endobj 120 0 obj <>stream H‰ìÁ€ÿ«ë jw—ò endstream endobj 69 0 obj <>stream H‰ì×ûKÕwÇñ¿a­°  û¡²‰L„¤ Ì&Ì`Ñ6¨Q¬Ú!¨ ]˜,/ó`Ëu5ìÆª1Ëf[ÎXËV–ضҭÌrÒÙ&¢a¢9šçèÑöŒ/D[V^޽Ï÷œ×ƒÃ!úéŸÏë¼?¯{÷äÉBƒCŸï:?e^Îss6Ç%æzöTñ?ÖCÉ0òwŸçŒø¶D†AjÈ âŒH™RŽ$\N_hâ^ñm=ˆD›k·_Y~€Û5;m[iE½õ8Ѧ/0°¥øâ´¤<þ™Yåí~ë‰$zh/H褉L9á"edÍz"q7í} #ú­„nÂ¥¢§ÐV¬'Š µõ­Î£+1}gùÙ›Öãˆëi/È8uû+7Ÿ4÷þc5>ÅsâtƒõD2"êƒîròÌ òÅ‘‘5Gî¬'·ÒÞ—p¡‰ÐG¸Nt“ßþh±'æ.«›µh+ÿ×ßûºÑ{Çzq1íík¦&åq…¦ÌËÉ*¬ ö‡¬'’‘RtòEÊÈGîHŸõDâJÚû2~´:‰>B+±'võô?Ýz&.1wrBöúœŠnÀz"q%í›ó¿üõÂÂ/¸<|–¬=ÒÑÕk=‘ŒŽú Kuùî’8'zd$ZO$.£½/ãAã wÐ>è üD±žHîy›;—¯;F®gÌ/ØôJhpÈz"qí­–6_ÚŠÎsô¥WwÔ]oµžHÆB}ÐÕÈésbHI¥õDâÚû26´ ºƒûCû ƒXO$ÿq®Æ›œQÄéð]õëßÖ㈛h/ÈÈõÖmþáù„lîÌôäü}%—­'’±SŒKkI"çH*É& µžH\@{_Æ€~ñ kTVß²G†ÚôÊŒùœÔòuǼÍÖ‰;h/ÈÑþ¼<7æÒËÓíÔ£I$“²9MJN­'’H§½/£B§ YpgâSø¯ý¨ðŠ endstream endobj 121 0 obj <>stream H‰ìÁ€ÿ«ë jw—ò endstream endobj 70 0 obj <>stream H‰ì×ûKÕwÇñ¿aed4+Æ.r‚´é¨Ø"&CiÅhs ª_V+ÖQ—³Û´ææº`æ²±t3»l;›)˜]D”²fQ)jimÏøŽØ¥‹—s|Ÿï÷¼Dýé ŸÏy½_Ÿ$:”–×Mš‘óÜkÆLÝðñÚ#Ý=}ÖÉèùù×FŽžŸÖƒˆÊ@S|Êv.@rza ºÅz‰ Ňk_|kw#-£¤¡ùºõ82ª´¢MÞžªØ„l=Æç_»©¢ï^Ðz"±±ñëÓ\~Z"6øî¯ßZIp È’Áz"%Úûщ†OÏçèã’riþÖãH$êìê]“[1>>‹ÕÀ/üi=‘Œí…èQUÓúÒì­7ŸÔ¥Åí7º¬'Kz ÈÒÀ‰ò”°žHÂN{?Ú8%Ÿ†OÏWÉ—gjn½9Ù~R".)w׳Áþë‰$ì´¢Áå«sív*ß+ïl«=ßf=‘ØÓ{P!^ó•d‰a=‘„‘ö~ô ÉÓçiõœxZF =ßz"qÊ@Sbj7'9½0PÝb=Ž„—ö‚·Ýí½¿:ûXŒÏÏ)OLܸ³´Úz"‰zʤ·‚Ä 7Hë‰$,´÷£ž&ÏYÓêéöÖãˆûû öý>iF·hኃ-Wn[O$ᢽàaE‡jœv7Öç_¾®LíNþIïAù?Râ“Ï"1¸¤b=‘„žö¾çÑÛiïœ2M~ÇÞ3´zë‰ÄÅnuÜY™y4ÆçŸ™²»§Ïz" =íOª=ß6}^>'Ëg΢ݗ¯vXO$GïAyƒÜp„$!O¬'’PÒÞ÷0º:ÞN{§ÃÓä­'¸ÐØž²¤ˆè˜2kKiyõ8bÚ Cø¿÷á>§ÈMž¹¹2Ðd=‘D(½åéNU5“!N˜**–ž¡½ïU´tº:‡Ko?×pÍzñ ò—âS¶sÇf/ØYSßf=Ž„Œö‚gôÝ ®ßZ9nZ&ûzVÞž*ë‰$¢é=(ƒA’Ä&dsUȆœ±žHFJ{ß{hæôsŽÕ77Æn=ŽxÙÝÞû› ›˜¸‘ûöѧ?¶ß貞HB@{ÁÊŽ_|þ/9Ê1S7,^u¨³«×z"‰tzÊ ‘'¤ ÙÂ…!gHë‰dD´÷½„6N'ç@éç´tººõD¸xË>;¢‹çÚ nw¡±=1µ€CäófÚ·Í­7­'wÐ{P†„lIN/t¢†Ì!y¬'’aÒÞ÷8=œ6Îiò$¤Ÿ[O$Q§¦¾mö‚Ü@ßܼò—¬Ç‘áÓ^p¯Î®ÞÅ«™ú°ž½œ[vü¢õDâ&zÊ03¤ 7‡ä!H!ë‰dÈ´÷=€îMçiãtrëq$ªýp´~ʬ-ÜÆ”%Eç®Y#á½àFÁþœo~ŸÅÙ›–™µýÿ±J\FïAÒæ‹§Iî)D)ÜE{ßÕèÛ´nN^Z^g=ŽÈCÝ=}™ù''$dÇøü+3Þê¸c=‘ ö‚ëTš&ÏÜÌ©ñ™¿l¿¾t2/¿¾áOë‰ÄÅô”‘»ÐØN9¡D:‘QÖɳi﻽švMÇæàèÛú¢I$ T·$§rWS *MÖãÈ h/¸BwOßòuec}~‹PZ^g=‘¸žÞƒ*$’ÓTÉ(’м²žHžF{ß]hÔôjŽŒŽMÓ¶GdPv8—”˽MË(in½i=Ž<ƒöBä+üþØ„lŽ)Æç_}ìnï}ë‰Ä ô”ê»$È(.yEjYO$O¤½ï´hº4‡E¯¦]û¬'‚ήÞ5¹ãã³øð ZO$O¤½ɪjZ_~{ÄçÝö¶ß貞H¼CïA 92*ui±Yd f=‘<†ö~ä{T¤c|~iqµ†æëi%dN\RnñáZëqäñ´"µ*eI‘j•„Þƒ&ä©åÄ9FšYOô·¿ìõ endstream endobj 122 0 obj <>stream H‰ìÁ€ÿ«ë jw—ò endstream endobj 71 0 obj <>stream H‰ì×ÿKUwÇñ¿ae„C+¨Ÿ¶,iX,AclPƒ¤kPÔ­„ „`[~™Íõe³æ–JLiYk—á¥Ø–ƪKÑJ«¥%áeñ ææ½z­=ÝEì›÷Þ÷¹ç¼ˆ?¿ùœÏ}½_ŸGdÒ·çï<óânþ["O×àk›½´’o´jóÑÎ`¿õ8"qÐèÊÊ?È­Î)8¸ò³õ8ò$í§ •ŸNË,Ụ/*¯m¼b=‘¸SÅ'ßsÇøo=ˆ¸ÙõìKïsÇH32d³žHÓÞw,z2m™¯Cs¦?[#O‘±è¡úK³–ìá†o(úª'4h=‘üI{ÁQý7ž[<ùK™žY²uWÓðHÄz"q-½%ÑH0rŒ4㦑lä›õD2I{ßèÆ4d¾ m™ÎLs¶žH$!î >(,ösÕÓ•—VUÑuí‡hkï]¸¼ŠoÁ_îšVƒõDârzJrfyoÔÆÂ”#ë¬'ò:í}G¡ÓŠéÆ|z2mÙz"‘„û±ó—ü Ÿsç_xõ£/OÝ´G´ìþ«·‹•¥¹¹{›]Ö‰'è=(ÉD²‘o± #ñTz iï;M˜>Ìç Ó­ÇI*ß7í±û¿lmíµŽõ8ž¦½`(:ñðÝÍ3”ò ff•U~vÞz"ñ½%ùöÖ\ ë¸xäéGZOäEÚûN@û¥ó!èôbëqDlŒ†Ç?<|!#»‚ßBa±¿ïîõD¥½`¥éÌ­99•þ´ù»×ï8y(l=‘x‹Þƒb‚¬#ñÈ=®HZOä9Úû¶h¼ô^>˜&L¶žHÄXOhpÓN_ìG±¿.‹ZOä9Ú ÉìXüz5ÇÎ_öÊêŽ;}Ö‰é=(†:ƒý¤_,ÉCRÑz"ÑÞ·BË¥ëÒx9Ú/Øz"i½Ù›»¦†_GVþAËmëq¼E{!™î…×ï89mþdzþåšÎܲžH¼KïA1GÎɩ䒊d# i=‘'hï› ßÒr9y/½×z‡jðµÍËÛÇ/eÅÆúÎ`¿õ8^¡½4¹83«ŒÓž± ´xsd,j=‘xšÞƒâ$!yH*rIHrÒz"÷ÓÞO2:-Í–3§åÒu­Çqºá‘È{ZØi™%ÛKOÝ|`=‘ûi/$As knî^Ι¿‚·¿ÐÅ'Ð{PœƒT\½åX,$IK2Óz"7ÓÞO.6m–NK³¥ßÒr­'IÁîuÛNV³–ì©;~5:ñÐz"7Ó^H¨žÐà+oÖÅJÎÂåUmí½Ö‰<¦÷ 8 INÆ“ä$?­'r'íý$ »Ò`é±5–fk=‘HJ:wù§ì•ÕüŽøßè²ǵ´dx$²uWÓôÌŽ7#»âè××­'ù ½Å™ý7ÈL.'ùIŠ’¥Ö¹ö~¢ÑZÿh°´YëqDR[tâaÝñ«³—Vò›Z·íD°{Àz"Ò^H„ÚÆ+±>“–YRT~z4>stream H‰ìÕ¡ƒPDÁÒE¦«XˆÂP@<ƒ‰ä5ð‡InWœ>÷Ž~϶ßËçÚ»Ãé>é5¯éyíÝG€át€¤ ÐC÷Hº=t€¤ ÐC÷Hº=t€¤ ÐC÷Hº=t€¤ ÐC÷Hº=t€¤ ÐC÷Hº=t€¤ ðÿNVõ»å endstream endobj 72 0 obj <>stream H‰ì×ßKTyÆñ¿aA!ºZ„A!/jI/¼ÈA‚ ‹. Aˆ  ÙüÍ,îJº-’EFK ,³S¬ôÃvÙ2Y¶iqØLRTŒiÇ39Ú¾a–!ªulæsæœçu10wÏùrÎçó|ß¼ñ¦©ð‘úËŸ}qþ@UÏÍдuœ¼ôó/r€üZÉ'/£ëM­¡‚Ò–B_ÛWßÞ]]KX'ÉXçw£|ûüZÉS—ÙËf3™ÉÖ‰ò‰öþ^Ð6éœ ý“jGDþ•þ6¿¢o3SÚ Inm MWtqhõÑÙëD"I÷AÉwL`æ0¯13™ÉÌ|¶N”´÷? “žÉÑÑ9ižÖqDä]ñÍŽ¾Ñ¢²v¾Ó†æàârÌ:QÞÐ^ؽ;c3å59.~üö—u‘=Ñ}PÜiœžÌLië8y@{?S´Jº%‡FϤmÒ9­‰Èš›ž<àƒ-®èêO¼NZ'ÊÚ »™]©oæ öô M$·¶­‰ì•îƒâÌd&3ó™WšYÍĶNähÚû»G“¤OÒ*91&=Ó:‘ˆìÊøäóÊÚ~¾\_uï­ûO­ã8öÂÎV×çü#…¾¶‚Ò–¦ÖЫXÜ:‘ȧ¡û ¸ ó™)ͬfb3·™ÞÖ‰J{—è4IΊVI·´Ž#"»˜,9ÔÍW|ìÔõpdÉ:Žsi/ì@o‘¸˜îƒâJÌj&6ï6Ó›nlj´÷ÿ—Þ"×x‹ŸóúÚ J[ÎtÜæ¯u"'Ò^ø ‡¿ÏUÖös2¾êÞàÝ'ÖqD>=ÝÅŘÛLoÞp&9óÜ:޳hïHc¤7Ò骎"î™]©;}ƒÑ·ÿ `h"¹µmÈY´Þ17=y6À™ì+ïìO¼NZ'É ÝÅݘÞÌp&9ï9SÙnÈ)´÷?ˆ~HK¤+r8ôFÚ£u"ùÄîŒÍ”×\äçwìÑ3ë8¢½¶ßìúþAQY;ÒÐ\\ŽY'É"ÝÅ ˜äÌs^uf;ž9oÈžöþûh†é–Hc´Ž#"Ù’ÜÚîÿáaqEß{}ãpdvÅ:‘#h/¤Ü M¨êá(ŽÔ_ž /XÇÉ:ÝÅ;˜êÌv^xæ<ÓÞ:Ž1íý·Ñé„ý–HW´N$"Y÷2ºÞÔ*(m)ôµµ^¸·º–°NdL{žpôøõñÝÅk˜ðÌy^{f>“ß:Žíý =6H'¤Ò­‰HN…#KÕ'®2Ku_ LZDZäå½°¸khòøEeí}£ñMëD"¹£û xsžiÏÌçågþ³¬ðòÞO£ûÑ9Ú Ð:Žˆ˜ Þ}â«îe®»ôxú…uÞÜ ‰×ɾÁñâŠ.žýäÙÀÜ|Ô:‘H®é>(žÅÌgòóþ³ØlëD9åͽŸFߣõq4@z u±Çøºÿ×}å©{ÁüâßÖ‰r̓{áÖý§lžº²¶|ò¹uºŠÇ1ÿÙ©{{Á:Nîxpï§Ðñhz<;­îG´N$"²¸kh¦GÄF|Ó:Qîxj/„#KÇN]çyKu_ LZDZ¤û Øl¾¶;Â:N.xjï§Ðëhwt<œ¾Gë³N$"õxúÅáºKÌŠU=?Žüa'G<²^Åâg:n”¶úÚÎùGøkHĘîƒ")löÛÁ¦pý‚ðÈÞO£ÑÑëxd:MÏ:Žˆä›¡éÏ¿ü†¹Q}âêTxÁ:NÖ¹~/$·¶†&öôó˜u§oDfW¬‰8‚îƒ"oc;°#ø(Øl v‡u¢lqýÞO£ÅÑåxXzíÎ:Žˆä“ÕµDë…{EeíÌÆó?½Œ®['Ê"wï…±GÏÊk.ò€üÞ›±Ž#â ºмM‘Þlë8YáBs£¿ñ˜t9½Î:‘ˆìÅ? Üü<[ endstream endobj 124 0 obj <>stream H‰ìÕ1QÅ@ A$®®Ef>Ì\ó4Ý"rÎízÏׯ|J|€å Ðáû,_€ß`ùtø>Ë Ã÷X¾¾Àòèð}–/@‡ï°|:|€å Ðáû,_€ß`ùtø>Ë Ã÷X¾¾Àòèð}–/@‡ï°|:|€å Ðáûü£¯‹§ endstream endobj 73 0 obj <>stream H‰ì×ÝKgÅñ¿¡ ˆ¼ –€bÑ -x#A¨RB@È…„‚àMŠ”B\ƒ²Á"ÆZÑÖ¤Á ­¨”fAZÝR²´J¢D æE6õ%®YM¾eÂÒ@šø2ú›Ï½òŒË3ç>V[Î:‘ˆø^tj¡¤:Â[¥à\çXtÎ:Žû‚× ›ÉPÇDf~sÆÙ¦†ÐÈZbË:‘ˆé>(òt BÐ&t ÍbÈ5Áëý4vk§c¹±ß¬ãˆH ÜŒå‡yÃTÕõÍÎ?´Žã¦€õÂ7Cä–¶ñDµ=û¤DÜ¥û È;Ñ#´ '…f¡_¬ã¸#`½ïà“b¡ñ\¬56›u ¦§ëÛáÑÌüf¾ø_­¹#0½‹/—Õtó,ùׇÇg¬ãˆxîƒ"ûD§Ð,œZ†®±ŽsTé}GP癈xÖ½û«êúx‘æ‡oôO[ÇqAzaeõŸ‹—‡xŠ3…-×"·“;)ëD"> û ÈþÑ,ô -é¡qèëD‡€ÞOc‰±Çx¶ Í:Žˆœ"cѹÂÊ.Þ?%Õ‘èÔ‚uœ#ñu/<Û~ž.èO¿^}´nHÄ7t9(Z†®áàÐ;´dè0|Ýûi¬/6Âc•YÇ‘Ó(¹“êìÌ.jå]t¾~`i%aèüÛ ·FÿÎ+o'|YMw,¾lGÄgt9‡ÞáøÐA4‘uœóoï;X\ì. ÆcY'‘Sm-±ÕᥔUp5Ô1±±™´Nt`~ì…;³*j{ˆýþG_ŽÄ­ãˆø’îƒ"GAûÐA"úˆV²Žs~ì}+‹­Åâ"?ë‹ fHDä•ôõ$·´Íw×õ/ÿú+?˜: ¨ëD"~¥û Èý÷zB7ùåzâ¯ÞOc_±²HÎâbwYÇyƒáñ™¼òvÞTe5ݱø²uœýòK/$wR½“ÙE­¤½Ð0¸´’°N$âoºЏ‚>¢•8M4=E[Y'z¿ô~›ŠeEfV[Ë:ŽˆÈÛ<Û~~-rûLa o­KŸßZ}´nèÝ|Ñ cѹ‚sä,©ŽD§¬ãˆîƒ".¢›h(ÎmEgYÇy_ô¾ƒÅš"-ËŠ}ÅʲN$"²/¼¾.^òËëËã½0;ÿ°ª®„9Åᛃ1ë8"Á¡û ˆëè)ÚŠ“EsÑ_ÖqÞÌã½ï`;± ØQDeS±¬¬‰ˆX,¾\VÓÍ{,¿âúðøŒuœÿåÙ^xº¾ÝÍÌoæ‹øÕ:‘H è>(r¼_^žíý4VÛ‰ì(Ö”u‘#éûáÏÜÒ6Þiµ=Ý]µŽóÞì…ýÓ9Åa‚UÕõÝ»ÿØ:ŽHé>(r|h.ú‹#F—ÑhÖq^ãÍÞw°”ØKÄc;± ¬ãˆˆ¸cc3ê˜È*¸šq¶©!4²–زNô¯õBtj¡¤:B¤ÂÊ®±èœu‘ÀÒ}Pä¸Ñbt^£Ý¬ã¼âµÞw°ŽØH,%ö«‰ídHDÄeó‹OÎ×ðÎ.jíúö·Ôîžu¢W¼Ó K+‰ô¿¨³w2¹“²N$dºŠœºŒF£×8ntMgÈC½ï`±‹Òÿ"ö’u"‘cZøðã¯yãVvEç¬ãüË ½°±™ uLd\%IChd-±eFä”Ð}PäÄÐk´'ަ£ïh=Ã0^èý4¶‹ˆ<¬#6’u‘“ÚÝ»Ñ?Sæí÷É¥ïçŸØæ1ï…Á‘xni*j{îÌ>°Š!rÚè>(rÂè8šŽsGëÑ}V1Ì{ßÁþa‘„EÄ.bÙæ9aO×·?ký)ãlSf~scx”_­’öB,¾\VÓÍ_Ï+oŸ9ù^ðR€Js*s endstream endobj 125 0 obj <>stream H‰ìÕ± ÂÁX„!Ù*-c°L t !ôw…kwžÀUÇóu»?>ûë#À×é>K C÷XººÀÒèÐ}–.@‡î°t:t€¥ Сû,]€Ý`étè>K C÷XººÀÒèÐ}–.@‡î°t:t€¥ Сû,]€Ý`étè>K C÷þË[€øã3 endstream endobj 74 0 obj <>stream H‰ì×ËKœWÆñ¿¡ ˆ BpeA,P¨›Y$4RÜ$„`ÜB#ÔKE0ÑXmˆÆ¶Z!Mjª(­J¤(¡ZÑ ¢Lð6££öK$›Ä™÷:£Ïg! Ì{ÎÙœó<¿“w´;H’‰NîîîµèüîNæÂû!XUçw8E䔿Aw‘€ä ×L$ÉGgöuk¤áÐsØšÎãÖ4*"’´"ÑîþɬÂÖØ”´¼rlk's!0:ïy7ù–VôÎÌ­8°£ˆ|ˆæA‘d@’‰±)‰”t`GççAZMջɗžCÛ¡ó8¶µˆHjÙØÚ­®ð`fä77Þ±>t`Sgra!¸î½þˆrJ:þÛÖ½D$šE’ÉH>r%ÉÊ^¯Ùº—“ó M†>C«aG=ÇMEDRÝ«…7±Ñ)·¬óÉÈœÝÛÙ [¡½ÚÆ‘´¼†Ø»³±i#IˆæA‘¤B>ÆF'“Ü$=mÚȱyC“‰ ¹t»·9gN_ÑÒŠ^[_Qûr!ztìûᯬÂVÖ¯¬.mZ¾…ˆ¦yP$ ‘•$&w“ôìyü'Ijù̃ôÚ »Ðdè3öm$"r¾í‡Û}cùͼ¨Õõµm;v±)~ÿ·àJ+öÅwãS‹Ö.."æiIZä&éÉ %IÉSk·u¤«ÐXXŸöB‡¡Éر‹ˆÈ…²¼ªªóó´f´Ü{89ˆZ»¾å¹\Ú¬øê'ÖÌ.j뚎[µ²ˆXHó H2#=ÉP’”{úå­ÉV«V¶i¤ŸÐRè*,No¡½X»¾ˆÈ73·R\îãõx»£ó®la.¼Ýßi{–îiJËk¸Ýú”ÿš_SDl¢yP$ù‘¤ä)©J¶’°–«ó Í„~²t‹…+‹ˆÈûü³9%¼·Wo<^®[²¦U¹pz¶k7­:›ˆØGó Hª UÉV.ì¥Ëí¤­ÉÕ¬9„éæÏ&""gÚÙÜíxžîiJËk¨mÙ í™\Ð|.LÎþW\îc·Ëª|»iI-$,9˵%sǧͬcÉ4}^q“æA‘óD&—Ign4IM^ü÷‰Îƒ4 zŸÐ1h¦Ï+""ö ŒÎ{¼]¼ÛÅå¾™¹•3f.D¢Ýý“™-ü¬ªÎ¿¼²ô¼"â̓"ç éLFs©Éë{'Èîý2þyA—àÇô Ú…¥ç‘dAœÜÇs!ÑéRDR…óàÿ *8 endstream endobj 126 0 obj <>stream H‰ìÕ1ÂA ‰H\Ñ"#fåȤøÝâÛ/ïºîõùž¯ãýß›€çé>¥ °C÷(]€º@éìÐ}J`‡îPº;t€ÒØ¡û”.ÀÝ tvè>¥ °C÷(]€º@éìÐ}J`‡îPº;t€ÒØ¡û”.ÀÝ tvè>¥ °C÷(]àI?øX‹§ endstream endobj 75 0 obj <>stream H‰ì×íK[wÆñ¿aL(‚ ÃW‹âÐ1s+¾èXe›Ã ] ¾±ìA˜Ö)Š`Õ92ØV†ÂJØ­¶[KQË0i˜"*V”Hª&uœilsÎْœ_ìýæœëº÷öXiÂ3Ÿ_âxéÕ¯³ŠÛ]CŽû⦠ú÷MH,ìƒ@bªo¿kD¿:€š€Ýãl0á™ãƒï•§Ï´½ùQ· —×ü»G`öA Ñ(å•õJ|ÝûJu½É/q¨Ø=À"s ¾Šj§žÿ)9 WzFƒ[¡[÷¦õ±àÃ.½¦å5u÷‡vví€éØÄ¡dW¾+åɯôWPPÐGu5»Ç˜h3°Ýì6û•5®¥e¿ñ½±êõöÈ㜳zÿÚ{ßŒÍØ;-³± B™®d×ý®”WÖ‡s߸ª> V o’³ëÕÔì`çàE­zÚ–vMN-î¿´?B;»×¤æ6꛲‹7¼³+6Í Àtìƒ@ÜSŽ+Íu§+Ù•ïJù½ç~˜º‚¾W[p{lš{z—÷FxÂÎ…UßFU;)³69»¾®íÎÓõ …ó°û Ç”ÝJpå¸Ò\™®d_:r4¨'¨-誚ƒúƒ…óbOÿÊ—žêÆZ·Ø>òØq¹ðçô’±H¦´ôýô»ùó°û ¯”ÚÊnc­Sš¸aµc‘ÔµˆåÕuóçÄXp+Ôqõ~jn£æÕι_„ÑsÁ5ô(«¸] K»&<óæÌ Àìƒ@üQR+¯uk+»•àGž‰œû5õS—P£P¯0g^@ìÝyllpù%Ž‘±™gžf.l¶›Ã)9 Æv¹´ìé¼ìÁ>Ä¥³±Á)¯•ÚÊîãNF³Ô"Ô%Œí2šó{MyŸœ;ß§çö+¯7_s>ŒòWQæ‚‚æÂ—7£ ÿ ìƒ@|P"+—•꣕ÔÊëÈç£ß jêú‰:†šÆ Ï ˆ½5à󦟓2kOe]Ö}Œþ·'Ê… Ï|ai—Îgµº†=ï¼ìÇ>Äe±Y÷²ÒYÍONºîýS3Ô1Ô4.5ž¨fLÚÙíîOËkÒ³ýý ?zgWNúž#Üžô‚ýª¸¼wrjñ¤ÿ#€ÿöAàÅü-ÀŸÑ_á endstream endobj 127 0 obj <>stream H‰ìÕ1A A$®¾EfÊx`æv‹Ôéî<ø¦ãùºÝŸýõþ‚.@‡î°t:t€¥ Сû,]€Ý`étè>K C÷XººÀÒèÐ}–.@‡î°t:t€¥ Сû,]€Ý`étè>K C÷XººÀÒèÐ}–.@‡î°tào›ÿ3 endstream endobj 76 0 obj <>stream H‰ì×ïKÝeÇñ¿!†0|" Aˆ¡4 !%d ’ŒFzå c93 Ó²ÒC²á|¨D; ¥FMJÙ”1nÓÎòÇ<ã;¤±<çû½ï¯úy!¢Îu_¸ïÏuíï[ugöAiu÷+¯Õç·F†¦ÿÿ¿ùî.Ÿâ÷aOœ_X}ûâ—|6»0ÔÕ7™ÜÝ;lqWt"VTæeÎ/ë‰Î¥V$µ\ØØLÛÆ2M|¶.8´ßJít±¥ù“o¹¿ü¶Ýˆˆ™KòrIa²˜D>ÔÇSÞÌLTxý­O™CR+"""iŠýö{Um?¯qVAKÇçß'w÷R.•N.,.ÇÚhïOì$SnCD Ó>(r䳤-™Ëå%IáФ¹‚©ƒÙã ù…Õ”K‰ˆÈaml&‚mc™¦ŒÜ†ºàÐZ|+Í‚éçBt"VT¦H~YÇHt.Í~DÄ íƒ"G KÎrmÉ\’7å:é羃 „9„i„™„É„ù$Í‚""òR_ þœSÜÊ3^ZÝýËÝWjº• ]}“Ù…!J•×ôÞ»ÿØ•ÞDÄ;ÚEŽ R•låÂ’³¤mšÕÜÊ}Ó3 ™OzoüäJMù·©é¥’ÊNÞÛ¼Òkƒ£3.Vv1ž¬o_ ŸÊkä‡?ø7ýš"âíƒ"þçE°º»:˜L˜O(ˬÂÄâbeYy´þÎû7xcOç7_ ß~ºýÌÝú®çÂìüÃòš^jf†®G¦Ü*+"îÒ>(âsd(IÊ=%UÉV·Êz±‚ù„)…Y…â. 0½¸[_DäúûÓzñƒ›=­åÂHt.p®ÊEáèDÌÝâ"’>íƒ"¾En’žÜP’”Ó 3 “Œ§ˆˆœƒ£3¹o~Ì‹ZRÙ95½äÝAÞåBb'ÙÞ3žUÐBýóu‘Åå¸ëGˆHÊ´ŠøYIbr7IO2”$uýO÷As Ó §œ9{•yÆ»ƒDDŽ¥;³J«»yEsŠ[#CÓ^çu.¬Å·jëoqDf )Ø6¶±™ðè 9íƒ"¾B>’’d%“Ü$==:ÈÀ>è`†a’á,¦f¯9xüë‚C¹ &W'3¹p°ä¾úÆG–\y)íƒ"þA2’fV'cûàþ‹K.ŽwK®ˆÈQ—ÜÝkïÏ*háÁ¬ªí_\Ž;Úd.ÜþõÌÙ«WRÙ95½dàDù/ÚEü€4$¹Œä#)iàD“¹ï`ªa¶áPæ¦ÄNÒØÑ""GÂHt.¿¬ƒw²¨"ˆ>Ýp.<Ý~v%|ût~3‡¾ûáàÊ£u3çŠÈ?h±‹$¹†d"ÉH>š9×ü>è`ÂaÎáhf&狈øÓüÂjyM/ocva¨«oÒJVrayå —B0±“4yºˆìk±‡Ô#ûH@î iH&š<ÝÖ>è`Úaæ¡æŸ{÷[éADÄž¬o_ ŸÊkä‡?ø×V'sajz©¤²“ÓóJ¯ ŽÎ˜o@ä$Ó>(byGêqûH@rÐ|v÷Á}?@""¶|6ðcvaˆ×¸¼¦wvþ¡Ýf¬çßFNq+=”Vw[ÿ6DNíƒ"†‘q$÷ŽÔ#ûlµa=÷|LAtÂDt=2e·c¢±¢Š0¯_à\ûHtÎv;ñC.ll&‚mc§ò3rê‚Ckñ-‹ÍˆœÚEŒ!×H72ޤ#ïH=‹Íø!÷0 1ÑÓ3’ívDD<´¸¯~ïk^¼¬‚–öžñÄNÒvGÏù'æV«jû¯(üÅÉÝ=Û‰gÚE ËH4rëFÆ‘t¶;òQî;˜ˆ˜‹œ¯è|]„yÉvG"".ÛØLÛÆ2M>stream H‰ì×ßKÕwÇñ¿a ˆÝƒ†pDÈ E ÔEÝD]taB^Èæ¯[,—H)T80“Z¹ 2g.’­Óè°™d¨º£yŽmOøŽÓ`ÎüqNïï÷{^‹Þ½>È÷óz}Þ¾‘ôè˜8päòGŸ|^~úæ“È+ë8›øî‡ß‰Ç¯uw’ë]½cû¶¬âüíèä¼u"ºøõC>1~­ƒˆøÍEñ‰Ñe4½fèö~ K‰½D¼?½Ä‚²Ž#"²'¿ü:}¨âwïÁo³Žó¿\Û ‹±ø…–»9… ¹¦ºÖAþ´N$â+zŠdmEgÑ\ô-æÂòrmï§°šØN„dG=šxiGDdÇfæbUõaî±}Å¿èüq%¾fh+.ï…HtöĹ[$,(kë [Çñ½EÒŽž¢­ø²h.úË:Îæ\Þû¶ ŠET6ËÊ:‘ˆÈ¶$V“—º†ëëlmhzæ/ëDïç‰^¸óàY ü 9KOvŽŒ¿°Ž#âzФÝDCñMÑVt–uœ­x¢÷ì(ÖiYV<YYÖ‰DD¶¾ÿÔy³ª¸öhâ¥uœíòJ/ÐíÝ#ù%AÒÒSÓ Ö‰D¼MïA‘´ œ7 EO¹ÿÍâ•ÞOaS±¬ÈÌÊbkYÇÙD$:{ìL77UAY[OhÜ:ÎÎx«fæbUõaç5·´?\‰¯Y'ñ*½Eöˆ¢‰è#>%º‰†²N´-Þêýö+‹äå§o²»¬ãˆˆüãõ›šÆœÂ†Ü@SãWß/-'¬í˜{áIäÕÑS7ˆ}àÈåþ ë8"ž¤÷ È^Ð>t}D+YÇÙ/ö¾ƒ•ÅÖbq±»X_l0ëD"’Õ’ë]½cù%A.ÕÊê¾èä¼u¢]òn/¤ºøpåuou±ˆè=(²;4½ÃçCÑDÖqvÌ»½ï`q±»8¬ó›Qö˜u"ÉF÷†Ÿ¿Ê]ÄïðÏZÇÙO÷ÂJ|-Ø1”WÔ̪êÃ3s1ëD"ž¡÷ ÈNÑ2t ½CûÐAÖ‰vÃÓ½ŸÂúJ-1V™uÉ"ÑÉùÊê>îŸý[»zÇ’ëÖ‰öʽ05½p¶6Ä)ö_lïI¬&­‰x€Þƒ"ÛG³Ð/´ _ CïX'Ú=ô¾ƒ ÆcqœŠó·YhÖ‰DÄç––u­ƒ¹¦œÂ† -wcqëDéá›^}þO‰¤—Þƒ"ïEÐ&|)4 ýb'=|Öû_þ§DÄ%FO•žìä† ”_¹óà™uœôó_/,-'êZsM9… 5‹±¸u"7Ò{Pd t BÐ&t Íb(mü×û)ì4Ö§c¹Œ¿°Ž#"ž75½p¶6Ä­’_lïI¬&­e„_{!:9_YÝÇÑölíêK®oX'q½E6E_Ðt=B›X'J3¿ö¾ƒµÆfc¹qFV[Î:‘ˆxÒJ|-Ø1”WÔÌeRUž™‹Y'Ê ÷½áçÅǯr@~‡~úÃ:Žˆ‹è=(ò_4Eª5hë8áïÞw°ÜØo“-×Òþ]gHD¼¤`âÀ‘ËÜ!GOÝxye'ã|ß Éõ®Þ±ü’ Ǭ¬î‹NÎ['q½Eþv #ø(è Zƒî°N”)¾ïýV[ŽÃ²ëXwÖqDIJóÞÈ’^x½ð¦¦q §°!7ÐôÙ—÷—–Ö‰DŒé=(â èÚŽ )è ëD™•%½ŸÂ¢c×qäÕ×YzÖqDÄ¥fæbUõa¢æ`ÇÐJ|Í:ч“U½‰Î;ÓÍy ÊÚzBãÖqD,é=(º€Fà[ èë8BVõ¾ƒ]Ǻcãqpö«Ï:‘ˆ˜ú[€Ë™<  endstream endobj 268 0 obj <>stream H‰ì×ýK•gÇñ¿aÓXŽF°1ûa´YâpµLF„þÐØB¶HhXT¬m,AÏŽJÚVZ†ss=Hn†k:[mI+œ²R+$‡â,œäN˜Oe¹÷¼~(Z–Ö¹ïë>ç|^¢Á8×·÷ýþ^ãã“ë ¥eî{âÅl>±I…õ —ð?‹ˆy;Nð„ò§íADä^t“zšŒÒSªÄ/?ük;_ËŸAüN&\ç«‹ŽË‰IðûŠŽ_ â—‹ˆD¸ªº–9‹·ðêNÍØuîâ• ¿]0š[{æ§™œ%§—u_ýydºŠx­¤˜&4”’ýçºÏ–®—³·°½ýûED"MSK‰ÂÜ%[k]pèçº`TÖž}æ•<ŽˆŠËY½©æúà¨C‰È´è>(â)ô‘JÒJÌY‰yÔÓ¡ƒœî>KÜÒmÁÃ&ãÐ)""á­·o ó³M JOÜtî,§»æßà?=Ѹ§_Î-«ltî,™"ÝE¼ƒ2ÒGIZI1àûl/ì0Ä>ÃVãÜY""aæîWèªÕ.¼B]è‚Á¿%eå·œÅç…7¾<ÕÔåô‰"òºŠx5¤‰&ŽKW”‡Y÷?øäg±Õ°Û8zÉ µÇ.ħóæLN/kjéqçP׺`ܾeïíq!|"r_ºŠØEé  "e¤îœër÷ÙgØj8‘ ‡=ÇCEDBN[{ojÆ.Þ–so©8ð‡›G»ÜcgÅ™™ ~ÎŽËù(÷çÑcnž."㺊ØCõh䤆;vŸvót+ݯ¬=ˆùl;ì8êòVºþ¥«7ÕDMÔpö‚|Jáò"N÷A+èÕã飀t0¢ºÏžÃ¶ÃÎÃæÃþãò""^3vëvÉÞ3& ï¬ý¾£ëª•1luÁèüëŸEi_1ŸøÔâ¶ö^+cˆD ÝE\Fã(Ií‹Øî³ó0û[»•1DD¬«o¸”¸¬„÷á«oílhì´8‰Ý.ü±I…&‘i™ûúC‡‰ºЏ†®Q7“¹ØE…TÏâ0^è>›ÏÂ奌Á.d÷×q_G×U…g_Ûüõw¿Ýºmw/tüù;y*þs†™1Ï—»ý„õ_F$¼é>(âZFÑè£tÖëæî³± 1 {Û‘ÝyDD\pm`äÓÍGÈAt\ÎÇù‡øOÛýÇ#]0øMV®ßÏ<|ž[¸¹æèyÛ‰„-ÝEœFÅh™‰ÚŠuUêþÿ™Õˆ½ˆíˆ¿xä'qžêæç_/à üö‡;þ¶=Ξê‚ÑÖÞ›¸¬ÄtáòÒŽ®«¶' CºŠ8‡rÑ/2ŠF×lOt‡»Ï^ÄvÄTlJìK¶Ç ²†ÆN…øÔbO½~ vÁ¨9z~ö‚|f{ò¥ì•ë÷_±=‘HXÑ}PÄ ÔŠfQ.ž/*öÃá6ÛÝ˳ݯo¸Ä¦ÄllMìN¶Ç ‚îËU«M¶ïþmôƘí‰îó]¿XÖõ3æù˜pf‚[ù)Û‰„ÝE‚ŽNQ+ž,ÊE¿Ôýéâc_bkbB6(ö(Û‰ˆ<¢á‘›¾¢ã1QX“UÛ×?h{¢Iy¹ F`èÍ÷÷2$ŸØ¤Â§ÿ´=‘H8Ð}P$ˆh…2©¢Yêþã ûìN ÉÅ6ÅNe{"‘驪k™»d+ï±ÔŒ]ç.^±=ÎCx¿ FskÏü”"“Ú%ï~Ó}9`{"‘Цû HPÐ#ªdòD§¨•í‰"TºÏÅŨìTlV¶Ç™Þ]Éée¡õî •.åUM³ó8*.gmöOÃ#7mO$ªtyL4ˆÑ#%ÚTVÙh{¢) ­îWje§b`ö+¶,Û㈈Lª·o`MV-齃Aéɺ§„VÆ'ú»Á0:Ôú+¡å_|,ôû endstream endobj 269 0 obj <>stream H‰ì×ïk•uÆñ¿!]¨0”¡tµ¤1p©ƒö =˜¡X>Ô¬‚âÈý`ckÓis:l“¦Å¬JÍL9º¦â’5ÆÛp™ûq¶£öÎ/I¿¨9wÎçÜ÷}½8Œ=ü|ïûœÏu}ïÝó¿Ê}ß<¶h'­ñ¤ÆÖ‹™9•üˆff•n­h›°žh²¾üöcó×zÉâÙÖ4œsO»¸$Ô70d=‘ˆÈ_ÄÇõMa·¦ÖokëîYOôp<— Ϲ`Ý!&糨`wäjõD"£û ÈÔ8äŽ ’H¹ŸÈ}zí‹SÐÄècÖãˆHà ÆF¶” fe—ï¨=y{8n=Ñ#ñA.€·ðÆ»ŸÍX¼“³ÌÍ­j ]¶žH$Ýé>(2Id ÉÂï…”ÙðÎqå~:à-¼·ë4MŒ>F+£›YO$"¸s÷àÑKó–V³H×n>íºi=Ñ4ðG.8¼‘ekp>9Eû¯Ý賞H$}é>(ò¿ÈÒÄÅ ù¢ÜO7¼úÇ¡›ÑÐèiÖ‰ˆŸ G](ð—ÿ­Ç™6~ʇ³ÌÏ«vñýjqë­¡1ë‰DÒ‘îƒ"ÿì A\”)íg~´žhÚø/÷Ï~÷³/šˆ¤h×͵›±gæ-­>xôRâÎ]뉦“ÿr¼£ªÏÎÊ.çhü埽5‘G§û È¿ò}‚ø5÷ihô4ŽFg£¹YO$">q{8¾£ö$q‘Uº¥ìÄ`lÄz¢éçË\pn ­yëcNÇg~^µ/Ï(2eºŠüIA^¸à A”ûÞBîÓÖèl47ú-Îz"ñ¶æ¶È‚µìÌ•[:£ýÖã$‹sÁ¹v£/§h¿ ÷ekD»nZO$’tù3ÒŒpañ|Ñ>²Ãz¢dñ}îÓÙVm:Âiqt9ëqDÄ“:®ôä­n`“dî ¾n=Nrù>œÖÐå¹¹UœtÆâonÿüöpÜz"cºŠ8$¹@:ð‹ )È ë‰’+ ¹O£ÅqR½ÎzñŒîÞØúmmlÌœÊú¦p|9qåé‚ÝìŠü×èüÕzœ” Z.8‘«=O½¸ËÕ€‚u‡º{cÖ‰¤šîƒXì|6¿‹²€D°ž(¥‚™û´;:§ïÑú¬Ç‘4Â~(|ýp÷C0sÁil½˜™SÉñ3²J·V´ŽMXO$’:ºJ±çÙöì|¾üìRÀz"AÎ}š}ãÓýh€Ö㈈±Ááâ’;aÎ’Š²=_ö.ä\¸w¿¼½ã‹™tƒÃŸvXO$’"ºJдÿž=Ï×žÏæWî[bƒ÷Në£ûñè´Aë‰DÄ@|<ñÁGææV± ÖokëîYOd)à¹àð(XwˆçÀçÙ—öD®öXO$’tºJp°ÕÙínɳí•ûÊ}¾4@žmNH3´žHDR‡˜]¸— ·ºáüÅ_¬Ç±§\xàÔùŸž\þ¾+ /olŒXO$’DºJ°ÉWm:â;ž=o=‘=åþô@Ú Oƒf¨"Ñ~ O¼PÓܱ'](þ¦¾)<û¹ržÉãÏ”•ÔŠ'¬'I ݃ë7ÈpùH endstream endobj 270 0 obj <>stream H‰ì×ßOÕuÇñ¿!Ä©[ËÔ¥­@‰ EièZº²‰Ó¹y« ‡nâVsYƒš‰†"®´HTæ ¦+A+;³â4Á‚™–à¨=õÛ…Î9ç{|¿ßózìÌÉÝ{Ÿ}¾¯÷ës÷n"è¿9ðÞõ£§†žz±`ìKE[>>a=‘W|}¼•3á_ëA¼âÓƒ§ž{yg’³¼²¥ý’õ8"=½}ï”|•œZ8&­hMøZOä!Ú â†äæW'¥p2Ïf®¯©k¶žHÄ}ë>ú–οփˆ¸Üž0s=7œ$'ϵ÷¤½ÿ(ný–HW¤1êˆÉÀí;»öœ8+Lô-ÊÛÛÞyÙz"ÏÑ^ ·ef·_Æü²³­]Ö‰¸IïA $²šÄv¢› ×Þ”öþ`¸-tE‡ÞH{¤CZO$"±Š4td.Øî”ùúH›õ8¥½0´šºæIYaŽ()¥ 7¿º§·Ïz"wè=(C>“Òd5›Ü&½­'ò(íý¡Ñé’&i=ŽˆD©½óòÒ•ûù–ÇÏ()ûìÇÛw¬'ò.í…aqж~3zjˆƒ“VT²ý;Ý( ½%HHfò™+MV“ØJé!hï‹ûC{¤CrPôIZ¥õD"2W¯õ‡JK/NN-\:t¥ûºõD^§½ð˜¸K‹òörVü&go¬´YO$½%Hc2Ù gRZ{XÚû‰»D“¤OÒ*é–4Lë‰Ddx•_œž2{)7oÙî³­]Öãøƒöˆ4µü9mn©S<²ïìøýë‰D¢¤÷ øÝù‹Ýä°È$3ùl=‘?hï}’VɉÑ0é™ÖãˆÈ ›.ÌYRÁך6okíÑsÖãø‰öBªjÏŒŸQ¹J-\±¶æêµ~ë‰DFLïAñ/R—ì%¹Ã¤1™l=‘ŸhïGnIÃäÜh›tNëqDä!]õ¾õöA¾Ð§3Öm(ÿþFß-ë‰|F{!:Ü´ÕŇ“ï·‘±éÅåŸÿd=‘ÈÈè=(>UQÕ@êr{I`rX{¤´÷£ÃM£gÒ69=š'ýÓz"yèÃÌ{÷K}˜ÑÑ^ˆ·îõ7÷p€üžeó‰ÆNë‰D—Þƒâ;d,IëD.Ù«½íýXpëèœ ý“JµžH$qÕ=÷«ò=ÎYRÑØtÁzÓ^ˆÝƒe޲ݪ(â zŠ«<˜%oI]ë‰|L{?v4Oú'ÇH¥‘Z#’p~nùƒÊÍ78eö¦‡š¬Çñ=í·TT5ŒK/æ0“S W¾ÑwËz"‘¡è=(¾@–’¨ä*וŒ%i­'ò=í}·ÐBé¢&½”vj=ŽHB¸Ò}}Uè³B¥Ç®^ë·ž(´\Ä\±¶fÔýÞòÌô’ªÚ3Ö‰ JïAñ>RtüŒ.*¹Jºjï»B{ßEÜI)½”#¥£ÒT­' ¬þ›Ûöüà,…¥+÷Ÿ¿Øm=Qph/¸Žû™½x'§ÊoÚÜÒS¿\°žHäè=(^vºù"ùé)‰ª½ï"í}×q?i§œ*M•¾JkµžH$hê#móËøÊ²–G:¬Ç í…8áÞNÎÞè”™Ey{¯t_·žHä!zŠ7‘–d¦ž¤(Yj=QÐhïÇ •¦ÊÙÒZuoEÜòëoç,¯äËš8+¼kßIëq‚I{!®Â;ŽI+â„GO ½¿¹~àöë‰Dþ£÷ x Y¸åiÉÍ$9ÉO뉂I{?®è«´VN˜KµGÄÇzzûÖ„°øñþ´ž(°´âÛ››_”RÀ9OÊ ×Ô5[O$rÞƒâ)d# É$-ÉLíýøÑÞ7•X‘Ø}r qâ¬{K!gyeKû%ëqN{áÉ8ÛÚ•1¿Œ£æ7ý²öÎËÖI¢Ó{P<‚<Ì\°Ý‰Gr’´´ž(à´÷Ÿ ,=–£¦ÓÒl­ÇñHCGÖÂr¾ô×¶ÕGÚ¬ÇIÚ ORM]ó„™ë9𤔂ÜüêžÞ>ë‰$qé=(æÈ@’<ä*’$¤õD !è{ÿ_sýñ. endstream endobj 271 0 obj <>stream H‰ì×ÿK•wÆñ¿a­–Á@ØÆ‚–e &Í.æ6˜Ò bÛjÑÛH0µD§Ë²†YRR«I²e_¨YkK攕֜(䜆‰r6µµ}÷.!¿­Ÿ"ý¢es ÉCRQ{?l´÷ÃŒ»M³¥ßòg§ëÒx­'qÁ¡`ÖÎósârx&2OônZOä/Ú &¸ç©ïæ/Ïϳ/V]Óf=‘øŽ¾Å ‰Gî9Hjö¾ î9-—¿<—ÞKûµžHÄ-*N6=÷J!¯#yõË-×­Çñ#íCÍ] _Û锢e+öuv¬'Ñ÷ „)—´r¿z¤h=‘iï¢ëÒxùûÓ~éÀÖãˆkhêZš^Ê‹˜—´ã›³W­Çñ/ís‡¾þùÉøíœÂã1[×m9>8´žH|A߃N·†o“o¤·ŽÄ#÷¬'ò/í}sô^Ú/§@¦[#b §w`}F•³òK.²#¬'ò5í7àlÊ95óŸ¦Tz¤Þz"‰|ú”°!ÓH6î)GÖiïÛÒÞw^Øy´bº±õD"a ^þ5›+»{þ´žH´\„ñêÊ2ŽƒŸç—}^éwë‰$’é{P ±¹‹4sb|ÓÞwí}÷àEЇ9º1 ™žl=‘Èôª:÷Klò.îüÒôÒ†¦.ëqä>í·©mè­O)kË{z¬'’ȤïA™Vd æD™F²YO$÷iï» ­˜n̡ГiËÖãˆL‹–öÉ«pÏç&”W6Z#Ð^p§¢²Ú¨¸ŽffÌÖóÎGBÖI¤Ñ÷ LòêÓü³dŒ#ͬ'’hï» ™žÌÑЙiÎÖãˆL™þÀÍY'Y ³c³³vž ZO$ÿ¥½àZ¼—u[ŽÏ˜ŸÉE/Î=RuÉz"‰(ú”é@R‘W\-²‹ÓÞw!í}×â½Ð–éÌ4gú3-Úz"‘I ݹ[røGg)¼½á«öŽ>ë‰äÿi/¸ogIÚ^ΈŸE¯_ií±žH"„¾ej‘N/¾¹Û +RK{ßµ´÷]Ž·CsæŒhÑtiµõD"Q]ÓŸ²‡›ÌïšúkÖãÈÃh/xoꙄ|§h¥½ÿeà¦õDâyú”©B"‘KN@‘Tä•õDò0Úûž@íÒzSâ-í}éáö>õRÞ¾£?…îܵžHA{Á+xM¹_|?;6›ózbaÿÖû’ÉÐ÷ LÞ¿s‰ßÊ%OÐÞ÷ ^]šFÍyÑ®éØÖ‰<ÂßäeÌŒÙúá¶Óü×z"íoáe­Øp”#ãç鄼ãß^µžH¼J߃2I'εBN‘KÚû^¡½ï-¼,z5횎MÓÖC×*¯lœ›X@¼¼õî¡–öÖãÈ8h/xѕ֞ø”=N [’¶·½£Ïz"ñ}Ê„‘9$Ad‰d=‘Œƒö¾Ñ®éØ}›Öm=ŽÈêKH-á~Æ&ï:õݯÖãȸi/x×±ÓÍÑ‹s9¾ó3Wo:68´žH¼D߃2äÌ;U’9\ò‡²žHÆM{ß»hÚômŽîM·Gä^gw`ÍæJg#¬ Ž„¬'’‰Ð^ð4Þ]Faõ¬YbT\NQY­õDâú”ñ"aÈ® ™Còhï{”ö¾§ñîhÝto‘N·žH|êÖðímÅæü½ÖgTõôXO$§½xƒ)kË9G~æ&\¬¿f=‘x€¾eìj:È'dHí}OÓÞ¼A8çH§“ÓÌ­'©8Ù4/i7pùª²Ë-×­Ç‘ÉÒ^ˆÍ]1Ë‹œÂ–´rgwÀz"q5}ÊX$ä‰,$ 9c=‘L–ö~Ä ‡ÓÆ9Mš9ýÜz ‡¿ ö“ endstream endobj 272 0 obj <>stream H‰ì×ÿKUwÇñ¿aåV ì ý0Z.'ˆ0×Íó‡Ec¤?È Æ !ÄÉÔD1úâ—-J“”˜ºáŶ6kIÒ,—¥KDYâ4L ›š^µÚ³&CÜÅѽ÷}<çõà"þø‚Ïy{ôÈØõ®Ûofê¥Ü5©‡Ï4Þ°Ž#áqîçnÞ”¿ÖA$<*j[c“ yÓåñy»ó'§f¬‰K~ñß ­ƒˆKÑ=² ÎÒIøNè*ôëDšûÃNÎfΛ²¥³«[ÇÏÛ™àK[•XPtä‚6L/Ñ\ð*”KP[œ„¦{PB oÐ=øBè$ôÍ}/ÑÜ÷*”ýœ-—ecgo·N$žœž-¯nq†Â¶=õýƒ£Ö‰$Ì4¼ŠjMÍ<Îãò‹»¤­cÀ:‘¸‹îAY½bݦR§uÐC4÷½Gsß«¨Vvu—½íÞ:‘xAàüÍ„´2¾«”ÍG¹ÖoG"BsÁÛ.¶ÞZ½á€³Ú¥o¯³N$n¡{Pæ¾;A—pÚ}ƒîaH"BsßÛØØÙÛybvx6yë8²„uõÞyÎD¨©o³Ž#¤¹à%U—V&ðÐO¿œŸs°)8=kHìé”9ô:ýO‚^AǰN$¤¹ïlïìð<4û<[½uYbîMíÎoŒ‰Ï[‘°ï³âïÇ'‚Ö‰$²4|‚ZÎÊ®[¶6—çŽK.ªû¶Ã:‘Ó=(ޝÏuÒøèt Í}ÏÓÜ÷ j™Mž}ž­žÝž ß:‘,³Vžºòì«Åt‰Œ]§{ûF¬I4h.ø u½~Ë1^œ_Rú—ÝC։ČîA¡Ðœ†@gÐÜ÷ Í}_¡®Ùêyq6|ö|¶}ëDâ^.ÿî þ65÷XÇ‘èÑ\ð¡†~{.¥ØY·î:uolÊ:‘Ð=ègT}æ'§&@7 'X'’èÑÜ÷!vû¹=Ÿß:ޏNoßHÆ®ÇC!.¹¨òÔ•Ù­ITi.ø•^täÂ3ëòyý ûø_µï7ºýÉ©}ªž×§¨ö}Hsߟ¨tö|¶}^ŸÍŸýß:‘¸ÂøDðóCç 1ñy»óïŽÞ·N$4üŒªßòñW|üžOÙßÔÜcH¢G÷ Qã/¼¶ß)yj_sߟ4÷ýŒªgçgógÿç à°N$–jêÛVo8@Cx÷Ãê®Þ;ÖqÄŒæ‚tv½òN¹³"®ßr¬·oÄ:‘DƒîA_¡®©n§Ì©wªÞ:‘˜ÑÜ6ö>n.ë8bàê×ß<ÒÊçoZÇcš ⨠´Ç%ñ1,[›»coÃøDÐ:‘D–îAŸ –©èåñy<75N¥['cšûâà ààcà.à:°Ž#QÒ?8ºmO=ï›Tx°²98=kHìi.Èz§ÅçbþÞW&”T]²N$¤{ÐÊN´PË<4uMukîË#Í}ùzwŸ7—‚u"‰ É©™ýG/:Ͻ3'04n . î ëD²XMÍ= ie¼]Êæ£Í­·¬ãÈà–¹ð—_"òô endstream endobj 273 0 obj <>stream H‰ì×ÿKUwÇñ¿a¥´ÆXÌÀ~¬[â°HÁb?DÂ(µ Œ1æê‡ úeAzµÜ-4ç²b¨Ø7"†R°²ÖêR03¨f‰((«5™â—´Ôö´³¶Û¼Þ{ÞçÜózpëooÎçýþ¼Ïëùsñ¾Öhwznå+o—ð~rt`p̺"‰ÝÞ¯/qŽüµ.DbÇ ®ßrÌIf“ µ®H|àûË]4 ­ ˆ¶õæÖÑ0ytÃx_gÏÂâ&Î+-;Òxú†u9âÚ 2[Uß^]QFÛ¤. öUëÄÓIëŠ$ʃ¾ÆÜ1}Ì ‡È<2•Ö‰ohïËl‘,È´ YƒÄa]޼ÄÐðø®È¹”P)ük]‘ø‰ö‚Ä€{¦hÇ©yKKhž7W}Ñ|þŽuE2kʃþÅÄ-Ιù6c™Dí}™í}‰7È$Å O™œš>râzZöÌR((nêé{d]‘øö‚ÄŒ;gÅûµôOV~mGW¿uE2 ʃ~ÔÙóYs†ŽéÓÞ—hïK̸sHôéƒ B±®(è¢m½9…uÎgXk´Ûºñ+홣æówçDè¢yKKŠvœ·®HþåAa²˜/¦ŒScâ˜;ëŠÄ¯´÷eŽÈ¤ºˆ$B±.' zï=Þ´í$§°heEMõɩiëŠÄÇ´d>ßßšº,L/-È(‹¼l]‘ü7åA©°.G’„ö‚Äןï/_Wí|¾æn8ô˯ƒÖÉË)z³³úƒÃÎ(1SL–uE’$´÷%¾H%dšŠœBZ±.'iµß¾¿fãÌR­­j¹p׺I*Ú ’l„7VTÐZóC¥[w7ŒNXW$ÿ¤<èYÌ SÃìp@Ì‘¾¯$¾´÷%H(äZ‹ÌBr±.'©ôÿ>üñ§ßñn_ÏÚûeÝ•'ãϬ+’d£½ Â}µ³ülÊ‹oÚ…™å‡·YW$£<èMLÊkïìáh˜&H{_âN{_„ûŠ´Bf¡ÁÈ/¤ëŠ|O¯TÜ¡½ ÅÝ•·¹žãyëÝýWÛû¬+’?)z ÓÁŒ8ÃÂÔhïK‚hïKBqw‘\è1R Y†Dc]‘_µ\¸Z[Å›\³ñpûíûÖåH2Ó^üõC÷½ô¡ëʃÞÁDäÔè “¼XW$ÉL{_\@~!ÅÐi$ru9>s«óAÞæzÞÞ’ÕûŽ·Ü´.G’Ÿö‚¸¦îèO¯f–Óo)¡ÒågŸŒ?³®(Д½`âé$³ÀDpL3b]‘$?í}q Y†DC¿‘nÈ8ÖåøÀÀàØöð–ÂÂÌòpõÅ‘Ñ ëŠ$´ÄMÜl[w7Ïñõ»he›Âº¢àR4Gÿ3œÁ\hï‹;´÷ÅMÜläÒ ‡¤CÞ±®È£&§¦k®9KaÓ¶“½÷[W$¢½ îã–ËÝpˆÆãY¾®úvçoÖ‘ò ¡Ž®~:ßfA{_ܤ½/îã–#ãÐxäRÙǺ"oivgå×ò~r ë¢m½ÖåHàh/ˆn¿ôÜJç“xý–cƒcÖ‹ò  úœnwÚžþg ¬+’ÀÑÞ+$òíGöÑíçèé{TPÜÄ;IËŽ9q}rjÚº" "í1ĽWñÍ 2ÊhÂÔeá²?è&tò Ëèí=5—ès^;=Oç«ÛÅ„ö¾âÞ#õ}hBriȺ"3CÃã»"çX)¡R~ð¯uE\Ú bŽ;°hÇ©yKKhÅÅ9‘æów¬+ åA7ÑÕô6/œ>§Ûµ÷Åö¾˜s¢9ˆ4Ì(ÔxúFZöÌR((nêìyh]Žö‚xDGWV~-Ýȳªà`Oß#ëŠâèúÒô¹ endstream endobj 274 0 obj <>stream H‰ì×ÿK]uÇñ¿!3æ`°Ø 1hi™$‹É¾@þÄÆ*hÐh«UR°£F2u2sÍ}q_Ðm2mdµ¤v3jiµG-­5m"»”È åŠ_æuÖzng *uSÏõ}Îñõàpñ§sß÷ðòó>¯k×¼gçÁoîz ‡OëA.ÜÖ“¶¦„GÍ•šy¨¹µÓz"™í¾ø¶•4òi=ˆÌv-á®Õ›NÆË +ª­Ç™!uç~w–BrFqMÝ%ëqD®Ó^O9õå¯÷>ú6™ŒKÌyîõ“}ýÃÖ–ú`¬‘^2L’yΤšl[O$rö¾x ˆfD&iIt%ëqb¨½#²~ËGüÒùK ”ŸŽŒZO$r“ö‚x 'dvQÍ=æ‘Ì„‡wì+«·ž(˜ÔcŠÜ&¤äó„I2yÖÞïÐޯᄤђH&‰Þd=‘Ë£yû¿š{c)de‡z#CÖ‰ü‹ö‚x§å“/¼K8¹î[ñNMÝ%뉂F}0F¾®“X'ºdX{_¼F{_¼‰Ó’®D8éM´':”õDîø°úÂ’ô½ü®ŒõÇiùÃz‘1h/ˆ—56]~èñýΫuúºcí뉂C}Ðuä“”:q%·¤×z"‘1hјèMD”E“²gZ~jîXõÌç·T}Þd=ŽÈ¸´ÄûŽŸl˜—º“ Þ”ûÊ[§® _µž(Ô]D&_Ýþ)ùä‘’Uk=‘ȸ´÷ÅûhOt(‚JŸ¢UY3iÝýYÙ!g#ì*ùNï-âqÚ â œ¥[ò?‹ÿç}ûHå9ë‰|O}Ð-¤‘Lò0É')ÕÞÓÞ_à,¥I9§+ÝŠ†e=Ñ‰ŽŒ­sÆÞ°µª½#b=‘Èíi/ˆp®¦¯;Fb¹îlOcÓeë‰|L}púHà’ô½N I¦ö¾ø‚ö¾øç*­ŠÄÒ°èY´-ë‰&ª½˜œQÌ´+ž*m¸ Wñ íñú†¶Å«Šœ—ðÌÝýÖù’úàt:²ç„4’Ië‰Dî”ö¾øÝІEni[t.ëqÆÐîzâùr&\´rwEU£õ8"“£½ >µ¯¬>!%ŸôÆ'ånÛu::2j=‘ϨN IË.ª!u<=H­'™í}ñ)zm‹ôÒ¼è_ÖãÜÔÚœWÍR˜“¼cûžÚÁ¨õD"“¦½ þÅ©ûÒ¶OâsÈðü¥•¡óÖù‰úà1’Æs#udO{_üH{_ü‹S—ÎEó¢ÑÂèb†ÃŒþù×Ñ÷t–³¯}në1Fd:´Äï8—¯-%Æ\dlní´žÈÔ'…\¥frbFÞ´÷Å¿´÷Åï8é_Ę.F#£—Íü 5u—œ¥Àç™ï›ùD\¤½ Á@†¦:¯ëk_~¯72d=‘שÞ¡¾þaåD‹Œé´¿ÓÞ—` …Ýjd´³ûÞ[mtÁ²B«6*â.í Îä‚Ãgæ$ï Ò|ò·Né ¨Þ–%¤½/Á™L#£—i:M-¦_70}³ð4ë >)ws^u_ÿpL¿NdÆh/HÀp>?UIª¹¦*ÛãQœÉ!?NH”ö¾†ö¾ ç3팎FS£¯ÑÚbñ-U‹Vîægõ¦-á®X|…ˆí ¤æÖÎÔÌCÎËüòµ¥á¶ë‰3÷ÆRÈÊuv÷»>§ˆwh/ÈlÀIž¹±‚¨s-^UTßÐf=‘=õÁ[È©pâAN´÷'ëo|<ðU endstream endobj 275 0 obj <>stream H‰ì×ÿkUuÇñ¿¡6QÃè’MÇ rÄüÁ@‚ŒýPi¹Û¼w—aßt6–m‘Y7ØrRš1´ZüŠ ¿Çmd“«îÞíúåÅÅD¯ÛîÞçœÏóÁe lð>Ÿ×çÜ—ï;w&ßÿ4øÈ‚zý´( ÔPz]]—®úìòX¢õàHf,ÿ¿Ý½ïøSUëo—½Ò~ìôŸ…zî8qyÁø7¼>UkÚ/^¶žÈRÓö^ƒ~ZbIw@7Á»ºº!ÖGïÃÚæ´ÓéÂk¿Ëó÷_|µÃû}m……z®Ù‘쟳¸I×¾¸´¡6Ö=’³žÈ†ãû rWúº:ÝÝ ë‰€iBïÃ5Ú츦†ÒëêºôjÌ.Å[zý¿ÜD/ÀAúž§þ»¢wŽÝG¬'2àò>¨Ä•»_w@7Þ‡Sè}8è>ßóÙÑ\Ë—‡K*z/^Û°÷â•áé zÎÒw~ÕšvÝ}Uo8qÙz¢iåæ>¨”•µºÒ§÷á zøO÷¿—-ߦ7¢rUÛá Öã6è8®÷ç?æ.Ýâ-/½ñÕÕá›ÖM×öA%«|½ •¸r·ž°Aïrúì_+ßÜ¥waÞóìÜ;`=`‰^䓎C³Êczf,l¬û°';š³ž¨àÜÙ•¦2U²z^¥¬¬­',Ñûpܵtæ½øþâÒ†™e›76ÿ ZO£¡fýžGŸ®×QR‘èÜôn㾫Ã7­§‚ˆ^îCݱú­oôŽè3wé–ž¾3ÖM™èíƒJGya)5z¸'zàG/tr0U¶|›·h,YýÙ¹KÿXO4¢´*åâ´¨z«ò²ž.zàG/yJv-©Hè})*mX»©óú¬õD“}P)( %¢gQ:ÊÈz" èè}€½ä/;š{?¾¿x|û˜UkÝõ‹õD}Pç¯ôJ¤6Ö­t¬'B€ÞøÑ ÀÃJ ¥W¼¾S/Ž>ó_øèБóÖMD¨÷A¹NÞ‹@Y(뉀Р÷~ô01þ•¤ºæ‹Ð­$!ÝuÎ:mïØuþJÁz" dè}€½LÆŽdÿcÏÄõ—6ÔÆºG2cÖå+tû ÎV'¬sÖØ:s¼õD@(Ñû?z˜¤ë7²k7uï)?Û”ì:j=Q^µêTu¶Xç¬ÓÖ™[O„½ÿpî 0©±£ñ endstream endobj 276 0 obj <>stream H‰ì×ËK”QÆñ¿!Í ZHn‚ÌK$-L ¡°ÀÝPDѦ.mQ +±ÁèbA†T ]¸š gÑEº‚I˜" ÝdÄKŽÚS/Ù)*+Þ÷=¯ã÷à ƒ‹9Ïyàðã·°©íÎýþU›kõ×v`yï:ТפO^ÙùîÞÛ‰–pºù®¢ê¯í KP“êÓ)vçþõl;°¼1÷&æà¢X×@vIÄY^BmcñiÛ‰~+øû ÚS‡N™jUÝÚN¤æ>ÀÄ\\×tµ+3¿^/+#7\ÓKÎÍÛNô AÞÕ˜zS{J¨&#WØN¤æ>ÀÄ\¼0>1s¤ª#-§Vï+«¨1ÚÙg;ÑÏ»ª+5¦ljOªIÛ‰€”Âܘ˜ €w^½~_X~IOL}ú`;ÑwÜÕY×ËÁ·¶)ˆ¹01¯E;û²ŠõÐÒrjTuŒOÌØNôE öAu¢fÔ"©+5f;²˜ûsðAb6YÓËÈ ë¹eæ×Ÿk}h;Q€öAµ¡NFý¨%ue;ʘûsðÍX|:TѦ§OvI$Ö5`1LöA5 œBÔŒú±X!˜ûsðYwïH^Ùyg *=xux4n%†Ý}P·ÖÝÔ†:±X˜ûs°¢ýfÏúÂÓz}é[ê*«£“S ŸØÚuSÝW·Öéj@=øXá˜ûs°åã̧c'o­þº­Ûvª¥ý©Ÿ§[ÙuGÝTçêÖº»ðót Ì}À˜ €]oÞMì9ܪg¨Ï¦Ò³Ožûs®Ïû î¥Û9×Ü}¨U·öç\?aîLÌ >Z\—ÊÞða]òmÔ]t£Å…W7õúDÀܘ˜ @p4_¼vëI=ÉÕ[êŽ7ÜNÌ&½;ˇ}PùO4ÞÑ]tîuáÚ#ïÎð—˜ûs”É©Deu4ýëµa{CûÍòzTrå׺‹n¤{yt€Âܘ˜ @ }(]ÑÛÔ§`ï…ýo\?»}Pi ö]tÂ뺋ëGøoÌ}€‰¹V¬k »8â,V¡Š¶±ø´‹?îÅ>¨„ÊéÞ¸ãŒò»øã\Áܘ˜ @%çæ.ßË̯×;ÍÈ ë»þãÊ/»»:9×ä…õ›JëbNîbîøæ³{(þè endstream endobj 277 0 obj <>stream H‰ì×ÏKTQÆñ¿!Kr¸r×h!ˆ 1[X´™VB™Q„m‚ “h“¡&’Æ(º°Ej&H’Ñ/p#¹É‰„QQ rÌšž¸ 'Ìg¼s›;ß—a¸÷œ÷¼›ÃÉ‘Èð›É=‡jõët#¶ôeyõ\U¯®ªž¬Â¦çâ¯Ùxÿ•ªé7þRêG]Yí•_íQ·ñ×`r`"€d˜œË÷¶ZcWQiÛTp!žj»2ªubµ¤ÞÔa<Õ$¹0‘ @rédøtmÓ<µç¯=^ …c«ç<¨s/T÷©Q?ê*¶:ŒÜ˜È é„×ÖkZFÒsëuy3òü£1‰gÔ‰:WÛÕƒ:Q?1àr`"€$5¿:ué¡î¯žƒGï¼û¼£í±Íƒ:%»¸Ù:Ô[Ñ¥v´€ãÈ}€‰\’ÚøÄÌá“÷¬­¤¼czv)Ê;UYõ­ƒt¢ÎµeN"÷&rpöGcòu—÷æÔUÕ~[ý¾í–èçAUSMUÖz¢³v£eÎ ÷&rpMmÕ CÑOmQ΃椩úÑLšþgä>ÀD.n2=»TRÞ¡K­ÇsÜ?>1³ÕÊmçAíÍ9á·J©¦*ÛÓ2€„"÷&rpŸÑwÁìâfk”óVtÍÍ/o^óyPëµËÚ®:ªf˄ܘÈÀ­ü£y ºàé¹õ5-#áµuóë_çA­ÑJ­×'íU…Ķ Àvä>ÀD..¶ WÜèOóÔêšgøzßo|Ú<ö=›Ð½Ôú‹×Ÿh¯-°¹0‘ €ëMŠJÛtÓõä{[“s‘?çA½Ñ{kVj½Ó-° ¹0‘ @Šzù)«°ÉúÎ\é¾uwDô[VÙm½Ô×§/>:Ý&{‘û¹¤Žõ?}^ï?r[·~_NÝÆ¯Þè½¾:Ý Û‘û¹¤šÅ¥¯ÇN·ëâ[þëÓMHr`"€”2\(*mÛ­GoôÞéÖ$¹0‘ @ŠX …/ßHóü3 |e•Ýús¶²GÿõGïõUkœn€½È}€É­¹ðK€h endstream endobj 128 0 obj <>stream H‰ìÕ± ÂÁX„!Ù*-c°L ô‘ˆôw…kwžp?Çûóx¾~ûï#Ü‚.@‡î°t:t€¥ Сû,]€Ý`étè>K C÷XººÀÒèÐ}–.@‡î°t:t€¥ Сû,]€Ý`étè>K C÷XººÀÒèÐ}–.@‡î°t:®êþW€zŒ‹§ endstream endobj 129 0 obj <>stream H‰ìÕ¡Áh„"éê-eÐ̃Œ{Å0ÃíŠè¸;OþÁñ|ÝîÏþúðuºÀÒèÐ}–.@‡î°t:t€¥ Сû,]€Ý`étè>K C÷XººÀÒèÐ}–.@‡î°t:t€¥ Сû,]€Ý`étè>K C÷XººÀÒèÐ}¸ö`?3 endstream endobj 78 0 obj <>stream H‰ì×ßKÕwÇñ¿a HÞxÕ‚ åEÒºP¡Y0‚ X YjSNÔJ]pÒ‹a'·&Ú~t@6³¶¬tC™ázj(-h/Ä]é÷„²ªK÷Æ[ÇÙqzŠ{0Õ™í\xæ<ÓÞ:Ž1íýWÑé„ý–HW´N$";%8H“´N$"Û×í¿“·ï ï½÷»Æ'ŸXÇI_Ú àå{9ŸòêÝ"É0zJFbV3±¹ÛLof¸uœt¤½ÿVÜ"Ú#§D“Ô-q¢‘Ñ™ÒʾbOY[`pÌ:NºÓ^ØØóÈÒ o¶§)+¿¿ðOëD"É¡÷ d˜õqÍë hïo’&ÉYí=|‘niGD6%4û÷Ñã~¾ÜÝ…Íg;ƒÑå˜u"Ð^ØŒÉGOË«{8¨ÜbogïíØêšu"‘Dé=(™„ÉÌ|æJ3«™ØÖqÒšöþæÑ$é“´JNŒ†9 ['‘ÿµ¸´rÚw+þÁÖÔfç"Ö‰C{aó‚…‡.p\%¾àð”u‘„è=(™iÌLæ23Ÿ™ÒÖq@{«h•tKžIÛ¤sZ'‘×]ë¸gÿ9¾ÓÒÊŽ»BÖqF{aKb«kí]C9E-Ú‘ÚËSþeHd›ô§›…™Ã\cf2“™ùlÈ´÷·‡†IÏäèèœþ÷­ãˆÈ¿î?.«ºÿ6¯ôZÇq$í…mx~Qר—•ß°«àTcëÍù…¨u"‘-Ó{Pœ‹©Ëìe3‡™ÆÌdëDN¢½ŸÚ&“¤ÒB­ãˆ¸ÿöäu¾Gòi/l‹€uÀéåí;óeàWë8"[£÷ 8…œ©«B¾mÚû ¢sÒ<éŸcM}€FjHÄu¢Ë±ö®¡œ¢>êcW§CaëDΦ½ ÀàXþóœaieÇÈèŒu‘ÍÒ{P‡ˤåÞ2u™½ÖqœJ{?)蟴PN’FJ/¥Z'q‹àDÁÁv¾¾’ _pxÊ:N&Ð^HÜâÒÊiß­Ý…Íœä5;±N$òvzŠƒ0W?üä7–I˼eêZ'r0íý$¢‹ÒH9OOYÕ:ŽH†Ÿ|R^Ý×[ìíö߱ޓ9´’…ºÂcPuEœBïAqf)•¹ÊueÆ2i­9žö~ÒÑKi§œ*M•¾jG$=,ðög{šøÃ_ø§u¢Œ¢½\#£3¥•iþóÁ±”ÿÿÿ0TÔ+ endstream endobj 130 0 obj <>stream H‰ìÕ1ÂA 1‚ȸ¢Ef’”o€¡¸Ýâëïãýù¯óÙ~N÷XººÀÒèÐ}–.@‡î°t:t€¥ Сû,]€Ý`étè>K C÷XººÀÒèÐ}–.@‡î°t:t€¥ Сû,]€Ý`étè>K C÷XººÐv 0š3 endstream endobj 79 0 obj <>stream H‰ì×ÿKUwÇñ¿apA‚@Ÿ6.\4¦?ŒÁ…5P‚¿Èd“´Åˆí^#¹â¶² wÊÈ’²˜l\„c]¡6Ê… WLÃB»â×[WÛ3î`kèá=ïsÏy=~ïooÎùœ×ûõyþ\äÕœúö—7Þú’¿Öƒˆì(14 wpP«ëºFÇf­ÇñˆŸ½Ï#å¯õ ž²´¼q(àöGšqÒH6òÍzyA{ß…èÆ4dÞ m™ÎLs¶žHd7 &'ËvrÂ+kãÉá”õ8òoÚ n³¾ñ¬-~coÙ)ÞË‘‰ùÇËÖ‰7é>(yEv‘`œ1ÒŒL#Ù¬'’¿hï»=™¶ÌÛ¡9ÓŸ­ÇÙSÓ ‡_äT—TĺûF²›[ÖÉ6´Üif.Ýx¬?W¥¾êNfžf­'¯Ñ}Pò„¼:ýýodŒ#ͬ'’—hï»m™ÎLsæÑ¢éÒÖ‰¼¦¥åã±kE¡–@0òiëU~ZO$;Ò^p³Ñ±Ù·?øŽ w$†Æ­ÇOÑ}Pò¤"¯8Zd f=ŽlC{ßýrEšM—æi)8çûoï;ÐFÔÔ4õNL=²Gþ‡ö‚ûñM•VµóšÞû°Gß”ìÝew‘NïtCE^‘ZÖãÈŽ´÷ ß]š—E¯Ö7%…"9œª¬snCáåL¡Ð^(+«™/¾* µ‚‘æèÀbzÍz")xºÊn!‘È%Ò‰Œ"©È+ë‰ä¿hï–Áä$½šWFǦi[#²£™¹tã±~ÎjqyëÙž›™§Yë‰äUi/©é…ú£—sZwßHvsËz")`…xüS€J!8‚ endstream endobj 131 0 obj <>stream H‰ìÕ1AÄ@ A$®h‘™{Ê`áw¦ˆ…œóïýù>ž¯_pw¾@ùìð}Ê`‡ïP¾;|€òØáû”/Àß |vø>å °Ã÷(_€¾@ùìð}Ê`‡ïP¾;|€òØáû”/Àß |vø>å °Ã÷(_€¾@ùìð}ʸ“K€ó1‹§ endstream endobj 80 0 obj <>stream H‰ì×ßKÕwÇñ¿a ˆÞxå‚4fP ¼0V0‚Ã@èÂ!Ã$›?JNÈ*q–EVcœ›ÃÙZ¿[¡ÔLFr£Cs’a¢œ8þ8G¶ç¤Éjjçœ÷ù~¿¯ÇÅAï^ðù|ßï×çÕ+É-©•ÕÞþᢊÀ{ïåoˆŽÏX'’ÿ÷ÓÏp^üZ‘ÍJ.¥ºû† wvppuM¡‰É˜u"‘YL,·žºYPÖέoOÏÎ['’­Ñ^pœ;÷Ÿ–×ôpjü^¿÷Ä:Ž8Õ±ons‹øµ"Nuk0º>‹˜KÖqd³´÷j6¶@ÓæìhÝto¸u"‘\ŽŒ–ì9Áͬ®=ÿhì¹uÙí'J­¬ööU8;Ã@t|Æ:‘8Þƒ²mÌ&÷‡)Ä,b"Y'’-ÐÞw4ú6­›¤Óí㈧qw8£ÛèÚ Îõ2žhlä•¶äûÚ®ÎÍ'­‰“è=(ÛÀœ9Òy™Ãäaþ0…¬É–iï»@èÊo4pΑ6N'·Ž#ž35¯os ÊÚï.&–­É;Ñ^pº±è‹}‡.qˆÅUB#ÖqÄ1ô”­bÂ0g¸6Ì&uÙ&í}w ÓÃw”ã4iæôsëDâ É¥ÔÉsƒk¯®)41³N$i ½àá}Õ]eåþàƒ_'¬ãˆè=(›÷pô³… ÜaÚXÇ‘w¢½ï&´q:9J?§¥ÓÕ­‰›½Þ6Ù Öq$m´\ƒ-ÐÝ7ÄFà@ÙìëD’Óô”Íx½m2aÔ6]@{ß}hæ~ò-ÇJW§±[Ç‹¾Ø{ð"w¬¸ªóBhÄ:ޤ™ö‚ËLMÇë›ÃœiAY{Çé;‹‰eëD’£ô”·czÞe’pO˜*ÌëD’ÚûnEK§«s¸ôvÚ»uq‰ÙØBck$¯´%ß×v¤óÚÜ|Ò:‘¤Ÿö‚+={¾Û–“-ÙsârdÔ:Žä"½å-˜Ln“„ybGÒI{ßÅèê_~}ƒÞN{§ÃÓä­‰ƒ¥VV{û‡‹*L Ã@t|Æ:‘dŠö‚‹­7º>=§F'è=(ÿ‰YQ]{ž»Áô`†XÇ‘ôÓÞw=z;íS¦ÉÓçiõÖ‰Äyn FËkz¸Eüò·uÉ,íw[L,í¾]PÖÎ)×7‡§¦ãÖ‰$Wè=(LÏÎ3%¸L æÓÃ:‘d„ö¾GܹÿT}^¶!:>ãoàæUzû‡S+«Ö‰$ã´¼`b2V×â  wvt÷ %—R։Ğރ²Ž™Àd`>p%˜L ëD’AÚûÞA“§ÏÓê9q>=ß:‘ä´¹ùä‘Îkù¾¶¼Ò–ÆÖÈllÁ:‘d‰ö‚w üU¹?Èqûª»~¸õ»u1¦÷ ¬aþ3¸ ̦„uÉ8í}¯yOÐíiøô|Ú>ß:‘ä¢ ¡‘âªN†ÃރǢ/¬ãHVi/xÍú÷¾ïÐ%}ï^¦÷ 0˜\f“Á:Žd‰ö¾7é{—7y8ú¬r»á«î ßxlG h/xÐËxâpàj¾¯-¯´åó£?ò¯u"1 ÷ —ñÕÑq… À`hxŠö¾—Ñöéü\ú?¯ë8blb2V×â>ì(?vòÜ`r)eHlh/xVt|æÀgßsúEÞþáÔʪu"É*½½‰/ﯞÓg0¬I¶iï{¿»oˆþÏ5à-À‹À:‘XL,Þ-(kçÔ7‡§¦ã։Ēö‚Ç]¿÷¤¼¦‡;Àï½_þ´Ž#Ù£÷ ñðñéµïoß:ŽØÐÞÐÿypxð.àu`H²çrd´dÏ N×3Æž[Ç{Ú ’ZY ~÷ pg7Áß0Ÿ±N$Ù ÷ §ð]óusâ|é|ï|õ։Čö¾¬ã-°Û–ûÀë€7‚uÉ8N¼ºö¼N\6Ð^5³±…ÆÖH^iK¾¯­õÔ͹ù¤u"É,½=‚o™/º ¬¯›oœ/Ý:‘¼Áß ­s5Ê endstream endobj 132 0 obj <>stream H‰ìÕ¡Áh„"éê-eÐ̃Œz ÌíŠè¸;O®Ï×íþøì·ðt:t€¥ Сû,]€Ý`étè>K C÷XººÀÒèÐ}–.@‡î°t:t€¥ Сû,]€Ý`étè>K C÷XººÀÒèÐ}–.@‡î°t:t€¥ ÿá-À²§3 endstream endobj 81 0 obj <>stream H‰ì×ßKÕwÇñ¿!B„`ˆppè@odKBB"Á›F„P'§(†˜9is[âLØB%ÖÙìDtØ<”’M4Ì’ÓÌôè)÷G¬+œsÞßï×׃ˆ¼êÅù¼ß¾Ïkm-3~ùõÞ®§ø;CÿŸ8^p š[ÚÎT”UõÜ=²Ž#i17¿XÛ╳òýÃK˫։ÄAtä¿b9ŒDNqÛ¥þÛÖq$šÎßà¡ùÛ:ˆ¤QßÕ;ìòú×<¶Û:Ž8‚î¾¼‹vðMç š³Ak ;X'’”I¬$;{G² šyÜcÇû§fâÖ‰Äqtä]¡¡±¼²s FIew$:mGÒB}ÐÛØ\ö—'f—Ùhë8â ºûòh ôƃî@ƒ GX'’íbÓ׿ÑU£“ÖqÄ¡t佸­›{}MŒ×aföoëD’bêƒ^5;·°þŽýe‹õNÞ¢»/6rû/ºCBМ¸Wlâñáê>Þñ“ÏZ/õß¶Ž#ަ» ÀËÚ†Ðë/–K˫։$eÔ½‡ eOÙV^–Íe­‰éîËFÐ rŠÛ:ÍÂ:Žl³…寛Þ}ðôž¼3'Z®ó£u"q:Ýù¨Htº¤²›9É-m¿výOë8’êƒcCyS¶•µŽ#Î¥»/D MÐ)hô Õ çK¾|uáò­}…-ìø—5?L<|jHÜAwA6(8Ýè,ÓRVÕs7öÈ:Žl—ú g°l%¯É†²§ÖqÄét÷eSè•_ýÈÌÐ2è4ëDò~áÑÉO¿ø–—ò•w †Ç­ãˆ›è.ÈÆ=_Lø;†³ò™™ºS?ÍÇ_X'’­Sôv°Þ?À;²•ì&jH\@w_¶€~AË`rhôë8ò†‰‡OÔ]áu² š»¾û-ùò•u"qÝÙ¬©™øÑúàú¯ÎÞ‘ÄJÒ:‘l…ú «±wl;È#²l¥u"q Ý}ÙZFàûß×íÐ>è Ö‰díùbÂß1œ•߸ûàézÿÀ|ü…u"q%ÝÙšðèdQE€áÉÿ¼s0ȰÑkh7tëDî0÷•wñ¹U£“ÖqdGÐ] XZ^m ÜÜëkbØjN^›[°N$êƒÂFÔ6„xv„Ma_¬‰—éîK&Ñhè5»ü#À75, endstream endobj 133 0 obj <>stream H‰ìÕ¡ÂÁh„"é*–2h& ßG™Û¯ßÝyÂuÇûóx¾~ûï#Ü‚.@‡î°t:t€¥ Сû,]€Ý`étè>K C÷XººÀÒèÐ}–.@‡î°t:t€¥ Сû,]€Ý`étè>K C÷XººÀÒèÐ}–.@‡î°t:îÚý¯ue‹§ endstream endobj 82 0 obj <>stream H‰ì×ñKœÇñ¿! A!‹ÇBöËFJ Œ@0BûApÎ)Š±ÔŒÃÕt³Z‚—T¢2òHÊÄŽR6e.Ñ¡nrË©wz[}À¨+fmzÞ÷yîy¿2ûÜãçñë§ÞWÒ5šù»»yëniUß3Ï×ç´\¸rÍ:<äÛïn¨xúj™oie­²v@}Ëö5µÆ6cÛÖ‰<­éƒ«úYè«uO‹o%ô.èÐÏBo‡ÞëDÈ|Ü}¤ßÅþ°6ŽŠ§½£ÕcÇqî¯ÅN· Î;«ú¾µNoá. Í‘…âònµ.Ïß™²Žã]ìAsê¿ÞýôFè½°Ž¯àîÓg7ûÃ9-z+K«ú¦g—­ãÀ‹¸ 0Ñ÷ÅO¹Emêž¿¢ççKÖq¼ˆ=hH_Í×ó×[ wÁ:¼…»C7oÝÕêQµ€´ƒ¬ã MÌ–ô4ò_éÍXÇwq`åÁz¼¡}4+¿ñб35 ƒ«Ñ ëDÞÂ4¡ž«í꼚¯þë-°NÏáîܶ¯¤K=ÔÒ&²Žc`~1úFM¿žÀ‘ãͽãñ­„u"xw¶foß;yêó_‰]—H<|dÈ+؃i¦n>ùQ=×cWçÕ|ëDð(î>œ@ H;hçW¢–‘ö‘u¢4y°ohÍÊoÔ?UÿÕjtÃ:À]€#„&æ^xíCUÑWÒ5š±Žã ìÁtR«Õm=põ\m·ŽOãîÃ9´†jUHí#­$m%ëD«0òÜKïéóú+z®Oß±Žü‰»‡H<|táʵœ‚òõ·>½}Ï:Q†c¦‡š\þögzÔê¶®ž['‚×q÷á4ZFÚGª¥¶’“uœŽ,—wë3=qþË¡_¬ãÿÀ]€£Ü_‹½ÛüÍ¡cgç=Ý2¤o­e,öàAS{Õa5Y}V«)3‚»g ŽLi+©œÚMZOÖqRfie­º.¨Ï•íkj Œmƶ­ÿÆ]€MÏ.—Võ©™Ï¾Øzi`Ò:Nfb(õ6·¨MOXMVŸ­ããîñ´•´˜´›TQm(-)ëD)ðι¯õq*k—~³Î<wŽ¥Zæù;Ôϲ@hbÎ:N¦añÉ_ÕX=[µ—_­p î>N3PëI-Õ’²Î’«ÑpdÁ:ð_¸ p²øV¢³wüÈñfµT×a~1j(s°SNýÜùFUoÕ^ëDÀcp÷á ÚPZRÖ)Oà.ÀùVV׫ë‚*jV~cCûèflÛ:Q&`¦:y®óªú©Gª®ª±Ö‰€]q÷ɸ p‹ëÓwü=ªëÑçû#Öq\=˜*j£:©‡©~ª¥Öq€ÿÁÝ$ã.À]þúÛ»¸¼›¿½÷ƒ=¸jàË'?ÒcT'ÕLë8Àáî’qà:›±íÖÀXV~£ª[]\ZY³NäJìÁýPëÔ==@õPmT'­OŠ»HÆ]€KÍ/F+kÔÞl_ÓûßJX'röàÞ¨i½ãjžž¨Z'žwŒ»W G Ëêpž¿#82eÇM؃{ Ž©iznjºgØ î> wàÒÀdnQ›šüê›—§g—­ã¸{ð©¨W¥U}zbjšúfØ;î>¤Ö ð@®© endstream endobj 134 0 obj <>stream H‰ìÕ¡qÁ”ˆƒTV¦NÀHDˆ»LÌ$ÁMÀÿ`ºÁá#Sû|p†Ï¯ûåãú¾g?ü;»À² Ðôóû÷}{¼ïÙ‡²û,»MÚ‡&í°ì4iš´À² Ф}hÒ>Ë.@“ö¡Iû,»MÚ‡&í°ì4iš´À² Ф}hÒ>Ë.@“ö¡Iû,»MÚ‡&í°ì4iš´À² Ф}hÒ>Ë.@“ö¡Iû,»MÚ‡&í°ì4iš´À² Ф}hÒ>Ë.@“ö¡Iûp¼—U¾ endstream endobj 83 0 obj <>stream H‰ì×ÍKTqÆñ¿!$‚hUC FµhãÂ@)7„„ ¸‚¤Ô0F¤K°$Ê$4˜½h¯b„æ"ƒ$R$#Cñ]GíA~(äŒçvï÷³twî}žËᬮþßž¿û¶çðUýZìÈôÌÂåÚ—é᪴ŒŠÒÊö‰ø¬õD^W}÷¾}ýZâu“Sój”z¥v©cjšõDÀް÷.öü$6<^PÒªJ‡²"-½‰å뉼‹{ð¯ÔµH]Ò‹R¯Ô.뉀$`ï\ìøÏëîXfn½Š­ß·¿[ãQ܃ÛSsÖ[¤FY$ {àb/À—Ë+-½¡¬ˆê]PÒ·žÈs¸·¢¶¨3z9êZ¤.YO${àb/ÀÇ&â³¥•íiéáª+7:§g¬'òîÁÍÔõDmQgÔõÇz" ùØû{¾7;}á±z~ðDmS´Ïz¯àÜ@ÝPCôNÔuÆz UØû{ÑÖù5œS§¶?{ïSÿëqìq®SÔ ½ 5D=±H-ö>ÀÅ^@p,,&n=èÞ—Y­Î–EGFãÖYâu@MÐ{P+Ô 5Äz" åØû{Aóë÷TqyÛÚ PÓð~n~Éz"¿•»ÒWôÔµÂz"`—°÷.ö‚éóÀÏ“çî«ü‡NÝŒ>ûb=Ž ßƒJ\¹ëñÕ5Áz`W±÷.ö‚ìi{ÿÚ]sþaÐî‚`ÞƒJYYëÁ•»Ò·0ÀÞ¸Ø ¸¹ù¥ÊÛ¯ö¹¦¡¸¼m">k=Ñ. Ú=¨d•¯YY+qån=`ƒ½p±–Eõ-ì?zýΣ ‹ ë‰R.8÷ ÒT¦JVÏ«”•µõD€%ö>ÀÅ^Öuõ eç7è‹çÔut Z“Z¹•£ÒÔ“*Yåk=`½p±€ š¢}ŽÕè»È+jˆY“*¾¿•Ô3†²"ÊÔzÀ+Øû{ØlrjþRäEz¸*-£Bè_뉒ÏÇ÷àZ|ÊN ú5>àŸ±÷.ö°•Øðø™‹Oô„²"-½‰å뉒ɗ÷ 2RRÊK–WÔ¬­'<‡½p±€íut fæÖë3ÉÎoèê²'iüw*e¤‡R^JÍzÀ£Øû{Ûù#ÀD':e endstream endobj 135 0 obj <>stream H‰ìÕ± ÂÁh„"éÊ)eÐŒ!¼Ü íLðñ'«;Oø_Çóu»?>÷×_¥}hÒ>Ë.@“ö¡Iû,»MÚ‡&í°ì4iš´À² Ф}hÒ>Ë.@“ö¡Iû,»MÚ‡&í°ì4iš´À² Ф}hÒ>Ë.@“ö¡Iû,»MÚ‡&í°ì4iš´À² Ф}hÒ>Ë.@“ö¡Iû,»MÚ‡&í°ì4iš´À² Ф}hÒ>Ë.@“ö¡Iû¬«»ð`§þKÏ endstream endobj 84 0 obj <>stream H‰ì×ÏKTQÆñ¿!B„6­ŠB°…."¢En„6®Š„hSD“$F6b -¡”"™*R¢$Ì"§C$–R‘Mø#§Fë)¡Q¨ãxß{Çï]Ýç<‡ÃËûý;$;7þÒƒ’òÆu[Žï©ëyóÉ:Qœ¨þu :…nd(5næ>ÀÅ\rë}Q>«·SUÓ6˜|k'ÞÕ¹šWþÐŽfÝ…u H˜ûsÈÍ—Ùo§ZïoØzR/hïáëï>LZ'Zž€îƒêYm+¹šWÿºëD@À0÷.æ°ZOöí âz¸}Pݪaõ¬ØZ Õ¼u" ˜ûsX¹ÁäÛªš6=¥ÐŽæXï ë8K¬}P­ª[VÏjÛ:`Ì}€‹¹äKw<¹©ò´T¸¶}(5ngAÙÕ¤úTTu{9öÄ:xÌ}€‹¹äÑÔt&ÒÒW\ÖPª?‰O¤g¬ý—ÿ÷Aµ§Õ¤úT«êÖ:P˜ûsȻѱôžº.½¬’òÆhGvnÞ:Ñ?øyTcêMí)¡šyóÉ:P8˜ûsX%‰‘mÕ­z_[w¿“xeço¾ÝÕ•S6µ§­ã…†¹p1€UuáÊÃMze»÷u¿þhçîƒêG-)•SoÙ¹yëD@bî\Ì`µ}žœ=Òt{}é ýèýkè'_탿+* Õû§"  1÷.æàÔðûÝû:õÜ6V4]¼öÈ:ŽöAµ¡NFý¨%ë8@cî\ÌÀKw¯ÊvFõè¶U·&F “øaTêA1JÃgÕŒa`í`î\ÌÀc™¯ÙhGIy£ž^í¡«£ci“¶û N­³+€zPêÄ$°1÷.æ`b"=Swü†^_qYC¤¥oj:ãq«}P'Õyuj}ýÀ±˜zð8°Æ1÷.æ`h(5®m×ܼýLw<éå§MöAQ'ÕwujÝËOXÀܸ˜ €¹žÛ϶¤ªš¶ÇÏÆ¼ù¨Çû Î¥Ó­ûµù^»ùÔ›.懻R*ê endstream endobj 136 0 obj <>stream H‰ìÕ¡ÁH„ Éê-ã\óŠšnqúÌÔž'ðŽçëv|Jû,»MÚ‡&í°ì4iš´À² Ф}hÒ>Ë.@“ö¡Iû,»MÚ‡&í°ì4iš´À² Ф}hÒ>Ë.@“ö¡Iû,»MÚ‡&í°ì4iš´À² Ф}hÒ>Ë.@“ö¡Iû,»MÚ‡&í°ì4iš´À² Ф}hÒ>Ë.@“ö¡Iû,»MÚ‡&í°ì\{ 0¸eO[ endstream endobj 85 0 obj <>stream H‰ì×ÍKTaÇñ¿!D„6® aDHÈ „Z$D mrÑB„ZHù:V¤%–J f3h™Z‚d&’ 5’²¡‰QŒ)5gtÔ~ ÈÆ8/÷Î[ßÏbsŸ{鋇gwøÿ¼xóéÈñ›úMö €”@.©`#°u«ëmnQ‹îcUÛ·¼jwÇ–û#ê¥_»é[ôEꥯÓ7êKíî r`"€Ôáõý®¬uí­N·»Ç‚›!ûz%`Ôüúн%Wßåñúíë Bä>ÀD.©æÃÌ÷S—éb:ÊÚÝC³6u±{Ôäš_-N^|¨/²© €h‘û¹¤¦^×T~i›®ç¹+=s K–×·oÔ´šYÅ5¿¾ÂòúâAîLä²ÖÖƒ ÷^g;³ êk~úÿXXÜŽ}PjNM«™oÜÒü` r`"€·°¸RQݯ{šWììî› mïXRÖÚ}PSi6M¨ššV3[R€åÈ}€‰\ÒÂØû¯Eçè¶ê÷ÕØçø Z¸jžýÙFß}‰¿ ûû¹¤‹ÐöNwßäÑ­º³Õý ‹+ñT³dÔ šDu4•fÓ„ñTä>ÀD.éå×jàZóó¬‚úlGãõÖ—këÁØêĹª¯ºkMRÓ0 ©b« ÁÈ}€‰\ÒÑÜÂÒ…«OuyóKÛz]S1TˆgTGõÕëšA“ÄP@²û¹¤¯ÁáyGY»®pIy×Ä´'ªwcÛÕE½ô¢úº‡f£z@* ÷&rHkÁÍPGÏx^±S¹²Öåñú#|1Ú}P•U_¯äµ¨£úÆ:2€d"÷&rȾåÕª:·îrNa“³st#°uè+‘¦šª¬óê¢^VŒ 9È}€‰\2ÆÇ¹g/?Ñ>væî³™ð‡#ÜUGÕtòtÅcÕ·nXÉAîLäaö78í†a6¸C÷Á¨¶Ké‚Ü˜È ól¶œ£9…MºÝUunßòêÁ3aöA×[zª Í#ªfÿÈ„Ü˜È Sy¼þÊZ—.x^±³£g<¸2ŸþsÔÔy=Ò»ªØ‘ØŽÜ˜È ³ML{JÊ»tÍeíƒÃóûÿÜõTgô§ÎO}Kư,óW€US=Á endstream endobj 137 0 obj <>stream H‰ìÕ± ÂÁh„"éŠÔeÐŒMx‰ >þduçù¿ÞÇçñ|}ï¯n¥}–]€&íC“öXvš´MÚ`ÙhÒ>4i€e IûФ}–]€&íC“öXvš´MÚ`ÙhÒ>4i€e IûФ}–]€&íC“öXvš´MÚ`ÙhÒ>4i€e IûФ}–]€&íC“öXvš´MÚ`ÙhÒ>4i€e IûФ}–]€&íC“öXvš´Ï%ÀØKÏ endstream endobj 86 0 obj <>stream H‰ì×ÏKTQÆñ¿!0L7BPÓ@¶Ð ÔÆ6‚R … EàÂÐÑŒ ­L¢”ŠPJa‰‰”Ô¢4Hª¡JBCËÐÔrL°'.ÈÏxïmæ~? —;çžóžwsx8KK«{ôäýŽýåz®ñà-äàm¡¡Œìö¼¢öpdB#Õ ýú«§Þ5¢qýÕÍt»Y6"÷&rðˆÙ¹hi°'ÕW™’YqáòÃK×zuöõÔ»F4®¯Ó3ón· À^ä>ÀD.ž™,(îЩOóW-?óÏÝѸۭp¹0‘ €ݸõlç€Î¾žzw»Î!÷&rð”ÈÈdAq‡Ný®ƒ•ÿžþ*=5¢q·[àr`"˜‹êúR}•)™%î²Ú^}=õ®ë«æ¸Ý&{‘û¹xA[h(#»F‡=·°%™ÐHuC¿þê©wœ8ݪ¿š£™n7 ÀFä>ÀD.Émpx4'¿IÇÜ—{³ëñ»åqó>hÑWÍÑ æk•Ͱ¹0‘ @²ÿyæbH|÷¡ê«O£ ‹æ×•÷AÑœÚæÍ×'­Ug[`;r`"€äó{þ.€ÖµîlY×ø·™•sV½Z4_«–/’ªfËBîLädî÷¼ÝwìºÎuN~ÓàðèZÓÖ¹Z^½SÍQ5Õ´§YN#÷&rH¯Ã_s [t¢÷­íì^ò†÷A‹êX·KUVýík€;È}€‰\’À©_Ååt–ÓüUº¾Ù¹è†K6yUSMUÖ|í¢½¶£eî ÷&rHhÑ…ÅúÖç{_ÑA>UÒùelj“ 7´¨ráù{Z¢½´£öµen"÷&rH\½ýÇëu„œlxñyKk·z´hí¥…ÚW»oi-€ÿ¹0‘ @" G&òŠÚuxÓ³‚·;c¨Û}ÐÒÒ¾Z®ÔI ¸…Ü˜È ±LÏÌ—{R}•úéEc«Ï}pÛà0r`"€Ò|÷ezVPg6¯¨ýçïñ”Šó>h‰ŒLªÕQWê-žRœAî#ü`¡L endstream endobj 87 0 obj <>stream H‰ì×ÏKTQÆñ¿!B„ \‚bd ‹f!”A($ÜXAN¢(B©b -© Ä¡B%j@ÂŒJBÅ4Lœ&ü9:jOÜEú÷Þs¿ŸÅefsÎó¾pxywv¸åé‹ñ}G®ék;€?‰ Må¶èµf4÷E&v`õ­ç:MßÝ¥€Ý`îLÌ h†Gfó϶êa>q£§Ô£[¼ÛJžqò¦®P-ªÈ£[ü/æ>ÀÄ\‚c~a©ôÊc=ÉÙÕu-/×Ö7½»Ëë}P”_U¨]¤ºTwwøGÌ}€‰¹¹:•Ttù°:ù°:T˹KÝþ,¹þй01ëzúG3Cz‰ùg[‡Gfý¹Ô·}СºTnT¥ª×ŸKüŒ¹01‹>ŒÏ‡ŠÛôÓóê;ºßúyµÏû ãAÏ;Uª{Uµj÷ójæ>ÀÄ\¬ˆÆVËý)•©YUá†å•¸Ï¬ìƒ¢JU¯ªVíê€úàs`cîLÌÀg‰­íæ{¯ÒrjôôŠÊ:'§­Ä°µ:¦>~Qí  >¨ꉕÀÄܘ˜ €Ÿú"ÙÍztGOÝŽ MYLbwt¨¹…-Š¡ž¨3“{s`b.þ˜œ^(ꃺ¡ž(Œú£.ÙÍ$=æ>ÀÄ\¼öuiýrí³ý™×S2*/Ö<Ñ_Û‰¾ È>èpZ¤þ¨KúI‰¹01OÝízsèx^Ùéóc“ŸmÇù!Pû CýQ—”JSßlÇ’s`b.‰ Må¶è}e†øÄ¸:ú"꘲©{ê¡í8@²aîLÌÀu3s±’Š.½¬´œš¦öÁøFÂv¢_ì>(ê˜ú¦î)¡:©~ÚN$æ>ÀÄ\\´¶¾nHͪҳºpµg!ºb;ÑoytDc«ê¡BªŸêªzk; ˜ûlßQf=º endstream endobj 278 0 obj <>stream H‰ì×ËK”QÇñ¿¡œh‚ "pcäd DEࢠZdÔJ"è²Ô]4:ØÂ¢’$¡²f!¥t#f#–QI„-$¢°¦rLË~uººLsyßw.|?¼ˆ3sÎsžwqøñLOø¥½+æ†g,Úç „vº6ñqªíÄM}Ô_ý¯oô½>jVºY.ºzû‰.»þº@Q €ò­Z}T×\φmç/“æûŸó ù¨ïõ«Y¦õÚU¸–¸ˆÜØÈ \Åo×6týñî>|nÿúÛÀF.e¦ûò™æ*¡]{¢ÿšæÒ̃Óß&Jí­ø1Qž¿tÏÅŽxˆÜØÈ lÜ}ø¼fÝ1Ýh=u gžÅÇÒ,N?ª :¦ *«¾Ó-ð¹°‘ @x=öaÓŽ fp«¬=Ügä¿[2™ USMS¼~{·Îr¢e…AîläPÒ&>Ní=Ò?kq‹.²ik{W,Ùσ†*«¾¶è,¨ssm@!‘û¹”®hßðü•t…gVïklêy“Le¾7ÛyPT_§è,mÔ¹:=û–¹°‘ @)zô$±lÃI]^=+6žz:ú*Û 9̃†ÎZYßaŽVê$Û ˆÜØÈ ´¼I¦›zfVǬ:íέNÎó ¡suº*¨õ£®r«Àcä>ÀF.%ä`ÇíÙKZugg-n µ_Ÿúô9çRy΃¢Ó[ßP'ª£®öŸº•s)ž!÷6r( ýwF*kë¶êÙ¼óâë±yÌ4Ô‰ú1©Cõ™gA®"÷6r(rÏâcµ[N›«fݱ¡á¸#eš_¨7Ó¤ºUÏŽ”à8r`#€¢õîýÄ®=ÑŠ@H—tÞòý‘+÷,î쪋©gýÖ³‰—I7Nqi4Ô³:7¯ wѹq €û¹/Ç(WçAÛÁ@VÈ}€\ŠÁxj²9Üë „týÁpgd Ýê/ +pö endstream endobj 279 0 obj <>stream H‰ì×ËKÔQÆñ¿!3*$Š6ENv“ ÉE´HȰ•Ð&¨\Ö. œ”L%±°¢ÈE]ÅA%Ý7ÑLBl!¢$‘Œ™wËž8!'覣¿w~ã÷ÃàÒßsžÃáåœLÜ©ºÇ Ö–êï,ü¯¿ºÜøléÆr}+==V~wxd|®¿à/î=m×{Ô_ë €¤À\Ì5Þy±¥B/qa$Z\û28ÀGÛE'Ò¹t:}Q'Õyø(€ßbî|ÌÀЛw²vŸÕÔ/wÿ¥®žx`Ÿrtt:ÑV§~ÕÖاLaî|ÌÀD_|¨ðHƒ[ŽVåV75w ø}ÐÑIu^wp5 ÌsÌ}€¹lâë·²s­;©§·x}YÅ…'&1¬öA§òâS]ÔC´ö¡:1‰ÌCÌ}€¹)ö mEN¥]Zfé£7ûF¬’Øîƒ¢³«õ êDÍX%ææ>ÀÇ\‚ñ¾óÓ¶‚‹znúeçŸÛÞk›Ç|tÔƒÚpµlÝ{A-ÙæRsàc.s­`äÀÑ›i™?VžåÛNÇ´Y'ú!IöAG¨åQKêJY'Rsàc.sª¶¾eɆ2½²EëNž8Ó4:6a觤ÚEͨµ¤TjL½Y'Rsàc.s¤©¹cUnµÞ—~‡®÷Ҭý"ÙöAG-í;|Õ¦öÔ¡u" Õ0÷>æ0ëºzâyEWÜR“µûì‹ÖnëD¿‘œû £ÆÔ›+PMªOëD@ê`î|Ì` Œ—ÄF¢zV˲O]»õÒ:Ñ%ó>è\¿ýJ*¤úT«êÖ: ˜ûs˜-—Ÿ¹ý%==V~7É÷—äßEªIõ©¨êV ['B¹ð1€Ä½hí^³³FOI¿¼¢+=½Ÿ­ý[(öAG}î*ªwõ®ÞQ£¶­!ÆÜø˜ @"z?ä¼:µª´<ï´Nô¿B´:êV »ªÕ¹š·N„sàc.33:6q¼ê~z$ª´dcym}‹u¢é Ý>è¨gµ­äj^ýë¬!ÃÜø˜ À 4Þy±¥Bo'-³´¸$öepÔ:Ñ´…tµ­ÎÕ¼òëtÖ‰€0aî|Ì`ZÞ¶÷nίӫÑo{á¥÷Ÿ¬ÍPx÷AGÍ«w›öÔé^¬áÀÜø˜ Àê‹ip ÈŠœÊ¦æëD û>èèVæT¹KÑí莬!qßÐäñš endstream endobj 280 0 obj <>stream H‰ì×ÏKTaÆñ¿!Ct¸l—™ â¬A-¦•‹ÂÂ-*,¢•`*Š™`‘‚‘ ƒ²_B¤!e…ÉM% ‰(ˆ(ŠZjj=ñB¼dÙÂÏåÞï‡a\™ç¹ÏH¤®×CÛv—ëÝz@ °€ÿZY]«iêIÉ®Ôâw}Ö_¬‡Ú¬ê›¯ôuôn=Èf…2 qØû{ØXçËOéùµzLô:v¶mvnÑz¢øÍ=è(—ãçÚ\LÊëé‹ÖÅÞøØ À¿ L5»#7Ö884a=Q<…ìt”‘’r‘);%h=8ì}€½¬7¿°Tr¹=)ó×Y‘–Wó ã½õDñÊ{Ðyôl@©éÛ)ÁS—+M뉀aï|ìà -½©9Uz.’³*Êê»—–W¬'Jˆ߃¢Ô”ÔwTšÊÔz" (Øû{ø­÷ÝÈ®ƒ×ôDè+i˜œ³ž(Â}:JP9º@•¬òµž°ÇÞøØ €ŒŽÏßv‡C框þ1ë‰. ÷ £4•© W)+kë‰Kì}€½€ˆû¶øýbUçö=Wô ìÈ­¾u¯Ïz¢-{ÐQ²ÊW_YY+qån=`ƒ½ð±eþPZÑ©!j÷ (_¥¬¬õÅ•»Ò·ž0ÀÞøØ ˆ¦þ±½‡¯«üzߟ±žh«Eðt”µwÑ«j‚õDÀ–bï|ìDÍäôÂÑÓwÜ9q îMßë‰lDöt”»Òw5ˆ•´ªÖ[„½ð±KË+eõÝÉYê|jNUCK¯õD–"~:ꀚ ßA­P7Ô뉀„cï|ìDD{×`Z^Úž”Y~òÂÃù…%뉌q:j‚ú Vè×PCÔ뉀Äbï|ì„ÞàÐDn¬Q=׫ ¨yxdÊz¢@àô©ê†+‰Ú¢ÎXO$ {àc/ ÄfçO”>pÿä§ç×>yþÁz¢á\O QO\aŠÏßW¬'â½ð±J+«k5M=)Ù•ªwrV…>ë/ÖC ÷à_¹æ¨3úqÔšƒðaï|ì„O÷ÛÏu*¶^EgîNÏ|µž(ˆ¸7 Î¨9®B;÷_U£¬'↽ð±&Ã#SEÍîßø}Gn MXO\܃ÿ¥þ¨E®Nê•Úe=ì}[?Y"ûf endstream endobj 281 0 obj <>stream H‰ì×ÿkÔÇñ¿!7Y_ !AòtXËHPó‡A0ú‚‚pEJlàí+kNšhØÆ²a^!#n¤–+"U®­†b£vÔlk²u›îæmö’OÔeVs»»÷çsŸçƒcèo¯}x}ö¾×à.Ÿ|ùã]ÐOë À²LÏÄËÊÃ9 ú¼zK]¨£Ï:‘ÛÕùBÏJ?­ƒ¸º¤FéY©]ꘚfXî> wYàÈ{_ß½¹ZMÎ ÷×Ï%¬y{pñÔ(õJíÒSÓÿÊ:°tÜ}@2î<­«gp}á!uXŸâÛFÇcÖ‰<ƒ=x§Ô.uÌ)›Z§îY'–‚»HÆ]€GéËùϵþùåü›ï†¬y {piÔ4õÍ)Þã϶ª‡Ö‰€;ÃÝ$ã.Às®Í^ß[}:7Tuï{¸¦9Ômȓ؃ˡ֩{z€ê¡Ú¨NZ'‹»HÆ]€·„:úVÔª´9`Yyxz&nȫ؃ˤî©ê¡£:©fZ'…»HÆ]€Wô^ÞTÔ¤ºêSøtËÐȤu"oc¦„z¨6:µT?ÕRëDÀÿàî’qà~W&¯îÚ}Òùʽv[CgdÀ:Q6`¦:©f:UWÕXëDÀ¿â‹ÐsqØ:ð_¸ p³ø\¢¢±såÆJµ4/¿ê­Ö.ëDÙƒ=˜rê§Zª§ªÆª·j¯u"à6¸ûðm(-)ë)°¯æŒÞ¸—+:FÇcÖY€Ûã.ÀµÂç.¯ÙZ¯~®Øp tÏ©©Ø¬u¢¬ÂLµT]UcõlÕ^uØ:p+î>\N»IëI-Õ’²Î’úu^x½]¿Îª‚Ú7Ï%¬·â.À…~úùׂâ£j¦>úGtpÂ:Qb¦›\àþè˜u"à/Ü}¸–¶’“v“*ª 52ú›u¢”é¹8¼£¤Y¿WþÎßý`øî\e*6[ºçÔŠ 7¿H¯ÙZ>wÙ:QÖb¦›Ú«ë!«Ïjµºm¸‰»wÒJÒVR9µ›´ž¬ã¤Å‰¾_·ý ~ÇÏïŽYÇþÀ]€{4¶Dòò«TÈ•++;ó Ö‰²{0Ôa5Y}Ö£V·Þ9oàîÃu´Œ´TKm¥¶ö^ë8é5=¯lúüžÍÕ¹àk•_™¼jà.À:#k·5¨ŠúìÚ}’?ÀÌõY­vê­ž«íÖ‰àkÜ}¸‡þ>stream H‰ì×ÿkUuÇñ¿!¨ ”ˆtvŒ’FhÐÅ~Q1R“¬À‘›scº©m)39%¿1Û†9q~af¹‘ùm‰·Zk‹ëÅuånîÞmjO9`T~¹Ûîö>çìõàâþôâœÏkŸóº_¼èØéëÏLYË¿ÖAÄÿ‘Xޒοç_ÙÔÐØbhD+þ¬žÁ¿ÖAF4Z@œRÐ:bHüO÷¾ ¿šÚ¦É³Ê8xs–íiÝ´Žãjt3[Á³š1·ê\ÓïÖqdDн à ÑÓ÷ÁúoÒ2 8lã2‹¶í9oH´]„FÐ ^¡)ôÅ:‘ø™î}N,v GŽsôäÏÖq¼[ r×¹ôìžÛâÕµ­íQëDâsºd¨í ^tþ¦Î(xoÍáή„u"y@{ÐUèí #¼úBk¬‰oéÞ—áÁŠaË8ÓX7lëDéèZžäŽÏ,Z_YßïµN$¾¥{A†Î•ëá@nŒßKó¶ÿöÇ_Ö‰äÚƒ.DGhŠSºCƒ¬‰éÞ—¡Æra¿°b8i,šp$fÈÃ~jþ3÷­/x’/äl>pä’uñ'Ý 2:¢wæ½û¥óY;iæÆº³7¬Éiº}¡5N}èm²N$¾¢{_†›…åÂ{ma5[Æ:ŽO<|ª¯Îß©§*)§{AR«ïî½õ•õc¦r®ÆÖ•l;ÅÿX‡’GÐt3ZCwhïˆ6Ñ)õHRE÷¾ v k…ÓÅra¿XÇñ›îx3ã3‹xÂËóƒáHÌ:‘ø‡îI¡Ãǯ>;£”ÅoáÊ·cqëDòXÚƒîGƒ­:èŠfÑ/ëDâº÷%åØ&,Îk¥dÛ)–‹u"ßjm.^]Ë£žU\¹ë\¢§Ï:‘øîI‰PË­s«œ׬¼­W®‡­ÉShzm¢SN¹h]³N$Þ¦{_Rˆ=Â*a›p¨Ø)¬ëD#Bã¥6ç£+[Gå·w±,¬ãÈO\ äVðg¾¹½ñR›uq)Ý òH‰ž¾üòº´ŒŽÇ¸Ì¢-Õ Ö‰$Å´ýжÒY^.ý¥ÅtÙ:‘¸‹î}y2VÛCÂŽ`MXÇ‘Áâà^˜UÌ;]¼º¶µ=jH\G÷‚üßÞàÅôìƨ©k—|x¨³+aHRO{ÐÇèì;}EyÅt™F['ѽ/ÃR`/p<Øå;β#¬IÊ„#±åùAçån¨:ÓïµN$.¢{!9 0¦úf endstream endobj 283 0 obj <>stream H‰ì—ýK•wÆÿ†5£‚ Q¬¬es²C[®&1QÈ‚ {i.6¨`lm²<:VK+›¹Â^È­«3£•½-1F³Qf9QHšÆYØ”£yNmŸx ¢±­Ìã}Îó\Dýé‚ûþ^×u߹㠚[ƒ¾¬Š'ž[Ë7/{[{G·µ"+жœbÊü´"bï—Wì€à ÖŠÄØ¡Ü÷2´}:? @ÿç °–#âˆ]Î?ýJ)»±hùž–ö?­åˆ1E¹à5Êv4LL-dèIÉùkJFnG­ tzÞ~Þ†:|€5ÀpkEbŒPî{>=ŸÑO[Bó·–#â‘ÞPø“’£R ˆ~áOkEbŒP.x‡†ÆŽgÒ70n¾¬·wo„¬ Kt ÀpÇð\ÂZ‘ˆ9Ê}¯á”|>=_%_ü/íÝÙ¹{q‰©sK¾ùö×èаµ"s” ^àZWOÆÒíNå{öÕ¯Î_ê´V$ìÑ=(î'ÌÌØèX^cX+1D¹ïhòôyZ=_´|=ßZ‘HêêÛ|YlNÚâÊúsW­åˆØ¢\p7áÁÕ…‡“’ó™òd_QUÍ9kE"^Ð=(À%Ø ßÀ=¬‰˜ Ü÷txš<³¦ÕÓí­åˆÄ#:4\±û—)sŠÙ¢7?üîêY+±B¹àbª÷7:íîÉäü÷?;¤v'îG÷ ø'¸ÄŸÿˆc°¸b­HŒ>Ê}×Co§½3ešüægiõÖŠDs³çÖJmRrþ¤ÔBù‰¾þˆµ"1ú(\ÉùKÏ¿VÎdù2–n¿ÖÕc­HĺſcàŽà$ø‰µ"1š(÷] ]ÆNo§½ÓáiòÖŠ„Khn fæTc3¬¯ \°–#Få‚ËÀü_g·Sä¦Ï_WWßf­HÄ)ºÅs²¡qÌWQ±t Ê}·BK§«3\zûÅ–ëÖr„ ¿’’¹‰K_RÕØÔi-GŒÊ×¹ÍÛP7~¶ŸN|¡ lGƒµ"×èN21µUÁ[p|ÆZ‘x\”ûîƒfN?g¬É ËhìÖr„›–Vž™ì+bßÞýø‡àµ"1 (ÜÁ¡c—ŸzéKF9nÖÚe«ö÷†ÂÖŠD¼£{P<$ø ®‚·°0ø nc­H<Ê}7A§“3Pú9-®n­Hx/÷ÓƒZ<× \Htš[ƒ¾¬ †È÷ò¢¯Û;º­‰Ä@÷ x$ð–´Å•ŽÕà98µ"1B”ûî€N§3MNBú¹µ"á9›:Ó—T±É ËǯXË#G¹¸ô†ÂËVí7ën=›–VrèØekE"‘Ð=(F>ƒÛ°98þƒ Y+ŒrßнiàÌ‘6N'·–#<;ڦ Ö³™9Õ[®[Ë#A¹ˆD‡†‹·žžRÀìÆÏöl:ɬE‰C÷ ¸Í›Oá<ì.„É å~BCߦu3AxMà‚µ!îÒ×ñ—Ÿ˜”Z˜”œ¿Ò_{³ç–µ"ñh(Žºú¶éó×15¾ìܽztbdÜþ-ÀÉ·ð• endstream endobj 284 0 obj <>stream H‰ì×ÿkUuÇñ¿!˜!I öC”WÇbJÌ~pàE‹üA±ÀTt³¼ó¦Ý–ִѾNÔi6bC©¼JéE©Í•ù¥!»äX®¦Ì®ls÷nw³§1ÍI»÷}î9¯—a¿Ä›óùœ×ûunÝy<×ã7—®ÙÿÄ ›ùÍ,ªˆD;¬'’±úöÄ%N¿ÖƒÈãá¥ÛP~8'œ’*¯<Þ?´žHä]Ýñåë/ÓæmÛU:52j=‘Œ•öB¹üÇßEËjœ6gaå¹ö¿¬'’,¶õ³ï¹HüµD²Ø…K=d‘J¤e=‘<šö~Ö¡WÓ®éØ}[/š¸Y´årá’jîj~IU$Úa=ŽŒ‰öBVèH®-kšrXl„†æ³ÖIÖÓ÷ ŒÉiªdIE^YO$ÿE{?»Ð¨éÕ›¦m=ŽÈ˜Ôh^æÞ.^½7ÖÙk=Ž<‚ö‚ûUïûéɼÇ”–†Ž &†­'/Ð÷ Œ£äPŠt"£¸Tä©e=‘<”ö~¶ EÓ¥9,z5í:52j=‘Èc¸Ñ—x7üÝäÜ-üøÿi=‘<”ö‚›:ÓùÜ‚¿E«ê{®õYO$Þ¡ïAwdTÉ[{œÈ"»H0ë‰ä´÷Ýïn‘Î U¤%«µÇ®.^½—Ì™^ÞÓØf=Ž<˜ö‚;Q«ŠWîV­’ôÑ÷ ¤ yEj9ñEŽ‘fÖÉ=´÷]ŽÎLsæŒhÑtiëqDÆA$Ú‘[¼“[]¸¤:ÚrÙz¹Ÿö‚Û &†KCGrAÎeJ^¨¶¡Åz"ñ&}JZ‘]O½øwŒ4#ÓH6ë‰äí}×¢'Ó–9š3ýÙz‘ñ”Jíª?=mÞ6nøÊÒ¯ººãÖÉ¿´\¥¡ùìÓso¿)ÁµeMýIë‰Ä³ô=(éF‚‘c¤7d#߬'’Û´÷]ˆnLCæ\hËtfš³õD"iq=~sݦf®ú”¼Pyåq]—Ð^p‰¶óWæ,¬ä,ø-«a5XO$§ïAÉ ÒlþkµN¸‘rdõD~§½ï*ôaZ1ݘC¡'Ó–­'I»_Ûÿ,^¹›;ÿü+Ÿ|yøœõ8¢½`ð_ºf¿S–fUD¢Ö‰/è{P2‰d#ßœ #ñTz iï»M˜>ÌqÐiÈÖãˆdTã7çûÿòëµ?_è¶Ç×´ ¥FFßÛ™4»œ#˜œ»%üù ë‰ÄGô=(™WQs’¬ãâ‘{¤h=‘iï»í—ÌAЇiÅÖãˆØL T}rjþVÞ…u›š{®õYOäSÚ VšŽ^œQæáO˜µyÅÆC7úÖ‰¿è{PLu$¹Çõ#IBë‰|G{ß—ÞËÐiÂôaë‰DŒuuÇß|§Ñy)¶×E“C)ë‰|G{!ób½s_­â±óË/©ºp©Çz"ñ#}Š¡öØUÒωAòT´žÈG´÷­Ðréº4^ž?í—l=‘ˆ‹œ9w¥hY oGnñÎæc¿Yã/Ú ™t£/±bã¡ ³nW g^ú°éèEë‰Ä¿ô=(æÈÀ…aî!©H6’Öù‚ö¾ ú--—'Oã¥÷Z#âR{Ûžÿ1oÊ¢Uõí±«Öãø…öBÆ|úũɹ[xÚ“f—oÚI¥¬'_Ó÷ ¸IH’ŠÜF’œ´žÈû´÷3ŒNK³å™ÓréºÖ㈸]ÿ@òýÇØ9à†òÃ×ã7­'ò>í… ˆD;fUðœù-y{Ÿ.¶¸¾Å=HÅ¥kö;!IZ’™Öy™ö~Æp±i³tZš-ý––k=‘HÖˆuö._°š6o[ÝÖÔȨõD^¦½V]ÝñoÔ9%gÎÂʶóW¬'¹C߃â6$$9é&ÉI~ZOäMÚû@w¥ÁÒcyÔtZš­õD"Yé‡Ï/©â=âo$Úa=Žgi/¤Iÿ@rmYÓÄ@Ç;5ëÞ¯±žHäúwjh>Kfr9ÉOR”,µžÈk´÷ÓÖz·ÁÒf­ÇÉn©‘Ѻ­Ó ¼SË׌uöZOäAÚ éPÛÐâô™œ@°4td01l=‘Èýô=(®Ef’œä'W”,%Qÿ×ÿî ôÓ endstream endobj 285 0 obj <>stream H‰ì×ßK›gÆñ¿a ˆP<ñ¨C‚ ³Ð® ¬FÁÆ<èC†àlþ ‚[©®ÅÕÊ”Ži!'ÁIítÈdN]© ³Ñ°9iŠŠE­‰F»/8¤tνó¾ïõ¡zvûð¼×}=/^È˾ûá÷7Þü„_ëA\(<¿RY3Èñæ•´÷ L%vv­'q‰µh¬¶i(« 1Û×\ß>¼¾·žÈU´Òë—_#ç®ÜæHù÷ö{½‘Å¿­'9XÛç£ÜR~­9Øâr”Ý‹Sr•tµžÈ%´÷O픎JS¥¯ÒZé®Ö‰¸P(¼tùÚ],¿¬£?0c=Ž{h/¤ Õ¥º!Èaž)jkºñàÇéyë‰D£÷ 8YJ¢’«\W2–¤µžÈñ´÷ÓŽ^J;åTiªôUëqD\.82ç+ïä‹+­èž|¸`=Žh/¤.¾•ø´g|¯®TÕ"«Ö‰¼žÞƒâ ä*éÊ%iÉ[R×z"ÓÞO#º(”ó¤ÒQ­Çñ ¶@Wß„ºwºh/¤ˆüg p†o½ûÅôìëqDŽJïAq2–¤U÷N‘ö~ZÐ?i¡œ$”^J;µžHÄs—£Õ A>ÜÂÿ­±ÍضõDN¥½pl¡ðÒ;ôqzùeýëqD’£÷ 8yKêr{I`rØzçÑÞO“æIÿäé¢4Rë‰D<íQèéùÊ;|g/\¿74k=Ž#i/óÕçµMCYÙ¾æ?Y߈[O$’4½ŹH]²—&‡Ic2Ùz"'ÑÞOm“ÎÉÒ?i¡ÖãˆÈ¿ö¿Í‹W{õm&K{!)‰Ýž©Üb?‡VY3ž_±žHä˜ô§#Éa®1™L2“ÏÖ9ƒöþñÐ0陓æi=Žˆ¼j3¶ÝÚ5šSØÂwZÝ\\ŽZOäÚ GwüqÑ¥›¿c?ýa=ŽHJôw ÷“™”¶Ç´÷“E«¤[rhôLÚ&Óz"ù_ ‘Õªºln±¿«o"¾•°žÈ´Ž"<¿RY3ÈAå•´÷ L%vv­'I•Þƒâd2ÉL>s¥ÉjÛz¢Œ¦½t4Iú$­’£aÒ3­'‘#™˜ù«´¢›/×WÞùÍ÷¿Y“é´·¾¯oÎö5g4Ö6 ­EcÖ‰¤‡Þƒâ2ä3)MV“Øä6ém=Q†ÒÞ?":$M’³¢UÒ-­Ç‘¤õfòË:øŠ/_» /Y“¹´¡[$.¦÷ ¸YMbs·Io2ÜzœL¤½ÿZºE"®±Õ·gûš³ ?jý–ÿZO”‰´4ùp¡´¢›“ñ•wGæ¬ÇI?½ÅÅÈmÒ›N’“çÖãdíýCÐiŒôFÚ#RÕQÄÂó+W>üšèË+iï˜JììZO”Y´^±Y­ª p&gŠÚºú&â[ ë‰DN„Þƒân¤7N’sÏIu²Ýz¢L¡½ ú!-‘®ÈáÐiÖ‰HšÝ\té&ß8¿ã?ÿi=NÑ^Ø·ÛößË)lá@ª‚‹ËQë‰DNÞƒâ$9yÎU'ÛIxrÞz"{ÚûÿE3Üo‰4FëqDä¤$vv»¿šÌ-öó½WÖ †çW¬'ÊÚ {î Íž½p£8_yçQè©õ8"'NïAñRlç“ó¤½õ8Æ´÷_F¤r ôCZ"]Ñz"9qÏVŸ×6 e4fûš›n±dž7÷B|+ÑÕ7‘[ìço¯ª ,DV­'9mzŠg‘ù$?÷Ÿ-À.`#XOtª¼¹÷÷Ñ÷h}œ h=Nêþ`{»-» endstream endobj 286 0 obj <>stream H‰ì×ßKÕwÇñ¿aHÞA#8"èEÞHt¡7"¼Ñ„!ÈJ›q¢ˆtÁÁ ÇJÂܘ˜ë€0;]t Ü¦Ì&êíhzôôã ßqÖüy<ïïç{^BòîõA¾Ÿ×ëóþ½ˆìOj#}%úèHiûgŸ_¨oîŸ{m(×~úõÎÎOë ¹óÃÏ¿‡ª;8uEmtôÉßÖqDl´û _?­ƒˆØàþ§ø hzÁ:Nîäaï{Øx,=ÎÎêcû±­‰ˆÌ-$ÏÈ\kë›Ö‰r'¯za|r¾¦¡—óŸ¸z§ÿ‰uKzŠ€. øh:Â:N.äUï{Øu¬;6gï±ú¬‰ˆOÅ3•á.îŠcU×ï=³Ž“#yÒ ËÉõ¯¾ùñÐñ‹¡¶–È¿Z'1¦÷ ˆ‡F h:‚¦|AäIïg°èØu™ÇÒ³Ž#"èL=y{£º®ûéøKë8.ð½~ûîÖÝÇEåŽþòûɯ¬‰ø‚Þƒ"£è> ú‚Ö ;¬”À÷~+Ž-ÇaÙu¬;ë8"â’•ÕTë‘Ã%—¸C/¶Ž“è…Ù¹×õÍýœâHiû•è£ÔFÚ:‘ˆôÙ9š…~¡eøjhzÇ:ÑÞ ÷3Xbì1ŽÃ6c¡YÇ‘<2›(=}“û§¢6›²Ž³/N÷ÂÚúf¦ Ï˜[HZ'q†Þƒ"»EËÐ5|8ôíCY'Ú §{?ƒõÅã ì1V™uÉG©tgÏhaÙeî¢3÷¦g—¬í‘»½pèÙ±ªë„¯ wÅ3ÖqD£÷ ÈÞÐ8ôŸDYÇÙ5w{ßÃâbwq6KŒ=fHDòÚâÒ›¦ÖA.¥Ã%—ZoŒ¬¬¦¬íš‹½ðtüeu]7±ž¼Ö7˜°Ž#â$½Eöƒö¡ƒøˆè#ZÉ:Î.¸ØûV[‹ÅE~ÖÌ:‘ˆÈ¿2Ï“âW{ž¸Õ \þ˜: ¨ëD"®Ò{PdŸ>~žÐM®ï}ۉŎ"*›ŠeeHDd×≙Êp÷X¨ºcàásë8ÿË·½°œ\o‰ „ÚøÇøÕ:‘H è=(rü_^¾íý VÛ‰ì(Ö”u1óA€£<] endstream endobj 287 0 obj <>stream H‰ì×ÑKÕgÇñ¿a „BxÕ‚ØE7^8JÁA†D#ð¦ˆ-˜'§(BSg”¡åšÒ8­i‹uHš&‘„â(bGÒñîH=²ÏÖÖs?‰þC b½ˆvdwÃ^¯l\lº›•_ÈwåRó=~µ5‰Å\x2ñâDe·=y58(b©Gö‘€¼AÒL4y»Ý}¶Cçaú-ÈÊ ""^Ã7ÙWÖ籤"5»É\x?k. AÙ¥}PÄ.ä’‰$#ùhæ^[û ‡žÃÕt[Û¨ˆˆgÅ7½#9EMÉ-i~!jìj“¹žô½Ý|OTv=™xaàFù7ÚE¼€4$“[)iàFóû ­¦æíæKÏ¡íÐyŒ]-"²¿,Ebç.ù`f4øÛî¯ol¸ÔL.L…_•U÷pQ^ikß§®Þ%"Bû ˆwŒä#O’¬|>½èê]&÷Aš }†VÃ4zŽKEDö»gS/“«ÓÑ“WoN¸}Û¹‰®Õù³òë“Kîj,îÒE"ò¿hñò1¹:‘˜ä&ééÒEÆöA: M&¹äÒmܾND$Ãì~EOTv¹úu/Û;ï~Í)jâüªó·ÂsËŽ_!")Ó>(âAd%‰ÉÛ$=;o<&I¿ÂÀ>Ho¡½p M†>ãÞE""™m}c«%ð0» /ê¹ËÁÅ¥7nq)†B3…åœ|ìÔµÐ謳‡‹Hú´Šx¹IzòBIRòÔÙÃ]Ýé*4Χ½Ðah2nÜ""r Ì/Dk. ði=\Øøõ·â› gÏw<ÂsË•Ÿ}Ï™¹ÅÍÝýc‰í§Niñ2Ò“ %Iy§gÎÞ$[:Ù¥}~BK¡«p8½…öâìù""Ü“‰%¾±¾²öàð¤ƒ';˜ ¯W6.5ß;ä»’•_±é.¿¦¦ˆ¸Dû ˆ÷‘¤ä)©J¶’°Ž«û Í„~±t‹ƒ'‹ˆÈû®Œç•¶ò½ýäÓSáWŽœéT.ìÎvº¶Ï©ÙDÄ=ÚEö R•låÁ9ÞBÚ¦yš³û ³ÑI8þl""òŸVcñ/Z:ä»’•__çŒD×Ò<0ý\ÿ£¤"À!¾²v§òEDܦ}Pd!aÉYž-™MçGöA=„6B'¡™ÐOÒ\xn¹êü-¾ç¹ÅÍÝýc‰í”J'æ¢5øï9EM½#ñÍDÊcˆˆaÚEör–´%sy¼ä/)œÂ!éº „sh#t’”‘tüü(\XÞÉטŸü;µCRË…õ­¯:d4ðÏ].Eb©Ý~pý%ÀÄê*’ endstream endobj 138 0 obj <>stream H‰ìÕ1 ÃA &f•60BÆvy igН¿YÝuQôþ|×ùÜ_?À_° Ф}hÒ>Ë.@“ö¡Iû,»MÚ‡&í°ì4iš´À² Ф}hÒ>Ë.@“ö¡Iû,»MÚ‡&í°ì4iš´À² Ф}hÒ>Ë.@“ö¡Iû,»MÚ‡&í°ì4iš´À² Ф}hÒ>Ë.@“ö¡Iû,»MÚ‡&í°ì4iš´À² Ф}hÒ>Ë.@“ö¡©Òþ-ÀpKÏ endstream endobj 139 0 obj <>stream H‰ìÕ¡ÁH„ Éê-ã\ù ŠšnqúÌÔž'WÏ×íþøÜ_?|•ö¡Iû,»MÚ‡&í°ì4iš´À² Ф}hÒ>Ë.@“ö¡Iû,»MÚ‡&í°ì4iš´À² Ф}hÒ>Ë.@“ö¡Iû,»MÚ‡&í°ì4iš´À² Ф}hÒ>Ë.@“ö¡Iû,»MÚ‡&í°ì4iš´À² Ф}hÒ>Ë.@“ö¡Iû,»MÚ‡&íÃÿ{ 0fÕO[ endstream endobj 88 0 obj <>stream H‰ì×ËKTaÆñ¿!Dp妕ˆàF¡\¸q‘‚A¤… ¸i¥”EʤÀ‰l¡Âl†Bì&ºp‚†`Åð~ïñR”·q~sÎù~ƒ;Ÿ÷}ÎËßÉIz½ýôíÚGúMóÿ‚g4Ï/{¢U^ór6±dçÏ>(ª~­ƒœB7©ûTTÝ­nØ:à{Ì}€‹¹\žv–Òª~í,~Ù=‘7_t· ¬{Öm[Ç|Œ¹p1€ËX^Ù¨oŽêå¶wõMììX':+탢»Õ çu(¶î\7oð%æ>ÀÅ\.foÿ°gpÒ[OjDæ×­ïöAîY·­äºyÝ¿Z°Nø sàb.ÿZPÞ«·SRÙ7_°Žs>Ý=ºó[÷^(¿ZPÖq?aî\Ìà\ÉuCz5×ow¿ŠÌXǹ8_ïƒÝ¿ZÐ)Ôˆz±Žøsàb.g´¶¾ÝØ˺ْ]ÐÖÔ=¶¹µgèR°ŠZxøx\¨µ£Ž¬™Ž¹p1€S Oåwê±T7Œ$çV­¥@0öAQ/:Ž:RSêË:¹˜ûsø¿÷“É¢;ÏõLô«¿­ã¤LöAÏÇÏßÙZÌ}€‹¹üKrnµºaD$¯¸s`xêðèØ:Q*ou¤¦Ô—ަîÔ u" ã0÷.æð·Í­½¦î±ì‚¶¬›-­±µõmëD©È}ÐóscW­©;5¨Õ¦u" ƒ0÷.æð‡W‘™ë·»õ.*ê†ÉÖq®J€÷Aº»{ÿµÎ¨6Õ©u S0÷.æðÛt|¡¤²O/¢ ¼7:þÕ:ÎÕ ü>èQjS'U³ê×:`¹p1™_\¯}Ñ[È-êèœÜÛ?´NtåB²ŠÚT§jVçUËêÚ:`‰¹p1r;»]}9…ízõÍÑå• ëDiž}Уf՝ެ®Õ¸z·NØ`î\Ì„Ùh,ž_öDO ´ª6±d'­Â¶zÔ²ºÖÁÕ»Ú·Ž`î\Ì„“ö‚òš—aÞ Â¹zÔ¸z×ñõ èK°Ž¤sàb. lVֶꛣúìs Û[Ÿ¾ÛÙ=°Nd#Ìû ¨wµ¯o@— ïA_…u" M˜ûséôK€1¼:$ endstream endobj 140 0 obj <>stream H‰ìÕ± ÂÁh„"éÊ)eÐŒ!¼,@Ú™àãOVwžpãùºÝŸûëG€¯Ò>4i€e IûФ}–]€&íC“öXvš´MÚ`ÙhÒ>4i€e IûФ}–]€&íC“öXvš´MÚ`ÙhÒ>4i€e IûФ}–]€&íC“öXvš´MÚ`ÙhÒ>4i€e IûФ}–]€&íC“öXvš´MÚ`ÙhÒ>4i€e IûФ}Ö¿íÂ[€®+KÏ endstream endobj 89 0 obj <>stream H‰ì×ß+ÝqÇñ¿a¥¤VJ-W[JJ+.vs.Ôh¥Ü(r£ÜXÚÍüˆŽÔÂ,qÁ¦ÅJ[R›ÐÚNia[“Èh$–mD;ì`¯«õmËpœÓû|¿{>Zš»wŸžyßÇÇ–öÂm=ãÉY—®Ý+­XYÛ2ÇXÃWzý´Ä’P zU¡6TˆõD@̽|=¯æõÓz@\`/à?¡ÈÓ}­ª=§°#0±d=Ž=îÁßÔƒªÐk¨þÂóØû'ö<²ž(~qžJý¨"µ¤‡RWªËz" Øû'ö¼agw¿¶e,)£>!­¦²vhskÏz¢xÇ=xFjIE©+Õ¥ÆTšõDÀ…°÷Nìx@ﳩ¹Í*ÙWÒ=3¿n=Ž;pž‹ºR]z1•¦Þ¬Ç"ÇÞ8±àjSÓ«yEj8Ý×:8:k=Ž›pF@©4½›ªS{Öã‘`ïœØ p©õoÁÒªÕ{9³¡©ãÍÐOë‰\†{02*M½©:½ž T‡ÖçÃÞ8±à:Îòò»Ïù ÷àE¨:µ§T‡ªQMZOœ{àÄ^€» ŽÎ^½y_ÑæuNM¯Zãb܃§Õ¡žQMªLëq€3aïœØ p‹s_|%ÝÊ55·ùéдõ8®Ç=-ªQMê1Õ§*µ8{à´ ½ŸYÓOëA€mníUÖé&)£¾¶elgwßz"/àŒ"5©2Õ§žT­ªX뉀±÷€[ì„ÛzÆ“³õ™]\Ñ¿²¶e=‘wpFúT¥zU«nU¯õD€[2óÛõuSؘX²Çk¸cD­ªX½­êUÃÖã.óéó÷‚²^}Q§dû»ú&­Çñ&îÁ˜R·ªW/¬’Õ³õ8€ lCÕþáÄô:ýÓô«õDžÅ=}¿J\Ph endstream endobj 141 0 obj <>stream H‰ìÖÍK”QÅñ¿!D„6îB1laÛYÕFh¸ha-„|™ÃMJ1ԢĨC0”½Q‚P9.²h ‡)Óµµ¸E´jîïñ¹ßÏ"hwxæžós{€÷Ÿ½Ûµ÷¬þµÀ+ºpq€0Ñ} Ltàâ.a¢û@˜è>ÀÅ]ÂD÷0Ñ}€‹»„‰îa¢ûw¡Š¥µ©é9ëÀ¿Ð}ìÚR-ªuŠX¡ûw¡ºRãúª=¹…¥ë,ÀßÑ}DœöS+ªWªEµÎ+tàâ.TƒþŒéèÎêÃîn>w>ó¼¼Q±Nü‰î#²´™ZNí§ž¨¶t~á‹u¢X¡ûw¡z¦¦ç´_ÖçM$‡sÞXÇ~C÷MZKm¦§öS+j'†è>ÀÅ]¨¶±Û¯Ú†ô‘“Ǯέã¿Ð}DR;©g©ÍÍæ­ãÄݸ¸ |]-÷]x\×4PÓØ{ªïN±´f ûˆ­¢¶Q Y›è×Zj3­Åݸ¸ Þf—ž¼¥¯]ß’Î\QÙܲN„ Ñ}D–P{¨UÔkÔBj'­Åݸ¸ žM¼ü°ïÐ%}óæƒN¼·ŽƒpÑ}˜Ój î¡¶Ñ:N(è>ÀÅ]𯲹uåæ«=­ƒúòí'nf—­!Dt†´{Z?½@-¡öP«h( tàâ.Xù¼²~:}¯¦±·6Ñfðþka¡û0¡­Óâi÷´~]©q¦Ï?ºpqlÍÓOÐÐ64šÍ[ÇA@è>üÓÊiëôð´{Z?ë8¢ûw! ôýÉaýûd&ó­ã t>iÙ´ozrÚº»OÞZÇ Ý¸¸ QÞ¨Œ\›¬oIëçèèÎ~š/Y'BÌÑ}ø¡5Ó¦é±iß´rÚ:ëD¡£ûw!R–Š«=9ý"uM©‘§ßÖ¿['ÂõC€‰ŸÃ endstream endobj 90 0 obj <>stream H‰ì×ÁKÓqÇñ¿!$/BPCAtÑA/B‚… „à!ÐYʵ`¤bT Ì1 ™jM44”ÙÔÜšÚç RaæÊöüæïýBDo~ßçϳ½ý£•ØFƒ(ÛÓ¬ý¡·üƽþñÜbÿ±Óå5}áÈ¢uœ#®åöK}jý¶rÄi’5ÏúÔšmM¸uÀqBcÓ%íÌç:‡CSÖq\{04Õšm}p͹¦Ý:à³óÑ‹uýÚ“sŠZ;{F㉤u"·àL3Ͷ&\s®Ï®™×ä['̬®Å}í#Ç ®i=®m|²]·Nä.܃&4çšv}yM¾æ_-°N¤[ÿàäÉ37µ{«ºß†?YÇq#îACšyM¾¾¿Z .XÇÒd|r®¬²K›ð©³·½³Žã^܃æ4ÿj^AP/¬ãÿÑÂçØ¥«Ú~O¶Ü¼úºñÍ:‘«q:Z .¨z µC±N²x"¹»ôV×ç¾X'÷ ƒ¨ê…žCQSÔëDÀáxþÞãíЮ[VÙ5>9g;¸FíPGô(ê‹Zcø'áÈ¢·ª[ûm^i[opÂ:~Â=èLjŠú¢§QwÔ ë8@Ê–£ëu¾Á¬ü¦lO³¯}du-n¿ât,õE­QwÔ õHm²NHrs+pÿuNQ«n µ"3KÖ‰°7îA‡SwÔ ½‘Ú¤N©YÖ‰€ý ‡¦ Ïßѫߡ±ië8Ø÷`FPv;¥~YÇö™Yª¼ü@[kn±ÿîÃ7ÉÍ-ëDøîÁL¡6©Sj–ÞK-S׬;Vb þ¡lOsV~Ó•ëÏô¯u"÷`fQ³Ô/µL]Sã(Ìõ'òJÛtV”×ô…#‹ÖqîÁL¤–©kz8õNí³Ž—øXRÐ^êñv<}ñÁ:RÆ=˜¹Ô8õNϧª‰Öqà"³óÑêú vÑœ¢ÖΞÑx"iƒ{0£©wjŸ:¨GTÕJëD8ò¾ 0—B¶ endstream endobj 142 0 obj <>stream H‰ì×ËKUQÅñ¿!B'Ž A 2H¡‚‚$$‚“ H*3Ű—RX&f ,¸“‹ÐËÊ”¢ÐŠ,’è"*†áë^Ÿ­lcY¦W~翟ÁÊ‚½×Úǹ9ï¸ÿìÓ†-§ôk5:[ý41½T7­ 8Ü?8b?Ñ}€‹wÁƒÞu}Íɫ׹lξx·©Ó:‚‰îcMi»´`ºc»ÕiÓ¬ãàºpñ.xÖÂ×ÔÎÜ|M!îè>ÖˆöJ«¥Û¥ÓŽYÇÁbtàâ]ð²‰èÔ¹šÖÄôRQAq¸pÄ:‚ƒî#î´QZ*Ý+­VùÕ-˜u"üݸx¼¯§o8ÿXHÇ””QV}óElrÚ:‚€î#Ž´KZ'm”.•öJ«eK¢ûï‚_ttönÛ_£ÃJË© 7´Žߣûˆ-’vI×Iõêmuüݸxü¥!ô:%«RG¶ïèí®È€uøÝÇêi…´EºHÚ%­“u, ݸx|gt,v¢òáÆ´3 ©§‹Jš¾D­Á—è>VCË£ýÑ i‹ŽW<Ð.Y'ÂrÑ}€‹wÁ§"ÝC¹…wtvÉ™µíÓ3³Ö‰à3t+£µÑæhyt´BÚ"ëDø?tàâ]ðµ'Ï#{®èõÛòò‹uø ÝÇ hg6çQÛgë8X ºpñ.øÝôÌlmc{rf…Î1·ðN¤{È:üîã¿h[´0º3›¶–ks´<Ö‰°Btàâ]†oÃãE%M ©§7¦9y¡yt,f^G÷±LÚ­Š¶E £ÑÚX'ªÐ}€‹w!Hº"{ÜÒ¦dU6„^[ǧÑ},‡–D{¢«²ûðM-ŒuÄݸx‚'Üü1-§JǺýÀµŽÎ^ë8ð(º¿ÓzhCtI´'Zë8ˆºpñ.RlrúRÝó¤Œ2nþ±POß°u"xÝÇR´Ú ]mÈùÚ6í‰u"Äݸx¬p¤ 8<ÿQw®¦u":eB÷ñ;­„¶B‹¡»¡õІX'BüÑ}€‹w!ðÞu}ÝqðºNysöÅн÷Öqàt‹h´ºZŒ7ú¬ã`­Ð}€‹wa¸ÛÔ9ÿ¥—“W¯ÿ­ãÀÝÇm‚–A÷A+¡­°ŽƒµE÷.Þ…õc":Urùqbz©N¼ 8ümxÜ:,Ñ}ˆv@k › eÐ>ŒŽÅVñÇ~0¥CÆ endstream endobj 91 0 obj <>stream H‰ì×ÏKÓqÇñ¿!D‚.ž a#(È „:D A䡃 x:ŒòGŠa Z¡­Hé Â.cÑ@IˆÂ,\á‘¢bÓ¶¹©½`à!"ȶ½·ï÷ù8|Ï/ø|_oÞïý}ànÉTæÎðtU}Ï‘ã·[}ÁÕõ„u"^ïƒi½£¾ÖApxê š¨wT+ÕM5Ô:œi*©mÔæyîêÓ…èŠuü/îAÇPÕJ½¦ªžZÇ€£hÛ<Ûü„mÓa¸FÝTCõ¦j«:keou=Ñê jìªïé{4“Le¬!o¸G UOÕV½¬š«þZ'@YJïd‡ÇÞT{{µX¶tâ˛։g܃N¥¶ª³z\õW-V—­ œËž¦!í“§.¼û·Žƒ‚àt65WýÕ«Ëj´u”hlíâçÚ!kÆóÖqP@܃n «ËzhõZí¶Ž€õ#‘jï UÔuVzºoö¿ÜÚN['Baqº„º¬F«×j·:®¦['@ Éîîù'æŽì×uÐÜ6[Ú°N„bàtõZíÖ‹«éê»ZoöfÞ~õ^x¨-QßW³_¬ã x¸]H?軺ofbKÍm“Ú žèóOÌew÷¬¡¨¸ÝIMWßÕz½¾&€æ€u"ÕÖvúÖýp¥§»¢®³½+ô}ó§u"àt3µ^Ý×ÐÐ4ÐL°N€bÌ×4 è8},[³Ž3܃ÐÐÐo ™ É`ô>òíôåQí~ž¦¡`xÑ:Œq"GÓ@3A?ƒæƒ¦„uäY|y³¥# }¯ÚÛ{Ï?›ÞÉZ'‚=îAÐLÐdÐ|Ð/¡Y¡‰ayLeέy­¾àêzÂ:J÷ ~£ù )¡¿BCsCÓÃ:/ðâSmã ¶»3Wø¼l¥…{¤Y¡‰¡CÓC3Ä:þÙBt¥éÚ³ÜF7ŠXÇA)âÄ_hnhzèÑ$Ñ<±Ž…õK€‘¼½. endstream endobj 143 0 obj <>stream H‰ì×ËK”QÆñ¿!B!ÜÅ€"h +Á… %ÜAâF Š6i’(.¼ ˆ.´$5’bpQ¨‹P•PDaÄ^ÂKZ£õ@¢Ôqô7ï¼ßÏ"l÷À9ß÷èÏŸð‚7ïæ®Üx¤­‡âï‚ß,­nß¾7 COɪkí=ü±^´ïsj__}t Êî¾Ô—Áz. í\¼ þ ç·ëèÓ Z†BóÖs`€öýLÕ«}]}ô5°žƒKEû=øxýfƒ.@QyÏìÂgë9¸T´ïO*]½ëèS³ëõ°ž´pñ.øÜ׃õo¯¦?N Tëý×z. íûÍïØUºz'v?£}€‹w²°¸q«â¹nBjv}gßxäèØz.íû‡ŠVת['^TÞ£Þ­Áí\¼ øc(4ŸYئûSÜ [ÏÁÅ¢}ŸPË*Zg­ºÕ¸õØ£}€‹w®ÈÑqÛ³)Yuº¥•ýáå-ëE¸(´ŸðÔ¯*Ö)«èÖîQÕm½qö.Þüms{¿ªf0)PœQ[Ó<²»wh½±Gû Lͪ\õ«ŠÕ²Š¶^„8BûïþåÓÜzAY—®GZncopÒzbŒö•jU³:\õ;5»f=q‡ö.Þü_px&½ E—$¯¤cbzÅzb†ö U§:Ö@~“ʵžƒ8EûïNôíàGCûûk™OtUîܵþeÇzb€ö‰ªT›:PuªZÕ¬õ"Ä/Ú¸xpJú…³âák~áL´ŸT¢zT•:MýI¨N­!ÞÑ>ÀÅ»€3™˜^É+éÐ ä7‡g¬ç z´ŸÔ JÔ9ªJµi=Þ@ûï¢ðbp:-·Q7§ ¬kjvÍz¢Aûž¦îTŸNP%ö'­çÀKhàâ]@tv÷kšG’3j“ÕU5ƒ›ÛûÖ‹p6´ïQjMÅ©;Õ§U¢õ"x í\¼ 8¥ÕíÒÊ~]¡”¬ºÖîÑÈѱõ"œí{ŽúRejM§îÂË[Ö‹àI´pñ.àüBcáœâv]¤Ì¶¡Ð¼õœ í{‹ÊR_:2µ¦â¬çÀÃhàâ]@¬tö§f×ë:•÷,,nXÏÁ hß+T“šÒa©/U9:¶^o£ýèü`?êJë endstream endobj 92 0 obj <>stream H‰ì׿KÔqÇñ¿!B„·8A„r t \œr„h©!ÈKÃA³à¨!C° —0 :p°‚rÐÁà¢L*Ò‹ÔºRë 5ýðÞ÷ýÞó1÷Ý^Ç'ŸÏ·o’”+¥gó{œ«oêÏŽL¯­—£©J]¸ü€sÂoôU)êAC( 焪ЖèE’$Iú­ò—Íѱ™†–.oݧn¿|]Š^¤ªæ{P;AIè G…¶P:½H’$I¿š*,l¿Ä­µ3W˜-FÏQøÔÎQÚ¡3Ô&zŽ$I’~Zxþ¶£gœ{ÚþCƒ7î<‰ž£Äð=¨?Eaè džæPžè9’$I5íÃÇÏgïÕeúö<Ï>£)I|ê/üÈÍ¡ßÑ3þüÅûèEJ߃úk4‡òp~¨-¢HÑ‹$I’jEa¶ØÚ™ã&Ö|ôÊTa1zŽ’Ê÷ þý¡Bœ"ŠD—¢çH’$¥\ñÕjWï-n_ -£c3›[ÛÑ‹”`¾õï¨-¢Hœ%êD£¢I’$¥ÐÚz9;2]ßÔ_—é;™\)mD/RâùÔÿB‘èu¢Q”Š^E/’$IJ‰üÓÆÃC\ÝÛ»¯?[XŽž£”ð=¨ÿ‹:Ñ(½¢ZÑs$I’ïñÜRÛ±«Ü¯2G†ó÷ç£ç(U|j7P*zÅÑ¢],zŽ$IR"½y÷ñøé»Ü©ö5_¸˜{øéó×èEJ߃Ú%ôŠjÑ.£fÑ‹$I’ë”*Ã÷ ví¢`œ1jFÓ([ô"I’¤j—¿?Ÿ92Ì ªíØÕÇsKÑs”f¾UtŒšqÒ(}‹ž#I’T¥ž-,·w_çÖÔxxh"ÿ4zŽÒÏ÷ *†¦Q6Ε£uÑs$I’ªÈJiãdv².ÓWßÔŸ™^[/G/RMð=¨J¢lôÊÑ:ŠG÷¢I’$ÛÜÚ›ihàZÞÕ{«øj5z‘jˆïAU•£u<ºGýh`ô"I’¤S…Åæ£W¸µvæ ³Åè9ª9¾…âÑ=Ž ¤„Ñs$IJµï ¶Î½$ endstream endobj 144 0 obj <>stream H‰ìÖÏKÓqÇñ¿!$/ž a(d‡.ƒ:(DàEêàA$ì;tQŸÖAà ‹«M‘¡ÂP›þôEÿZ'Â_±}ïÛTAi ƒB¶°}€‹»€¬K$g«êúÔ«âòHotÌ:öÆö=NÛÑ‚ôŽ´&mÊ:üƒí\ÜäÈp|2îT»*ª»â/?YÇÁnlß³´­FoG ÒŽ¬ãÀoØ>ÀÅ]@î¤×27{žiWÇjÏÝŸžIY'¶ïAÚˆ–¢÷¢Õh;Zu"øÛ¸¸ ȵùÔJ}sL5ÛøRëGKËiëDø…í{Šv¡uh#z)Ú‹Vc¾Åö.îòãmâK¸ö®Êvðøõ{ƒãÖqÀö=D‹Ð.ô:´-Å:|Ží\ÜäSôÁ»­ß½ÇNßyý~Æ:N ±}/Ð ´½íBë°Žƒ@`ûwyö}õÇ•®§Ê.«xõͱ¯ß­Û·¥æ«ÿzÚ‚¡]X'BP°}€‹»Ó3©³ç£[?†¯vÇÓkëDÃö­¨í꼚¯ç¯h Ö‰,làâ.ÀЫñÏGOÝVCáÎØÈ„uœ`aû&Ôsµ]O^ÍWÿ­ã ˆØ>ÀÅ]€¹ÞèXIe‡zxâLO"9k'(Ø~ž©Ûj¸ž¹Ú®Î[ÇAp±}€‹»/XZN_¸6Rj+(milœO­X'ò?¶Ÿ7ê³Z­n«áê¹ÚnÆö.î¼#95WÓ0 BiïîͬoX'ò3¶Ÿê°š¬>ëQ«Ûj¸u"€íþÀ]€×<~þ±ìä-ÕRŸÃñIë8¾ÅösMíÝn²Zmøí\ÜxPf}£»´¸<¢rÖ4 $§æ¬ùÛÏ5V½ÕãU‡ÕdõÙ:°ƒí\ÜxÖÂâjcë`AiKa¨­)2´´œ¶Nä+l?ÔRuUUoÕ^uØ:°Û¸¸ ð¸Dr¶ª®O--©ìèŽYÇñ¶Ÿuê§Zª§ªÆª·Öq€½±}€‹»€ÿBld"îTW+ª»^¼™¶Žãl?‹ÔI5SÏS-UW­ãÿÂöìöS€VxN@ endstream endobj 308 0 obj <>stream H‰ì×ÏKÓqÇñ¿!D/B`"ˆ  ¼Œè !‚A‰@ðD6e¢b ƒfx¨ ¶‹¨<Ø:8ÈAJ‚¨LCVsêT°×)èšSßßÏcèíuùðÜûäÅ ¿útíf—¾­‡N´“Ýë ůßz^RÝšÝͬ€Ó½ÿRÙ8 _¹`4½²e=p.îAàTêˆj¢—¢²¨/ÖsÀ?%SëMm#ªvuàåäÌ’õÀé¸3RST½UF­±žþ²‘ùõàñ¸J]VîÌ­.À=œÊ¢¾¨2z5*Žºc½œìý ô£g“™íœõ"À5¸ÿ¥Ê¨5z8êŽê£Y/À¿&¦¾V5ªËMm#ÉÔºõÀe¸óQqÔ=5H%²ž€ï,¦7Á¨Z|ãö‹X>stream H‰ì×ÏKÓqÇñ¿!$/ž a"(d‡.ƒ:(DàEêàA$Ÿ 8M25[]ßèØ•âŠpd`,·¶n½~Ô~牡¾ÖCàGêžê§êª‡ª¢õ"€ÿn~a¥9<\h+(mÕýµ^ÿâ=s[ITUE’¼­/:^\Ö ¼º¾?‘œ±ž¿ã=‡PUEFR´žgñWŸ*kºuÛ »FâSÖs€M¼á(j£ ©3©Zª™Ösò`:©»øP7œ¢òŽÛ½Ï³«9ëEÀ/¼á4*¤:©Zêdªœê§õ"€}Z\ʆn=>|üª.6 -±¹Ì²õ"`Þƒp&ÕRÍÔáT?UQµÔzÀÞ<š8zê¦î3Áºžw‰/Ös€?à='S9ÕOQµTEµž°+o>¤Ož»¿u‡‰>zo=ØïA8Ÿ*ª–ê ª«ª«õ€}ý¶ÐÐÓ½åHYûµîgßW~X/þ†÷ \A-UQÕUW5V¥µ^°Mv5w=ߺ®\¸Ng¬ÿÆ{.¢®ª®:±*­z«êZ/Ø »tK9qöÞë‰ÏÖs€Ýâ=×QcUZ[UWíµž|-‘œ9}¾W7“’ªÎ¾è¸õ`oxÂ¥Ô[UW§WV‡­çß™Ë,7…† J[ m—oŒ..e­{Æ{î¥êª½*°:¬«ÉÖ‹€/äÖÖ#cEåºH×6&S³Ö‹€}â=·SÕac5YeVŸ­/‰O•¹«»‡¾O_|´žïAxƒjü»Ìª´õàAÉÔlmã îÅáÈÀXnmÝzpP¼áj²Ê¬>ëH«Õ*¶õ"à‹KÙæðpa ­ ´µ)44¿°b½ÈÞƒðõY•V«Ulu[õ¶^Ü­/:^RÕ©;su}"9c=È'Þƒð$µZÅÖÙV½Õpë9À•^¾®¬éÖ"ìŠNZÏÁN~ 0KMµþ endstream endobj 145 0 obj <>stream H‰ì×ËK”QÇñ¿!B„6® aD¨…B¸hQA‚ÀE #Bh!äC”B¬H)ºÀ@ I÷¡ÒEBY4‰Æ(†5•3:j?äPâÝyæ}ßïg1àî™s¾g\^F=|ñqÏþóú´XGr>ÕÙ3˜SÔ¬b«jÂ㓳Öy»¿#Ô¡jÔIªLõ©J­'ÖÁî\¼ ð–Øt¼º6¢h³ [.?ŸK,XOäUìþ6©=¨uŒjReZOl»pñ.À‹ÞŽ~=TyUéæ—µßí±Ç“ØýíPujO¨U£õ8À&°ûï¼kå7ùáã×øM¾YìþÖ¨4õ¦£S{*Ðz`ÓØ}€‹wž6—Xhê|–]بŒ«k#±é¸õDžÁîo–êRc:4õ¦êÔžõDÀV°ûï|`|r¶ª&¬’s‹[:{“ó)ë‰<€Ýß8¥®T—NL¥©7뉀­c÷.ÞøÆàð—ƒÇºÔs¨¼ãþÓÖãd:vƒÔ’ŠÒY©.5f=°]ì>ÀÅ»Ÿé ç•´©ê£'oŒF§¬ÇÉ\ìþºÔ*Ò)©(ue=°3Ø}€‹wþó=ž8×Ú¿7ÔUPw¶éþ´ž(±ûkP3*Gý¨"µDBðvàâ]€_EÇf*NÝRÞû´^¹ý&µ¸d=Qfa÷W¥NT‹šÑá¨Ud=°ÃØ}€‹wþöhàSÑ‘KŠ\Ÿ¯?[“AØýÿ©•ZTŽõ8À®`÷.Þø^jq©ëæ«Üâ¥^yúNtlÆz¢ŒÀî»T…ÚШÕ¢f¬'v »pñ. ¾Íþ>Sß—UP·7ÔPñÉÏ_I뉌±û©õ *Ô† Q'Ö»‹Ý¸x(£Ñ©ò×Õ|^I[oxØzK쾨• sPjÃz Ø}€‹wyü>TÞ¡òK+º‡F&¬Ç±ðÝ×½ëöu*A=X¤OÀwðÞSr>u¡ëeNQ³ú¯ª OÆ~XO”nÝ}ݵn\ß]·¯T‚õD@Zv÷«â]@ŦãÕµ‘• æ Ö¥Ow_÷«[Ö]ë‹ëÞuûÖ¸û€5ð.C#¥ÝZ„ü²ö{ýï¬ÇI“ í¾nV÷«¯¬»Ö[˜ ÚîÖæ÷wá.ÔJ° endstream endobj 309 0 obj <>stream H‰ì×ÏKÓqÇñ¿!B„ <ÂÄÈ@¡.;)àE1‚.F„fŠ"”š1¬ðW?aC¨H‘”¤L‰$Ò@ Å0sêÔ^*)ü5{oß=‡Án¯Ë‡ç÷½¾g[ ®T{ºR+ö¾Rxùéäô¼õ"þ“ß#˜_ì%‚€•Š›]z†úµÄ(PÔ3TUFõÑz{Ë×1ärש}™9ýƒãÖs€˜Æ=DÕPMÔcTUIë9ì `ÊפÞ%eÔ´=yo=÷ ATFõQOR­ü8¥¼¬¶óÛÂ’õ"?qE}T%ÕJSÝT=­°+¡Õ5Ͻ·‰i•úæÌ=ÿ(0:c½À/܃@R+UL½MÕ³¡õJj½€xÙó)õdƒŠväô­ž¾ë96â"–º©zê…ª¤ê©õ¶!0:“sî*vàhÕí‡ïB«kÖ‹ü÷ ÉTO5T%Õ;=Sx_mµ^À&¾Î/U½Øïº—\z±ò™þZ/ðO܃@äSIÕSUUmUa + bµx’2jôy™UÐæLYϰ îA Z¨ªj«ìÁcÕª­õþÐ;ð9=Û£N¹ÜuÏ_ [ϰ%܃@tQaÕY=[5·§oÄzëcsùÅ^µ)1­²¾¹wi9d½ÀVqQGUmÕ\=^õW¶^ˆQ‹Á•kõ]ñ)åJRQ‰ozvÁz€íᢔš«òêýªÂeµ*²õ"@lyÜ>xèÄu•È×ôÁÿÅz€à¢šú« ë«Èê²õ@LP}ŽçÞ¡>€p «ÈzË™9j´õ€cMNÏ•øTœø”òjO÷bpÅz€]áœAEV—Ug½h•Z½¶^p”¥åP}soBj…B“_웘³^ ¸'QÕh=jõúÆÝ×j·õ"€ø:†\î:õ%=ÛÓ?8n=@ØpΣR«×zÚj· n=Åü©¬‚65%)£¦Å;`=@˜qN¥j«Ýzà§Î¶ªæÖs6ø!À ¶M endstream endobj 94 0 obj <>stream H‰ì×ËKTqÆñ¿!D„6® aDÈ…BÌ¢En$\´0‚ Z äCœŠÁŠ”¢ Ä`d ‚¥DB4‰Æ(†5•sÓé@Š.^j|Ïx¾ŸÅ³{¿ßûüÞl;ÕqqdßsúZþ¿Èð´ÇÛ«^]1gä¹…•FX¯ˆâÊŽ`ÿX2•±Näû ö6MoÍpMrsMuÍvëDÀÑVéÎËOŠ*Úôxh DbKqëD@± 4É5ÏuÔ5Û5á5ç­'º;8UV×£7ᆫ/gÞ[ÇrŽ}î¡©®Ù®¯9¯io8ˆÞ ‡]ã·a„ÛhÂkÎëØkækò[ÇÆbKñ¦@Doƒ¢Š¶öàÈj"mØ=ìƒp!ÍyM{Í|~͵€u"` ™ÊûÇJª:õ$hô‡çV¬»}®¥™¯É¯ó¯P¨¬€Ýsÿñk·W/êúÐØä;ë8€ öA¸œæ¿Z@·@ ^°Žrn&ºxôÄ µiM÷@xÒ:`‰}uAwAí Ž°Žrâc{[yä’ú]߇£o¬ãÂ>üJM±Ñjë8`‡¢³Ë §î¨ÓKª:C7Ç3këÖ‰ga~K}¡ÖPw肨GÔ&Ö‰À6|þ’l¹ð¨ÐÓZPÞ|ºeðÃÊWëD€±¡îPƒ¨GÔ&ê5‹u"°¹ðdiM·^¹Þã×g¢‹Öqçb6¥Q›è¦¨YÔ/ÖqÀMLÍ×úúÔÚoodxÚ:àtìƒÀ©SÔ,º/juuð“…Ø§FXM]\Ùq>ô4™ÊX'òû °ujõ‹ZF·F£Þ±N²«‰ôFA7"±¥¸u" o°Û¥–Q×èâ¨wÔ>ê ëD¸×½¡Weu=êåZ_ßÄÔ¼u ϰ:ß7v8¸¶ endstream endobj 146 0 obj <>stream H‰ì×ÍKTaÅñ¿!B„6BP2 †.4h3„m‚„ÒFpD›$1Š01¤ %5…Í¢P5 aB4DRJ†¤Ø‹L¤Ö”½œE…Õ¼Ü;¿û<~?DØ&Î=?~ÿä'™ÊlßsnÓÎŽxËÀã©ë8¡»sï™>V[ ®©›êcu_]Ù:`lãlÞà—å•\¢g¬"Ö©Q´uÜ^Ê®Z' ÑFؾ.¨;ê3uS]V÷µNØÛÛäwøÃÜ|öp{R»¨¬íêÏ}^³N ¿·¯«évº ¾Q×ÔM­Qá÷ö…â]Ö•ž˜­?ЯuÄöõޤ§­ãÏãíë^ºš¾NÔ­ãÑâñöEà]þáJrr[]·6ÒÜ:45óÚ:N¼Ü¾n¤Ké»t5ÝÎ:E^nP4ÞàßÞøt¼ûî–êSú£ôOëDÁðlû¾ž œgÛ”ˆwÈÇóo›[‡4–muÝ—¯=´ŽŸ¶¯‹è.úÝH—²ŽDšOÛ”ŽwÈßHzº¦©O“©?Пž˜µŽS?¶¯+èúÝE×±Ž8Àí‚»$÷y­wp¼²¶KÃ9Ôv}n>k¨H®o_Í«}‚n¡‹è.Ö‰7¸¾}@°x€",eWÛ)m§"Ö™è[^ÉY'*˜»ÛWÛê\Í+¿® [X'\âîöaà]Šöxj!Þ2 U5œM¦2Öq ãèöÕ³ÚVr5¯þ­ãîqtû€ð.%}ºcïyí¨ñà¥ÉÌ+ë8ùrnûêV +³ÚVçÖqW9·}@¨x€Ò}üôåLÿý­5§µ¦£'n-¾ù`èÿÚ¾úT«J«†Õ³Ú¶N8Ì¡íÊ€wŠ~m9rì†+¿¶8±}u¨&Õ§¢ª[5lpžÛ” ï¬É̫ƃ—4«êø…áѧÖqþ*úÛW{êP!Õ§ZµŽx"ú۔›ªÎj\ñ–'Ï­ã¬#ÊÛWcêMñÔ¡š´Žx%ÊÛ”ï’å•\¢g¬"Ö¹y×ÉöDj)»jè7ÑܾZRWjL½©=uhðM4·°Â»„jæå»Cm×µ²ÊÚ®¾«Ö¾~³NôSÔ¶¯fÔZR*5¦Þ¬~ŠÚö¶x€2HOÌîÞQ[«iêIOõßþ`O6G endstream endobj 310 0 obj <>stream H‰ì×ËK”qÅñ¿!D!Z H¡Q-Ú¸0JŠÀM !nŒ@)/(#ÒÅ2¦$Ê"4˜–Úu0Bs‘A)’‘â0¢£3:ŽZX™ÖŒÏkï÷³tw6ïsÎoeàl3³Ñ²ê䬪tOMEc÷\$f@òÕÝ|±cßeýZ|ên5¸z\m®N…ç­¶ør¢¥m 3׫•XTÚ›¶N Uxÿ=õ¸Ú\_ºš]ý®–·Np®—o?ç4«5ôû¼/h@jñ\BN¿Ö›.*mWSdæz[ÚâË ëDRŽ÷ àjvõ»Z^_½_½oàs‘Ø¥+½éžš´¬ª²êÎPxÞ:€-Â{pµ¼º^¯Þ¯hìÖ°N°ÔêÜs¸QƒðØÙÃÁIë8¶ïAÀÔøê}}þÚZÖqÞ }9t궺À“ßÔÑûÑ:¼7Sûkèäú´ ¬ã¶ÈøD¸¸Ü¯û¿3§îÚݾØbÜ:¼—ÓÐÐÐ)Ð6ÐB°NH¡…èRƒïõêÙ/©ìø65k€%ÞƒD{@«@× #»V;AkÁ: ùü]ö½ªkäô÷Ã_­ã°Ç{ÀÚZº Z ;‡¬ã’F>ÿÌ=.<€5xXC;AkA—AËAûÁ:àŸ„Âó%•ºêÙµÕן-D—¬pÞƒ~¦µ Í å û 1ŠX'lZl1~ãþ›]ûëuÌ‹ËýãaëD‡÷ €ßÑrÐ~ЉЖТЮ°NبžÀˆ'¿I7<¯Ð赎À¡xXŸV„¶„…vÅ“WŸ¬ãþ`88yâÜCÝíÝZýƒÖq8ïA¡E¡]¡s¡¡¥að 3³Ñ‹Þ§iYUéžý¡­p:Þƒ6hufhchi\¨ïbf€sÄ—-m™¹^íº“çǦ­ØxØm - Ý ­m-ëDàvþѼBŸ.sNAsO`Ä:€í„÷ €¿ ½¡Õ¡ëqàø-íë8€³|`±½p endstream endobj 95 0 obj <>stream H‰ì×ÏKÓqÇñ¿!B/B`24ð2¢ƒ^ „Òeà%ˆ.¶†²0ÄL)ä ÛET‚R6G9Ê‘!S´’…ÛrfÙ«SÝ÷ãýÝwÏcèíuùðÜûäNO¤;z&Olê[xo=€š³–ÜñõM©Åç.ÞDÖs€ª4tÿ…‘¾­‡UIõQƒôˆÔ#UÉz5a?“÷>Wë<ÁÀØr6W°^T+îA HjJ¤é)©M*”õ"\«pt<>½RïVv¯ D¶¶3Ö‹€êÆ=”„z¤*é5©Pê”je½·YŒmx.«¶mÝáØê¦õÀ ¸R›T(½)ÕJͲž€K$S{]ý3*lCkèa$n=pîA äÔ)ÕJ/KåR¿¬çPžÞ-œi¾­þп֋WáÊxP¼OÞ4´†ôcµ«æã§¯ÖsâÊGåR¿ôÄÔ2ÍzU#¶ºÙÖVC[.O,Æ6¬ç®Å=”›*¦–é¡©kª›õmk;ÓëŸU7ë½ÃãÓ+…£cëE€›q –©hêšž›§ÒY/Àq²¹B`l¹ÎT.ÑýLÞzà~܃@Ũkª›^œJ§Þ©zÖ‹pŠH4ÑØ>¢Júú¦Ö’;Ös€ZÁ=T˜§ÒéÝ©zjŸõŒÅ鎞I•±©st~iÝzP[¸ꪧקªƒÖs0°ûåàÚÍ9ÕðlËÐðˇ?­5‡{°¢ê©}* Þ j¨&Z/ BþàÕëO‰ `…{°¥ªƒz†j¢Ê¨>Z/ ¼æ—Ö›}÷Ô¾ŽžÉx"m=¨i܃€¨†j¢£ú¨JZÏ ,’©=_ß”zר>2óì­õ܃€ƒ¨Œê£ž¤ZùîîõJf?“DO_¸Uç Æ–³¹‚õ"qŽ¢>ª’j¥Š©nªžÖ‹(Êñ¯ßáǯë½ÃúÍÙëŸM}þf½À?܃€©•*¦Þ¦ê9ñè•Jj½¨lþ0ÏŒ¶ endstream endobj 147 0 obj <>stream H‰ì×ÍKTaÇñ¿!D!\ …¶hãB) 7H„ ¸1…|!¨ C’(Ð`6"Tö%¶Ð\ä¢!P$#E™ðutÔ~+¹‹ˆ™;÷>Ïý~¢‹9çw8æàÀ½×¿Ÿ8{G?s¨á™·?ÂÕ}Êsþò£‰©9Ûq€£,P»°Ž»˜‘ÞÛž..hã®Þ|‘˜_±›' »¯wÐk(‰^Fï£W²›8ò²û€€à.&ýYÛ¾Õýª ´½0Ôy;òFÚJb}÷5»^@ï ×ЛX| àX±¾û€@á.æÅKWn<×ê¾Ð3›±’ÁîîkjÍ®z½†• ÀñÄÝ8q[´w¡ª^-`EmÿÄÔœùîVv_“j^µÖìüçÌã €E©ôÃgŸOëÖÖ·Ä“ÆZ›ß}M§ÕTójjÍn¬5€CÜ}€w°nyu£±mT›XTÖÕñàýÖö®¦&w_i.M§ŽšTóh àŸ¸û'î_㿪®?Õ>ž¹tï娬ßíŒí¾fÑDê¥é4£ßíüwàÄ]åðÛÓÅk}ýöd`÷•_Sû† Ü}€wš­íÝžþOEe]ÚÍÆ¶ÑßËk~tñu÷•YÉU_ShMäG.p÷NÜ ˜“õ-1­çÉðÝûO&S;ioëû´ûÊ©´Ê¬âʯ)¼­ GÜ}€w²/³?+jûµ¤¡ªÞÑwß<¬ìÇî+¡rª¬2+¹‡•x…»pâ.Á7›)©ŒjUk†â‰%Ojz»ûJ¥l*¨œJëIM~à @^XßHµFÇ C¥íÍc«ÉÍ zµûJ¢À‰»ä‘ÄüJ]Óˆv¶¸<20<ÞÛw]*÷ÝWwePÕQ*es] €1Ü}€wÈ;&áê>m®~êwwErÜ}O20»pâ.ù(½·?0<]\ÑþÖ5$æW²­àz÷ÕKõYuW%ɶ‹¸û'î¿V“›Íc¥í…¡ÎÖèøúF*óϺØ}ÕWõRGõU÷ì#°Œ»pâ.ù.žXªiÒ"—TFc3~*ÛÝWeÕ×GÔK݆2öW€û¥CŒ endstream endobj 311 0 obj <>stream H‰ì×ÏKÓqÇñ¿!B/B`2AH0¢ƒ^ AÒE Š.ºD1 3D!-¡‰b»ˆJÐ@Âì‡Ã”RRLÅJ[ø#gS{:tß÷¾ß=Œ±Ý^§7ÏÏÉ "Ë_ÖÔ ž:×SÜÒõäuìèØz‡i~øR7DßÖC8ŒªCí¡Ñ Q,­lY/€ ²»õwLf{š² ëýÁíȾõ"ŽÄ{@±^î÷tôC^Y›Îëë›û´i=€ƒñ?ÕˆšDÇD}20üÞz¸ÖLx­¼ºG÷¶Ðû`tbÞzÇã= QT&굊ŠÅz¸Êæ÷«7‡ucÏ5ßí~õûàõ"nÀ{@©OT)j–+7†T/Ö‹Àñþ?­×npZ$ïA §VQ±è¶¨^Ô0*ëEàT£óî뢖W÷̄׬çpÞƒ’DÝ¢zхɯhWÏXχ™]ØðúútEóÊÚÁ°õîÄ{@R©aT2º3ªµõp€íÈ~½?˜UИíiòwLîîE­p-Þƒ’M%£žQÕèÚ¨pÔ9Ö‹ MÅŽŽ;û§rŠ[t0kêW×#Ö‹¸ïA©¡ªQÛèà¨sT;ÑØõ"H/ã¡Å¢K]º“¥UÝ¡éeë92ïA©¤ÂQçèì¨yT>Ös -,­lUÖè6æ–´ö>{c=@á= õT;jõÏç/?¬ç€™_;·ZÇNÞÑG?ô×z€ÌÂ{€ ½Í-iU‰UÖ,,}³ž ñ`Hý£ ÒR= ÌXÏ€ M/—Vuëúy.vއ­çÈ\¼˜S ©ˆt‹TGj$ë9D«ëßõçºx9Å-ýSÑØõ"÷ €t "R©Žt‘.×ÔKÖ‹ Áv÷¢þŽÉlO“]]ËíȾõ"à= ¨ŽÔH:Jê%U“ÚÉz$F ίh×}óúúf6¬çÀ?¼¤•’zI§éìù{*(ë9—wsëåÕ=ºizŽŒ}´ž·¿ I„¶@ endstream endobj 96 0 obj <>stream H‰ì×ËK”q†á¿!D!\ H¡Am\)à&07F ”‡”‘¡ƒfHiRÌF„Ê,+QBs‘‹$Ò$#Eñ4££öl“J­±w¾oîk10»góãþÞÍM€‹=ïÿ”žÓ´ïð•£§o÷[ϰUí­>½PýZ°•º©zê…ª¤ê©õv!01›á‘*–œáméެoX/ð ܃@,S=ÕP•TïôÌù‡j«õ"¶1¿ºä}–è©NH­¼X÷D­ø-îA ö©¤ê©ªª¶ª°„³Úü#)Y>}^浦­çØ÷ પڪ{ðX½jk=€Ÿ Ž|ÉÌkV§<Ù O_´ž`G¸gQaÕY=[5·hÜz›“SÁÂ2¿ÚtàH]cë`x5b½ÀNqŽ£Îª¶j®¯ú« [/Ä©•ÐÚÕÆ¾¤´%©¸¢kfnÉz€ÝáJÍUyõ~U᪛/TdëE€øò¸{ôÐÉë*QöÙûïǾYÏð7¸GSUa½bY]¶žˆ ªÏ‰‚»ÔpîAÀÔbYoùxþ5ÚzÀµ¾Ï,Wt©8Ii5õÍoVBkÖ‹üîAÀTduYuÖ‹V©ÕkëEW ¯F[÷§×*4…eþÉ© õ"QÀ=¸‰ê¬FëQ«×7î ¨ÝÖ‹nÐÕûÁ“Ý ¾dæ5¿ýj=@Ôpî£R«×zÚj· n=à`céÜ¢v5%%Ë׿±ž ʸ·RµÕn=ðSç¨æÖs3¿*­êNH­LôT—ûz—ÂÖ‹D÷ àbj· ®Ž«æjú\pÙzÀ"ë-ÃÉ^}%”t&f­Ø+܃€ë©ãª¹^ºÊ®¾«òÖ‹±ëÕÛÏé9Mª†~_¬çØ[܃@œPÓé;à³%*Er†·¥c8²¾a½Àžãâ‡Ê®¾«òzõ*¾ºo½——¯õ&zªR+K«ºç‚ËÖ‹ü'܃@¼QåÕz_Ý/÷õèÀzàV?*_½r endstream endobj 312 0 obj <>stream H‰ì×ÏKÓqÇñ¿!B„.ž a"äA! uÈ‹ A䡃!!tòç0 IK†)E bh •J‚`*’P ²¡1ۦétj/(‚BLM{ïûÝóqøœ_§7ÏÏö67©¿3pìä ½ÖCà7OûÞf6é@·MÎZÏ€}‹,DË*ƒºci9õ7ý¯V×6¬ÀŸøHXj'”:JgJM¥²²^{[ßjúq¾J+s‘¯Ö‹`gü$8u”jJ—Je¥ï¡*Ëzì&øâÇÛ¬«UPÜ669k=vÀ#¨©TVºWª,µ–õØÁThþì¥]ªŒüÆÎÀ¸õø;þƒD}¥ÊÒÕò^| î²ž?}^úvµº'%«ê¸§¦úöË啘õ"ØþƒœE•¥ÖRq©»T_j0ëE’Z|s«½k4=×§ *)ïÍ,Z/€}à?À‰T\ê./5˜ÿшzÌz€dô|è}ι»ºEz‡^°žûÆ€s©¾~•˜ªÌz€$šY,)ïÖý9qª¡½k4¾¹e½‚ÿ GSƒ©ÄÔc:eÅW«Ð¬p¹å•Øõ†¾ãžš”¬ªkuϾD׬ÀÁñàê1U™ÚL…¦N#Ï‘ÎÀxF~£Úéüå‡S¡yë9ð¯øp µ™ M7Mµ¦f³žÀUF&ÂyE~]·¹·Úzþƒ\F¦ZÓeS¹ ´žÀñÂsK¥]•ô\_KÇpl=n½ ÿAî£ZS³©ÜtßTqj9ëEiumÃ×:˜š]«cRVŒ,D­À!ã?À­Tnê78µ\]Ë€ºÎz'yÒ3™YؤræÂý7SŸ¬çÀ‘à?ÀÝTqj9:uêÎzànHü$ºNçîtÉ=•žõ *²-« êV¤f×úZW×6¬ÀÑâ? I¨ëTwj<=õžªÏz€[·t §çút"J+á¹%ëEð?ðTÔx*=ݽ´œzµŸ Ðz{½ýÓo³.C^‘d"l=€•ï ®Ï½q endstream endobj 97 0 obj <>stream H‰ì×ËK”q†á¿!B„ \ ˆ‘‘.ÚÌ¢()„6‚Tˆ´±"„4Q¡´“¦Ò c,T"‡"L©,q@1 mÂÔQGí!ÂN&ßùœûZˆîžïwÿ–—'¨óv%eTîØ{ùÈ©úÞÀ˜õ[ªôÆsýûë§õ[J_|}÷õï¯P XÏèì>xâ¶¾.wµ¯µÇz¼X¦¯¿@G =Ë£*°žØ"C#ÁܯîBjéµ»/çæÃÖ‹Øà=Ä85€J@= S 6P!X/üG³¡… OûÊÙÏ/ôŽOY/`‰÷ Q¨ t âSJÔ ªëE€Èó6Øs誮}fvÍûÞÏÖsØã=ൠA7Aµð¸©Ûz btáÝ9µ\x«ð°Š:Aµ Ë rP?XÏlÊdp&¿Ð§«ŸRR\Õ6Z°^ Šðð+Õ‚šAå û ŠŸœ¶^X·¹ùðõ{¯ÓÊtÌs ¼C#AëE¢ïA¢rP?èD¨%Tê ëE€µjñ÷»ÜÕºáéYÇ€õQŠ÷ €¿SE¨%t(ÔO_ôYÏüCo`ìØ™ÝíÝ*ê¼]ÖsD5ÞƒÖBE¡®Ð¹Pc¨4¬ç~ãëTèbù³¸ä¢®+úEZ/íxX£•ÌPc¨4Η5“=‹Kw¾Ùµ¿\]w<ï~`pÂzgà=`]Ô* Ý U‡ÚCb½b¿c =ˣ˜zøf‹¿ßz'á=`Ôª]}Go©C¬ç@ŒøôåäÙGºÆ‰ie7ë_‡—¬pÞƒ6FÕ¡öP膨FƒÖ‹ †|›ž+®j‹O)‰K.:WÜ4œ±^À‘xØ ˆ:D5¢&Q™¨O¬Àö÷À÷.)£R çΩýØ7j=€ƒñ°yª5‰Ž‰ú¤¡ñ­õض:»‡3³kto]îj_kõŽÇ{@¤¨LÔ':)j‹õØVFǧN_hÔMH-­ð´Ï†¬Øxˆ õ‰*E­¢Ã’[àU½X/Çûù´æ]z%§õ»~¶T endstream endobj 313 0 obj <>stream H‰ì×ÏKÓqÇñ¿!$/ž a"(¤‡.£:(„à%êàA¤žŸµµøSuçù‘åúZ€ƒóöÃxV^ƒn?—».Ð=d=€™áÐdna‹nƒ”ìšf¿õ8h¼Ä-µŸ Pw jPMh=Àš[º|ýiBjE¢«²ÔÛ9¿±^xˆg*@u jPMXâiWZ/°ï¢+«¾Ö¾äL¯¨ ¸-46e½ÌðÕ šP—¡úP•¨V´^`¿{GÓÏÞÕy×·+8b=Œñ€u*ÃJ|ñæ«õ{,46UPܦ3ž”Qíkí‹®¬Z/{¼`ƒúP•¨VÔŨnT=Z/°æ"žÚžDWeBjE‰§}zfÑzÄ Þƒ°‰ZQŨnT=^½Õ­’´^`÷šýý)Ù5ª3š†C“Ös ¶ð€R7ªuCª$Õ“ÖsìØ»o9ù:Å.w] {ÈzÄ"Þƒ°5¤JR÷äÉs÷Ô–ÖslKxâçÅ+~ÜcéU7}ÁÈrÔzÄ(Þƒ°5•¤zRU©ÛR…9ž±^à¿~-ý¾ÑðjýÀ•&~ÌY/€˜Æ{¶CU©¶Ô…©ÎTmª9­Øìqççã§nëœæä7¾ [Ïà=Û§ÂTgêÚTsúŸ}²žà¯ÃßÝçﯟÍíÖsÀ1xÀN©6Õœº<ÕŸªPë9@\›žY,.¢óx4íš§¶g~!b½œ„÷ 삚Så©þÔZTP‘Z/âNd9Zßô:)£ZÇðü¥‡ãáëEà<¼`×ÔŸªPÝ¢*Ru©êÔz/º‚#i§ëuú²ò‚½£ÖsÀ©u ê.Õ×z8•ZTEª»Ôå®S£ZϹáÐdna‹N\r¦·Ùßo=œ­ãåݨúZgS—ªNu£ªTÕ«Ös€Chvn©ÔÛ™èªÔŸ~è_ëEàx¼`¯lÄjBj± ì-_k_r¦WÑ’[Ø›²ž‡ïÁøñG€ž7¼| endstream endobj 314 0 obj <>stream H‰ì×ËKTqÆñ¿!B!ÜÅ€"h «`.”@p#‰‚›.D“4(.R]hJi Å T¨‹Pƒ’PDaÄK˜¨Þsfì‰Z$t#œóž9óý,"wÏbÎï{| À ‹µýg.ÜÍ-n'’Ö‹€ô™ˆ–T†ôM–wŽDæ­ç€§¼x5§VÿZOQµª]õÀªcU³Ös€´´´«®Ôw”Sìè'’Ö‹Àk¸ EÔ®*Xu¬žY5mtyËz6vvmcÙMY¾Æ†ÀðflÏzx÷ ¤”:V5«¦UÙªoU¹Ö‹·{2ñ×ô¼Ÿýh=¼Œ{ ¦UÙê½Uåªu­ç.55½RVÕ¥/ÅwéAxtÆzx÷ 8F}«ÊÕ««âU÷ZÏ\dm}»îö3}ç ï·„^ïY/€ŒÀ=NRåªuU¼z{U¿j`ëE€±Ÿ?Š«7ŸòQ€“¸Ày*^u¯ž_5°JX=l½°É÷·ë[(«êšš^±ž‡{¬¨~ÕÀz„Õêbë9€£>Ì­ùkzôûÏ+m}~g=2÷ ØR «‡õ«UÈÖs€”ÛŒí5†³|ÙM¶±ÝCëE¹¸ÀœzXU¬6V!«“UËÖ‹€”ˆ'’}orŠ‚jêúÁèò–õ"Èt܃àjc²ÞdÕ²šYål½8M#‘ùÂòNýÂK*C‘‰¨õÀ7܃à*êdÕ²^f•³úÙzp 7.×=Ò¯:·¸¹{`2žHZ/üÀ=n£ZV3«œõ>«¢ÕÒÖ‹€ÿôyûàVó˳ù÷²|7‚Ïõ§õ"À ܃àNßCZ­–Öi¤‡CoÏ_lQfTÔöÏ.|²žøîAp3U´ZZµºZum=ø'‘‰hIeH¿Û|;nÆ=î7™WWë¹Vc«´­ç¿µ´»r}H¿Õœ¢`Gïøá—¸õ"ÀŸp@ZPW«®ÕØz´ÕÛªnëEÀ ûG¶±ì‚&ýD¯Ý ¯oîZ/ü÷ /ø*À¥™ÎK endstream endobj 315 0 obj <>stream H‰ì×=K›aÅñÏPDprq²!à¢P…ºd¨P¡.‚H‡€à⤴F+(¡¾QHµbµƒ Y‚Ð"ÚÁRPSP ¡ˆ¨¨R|IÔ¨=­_ÀZãežçÿBÆÏÍ}ŸsqáñÄ‘¿5rïþó8<¶N¸ìApuõg/gÔÛÕÞÕáÕä­!‹¥Ï·Æ J»Ôj'bk{Ö‰7‰=Ž¤Þ®ö®^M^}^­Þ:²ÏÇùXÉ£W:EúÕë8€›Çûüí'}×[Û«mœÐÉ)(í_HŸ['d{œMM^}^­^·½¾z¾u"Üi‡Ç-Áé\O{Nq[S`*ž8²NÈ ö ¸Á¯ý”º½¾z¾Ú¾:¿u"ÜE£á¥Âò ŠAUÃØjlÇ: ãØƒàjøŸ¾Óµ¯Î¯æowÈbt£¬:¤³áñõGfV¬ãn {ÜFm__—¿ú¿V€u[ßLÔ7‡uòK:{‡çOÒÖ‰·‡=.¤Î?ðö«ú¿žm-ëD0Lv‡æò¼:þÖÈöî¾u"Àmc€k©ÿkèÐ"Ð.Ð:°N„Û39-ªìÑׯ¨\^ݲްÁ—ÓxXûFoÖ6‚udœ¾¸¯n„/¸`þÒ.Ð:Ћ ¥ ½`±?ô·Fô•ó¼¾ÙdêÔ:À{pIëàÅÀ'-½ Z ÚÖ‰pé·/ÄÇ endstream endobj 316 0 obj <>stream H‰ì×ßGÝqÇñ¿aDbDLŒMd¤©Qc7ç"VFdDÉ&ºi2cý°”f*MŠÕÖ¶Šl[ª‹í­f™Ò:VKMm¥ôcvª½®ÆìWíTïï÷Ûó!éÜäås.Þž;;a n†j›û£˾™SØ1=»þÿxÀóã: úm=à*õ‚NƒÚA¡Ž°^„péÊÇûjô&gÔû&­ç„üªø£ÚABÁp¯±À|zn‹¾Çç*ïw [Ï8=øDlJ•΄šBea={°¼²q­üYD\qd|iQE·>Z/8=ø u„jBM¡²P_ÎÚÚnlŒIªÐ}¿”÷(0µ`½à\ô àŸÔ™Wë^¨2Ô*ëEø=ÿÀäÙ‹wõM%¤Õõø'¬çœŽì’úB•¡«¡âPwXÏÁOS Yùmúv¢Ëë¼ mm[/¸=Ø=UFýÃ×*ÝÕ‡ÄzvVׂ%Õ}QgÊ"⊠Jº—Ö­\ƒ않CÝ¡úPƒ¨DÔ#Ö‹Ž®–'obSªtÊ}ÙMïÆç¬ç\†üŸ±À¼DGD=¢*±žsä ̤f6èýã}5½£Ös®D¡Q蔨MT(ÖsŽ„¹Ï+9…zóã ·*ë_~Ýøf½àVô LÁͪDm¢ƒ¢NQ­X/ò,¥ß§Î»þ”§„‰ì µÉ•º)ª5‹ÊÅz‘×töŽžºpG/œšÙ042c=àô `©ST+º,*õ‹õx;öɗݤWM©jﱞðz°ïÔ,'ÏßÖ}QŨe¬ç¸ØâÒzAI—^2êLYIußêZÐzÀSèAÀAP¹¨_T1º2*uõ"— n†j›û£Ëõ€YùmÓ³KÖ‹DŽ*ærA»ºFu£Æ±^ä=þ‰„´:½[rF½`ÒzÀ³èAÀASѨktnÔ8*ë9Žöþ×ôܽULREcë õ€Çу€Ãq¯}H£££ÞQõXÏqœå•¢ŠîÈøRýè}´^†ï Ï+Ç endstream endobj 317 0 obj <>stream H‰ì×ßgÕqÇñ¿¡«DD—Q7uSt“tQ7ÝDtÑEÄHt³~Y$™˜.*º‘5iV5ºÈn5ýPdË*³Z­­b½ºŠ®Ïö>ö}<Çv÷úœ›·çÒPéþ£—k¶tç»z«ß—¹…S½Ãk·žÉ'äßêEíâúÀØÆí½¹ÈûÞšxó±zM¡Xa¯Þ~Nõäú¤€ÒAÕsŠ>}·ã@~޽}#£¯«çÐ,z€iŸÎ}WsƒRCi¢ê9ÞOÍêÈ/°aÛ…¾›Oþ®^@ãèAª¤€ÒA©¡\¢”Qú¨zÑ ùö}±çÊÃugóðãÝwgfç«ÐPz€Z©¡®ž¡£ôQ*)­T½hy oÚu)ïÝsøÆ³‰Õsh4=@;H¥r’ÒJ)¦ê9Ëbl|rçÁkyãæÝ—ï ?¯žz€62øàEZ)‡)Ý”zªžÓ2ÓŸæŽÌ»Öwž¿ØÿøÇ¯êEð— ­¤•RL馜§4TJªzQ œ8w/Ï9ròöÔô×ê-ð  %SO¹P)©ê--03;?6>Y½þ§h[i¨”Tõ Xµô @3éA€f҃ͤšI4“h&=ÐLz õþ0#SXi endstream endobj 288 0 obj <>stream H‰ì×ßK[wÆñ¿aL(BÁ¯¤Ca:êV¼°lÂæpAÊÁ£™fŠ"Xë™Vlí… a#ZºéVÅRjËЉ,¬"U¬Rü‘ÄDÝ‚óW“Ô“c“÷‹brNú¹9ßçùìîÖjùþ··ÞùV¯V 9+ »Ã«ç×Värv†ÂѤn¿÷`N÷ê5µÿ}lÒ_\Õ£_Ыާö#€“ÛÞéšÊ-iÓÉ\Û0ìŸ_MöRÈ…ßL~E§îª¬˜ž]Jöp°o4å¯RXO±Y¹œø)ïƒêjºW­CÝC $Ù_˜$Ültúr šÏ^»Úq}#’ø½Iå‚ÒçbíÍÒÀiÃ>de±YÏryM¯2:‘[RØÕ+Ô.Ô1Ô4Ô7Ô:R`¢Yÿ‹ËWuÈç•uÜö’Ý.¼)ØÌ“È—È>˜øv 8µ–WÖì¯s[‘«Ý= G½ì¨\˜õ¿øøË;ú*¯¬ã¶ç©ùóH+öA S)µ•ÝzÀ/_Tšïûöø}PmAAÍAרE¨K˜?/ÀDÓ³Kå5½:Õó+:G|3/8˜ /×ÂN_NAó™ÂkW;î¯oDÒ8/€4a2˜²[ ®Wš+ÓÁÍøWÇìƒê j úVÍAý!óÌ?á+ëöð{s!¶½Ó74•[Ò¦Oj†ýó«Í Àtìƒ@ÆSŽ+Íõ¤+Ù•ïJùÝ#öAu5}®¶ Î`Ѽ…ÂQgר­È¥ÓÞîð®6ŒÏã¹ðû£‹«zô^¯c“~k§`6öA K(Ó÷æû¾}P}@­@Ÿ¨!¨'¨-X;-ÀT ‹Áú&ŽýsZ»o=ŒlÅŒ\¸X{S¯¹%m}CS±í«Ç`:öA {(Ù•ïJùxâ+ýÕÔÔô§º‚ÕcÒdâñ³Òj·Îÿó—º>ü¢_oÞ.hntúÁM«G&ìƒ@¶QÊ+ë•øzö?ø¼_@oÔÔ ¬ `¯¾ùÙýû®›NdöA ;¹nŒѯ &`õ8 <™yþÞ'?* Î_êzÿ³>#¾n½ûr-lõhÒ„}È6Jye½_ϾÒ_@oJ«ÝjVH“…Å`}“GçÿÙâ–ëý“‘­Ø½sú³ìÓ^½æ–´õ MŶw¬€éØì¡dW¾+å㉯ôWPPПêjV 0Q(mwǾÝá]^Y3>7öA½þ2ñOqUÞ¿ûÑŸY;-³±YB™®d×ó®”WÖÇsßøV}@­@ŸØŠ\ê j ÖN 0ƒçîŸù:íËkz§g—ö~µ7bÛ;=ƒÎ]hÕ'µ ÃþùU‹æ`:öA ã)Ç•æzÒ•ìÊw¥üîÿs?NÝ@ AŸ«-Œøf,špòtÂWÖ sÂÌ…@p³ÑéË)h¶¹œ]£ë‘4Î MØ ¦ìV‚+Ç•æÊt%{ü«C÷Aƒz‚Ú‚¾UsPHã¼€“§ÃßîðêT7ÖºP8zèeGåÂ_sËÆ"™WÖqç§?ÌŸ@Z™¹þ'ÀÖ´[c endstream endobj 289 0 obj <>stream H‰ì×ñKÜuÇñ¿!†0„CA 4ÁBJ Œ@$c0ðkŒÁvE1Ì™q8Hë¨MÉ%”¨D;pkÇR–Ò‰ép¦ÝrNOo³|Ijmz÷ý~¾ß»sÏc(~¿ïÏ÷—ï÷õzïíÈœàÛEÕ]¯¼~Ñ×8p÷ÞÊ3ýî‡{ú“þî½[Û»þžÉü²V]sæBhu}Óýç–ØIöNT´ëc~ªexq9~ÀÅçBhb¦ÔwEÔ4ôG¢Kzý¡¹°µ½Û¸y¼¼ÍÚ.WV7Œ>/€Ì`Ž¥³µÁ)¯•ÚÊî]™Ê>hQ‹P—°¶ËT®dÖìüƒº¦ ¾Û¯¾ÙùÅðO)Þ•b.(hNŸI%häöAàhP"+—•Îz£•ÔÊ냯O}´¨Q¨Wèu 5 ÇÏ 0ïáÆö¹Ž±¼’KÇJ/ëýšú½iåB$ºTÓЯë‹Ot‡&fì>/€ÌcŽe±Yï²ÒYÊ-éîƒ{ÿÔ u 5Û¿M«f\•|òôêµ[…•ú¶¿wú«ù…µt'ØÈ…¡ÑhQu—îò5Ü™½Ÿî‰²û Ó”¿Ja½ÅJdårê7ÚÈ}‹:†š†îUëP÷PIwÀ¬ðt¬ª> /symßxxÎÞ{¹ðh3áï™Ì/kÕ½ÍþÑõøc{§ÈöA G)s•¼z•ÂÊb%rZ·ÛÞ-êjšðÆ»Ÿ©‡Øp(öûŸ'Ï^×׸ ¢½ïË“OžÚå$—ãûÑ;8•ØIÚ~ crŽrVi«ÌÕË«üU Ûâpµuýǘ_X³= ®G› Ïd~Yk^É¥fÿèzü±ÃÎs!<«ªhHymßxxÎáóðû [”°ÊY½¶Ê\%¯í9Îsߢ¢¢6¢N¢f¢~âp àP_‡~.ªîÒgÜ×8p÷ÞŠ‘™¦ráêµ[…•U×üõ·?Œ<÷°¹B©ªlÕ «œUÚ:œf*÷-j#ê$¨~¼qÛÈLÀÿE¢K5 ýúÞ–ú®„&f N6˜ 7¶ÏuŒ+½¬úA¿:Ÿ À%ìƒ@ös#XÍîƒ5õUWQc18°²ºñÁG7ô=^ÞÖ¸¹µ½kv¾ñ\˜P×ÔÌÂʎχ"¦Æ0‹}ÈrÊP%©ÞS¥ª²ÕÔX7öAQ?QKQWÑðS-Ãj/fçÀKèߟÖÓçG\ú´º” ãá¹²wz5¹ª>žŽ™À9öA k)7•žzC•¤ÊS³Ã]Ê}‹ºŠ‹æ«½¨Ã¨É¸q ¼ B3%o¢/jMC$ºäÞAîåBb'Ù;8UPÑ®ùï7-.ÇÀ6öA )+•˜z7•žÊP%©ñ#\Ý-ê-j/:¥øD·úŒ{À‘tgö¾¯q@_ѢꮡѨÛǹ ëñÇg/~£#òËZý=“6. -ìƒ@VQ>*%••z1•›JO—ò`´¨Ã¨Éè,µu·€#@ÿfÿh^É%/W'oraÉ}í­=XrŠ}ÈJFå£7«“gûàÞ—\5÷–\ÈuÉ'O{§ *ÚõÁ>stream H‰ì×ßKÕwÇñ¿a HÞƒ†p$Ð ‹ÁaëBo d]xQ²¼RK9aDºÆ!·¥™LÎbÒ¯­‚©‹d˶Ë$‡6C;ZçØÑöß8cÐÌã9ž÷÷ûõõ zÓy#ßÏëõyý:S‰•ä©ðí%-ï}püàÑþ™Ùçÿ—iøá§ßx_^sù¦)½£¥!TÔöüþÇ_&DDÜ`1o åšùÇüj•İÆ&žì­:Ï»‚í×ïç>€ÈvÖòÅ-ž>^­ƒˆl/ô­ÇÓGÒƒ¹`{|í¦ $"b¥»¼ 4Äi\QÛ3³ cÞ |…åmdÖ\0ÿ6D¶ÝErŒŽ£éxîh=ºÏ*†yï;ø6XA$a}Ó7fFD$g"w•U†9ýŠ?é¸yhçnè…¥åDÓÙùæ¼¢Æú¦Ág / ÈlºŠä ½F»Ñq4}Gë†qCï§°…XDäa±‘¬ãˆˆl¡é™…šÏ¿åÄÛµ§µ£k8±’´Nô†{z!:5_]wÙùŠÂG’«kÖ‰DüL÷A‘ Ëh4zÇŽ£é¬¹¨÷,"v‘ó¨ïc/Y'ɲ¥åDÓÙ;ŠOpÐÕÿþÙ ëDÿá¶^ˆÜyT²ÿ‘x½yhGÄ·tÙj´XªÑh7ë8o¸­÷¬#6ÁØK¬&¶“u"‘ìèœØ½ï ç[°æÂ½É?­ã¼… {!¹ºÖÙ;ZP"XÕáKÑ©yëD">¤û ÈÖ¡¹è/1ºŒF£×¬ýË…½ŸÂRb/ïýO³ ¬ãˆˆdäç_föVçLã>øÝЯÖqþ—k{a1?ròj^Qc~ ¹!4į։D|E÷A‘­@[ÑY4ýE‹¹°¼\Ûû)¬&¶!ÙQcO¬ãˆˆ¤möiìбα%-§Â·_Æ_Y'ZË{a2:WQÛCÂÂò¶îþqë8"þ¡û HÖÑS´OÍEYÇy;—÷¾ƒíÄ‚bG•MŲ²N$"²!‰•äéΈs|<Ú?3ûÜ:Ñ»y¢®Ü|¶“³¬2<<þØ:Žˆè>(’Et Å3E[ÑYÖqÖã‰Þw°£XS¤eYq=deY'YÏÀõûÎeoÕù±‰'Öq6Ê+½@ tt ïÚÓJZÚazfÁ:‘ˆ·é>(’ô‘sg¡¡è)÷ßY¼Òû)l*–™YYl-ë8""o1ûô³.NªÂò¶îþqë8éñV/Ì>:6@àÅ'NvÜzeHÄ«tÉDÑGtMd'mÞí}‹‹ÝÅG`ƒ…/Ž°Ç¬‰Èvt-ò°dÿ9Î"^#wYÇɈ§{áeüUë—?î(>ÁG8tl`öiÌ:‘ˆgè>(’.Z†®áÁ¡wh:È:Ñfxº÷SX_©%Æ*³Ž#"ÛHtj¾ºî2çOAi¨³w4¹ºf(S>è…é™…ƒGûù;KZ:º†+IëD" û ÈÆÑ,ô -ÃSCãÐ;Ö‰6Ͻï`ƒ±ÄØc|œªÃ—XhÖ‰DÄç–– ¡¡ü@s^Qã‘“WcqëDÙá›^¹;]V泂í×ï[Çq;ÝE6ˆN¡Yx^hºÆ:N¦|Óûö«ŒmÆBc§ùfž‰ˆÛt÷–·q~VÔöLFç¬ãd“ÏzÁÇ)‘ìÒ}PäèÚ„'…f¡_¬ãd‡ÏzßáË¿”ˆ¸ÄÈÝé²Ê0'L Ø~åæë8Ùç¿^XZN4„†òÍyEõMƒ‹±¸u"7Ò}Pdt BÐ&t Íb(kü×û)ì4ÖŸŽå6<þØ:Ž7ý-ÀëÆ*¹ endstream endobj 291 0 obj <>stream H‰ì×ÝKTyÇñ¿aA ¼éªE2ØXÍ‹‚d!ê¢ A]‚.¤|¨Áè2Ú]RºÐؘu·ms6«E{p‡· Ýi}mßp–!ªu­œùž™óyCAŸsøï÷ó{õJD’Æ£±CG‚Ÿ|z<¯ØßÜÖ_NX'J‰Ÿ~ùƒgä×:È&‹ŒMWVwòhù%MŽÄêšu"w9yñ6¿ÖADÜ…}ÁÖ`wð°GØ&Ö‰6Y¶î}mÎFsãiqt9ëD"’‘—Vü—ú¶62LªjCS³Ö‰R(»÷BOx¤¨¢…ä·ïî3ë8".¢û ÈÛØÉ­Á±Ž“Ù½÷47úI—;Ñ|›^gHD2Éõ®¡í»Î1C>ÿòÛÁáÖqR.ë÷Bbu-Ð1Wìç1+«;#cÓÖ‰D\A÷A‘×±Ø|ì ¶»Ã:QªdýÞO¢ÅÑåxXzíÎ:ŽˆdoÎ ì…™ØBM}WNA]®¯áØÙÞ¹ù¸u"cºŠ8Øì¶;‚MÁ¾°N”ZÙûI4:züYå74=ë8"âRS³Uµ!fÅ–ÂFÿ¥¾Å¥ëDé㩽0™Ü}°çÝVvº=øÀ:Žˆ%ÝEÀ.`#ð-°ØÖqÒÁS{ßA¯£ÝÑñxpú­Ï:‘ˆ¸H|9ÑÜÖŸWìgD:Ƭ¥›÷B¨÷©¯üO½cßåûCÏ­ãˆØÐ}P<ŽùÏà+`#°¬ã¤÷¾ƒŽGÓãÙ·¤ûÑ­‰ˆ½~þݹ”îmýõ·që86¼¹Øga6ÏÎv`GX'I7Ýų^¿° ¼v/ðæÞO¢ïÑúx4ÀPïSë8"bf82¹çð5¦Á¶²ÓíÁÖq,yy/LLÍVÕ†œJpªõÎâÒŠu"‘ôÑ}P<ˆ9Ï´gæsø™ÿlëD¼¼÷“è~4@ÞmNhGDÒêåìÒ×'~Ì)¨Ëõ5mêž›['2¦½ððqtçþ+¼„í»Îo>²Ž#’&ºŠ×Üè~œçØ3ó™üÖqÌhï;h€ô@Ú °¦¾‹~hHDR.±ºèÈ/ib VVwFƦ­¹‚ö‚ãz×ÓÊ\~aG$åtï`ª3Û9ðÌy¦½ucÚû¯£ Ò y!ôCZ"]Ñ:‘ˆ¤JøÞhQE ß;¿=áë8.¢½47¯?kKa#/¤ª64[°N$’BºŠ0É«ÏQg¶3á™óÖ‰ìiï¿f˜l‰}wŸYÇ‘M›®¬îäÏ+ö:«kÖ‰ÜE{á ãÑØ¯¾sLs[|9aH$%t”ìÆôf†3É9çLuf»u"·ÐÞ'ú!-Ñ90ôFÚ£u"Ùsóñúó·r} 9u5õ]3±ëDn¤½ðNá{£¥{[y3¾ò =áë8"›O÷AÉbÌíÂ/š9áLræ¹uwÑÞ_]‘ÆHo¤=;ÛK“´N$"®=ø`[Ùi&ÞîƒmÑIë8°NQ~IïgÏák:E’et”¬Ä¬fbs¶™ÞÌpë8n¤½ÿ¿8E´GÞMR§H$Ýz¾sÿ¾b_ù…PïSë8n§½°¾—³KG›ºs} 9uü…Z'ÙºJ–IŽkþh\¯C{ƒè4IÞÕŽ}—é–ÖqDdC¢:äËÝZtòL _NX'ÊÚ ›Þsø/*¿¤)Ð1X]³N$ò±t”lÂdf>s¤™ÕLlë8®¦½¿q4Iú$­’7FÃƬ‰ÈZ\Z9ÕzÇù`«jCS³Ö‰2†öÂÆõ„GŠ*Zx]¥{[Ã÷F­ãˆ|Ý%;0™Éfæ3SÚ:NÐÞ_´Jº%/žIÛ¤sZ'‘7Ýè~²}×9¾Óû¯<|µŽ“a´ÞKbu­¹­?¯ØÏK«¬îýó/ëD"H÷AÉtãÑs˜cÌLf23Ÿ­eíýCägòêèœÁ›¬ãˆÈ¿‡_”¸ê|›×»†Öý¿ÿ0‘5ª endstream endobj 292 0 obj <>stream H‰ì×ÝKÔiÆñ¿aa „@ZDAô ‚aé@Y:‚D„@‚¥ˆ 'Q¡Ì;Ð’­$)fvCeÙ"Ì–œ %&JÅ"›ðuò¥ý†°o´léÌïþ½\–¨ƒ…›gžßu_Ïû÷ò1?ÿúô‹¯Îó§õ ^²”YkŽ&Bá–‚ÒÖh÷ØÊjÖz"‘ÏÖöý/|ûüi=ˆÈg#uÉ^˜&Éd뉼D{?†©C‡/r€‘úþÉéëqDð?yþG¾Gò}Ò^Ø3ë€Ó+®êºl=ŽÈçÑ{P<ŠBNêªï™öþ>Ñ9ižôOޱé\œFj=‘Hàdßmõ Ü/,oç3¬?uëù|Æz"oÓ^اøèTøÈ%ΰº®o"5g=ŽÈ§Ò{P<‡Œ%i¹·¤.Ùk=ŽWiïçý“ÊIÒH饴Së‰D‚b$9SúM__em,9ž¶Ç´öo}c³3vï`Y'yâôíÅWËÖ‰ü?½ÅCÈÕÆ³w¸±$-yKêZOäaÚû9D¥‘rž%‘ËtTëqD|nzöeMà _\QEÇÕáGÖãø‡öB®PWx ª®ˆWè=(ž@–’¨ä*וŒ%i­'ò<íýœ£—ÒN9Uš*}Õzz»¼q¦ãî’ üÇ_ø§õD¾¢½[©¹êº>Ž4|äR|tÊz‘ÿ¤÷ ¸)Z¹ÌE%WIWëq|B{?þ,«¡p‹ÊªHn]¹ñ°¨¢ƒàªiœ}öÚzÒ^ȇëñÇÅU]l¤¾rzÁz‘Ð{PÜìÉÓEò“+J–’¨ÖãøŠö~þÐTé«/Ý•»µ½c=‘ˆ·%ÇÓ•µ1¾©²£½#Éëq|K{!OVV³ÑÒÖP¸¥9šXʬYO$òzŠ;‘–d&ÉI~’¢d©õD~£½Ÿo´Vº+‡L¥ÍZ#âIÏç3ÇNÞä;*,o︿µ½c=‘Ÿi/äUúÅ]fq'½ÅmHÈÞkHKn&ÉI~ZOäOÚûà2³ôu™Eö`e5í+(m …[š£‰¥ÌšõDþ§½à€äxº²6Æ9—íIÎX#òÞƒâ*d# É$-ÉLëqüL{ß1ôXÚ,–fK¿¥åZO$âvC‰TqU©ïŸœ^°'(´œ±µ½såÆÃ¢ŠN»¦apöÙkë‰$èô— ¿müÛHB’“¤¥õD>§½ï0:-Í–3§åÒu­Çq©‰Ô\u]_JøÈ¥øè”õ8Á¢½à¤·Ëg:î†Â-J.ðþi=‘—Þƒbn7ÉCRQ‘èí}ô[Z.'Oã¥÷Z#â"‹¯–ÏÞáë8XÖÖ»·¾±i=Qàh/8ozöeMà Ç^TÑquø‘õ8PzŠ-Òï˯;¹„ä!©h=N€hï[¡åÒui¼œ?í—l=‘ˆ±¿'NßÖGaE{ÁÊHr¦$r™Ã¯¬%ÇÓÖãHàè=(VH:µÛ„«ëú&RsÖãšö‚¡ì»­žû…åíüõ§n=ŸÏXO$¢÷ 8”;þÝ0Ü#ýÈ@뉂H{ß h¿t`~ú0­ØzG=yº©ïçþWu]?¶G´ì-eÖšÎÅù J[£Ýc+«Yë‰$ô'­ol’o¤·ŽÄ#÷¬' .í}÷  Ó‡ù9èÆ4dëqDòŽðoŽ&Bá•^WÑ^p‰ÉéֿšÇ)ëqÄÿôÇi$Ûné%ë¬Ç :í}W¡ÓŠéÆ4dz2mÙz"‘¼ØÚÞé½ö °¼ü9vòfúÅë‰ä/Ú ®2üÓï»­©º®ï·'óÖ㈟é=(àõGšqÓH6òÍzù@{ß…èÆ4d~Ú2™æl=‘H.$gÊŽörÃ+kcÉñ´õ8òoÚ n³¾±Ù»w°¬ß¥é\|ñÕò§ü_0iæ2P endstream endobj 293 0 obj <>stream H‰ì×ßKÕwÇñ¿a ˆÂðª! tä`1f,2ˆIÄoAÒü1åÈY5ã4'i1487G«\5Ei™ŒäF‡r’¡¢œ8þ8G¶çpH‰•?Îé}¾ßóz\ôî ŸÏ÷õ~}ž?Ù™Æïn½óÞWüZ"î45©¨ rÇöå76ûû—¢+ÖÉÿ~ùíoÎ…_ëAd³» KýœN~IÛ‡Öãˆ$@h|ö“/~âVgxÛ»‡ã«kÖÉ´RÓÄd¸¼:°^¥¾iˆ-Ç­'·Ñ{P’„¼:ß1HvqÁÈ1ÒÌz"y‰ö~*£-Ó™iΜ-š.m=‘È.=‹DOy¯ezê3rk¿lºÊ¿ÖÉ+i/¤²{£O»ÀyŠ[‚}¬ÇWÑ{P’¤"¯¸Zd f=ŽlA{?õ­iZ4]š?T¤Åqº#ï¾ßLÔ=yy,4m=޼öBêã›Ê)òqLÞ©oJEïAI,ÒéȉK\*òŠÔ²G^I{ß)ø¦èÒ½Zß”8ÅÀÝÇ…¥~î­§¸E9ãÚ Ž0¿;s¶/ÓSŸ‘[[U×;^´žHOïAI‰\"È(’м²žH^G{ßYn <¤Wsdtlš¶õ8"¯41.¯pW÷ljíŠ-Ç­'’íÒ^pÐølYeÏú‡ÖÞ=_]³žHLïAÙ;Rˆ,Ê.ðr—H'2Êz"y3í}Ç¡WÓ®Yý}›Öm=‘ÈK–¢+ußþš•×À­¨ ÎÌ-XO$;£½à8·ï<Ê/iãÔø½1ðÐzq*½en†6²ˆ\²G¶K{ß¡æÂ‹4mÎŽÖM÷¦[O$òŸ+½£Ÿãf¿xì©õ8²Ú N_]kïÎ.ðrve•=¡ñYë‰Äyô”]#sHî)D‘HÖÉhï;}›ÖÍ ÒÀéáÖãHZã6~ðéº. ½à\Ï"ѪºÞŒÜÚLOý)ïµù…˜õDâ$zÊ.3§}×É’‡ü!…¬'’ÓÞwÀÕ?iàœ#mœNn=ޤ©™HEM˜•×Ðìï_Š®XO${¢½àtc¡é£'/sˆ9E¾®Àˆõ8âzÊN‘0ä ׆Ì!y¬Ç‘]ÒÞw8=|_~#§I3§Ÿ[O$i!¶?ß1¸~ñÊ«“aë‰$´Ü!Ø÷ÀSÜÂQ–úÿcÂzq½eûî>![¸0ä ic=Žì‰ö¾›ÐÆéä(ýœ–NW·žHÜìŶÉ^°GF{Á5Ø­Cl”íÀްžHRšÞƒ²/¶MFmÓ´÷݇f~èØŽ•®Nc·G\h,4}äÄ%îXN‘¯+0b=Ž$˜ö‚ËLÍD*j‚œiV^CÓ÷·—¢+ÖIŠÒ{P^ôhö÷“$ÜR…l±žHC{ß­hétu—ÞN{·G\b.¼XU×›‘[›é©?í»>¿³žHO{Á•î=ý°ìGNöÀásWzG­Ç‘T¤÷ ¼¹AzpCHòÄzI$í}£«Ÿ9ÛGo§½ÓáiòÖ‰ƒÅW×Ú»‡³ ¼$FYeOh|Öz"IíÛht}Ö¡F'›è=(["+Š_ändˆõ8’xÚû®Go§½sÊ4yú<­Þz"qž›ƒ¡ü’6n¿üm=Ž$—ö‚»-EW¾n½••×À)WÔ§f"ÖIªÐ{P6™™[ %¸$¹AzXO$I¡½Ÿ&nßy¤>/»Ÿ-«ìáædxÛ»‡ã«kÖIÒi/¤ƒ‰Épyu€ƒÞ°©µs(¶·žHìé=(È’|àJ$†õD’DÚûéƒ&OŸ§Õsâ4|z¾õD’Òæb§}×3=õ¹µUu½sáEë‰ä-Ñ^HC#ÿ–ú9nOqËÏ7ÿ²GŒé=(ëÈ2Ë@>ÖãHÒiï§›g‘(Ýž†OϧíÓù­'’TÔÉ)òGN\ M[#o•öBºÙøÞž¼¬ï=9é=ø¯¡¤8o endstream endobj 294 0 obj <>stream H‰ì×ûKÕwÇñ¿a ˆÂ á  èX¿ÈRB ‚~(a1‚¼¤q´rÆÁ¶.³U‚g²&±“eJ$›RÒ…†šbóvŽmO8[W/çœ÷ùžïë<¿½8ŸÏûûþ¾^¼D M–V´~ðñ‰œÂÆKíýÖq$I~ýí!‡Î§uI*Í»¼MßÀXA™Ÿ»á)>è´Ž#´\èù\ø˜¯3ÓS“‘[õÕÉ_øjH Ô}w›ÙçÓ:ˆ`êÖßä Às€§®¢½ïf¼íóÎÏàýŸ`GŒ=ŸÝ¤û°Í[÷í¿G–£Ö‰Ä†ö‚k…F§Ë]áô³ó}ç®Þ‹®®Y'’¤Rt'&ygê9}ž<¬I²iï»ïüM{xÿçÐhÖ‰ÄÀRx¥Á'+¯–kpðx`bjÎ:‘XÒ^p¹®à°·¤™;Àg°wÄ:Ž$ú  1ã»öœÍ;³oGlhï xÿ§phôÚu"Iž¶Ž»OqúEå-†žZÇ{Ú ]]ó_¾»}g=7aïák¡ÑiëD’ ꃮÂ\3Ýœ8“μ3õ։Čö¾¼Dølï÷ÜÚÁ:Ž$'^¼ï‚N\^¡½ 13³‹•Õ¹U™žšêÓ·æ"Ö‰$±Ô]‚Yf¢³òj™nfœI·N$Æ´÷åôÚ·‚¦@_°Ž# 15³pðx€Sf°–Â+Ö‰$…h/È …&Y\‰œÂÆKíýÖq$ÔÝ õú}f9öšÇt[Ç‘” ½/¯£œlºMSànÐèÖ‰$n"ËѦ‹=ÛwÖs¸û´?ŸµN$)G{A^èôŸáb•·ô ŒYÇ‘„PLoL.óË3ËL´uI!Úûò64ú׃î@ƒ GX'’­bÒcoteþ`ïˆuIQÚ òFlÿmÞ:®Ûa|âëDgêƒéjbj.öFÇü2Åz£“WhïË»õôÿMwà’Ð#tOœk(4YZÑÊ9~øIÃ¥ö~ë8’Ò´äx±ÔÓL { åL™VfÖ:ޤ.í}Y'zm‚NA³ _¨V¤¾èêÚ¹«÷²ó}Ìø~ N['gÐ^ujëøèÓo¸-Åû.<zjG¶J}0m0L%§É„2§Öq$ÕiïˆÐ)Ê]áÎÐ2è4ëDòfÁÞ‘]{ÎrRÞ’æ®à°uqíY¿ù…Hõé[YyµÜ™Ã'~ž™]´N$›§>˜˜ÁÊêΑ©d6™PëDâÚû² ô Z7‡ÆAï°Ž#ÿÞ{ø§³}g}óDW׬‰Ãh/ÈF=Ÿý²²-öØiºØYŽZ'’ÍPt4æŽéc9Dæ‘©´N$Ž¡½/›CËð_¾{ìÐ>è Ö‰äÅüB¤úô­¬¼ÚŒÜªÊꎙÙEëDâHÚ ²9ÁÞ‘‚2?—'ïó¦®à°uÙ0õAçbâ¼%Í3È$ZLJÑÞ—­ qÐ;htš}Ä:‘{µ^¿ŸSØÈ8ï»ðçà ë8â`Ú ²çÛú²ó}\¡ÒŠÖ¡Ð¤uÙõA'zôø³ÆÁ1wLŸuq$í}Ù:6>„‹D¡•XÇq¾±¢ò~Oñ™@÷ uq<íÙ¢çsác¾ÎLO üÃWëD².êƒÎ¢A“xÑÞ—x¡‰ÐG¸NtŠuW˜˜šÛ¤ß|›·®Ág)¼bHÒö‚ÄÅ£ÇÏJ+Z¹KÙù¾sWïYÇ‘÷Stóm}LçÅ”1kÖqÄÙ´÷%Ž"ËQZ Ý„KEO¡­X'J[T¿—?õ¯oè§–8Ò^8ê {Kš¹Qeþ`ïˆuyõAG`Ž˜&NŠÉb¾¬ãH"ü+ÀtF5à endstream endobj 295 0 obj <>stream H‰ì×ÿKÔÇñ¿a„ ÂG ‚8t ¿È¦‚B?H8a4bu™¢bÎq¤›Ûò@7Ù&*1d³‹á±)¥d³äš_O¯Ú ¶Â¶_î>ïŸÏëADþÔû>Ÿ×Û÷½^¾tÖO?ßç½Küíðÿ+¶¶¾ÙÐ&W™­ÁÉݽ뉼&<>›[ÖÅ.­î‹Æ–­Ç¯Ñ]ÔJì'{¦² ÛÈUMãÐÒJÜz"9ZëçwxGüm=ˆÝ©m ñŽØ&vŠÍ²žHÎË)éä@X#¯Qt'}•’tÓÝ—t£¹Ð_h1$FC¯±žè˜Iì'{¦² Ûx€5CK+që‰Äãt$ÝÂã³¹e]Ĭ´º/[¶G^Qt¶ƒᥰ/lõ8âYºûâ ZLmSˆ°Ñkh7t뉎‡±È|AE/Ï­¸*™^´G|AwA°»wМÌ,h%lç?»½¶¾i=‘¨ºÑÐæu°#l ûb=‘x™î¾8‰FC¯!rtšŽõ8®öàá“ÊúAžUvQû[w­ÇÑ]Çð¥÷Ü…a}éu õA7Hì'Ù6‚wÁv°#Ö‰÷éî‹ón†¢t‚Gß¡õXã:Ï6÷.¶žÌ»ÂþÁÖ‰¿è.ˆÃ¢±åÒê>R—W~=<>k=Ž©š#ÿlo`/¬Ç¿Ðݪh‚œ“v2OòÉ?[`=‘øŽî¾˜£ûTô’CÚÈzK+ñÚ¦O «°­g`*±Ÿ´žH|MwAl-è ’\ýñ·¿ÃXrKz­'9‚î¾ t(š”õ"¾ » î·¾±ÝÐ&¨ù-î‰Ý½뉼@}0…ÈäÕž;ä“GJVI¬õD"o¥»/""ÿ¦» ÇÅÌÜjy]?qÍ-ë ĬÇ9öÔS…4’I&ù$¥ÖãˆüÝ}qÒß ¤_œ endstream endobj 296 0 obj <>stream H‰ì×ÍK”aÆá¿!D7­ a$0H!7. Bpˆ´7®’JÅH$- L“Ô)ÌfаOPuáI0„ˆŠŠ2a~ŒŽÚ ‚<•Ž£gÞy×bÖ÷ûœ{8œ½=©îõÇogÎßѯuàP‡Â¹%m*mqy×äÔ¼uk~ü^Ϩ_ë ¦^®x¦gT'ÕLë8À¡°÷.öÀÅ^@:‰L/WÔ ¨Ò9…÷»_ŽÅwv­¥.îÁÿRÔ"uI¥^©]Ö‰€$`ï\줟w#‘‚+OTlý~øüÝ:NŠâü75ç Ej”u iØû{i)¾³Ûýr,§ð¾ê]Q3™^¶N”r¸ÿFmQgô8êZ¤.Y'’‰½p±ÆV¢ëµ Cyw3· ÿ\‹Y'J!܃RCÔµEQsÔëD@ò±÷.öÒÞTd±¬ª_=?WÔÚœ°Ž“*¸£n¨!zµE±Žœö>ÀÅ^€O„†¿J©í—®?ÏZDZÇ=x@}P+ôjˆzb8Yì}€‹½ÿˆmÅÛ{F² šÕùʺàÌ\Ô:‘%îAQÔ½ƒZ¡n¨!Ö‰€ÇÞ¸Ø ð›…¥ÕêúÐþ ÐÒùicsÛ:‘ Ÿßƒš»¦¯èÔµÂ:pJØû{þ495_\Þ¥òç–´_}±ŽcÀÏ÷ &®¹ëóÕ5Á:pªØû{~68Þ¿ Jo<÷Û]àÏ{PSÖ¬õáš»¦o0ÀÞ¸Ø ð¹Í톇o³ò›ôG¨®­D×­¿Ýƒš¬æ«OÖ¬5qÍÝ:`ƒ½p±™™‹VÖõ_8{á^Gïhl+nèÄùçÔ45SMVß«)kÖÖ‰Kì}HŽ_ Ý=ë endstream endobj 297 0 obj <>stream H‰ì×ËK”qÆñ¿!D!ÜÅ€"h +Á… %ܸJÜîŠ6yA™paš ºÐ’´ ŠÁE¡5 ¡*¡„ÂH™XxÃKJ^z"¨f©ã ç}_¾Dt÷¼ÏáÇáË×.]½£ßÖA{ѱX~Y§^DVqÛPtÎ:Nr5Ý¥/Õoë É¥9jšúRMVóµŽØcï\ìà˜Oß]¹vWªovþ‹uœd ü=¨Ùi‚úÆŒ¼°fjð ö>ÀÅ^þ¶±¹{+ü25«!%T§?ô¯u¢Ä ð=øk|š&Ôñqcï\ìà_æV®W?ÒÉÈ wŒïZ'J¤@Þƒš‘&¥yéÓJ«ú4AëD€ç°÷.öðCѹœ’=“ü²ÎèXÌ:NÂïÔt4#}”楩YÇ<нp±€Sív<|›žÛ¬ÇRQó8öiÍ:QéÔD4}ŽfÔÞ;ªyY'¼‹½p±€3Z]ß©­L Õ¥e7ÖßÙÚÞ³Nt!Á¸5ÍBÑ\4ÍÈ:àuì}€‹½œËûËÅ•=z5™-ý‘Ië8ñ À=¨þ5}…&25»dðö>ÀÅ^âžÉ*nÓÛ),^´Ž_߃ê\Í+¨¨U³°Žø {àb/ñù¶ûýnç›Ë9MzA7n>[þºiè||zªgµ­äj^ýk Ö‰Ÿaï\ìà"tžTß~îÇóÄw÷ ºUÃêY±uªyëD€/±÷.öpqÓ‹…å]zJ¡¢ÖÈðŒuœ3ñ×=¨VÕ­«gµmð1ö>ÀÅ^åÉàtfA‹TqeÏÔì’uœSøåT“êSQÕmdÒ:à{ì}€‹½$ÐÖö^ý½‘´ìÆ”P]mýàêúŽu¢òþ=¨öÔ¡šTŸjUÝZ'‚€½p±€„ûøy½¢æ±^Vzns{ïèþÁ¡u¢xùTcêMí)¡šŒ}Z³N{àb/I‹å—uê}å”t Eç¬ãçÙ{P]©1eS{êÐ:4ì}€‹½$U÷ÀxF^X¯¬´ªo~aÅ:μÕZR*5¦Þö­ÄÞ¸Ø @²mlîÞ ¿LÍjÐþп։~òÔ=ø»¢”Pw*‰½p±p’ êV:2 endstream endobj 148 0 obj <>stream H‰ì×ÏKÓqÇñ¿¡è"Bú" #=tÙ! ]O!D]¼„"J”+ca?ŒbxR"¥3" C Ñ#Y˜mÓéz…0>͹íàçûÕÏžb|ú|ÞŸ·ŸË›ßl6¼x=»ïèUýúýÀ®@.nˆŽÎÔCç†æðÔôBÉúòg_ÝÔSÅ꯿²àr`"g¤W37ゥôj¨Û:"ó‹‰"Åå̾:¨ÊÔSÕ§Ÿ Àkä>ÀD.މŗÛ;£šëªºžþðx2µV°¬øìë–jÔM=m>€wÈ}€‰\œôé˦–!M÷‘Ó7žŽLo-(2ûª×-ªƒúØ,ïû¹8,÷elÎû²+8ûªQe‘¯H{¹0‘ €Û’©µî±ªºMz{g4¾´²¹Ÿ7ûÚשvT©zÝòïÉ,"÷&r¨ó‹‰¶Žˆ†½¦¾ïÖý·éÕLnöµÖŽöõ_Õ¨ÒïǰˆÜ˜È rLLÎ54‡5òµÁPïíWZèWk-´¯S¿À:r`"€Jó òáЩ~ þæ?­µã÷£x„ܘȠÒüZN]êÙìßÇ ~µÖŽßàr`"€Ê‘Y߸ûøýÁ“×4õç†r¿ÚѾNý~ ëÈ}€‰\*ÄÄä܉³w4ï3ƒ/'¾æf_kíh­SÕøýLv‘û¹8ïÛ÷Ÿç/>Ѥ×Ô÷ >|—YßÈþ?ûÚѾNµ£JÕûýd¶û¹8ì÷Jº{`¬ª®çÀñ®ËÝ#K‰?¹£­³¯SÕ¨Rõº¥»~<€]ä>ÀD.®zôìãáÆëð`ëðçÙXÞév³¯JÕëHwÕÁ«Çð¹0‘ €{¦¦šZ†4ÚµÁPtt¦`MñÙ×-ÝUú¨›ÍÇð¹0‘ €Kbñå¶Žˆ†º:ÐÛO¦Ö¶«,9ûº«ê£2õTg;Oà)r`"7˜Ÿo®>stream H‰ì×ÍK”QÆá¿!D7B`"ˆ  Ü ÑB7BB à&hØ(‰aˆI i¸¨!l‰º¨6-È¡”QÑB¦üÈ1aºWq çý8çü]Hø>n* ^¿ùxîRþt=ï¦ç–«[†”åæö±tfã4Ÿ•}ÕTeý¾º¨—¿a¸Äݘ¸ @I[ÊnÅ:ƕ⪦ÁD2sú=d_õÕE_©£ú?,÷¸ûw(Q»¹ÃîxRù-¯í‹Ïïä‹úÜ[öÕE½ÔQߪ»f(êsÎq÷&îPròÇ'# õý ïõ®ë›9Eüd_ÕWŸkM¢y<àw`â.¥e6µRwí±bÛØ6šZ\ó\ÇöÕ]3¨ˆæÑTžë°‰»0q€Rñéó×ÖÎI¶²aàÉów>«•}M¢yTJ³iBŸÕ„»0q€èû¶wtg`¦¬¦W?ú‹þé¿f€Ùc<!áîLÜ âž&Ò• Êikçdvu'¨²g_³iBÕÔ´š9¨²‚Åݘ¸ @d¥×ÛF•ÐÚ«#³©•`‹‡”}Í©iUY“kþ`‹ð»0q€ZßÌÝèN(›õý# ùã“À[„—}M«™5¹êk íx žq÷&î)ûùøð|ymŸ‚ÙÕój7wR£°³¯É5¿Zhm¤½Bj (Ü}€‰»DG"™¹xå¡"ë_Ên…ÚËNöµ…vQ#í¥íBíà4¸ûwˆ‚tf£¹}La¬nz9óÁBG›Ù×FÚKí´£6µÐÀ¿p÷&îàÖö—½[w§à u÷Œ¾ýqôÓN_ËÙ×^ÚN;ª©öÕÖvúø w`â.®äO~ÿéæí©Ííï6»;ɾvԦꫭµ»^Àfwî>àOÜÀ‰é¹åšØ#¥¯¹},Ù°?€Ãìk_m­îz½ƒý€³Œ»0q˲«;±Žq宪iðÙÔ{Wc8Ͼv× h½†ÞÄÕÀYã<û€Há.Öìæ»ãÉó—ï•ÕôƇç÷ò‡‰Böõz½†ÞD/£÷q8 pFD!ûþo¿ã©N4 endstream endobj 98 0 obj <>stream H‰ì×ÏKÓqÇñ¿!D/B`"ˆ  $ÕA/B£ AèEQÌ, ©x¨‘ ¶‹¨<˜Žr’!NÔ’•?§+{A^ ±Âæû»íù`Œíö:½y~$ƒ¦Ç¯Î]¨Ó·õÉcu}óÖý!ݖ̦VïÄîÞõ"HTÃcsy—ꢖUuO—­çH6¼ĉºEõ¢ “[Þ¡ž±ž f6´âr÷êŠæ”¶ùüAë9’ïAq¥†QÉèΨjÔ6Ös lDvj=þ´¼úŒ‚FOçøÖvÔz€¤Å{@¼©dÔ3ª]Ž:Çz8TìÛ÷®¾É¬¢fÌk5Ï—ÂëE’ïAgCU£¶ÑÁQç¨v¢û1ëEà,£ù«Ot'K*½©Eë9RïAgI…£ÎÑÙQó¨|¬ç€#,|ü\Q= Û˜]ÜÒóìµõ)„÷ €³§ÚQóèø¨Þød=Ì|ÙÜ»×2’žß ~è¯õ"©…÷ $ôÎd·¨Ä*ªB kÖs¤"Þƒ ©TAºB*¢§¾ië9pFS‹%•^]¿‚Ë]£yë9RïAæÔB*"Ý"Õ‘ÉzÄÑR8â¾óB/«¨¹«o2º³^ ¥ñà*"u‘êHéz­O½d½þ³­í¨§s<£ Q‡®¦îåFdÇzðà ª#5’Ž’zIÕ¤v²^ÿ‡ÏÌ-ïÐ}s¹{gC+ÖsàïAN£RR/é4¿Ø®‚²ž§òæm¸¬ª[7MïÁ¡‘wÖsà¼8“ªIí¤¥Žš.[Ï€¶º¾yûÁ°îXfaS«wbwïÀzüŽ÷ ÇR;© ÔQ:Sj*••õ"ø+ÑýX{Oàçùºyw0¼úÕz÷ ‡SG©¦t©TVzª²¬ÀI†Çæò]tµÊªº§ƒËÖsà$¼$5•ÊJ÷J•¥Ö²žÇ-¬]¹Ñ§K•SÚÖ?8c=þŒ÷ €¢¾Reéj¹Ü½ê.ë9pd#²Sëñ§åÕ§ç7x:Ç·¶£Ö‹œÂq9½l endstream endobj 150 0 obj <>stream H‰ì×ÏKÓqÇñ¿!$/ a"Ø¡CtðP—@:uð`A¢Ìj ¤ ) # ¼ˆEaôA*‘¨CZBQ±0¦¹Ù¦½aQ:§~çûóùð|Þ^{}öâ‹‹ðÉÝÇo¶ì<£Oë @Èò……®O«êâš[cË@2•¶NäÐöÕ†:Qõ£–Ô•u" dîlàîPn#£ok®hhú}öÞ:Îo®m_Í,µ¤Æ¬ãÁrmû[Ü |’©ôác75±êúDwÿx¾°`è·¯~Ô’ºR0õ¦ö¬rpûCÜ ¾g²­‰{•±öŠš¶çïèOëDÿrvûêJ©7µ§¬ðš³Û˜à.‘ëœØ¾§CË:ØÔ7™übgyŽo_½©=%T“êÓ:Ç·ØdÜ BcvêÒ¦b.ß~ðÚ:N1^l_ªIåT«êÖ:/¶Ø4Ü S§žÔšªêâ=c¹ù¼u¢Uø²}5©>ÕªÒªaõlð›/Ûlî°AsÙŸç;nÝuNSj>5ôùkÆ:QIüÚ¾ZU· ¬žÕ¶:·NøÊ¯íÊ»lÄ­á—;ö]Òˆö¹þbò“uœ5ðqûjX=+¶:WóÖq/ù¸}@ùp€õÑÿ&{¯ùû¿‰¿ÛWÛê\áÕ¿^Á:à·(î°VŸ¿fšO i8[w‹_}4—ýih=¼Þ¾:Wóê__Ao¡±NxÃëí"Ç]J—›ÏwöŒm«½ Õ=98õqÚ:Ñú°}õ¯WзЋè]ô:Ö‰°}@„¸ @‰†î¿Š¸¬½ì>Ôõôù”uœ fûz ½ˆ¾‹^Godp]0ÛD‚»¬j2ùå`SŸ–²}OGïà„uœh¶}½‹^GßH/¥÷²Ž¸+°í%:~vø{&kpw(B·C¤¢¦­2ÖÞš¸73›³N™ð¶¯×Ñé¥ô^Ü}`%ám(…~öÕõ‰îþñ|aÁ: àî°,Ý ] Ý ¤±e ™J['ŠX¨Û×K齸ûÀJBÝ>PÜÈèÛÚ†+úñëóÑ“wÖq‡p€ÿéR,] ]ë8eöö¹ûÀJÂÞ>PD¾°ÐÝ?^U×[’©´u"À Üàoºº…î…®†n‡u¢r ~ûÜ}`YÁo(îÛôãg‡+jÚ*cí§/ÞŸ™ÍY'ŒqÖæ—ÏÜ.… endstream endobj 99 0 obj <>stream H‰ì×ÏKÓqÇñ¿!D^<Âd EàÁƒ^‚ÑɃc ˆàAÈŸc Dš"¬@1Ò`QA,’‘:¤àH •…2ÍM7íç´mo·ïóqøž_—ï›ççêÊ9ú^/Þ{øB_ë!ðONN“]¯>»»‹Ê;[º¦ý¶^ÀÑRéËàDÄåñ+¨¼¾ÉèNÌzÜïAùHÅ¥îÒùRƒ¼[QY/àDóá­Êº!Ý"}ëÛÖsàÆxÈ_ª¯ëS•YÏà ј×7©ûSZNDRéKëEp¼ä55˜JL=¦Söôù{šõ"îä4Ù˜+vw•w¶öÎÇÖ‹àöx(ê1U™ÚL…¦N#ÏdÉXh­¬¦_íTß4¾=°žÿ‹÷ €‚¡6S¡é¦©ÖÔlÖs”•õÝê†]wíÀ̦õÈ Þƒ Œ:Mµ¦Ë¦r[^ûa=@ÞÛÝ;jl 骸<þÁÑåäyÊzd ïA…Gµ¦fS¹é¾©âÔr֋䥳ąx©¤¢GǤ¹cjÿ0n½2Œ÷ €B¥rS¿éÄ©åzÕuÖ‹ä“Ó_<~©òäÙÛ/?­ç@VðPØTqj9:uêÎz€<ÀÝà¼8ŠN]§s÷ÈûF¥g=Àµoî˜Ò­(©èñ/%.¬@vñàê:ÕOGO½§ê³^àIž§G—]¿NDc[hwïÈzäïAŽ¢ÆSééîݯìSû©­°7³°é®Ðe¨nYYßµž¹Ã{€©÷T}º~*À©ß¬ç0³=¨o×5(«é ­YÏ€\ã=À±Ô~*@Ý@Õ šÐz€œ:Ž'Z{g‹Ê;‹ÝÝí¹“Ó¤õ"0À{€“©ÕªA5aK×´úÐz€¬K¥/ƒ‘Òª€È뛌îĬ€Þƒ TêªU‰jEëE²%¼º]Y7¤ÿ]ßùð–õ0Æ{þR^WâÒçïÖsdXt'æõMêwyüÁ‰H*}i½ìñtž? ­Q¸ó endstream endobj 151 0 obj <>stream H‰ì×ßkÍqÇñ¿A­´RÊÍ®hµVKQ¸Z¸ ¤Ü,ФVK‰$6‹Èï¥Æ.LÊ,ëX!sÁ)~Ű%«iLÈíçaÌ«N-IÇÙœï÷ýý|>ÏGÒ”ó®ó}½^Ûä$|5<’Ý{¬svÅþ’òúº†ŽĄ́õEѺy÷Õ¬ûô·õ!ÑÒç¨OSŸ©>Y}¾ú”­/Œ’} ¿žÞ«6¶* eKœo{l}`‰]D[ EP´ÚësâTöÙ}`JPÙòKuvWTŸR"–¬;ó¨ëõ9€ vSÿk”-‚vÁúœø˜}v˜ 2û@ÙoG[Òsª(›v´õd¬/âÆ. Xê|5¿ž­€¶@‹`}Q¬ÂÌ>»„™} ¿Ÿ†¶íIå~$8Ü|olü»õE@|ØH=¯¶ÏýR þ× X_d äì³ûYÈÙG° ìù'/–­?«€Ì_~¼íÆó¨¯‚]@hÚo½TÏë±Wç«ù­Ï1CöÙ}„‰ì#4¹Ý/üÿ_éèÊýœP]sîYÏûè‚]@8ÔêêöÜÏÿj{ësŒ‘ýv¡!ûÇï»?­oÉ6œ¼SZÙ¨ïݶ'5˜èB Ø„@M^»ïºuu»^=o}‘=²?…ÝGPÈ>BP”ÝïÈÔl¿ª™»ð`Sëýì·‰¢ß $»¿©½Õájr=çjuu»õEIAöÿÀî#d~+úî§ô-^Û¬W«¨>u;ýº(G‰Â.ÀcêíÊ•MzÂÕäêsës’…ìÿ»ï‘}x,ºÝ?ßöxÞ¢Czå5[.ôô~,â+æØxI]­ÆÖ³­öV‡[Ÿ“Dd?v#ûðR »ÿuh|ס[³+ö—”×ë ý3ŠwâÇ.À3Su­?Ôud??v¾"ûðLÌ»ßûæóÔ/ž-—NüøéÛ1`à5³úY´ºZm}N¢‘ýB°ûðÙ‡O¬vÿvúuÕêÓzßÅk›Óúb{_ ìü 6V'ëaV?«¥­ÏqÙ/»Ÿ}øÁ|÷'~ülj½?wáAݰ¡örßÛ/ñß»×õdÔÃzŒÕÉjfõ³õEn ûÓÂîÃd®KÔîfFë:JÊëK+NÞÉÌ »w©uÕ½j`õ°ÚXl}‘KÈþ °ûðÙ‡»»ûÏzÞWלS²Ê–¹˜zj}0=ìu¥£K­«§W ¬¶>Ç=dÆØ}8ìÃQÉßýTgwùŠºpÙú³ºÞYŸŠ]€sÔ±jZ=·j]u¯õ9®"ûÿ‰Ý‡£È>œãÐî?Ü|oNÕ]»y絟†¬/þ]€CÔ«[w·ë‰UÓªoÕºÖ9ìoÙÿ%ÀÍk™ endstream endobj 100 0 obj <>stream H‰ì×ËK”a†ñ¿!D7®ŠDPHHµPÁÔÂ… H´tŰƒZ`ºPq¡ÒDØ@ŠJÔ€ fJ((戆6å!ÇFí£E¤¨hÏ|Ÿ×ùw÷æ}¹ÞÝ]ûˆlï4µŧV»XšWÔ1=»l½À X[{kûc“Êc3·Q§8)«®«oÂzD#Þƒp5¤JR÷ä¥ÏÔ–ÖsJpñû­;>Üó)•šá­ˆõ"ˆR¼à`*Iõ¤ªR·¥ s.²^`_?6Þox·w` Kº¿¬Z/€¨Æ{CU©¶Ô…©ÎTmª9­øÛËž.?Ò9ÍÌm|?´žÀ{O…©ÎÔµ©æô½þ`=Ào£“ YùÍ{g³Ó?f=ƒ÷ •jSÍ©ËSý© µžœi+¡¢ÒW:qÉÞÚþµõ°õ"pÞƒp jN•§úSWhaI—ŠÔzpæ„·"õ-ñ©U:†ù·ŸÏCÖ‹ÀyxÀ±©?U¡ºEU¤êRÕ©õ"à¬è L%_­×éKÏi ÎXϧzÑ=®»T_ë!àTjQ©îÒ¤¬:5ªõÀå&§—² ÚtâÒª[}#ÖsÀÙºß~Òª¯õp6u©êT7ªJU½j=p¡o«›w«{b“Êõ§ú×z8ïA8)b5ÆSF¬'«©}(!­ZÑ’]Ð6=»l=\‚÷ œ,•ªzUW«ÚUÙÞ±^8[`p&=§Ag*åúÓÞÀ”õpÞƒpT­jW]°êXÕ¬õÀ‘æ‚¡¼¢£øÔªú–ÈöŽõ"pÞƒpJÔ®*Xu¬®Y5íÌç¯Ö‹ÇX[{kûã’+b>stream H‰ì—ÿkUÆÿ†t’‚`)ý NÇ`®¦?ŒðB3EHPR“„IQ£mMצcßPæ—¡›ei£6µ/N³×̶H7ÃÅÆÚä*®ÉtînSûèY‘¡itï}Ï=çùpõ§ç¼çyÞ÷>wîˆÿÂÍÁናS6?1=ûµ·?]é·V$Ä£ùúû6ËŸÖB„x4ìÕµï~cÙ´ì[¶®µ¢ÇÙGvnéñ`c§µ"!þ Ýè‡wÄQö#Åßï~ý\¾EÙqŠ&×w¿ñ\÷¼¥;ÑÏ“±ª*_AøÝá~êŽ]H ”aTö*ÛÕZŽGPö#Ë_w?ñÅk-Gˆ‡¢ì —Co¢=95Êw¿â£Ç'çñ. ‰9™yGÂC#ÖŠ„ø'º ÂÍ´´…+ö`Ñ©s·î¯ûÅZާPö£.Å« ßžm½d-Gˆ ì ×BWzkÓ—ô&,J‡Ú¾ï´µ¢ÈpýFøõ÷jÇÞ{¯I³óõ{F¸ ÝáNzûÞÌ=ÌQ˜œ—[zœ]j­Èk(ûQ¯âX|‹{ñ0N¶V$Ä}(ûÂÐ’èJ˜“ÞD{òÞÝïøí÷´%;xAžYóK[ÚBÖŠ„EwA¸‘[··UŸvŽÂ+ë?eZ+ò&Ê~TÁ·¸— ãäò½§pµµ"!FQö…Û %Êœ¢ôÂâÞ¾ûõ §¤mq^vñÚ{û¬ ¡» Ü{2%cžL]TÑp¦ÃZŽ—QöcÆÉÌWãmk9BÜEÙî6D'rÊ-É'{räÖíüíß=™ôo=nfî¦òüµ(ákt„Khï¼ê…És v}ò“vc´QöcNÆÏ¸ši/\³Ÿ[+~GÙn€ÝH¢ áFšýÈowÿZÿàò ÇÌÈfO§Ô=o­HøÝa+ñ‚o8 ‰9ü…Z+òÊ~,qLŽÃñ¹L.lQö…9t>ä¡ùy%¶´…R2¶9£H]TÑÞyÕZ‘ð#º –ªš¦gž/Ä„ ×ìkm¿l-ÇG(û±‡ãsÆ>yNη–#|в/ ¡ïÐzœúC¢ Y+rµGÏ?õ܇ÌdÌŒìå^ë´V$ü…î‚°¢áL‡s’eõ ­åøeß ÜŽç>þ'Ör„ïPö… tš}ûMšO²Vä.ÂC#YEõãfæ2ŸñÉy%•AkEÂGè.ˆØÓÕÓ·rcsÊ÷žbZ+ò#ʾ!xçã>ÁŠÌÏH„µ"á#”}{h7tŒGß¡õèî?ŒÞ¾—WW3(ž)i[¾ ¶[+¾@wAÄ’›ƒÃ¹¥Ç'Ü; ë²êØ{ÖŠü‹²oþ'|A.®ß[+¾@Ù±äÄ¿Òkœ‚³`uµîþãÐÔÜ=k~©3´ôe»»zú¬ £» bÆÃ禥ã·ÀŠ=g[/YËñ;ʾK $‚oA:Ȉµá}”}h1t§ÔÐnè8ÖŠâŒ='¦lfzcsÞxÿÐÍÁakE³è.ˆÀ/ÞyKw:¿xk¾j¶–#î¢ì» rA:ø"$åç–k9ÂË(û"ÚÐ\Ög¢Åà4MåFkEñ “ÌÌ;’ðç$wî?c­HxÝUBWú×eÕ9{¬°â$›ÍZ‘EÙw¤ƒŒ¾ ©!;ÖŠ„7QöET¡³8{ŒC—ÑÝÿÿtõô¥/ÛÍHy¦¥75w[+^CwAD‰ðÐHIeÐ9 +7ְͬ‰ûPöÝ I!/|²S´«Y+^CÙQ‚ž2=½Ø©-ôÝýÈlì|v^‘3ÞŒUU¡+ýÖŠ„wÐ]Ñ îØ…¤@ÖJ[²£ñ\·µñ”}7CjȈ‘&k9ÂS(û"âÐMh(NU¡³Ð\¬y–’Êàøä<朘“UT±V$¼€î‚ˆ,­í—¬®ÆTSçn­ªi²–#вï~H9â3½ôê^’e-'îùC€· € endstream endobj 101 0 obj <>stream H‰ì×ÍKTq‡ñ¿!B„ Z Bå"‚Y´HŠ6‚Pˆ´±"„œDQ‚Ô&#ì…Þ`(ÁB]äP„ÔŠ(¦a’M˜::£ö[$ôb¦ž{½Ïg!Îî,~÷ðœÅEG‹uôæªß¶çBa¨¹'1b=à cã“¥çéëÈñW×EºfRië‰À?í×îÕ_ëAÀT¹j]¯v¯êW l=`ìçâÄÙ‡|°™¸`ó©xÕ½Z¿j`•°zØz"ÀF¬£×lÔ·PjîIŒXžÃ=VT¿j`-aõ°ªØz`S½ë ·èýï:pénìµõ8àQ܃`K%¬Ö*V«­Ç6ÜDrút¸5+¯2;¿*ÜÐùmjÖz"ð.îA0§V«UÈêdÕ²õDÀ†ÈÌ/4Ýz‘[P£ö8~êþЇ/Ö€×q€C¨UÈÚɪe5³ÊÙz"`=µÇü‡›ôÂE‘x÷õ8€%܃à(êdÕ²6³ÊYýl=°ß>ZzG¯zÇÞÚk÷^fæ¬'üÀ=N£ZV3«œµŸUÑji뉀5ú:™:Wûd»ïbV^噚6ý´ž°÷ 8ÓrH«¢ÕÒú‡†ëÜŒ¾Ú¹¯N™qääí¾ÁOÖã~{œL­–Ö¢VW«®­ÇV%Þ=(ŠèÝú‚48÷ 8_{|@]­u­ÆVi[üÖðh²¤<ª·š[PsåÆóÙ¹ŒõD€?áWPW«®ÕØZÚêmU·õDÀ 3©t¸¡3;¿JO´¬"6>1e=àï¸ÀE&’Ó*mímU·Ú[n=°äAkb÷ÁËz™Áâ–7}­Ç¬÷ ¸Žz[Õ­í­W‡[OÓk, 5óÀ¥¸À¥¢moUàÚáªq5¹õ8ðœ±ñÉ²Š˜^`v~U]¤k&•¶žðϸÀ½Tàêðµ6¹Ê\}n=W¥«Õ­'ÂVëèõõÞE‘žÄˆõ8€ÿÂ=[ƒÊ|ÿ±«Zéju»õ8Øß¶rÇ- endstream endobj 153 0 obj <>stream H‰ì×íO•uÇñ¿!¢‰›M·\Rб1œÌl‹µx@¥c¶a³Í¼å¦5S=‚2™æÝuLE­§–ƒJ`™7óTÄ´¡ÃÁåà{çµ| …Üžïuëócê£Ïüý>¿ïõ½wOþñÍ·-OLËç·u‰á¾H^Im|R—*!¥hSEu¢Øw«'¼tí¡¸éùüŸ'¦*kÎ['ÏÓ\±r³óöŠÂ£ … Éë×}v’÷Ê:‘ FÝ÷zD›èÍ¢_´Ì:‘xžº/c…M„}„ëÄn²xõAÍýh µvÌÊÞÆ>?©Y[.µ´['Ó\Ñ‹ôl¯j˜<3È]ÊY¾7Ê:‘<žºï!tŠfq^|zÑ5gH·Œ “œ¹¹æä/ÖqdTÔýØ@é#GI7ü©Í:Žx€º/Cıtí!v . û[†u"ªp_$¯¤6>©€³KH)ÚTQgH\MsA†¢íZçÂUÕ\•I©KwÖóÎX'’ÑR÷c}¤•t“¥§´Õ:‘¸šº/CÁÁÁUa§`³ÐÜ÷¢öÝYïìâùyö¥’ºÆVëDâRš 2¸;½w?)ûnâý¡›WÃÛbHƆºcè& åLik`ëškH\JÝ—Á±5°;8KÛ„æ¾×5]¼:-ãsç@3æ—·]ë´N$®£¹ ƒØôÂs÷ß—sÊnþË:ŽŒ%u?&ÑSÚÊÉÒ\úkGÜHÝ—ÿæÀ¾à,¼!ìÖ‰dÌ|YynRêFN6>©àý¢cwzïZ'Ñ\ÿÄWeæÛ;ôUÃÔýFgi.çûÊ[tÙ:ޏ‹º/b;`G`Sàn°5°;X'’±Ç)/Ï?òä¿§\±¿Ñ:‘¸…æ‚<äÆÍžÜ¼nÅÄ”¢ ¥§y=¬ɸP÷cÍ¥¿´˜S¦Ñí7º­‰[¨ûòÙ¸l ï­;¢¹ÛÚ®ufÌ/ç¸ùyáÕ/š.^µN$ö4äp_¤tg}bZ€+±pU5/†u"Gê¾ÐbºÌAÓkÚMÇ­‰=u_``#pVvÍ}ÿ8ýýoϼø©sô¯-Ú}³ó¶u"±¤¹ î@ræf.Cúܲú¦?­ãȸS÷ýƒFÓkŽ›Ž;õ«u1¦î øþ}Ñng`/8U²N$6UÔ%¤qžz¾0¯¤6ܱN$64¤9t}Î’=\ƒ©³‹wU7YÇ‘(Q÷ý†vÓq¾Ózë8bFÝ÷9¾ùùòçûŸkÀ.ÀF`H,uu÷.Xy nz>÷!1-pøÄeëDb@sÁÏx> |ŸT0!yýšàqþjH¢GÝ÷!:NÓé;­ÿ`ÃWª¼?©û~Æ×þÓ3>æðýÏ G@¡ÖŽô¹e\ ~R³¶\ji·N$Q¥¹àO‘þíU “g9ý7ß­ä°N$Ѧîû}§õœ>/ï¯u"‰*uߟøÂç;ßùàçË_s_uøÄå)éAç’,Xy «»×:‘D‰æ‚=÷ÇŒ7¶rڳW¬ãˆ ußçè¾óqÈoÞë8=ê~lú[€ªw [ endstream endobj 102 0 obj <>stream H‰ì×ËK”aÅñ¿!D!\ H¡Am\()à&‘07F ”—’‘¡‹bHy¡4˜•ÙU”Ðf‘‹†hH“ŒeÄÔµCm‚î53¿×™ïg1èîÀóò<çloÛòæ Ë{ví?—‘çéöúŒÓ¢áÞÓ׺ØõkjéêêºØÕÛÕÞ­ã A,W«S2ëS]µž¡O+aëD€è`@‚QW?{qX½]í]^MÞ:v°ÈæVgßDzŽ[m¡´ª?0½`MìAHHêíjïºáÕäÕçÕê­açy4È.h×W¤_ým}ìAH`Ož¿¥Ïã¦J«úõå¤ç¸;û&"›[Ö‰1Á€Ä¦&¯>¯V¯Û^ _=ß:íÓJ¸Ö3”êjLɬ¯n\ ®Z'Ä{’ÁÒrHÝ^ _=_m_ß:œ¨ÛëËÈó¨–÷øsÖq1ǀ䡆_TÑ«k__Íß:äÅäûÜâ}®üÖáWÖqq€d£¶¯Î¯Ë_ý_+À:ŒÍÌËj¼úvg_¸|c4¼±Nˆö $!uþ¶®1õ=ÚZÖ‰``-´ÑÒñ,-«IŸAeÝÀÇùeëD€xc@ÒRÿ× Ð+ E ] u`ñsgprßÑK:ýÃ%×^ú?XÇØ`@’Ó8Rz]oÖ6‚uÄœN<ÿÄMN°Í|¡] u AKA{Á:bb~q¥²n@§œ–ÕÔpåáZhÃ:À{ð•ÖÁù¶ÇZ z´´¬!jÂë‘¶®±=šu¸e5Þ™Ù u"€#°ßÒRÐ^ÐÓ í ¡aÿK¯¼+¿Ugš[Ü12>eà ìAÀ÷Æ|ï´ô@hGðFì\þÀ\QE¯Îqï¡–n¯Ï:Àq؃€ŸÑ‚ÈÈóè™Ð¦Ð²°Žƒ¿°´:Ý|7%³>ÕÕxÆ}_ÿZ'8{ð ÚZÚZÚÌ ç‹lnuöM¤ç¸õ¾?y+0½`à\ìAÀoiS”œº­÷B+C[C‹Ã:~ld|ê౫:©ì‚ö#o¬ãî³ÝÇ endstream endobj 154 0 obj <>stream H‰ìÖýk•uÇñ¿!°…5PP0ÊéXÌ£ù@?l„²’D&ˆÂ&ÆvœŽ5gÍ¡ÌI>0]N¤¶f¤G©<(i“ælÝP±M4]ÇöàŽNí­7¤ÙÔ=œãuß÷ù¼8„EÂ÷u}¾Ÿ{÷žäFW_NÞÞQSó_x=bzqíÁæ'þ¯÷úïÜ][þãØi¶e\òš¢Í?ñ_¬‡’˜ûáç³|qþi=ˆ<m¯/Z±‡/ž˜VT±ë¸n<žéö… H6d ¬'’çA·?¸qú<­ž/NççëÝ—Áè ÷f/ÛÍÚð›”Q µZO$±¥w!Nt÷De‡R Ç$äê¹të‰Ä˜n_¤™@2PI ²Âz"‰-Ý~œ ÃÓäJO·×»/CõûÙ+ÉYz3{Ë…?þ²žHbEïB<¨úæ·É³Öó¡³–loi»j=ޏ‚n_E2¬Y±sßIëq$†tû¾GoÏxw‹Sã§g–Ñê­'«®kLL+b—F',_UÛݱžH¢Oï‚¿54µÏ^XÉ'NÎÚXwèŒõ8â"º}ù?R‚¬`1È ÒÃz‰ ݾÑÕiìôv>1ž&o=‘øAäVÿÇk¿ó`¯^L)Ü\õ‹õDezüêÊŸ]|²;>uÝçG¸eë‰Ä]tû2 ²‚Ä 7X2¤ãÊßÖI”éöýªb×qº:—Þ¾²p¿Þ}‰.Šå¼w²`ü^»áhÃEë‰$jô.øÏ;ÛÿÖ¹V×q¿Ö‰éöå)È Òƒ !IÈRÅz"‰ݾÿÐÌéçNQ§±ëÝ—ØytÙ2s¶iÙüAï‚ÏÔ:óÚ[_ðMg/¬lhj·GÜK·/ÏD†$ì ©òífëq$:tû~BÏZ²Ý)ç´tººõD*«O¼ôÆZ¶nLRÁÊÂý7ûn[O$#¢wÁ7Nµ\v…)sJkꛬÇ·ÓíË ‘'¤ ÛBÂ3ÖãÈHéöýN§ó5iæôsë‰$¾t÷D–¯ªý`_ž±®º®Ñz">½ >ÐîÍ ÔóR e‡¹Pë‰Ätû2x¤ ÙB°3+ò¿#s¬'’áÓíûÝû•E|GÚ8\ï¾X¹Ôž½°’Uä7=³ìäévë‰d8ô.xZäVùŽc‰i÷…Ź5\¥õDâº}*†œamÈ’‡ü±žH†C·ïiômZ·S¿g½W©w_Ü j”Qâ¬eö²Ýá^ë‰dhô.x×—:oŸ/}AEèÄëqÄctû2<¤ ™Ãò¤¼]N Y#C¦Û÷(:6MÛ©Üto]Ÿ¸MéÖиä5ìçØiÕ¥Áþ;w­'’ÁÒ»àEçÎ_›¿´Š7afñ¶šëqÄ“tû2$ùà ‘E-mW­Ç‘!Ðí{½ú³ A:6޾]²åˆõD"»ÑÕ—“·wÔÔ|vubzqíÁfë‰dPô.x ‡öiñž~üµžH¼J·/#¤8ò(ݾ·Ð¨éÕ|2:6M[‡&îwîüµÔy›XZ~ü¡íâuë‰äô.xȶš† 3ï? ó—VqkÖ㈷éö%*È"‰]"¶~ý«õ8òlº}¯ EÏxça©ni»j=‘ÈÔlž˜~¿µŽššŸ“·÷FWŸõDòDzPn žk²žH|E·/±@R‘W¬ÙE‚‘cÖÉãtû®EO¦-;µ™þ¬w_üääéöé™eÎzÏ}륎°õDòÞwª©oš2§”O“µdû©–ËÖãˆéö%vH-²‹›>stream H‰ì×1€0A A$®Ò"3 )€™Û-¾þöæü¿q^Û~<ûõ^¥šô @“hÒƒMz I4éA€&=Фšô @“hÒƒMz I4éA€&=Фšô «nLJË endstream endobj 103 0 obj <>stream H‰ì×ÏKÓqÇñ¿!B/‚P2†Tè2BH/‚B‰@Ø%ˆlIb(a²*ä Û¡P5²A8Âá4DE3Yø#gK{‚A¥ÛÛï÷û| ¢·×>;¼y°ðòõô‰³­úm=pÜÄgý5a]ó—Ä'¬çà7sŸ¾4´ éÛ),k?z›ý±o½àô àï©2"ß©8t;TjëE8ØÚ΄ºÇ |m'ÏÝ †béëEÇ ÿJÅ¡îP}¨AT"êëEÞ5øìCqe§Ny ©ÿãôªõ€ÃЃ€ÿ“š[Sƒèˆ¨GT%Ös<'‘\ªªïÕû—îNYÏ8=8 •ˆzD§Dm¢B±žã «Ÿ7/_{ª7?í¿s7òæÛîwëE§¢‡”Ù˪JÔ&:(êÕŠõ"×Rúýzê+7žóÔ€C¢GBmrõæ°nŠjEÍ¢r±^ä6ãSg.ÜÓ WÕ÷&’KÖsn@Ž:Eµ¢Ë¢rQ¿XÏq‰ÉÔJ ©_¯Z\Ù%­ç܃95KIu—î‹*F-c=ÇÁ6Ò;ÁPL/Yàk ummg¬\…ä‚ÊEý¢ŠÑ•QѨk¬9Lf/Û30^XÖ®lhZ\N[/¸=ÈULc0ªC£®Qݨq¬9ÃH|Ö_Ö»UÔEâ Ös®ErME£®Ñ¹Qã¨t¬çk3óëµÍƒz«¢òއOÞ[ϸ=ȾhB£££ÞQõXÏ9v¾nî^ïxuªô¶~ô‡þµ^p?z7$ÏŸôEEåºÈµÍƒ©¹5ë9¯ y63¿®êÑõQ©ƒ¬ç‹O,TÔEô¾‹=#ñYë9o¡&Ô>þš°njHMd=ÇÀârº1Õ –µ÷ Œgö²Ö‹žC¬¨€ÔAª!]"•‘úÈzQžlmgBÝc¾6}ð–ÖéëE¢¶TCÁPLÇH}¤JR+Y/Ê­h,YRÝ¥ÏhêŸL­XÏäÜO?hÎ endstream endobj 155 0 obj <>stream H‰ì×ÿO•uÆñ¿¡ÔÒåæV3~h&Š,f VØ¢­œ›l¹ÉÖÔV36¬%›œPQò%’NÉ"+,Îp’â,ÌŠt,6‰°!ÃÑåjï|œýP¦q8ç~Îó\¯1WýÐî=~î뾸qC"©ñÛÞûßÁŸÖƒÈ-݃©™Õü¥,IÛl:k=Žx–v_"#ÇxfdÉf=ŽÜ¢Ýw•Ëã¡ÍÛëçÄçó—²0iWm°Ëz"‘Ⱥ:1•SptîÍ7ÿÐ;«kÛ­'ÝÛ’t.BqU3ûb=‘x™v_¢€#ÍÈ4Û¦·¿"å¬'í¾‹Ð„í Óu÷Å?8k²öóøùyì™÷Oÿ0`=‘¯é.¸AhrúveÚ˜[§Ê$Q Ý—¨!ÓH6Þ)GÖ©ôÚÒî»A{×ot`§ ÓŠu÷ÅŸZ;úo/BFvÁŠî‚¹`ÓÙ„ôrþR3«;º­Ç¿ÐîK”‘o¤¯ŽÄ#÷¬Çñ/í¾-/½×)À4aú°õD"ÆÊ´ÍO,`#æÆço+<šœ¶žÈwt 뻘¾áß?.¥äЗ?Z#þ¢Ýd‰ÇÛ#ýzz‡¬Çñ#í¾Zî›E4^¾?í—l=‘ˆ[\mÞ^?çæv,ZYX첞È_tL\½²5ÐÀQXX(;ÉXO$¾£Ý+$¹Gú‘$!yh=‘¿h÷MÐoi¹|y/½Ww_äŸúúGV¯ÛËšð³"½¼§wÈz"¿Ð]ˆ²ék׫>þÎ9 ë_;ÌË·žH|J»/¶H?2GHV~tšl´žÈ/´ûQF§]ñB…Sq麺û"ÿíDË/‹W;+³nÓ'—F¯XOä}º ÑÄ Oʨäƒ?ùâž–öóÖ㈯i÷Å HBò§H6’Öãø‚v?jè±´Y§ÖÒoõÂEîÑôµë…{¾y0ávgÞ²ÿ̱ÊËt¢£¯$óÕZ>õÃO}øé÷zÕbN»/.A’Šd#’òLZZOäqÚý(pÚìË|j:­Ú¬È ü16‘õúa–ˆŸG’‹êÿl=‘gé.Dù­¢¯9sãó·ã_­'ù‹v_\…l$!ÉIÒ’ÌTTFŽv?Òh­tW§ÄÒfõ˜EÂÑÓ;””Qé,Ôêu{ûúG¬'ò Ý…ˆª©ëŒK)á ¿ôÊ¡s}­Çù›v_\ˆœ$-y™‹W“ŸÖãx“v?rhªôU§¸Ò`é±Ö‰xđƞE+ Ù¬û—îxùÏ/‡¬'òÝ…iëü5ymß6!½\ŸW\H»/®Å³$9yŸ¤hKûyëq¼F» ´Ó 9_ÐTù¶´Vº«õD"^šœÎ{ïļe¶l~bAéþV뉼CwaÖ \ݘ[ç\„Šƒm¼^ë‰Dþ…v_ÜŒä$?IQ^)‰J®ZOäÚýYG/¥òUiªôUÝ}‘Ⱦ4ž‘]úñóèÓï6·Ÿ·žÈ tfÑÕ‰©§Ü< [ò‚¼Xë‰DîèHc•?­¹#R”,å¡’«²“d¬õD^ »?‹è¢q)%N5¥£êî‹DGç™ÁåÏ—9«—–µoà¨õD±Mwa¶|Öн$m73}ßÎýn=ŽÈ]ìúàÏ•?­¹ •\å¹’±$­õ81OwVÐ?i¡N¥—ÒN­'ñêÚö…I»ØÁ9ñù[ W'¦¬'ŠUº ᣫ<»~ŸºŠÄý>(±…t%cy´©™Õ¤®õ81Lw?LtNš'ý“ÏH¥‘ZO$â_ìcNÁQíc˜tÂ14<¶%/È\XP\ÕÌ›´žHä^é÷A‰9d,IKÞòtÉ^Øz¢˜¤»Ú&“Hÿ¤…êÁÀ…Ñ´¬},&?K×”vž´ž(Æè.ÌLhrºâ`›s6æÖñ­'ùôû Ä(ò–Ôåõ’À¥û[Icë‰bŒîþÌÐ0ãŸ+u 'ÍSw_ÄmZ;úãRJœ%ÍÈ®³ž(fè.Ì@°élBz9ß-ymUG÷`8ÿ«?°š7 endstream endobj 319 0 obj <>stream H‰ìס€0Áh„"é*–2h&àãa˜Û¯ßÞœÀŸóÚöãÙ¯ð*=Фšô @“hÒƒMz I4éA€&=Фšô @“hÒƒMz I4éA€&=°º·Ï endstream endobj 104 0 obj <>stream H‰ì×1+…aÇáÏ`÷ ”3Û)‹OpFe´Ê¦, JVYÌJé¤ea>‹·ýÐIIÊpÜ&eõêyr_×ðÌÿgºûÇõ:9¿è¬Ç[z©]ÞÜ/,îÇIššÛ>8nJÏùƒf8ÛÝ‹?NÏï^•žz€Šôή£•â0E7E=•žÓšÑÃËòZ/þ59³¹µ{ñöþQz|уT%Z)Š)º)ÎS4T”TéE-XÙèÇw–VïFÏ¥·À7=@…"£žâBEI•Þ҂ǧ×A3,½~ÒƒT+*Jªô ø·ô @Nz '=“ÈIä¤rÒƒ9éA€œô @Nz '=“ÈIä¤ù­OÕœ; endstream endobj 156 0 obj <>stream H‰ì×ÿOUuÇñ¿!Ãa›‹¾øC+1¢1 R[³-¶pÁh-Ýj©³tc³–[MßAjHêü+¤Dë®AôE¡²ØmM`˜ŒyWÌAÃPäâUzÖY¬i)÷¾Ï=çõØÝúÓûœ{ÎûõúLNŠØ(ÛõÍ-÷òm=ˆÈhïìËÌÝË3œšUÝØrÊzœxòå·=Ü7¾­‰gG³×ÕrÓø,Z±-ØÞk=‘ˆ\WUMpAZ)oëü%ÅÛ›Ãë‰â€ráé æl¨s¡6Ða=ŽÈÓyP<€=Ì6æI^µþ ûÙzœø ÜŸ=š$}’VÉ£aÒ3­'‘™¿~áÕÀ¼Å…¼¹IKË4uZOävÊ…Y:7:¾¹¸)!¥(1µdë¶c©Ü‰_Ÿ¶tß‘Yá¼ÎÏæ×Ÿ·žÈ” Ó;þïN(ðýu0d=ŽÈœÑyP¼‡-=µ±ÙÞÖ㸔rtE£Sé4Ië‰DäfE._)ßs<1µ„÷šoþ欇råÂõ„z‡Vçææ$gT¨oÓ“#£ó x»šÍÞæñf‡³É­'råþRcñ¶á‘±¼—>äçsgfesëië‰\D¹p­óÂoìh!RŠ67ñüXO$2÷tco³½Ùálrö9[Ýz"Qî_‹fH?tŠ"Q¹/âU'{|r—ó²/ËÛ겞Ȕ W© t,Z±{²jýÁîРõ8"Ñ¢ó x;œMÎsÎVg·[ãÊý£ Ò rHK¤+ZO$"Qw¨ñ§¤¥å¼õónÜÚpþBØz"cÊ…)í}ËŸþ+R³ªY#]:ŠO°ÏÙê<ílxö¼õ8ö”û =6ÈÝ Ò­'‘Ø OD^¯<šRÄXVZU´žÈ’rgúGÖn p¦—ñ<ð„XO$u:аÕÙílxžy¶=;ßz"KÊ}ð<й´A:¡r_ÄŸÎŽf¯«eð¹ç±Áö^ë‰lø<.Ž_ªÜûS64òTXO$#:Šß°áÙó<öì|6?ûßz">Ï}ú­Ï©ô@很ttõM­…Ç×Ôôüa=Q¬ù9_tÝ»òm.ÿÑgöÿÜý»õ8"1¥ó øÛžÏÃÏþ'¬Ç1àÛܧãÑôœÊG÷£ZO$".²ÿЉ…ée쇄”¢WJ?»8~Éz¢Øñg.вžÏéGš:­Ç1 ó ø›ŸýÏ+@ÖãÄ”sŸ^G»£ãqáô=ZŸõD"âFìŠ[nýgWÔ}ò£õD1â·\ÛTÐÈ%ß–VZ¼ó+~wë‰Dlè<(>Çþ'È^rt°ž(Fü–û4:z—LÇ£é)÷EdzgúGV®y—¥Áçþ'vvtõYOuþÉ…ðDä÷¿OZZÎõ®Ýà·¶žHĒ΃"“ç>‰À»@:$…õDQçŸÜ§ÅÑåœRG»Sî‹Èì5·ž¾{ù[ÎÉ}ñƒá‘1뉢È'¹ÀoššUÍ•fæîm=ñ›õ8"öt™B.¼$ya=Ntù!÷inô7§ÈÑè<ÿ›ŠH”TÕºCƒ9ê¸ÆäŒŠÚ@‡õ8"n¡ó ÈUȈ»©ä½ 5Èëq¢ÅÛ¹O[£³ÑܸÆÄÔºœõD"ßÎŽ?÷òGó²UnøÍ†c¿XO4÷<œ ü|¯UMH)"øƒZO$â":Š\Ë Rƒìðjpx8÷éi´5®ŽæFóäÏ'"&B½C=µ‡õÂ'={÷Éžë‰æ’'s!rùÊú¶äŒ .-gC¿ õD"®‹óàŸ ¬òùË endstream endobj 320 0 obj <>stream H‰ì×1€0A A$®h‘3 *`&·[|ýíÍ °¿ûÇy½û÷>¥šô @“hÒƒMz I4éA€&=Фšô @“hÒƒMz I4éA€&=Ф e 0yïÏ endstream endobj 105 0 obj <>stream H‰ì×1€0A A$®Ò"3ia˜Û-¾þöæþhœ×¶Ï~}€WéA€&=Фšô @“hÒƒMz I4éA€&=Фšô @“hÒƒMz I4éA€µ[€ÙÏ endstream endobj 157 0 obj <>stream H‰ì×ïK•wÆñ¿ae”0æVPËr‚¹,ö ’­Q=Hö`aƒ z²±z|g‡Â­Ö‰¦Å½Ð?0(­KL &$çï œá7²N$â:ÝE&ˆN¡YèZ†®¡q¬M‹?zŸõÅ‹Ž1V™z_DâïǦîåëJ£Qæ¦#ÝëDSäƒ^¨®½ºdõ¾EVαkÍ·¬ãˆxƒîƒ"“r½¥‡–á­¡qèë8SçõÞgq±»¢Œ%vå§.ëD"2«ÑIé…œHs“ó·ï©é¶N4ižî…Ë]k6W’?ymIíùÖqD¼D÷A‘) kR²ñîÐ>tuœ©ðnï³²ØZ,.ò?µ¢ fHDdܽ¡û»ƒgžN‰©ÁÊêëD“ãÑ^èùµïµ7>'ù“iûÞ©øŽ_Á:‘ˆÇè>(254½CûðÑDô‘u¢ÉñhﳯXY$gq±»Ôû"âêàåW«8¦ø<ûâÁ‹—;¬M”çzÁëE,âÝE¦ƒöÉ}ë ^"úˆVòÐõÄs½Ï¦bYE'VVÎ1õ¾ˆ¸ìïG×COYÞê…Úó7’×–xÍæÊË]ÖqD9ÓH7ñBÑS´•uœÇðDï³XPì(¢²©*>þÁ:‘ˆÈäô oßS3÷á9–”^èòýÅý^è î œ¡SƒÒ:ž­u"?Ð}P$†è&Šž¢­è,šË:Ñr¿÷YMl'B²£XSê}ñ®ÎîHæ¦#h|–¯+mlþÙ:Ñ#¸Ü #£ceUõÑRزãTûÍ;Ö‰DüC÷A‘˜£÷i+Þ,š‹þ¢Å¬=‚˽ÏRb/E‡ J½/"þ ·.Î,ŽnsOôF­ýƒ³½ÀsK[_N¶Œ á†vë8"~£û È ¡³h.Þ/ZŒ.³Žóonö>ëˆK¬&Ÿ›ˆÈ4¾ÿíü”N¹yˇ¾³Nô{¡­ãvö¶ã¤Z¸ªèèÉKî<+?Ñ}PdFÑ_´oF¯YÇù‹k½O˳‹XG¤b)±—Ôû"âWwû†¶î:=gi'Þ¢Œ¢šsMÖ‰Æ9Õ <¢7‹¾¢’óù ÿ´N$â[ºŠÌ´?K;¥æTï³…XDäa±‘yD""3êzKOÚúrŽ>>+³·uܶÍãN/|øÙ•…«ÆK!{Ûñæ¶_¬ãˆøœîƒ"ñA£Ñk¼ntMgÇ•Þgÿ°‚¢sˆ]Ä:²Í#"g5çšžY¹Ÿ3pÎÒ¼­»Nßí²JâB/„Ú36T#%ëP(Üj˜DdöÐ}P$žh·Ô—Êxéè;ZÏ0‰yï³yX>ìb<ýÂ~‘U[ÿì}74oY€ópÁó%\4‰aÛ Ý‘œÝŸ )½°¬ªžgbCdÒ}P$Îè8šŽ¾ãÕ£ûh@“¶½ÏÚaó€ýà RôF³·ç`ä³8³8ns«^è”Ö%¦ùß_ß[Ësˆs‘YN÷A‘éù]€Ÿ4ýÛ endstream endobj 321 0 obj <>stream H‰ì×1 €@A A$®¾Ef’÷ ;S\}íÎ Ë8¯m?žýú¯ÒƒMz I4éA€&=Фšô @“hÒƒMz I4éA€&=Фšô @“hÒƒüÅ-Àâ'Ï endstream endobj 106 0 obj <>stream H‰ì×1€0A A$®h‘3 *`&·[|ýíÍ °¯ûÇy½û÷>¥šô @“hÒƒMz I4éA€&=Фšô @“hÒƒMz I4éA€&=Ф i 0{Ï endstream endobj 322 0 obj <>stream H‰ì×1€0A A$®Ò"3 i€™Û-¾þöæVŒóÚöãÙ¯ð*=Фšô @“hÒƒMz I4éA€&=Фšô @“hÒƒMz I4éA€&=ð·JnÏ endstream endobj 107 0 obj <>stream H‰ì×1€0A A$®h‘3 *`&·[|ýíÍ @ÝýŒã¼ÞýûŸÒƒMz I4éA€&=Фšô @“hÒƒMz I4éA€&=Фšô @“hÒƒìf 0ãIÏ endstream endobj 323 0 obj <>stream H‰ì×A €0A A$®úEf "JÒdg÷¼ÿι޸Ÿã¼¾ýá€}éA€&=Фšô @“hÒƒMz I4éA€&=Фšô @“hÒƒMz I4éA€&=È.^· Ë endstream endobj 324 0 obj <>stream H‰ì×1€0Ä@ A$®º"3-CÍœÀNã~Žóúöï#l¥šô @“hÒƒMz I4éA€&=Фšô @“hÒƒMz I4éA€&=ФÖ{ Ï endstream endobj 325 0 obj <>stream H‰ì×1 €@A A$®¾Ef<|$;S\}íÎ ð?ã¼¶ýxöë#¼J4éA€&=Фšô @“hÒƒMz I4éA€&=Фšô @“hÒƒMz I+n…CÏ endstream endobj 326 0 obj <>stream H‰ì×1€0A A$®Ò"3©a˜Û-¾þöæà¯Æymûñì×Gx•hÒƒMz I4éA€&=Фšô @“hÒƒMz I4éA€&=Фšô @“€µ[€í{Ï endstream endobj 327 0 obj <>stream H‰ì×1€0A A$®h‘3 *`&·[|ýíÍ {»Ÿqœ×»àSz I4éA€&=Фšô @“hÒƒMz I4éA€&=Фšô @“hÒƒMz g 0UÂÏ endstream endobj 298 0 obj <>stream H‰ì×ÍKTQÇñ¿!D„6­Š`DPHm¤Z„àFjÑB¤ZHf¥½ V˜.RZh4“½ˆÚÛ@Tf‘½X4TH*Ê”šŽM?â@P:sï=wòûYÌjîóüÎÃÓLÂi£‘‰]û/­Û\·¡°©+8l;N²áì…ѯí I݆îDat?º%Ûq€ÿÜ­{oõÜôk;À˜ €—úÃïò¶·êÑín ?þ`1‰öAÝ€îA1¥-º‹I€µƒ¹01Å­r õô*\‹Æ¬Ä°»êÔ:»ètº+1€5ˆ¹01+¦cߪê®éõåä«oœ‹{ÀÖ>¨“ê¼:µºWÖ†tÖ8æ>ÀÄ\,z>ú¹´â¢Þà¦mg.÷ŽxÙÚÊ>¨3ê¤ê«Sëì^¶°Œ¹01ë®ö½ZÞ’JÊÚŸ¾ŒzÓÔã}PçÒéÖýÚ|ƒ7_xÓÀŸ˜ûsðƒù…ï'Úî¯ÏoÐ{¬¬ OθÝѳ}PgщÔK§ÓuR·;ø æ>ÀÄ\ü#:þu_Mpyu:ÕŽ/&ÜëåÁ>¨ü:Åò’«sEcîõ°BÌ}€‰¹øÍ“‘O%eíz˜Ò–ÐÀk—º¸½*¹ò«ÅÖ=t"—ºX-æ>ÀÄ\ü©+8¼±ø¤žç޽£‘ Çë»·*­2«¸òëŽ×æ>ÀÄ\|kv.^ß<˜8šµåHu}ït웃ÅÝØ•P9•V™ŸP~‹ps`b.>ù8U^Õ£wš[ÐØÑ=”XúáHYg÷A¥R6%TM¥UfGÊps`b.!üøCþÎsz­úí¿K¿ ƒû òüÎv÷áûô ps`b.™"±ô££{hCa“ÞlyUOäãT:ÕÙ•AITG©”M Ó©ÀÌ}€‰¹d–/3 ßÈÚr$;pôPSßì\<µ:iîƒê«îÊ $Õõ½J•ZcîLÌ F&ví¿¤Ç»±ødWp8… éìƒê¨¾ú\”$… laîLÌ s]¿ý&PÚ¢'\´»íѳ±U}›Ú>¨.ê¥Õ74ðzUßðæ>ÀÄ\2Z|1ÑÚù · Qy_Mp,[ᇫÝUYõõÉúüuTßT#°‰¹01€ÿÀøäLemHo9'ïXãù»ó ßÿùÉÊ÷AUSMUÖÿÕE½œˆlÓO2*ö endstream endobj 299 0 obj <>stream H‰ì×ÏKTQÆñ¿!0LZ aLÑ¢…F ´© 䢅!!´0t•B3b‰J a‰™ý !Сš‚Y˜¨¨–šŽ öÄÀpbl,ðÞ[÷~?‹Ãsß{æÝÞ­-À»?ÿ´çP¥V§üÈÀ5Æ£3§ÎuèFç4ööGÒ×¶«Rkú2£ÓTy²èŽÎß½f8ƒÜ˜ÈÀe’œfÃ4ÜŽóà_M—þä>ÀD.¶QwëY–?¤Û]ZÑ7;¿”Z“fT½¾Ò[PÓ2¬Ó¬o€MÈ}€‰\Üjrz±¤<¬ ~àX]K×H|}Ó|»í<¨Uª^¯ô­N°·e–#÷&rp·×o'ŸmÓ5÷š>ý˜ÜOõV5ÚTýÈØg'š`9r`"/èeçÕ벟¹p7›ÛúuÔŽöõS5ªtºY"÷&rðˆå•ø•k™¾êŒÜªË5®ÞÔÝתgíh_o¿.­9Ý&k‘û¹xJlb¡¨¬G·>ËJ®…ïißéÖØÜ˜ÈÀƒnv¼Ú{8¨»¯UÏN·À>ä>ÀD.ž›X(*ëÑ­ßw¤úçêiÕŽön €È}€‰\§ Q÷:¿°}42õ»²4ó`›wÓ:A5:MgZÓ,»‘û¹¸Æxt&PÜ©}ðDCo$}ñŽó`‚ÎIL—:Yçï^³œAîLäà_¿—U>Ð]Îò‡‚MCË+ñ?ùÃyPtšÎÔɪ׿è¿v£eÖø!À·åP endstream endobj 300 0 obj <>stream H‰ì×ÏKTaÆñ¿!B7® A1t¡‹$„”@@7‚Q´ÉI” ¡ÌŒA!-)•Ä…JÔ€„•„b˜†•fø#ÇFí»y!HgæÎ½3Í÷Cˆ÷=ç¼ðòpö÷ÿíÙËÙ#'®ëçH äÔB;áÖ®±Œü&=äóu} Kk‡ü°ñî }¢Ÿ‡ü{\ué‰>Q-UTÝh[à&r`"€ä5ìŸË=Óª'\Xîó#ú6Ò}Т*ª¥UWÕ#ú@" ÷&rHF3¯eÕÝz¼™Þû}“QœÝ>hyÐÿFuõ¹zP'QœÀ-ä>ÀD.ÉåçúöUïó£97ôO¿è¿ÑË>hcFîLäD:z&2 ¼z³eÕÝ?}å¨÷AK`~Eèu¥Þb9 €3È}€‰\’‚Ó²ëÕ³:Wÿ6Àä>ÀD.‰©oh*«¨Yϳ¤ªóýÌÛÏÇ>hQ·êY‡«MaûùbAîLäh&§‹+Úõ0Ÿº582§*ñÛ-ê<ûôm•Ð,š(NUDŠÜ˜È q,[¯¹öTOòX^ãMß«_Û¿ãW+Þû ¨M¡YTHsiºøÕpHä>ÀD.‰À\.\îw`ur`´h–‹WœYrˆÜ˜ÈÀuƒ#Ó9%wô‹+Ú'§)êØ>hÑ\šN5©æu¦(€¿‘û¹¸èÃìrIU§Þ`VQs÷À['K;¼Z¾Ó¤ª«©5»“¥XÈ}€‰\\±º¶UçJË®OÏmð´Œnl†nÀ•}P4©æÕÔš]7 {p¸ Å‘û¹8,¼»×öðuF~“ž^emo`~Å•6ÜÚ-ÁÏ?4»Ð=è6t'®´¤ r`"' ûçòJÛôèNž½çºØ‰»û E7PXîSºÝŒ‹©ƒÜ˜ÈÀù•s5ôÜ2 ¼=áÝ=wûI„}Ptº ݉šÑýè–Üíøï‘ûHfó³:. endstream endobj 301 0 obj <>stream H‰ì×ËKTqÆñ¿!$!\ÂH‘-ÚÌ¢ !‚6ˆ‹@pcJ©‘(C+°$ÊZT0,³;ET.2hˆ†Š¨Hq˜ðÒLŽÖ#êGwÇ#ï9‡ïg1èî9ÏË—÷ëW~»zçÅŠuõkˆ¬O“¹ý×Jcí%­û:õ¯u¢‡OÞÒÛׯu^EêG-é€TD{àb/˪/9²fS—^ÙŽú‹©ô˜uœuzÔZR*5¦Þ¬ãÑÄÞ¸Ø À2¹÷èuUMÞW,ÞÀ'À{ÐsýÞK5¦ljOZÇ¢†½p±ß½}Ÿ­mJêe­ÞÐqâüƒü—‚u¢ßì=(jL½©=%T“êÓ:ì}€‹½øèsn¶íø•ëéYíméÏL['ú£ ߃žLvF*¤úT«êÖ:ì}€‹½øåÊÀèÚ­Gõ â{Î=M}°ŽóÁ¿=jR}*ªºUÃÖq€Ðcï\ì`ét³lÙu&\7KXîAOrð™ºU`õ¬¶­ã!ÆÞ¸Ø ÀR|ŸÜÛÒ¯G´rý¡®ž»Ÿs³Ö‰þW¸îAQ·jxUåaÅVçjÞ:Jì}€‹½'ÿ¥pìì}ï<©mJ¾}ŸµN´8¡»=êYm+¹šWÿš‚u" dØû{(BÿðóX¼[o§ª¦çÉè;ë8Åé=èQç›wžV~MA³°Ž„ {àb/‹’Jm¯» WS^èKŽXÇ)^¨ïAú×ôšˆæbö>ÀÅ^þS&;ÓØ6PRÑZkoN MMç­-IîAÑÖD4MG3²N{àb/ÿT˜›ï½ô¸lc§Ëî†Ëé7Ö‰|{У‰h.úÍH“Ò¼¬ÁÅÞ¸Ø ÀßݼŸ®ÜvJÏD¿úÛ:Žo¢tzn?|ÉIþbï\ìàOÒo&v7\Ö)ÛØÙ{éqanÞ:‘Ÿ¢wŠf¤Ii^ú4ÍN´N{àb/¿ššÎ7'†Jcí%­m™ìŒu"ÿEòô|šÌijš&¨9jšÖ‰€aï\ìà'}É‘òê„ÞÅöº ©ô˜uœåá{УÙí¨¿¨oÔ45Së8@P°÷.öðÝ“ÑwU5=z±xwÿðsë8Ë+ò÷ GsÔ4õ¥š¬æk°ÇÞ€`ú&ÀYˆ=Å endstream endobj 302 0 obj <>stream H‰ì×ÁK”Q†ñ¿!B„ Z‚bT 7³*¡à"DÚBš(J`Z†L„•DC1)‘R„‘„" Šh˜(†™£ŽÚ q)*9ó}ßó[­ÀÅ^@p¬¬Æ¯ßy“[ܨæ+ª#“Ó ÖY ø{0A ¨ƒªP*Äz" åØû{¡È BmªýÈ©ŽþqëqìñüE=¨ † á?Cø{àb/À÷Fƾž<Û¥Î÷m¾yo=N¦à=øµ¡Bt&ªEÍX¤ {àb/ÀǾ-Æ.4>ÍʯÝ[påbÓsýÓz¢ Â{ðO*D¨5£r¾ÄÞ¸Ø ð¥øúÆ­ïönRÞ§+ïMÌYO”qxþjQ3:õ£ŠÔ’õDÀnbï\ìøOÿÀø¡7vÑñöýŸ­ÇÉP¼ÿM娑ZRQÖ㻆½p±à'csgÎ=TÒ¹Åí÷ÞÆ×7¬'Ê\¼ÿKý¨"µ¤ƒRWªËz"`°÷.öüáûÒJ]kova}V~íùºîù…Öe:Þƒ[¤–T”ºR]jL¥YOì{àb/Àº8pìªJ•w~±Çxn‹ºR]:1•¦Þ¬Ç’ÇÞ¸Ø ð´Á¡©’²°.µE{†­ÇñÞƒIPc*Mç¦êÔžõ8@2Øû{53»XQQ½9E Í}˱5ë‰<†÷`rTšzSu:=¨­'¶‡½p±à9îä•—žðyrxS{:@u¨Õ¤õDÀV±÷.ö¼%Ú3œWÚ¢hKʃCSÖãxïÁSêPǨ&U¦õ8À–°÷.öÒá§v¦9î endstream endobj 303 0 obj <>stream H‰ì×ÏKÓqÇñ¿!D/BP" AtáA/‚B°KÐ!°)Ša„™0 Ò0ȶC²$j d8ªQJ†8ÑJfþÈ­•¾i†ÛÞßíû|_ì"/>Ÿ×?ïÛ‰-y›œl+«é †¢øîÖyó±S_ë yOmT'u˜ê§Zjø‡‡OÞª®úZ8ÂÚúöËWq}­ƒ{ZMlùü!=`Š+:ü½›IëD…€}0ƒÔI5SýÔ‘ª«j¬u"`OüÝù"™J÷ M–Tvé™ÝÔ:²OX'*샧~ª¥:U5V½U{­ù*™õÔõëu]݈LÍ[Ç)4ìƒY¢®ª±:[µW¶Žä™wï?Õ· ëE]ZÕ}ëÞsë8…‰}0«Ô[µW'¬&«ÏÖq€<°¶¾}©{¼¨¼]ÿôƒþk¨`±feîvpº´ª[KJ}ËplnÅ:NcÌ 5Y}ÖQ«Ûj¸uÀq"SóÕ ½™+Îö…#³Öq\}0—Ôju[®ž«íÖqGXˆ'Îù‚z'—Tvõ M&SiëDnÁ>˜cê¶®žëØÕy5ß:`fc3éï(®èÐó¸µíÁjbË:‘»°šPÏÕv¼š¯þk ¬¹ EŸ¾¦W±·yp&¶dÇØ ©ój¾Î_S Y°ŽäÈtt±¶q@/ág®ßmǽØÍ©ÿšÝ‚&BsaÈ¢åë.éõ{ÌÓy5ðôëö7ëD®Æ>èšÍ‚&Bw¡éÐŒX'2,™Jÿzôž¿8_þb샢‰Ð\è:4#šÍ‹u" 3ƽ)÷ÞÐ[·¶q`:ºh?±:¦C3¢KѼhj¬ã‡›[ñ6ê}[VÓsgô…uü†}Й4)š]fGdøo«‰-Ÿ?tôÔ•¢òvïÄÆfÒ:þÄ>èXšMfG¤9Ò4Y'$ýýGàî³’Ê.íM­#s>['Âß±:œfG¤;Ò4i¦4YÖ‰€ý„#³žº~½`õLÍ[ÇÁ~Ø3gW€:Ò¬ endstream endobj 304 0 obj <>stream H‰ì×ÏKÓqÇñ¿! !¼x*C‚<½Ò% AÁƒ”¿Hf+˜i°‹X J ‚T2¢-p” †Êb2ÍM§ö:DWäööûý>‡/xÚ>>?|ÞÇdzøá{¨näÊõGúÎ.®sK®¦îÜ©WkYU82±œ?<²ž'è:¯óÒ×zœ@5©)•¥óRejÍz"à¯íL¶#<ãöø]úÞèOë‰p*ìƒÎ¢²Ô—*Sk*ŽÐ`n,/¯ÔZQß<žHnZƒ3`t"U¦ÖtpêNõYZŠÿ¨nÕ»4X;ôúíWëqpfìƒÎ¥âÔŽO ªDëqà!këé¦ö˜Þ¢¥•ÃÑ¥Ü~Þz"œû £©;Õ§uˆêQUZO—ÛËô Ï—Tôê ÚÒ9µ±•±žçÇ>èjP%êU¥ÚT¡ÖÀ^M¾vó‰^ž·î¾ø”øi=þû k¨GU©ÓT¡êÔz¸Š^›7ŸóÚtöA—Q›*TgªZÕ¬õ8p¼­LKç”^˜%½Ïö²Öá°º U§ªU'«rÕ¯õDp¤Ü~~8ºt5Ô¯‡eS{lm=m=.û [©V5«ÃU¿ªX-[O'™šû¬Ò{²ºaôýÇ5ëqPìƒî¦rÕ¯ŽX-«hëqà‰äf}ó¸Þå5ƒc±¸õ8( öA/PÅjY­®U·õ8¸¤¶3Ù¶îi_ ËìéÏììæ¬'Ba±z„ZVÑêZu«q•n=.‘üáQdb¹¬*¬í ±u2¹š²žÅÀ>è)êZuëÄUºzWõÖÀÞ»o¡º½õ]\±ÅÃ>èAjü_ïjßz˜I®¦['õ2,­ˆL,ç¬'BQ±z“JWïª^§¯@÷€õD(ªÝÜÃÇsþ`/ÐÕÖ=ý+ýÛz"`ô2U¯öuèÐm ;Áz"ÃX,^^3¨Eàö½h"¹i=̰B7€îýèNÐÍ`=.©? ™ ¶ endstream endobj 305 0 obj <>stream H‰ì×ÏKÓqÇñ¿!B/ a"(”‡vè B—A!ˆ ê ¤‰2)J-XzÐúA#B„JàÀƒYä wPX˜“láÏéÔ^°è`%:·Þû~}>cßÛëðáÉç³³Ü`<2{ú£c§ny¼¡¡Ië90Öúàƒ~­‡À˜j &è0¨ª„õdÙLèH¨*†õ"dÁÚúf{`$}Íkh Í/,Y/B¾à=ˆ]ÔUB§BÅP7TëEÈ\ðÕÇ“gïévW]×ýþSÜzò ïAü•Z¡bèl¨jˆõØDtÎëëMßèžD¬ç ñÄÔ ÕC'D%QO¬ç`_« !Ýâ ËZš;†—W’Ö‹§xboª‡¢’蜨*j‹õ"üSr#ÕÕ7Z\Ѧ˛ïÚ‹™xÂzòïAì‡J¢žè¨¨-*Œ:c½» †§<ÞNÝÙªj᱘õ8ïA쟪¢¶èÀ¨3ªõüþZS߯{ZI¥ÿqðõ8ïA” £ÎèØ¨9*õ€#íÇÒúMÿë‚Ò¦ãžÛú£OëEpÞƒÈ@:;jŽÊCvL¤¶¶{ž¾-©ôë>_Sß?ýù›õ"8ïAdLÍQyt~T!µHE²^pT„ÇbUµÝÄÊÏ? OYÏSñÄ!©?ªN‘Ф.YÏp¹Ø—ï¯<Óí«¸¢­«o4µµm½Æ{‡§ ©E*’Î’ê¤FY/p¡å•dsÇpaYKAiÓÕæÅĪõ"8ïAd‹Š¤.©Nj”J¥^Y/p'¡'ÎÜÑÕÝëëˆÎYÏKðDv©Nj”•z¥jYÏp¼ñÈlu]·îW¥ç&­çÀUx"T*õJGKíRÁ¬ç8ÒüÂÒå/u§**omŒ¬­oZ/‚ÛðDލWª–Ú¥¦Ž©fÖ‹ƒ«þÞƒÈ)µKÓSÍÔ4•Ízüá§’̽. endstream endobj 306 0 obj <>stream H‰ì×ÏKÓqÇñ¿!ˆ^<ƒ!ˆ "ÔA!„.RB AÐAÊ)Ša?Ô‚¥¡´Ë"T‚L#W¸ƒÃT2²…?r6¼d]„, Ûû»}ŸÃØ÷ö:|xòùì쀣„G¦½çîŸ8}«²¦g":o=¹¬õÁ+4ýZA.SÇT34•M}³žàPS±EmŸnMEÃï¬ç ÷ñDƨi*›Î›*§ÖYÏpåÄzC`ÈãmÊ/n tŽ®®%­Áx"“T6õM•SëTýôÍz\„÷ 2O•SëtðÔ=ÕO ´^`c82Srá¡îEåÕÁÈø¬õ¸ïAXQñÔ=?5P%´žQñ_«êu*,kï}ò&µµm½nÄ{†Ô=ÕO Ô!TUEëEÿÝ÷•í/ó|Ío“þèÓzÜ‹÷ Ì¥“¨ªŠ$ä¶ÐdaY»nàUuƒ±ø’õ¸ïA8„z¨*ê4ªê¤õ€cŸ-¯ê¶ãów Gf¬ç{xÂQÔFRgRµT3­çƒ¹…Díµçºá”¶u÷%7SÖ‹€_xÂiTHuRµÔÉT9ÕOëEÿhu-èÍ/nÑŦ¾1¼œX·^ìÃ{ΤZª™:œê§*ª–Z/8šgCÑSgïé>ã¯í›Š-ZÏ~ƒ÷ œLåT?uDÕRÕzÀ¡¼ý°PYÓ“¾Ã„^¼·žˆ÷ œOUKuPÕUÕÕzÀ>Y©o ëÞr²¤õvðõŸÖ‹€?á=ˆ¬ –ª¨êªŽ««ÒZ/Ø'¹™ºÓI_W®\Í-$¬Ç{YD]U]ubUZõVÕµ^°'<2íówé–ræâ£‰è¼õà°x"먱*­Î­ª«öZÏ®‹/¿Ü¯›IQEÇ@hÒzp4¼‘¥Ô[UW§WV‡­ç×YN¬7†<Þ¦<_óÍ»#«kIëEÀ‘ñDöRuÕ^XVÕdëE8Í®^U½& endstream endobj 307 0 obj <>stream H‰ì×ÁKÓqÆñ¿!D^<ÂDЃ‡"ðàA/ÁèäÁƒ1Bð 䦎i†`bè‚]ıRF&uÈÀQK0TÊ47ÝfÔ%ÝüÌßïý: v{ßßó|¿''(‚l.?6½â© ]¹~ßçÄIëDÀ ]:zf¶vRÖ‰€"â=7P“«ÏuÔÕíjxõ¼u"PŠžÏ~¼vóî 7|O>¬}·ŽïA¸‡Z]Ý®¯žWÛ[Ç%D÷„[wžrO€Ûð„Û¨áÕó:öê|5¿u`lk'ÕÑ3£»AEM_ÿðÂaúØ:pqxÂ…Ôój{u¾¿ú_+`Èe‡Çcžº®m]ÑÍ]ëDÀEã=×Rç«ùuþµÚ-‚u"pq^¼ùìmÒM ¡u4¶úÍ:`ƒ÷ \Ný¯ÐW EÐ.XÇE·ßniŸÔúW5NDW­ã–x¢-Ð"è[Ð:h#¬ã€¢ØK¥ïõ¿,«î-÷»Ãsúk0Æ{øM‹ ]Ð:h#´ N’ÍåǦW*ëúúÞ¾;O$­%÷ ð'­ƒ6B…öB«¡í°NÎkéÝ×Úæí»~ç—Ö­ã%„÷ ð7-ÅéjhA¬ã€3Š'’>D›î© >[ÎæòÖ‰€ÒÂ{ø'í…VCÛ¡D;¢5±NþÃþA&ððu¹7XVÝÛ˜ý±ûÓ: ï—zô¶ endstream endobj 158 0 obj <>stream H‰ì×ÿKUgÇñ¿aå(A,ÆVº‰L‚E)Ë “±áÖÐÁXŽmÉi4ÉÔL±ej_¤L)ÓFÝt[hå&ŽÍ´•º,’MDã&ÊÝü’׬öfgÛ/M½÷ÜsνW?/.Ésžç1xžÏçyøÐ”1ÏTVî¹ÇÖåFÆä—_˜˜ôšǴ﾿Éì|;M†>C«aFÎñ¯;˜TD$¬qrn/hŠø÷䬬í°{FÇrÁ=2ž™ã2þ®½G~pæ¶+"sÑ}P$†d"ÉÈ~$%ÉJ»gt,÷é0ÆßE«¡Û(÷ED|7ìþ3)½Š#”Ï3›÷wõ Ù7—¹à™-9Öf„ÂÖ ƒÃûæé>(:È}ò‘-IV’˜ä¦}s9ûôÚ‹Qcè3Ê}sÚ;ž~ñŸã4%£Æ=2nÇ,vç‚«åzlò¦ØôæÑÎn/¶"âÝEB )™¸¥’In’ž6ÍbkîÓUh,Fuy*±„&cÇ,""KJYuûʸÎÕˆ˜¼{Ï{gf­ß¾\èë¿óê{'|M¾š†.ËÇ‘@è>(šHLr“íI†’¤–oSîÓOh)t§·Ð^¬_Dd)›˜ônÛuvYt.gìªõEµ®«nG.Œy¦²ó …±»?ßßÂú-\D,¡û HÈ"7óË/¡$)yJªZ8¸¹O3¡Ÿ0,]åÃg”û""vèݘz”ÖÏó)‡zoº-ÖÚ\˜½ÿàXÝe#Ò²N±fK†Ëé>(âÈP’”}Jª’­$¬%ÃZ›û´:‰QNh)Ê}»5·ÝZ½¡Ø8xS?újÌ3à€æk‹O9Ìh|·þô[àŠˆ}t m¿ÿ—­älàZ•û4zˆQHh&V]0EDdA³÷U´®ˆÝÍ Ì7?ó/¦G³$úFÓ²N1Î/«»ÈzDÄºŠ„ R•l%aÙ³¤-™Èhç¾µ=DDDÌùc|úíë8Šù¬ÞPÜtñ†¹qÌ…‰IïgÅ牃ˆ˜¼ìüFVenq˜îƒ"á…„ýdÏ7¤-™Kò’¿æÆ 0÷é´£~¼•Y«Ü ®Þ›îø”ÃÆ±¼1õhÿÀ¨¿#’ 5 ]köñúë|Ù×ÇÄ",ºŠ„#Ò–Ìe󒿤°‰Lç>ƒ¦aTº ÄÄì""b‡úÆîUë‹8Ÿ—Eçf|zzbÒëû»æráç_7¼q„c“¸Z®û¹^ >ÝEÂWÓÅä/[˜,&‘ýz×DîÓ+ht ^¤oÔº®ú¹^±wf6§¤ùñgó9«WÆ”U·ûø¢¿¹08ìÙº£W¢â žø‘yÍ.YD‚I÷A‘°Fþ’ÂÜÎØÈä2éìã‹þæ>‚^Á+1y4 很H(sŒ§dÔphóY“°¯½s`ÁW|Ï…»Ó÷Š*Z#ÿ…ÌsY±d ÝE²˜Df/“Îd4I½à+¾ç>-‚.a” Ú…r_D$\tõ E¿TfàIéUƒÃžyö1ê»×&•òäæ´ªk}·-]¯ˆîƒ"‹¹üò;Õìh’š¼žÿa_rŸæ@0ŠÄº¤Rz…¥ë'TÖvDÅr’/ÉÛ^ÐtwúÞÿ>¶`.ø•2".tYdÈh’š}Mj“Ýs=6îÓè 4ž¡EÐ%l[¯ˆˆØŽS=;¿qþS}ž\pŒgæ¸ømd\Ážƒ—æºQŠH8Ò}Pdñ!©‹*ZImv7 NŽ?úÌ<¹OO -ð[šCVî9åþRö—&ÑêL endstream endobj 159 0 obj <>stream H‰ì×ÿOUuÇñ¿¡ÀaâÆÖ¸Õ*”ÇCÉ9'ëË&cc‹eÍiÍ,[›4¾]n†˜€+„HÈÉ$iIJ82CãšELšÄ ƒa€rñ½âlw·@¾Üî¹gÜû|ìîîrî9—Ï/ç<ߟ™£plÛ‹?ðx–^v9:<¿mhêÑq½{tN»J*[#âìúj÷ÁZý‚— ÀtùÇ/ë×»Õ àcª¶Ú­\WÍÕtÏoçí¾fMƨ ™î@à¹Òv3rsñ¨þÕOoNÇçváÂ7¿D'ë`|ri«ã7‹Ö À\ìÀöýýê¸ns5]ewÿO÷5h*0ÆÍ —¯þjÑzþp¬¢euLžžù«Öçd6:§]ž]èîÞ¹ç”þ\·åHU­ÃêÅ0ûA ¨æjºnvõ]•ŸñØjÐ$ y@j6Є`õbþ01é|éÏ|"KÏÿˆ8û»Gõáó†®7mõ¡QÙaѹï¾x{|Êêe0ûA H¨û*»ú®Ê«õ*¾î}Õ_3€>hÐT@÷ Øôö$¤œPŒWx¬M﩯Wë¸ÕKàì ¢¾ïÊ8ã.¾ñŠO.¥ûÌÞû¨)$*ÛˆÂö´ŠÛãSV¯€Ÿ°‚*¯ÖÑWý5X½"€ezûFveœQÖl´é=tvWkÿð[ןY½:¦c?•]}WåÝÅý§þš4X½:€_ML:sŠ.) *Âþœógë;U½§ì=­zE&46ß°z™ÌÅ~jºÊn$^­ww_3€&Íš 4X½L€?TÕ:Öm9¢$¥ŸìîÖ‘†¦ý©w}îêz2©ØHFBʉ޾«× À,ì€§Ž«æFÖ£“ŠUù™w_“À³/WêOÍš¬^/ÀD퉩eFê¾þÙ}ܳ †êºëqv ‰ÊÞwèÜĤӊõ0ûA €©Ý*¸:®Û\MWÙÝ_Íí¾¦Í:¨9AÓ‚ë˜hpèÝkõœ_»)ÿýÒ+Îi—ç·s» :çmûW¡³Y“w¼òª— Àtì@¥j«ÝºÁÕñ·lõKì~ay³æ}¥™A“ƒ— 0ÅÝ©{Ú÷×2ë†nÏ=gÞ.tþs¯Té[½Ýz´¥½Ïü%ðöƒ@àQ©Õk#Ü*¸Ý×´ o59h~Ðaþ’fùââOmû@OõÄÔ²öŽû¶@ ß]ëwÇe{Zżq°â°‰ê¬F±Vµµ1¼ß™‹vÿZ× &£)B³„9ë˜èÇîß“ÒOêIþÈÓ…5ç;>yÑ.ʪÛÂcm:34*û@Þ…»S÷|·^`?Y]VuG¯ÙhS¯>‰Ý×ü ý ÎÔD¡¹Âwë˜htìNFÖ—zz?“—StibÒ¹è%Kì‚è×ö:2[œµ›ò«ë®ûbɬÁ~j±Š¬{YuV£}Þ}Íš(t¾¦ ;X2ÀÎiWIekDœ]í´ý5ýƒcK¼pé]0è—·¾P®KôÚ°£ÈÑ9àí’X‰ý °¢©¿ª°‘ãÄÔ2S»Ÿ~à¬.ÑŒ¡ICó†·K˜¥±ùFÌ3%zVÇ'—6·Ý\ÖµËí‚û?Fn.02”²÷ôèØe]ÀrìJÍUy«Å*ò².÷®ûš.4cèBÍËýót÷ïÜsJÏ營:üIM»¿à] Ç*Z¢suùªõ9™…Îi—?ÀìGUmÕ\ݼêoay³?òº_Uëм¡Ë5{hñâÀz 0“j"2 endstream endobj 160 0 obj <>stream H‰ì×ÿKÕWÇñ¿a¦Xc#HV?Œ-8œ#×ƈüAX!…ýèX[¬@o~ÁÌ­2Ã-›d%®)n+-j»Ôе¦…S¦8nÓ)¦ÓvË=íülåý|>çÓ½¯Ñ_Î9^ø|žï35FF'¶•ž‰OÞɇ_øsvëœþ¶ã™—óù9ëcdçÕÅ,Îg‘„ôÒ†æöÙ­#"+ޞǖŸ¶""…ÂÒY[šKy-vß‘ñCDDÂqèø•K¦£°zSÍÏ¿üÎRavÁèêLͬd>üæ‘DĺŠ<-¨ªƒ‘uªûL ¬Ã4ÂLÎR""òD‚­ÝékªLZ‚á/èHŒ†æö„ôé[jÌâü켺‘щð×—è>(â””žRUžV KgÃ_ÓÁî3‡˜‹*“ óIø ŠˆÈ#ôö¯Ûr‚·îü´’ŠêK“wBŽ,ë`º{oGyK\R€5ã“w– :²¬ˆ8N÷AŸ£¡””甪ÒVßvŸ™„É„5™R˜UYVDDfº=6Ø{n^J!/ÛÜ@ÓÐ𸃋;ÛƒfåcY> —•µ;\\D¡û ˆoÑMêi2JOŸŠî3ŸÄ&0«0±0·8¸¸ˆH”;ÙtcÑòݼº36ùñÖoޝïFŒk?õ½²j¯ÉÙŠµ{û‡ßBDfM÷A¢•Ó¤“†RRÇ·p¯ûL)Ì*,ÎÜÂôâøú""Ñæê>…—Þú¤ñìM—vq¯ Fmãõç_+f‹9‰›·7Ü›ti#y"ºŠø }¤’´’ó¹ÔbêéÒFnwŸ‰%qå¶`†a’qi‘È6ðÇhÎG_š"ìªúîï‰ÜÛËí.€ó¿WøUìýÆ=ûjÑÁÚV÷ö‘Ǥû ˆPFúÈ#I+)ftŸé…†˜g˜jÜÛKD$ÂÌ|…nÜZïÁ+Ôƒ.ü/«²?c/>/¾ùñÅ«=nï(" û ˆPCšhâ¸rýáëþ»žb/¦fW/¹""‘¡ñìÍäŒ}¼9W¬=xõFŸ7›zÖcfø2ß9êAøDä¡t±‹ÒADÊH½Ù×ãî3Ï0Õ°#sŽ7›Šˆ74<žh" óR {ÏÝ›ôøVºþÓÍÛæÜ¯áü´JáñD¢œîƒ"VÐ;ªÇÓGé`TuŸ9‡i‡™‡É‡ùÇ㈈øMèî½ÊÏ/›(¬Ûr¢«gÐÊ1luÁèþõ¯¥YŸr>ÉûÚ:¬C$ é>(â1GéLòh_ÔvŸ™‡0ÿ01 Y9†ˆˆu-ÁÎÔÌJÞ‡¯¿} ØÚmñ$v»`ðm,\Vf™•slhxÜâaD¢„îƒ"ž¡kÔÍdnáÒ2ªgñ0~è>“Oúš*ŽÁ,d÷Ûñ^WÏ ‰Â‚%¥‡Ž_ ݽg÷<~èøJ\ˆOÞÉaâ’Eç­3"‘M÷AÐ2ŠF×xÜh¥³^7ÿtŸ)ˆYˆÃ01Ù=ˆˆFF'¶•ž!±‰”|ß¶O4Í']0øN²óê8Ÿ„ôÒ†ævÛ'‰XºЏŠÑ2µõ¹'Õýÿ3£sÓ¿øä+qÃÑúk/¼±‹7ðêM5·º~·}œ|Õ£­c 5³Ò4}MUWÏ í‰D ÝEÜC¹è— E£k¶Oô€»Ï\ÄtÄ©˜”˜—lGDÄaÁÖn…äŒ}¾zý>ì‚ÑÐÜ>?­„³Å,ÎÏΫ°}"‘ˆ¢û ˆ¨Í¢\<_Tì‹Óm¶Oô_¾í~K°“I‰³151;Ù>Žˆˆzû‡7n­7E¨¨¾4y'dûDáÛ.€olGyK\R€ÎM)Üsø¢íùß¿ å ê^ endstream endobj 161 0 obj <>stream H‰ì×ïK•wÆñ¿aÍ‘B,‚Un"!©„ù`>PX¸õ ¨öAˆ HRE§e­†YÒlÌ ÜÆ™±­Zµàl£J#¸!¢a¢œðçQ«½ç÷ÉÆlùãèç¾ïs½8ˆ¯ï¹9÷u}Ÿ=™²×_Z_Ä_ë "ÁQSNL-å—õÊë%…ÕW¢SÖ‰fðÃÏHÈ_ë 3àûì‹_V¦—“p×þ¦îÞˆu"‘yŸ,9öSÒt)ä†úG¬=——{ÁŒŒæî9GH>¯nþôú¯X' ÝEbˆn¢¡\UÑYêý… ÷ÙN„dG±¦ØTÖ‰DDææbsÛº¬£¼Ç²wž½ÛñÐ:Î x¿œÖöž7Þ>æª6kÇ™îÞˆu"Ó}P$&è#ZÉÕ=E[Y'z¿ô> ŠET6ËÊ:ŽˆÈ¬ðîÊÜVç¯w—_zÁ©¿Ø²"­ŒÀ/'}76>iHįtY :ˆ&¢ø)ÑMu·¬ÍŠ¿z¿éûv6ÙW¬,ë8""ÏÕ×?”_â}•”ZZY{ÓG÷õ³éþÝWz)Áoý+â5ºŠ,íCñ#â>H+©÷ß-ËÊ}Ûl-—u"‘‰NLÕÔ‡Ýkj×þ¦îÞˆu¢¹ñ]/8|ÏY;ΜÏú¬£­í=Ö‰D|F÷A‘ù¡qèW@4‘zið=³²HÎâbw±¾¬‰ˆü-tõ~JöqÞN[k[Ú|y%ñi/8á–®µ™Õ®”sv7ôõY'ñ ÝE抖¡k\é¬ÙREY'š_÷>[kó»§ÈÏúbƒYÇ‘¸ÖÑù(wÏ9× M­ÖqæÏ×½àÔÔ‡SK9EBrqaõ•èÄ”u"Ð}Pdöhú…–áWCãÐ;Ö‰æ/½Ïîb}q –{Ì:ŽˆÄÁÈèÞ’fJayÊáƒU—‡G¢Ö‰$½žÂûŸ|³lCgY™^ÞºcHÄët™%:…fá÷BËìþøkõ¾ð¹Êc±ÊØfÖ‰D$.L=yzúüíU+x‘n/¸ÐÙ5`(‚Ñ OdSÞ)ŽÃ'-çä½}Ö‰D¼K÷A‘¢GhW+ô‹zßkx"ì1ŽÃ6c¡±Ó¬‰H] wºRà/ÿ[lj™ õ‚ÃYVgT¸ú~/¿ññиu"/Ò}PäÐ4ˆ«:åҵ߭ÅLðzÿÆor¡‰ˆwtv l/¸À{fÕÆŠÓçoO=yj(–‚× à•~cyÊaŽÆ_þØSY8ÝEfø jï³ÐØiÍÆr³N$"1<=Xu™:HH.Þ[Ò<µN{ìçñÐxÞG_q:>«3*yF‘yÓ}Pä¿h ú ¢Þ÷zŸµÆfc¹±ßXqÖ‰DÄßšZ×l©â™»ç\Gç#ë8‹%À½àÜ{З–sÒ•û¦¼S]Ö‰D›í¾äŒ¬8¶œuñ¥–¶žŒ­µ¼IR²‡®Þ·Ž³¸ß NcèÎÊôrNºlCч¾‰Z'1¦û ˆC#Ð ´¿š‚¾°N´¸â¤÷Ùo¬8NÊ¢c×YÇßèîìÚßÄÛcEZYM}8:1ehÑÅI/€§y òÇ„äbΛ˜ZÊóµN$bI÷AÐ4¿ÚŽPï O“çˢ㼬;6žu"ñ´±ñÉÊÚ›IÓ¥_êë²N´Dâ§žlÎîŽÌgmfu¸¥Ë:‘ˆ Ý%Îñþ§\Ð êý âɲë82¥ÇÞ³N$"^t±¹m]ÖQÞ™Ûêîv<´Ž³¤â­œÖöž×Þ:âf@ÖŽ3ݽëD"KM÷A‰[¼óyó»   hëDK*>{ŸuÇÆãàì=VŸuñÞÙ;ÏÆóû!>{Á©k¼µ"­Œã'$ï+½46>iHdéøñ>ø—žÐùZ endstream endobj 162 0 obj <>stream H‰ì×ýk•uÆñ¿!¨ ­Òœ®ÁšfL Ø )e"8’ˆ*‘‚;;x|*;Úl®b¦mé°Ú˜TN{:(µfê|2ab›™¸Ž¸Í9µ7Þ$êÚÃyØ>ç¾Ïõâ øÛǯßûú\ß»wEâr³çÖjÿÁ´ŒâÇž[?){CyUƒõD¾ûù<ÿ|þ´ÄÀþº¦©ó¶ñÏÏ/¬8Õ|Ùz1vµ£ëíuµdÂÄ,¿/x„a=‘TÞ wïuƒåkkÆþ× *ª­'%>ú‘kÏŸÖƒˆŒ’=_ýAÎsíÉ|’_{ßzü¿Óúè~=6h=‘ˆˆôöíØ},='@,[sàR{Øz"K)¾Üy¯Ê9ð›‘<~ºÍz"‘§÷ ¤RlwBž´×Þ×ÞçÐ9Ú fh=‘ˆŒ03; 0{aY¨¡Õz{Ú ÷Õ‡Z&çnq ëoîéw[O$2‚ô”T@’/xk¯ì$<9o=‘=íýûè´ANƒf¨IÍþv–Â3/mþüÀqëq’…öÂ#>üìè„çK8“qÓ}ëÞ¯ôöYO$2"ôo#½Ép’œ{Nª“íÖ% íýGÐ i†œ -‘®h=ŽˆŒˆë7zÞ |›–Q<>³äÝMßóW뉒ˆöBÜ¥«ªÇL[ÏÉ<1scÍ¡³Ö‰$žÞƒâaäö“³6rÃIrò\{ÿAÚûýqC致Dº"QFÄKúnßùäËߟzqÑWPTyáâ5뉒ŽöÂ@¸-³|ÌáðËž_zæüë‰DIïAñ$²šÄv¢› ×ÞïO{ ܺ"‡Co¤=Ò!­'‘x…Zg¾¶Ó)óõ¡ëq’”öÂàj}zö&ŽhÌ´õKWU_¿Ñc=‘Hbè=(C>“Òd5›Ü&½­'JRÚûƒ£1Ò9":$MÒz‰Ñ…‹×–¬ØÇ·œž(Ýókßí;Ö%/í…!qJ¶ÿ0nºƒŸYØù“n”x€Þƒâ%$3ùÌ•&«Il¥ô ´÷‡Äý¡=Ò!9(ú$­Òz"‰BgWÄ<21ËŸ–Q¼ÒW×î¶ž(Ùi/ w© ¨’³â79wK}¨Åz"‘¸è=(Þ@“ÉN8“ÒÚûCÒÞ&îM’>I«¤[Ò0­'‘¡íýúÄ”9[I¹üŠ3ç¯XãÚ QijþkF^Ð)¹‹vµþùõD"1Ò{PÜîR{˜v™d&Ÿ­'ríý¨Ð'i•œ “ži=Žˆ ¨±©mîâr¾ÖÌüíµ‡ÏYã&Ú 1¨ª=™žàÜÆf/_[ÓÙ±žH$jzŠ{‘ºd/ Ì&Édë‰ÜD{?tK&çFÛ¤sZ#"¹rõƲ5øB'eoØ\öËÍž[Ö¹ŒöBl¸i«ýÓ Yþ²/~³žH$:zŠK•W5ºÜ^˜ÖÞ–ö~l¸iôLÚ&§Gó¤ZO$"}˜Eï}£36Ú ñàÖ½òÆnß³/p´ñ¢õD"Ã¥÷ ¸KÒ:‘KöjïÇF{?Ü::'Hÿ¤…ÒE­'I]µ‡ÏM·ïqîâòƦ6ëq\L{!~V”ü Uq½ÅEÈU€NÌ’·¤®õD.¦½?š'ý“c¤‹ÒH­ÇI9§š/S¹ù§ÌÙº¿®Éz×Ó^H”òª†‰Y~3-£xµÿàÍž[Ö‰ FïAq²”D%W¹®d,Ik=‘ëiï' -”.ÊaÒKi§Ö㈤„Žp÷J_³|Á#]뉼@{!¸“Ë×ÖŒ½×[!PU{Òz"‘é=(ÉMÏ pQÉUÒU{?!´÷ˆ;I#¥—r¤tTšªõD"žéíÛ±û˜³–¬Øw©=l=‘wh/$÷3wÑ.N•ߌ¼àñÓmÖ‰ü½%™8ÛN~:AJ¢jï'ö~Âq?i§œ*M•¾JkµžHÄkêC-ÙóKùÊf/, 5´Zã5Ú #„{;9w‹Sf Š*;ÂÝÖ‰>stream H‰ì×ÿOUuÇñ¿!Ó°­Í¥-·Z",˜iζ¬héÜœÙt«Í²Æ¦µ–Mß’.©Iˆ¡fÆ0Ç µ& +»³-„e*1â.˜ACƒA| µ§;IJ5Mñž÷9÷¼»cöSïóù¼Þ¯sé’;Žk¾åþ þºôÿ Œp]kêÒ"žmrZaM¸Åz‘ñÓÏ¿-YSÂÍšžÚSvÂzœØ¤½U¡ŽÅ%fó„§ÌÊzk[Íè…‹Ö‰ŒÙ¼ã+N&­CBfn¯%-9™$'ùi=QlÒÞ*ú*­•'Lƒ¥ÇZ#âc½}CBU¬~üƒÿ´ž(fi/D§wÕú“â3xÎ3RC•ÕÖ‰\¦ïAñ²‘„äL’–d¦ö~ôhïG›J¬ÈÄ}T^?=åòRX²¦¤)rÎzœ§½àŽ3ÍÉi…]i벞H‚N߃âäáCÏìt⑜$-­'ŠqÚûî ÁÒcyÔtZš­õ8"¾®kM]ZÄÝIz² &Üb=N h/¸©²ºñ·ßáOŠÏXµþ@oßõD\úsd IHrÉFÒz¢@ÐÞwm–N˧ßÒr­Çñ´³=Ï­+ç¾L››[ðñ·Ã#£Ö…ö‚Ë8Û›¶ÖL™•ÅcKÌÞ¾÷¸õDPú[¤ßÔ9ÙBòTÔÞwö¾Ë8Û4[ú-®K㵞HÄsú†³òkoOÊᚤgêî´ž(X´LpΗ¾¸Ÿ'ÏïîGÞ­ ·XO$£ïA±Bâ‘{N’„Úû.ÓÞ7Á9§åòäi¼ô^Ú¯õD"^Q~øÔ=nåv,^½ï‡¦_­Ç "íC §Ûg?žï”¢…+öœí豞HD߃â>RnÑÊÐ#ýÈ@뉂H{ß]—ÆËó§ýÒ­Ç1Vª}ÁòÝ܈û½÷yU£õ8Á¥½`®ä³ïïHÞÌ[¸5!síÆÊþaë‰$ô=(núcèOò”ãÔ‘xäžõDÁ¥½oŽÞKûå-ЄéÃÖãˆè<ß÷ò¦ƒÎFÈ+ú†a=Q i/x·àÕœ/&ÿÝ”v—ÖYO$±O߃â2d㼑rdö¾-í}/àÐ{A+¦$â’á‘ÑñÃÿüë¿[O$Ú Âxlå^^¿{n«;ù‹õDËô=(.h8ÝNš9±F¾iï{ö¾wp#èüº1 ™žl=‘Ht<úcââ÷9ó –ï®?Õn=ŽŒÑ^ðšãõmãõ)í…âÎó}ÖIlÒ÷ DÙE‚9QF¦‘lÖÉí}¯¡Óy)ôdÚ²õ8"QÑ9·xõ>ÎùÌù[Š+¬Ç‘+h/xÓö½Ç§&åðj&'d¾:2<2j=‘Ä}J”WoæU‘]0rŒ4³žH® ½ïM4dz2¯†ÎLs¶Gä¦éî\—u˜¥—˜•_Û?0l=‘ü›ö‚gq_Ön¬œŸÁ š67·ôàIë‰$¦è{P¢¤"¯8Zd ¦½ïAÚûžÅ}¡-Ó™iÎôgZ´õD"2zábÑþðlú§‘¶.ë‰ä¿i/xwgÞ²]¼#~sž(8ÓÜi=‘Ä}ÊÍE:=ðÔ'¬H-í}ÏÒÞ÷8îÍ™wD‹¦KÓ¨­'¹5á–ä´BN2Ãu­ÖãÈÕh/øwê®Ô<§h-{é“îžAë‰Ä÷ô=(7 ‰D.9ER‘WÖÉÕhïûýy¼KëN‰¿DÚº–¿RÊéžÚSvbôÂEë‰ä´ü‚Û”»óë¸ÄlÞ×m³³ø·î—L„¾eâþ™KüU.ù‚ö¾_p›èÒ4jÞ횎m=‘È5ôö mU±&'d¾öö—ü§õDò¿h/ø 7kEz¯ŒßŒÔPeu£õDâWú” :t´‰râˆ\ÒÞ÷ í}áfÑ«i×tlš¶.šxVqEÃÌù[ˆ—%kJš"ç¬Ç‘ë ½àGgš;“Ó 6oÙ®H[—õDâ?ú”Fæ>stream H‰ì—íKÝuÆÿ†6× „ðE,ÝL![F‰d䋆i0¦5XŒ‘$©3űÓîAR¢¹ð·V޶&ÊrÚô™Lš‰†“ ‡šu³Ïö‰27ϹÏù}¯?çå÷÷¾®ë^Xþ¥£û¯´-µ<]œ”U}ò‡?¬åˆesúÇ~ÆÇ¯µ±lšNõÄ¥V0¾U Å[w5MN­‰h¢ü³³<~­…ˆhŸÙö~Ïáñà?¸µ"±l”ûÑ M›¾ÍøèÞ4pk9B, Œç¼D¨©ïÎÎ[+‚r!ªaïŠöµ®ÙXÊc“˪êÚ­‰¨A÷ X.8 >óÁspå~”¢ÜjØ;Z7Ý›!ÒÃiãÖŠ„£LÏÌ}RsvÝÝPØ^Ô<:6a­H<8ÊÀf40G¾øô½ç;¯Z+Q€îAqÿ´w â-žÉà6Êý¨F¹ïØA8s¤ÓÉiæÖŠ„[|ÝriCÆ^`æ[u¿õým-G<,ÊßÐÝ3œ˜Yå¶Œ¼£C#ãÖŠDD£{PÜ8 ~â ƒÏX+‹rß7ÐÃiãL“fN?·–#œ€W÷RîQ½:Ÿ¡\ð‡u®O)g¦«Kv–¶LÏÌY+ŠîA±4¸Ç®²“8 ïWÁ[¬‰•A¹ï3èä4sfJK§«[˾etlb{Q3/m]rYÅÁsj˜~B¹à?ØP.Aµ8±4ºÅà¸/'ÁO”û~B¹ï?ØPú9-ÉÒØéíÖŠ„¯ÎÎ×Ôwx¡_·V$Vå‚_a[3òŽ2\¾Ä̪îžakE"²Ð=(þ¼bÓËŸzÖ‡(÷ý‡r߯°­tu†Ko§½Óá­ ?Ð|ærRV5ï*mKíO¿ YË!A¹àoÎw^OßëU»ì‚†Ñ± kE"RÐ=(îaìÆ.áÙ¾{X+!A¹ïohìôvFL‡§É[ËQLßÀµ×ÞþÒK„†@·µB” .PU×›\Æ ×l,-Úל·V$ìÑ=(Ápü'WàÖŠDQî»íÏ éó´zk9"ʸ91³³´%&±dmÒî+¿›œ Z+¡E¹àìòÖ]M«Šw\jEÓ©kEÂ݃Âã›Ó½xÀ%”û¾G¹ïì2Mž>O«§ÛÓð­‰(`þÖí#{¶—ÈÝq|`ðºµ"” NÁ^oÎ9ÄÄùR²?ïíµV$ÌÐ=(p|À3œA¹ïÊ}§`¯iõLœ†Oϧí[+‘˹ z¡ÀokÛk9"|(äÄ÷¿?žVé•À7w4Þœ˜±V$ Ð=è2l}Þ{Ç=À ðkE"|(÷„n¿ØóéüÖrDÄ10x=wÇPˆK­8ÒxqþÖmkE"¬(Ü„M¯8xîÑM¥LmÒnþk÷]C÷ ›x»ÏÖ3}@»ï Ê}7aÓéù´}¦Oó§ÿ[+ÁäTðãýg…˜Ä’¥-7Æÿ±V$ P.¸ [ŸóÎW<¾'Òö´¶]±V$‡îAaÇŸ|n·òì¾rßM”û.ÃÖÓùiþô®nkEÂ’†@w|ú^ áÕmõ}׬å3” ¢·ô™Wj¼Š¸9çÐÀàukE"èt öšíöÖœ}gë­ 3”û‚æOÿçp pXËt]~þõ;¡”UÝ|æ²µaŒrAxkþ5.µ‚ǰ*¡øÝNLN­‰Ð¢{ÐØe6zub ãfÇÙtkEÂå¾ðà àà1ppXËabhd<¿0ÀÜ×§”ï;Òœ·V$ìQ.ˆEð„*OÇÜí±ÉeUuíÖŠDÑ=èÕ_t°Ë š½f»•ûbA¹/þžÀEÀ]À“àFàR°V$BÈôÌÜžÚóÞ¸·5ŽMX+‘‚rAÜþ]ÐÀ«à{êÅýí]ƒÖŠDHÐ=èoØ\ö×[d6Z¹/Qî‹{À¸x\ Ü \ ÖŠÄÊø¶gCƦü‡ã7þ`üžöw endstream endobj 328 0 obj <>stream H‰ì×1€0À@ A$®X+3_t4wC>stream H‰ì×ýk•uÆñ¿!ØB)èR•…JÜ(–dàˆÈ4t¿h¸ãikiæ2iNd“é2ÙP*ç ­YÛ|2aâ˜ÒœíñÌ©½õ.¨°Óvž>÷}ŸëÅAê·û~¯ïç¾>ô¶ïÏ^{ê…íük=ˆ¸KCSÇ쥻¹ü^yë`WÏïÖIœ~ù#‡Ë¿ÖƒHœõÜî'³NxI1Y¶žHÜE{_žè—Ë]9kʸÏ¿üùñï.Y#qÓÜÚ›Wîœì7'[¬Ç7Ò^ʪ¦-(䆤 òC§†GîYO$q£>è?$”œ’VN–ä’_ë‰Ä´÷%ú­Bƒ GX#1éíz[ §™ž –Ô †­'—Ò^Èx=6n­žü×få‰_­'’øPô™ªš&Ê™’V2«½/ÿE{_"ãõ ;Ð ¸'´ :…õD2aáѱ½2qˆyùßÞì곞H\M{Aƃ—d雸*üæ-/¹x©Óz"‰•ú oGRéÄ“œjïKdÚû2¼$ô® ‚fA¿°žHÆ«¶¾m~îœ]ÖªÒú†vëqÄ´düxaf.Ùé|v®zïpoßõD=õA ƒ«7q"I6I¨õDâÚû2~´ :†~¡ÆýZ¯ßZ¹¾’󚾸øÐñ‹Öãˆgh/ÈDí9x~êü\›)sƒÛ>« ŽYO$ÑPô4rGúÈ ‡HI¥õDâÚû2Q4 ú׆®Aã°GžànÿȇÅ?¤ Øüÿk=‘x‰ö‚DwfÝ–c“ælçò<÷Ò'Õ§¯XO$¦>è]$nFÖ£o32Hµ÷eB´÷% NÝ kÐ8T7\eìþƒ_ÿ<}ñ£¥°r}åõ¿YO$Þ£½ QãÍYøÚ>î¿+ö]¾Öc=‘L€ú µ^¿E֜Б>í}‰‚ö¾D7‡ÆÁý¡}ÐAh"Ö¥ºú†ö¬U¥ÎgXm}›õ8âUÚ £êÓWfds‹&ÍÙ¾n˱»ý#Öɸ¨z É"_¤ŒS#qäÎz"ñ*í}‰½ƒöÁ-¢‰ÐG¬ÇIQíwÖn:Ê)d,*Ú[qaìþë‰Äô$v¼Bí®27È]š:GñWg­'’ÿ§>è!;÷Ÿ#Yœ)#kÚû í}‰¯„&Â]¢•ÐM¬'J!ƒá`I]zf(-P°9x²·oÈz"ñ<í‰^¤ÕŽpøÍ\²³¶¾Íz"‰D}ÐÈirbE¾´÷%vÚû/¼HôZ Ý„†BO±žÈÿªjšfeï"¹yåÍ­ÝÖãˆOh/H|]¼Ô9oy‰óùºäõý7»ú¬'’'St9²“ýF™%2E²¬'ŸÐÞ—ø¢•ÐM¸TôÚŠõ8¾ÕØÒ™³æÑR,ÛSsæªõ8â+Ú ’l„gqµ& 6n­ [O$ÿ¦>èZä…ÔˆéûJâK{_†BOájÑYh.ÖãøJÏíþw?8ÁßvÚ‚ÂOKÏ Ü³žHüF{A„÷*?t*íñ7mzf¨¬ªÁz"ùõAw")ϼø1GCvHö¾Äö¾$ïm…Σ¿Ðb¬'ò<ýI%9´$¡x»róʹcüf/Ý}¾ñ†õDò'õA·!dÄ ©ÑÞ—ÑÞ—„âí¢¹pÇh1tõD^Usæj`Ùþ’9kÊ[:­Ç?Ó^$øû‡î«oWèC× Ô݃D¬xç’B^¬'?ÓÞ—$ ¿Ðb¸i4zõ8ÓÜÚ›WÎ_oVö®ªš&ëqÄÿ´$iJÿôtfˆû–(ȹg=QJStƒðèY œé #Ö‰ÿiïKÒÐeh4Ü7Ú ÇzèíÚ<ÉRHÏ KêÃÖIJÐ^dâeÛ¸µzòã¯ßŒEEl ë‰R—ú 9î?)àH¹ÐÞ—äÐÞ—dâe£×Ðnè84úŽõD.5vÿÁÞŠ ÎRX»éh{Çë‰$…h/H$0²ú endstream endobj 329 0 obj <>stream H‰ì×1€0A A$®Ò"3)a˜Û-¾þöæVÆymûñì×Gx•hÒƒMz I4éA€&=Фšô @“hÒƒMz I4éA€&=Фšô @“øŸ[€(_Ï endstream endobj 166 0 obj <>stream H‰ì×ÿkÔÇñ¿¡5Ñ Xl`™Ó%•£%´4B™ J_0“¥á¾˜ë´©sjÎ/¨‰ÓlЖQz¦Ö1 Ý¢¶Ù9ÌÕ×sk³ÛÖs}L¦nîîÞŸÏÝëÁqèO÷އ׽ß÷‰†+¿ý™³¨ê‘gŠxÍž_ÑÔúGT>FîkÓÎs<Þ­ID-mÝ$ßù ð]àa=‘$o¾k#x¼[" „-·xÕq‚—’UVyèBxhØz"wñÚ3ówñ|²î \¼b=Ž$ݱÂö›ž³ÅùI\°âhO°ßz¢Ä¢>h‚œ“v'öäŸoõD’pt÷Å M‡¾Cüè>Ú~ŽŽÎ› –ᙤÎõí;v)<4l=‘$"Ý1ÄÞ+Û}~jF)!œ2«¤tÇYm˜QŒ1²ýaå9rÎc'ó$_iºûbˆ½Gë¡ûBzmÈz"3½¡u¾SœƒäôbþÁ­'’Ä¥» æØKלHšYDÓ²}µ§/[O”Ôc‰T“m89'íºûbHw_Ì9UˆDJÌ*t¸¦1uîèQX°üHkÇuëq$Ñé.ˆK´´ugæï"¼^XðIGçMë‰âœú`läì…{œ`“prn=‘$:Ý}q zmˆ4ÒŒèGÖãÄHàâç(däíðÚ­Ç¥» ®R{úòÏD&“f-]s¢74`=QÜRŒ6ÒK†I2Ï™T“më‰DFéЉhFd’–DW²'Š®v—­ýœ¿4%«¬òÐ…ÁÛaë‰DîÐ]·aC–û§Ì*!™Óž-Ý~ Þz¢ø¤>UävÚœöïQXYX×ì·žHätÄØ–¯¾ý)áä5=g‹?Ðn=Q¼QŒ’³õ$Ö‰.ÖÝ·ÑÝwb[Ò•'½‰öD‡²ž(2>;Ù4#wWÞ²ƒ?·þn=ŽÈtÄÍ›¯Íž_áü´Î]²ÿjWÐz¢ø¡>qä“”:q%·¤×z"‘1èјèMD”E“²gR~léš÷ú^ço©ùºÙz‘{Ò]÷;x¢áñÌMõÑôâw?¨ýkàoë‰âú`‘É÷6|I>y¤d•ÄZO$rOºûâ~´':A¥OѪ¬Ç™°î¡•…uÎEؼç{ýn—Ó]O`—®ÝøUò¿·÷V_´žÈóÔ#…4’I&ù$¥ºûârºûâ ìRš”³]éV4,ë‰Æeðv¸|_ÀûÍ÷k®v­'y0Ýñöjî’ý$–×Ó/oml¾f=‘‡©N œ‘»Í $ÉÔÝOÐÝa¯ÒªH, ‹žEÛ²žè~êÎü’‘·ƒisU54é'Šx†î‚xN}CçSóÊáùoî¾²žÈ“Ô'ƒÔ‘='„¤‘LZO$2^ºûâ9t+¹¥mѹ¬ÇCkÇõWÞ8Ä„O¾ôñášFëqD&FwAÐÂî62ÚYÌ>÷nMë³j£"‘¥» qƒ\¶ûüÔŒR"Í;ÿÖ–¾õÁR¢$.éîKÜ`'ÓÈèeDšŽFS‹êÇÝê\ç;Å9HN/^]r²74Չ݉3ìç×VV“j^iÙ>eû^ÔGFþ`zFðO endstream endobj 330 0 obj <>stream H‰ì×1 €@A A$®¾Ef<|$;S\}íÎ °nœ×¶Ï~}€WéA€&=Фšô @“hÒƒMz I4éA€&=Фšô @“hÒƒMz I4éAàOn—Ï endstream endobj 167 0 obj <>stream H‰ì×ÿKUwÇñ¿aeX Šý°².‚“j0ùƒƒD6X£Ú›cPm±`‚_®^¤d¥KlSȹ9 :•c6D·Z²¶lNrä\‹š¢–×nµ²šIÞëûì|ž„ëõ}îëý9oß÷îý·¯¾í_•YþÄÚB]/æ7ŽOÍñfàD½­®Ö«u!@|èù¼«¸5)µ(9T²¯üäÄd4¥¾©gÍæ:;[w6ô \MÄŸ¬0H½ý#é9‡½æ7æ¼n]‘ï”}Ø¡/G¯Ö…øŽºE=ã5ºH½d]OÌ}’v4mjêmmmÚÝâøÉg~ÊÌ­Ñ'‡²+[¾þ%ŽŸ øsÖØr>%#¢_²®ðõ÷¾˜˜ŒZWä#ìƒR‡¨OÔ-úfÔ9ê늀øcî#À´¯ikS‡kƒÓ·ÀOݱ·IŸ¶2½¬êhwt:—"¿a. Øôô.¨hOJ-RŸ/O ¬ë²®È/ØÿE½¡Ñw¢nQÏ0÷TÌ}›žÞÚÝ´Á©ÏµÍi§{Œ¹5u;R}zÅÌPÈ/h¹6÷:ÿ`.Àz’ç¼Z¯V×õÔ³]ç­+²Ç>xŸúA]ᵇú„¹`cîÃz’kS«k§Óf§ýnþ¿{¬õç§³>Ðï>÷ríO}&®HÀ'˜ pGÏ…+kgžðº²¶Õ ZWd‰}PÔê¯%Ôê늀„cîÃÚæ´Ó©áµßÍóýÏ¿Rç½_[a¢Ë|‚¹×|Ôxvez™Ú>)µhO¸íÖÔmëŠl8¾*w¥¯З ~PWXW,æ>\£Íî‘ûàȵñü‚iáÒªgÿ7€›˜ pžóo~¹ôŸ] îØ9ëŠ ¸¼*qå®ÛW¨˜ûp sšã9ŽUíNɈè\ìØÛ44<º˜…~À\€³ôÌÏÚV«þ×µaË¡ž W¬+ZTnîƒJYY{¡+}æ>ÄÜîkûæ×Pv¥NDfnMwÏïÖå6˜ p\Çw¿­Þ´ß[^xí“£7­+Z$®íƒJVùzA+qån]`ƒ¹HßÀÕ­;tÖl>PßÔc]`‰¹ÈÁº®åia…eë‹ *Ú£Ó1ëŠÎ}Pi*S%«ûUÊÊÚº"ÀsŽŸz§ôDRjQr¨d_ùIýh]`Œ¹x4¶ï>¾d]¡NDJF¤ùÔEëŠË‘}P9*MÝ©’U¾Ì}€¹gÅîÜýøóž|¦\Gॷ¯[Wøs˜MÓ!3·F‡BWzÎáÞþëŠ%ðû ²S‚^”Ê”¹x˜ûpSçÙËÞPÐk{ç%ëra.j>uqUf¹·Jlß}|l|ʺ¢ø ð>¨¼”šŸrTšÖ>Â܇›Ôö)‘šOÏÄîܵ®ðæðPš¥UËÖë€$‡J"Õ§6A¹*#%¥¼tkÊN ,5`á˜ûpÓ®âÖ£7­«üˆ¹ÌA³#ïÏtFt­Þ´¿½ó’uEq¼}Pé(#/,¥ÆÜй˜¹>stream H‰ì—Ïj1Æï {èèbH žhôg$µ'›´´`šâôà[ÎÖ54ë²Þ¶øÚ·êµÑ—I%·±ÚB !9d~ b˜ý¤Ñ§Yöò’a†¹/¾ÿøù¾¥ñ¡7Â0 Ã0 Ã0 ÃÜ+ü?È0 Ã0 Ã0 ó8áÿA†aæñ0¼hÏcëjöª®£×ö,e¦qÝ7]]½©+)NÒ!(´N¤€Œ“”©­ &R¥R€>G9¸[§¬ bó:´rûÌ6u5Dôà•U‘ÒÚ‹‹ºR:O'-9@ƒ(&ue]…ä÷Ê2©I)¹Uî¦#! ¦‚“²R)ýGý”}ŸáìhÔõÇËy¿\µ±Ûˆg9w0ÄdGº@‡âè´ï–íBŒÇ£ùüóÅtÕÇ,>O³ôy²c,ì"‚,xïÔ5³^9HçòŒõ`Pá^Y&V ‰Ü5³ZJ I&'¯ê”¿jßµÑéí?‘QÙ<´MÍ/Iù»£§©}Jè qëÞ"Q“'p>õ4Ÿ¨K¯ÿ¨ÿcU F{S§û¢»õË¢»ÜiÑÉx1'qÓtÃaJ ÞÆEó®‹Ëù¢.ÖñK#bÛæšOé•Xtͺ_uXX}Í™Í endstream endobj 168 0 obj <>stream H‰ì×ËKUQÆá¿!/]F‚!oT6,„‰3)¢pâD‡:¨‚÷Q2lbå@Ž$ÑA”X!‚H”" fɯG-{sƒ­DËÔ³×Þçü64Xïz‹o{{½¯>žºP¦¿ü? ²0€ÿ57¿”“ߦ‡£/1«apxÊv¢£¨iz©üúk;ÈQ¨s5ïüú-ô‹ØNøs`b.Gc®$ÙyO}·’øtTÏjÛ©]ýëW°ðæ>ÀÄ\Ž£¹cèÌ¥j=¢˜äò⪞µõMÛ‰Ëwû ºUÃêY±Õ¹š·ð%æ>ÀÄ\Žiy%XXÒ½³§œ¿RÓÑ=j;Ñ¡økT«êVÕ³ÚVç¶~Åܘ˜ À‰˜ž \»Õ¬×¤/5»qdlÆv¢ðË>¨&Õ§SìÕ›ÍêÙv"Àߘûs8Aý ™uÎò’[оXµè@ÞßÕž:tÊT«êÖv" 0÷&æpâê[âÒ*õ²bS*Jëû·¾ÿ°h^ÞÕ˜zS{J¨&ëž¼¶Ì}€‰¹„ÂâÒz^QgTR™ÞW|FmW߸íD{yvTWjLÙÔž:T“¶a…¹01€ÐùôùkzÎc=1}úÇäÔ7Û‰~óà>¨~̺>L~±CÌ}€‰¹„ZWßx|F­ZTRY^QçâÒºíD¿xjT'jFý(’ºRc¶a‹¹017¶JëûcS*ôÜâÒ*¶ÚNä¡}Pm¨…Q?jI]ÙN„3æ>ÀÄ\\³XÍ-h׋ӗY×?0a1ŒöA5 œBÔŒú±ˆÌ}€‰¹¸ldl&5»ÑY‚²n·LϬİ»êÖº»S‚ÚP'Vbˆ¹01+:ºGÏ¥×èõE'—–t-¯]`kÔMu_ÝZ§«õàr Â1÷&æ`ËÚúfqUOÌÎftörusÇ›§[ÙuGÝTçêÖº»pótÛÌ}ÀŸ˜ €]sóK7î¶êêKÌjx÷~Ús]Þu/Ýιæõ;­ºµ;ç؃¹01/žÚ]—ròÛ\X—\ÛuÝhwáÕMC}"€¿`îLÌÀ;šž¿=}±JO2&¹üÞƒÁ­ÐåÂ>¨ü÷k{u¤{=zö&tg8$æ>ÂÁOWbûS endstream endobj 169 0 obj <>stream H‰ì×ËK”QÇñ¿!År¸t——Ä…™‹ lå¢0аEA…I´ÉÐIScºº0H3, ÉèŠIˆ4JQD1tÊ1Ë~ñBœèâ8ó¾sëûáeÞ9ç9¿YžÕUvé6¶ak¥>ÃÀ‹^ßñs=ñéUº˜I¹µí÷^9tP͵':BŸÕWrå×ú/úGú_`]èû}ˆ@ã³ùÅͺ›z²ö\óØ~„só Òfí½j…׿бý£ïLô b ¼xŸ’_o VÅÇnÍͲ±¸ó *§xËö‹Êocq¶ ïLô ’­|ýV{ýé¦mtO2\ú®7¶T¶w´rnÌt©¦ÒÚ˜€½èû}ˆ|––uêªêIΫëyø&øš6΃ʣTV¼’S·•6øšBߘè @´óä5YcW~qóøÄl0Õl™•AI¬Hʦ„ÁTô}€‰¾D—îþѤÜZ]Û¸´ÊC§ï,z}Õ rÔ¹‡Ë»”AE”G©« Äèû}ˆ:¾å•ŠÆ„ —.obvµ»u0€"Á̃:Qçj»2(‰òP@XÐ÷&ú¥fæ¼ûŽÞÔýÕ“²£þùЇumlÔ)© Ö¡E¥mʰ®íÂŽ¾0Ñ€¨6<2•¹û²5 –´LNÏû¹q½ó *«¾uNÔ¹FNô}€‰¾Ä€íC›sjt—ãÓ«Ê\½Ÿ—¾¬¹ÅÿyPÕTS•µ^§è,;"ú>ÀD_bƒ¦¶òê>ÿ§6?çAsÒT}&M‘Œ¾0Ñ€X29=_XÒ¢K­'m§{xdêo+לµ7}—Û*¥šªìLd!Eߘè @ì|9‘ZÐ`rE¥mž™…ß×ücÔzí²¶«Žª9@ˆÐ÷&ú«Ü­ƒ‰ÙÕºà ®ŠÆßòŠùëçA­ÑJ­×OÚ« ¡ Àqô}€‰¾Ä°E¯¯ôlw\Z¥®yRnmgïëŸ?ý>v=ѽÔú#gîjo8"p}`¢/1o|b6¿¸Y7]ONQÓè˜gõ×yPoôÞZ •ZîÈœBߘè À¢ïñ»ä¼:kèÛ¢ãü¥}Ñç“ÖKýzÿÑÛpÇà,ú>D¶ï |çÿ endstream endobj 170 0 obj <>stream H‰ì×ÍKTQÇñ¿!_ÐE¸)rÔ)‰$ÊÀaD n‚Ê… Û…£¢™¥(º({C(\¥TЏ‰LÈ$D"Jʘej¾ô³SáÓqæÞfü~¸ wν÷9ÏæðãY^vÖ“Î-»‹õë𾜷°¸TQÛ—RªSãñúµ¢u=u»A!Gîlä°ÙLúflÐÁ7—îµâvSBîlä°© OÌ©÷ƒæÒŠÖÝn €È}€\6‰OŸçò‹Z£WÀmû*NÜ×Í邺×ÖõTï¸Ý&€Ð"÷6rØ ª›ºã÷–é°Çx¼¯<›_(¿ñBõ«{­h]õŽÞt»Y!DîläÙº_ ï<|MÇ\WÖ™[ã¦Íº4µ®§æ5½¯¯Ük@‘û¹Dª±ñGs›ü#^Oߨýô—yÐÐ;»Žü3rUÁÙ–„¹°‘ @äù2ûõBÙãW§{kjyý—¿¿óÇyÐÐûúJOUAuT-ô-p¹°‘ @„i~Ôk¦¹h7¿¨õoÓÜ*óàò÷‰RßFÿœ(o?|ÂŽ8ˆÜØÈ bôô&gÖèDëÊÈmó­òòêó ¡ ªc ª²ê»eN#÷6rˆ“¾™ãçî˜Á-!½ª½k🟬e4TM5Mñì³ÍÚ+-p¹°‘ @X››_¸tµ=6©D9~OiuS÷?\ûÀF.ÿ¹‘1_ú‰z3p%gÖôö¥l°æAãÍ»÷êÍ4©nÕsPÊ:r`#à¤o v™E endstream endobj 171 0 obj <>stream H‰ì×ËK”QÆñ¿!/dDnŠ-A,fà"!£VBAåR·™H¢Ñ…$¡²f‘t#܈¦TR ‰$‰Bó6f·GOĉìb¾ï{^Çï‡a–ïy·¿¯_±“3•5‰ôHtÕæãë ëã·ú=üø‰3÷õYý{øM%TN}V™•\ù=ü8OÜ~8¨Gª×A¡À\©5Þ½&?¦ç™‰VÇ:¦“³Þ~ß}P”Si3æwجü˜náí÷,s`c.aÓÕ3´±¸IS¿Ý/¼÷ãŸöAC™•Ü\AwÑü8À`îlÌ <‚\£|Ý`[‹ÂÜؘ @L'g«c‘¨ÞcV~¬5Þí÷‰샆î²&?¦³t;ÝQ7õûDÀÜؘ €sñ[ýë ëõÓ#ÑÊšÄÄäL‡¶Šn¤{¥Ïo»º©îÀ¡ÄÜؘ €COž¿É+mÑÔ¯hÿ…Wãä>hèvº£¹¬nÝ70ØÑ~`îlÌÀ‰÷£SûŽ^3ËQvQcç£~4tSÝ×\\ ¨‡€+s`c.ûôùKÝé{™¹µzz«·ÔÕŸ{à$†«}Ðh8ÿPwWõm¾«NœÄV æ>ÀÆ\‚”¸3°aGƒ]ZÎñU×ÇÆ“®’¸ÝEwWêA1Ô‰šq•XQ˜ûsÆË¡wÛËÏë¹éWPvöÙàˆÛ<Î÷AC=¨ S˶=çÔ’Û<@ÊcîlÌÀocãÉU×ÓræVžõÛO&î ¸N4'$û ¡NÔŒò¨%u¥Æ\'Rs`c.¾jnëÊÚZ§W–™[{ìTçÌÇO®}ª}PÔŒúQKJ¥ÆÔ›ëD@jbîlÌÀ'^d5ê}éW~¸ýýè”ëD? Û>h¨¥½G®šÒÔž:tH5Ì}€¹xîÕðhIÅE³Ôä•¶ô>}í:ѹjL½™Õ¤útHÌ}€¹xh:9[Y“HDõ¬Öœ¸rã±ëD¿æ}Ðh¿Ù§R}ªUuë: ˜ûsðJk¼Ûì/‘hu¬#äûKø÷AQ‡jR}*ªºUîËs`c.K×ûôõ¦MzJú•T\ùà:Ñß-‹}ÐPŸ»*ÚL½‹›Ô¶ëDÀ2ÆÜؘ ÀRŒ¼/;tùǪÒÕ3ä:Ñ¿ZFû ¡nÕ°©Z«y׉~ñM€ÕÐèÎ endstream endobj 172 0 obj <>stream H‰ì×ËK”qÆñ¿!Kr¸0j×ha‰ ±6-šV. ![TD jƒb%h`è ¥‹PiFWÜHB¤P’ˆÂ Š¡–c–=ñƒøQtñ2ž™y¿†A\=ó>çåpÄ×õ|pݶr}[$ö°<±ù…ó—mȮД‘©kî±N´4UõO•\ßÖA–FÏYO[ÉõäõüÕ‚u" ɰ÷>ö° ­÷_gæWëÝI •¿pof6fhÉ’ô=m=s=yåW êÂ:LØû{X’Áè®p½Þ} ‹‡†'¬-SòÞƒŽž¼ž¿+bçþzõbHì}€½ü§É©OÅÇnº$« ¦ûå{ëD+’ì÷ £6\r¥¨udHtì}€½üÓÂ×oÕמmÜqQ/‹¾õ·þcj¥Rã\LÑv€øaï|ìàï:Ÿ¼Ë*¨Ñk¢ÏÁm§ç¬­Ž”¹õrèd›«I}=xüÖ: Øû{ø“¡á‰ÂâFwbä…£Ö‰VSŠÝƒŽ:RS®2u§­ ‡½ð±€ßÍÌÆJϵ§…~œ™ùÕ·:ÞX'Z})y:wö«5ý:5xäì]µiH ì}€½ü¢®¹'#7¢÷"=§²¬¶;6¿`(.Røµ¦îÔ ~£ÚT§Ö‰€DÁÞøØ ÀO=¯†·î¹¢7BŸpiKt|Ú:Q¥ö=è¨Aõè U³ê×:`½ð±›**ir‡Cho]_ÿ¨u¢¸ Â=è¨MuêÊUËêÚ:`‰½ð±pŸç¾œ‰t®Ï®Ð‹°)¯êzk¯u¢5œ{ÐQ³êW?Y]«qõn°ÁÞøØ 2ÿF8UÙ¨!h÷ ¨_µ¬®õÃÕ»Ú·N`ï|ìS_ÿèö}W5üú•4ŒMY'Zk¼u­Æ]õšM‚u"`M±÷>ö‚f|röÀÑîزûò‹ÞÖ‰lötÔ»Úwc.mÑTX'Ö{àc/ 8bó eµÝé9•šùŒÜH]su"K¿Í€&AÏAS¡ÙЄX'⎽ð±í]™ùÕšö´PùáÓ·gfcÖ‰Œq:š̓¦BOC¢9±NÄ{àc/ å Fó šs} ‹‡†'¬%îAŸ¦B³á†DÓ¢™±NÄËr÷þwLcûe endstream endobj 173 0 obj <>stream H‰ì×ßKÕwÇñ¿a¥¸X° ™»êØYLvájó¢;!FÑ`ÝØ.¢6ÖMBçhŠ9£¤E?Š¡lãH[áilKª¶EË¢”!a`?DwÔ<îôãߨ¾…+Óïñýù~÷|ðE¤«÷ùòÌ÷y?zˆ¢S¿\mávý´Þpf|ÝæoU¸žâò†TG·õD©Ûû“^‹~Zâ¢N¼`ÖnúFýXO½ðc/ ’rÖïû¹(^£¼ K“ú]ÿb=”[¸'å•£fôrÔå zØû?ö¢'ÝÙS²´Qa멬j³žÈE܃/ fTŽ—Ð[ïïTQÖaïüØ ˆ’Þ¾{K+x_ãß©h¾r}Àz"wq¾”úQE^NêJuYO€½ðc/ FF³·¥æÆêùÍ÷êÛÚ/YOä:îÁ)RK*JïJu©1•f=0#ì}€{°÷Èù×—Ôªä‚XbkýÉìDÎz¢àœ:¥®T—Þ˜Jk>|Îz"`úØû?öBílWß‚»Ô°žÕŽÜÉXO܃¯Ju©1/6U§ö¬'¦ƒ½ðc/ ¤ôå|Õº–¾œÿúÛMë‰B†{pzTšzóÂ[¹¶EZO¼ö>À½€Ð¹?þ÷gµßÄJ÷wwl»`=Q(q΄ªS{zêP5ªI뉀©bïüØ —¶öKóËêíÜXbã¶ÔÈhÖz¢°âœ!µ§Õ¡^£šT™ÖSÂÞø±ÿè_üáåªgÅG‡nÞ²ž(ܸ¡U£—¥úT¥Ö/ÁÞø±à¾Á¡±ÊªVï+wɲÆtgõDQÀ= 5©2½DÕªŠµžøOì}`6i#t]î·žxö\–ÈU7¥ K“ª´(^³»å¬õDÑÁ=8õ©JõVU¬ºU½Ö“`ï#tCé’²ž"ŸïøAÿã>­n¸“±ž˜{ÎJut—7¨Ï9‹¶¯ßrl83n=Q¤pæƒ*U«*VïVõªa뉀ç±÷á8ÝMºžT©.)ëY óÉÇõqæ—ÕíÜ&;‘³žx{ºñçݲÕ_©L=ú¥·ïžõDÄ=˜?*ÖðµÞÛÖÿbïÃYº•t1énR¢º¡n üe=Q`º.÷/_sPŸ+^ÑÜ~úªõ8À3Ø pÊpf|ý–cs=ù"]\Þêè¶ž(²¸óMõªa½dõ¬ªÕ¶õDÀì}¸IW’n%Å©»Iדõ8yñõw¿¿ýÁ—úŒ¾Ö{Ûzà)öÜÑt¨³(^£ K“ÕMé܃‡ÖE÷à,PÃ*Y=ëU«íÆg¬'ØûpŽ.#ÝGÊR·ÒÑã­Çɯ‘ÑlrÏó–ÔÄ›“'‡Æ¬'Ø pBº³§dY£RÔSYÕÊŸÇYÀ=8kÔ³ªöòVçªÝz"ü¯±÷áýyÔM¤Ë¨(^£+I·’Õ$à$ºU endstream endobj 174 0 obj <>stream H‰ì×ýkUÇñ¿¡œLÃèQM/‹µPÒ( ÷Ã"E–XHµ AÉ»§ËÒ,]ŽåCiÖ|`Á–š:qÚÐ|™™x˵\̱µq7w¯»›½å€aÎíî~ï9çób ô¿œóýø=ŸÛ·“*ÜÔž_°ë‘§Wgä„*¿:ïHî¿/rÇ®°ü¶D|ª¹¥óŹ›XB~&Ï\ßxáºõD~Qúi=ÏœßÖƒø»Í†;«ÎγùÖ‰OéîK* уhCl#͈~d=‘†Óמ­‚'·±®áªõ8â_º b¥»'¶heÍ¨Ì øøs¥Uµç¬'òõAì9ÛΓgóÙR`=‘øŽî¾˜£ûЀœD'²ÇR¼`óÎ3ã§”ñ4æ¾Snj·žHüHwALlª:ýس%ì^ZfpYñ¾ÞhŸõD¾£>h…mgçÙ|ž?) Ö‰¿èî‹!ú­‡ ¤уhCÖ¥„®HôýÐwÜ…ô@ÑŠ²ƒüÑz"ñÝI²ãg›ž|i[ÇÏÌùŸ·¶E¬'ò)õA[l>ûïD ë‰Ä/t÷ҦCß¡õ¼[²_•ç¿.‡oÌZ¸ƒxNœ¾v{u£õ8â#º ’4|ç½¹]À)B}0²à„‚të‰Äût÷%ùh7t¾Cë±'¥‘Í@îžÕÔÙ•'·G|AwA’ v+þ^Éþ´Ì Ë6&«¸bÇIë‰D}0…rÁë #$…¼XO$^¦»/ÉD£¡×°rtœ}G~±Ç¸åÛNdä„xn –W7·tZO$§» #­ªöœóÚ¨Ì࢕5Ý=1ë‰äõÁ”B.Há¥Rc=‘x–î¾$-†.ãüŸF»¡ãXOä2m=‹WÕòÇf—”×÷Fû¬'ÏÒ]‘sñJk w ÆÏ s>»öÇ_ÖÉ?ÔS!)NdÈ ²žHuv¥óáš·ñâ•Vë‰äÔÝ‚4‘)'\¤Œ¬YO$/ D¡•ÐMX*z mÅz"_8{þºóÑÈÝP{øgëqÄõtd˜º"ÑùK÷<úÌÕŒœÐ7.ZO$ƒ¢>è.5‡.‘/^Y#qäÎz"q+Ý}Iš}„u¢›œú±ÙzßÙ^Ý8qúZžÿ¬…;.‡oX#.¦» ÃñÉÖãc²ŠY¡Ñ“ W}T»·žHK}ÐuÈ)#k¼8rGú¬'WÒÝ—á£}ÐAX$ú­Äzÿê\{(=P”–\R¸·+µžH\IwA†¦þ‡_'L[Ãòðóê[_¶uôXO$G}Ð¥::o’8'zd$ZO$.£»/ÃAã wÐ>è +ÊÒG¬'’Ûá¦öü‚]äzü”²Í;ÏÄû¬'—Ñ]‡ÕÜÒ9ãõ-Îçèä™ë/\·žH†B}ÐÕÈésbHI¥õDâºû24´ ºƒý¡}ÐA¬'’{9ÎÎÛÈÛá÷Ñ“¿Y#n¢» ƒ×í+Xýí¨Ì ;3.»tSÕië‰dèÔ=`ëî³$‘÷H*É& µžH\@w_†€~q·kÔ5\µGî/Þ?°yç™ñSÊxSù»ÂMíÖ‰;è.È Ñþî~y.+Þ§/O·Sô’HÓ2ƒ¼MJN­'’T§»/…NA³`g2rBt ‡õDò7—îå.¤Š>Xw¸»'f=‘Xû[€€$öÌ endstream endobj 175 0 obj <>stream H‰ì×ûkÕuÇñ¿![8A0”!õÔ Ã¥Ñ ÊJHHò–I fÒÐ]ØÚr:/‹yC§¸Ê–¹”²©•c¶…ºåk“9´3ÎæÎÙŽÚ3¾ ¢9-Ï9ï¯ßïëÁ*þð‚ïç}»qcdßÿÜöÈ”µü¾Çÿkjîš’¹wÂOæ¼ÝAëDE[~äƒòÛ:ˆÄUIm:EJµR³Ö‰Ä½4÷å>õDÖ¬?::¥ )·<ÿЕàUëDò´¶_zuÑŠ}â¬uU5MÖqÄÕ4d=½¡ì…UÎ’I?ihì°N$1£{Ð{¨ÐIeNÁR¹Ô¯u"q#Í}¹\Ì}žÊ+oïæ²°Ž#ÿSíÑs)Y›øŽ3_ßÚx¶Ë:ޏ”æ‚ü«ÈP4·¬.)ÇóHN-,ßÙ`HbL÷ WQ­Ô,—ú¥Š©eëDâ.šû22®n wׄuyPLæÂØ´"¾é‚•5ÝAëDâ:š r§êÚÓã¦ó0FM]»ðïû"Ö‰$ötz5»xÕê—OL-SÑÖ‰ÄE4÷ån¸¸xÜeÛë¹#¬IÌôô†–åÖ:·´òÄ`xØ:‘¸ˆæ‚ܪ¥­'-»‚'ÁÏŒœ­í—­I¼èô<ê—*vÊ™º¦º­‰+hî˸¸¸x\ ÜÖ‰$.δ^̘»¯<9sCÍwÍÖqÄ-4ÄÑ ¿±¬ÚY'¤—>þ‡u"‰/݃>A{§¢Ò¦Æ©tëDbLs_nÃ]ÀuÀ«àRø­¥Û:ŽÄÝ—‡Î:_€>`HMsßçØùÙüÙÿyóW|ÅE`HŒÕŸº>§’÷’µ©®þ¼u1 ¹àCý‘wV3jê? !¡ºö´u"1 {ÐϨzg¤Ð è Ö‰$q4÷ýŒmŸŸÀþÏ`G\¤ª¦é‰Jy³—ìmm¿dGJsÁoÊw6$§òÑ“y«KD†¢Ö‰Ä†îAŸ£ösËêè<zÁ:‘$ˆæ¾?±á³çóéÇO/aó·Ž#nÔ TrdtJ£?ðWëD’ š þÑÐØ1)£ŒÏÍOöªžÞu"±¤{P@ 8mþ@—°N$q§¹ï7ΒφϞ¯%_ãrÎÒ}t‰ñÓK¶þkôÚuëDwš ~ÐÙÌœ·ÃYùžzq}Ss—u"±§{Pn¢'LÎÜà´zÃ:‘đ澰ɳϳÕóÅg/ÙËžoHuõçÓ²+x9és*ëO]°Ž#ñ¥¹àmƒáá…‡“y|å±iEÛªOY'·Ð=(·¡?Ð%xt úÝÃ:‘Ä…æ¾O°Ã³Éó­ÙêÙí­ãÈÃ'zízÅž_ÆM+æ½ùþþüË:‘ċ悇íÚßèlwòÞýø ¶;¹•îA¹]â½5ßÒ1xtzˆu"‰=Í}Ïcog{ç+³ÉoÞ}’­Þ:‘<Ä®¯.Ï?”È“Z˜¿ñXÿ@Ä:‘Äžæ‚'55w=óòF¾,?™óvtv­‰ëè”»¡cÐ7œB'¡ŸX'’XÒÜ÷0vu6vöv¶wvx6yëDâ-m=YówÑ:&ÎZW]{Ú:ŽÄ˜æ‚ÇÐü_[´ÇYäžœùi]ýyëDâRºedÇÚé!N3¡«h±ô Í}¯bKgWçã²·Ÿi½hG<¨öè¹”¬M¼±Œ¹ÛÏvYÇ‘˜Ñ\ðŒÈP4·¬î±§óù ÉÏ”ïl°N$®¦{Pî$9µ§Bo¡ÃÐg¬ɃÒÜ÷6sös>kà¥r6vë8âeƒááÒÊcÓŠxo‹Wèé Y'’Ð\ð†ƒ?üþøóŸð)GM]ûÖûûBaëD‰ñ·Ó ñt endstream endobj 176 0 obj <>stream H‰ì×ÿkÕuÅñ¿¡9Y†d)èQ»:Ót0%"¸@Ñ„~ذHTšEî‹_®ßrÚr›„s嵋RmšéE!Óй9Æs6EÛ¸êîÝîfÏq£04·ëv_ŸÏýœQzqßï{^ç}ÿ¾ÄkÓg'žziZ"N× çÖ¦¤oàÂ<÷Ê–ú†ë‰ä‰üp²£äOëAd tß ½ûá·èä¬M[+Nõ…¬'Oàâ­úø;]¼¤¡½àvÍmÝYyå"Ÿ¹‹÷vtÞ²žHÜAïA²%{IE,jÈ’Çz"‰“ö~r ÓÃiãœ&OBú¹õDâ9çš®-X^Å ô½¾+pì²õ8?í÷ê …ó kSÒ‡ëÙ´l}C‹õDâ&zJÈÒ†›Cò?¤õD2jÚûI€îMçiãtrëqÄÓiš1;·1·`ÿÅÖëÖãH<´Ü(:8´ùóŸÓ2J8»‰3‹KvÿÄÿX%.£÷ Ä‡´Ù¸çÉÃý!…È"å»hï»}›ÖÍ ÒÀk¬Çvçn¤¸ìø¤ÌÒT_ÑûÅGn÷ܳžHFG{ÁuƒíÓs¶qj|–®:¤ÄGïAy$ù "‰\²žHFJ{ߥøÑÑ´éÛ´nº7 Üz"‘\íêy뽯‰—)s6ï©>²žHFJ{ÁE®üþgβÊX›µ°¬©õë‰ÄÅô”'×ÜÖMÅB‰t"£¬'’ÇÓÞwz5횎ÍÁÑ·õC' ž½’½¤‚»š•WÞl·GFD{Áîܬ^W?ÁWÄa±j¬'×Ó{PÆ ‰kªdIE^YO$ÿG{ß]hÔôjŽŒŽMÓ¶GdDö}õëÔy~îíâ•;:oY#¡½à|_þòtf)Ç”ê+Z[z´/<`=‘$½e Eú£¤Å¥"¯H-ë‰ä‘´÷Ý‚M—æ°èÕ´ëèàõD"£Ð äÿ1-£„áŸÖÉ#i/8Ùés/¼º“â³hEu÷ÍõD’<ô”1GFå½s Yd f=‘<„ö¾óýS¤S}E*Òâj­7¯\žŸ»¥¾¡Åz"ñ.½Å8-ÛÏ=$ÉFÒz"OÐÞ7A¿¥åòÍÓxé½Öãˆ8Ôºó3æoç—²hEukÇ ëq¼B{!av}q:-£„o{âÌâõ;#ýQë‰ÄÓôt¾¿õ"ùI endstream endobj 177 0 obj <>stream H‰ì×ïKÝeÆñ¿!2D>ÈG…uÈ`ÂŒ~‘°=˜#ëÉ|°Ê¤ÉòÇÉ­¦9ÖNe¥‡èࢡ5C&Ûœ­VÌÂÃ2™¡âÐŽÎsôèzƒCh,§žsöù~o¯rÀgnîïõ¹î»wÝ_LTëy♚Ǟþ03PûÉ™‹Ö¹ï»ÿà´ùµd»ŽLî=ØÆ™ç6µ‡†¬Çñº¹ùø‘ã½l„Œ¼êŠšîÛ3w¬'rŸöÂ#ÐÓ?òäž8gþŠßúB[¼ þÓ \H~­¹K*¾úö—«!IZ’™Ö¹L{ÿ‘ábÓfé´4[ú--×z"߈ŒN—”wVÙ»‚ƒ‰åë‰\¦½Vcã3Ï¿\-9Ͼrbè×[։ܣ÷ x IN®&ÉI~ZOä&íýG€îJƒ¥ÇrÔtZš­õD"¾Ôwéfþ¾V¾#~{úG¬Çq–öBšÌÍÇßùà›Çóª9Þùõg¿¾f=‘Èè=(ÞÔþ™Ìär’Ÿ¤(Yj=‘k´÷ÓÖºÖ`i³Öãˆø[by%Ø9˜³»‘oª¤¼+2:m=‘ƒ´ÒátÇ•Õ>“‘Wý^ݹ…Ø’õD"÷Ó{P<‹Ì$9ÉO®(YJ¢ZOäíýô¡©ÒW9^º+ –k=‘ˆ#f£±ŠšnöBf öpãù¹ù¸õDNÑ^H­Ÿ~îÀiŽ”¿—Þ83>ñõD"¦÷ xÜÄT”]Sr•tµžÈÚûé@;¥£ÒTé«´Vº«õD"ŽLî?t–Ë-lj Yãí…T¡º”U…9Ìùõ5'¾¿xuÔz"‘õè=(¾@–’¨ä*וŒ%i­'ò=íý”£—ÒN9Uš*}ÕzÇ…{oŠšùâ ŠO]¾6f=Ž ´’_L ö¯Ö•ÒÊÐØøŒõD"§÷ ø¹JºrcIZò–ÔµžÈÇ´÷Sˆ.J#å“Òd5‰Mn“ÞÖy”öþÑ!i’œ­’ni=ŽˆlZ{h(·°‰¯xÿ¡³Ã‘Iëq¼K{aºEâ0½ÅId5‰ÍÝ&½Épëq¼H{ÿ¡t‹Dœ1n<Ÿ¨ÍÈ«~ÿè·ük=‘i/<Ðåkcŧ8™@Qs¸÷†õ8"©§÷ 8ŒÜ&½¹á$9yn=Ž·h﯃®Hc¤7Ò骎"nˆŒNx·ƒèËÙÝìL,¯XOä-Ú ÷Ÿ)­ q&;òë[Úâ‹ ë‰DÒBïAqéM†“äÜsRl·žÈ+´÷ˆ~HK¤+r8ôFÚ£õD"’b=ý#ùûZùÆùí¿ò§õ8¢½°f!¶Ôp²/kgRVž˜ŠZO$’FzÊv@’“ç\u²„'ç­'²ç•½ÿ¯|  endstream endobj 8 0 obj <>stream %!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 13.0 %%AI8_CreatorVersion: 13.0.0 %%For: (Apfl Strudl) () %%Title: (FIFE 2d isometric engine.ai) %%CreationDate: 7/18/2008 4:52 PM %%BoundingBox: -306 -534 894 1386 %%HiResBoundingBox: -306 -533.8701 893.8496 1385.8896 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 9.0 %AI12_BuildNumber: 406 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_TemplateBox: 298.5 420.3896 298.5 420.3896 %AI3_TileBox: 10.1968 14.4746 586.1973 833.5942 %AI3_DocumentPreview: None %AI5_ArtSize: 850.3937 1275.5906 %AI5_RulerUnits: 4 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 10 %AI9_OpenToView: -879.3496 1175.2588 0.6667 1610 1103 18 1 0 73 97 0 0 1 0 1 0 1 %AI5_OpenViewLayers: 7766677777 %%PageOrigin:-165.4004 159.8789 %AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 178 0 obj <>stream H‰ì×ßKÕwÇñ¿a ˆÞC8"è…Æbp]Ô ÐE AA-1Œ0'l›F±„°³11ë€é…êlSfsÊ)=Úžð‡`£¥žsÞçûý¾„äÝë{<ßÏëõy÷.DÇg+Oõ|òi ?G¢ÓÖqD$[R{ûá{ÏŠ«Úyßš̼Z±N”~úå7>~Z16‰•¼ÉGñYÃ7SñEë8"Ywíë'|áùiD$ë8Õ9ÛùÂsÎsÚ[Ç1¦ÞkMÈÂ>d%²­‰HÖ­&6›C‘‚ò+…ÖP×èúFÒ:‘1õ;áó³ßj'ˆßè>(~à Ï9Ïמ3Ÿ“ß:Žõ¾ƒÈd ² Y†ìCëD"’Sñ™×ÁÆ>ÎÃÒÚÎ;ƒ“Öq,ù¹––×.\âñ‹*Ú®v?ÙÚÞµN$’;ºŠqÎsÚsæóåçü§¬ðsï§±ýX€|¬A6¡u13ôøe x‹Ó ®¾w"6odž?{!¹“êî+®jçÙÏ]œ[HX'É5ÝÅ·8ó9ùùþÓt`(§üÙûiì=VŸ hGDìÑ×ÃOU^sî Ko­åš{ᇟ¥xêš3á±É?­ãˆØÐ}P|ŽóŸpîô‚uœÜñaï;Øx,=žÕÇöcZ'‘<²´¼váòPúˆØÚÞµN”;¾ê…øÌëÓçïò¼¥µw'­ãˆXÒ}PtÀ»@;ÐÖqrÁW½ï`×±îØx<8{ÕgHDòÔDl¾®¾—³¢ìä͇Ã/¬ãäˆOzáÍÚöWW,(¿Rh½Ô1̯։DŒé>(â èÚŽ )<_>éý4»ŽGfã±ô¬ãˆˆ DbÇOÜàÜ6öMÅ­ãdç{!µ·ûþó’ê³þËïg^­X'É ºмv #x)è Zƒî°N”-žïý4V[އe×±î¬ãˆˆ›¬o$C]£Emœ!M-V›Ö‰²ÈÛ½Ÿ­<ÕÃòs$:mG$è>(òo4Eº5hë8YáíÞw°ÜØo<&[ŽEÇ®³N$"®4·8Û<ÀaR\ÕÞÝ?–ÜIY'Ê ¯öÂÌ«•†¦Ο/|ïYjoß:‘H~Ñ}Pä?Ñ´ÝÁ BÐ&Ö‰2Ì«½ï`­±Ùœ?+Ž-gHD\/:>[s&Ì©RñE÷HtÚ:Næy¯Ö7’¡®ÑÂ@kAù•æPd5±iH$é>(òt BÐ&t Íb(c¼×ûiì4ÖOÇrc¿YÇOùn`¢¤ºƒæôù»ñ™×Öq2Éc½pgp²´¶“' 6öyì/%’YºŠü/z„6áM¡Yèë8™á±Þwð—b¡ñ\¬56›uñ¦7kÛ—:† ­üã?üj(3<Ó ±ùºú^ž%¼5ôø¥u‘|§û ÈG¢ShÞZ†®±ŽsTžé}‡W癈ä­ßÿøëôù»¤%Õ·ï?·Ž“è……¥·ç.òÇ*¯]?M‰¸€îƒ"f¡_hÞ‡Þ±Ntxèý4–{ŒÇa›±Ð¬ãˆˆŒD§+OõpþÔœ GÇg­ã‰«{ak{7]Ð.--¯Y'q ÝEŠ–¡kxqèÚ‡²Nt®îý4ÖŒa±Ê¬ãˆˆ%wRÝýcÅUíœE MæÖ‰ɽ½ðpøEÙÉ›„¯«ïˆÍ[ÇqÝE‡Æ¡wx}è šÈ:ι·÷,.vÀc‰±Ç¬‰ˆ¯­&6›C¥¢Š¶P×èúFÒ:ѹ±¦â‹ÁÆ>b?qc ³Ž#âJºŠíCñÑG´’uœpcï;XYl-ùY_l0ëD""ÿH_OJk;]w=qW/pø7µ<"0u@)P Ö‰DÜJ÷A‘#zÿzB7¹åzâ®ÞOc_±²HÎâbwYÇù°¿{Ï5, endstream endobj 179 0 obj <>stream H‰ì×ïK•gÇñ¿a „ Âð‘#A 䃞ÈJ!BOÁ2Q” ¥3ÊVË5¤8[hŒuX4sD‡Pœ‡)¢¡N9áÏ£GÛ{8,èçºïë{ŸãçEH>¹¯/Âu}>ßgÏdO ºøÑ'_UÖvFg­ÇyW?ÿ:ÁÌü´ä-[ÉΫ÷òËZ™öó†þ™¹¸õD"™­å›_¸Mü´D$³‘G¤·‰„"§H+ë‰Þ"Sr?NE³bfZ]Ëz‘7ÙØÜnÝÍ+máÕª?sk~qÅz¢·Ëˆ\ŠL–|ÖÉœ5¡ÈÈ”õ8"Ù@û ˆ‡È&Š;EZ‘YÖã¼IFä~ =Š6Å´4+ú-Ëz"‘wÂóU×8)ÏWÀsa<¶päD/”·}×?j=ŽHöÐ>(â9rŠ´âf‘\ä—õ8¯ðÜO¡;Ñ èQŒJ§¢YYO$"òÞF£³•µÝ¼cÅUáá1ëq^+°¹ðteótÛí}ÅçùÇøÕz"‘¬¢}PÄÁ¯Àæ~­‰îÄô(Ú”õ8""¤÷æÃƒxÓªŽ_y<1o=Î+3zú”·1Ø‘½þõ·õ8"YHû ˆH.ò‹+F–‘hÖã¼$˜¹ŸBS¢/1݉e=Žˆˆ7V×M—îä–4çì?×Ð4¸_·žè%AË…ÈÈTEMˆ‘J«»†"“Öãˆd-íƒ"~#ÅÈ2.¹FºYóBÐr?…vDG¢)Ñ—hMt'ë‰DD<›^:vê/p~Yk×µûÉ]ë‰^N.ÌÌÅӢΫ÷[Ië‰D²™öAÈ2\㺑q$õDÊý½(ý'¢/YO$"â£ÈÈÔ×yñJ«»†"“Öãü+¹°º–hºt'·¤™Iš—ãë†ÃˆìÚEœ!×H7nIGÞ‘z†Ã!÷ÓèB4"æ¡Ñ‘¬Çq!¹³ÛÓ÷  ¼×ïhýõØô’í<æ¹Ð?-«1Ìs?…þC b½ˆvd;ˆˆcOW6¿lý)gÿ¹}ÅçO·ÝæW«I sa4:[YÛÍéE‡.†‡ÇÜ ²—i1AÞ‘zÜ>t?€ù>Hç¡ùÐhAt!à $"bn<¶päD/ÏòÇŸ¶?ð‡É &¹0¿¸Ræçæ•¶´‡înln»<]Dži±Cê‘}$ w4$]žn»Òvè< @ÿ¡™Ì "4¼ÉÅU¼5¡ÈÈ”ûÓ]æÂC°®qÀqŠHšöA[$ 9È5$IFòÑ͹Vû ‡žÃÑt«mTD$°[ÉΫ÷òËZS[ÒÌ\ÜÙÑ.s!<IêùöAz í…Sh2ôÿÉn›Ûí¡»¹%ͼ¨'φçWü8ŧ\ŠL–Vwñå‡/GF¦¼ý¸ˆ|8íƒ"En’žÜP’”<õöã¾îƒt ß§½Ðah2~œ""²§ÌÌÅëxZóJ[¾þö·ÄVÒÛï{ž ±é¥Ú/~ä›åm=}’;»^}YD<¤}P$ÈHO2”$åž­¿N¶zõeŸöAú -…®ÂÇé-´o¿/"²ÇFg+jB¼±ÅUáá1¿ü¾¹ðrû1µ endstream endobj 180 0 obj <>stream H‰ì×ßK[wÆñ¿aL¡P†W– HAÇìh·âE… [‡D:o, 3Z%hÕ2S©Ú -F´“Ö®-ʨzQ/*…°:ÑÒŠ!â¯D£î!ˆ]4ÉÉÉ1Éû…„ü8çë÷æ|Ÿç³·ÓÊjègÇŸù¶¶¼âÖõ1öµ,ÖñÛÓO>ÿU¯Vo@LJRå©RUÙª„MI°>zöFϾ^/å}üÚVÙ£eË«]S3 )\pРgº¨Â©ó¶ªnhÖÿ!%k¦*¢{»rý~ªöÀ<̃@¦Pª*[õÀ~öE—ÒÖàj©µ7u-¨`|o€c­­‡›£ù¶¶¼âÖF»/Ü0¸ ñ\˜˜þ·¼Ú¥El•=©Êfc2‹V9«ÇV™ûâå[#ë¤dTQQQ'Q3Q?1¸ ~þ¹åš†ç…e÷ðddg7饌äÂüb°¶É£ÛOŸëì˜oE’Þ€4c2ŽrVi«ÌÕëüU '±ˆñyP­CÝC D먨“$½Àˆ±qéå;:õª÷É-’\.l†¶oö>-(i×½õ-Þ¥Àzrÿ€U˜ ¥ÌUòêùU Û»Ÿ(‘ºÝà<˜’îH•Èή{x²°Ì¡“¹¦aÄ?·œè IäÂßÌ™‹·tWåµ{¯fß%úœ̃@FSþ*…õ+‘•Ëñߘô<¨Ž¡¦¡{Õ:Ô=Ô@]`’@p£ÑîË+nÍ·µ5;G×ÖÃñß›P.(}.ÔÜM"}œ4̃@P+‘õ,Ÿ¿Ú§ŒŽç–$æAõ µ u 5 õ µŽd÷ 0ѬÿCUÝù¢ ç g:λâÌ…÷K«õ-^]YPÒÞåz¾Ú6¼_Vb²ƒY¹¬tÖ­¤V^}}¢ó …z…nQÇPÓ0¼_€¹¼_Û*{tn—W»¦f޽þØ\oEz&N•vè²Ú&Ïüb0¥û` æA ›(•Ñz¨•×·ûǕݱ®ŒT‹P—ÐÅêj)Ý/ÀDJeAœÜѹèt S0Ù'ž .žy0þépb½_Z­oñê0/(iïr=ß mÿïe±raÖÿáÊõûú©¨Â9è™6¿ÒŠyÈVJme·ðªº!¥ù¡_žÕÔÔtZ„º„ùû˜èÕì»óWûtªŸ¹xëoæã >Î…•ÕP£Ý—WÜšokkvŽ®­‡Ó¸_iÂ<d1e·\9®4W¦‚ÑŸŽ˜ÕÔô«šƒúC÷ 0Wô„¯¼vïÐ 0";»îáÉÂ2‡¾©iñÏ-[´_¦c²žr\i®']É®|WÊïŘÕ Ôô½Ú‚:ƒEû˜h3´mï~RPÒ®Ó¾¾Å»Xßÿ>š ýýOéå;z¯×±q¿µ»`6æA G(Óæû¡yP}@­@ߨ!¨'¨-X»[€©æƒµMû§ÏuöL„·"û¹p¡æ®^ ËîáÉÈήÕÛ`:æA w(Ù•ïJùhâ+ýÕÔÔôQÝ@ ÁêmÒäÅË·åÕ.ÿg/uóc¿Þ|ZÜÚh÷‚Vo @š0¹F)¯¬WâëÙÿú‡~u½QP+°zk üôËû¡ ¿›½tB ·0¹©½gl?úÕÔ¬ÞÀS3 _~û»²àì¥î¯¾wï‡Â·+«!«· M˜\£”WÖ+ñõì+ýÕô¦¼Ú¥V`õÖi2¿¬mòèü?UÚq»<¼yôì>V|×§×Â2‡{x2²³kõ6‹ü'À1áWú endstream endobj 181 0 obj <>stream H‰ì×ÿKUwÇñ¿a„Â𧆠ÄÐþAʘA˜HøK[DP7QÁÌcÓ%› bÜ -Tƺ,­»Pœ²+NÃLwïW¯º'&n™Ý{îçãÕëëˆÞ{Îç|~9Ÿ×ë½µutÔ|õÓ{\åw²7""ÖE76ow>ÉÈ«ã­/ø´•ß?þ<Y‹Þøú—95ü[~±{r:œìmŠˆˆE+«ëõ¾‡Î±þŠfvÁùœDpr¡/0–s¦…¿O½ %w·"b›æA‘#‚L'ÙyßIy²~;÷oé´>IóTÓh ÉÝ­ˆˆØÐ}ÿ÷“§9í K[Ÿ¼ØùÕÎ\ˆnl¶Üyœž[Ë'ç.ÜŸ˜KÒ~EÄ:̓")'ÍyÓIvò”ßúoîo£Ðøœ¶ÐÕLÒ~EDļ\åí=–u-ÍSímX\Šìã~EdŸhIad7 NŽ“æd:ɾýծ󠃞@[à[šýa÷+""æqøŸ¿âçTwƺ•Õõ]/{[.<qÉÌ‚†Žž§ö÷+"ûJó Hª"µÉng¬#Íÿ÷íó h Î É5´ˆÙù%ûûÃ"kÑæöGé¹µæå»'§Ã{\¼w.øû‡³‹nrAaiëPpÊÎ~E$ 4Ф’š¼æÕ&»Ið]¯Ù;÷4ú—Ñ%hô ;ûóúcΗ_â †Þyý;saeu½Þ÷ðDN3]ÎÌ.ݯˆ$‡æA‘TB:;yMj“Ýo»2–yÐA‹ K8Óe,׋ˆHrŒ¿,®èàÜ~ÿÃúo»ñ®s ©¼|/– ‘CAó Hj ‘ÉeÒ™7š¤&¯÷¾>öyÐA£ Wp ƒ¦‘ð~EDÄ¼× «—ê˺v<û:ðoì÷Æ• CÁ©ÂÒV®?yºÑß?ìv¿"’|šERYL"ó.“Îdt,·Ä;ný[3è4/jïÇU3DDÄªèÆæíÎ'yuœíŸT~7>1ï .r¡«7˜YÐÀ]EemÏF^ÄûD94Šjä/)Ì[L"“˱ßè"÷t š÷Ò:è4xW³ƒ¡ü'sΙ–¾À˜»EÜåÂâRÄÛ4æ©æÞ*oï|xÙÝÓE$Y4ŠRd.ÉËûK “Å$r\·»žô Z+œ:{‹ânIP诿Ï]¸Ëiœž[ÛrçqtcÓõR‰äÂätx{Íí"kQ×Û‘}¦yPäÐ!gI[2———ü%…],’à<ZÝc{ãs®—‘x-.E¼MižêcYת¼½óáåL<ƒ¡ü‹äœié Œ%¸ÙšE–œåµ%sI^×ë$žû=„6B'¡™ÐO\PDDÞé{ÿo™ ãEemÏGgŒ¬i*nw>ÉÈ«c©âŠŽ?þ|edo"bæA‘ÂT%[yaÉYÒ6ÁÕL徃6B'aAúIGÏS#kŠˆÈ›†‚S…¥­œ·ÙE7ýýÃW6˜ ¯V/Õ=8ž}þàßÄ×K4Š|6‚Õì<è ™ÐOX–®Bc1¸²ˆˆÌÌ.|þeg쉜šzßÕÕu³ëÏ…‘ñ—Ŭ™‘W÷MשeEÄ,̓"J’òž’ªd«©em̃ ŸÐRè*,^~±›öbv}‘#hçÑZyùž¥£ÕR.ôÆ<7³r~‰/02»¸ˆ$Nó ÈEn’ž¼¡$)yjvqK¹ï «ÐXXŸöB‡¡ÉØxŠˆÈQàïÎúè'jaiëPpÊÞƒìåBd-ÚÜþ(=·–õ?«êšœ„ˆ¸¦yPä"+ILÞMÒ“ %I?Âê<è ·Ð^xÊÉÓô{IIÏF^•µqŠf4tõm?Îv.̇—/\ýG¤yª½M‹KK‘¸h>stream H‰ì×ßKÕwÇñ¿a ˆÝACA„¼ÐX dë¢n d]tád#èBÈ£%†æݦQ¬dB˜sm2tX¹ÍÃt¡¢¦œòçÑ£î_9£QMÓó}¿Ç׃8d}^ø~_¯Ïæ¦xØÂb,ÐØ—‘[ûÞûç+Îß™‹.%é ùƒ#øLÒÿŸÐÑÎ*là¬â²¶GÓÉ>ND$ðò¯ t§eWS”Õà¡îôE@pС£—)ˆ¤ž%"Ûqñ‹{<’|Z‘—W'úÑ«“k÷ÁÍW/¹,œä]rEDü.¾¾ÑÔÞŸ™_Ç ³´âÖÓ‰¨kG»Ù ·{>v…ãŠJZÃã.œ("o¢û ˆІt"#ýHKºp¢›½ï`Õ°m8”ÃÚ‰­Æ];ZDÄzC#yÇ›yOœ †F]>Ýå^X^Y»¼ ï"‡–WuMÍÌ»s®ˆü‡îƒ"¶h@zÇN¤éGwÎuÿ>è`á°s8šÍÃòqùtoŠŒÍž8swãÁ#õ­7šd0é…‰©§Ïv&J0¶wótÙÔ}PÄ­G÷Ñ€<ƒ´!èæéV÷Ak‡ÍCöÏŸ=3É "âÏçWÎÕ÷¤çÔð‡¿ð£UÃ^ •´pzNñÕ®»OÜ ²Ÿé>(b‚¾£õxúh@zÐý¶÷ÁM/M +×:‡©çm|âÌõáÈ´mó^àÛÈ*l CqY›ù·!²è>(â2:Ž¦ã¹£õè>«æ½ïàÛ`‘„EôMÇ mׄF Nyûå~ÔÔ±Žó’zaa1hìKÏ©IË®® tÏE— ÈìºЏ†^£Ýè8šŽ¾£õ Ãx¡÷ØB,"ò°ŽØHÖqDD’èéD´ì³ïxãeæ×5µ÷ÇVãÖ‰¶x§"c³¥·œ¯(xãA|}Ã:‘H*Ó}PÄtF¯ñ¸Ñq4u"õ¾ƒEÄ.r¾¢S•ì%ëD""{la1hìËÈ­åEWqþÎ\tÉ:Ñ+¼Ö ¡Ñ¼ãÍDâ³74bG$eé>(’l´X¢Ñh7ë8[¼ÖûÖ‰`ì%VÛÉ:‘ˆÈÞèè>v…÷[qYÛ£áIë8¯áÁ^ˆ¯o´Þ|xðH=ÁJ>ý626kH$é>(’<4ýÅ#F—Ñhôšu¢y°÷XJì%â:z™eGDdW~ým¢¨¤…w÷ÁÛ=­ã¼‘g{áùüÊç~HË®NÏ©9WßÃÖ‰DRŠîƒ"É@[ÑY4ýE‹y°¼<Ûû ¬&¶!ÙQƒáqë8"";653_^ÕÅ{ì@ÞÅKÁûË+kÖ‰ÞÆã½0™>qæ: ³ ®uYÇIºŠì9zжâÉ¢¹è/ë8¯çñÞw°XPì(¢²©XVÖ‰DD¶%¶¿Ür^_§ÏvNL½°Nôÿ|Ñ ßÿô{NñUrœ öýmG$è>(²‡è&Šgж¢³¬ã¼/zßÁŽbM‘–eÅõ•eHDämºî>qî,E%-ƒáqë8Ûå—^ šÚû3óëHK;<ˆZ'ñ7ÝEö}äÜYh(zÊûw¿ô~›ŠeEfV[Ë:ŽˆÈk G¦?þ¤7UVaõÎ!ë8;ã¯^˜š™/¯ê"pFní…¦{Ë+kÖ‰DüJ÷A‘]¢ƒh"úˆG‰n¢¡¬m‹¿z?}ÅÊ"yqY»Ë:ŽˆÈ–¹èRe ;-»:=§&ÐØ·°³N´c~ì…GÓžúšØ‡]éè[Çñ%ÝEvƒö¡ƒxˆè#ZÉ:Îø±÷¬,¶‹‹ÝÅúbƒY'‘}-¾¾Ñzóaf~/ÕÒŠ[‘±YëDïÈ¿½èâJ¿òW‹xîƒ"ï†Æ¡wx|è šÈ:ÎŽù·÷,.v¿,xã{Ì:‘ˆìG½¡‘¼ãͼ‹ø ŒZÇÙ_÷ÂòÊZÝ—?gäÖò+”WuMÍÌ['ñ ÝEvŠ–¡kxpèÚ‡²Nô.|Ýû ¬¯Äc•ñ/ÿ0–*¼ endstream endobj 183 0 obj <>stream H‰ì×ñKÔwÇñ¿a HþâO áDP˜ƒÅ@V?$Œ@Q?ôƒC…àRj)7\‘®p»)Á4v0nW›då&HåœÔ¶®ÑQ¢\¨y§§í _8bI »»÷×ï÷õøá~~¾÷ý¾_¯Ïóç""…ŸYlh~ëíS¥ÕÁÐÐdfsËz¢7õÓÏq~­Ù¹ÄlòXK˜Sì­ìê˜H¯g¬'Ùº>¿ÉWïõ "»ÉB¾2|5$¹c=ÑÎy ÷t0š}Œãþø[šõD"âq+«éÖàHq ³¨¼ýÄ™«O—SÖå†gráöt¢¦¾Ÿ³êz#£÷­Çq;ÝEþ'2…dá{!eÈëqÞ”grßA£•ÑÍhhô4ÏÔ3q›ÁðTYmûóÐñK±ø¼õ8¹ä±\ðð?%’[ºм9Bšð¥,ä‹õ8¹á±ÜwxòŸ—¸=¨©ïgÃêz¯Üx`=Nîy/VVÓ­Á‘â@gQy{sGôérÊz"7Ò}PäÈ„!MÈ’Åz¢œñ^îgÑÓhkœŽæ61õ·õ8"²ë%f“ÇZÂl•’ªî¾‰ôzÆz¢¼ðj.Ägš†9Ziu044™ÙܲžHÄ]tÙyAj| äib=QŽy5÷´5:Í3Òâèr։Ȯ´–Úè¾8¶§â4ˤ±-2·°l=Qy;®?¬³h=‘ˆ+è>(ò"Ҍ࣠/H ²Ãz¢|ñ|îgÑâèr–^G»³GDvî ŸäÂRòYsG´¨¼½8ÐyòìèÊjÚz"cºŠ8Hrt #H òÂz¢üòIîgÑèèuù½†¯hzÖ㈈KÍ-,7¶EØ{*Nw_[KmXOT8¾Ê…X|þÀÑÎ[VÛ3ž²GÄ’îƒ" H¾ÒŒ°§|•ûz펎ÇÁé{´>ë‰DÄEÒ뙾‰’ªnVı–pb6i=Q¡ù0"£÷u½œú¿øõÞ?ÖãˆØÐ}P|ŽýO ðä‚õ8…ãÃÜwÐñhzœ}oeÝh=‘ˆØ»rãs/¨©ï¿=°dž?sø,4N"pvÒŒ°žH¤Ðtßzñ^@øí^àÏÜÏ¢ïÑúx4ÀÈè}ëqDÄL,>èø%¶AYmÏ`xÊzK~Î…¹…寶ˆS >íÿe-µa=‘Háè>(>ÄžgÛ³óyùÙÿ¤€õDüœûYt? Ï6H'´GD êérêÄ™«EåíÅÎÖàÈÊjÚz"cÊ…ßþ˜}÷ð—<„}ûÏ…üÝz‘Ñ}Püæû‘?Ùó¼öì|6¿õ8f”û =6H'lîˆÒ­'‘¼Ëln…†&K«ƒ¬Á†¦áøÌ¢õD® \p\ŽÞszBÝ‘oîÆžX#’wºŠ°ÕÙí¼ðìy¶½õ8Æ”û/¢ Ò y ôCZ"]Ñz"É—ñ;+^à{ç÷ÚøCëq\D¹µ²šî8}OÅiHc[d)ùÌz"‘<Ò}Pü€MÞtê^uv;ž=o=‘=åþËh†Ù–8vë‘õ8"’cñ™Å†¦a¾ñ’ªîÐÐdfsËz"wQ.üGb6yä“o`"½ž±žH$/toc{³ÃÙä¼çluv»õDn¡Üßý–è¼0ôFÚ£õD"’+«éŽó׋EåíÍÑ¥ä3ë‰ÜH¹°­ñ;kêûy2ºÞkã­ÇÉ=ÝÅÃØÛôñ†³ÉÙçÖ㸋rÿèŠ4Fz#íñäÙQš¤õD"²sƒá©²Ú6Þ£±ø¼õ8î¥\xÞ¢Òê ÏçÐñKz‹ÄctObW³±y·ÙÞìpëqÜH¹ÿZ¼E´GžMRo‘¸Â¿ <¯ endstream endobj 184 0 obj <>stream H‰ì×ßKÕwÇñ¿a DÂèjãÀA@Çôb‡á…²!t# ’Œ$‚ürı҄3½¨&ë“äLØDe¬2ÔFž5%Ž˜†EuÜñgmÏáˆm¬M=Çóþþx=л7Ÿ>ß×ûõyõJöe2¾XVÝóÖ»‚¡ÎèÈ´õ8N÷ý8+þµÄ¡VR› á¡#Áæ¼@#¿ð§õD"ÙÑzù¾}þµD$;^Ç5?Šëÿ ½¿GtHš$gõþÇ_Ò-­Ç‘=YZþí“Ïúùrµ~ÞÛz‘¶žÈ´öbnþiemUPî½1‘ÞÞ±žH$SzŠ—Ìä3Wš¬&±­Çq4íý½£IÒ'i•œ sa)i=‘ˆ¼ÑÆæËöÈÝöÌùèò“”õD®¡½°wñ٢ŠnŽ«¤*OX#’½ÅHc2™ËL>“ÒÖ㸀öþ~Ñ*é–=“¶Iç´žHDþi`è×w>ø‚ï´¬ºççûKÖ㸌ö¾¤·wº®ŽåŸhãÐNÖÝL<|n=‘Èé=(n·°”$‡¹Æd2ÉL>[OäÚûCägrttÎþï~±GDþ45ó(Tse÷Û¼5·Ç•´àYr½¾i0/Ðx´°¥éÒèêÚ–õD"û¦÷ ¸©Kö’Àä0iL&[Oä&Úû™ mÒ99@ú'-Ôz_#üë.|Ë÷¨Bž!í…c°8½ã¥×£÷¬Çٽť(䤮 ùiïgˆÎIó¤rŒgÎGi¤Ö‰øÎÖ‹t×Õ±üm|†5Ÿ~³°”´žÈÝ´2™”_ä ˪{&ã‹Öãˆì•Þƒâ:d,I˽%uÉ^ëqÜJ{?+蟴PN’FJ/¥ZO$âñÙ»øúJª"±ñ„õ8^ ½¹Í—í‘;ÇŠZ9ÉSgo/?IYO$òÿô!WOŸàÆ’´ä-©k=‘‹iïg]”FÊyCtTëqD +Ú V†c³ÁP'‡_R‰'¬ÇßÑ{P¬xä× $ ­Çñí}[4^z/ÿt`š0}Øz"Ñ‘éÝ&\VÝ3_´Ç׬÷Âï ¶2I endstream endobj 185 0 obj <>stream H‰ì×ïK•wÆñ¿a ˆÂðQC8èÈ`2VP,Ä$b‚ AÒüA¢¸,Ãr‘›ÆÎ“ÃWÙÖ¥emÓ"‰K\†Šî„¿ÎÑ£íŽV£ÌG?÷}Ÿëõà Ï>ðýÞ×çú>{–À¢ ±ÆÖ¾»«ßyïËßÿ02¶žHÈɯæâñk=ˆ$R®°ÔÏÅ#÷H?2Ðz¢Dôã/8~­Ih·ïÍ?ÇAøòÝ÷­ÇÙV÷Œå¾ÀýOË©û>ð‡õ8¢½`o*L+¦ÓéÉ´eë‰D¶Dli¹©ýæÎÝÕäOAq磿þ¶žHþ£½à(þ®»+­ioþ¹ßîZ#^¦÷ l^¤7d#߬Ǒç´÷ˆnLCæ\hËtfš³õD"ñtµçaæ¾&nxöÁæž[¬Ç‘ÿÓ^pšùÈbmó™'9—¢²ÀØÄ´õDâMzÊ–"»H0îiF¦‘lÖÉ¿´÷‹žL[æthÎôgëqDâ 4<ùñgßq«S³jZ:úcKËÖÉkh/8ÓÈh¸°Ô¿R¥¾jé‰.Ĭ'¯Ñ{P¶yuú|/ÙÅ#ÇH3ë‰äÚûNF[¦3Óœ9#Z4]Úz"‘ z:9Vs9ÙW™”^þEuÿZO$o¤½àd·ï9t–òå5ºï[#ž¢÷ l’мâj‘]$˜õ8òÚûηR¤iÑtiþP‘×ióßy÷ýZ¢æÀÑ‹C¡qëqä-´œo*-§ŽcúèÓV}S/zJ|‘Nû´s©È+RËzy#í}·à›¢KsXôj}Sâ=·elæÞúò”3n¡½à 3³Ñ§º“}•Iéå%Á©ðœõDâzzJ¼HäéDF‘Tä•õD²í}w¹Úó^͑ѱiÚÖ㈼ÑÈh¸°ÔÏ]ݹ»º±µ/º³žHÖJ{ÁEBÓÅ+ZKGliÙz"q1½eóH!²(5«†»D:‘QÖÉÛi﻽švÍêçàèÛ´në‰D^1Y¬8s-%£Š+ZT˜˜šµžHÖG{Áu®ßü3s_§ÆïÕž‡Öãˆ[é=(›ôSoèE‘KÖãÈZiï»ÔTxަÍÙѺéÞ4pë‰Dž»Ü•[ÏÍÌ;|a`è‰õ8²Ú n[ZnéèOͪáì Š;CÓÖ‰ûè=(Fæ<ÜRˆ,"‘¬'’uÐÞw5ú6­›¤ÓíǑ„ÆmÜ›N·Ñ´Üëét¤¤"˜”^žì«(ø–“Ý•[)8h=Ž8‘Þƒ² rƒôà†$ä‰õ8OÚûFW?qª›ÞN{§ÃÓä­'‹--·tô§fÕÅ¡áIë‰d«h/xØ‹F÷á'çÕèLü#Ày%5Ó endstream endobj 186 0 obj <>stream H‰ì×ûKÕwÇñ¿a ˆÂ á ˆ¡ƒëŽ’ ƒ F CFLÈ£%†Ãå™qÈì²T³³µÖmë”&#a¹Ñašd˜(Çy;G¶'Í.Sóœ÷÷œïëñÃA{Áçóþ¼¿¯gÏœëÄ—7ßxû¿ÖAÄYî=)Ý–»±cOKwpÐ:Žl½Ÿ~ý“óå×:ˆ$Kxd²²º‹SÎ+njïì/¯X'’ôsãv¸°¬[Ä/[Ç‘äÒ^Èl ѥ㾛9 œrUm`|bÆ:‘8…ú ¬115Ç+Á­àÅàÝàõ°N$I¡½ï¿ÜùKßó² á‘ÉÊê.nN^qS{g|yÅ:‘$ö‚ŒŽEîá s‹}½±Å¸u"±§>(«xxx¸¼¼Ö‰$‰´÷݃/y¾çùªçÄùÂç;ß:‘8Úì\ì³æŸ³=õYùu5ÞàTdÞ:‘¤ˆö‚{ô<*)÷sÜžÒÖnüaGŒ©Jï?o—÷WÂ:Ž$ö¾ÛLÏDù¶ç Ÿï|¾öùæ·N$Nt®g`û®f‡>>?~jGRJ{ÁmVç}ßÁ šw7S^Þ®o/ƒuIí}wÒ¼ËËÜ|\RîçnxJ[×XÇÚ .4==Út%ÛSŸ•_÷éñù×:‘Pt3¦þHãe^Þ^=®¢½ïf|íóÍÏàûŸ`GŒŽEîá>l+<ñÅ×·c‹qëDbC{ÁµÂ#“‡.qúyÅMíýñåëD’RêƒîĤ3ïL=§Ï À;`HRM{ßåøæ÷uôòýÏ5  Ь‰…èÒIÿ­œ‚®AUm`|bÆ:‘XÒ^p¹«¡‡…emÜ~C}ÃÖq$uÔ]ˆß¹÷tbÞ™}ë8bC{_À÷?-€›@# Ð¬IêtwìiáôwWœ¹?ôÄ:ŽØÓ^øòŠÿâÝÜ¢FnBeuWxdÒ:‘¤‚ú «0×L7'Τ3ïL½u"1£½/«èïU~Å} Ð¬ãHÒqâ¥ûÏêÄe íI˜ŠÌ×xƒYùuÙžzï©ë³s1ëD’\êƒ.Á,3Ñ9 L73Τ['cÚû²½€vÀ­ )ЬãHRLLÍUÕ8eÖKa!ºdHD{Aþm(ü”uÀ•ؾ«ù\Ï€uI"õA7¸ðíoÌrâ3é¶Ž#Ž ½/Ï£÷ݤ)p7h tëD²eb‹q_GonQ#‡{àpÏèXÄ:‘8Žö‚˜a×0¡œ)ÓÊÌZÇçÒÞ—u¢GÐ&è4 ú…j…óÅ—WÚ;û󊛘ñ?ù&<2iHÒƒö‚¬Swpð­w?ç¶”î?{è‰uy]ꃃyd*9M&”9µŽ#N§½/B§¨8t‰;CË kÐ8¬É‹…ú†wî=ÍI–µ] =´Ž#éD{AÖov.æ=u=§ ;S}ìû©È¼u"Ù<õÁ À Öxƒœ#SÉl2¡Ö‰$ hïË&Ð/hܽÃ:ŽüGxd²²º‹ÓÉ-jl;'¾¼bHÒŒö‚lÔèX䣚îijãëè-Æ­Éf¨¦5æŽéc9Dæ‘©´N$iC{_6‡–á¿x7ñìÐ>è Ö‰äÙì\Ì{êzNACV~]78™·N$iI{A6'Ô7\Rîçò¼ï»zhG6L}0}1q…em3È$šåøG€èè1G endstream endobj 187 0 obj <>stream H‰ì×ÿKÔÇñ¿a „ ÂG ÂѰý"C˜1DúAÂ!Ü/ ¡.QNŒ0s ÚvÛô@Š›°‰Ê˜±ÙèhJ*¢a™\ø%Ϯڊb_ ïîý¹Ïçõ@D{ùù¼ß¾ïõò¥ä£Ÿ~¹÷ÁGçùnDòÒfr×+8z¡°¼=Ð3µ½“²Nä]áë·K*»YçêÆ¡»÷Ö­ãHÓ]ƒŒÄ‹+‚ŒPmSxnñ¡uyWæÅñÝ:ˆ¼‡ù¥ vÇÞ±}Öq$/éîËÁqñé }„VbÇsâ‰Õªº~žYõ•èä¬uÉ{º r@O¶öZƒã‡Ê.òÅüjHÞ‰ú`~Ñ¢I¦èîK¦ÐDè#ŒÝ„†bÇÖm>;Ê3/òut…¦Ÿî=³N$n » 1¿´QÛf–Š+‚÷¬ãÈÿSÌ#ƒ‘8›ÅûbËØ5ë8’ßt÷%ƒRûiZ Ý„¡¢§ÐV¬¹Õï¯G}æÜ =jÉ ÝÉ ‰Ø‚¯¦‰:~*›Y¶Ž#ÿE}0/°GloŠÍb¿¬ãˆèîKÆÑMšÛ¢Ìm…ÎBs±Nä6ÑÉÙÒ“—yÂUuýñĪuqÝɬÔ~º÷ÚÍÃÇ:™«ú–‘•µ¤u"ùgêƒÇî4ø#¼#¶‰b³¬‰KèîK–ÐSh+LÍ…þbÇ%îÌ=¨nâ©–TvGÆÖqÄt$6“»þÀ£UXÞè™ÚÞIY'’·©:ûÂÖ°;¼ öˆm²N$®¢»/YEg9râ3F‹¡ËXÇÉcú(%9£» ÙÃ!à0`%•Ýë8òõAgÒG)É6Ý}É6š ý…äÑhè5Ö‰òLj?Ý{íæác<Àú–‘•µ¤u"q9ÝɶèäléÉËŒYU]<±jG^St¶ƒᥰ/luq-Ý}É ZLƒ?°Ñkh7tëDùa"¶à«éã¹?ŠÍ,[ÇOÐ]xº÷¬+4]äë`ØÎœ»±þhË:‘¨:ÑÜåu°#l ûbHÜLw_r‰FC¯aäè84ë8Ž6¿´QÛæYW†oYÇÑ]œáCïé³£úÐëêƒNÚO³ lï‚í`G¬‰ûéîKî Fât¾C뱎ã8O¶öZƒã‡Ê.òÅüjH¼EwAr,žX­ªëgêʪ¯D'g­ãx—ú 9æŸ-à-°ì…uñ Ý}1¡Êóo#ñ⊠[YÛž[|hG¼HwAL„¯ß.©ìföª‡îÞ[·ŽãEꃆ¸øL>ÏŸ-`¬ãˆ·èî‹¡ù¥ ZH¢YÇ1›Y>~*ÄÓ(ÿ´w"¶`G¼KwA¬lï¤=S…åíG/øc›É]ëDÞ¢>h‚9gÚ™y&Ÿùg ¬‰çèî‹9º¯¦9¤ щ¬ãXYK6ø#<ÃÇ:{¯ÝLí§­‰§é.ˆ­Åûë[F^ýKìûæ×ôóÖ‰¼B}0ǘíз¿1ç>stream H‰ì×ÝKÓq†ñ¿!bA!È@Œ 4òdAE0ðDð Ä<1"„\+Q Q1Ä+{¤ƒŠ”HAÊ”p„Cha¢¢j:®›)zÓ|y~›×ç@ðìæ÷=xvÅãp²ù…¥ªÆN—Û¿ëÀ¥â²ÀØÄŒõ"Àv{úrPW@­‡¶›~ÿ«tTêÕõ"lŸÖ`(=¯F¯ŸëmêZÏØ `‡S Ë¿©[ :P#XÏÁ–Ó‹{ šyq@œ|£.Pè"¨Ô Ös°%&¦æŠËze—Ûï«í˜_X²^0F¾S\©¡RÐ]P5¨¬aÓDcõ·ºS³+ô¸…¥m?M[/8=ø‘JA½ Ó vPA¨#¬a£tå3=uzÓç»z†¬ç„üª»ïƒÚABÁH\áÈøÉ3-zÇ}Gªn·õYÏ8=øDZNµÎ„šBea=ëðyfá|Å“”ŒòÝ™—/T>Ó¿Ö‹NDþB¡šPS¨,Ôd…óÅ–Wn>stream H‰ì×ßgÕqÇñ¿¡«Œˆ]FÝdLÔMÑM²‹º‰Dt±‹#ÑEd­f‘dbŠ5º¨CdMšê¢Fk7šZié‡9ýZÛŠzuU¢»mŸ³s3ÛÝëû¹y{þü °úݾÿlͦù]zuåË×…®ó÷šZºse:»†g«s¥­2 ‹?ú®ßÒ“ÜßqíÕLµô"ê`ù¤btVrhÒ5©›4NéE«Ãѩֶ y·m{ûGǦKÏ néA–[Š&]“s“ÆI锞SÓž¿ü°§ýJÞªyk參JÏ ÎéAVÆ@e<“£“ÞIõ”žSs>~ž?Ö;²vóÉüäü[zõO°b$Ïÿ TÆ›·öæ"ïi¿2ùâ]é94 =À {þòCª'×'”*=§°Ñ±ém{ûó-»ûîŒN•ž@cу‘öim»”J•žSÀ«™êÎJ^`ý–ž¾Á‡ ‹?J/ áèAJI¥ƒRC¹D)£ôQéE+äË×…®ó÷šZºóá'nÎVçJ/ AéAÊJ uv ç¥RIi¥Ò‹–WexbÃŽ³ùÞ]/?ž|Sz MP RF飜¤´RŠ©ôœe1>ñzû¾‹ùÆ;ÏÝyRzèAjÈÐݧi¥¦tSê©ôœ%óöýçÃLJò]ëZOŸéðmþ{éEð› ¦¤•RL馜§4TJªô¢%päÔ­|Ρ£×gÞ~*½þЃԠd`ê)*%Uz˘­ÎO¼.½þ¥¨Yi¨”TéP·ô @cÒƒI4&=üí—·ÇU endstream endobj 210 0 obj <>stream H‰ì×1€0Ä@ 5‚Ⱥb­ ÌTÐ!wÃÏ¿fo*îõŒk~{ú¿ÒƒMz I4éA€&=Фšô @“hÒƒMz I4éA€&=Фšô @“hÒƒMÅ|$ÀË endstream endobj 211 0 obj <>stream H‰ì×1€0A A$®h‘3 *`&·[|ýíÍ ÀýŒã¼ÞýûŸÒƒMz I4éA€&=Фšô @“hÒƒMz I4éA€&=Фšô @“hÒƒ°—%Àã6Ï endstream endobj 445 0 obj <> endobj xref 0 453 0000000003 65535 f 0000000016 00000 n 0000023056 00000 n 0000000004 00001 f 0000000332 00000 f 0000025131 00000 n 0000066131 00000 n 0000066203 00000 n 0000429745 00000 n 0000154958 00000 n 0000161883 00000 n 0000180714 00000 n 0000197328 00000 n 0000207051 00000 n 0000207209 00000 n 0000207367 00000 n 0000207525 00000 n 0000207683 00000 n 0000083463 00000 n 0000084658 00000 n 0000085820 00000 n 0000086977 00000 n 0000087232 00000 n 0000087491 00000 n 0000087746 00000 n 0000088004 00000 n 0000088259 00000 n 0000088513 00000 n 0000140567 00000 n 0000141770 00000 n 0000142991 00000 n 0000143283 00000 n 0000143575 00000 n 0000143868 00000 n 0000144159 00000 n 0000144451 00000 n 0000144929 00000 n 0000145946 00000 n 0000149243 00000 n 0000150204 00000 n 0000151172 00000 n 0000152191 00000 n 0000153146 00000 n 0000154061 00000 n 0000160899 00000 n 0000179603 00000 n 0000196011 00000 n 0000205444 00000 n 0000210707 00000 n 0000212330 00000 n 0000213936 00000 n 0000215550 00000 n 0000217165 00000 n 0000218768 00000 n 0000220278 00000 n 0000221813 00000 n 0000223394 00000 n 0000225003 00000 n 0000236272 00000 n 0000238100 00000 n 0000239957 00000 n 0000241800 00000 n 0000243539 00000 n 0000244857 00000 n 0000246089 00000 n 0000248138 00000 n 0000249169 00000 n 0000250196 00000 n 0000266517 00000 n 0000268197 00000 n 0000270023 00000 n 0000271844 00000 n 0000273742 00000 n 0000275572 00000 n 0000277419 00000 n 0000279216 00000 n 0000280941 00000 n 0000282520 00000 n 0000299014 00000 n 0000300891 00000 n 0000302734 00000 n 0000304591 00000 n 0000306433 00000 n 0000308092 00000 n 0000309381 00000 n 0000310695 00000 n 0000311961 00000 n 0000312888 00000 n 0000328622 00000 n 0000329911 00000 n 0000331733 00000 n 0000333668 00000 n 0000335543 00000 n 0000338276 00000 n 0000341086 00000 n 0000343912 00000 n 0000346682 00000 n 0000348496 00000 n 0000370017 00000 n 0000371954 00000 n 0000373986 00000 n 0000376502 00000 n 0000379012 00000 n 0000381819 00000 n 0000384549 00000 n 0000386774 00000 n 0000388815 00000 n 0000389259 00000 n 0000235604 00000 n 0000235827 00000 n 0000236051 00000 n 0000237877 00000 n 0000239734 00000 n 0000241576 00000 n 0000243325 00000 n 0000244634 00000 n 0000245866 00000 n 0000247009 00000 n 0000266199 00000 n 0000266358 00000 n 0000268038 00000 n 0000269864 00000 n 0000271685 00000 n 0000273492 00000 n 0000275318 00000 n 0000277161 00000 n 0000278958 00000 n 0000280684 00000 n 0000298497 00000 n 0000298757 00000 n 0000300636 00000 n 0000302480 00000 n 0000304335 00000 n 0000306174 00000 n 0000307785 00000 n 0000309087 00000 n 0000310403 00000 n 0000311669 00000 n 0000328038 00000 n 0000328330 00000 n 0000329616 00000 n 0000330902 00000 n 0000332644 00000 n 0000334564 00000 n 0000336426 00000 n 0000339193 00000 n 0000341997 00000 n 0000344800 00000 n 0000368198 00000 n 0000369077 00000 n 0000370924 00000 n 0000372861 00000 n 0000374923 00000 n 0000377422 00000 n 0000379948 00000 n 0000382718 00000 n 0000384941 00000 n 0000386997 00000 n 0000400073 00000 n 0000401675 00000 n 0000403162 00000 n 0000404727 00000 n 0000406289 00000 n 0000407918 00000 n 0000409535 00000 n 0000411359 00000 n 0000413187 00000 n 0000415003 00000 n 0000416958 00000 n 0000417952 00000 n 0000418935 00000 n 0000419892 00000 n 0000420928 00000 n 0000421945 00000 n 0000423156 00000 n 0000424811 00000 n 0000426481 00000 n 0000428131 00000 n 0000430803 00000 n 0000432386 00000 n 0000433963 00000 n 0000435417 00000 n 0000436981 00000 n 0000438587 00000 n 0000440178 00000 n 0000441756 00000 n 0000443367 00000 n 0000444990 00000 n 0000076490 00000 n 0000077546 00000 n 0000078535 00000 n 0000079520 00000 n 0000080477 00000 n 0000081448 00000 n 0000082453 00000 n 0000083719 00000 n 0000084914 00000 n 0000086074 00000 n 0000133291 00000 n 0000134175 00000 n 0000135095 00000 n 0000135986 00000 n 0000136880 00000 n 0000137811 00000 n 0000138707 00000 n 0000139649 00000 n 0000140857 00000 n 0000142064 00000 n 0000446543 00000 n 0000447465 00000 n 0000448184 00000 n 0000448406 00000 n 0000075155 00000 n 0000075378 00000 n 0000075600 00000 n 0000075821 00000 n 0000076046 00000 n 0000076269 00000 n 0000088769 00000 n 0000088990 00000 n 0000089213 00000 n 0000089438 00000 n 0000089659 00000 n 0000089882 00000 n 0000100511 00000 n 0000119040 00000 n 0000132973 00000 n 0000133132 00000 n 0000146956 00000 n 0000147115 00000 n 0000147274 00000 n 0000147433 00000 n 0000147701 00000 n 0000147958 00000 n 0000148215 00000 n 0000148470 00000 n 0000148727 00000 n 0000148987 00000 n 0000207896 00000 n 0000208155 00000 n 0000208412 00000 n 0000208667 00000 n 0000208949 00000 n 0000209241 00000 n 0000209535 00000 n 0000209828 00000 n 0000210121 00000 n 0000210415 00000 n 0000226614 00000 n 0000226908 00000 n 0000227873 00000 n 0000228894 00000 n 0000229864 00000 n 0000230831 00000 n 0000231826 00000 n 0000232828 00000 n 0000233763 00000 n 0000234652 00000 n 0000251202 00000 n 0000252249 00000 n 0000253449 00000 n 0000255060 00000 n 0000256694 00000 n 0000258290 00000 n 0000259928 00000 n 0000261546 00000 n 0000263152 00000 n 0000264719 00000 n 0000284107 00000 n 0000285679 00000 n 0000287257 00000 n 0000288887 00000 n 0000290509 00000 n 0000292124 00000 n 0000293734 00000 n 0000295326 00000 n 0000296562 00000 n 0000297565 00000 n 0000313881 00000 n 0000314886 00000 n 0000315938 00000 n 0000316942 00000 n 0000318316 00000 n 0000319971 00000 n 0000321632 00000 n 0000323293 00000 n 0000324883 00000 n 0000326433 00000 n 0000353704 00000 n 0000355143 00000 n 0000356696 00000 n 0000358314 00000 n 0000359938 00000 n 0000361512 00000 n 0000363111 00000 n 0000364710 00000 n 0000366210 00000 n 0000367210 00000 n 0000390593 00000 n 0000391622 00000 n 0000392533 00000 n 0000393518 00000 n 0000394520 00000 n 0000395513 00000 n 0000396450 00000 n 0000397358 00000 n 0000398248 00000 n 0000399150 00000 n 0000337392 00000 n 0000340174 00000 n 0000342997 00000 n 0000345767 00000 n 0000347583 00000 n 0000349422 00000 n 0000350355 00000 n 0000351268 00000 n 0000352188 00000 n 0000353117 00000 n 0000381594 00000 n 0000384327 00000 n 0000386553 00000 n 0000388593 00000 n 0000389036 00000 n 0000389480 00000 n 0000389705 00000 n 0000389926 00000 n 0000390149 00000 n 0000390372 00000 n 0000411141 00000 n 0000412964 00000 n 0000414780 00000 n 0000416395 00000 n 0000000352 00001 f 0000025032 00000 n 0000023107 00000 n 0000024914 00000 n 0000024946 00000 n 0000023190 00000 n 0000024796 00000 n 0000024828 00000 n 0000023261 00000 n 0000024678 00000 n 0000024710 00000 n 0000023332 00000 n 0000024560 00000 n 0000024592 00000 n 0000023403 00000 n 0000024442 00000 n 0000024474 00000 n 0000023474 00000 n 0000024324 00000 n 0000024356 00000 n 0000000353 00001 f 0000000356 00001 f 0000055594 00000 n 0000065502 00000 n 0000000365 00001 f 0000055718 00000 n 0000062754 00000 n 0000023545 00000 n 0000024206 00000 n 0000024238 00000 n 0000023621 00000 n 0000024088 00000 n 0000024120 00000 n 0000000366 00001 f 0000000367 00001 f 0000000369 00001 f 0000065438 00000 n 0000000370 00001 f 0000000372 00001 f 0000063101 00000 n 0000000373 00001 f 0000000374 00001 f 0000000376 00001 f 0000065374 00000 n 0000000377 00001 f 0000000379 00001 f 0000063415 00000 n 0000000380 00001 f 0000000381 00001 f 0000000383 00001 f 0000065310 00000 n 0000000384 00001 f 0000000386 00001 f 0000063766 00000 n 0000000387 00001 f 0000000388 00001 f 0000000390 00001 f 0000065246 00000 n 0000000391 00001 f 0000000393 00001 f 0000064111 00000 n 0000000394 00001 f 0000000395 00001 f 0000000397 00001 f 0000065182 00000 n 0000000398 00001 f 0000000400 00001 f 0000064435 00000 n 0000000401 00001 f 0000000402 00001 f 0000000404 00001 f 0000065118 00000 n 0000000405 00001 f 0000000407 00001 f 0000064764 00000 n 0000000411 00001 f 0000023695 00000 n 0000023970 00000 n 0000024002 00000 n 0000000000 00001 f 0000060881 00000 n 0000059981 00000 n 0000062551 00000 n 0000062648 00000 n 0000060127 00000 n 0000062201 00000 n 0000062322 00000 n 0000062442 00000 n 0000060281 00000 n 0000061982 00000 n 0000062079 00000 n 0000060427 00000 n 0000061625 00000 n 0000061741 00000 n 0000061858 00000 n 0000060581 00000 n 0000061268 00000 n 0000061384 00000 n 0000061508 00000 n 0000060727 00000 n 0000060909 00000 n 0000061030 00000 n 0000061151 00000 n 0000023774 00000 n 0000023852 00000 n 0000023884 00000 n 0000055832 00000 n 0000058955 00000 n 0000056015 00000 n 0000057813 00000 n 0000056247 00000 n 0000056534 00000 n 0000025842 00000 n 0000448626 00000 n 0000059220 00000 n 0000058075 00000 n 0000056794 00000 n 0000065566 00000 n 0000065616 00000 n 0000054251 00000 n 0000000301 00000 n trailer <<2946632BC680084BA5C2F4844F68BCB3>]>> startxref 448815 %%EOF fifengine-0.4.2/doc/logo/fife_logo.png000066400000000000000000020727021341615052600176300ustar00rootroot00000000000000‰PNG  IHDR ÃÿͦÉsBIT|dˆ pHYs.#.#x¥?vtEXtSoftwarewww.inkscape.org›î< IDATxœìÝwŒ¾ßçïá°ˆT¡Žz—HQÅr´ÚU_õ:”öìj»nâ8pb FœØ†kØp¹÷†#ŽãÜ\çÆH\6VZië‘Dª÷]µ¥¤W,"©Bª÷£Æ&’sòÇ;$‡Ã™á Û;åy€W<ó¾§üÎ,g±8šÏþjN'ýµŠöqI~œä¶$»Ù¨ûð\?Kòa’Û“<ÝlÔ}0 À^™\õÀèÑ*ÚG&ùAÊæÚ$]½—&íãSŸØûœ'ɺVѾ#ÉíÍFý…}|^&1 Lp­¢}X’歷UnJ2õ¿äéIþa’Ø*Ú«Rn‹¹½Ù¨¿r€_€q@ P«h’dQÊæ;IfT4Ê9Iþ$ÉŸ´ŠöKÙƬ­hF91 L­¢=9É )˜[“QíD»9¯÷ø×­¢ýtÊ0æçÍFý½jÇ`4ÃÀ8Ö*Ú“’\™2€ùQ’£«hØ.é=þ]«h?ž2Œ¹«Ù¨RíXTM ãP«h_’2€ùI’+g_LJruïñ­¢ý@Ê0æ×ÍFý‹ ç "b'ZEû¼”ÌmIΨvšbr’E½ÇæVѾ7esw³QßPéd4bÃZEûœì `æV<ÎÁ4-É÷{¯ZEû·)ØûšúוNÀ%†€1¦U´OOòÓ”Ìù3–ä¿ê=>kí_¦ cn6êÛ* €ýN c@«hŸä')˜K’ÔªhÔ:2É×{|Ø*Úw¦ cžj6êJ'`¿ÃÀ(Õ*ÚG%ùaÊæê$“*hì9.Éßî=ÞjíŸ'¹½Ù¨?_íXì 1 Œ"­¢}x’[S07$™RíDãÆ©IþA’Ð*Ú¯¦Üs{³Q_^íXŒ”*Ö*ÚÓ“Ü’2€¹%É!ÕN4îÍIòO“üÓVÑ^–aÌkÕŽÀpˆa ­¢=%ÉM)˜ï%9¬Ú‰&¬Iþe’Ù*ÚÏ'ùY’Ÿ7õ·« €Áˆaà ií®$W§ `~˜¤^é@ôwAïño[EûÉ”cîl6êU;}‰aàjíZ’ËR0?Nr|µ1 µ$WôÞ*Ú¥ c~ÕlÔ?«t2Ä0p ´Šö7S0?MrZÅã°÷º’ÜØ{üß­¢½$eóÛf£¾¾ÒÉ&(1 ì'­¢=/es[’³*‡ýoj’ïöZE»•2ŒYÜlÔ7W:À"†€}Ð*Ú³Snù£$ +‡ƒgFÊÿÜšäóVÑþuÊ0æÁf£¾µÒÉÆ91 ŒP«hŸœä')7À\Tñ8Tof’ÿ¶÷ø¸U´ïJÆ<ÑlÔ{* `ÃÀ0´Šö1I~”rÌåI&U;£Ô1IþVïñn«hÿ<ÉíÍFý™jÇ?Ä00ˆVÑž™äû)7À\Ÿ§12'%ù{Iþ^«h¿‘r[ÌíÍF½¨v,€±Í¿¼€>ZE{F’fÊ 0ÝI¦U;ãĬ$ÿ8É?ní•ÙƬ®v,€±G À„×*ÚÓR†/·¥ a­v"ƹs“üY’?kí’ü,ÉÍFýÍjÇÄ0LH­¢=9ɵ)7À|?ÉÌj'b‚:¿÷ø7­¢ýû”cîl6êïW;Àè%†`ÂhíZ’+Rn€ùQ’c«v¨%¹¬÷ø÷­¢ýhÊ1¿l6êŸV9Àh#†`Ükí S0?MrrÅãÀžLJ¹µèÚ$ÿW«hߟrcÌošú—•N0 ˆa—ZE{aÊæ¶$³+öÖ”$·ôûÞ”cîi6ê›*  "bÆVÑ>+åö—?J2¯âq`›žä‡½Ç—­¢ý›”cîo6ê[* à Ã0¦µŠö©)˜Û’|«âqà`9<É_ë=>mí_¦Üóh³Qï©t2€L À˜Ó*ÚÇ'ùQÊ 0—%©U;Tê¨$³÷x¿U´ïL¹1æ÷ÍF½Séd€€1¡U´ëI~rÌ5IºªF¥’üϽǛ­¢}G’Ÿ5õª `ÿÃ0jµŠöaI¾›rÌI¦V;Œ)§%ùã$Ü*Ú«Sn‹¹½Ù¨¯¬v,€}#†`TiíC’ÜœrÌw’L¯v"ÎNòÏ“üóVÑ.²3Œy£Ú±FN @åZE{J’ëSn€ù^’#ªƵFïñ¯ZEû™”aÌÏ›ú»ÕŽ0kí_¥Üóp³QßVédÀ„"†`Ÿ´Šö‰I~’2€¹¤âq€ƒãÈ$£÷ø°U´ïJ¹1æÉf£Þ©t2`ÜÃ0b­¢}t’¦ `®J2©Ú‰€ —äì=ÞníŸ'ùY³Q¾Ú±€ñJ À°´ŠöInMÀ\ŸdJµ£Ð)Iþ~’¿ß*Ú¯¥Üs{³Q_VíXÀx"†`P­¢==ÉwR07'9¤Ú‰€1äÌ$ÿ$É?iíåÙƼZíXÀX'†`­¢=5ÉM)˜ï&9¬Ú‰€q`~’‘ä_´Šöó)Ø;šúÛÕŽŒEbÒ*Ú]I®IÀü I½Ú‰€qì‚Þãmí§R†1w6õ« +Ä0T«h×’\–ä’ü(ÉñÕNL0µ$—÷ÿG«h?œ2Œùe³Qÿ¬ÒÉ€QM 0Á´Šö·Rn€ùi’S+ Iº’ÜÐ{üe«hß—2ŒùM³Q__édÀ¨#†˜ZE{^Ê 0·%™Sñ8C™š¤Ù{lhí»S†1÷6õÍ•NŒ b€qªU´g§Œ_nK²°âqöÆŒ$?é=¾hí_§ ch6ê[+ ¨Œ`ií““ü4esaÅãìOG$ùë½Ç'­¢}WÊ0æñf£ÞSédÀA%†ãZEûØ$?JÀ\‘¤VíDÜÑIþ‡ÞãÝVѾ3ÉíÍFýéjÇ1 ÀÔ*Ú3“ü esm|ÎL\'%ù»Iþn«h¯M¹-æöf£þR¥SŒ_’#ZEûÐ$Í”Lw’iÕN0꜑ä%ùG­¢ýJv†1«* دÄ0£X«hOK²(eÓL2£Ú‰ÆŒ¹Iþ4ÉŸ¶Šö )Ø;šúºJ§ö™`”iíÉI®KÀ|?ÉÌj'óÎï=þ—VÑ~:eóóf£þ~µc{C 0 ´Šö¤$W¤ `~”ä˜j'—jI.í=þ÷VÑ~4eó‹f£þi•ƒÃ'†¨P«h_”2€ùI’“+`"™”äÚÞã?´Šö)Ø_7õ/+ ’à kíFÊæ§IfW<É”$7÷›ZEûž”aÌ=ÍF}c¥“»Ã­¢}VÊæ¶$ó*€Á’䇽ÇW­¢ý›”aÌ}ÍF}K¥“IÄ0L«hŸ–rûËmI¾Yñ8ŒÜaIþëÞ£Ý*Ú¿HÆ<ÚlÔ·U:L`b€ý¨U´Oòã”ÌeIjÕNÀ~ROò7{ZEûΔaÌïšz§ÒÉ`‚Ãì£VÑ®'ùaÊæê$]•Àv|’ÿ©÷x³U´ïHr{³Q_ZíX01ˆaöB«h–ä{)˜›’L©v"*rZ’?NòÇ­¢½&嶘ۛúŠjÇ€ñK 0L­¢}H’[R0·$™^íDŒ2g%ùgIþY«h)Ø;šúëÕŽã‹`­¢=%É )˜[“^íDŒÞã_µŠö³)ØŸ7õwª Æ>1 @?­¢=)ÉÕ)˜&9ªÒë.ê=þm«h?‘2Œ¹«Ù¨\íX06‰a’´Šv-É%)˜Ÿ$9¡Ú‰`l™qÊŸLÚðöŸõT=Œr“’\Õ{üŸ­¢ýPÊ0æWÍFýóJ'€1¤Öétªž 2­¢}~Êæ§IN¯xÍÎo6ê/ö=1ã”?íJò½$'ɹIþc’¿ÜðöŸ¾×ÿÁ­¢ýhÊØÝæ$‹S†1­f£¾¡ây`TÃN«hÏMÀܖ䜊DZbG 3ãÔ?«'ù›Iþvvȶ$¹3ÉŸoxëOžÙ~R ö>I+e³¤Ù¨o®xuÄ0À„Ð*Úgdgs^µÓÀ˜tþO¿óç_§Üóß$™1ŒÇ<“äÏ“ÜyÇÝçˆa`¤>OòË”aÌÃÍF}kÅóÀ¨ †Æ­VÑ>1ÉOR0—T<ŒIN'KŸ[›ÿðïxfýW›/Þ˧yïæï}có­?¾àŒ™GN߯óÁòQ’»R†1O4uî0a‰a€q¥U´Nò£”Ì•I&U;ŒM7|GX‘%÷ùà½Ï÷ËsN™Ò•Ë®<;‹šçeÖ™Çî—ç„ ê$w$¹½Ù¨?Wõ0p°‰a€1¯U´HrkÊæ†$“«Æ®÷Þù,Kî.òØC+³iÓ–ö:sç˜îæy¹ð’ÙéêÒ¬Á>x=嶘ۛúËUƒ“ZE{F’ï¤ `nN2­Ú‰`ìêt’â…7³¸U䥥ë²ÛG†µýùb»~yô1‡åÆ›äÚ›æçðÃÙ/ÒŠ$?KƼZõ0p ˆa€1£U´§&¹)eó½$‡V;Œm›6mÉã¿’%wy÷Ï*eêÔɹüª³ÓÝlä´Ó®t'þrcÌÍFý­ª‡€ýI Œj­¢Ý•äڔ̒YíD0ö}øþYrO‘Gz%6|]õ8»™¿ðätß²0\<+µÚþ\KR'ÉS)Ø»šúÏûL Œ:­¢]Kòí”Ì“WíD0>,+ÞÎ⻋,}n]Fü¹à¾F){ñ9ä±Çž›nY˜k®?7‡:mß^H’mIIÆü²Ù¨·+žöŠ5ZEû‚”ÌO’œZñ80.lÞ¼5O>¶:‹ï.òö[có÷Þ§2%W^uvº¿³0'ŸR¯z/¾Nr_Ê0æ·ÍFý«Šç€aÕjíù)˜Û’Ì©x7>þè«Ü¿xY~`E¾újóàwÜ×/ ŸYÖjÉÂóNÍ¢ï,Ì7¾yú¨ƨIîNÆÜÛlÔ7U< I t­¢}fv0 *Æ••ËßÍ’{—å¹gÞHOÏÞö7th2Ü eè×ß—&O8qfºo^«®›éÓ§ìýý}‘ä×)Ø›ú–Šç€Ýˆa€ƒ¢U´OIò“$”䂊ÇqeË–myê‰5Yrϲ¬}ããݮﶌÅu*åg˜}”9}ú”\uíÜtß¼ 'œ8ó ÏãÞ'I~‘2Œy¬Ù¨÷T<$ÃP«h›äÇ)7À\ž±ù[ø0j}úéú<°dy~`e¾øbc†ý#¶Ç»ÌÕ!>ŸöG—ÔjÉ7¾yzºo^…纇Í6À^x/ÉÏ“ÜÞlÔŸ®z&61 °_µŠö‘I¾Ÿr̵IºªÆŸ5«>È’{—å™ß¿žmÛú-j0FRu<2‚ðeO§N>¥ž›n^+¯>;Ó¦MÞ×ɀݭMrGÊ0æÅŠg`Ãû¬U´MòÝ”`º“L­v"¶níÉÓ¿{-Kîy9¯½öQ¿«ƒ”,à \ö×6™aÖG‘øÓwÙyqÆŒ©¹æº¹¹qÑ‚wÜáÃyq`äV%ùYÊ0fUÕÃ01ˆa€½Ò*ÚÓ’,J¹æ;IfT;ŒOŸ¶1Þ¿"Þ¿2Ÿ}¶a÷; © paDAËÈê—Ú¤Z:=#ù¬q÷ô®ƒ\èwºV«å[ž–î›fþ‚“†ÿºÀH½˜äö$w4õµÏÀ8&††­U´''¹>å˜ï'9¢Ú‰`üzýµ²äÞeùýS¯eë¶žAîUòË=^ØÇm/“&ÕòÍ+ÎÊM?þfN:ãè<üë—òЯ^ÈgŸ¬ß·'iü2à¥îÛIN=í¨,ºeA¾}ÅœL:yïæ†ãé”cîl6êïU= ã‹R«hOJrEÊ 0?LrLµÁøµm[Ož}æ,¹wYV¯ú Ï•Ú€7‡<¹[`j{x졇’«¾³0×ýà9æ„]›¸m[{òì#«òÀ]/äµCÿþûîMŽð³Êá>¾³û‡~H®»nnn¸i^Ž>æ°‘½.0=IK¹1æÍFý“Šç`Ãjí‹Sn€ùI’“*Ƶ/¿Ü”‡X™î[™O?íݪ²§èeX±Ky§=Å-ÃuÒG熟Ënœ—©‡ìy«Êë+ÞËw½ç]m[Ûn3|¢–Á'ûöžêêš” /:=Ý7/È9sOØ·=Ù’äÁ”c~ÓlÔ¿¨xÆ(1 °C«h7R0·%™Uñ80î­[ûI–,^ž§ž|5[¶lëwu8áË^Æ.#x@­VËy—ÎÊõ?8?ó¾uÚ_¨ôù'ëóðo_Êc¿}9_|¶aøág—;ï>ÄㆈdfÍ:&Ý‹æçÒoŸ™)SºFôÚÀˆmJroÊ1w7õÏÀ"†€ ®U´ÏÎÎæÜŠÇq¯§§“çŸ[—%‹—eåŠ÷zÏÖvùcw#ˆ^öz Ì®›>cj.¿y~®½õ¼{Ò̽|Î]mݲ-Ï>²:ýòŬ[ýa¿«{ù9å0?ß,ï6È}û2GÌœžë¯?77ÜxnŽ¬ÏØ»¹€‘ø*ÉoSnŒ¹¿Ù¨]ñ<Œrb˜€ZEû´$?MòGIίx˜֯ߜ‡Z•ûï[‘?úª<9`·RÛsÏ2ìàe8Ûevuü)õ\{ëyùöMó2mú”a¾ÎȽºìÝ<ô«³ôÉ×Ò³­gÏb£Ëàú~{ dºº&å’Kg¥{ÑüÌ9ë¸á½&°¯ÚI~™rcÌ#ÍF½ÿÚ,ÃÀDÑ*Ú'$ùqÊ 0—fؿ싷ßjgÉ’åyò‰W³yóÖ~W‡±ñeÏeÌ. [Ÿç­Õ’yœžën=/ó/8}ï—Ëì…O?ú*¶Šƒ2gžylݼ —\:+]]“F>°7>HrWÊ1¿k6êþ…IÄ00®µŠöQI~rÌÕIü7N'/,}+K/ÏË/¿Óçʶ¾ }q—?†4ÌšeÚô)¹ôússÍ÷9þ”ú°s lùzkžyxUùõKygí'Ãàp>ßììvcØÏÓ?Ž9²>#7Üpn®¿~nŽ˜9}¸Sûî­$w$¹½Ù¨ÿ¡êa¨–Æ™VÑ><É÷Rn€¹1É”j'‚‰cãÆ-yô‘U¹oÉŠ|ðÁ2~ÙSø²Ç…0Ã\ßRÛý‹cN8"W7¹ìÆs3ýЩÃ{žƒhuñNþõK)žY›Ÿ_vvùcöô¹çž™=Ä1S¦tåÒËf§{ÑüÌšuÌ0‡ö“5)ØŸ5õUÀÁ'†€q U´§'¹9å˜[’RíD0±¼÷Þç¹oÉò<öè«Ù´iËÀÊàUÌÐáËp¢—Ún7tÎy'çšï—žÚpcš }òÁy¬õr~wÿ+Ù¸~óî=ÌXf¨ÏCûmÎã:äœsŽK÷Í rá…§§«Ë.8È^Nr{Ê1¯W= ‡ƨVÑž’róËm)7Á^íD0±t:IñÒÛY²xyŠâíÝ[‰½‰_ö¨Ôvücð»ô c¦Lœ‹®9;W}gaN<ý¨¡Ÿ”úzÓ–<óÈê<Ö*òÁÛŸõ¹R~Ó‡þˆs‘ÌÞ2<¦~Ô¡¹ñÆssÝussØáÓ† 80žKò³$?o6êïT= ŽÆVÑž”äê”`~dlþf;Œa›6mÉã­É}÷­È{ï~¾ëÅWÂŒ<~Ùæ—þÁË@êÇ–+nYKo873aF§“¬zé­<Öz9+ÿðæ#˜=F2{È #Ž™:µ+ß¾|Nº»ççÔÓêC $O¤ÜsW³Qÿ¨âyØÏÄ00ʵŠv-É¥)7Àü8É ÕNÓ‡|™ûï[‘G] ¾.Oî×øe÷kÉ^v½TËìy'æªï,È‹geÒ¤=lšÃ>zïó“§tåü+ÎÌ•·,ÌÉg=ðãÇ©M¿Î³¯Î“÷.ËÇï1À=:ÞìŸ?&ÝqLïýŽ=ö°ÜxÓ¼\sÍ9™qèÔÁ¬ÍI–¤ÜÓj6êë+ž€½$†€Q¤U´ÏM¹æ¶$gW<LX›7oÍSO¾š%‹Wäí·ÛD-û¿ /|êù’#ê3òíîù¹äúss؇ ü\D§“¬\úfž¸wYVo÷¹0à½÷x}Dq̶ÆL›Ú•+®œ“›ºççä“èE€ƒcC’VÊ1KšúæŠç`Ä0P±VÑž•L£âq`Bûøã¯òÀý+óðC«²~Ã×ý®Ž4€fü2ÄÆ—Ýï^ž8ý¬ãrù-ó³ðâYéêš4ÀPÛ‡ï|–'ï]ž?<¾&_oÞš –ÝNu9_žÜ§8f1 žœî›ççß8uà…CÀÁòy’_¥ÜóP³QßZñ<ì*Ð*Ú'%ùIÊæâŠÇ ï••ïgÉ’åyþù7ÓÓÓ÷ó²a0{¿ /|Ù~³kò¤4.™•Ë»ççÔ3ð}°«¾Î³¯Êïî_‘öG_•'wüÇ»§@f¨í1Å1{Æüṩ{^®ºêìLŸ>e€'¢“Ü•rcÌ“ÍF½§ây€’VÑ>&ÉR0W$±Î*´e˶üî©×²dÉŠ¬[÷é®Üö²—̰â—Ú ç“ÃfÎÈ%×ÏÍÅ×ÍÍáGNß}.ö¨§§“•x3OÝ·"¯¯xw÷; È Ç ksÌÞ…1‡LŸ’«®œ“›ºç焎腀ƒë$?Or{³Q¶êaØI P«hÏLrkÊæú$“«øôÓ yð•yè¡UùòËM}® °fo˜aE.µÎízâäÙGçÛ7ÍOã’Y隬Û_Þ³§î_‘Ÿz-[¿ÞÖ{v°foâ˜¶Æ ôìaL­–œwÞ)é^4? ž<`›t¯'¹#ÉÏšúËU0щa`?kíIš)˜EI¦U;$kV˜%K–çÙg×eÛ#]æ« IDAT¶žÞ³#`†½ýe$ñK&eþ§ç²çå´³Žâݰ¯6|µ9Ï=²*Ï<ôJ>ÿt}yr Øe—›ëóÅþcúm‹9餙éîž—+®<+Ó¦é)a”X‘äö”cÖT= ÀD$†€ý U´§&éNÀ|7É¡ÕN$ÉÖ­=yú÷¯gÉ’yýõw^Ø-x9XÌÀQÌŒÃÉ…W‹¯››#Žš1à{áÀèÙÖÉò?¬ËÓ÷¯Èº5îzq¿Æ1ýØÎîñÌÛbf̘š«¯>+7Ý4/ÇwøÀo¨ÂÒ”aÌÍFýͪ‡˜(Ä0°—ZE»+Éu)˜ï'9²Ú‰€í>ÿ|c|à•<ôÐ+ùì³½g‡³¦ÖïË=0{¿l?yÂiõ\rùi\2+“§t ø^8xÞ]ûIžyð•¼üÌÙº¥'»Õ*CF00ŒéÅÔjµ|ó[§fQ÷üÌ›âï8¨:I~—2Œ¹³Ù¨Pñ<ãšF U´kI.OÀü8ɱÕNôõúëgÉâåyúé7²ukOïÙ~ÌH·Àì·¦–Z-™4©–s¾qj.¾þÜœqÎñ{|O|_}±)xtuž{tU¾ú|cŸ.e¸qÌaÌnÇö cvÛ3ø¶˜SO­§»{^¾}ùœL*¦‚Qd[’GS†1¿h6êíjÇÄ00 ­¢}A’?Jò“$§T<ÐǶm=yöÙµY²xEÖ¬ùpç…¡¶¾ì×fèøe»CfLÍùWÌÉE×ÎÍÌ£â1ZlÛÚ“ϯË3®Ì»k?Ùq¾Ó?xÙåË!¶Æ Æìý¶˜Ã›–k®9;7Þ4/Gû»£Í–$÷¥ c~ÓlÔ¿ªx€qA ƒhí)7ÀÜ–äÌŠÇúùòËMyø¡Uyà•ùôÓ ½gGºfèëƒ/à `’䨓fæÂkç¦qéìL™:yˆwÄhöÎëç™_ÉÊ¥ëÒ³­g—k»Å1#Ú3p(3ìm1}žwÒ¤Z.¼àôt/šŸsæÚ:£ÐÆ$÷¤ cîi6ê›*ž`ÌÃ@­¢=';˜ù `ݺO³dñòüîw¯gË–m½g÷Áìi Ìþ `jµI™Ó8)];7³Î=aäËÏ6æ­ÎÒÇ×d×»ÿû>‡1#Ù3D$sÆG§»{^.½lv¦Léâù2ɯS†14õ-Ï0¦ˆa˜ðZEûÔ$?IÀ\Pñ8Àzz:ùÃóë²xñò¼òÊ}® Á춦Ï×C.µ=|=ÀF™ÞûM›>%ËÎÌWŸ“ú±‡ ý¦Ó¶míÉòçÖæ¹‡_ÉoµÓ¯bI2Œ0fØ_—_t‹f†ˆbŽ8â\wÝ9¹þ†sS¯ÏúMUù4É/R†16õž=Ü`ÂÃ0!µŠöqI~œ2€ùvØõToýúÍyäáÕ¹ÿ¾ùø“õ}®Œ$‚æÖ—=0m€Ù~¿£Ž;<ߺúœ4.™•©‡LÙãûb|yëÕóÜ#«²ú¥·Óééì¾ù%à cöb[Ì!LßÛ]]“rñÅg¤{ÑüÌ™sì0ÞP‘÷“ü,ç_yV^2;Ó¦OÎ[ƒ¼¹úƒüá±5y}Ù;;£•·Åô;7Üm1û!Š™2¥+—\:+Ý‹dÖ¬£‡ù΀ ½”2ŒùOÍFýݪ‡¡zµZíI.©z¦;Î]U±]­Vû~’㫞#É»Nç·U½x­V›—äʪ^FèËN§ó_ª¢V«ýõøÌ‘±ã‘N§³ªê!ö71 ãR«h·“YõÀàÞ}÷óÜ¿dE|M6mÚ²Ÿ"˜ý»&IN;û„œåY9sÁI30<ŸòU^xâÕ,{úõlÞøõÎ ý"˜m‹ÙÏQL’œ}Îñé^4?^xzºº& ç­ÕùÍFý¯ª‚êÕjµ”ä_W= ÓKNçU±]­V{:ÉÅUÏ‘ä±N§suU/^«ÕþV’¿¬êõa„Öu:3ª¢V«½ŸÑÓÁpüN§óWU°¿M®z8@^LruÕC»êt’⥷³xñò¼\¼½ówñwD&CE0;þq"˜]¯Ož29ç^xzοâ¬}âÌröô `ø?êÐ\ù½óri÷ü¬xnm^xbMÚ|±óïooäÒ÷ïv§“¤¶=|Ùþwº³óþ}¯ÕÊǧ³sËQù÷u×k;þâw:åííqMïùÕ«>ÈêU䨣Í 7ž›ë®››ÃŸv ¾-À¾y¡êª"†`¼Z1 Œ›6mÉã­É}KVä½÷>ßya/ûÁ Äd€Í.»Þÿð£fä¼ËædÁ%³sÈŒ©I’NÏ0Þ Óä)“Ó¸lN—ÎÉÚUïçÅ'Ödí+亮T)ïÔ/ŒÙ%ŠÙ%„Ù‹(f{ÐU«õ1}ž³Oóé§ësÇíÏçw½Ë¯83Ý‹æç´ÓŽ:`ß`Ä6'Y^õUÃ0^-­z ùðƒ/³dÉò<öèêlܸeç…ƒÁ ½&©åäÙÇä¼+ÎÊœ'§6©o@ÎéçŸÓÏ9>í¾ÌKO¾šϯ͖M[ÝÓÙ¬ô¹>Ò(¦ÿf˜·w}Íí±ÌÖ­Ûòè#«óÈë3oÞ é^4?ߺàôLšÔ?,²—›úÖª‡¨Š€ñJ Zöò»Y¼xY^XúÖ.¿s¿k•Ò'J© ‚éšÒ•³¿qZλ|NŽ=ùÈ$e ‚á`›yÌa¹òÖoä’îùYñÜÚO½–Ï?þjgè’$Î.?þË~bv=_«%+W¾Ÿ+Þ˱Çžoš—k¯='3z ¿5Ààüo]`BÃ0^­J²!ÉŒª‰bóæ­yò‰W³dñò¼ýv;IùË÷»‡0ý6³ °fÄL¿èeð¦–CgNÏ‚KfgÁ%³3ýÐiI’NÏHÞ)S¦NÉyß>+Ëædí+ï§xjMÞZýavljIÒ»¦_Ø’Œ<Šé”OÕ{;;nggÓwKLïùZ­–>ú*ÿå??“»îüC®¸â¬tߊÙþóÒI§_,S†0ýžo{ÓgCÍæÍ[óàƒ+óà+³°qRº-Èùß<­_Œ 6Ú€ñliÄ0pÀ¬\ñ^–,^–çŸ{³OT2XÒ'\Ù%‚ÙñL¿ó;nïE3©«+g6NIã²3sÜ©Gí8¯a¬8òØ#rå­ççâ›ægåsk³ì÷¯åËöúÝB•ýÅtvݳóùvßÓé}Þ—_~7/ïæ„ÏÝósõ5ggúô©þÓÖ$EÕCTI ÀxöBÕÀx³e˶<õÄ«Y²xyÖ­û$}ÔÚH6ÀìÁì¼=`3àíòÆ`ÌôÃɼ‹fgÞE³2ãðC’$== Æ®)Ó¦¤qùYYxÙœ¬]ù^^þý«yïõw]ö*ŠÙy»\ü²=xé³%¦|ÂÞÍ0åëôß³ýõÞÿËü§¿ú}î¼ãù\yÕÙé^4?'œ8ó |`YÙlÔ7U=@•Ä0ŒgK«Æ‹O?]Ÿî[‘‡x%_~µ)e³sëËΛ»Ô)ƒlƒNÓïñýnÁsr= .=3s§dRפ$½¿ÜãE-9cÞ‰9cÞ‰ùäýϳì÷¯åÕßζ­[³WQLgûÏ]§·q)C˜Î.Ûc²#~Ζ˜¤–·æ¾%Ësÿ’å9ïüS³hÑ‚,<ï”]v½%ø&<1 ãÙò$_'™Zõ 0V­YýAß³,Ï>óF¶mëó‹ðCnƒé®ô9¿Ë6˜¾ëÿ˜‘E0“&ÕrÆü“3ÿÒ3süiGï¸l ã]ýø™¹âÖoæÂä•çÞÈÊgÞÈú/6dØQÌ.ÁË®·k½·wD1ýâ—ál‰I§–N:yñ…·òâÒ·rÒÉ3Ó½hA®¼úìL›æ£iØ‚o`Âóo·šú×­¢½,É7«žÆ’­[{òû§^Ë’{—åõ×?ÊŽ e°fÀ fàÛCoƒY3mÆÔ̽`VνhV=bz’¤£€ašvÈ”œwÅÙYøí³²vÅ»Yþû×òá[Ÿ¤ÓÙ¯¤7~éýyÙívïýz£˜ÎŽfï¶ÄloÞ}çóüÿýgÏæškææÆEósÜq‡¤ïŒ+b`ÂÃ0Þ½1 ËgŸmȃ÷¯Èƒ÷¯ÌçŸoì=[0TÙ¹f€m0m}Ißxfç¹Ýã—]·ÊÔv­`’ZrÔñ33ï’3sfã”tMîJ’Þ_ò‡‰­V«eÖü“3kþÉùøÝϲüéWóƲwÒ³­§ßæ–ìªìz;;™ÎöŸÃ}ß³ýu6¬ß’{î.rïÝ/ç[œ–î›dþ“âw Æ´N’« jbÆ»¥Iþûª‡€Ñìõ×>Êâ»_ÎÓ¿-[·vˆZØ3ÈõaoƒdÌ€¯“Zj]µœzÎ ™wñ™9áŒcv\éQÁÀ€Ž:qf®øþ·rÁ ²ê¹7²êù7²ñ«Í{Žb:Û;tKL:µtÒÉóÏ­ËóÏ­Ë©§ÕÓ½hA.¿ê¬Lêck«ÍFý˪‡¨š«Àx·´ê`4Ú¶­'Ïüþõ,¹wYÖ¬ú`ç/¯÷Uú/»oƒäö°¶Á ÄÔúÜž:}JÎúæé™{áìväŒ$¶ÀÀH2cZλjn^~vÖ.'+žy-Ÿ¼óY’Á¶·$Ûã—¾%¦Ïk¼õf;ÿÏ|þx}’þ¡ÊÐALmÀ-0„0û¸ æð£ÍÙÌάƩ™2µü˜ª£‚ƒnÒ¤Zf7NÍìÆ©ùðÍO²ú¹×óöê÷ÓÓÓÙÏ[bv=Wn‰$ˆÉ®çjµä‹/6æ—w-Ío~ùB.¹ìÌtß²0gsüAý^AÅÞl6êŸT=Àh †`"ðÿ Í„ðö›ŸfñÝEž||M6oÞºûÆ–alkÙµ Äô¹½Û`N<ó¸œ}Á¬œxæÎ_b×ÀÀèpÌ©Gç˜SÎúÏ7æÕ¥oäõ×eóƯ÷Ó–˜ÞǥZ:ÛŸ+½(¾é n:N¶õtòÔkòÔk2ç¬ãÒ}ËÂ\zùœtuMªâ[ÓÒª-Ä0L/dÇo×ÂøÒét²ô¹uY|w‘eÅÛÄ*ƒ„*»m|©õ95Ä6˜¡ž{ ×é½=yJWf5NËYßš•Ã>lÇìÀè4ãˆCÒ¸úÜÌÿöÙY»üí¬yî|þñù–˜þALzŸ£oSžëô fv avb¶ÿ÷Ыk>Ì_üû‡òŸÿêw¹¡{An螟#fN?øß088Ä0½Ä0Œ{ÍFýóVÑ~=É™UÏûˆ _çÑWfÉ=/çþ(O+„8ˆVÓ'z4²é÷:‡Îœ‘9ßšYS3eÚ”$IOϾ¼sà`ªuueVãôÌjœž×}”5Ï¿‘÷^û ž cKÌö &;ã—d—¦ï¹¡Kav>w-Ûc›ìxžÏ>Û˜;öl~uçó¹ìò9énž—Ùg{¿[pÀÙvÐK ÀD±4bÆwßù,Kî.òøÃ¯dÓæ­åÉálm$ˆ© ðØžoçóîxÒÝ#™>AÌqg“9ßœ•ç¿ã5l‚±íØÓŽÉ±§“¯>Û×–¾‘µÅ›Ù²yë[bj½­Êöè¥ÿ–˜Þ&}·Ä ÄìöÜ»1©Õ²ukOtudUÎ9÷Ät§‘‹.®®IU|Ë`³ —€‰â…$?®zØNòÒÒuYÜ*R¼øæÎ_þΦo3ôf˜Ýî7Èó Øô{î®É“sêü“3ç[³rÄ1‡—³GãÍŒ™Ó³ðšy9÷ÛggÝÿÏÞÇÈ™v~ÿ=oUõ}ûä}ÌŒæîáè´%Û²dËÒHnÙŽmy7Ánc`‘M`ƒdóW6@€ Á.6À.² Á"»°ãõZk[´F’e[¶d˲rØsp¨™!9äpx³ÙwWwU=ù㽞÷¨>È.¾Íîª÷xêy_BUÔàùÕïµ÷ôÎé‹Z¸» lKŒ r.a“K¼-°È?6ˆI£Ôñya›Ôãù7¯ëü¹kÚ7ܧ_øüsú¹Ï>«þþ®Âîð€nLMVß/z;aÀ^Á/i㑳²²¦?ÿ“súÆW§uíêlܼÒ"cœ`J^Xeý ŒÉ?'¿iÆ?¶»¿['^<®c“GÔÑU‘$Ùæ]:€G@©\Ö‰“Çtâä1ݸxS¨o¦]$¿&lr ¶%‚+Rv 1ŠÃ3‰}Ê Ûäb$Éݽ³ ßù·ßÓ—çûú©O>©—¦&uäØHAw ¸oü]ÀA°W°€Œ×fõõ¯Në[ß<§•åUåU6ÂDÅ.émÆÉ¿¬„I›Øçÿkøð>xñ¸ö?1…eš´À{Òè±QÕÂÝE]8sQW^{Oõµ5çFM.R¦Õ% ÄHnÐE© Ìæ1²VkkM}ë›oè[ß|CO?w@/M½ ì„<Ïä\°ãœ)z;‰±,P짦g®H:Tô<€V^}劾ö•³:ýÃKÎñÂdÂ.9Aã,ÏŒ›mˆñÊž>uH'>xLƒcƒxÅv«µZ]—_»¬‹g.iivѲÈA FÉmQxÅýoÖÁóèøÄ8éG÷¸Öc¹cŽŽ è³_x^Ÿþì³êíí|°‹Úëצ&«_.zØ™Œ1?!ég‹ž°I7¬µÿºèI„Œ1GÒÁ¢ç!é²µö·‹zscÌIIŸ+êý-šµÖþË¢'aŒù’úŠž°I_µÖ¾Zô$`»†ì§¦g¾"iªèy®Z­®ïüÙ›úÚ©³zïòÝThå~ƒ0ù˜–A˜œ@L:ÓÕߥ£“Gutò¨:º;ô²ìÖZݼpS_¹¨ÛïÞ7†{ƒ§y˜è_mÄHRgGY?óé§ô¹©tèȾºf MNLMV/= €‚0 `Ï85=ó%ýOEϤ[7çõÇtVú×µ¸XS¶½e3A˜TsK‹@ŒÙD ŒÛþâŽ;4QÕñ×þ'öËxÎù°EówæuéÌ%]=wUz= ±ØLæ~1yÇm>Ž5yòˆ^úâ zñ#ÇâÏC X÷¦&«Õ¢'°“†ì§¦g¾(鋞ö¶7^}O_ûÊYýð{ï¨ÙT&ÀÒþ LÞØÉ÷6žÑþ'êØÉcœÚ¦+ßÚÊš®¼vY—Ï^Òòܲ¤­†W¤õša,c& 곿ø‚>õ™gÔÝC# õ­©Éê§‹žÀNB°gœšž9$éJÑóÀÞ³¶Z×_þùy}í+¯èÝ ·[XŠ Â˜è¡£§SG&êðóGÕÙÛ¹MWù¬µºùÎ ]:sQ3Wïf)îó‚1’UwW‡>ùóOës_<©ý ¢ÿtj²úß= €„0 `O95=sKÒHÑóÀÞp÷΂þøÎêO^~MóóËj\)638>¤#/ÓÄÈ+yÛsñ°ó·æôî+uíüU5Må[¶ˆq¶Y›3Nî˜9˜à¹‘ÕÉ×K¿tR“<¼í÷ŸLMV»èIì$„a{Ê©é™oHú…¢çÝíüïëkøŠ¾ÿWo©Ñ°WŠ Â˜’§±Ç&tôäq í¯nÛµÀƒX]^Õ{¯]Ö•éwU[\Þz &qLrß}bZ¼ÿCU}î—NêgþuvUì¢==5Y}³èIì$„a{Ê©é™ÿUÒ?*zØ}êõ†¾ûçõµ?<£w~|3p)0“z¬tuèÐóGuèù£êêëÚ¶ë€íd›V7Þ¾¦Ëg/jöÚL°1?ã?m±oÛ1ñkk­zz;õéÏ>«Ï}ñ¤Æ&èš% LMV›EO`'! ØSNMÏ|IÒ¿+zØ=îÝ]Ô7¿zVüÕiÍÞ[R6à²Qpe»‚0Æ)‚ÉŽÓ7< Ã/ÓÄ“啼m¼Ð^s7guåìEÝ|ûššõ†¿1§ ¦-˜tóLâ1~O#éÃ?qB/ýò‹zîä‘m¸j òÝ©Éê'ŠžÀNC°§œšžy\Ò[EϾwÎ_×ËpZý?V½ÑŒƒ) Â+; cŒÑȉqš<¦êÁám½~xØV—jºúÚe]}í]­.Õî;Óò˜Ô6»n&®qÎ=|tXŸÿåõÓ?÷Œ::ËÛríØÓþÅÔdõ¿*z; aÀžrjzÆHº'i è¹àÑÓh4õ½oÿX_ûƒÓúñ¹kþÆ–á•‚0Ùs·+SîêÐþgëàóÇÔÕß½—;F³ÙÔÍ·Þ×Õ³—4sVm Ä$‚.[ ÄøÛûú»ôs/=¯Ï~ñ¤FÆøkîÛoNMVÿuÑ“ØiÃöœSÓ3.é“EÏ޹Ù%ýÉMëÿèݽ½°‰ðJ:³Á1ëŽükA˜žjŸ¾p\ã8¨R¥´ W;Ûìµ]¾¤Û®É6íæ1>¿¯@Lj»µò<£~â ½ô+ÔÓÏÚÞ€½àäÔdõlÑ“ØiÃöœSÓ3ÿLÒSô<°ó]zû¦^þýÓú«oÓÚZÃ߸éðŠóºÍA˜}ÇÆu`ò¸ª‡Fü¢àT[Xѵ×ßÕõ7.km¹&é1©6™ÍbâÿÖnïá>|L/ýʇô‰O?­ ¡El¬&©j²ºVôDvÂ0€=çÔôÌß‘ôoŠžv¦fÓêûù–¾öû?ÒÓ¤/fƒÐŠèfƒ0%•;Ëò<\]ƒ=Û~àQÔl4uë­«zú’ïÌå‡]¢ÌÊV1É×é˜Íå?övë3_xAŸý¥Uî{àëÆ®õ£©ÉꇋžÀND°v·Sl IDAT眚žyVÒkEÏ;ËÂüŠþô«gõõ?8­Û·æ%…–0€"?©’ÛÎòð‚0݃}Ú?yTcOR©RÞþ»ÄìûwtíÕwu÷âu?¤bSiË!–Ü@LËcZ?†M3¥’§Ÿü™'õÒô!}à™ÛrÝØUþÕÔdõ¿(z;aÀžsjz¦$i^RwÑsAñ®\º­—¿üC}ç›o¨¶ºæSÖ ®„á”ð¸ B,ÆäŒµ¹ ÌÐáQíþ¸ªGF·÷À.W›_Öµ×/éæ¹+ª×Vó›]t?˜t¨f“cEM3Éy<þä~}þW?¤ÿìÓ*•½mºz<âþþÔdõÿ*z;aÀžtjzæ{’>Vô

vPcÏW÷ðÀöÞ@[5V×tçÇWtëõKZ_Z?Ó"À"ë]Za6'/0ã<ŽŽè¥_ýˆ~nêEõöwmë=ÀCg% MMV犞ÀNE°gšžù’þyÑóÀÖÕVÖô_ŸÖËÿþûzïâí–!–lÆyÌ ¹„np&Úµ…@M°½ÒÓ©á§iø©£*wwl÷mþßG–ßš¬þFÑ“ØÉÃö¬SÓ3½’æ$yEÏë{ýô%½ü»£ïû¼šÖ* ©l)Ä’ ´´Ãy4-‚4é@)y<~@ÃÏWÏèP[î`giÔVu÷üeÝ9÷®Ö–•dÑÍ.ë„fÖ;.'¯e&õ>ªúü—>ªOÿâ‹êîíÜþíö¦&«ÿ[Ñ“ØÉÃö´SÓ3oHzºèy kmµ®ï|}Z_ýݿѥ·n8M,© KNˆeóm.é1Âã6×,#Uº;U}ú¨ö=yLåÀ^d›Vó—¯ëÎë´tãnë Kðh@ËzÍ.ùA˜8dcsƒ0­C5ÝÝúÔ/¾ —~ýc:pd¸ wÛä¦&«ß,z;aÀžvjzæ·$ýÇEϱ»·æôõßû¾¾ùû?ÒÜì’Z5±$Û`rÚ\¢}ÚäÉã6j–éÔð³'4xü€L‰r!€oåάî¼qQ³®ÊÖ›jÕì’d £f—ì¶ô£Í»e¨&Ó½ø“é ¿ñ“zá'‹¿±SŒNMVo= €Œ0 `O;5=ó%ý“¢çéÍéËzùw¾§ïýÙj4ƒÿ^Ñ*¤²N˜e£ËfÆð_æœW2ê?º_Õ§«g|_[î`w¨¯¬êÞùw5óæ%Õ—V6Ñì’hÙ¨e& ÄlªiqîÁ£#úü—~B?û…“êêéhÏÍÀV\™š¬)z;aÀžvjzæS’þ¬èyìUõµ†þê_Õý»ï鹫J7¸D~z%tÉ ³dƒ0ÙãM0V«1âcdJzòˆ†ž:¦Jow[î`w²M«ùKïkæ‹Z¾u÷Áš]R /¹¡š-ÕÝÛ¥Ÿÿ¥ê¥/}Lã |è§&«¿\ô$ðh1Æüç’þaÑóÀŽ÷÷¬µYô$vcÌïH:Yô<$}ßZûw‹zscÌoHúŸ‹z<2þGkíï=‰ÂóI£EÏ;Úkí狞ìfå¢'@ÁÎ=½èÞy}ã÷¾¯oüÞtofA~Ð¥Eˆ%jj N6Î@é0‹œÇÜ1Lò°Ä)Ùc:«zæ¸;(S*I’šü°`+ŒÔwü€úŽÐÊ­{š9wA ¯É6’5ò“)Á£1~8%|”‘16|…_üçF26qš¿¯ÕññññXË‹+úÊo}W§~û»úðO?©_üÛ×ó9ñ°îb§‹žIÃ’ž,zØñúŠžÀuL;ã?× ~ÿªvÆ}ÀÎ6Xôv˜'$= ö2Â0€=mj²zïÔôÌEIÇ‹žË^ðöëïé«ÿß_믾ùªêõ¦¿1jtqå‡Y²á—ì®8è²Ù1Lr—1ê;2®¡§O¨{b$zÛÜêÕÔ9<¤‰Ÿú êZÑìùw5ûæ%5Vj~³KbQ&°bŒ Ú_Â@‹ó¸n˜&»+w g,k¥üÅ›úÁŸŸÓ‘ÇÇõ…¿õ“úäNª£³òïÖžE`Ãà/:$ ÓfÿâÿýÙW~ä¿hH‰ƒ)áfÿí£¹ç³ÑÚp ¯£¢ÁÕàSÇTîë‘D  =¼®NU_ø€†ž{\ —®jöÜ­Üž_Z´ÄäaÒa—D˜f“c'¥f.¿}CÿòùýÛþ ý“ßú/5v úPïÓEk!À&†ÀÃüjÑ“ØíÖÖêÉ ™’—œ`Œ”Óø¢Ü0KæÜÄ&y˜ó¼c¨_ƒOWÿc‡eÊ%I ~}€6óŒúNR߉CZ¹yW³ç.jñÝ÷ý6²TˆÅ›vQ"ØâÓ:Lí76Ó>³^gavY]ÝõÖìQ7§&«W‹žÀ£€0 ~m6:1ä?iÙè¢ÜV˜ÄcRûóÂ2ù˜t€¦çЄž:¡î£’üuÀ¶y?WÀƒëÙ§ÑŸÞ§êŸÑüùKš{ë’š+«þÎ(£b‚Àæú /Ù LvWbŒ¼v'tÓÑYÑ@µ÷¡Ý‹=Œ¿“la¤3EO`/™Œ_˜ôÞV.9Ç· ÓeÃ4Š‘äuTÔ÷øõ?u\•~Q/-0€¤ÔÓ¥¡ŸÒàäZ¸ðžæß¼¨Õ»³‰†—Ü L:ì’hɶĬדn˜I|‡£ÃlaÀž75Y½qjzæ}IŠžËn6:1´~+Lðr£F9»Í1¹aÿ±<Ыþ§N¨÷ñ#ò*þi’ìd^I½UïãGµrý¶æÏ]Ðò•ë2jæ„]”ǤÃ,J?sÛaî¸" óðÐØ$Â0øN‹0L[ìòŸ˜õ,á>³n Æä´ÆdÇë:0¦¾§N¨ûàx4²%xÄtŽ «slXõ…%-œ¿¨Å·ßU£¶ª–-1™š­Ó“>Wò¿gã@Íèþêÿ轉f€M" €ïŒ¤_,z»Ù¨ó«òÆ °„-›bR'eR0ÙsºÐà O«<Ø/‰ÀîàõöhàƒÏªò)-¾sY³§_“]k$Ã,y…09A˜(ì’i‚I…cŒ¡æá¸75Y½Pô$„aðñKÜmÖÓ×¥ž¾.--Ö”°dÂ/-Zaò6åµÂHZyÿ–:Fö©·¯GÆó¶ùJ(Öê̬–.\–­7¢ð‹¤8̒דh‰qÎ 7ä4Ë„§ŒN =œ ÛÛÎ=€G a|„a‚áñA-_¼¼Êi…Q^Ð%¹1 ʬ×$S¯kîôZ|û] ¼øŒ:Žoï…P€ÆòŠ^9§åKW%keŒ‘ š^Öm‡If6Ó£D°†f˜‡‚0 À†@ÒÔdõò©é™;’†‹žËn6:1¤÷.ÞZ·ÆÞº&±!Œ‘d¢s¥Æü¢f¾óCuLŒªÿä3*ômÛµð°ØFSKç/hñÜÛ²†¿±UÓKb Â1QàEùí0ñ¦Öí0„a ‚Ù[@€ØI?_ô$v³ÑýábÚVAçàL &Ý Ózœô¹«7nëÎ7¿£îÇŽª÷™Çe*•m½.Ú¥öÞu-¾z^Å¥Üý¹í09¡–Üv·:fv˜‘qÂ0a€- @ì´ôÕÈÄÐú /Rª &ˆIž“ÜlÖ ÄÈJËo¿«Ú•kêyæ u;”Jß°sÔgçµ4}Nk·gü°K¢Õ¥U˜%„I´¿¤ª`œñÖk‡¨ö¨£“i›-I:_ô$%„aˆñ‹Üm6:1¨l›‹/7È¢ô~)·ÆÝ‘’ O6ÆÈ®®iñì9­\º¢žçžTedß\ÛË®®jéÜ;ª½{U²Íì9Acl”‰I¶»¤Ûaœ@Mz¼t&xð¿»Ñfg§&«9Øh…0 1Â0m6â.¨Mbò‚,9­09!šu[aœcÓašÆÜ¢æÿú´*cê~ú y=Ý÷}]<0kU»tE+?¾ »V—b1Æ$Ûa2¡ÅÇ´µ$r0ëj¢1ýqF&†Ú-ØÃø;(À† ö¶¤yIýEOd·™Ê ¿˜Ö­0-‹b’!cLâøäóõÃ4k7niíÖu?¢ŽÇŽÊ”J÷qeÜ¿ú­;Zyóm5 L‹0Kb_b£?X^;L"“¸ç8Ç+ÙTíB`‹Ã˜š¬ÚSÓ3¯Húé¢ç²[ öËx^üËõ®¼V7(Ó²&•˜Ém…iˆ Â4Öªvá]­¾]]OœPåÀø\%›Ó\\ÖÊù·U¿}7'˜¢ü0K^ÕËFí0áp9Ù™l;Lr£„aÂ0[D€¤Ó" Ó6¥rIÕá~ݽ=·éV˜Ä†¼ ËF˜ÌxùãÈÙÚª–_?¯Õ+ï«ëÉÇT¤$°ýl½®ÚÅ+Z½|Uj6£í¹a'ÔíÏ ³¸I— ÕÅ߯Ä8‰ÀKn;Lòœ‘‰¡vߎ½nUÒëEOàQC€¤3EO`·Ý?¨»·ç%ågVZ·Â¸Ç¦ƒ,éýñ8ÙV˜äqyašÆü‚xV•‰1u>vT¦³cK×@.+­]»¡Ú;ïÊ®­%C,™0KªÝ%Qò’ ³dÚ]ÔzœÔþóœv˜ P32N3L›½65Y]+zÂ0$.z»ÝðØ@2Ȳn+L:È’¬‹Éo•1¹›òƉ‚2™ÿäµ·Ô¸sW•#Õqh¿äy›¸B²³sª½}IùÅxãza–¼¦–D;Lxnú¸àI"“gSí0Á†‘ñm¿Hàïž÷0 Iç$­Hê*z"»ÕèĤͶÂ(?ȲQ+L^ˆ&÷8wœl(ÇÉ6šZ½tEõë·ÔqüˆÊ#û6¼FBÍ•šV/]VýÖ]Éæ„Y\Q>%8Æ µ8í0n‰Œ2¡·Æø>ÚaÊž††ûÚq[# pÃà˜š¬ÖOMÏLKúhÑsÙ­F&u­0Á«’'Ûln¾&:l­0™@L|N³VÓÊ›o«4دÎãGäõölî‚{’m6µöÞ5­¾]j4ü9e,™v˜VM-að%jI†d’ç™’‘m4s5›k‡ˆ¿/Ñ.gŠžÀ£ˆ0 YgD¦mFƨfø©#<:¡+ß>«µåšs~úIªA&o[NL<üv™ÆÜ‚–¦ßPe|T‡ÈTøÏ+€¤úí»ª]~Ovu-®p )‰`JN&ÛclTÙ¨fôùc:qPoýáw²š–Ašd;ÌÈøP;o¤†¤³EOàQÄj ²N=Ýltb0x¶õViu~Ic“iß“GôÞw_ÓWÞòõ>Ñ “d‰†Y/“;¥Æ1ªß¼­ÆÝ{ªœPyl$7PØ[š‹KZ½|UÍùgk~& »$ZYÒá˜tŒr¶%C-}ûGtøS/ªobXwß|7ÿœDv¦u;Ìèø@;o¤7§&«ËEOàQD€,Â0m42„aî£FòÃ0ÆH¥ŽŠŽ|ò¤Æ&×åo¿¢{ÞOšw~"“3¹àÍsÃ4îCðh ­^~_õ[wT9|@¥þo`×±ku­]½¦ú™Öa§Õ%ÑÆÊ Âc㘰Õ%¨‰ß¦ÒÛ£ƒŸÔðÓGäÿûtu~)û~[h‡‰¬hþΉírFÒÿ]ô$°ã].z;ÔôJÑ“ôã‚ßÿuñ9‚/z;Ìÿ+‰¿0c=׋žìv„aÈzUR]üÿæ¶èìVgW‡jµµ-·ÂHÒêü²ŒÛ]ºª}z|êš½|CW¾}Vµ™ùuÏ_·Æ}š× #'(=JÍ•šjo_Ri°_•ƒò:;7¾€GŸµZ»yGk×oJÍf°1N–¸aÓ&Úa”&¿Y& µxeOc/~@zR¥J9þ5Òêübü÷Ñ3B¦ÝÎ=ìÖÚoHúFÑóEÖÚÿ½è9ìÖÚïHúNÑó%ÖÚÿ¡è9°×±¨€”©ÉjíÔôÌ’&‹žËn521¨«ïÞö_l¡Æ#ÛljmqYå¾îèWì1<2®¾¿õÝzí]ÿÁjÔê¹ç'ÇwäµÁ´j’ÉbüÇÆÜ‚š ï¨<¼OåñQ™’·é{x´4fçµv톚µU%j^¢Ò?X’ £$Kä`Ök‡Éiw|ì€|ü9uö÷Êm0á£d´:·œ—sþFí0Q›Ú…f€ûD€|§E¦mFÆtõòxÃ&[aüçF«óKªô÷HÆÊÊÈÈÊJòJFc“iè‰ÃºþƒsºûÆ%O"ü²‰V˜cåc¥ú»jÌΩ<>¢ruhý›x¤4WjZ»vSÍÅÅÖÍ*™P‹6ÑôÒº&¨éÚ7¤^}†LpЉÿ©Í/Û0L[YÑ pßÃï´¤ÿ¬èIìVÑâÚ-¶Â„jóKêS°Ž8<:XTleTéîСŸzAûž9¦kß}M ×nç·Âd1y!œtCL6Dc ­½S™Y•ÇGåõt¯{O;›m4T¿uG»³ŠUòÂ,N«KXµ’FqÎݨ&§ÜÝ©±=©}O•ç™ðûÓi…‘m_[jÈ Ÿ¯ß32>О› Izgj²:Wô$U„aÈwºè ìf£Î/Ío±F’jsKþ¢ßpÕ®52Æ_Ìk/2îÞ7 ã_ø¸f/^Ó¼¡Õ…åÄ8J ~“ÚŸx•ÜèîLͽ¹²ªÕËWUêïWytX¦ÂŽ€GеjÌΩ~ûŽl½‡Ha– ì’ ›(jIaÜãZj‚ӌѾ§OhôäTê(Ëx&ØîŸîbbŒÔ\m¨^[.c«í0}ý]êêîhóÍÝÓh…x¬¾ ßYIMI^ÑÙ†Çî»Fƨ6·(câà‹56 Æcä/&8¶_}‡Ætû ºóê5×ê› ²´n…I·N˜&xh.,huqQ¥}C* I^6ØYšK˪ߺ#»ºê”´ä…Y²a’l;ŒÓþž˜¨IbÔ{`TãyZƒ}QØÅÀ„˜àµÂGÿ½V[†kòÛa’×32F+L›¼x„aÈ15Y]85=ó–¤'‹žËn424ÃÜG+Œä4à ’£=6 ¥XYký5Ë’¼²§‘ç×à‰Cºyæ¼æ.¼¹QeÝV˜Ü0ã¸ažÆÝ{jÎ/¨¼¯*¯¯7çîŠf×êªß¹«æâ²2a–(;’jX‰R1Êe6×>÷íìÓ臞RßÑ ÿ~]9˜ 6§­Î/e®kýv¿e- ôŒ¸-nhÂ0€0 ­a˜¶ Ã0[m… Ô‚¾qQ‹¿pØm1VŠbÂÆ,ò­ôtiÿÇ'5ôÄÝ<}^µ;÷Rï¯ü÷Ïm…É Ñä„i/Œ‘­7´v뎼¹y•‡«2ù7 ðp5›ªÏΩ1· 5›™0K6Lœ·Õv˜cŒL¹¤}Ï=®¡–Wò¢6ÿ|·Ã„á˜p nPÆH«sKjñ¦›j‡‰‚«hÂ0€0 ­‘ô·‹žÄn4<> ãks#›h… ýf˜ü)nŒñ£06úµûpõ¯±R÷È棚¿tMwξ¥úÊjë K&c2»ZbÌ:!šæêšV¯ÝT©¯W¥¡~™Ri»h§æÂ’³³jÖ›þT"Y7L’nzIaœc7 ÔxFýÇjßs©ÜÕ!ÏýZq1AÌ3 ”F­0©×µ¹¥Üyl¶fd| }7W¦&«·‹žÀ£Œ0 ­ñ‹ÝmR©”48Ô§Ù{‹J†`6n…‘1Z[®©Y¯Ë”KNþ$XÌë_¬lŒ G²VQÆÈ¨ÿè~õÓ̹Kš}ë]Ù¦Ýðý¹!žTCŒÒç¸Ã5—Ô\^Qi O^_Oîq€ö°««jÌÌË®­:m)9A˜ ¸’&Iµ»Ø(€bZk”Ôt ißäÔ5Ô‡[Âö—è;)Ùüâ~%^ÿ^_Œ/ò>ÚaFi†i§3EOàQG€ÖX¨ØF#ãAFZ·&/HbŒVç—ÔUPø üaŒ|‰`⢗øùýF™¨šaÚŠÀ5À" @ S“Õ»§¦g.I:VðTv¥‘ñA½sþz~«ŠœÇÄþøEmnIÝû-^$Gù§ÆÊÈXë¯Y‡ŠŽƒ4•Þ.}ôY-ß¾§™WßÑÚÜBj.ñÜLjš­çŸwá®l˜Æ6jÜ›S³£C¥þ>™r)ïöî—µj.-«±¸$5›¹¡??’x¡d;Lºh¥E;L‹pŒ)yxì°?,¯ä)üü‘#ÿ IDAT^‰0qø%<5 Ƥ_Mxtˆ©Í/å¿¿üµd>'Š1ÆÿžFÛ†x@„aX߆i‹Ñ çç!’`S^›Š³©6·”lyq`deƒ¶˜(câ}áB`…A…2þ]ÃCšø™iþò5Í¿¤æZ=óþ‰ÐËz­0î‹M…i|vuM»3òº»äõö¤Ü[[UcaÑÁؼ ‹Ó˜¢í0Á9Qà%·]EÉÎûôÕÀ“ÇUîîç9!˜à[*nwqå„^Ü–å„cü+UmniýëÈ\s¼³T*©:Ü·}7i„aaÖwZÒ¯=‰Ýhd,üÅùT$'X’|î?ñÃ0 Öø:-/6Žq~Ù?l€±Á¯öû2þq6 Ë œåYõݯîý#š{ë²/_w~Q?êá“ ¿¸Çå„hr‚?áaÍ•šš«k~(¦«3ïV6`ë 5—–e×Öœ­Nð%'Ì’Û…Zr†Ù ¦2دÁgN¨c¨_ž‰¿+âЋâ¯)Úæn7r1A Æ„­0ÎëµÅZ†`cgŠžÀnåÿò|º%Å9À †ä…IjsKÒáL8E Ã+q8F&¹(ÀDo`Œ³Oδ£Œ²‰Æó÷ÙàüÊðÊCª]»¥Úµ›Q“LtaÙ£m&q² Órœt¨FR£!y^f ØU¬Í†Y"­Â,é Œò!9Í2év˜RŸºŽP©§+§a–èÛÁ¤¶‡ãd[aÂñ³m1N &K©×Æ Êã¬Ì-Åá 'ä’ óä„‚Û@3LÛ°Ø&„aØÀÔdõÒ©é™»’ö=—ÝÆ]lÛ2 bÒOâ•Ã+sKÙ¬‰Ã)QŒ¬¿Z Öû ­ŒŒM…cœ…ÎaÈ&9žœ [k£ñŒŒäyê80¦òHUµ÷®«>3»~Å•jÑŠ“<''L“^ì »E:0è†YÒ'Ôâ–¾´„„ç¸c§ÆéêTçÁ •‡âÖ9ïî?átÖÿ°l+ŒR¯Ý1©¦ƒ2nCLø¶ÞÔÚr-¾ÐD¦'/“¼ÝÝêéí¼ÿ?¬‡€5À6! À朑ôsEOb·H†BaÌ“ä¶à—ïãH*”Ò¢Æ:m1&Xl¢•ÀqLr<ŸŸ/ Â1òP‡!I O52ò:*ê:vXõÑa­]½®æòrö:ZYRÇm¦1&y|b£çÅí c<ÂŒçɆŸ¹› ³D'+§%Å &#Á†D F2%O•±•G‡e¥¦h†Ø&„aØÂ0m6Ã$~ä?§ %ñùa˜ äbÝp‹r`â°Kl `ÂÅÂþxN!@*ø¾v§cm¤1áBm#•z»å=q\»÷´vã–l½_KêróîA”q÷;·#s“òÂ4ž‘ä‡bl£A(À£ÅódJ%ÿ¹]?ÌoJ‡YÂÏøûh‡‘T®©<1&S)Ç…a”8ä…U””q¶'ÚbœïƒLP&5vøžé`Œœ±Wæ“׿©v˜ø^ކi—%I狞ÀnA€Íá—¼Û`dÌYp›âp–'·!å¹ÅLÄa”¼˜hD'¸"Y†f‚-6ü…þ8ø§¨&¾¤Çó'6ÈXkUªª4دµ[wT¿3“¼¾u‚,îõ¶n…i5N*Lc<™’'[oÈÖë€Íóä•ËÎüaw§  Ç(ð²‰@×Û¥ÊƼî.g˜8ˆ†]üiÄ-ÑÇ®3Åth%|‰dRA·-ƤÞÃ×mŠY™[NÝeÃ@î'˜äw3¶ÓÙ©Éjcãð„aØÂ0m0<Ö/'õሷ%[c’Ï—g—‚…½ÁâæL8%84N‘ `¢ L¸XØÙ¼—3£(ø’Ïççì Æ³’äyªŒ¨44 úÍ;j.,æ\z:Èâ^{~ &·U&Ó°?šJY¦\–]]õ›b`'1F¦£â·ÁXINÛVË0K¦Ý%KÉv˜Vm)©qL¥¢òè°J}Q EN% º˜¼ÐŠ’A™0”˜”q[aÜF˜tPÆ?'8ºEP&Ü^›_Š/Þm¸qB1ÉPòÞ†i›3EO`7! Àæ¼%iAR_ÑÙM:;+ìÖüÜŠ¿!ÑŒ’æˆwJ’Vk²õ¦LÉ“ddœF#9¿„<¯m8¤Uf±ÎùaÆ8‹†ÃMr<66X¤lm*l,4v[k$ÉëèPåà„š‹Kªßº+»ºº…kW´-·&wSÎxždººd 5k«R³)(šé¨ÈëèðãˆVÙK"Ì’ÂÈ ¸äœãC e^0¤¼oH¥}C’çA} ¦C.QÖÐ ºD'<~n'¶;é±åk²c· ÊȨ6†a¢»ª8³Î®àù0a˜v!X °ð S“Õæ©é™³’>Qô\v›‘±~ÍϯÄLëcã0GðÊHËóKê©öË©¸G:!— 06 ¹„2&.ˆC1Að%/Øb•l€±qHF’ÂSݶ›Xq,y==ê8Ò­ÆÜœwïÉ667ÈbRîþDF(½Ñ$žº·1 Ó”Ë*Uʲ«kj®Ôâáð™JE^W‡äyþçP«Lø™—™dÛ]¢v˜d&8(?P#ÉëïSyxH¦R‰Ó'î™y¡~§(ÓÐbÜóÜ@‹3Ýl[Lrl™d€FÎ{†3L¶ÈHËsKÎuÆ—í:­µ‰mî}% Ó.„a¶a6ï´Ãl»‘±]|çV2ȆV2øe¸aenI½ûúƒµ¼AÈ%lyqÛd8F6n€ñ÷KQL*Ü’('P¼˜8 ÉȦ¦i¢ñ‚¶šä¿}¥•z{UŸ™Uc~!ÿšs®=N÷˜Ôþ­‡iLg‡J5—j²µZÎÀö3¥’LO·L¹äoX/Ì’ÈÃ8ÇdÚ]Ò›òƒ5Q±Lg‡Êûªòº:!˜0|P¡EÇ$þqÎK´¾(j1NÓL²%&;¶”qƒ/‰`Œózen9ÿÚ`¢»ŸÝfŒFÆúìyV%½^ô$°{c¾$é7‹ž‡¤kí¯= `+Œ1ÿLÒÓEÏCÒ´µö¿/êÍ1Ÿ—ô_õþ.kí犞°Ƙߖ´¯èy›ôO­µß,z°Ýðyü¢wŒŒ ælÍcZ…9Væ–‚uÑaðD™VkSáë 4¶Dá–`Á° öû™š0Ìâ¯.¶Šƒ4ÆY@ì6ÀÄãù»Ã kgý±•JžÊÃC*õû¡»RK^s^%qËâ{fç¤îëzaãÉëë–íêTsqIvm-ç`xF^O@±VR6ô²Q˜%’ s$+cR÷¯¤òà€J}½N’%8%Ó ã„XœðJîvçÌtkKôñìb‚ L"@“;¶‰‚5ÎXáÔ´2¿ÔâÞ(JdŒÑ¾QÂ0mðúÔduµèI`W;!é³EOBÒlÑîÃOJúXÑ“ÔUðûÑÎø%Ÿ–4^ô$€Mú¢'í@€Í# Ó#ã΢['å‘|´|n´2»”ø%ýlð%~…SÜV·»D»‚³Ý˜h¼DÆ$Û&Æ æ"aq´/Ïúͽ(S©¨<:,»²¢Æ½yÙF=uX‹ KâyNˆ&sX«qŒ¼JIÞЀš««jÎ/Ê6€íâõt«ÔÛ#%r+©ŒjIa‚A‚sî«Æ“¼Þ^•úe<÷ó1€ Ò%QC‹s„Û~c¤ƒ2Q0&½Ý 6¦-‰àŒóžé`ŒZŒ½º´ªf½Œ0óï]^+Lu¸W¥’w°X‡Øf„aؼ7$Õ$u=‘Ýddl èH?ÉKÂÄÛ–gå¶²Dá› §D…,AðÅ­1ád§ÆÊÈ ˆÃkÃ…Êñ{¹a™¼˜t£Lpº\´¼9ŒáÄ×e$©«Kå±N5ÕXXtæïÞŽl ÆäÝ¿t0¦åmMÞ_¯³S^g‡š‹ËÁÒÕ °y¦³S¥>™RIaLn˜Å Â$öû£(·%&êÈÔH^W§¼~™r)N¢¤êUŒ›Dñg‘iñ߯ ÊħGSX/´7È8á–àûäÞ3ŒI…eÂcÃù¬Ì-Æ÷)·§Å¶àadl`K¦Ø4Â0ÛŒ0 ›45Y­ŸšžyUÒ‡‹žËn-¼Í„8RÛÜÍN¨cyn9(zq‚'²©|riÑcËâ˜ø]Rí2éñl² ƒ/q£Œª8H“ÀÄÆ[­gäõõÊëîRcaQÍåš{’Ï3­0É¡£÷Ob²ç˜ô¹Æ“×ß+¯§G¹95—–[aÊe•dº:‚E'Ä…1‹R &îóTÆù¼o¨ >×J%•úúd:;¢$‰‰Ó$Λ¸7©ÐI2Ì⟑v ?o×Ê8c;¯ÓÁå½§IÍ/¼6·”ºwá=KÝÇè¾%·†iÂ0ÛŒ0 [sZ„a¶ÕÈXðÌùþ!˜¼f“åÙE'œlvÂ)QË‹›±É0KÜ(î÷'asÂ-VñZìxa³ó^²©i;m5J¶Õ$ÿ­xár$˜SÉSi _^w—š K²õz2“wß÷Ï$÷gîi8ÏÔ9îqeO¥}C*õ÷ª>3+[[ͼ?$xžJƒýòz{ãpFN›K^(#·&êhuNr^O—¼îne’#Ñ@qZŤŽÉ4º(<./Ð’ls‘”Él7©±åk’ï‘|Ïàœœ Œ1~@4²‰PŒ{ï7QÍ0mÒ4]ô$vÂ0l ¿ì½Í†öõªTöÔhØdZ£E&¹†Ùhyni–E­,ÙàKü: §Ä¿–<Úp¼`©°•fI.ÔŽÞ+˜—Ûçï¶ÁBfkãkŽ—"»í0Æ ÉØ¨]¡Y«©¹¼/úÞd+LâØV÷:}NâÞ©£C•‰15–Ô˜™•m4rN°×•ú{U”ñ×êˆu·5ÖZ]ª©£§Óo€Q¼ÐØæ_ld Ã)nÆi‹±r,'C2Ñx&^Їb² 0 ÏrÛf‚ñlºÅ q½é°‹¿Íëì©”ek«j®®F œ秃,î[d1™Vw>9ašR¯J}=ªß›SãÞ\¶Àžäuw©<<$ÓÑ.m]6¬‰êµÜPK ɸ ·:fí0¦T’×Ý%•JÉ¿ 1’ü¼ŒC0a%n[Qô˜hqÃ(‰†9ág»R¯Í/ÎØñ{æeÂ`Œó:ü–22Z™ÏË\ä¥_RßCÁ=¤¦-R´a¶fZR]üêm526 ›7ü0Lb‘r*“á$WœíF+sK~Æä7ÀD-/N8%\œ­0žbãIÑñÙñÂýRÔ#¡vÔ¼`’ï,Jv,á¬ÂÙ¸i¤l`Æ¿m¡«S¥JEÍZMª79˜üû–,2铜ð‹I–ÇóTÞ7¤Ò@¿ê·ïª¹°˜Àž`*e•GöÉëíñ7ØõÂ,© LÄH¶Ã¤ÏuŸ¦ƒ4ÁçlÉ“éè©T6§ÄÕ)‰Ù:I–ð¥yñ‰B,n %o»sf¢µÅý8u1Á7A"@“{Ý Œ;õh»ÎòìR|‚Ó^–{ßÿÍ0mA  X¸ÀLMVWNMÏœ“ô|ÑsÙM†Gû• c¸ÏÃ_ÔŸ»ÁŽ¥Ù% î¯JNpÅ žX'xUœ˜pvt|ºQÆ–ÿ+úÙàK0žu³$Á>ÅAš(Oc⹦0É£eÞñ>7ãyòºº¤zC͵5É67wßœû—ÉÃd1&µßynŒL¥¬Žãj.-kíæÙZMöϨ¼¯ªò¾¡8WÑ"…2ÜF„qC-n&²A;Œé¨øm4ë„[üÀHê;&ñ¹+' ’<Âmƒ ¿-ÒA™(“Þî|§-‰àL⣶uP&ÎQ<îò\ª&s¯³ÏÝÛíc›Ñ*Єaغ3" ³­FÆÖ? /„áX™[ŠÃ)aã@xhNŒ›·‰oÕ(£`•q|‰Ç‹d?Άċº’ï.WÃ1 C;aØÅÆë“múBÃUËñMˆg!©ìÉ+uÊÖë²õFæØVA–Ô†ÜãòCHÙ0×Û­Îã‡Õ¸7§ú­Ûñ<ìJ¥Á~•ÇFdÊeÿ³QA“U„QNøÂ ¾ä´”$r0ëjÂÏO¯,S)Ižç¼‘óÔM™¸;œz“:ÆäOüé8A™øôhªQC‹Ö ÊcG¡%·'ÞÃ7Yd“œOøž¶iU[Xɹo©ûžùCñ;»+êèÞàO[dE -ðu§%ýÝ¢'±›ŒŒù¿D¯EN…2Âm™Mþ¶¥¹¥LበÂ(ac‹e^¢}nðÅ:Aš0DãDNl8^°lØÊ ³$jKrb’ 0qh'˜g°Ú:õ5‰KtõÁUÄÿÊÞceÊ%™’§f½!5›­ƒ,-³-á¾x±uæ­òÂ4&~,Uå ö«~ëŽêwf² i^w—*ûÇåõtùG¶E˜%³ñ>ÚaZj<É+—%ãeÒ)ép‹®Ó ¥XòŽq‚'©0‹F~ØErB,-ƒ2ɱmOc”÷ž&5¿œ°ÌòìRú ºqqˆ(u¿û;2ºA0÷ãÂÔdu¶èIìF„aغÓEO`·‰àº!˜t(#~žXälŒ–g—‚õ¼q¸ÅdÂ)Î>…u.A%j€ ßÙßjœ·ŒŽÏi€qfÛ¢&޹D¡g<›³€9fý5ÎémŠ×‰»m2¦Tò‰Ûf‹!óƒ,ÉãR÷{V˜Ä9ÆÿÊþ1•‡«Z»z]ùx´™rY•ýc*Uý ágV®H4½´³ÄŸwés’§&CN ¦dü&˜ÜpKòû!Û ããgœö—(äâ ›hI¶¹„ß¹ÛMÞØáñÉ÷H¾gpNNPÆ[Æhen©Å\öÏ ýܘ8˜ŠmÅßÚ„0 [÷ŠâŸ¯Ç6Xwn&l‘µto1X\Pl Nq‚0r`âýq8ÅAš°F’s|ºQ&Ü/É8Áë4À¯×/^«†]âØŒsá‰V˜p—qÖ3;s’‘õ$Y/ÕO¤U%Šô$ö¯Œqƒ3©ñ¼Îu>vT¹y­]½®æJM1ƨ26¢òÄhÔV’ ³8¡–uÛaܤ‹±Ùv7«ø¸’BâÝp‹r0q¨$þÇ$Ï•RIµ¾˜8æ˜jr‰nO¦&³=z·äØZç=ÓSM6Ö$Ã3FÒòÜrâÏ,y¿• !e1F#£„aÚàLÑàÿgï]ƒìºÎ3½wõîÐÀi€ ˆ IðNB¼Š4)‰¢)“–-h¬±9ö¸2‰=.'åJʉ“ÊüÈåG&U©¤Æ5™r¥*Î̤%Çv$›–¥Ø”¬ M‰¤àWÐ÷Ó¾­üØëò}k­}º4pà}Êúì½ö·ÖÞgï Vù{ú%„B!äZ…2 !„B!„rìÞ54ñÜþ‘Cnk÷Z®ucs&½,Ñè<=ÞÌ(ÇÈTyhHj1"&,Á¯M”©Ú¢øâêÙ¤^’V|kgŒ·uÄV•“Š.qG‚æög”ÈRÜ&jê šâÕ1™LSýܹv :× bþ㳘;qva„O>ëÖ ç¦Í0½=ñ}ÓB„ RKI€Qb†ÿ1­½ßðWò·´Üâm‘\œï()·]V”’Š'ZE™ SŸnÏkÇ9 ¢Œ‰µã¹è9ýö £m$qî6ù(¿3 ±q ÈŠÃdB!„B!„B!„ËeB!„B!äâØÊ0+F__úûWaªéSCê¥ -gT?ÏLÎÀ..˜Ž*ÅË)¢Ñ×;%ÖÉ(>F–4¢;È)B¤ á2ˆrKL”ýÜay¾ùØÕ32R(J6!QÆI6êOß,®ðÝââ…Uˆñ6o,.V åÅk­/mzÍM²_n* 1ª/½Ã gÓ0zC8üæNŸ!ä“IGß*¬Ú~#:Ö ÂZëÄ”h¨cQqï/ŸBD9N˜.* j›Á"ì‚ùD™D#2Xl”[¼H£Ä—0ÞÍêùýˆ’ êeŽÙ3Rrñ—¢ª"b$ d IDATþH. £V#ö-.bqÑÂtuÀ˜N,GdÑß(£ÇÕ L€éîBßÍ7¡wS3ïÇüø$!Ÿ LW'VmÝŒî ñŠ©Þo6(ü‰ÔâÿRbFºQ5a·«³ØùÀ.BY"R¾K,‘Tn‰âŒÉS¥\“K'*‰%e‚#·‡Ñe¡EŠ2FÌ™Š1òs&ç •nª:ÓãMùåÄk-¾ˆ )Œ˜Æ0e˜æøî]C·{„B!„B!„B!×*”a!„B!„‹ƒ¿é{…ilı÷Τ—‚#ä ÿcs´‰þuýÕh‘ÄD9Å÷­$Yâ~QÅ 5@Hˆ‰ãÅ\Õä‰â‹âKš(“ÖC"À¤²‹1¹ä¢Ž²e9&¬ÊZعy c¦»Gtj׉,ù5WkÇÝᎠénCç@î¹ sgGÑ|ï8ÏϦ… !W c°ê†aômÛ tvI%Èx"9kYé0JŽñRF:Îý`â{ØÎÍÃÎ/8 $5í„Ü’¼Óâô8?G"ÎÈG âIuI’T˜dŠÐ‚¢ L'Þƒ±ŽQK–µÃ8èõÔÍYÉ0ñûÌ#b’[üwåþhl\²¢ìm÷!„B!„B!„B®e(ÃB!„B!W˜Ø„›Šñg0bÔøé±fÕ ìLÀFÖ&ÀÄý¾ºuŒit½jm%ñE'ÀÔÕ‹§VN‡ ;T˜12G¤ÒÀˆžhyŒ]°°ó30Ý]0=Ý€éPÓ¨Ÿ—• “|Wé1ªI¼ú¹wx=µ˜9þ¦?8 »°BÈ•£gh úoÝ†Ž¾U°6¾CLòڥè¤)ÀøaÊɨjìÂì쬓 S“ÎK²N½ÜâSâŒ|?©1B·ä€mí^˵Bcx°~§©ßåiŽ5Có°™)^¦ rŠH€‰û½ª’$À¸¹Ãx!¾X!Òø¹¬i²D›Ô+¥Õ¸yÉ&`¼­¶­ÃX-ºˆ…$@Î`çæaçæÑÑÛôôÈ‹§j©ft“ü-®·\J:ˆÝáèß~#Von`òðqÌ|t„ËKgß* ì܆ž ëÀI-¯ëÖÜ€‰[J„‘Ã9¦.favæ|%Á $OxI¬ùƒbês?šdŒJWeËB‹H}qk·'bWR1&ûì×ã5—šÚ©(3;=‹…¹ý=ùk¢¾+¹?Ž[»®ÝÝ + eB!„B!„B!„ËeB!„B!äâÙÊ0+ƆáAíoH©B"šœ¥˜Ñ›² BvSBCvtJ¬O%€K”rŠ Ü^N‘"MƒA”[b¢ Âþ “˜Ø|l`űó¦ÒŽXÜŸ6½&B~‘BJX…_J’qMÕ!IÆZ,Μ‡™ƒé[ÓÝ%O Ö[BˆÉzÓ}SwÜûÙ“ÞõŽÞ^¬½çVôo݈ñwßÇÜø$!+‹éêÄÀÍ[°ú¦Í@G•ìÞ/òÝc­zÜ=Ö§·$é.QŠÑ"L1Àâô ììœ6BÒ÷¾{Ad©0~:õ"‘‡ÉM¹~T¤cÞXYB‹^’J…ɶ‡™tm”æôs%K•²Œ’kDm¿}f¼™^ÞD€‰×/~_~¼©þ &+ eB!„B!„B!„ËeB!„B!äâÙ à—Ú½ˆk… #¥%ǘÂϱ 9$ÃA&ñi/ò4^„1ñ÷ä˘ Ò‘#`¼HceC´MæõüþjAa„ib¢ŒoÈŽ97Zr‰ç=—D€ “Å­:Æ'9èmvqvrèîFgÿj Ã%!&^J… ûUÓ·l ÇÈ~öžµƒ~ô>4O~Œ‰ǰp~„Kgõ–XsÛ6˜žî* FJ,@x-ø'X¦ÃD¹#•)D ÂÈýn“3ÏŸ‡ž¢UR'·h;E¹ÅÉÅñoŠ”[„Ì’ -BÞ½kèx»A!„B!„B!„r-C†B!„B¹xø¿WÆÆA$ÏŽÒ¶œ© ÃD¹%4s ¹¥(§„fcç`,DÃ±ßæDšÐ0.Ä ™+Ô«zñÅ ñ¥œ(ã¶ÙRw³–Wªt—d¤“0ªQá\âj»Ãüì:úV¡cu_ÒœnâÉË5IÆ7uË¡›;^ÓØ0nôôß8Œþ6`üðqL=»¸BÈ…Ó;4ˆ¡»oA÷š˜cÄÓ/“[Ä;+X/j¬–[ü{ÏF‡0Ô‘é0‹³sXœœ‚]XtÉ(RnñBIÜ’ .Zni-Î䵥̢„ñN ÛÅ‘¥Ô–ðÙ 1á]¦Å@®K›IŸ’(“J8ÓcÓâú¸gÄwWJˆ‘ÿ¶Tÿ“do»@!„B!„B!„r­C†B!„B¹x(ì ë7  £Ã`ÑzY#—+”D‘HÍÑfÔQœb¬–S¬O6ð ÈÖI)>•%4xûýNJ1"FÌmDC¸—lt½j\Hy©M€õ”´ç*§Ã„MÍ0r¬ÞW%ÑøO…$™j!ñx ,6§agfÐ10€Ž¾UY¯zœR}ˆZ5‰ëïô{L›Ï10]XwÇv n»#oAóÔYB–GW_/†îº«oVLL†B|»ˆ—VxÏ$ï³€ô+¤#$@/ÂØÅ,ŽOaqv¶…Ü"ÞùÒ‘cŒ~Od/#c‚Ü"Ì:5DÎ/gÖï$Þ?R” ï&¹=Œ–âŠ]BݘXã¯wI”A2g\KRW­Ù 9>¥ÏÓŠA)&þX}W”aVþ7"!„B!„B!„BÈe†2 !„B!„r‘ìÞ5tâ¹ý#ØÔîµ\ tt mÀÙ3“¤$‘~Õ§ù¹yÌÎÌ¡{U7‚L"X\2ïö’‹]ÃR<1"&ÖC/Òf‚Hcb>‹µ¾Y[Š/®®ð}ü>ib¿–lÔy “\ü‡b@ØÙ:IÉ0~ØE‹…±q,6§Ñ¹v¦§;Ô5ºÃ;\Ë4á vtëu"²±Æt÷¯Â¦Oß™GqöØ•Íß„…éìÀºÛ¶bíέ0XÔn‹˜'¾˜üà\qðrÒa¬ÅÂÄ$›.µ¤¥Ü‚Âû!•[Tm±è³‡´]L2Ƨ«Èä–êô’T˜dŠp Zˆ2im/³„:F-¹˜½žº9!jO7Å…_Š|\cxÍ2Ž#eB!„B!„B!„Ë eB!„B!äÒØ àçÛ½ˆk…ÆÆ(ÃT$ÙôœìnŽMa]ßK€rJh¯€­•r \@‚käFš(S–S¤HcE‚Kšcö"~›¿oDŽëˆ§#’liǧ¼ˆßèÉ0²Ú2’d¹¥I2b›lìì,æOŸY½ëÖÀtvèÚ2FÔ®m,Gl;ËcýõmÂÖŸ}ãGOâÜ[G±0;BHdà¦Øpï-èê[káÞ%P%dU?:ñE‰1Õ_21$Æa‰±âñ®K‡YlNca|XX”&IÜ’¾/¼ô‘ŒIå£SµM¹¶OJB rñH$–äJ‰0ò³cêæ4Éúje™‚(c€æXS|îû2òûäwå¾ãÆ0“aV˜½í^!„B!„B!„BȵeB!„B!äÒØÊ0+FcxïšSqCÁ…’i!~4Ç›Ú<”ø2&Ø(^'i™c9¥&ƆýQnñ"•âKE#ºÏk4#„Heb½ØÒ.%—x®Ñs)t­ËyE­ªpa¼†l²Ï6›˜›n¢kítq_1²y;Ö2b@LVc弪ÑÜ`Ý­[°fÛ&œ}ëÆ}›ü ¹NéÄÆûoê ë\0KLq‘â]µ-ìB|¿¹Ÿý»B¦¼È±©#ÒaììyÌŸææ’—AúüK¹¹Ü’Œ)Ê-hqœ?•¤¶JWeËBK½(#S^ýY¥Ä TWÎéÖã5—šÚ­D 96­¾+)Åd×ËÚäGƒ ”aV’q‡Û½B!„B!„B!„kÊ0„B!„BÈ¥±§Ý ¸–ˆ¿™¾`ÁdÍÎÙ4G§ãoôOä–ÐÓ-ä–¢œâšÓT–òz¬Ý6'Ò9ÆÄ}U³q|=7‡_¬_ʉ2®žõ3Õ\W[I.>Iðìâ\eµ°*½MõQë¹µ˜ÃÂÄ$ºÖ¡£uÜ'/¨Ñ+õ)!)AžJè÷‡×Œuu;{º°é;0´ó&œÞs“§Î‚ë®U=¾ïV¬½ùÆè?$¯Šèȹ·D*¶ñô[q`úλ<Öv~ #£X˜j¢˜Ü‚K ¹EËp5r‹‘‡%âŒ1HëIE 1á+”°]-I -r{üw¡úSÉ,¥9!DäµcݸŽRíðN´ÀÌÄ jQ1òºVÛº{:±v]_ýñäBÙ»{×íLr¥y@‹Áã|»@ÈEð6·{Ž·yþ¿ð{m^!Wÿ€þv/‚eòr»@!„B!—Ê0„B!„BÈ¥Afi ¯z/¦ægd?ON¹Fc ÷U°—b„œR5u‹FoëÄÝß¾£Ü7>[„ñy=ˆñQ²±ª^µF믗H€ñ‰2A¤±ûEkz¸"zpC¢Až$£å˜úd˜x|²Ï5ÖÛ¹Ìú}«Ð=¼¦·Gõ»ûFp™ª†&p“ŒOûÝkƺº½kú±í©1yâcœzõ]ÌN4AȵŽé0ØpÇv ßw LWgå;X÷¬Ù¤øâÞÕñy–Ï[|iùw‡A!Æ #£˜G¬¼·³çß?Ìõr‹¶Cü:Ó—ˆ¨­æörK±%È$2%¤"øC…ä⛾Ý~¿-¯Óf Òf‚Hc¢:b­oœ–⋘«£ÒjœÕãçMì®Úº•Êó‰^L) ì ²Ú&«¥ÂLh°÷Õb öâô4Î;®µƒèn Átuf_£N…IZ×Cçw²ÖÒø¬ß¾ª»æ¦a¬¹±³ï¼Óûcan„\‹¬¹i7<|'zWWÉ,.úÅËåÄ—øþ ¨=V2A’ï”…É)Ìž9;·R) äϳ~MfÈ ¹%\ÒÚÈŽkU;¾{!E¼“’å©9ejKødCŸZeòí‰(#ë¦ÒŸºl‰(cJµ]¡æ¸—ÿÔÛ;ßV4c 6l¤ ³Âìm÷!„B!„B!„B®(ÃB!„B!—Î^Oµ{׆âÕm ?¦ÍÐÀÔhÓ…´–S äÀ¥¼ˆrÖä˜%䔪vU¯_ü J€±áØ|® °¨ý.ÁFŠ<á³;‘°¬šîv!¯ÄUˆñ6n©dã¶•Æ'sÏŽaa|=ÃëÑ3´¦#6·gߟhlO›Á‘+×cýŠò±€éìÀð½7cý­[prÏœ;ôaM4!W«ÖöãÆGïÂà(Á_Ü3¡dùÈ'’„H°’ã¨tX<çOÅÂôŒ~†3¹-ä–ÂsŽÛëÅyl2FH%©è¢’[Sa¤(#Ób ? 9'•e”(ãe·)µøÏR ÑkIêª5ëõL‹$,ñµêŸ¤üÏÆ†ø·—¬L†!„B!„B!„B¹P†!„B!„B.=  ³"TÉ0²‘ÙF¥ÖqÛÔX>å%Ê&¹œE–¸?$ÀH9%k*wRJhwz‰h:âKu¼•ÌNÊA&ÙˆFt!¾X!ÒÄDÑŸ^”\Â™Š¦÷D€I:äU’Œ¿(ÙµŽÂN’T›¼K’± ‹˜9ù1fÏ¡ïÆat¬ÎÈ“–øØ´ž¬µ”"cjÇš0¦{u/¶ö> ß½ þø-L~4B®V:{º±ùÁÛиk{õžLÚ–°£zÇÉ/y¼Ã_AD–ƒùÌ|ts#ãÑ(©•[Lx~…Ñ¢~Ôïx§™Åäµ¾¨¯­Çxq.Kn‰-J–1bš’#ß5&© £êÀè%—Ò`Š25s¢¦vs¬/C*:µ¤§SÙÈ%2 àv/‚B!„B!„B!äz€2 !„B!„réð7€¯ý½èëëÆÌÌ\¾S6?§}ÐŽéñi—œÅ—RLÐO²T–DN‘MäA²‰ê‰’l`adã+ÀÄ}U³sõ·Uõ*¬iÒ˜xémÌNNƒ«c †ïÚ†¾½=ÕSé3‘ú·'ï/‘Šäß[œc-f>ÅÌé3À¢Ã¥Н‘l’gW™.ê7é˜Tn1ú8%Θrm%žHiÅ 1ÈÅÝK¢Œ\rÜž¤_I1¦nN£×—\ !ˤëѵ1N†ßeøÞâ½P Çr‡lØHfÙ·{×ÐB»A!„B!„B!„r=@†B!„B¹tö¶{×áAÿ` ¡ñ9þl­Es¼‰Õëúøâ%Ùî_„œb9%ô†;ÅÆ$¿ßÏë!$ÆÄù}C²n6·^n)$À„¹|=%í ìé0Kˆ+âz¹³Ò×ÓÊ&öB2ŒQÕ3É&6Öëñ¾={n|£oM¢oãVß8 c:’æòBÒ‹ÿÑ7€ûjl©Ç>k¬ß¹C7߀“¯Âɽ‡°8Ï~eòÉfÍ–¶?q/úÖ¯…­„†$ñÅÈçÏÄg×Jû!<ÿþýcY/2 Fˆs£S˜:þfç„€bÔóÖRn‘h"Œå™Vr Jlj1…Ú*]E”UB‹Ÿ¶…(£’[ˆ)B\ñÓëºrN·¯¹,C”‘²Œ\»¿ ͱ¦^Üw«¾Þø}–Ì&ì(üoBB!„B!„B!„+eB!„B!äÒyÀ€þv/äZ`ÃðŽ2Œhz.Ê ͱiô¯ë‡OJ0@Hl ãR< ¾rÕHlýX1¯ß–׋i3YºŒõõÜ뛞£øë!$À„ùC=ˆý1A&6¼—ÒYÏÂêíùuôé0É6uh"À½M 9¥ñÖbúÔYœ?3†þ­Ñ7<zßC Õ\nÂ>ÙPžŽ•åª^†1@Gw'¶>r'n¸{;ÞñMœ9p„|ÒXµf5¶?q/†n½ÖF ÆÈçÎú§]ˆ-Én“Œõï?Öm„zþmõÜ/ÌœÇı0;>U/·¸¿ZÊ-Jp©—[ôû½¦vòü+qÆ},„#…÷¾û¥x¢—¤„¹ÝÄåÁ¿{U­tNˆwT¡v¬kÔû,­]hŒ¦Æš¨Ex0J„?7†ê' Ó !„B!„B!„B®”a!„B!„Kd÷®¡Åçöìðx»×r-~C}ÖT äMÔq›>9:…;q÷r „œ¸”ÑülÝñKÉ)^Ž©ÒeªzV¬+Š7bŸ[¤ÔIŒL€ õª}ÖïWƒðÙˆjn÷Èt9“L‡1bh>>öR ñ¾Z 6é÷#Óaâ¾ÅùyLùÓڛѻ¦¿ðuÇFw£Ö­Óòþù¸Q…Û3؇۟}›wÝ‚£?؇ÉÓ£é¹âtvwá¦GîÀæw¢££C'} Ê*ð›ýBv°î]`ŒåüØ,¥ê! vaÇO£ùÑH¨©“[”¥dÂZ+·h;¤¦6ÒÚ¦PBÑËËS¢ŒNbòJ²b¼÷t]9§ ï0%Ê$µý;Užv©¶–sâ:šcÓú+²ê‡%0L†YY(ÃB!„B!„B!„\!(ÃB!„B!+Ã^P†YŠM¹²;“&ô¸©±¦FŒÐ0¬h.öMåAd‰I ¹øâ$7ÕTå” ÙÀЦs•2c9ÆógõÜ’MUÇZy>ÕÚe½¨ÌHÉ%œ©ó\ âŠ_¬Ó]êD—( Õ&ÉøÅËcõ]ÎOMãì‡Ñ7¼kwlFWoO&¯d}ñ…õÇæuÑ(ž4K±FŽ]»eîÿµ§ðÑ›ïãýÞÄls„´ƒMwoÇŽÏÜ‹îþU°Ö=~iâ pïŒ(…D!ÎÈqr,Þ¾n<¢ùÑ9Œûv~A.‘gÒÚQ†K„‰%y×È9ejK”SL¬-®‹Ú.æ’ËVŸœ7¬E¤¿¨usVuçÏÏaîüœúÕerÿÖ“¼ÒƒkW¡§‡ÿo‚bÀí^!„B!„B!„BÈõÿ¿\„B!„BÈÊÀß¾B,ë7ÔËNï¤ë{j´Y5 ‹Ð“ ñ%&À„Ì)¾x9ÅÈ?O"¥Ô$À¨¹‚<â•“´šP¯ÂúTDñ%¦×¸s“õD£{Ò1Žºt– ®Øô×4­/6ä á¹ñz>!ߤI2þäô˜þx3gÇ0xÓF¬Ùº¦³SwŠ‹*y3¹‰ÃD繑²LØU3Öt`ó}7cã7áØ‹ïàøžƒX\X!W‚5›×cçÓ`ð†¡J‚øJ`‰ï `8˜˜£äËÒaÎMbäЇ˜kÎ8y$yÐüXùÞ-(~þ²Ü"5j“(¨k§r1AnÑÇÊ2qþøÑïÿ†HE™ùÙ_­ ®ˆKêšð^úЍí?KF¯%©+æËÖ#jL7å¥×iBêÖ÷B¼o˜ ³¢¼±{×Ðl»A!„B!„B!„r½@†B!„BY(ìjscO´)î÷L6c3³_¢œb­>ò˜òâå”Ð;\í³¢ÝïO`d'¶¸ðsA$Àøý>FŠ/1½&žu.í ì·êO€¼^yl„[…¾ˆ¥cTùVe”dcëÇÇuÅ}Æ]»°ˆñ÷N¡yò,†vnAÿÆ!íè¯]7äûYã»dŒ/íêéÁ­OíÂÜ‚Cß} g!—‹Þ>ìüü.lºg{`d‰/á9÷‚Ü3'%˜ÒX'#êA¶›Ÿ™ÅÈ¡Ñ<3E“ì› (êáói6Ä%·@¾ÈØ–r DídMáÙ²ˆ|¯$â â8%´¤Ë÷Ç P "ŠJru`ô’sÏ_Ó¤VaNÔÔ–—}z,Ê0µ¨ôµ¥ ³¢ìm÷!„B!„B!„B®'(ÃB!„B!+Ûfô´{!W;áø!kœN?šlØäè”kZ–â‹OYñ©+Õ±AN‘)/V6Wû‚4#æòÛJ 0ae5’ML£A&¾Äz 0r­º^µ °BßoJé,ˆgaõöüÚJ­Æ#$«ÇZìEE¡Ø$ãÓ¹+1©Ú>~¿që>Ɔ;¶¢wpuX{X¡tC=b³zÒ°óËcû‡qÿ¯|gžÂ¿Ý‹©3c d¥èèìÀöÇîÄŽŸ¹=]ñ¹­I|±B‚‘Ž‘ȱR‚©I‡±ó‹}ï$ÆŽ®æ—„²Cäû5PÐBR1âùJ6ñ××NŒwœgL¹¶Oi¥:"O€( ¤¢Œ\rÜ.Òg’9Ôg#æ4z}É¥²Lº];h¦Æ¦c1¿çì»—×_ˆT +ÅhB!„B!„B!„+eB!„B!dؽkhî¹ý#ox°Ýk¹ÚÙЀéèPbG í».05Út Ë1&Z#§Äý¾yY&ʈ¾rw|ž(ãæHä%ÙˆSñÛB:ŒŸ_ö#®U×sk„äëU²Jè";éåL2ÆÈX™l|\ñãÓyÅ÷J6±i;n›À‡/½…5[XÛMèîíÎ늆øØŸ4Ã׌EÍXÙ_߸e3¿}>xõÿuÌÍÌ‚KaÓ][qûÀªu•üÖ*ñE¾£U?VŒÈ’dÖ`üäœ;ð!ægç”´ä–LBL¨\@Qr‹|èa¤(Ï”>5¤fMþpQ;(^e‹âIIZI¶yRŠ)B\ñÓ«Ë$?ûõøwÏ2D)Ë Ys¸n_s¬ ÿf{k*$’%ÿ<L†YY(ÃB!„B!„B!„\A(ÃB!„B!+ÇP†¹d:;;°v]FGš-FõWõsõavfsççÐÝÛš˜K2 DŒ âKLeña ¹øâÆÊz¡ÑØýí>[ß¼læ·âx/Òøñaþ¬ž[§k¨¶6‘mlžZã/ãpBå IDATU Ò¢M:fªsdu¼ùøH†j“dÂ5ÒÇÈ:ZÈqã­ÅØcâäYlعC;n€é) ˆMẠßÕäË‹tl‡ÁöOß-÷ÝŒƒß߇~zv1é&'d 7 á®/>Œõ;6Á: F&¾˜Òãe~~E:Œ)ŒO°ëÎŒNàôÛÇp~lJÚ¥BÉ%Ùd‰€’ˆôyjY[Sªmäa²®¬­þ!2KxößZÚ®–ű%§ø9DðÎÈ$œ(Ê”d™¢(“J7&sjTÿ[…õÎq™ ³b,Ø×îEB!„B!„B!„\OP†!„B!„BVþFð¢1<¨dÕ4ö^'Ð05:¡MÝ™L⛎a-l_bLÈŒ‘â‹“S¬‘ ,rƪñÜK3¥5ô\@œË«7U=¿–ªá9=6J2€ëy7ZÚI˜Šå¤³äÇDI&î[V’ ¶µdcÂyåÚòûµaôâü">~ûƎƦ{¶c`Óè7âèšTÈûú±º7_Ô5=ý½¸÷?íÜŽ·þúœ9r „,EÏê^Üñ…°õ¡Ûà_íÑÍÈñË Àˆ'PH0~¬„\c0þ<£…ùìhCC,ÐÄÂuJ­8cÂî’Ü¢íšÚHk›BmYD/W,/J*©#åY+Ì‘§ÂèºrN][J+²¶¯.O»T[^"¤¢Œ«=5ÖŒ_|ŠÜn ï“aVŒwwïjeñB!„B!„B!„†2 !„B!„²rP†Y!Ã8tðô£D3tÂÔè†nXSp2‰×OtŒKYId%§Xƒ #¬NÎfEß+ÎNÍàƒ—ÞÁÀÆuØ|ßÍèìSMãjÝ¡‘Ü„]±ùܨsÙ•nÔ¸äþ2knÂÏüæ38õÖxëÛ¯`êÜI1¸ù±;qÇÓŸBWoK‚ñ©Sâ©ôï‚`¾T?ÇT)'¾">#Ê;cý³eíÎ:3O`q~AÜÌâù- (Њ’P´€¢—ÄD1þ]©"]­jC—È3ií(¸%BJØ®—'NU—–Ÿ¥(#®‹1&›3½R–‘5âZDú‹ª!j«9u]¿Æ¦L†1&IñªAŒk 3f…àB!„B!„B!„\a(ÃB!„B!+Ç~ :Û½«F#ýMõIctÒ·nŸmFFŠ/N. ã!¥!Š+ 02Å!O”A–Ê’'ʈ¥Û8l`CÓ{åÔˆù­jŒ˜ Íói½j·i¬•Íöi:KX!Ä…‹å›4IƯ9_‰Ez»J’) 9rU&]«X¿;§ÉFpèôÖßr#6ݽ ]=]¢¡\öâÇæó¼¹ªÉ<›¬I×6ß³ 7ܹ‡_x ¾·ó³s 6ݾ÷~éÓ^ ÄgÑÆd(ÿTUÿçßUñTÉXŸ /H´J‡;q§^?ŠÙæù`O¨T!’,)·ƒ$—[ªq¦î¸ð±¦v*·$Ï^¶îp¬,åšx*â¹ ïx eŠi1a´–NÂòÃgwL&­h µkÑ—ÀÏ— =Ðëõü·Þœ˜FŽ«ôÏšÎάZ]8ž\”a!„B!„B!„B®0”a!„B!„b÷®¡éçö¼àžv¯åj'ü¦zÕÝ‚dÜähÓ·2Ã:¹ÄZ™Ú7¤&Q&6-çâKZϯËjÉÅ'À„>q7FÎÕ"ƪzn-€|b=)ø:‘(˨K©²aŒŒ•%Lø±>I¦f^£ªg’MhÞNÆÇvÿjŸµg}ˆÑcá†ûv qófÑ]ެy>k’G2Lü{÷['Èttu⎧vaÇÃ;ñæ·_Åû¯,6œ“ëƒÆìúò£ØtçVN‚‘2ÜýîžÉÎÞIõcávÅ÷c˜mâÃ×còã±ÄàÃËgi¹Å”“µ£äÞáKÈ-þÂŽ“Ï`*Îxò™•Ïpúj0bš’“ˆ(Pµª£„£kÇÓLD™š9õûG\ÇdÝþ˜éñi,.Ê®V/ ÷Æ·Õ†Æ@lÈ%C†B!„B!„B!ä C†B!„BYYö€2Ì%³a8M†‘ˆÎଉ€1˜rHØ ÔÈ$ 06ˆ/1Æ'Äø)¾T’¨“ªñغ„Ÿ‘æ ²‹OˆAœßúf÷w!&M”‰çe·u Dj…¸¾Õ¹Š“AhÁ¿´$™ph~ŒÜ¦“d ãż ³ó8þÓƒ8{è¶>¸ƒ‡\ºN_ÐÍ÷ÐêF7·çåßD¾jÍj<ü«ŸÃ­OÜ…}ßø1ξäú¡{UîzæÜú™{ÐÑÙkmLMJ“Üf@u>&S`ÜV?•þó3ó8ñúQœ;r*KfÊõ` ¹ñ彯 ’:¹EÙ Fl CâCU_»ðà™Âº µ•xb͍¡d≿~%QF.9né3ÉÙg¶]WË2ézò4%Ð ÖœŸÒ_…pcrW½ Óhùo-¹@^k÷!„B!„B!„B®7(ÃB!„B!+Ë¿ÑîE\í4ág:Ð꨸sr¤SLß,m-l_¢ãEšRŒLyQ½ÛRr©I€QsÄÿ•¤Ë¤õDZ_{L”qMôkM˜80n-§³$ÇøDdû’I2ˆ!®4®©ºÆÉx}QâùÁˆQ€ÁôÈ<ÿ†¶ cëC;Ñ;ЧæH›ÈU½ŸK0å±ê¨fõ Û†ñôòðþžƒØÿ—/czL4ª“kc n~ìÜ÷‹ g`¬â\ ÈkF~?Ç¿c–N‡Y´¿û!>|ã=,Ì.Da%ü]PÂúã=Arã/%·¨úñð¼¶ß‰úÚ¢~qÝIí ¥I‰DŒËÄyŒ»’Eñú³W«BÕÕk“b JsÊqâ2euÿ é¾j@slK"n½êç¸aÃð@ÍAä9²{×Ðh»A!„B!„B!„r½A†B!„BYYö¶{×Kÿ¶ú("”˜ª†¸!“@ˆ/^N±6 ÕøDNiQ/&ÊÄÖî8>M”ñû«“i5Bn±n¿•õä\ÐsAˆ4iúþA ‰ø8qmÃ*Ä5/‰.J\)$ɺ™¿ åÄÕÅúFfÂöx¬<ó¸Ò‘c§1vü n¸g¶Ü·¦»«Ðo/ò¥,ƒÐ´dªº±I{X“v<|¶~ê¼ý·{ñöw_ÃÂÜÈµÅÆ[7ãÁ_yë¶l¨îSÿÀ¢è¢ìâž$›ß‚éX¸g±T2Þ¨t˜±çpì§1=Þ 2H½€¢ïãd5ḋ’[Pª-ŸsQ[ãŽSµ³çt‰ÚBZ BŒ—EPÚ®–¤¦HšxjZ2 'O£J¼¤x b ýÎIÔÌYÕk"Øä[ƒ1h4˜ ³Bìi÷!„B!„B!„B®G(ÃB!„B!+Ë^—‚\ƒkV¡§§ ³s È›¶kۧƦ¨âw¹†s)¾¸´+4Œà¿B‘÷Çz1å!•%_ÒDÒj|= ÄÈù­«“6Ê›XÛªzÕnëš«­ˆ«ˆgSWTBKzÝ—Wòñâʉ¹„bcu}¼)¬UlKš½«ï²bqq'öÅ™ƒ'°íáÛ0¼s3Z¥Â„fü• Ý[¨k€®Þ.ìÚýv>~ö|ãEÛs8¯O®:ú×àÁ¯<ŽmÝ’`³ëÅoV8 &|2ñކ•ÉPr»ß-¶ f&šxïå=~Fˆ&éó'¶‡›Ý¨Ý5Fp!r‹IŽS‡u˜¶CüǤ6–_;•VäóHÄèíHZ„@£“Ö•—H×–ÒŠ¬í«ËKZ[7\¶tùù4G§b‘L€1Õ{;ȹ Ó`2ÌJA†B!„B!„B!¤ P†!„B!„BVÝ»†ÆŸÛ?rÀÎv¯åj§1<€'ƪO!P-¦Æ§Ñ¿¶€Klur‰µ6ô†  “Ħöj¿“\¼Übµc â‹"M—ožŽé.VÔ ãC#|l˜%ê`à2bŸ—~JÒß±¯·©öé’¸"ì•äR7>W¦ä„ý!)G 9É¾ÂøÙæyüÁë8õÖ1Üòø]ܸi£¿G鄆dʼnPŽ5…ºÀ@cOþö³8}à^þ“aäø«®ž.ÜûóáîgîGGW—óÓÄ]hÅ-Ÿy]îŽõR‚OI$78ŒMßl só8¶÷N¾uÌ=ωHR”[ÇH#­.}Ã'r‹|8”ìéi!·¨u©%%fH¡vÜ¢Ä)—ˆ£JÒ‰ú,Eq]¼l$çL/‡¼ü²FœS¤¿$ëEqÎkvsNŽMëï±Fz‰»Ü›ÖÝz”aV ¦B!„B!„B!„´Ê0„B!„BÈʳ”a.™ ÃQ† õW†hŸmb`Ýê– 0(È$2QÆzñňD뉅øb‚íâDš¬^µÏ×ó 0Âø¼žß5?¬vÜgŸ£çMõâ|â™kyĹ0cJé,ð+M’dÒ/&ÊDÅ$ fcüªdÃ{]’Œœ;6íÛd=ÀÄÇcØ÷ÍcÓí7âæGïDo¯¾ B•nHש™oà›ñ‘6ÀÇA›îØ‚Ýÿõ×pèGobÏ7~‚™‰´‰|R¹åÑÛñÐWŸ@ߺêyó;ÒŸÃ(”øtˆd'u犱òöu-N½û!Þ{åægæ´¡$qSš$FŒYRnI.·ÀÕ¨9.|¬©Ê-úAÊׯ’ªŠ.išKxfkE±=ŒN¤¿üðÙ?ç¹(#kËw‡^‹¾~¾âzJNá<§F§Â­“â…—Ú64‹ÛÉÃdB!„B!„B!„6@†B!„BYyöø•v/âj§ÑH~c}æ+˜V;19ÚÄ ~o>¿?6©ÇýƉ%Q<ñ"Œi¬•ÍÍ. Bˆ'q^/Iø¹` ‰2b­ðâ[sZ¯´vD‘&ø4&®5`ô@ß2-ö)9F^c/éí:ƈþkQ'4wçâJq¼l°/ 9r¼ãý[Á?:pgŽœÂ¶‡vbëý· ³3®E¥=ˆ™MöƒXîí—¾A«ëÜñä}¸ùÑÛñÚ_¼„·Ÿß‡Å…EO&ñè¯=‰;o„uÏœLsÉ_`¯%Lj‚á6ÏéRé0ã'Gpð…·0yv¢Vn ·«×¡S–¿êY;ÞìFŽQrË…ÔNηp\xxƒ,ÇùtÈgV ÉeyxY”‘"ŠÚîÇ‹Ë^7g<ÍD”©©×¢k§—=\uÉ &G›ˆo8ýcv9m¾aCúï,¹>ܽkèt»A!„B!„B!„r=B†B!„BYyøÂW€ ÝtõN'C'G¦ ÅŸ˜!ž„fvÔ'À„’5 0q¬eâÊóùÓzþ¤¢øëU‡ªD¹vè¹€XÛgÎø´ý'êÓVLø#WŒ–Š+Q’‰ãUv`#®e1IƦÇäëD8cy¸®µ0·€£?~§Þ<†Ÿ¹Ã;7#C$O„&v¤ õ¾ñ]wÜgcUÝê½}½xìß}w?µ ?þ¿~€ö½—¯´¾µ«ñȯ<Û?{O`ŒéâýVH|Ò°"X’±Âߊ·°k™‰izñœ>t2!¢n¡y§¥©0…1ur‹P€üE+v†’uµM‹ÚÉÃäŽËÖÖÖKO„ÿ¾ÊÓ_ªãDÚ“Ñ•óíñØtŽì3 ÛM²VuÉÒõ”S_âûÄ$uªãææ1;=‹"Æä’•ü*,Ðßß‹¾¾îòr!ð¿ù!„B!„B!„BÚeB!„B!dåÙÛî\ 4† ¿±>ôvÍÄhS #&*U!¾¸´+4 ÿ[ûµLÛ}³³u2JL”AH€ñû¤øb…H#›çcZ¯‡ ¨ùmr>69Ï'H6ð"M%ùøÅ»“KéÎ"þ‘\`>ºô¾%ÒYä>%®$ÒŠ^”¼ò‰dcóñÕw©k¥I2ÓãM¼þ­W0tSw|þ^ ¯UòŠjÁ èan1 4¬C7«‡µ‡Fx±öÆ!|ñ÷ ì{?þú÷1zr¤}ttub×Ï?ˆ¿ò(ºz»«{ËÉ,áö,9Xáw¹?‰O"Òa” æÄ……ù¼÷ÓCxÿÕ#X\Xˆ†F* dr Âwé1FÞ|ú@]{)¹E>ˆ‡çµýNÔ×õ3q¦P;•\dÙL:bIbÂ3˜ˆ'0Éxñ.kеåÚäóÒœrœ¸LY]/ÊdûÄ9»¿«T˜ä:–˜p[ÆûSaVþ7!„B!„B!„BH›  C!„B!„¬0»w }üÜþ‘ãnj÷Z®fAdMÓË¢:frd ¢7=6<;™Ä:¹ÄZ›©ÐüeW$ìw’‹OyÉä±>Î%Š4! ¾ÁÙë6ºq>Œ—BO"¢@¬£$íTõ|»}¬g³†iÝ­oLM:Kø¨÷¥ÍñK¥³dó½]‹+ Þùxvh5>W4ì?ƒŸ|ýû¸i×ÜöÄ]èYÝ+üÑl¤¹±A=oö_j¬lx7ØþÀÍØ¶k;^ÿ›×ðÓ?{³Íó W–ߊÇÿÑSX³i-¬…“ÆÄ”¤ÀH%<£B8ÃÑ:FÞ©§Þ=Ž?z 3“3ÊìÈ”xÕ (Ùý–Œ¹¹¥(ϤµÅ˜Z¹Åj'ë. ?zþLˆ1þ}™lG–„–ð³X«IæHE]Û¨eæ"Ž8&ŒM¤¿òT”1q¼Z³¸4ScMøû­žd¿øXNÉÅÀdB!„B!„B!„6A†B!„B¹<ìe˜K"4ê¦}Þ’¬ q7vóŸÂM÷í¨|–µT=O¤U'å¸ðô$¢ŒGˆtc,ÆNâíïíÇè‰s†P• n ò=1N>;ÚÐhQ[L’Ôo-åøúɺMiÝ&³œÚrér¸Oª¡&Ì¥¶#Ihs(AŤu场v.­&¹¤Åºê}‘¦Ó´>Ÿ©±iý5Úâ‡Õþ“aV Ê0„B!„B!„B!m‚2 !„B!„ryØàËí^ÄÕ̆¬Qר¿2’©JÔ(¤²øÆc)“ È.ã­_Œ3IJ"#SYä’ÒzAŽs¡6Q¦h‹â‹«g“zIZMèÑ7±v&À@6P×§³¤_B)IÐé0FÆÊÈ‹ª¥âJ6~Ùkµâ/±&-Â9u çfæñöóûðÁÞ#¸ç ŸÂð-›’†{™ô"N#ló‰¤ß/àQSwõÚ~<õ;Ïâ¾gÀþÍwñá›Ç@VžU«ðè¯~÷>s?LGl¸ Z&¾øïÎ߯áˆ[²4V Õ³}~jïüàM|ø†ûŽMvcä–|LYžñÃM~œ;6¿w£¢nØp¨·7Ä(·¨u©%%fH¡¶—YŠâ‰x¶Òç3•NÔç:QƘlÎôrÈËïkTÛs鯤ëõµ!çl±æ0g<÷©Ñ),… ·³¼ÿ*˜ ³"œÙ½kèƒv/‚B!„B!„B!äz…2 !„B!„ryào ¿Dº»;±fmÆÇ§³>™éYÌÏΣ³§3ô³™$$6ÄĺÀI1A&q"Š›ÖA&Éëùý1õ!$Ê@4;gó—¥·%íXÆ»2þjH¡Ç­#–ç!ÒoÜLñÏVi+¢Ú2“d\¸N’©OgÑÍòR\ÑkŠk•Ç”ÌÆrHéüLøÞüèɳãxéßþ›vÞˆ{~î~ lHšÆM<&6¶Ü¹ÌÐ…ïÌÅél¼e#¾úßýþøüèß|ã§ÇÒªä"0»~þAü̯}½ý}•cÑ"ñâ»F¼Œ¿³ ô@q_ÛxÇÇ÷ °¸°ˆ#/ÀÞÁüÜ‚?Ps™øW«îd⌳¤Ü" ’\n«!oÖdþ¤¶‘cR¹%‘sáPónj™:%Å¿·Ô‹2b{/Szzê¤ÒŠ®­Ä·äk”µõö<ý%“p ç)¿ÚÉѦ¾–ò=X †I¶7† ƒÈ²·Ý „B!„B!„B¹ž¡ C!„B!„\Ø ¹4ŸYb”)þTÍÂë6­Nl‰‰)1¡%¦»xÉ¥”RYj`ª­I¢ŒõrJ_L°]œHc„òa}Cti”øb“ùm<Ÿjr>ÅD٤Ótø'²‹¼Þ*û%WŠŠ‘=ÙF/Å•ä˜0H®U¯ÉÀ; :I& 9q_–$£N;ÎýÑÁøøÈIÜòéÛqç“w£{UêÙ×N‚¼.…Tÿ?ÑðФcŘÛ¿·>r^ýÆOðòŸ½ˆ¹™9‹cÛ§vàóÿä4¶ÃZ'»8 F¦¸h'Ã=3€ûÂeò¦·ëºÕýipêÝñÆóû052%DaNˆªurK(n¨ãäŽÕcÊЬ-“Ž’G©¶#®bâÿjŽ3ɘ,¹EœŸOÒå4Š2RDQÛå3+ÎUÏ™ÊleQ¦(ç¤u —=\èõB¬ort:\ÎÌ-\ SJ_#ÅgB!„B!„B!„6B†B!„B¹ ìÞ5tü¹ý#n÷Z®fÃ8räŒØâ›ƒ—wüÄHC›Ö È!þçû¦d—ãSYJ 0 0ÖÆä•jL€‘õ‚lce3¶s‰"KÜïZ¤mi|Œo~óû¹BœMlÆöâKH€)$ʤõJ‰.ëd’d›?ªFv‘u”䮩ŸÎkôv%®ØÖã òµj9¡0¯¸™â•Š[,¾øŽí;Š{¾° ;¼%4чÆv(w Ô2iw¾¬œ5ÔËÎz£Æt÷tá±_ý î{æ~üð_o}ÿrò)²nó>ÿ[_ÀÎÇn‡–L| wSHtrw|*M]@:ÌØÇcxýÛ{qúè©Üà%k_Zšâ@-ÎÆ\²Ü’ÞŸ¥Ú¦EíÄü‡&ëNk#yNÜ^ZqgŸ‰'ê8½µä¸=›Î‘}Fa-F×Õ§•®§&ÅÆo‡Qu æ“N†'æïÅ%,™e˜•€2 !„B!„B!„BH¡ C!„B!„\>öx¶Ý‹¸šQ¿¹>íÑ.n׃&F§B#{ÕgEŸ#õ /®ÈñÄ7&ûÄ– ÙE¬¢&&îMö­`âüi=}>¨M€©«§Ï'žy’“¦­9Vï«„"ÿ©$S-D/÷9ÉÆæãã\q_lJBŽå›ÝSÉ%ÔÌšÅÅEI2ç§ÎcÏ7_ÆÑ—âþ/=ŒÆŽá¤ßnBúßSJ|QG%Mù±Þ„òÆ nÄ—þ‹_ƒ_~ßý_¾ƒ“ïž©§§¯?ókŸÅÃ_y]&Œ¿¨Vˆ/þ¾ô‚˜xhKÜ6ª^ê6Öìôy¼ù½×q䕃°‹þøxƒÔÉ-ÁxÐæE2Ä$÷›cĘ–µS%•[Ô/É-âF.¯[Ô_RøIe– ‹ˆS§âLjç,>{õÉ-²†<}$µåÚ¤ƒÒœrœ¸LYÝp˜dŸ‰çìkÉó2L¼'k Cª:: †Ö÷·>†,Ê0„B!„B!„B!m„2 !„B!„rù  s‰l¸ˆß\/¬'F¦ª_Ž׸.RY¼Wâõ)“^v á+!±^& "ŠœWÈ)b.¹® â‘SÇ ñÅ ‘&ôÚ ‘&K”±I½RZ[—l2Ʋ¹º>EãÏδH’ÊÉ0JYÁ$™ºd%äè}þ¦çå9q÷¿þ ¶íÚŽO}ñAôõçÍôˆÍìê~¿oœ ñÊ-S À×Ùr÷Mø÷þçßÂÏïÃ÷ÿÕw1yvD` v=ó)<ù›O£hÖV2”L|ñÏ@ønn7«ãÆúÈÓaìâ"½to<¿³3s0ò&rG\3 (^˜€¸IÔ ê~Ko¢VµýZDí¢<“ÖÎnè‚ÜRX·ZVzM µ‘§¾YÉvqdIh ?‹µšdŽT”ѵZf.âÈçº,áäM¼ÜzÎä}bôú›“3X\XÔ7i-É  ­ïGGGz‘ dÀáv/‚B!„B!„B!äz†2 !„B!„æ*ny IDATrùØÛî\í4ZÉ0YCxÎÄH³j –2Ið/ªá˜Sb“»“b‚Lâ` ë¹:Y=„ù¬;ÞfõP˜ß×öõ zÖ’v*Éq.q^ðZHÖô-$Ĺ|Ê‹ZÊ ÑÊð-ÖK$ÉT‹íØq|ØÖJ°Y2I&_« äv%ÙÔžŸ ×2QrÄ5ª&=¶ï=|øæqÜõù{p÷S÷¢«§3 âšÇ$Ù/fÏ>ÔŒ ò®^°ëÙûqç“wãï¿þC¼ô§?ÆÂÜ<®wnºg+žùÝ/bó[‚#ŸSð"[òµWHÙ%Hi:Œø±óÑ¡“xõ/бÓcîž0u_¸´(’ Ä—ï%‰Âq&½I‚$²ÜÚÙš\ÖRޝ¯‚ºiKë†Yvm%ŠÈ)Ãÿ¢pâçRÛ‘$´ˆ9” âçH.—¯!k£fN_]^Òb]q‰€²(S{>B”™ó©0ÉWk‹2ZþÛJ–Ëk»w -©"B!„B!„B!„ËeB!„B!äò±§Ý ¸Úi ' »¦<.oö®™’îF?¢þ!Sü0÷Y'¹ä 0uõâþ4ÈÓfdLiŒH‹ 0^¤±¢ÿ<Ž"?Ÿjµ 0Bˆ41Q&ÖógégÔ—ÞÏ%`Âdq«Wla¼†Z‹+É1aPÝZŒ¡Ñg w…Y—‘$ãÎ/=¯…ùy¼ñ·¯áðËðà—ÆŽo 5¥Ý·*ý!O… I0¥±¡^5¢·¯OÿöÏá¡ÝãoÿðÛxçGoãzdpx ¾ð;ÏàÞ§wÁB?cVHa€¸Uýu´Bg÷±<¬z”ÜÝZ“3qv¯>÷ Ž¿y$O@4Gûmn­QÔ‰û€d®P¯èÅ—S›(ãêY¥ ä×¼ ƒ„t ‘Vcdµ°*½M5h׉+…$™êb뵆éK’‹Û^]rÁ&_+Äùåã§Çšxáë?À¿Ÿþ‡aÃÖ†j~¯úäóT%ÍÄ»,ž’LJæ}ÙlÇ Ý8„¯ý÷¿Ž£¯ÆwþÅ·púÈG¸èêé¿þY|æ×ŸDWoWtµÑ+,Fˆ/Ö9!|¯òcM‹t˜¹™9¼þ7ûñöÞÆâü‚²ZÊ-~î¢(‡GŨãTítŒßV’[Ä}WgP·îrm#Ç´[ü~“>…k’Š.2%Å­0lÏŠ¿úiÕ3dÂåVË”Ÿ}-?ZÌ)kK™¥•Т·ç)/uç£dœlÕ¶I—zVþRÜ72fE  C!„B!„B!„Òf(ÃB!„B!—‰Ý»†ìsûG^ðd»×rµ²víjt÷tbnnQl55?çLŒ6CS³NE÷?|›{HYñ­Heñ2Ii¬OŠ@Hl©¥]¢Lh²w+´1e&$Àˆd”êGƒòb9&ŒÒŽªçÖìÎK$Àøsõg¯…L‡©W–“΂šD—d›è­O%›˜¾¡ÇÇvî¸O‹ &ŽWq|"ÞøÑI|B%ésP’M2þô‘ÓøÖÿô—ØùèmxðËcõÚÕÈPoöÏå¹lí!èT‰pjî¸[¾ÿáÿ.^ýæ+øÞ=æØò$®6îýÙûðÌï~koX kÝ×!·4ñÅ?‹áÞp²˜¾Uü³!†!~Té08ôÒA¼úW¯bfbZØ …/(P2 e9r ²û'c±úœÊЬmêk £T[ŽÑW̼€k"å7_Kä¸\½|ãF.–E>3ZZӵ㜩ÌVeŠrNZ·pÙÃ5HÖ]]"“ÍYN†÷vnH–ºF.†½í^!„B!„B!„BÈõeB!„B!äò²”a.c€õëûñÑGËœoZ˜_ÄÔÄ úW…ä*¥œS•1µ 0~˜OlW#ŒH`hÆ÷ÛÄ\þ¼öÚB=Äñ"m&ˆ4KH;±Š 0*­ÆY7~~R:KXaœ¼öK°ARÛdµT˜ ×ÍW«KgÑkRMýuk­K†1Q­I%ˆkQž¢y¿’l¬µ8ø“xoïÜÿÅpïÏÞ‡ŽîÎ0Fݦن¸=K…nœ¯¦NôÝxô—çžý¾÷GßÅKþ,.,&º:Ù|ûfüâïíÆövT_kˆƒ‚øæ~މ/în*|•ùX? zÖJé0§žÆOþôEœùàl&r„£•­ýåAlS‡Ê/Ø’Þ(‰±Q¬×´¤ÜR”T 7ÖÕ^æ5)<y*Šÿ쟵4¡ÅèãÄR’åŠ%š°ÎtŽì3 k1ymù¼êõÔ¤ØH'¹\éóžÎ9d˜ê¾5¦ð:nÁ&Ã\*ÓÞn÷"!„B!„B!„B®w(ÃB!„B!——=í^ÀÕNcxÀÉ0¾ÁøBŽ6˜™BÿšU¾•]Ë$¡¾j(¶6Ê-i P—³œzû­;>O”qb‹;IŸ#ENãÎÌ(i§’| šÀ­iL8™p%CZNyÂç°Øp#2&î‹«ãm2>œ[*Ù¸m¥ñª _Š+zMñød»©I’ CÒJœƒIÏK¬5 OÎÙ}ÑsççðÊ7^»/¼ƒÇ¾ú3Ø~ÿöÐ1_j²WMó—V¹ñZÇä ”ë op5¾ôŸíÆ£¿ü(¾õ…ƒ?9ˆ«™þ¡~üÜï<ƒG¾üÐaª4˜L¼œ–|•á¹ðt `jd /ã%þéáh*D‘\n﯋’[’ÚÉ=¡jg/ɤvºætÝim³TmÔ¯»å5ÉkkĨ%gâ‰ûC 1áþ¯eŒª!–§/“Ñk+Š2rNµ=^¦¬.ôzäs #·'©5Éœåd˜5–Lƒ2Ì¥²÷®¡…v/‚B!„B!„B!äz‡2 !„B!„ry¡ s‰´ü öi_vaßÄÈ6ïh ˜#E‘ ¥x9RŠßæÄÙD§KëÅýŘ`¾¸¿j`Â’EŒi¬lè¶ÉüY½jA^|±Vžq‰2±ž?K?cr¦Âs)Ë r´Nw©I[1a¥r4êÅ•(3ıùZÅÁú® L’©]kYÈ?=†ÿï¿›î¹ í ¬ß²>–4zlÜîæe3|g$Ȉºþ˜M·lÂoþËßÄÛ?zõ…³œÅÕDgW'ÿÚãxúŸ<ÞþUUz‘x–½7æ1ês÷vØ ÓaŒ,eÂ|÷ssóØ÷7ûðÚ·_ÃüÜ‚úŽäw&*K"ˆrw½€"k›rm%¡o ][Þk&©­ê×Õ6åÚjÍ…u«e¥×¤PBúpYÉvqdIh ?'¢ŒœÃ˜üs¬mÔ2Ó¥«u†±I-?g(ÏGœK:gAè™ÈdqïÖ0Ê0— ÿÛŽB!„B!„B!äeB!„B!äòò.€&€Õí^ÈÕJ£1õy—)?× =î^þ¼Œ’¦¢ˆJÖÀŠTï•xÝD¦²Äz±±>Oe‰ 0€oˆóˈ†i¿ÍølÑè 1¿y|½ ëÎ=M€Ée\=«”äÚ^˜ ¢ÓYâ>=ƒ'ÃäâŠr I2azFëQK¤Þ½=½Ѽ)9þ¼R!§šÿø›ÇñgÿÍÿƒ{~ö|ú—Ūެ©^6ÃëÎø¸A5ÜË] ðRŒªk€»Ÿ¼w>~^ø¿_Àwÿ·ïafjŸtîüÌØýŸ~ íÕ |#ò™ö÷⋵ñ>Én ù¬Õ¤Ã¸{ýð+‡ñ“?ý &ÎM*#¤JDädå1­”eÔV_¼—'ZÔ?&7‹¨ßZÊñõ“1Eá'™™µ•("§LîåL”‘òЬ%æÐrIù«ðO˜ejæôÕå%ÍëÈK”Ö–Mñ|äñb‹ó ˜ž¼ˆg×ÝÒ}}=XÝßsáÇÉÞv/€B!„B!„B!„P†!„B!„B.+»w -<·d?€ÇÚ½–«• ù ö±<6c4ESsMÊ‹K–ðº‰OY‘ÍóiŠJ¨ç“% BbKÕôìæ²‰œb]_Ï}Íúa|^b|”lt=·dß ^H€‘b@ž(ƒ°?¦Ã,!®„Æ|\"¨”]T£¿VeRÉ&Ê z¼ Õâ>+ü¿½,Ìäku’Í©„ }J²)I9b¼1À¢µxýù×qðÇðè?|÷þì}0ɲ„Tšå‘ nQ¢Ù^'ÈÈÙ!ŽëêéÄçÿñ“xx÷ÃøÎ~/ÿÅ+°‹­S$ÚÁÆÃøòïïÆOÜ +’]¬©Mßuþ|yäsP—£o㘠uæØüðÿ|'œÖCÌ¿&„ÿ™Ò˜rË’µÅð\@ñµQ¬­åy³„‚-j»;³¥ðSZwMm1&J\FÌ !‰èË 9MLÄ8qßg¢LxÎÒT]ר%ëõHéF 4És›‰>&Y£:ŸxîaN£çœLSaô-_CÔ2m,&ÃB!„B!„B!„|  C!„B!„\~ö€2ÌESlÜÍšÃë™™ª¤#RQx§ÃÔ$ÀTC\½i²¹IÚ ¬Zª’\|k¾Ûï·åõâ\i3A¤11-Æ'ÀHñ%ÖƒH·©I«qVOX¡Hâ0&MgA<‹‚<¢è}:L²Mª÷Å~_Mh+¥ñ鼦f­~|*̈ñþ *ĵ(Ϋšú¥dcÄÐjÛÌä ~ðÇ?Àß{ŸûÏaë=[õl&ù_&:ÈfyÙè¯Ï'M‰ékøwþۯ≯=Žoþ#{â“@ß`žý/à‰_}áI×ßߟÞ@ó×Ù§¥RÈ3V~«"FÖ…fƧñâŸþoýð-ñLicYrK¤R´•ü_&™oÉÚòØ´vͺÓ5!•rä±ym#Ç´[Šë–ç«Æ¨e 9Åø†íòÞöï&#ÖàŸ ¹Õ2åg_Ë®e¤ÌÒJ–‘ÛëD™Òù¨ýÙók2‘Ê0µˆû[p!‚))2àv/‚B!„B!„B!„P†!„B!„B®ü â—À’¿Å¾•c€ñsÍØ¬,`¤L"ä½LxñE$ÊX/·¤2É…Ô‹ÓÖ¿”œâç‡v‚ q>Fìsç¯N\«®Wíói9ZäñIAñÛ ßC\…Ÿ 3¡)<•lêÒYÒú:qÅŠã“í¦&I&LUsn0áZ“d&Ôkõ7-“dÎ~pßøgÿ/n}øV|î7>‡u›Ö }a‰T„b:S+ºõcÂD5~ëÝ[ðÿñ„=ß~ ùÏ¿…ÑS£h¦Ãàñ¯>†/þî³è_וŒåà .§WÂvãå6¿%—\âV÷Sòu/.,bïwöá¥o¼„Ùé9ä  .¸«¯, $c‚t‘‡åÈ-¾¾,ŸÖF2w¡vá¸Z¹ñ¸ºÚrL¼&rH‹kjë1yÚJ\C&´dSÔˆ%&n‡üœ<[²vœ3>ó&\S±NäI3z-IÝdÝá$ëöÏe:gX‹&ǦEÅDv)lJÙ°¡¿õ²oîÞ5t¾Ý‹ „B!„B!„B!”a!„B!„+ÁÞv/àjæÂ~‹}Ú¸ Œ›ª‰ƒ¨Ru ;ÏÅe|¬ ´ø"Ò$ÂxŸLáëU´®÷‡!Ò»ú«¹¢œ$X'ò¸µT'UÕ³‰ãƇù³znÍ®ñÚZê…DQ/*3++ƒ”¿·( Õ&ÉøÅËc \³Ö$Z&Ì%™ H’p1BŽ.Qýpø§‡qôµ£xèÄc_} =}ÝÙyY* „Ðjl"ÂH_á¡_xŸzú^<ÿ¯þÏÿë¿ÃÜÌ®;¹¿üOÿ¶Ü~#,* F¦yQÉ:¡I}Rv)¤ÃˆKî¿ÿ³uî9Šü?ÄÈ©Q¨ ŽŽ÷´‘\ŽJÅ™T€ ÇÉCŲ6 óå™0yøß’rKQRµqµÃ51…Ú…k’Ö†¸G3!Æ¿wrñb|¼§³åŠÓ7aéÙgu‰õs"kÇ3Y†„ãk‰óQu‘¬9›Ó„çvbd Š1ñ•»a˜É0—ÿ›ŽB!„B!„B!äeB!„B!äòó€9Ýí^ÈÕHooz195{QÇ7'f°0·ˆÎ®øvùº˜Š`\³³5°B¤ a0®"¬-ÔóŸ Å—R¢LhO¤”š+¤ä1¿¬êUxÉ@Ÿ«?áÜB=²SâI{.)%î“3„ çÆ'Ä•:!þDT­LrQÓèµÆMq»Z«:¿ºÔ½¦J>JÏÏ`an/ó¼ùƒ7ñ¹_ÿ,î{ê^ #6ǧ«Ó‚ԠДï‡$cSÆïYÕ_øÝgñø¯<Šoþ…Wÿúòö|oز_ùÏwãþgvÁzA-Üð6Þ?2ÁÈÚøØäNR_E¼§(~ÑË}“ç><‡ïýïßÇ{ûÞ†ƒ¯Y+·¨AA˜ˆ+š„²’1I}#Ljã´÷"îÅbmͤ­‘¬9]wñjUû®IR;—Vâ’3ñÄý¡„ä©0H>Ëbyú2‰Ïµ¢ŒœSm×§®/Ízµ¨eÒ9ãº'Fšêë¨M‚)î3(˜’Lû#„B!„B!„Bù„@†B!„B¹ÌìÞ54ûÜþ‘7<Ðîµ\­lh `rêÜò§½Û&F¦0´q0È)2‰JL¼ÿšåÓ)ÒøT–PÏ…XT†O|‰rŠN`4qõ¬”[PL€‰õœØ"ÏÇ%ÂÄz®Ú7_[y®&ðç–K;û­úÓ /v.ø«¤(£éµàJ6Z@‰ã㺄,„ ¹=YO­¸â$›cŒ¾%ɦ6õữK½™iâÛÿò;xíÛ{ñôo=›îÚšý3!ˆI³¿<7Ϧ8VŠ3î‡õ7¬ÃoþóßÀçÿÑgð§ÿì8öæq¬$½}=xö·ŸÆÓÿÁSèêí¬NÜúûJˆ©.—Ñd¢‹<Ù˜îuÙM&JŸ:þäEìùök°‹r¼ ’C¼—Ãá~¤/e@ÑAIkËúzLV[}ùÉ1¥Úâ9”’G½˜“ÖÎ×ÔZøñã–sMôüAú0ò~ôµÅvqdIh ?'¢ŒœÃ˜üs¬mÔ%PK—µ›K.Æ-0½Üªnò¼ê9“k!怉Q!Ãdˆç¦Ê0— eB!„B!„B!„O”a!„B!„+Ã^P†¹h¼ÿþ9d àËd|d ë7­ 2IHy±64QWMöX"FŠ4:Q…ÄWÇדý卿²~,bÓ´ßVJ€_Rš.#eÄ)¾ÄzçV“Vã„„°B/(DŠ+®r*dMû­e-˸Z²±¿úkÒYjæ65kÊ⊟­µVtÉ“a²µú­f|5Wµýä¡SøúùuÜó¹»ñÔ¿ÿy¬i¬‰c3_!®»(ÍdrGEqœÛ¾ó¡›ñOÿü÷ð⟿Œ¿øƒ¿Æø™ \ Æ|úËá+¿ÿ‹X·i-¬­.§ rX¼‡3·*¸YîŠþÿì½{°mÙUÞ÷ÛÝjõCnŸƒM `Ç0 \Aˆx‡‡1c] aÀ±ùƒq9•Ž“Ø©„@Á8E Ä8E±*€˜—°, $ŒpwKBHK Ñ÷Ý÷Ñï3óÇšoŒ9çÚûœsûî{ê~?j÷9{®9Çk­½»ñQ?¸ýt˜&˜iŸÍBJÀc¯{ ¿úÏ~O^}2×+(ª5¿Þ 9ªHÄúsaϺe ÛFçPÄ+¶ë¯ÝÃRíÏD9¸…÷l!nÙ,øiþÍüw;ŠH% ehÝØÅ…'£[Q>uN(3ñY¬sI{».Q´ÍB™Y>ƒ‡º®^ºŽã°'1Ìq8ðÖ]!„B!„B!„B!$†B!„B!n ø/wÄIeü—ìm°6手7Z³ñ`ÌHLÂ`€(|ÉS^¸©zƒ8el¯eQ¦²TqLµ—}q ‹vê P>F×r­b4­ÆÙ˱äZÕkÙÞ"R¸5b—Í›vÞÇ´œï÷—;á«R„ñÙ ¾m%V «‘Õ´·äPL xǯ¼ïþÍw㳿ê³ð™_õxѽ÷Ôóõ¾Ò½múƒÐQ_ΡAÙ[·×æÿ¼ïÔ)|î×|&^þ—??ÿý¯Ç~øWñܳÏã°ü/ûüÕ¿ÿ•øs/û3Ë ˜„ö|Óä—2ݨ$ç&¾ÔgÔ|ÍÂ^kwr©}þ€¼ÿíïÇ¿øÁ7àñ÷ŸCšð½^Šå(®ª^™àðõîmƒ|¶˜§¶ÝQú¢)¶»ÏÀh*LÉgf»\±jÂçVk2±í¾ú©0K*$” ·¢­GAŒ®­æM>‚Ï™P¦…ìãaÑÐ eƶC9ªm„¸[­(κ\½'Ã,Ÿ™ú¬¯`fØÛ{`}“XãÝgÏœ>žI!„B!„B!„BÜ4$†B!„B!n ì:€“ÌÆ¿dûÒyÑ€+¯×¦ê2]‚Å$K³w‘Fä5kSYRƒ$jbF»æõëñfÏM”©o«ÓkÄUȓߧқžZ>‰Î×|Rȧ³—CÎ ×)±Mê§Ö”ê61¯á˜b¾™M04$SkDg8`”»Ä[ûkã{¹„X«8#ĺ"Èîw£OÈ?úº>ûÔsø•}#}Ýcøâoú"üÇŸ÷‰.¶²u8¦4êS#>öš™(„)‚î{ð>|Õ·}9>ï¯}~ü;~o}Ã;° ö§Â_ùï^‰ÏzÕË+ÏW® ¾R?ñÅJ ìa•×HP—¿‚×ÿã7àwßôî–´Û;)s+qËD¤²½¸ÅÜž±m>mÓžj}ÜѶ;ÛÛ6Þ³"nÖ„óu{\˜$N)Ÿƒ• -5/ÿœ—r»0ù}ý|´ -#¡ ‹YÖÄ2¼>ÊŒòq×»}Màöž¼ñt£Ñçâ¼ô¥÷á®»Núœ¨è¿å„B!„B!„B!n#$†B!„B!n op@]¨G`<f{®\¼Þ‰Iš8¤LB€&&I$)=÷Ô†ü(&)MÖH ‰„4eL×,NI$ÌáÞr'r™L€q¾à}-ã4­¦Ú+±€D>9W”£,Ú‰B…TßOîÚD ÒD2íÚV“d€|ÿ¢Èf6%Ûªî›ðɉ\œ›Y¬mÝÅ:Ø Þ°|·\<åø3TÈ ºrî üäÿúZ¼å“?é¿~þ½ÿð#0Äuë‡|b#~Ж²‡÷çß?âÏ~8¾å‡¾ ïüµßÅ«¿ý§ðÇïùÐ0„»_t7^ñ7¾¯üæWàÞû_DŸªä1ù¬¿R ŒÖÊ”¤î;á ðÌSÏâ×^ýxók~kŒ„NÌ(€+L+Nw.Ö·Æl#nAÑ PœmßÛñœ‹{`›Ä#Û¼§Õ„·¬ÔdRï~ÚJ‹¡´DqÊDXbMÞmÛn>óTY³]ÞÃëØåÛÉ5qÏ|ÖÒQÝÍ€kÝT˜ÃqÜ— ‰a„B!„B!„B!n'$†B!„B!ngÏœ¾ñ³o»ô{>qãfѱ¿ÿ€AŸö–·˧æšs _­VdÏÊDþg‰oNP0ÔŒÃ?®…ï %ÔVÈ&Í÷·¸8›DÚ‰²>SlŠÕ ]š¯›<õ&õû‹ çýoÿ~ðoþ>íË>ñþ|éM°Ò-8AK'ap‹^0Ð ajCú“>ïÏãÛñïâ ÿô×ð3ÿûëpýJkÒÿ´/9ƒ¿ú?|>ücöj –G·M~ñ‚_žå³×žÉòÙ\Þvs~PE0©Ù{ëëߎñCÿ ×.^#UW'ÖÁèû…öT1Cù…YÛê” lÆš gÛ¼m©¦¶ .nÎŽÏE*d;Ö$ÚÖĶ5Ô›E+^S>¡ íoÏb.¥o5Îjkâ3–˜ÓbÛ-“-D8ìæc$sŸÙÌåsõ(b³ú!Û8eMlBb!„B!„B!„BˆÛ‰a„B!„Bˆ[Ç#æH·÷Ê…ë®q¥ã 0‹pĚؒu.‹¼¿¾”)+ ýM¸²É^›ò‚n*K?Q­!¼›V“}äë)•fê–kBÒ´Á~Lœ~S„4©NïØ I~Ý7Åoƒ‡|ÚŠ ¢­Ï§³ô¾‹˜d8Iè…+ÕÜh’Ì`ô…›¦ÞTñ@©K}ÔüRJøíŸ{¿óËïÀ~ýçã³þÊgàî{îªÓ'¼_/bè5$2ˆ{K¥1¿6ìîºç.¼â뿟óª—ãµßó xÏ¿ùüµ¿ÿ*üGŸýñµ4ÉÝÝò¹ÉÕ¨Ÿ¹|åy IDATUÉhŸû•·ü»wý~îû~ ÿîwÿ˜ò¡W ­ (ìЪ¢E@2 §r{Báݽ¢s^÷BÕÚfûe{ˆ9Æmo¬ §yÈšÛ½h¥…Ü Oò?ª8ù?³¥îQ Ò" eX„â„13Ÿn}`—l㩵˜ e¢ÏPl߉a žÏÝ“Ág§KÅ‘yt×!„B!„B!„Bˆ†Ä0B!„B!Ä­ã_»ë N"§Oß»î:…ƒžÊ±r \»rñ: UÌML1`:Eþ0™Sg´Ð”‹ÅÞxL»>²×Âî…/Ñ€ÿb»ŠlÊ%P>ìkeLrör,€¯Šè7_ BgZ6öG¿t¢È¦ˆ-âþÖSÎUIÃé,£óAx4ѯ×4¶õþ—ómí©OãÿÏ_ÂoýÌoã•ßò¥øóŸý Ae0¡=Ðr€EÖÿž¯¿äáðußñÕc?¤ÈªŸ1ÄÐ}iSŽüÖîR+QŸ=qþ*^÷ƒoÀc¯Ûr´W)T1‚Oܪȡ-·7Mû‹5³Ýsf›÷t¶Á¶73Ú6΋[l Û“š¸˜5qamWï*úÈ?«XaNŽ„'õ÷ ”afý{®¸g<”ÅÅY÷ŽÅ9,”áÏh­æÒù µ Ÿ>Ÿ¸tÇa_“aŽÃ¿={æôå]!„B!„B!„B!Ã!„B!„·ŽGvÀIÅÌpúáûqáüÑŸ{öyܸúî{É‹á&¦ 4"7¡¨)¿ÈO–¿âO‚kMøùr»VíehLBÒ”#eBL™Ã—2½¦Ú«“%Ö”òÔ˜ÒhM`ª/Î'…|ò™µ 0q¢LË·‰2r4¥mí°b$]il1I¦ΰ/Èì笟Îâ§Ã$rlô£IkÆ‚œAnu‰cíëÚ fò͸ð‡ðÃûŸâ>óãðåÿÍ—áÃÿì¾ À ZÓ¿Ÿ S½³ ½†…–ƒsâl² õÙ,¶ç³£ØNqqYxîÙçðÆö&ü«ý5<óÔ³Uy°.@W>ðZï„Õ6ŸïY ÞöFq‹û5ØÎ¶üÄ=ǵ·aª »¬¯&8)¾âº±-Š? OF·"ïöB™‰Ïb=ÚövéÌÀv/”éó”8ԥ东u“a:ÚçbÆq§¬Ýáè¿á„B!„B!„B!n3$†B!„B!ní:€“ÌþÞƒ+b›¬7®\ºŽû_òâewäæá*ÉÖJ3t“$ƒ”^s¦b’"Xšÿ›ÆO”O€aa÷¼;‘ËdŒó¦¤,Ú4]&Ú£i5qzÔ£k'Ô¨Ûê¶b&’ሷ˜$Ô†v/²)ÓYûë l×:‘‹;6‹µ­×XצɔÆvÌ&ÉÄXùn'ú½7¿ÿè·¾ŸóÕŸ/þÆ/Âý½Ø§µ |º4ý—¦~´ßÝzyHàà‡³>[ÙyŽw¨AÊÏ(?U)úû·ðö_y'~þû^‡‹¼LêÐi¯4°‰Ä P¸XeKâþèלõNdƒ(°©â¦‰Èf Èñ Íc5 ¯‘±ê°â!Ôû2N`óÇïþ¾ÿ~/û‹ŸŒW}ë+±÷ï?L‘ür´4ýÔ w«ÚÔ¾Dµ6KE{•kÒžSD"‹à¯~3~ñþ%ž¼öT(8…‚?ïrÉP(›„3QSÏa`»#çÊug?Ú67çFÇç"²ÝÝà`ûfÖ$ï1Úë&Ÿ`ùé„'|ΚɶŽn}4EÅÞgŸ1TN‹mÓ]Û,Âøtvb¦Zoç”ýׯ\Ÿ‹Æ e{{Ç”ÞáüñÙ3§ÿd×A!„B!„B!„BÄ0B!„B!Ä­åÑ]pRÙ^ Óc¶L†)MÅeÆ OLJCõxÌr¨¢¬O€©>HL‚6De¹šÂD™T&žô`ª¦³—óÈö\>yo¯\÷ù,Ór(öj/úÏõ ù´ÌÛ´•º6Ì,¹æDè{’L=ÚŸá5?If°Ÿs°~:‹›“±Z³ÓÅ:ÚÏ~×b…!Ž$â=hû{ýÛñŽ_}'þÂ×}>¾ô¿ú"Ü{ÿ½XÅVX0Àÿ(Ÿåg®Jí3ã´3å§¡ŠfÞùk¿‡×þo?‹?yß9¯&ˆ9†”z„&ÃÛF°°'EŒ÷Ð9¯¡{>´ÍöËösŒ;ÚÞXNóx5éE+΄žä8Á ú©0ïc#¡ _œ0&øFë»d»‹'¿ÅÎÇå^|ö5i>[O\:úTØ;Æ¿C…¦Â!„B!„B!„BÜŽH #„B!„BÜZÔPyDŽÛÈ{ùÂ5´É)¨ƒCª˜$•I)mÌrÊÄšÊ2˜Ã“Wi/š°¤ OЦŠRóU„+,ç/µs^ÜrHÛ\ó¨ÞÛÔÄÛfAG{^ëtÒ‰NŠÛú¾|NÊ3ê…1l{øÜ²mNã©{B糕{dd¿]óµ`Ÿú\Î=qé:ŽÃq¥Bÿí&„B!„B!„Bq;rj×!„B!„wgÏœ~Àí:Ž“Èqy¯\¸îž×ú&mÄk€_‹Í×61hpvÞñ|˜@ça­¡{óùÍñ”>y/zÕ£¿낺ê‡7zñ’å†ró[†ÍúdgÔ|ß ‚_: ë üÒ~š!¾i6†yÍb 6VbiqÍbíã¼ü'WðÃçÇðÝÿùÿ÷½í]åÚﱃM(ÏOÒˆ÷c²ùäÕ§ðšïúY|ûÙˆßùÕ"„\ ÷hüÌñ[ ËýóÔÙ=£í•ço«¸Ç¶»{ê“ )®&ÞvØ3ú| Ÿï±íö6LU é”gdY³ê+~G¹uŠ¿~w•†EÛ5[÷½…‰í‹· 3Øž‰sú|\‰»ïWÀŸE¶}õâ ‡½=‰aަú !„B!„B!„B܆h2ŒB!„BqëyÀGí:ˆ“Æ}÷݃ûïnÜxæHç¯=ñ$žþyÜu×]a*‹-S^rãó2e…&À Õ©+eÎ OlY¢Û¼ŽÚ ߥ<-¦L€É—ÛµÎ(–-ÄgÞv/”ئxGù¸õs¨ çÎB™è)ä“B>Éç³LË¡Ø'öªŒ#äÓ2÷ª zÁÌš¤.Q ’kçÝ•¨Úú|’ ûn îQäb´ËO“¡¢ 'É öG¿AàAÖO†1ÎkÛI2ÀÓ7žÆOýßïÿø›ñ5ÿýWàÓ¾ôL¾_¨B—%~Ê‹(+_Ot»RçÂqá/áÇ¿ógð–Ÿ”âŽj€~iûòk£#ÖΩ¶Ù¾«¢Õ_›Åïél›?Wלù™m¯I<·uMVr[«ÉÄD½ÐƒRˆ·¸§¬Lh±`;ïær³è¤½ÏgÐ eØv/”Øæ ¸|Zî#¡Lÿ$æøøAÌ•‹Ç› ³·§É0GDÿÍ&„B!„B!„Bq›"1ŒB!„BqëQcåÙß?Z3oiæ¿|ñÌ>›Ä$@/NA§ HR›ÃSYJÓ3‹Iš=Ôý‰l[V’Œ„4Õ? OêõÞ^͇|a:Q&ç3¾d{)ØKY.S¦§¤p±0~#JÅü rWë…*âõb*P®Ž·¿6mÅüº®$úáã,÷~ëh?3Œ•ÖÓvZ]Fâ¡ Óy,܃°ÿÜ.àûÿæ?Á'~öÇã¯ÿƒWá£?ñ£òg¨L j·³Å`Í~bL¢i1 O?ù4~áÿ~~ñ߀gžz¶Õ NÄqWÁA[¸ÜF ·…lW»›m¯Š[@kî( Û.¦ ¬Ú6LkBÇç5!Ûˆþ_Àšä=F{Ýä,?ð„ÏY3ÙÖ}(–m°m¬øŒ¡6NxÕLúé/#Ûìs#çBµŠsÈ'†>'Ž!†1ö4æ¨<ºë„B!„B!„B!ĘS»@!„B!„¸Ó8{æô8¿ë8N"{{Û4óÎGQ\¹p=4$û¦c÷×ü¹Á¨ ʵ™¯ñ~{`4É€}q<°‰=öš±Ãy ç}sø<÷Ú€naû9¾†°Ç‰¬fI¯R˜o´çô¿æ:Ø×úýõE ñ±Þ›ÇYšø}:£XGyñ³öqÎbž—l묦=ïzÓ»ñ?ýåïÆü?Žk—–Fü"lIEäS„/)åWÛƒ”H³üþæŸþm|Û~~æ{_ç…01Ÿµx9¯i &µŠÏØšíÁ}u¶»˜ã}›=çì²íÛÔdtÿÖlwÏP¬ §y¼zóÇ–­tßt®ûn0ÿ>}÷FŸVëï|À¿ȧ‹e`—mÇxòûÎ'ÙæïÌZÁP“æ“leOßxÏ<ý¦¬L`€—¼ä>ÜsÏ]ë›Ä ˜…B!„B!„B!nS4F!„B!„Ø øâ]qÒØ?æ_¶¿|ázk\`x*JiL^&`Œ'À¥éš'¶´‰)mBK›î’°L`M€©þ'`–Õ0Q&m)×x O¿©=ì4ý&åó‰›ÊSðŸ(ŸòI-ŸZä¡3X¦Í€¿SèÖnSLê?Zak°m5Åk‡ÎR·…3.(®|‹ÉP&›„¬ŸÓM’qG¼o³>¯ê’ÛéëjGŸzÓM“Y8xþ¿ü£¿Žgžzßø=_[Ÿ¯TÆÃtq"§Mb²íßôýøoù‘¡Ÿ±ƒÅðª²g(@é÷leÛRWmóbÛ†¶yϱ?õR;çÅ-‡´ÝÕÄïñõFwnS½;A‡MÖé¤X Ë H¬}Ml¯ eBY:¡ ØÆÌg+÷È.È~»ækÁ¢J }öõ¸ré:6*^V8êT5@b!„B!„B!„BˆÛ‰a„B!„BˆÝð$†94{Çlè½|áznÂ΂‘ÔÄEìQÄH,NAíCnû³*)× UЄ4)¥Öàìi`Õ_B·{NœR|eq YH‹Ró)Bš¢ch ÙÙñUò©MåíZˆvÕ¥Š†Ìª¢ÁMóÄ µFíšNä2Úýš_÷ ¤ß_²ÃÚþè—D ­R´6N<4ˆµº„xlk®kê÷7_6ĨS_ª=ÅÃûÛ¹ò¾E@¿vb TaBwνµ‰mó¶YHÅ-6²ìt«¸Ç¶W?ü<º&löÄš øß(øiþ͇Ê5ž¢2›®bT›(,jšÞ^šäÓ2"ŽÁ´Øh:KŽtmêIY7wW꺡4º­L’Mg ~—ó~½Æ?UsƒI2ÄCÕaÌ«¾]ß¿½xh@· 쎖I:‰Î Å09²±H„•MU`¼gMÜ2´ øº’íp®ùžØŽâ–($ q¯ÚÄÔD,›k º_½mÛ\¶k²RoC?ýeI…„2Ám[ß ”µ}†*aŸcA ‡ìã™ùDµM1ÊÎåh>ÉV±4Zg¡ŒœP¦\»zùxbM†92=súè#y„B!„B!„B!Ä ŠÄ0B!„B!ÄnxtלDNŸ¾f¶©mÊå ×—äÔ&¶°˜¤JjHL4qЇ,6—)+ÑÞb¨ÈMXLÒì5 O™Ø‚"¨¾Jƒöh*K»^¤*aÌr´í'áK¢Ü‹¯D¹weR°¦ÕXj‘M'€)®«³é,t¦dgýt/ð0V†pñªµñtÓv±&úÁBžÎ⯕Ƽ|B6ˆ•Ö¢ dM<lØXñU¢õé0ùÇïö÷bbì,4h* ´õ¡H%(*Â3áT“s6Ú3·ØÀö &íxl;DûÌo[“±¸eÍöJMB-}Ü0ÚÓÊâÅ)åÙ]žÔ¼| #щ§a F>-ÄgÞv/”ØæxYœƒAž1fwË)÷â3Ú6^oµ¼rá:63ÿ,j2Ì‘‘pY!„B!„B!„â6Fb!„B!„b7¼ÀÚu '‰»î:…Ó§ïÇÅK7¶ãxæéçðäµgpß/B“˜£Ÿ:{ø/¶‹½VÃ(ÚYD>ð`XÐ/èqyÀçáþ¹&¡FûíM’ÉÍê^ ²a:Ký•…+>¦+ŸIô¶íw‚œi~Vï[˜ÏRª™·‡œ)Îa¬ÅC+±ÂŸ’²+ʃ±¶¿j…Ús?ÖÙDµ­Õ-M°QÈÄc!Gˆ}f-´&^i{:ÛæÏÕ5ÖÌöJMâ¹­kBû:Û+5YÕ¸ýž^èA)Ä[L’ú]8[·‘í²ßûð>Ëç­ʰí^(3°Í°à#Ä _ˆs||XàSl\¹¸fÎþžÄ0GDb!„B!„B!„BˆÛ˜S»@!„B!„¸9{ætðØ®ã8‰ìoóîWúú/_¸Öš”óZm’FhȨ©<·ISC5÷šwÝŸš¬öps·kŒ¶5{ÜX>ð…A3µ‹ÕÂõàð±LÎÛàü¨)¼Ùk>–xcx©CY(ðÞëŠNGب¿o¼ßܶp¦šâXÙ^‹ûÁ{ ]^.Îè×0ˈqZ01ª«K~%ÖWS ©‚–´LzY^¿°\Gjgœ&Þšß»Q<ñùY»±ÞÇ´íêm—ÏÀÈ6=¼SÛƒg4Ä´7Ù^}¦W“¹àÇÜ£½ü±˜“Oº”kšÝzõæmcÅg µ}_…W»kþ»nb»÷bä\߉ øØ'†>Ý­ÇoàPåÙÞþ‡;/ Ã!„B!„B!„BÜÆH #„B!„Bì5Y£5õ¶Æà+®Sstßüì³c“ul¤žœgqŠk wï¹1{í|i¸Þ N‰ÍÜ®‰»ßÃM÷1ÖÞ—?Œ›¸×ìõ½Pcâ›ñQ¿? ?\¾ öG¿¡É.é÷båÕ–m‹XûýSñPwf\Ÿy¬ýþfvt¿¤„„„ƒ*xaQŒa Œiƒvq;ß!7®Û vŸ£+b¸ÏlžgÛ1y†Ü–hü˺íaM¶´ÝÝ÷7¶[oÔ=Â%ÝwH;CS^x}¿øõÞvóiµþÎÂw¼O´Ë¶c<ù}çÓåCv©ÔÝ5 ¶Šàc8f}˜“c+©ˆ<àww„B!„B!„B!„˜s÷®B!„B!î`Ýu'‘c5õ&àÒ…¥©xiºNK«sRn~N,`)·$/Ó/Zc³¡,ز)¥‰=CB"{9ŒÄþƒ½,20ËWÓâÃŒ|-d_ÙG±—rõziOÕ^±ʵD‹Ô|-ö–͉b±—Úí5_¥¹ªåD½7®»Ûx¯¿f0|ìÔM‰Îóµå]Jýþæ«]³iŠ>¸Ýj½SX¯6ä3£©îniÅN÷ƒMòªoC¬å¡‰yÍöGR ©µ~Ÿ³Ðžg ¤4rôb‹NÀ3 p¶½m‡SWm3X lóžc ~ê¥÷mw5±íbݹMõîÆëíŸìD'ü¾~ö³%cØçªP&”¥Ê€mÌ|¶rì‚ì·k¡äCŸþÖV[yïAJ¸zù“aˆ{î>…‡ºïÈçï`ÞvöÌéçv„B!„B!„B!„˜#1ŒB!„B±;4æìí &ÃíÆæE\>Ä€%C"áËXÌaÕžeኇ¬ÙkaD1I³×¢M$²1_(¾òïXb%É…žÒÀÚ~¾l+Ú)öé+ª ÅèzÙt+UkõyÁÄ \œš1oìß6VV|8 rµ”úýQ„âAÄCyó5­×´4à׺&Î01 CJ IDAT÷ÈS\ºŸ#! © z±EÎ`U€Rìna›…$QÜb#ÛAÁN ëq¯Ø^üð3·jƒslö¬Ö;Ô$ÆT߆©*1œï²fÕW±Äõº›Îsiª]s>K¾#¡ â:‚Ýb‡l#ÄçD7%¸Þåãà³äâÄl¸zùâgmû±0?ü@ÿøŠmУ !„B!„B!„BÜæH #„B!„BìŽwx€þdû!Ø;ìd˜ ‰¹tþºx81 ‰9€:¥ˆIp˜ 0U±ìO©‰[â`6f{h±äóýD™±8[ŠvZ-Z) §NáuÙPKu EKÁ]Ú<†­G 2ŸÎâü7M’éc]9~݉lâôÎÁb^!V/w&ȉùbõñxA±ã¼d^3ðŒaSÕ †¼H¤ØdeESïY·¬Úæ-ãsÆÐv·D!Iˆ{ÕvWÙpf\“`Ðýêã¶Í5aÛ±&+õ6ô“¥La* y3ŠÑàÏ:a ú©*\vçƒK÷>ž™OÛü̹҄ò4hïÝ: eüãàÅ8®~ËÏ+ÛT˜5ýÙìÚÞþ@@*¶Ab!„B!„B!„BˆÛœS»@!„B!„¸S9{æôóÞ¾ë8Nûu2ÌöŸ¹T'Ä¿þÐhД¼¡ï85À75Ï~b°Ç7ƒ^ÑNh*ç¦ñ;7‡&„æîØ0ŽÁy„óÎâ{{å/,@;_‚«ðÞí÷÷›ÛÎTS³X'û«ð Æ ¶1V¿¿¥7ðrë]=×b¥5&‹·RZD1åuR^k¯º^&Ê”×0—x?CŒñ¾ÏîÑðÕŸÎÅ-6°=ˆ d»{6Øv÷øð5Y…¸ç¶÷yô¬êí?ûðßgK„Ý÷‚Y‰½•ƒ£vëd›ë0ü>bŸâ3o»¥–ÏØì»-h(ç3Æìn9å^|FÛÆëáñÌ?Ÿ¸xë¬ÿ»pÿ°RQxt×!„B!„B!„Bˆu4F!„B!„Ø-øô]q’Ø8&L‚‰\:=7<ÓLŒ<¢¥N1LE)`@`ª«„ºÈSY:{Ù$CLe)sVس×RK©M^)S^\>¹é•ª¸›Z¢‰ÓVÌÂt“š9­ùñ)ηÕ˃I2@?m¥ºOu·oEOnJç7ˆ b5Z~<%§ä'Édÿq¢‹Eøêĺb4Ç@5Xîé"„¡ñ@Óšö+©Nñ)OXP L…FâÚSÄ1ÇXÈŸ±M¶ÑíPoÛü¹ºæÂšÙv¾&¼Ç‚íQÐ&Ûݹ·ßÓ =(…˜ Hª f¶n#ÛMàçí²Ï|E|7¶½&”aÛµÑGˆ.¾w~üøTΠ&f†Ë6‰a˜þ³¸·'1Ìx+ !„B!„B!„BÜöH #„B!„Bì–GvÀIãÁïŽ÷Þ§Ÿ~î§ž¸t°S¥%¹‰7Jt²r%·m“˜diªnBˆ¬„AФh„4‰„4ÖB¢ý¶(н¬UXYSýg! È^ ù¤j,e±çÄ1)ä“B>‰ëcNøRÞ—ÚU{N´Ãµ-ä3áÊvb/ŽˆArþí|¸¶¤ZM$<±¶ßat>oÀÂN5‘Mø ýåùpkÅÒ$¿./6?¬é8v”'ŸŽôâœ<¦ì³v¶üpBŽ(Ê)bŽ^€b½í»W(D»lcfÛ©&¶ÍÛÞT“7×%Öcµ&Û.¬ÍõæÉY‹-šp‚å§žô)·ï¤¸^½yÛù,¾B¨,–qÂ’v×ÂúdŠMç3ÄȹŒ„2d›}ºøÉ¶{Ô)—'.­ˆaÖ†Âäkûû¬lÞyöÌé§w„B!„B!„B!„XçÔ®B!„B!îp$†9ûÓé0kÁyGJxââÚŒ p#rhh¦&龩»5cûæì`/6c›?jžŽMÐîZl¤6„×xò¯õöB®Ã÷Ôbu¾0³Ç×ýD…læ6•üƒsm¬5óÎ|¿ßn„ß;Úý®ÅjëûûX­ß?6,±†Žy›ïŸÖu–WÝ4ˆ55AKJüZ&¾¤Ô^íý²ç€öGáF¹ZiF÷Ö{S¾ñž;û!çX£¡íQÝ£ívyj{X“mlóó>yã3ÓÕ›l»zôõæGŽ­ôß'-&þÎè¾g¬ø|7ÛÍgÉ9Šnüû¼sËÀ.ÛŽñä÷O—Ù%ŸÝ5 ¶ŠèƒÞ_¹p},Ü’ÓÔÄý·™B!„B!„B!Ä @b!„B!„b·ü€gwÄIcoþÒ}75ƒ˜\ºxá:5A÷ÍÙ]Svmîî¤]ã¶k?ÌùÖt¾­8el›ÈçMÛ9Ô©/°­kmHwMÞ1V˜5zSÇ{‹ aÑÜJ ’èÅ ym´“¤Æ?ŽÕbLT¯ÕܪÁüŽgØÿ‚ЇòRJ é y1 ±Ë _:Ñ eºzŒjçkÓå9r l··³:FÛ¼epo:Û£ºGÛ£z†¸ƒíî­ÄÝ?Wë5ñõFwn­Þü]Áßwàï—²N'Ûº/‰ûŽÀ@ èloÊ„’×ï?óq¯ûlåÙ]Ö-\ µ Ÿ¼¿ùô·Ö¯’­ßå a2Ìš0f°¤É0GâÑ] „B!„B!„B!6#1ŒB!„B±CΞ9ý4€wî:Ž“Æq›{/Ÿ»Vk³5½÷ Õ}Csé?oMÌÛ‹IzqHðåìa {ízk€ŸˆdFMáˆÝ¡©›r];ï…0­¡{­vÜð¿.)mèhFMû±h¼¿Ø~›ÞÎø0ŒµÛ_ZÙ¹{+º3­3~+§7Š“bêbÕ³å7™9ñ ‹[qÌò:à5ZG7†óÅCq»¤øm¬ßÄ6? £š¬Üç“w3ˆ{Åv{D&qoeƒslö¬Ö{›šxÿñÑoåOQNW©»ýcYKSíÒwjþ§__ç``×Åâ±ø]6ç´¼ÍÙæšpü¶aœ{\ù£ÃlÍ¢ŒÙÛÓd˜# É0B!„B!„B!„'€»w€B!„B!ð€—í:ˆ“Ĭ¹7¥A;s×.¿–  fíÏé[`†„´4,§”šÓbi9’›™,Y9”í¡î –{{Ù$C²DöÊtþ›½òH5þI>¹³ºú'_  XòZ®K ƒr]ÏÓÀ×½vÎ^*žj´þ¾åæðÖ ,® uãÁ¥u>ùµéT£ó©­•wÝ"ê®Ïûóðöí×̯»X]~ä»4סvÙ—‹|u\]Ó`?ßËþRø€ÕRüu>Æ«*ø3앳I9^Ès`ÛæÎqCáÕHL´··âŽ1uqoc›Uí×>¯ 5aÛ!¦.nÚÓ„s½°Ï Zbøå €(ZaaŒ³ vzñ—§Øàxf>ló3çJÊÅ,Õ§Îg°íbõ ¢AžyúY±Ø+’ˆ, a{$¤I$¤©‘’&¡ iŠÈ¦ˆWêµêßR§¤O~_óM-ŸÞhÙx{\s—ò¾ÕCÑjmËØ \±ú”*9œPãbÓ`¹Û|ÍHxÂÏ1®ä'(…3Fâ²çD6ÉÛñþÒ0¯j3YÌÒ8/¶_Þ¤/ ¥ºšQÜQTL,@Ø Èà{N{•Áàœ ÷4‘‚SB¸{^ìb*ỳmÏ|bÛm"‰qÜ㚌Å-÷6¶ûzô‚Ÿ±m'<1^+Ïx/<)õ e8dt¶ƒLD8ÝzK¯Ëøx¢íN@Ö[>!f÷8µÜ«ÏhÛxâÔÅŒ§ÂŒg›/ÿ])6ðî³gNuB!„B!„B!„¸…H #„B!„BìžGwÀIcoÿå—5ÍËʵ‹ç¯6I…5ñF‚U€MÅ$$æ@ifnb’DöJ_yµ·a iüDÔ‰-(Ò£ ,hÓfª½"r)r+eÉRœÎ•Œ¦Íðô›6ˆÂ—f5·êÃôDSIÌât´,¢x¤ÜCºéE,äÖÜQ­5ÿk³é,Ñ7u±bÆÂÚ_*ˆµýѯMb…!îö/¾fâ¡¿$.(áâ]XoÔ¯b˜±EyuBŽüëvâ–m²?·¦ph‡ÖÅ- 5–ß³.ø±yܱ&¼‡Žom²Ý‹5!QKvÙ± e.”qÂŒ'¢´ýÑ.ûÌñ佘Ø^ʰm¾m½å¾) cäGÇ:Û~=Šn–÷W.ÞÀvŒ?ƒõß•â0è¿É„B!„B!„B!NÃ!„B!„»ç1Ní:“ÂÞÞQ|«B—Î]«bŽ&á¦hƒ“¬‹9üT¸ 0#1 HLDáKžòÒúÒ§â”ÚÊ>´×òI©ˆ|ÖÅ)%Wí”i4µ.$â !­­¾Åêí-×Ê´/ä)RN8aÂL £­31_›Lgé„áJÙ¤~óűæHãþèÛb^+jÀmÝVÄCÝþ˜ßñÅ›R--Ï„ùÐW¨b'ºUNlEUA€¦.ˆ9zŠõ¶cî^¡ìÛlcfÛ¶°mÛh¿lŠ›ëë±Z“mÖæzW‘ bê÷[{_!e·8%ÿÓ‰YF>—]]¨,–q⚉íÑ›±O£ÏÇçÞ‰s×á߇[êE4Íö• “%kŸ=úÌï=,1Ìxd×!„B!„B!„BˆíP“B!„B±cΞ9}À»wÇIboïÁ¾_|Øœ†×.ž»6h¤Ó êûQ#slÜöMÒ6ü9¾÷Ó7t£;¿Äïì…XËõÖ§.pO|hè.+œ7|£8Ây ç½=½Ú"îâa{­¡Ÿ»ÄAkñ¦Ç›H¾ÖöOE¾Q}$†7Àïí/•ìò ±ºpyÓ<ÖinniTWN4–‰êMfSÊ}ö H )mñ:Hõ\ªÊªßú¼ö¹˜‹9ä<º÷ƒ{å—£íµg+Úö1»ºÖsír÷áÚž?cø»ga­&“çqËzócÂVfßAí ‰WÂ:hÿ軫÷YrŽ¢ÿåûˆj?²¿ßºxòûÎ'åãì’Ïîš‘-èýo篜¿VïZÓ¸ôÿ²ë4o™ýýÇÄÃ!„B!„B!„Bœ$†B!„B!nÔ|yî¾û>ìÃîÃÖ£)O=ù,ž¼ñŒkJ.ÍÕ€ï1wØàln ï'˜»îÏ{{ì/4f»ëQøbõZmŽ]£fñM‚× >j:ßâüX´Ó7{»Ú†Xæ_œ£ë8o¾ü™V.p·Ö‰Ú ëÅ 3ABñÊÛ~mœ‡bãX1‰µî5¿¥¬DX"Æ:¾‹˜e¶ä>,r™¾Ü¾4É7Ö1Äsàú¸8ùm¼OþYj¶7Ô³³=ªS‰‹}ï×ø¾j²1îíkâmǘ×mówHý,çØk¨áñcŸüYok¶©.CÁ\xDâ£Ú•múÝ7óÙÊÝÅ\}†ïH„Z„ï°Þgw­YüŽ„ÿ®¼tñÖI“ßöö5æ<ºë„B!„B!„B!ÄvH #„B!„Bܨùòìí­üÅûUÌrñò…ë}Ã55k~b‹=3;ˆ{¿†p¡Ù¼wÁ]àé»kÜõù„ó±a»\wMÝ\öåéIôCÍ쨿“á™àÁFbÉ×õO¿öN÷·¸Œücp&0u'hoŒuç ßQ^î˜ß?͋֫  nLÁ´knÊóÙǾ.@ËÁÅOç:±Ò¨æíµz†ºOïQo»¯g¬û6¶18Çg í‰5‰Ÿ5ñþããê>Çúï·É䪅PëïåLÛí¾+Ê{Ø`».æÅï¡^œã¿ŸÌÙæš¸øƒí’Ïx=æO57àÊ…6¦cíßsùÚþÚ¿'ň÷=súÒ®ƒB!„B!„B!„Ûq÷®B!„B!M†94ûûà÷ÿÜàJ‚kìo —Î]ÃG~ÌéeKÊÍÊ––Ÿ)!Á`–øscñÒ蜒Á–¦i¤Úx\š²SZì$²Wž{ä ‹˜ ôâ—ýÕ6 –ß/Q‰¯¡nöœ ç•Ê^4_e­·WÎHKPl§b/¯¤V—Z;#_µþ¥VÑ(7«ÓC`%€»¾«åä×»›l©x ÅÔl&¿¿Ük¶³DUŽÆ‡Èû6‹±rü¹Pk5—ên×Û÷G¿A¼áb…±c2aõ×ä½Q~¿É‡ärÛ0¡©ÜªÔJC NÅ«/Æ“x¢#Ä ¶mîœsÁÊ:çÅJ,yèãö¶CÜÝ—ÎL€2¶m¼Ç‰[J\Þ÷jMØvˆi­ÞN Wó :Üq_ö‘ ¦üÙ†9;02ÛniF±âØ'&¶»Ò„[;çšíêÃù ¶]ì±~¾&œOñyùüõþ³Üý>go_b˜C¢ÿB!ĉÄÌðJà#<àƒþÀo§”~s‡á !„B!„B¼`H #„B!„BÜh2Ì!ÙÛ{ ½a5É^sñܵ&â("q5DÃPU0²"æ@jö,»NVÚ±›˜¤Ú#1 …/YXCÍÕ›Ä)c{-Ÿ”ŠÈ'ŠS²˜‹vÀÞ±v¨=þ®>ÇêíÑ]a_Ù^*÷”ìø{Y–ÙÓ1íooØýÒ}ˆ"›åX¿¿Ü _•”Ó›äUöÛ8Všhˆ×kÛˆ‡zÿËù°–O%KÎgy‚7‘H,†"܈9šrüKÞbÏÍ&權[@ëîí©B‰pkS~ØnIŒãF³»Ï j²QLdþ\÷À¶ž¯•ÏP/<)õ e8dt¶ƒLD8ÝzW ËÄx¼íN@Ö[>!f÷8µÜ«ÏhÛxbÔ%æ$\¹xÝ?[Lƒ)Üu×)œ>}ßÊ1@b!„Bœ(ÌìžÀ`ª„6³ à[SJ¿q‹BB!„B!„¸%œÚuB!„B!„Ξ9} ÀûvÇIbòïÓPÔ¯1 €Ú`Í ÚaŠÿÕÄéØ\=¿Ö5ŠÇæk ¾hÂù Ç«c“yœÎP¯ñùÒNÌÇ äóóí=Èžonoñpm-ÇíºÏi­´’h½î­õû]Kzð[ì˜ÛÖŸáýnïh?ùí…!Vn|@DZNsÆÚ×5Éçò^Ržî’ò¤—´Å+‹iÂdW3ó ?w,Öm÷¶¶Ã}Ùh»Æ„±m°mPsÜ=>f÷Õ€×kÂ{†¶1:·^ï^èA)Ätø;l©d·nVjÖÝþh—}æxê÷Òf¡Œÿì?*½OÊyC>ÆÈNü÷Š…õ(ºé}^½ü$žþ« ˜é¥„‡¾¿Ú[#1ŒB!NÿÀ7cE“ù ?kfû‡$„B!„BqëF!„B!„¸}Pæ!ØŠaÒê[æâ¹kµzÔ¬Ì Ú­É96ˆSÃ309o¡IÚŸ ç6œç†êؘÝ5žwÞüò ÚX¹¶IÐãÏpCzȕ㨱S¬£WûÕ5ïs‡ûàŒñÛ¼¿[ j»Nw˜Mö:ã;‘ËV±Zë¨g‹[ÄÊ7“XÛ™TÄ/ù÷ÆÌ^nO>í}¼]~\‡iÍ¢]¾Ñ6›‰5ÞÆö¨vã˜Ç÷¯ŸÆÛ«5Øvam®w/ôŸË~ò‰OÁm|œ²•þû%ú\vu¡òwF±k{£í‘€fì“bîòñ¹¯ù„‹¯ÙÝR›Ø6._¼íÿ‹nüïH±MéB!ĉÁÌ>À_?đӾý G!„B!„b'ܽë„B!„BQyÀWî:ˆ“ÂþÞË/ ]Ÿ¸‡7äßpñÜÕÚœ¼42—}©öÄ/+yÍʵågrÓXÊWÙ+ט¡í`{KXÉÈWZìÕ´ê~À`)åFîå}J fhþSÈgÅ^ªö(ŸòI!Ÿ,j°ZÏDö–ë.ŸP;öŵ¯ör¬þŸ%v¾Ù‰ \M®9ÜB¯xB½t/ýö°¿À=-t>Ñ~îÊg¾+ù5P &±Žâ\5×5Å3åYòëuÆ»¬}ô†íùa2̺¸^PöÄ;îÞX³ÝÙ/¶‹:!ØÆÈ¶¹Š‹œívy$$êmû|÷jM¶mÏëí d……'ËÖHË3×AûG“«zŸVëïE7A´‡‰P&Øæá^Ž£u˜‘«gè¯ÙÙˆ>ÜûÞ6 ¸|þ†¬ˆ<ùóYÿ)¶åƒgÏœþЮƒB!„8/?™O½éQ!„B!„Bì‰a„B!„BˆÛM†9ÿz¿©;Ÿ®]îZ³(ˆÁD\Ãå ×ë}iŸ=þT¥pͳ'1Ìaу !„â¤ñÑG8óQ7= !„B!„Bˆ"1ŒB!„Bqûðè®8I<ôЋqÏ=wáÙgŸGׄl˜“péüõEXRš‹\"LEÙVœ2s Ú§ 0œ˜$OF"› ‰v,;M€i×GöZYzáK´‡œ<ç±¼¯—@µc_+`B]ÐêR¯¡ˆ~º½ù¦ŽÄ ÅíäÖì´lVöG¿aêOÙ lÜt­M’äU7Íc5 ‰†hóµx¨÷¿zÌ]Ž~š¶É׿‹§¬8hU€¯~í‰BŽ(RÙ$nÙö‹ÁÍøœ³M{:qKŒ{+Ûœã³Ò™ÔÄÙ¶AMà÷´Í‰Sr-ËzñU(q½î¦ó\šj7Ÿi»¨¥¼g%Øå[ãÙ(”±jÇÙåšt>ûZ”|}†Ç²ÊxÛÓÉ0À@…Öæöö‚Q±†Ä0B!„8i¼ígÞyÓ£B!„B!„Ø!§v€B!„B!Ξ9ý!Üu'‰ù_¾“.ú W.ÜpÖ±;6Pw ∠̡a››©cÃ5ÙÁ`ÜÏIƒwlÖ®öúXºVšÏccxlüç¾ïÞ¼/_ì!pCxôoä¿ÅÜ5ôóZGÙë»Ø›x"žáV÷–g,°?ÚŸáý.wûiÍBœ.Ö.?~`&±®å6Œµ¯k¬Q‚Õé0üBZD.üBY¯*ˆ¹Äûãã_r`–;ߗɽå>½§£š’íÁ35åŒmïÝÛà{qËüÙ‰5©‡ïˆ¶Ï}WÅðËý÷Ó|òI,{ü®ŠaðwÄŠOLlw¥ ·¶~R|ì³úp>ýõuÉÌÇ]lt¶ákuéÂu/ÌŠôäËûûš sH$HB!ÄIãW<}È3ÿòˆC!„B!„bgH #„B!„BÜ^è/“‚}ÃL¦QІnÛÅs×|sv×4Å|=4G×FrnŠŽS ¼ÄÂyo›Á7ŸGh´æfíØDnñ½{ù¦u¬\[;ß ƒJ-æò5·kƒZÎùWßw$ˆ¬¾mû·˜ßßÌ”½±¾rÂ~'l0zÛ¯õqÒ½›ÅÚµàÏbõ¹mŽ•ßR¬X&¾,¯&p9ȯ¬©ï:1LÊcúû×åüúDZµ£þÞô¶QólGi?OáÙÕ“Ïñ}ílÇgu­þ1¦P“¹íAMFÏÁÀvüüÕµò¹¡ï ê+¿¯.Ã#ݯûïö¿W€ÑzW zdc<ãï:”ïœî;Ðú˜;Ÿ-÷ê3®¯Óy*}¼M>ŸVñe2̦¯eRÿfo_“a‰þûK!„'Š”Òïø¦Cy€ÿå G!„B!„b'H #„B!„BÜ^¨óŒ›} ^Ö‰/ž»ƒfj×=z¬ F†MÔ¥~ÐÌí´ l;¼B3wlú^±WÅ]£ù`¢ClDMâ\Œëãðµ‹uA]zÁ@]p7s.^ ýl'ìß8e$r Âøc¿´ß…fˆoša^³Xã¦mbõ~¹ÞQØ’RBùŸƒ´¼êÿ¤øj)wõˆ1¹Íîa_Ƕc-±Á¶{–¶1‹{ð£y¯û¾Aÿ=dÙ€ÿ\—(Ú÷ŒÿbŸ9ôb¿êÓx½¥ëí´Êô>ÞŠ¸Å IDAT)ç ù ÏómˆßYÁh}æ3<¸tþ:VÙ “Ù—æ0\<{æôûw„B!ÄaI)ý€Ïðž›l{€ÿÀ—¤”ž¹E¡ !„B!„BÜîÞuB!„B!„p<ºëNûûy2L81¢»–RÀÒÒœRmªN,`ùR2˜¥f6•†æeÅRšØËkÉÈžµpr£t»¶4“/ÏuÍ –¯%$XõµP›ÐK„Î5Œ—|ª=P,y-ÿíýbËïÙ?r^‹½¥.)…|RÈ'µ€‹íäìå{ÈS®+rÝS½C-ŸT—ªqÿ,ÔZ‚*†ú.¥~?UŽ|¥æ9y;þ¼ b¥µ0Íh¹—ÞV»;yÍ 9Ø$¯µX­þ£<>‡|&õáŸ@×Êd˜ª @SpÜSJ ÌE"6°ÍfÈvÍý&ØŽq»ØÛñ©m¶«ÉÀ¶+åæz÷Ó¤H¸1\w!¹ÒÔß)Íòt9¡ÌÈ粋o“/{µ›Ï´½è¦¬GqNç“ré|¶Ü7ùÅÇùnéH(Ó‹ Ï>ó®_} Ýçèzÿý/Â}÷ÝÓŸ3$DB!ĉ%¥ô~ÃÌ^à#óë!ðG)¥ó»ŒO!„B!„â…Db!„B!„âöB ™‡`ooð—ï‡Â§8©\xüj_”ÅÚžª¦‡  Ý:ÌÇÈÕ3ô׌lµìýú@„½.—+nÔ»9žt–Â5ÏÞÞýã b†„ÈB!„8ñä©/ïË/!„B!„Bˆ;‚S»@!„B!„³gN¿ÀÅ]ÇqRØß/b˜IGðj³~…ǯQ¿¹Ÿ&Ð5Q/K]CµëWwÍØq*Ah0þïû¹f‡úäk,ý‚œ¦k`÷¹ŽìùFuË !~v¾¯Û›ÅãóYüp79­Eê^ß}nÍ`<@/¾§>¡vÔÜËBLõyšì~G“<Œ}ÇXCn]¬k¹Õ¥I¬ö§¥ù>% Ðï³×AÛWζ˜é>¬ÕÁÅ=ˆ9æ6¼ÇeËàÙél¯ÕzR:;¾×|„ò_‹;Ö„mcÍvˆyC½ù³ÆŸA }†;áùäÏg÷ýˆ~BKôËÑ}oÀZjF¶:dÛùôvC9ò5ŸûPœ3Xo>CÜÅg´íòé}r>—Î_ckÓa2û#¡¨XCBd!„B!„B!„Bˆˆ&Ã!„B!„·ø¢]qØÛÀ/äI-ù \gø`bÌ…sWóoˤ’Ñy*J™¥ay ™å)*4&•³(Ói™À&À,×—8R>ïí¡6¤#O|iö@×—ý‰bµ\“T¦¤¤æ«ä šÃ%Œöj>ÅWÉÇM”¡XK>9ÖÎÞ(v´Ú×[`-Ö6 …næVÓYÂ,÷0NgñÓalÜNMðãé,a?Œ~ ¦³ðþDûË‚_ƒX»ýÛÄJkƒÉ0­.~ÝO†1yFj–’û òýƒW@ð…(äˆ"•Mâ–ëPo{p®]•ÚñÚP¸cë¶1ü8%ÅØöjMlPÀù·’› Ó‹SêwÐ 7l°^wsm(üj×êçÝÐâˆ"Lc v¹L1žB/¶ùã»á}öµh߇£õ˜?Õœî¡ÐÀpéÂ5ÿ¸Ì„1‘|yo_b˜C"1ŒB!„B!„B!Ä Db!„B!„âöãH ³{{L£-sþò{¹vññ¥áØ‹CP›•—½,æXL¤Úüœ`QLÂMÚX®UÛh‘j¯ UòÏ-|q¬e?Є/VóL®É)ø¯öPýU‘MµGùtþ£½RLòT{ËQWŽÞתÔg©s©Nù'²@ÈÝ}JÚê¯f"\éÅ Ö|s ÕÒ rHˆäÏôq¢fÌǽ­zÈb^-Ú>Ö`ƒž‹+º8iºK=´ƇÜ&àŠF"•n:ž8‚ƒcíl›;7·ðYRC8ÛmÏFq‹Ï±mã=NÜl¬ çkέջL#©âʯnpøå €5¡Œ·mΧ ó¶[šA(3ñY>Ÿ.æAÙAñµ’•Ï‘u>y¿›Ì…ð2²E¹wÓ¯¢íâÓB,\>w «Â—4ù=¿ÙBQ±ÆUïÙuB!„B!„B!„âðH #„B!„BÜ~è/”oÉ‹^tzèÅxâêÓáʦ©0ËÂõ«Oã©'ŸÅ‹ï»giFŠ9èD7E¥L”Éæ'â”´b/‘½¢+)òöµ4R'Šp—,¤I$m(â^LRìbÉRœjK/|INTÍ5áK*öPuÎ ù¤O  "¦È ä‰PÙ£»û5 7õ„€mÄ ý~ªù"ïCÑJÙÈ•"›n: ò½ô¶ºI2îˆ÷m6äÌb­o'u5,“ašRèP¤”{¥ûŸc›Š[ÚM²áž& p* g»Øç£Ñ6Ÿm{:QŽùsSq Ú¹™¸¥SV¬Ôdn{P“Nð3¶í„'FkM¶‘¯Yó•ß„2r[§é3ÁÇÔ§ùøB)¨d1ž~ŒÐÀ‚ëcî|¶Ü«Ï¸n¼Nç©ôñ6Å8ZöÍö¥ ×ÑÑ}îæDM†9o={æô¾Õ„B!„B!„B!Ä®‘F!„B!„¸ýæìí?¸ˆaú0§4©\xü>êÏœP¤IÜRµ›ø£‡  ÃóîÑ ¶‚ ÐúÌgx,Úm6àâ¹ejÙøs9€¿SÂþžÄ0‡@ÿÍ%„B!„B!„BqB9µë„B!„BÑñ×vÄIaoïüÛ¤Yxµ‡8áâãWë»Öðì²»&ïeÉýeÿØnpŽMã®á<6yÇ ¾ñÚÿìít>(/t±¶†ln÷¹Žìù© ¾Y¼o5×»F|Ž}£=ŸÏ²îºÔ[B‘º—÷—:ŒÎ„õà5ñ~‹1ѽÚ~GÂÙ„”P4zNVöGßa?—%™!`Åò…¤ƒ2pg”3ùÛTÇaÎð9;3ku÷sÕöà>Mm·ã«µßÖv¬I÷n·¯wü^)ŸµÅu\w!9ñ{¨U`2¡%~öÑ„2³ï­(”‰ßu½€Ÿ”Kç³å>òÙÕ ðñNn)Ç×Å=ðYö_:Wþ ü ŒDn£‰R…½ý†ëbˆÄ0B!„B!„B!„'‰a„B!„BˆÛŒ³gN'í:Ž“Âú_À5{.œ‹º£íĵy±ºo0ãù‘=›ØóMâkç]±ÉÛ‚áÏ~7ÿwçÑ7u»†öA¬ÕàcG8_¯ûÆ}:6–\¹[ý™‘("¿Œ·˜ß_Õ½Þ÷pÿÖ±ò±`ÇØtˆu´ß¹ÅJkýRJ8ȯä^#L»~R^á㹎ê2¨¹Ås£û2¬{´½¡>d·{F¦¶çÏÊ,no;ÄŸ­îþncuû¼…’ñwŠûÞ ŸÉj«úè¿;¼].‘· òé¾c` ÐÛ³bæ!~mʇâu‰ßoÍg¶Õ²÷ëÏðxðm­>[îpéüõ–èÖÓa–§NNŸ¾}¯`$†B!„B!„B!„8¡Ü½ë„B!„B1䟻ë N{û,Ý÷¥«˜~o¿&´¶ïå÷ríM†Ê~ƒ•Îbj²N)åú„b6Õ†ðKXªï9,ƒÕ€¬Æ0·—œ½| hûÓò³Ú«×³·´ø0#_œOÊ>:{ ËùTíQ>C¢ÜJ^r/¾«¹–º[½7–ãh&(d¹.îŸ tŸË½.@ÖJ´8eaiPOÎVɰ:tûÛ¯‰|ù˜Z¬|&ÑÛ¶ß(ÒeÛ(?«÷-ìæ'™œöqÎb­‡“ÕÕü»8æä1½¸¥È#œ$ìaeB8Ç ‹{¦â–~ÏX'B;¶í|®Ä\}RîÙ†«ùÇW}†¸ÏÞ¶EŸƒ|¸æ×®>‰çž}SÒä÷üæ¥/½wÝ¥¿µ%Ox×®ƒB!„B!„B!„GCb!„B!„âöD©|Kö÷g“aXÓ¿- þ$N†ÉMÍEXQ)5½ 0¾4ÁF§8GUÆÌí­ŠIèÚÒ¸Þ$µ¼ˆl²È%‘´¡4¼WÿÎ(–,Å!{Kìí(W/j¥m—å¼¾„Ú5{åzÈlj†–Ú±©x.ïܽDq8ñˆsÖVÇb°fàÊÑyò>­´B·óAd3å,÷ÒÛr"­Äü² '¬KÒçÇv @²eÊK9â'ó¬S«RGÃÀ+ 8î(äˆ"•Mâ¬Ø¦íM$bî\75§Hxm(ܱmï,øá¸&¶WkbƒšÎ¿•Ü\˜NXR1æBZ¯»[™\øõ}>Sv|¯#ÄâKPü ãÙ(”±jgs¼í^c]>úŒùSÍéVM‰“jpéM…)tz³¹mþïD1àígÏœ^Q !„B!„B!„BˆÛ‰a„B!„BˆÛ“GwÀIaû0¼H×.<þÄЮ›bPtôâ"lXÌᦢ”ÉÅ^ò“Nꀺ¿LJi"›åúT™S„4£ 0@ØCõW&À°½šO"_(ã\Ö§ß!M«h/ª±  _ê˜ÁD™ho4Ñ…ïùñÅ ÛLg!;æ×ÇÓYÆû 1V>3ñKâˆV)Z‰›© 'ÇÚ‚%æBOïŒxWRˆµzŒj„h5Žà`Ï$0hŠ•™mçį;—~Õ³+qαÒÂx·Æö &á\S^pMªU/<áp¨|®,ÕÄd‰MÖË~*ûÌgK3NKYçp (Í~½É¶†âòÉûÛ{ÿhº¸Ëç(Šmlb»ø´‹5Û0àÒùE ÙÛïîkÄ}0Ó2-Ml‹„ÇâŽÆÌNxÑ1ͤ”ž¹ñˆ£cË¿”î½….ŸO)={ ý‰›ÀMzNRJéé›8>fv€»{.¥ôÔ Ž`f÷¢û_Þ^0ôy<¡Ü¤çä锺qÅB!„BqG"1ŒB!„Bq{òNOxñ®¹ÝÙßãÆß‘¦8Æ[.<ÞO†¨¹:‹-ªÀcƒ˜ÃO€ñîL¹Vì¶pŠ(¦ÚF˜À’k2ž˜Âq“nZM)C‹ÕO`)±`:¦]où¬M€iþ£=Ÿ¦`fö|>-ó ¹b†j0Ù¤~óÕ®U‘ÍHC»JÈQäRmvýT´êu&È™ø¶°fþ˜ùÝS†=ûSqK{øl¸§ œz€ã¯Š>móÙ¶§åÄ=3q Ú¹™¸Å«BL¡&sÛƒšØLL÷{£µöÍÕ‰BJ½GB¹­·³ÑG÷ƒuóv½X&ÆÓOƒqX°c}ÌOŠ?äƒà³;O¥wñtùláÀpé\ùwO|ŠÓŸòÚM†9È; 3»À×øtŸà“qþw 3ûC,BþÇüó”Ò¿9®Mqh>À»n¡¿dfïÅrÏð)¥÷ÞBÿb Ììn_à³|*€—8ö(˜Ù‡ÐîýëRJo<®Mqdþ1€¯;¹ø¿°ˆ›Çûüé[åLŸÇ“™}!€W`ù.þTê&˜½ffoÅrïß àÇSJšz)„B!„¸#9µë„B!„BÑsöÌéç¼}×qœ>ì¥÷ãî»Ãÿ‰cãGl]ÿâùk˜ÿ1ÅqS·o,ÒÜ î›Ã[ó·?›»··Ç݃æpwò°ØˆšÆÃžØœ^ö-ä3ÈÕMEèÐÃ$n Ü5>ß®û†~ºBnõqÂ}¦vöšßhs[üþz(¿ÜÞÙþmcuÇxB\Áÿ /ïºìeß´6 ¥T_ù•&¯ñu´œj>÷Pèë¸æÎ­Õ6Ú ¶Ý½j®ûçf`{›ç¡ž…»«w¨ÉèNkÒÛî>×dvô¨¹ïU¼¾€ÁwDHß×ùØê÷àã,>y•©³[>·Ý5ÊyC>Ãó¡&¾~ÞçãëÚ|†ÇbP§ÅÆÅscfG?0°·§É0‡@bqG`fw™Ùßð^,Óßàå¸y¢ûðåþ€·˜Ùÿgf{“l‹Ûðq¾Àwx§™}Ÿ™ÝŒæ^q0³¯ð?à›|n‚&ó¾Àßð«fö föÉ7ɶâpèóxcf/3³_ð˾ À—àæa€å;ýs°|Çÿ€wäï~!„B!„¸ãF!„B!„¸}Q“æ˜?üÀD“ü”Á_Öþ¹\¹xcj{$™ Ebãõ|ïL¸šÊ¹‰þšÛ›»cüàó¾Ù||Þ qê‰Òô½ÍyóñÌrGw}^ßx­kt¯kõÒ‹ols8ƒtûs1ÙGÙ_×úíE ö>™x4øûÍâ–Q~£¼Ê2?¬ó8G±&,1~!õk|-^ïcçÑòŒuõoÏs¬—¿ÑöèžÅŒž›™íqÍ6ÛæØWjÒÙ^«Éø™~fjM⺠ɹhB/\cfŸËª Ó}¤ÈvýΞŸ`þû¡~7Ñg«æÒåÓrùìâÄ<º¥ßèßÑ'פÔüÒù †éD/ã×4fk$:wföŸx€ð‘·Â%–Iï2³ï5³{oO±{îÁÒŒû^3û»6SV‹3û$3{€×øø[äö/xÌÌ~ØÌ^r‹| !Æèóx`f/1³Æò×}Å-rûñ^cfo2³OºE>…B!„â¶@b!„B!„âöåÑ]pRpÍ¿“¿–ß-Òµ Ïÿë3÷ ÌåÚ¨i±šmÙ Q †÷|:4§s£xmüvÖÍÆH0âÏmÍ^h.¾|…&ø6ћܽÆ7Á÷“\y¬Ô®ØYlq§:Úù\»Ã´÷º¢÷‡ûÆûÍm gÜõ"²‰ûÁ{ ]^ü°u±†y¹’„ý¼›OÜë`:&…2ļÑçëéƒr{b­ú{ºV®A»¼ú ð}ŸÜßYÜþ™ qoª Ök¶9tÞî>ÿÀÿÏÞ»Çø–ew}ßÝÓóðt·íò­ŠÁQˆƒHTŠ€ 'R"ò)…œ@YAQBXB (rÃC‚ˆ QˆÀcn§õÖGHW³amkÃg³nSšÚu·ú,8ÙÝO)1Î{~W[c÷~|ò™ßÞgþ=.½ú…7½ˆSþ½–%"Ð;ˆaåÓçg'_9v’RÊ·HúË’~ÁÜPÒo”ôJ)|1==¼ é÷Hú#¥”;˜§RÊ/•ô7$ýÒ#¸FÒ¯“ôý¥”Ó#ø€ÏãYsþýZÎàõX¿TÒ_/¥ü’#ø8 ˆan.t†9;wž3ŸRÌ®HæâÞ»ösÁHì‹9²‚ìV0­ÄÞ!ë­8Åu{pŸóÂ÷y}+ÔÎÅ-þ• ‡‚ìÚöϵ°\yÁ¹+6{÷'ç_½PÝ'¸Ù‹ó‹ûXÜ^fÄì{Säb«âc¬f~k¾7w³nĪÝù›â!³fê£YüâÄ1YǘžÛ²—Ý÷”ŸŸ“íe²½—ã{#WþÒ˜3ÆãYmÄíl‡ó’·íscŽ÷Œ_gÅjö{AÏš Ϧș¶ŸÛ³Øž8óüFŸ1ñvâš­ïÑ(”‰>wbî>ÍÞ›¥’ûŒßS.õáÖ™òjâÛúÞš¾¿¤àSzõÞš:™%]Í&VaÌéésó5È࿱àVSJùu’¾GÒ±;³ü2I¥”ò GŽ/ÿ‘¤ï.¥|èØ<-”Rþu-â·¯?r(ÿ¼¤¿QJùÙGŽx;k®ÿ†–Ü“-ÿýõ¯9€Çb€›Ë§$½wì žÒ¿„_w+‰eÿÊþÕb˜P`=”ç“ej(wè±àÛ¯EÔÛöJ°g ¶7„4fo²…Ü[Eà¡h}}ûÂvkOa} ëâ±û™ ÈMî²byŸÛ2Ψ˜l–¹&Ì´&Œµ³œ*æ·çSŒ5[c}§±‘M\1«üؼÂùnûJÅ-—W¼ñŒßR|\~~¿;g8Û–·×N¹sæ3Jò3Ùöþó¸m\Ãv±s²³²ûšrÛï æ,È0Ϥâx ã}öHSö½6uQÉ|;>¶×߇”ñï²þ}• OÊFÌñØû÷R ¶Ûxê3îßäÜœaßK‹ÓîÇäûý÷Þ×_z'ÜK™ð%ÿáPÏ=wìº÷'Ä0pk)¥üBILÒMéÌñK$ýÑc_%éw;ˆ§RÊÏ’ôqI7Eûóµˆñàøü|IæØA¹%;w»<;£­³¶í”käd3‹.F þ»$»mr¡LúÝTV_!í[>Ç6s¡L*Ήv“´÷ÈÇ+_êÃíÇßšþûn¶í¾³¢íæÓ®·>ì=±ú{í omë8k˜'ù.ip/;€GÈ·júErt~E)åØ+àñó­ÅÿÇ9<þ=I7­ Ï/)¥|Ó±ƒIÒ¿PJù'ÄmgýÎûÅÇŽ#ð5’~õ±ƒxÔ †¸Ùð—Ëà4v†¹ª)L\\ÕFJŠ™M³+è…ÙÙ+éÅèI±¹Ó@Ä"ëX¸=Ž›x‘]ï‹æ÷í™Xl‘}X¯°> adm…½Ž\Ø‚÷¼ËC,NŸ ÛÍæGTšjCÁ=1H¼f‘Í:–Öžßî±7ÒÈ_ŒµÄ˜L¾úÍ‘î/ÛWŒ?ÌO-ϱËKÚ-&Î csN’|¸Tϱ»=öuYþ‚훫mïœM¦ÏJÆ‹·ë·ãÉE8Ùwÿ21O>­°Ÿùû$±-k7û~6”äÛǽŒ¿öÊ›^¼)ÿÞ eæ_nwNÃÈ¥¤O;€GÈ¿{ì>$é[Žê‚7þzþ†HæÕ/ÒÆkçd ¿{qô,NEÚQøâ; t{%¬ØÙÏX¤w~I ·7æô¢ý©8ݲÇX½@Èå%ìuo½ß»)XßÉ]1ÁíŠA‚@«á+VÚÛù™ðÂ¼Š›Ö¸›kO æ+äÄXýü«cµÛ ó«|7˜¬KÌ^ç˜õýAû³yKb)nÝÞÙE»Á¶;ázóœ­í˜½m71ߎ­œØ)[9™mÛ[{ˆ.ÌìVÚœvïHÓwXÖ¹%Þbާ߆ûÞP{NsAž¿íu²ÛïƒøýÒîáD(öÓ3˜ådëó…{%øÔ´Ÿp[$yšG¼úÊ›ò¿«ònfë/ÀI [|æüìä°_üO&?÷ØlðÇŽÂ7;€§€âØlpSãxùÆcðpS¿ónj\gì‚æNOŸÓR  ÈkM Ïí¼åý+w¯î ÓXŠ«ªŠŠj¯c—¤R‹T̵ZTÊ(\.UR)}µj5ö–ëµX«{«:üKEeÝŸ··ú’¤ZTK5ö– ëjçØª=þý¬…ÜÝ¿ñU%Ë:VÊ:ÛçËø_}y{ö(÷sçìÕæ©GkÞs«a¼¨Õ•‡ñbKÐ[Á{õciG‡5ýrcGè IDATvf ±v÷µÏöVm‘|Ø[ã1ªÅÏ—ú¬Ê]«ýÆÐ}Q]¼í5ĹH¤¸éÅÎ1j†Y€bm—ܶ¬mg@}ñ¡â–T<mÛØíÍœ˜ýoæ$±­ \·mÆÍÊLÐ2„¦óIð…2ÞvqaÎB³¦ÏMDqk€¹¸¤ø˜CjœH¥”Ég>>Çœ©/%Æq“›óû¦0s«Û™y_kû]À[ÜÃÜlþŽR•X>ò‘ê¹ç>¬·ß~wS³;úGYeÈ_zGï~å=}èÃWÿ_%^l¢.ðs#H(}öoô0J»"#þ0#e!V%L÷U£=#¤©FHÓ3a„4MLÒí­ºŠE°±ŠbÌ~j â”öS[|#/mþlOfþÙx{6?Å _Fì¦ð}ÝkÏ}ÆŒl_)\)ýŸu]P|tñˆYãÄ ^*E6J6#F­¨áˆõiÆKëz·ÔyÍ"&ò{p"›šø0×j57ÊuhvÛ³Ùíž´y,]ô0†ó9û”=Ûfž±ý@â–ÕÀ¾(§Ùw‹®Î‰ösbm;¡ˆuÙ_C¸Ñ|MB kËøðBü(š k[>›u›ÒÔ®I‘” e6÷c…2›yi{œ…2ѧ6lg·‡÷òjs`Æ/î51Ìa‚2æaååcpùƒ’¾xùß"éŸ{D±Àãã·_sþ&ég=Š@à±ó§%ýØ5æÿ«’¾ùÅð´ó’>{ù<·‡¿)é¯\cþÏ“ôï?¢XžXÃÜ`ÎÏNÞøø'_ûŒ¤o:v,7ÓÓçô?ñn¼\ñÞpqïMýc?çëôֺ 1G•éÊÒ„eˆ7†ØD*5ˆY&qˆÕ 1I5öÖKÃ^Ò¦EªZ½h'v€±×ºÍ˜}u{¶ûFÁw›í™´›n3Y÷›ÖÆ _†= ÓF·š5q=Â.ðȺ³hì"ø¥u‡ cn©¿6ÄÍÚVw–èÛTíg±¶ùQ0cæ· :L.R¿ÅÆjE6Eµ]6Ù$š¹šZ¥ËîºÉŒ³CÅ-Qˆ³#nÙ¶-¹œuADf[©m/n)féFÜÎvñ¶åmû¸cÌÆ_b»‰.¬pc‰×ˆXŠ÷6ÆË0m]m ešmã3¦Ã qÖ¹6+º™D"Ͷ¬Ï³KG·­·JîS&>{ .nç3ïò’ eÜ~Â-:åe½øê½×å0ßKî±³ÌûÓ;ˆa„Î03 ÖúÙC'—R¾Qˆažxj­»ÎüRÊ·1ÌmáOÕZÿÒ¡“K)Å÷Š?^ký¿Ìóx«øëü..¥ür!†˜xæØÀ•P´yË_Ä÷%&vûc÷Þ8Ø×Tø]’BiSt­äÚüÓFÏÝ \‘¹]§ë¬/sü±ý {¶H|«¨}c},ßÌÝ\¾Ÿ»QŒó=×Oм¦ƒ]÷bª×må}2ßùè¹HæGßfŸ1i¥$óeÂp±ZW{“Us¬%™o•+µÞß«­õûNüÆwÏ)Æ+o{˜$çj縼&ùœl{ÿyܹíbç”`Ûå$97»_c»ø0çç>n”ûH‡‘ÈŽû´¹ç®ÍŽÏqü~0Ûó>ÇŽÆøßcšÇóçœ Ÿ!ÝFÛ{ôéct9ùkV&‘BŽL¾/î½9w­rÔômã”Î0‡Bg€[b€›b˜pã¯æW[d ‰¯#†‘LA·|Áö(þN °cñ¶FõÜÁ¡—Û‚ëXhn‹²·„/£øÞùröæõLˆÓ÷=Ñ—°—¤˜\~?S‘¸‚ÿ)WÑžŒ=SïÎÂÖO¢‚¾³ÁqÂ1Øáko¾?X¿Ã¿ÖøHcæ·LNUÿ!V®´«Ýâòæ²VÕû|]®Ý‘ü¾ç=Ïù{ {¿ZÜ¢ý$ç䨠XÛ[¹JòlÛ96Ç÷•“pÿÑň¡˜x\Zúò a‰ùý,ÿÌ[ÛÃgxV§ï/+X ãÑn’v÷ì—`k|c„q…ý˜±Éçl{kÜùÜʹ½'ºOfý÷Ж®Ó·–ïÖ®Mßpç9Á•|öüìäÕcγÇ®„¿`~é_į25æîƒ«×ÃH­(ºªª¨¨öbkI*µHe±_T¥ZTÊ(^^.•¾Zµ{ËõZZYxMì ÿRQY«¡½½Õ—$Õ¢Zª±7Òý{#kµÇ÷³ÚkUàÍ¿ñµnuøRU-«—;ãßÚîöÖS[÷žånäÖØ«e¢gÃbí£Õ]«ë¾ãše¯æ$׫ÛìîPÌúS¾Îóý=Ü3æíW3?^+~ÜÅêög|wÅr‚­‰RÖ«â`Ì8ña[4Ö.n±¶›aÏöP1\)nIE*ƾîÇvIl'9‰¶×9^tDdFtÑ}Ùu&”® q¬>¦ÏJb)³í±­O"Âi¶Ì~ö…2ѧ±ö£Ôg°-kwΟ[2û>},#î·Þø²ÞýÊ{ÊÕ/¹ÀÓÎûº¯ÿ¨ž}–¿}uü7À-1 À͇Î0pçtù‹øí/ä/ÅGÛU&nüâÞ›×öéÅ&òU‘Q›Ä¢»,ZëÏFiWZ‘ö“ {fÆWöŒ¦!M‹ò¬Ik"›&^é×ì~j§4½E³Wƒ0¨ŽýÌöÖó²û©>?ízU»×Ò ô¶T(c}ºñ‘¦É®|<ãZ{n¶ööcâv9Yçúüyv?ŠñºwöÒÏ3úhý´Ñ½lz†ýI¡;ìÁSÜøSq7œó³“W%ýıã¸éÜ9}¾µÖ˜/š‚áj‹Çè}u†Y…×ý³/æÎº¨ÌE×óçPÄÞ<†Âwg¯„õ%¬/eú<±oþ ö’‚v;6Û³¹‰±úbw%±:_RºÞï}äjYQqF4æ´Âûר£ Æ/õóc%~ —§ùÑ÷V¬åêùS¬›{³Ã>ÖªåÙ©Uº\_µ¿jxmϹSK¶OjÈŸÛCØkšë;ß³?›q~Ûyܲ]rÛIÞ½í½œdç»á†Â¸Yio÷î¶o¯ØœRæÏ³ˆ$ÝÅ¿ëìs¼Óí÷iö}–±÷è3ëó#µñÍ߳햛ïøýÕÎæÕ/$‚̬ILxßž«;wž›×Cb€[až ^’ôsÄMæô4üU|ß"¦ Ê‘WIk‘‹»÷'†i…á½ÿG1Ý]l‡-}7lS×1%t€Q­ôÕ¾+Š\™0¶ N›/•Þ¦{¬u™K’éªr¸½±ŸÖ•¥ï§^±Óý¦u£éyq¹3…úÚ|÷foEK¬ýÚjoÑKÅ®'2«ÜÁ®3l¿•b¦ÎóKcJw¹å·%ÇÝI=¦eý<øJbó£ï"“ù1ÞmÖd¼w†)“Å=šÚï[‰ØÃÍçì P°]Ì:5!ÂŽíþ¶hŠi5°/ÊiöÜTðühÛ E¬ËþJºØq%OÖ[!]í®wB™ ŸÍºMél·È¦(Ú¶B”t?výf^Úg¡Lô© ÛîÖ3{±ßa{B…ýHZ™5y°²'mVÆœž"†9Ä0·Ä0O/Kú·ŽÄMæää£úÀŠÞ¿¬^cõ/;ï/î½™ëg @¯â‘.ðèâÕÕ†8¥´ÂæîqtáËjo-ÀîbãK]¢1Öm{ÕH-œ¯nO!–Õ^ˆµåj¾¬û²ö꺶Ÿê÷£:öSÍú¾Ÿö3Ù[C^‹Ëk b›&â(mk­äÝŠAì˜rÁL ¶–ñiO`ÓÏÍw_=Gf Xí”ì”d¾2„Ù>VWpoììrZg˜ñÉï2cS,c• ñBW4ñA˜³#n¹Ò¶™> Pšm¥¶½¸¥˜¥V ±e{ù¼/øÉâÞ°íî‹Y¸±ÄkD,Å{㶃’qµ%”i¶Ï²â¨}¹Nbl´™#–\„ÒÑm+Ä­’û”‰Ïž‚‹ÛùLÄC™ÏönÑ\(ã}\ÜkaÚó9¾kûÓd¿gÜûµ;\ÅçÏÏN>ì àáð̱€ƒà/™_Á3Ïœ|tý4ÿÕ|/V¨Ó¼÷¾úž^ÿâÛA,¼¶Eá¡`ÚØ»¢ñ´Ý}çödì%ášãQX_Âz[‹åÛ^Ý~Bqüxù¼hçÚTÀ‹Ñc±yyÉ Ó“âúD¤Ð3h톪þQðï×ûq?EáC7ÕþRHóæ—2mí¯„8§Xc>LœÒòÙ×å¯8¿Úö?Sb¾‚{£÷½Éç!ƾiÛ®¶ÍœÉ¶÷_¦œoÛv÷Ov~{9±ûus\˜îY#œ…¥Å>Òá¾3dÇ}Úºí2lÇg·Ùãc{Ówƒü¸}Fã3÷ã¿bŒsNÆ~B.Â÷ÂìsŽ]“Ͼºçqo?ãÌL¾¥¹;Yö++¾7LÝÑ ƒÿ–¸EÐàɀθsú¼^yå­QÁœ¶zi[úGiíhrqïM}]Ô\^¾þUÿZZ/Ž¢Ö1¥÷Ûè…àëXi×–Ÿ½cŠZñvÞ¦Yñå;ÊH­‘J[?º×Œýow«Y»¬”¼ÌUöz—»Ÿuþl¯]÷ûQ­ÆÞrÝí'äÎú²¹ïöJëÈbÿm±Û{¥ugéÿhDa§%k¬p!œ•ë¸R·ç¸ìnªÑtÙØP¶b-v£nþðµßõ¦ÖàËGîÈêõûú¨’è–J[¬òÀFu¥¸¥Ù·æ£miþ^xqËP7lÚ¶sì=5¦ìäĈ.ìœYÐ1b˜-“‹ aIãVèÑ…(šmŸ^\·äÔÄ©\ü6b vCÜ=!î%EeòÙSg?‡cð"šÙöÖ¸ó¹•s{OtŸs÷^OœôIïÌ3æ øo)€[ažÎÏN~FÒÝcÇqÓ9½3ŠÓF0W¼Ÿþ2ÿ}à ÌM‘÷(ˆöEç£@ÜhÇ"ñ¼ƒKŸáŠÖMöTŒn âçbxÉËø*ÚEÞ6–Ø‘Âwth¶¥àkMèU¹ó¹Ùèô [¸? Ð—Øæ*ù\Œ!¹I=÷.flž_F ýUì”h?øÞí$Sæù1A¾“ÌÞÞF~TŠªJÚéå:]aj³g=n©\HþžÜÌ¿ËWßðŽípn¼ír…í¼¥¶ûÑäç0å$¹âóÛŸ»ñd¤¢‹©ûÒ®Ù~éqFÓg—ââ¶¡'á4[f?ήBÌ“ÏÕ–Ê´¥>ƒmY»sþò3în™äè/î½)©=(M€6Þ»_jý}í—ï †9Ä0·:Ã<9¼$éW;ˆ›Ìò—ñG×’Qê=ºŒŒêãyÞŽÔ^¸>:À,?Ö±²ül]Q²0Òèbâ;°,ÚjÛ1¥¬ÛÉ:Àt{`z4k˜öF˜q=³g2nÖçeZÂjß{‹½_Jr×í_6WÕÙ[cÑk¿¶Ú[êÌC÷”Žïž2fØ~+e³ÛJ³vPw–èלC×j>¿eÇg¥u’ÙØW›_òX‹l7˜jÞEZŠ’æ1!vu@*ni¶ ‘˜bl;û&Î-!О¸%Æm—«lÛm^a;æ$ØžE+#äIx²þãÚÂyA‡ù~²>íàC"œiÜ<ãÓÑnÄÓs±%”‰>C>l¾¢ &äD“O¯‹qg/ý<¡½w$½ÿÞ¥¾xñÖ¸p>ô¡gõµ_û‘ü"X^>vðð@ ð䀿 î¼øÜòÆé`¬¦QW±†ÌüªW¿ð:ô¢èU<Ò…/«¤‡¶+Ni×MxV8b„4MbÅ$êⓊ2D6µ‹A†Ô¢mgbˈµ˜î¥¨ïÕ _j öjóWÆ9XaPûé¾ì~jØO]óÒòÓš(¬…ìÞéj »©åÒ‹=Z6£`fÙ«ÙÌzCç²/ti'iÇ»¯|XcíxAN2ßî¡D‘KˆÕŠTŒ°ÃJkªFgçøÝÁdÍ,L$»â–¶T€R¦9“m§ k2Û6ÏÍdT;ìÚžcJÅ-жɉ÷ßEFtaE$^èÒdÝöíµ{>ït?Ï"’$tk»Ø¹³È¥?Ó!Ý6µNœ3ù ¹0>¥l<¬·Gjî ß$”)³í–›o'Ä1gjo©×^ySõ2> ÙCež\ó<Þù†ç’¹xõüìä³Çˆaž^:v7ÓÓç&m³óþâašð%ŠC´ˆddÄ$]̱®\;yT#Þâu±ÇD{íúÇ*&ñöÔ ¿·Ä$½¼VU#¤‰¢¬ŒæØ‚o'rÙèã|….)-¯j¶£=#0ê{í‚#©/5±FÌÂ!ÝYæ5C$c#> “Ìz`#ÒÓ’ãd~?Àqm¹¸e[±ŽñëF7™©1Ìf˜€ ¥‹DlüMñÐ>E„ãÄùºn»˜ujB„ÛýmÑÓj`K”3–”°´ø±,n•]Û6.'±.û+éBÆ #7œ8$I×xƒ­Äg³nS:Û-²)ж­ek?IŠC^Úg¡Lôén1cÛ'yÒ¾PFa?‘¥+Yûn±Ï[{x2UÙø.:}1ÌÐà–àÉBÎ+8=}~}7£ |}o2Õ‰%Š.î¾ùPâ…àK±rïz2‰9ÖÔÊÆ(eý<Öj {íúâÜÊM†=™XÖ±Þ½FýzÖ­¦w”©CD±ÌûÙ±7:ʘý„î9V4´\÷û±â–& rù±¾ä}ÙÜÇî7þß•¬ÛJéÿhDa²ïÛµØS 1gé§'¢œ& êÑYoÕÔÇÛ{¼ ÙïÅêÔO&>Ö%Ä(°ñáN±LZÃxC™D*Òž¸¥û·­7b`Öv Ö Pœm;m[%Ä–íf#Y—ÅÖM¶ÝYÎ]a–­¡LñÞÆxĨÛ*Æö$è0>·„2#dmfKƒ6l‡ttÛ q\yŸ2ñ¹±Ÿs——’ù,a?áÍ…2Þ‡Åýî±ÉÖûÀþ»v@P pËxæØÀaœŸü¸¤×ŽÇMf)N ö§"ü8aùxqïõ‡˨ˎ lÁzR  À§õ™½ÒíÉØ…æsñ¶-lÏ®ÉýÔîÜ©(>»XòâøñÙ ÛÏ-–5Si!¿-œ·ëå>Û¢uS•^š€ÁÑ‹b ;ÉÆÃ…Ÿ_F ýUÜ”`?øžc5cÉü˜ âÜÛ[­á¥õÇwæ´V@%Ä<9Oc9ç×nÙ¶k£m{Ð#Ms£(Ç®m»3Ïrö›ÛŽs\˜þy•nì3/ól¸õá>œ¿3Œ­þ æB÷¬—r|ÜøæwA²ÿ]cœs2öra¿RŸsìš|öÌŸŸŸÉwà•{­+Y ?-¦ï“³U+…Ü2Ãí™Ä¸·´¸•ì1ä.øß·˜|¤¶ã¹d{sá†9î¦Ü²íçÌ¢‹ƒ{lZúò a‰ù®™¾O”Û¶ÏÚ®‡Ûí³J2®ÄnˆÛ}Åç:ñÙSg?Ï·²ßÎɮϘó$Oã4çd\Ü{=ù½Uí‡ð¾ºßawî †9:ÃÜ2Ãa=²N2e{_Âåi¾›E.&ÖiöƺªÌUâ˜eíeUCˆµïφd69Kö¨xvÎv’7cw:=Û1ÇѶœ\O9™Îo¾·íó°¬ÈE“`l×l¿ô8³çÛ=ƒ!Åv[ÓóÙ",6žD„c}†ç\Æß¶ÏÕ–Ê´¥>Ýñ„¿ð’}¯¹¸‡wú5"éÕö{lj77Þ'Ü¡3ÌU¼)é3Ç.ˆaž,è s§wž×ø‹úæBÝ3\Ü{ã!G´-æX®&Õîz(äîöLý|/ÀbÙBì²aÏ®‡â÷°~q±U̾Îâ%Ø+¹½¾7? í«[{IìWuê±gÖ_öm¬jw…íf¢L¡½™_ì”âç3m® Tc,ÎwBb>Îcsœæì¶b5swÅ.W¾šœf+Wæ&šö%¿/7%Æ+ûföµ÷™Eb{º‚í«ÎÚÚŽ9 ¶{øÁ¬;öb]ALü^Èž°Ù§ÞuñûÍútã‰]c;Ç~W5[Æö´{ñÖ)ÆV’M>MÌùnûãó÷°õ9Ý_†‹»o¨=u«Lš»Ãœ"†¹ŠOœŸ\;x¸<{ìàZÐæ ú_ȯ’J•TT«­…_Æn|ÎwÏìxx9ŸöÞ˜™ïìw4sß/UºsúܶqÜJÂÎ0kaô*èâ #&YB\&uáË*é‘oˆSöìUc¯¥ ‹m̵¥ð}ˆz¡z¾¬Bšjd­`Þ‹Iš=™XV)N·'Ë,|©FHÓö½Ø3y1 EScüW¿ŸRGÀÍ—µ†Ak±{5Ê©±›D¸Ríx¸·®®ÌóMæŒ/#\IE+vo1V3: -gém9AŽé8a÷—4Rº>M‘aór¥ÝóºRÌqì8n2§­3ÌÞ_ÖO ŠÛû‡Ý¦á:,ØBö’V«ø9n}ø,u €íTÐ×Ka~¾¾„õ£ˆ?šOëK¸¾¬ˆöF!yRü^BÀë²z·eŠGΧÏÍœGv™mÇ}ÅÜ›ýÏy 921¥â]#î˜ÿhÛ̱χ{&ãýn¼ñ(ˆ1Ï…±Ý¿wúóž«á§é†{ †¸…ð'ãž<^–ôÍÇâ¦â ƒMWÓð£]¬uérqïõGW/”®E2RªéŠRÖŽ­ë‰Tz˜ÞcÄ\_šÍ´kÍ®)$W‘JëÝâ;¦,×—ÀÆŒí0ÝÇÔ­f™WM¬½£ÌÚ­fÌ{•é“u¿iöÜ~jØO ûY»ïs¾.?Ýž÷ß>ÇýŒû0EËý¸ÉÕd†­æ­×§dÖÜyw-ª1¾ÝIÆún⻯©‰°ÆX—gh£Î.Õ¾ñj”¶¯€0>H$®S Ä9%³]Ûm­¶m»µ³íçØ¸¯üȾ1sFèQ±F8 7J‹}¤cìxœ½¬mû¹Ùj³7„2.¾ÒCžb¶ã}†Í­ý¸ñcô9±{·B™èS©Ï9öž3s†#ÂÜv,ïm IDAT.”1ùÞáâÞ»ÍågM®/ä鋈a®à+’>}ì àáƒàɃ¿p¾ÃÒ¦)Fš(Bæ}Mª“»ã‘u†Y(«ˆá:ba-ªF¼±'&‘fqʰ· ^&{ê…Üc~´§>¿ÛeU’dBšîß O4Ž!Úëû1¾4‰†š½u?©ð¥ Ž‚½ºžÁšû~eØŽ?Q-cãÚ$éº ÈŽ;ኊ/pïã`? WÒùV¨‘ rìü:ÇÙÎ>‹UZº»oeöudZGûŒ8ÂÇÅ-aŽ3" '½p¶}|»â5»¶#³mçô›ÍM±j‹-Û~Î,ô1Ì‚–(NÉ;šØN'Vè1„(³íá³ôg¨Ý™N¢¹ÓŒ%صÇisâ–rŸ=uÖîÆíÓE+9™|Ú}Æœ'y§9çà*.î.L'°ëïë<¤ê³Ó;ˆa®àSçg'ï;xø †xò@ ³Ã7ÜyÎÿ‹×ÁØFMrqïщaœ8$O¼˜C¦Ì:º˜Øð›Àà _öìUgO½¶ºÏ_»× qˆiê¡U£!Né"‰¶Ÿ:ºÌx{2þŒ0¨qÌä?íØ½Ž2Ré{my_íµÜ›knMHSZGû¯¶»­”þFclK¸2D2c~qÓ76MÄÓ£ö‹[Öoö)NõÛåÞV_´®³aBDaoùhuaŒ‘MqK)$ëÚu§~ˆ¶‡Ša\²Šc;©ۺ¶œ.ªˆ¶‡Øb3îuN1s]ç%¢ »® “c\ÓxÚEEáóê3†j·em›S»Z„c}ªø?+”ñ>W[6+%øp>ÝÑזּF!^ccÚbÜÇû-Lø“ðŒNN>ªW_{K£¼©'ŒŠ¢ÑU%Uµ½ûå÷ôÆ—ÞÑ _÷5$¾RÔ;ÀØ.&N—3 _bW”V¼í;ÀìÙÛ“¸Ž-£cÊèÐbD6«È%ëÓýot€iq\G™µmËÜ-§ÅÚì©o¨˜óZì­³kØO û©a?“hgu±»W£8Z=ú³\waþ‰íÁŽÑ(\¹nw–QÖ¸ læƒÈ¦Îó—³ô¶¦N2k¨5¸Êå/Û´õ PŒHaL)]¤1Òcò”Ú¶öÛtg`,Þ²]‚m·4(,Šýضñ4©EØ[n^x²þã'M¨aÆ>ÇmdB+|q˜àSÊÆ»ÆvÏêü*¡Ìð9çdø4¶BN”ú4ëÍ-’Ù–‰£}÷M¶í½sK72Û±iÅvJðç¾ÐÜ»o <4t§?}‘¸¦kWØ1±jŠ5)Ÿö|™õÍž’õsáº_ïD¡¨}ßžßÏ2Þ.¸‹éÈ8Ÿ1àøñàW}ùüc2çŸÚ~KˆÓÅoÈ4/—;¯8w4ª1ûŠ9Hó•å¶]ÚÉÔßClgy‹¶ÃœÍsös¶lA(¶Ó¿#îípG¡‡M¹ ×? Ÿ Ϧ6lX¼m¹˜ÍšÄö–8gÞO¸E£ùµ²¶Ççý»[/îeÝ©û~>÷s ^m¿o2q¦ý…UÍó;íb˜=Þ“ô©c†g܈avÅÁUªE*URYj‡ûû æÕÇ^½÷æcˆ²¨”ªª¢²ÆYÊ(|^Â,j3TkwÙFQ-ë5U•uŸëî¤Ú ¶—‘²îíp{)ëó£=uµ¬ûhûé¾Öý¬ÕçÝ¿ñ5®«ç£Ùëûé…ý6W#w‹½Õ‡‰µÅÞíÕ`¯Ö~=ïk@Ív*óÜպóŽS\Ù{lÉyuc’õГÚOÆ$§åZÁ~œp¬¶C’‰©å¢ÏXÖÔ´cÅüIys‹Z“É;â–„¹ cú•âgÛ®¶bÓö*84î°n²íÎ77&¡‡œpCÖÍ– ¦GA‡ü¸óaSãBND ¾ŠúÌ–;>fŸþL@SdraãìãÆn<Öÿœ‰sœÏ(¬ Gí}ÎB™ì™È¸¼¬zõ æ÷Mpê<»ÂTéÙgŸÑ×}ýGsötò#çg'_>vðh@ ðdòò±¸Éœ¾øÂò¦+)ü{§ƒID1w_ä1Ž‚ñ&xP/Î^DëÏf+þNÅ$FÌÑFœ¢ìÕa¯!M»¶Ä·Î¯«.Y=¶ø˜d¢ÈÚ ûéö4b‘Mâ”è?íØ½7_MûT]±½É™¼ ÇíC~îß(±êEÆš®35*EÊ*’±×ŒThR–ßN¸âc±Ú5Õ|ó gcZ˜Íñi^w= ¡8È»è$Ýyìœâm—bì:Ûm­¶mÛ˜6moÄ}¥àGö™ãESg%íthéûòn2щý…1Ê|–_ñ¶g¡LbÛÄ›íÇǘCNìÞ­P&útë»Ï9öÙ§Êløt¢—pK*„‘¤/^¼¥÷ß¿ÜQI^ã»Âœ|Ãs×ò÷‚pàƒàÉä“’Þ—ôcr9=}^¦g‰F t³B˜þ¾ê•»o<–8KѪeXÞô.&ëµÖ±ÅŠIjW6Å)]ø²Ú+f×W‰Il·š.1Y4"›ºÆ5w€Ù²gÒ-ßfÄn|™0¶ûMwaºß4!¾T“W×Q¦]ûI;ʨ¯½gbw:±‹M†ëý2 WRŠ97{Í Wš>ÉÆêc*juö¾“ÌäŒkæäÖÎ0÷[y_[k˜àÓ* ZÜý†4 {où9[â–¡†HÖ©Ù-]@á×ÛÅÇíû¶·Ö•0g]˜-„íØ..ýÙwãe·B!Dñ>¼Ïuf¡ŒáÌB™Ä¶Í€ÛÏØ{&”i>F,yÌñö颕$'WúŒ9—· hÚ“wÀEö»ÆcœF&yúâó‚]ÃÜbž9vp}ÎÏNÞ‘ô#ÇŽã¦rúâóIq5ïanZ üˆ˜:¸bø¹Û-:Ÿ ½=[Ø~ýõã³_‹õ]Ì›ëM‘ü^<é5S||õtKì–‘ÇÚr¯$ö-{Éé™W+˜÷ .Å.õó½ØcøžÑ·«ø7]²wçg±níKZŠò—W¯«þgçZ-ŒÍÍ^]PٞóŸ)ïÙ¾cެí,ïֶœÛ»‚3§˜¹î™ÓxÆwYgî³1®i<í¢²á3†:?C!]ñyÛ°m}ÆÛեϮéã«-›•|8ŸîèÍ÷¡Üw@÷´Ÿî3Ä’äå:,]ÈÚï&ó‹Èv…q?ýØ"ü„è¢p‹¡3 À“ËK’þÙcq¹Ó „—n ½Šyi"Évézw˜‹{¯?¶X{±w«‡.kÇÓ¥u€Å‰ÜV{GÓÅ6Á)f¯yWkoíüº²TÓ•e²gºÕ´Ž-Kq¹ñ%³Ÿ:ºÌØ0딃;ÀŒ\ _£ûMë`³Äšw€Ù²7r—w‡éÛ?îpKµÝaŠ©}O:ɘ›ÂœJŸ_$Õ:ϾƵÞI&ë>cfµó¨a¼Uaf²-jÜCTY´%LYæÌ¢¢õSPX‚BÎÀX¼e»ÛniPX8SbÛÆÓ·(Ü0&¼ðdýÇ N4 Ñ>Çml eì¾»Ä|n÷Ã$Î)‰]k;Ƴ~–‰OÅÛ¯ñÅœ ŸÆVȉõ1Af½¹E2Û2qô$>§ûë.ë\”Uw½VéôÅ®íó)¢Júıƒ€Gaž\ø‹ç¼ðÂGôá?ëÅ[Ýaê<öÅ‹·ôþ{—<ÎÁS”’Ûbö¹àÛÛ»¢ýJ{¾0}+ž©¾$Eã¡°<-ØvÆOÍëcazÈ’XGa¿ÝÛ\ˆ?®û.抭øï{tÂ9›Òû¾7{ÐÅMñóû¢õåænÍ?4Ö’Ìꌼã˯u݈ÝúÜÞã¼shëÒš{ê¾l+ØNϲÙ×´nÊ{°='é¸Y9=Öݺ¿ÞÑ$Æ_iÏÄ¢.“ÿLô£t¯š®ç9Ë®ÍEùã¬Ö ˜—=Øá°‹?b}r3Xm~›Œ—»G|åþV¬%ÆdòåER½4¯z—Y3ÅnÃÏrs·û”“ClÛá-ÛÉ3ž‰[\Ü1¦þ1^ù£ÐxFæû0 jü~Q(~Ïä¶G,Þ–\ÌfB¼k|Åä~{?þNϦ‚mYÛŠãóþÝ­gö3Î!e‚Ïž£îóþ¸¸k~ÏtíKÇ‚ ³M9=¥3Ìü7À-1 À“Ë'äe`8}q)žÿº¾í302¥P¤üÅß¡‹I/Ê…×{â”Q8ž£K£è»_Å®MŠØcáy:–‰J¶ìÙÂô¹ð|*ºŸb-áú\¨îŠÿcq»BòûÐNîšÅV¬Úovz ~;a3ÁÎuIÏç‡s³ó‹›Ö¸›+‹uc¾fAN•F‡—´;L¿lt…Y,$qÿn>&›–+Å-Y>RÛñ&Êl“…µIÜ!—“m3ljÇÒ{Oî–‘ucžqÿüy!™»çƒOÎôÌ®sm<[>Õm›˜“´Ût ŸÆV³”»ïwzÓ÷Œµížá$ßͶ÷·‘÷™|_Åc?‹»olt…ћĜcÒé‹Ïߟ㧺çÜrÃ<¡œŸ¼.é;Ž›ÊT$|Íî0[ #…‚ó©0ýzbŽâìÙ¢î«Å$i× Íñx{¶Ø=âø"ù\Üâ_¹ GÉí\ÛëžcÅ{¹‹±†“ó¯^øï¨Ù‹ó‹ûXÜ^¼`¤p¾w;ÉLUúñ¦‘Ÿk• ao‹ fëE1É+Í™‰aÚß–p¦!¿áÜY¤y³.¯²mæÄÜ9Ó‰ð(ž›½»«Ð…Dã^œ„'æ~²[pãÆ¶ÍCÞ\Æg ño{l­ŸñYùgk<{!fwäfïÍg´]ì¸Â~æØgŸF(“ä{Þ¿%§[ëôß3SWûÀÄ®0ãIºsŠf:ÃÜrž=vð@¼$éç;ˆ›ÈÓç—ÂâR´¯?kÒURY¯µ¹ëÇWî¾þØcî…Új¡–U‚PTÖ8K«îÛXöUÖ}ö­•¾ãµP¼®¥Þ֞ƘñU£½ž¶õZmöš3™ù#—e-â®j©-*Õï§ÖÚµe Üù¯-¾‘—¶Ÿf¯Ù—dæ7ÿÑžÍÏkŒÝÞ"m¯=÷Õæ¶@5Bâ‹ØÃá.ëBC§j«éÛµ0fî¯Õ|~;m{­¨˜},Ŭ_ ðUuYÛ=t}–õChàÔvs]a`E~Ζ¸e¨!’ujvKPøuÁ¶³û¶§u=n?gz˜-„íL‚°DXâ…2Ñö,Hë©êŸÛ¹ÏBk{Ê$¶mLÞ²®Krñ…ø7bŽ·O­$9¹Êç”sgwÜ+=&î¸&_~ç«zëõwÖO×ï óÜóÖG>òÁûöÿ€à–Cg€'Š=7851¿ÆZÿPdœu‡9Fg˜…PÐÝ®Üw\i×åæ—¼@ÜÌO»-(ƒÛk¦PÜù/>[  ê§® áZ™®y;³½°×ôs+Ú>\ìvoùú©XßžYR©¿ÝEr{μ³â¦øùá üÜl~ô»kIæ«,Mïs½×ÒV怽ïÆö“í¿­ ÷à|Áv–+k[aÎŽí]Á™SÌÜéy¢‹Ò×Ùgbc¼»ö¶µã3†:?ë!]ñYÛ°m}¦1Ú½”v?DAL™|*õéŽÞï%±í¾²ï—Ûá#æå~yõÞ!]aÚõ*?ÙÿŽƒ‰Ÿ8?;yõØAÀ£…Î0O6ˆa68=}ayc»Ã˜.ëE?fºÃ\¡3ŒÔŠ«—xÛÛV¬m;À,=:êèpÒ:›lt€‘Ú6GßE®LïʲÑFZ»¼{µÖëÊâ;À{­ÁMÛO]×´ýÖuG¦ŒÝOmÍRÊðe÷Þ}ÆîÕ6êw‚‰µu€±¹¯ëú–yõÏ=Ø–esš¶3̸6¢0ók˜ß÷¦ácìf­›O:ºô·£'Lì$3Ö‡ñ²ÑIfõt9š] WÆŸ‰pÜ…Á$n1—7Å-™âPÛ%ØvK}Ì^y”ضñ´3/~NnF1Ö9ÁI"DYÖ'B±`{ølâŽ(º™;ŸXŸ.þh×ÚŽñ¬Ÿ'Ÿn?þXÝqL>­f#úpŸí÷Áx3ÛcÜä ñyý'Á3~Çd]a”~'ØëˆavyùØÀ£1 À“ ŸÜyñyYE„G85D²×UØf‰c{uG­F¢¦uHÄ$FÌ!õbîê„/«½µx}±g|mˆIfáK‡hʬ¾!/r/=ÿMNÒ®‘ÏðUºòeýa„+V´ÓOÔˆvš¦íUf¯Ýÿdo ¨KŽvr×bV_m‹×˜Å¶»Í¸Ù¾IQ˜¯¶¹©Ý…+ZsäÖØ$oÄj;¿ã¹ñ²œëRÝ~ì ‘(!6Å-ó:iÌñâ–kÚV°Š[š}Mëìô2 sq…]Œuvå$: ÂÕ®ÆXŸ»B™–I(#kc˧ùîHìÊØ×|.lW¥>ýÑv[ y5ñm &ÑŽ9c›«élܹ_ŸWî¾±Ó¦öóØòó΋ˆav@( ðð̱€ûçüìäI?yì8n"wNŸŸŠø}í«3Lc*Üv…Ù¡ˆ[%)Üᦰ¿ÕöÏë‹[_ÂzoÏÇ£i½Rÿv}+„Ÿ õã~Jðo‹ÑÛ³ìÚTlŸðïç.ÆNμÌÃBz?¿Øëüiln [ÅÝ-Ρ5Ì/ek\Öñª×xÙ5û"o»”åÆÄ'?çjÛJÖ•`;™säl·sÚˆ© ]UâvÚ³ û=Ž÷Ùf½MM|.F&ÃøŽ8GÁnF4¯Qˆw}>ŠÉýö~ü“0=ûÁ¶ŠÝ{û—÷ß=ýpßѧL¾Ã]uß,¿cî¯+ŒjÕé‹/<¤Hn%ˆažè ðä󒤟sì nüàôµ_÷Q}é‹o÷ªçÑídé²×æËo¿«·Þø²ž{á#=vÉj/ášN)kܽ+K¯Á/’l“×F˾‹)£ãG/\—ñaíµÔ)ïc»²´.*ÝÞª;*E½c‹ÛO­&¾5pëýÜ÷kºçÌödæ0ÞžÍÏëû¸CæŽ2#÷£;Œí·Ræn+¥ÿ³® }V²Ž.NTᬇî0MØ5Ïo§m¯•µ÷â1"šjªñï·;LP£僛h®·{*ʶ„3vm´m”VáÄB%±-mÆbJÅE#âID²¤%t…1ÞŠ‰±È¯uÂ’(èP)Á‡Mñ&[>lOâ’âÇý^Œ­f)·B;LBkÛæDI¾›m?>ïeøœ…2ӱߟ_»mu…ÉÆÌ3xzJg˜Ã<Ðàɇ¢Ï N_4ÅÂ÷ÑæÕ{o<ò÷ …Ûý³-`Ï‹¿åæÇõ¦ƒK·7¦OÅîòÅà±(}©‘ßéŠÉ·º³¸‚ó䚦kAHÆZ|,òqøØí¾K°g¯›"~{f³Â`ŒM‚ÉM4~­3¿ÔÏ1ænÍ~·b ÿ±ã‹xMkd|L1Jœnþ÷×\Übæd{ÎË’sŸÃ)×ɽåžÉ=Ÿ“ðÄÞ߯ú|ßûÏñþU泄øŠ·=¶ÖîÏDtSÂxØócvGnöÞ|FÛÅŽ+ìgŽ}ÚKé;Ùôé÷ãoÉéÖºOl÷±´+Œ‹]a$Ñf›ÏŸŸü̱ƒ€Gb€'Ÿ—ÀM¥ÿå|ÛÑÂvê˜þ ¿/:~åîqÅ0Qè1 È“âóX\‹Çƒ´<ì;_AL‹Ü·‹Þó‚ù-q‰·g‹Ï· ð7ÖÇbö—üZ>Ççnä,žÅH\?AóšvÝKViŸÏŸE6ëØ–ÈeK$bì´ÜÆù%ÄTU&aËå¯I cãu>¬ÈÀÏéqg{t9¹pyn—vr2Ù¶&·mÏyo¶ýœYta¶¶3ݧ‰°Ä>© C™]ës]Ód.¶ÇøØnsÏ@ôâ–‹/Ä?­w§ó™çdÏç8cËÙ ù9p÷Àrq÷õûî #±'Xøo"€§„g<0t†ÙàÎi(®u­z®R5ÜURicUR‘ju¹ÿXôâó5¶¥D»ªÖ¢RªÖh¥Úо—‘²îµôBjõbîªÚçv{k:ÖÕÎ×R¿ØécÝvQ­‹½ªjb1¾zìk(Õìk͵µ]_"{íûZ®¾Â~ªßêØO]×wMFË«ÝÏdoy-¾¯µúü{m—kö${6}Q{1?ª›=t[Éü~¨Í—ï¾ZðvLÀj§d§$ó%ÕPŒ£q&Ò±:\o P¬ú¡½iS†ŠÁ_*nùlÛÚoë‚mcÿJQŽà !ÇwqsŠ™kEa‹ù(öš¶<îù8Þ½yÛÊ|6_!T+–qÂ’¾‹DÌ–ìgöb´{ÉD+ƶõéâ7¶í‘^%Â)ÆÆÖ~bnç¼è¡P«ôêÞìïÇ…õŸ+ºÂ|à™¢¯?yîásû࿉žè ð„s~vòÓ’î;Ž›Èé‹/ŒJâûèsñùãv†Ì…ò£P;tGh¥Þ¶ÛÉËÞÛâú¹È}.Ê/¹½âãñÅþ¡ÀÞÚ6ë{q{V¤îŠÙ7 Ü]!|(Î?pýÔ…Gy!þ\$ïsßÎ̽ìC¥ý(°·kF^l§±LÔ¡¶owø±ä 7Y¿Ì]^öºÃdsklù8ݾzÆå\…àó \m{:‹,{y6¶m<ÓÙûņk›žwÏ*{šä¾ ¶‡Os[ụÝÅs,‰]k;Æ£ðì4[n?Æ®ñ9?ƒÁV³}¸Ï³mmØã&=˜a{º¿€/½ú–Þ{÷½õÓõ»ÂœÜyNÏ<óðâ¹e †xJ 3 Àíà%I¿üØAÜ4N_|a¼Fw˜‹»_z|Áî0ŠÔëöèÊÒ:¦ôÞ }KëXi×–ŸvË®ÃIèÓ,ÈøòedR˜w€±ÝjZW–no­õ.EãšÙïÀ"ÓÐdµWW;m?I»ŸZÃ~ªÏO»Þö£rW/Éw«é›±'qHw–þO;ði‡3ÎÊu‡©ÛóG\ãZYsà×™òÎ0×¢wõ Š„î³«+†JÁÅ_†hÃ*œå>m+ضëÜ’â—yUHOøÜ&NŒè¢˜uvå$: Ân{œ :®Ê„´LBY[>Gº3»26Ƶ ãS©O´Nè³#”™öS¼í6_Ñþ”'+|zpZ×±ûé £Zuzšünƒb€§:ÃÜ^>v7‘;§Ï/oíŠ/îÞ”Î0 ®0½|›Btù"ïVïu¡D·g ÀGÑ{,ÒöBa¹‰e»L³§©x«;‹+ðO®iº–¬Ÿbõ…ùJbu¾¤t½ßûÈÕ8°¢¹;‹Æ˜WUÈMê¹w‰5cóü>næ;%Ú¾÷;ÉßåE¾ÜšÄo÷cT²Ÿ˜§ÓÔ¶’u1WÉ3>Ûn¹Íãf’çÏÏ‹üý“?3¹pÆÚßáFégkÇwÄ9 v›c[!¾éÙ0¹Ÿ¿Š‹ÙæÄƯ`»}çäãqÿ!çÆö8©ù{ÃÚ–Éw¸« ãwËõ»ÂHæwD^;?;Ðhî IDATù챃€Çanü%ô„ÓŸï;Sw;iŒ]|þõÇï­XÝv€Y~¬cë~–>&y­×–bxÓQfmÑÒVû®(r`d:Àô¬™0Ré`z4µúâüýbϜк¾íuØ[}Äý˜î7­Mž;ST?¬õX½½5-±ök«½¥–ݱۛЌëÉö†)¶­Ì4D|ÅüèלC×j>¿ùªÕ<'×n³®ªˆð\zC*nіŪ¢m«²omÞ»<"ÆØ)%¬ÛˆÛé¾è"nc‘E+®е­ì²µ=2çãÙò©`{—?Þ2Å,Ýg >œÏ`ÛÅó— ÷D;îv°1wŸ¹Àîarq÷õƒ™Ó‡õç鋈a6@ ðàv€&ák¿î£úàŸÑWß»˜.„qoWUƒǼú…7õþû—úÀnFsÝ^¬ÝÅ#«ð¥‹Ct€8¥]_l51‡Œ˜£ iš|ÆŠIÔÅ!ceˆljƒ ©E+¦ÏÄ$6–&Äö̱) _Ö}Y{uÝGÛOõûY´&w5짆ýLöÖ×ÂþZƒØf-T¹måùV¸bÇ4 f–½¶“yuóûB—v’v¼ûê9òk¬/ȱóËêÚ s´OÌLb› @±ê™ÏFÀ`.Œ}¶mÛuýã!¶Ël»$qÇd!ÊØVÄ4qˆnHV¸áBq!o :œ0fËg ño{lÍÇmouQ)ÑgŒÙ¦.ŠVd>Ÿ³heÎKº+”Ùðé÷ãoLJ-„‘1L¿xAÌvWUéôÅ~P·þ[à)âfTrÀq~vò%}éØqÜ4J‘îœ>Ÿw±èEÆù_åW•.//õÅWÞ|äq^­Âô¤½îI!¸/ëK_¯n/)^—‚¿PÜﮯWMáüTØŠÔc¡üTðnò¢k“ØÀ%…ñ½À>ìÕÆÑc7±š3s¥ûÖnT l¬)öã:‹bnª‰7ü!äÝW’7¦Ôº¾´¾ê/…¹’‰ßŠ |=/1&ŘBü&—%ÎÉr>ÙÖA¶§u=e~Î,ºð©uÛ1÷Ý2m–¤Ï„}Ž•Ùµ>×xÚݹa{ŒÛ{¶mÓù8p?Jc´·hx–ƒ E‰Ïéè&Ÿfï-Nc;>œWz×±(~Yìt…‘êò{ 2Ãø’B»ñU´×EÅÆ²Ñ=îb„Ñ%Ãñû¼ {67¹¸¡‹ Ì^Ûæî,cQ¨áÔ&¾Pµ?\øùeÚ_ÅM öƒï)V•«;ÁÐ)fŠ¥Ç>Î9W"ô›Íß|^¥²aÛäÊîËÚŽ7þ”cûŠ|ûçpX™ž ³_?~uç›—®î³í9…¹g%ÅÛö)JâQ»—ƒO³g×øœ®cKÆFôá>϶çñð¾/â9äÏÆÃáâóo(ëF&]Õfy‹&å-IÿØAÀããÙc Ä0 §/¾ Z¥Rª¤¢õÃø)óv² J*uù þ7²\¤÷RÂ]Uj‘JUUQQµ[]æ¬e]Xköª¤RÔVË^[}ÕÄ—V_ª#6©¨¬¾z4µº¢uÕ2ÎÆÙS÷7Û3ÇdÖ—58oOýp@í±÷K2û±¾ä}-EókΜ½5–õ\úµÕÞ¢¯Š]QdV™@úŒjêä‹ï"ÑMŒ’};;ýg]5ÆTýüªªËËü¾Ñ…Sn ÅE lŠxì’òm·{(ÌÙÎL¶5­Û³mÅTNbD!NÐ1¶êÍáF·mòâÆ/vœLi B™I¸6ù4ÏMŒ¹ûŒâ» ãÓÎ>ç¸û‘FAŒ¼ànk?ã–gìròý ÷úï~å=½þÚÛë'/À¬‰ø¥³Ž}ÍG?¨>÷¡GÜ“Í'ÎÏN.<>ÃÜ^>v7‘o8}þ=©>+#q4±†}È<.>SÅ0ëÏIøÅ!R&N±â–f«‰9dÄu-o­˜D]btDVdÓÅ CjÑD™˜ÄÇ2b-½P|¹^ûÞŒ8¥{]c²î£®ùi":öÓ}ÙýÔ°ŸºæÅІ4„AÞé…ëv?RËe+t7cSñ{Y÷j63NÕw02¶F"›/?^ÜÒyó‚õ¼<¥u‘ñ7Ä ^1"éº`ÁJ/¬m%ëìÚ Úwl—ݸ­m/º˜EMŠ…2iw•>Û¬·©1 5ñÇŒt$O\,Á®‹9Äldâ+.q[BN\üÁvÛO>÷orò4Njε­$ߊWïnw…YÞ×ü§–“çÞ•„fA0ÀSÆ3Ç?*éí+g=]|üoýß?öŸH¡ˆ÷¯ïû÷?ôWTŸü¡t>[ÚÕ¹hÝ_Ÿ ï§bþi½)vïöL!¹ûlŠêXï êå écÚ Ã×Û¼hçÚÞúø³ÛS¸¦`GÁNVtÕ…yë’µ^ËÖhûÛùÅN)~þ0ÓæÚ@5Æâ|\UÑe]º ÝÏë²V]NÝqŠq‘ûÏ(îï{)vN)šr|{ے󖽸͜«DóóeÜL÷}¸Ç²çÝØqâ`ÛÜ=ó=øÔ†í)5áví{vñ ÛîûÁœ›³íbùó9±ûq>K/šö2|ægö(xóõ/ëû¿ý´ÑÆ’ü®úü?úâ÷IúÍ’n¦Róx xÊ@ pK8?;¹”ôwŽÇ áG$ýçg'¿ò?ü?èºhdB˜‹‘G‘ò›_zG¿÷7}¾ûÿu½ÿþåc þP¼àÂgB©ÀÞÅÏëµaÇ™ÇÂ}uÝB®ø¢ô-1Ié{ós!Lfo÷[!À¶hÈ®…úV¸°ŸŸ<÷1/êcê(ðèCeµ_ü”’Ì·vÂübƒËæ;aÇ”8¿¬.ÏÈý¼T5º¥ûñûö¾7âÜÛ¿Ûcû8ö¶m;ÉWv‰m?Ù±õž6B ÙqwxËþÙõ)ËîéÔg¸WC*Ì-ãÉ…gý‹Ï¥yv]Ì6uñ93B™¸Ÿ-¡LŒÞÊløôûñ·ãtk=$>ówÿ‘¾ý×~‡^úKºÂìý~jCË›ËËËÏžŸü^Iß$é•t³~1:ÃIn~ëòryÍ×裾'§PHöí/•þÃÅ—ígÚ·bl+Ì™ön—ù…ésŠ™»%ꂎ°e·ñ¦{¿ÙŠ>—YS¨Ùý¯2æFÛ™€&÷ibžöã÷¾çS.>ß§{IlïŽwŸ>·%Ä>¢À_zG¿ï¿þ^}×þkzÿ½ÖÀeþݲ ×Ù@è ³®ùI;åüìä¥ó³“IÒ·JþÚSħÎÏN¾zì àñ‚àvñ4v†ù>I¿ðüìä¿8?;¹HgT}n·;LŸ»ÃÄbeéÍ׿¬ß÷ßüYýé?ôý¦¸ù¸ŒÂn_À>¸‡"q÷9/f÷…ð¾˜>ÿ™Ïñâ=;Y,[¢±×2í5³ç ú],Šb…íõ[Ýs¢bÎýˆyñ3Wã§‚™>×Î×Ûº˜}Æ ¥Å½Jˆ©)l·ør]b\|ãÞÍ•m“&–(pé9³Ãc·òs?‰g¢m?ÇæÈ=3ÆŠ»Çî?;ï½~'b¬˜®î³í9¿û^¶„2Á¶º$ϺÚý—Œ‡gÇe¯h¾VŒ-чû<ÛžÇã÷–ÿ^Œçn’æG?ñSúö_÷úÄþÃudî:&]Ý&ió¹ÌßùÙÉwIú§%}LÒ;ûÈÓ*xªA p»ø{’Þ=v‰(éß>?;ùeçg'ŸºbîR<ìêŒè3.qÌ_úîÖïü ß©W~æõûßÁCe[̱\5Eë½ÐÜŽ»¢s[HÖ˪Ïz޲aÏê‚8 ¬_\lÞ¯óm~(Ö—õìõý$Åñ[dd÷íe±[1@’{{fýeßFÕ@8gSþß÷dç;¥øùÃL›ë}oΗzw—Z¥Ë_N SëAqùK;{9q9Œ¶Cn\.£í$ß&OѶ½ÿ¬8ÄÞ!<çÓÞsV¸Ñm›¼¸q{Ïo×½bÚ6ž›mŸÞnHÇzÍï}Oœ£Ôç÷xVÍß–ðlj÷ÖùS^’|OÚ}R/«þüwü~÷õÝzõÞ›ë`¿ê–5ùý#3uZ³üLÅ0’t~vòÎùÙÉo×"Šù®ÚÈ“ÅÓ(xêA p‹8?;yWÒß=v˜7%ý·’~ÁùÙÉŸ=lIýÜV§—yj(Rž ‘Ç´ðéŸÑ·ÿ‡Bÿï_û̵7ñ°ÙsLEó¦¨?›£²·>³7ŠÕ¯)øJ…'³ðÅÊ»"ö¸¾„ë¡HþàõWÇÓŠë÷ó“_‹yQÓ0:É%ÚDzü‚=ÈI¸ÒæúùÅæ÷—9»™ª!hi/]ñªá¥*»a¾½Yl<&¬’ìӜ˴—»dN);¶“|÷µþ\¼èb¾d„Ó3Çûl¼þ92kÆlÿü*ˆD츻î¨C<ñYœ„2þ;Ç=öDœÏ9m?Š>íؼŸÖö8á9Övÿn°÷âCàK¯¾­ÿþ7}¯¾çù]^¶öHRüýáßo 3«×È,v.UõÓWÅq~vò“çg'ß*é_”ôÃ÷µ™' Ä0O!ˆan/;€GD•ô’¾éüìä÷œŸ|å+?—‰Y6»ÃLB˜†Yûö_Öüöÿ]â÷ŸÞûêûרÎÃÇŠ9|A»- ß*œ÷ëw öƒ=WØ.[œ¾- ±…ý±ß‹M6„aÎ&x!ŽÓ\|?îá€/²y1ëÖO…ý²ýmAYc‹Êc_%ãaŒY€KÈöünÒÌ/nZXcˆz—ëu…1UÏAô(Ù~Ç‹cÖõ|„¼"n™UýFçÒ#÷ؘ7 7Â1uAFvËÜ‹öþ5vœ8$ØÛŒB·Ü§6lO© ·Øô<Ÿþ{£¸õîUŒ-³÷©#Sö ‡ùþ»,ÉS<³éÌïOÿðçôíÿÁŸÐßûÛŸ•´'¨Œ‚Kð;¨Ïý™·êc_=4¦ó³“¿)éKú%ݽÎ~ž Þ“ôÉcŸg Ëçn¯Õh—1w¬¾jð_—ŸÝ^¿¾z«kËM­CHЩ&öÔýUµø‡½¶ŸZÍ5s~#ê·DÛGËKo`"“»5ŽnÏdâhV¬¯êÎeØsÅðÆÚšéåvŒc#ÕkŽÆµ(òh{ÑÖüè·øñv'ôS¼×£JCÐüMâ–~aüèªK¢Ì05_Vð“ÚJ‰uÝ$PJl;á‰WŒ»bžHV¸áBq!q/Vs˜DÐ1O©0b”Ï,sš0;7Í¢¿÷ñbÇÃzy»ù~lÆsŸ~?æhÃÑß——Uîý þÜwüêeûþY/އ5Ä({¦ú¥TLóéëÆw~vr)é~ü“¯}¤ÿNÒ·IúÐuíÜ`~ôüìäËÇàðãKñ[J)¿åØA<éÐàöñÒ±xˆü´¤_#é›ï_#½ýS¿ý/ªêWKõKé_æÏjü¯ø«þY-ógÿþ]ýÖ_ÿ§ôCõÿ»ßP˜QìÞ:›ø0¶S‰B1¹ë¸b®»¢u[PnׇÂü©øÞ ÜÏÙÎäÃì«æ'ùc~^ÜïíùBK(ìGIÁ½ýJ{~?ËxV¡Ÿ¥ö¹v~ËC¶&Œ¿êûÈç7³U%íôrÝ×°Uñ€¤i?&fŸžâ–ç ‡¶–äj+¦,oJî3oë~s¢•0ž>§=ì6?Úµ>×x³¿'”iÛži›çÓìùŠý(ÑÞæÁV°aŸ¿-Ÿá¶H|š¼&¶§{àš¼öÊ›úÝßögôgÿØ.B˜ÍßcX ˜¤Ì,¦‘TõRýU÷ëùÙÉëçg'¿YÒ?#éã÷kçr›þ›®anŸ”ô¾¤;àË’þI¿çüìä­‡aðíŸúØ÷~ôgì%}·¤_dšŸ¨lu‰‘yk:‰,ïó3ï¼ùýOû ú‘—R¿æ7þËúà‡Žñ¿,J²0R ¹õý(k»µÑ±Åw”YSP[AºéÊ’Ú[;¥LöÔ‹ÖÇühO}~5¶ËÚm¦šž)£Ø½¾ÆõÙ^ßñ¥ÍŽ2ë~l·œ5ön¯{¡[M?‚2lÞ-ÅüØîÎâ«èm!ÖIFòÝaŠïTa“³Zó½düüí Óòá,C˜Ð/\ìŠ[ºò¡ícǶ]“Ù.v™µkm7gKÐѯ;A‡ iˆCL,Nœ²þë„2™ÏeV3ˤB™`;Ðä>Í^&Ÿ~ï{>gÑŠy¯äšF.îħÛËAÌIr[]ƒOý­ŸÐÿü;ÿ¢Þxíe ‘冲NâC|>—µïHõ7¾ýSû#÷íàüìäÇ$ýÊòµMÒô †Ý#‚àÉá«Çà)ƒÿþ€[ançg'oK:^k’çÏHúùçg'¿õa aoÿÔÇ~\ªß¬ªß¿ÕéÅq¿ÅÍUú¾?ÿIý¶ÿô;õ3Ÿ{íaná |Qx(ˆ—-·Åø± ÊØõ± }Ïžœ=+È;A”¿|<«ic¯lسþBQX_ÂzŸ‹í½·¢}/d˜»züÿìy¼œE±þŸ>9Iû°¹€€¢ˆ ˆÊ:@á îŠàQQ¯Â‚àŠ *×増E@ddG@ea‘%ìÛ$d9ýûcæ}»ªºßYÎ6É9Ï÷~†™é·»ªºÞzGn¨'Ä5Ds‚Ða—‘î)X0ª—˜Ÿï_* Ö§çç/?`N†A‡/³ÆÉx•ÿ%„V© k„áðEÛ6{²ùŠòkm»„mäs¬pC„—¨§ÇaÆmK6]¹O]G(ð™Y—ÛNÙÖB—Xp’ÙFj\>ã™]á3º&Ÿ)”±>ÔwSHìÅæUæÀäÛåQvÏ¢E8÷çÃ)_?³_š ù?ñ‰.éÿ͈Nƒ)>æ^ï™3kx„0’J¹t%€M `ôÿ‡jø †%‡«z!„BÈ8ƒÿþE!„BóP C!„B!„ŒM–ÄæÐضR.íS)—)'sf³`άé_°€¬¹}“rº©ÙLƒ³þýŽúÂïqÃå÷ÿFÚĶ¡]6–§›Æµ$nˆoe¯¥˜$ùÑÔ F´Ø¤µ`¯@„`âU¬ÆŽØk&4P±t±>yzEn/øhÄf:þó<ä€ì‹ r®JºX¢dJ` ç;5-|i[|ZäÒê•ÏÏšü¡Ðg*>³›£–â–V¶¡×IeH¶hÉ{SÓ:ãºÖí÷¬F2¡†­H ¢íªºË…%mj¾Ð§¶kÒѼ¦÷žç$Æ“¢6›3i[í'öé”O]Fñó¨óí³^xv6fúTws£žÛþïDVÓä—b¿…ÇsfM¿«ûH;£R.-¬”K§XÀOÑ8UnI£ñï„ÅŸ‡½÷7õ:B!„qÆÙ½€B!„BFŠa!„B!„±É’$†yÀÞU)—®-§s›~àßÙçÜMí…0©¿ñèäoü}î|œ~âeøåÌ+0ÞÂáßH T“¸iON‘jJ—â uZ €¨aÝ4Í+‘€´‡Ðœ.×ái–‡õïÌõæXA<¾RMôÒ–Ó€ ã_ÙÓë³Ü«ü´±—¸{âD rÓÎÉ¥z¾Ir˜+ÕJÞ`ì¨Õ¸â=à¼~ù‚W4¯ùHÄ7.w,nÉòžZ'רû‰OÅÉrä SâÔ”¨& Ÿä÷2·"h<Ÿ-ÖËðeM‰çÎÖ¯ÙXŒ]™¦‚:m%ÎI‹KôÝÐ>ã\dûõ)oÜ‹ñ™×þµè÷L Úd¾»åö¿?ŒiŸû¸óÉÆ@þ¿ ƒ¥E0hõE.jiÛ.l›uR‘a…3±è"Ì‹„2|)Èh!”‰ÂN± En³@b|f²+±i‡ˆ/ølÚ Ò’Ba¹U‰¼4-X±+° «ÈGj/öžu©„Y´pçüüo¸ìÜ[õi0¢¨ã¡¢“ÄŠOƒñXsí•ñ•oî¼Ôêk”¶­Öê—WÊ¥§» vˆTÊ¥»|¨Z«Oð]댦ÿA°$  ¯,°¯÷¾Úë@!„BÆçø¤÷©¿B!„BÆ<†B!„B›ÜŽÎÛÔ{Á%6®”K_ë‘æ½nð› úÞ´ß§·Æ·¦ïŽe—[ 4-§›œÍ´Äà¿€£: ½äîaßS1Å'À„rÛÄ.›úMã~nO¯·MýÛ‹›îc{ÁŸlhšáeƒ½m¬7s2;á]¯×¹øÒF"ÖÜdÓ8•B­…ö%ïYJEà¬ssŸÃ+ìQÞh§¦èùù¢æKÍuJöÙÿÓêÕü¿(µ_}Ÿ“ûËr¢ö\Òv"‡Îg\Ú¶~fÄXmDõèú¡¨Ã¸®GûÜZAG<¥B”‘'ñ¼e¶„mõ\Ù˜#Ÿaï¹O;îä¸y í¦÷#3žö)c‘9/|| xþéWpü!çâR+„iû¿ aXMK­m¾ï°ã;pâw÷Áêk”€Ïx Z«£Z«Oê<âá¡R.]àþÀ«£í¿ (†!dñf€{ïÿØë@!„BÆgø„÷~Q¯!„B!„Ñ€bB!„B!d Ò˜ü§×q$¸À.•ri×J¹ôÀh;¯Öê«Wkõ3üÀ{äµÍÞµN9íãØp£7·hxN ÐÕ óç.À'_rúDŠ IDAT‰ÓO¼ óæ.žµ H R$I‹HRs‹„+Z4 ᡯ©ù0ëmü0Mî°öìz-ÄÉW5û§Ö;OÑÞ]/ί½fó|,¿ƒâ%olp¨…âF&ŠAúÈæÛÓOŒ“Ü–÷CE¶e,íÄ-2'byZáàLø© Û0sŒí´ÐClA¾`î)õ•ûMÔ‰šoÒ$¿Ëç*¿¿ñó§k)»ùb¯%j´`?ÉõªÔŒ-cb¼È§)‹p›sŸ"¯ ÛÉ碀[¯G~þ÷xèž§’—¬ }¡ Æ\Oý…¼˜2eùúGðÅ/“&©ƒÜ—p2€{ªµúî>LTÊ¥×+åÒLëø Oí’p !ã•«lâ½?¿×B!„ŒžFCˆüqïýÂ^C!„B!£Å0„B!„BÈØeqúÓ_p8€r¥\ºt´Wkõ¥ªµú4÷ø :¢K+-ƒ£NÜ{í»EÞx­lós⮸ӿx{èù!í­Tƒ½hæÏ®!Õ˜Þ‰8Å{NÛÓﲉ=>åB5·ÛFxõžz¥›þU¼‰Õ6ü+Ÿ¹ˆ@Š´F7ûÇÍü)qD¾¹Ëì4lI%Âú,¸p‡Å9W%==ßÜ79ß©inp'ˆ׀÷±í<žD̺ŠÍþl m«}¦òal»”m3[¹p©q’raë8dÀeÄs–ÛijÛ–Ï„|®­íX@ƒŸb/‘ϸ–‹|Æ¢ñ‰kö÷GúH‹_ìøÙ+x X¸pÎüѵøÁ´*æ¼úz$~‘šx¨èä°ôûÚ묂“¾¿Þ÷õ[…ô6ªÖêWVkõÚï`x©”KOWÊ¥ÏØÀ?FÛ§Ï!„4x¿‰üÃÞû÷:B!„qÀ?°¡÷þì^C!„B!£Mû)„B!„BYB¹ÀÇzÃ"g˜V)—F^õ‘ Z«À)Öîd~_ŸÃ>ûo‰ 7~3~ü½«ðòKsÔY#öx8ñ×è}v AŒSëºÊ›ŸŸ|ìEû¥³±ÿ—·Åwßdvp͘=|Þ´x¸füù5ïà\hønl­y­±9aO¤ÀØËûÎ}ð8¸fN´=4®5ý{ç…=äMóÖ°'Ò›Ç_°é Y¬b?¹@¡9ÖŒ5¿…b¯†Ÿ°×˜˜ÕA–ÝTî”=ŸyÊ£57ÒgYƒ>^ÏwNZË£Òc꼇„o—åCÄ™Ï %„œS(œqù塈[ÚÛF>GŠVbÑEB´"Ç‘8ù)¡‡µ+S¤mKÑŠ´Y—ÛNÙÖB—XpÒr?V@#ò¢r¢|º¼Î­O$}šò@b/6¯2&ß.²5Ï>ù2~|Ì%xägµø% «i‰µÙyc|òóÛ`âÄ mãjò!ÿªÖ꧘^)—^ìtápP)—n©Öêï°'Ö¬>šþ„)KOʶ Éȳ~ìLà G7¡Cˆ9rùEØ^s»JLâu³:Œð¥Ø^S0b„4^i"{Y¸®yÕkqŠ÷^ˆW Mr{¾¹‹üz&:ð¹=%ŽÉç ÑŽ²—å6ìÝÆžå.·grr›ßáŠè²ÏNË …40â˜ìš‚†¤ÈÆ7îÞ€×+»Á£©”ìæ$(Zà+#œV±dƒ‰[ô&rƒ…¶åÉAJ’ëð2Vt¢Å)ú”)è°>m:¤EÚ>…DÙ¶•Ï1ç>ÅÞ‘='"§­Ÿ&nå3¶í¬ÏÄ~TÎíd¾ÛïM×<€_úÌ}íõ¦^¥µ¦ëš,½ô$xȱåÖokPš~_°_µV?Àé•riÑ` †J¹äü¾Z«ÿÀ·`©Ñòoèõ¿ã2Ö8Ù{ÿH¯ƒ „BGüÕ{ÿ­^A!„B!K:}½€B!„B!#F¯EðÑJ¹´}/„0ÕZ}Õæßœ)„ÉXaÅ¥qä±»cŸý¶D_Ÿè¤î¤ºƒfjyºÀM×<ˆ£ø?<òÀ³C ¹ ¦9^4ó‡r{ „löoÝœž^oÝ[ÚÓMôEñ ·‘hö·‚Äœ¨)ß6ô§Ö·É±J±AØ[g¹×÷̨ò½ çæ>K)ƒ Îs;NMÑóóEÍ—s™˜Åc ñòæU8G‰q´š!·È½§÷ÕZ8cl›œ6öå̶šêBx65‚áRš|¶®ã<|QsÙó¡ë¨àä“|{ñ3’íÈYÛ‰ç+³òÙÕåh|ê\Èý éÓî_ä\ÜÃü9Ëâ”9ˆ„2‰|°`þ"üú{Wã'Ç^й¯ÍB˜ÄI/Ño¿§uðÛÿ¶uWÅÌì;X!Œd%?pGµVÿÐPuK¥\šS)—ް€?Œ¶ÿ&·÷È/!„B!„B!„BYL †B!„B£TÊ¥ç<>Š._0 À†•réüQô ¨Öꫵúáp †éÏ=œsØkßwcÚq{ ´Ò2I!K+!Lt:@b}Ö|ýì/㸃ÏÅ•Ü1¡'ö"›áuƒ¼n$›Ð[‰JBãz,„‰›ýE£¿mªO â†~§šáã“4ZÙ“¸i^j&´+F0¹“¾D¿)$„*þ„HAm>D3¨ *‡¼A‰bˆE6b,^ï›ek^Þ¼Z]O PTÒ󘜜#Öe÷ÍÆ×RÜ™DNE½Ë9±èB„cëf¼@(“Šeu&ì(A‹ñ¶Y 1¶í3 ógQ£">é3®YSR&'²Þ£ß“”í̧3±¸`;Ú‹½gÉznðÔ¬:ŽùÒ9¸æ¢;$D.òw>9”ͨÃ`š_v©”qì̽°Ú–/ŒglàÊj­~aµV²Â¦[*åÒ£•ri4„§ÿe÷<†B!„B!„B!dœC1 !„B!„2¶¿9Ý8Àú•réÄJ¹4o|*ªµúÎîð=+Œ„wlüfœüý}°éækªNçtc´n¨ö¶±:jžöù¥… áÌÓþŠ}1æ¼úú°ï#4ª§›Ðez+qJhrO˜Íë¹=gÖ‹æö¢w$æhQAê‹uB£Ü$5ëG±jÊ‹Ùk«õöôœ\xÑ"wN§E.cÙ@~‡M°¾T2Ì|!HqÂG˜ßúä—V¯l]xòÂþ¬`!±˜½ŠøÂrk;±çT>¶t/ë&<1mî§ E…ÆuMKÑw$ƶ«b†'ñ¬Š:V‚2µsäSÄoöS(” ¥ ]Òûi#‰ÆÅ­µå.øû•÷aúgcÖžÐpqÈe–Œ#¾½ >õùmÐß?!ÌÐÙÀ=ÕZ}fµV_n¤œQ)—®ð._ðÜ(¹¥†B!„B!„B!dœC1 !„B!„2¶éfÑ›lU)—>U)—ža_ÕZýíÕZýb—xûHû[~…)øÖQ»a¿Om… úòfçè4ü³Ä.j¢·¢™0~ëõaÚÏÂC÷>=ìûˆïU}º)_ âFwÙà¯+-Ä$É2Ç£íÉÆü´Gú“ ôÉýØæz%0 ù"/©kíD;è w6VsçÄKìÑÜ Ðü¯ç;ùµ9?³>„ïV§¿½ô©1F©ÐNÜ¢ö‘Ø¯Í =±ifޱ]„y©g"_(¡Œz$ÄZfûúYѱå5 è83Ÿržª;c7——Økñ³P´Ÿäzy¢üÙšwÆ'"Ÿ¦,yyµ>ó:ÐÌ}!Î8å*œ>ã Ì›;ß[¿û1Ùüõ×Nþþ¾x×{ÖŽâ&ø&€ªµúg«µz¼ù¤R. TÊ¥_X aê‚t÷L/þƒB!„B!„B!„,^P C!„B!„ŒmFJ ó$€O¡!„¹i„|R­ÕW¨ÖêßCã4˜]FÓ·sÀî{½ÓOØ+¯²ì ›¤;i¶~þ©WpÂaçáÒso7bš¡ïA5â'ÄQÃÁ5$ÓÓs;Œ ØAÖôßBt ¾‹½A6ß'ÄRP D20¾¤¸ ãõB´#ö“ŽÚž3ëóܺü¥…+Ùæå\©JÁD"3¦î©¼ÑÙ /Rèð¥Ä0¹Z,øŠý˜¸ZîWäÅî%² mÛµ±-kGÝ—f-Eã*$åB =dŠ…2i‰±¥R×\“­Èú ÏzÈSû{‰ööžòÅŸˆ9uK“ÏôaÇ!}êÜj»²6<ñ苘þ¥spÝ%÷ ü6g?¿i‘b±è1þϦ8ì>u3LŸ1«¬º,F™7ø€›«µúÖ£í¼R.½\)—¾`c4„ª#ÁhœzG!„B!„B!„Bsú{!„B!„BF”án‡Æßø~R¥\zu˜m·¥Z«÷ø€¬:Úþ%ëoðFœüý}ð³][oy$ À;À%Þáà½o4w{ߘ_ô.ì,Z0€³N¿÷Þñ8üÖ‡±ÌrK Ó|³¾áÏÇf}ߘçmç¾!ep®Ñ÷íòùxoÆÛC>pp¾™a/ äö²kðYÊòHá=|f;³—­ôµfžhŠwÍ}ùln'ò±Ø^ðïàò›{w>ÄâòÅž—CðŸÛ¹ñ”Ëó/!Ê-{=ž] øæz3&Wy}-»IN Ï$ Z¥’‹5ÂpøâäZµL*!²¯Ö¶ëض­Ä¢‹ô)$J¨!må>b‘˜¶+}jÛ±hÅœˆ"ö´+R”ÕQËšÌx:F“å·i«H(“á(¡Œ¼­âw@åUæÀäÛTàºKïÁÿþèZÌŸ·°1È%&›Z—ZG)¢ÑvïË-7¶6Û|ÍD£Ê»ÜP­ÕÿÀ7+åÒã£é¼R.=`×j­¾€ïØ`Íô©w„B!„B!„B!d €'ÃB!„B!c˜J¹4 ÀóÃdî﨔KGöH³-€[ü=Âd,»ìdñíñÉÏn ú ¦u£uh¼NŸ>NЧüëãÈ΃w=5,±Û¦|ÛÔ®šð…À 5'²ƒ6 õ0öÐÍzÇo›û;²'íÍô­Ö«ü´ÊÍm»Ü¡€Í·P2dwP¼¢ÛÜ‹TÅA¢”'Æäü숗Áà=‚œ(ÜC}3ÌÞÄ»·„¯y{µ¶e=E‘F¹J»à:Ô€9ÑÄÖs$P‰m‡³üÕ­ÊXŸ-bÎ}нg–\Ú§}TêÅ+øŒm;ë3µ£±ÌwÓç¼¹ púIWàŒSþ‚ù¯gB{Ú‹y· —6'~ev6|Ç›pò÷öY„0’ýÜ_­Õ®ÖêSFÛy¥\º @Àá^&³ÃB!„B!„B!„Ša!„B!„qÀP›Fk>X)—ö®”KG@ÝP­ÕתÖêç¸Àf£í¿vÝ}S;c*V]m¹Ö§ Øþjèq97%¬yñÙÙ˜qøøóY·Z“ ÉÔeÓy6bõ¶Á>oX—ïºI?·§¶a_7Ò;³>³gEêä‰dÃ}ÊžØw$ppf/±è ˆ ´0!·ã?Ê•µ'û¢c/û E.cÙŠüÛ`ƒ/›49?ó,ýJ2QL7¯($áG\Ì÷VT?d÷Ïî1ÎE"o¹A(ÛEuŸªØqgÆóÙ¢þE¨R¸‘×2B…'Ÿ$j]¦@·•Ù•µ™ˆY>#Á§Î…Ü’>íþEÎÅ=Ì÷˜Å)÷cGRù0ë?/`ú—ÎÁ߯¼E–HcÞ}‚çöÜ{suÜîXiåe°²4€cÜW­Õ÷mç•riA¥\ú€õд.¢IŠa!„B!„B!„BÅ0„B!„BÈ8`°M£Ïø€Í+åÒ5ÃOGTkõeªµúñîð±Ñöß-ë®·f~÷£xÏ{ßÚQótãrÁ)Ñ)2aÚ¢E‹pîÇ©ÿý'Ì~yîãŽNzPÍï¶A>}bŠjþ7‚$×;µÞ6ëk{:Dë­wf½N¤÷ã´Ä»D9k¿Þžžƒ¹Ó{ÓBšæJý’{47ȹԚ™ÄhL+G'‚Q/h›*^«KìKW®Ú{SÅ­žXçÌœXtaï½v«—œp’ªí¬þLº‹|Š;§kP|‡·viÏs/D|Ij?¦"Uì±m™“ÈvæS®—>dMä>ãç®ùó]8æàsðÔcu´ý n'„iñ›¾ü Sðíé»bßý߃¾>[§‹k8§Z«_W­Õß9ÚÎ+åÒó•ré ›£!p /õB˜K!„B!„B!„B?(†!„B!„BÆ>·w9!€X¯R.^)—†ú7¸wEµVwÕZ}÷˜`©Ñô?–Yf2¾úñÙ/lƒ‰ûZ aº>•@ž®á=î¼å1L;àlÜW{bH1Û†ûXà!šÑEƒzRàaì‹æ"aÖ‚¼IÞŠœh‚ߨ[~ ºQ^Ùƒ±'„áz|E,00"‡ÜžÞšëŒ/#p"—yÌ [áŠXŸ$S°FŽÉÍ)CÕÂÀ{» Ȱ1ÆÅ–ëx­¸%,59ˆöç;‚l#ªWµÎ¤N†Æu­KÑw$ƶ«·eãI‹pR5¬ëXÄù¶Ì~l}GëEêe}GûqmD8ѸÈæÍŸ9~ýýk°àõEHýû¤ ê»Õ*êßàÆÛ;6^'ïcؤ¼–0ÞàŸÕZý—ÕZ}µÑv^)—j•ri{ðH—Ë»ýwB!„B!„B!„2F¡†B!„Bûts2Ìe6©”K‡WÊ¥—F* "ªµúnð;«¶ÿábÇ]6Ʊ3öÄ߸|ËÓºÄävë/¼Š™_»žy‹˜3¬˜¤X bÕ¡æ§Å ²Q=ÕD/¯çöœYoå‹þ!„Å‚eψ œ±Û“¹±±Š¼äþ&wÒ\oOÏ‘â ä6"5D3Bì> IB¾7Œ^ªç7Šo(/@Å%|Ç~E¥¢BîE…—س´ 3ÇØÖ§ÌšE5Õ˜–¨Ë¦¨vÌöalGu [7Âg¢v„]#” ×Bmå¶ ö“g0•è:MÙûÑy û1e‘ȓȫõé€G|GxnºöB1¢Wß›ÈßgÀÌÑ¿»€G_ŸÃG÷}7¦³V\qi,¡ôø€«µúתµúÄÑ R.`C4„¯¯u¸l°§ÝB!„B!„B!„1Å0„B!„BÈØç!¯´™ó€Ý*åÒΕré¾QˆIQ­ÕßT­Õà&[¶ÿ‘à­ë¬‚§~[o³®n¤6§t*ˆIž0ã\ð››ðoü /¿8gP±¦„Pcº™Ý6²ë†|#A¢IÞ ä:Øf}‡±â‡Zß=Ù|Ÿ>±£p?*q^Ò×â9Úž¾ÖW®wP¼¢ÛÜ‹R-‰ù±È¦ùyèGÃä¹E´lçÝS_bßù–da‰yv?Q¾ î…‘DB“J]ÏâÞçó‹…2i‰©•ºæšN, ŠÅžªÆuü0¶3Ÿéñ8æÔ-•ñ¥kֶ̹̉3>¯úÓ8þóðì“/a¬Èú÷Õ~/Ó”JË`Ú1»aï}Þ•Ç»„³<€SÜU­Õwmç•ri^¥\:Àú΄–)¥ †B!„B!„B!„ †B!„BóTÊ%àö‚Ë/ø€+åÒÅ£Uƒj­>¹Z« 1Χuç/ÙL™2‡¾¾pÐ0±_ü1L²A[|H4j§O*ïwßö8¦x6î¾mÖ bu²I=ѰßNœ7ìQ…¤®i1H¢I^½'„¦ñߊl¬Ù¾sÁ øEÍû¹Ø@ø’Bš×ÛÓsò="¸fÜRm1f%{…¯Vóå#9Ôƒa¼±‡û0¾8µi[jFÜÒ©íH("òlk'ª[˜ûÞ¼·€Yoj.ö©m£Àgf݉=$íŠÁ<Óm÷cž±t^²=ÆBë¶ …2¹O“W™1>÷Õùøñ±—âw?¹ .l!„)ø}m{Wx/oúÌüîÞØp£7c ²>€?Wkõ˪µú†£í¼R.=Y)—>…† ö¦S‹þ}†B!„B!„B!„Œ3(†!„B!„BƶytÀ/¬W)—¾W)—Œv@ÕZ}*€{œ`ÙÑö?šìðá qÂÉ{âÍo^¡PÌ’÷_CŽ£yª†œS,ˆyùÅ9øÎ7/Âù¿¾ íþrý¶©_4¿'ÄP×MC?d3{Ð#´ƒ{®ÀžŽf½3ëU=¬x >IC b1ƒW]S‡H Q BZ4 r«îK–-d»/iWm"øÒkB¬2Áјwê„—®^òt}u»òyPµ'â“wÁ>7ÁgB<”ò™z>²íÌßÃ<‹éÿïÜzçº !„iý®æ‰ß× þkÿ-ñ­i»`ùå§`Œ³#€ZµVÿAµV_q´Wʥ세OxÒ\~ Àý£!„B!„B!„BY<¡†B!„BÜ&>_à]•ré‹•ré¹Ñ¤Z«o\­Õ¯ðG댶ÿ^±æZ+cÆ){ãýÛ®W(fnèÎ/·Äø?ýþœôõ Qþµ®bÔâ¨þ¨qß%Ým#{›9Ev"Q  Ç`Ö#ÑpoÅ-D­ì!·'¯‰ÚÇ“5øë=v‘_K6ÙÍ ŠD\ž_´[ l Ä-¼”8FUœŽÇÆ¡Ÿ ,dq…<æê‹l¡ÝknPçÄŠ.lÝ %ÜpYì!÷JD9¶!…2ÈꢎŒí0¶§}†Éšhù OÇhÊDù4¹Ï’>uŒ*ç&y¾ Ÿ±Æ»‡Ã•Ü_½Ï?3[‹ZÌÉ/Ý a²"iØZy•eqÔ±ì±çfºÌÆ6ýð`µV?¨Z«OMç•rÉWÊ¥ÿðv3¼Þ¼tG¥\ÍX!„B!„B!„BÈâ Å0„B!„BÈøà6اR.m[)—þ5ÚTkõ•«µúOü À£íq`òä~ü¿C¶ÇAo‹É“úa…0QÓ¶ÈØSdZcî¯=ižÚÍv§j–Ï›çEC>tÃ}hÞERL ìMƒ¾Ȇy+MõEÂ)ž€Z߉=%BÈc±"ˆXœ‰r±CûÜé܈ ÔÞDW~.üÐ † ±üN¿„B–6? âP˜HcíËx„à"V˜ËÇä©¶(²­çÄ¢‹C$܈\KD]Z¡LTß‘OýœØz“ßaǭݼæÌ^Äs¢lÁÖ¤‰_Ü7UANÇom+Ÿ6ß.¶íeÎìùøñq—àì_Ü€E bq‹ø<8!LÔlþ®51óÔ½ñö ÞˆqÊ*~à¶j­¾ýh;¯”K¯VÊ¥#làha/!„B!„B!„Bçô÷:B!„B!„Œ ÷Ø R.ÍmÇÕZ½À—  4ÚþG¶ÝþíxÛz«á‡ß½ ?^GChàçà½o4Š7¿ÇïÙôlçï¢÷Ù/ÏÅwü3vÝwsìýÙ-1aBû¿%k¬oœ½€\oà²1×x÷ppð wsœo~j¾7¿¾yÉå«áƒ=4zÐðå=|>àಜeÑx¯šæá­ÿÌr±½°/Ö»fp©ý Ûóyìù¥Dîr{—̕Wöš± k~­i¯Ñ»/O\qâ³wÒ“Wœ> ÃÌ»‚A¢—[Õƒ“14_Å£üÈ—ņµ !ÌȶkEH QˆZ'B±!‡… Äøˆ¾#‹Óvõ¶Âèxs[j?Z\‰P”OaËì§P(#mCÚó'ã†È·3>³ïÿ¾÷iœñ«ð³³›EÕL¼³ •F¯I‰ 'Lpøøþ[b—Ýʶ´Æ+eWWkõ |½R.=<šÎ›þö®ÖêËŒ¦_B!„B!„B!„²xÓa!„B!„q@¥\è‘æÃîð#P£XcNBHqB^´-šp⃀È1ÛÍßæ$™Äüa#Kš Iqjc&«1ÛÎí¦mGu™Í´õ”/IÔ5 :B”Q=C·µ‡”O5nkW×D|áš~>T}šýäLåY½™vºŒ IDATÈüir?i¡ŒËc/ÜKÓ†÷—ÿávœú­‹ŒÆÇB!ˆI a<´Fÿf®ºê²8ö„ݱk…B˜{¸·Z«ŸX­Õ—mç•réµÑöI!„B!„B!„B_(†!„B!„BȰS­Õ×­Öê¸À;zÏâʤIýøâ—>€ƒý –šÜД=¼‚À㻞ÆQ‹Ûo|¤ÃèÒ'Y¤ÅN7ÍÃ4ÝC6òëfúVbgÖ[áBq<ñz),Ðüa¯.Ú«=Á"nôG‹k­ÖÇ  âHºaÅJh îYx…ÙüH‘Xãä׿ü\àýÐ^òä™<8ÈMAgý'c-Ø“-k[Üc)‘"’H(#ÜIV¸|~;¡Œ‘¤CWq&D+òµ‡‹Ú§Ø‹õéÂÞ­Ïô¸]Ÿ¾¥©gT>#Öv–“,öW_™‡s1.øíMX´pQ³›ÿ(øýk”[rXÿVnñžµ0ó”½ñ¶uW)d2€o¸¿Z«ªZ«»v !„B!„B!„B ú{!„B!„BÆÕZ}yÓ`RÃYbØæýëâm뮊~ï/xôÑßè(÷Þ7šÅ½ot…¼‡yœo®ß_}e~pÔÅØqïM±ï¶Æ„þâ¿'%oÞÏN˜É›èœóh|ó¹À#k`oÆŸk›sœo^õÂ^v½á<Ìö biŽùÌòëÙ|ÀÁ5s”ùjä b¾ÙO {>·'öãÍ~¼Ù×û÷ž¸=yÞuî¤/™ûl?p^܉ìŸM¼ìQ÷2ÁùGo*òkþ¥iÇ«‹Ý“Ý ©.I qœF¬Éò$÷ç:¶­„"Ò¥…d %”‘âiKøÐb˜ñà3»±Ñ -ÆgfÝŠK¬?-tI e ÷#׿%Ûc,”±>Q`»P(“ûŒ…2Þõ~uê_ðÒ‹¯ÿìwD.YÍÉ9rL¬éŸÐ‡O|jKì¸óÆ óf¿ppµV?´R.ÝÔë€!CbçÜ ]Ì¿Æ{ÿˆECivqέÝÅüÍF(BÏlæœ;¨‹ùyï/±h!„B!d …bB!„B!„ ™j­Þà3fxCo£Y2yÓ›VÀñ3öÀ™¿¹W^yÄ4›Å‡Iã½Ãåçßîz OÛ«¾qù˜œ bŽ\|Ñ“™«LÑ”V4Å ŠS‚½¦`Ä;xa/Ó©äbq BHÄ#BøÒÒøLHä¾´˜$³§óBžl.D,Vø¾g┆Ey|f¯‘—†¦Fø÷M¹Œ¾ rï0(ëëo r¡€“»‘"#'ôö„–Œ ¾ñf\~:V‘Õˆ‹ædb µN}j eÛiÛbŽ<ù'ø–B¤›\`bB™Ì¶¨¸ØvYÇ#E7ÒF63Ä’á˜tä¶aâ–B%ôñÉ» âV>‹N¾1>ÙˆÑÃãÒsnÇ%gÿ>!„iq"ŒÊÈ9@¾Î AÌV[‡}u¼uU@Å{ü£Z«ÿÀ·*åÒ“½ˆ2(NèrþgP CÈ’Ë!½€Bvl¾:årÃB!„Bˆ¡ø¯ÿ$„B!„Bé€j­þ>7øP3$&Nœ€Ïð>vø˜2e¢ið†hO¿§ONˆß½¾ÿYuÐ9øçõµŒÉ6ïG'NˆÆy@6ÇÇ ïÊšù ! ħ[ÄB‚¸¡¿iZسþ¹ÞX¡íÉFÿø´ 8ڻ̋‹¯Åïé9HÌAòšP$„»'^*aùËÉ).5?[Ó¬³!½BÜùÍ—þÌ Û‘X°WçŒm@í#Ÿ%ºˆê3%ÜP÷?®Ù,­*Luß›¶²ÙV hÂö´O[÷bM$¶‰÷£ëׯç$ø4¹Ï@2‡q©!ò)N”ÉâlN˜ýòœvô%øóÿÝb„0] a¼øíË×CÙÛj«upÒ){R3t€Ox Z«Y­Õ—êu@„B!„B!„B!dìC1 !„B!„BEµVKµV? Àß¼«×ñŒ%Þ»Õ:˜ù½ðÖuVQAÌÜ׿ã´ã.Ù?¹ ,JÆ"Å$Jà‰CLýú®uVÄ1\‚´˜£ÆU,E¢°×Hh€”=§ìi‘AÑ ÍÃØVß!ì ƒÌ³ÙOÃR7„±øé_.÷Þ¨›„¸¥õËÌÏU R!â6qÉ9a,Uœ®p3sbA‡¾WFwc\KD Y¡Œ´£-¶FóÝ¥…2IqNÊnT²¦­ g1ã0>Ui˜ç5¶]4®Aéœ?P{3¾rî¯=Ñ(»Âß»æ?Z aÂÄè÷qb¾pÀ68ôð0eÊ$ac4N—¸·Z«ïÝë`Ç<Óë!£ÊÓ½€B‹ !„B!¤WP C!„B!„®¨ÖêSªµút÷ø¯^Ç3VYí Ëá¸öÀN;o4‚‚˜Æ¼«.¬á¸ÃÎÇ3O¾\Í`ÄòzB$`´q“¿ ¨ûÈž-˜õ0ë.ŠD ÍùJ¤`Å R ¡íY!38gbM‰*DžsM}}eÒ±k“däö•‘Ô¡œƒw.Ô_N;5LbºR~_&±ùþí¬¸%,5Š k;ËÈ!LÞ"ÑR$衘pEˆ¢6ÏŒúÒ+|ƶöl< NfKì'~VẺº‡Š/ØFÒ§± i7Οznijá½ÇÅgߊs f¿4§©Ÿ¢¦àwñÍoZ'̘Š>¼!Ȉ±6€óªµú5ÕZ}Ó^CÈ8ä¬^@UøÌBHïáo1!„B!„ôŠa!„B!„Ò1ÕZ}_4D0ÇXº·ÑŒ}úûûðéÏn…¯ñ!,³ôd¤1ö{7‚˜0ïÑŸÃÑ_:7^û`GçbÙd_$ôhµ>e/ÑŒ/u*¶”ð¤HLâÄÞP°Þ4ñ‹õ¹à £õ:+*P"‹D~¤P"•;›äc@Ѓ8ñ’C®ißé)ÎÎ÷ÈTƒ}é“a bŠ \2ž¨0ÅR1ÇØVµ)gÚ¼"¬Su‚¢úIÔ¬/ø€þžû(áDã!M‘]#” ×t}äukk3÷iëLÞS»°5ìŒO¯ŠQ_{¥þN›~1.;÷¶f­4ë-;]6!Ì6Û¬‹gNÅšk­2*làÖj­~zµV_¥×Á2Ž8ÀÜ^A5ÎPïu„2žñÞßàú^ÇA!„B!ãŠa!„B!„Ò–j­¾yµV¿ÀÙÖìu<ãwo±6f~gO¬·îjˆ1ÅàÝ bæÍ™Ÿx%~ýƒk±`þ"C±˜CŠ ì)*¶1߈:°§Å.RP, ‘'SXÁH$~ˆÄ$±ð$\ÁCJРNÖHˆ ò¹q63¥óÒf=Ôw{B-á2‘‹4‚0¦Ä%N¿Dó Çu´?&ùj® ›_d‘¥Ä-AD)N²y:Q±m{¹ÔB’r!ë+¿wƇ¬ÿ¨æsI:ô¨Ž`l¨J eT­Ël*ŸqíçÏRãf½,•üŠ/tiÛ÷þëqœüµ?âßw?•—Xô%knB˜É“ûqàAÀÁ‡l‡¥–š2ªLp €«µúWªµ:o!#Œ÷þn{˜ßëX!#÷þI;˜ÝëX!dœ3À½‚B!„BÆÃB!„B!¤j­¾ZµV?À-¶éu<ã™UV]ÓÛ »í¶ œK bZŸˆÐ© ð¸öâ{pì¡çá©Yú/N Eì)(±8Dˆ¬( @Ì‘ "¡€K6Úk!AX/Å!ZGa×;s½±¢Hœ‰¢ïq~r‘G*wÑ»œW âPó¢†'^ù U›vjŠ™ [º}Ù8¤?gB³7>Û“Ü—S9me[ El-˜z´yL :„Hbl#D×CÂgfÝAÛÖvÃýJÙ–õ]´Ÿ¤PÆú€^+Å9Òg.ˆ1¶õ¸ÎÓÀ¢Tw ~1ãr¼úrãð‚¤ÆŠ]<âÓcÂâäïßk”pÂŒ©ØnûõAzÊŠ¾ V­Õwêu0„Œu¼÷—ØÀÂ^ÇBy¼÷7ØÀœ^ÇB!ãïý‹> à^ÇB!„B!ã Ša!„B!„Q­Õ'Ukõ¯xÀçÁ?CX,˜0¡ûrKñ±ìr“Œ ¦ø}0‚˜Y=韇®º?÷oÅ$ üª¢ñÝ aôõ¨Yß4ͧN–ÐBÝô¯ßc;ñ RÔ‹v²}‡ùi!Œ¶§*˜ýÀìÇøO}GÂJˆ“}pù3fÉçÊùcƒ;F¿¤M+nˆUŒé)Y,fŽˆÙ™92GÁ·®%)ܵnk"ªk{?3Ûö¾8mW§YÇ×F‘P&mÛj‰2Û0q+Žð‰{LêcŸ áXÊgsÞK/¼†Ó¦_Œ¿\Xƒ¿Qm„0¿Qùi1­…€Ûm¿>N˜±ÖXcEņ \Z­Õ/®ÖêT(2‚xïÿ`;°!“q÷þz[¸£×±BÈxÅ{ÿ €÷¡q²6!„B!„Q€,„B!„BQTkõÝÜàË÷8’à›¿'Ÿ¼Þ¾Á†QæeS_Ÿ;¿øÎ_pÆw¯Æü׳¿X|0b)8ÐMø­Ä$Å'ʈFûÈžlØo½ÞŠ´`ÂØI¾ÇsàÄ~¬¯•ÔI%ÙZcÒž,èÓKÄJTÈw¤nH­à²ZÒË+›:2½)+nAž£ø@jŽÙ¶¼Ï(n¨{eÓ–Ý'¦ü.jSÞC+” ãa{Q]AÇÏ]ñ~Rµc[Î û1¹05ûŒcGä³±úîΩ߸Üÿ,2¥K7¿MÍæ=›<¹y;xÐ0yr?ÈbÉ.îªÖêß­Öê+ô:BÆ*ÞûlàT=‡2Âxïï°€ãÀ“¡!¤'xïŸ÷ÞÀžìu<„B!„2Ö¡†B!„B!€j­¾aµV¿@Àz½Ž‡´f¥•—ÁÑÓwÅÔ=7 ƒ-1¾Åé æ´x%²¹þòûpÌ—ÿ€'}± 1G³I^Í·']èõI±B=({²!_ø‚Ž5øÓ§zȦþ`ÏØ“þ„X ±^ç*%NH‹~2!å´âXA‡Ë ¢!È`7Ÿ:IpáŽA¿ b¾!âR¡™9V9’XçÌœXСójt7ÆE°DÜ/)ô°5"m e¢g"-Ò‚°­ì&nSJXUäSŠV”LV‰3ñ䤕ÏE¸èÌ›ð?§\‰9³_GçB˜y ! ôØšk–pâIS±Íû×Yì™à«¬ÖêTkuþ÷ BFïý\ïýV°+€™žëmT„‘Â{¿À{?À쌆0fVo£"„ñ‡÷þ"k£!R<À = ˆB!„BÆ(.ÿ‰„B!„B×TkõãLëu¤{jµ'ð“ÿ³_™ÛJõÞøGÖ\¯v,_Zî'-ÕOü~l»Ó†ðMƒÇ€ü€Ç@óT™ïáÄ5ï10Ni\×¼GGö²ï {©ùÖžëµ½Vþ3{!þä~:ðÕ¸^œ—qäv’yLçEÚ R|B Òv òóðX¸HˆtÂ+Ô¤Tcd§kY v´òDÚvΡÏ®/4ú„€£Ï9¸¾ÄxŸzôµoØÈæ´ò™ûhã3Œ;ôõÅqd¶#Ÿ]Ä|ƶ¤î|Ú½4ÆëÏ¿Š3x f=ô¼8å"–æ?†A³Ã‡6À§>ý^Lœ8ahµJzÁ}>T)—žèu „Œœs“¬4/{ïçWû¤sœs«èöÿyÑ{?¿ ËX¶Ks¼÷¯t¹†Œƒ¬‘Œ×½÷õጇB!„BÆÃB!„B!$§Z«à'ü˜%=â¥úüø´kqÏ=O5:Ä$®µÄÀ[}p}|úÐm1y©þ ÄH <¬8$%ð°k[\ëPdcÅ ñ÷ND;­D6­Å)Ú^±Èf8öÓ©=-†¿d'QLX``CþsDïE‹´à%±qKSà’…3Ù‰&zNwB„P¦y­½h WÚbºÊÈkE{l%”‘>Óã˜T<>ïºåQœû‹¿aÞœù±&!f¬fÊ”‰8à‹Ûà½[­3´%½â:S+å»!„ÅçÜLßìrÅ0„B!„B!dÄéëu„B!„BY|¨”K?Pðj¯c!ݱbiiyÔÎØkïw6DmšÈ3F¸ÖÁÉ ÍBþqõ8æËÀã¿×Ô4‘‚lª×:×üNŽºÈu™=gÖ·|Ïú]i&Z­±"е!Òú »ÞÄ,ÖgöX³Þ™õù>L<ííéýÀIq‰ºT>WÌNÄKù •ü;Bû¬êZÔž_¸pþöFüï®Æ¼×¤&ñ[“ÂøŽ…0o]g̘9•B˜%—ÿða a!„B!„B!„BH·P C!„B!„E¥\ºÀû<ÙëXHw8çðÑmŽoOÛ+®¸tkAŒjNGÆ«yAãñôã/á¸ÃÎǵ—ÜÓ¥˜C6ÕÇB…"1‰ƒtnO6ó§Å$Òä5%¤Hˆ¢¹zŽ´—ôi”ÂÄ*…#aïBp -´D¬4³}•…\“ †ò’#¨6:·È|ª½¨¯Nm!äÂÜ[K‰ÉŸª5éÃ~oþ3ª…„Ï̺µ­íêš·¶c¡LÑ3£R‹q ×JqŽô iGØÎÆ_|f6~zÌÅøû÷*áJËßšH“}Oý†…Ï;îô{\oxÃò K$3|¢R.Íïu „B!„B!„B!dɃbB!„B!„DTÊ¥x/€;{ éž6zfž<åòêéfr3Vܤ.×4Ƥ fÁë‹ð¿§ý§Ÿt%æÍ >ŒP$-"IŸî¢ÄÑ÷¦àÀ6í·ƒèï Òb’¼õ_س뵀AŠrуº¯O‰vÒ‚ ¹×âü"q Ñ!\hÆ^:If´0ÆI°¯â‰ã°ëävfŽº—I¡GÈ«®qÿdþu"…'Ö§ GÖYÇc;ÊÀÞc³¬Ã/Lܰ㪅]“úاy.E}ßqãÃøá‘á‰G^P•֢;$~cÌ5ó¾ôÒqø×>„Of+ô÷ó¸—@8 R.Y)—¢_B!„B!„B!„B:ÿ¥B!„B!I*åÒ,Û¸²×±îY~…)øæï„}ÿëÝè˺ä}qƒyºYªI=4«çÜrÝ¿qÜ—ÏÃc=—7ÈRt`ˆSLý>}Â6ôÇB)VèD0¢Å&­ìá„õ}­õ 0Ðy1{ív}ñ‰2ÚG#¶\™‘¿‚¨$»#³Ó„†ú;'|ˆx¬¸%+s›£Lʵ§òS'ùγœš0M=É:GÊg¢†BÍëû)Ç ë(±]6F“´ ÆE>‘ôǾ`Á"üñWÿÀY?ù+^Ÿ»@ü®Èß–¦8¦íéS­…0ë®»*Nš¹'¶Øb-%’Ùv­”Kgô:B!„B!„B!„²dC1 !„B!„B ©”K¯ØÀ¯z éç€=¦nŠ£ŽÞ+•–nŽ5šg"Ó¬^p’ƒn\÷xö©W0ã«ÄÕÝ•oÄMýi1‡‡ st³^ŠSs*‹^Ÿ‰§bD↴€ _Y^ b±t¬€6$rgí%ªD¼‚Cn:³×Ñ©/Ÿ#ƒÌÜ›ø¬r$±Î™9±Ðù”8DÝgäù‰î¿É­Ê5t}HÛ…B™¨&Òâ-ÛÊn–å3ì]‹VbŸ².’B™ÈgqN2ŸÏ?ý2~vìŸùšûÃï O¼x/ø=i~(Â8xìºÛ&˜~ìnXuÕeA–H°M¥\º¢×B!„B!„B!„%Ša!„B!„Ò’J¹´°R.}ÀQ½Ž… Ž·oðÌ:s(±‰lòï@LR|*Š´çŒ={B(ô%Å#uŒSëSÂ{zNñú°Ÿ†øBª Dâ%j¼…Ê%;ù¥&÷;>ó{%nP†Ql Ž5)Zi梱 ³l dugk-Œ'OQ±÷VŠH Ö«º3µ‘E(ã.ØOî3UÏæ–ÅÏŽxŒO[[úYÔ©ÏÖÜ~ÃCøÉÑÆÓ³êâþKqKó…;{r ÄIBalÙe'áëG|ûâ=˜0¤½„r€÷VÊ¥Z¯!„B!„B!„B!cþ—CB!„B!„tD¥\:À'Ìïu,¤{–]n2ŽøÆG°ßþ[`B_³;>%ˆižøRÜÌ‹c|PÄÞãö<Œã=<ølR bO\Éšó­€!%) ´µ'Å'À@â$ )`°õ.cqæÝÄaöÚ©hG JÂÞb‘D¸®…!âŠVdäq÷yH/U‘Faáä—lŠSûÔA†ü†{¥Í ¦ÍýÍrfòå]ض¥P&YCV„“ÙŽÆv…ídÄ>þTöff÷Æ©9©½ÛVèî{n^Õ’¹ÿ±«Z²¹ócA‹¾7y­Êz(ôîU2fs«RBéIŸ±mùüe¶ž}ò%ü옋qÛõÿNœÓÁ©R¿F$äsöØ£Œ£ŽÞ+­´ ÈËv«”K³{!„B!„B!„B[P C!„B!„®¨”KרÀ#½„ –u×[ '<ï~wó¤ŸjH/jpGËÓb¤ fÑ‚œ÷«à§'\Ž9¯ÎK6ÿÊ Eé\” ¦˜¤à‰9ˆ®ÙW|’G ħ¤Ä :Vg®b¯z¾ÒèõA,Rœ»ÌNÖL<ÂúHp2j„ñgÄ-!§bLÎ1÷BΈî›ÉMËq!α÷ÇÖòˆŒP¦Àv¨wmÐñJᎵ]$Ή÷ÝVíÃÔ‡|>¥O;·]ÿoüü¸‹ñÜ“/·? &)ˆ‘s‹~w<–_~)|ó›Á¾ÿõnL˜À?Â^Bñ¾])—¨”K { !„B!„B!„B{ð¿$B!„B!¤k*åÒ½Þ à–^ÇBÇ2ËLÆW¿ö!|êS[¢¿¿ééºÙÝ6¸Ç§?ø ˆ¼Ç·<Š¿r>þsï³]‰9´8DŠÚ‹I’B‘„=9C]O q´"-n‰„‰w$æ ÅµV§çHaC«ÜÙX5F6‘‹5„Z#;=H½PðJÌ1æ73!nÉýɸÄ:gæH‘QZ$r­û“u¢DR¶ªYãS†Ý„\§„2êþç¶EÌ ÛJœ#î+LÜ°ãªæ…]“úاÂù qþ/ÿ† ýw,x}‘´¿ý6´8‘ê¾3OžŠò¦k€,±¼`ÿJ¹tR¯!„B!„B!„B!cŠa!„B!„2(*åÒ3¶pQC!C`§7Â1Çî†ÕV[¹¸ЧÀ¨SbвÙ]žþ O‰©?÷¾?­Š+.¸@;ÁˆnúNóHˆAì;ì;ù Qã,¤±¢ƒ\È 0b#~ÈF !íÁ¬wf=L¡%÷éL|J\¢ë@Ž+Û¶¦Í~Ô¸yflNÒ‚˜XècŸ5xfV§{1j7>/È~¬ø¥X,çåûãœÃ^{m†#Ú+®¸4ÈË‹>R)—Îêu „B!„B!„B!dlC1 !„B!„BM¥\š`O§õ:2xÖYgœ4s*¶ÜríÆ@‹ST|ª>j€§Ä ,\„?y3~zü¥xí•×µxR˜P$&‰Å)©“0¬¦c°'ÀDâ‡Vb›Ä%|vb{f¯ÉïRPa…/FÒb}JHÑ´D)A¢ÇŠéü%l‹ò††B̉â 5bï­„h¢«> IDATA‹Íeú„–ÂS…×FìÓå5§ïá 0sžµŸ°wysŸ¢†òÔ%bvH\39¹õ¯âŒ/Å O¿¢NƒI ã’9)Œ c0ëW\q ¾}äŽøèÇ67uI–0þ`ëJ¹t]¯!„B!„B!„B!cŠa!„B!„2$*åÒ@¥\:ÀW ô:28¦L™ˆÃ¾òA|îs[aâÄ BÐ#ˆñmšáÛŸsïm㤯žï~Z5øw$*AZ´ Ú‹A"1D3De ÁDö¤˜AŸ#×ì·BH[f¯Rä F"× ‡"*¨Au º|‰c¤Ý\à!’߃ņ™ã`öä²»ò gïo|*ŒÎµÈ/´mŸ>ÓâmWn+º_û‘>õýÖöÕš|¼i«H(ùlØ™?wÎûùõ¸øw7aá‚…Hž“ÃI1\‹ß“M6Y3OžŠ6z3ÈÍM¶ª”K÷÷:B!„B!„B!„2> †B!„B!ÃB¥\ú>€˜ÛëXÈàùЇ7ÄqÇWð¦7­€Â“Ô)1hq*Dñ)1/¿ð~|ÌŸì·b1b1‡ÈþnÄ$ñ)/©±øt—˜k¯e 8+r‚ˆô 0ZD¡Åè`½„}´Ê¤¤D(ÙXдø._¡|bq‹ Å—Ç;9Ôˆ˜£E+ö~k1Jt/l­¥r$lHÛR(#ïYîÈpòº¶â—°+l§îY¡P"^¹ŸDN‚OaKääéÇ^Ä/N¸÷ÜòhûÓ`"ALømðfÌž4Õ×ç°Ï>›ã[ÿý,¿ü%š?ؾR.=Ûë@!„B!„B!„BÈøbB!„B!„ •réÛx®×±Á³ÖZ+áÄ»ã}ï{Z5³7ÞZÑú”˜E¸ä¬[ñÓã.Åì—æ%D ¦Yß ñ DEbB!bq ¢õHú—ës!D¡8Åœ±#EVäPp­häÎÆªqâÞÔ /Ù½nõ²ó=”Ý ‡Š“ÌaP…äûГÒ9HŽ‹•QN¥»\@’‰…¬¸*-” šDèÙ=Éâ)áD>彌íBØ×âúÊ|"é3ÎÇÍW߇_ϼõgg£ãÓ`Ïx¨Q;@nc¥•–Æ´£vÆÔ=7Ëã!K,?ðÑJ¹D!,!„B!„B!„BU(†!„B!„BȰR)—nð^÷÷:2x–Zj"þò¶øâ·Á¤I ÛðŧFˆÏ-N‰y ö¾óõ ðàO&FtR ±óZ Fìä#H i¤f#¬@®Â!PÐëGÌíµZ/D;b?騡í9³^ 6‚hF©%"Á Úja’ˆ{¨mf¾E’­ß,GR(D{„ÈQT/©q!αÂ-F >aòˆÛ!SÇ*f±ÆÞ?qÏaÇ#Ÿ"ö¾gµ™Ê8óæ,Ày§_‡+Îù'-\Ô¸½ÝœcŸëBÇf›­“fNż± HÈ€Ã*åÒá•ri ×ÁB!„B!„B!„ñÅ0„B!„Bv*åÒl àú^ÇB†ÆvÛ¯ãOØ«¯¾"äéö¤‡ÆÐàO‰™ýÒüìøKqé9·b`@:ƒ(q€ì·ß8âÁrË-²D3À^•réG½„B!„B!„B!„Œ_(†!„B!„BȈP)—^ðag÷:24Þò–N8qw|`Ûõ5»Ó)1Ùº+λ?;î¼RŸ““´shÁÄÉ­Å .¹>4¤ÖwcO B‹Vë¥pB‰.Z]KÏѹK'¤èD2”¤dÈB/ü*'Íœ Rsd®÷Kˆ¥äÞ r],”Ѷ#T&sIùt&>§m‡­9ã³ ¶û‰ëÒÜûìnÙgÂÀrŸÞᦫîÅ™§^—_xµy‹¥F>¿ž“ËÁc•U–ÅÑGï‚Ý*›D·ž,q<`»J¹ô§^B!„B!„B!„BÆ7ÃB!„B!dĨ”K¯ØÀÌ^ÇB†ÆäÉý8è ÷ãKÿï˜<¹¿¸ñ½ëSbâ¦ú‡îy §ñGÜÿ¯Ç#q‹s¤D!Hˆ !(¾8XAD>†VB‡Xˆ“]Gîßž@"E Á¿]hEnÆ¿LDö „Aö\Â^ö!§ cÌ&TÎÉï§ž =Dž"AKÁI,©q[WYŽ„ï¢>š{JÙŽ…2 Û2j?æ~¶ʈÚM eš×æÎyçýìZ\}þmX4± ö4#{×»×ÄI3÷Àzë¯ÖQ•ÅšûlU)—néu „B!„B!„B!„¸ü?rB!„B!„Œ ÕZý?ÐßëXÈÐxòÉ—ðÃ\ƒY³ê)fÈ• ù?òæ}9–üœ› Âí*eì´Ïæp}}ÈNðh6ïx?€pÍ{ „FýÆõ0ß{``@\ËíÉùÖžølü{"¦Èçö²ù­í¥÷£íµÚk¶6ØÎÇš±f"%ßü<ðÚ,ª¿4¤ºqýý˜°âòZ o´²ÅŠsúàúã}FxÒç\¼l¼/1¯p¼aCÚ.ò™û0>ûú´@%Ä¢¯å¶Šl·o|ÏJc?‰5ÆçÿyýúÌ®Ï b–ü­Åçü‘3 ‚ðE~nÎïïïÃ~ûmvÞhHuCþ `ÏJ¹Tïu „Bι©ÖîbÉnvèÒÍo½÷Ÿér !„B!„B!]A1 !„B!„BFj­¾€s,×ëXÈÐX°`~û›qõÕ÷7Gäѱ8&; ù[±ÆŠbÖZ5|âí°üÊËJœ"Å(ZlÒæZ$Ti|O‰R¢k‘H¥•È%%бöÒ"m¯XøìµÙÈõÙ)Þ{ ¼ú¾øòjÆõ÷£¿´B$zÉkC aò“NœN„A\"Ä)¢+ˆ‘ãiÛB™” ¦kŸúZ[¡L")ŠÆûçÈÜtåݸþϵ¼(‘K,‚‘ãâô)ŽIbV[m9zØöXgU†T3d±á÷>W)—æ÷:B!„ çÜeva7ÃB!„B!„‡bB!„B!„Œ*ÕZ}SX½×±¡ó¿ÿ¿<ãÌ›» 1ŸÓüÐÁçe–›Œ}|?6Üü-‹9:9&%&i'néVœ’íħ²´ÜOÁé7iáM±¯b{ñ^ÃI‹f¿†…/$„pñPcMbêÄ~ô¯´b.vÉ0Aô}R ÂX¡ð¥Åx{qI|­HÓ^(cÇ;;¦+Ÿ©ø‹1ÆçÜWçá’3oÄ#÷>õçÁmN€éö4Øò=k〷ÁÒKO*(²„qb¥\šÖë !„2|P C!„B!„BÆ }½€B!„B!ã‹J¹t€÷¨õ:2t¶Úzœ4c¬½ÖJŸ81‡ÏFüæÙ|Ÿöɦü×fÏÃo¾{þüû›100 DRGNɾËëâ‚æ©30ëYŸŸP{p‰ tf/¼ÏwÆ^Á~Ä»>D¥Õµx޶±&ö¥„MáFê—/x¥æ*¤FŒIuÌÓ3¢\å+U¹0 :gŸ³|æ™<#Ó‹¾º~ŠêTÔäÞ‹ö#òaë3¯Y‡Yÿ~¿=ù2<|ÂäϤ?›ç0Qå〸ÏaíĉðÙÏn…Ãÿ …0cƒ…¾@! !„Bɽ€B!„B!„Œ}x2 !„B!„BzBµV_À|¤×±¡³`Á"üþÌ›qÅ•÷†A)¦PÊ'†âñ JÈ+Ä[Ö]û}y;¬¸Ê²mOeѧˆÓQ¼š/OJÑ'§´?eFÚŽO”‰O€Q¾Ô‰.©}è`:õÕi^Ò§áè\5N†y Ÿ{qH5â&NDÿ*%¥qJÁaÆšsú\ã”V'ŸÈñä -ö„'N^1'±[Ÿa¼àZ·>“¶3»‰“oÄ©0©“o/¿ÿ¸ônx?ÐÈgê$ñ&EháÏ¥0 ÉÓ`Þø†åpØW>ˆµÖ^yH5B^ð±J¹tE¯!„BÈð3J'Ãl콿{„}B!„B!„qÅ0„B!„BéÕZ½Àé>ßëXÈðpóM࿸sæ,hŽ!‹ÇäÿÈO±PãI!Lø¼ÔÒ“ðÑ/nƒÞµ–‡h¡IZ’ŤE.i{±x¤•È&%NéÔ^+qL»ýh{­öš­-íÀ{,zåU,|îqº ùÇnâDô¯ºR.~ÉO…QG´d'Ÿds¬ÐÃE"XÓÁ¸Z¯}¸¾„Ï„PFÚn+”1b–V¢›bNK¼Ç9¯ÎÅ¥¿½=ø´¸‰`§ÁdÅŸ|~ßÖëàó_x–š2±Ë ‹)صR.ñô6B!dŒòÿÙ»Ï07ê{íã·´Íë>îÆ6Œ1uSlpÓ ¢×PCHNBBIN’sΓç]£FEýN ¤üMÒåÓØô  cu`f‰A˜õ°7†0 (ÑX|š¤§%ñ/¬»ˆ?X­Ÿ?ô†vîÚg[µZÚ‚2**SS[¥ oœ¤£&PpcŠ=x’KL¶pŠw%½A&×pŠ×~ÞÁ›ü^W0Èýzš¶×«qÃæ¢~BÕÕª68õÙÚƒ0!gSŒW˜Å< '/ÛýC+îIöæ–L-4*òžÎsYƒ2YfÙ½}^øýl}¾<ùy„XÒÛC0r5Àø?ž:m¬¾xãɪ©©,ê÷%å’¾1¦ ¯ƒÂ0—t£eYëÚy_ÀaPR¢±ø¡’fI:0èYÐ>êêvéû^Õ’%]á—ìC>a¿PÌ ÓÑŒ/LPEe8­•Å+ãN±‡AœáìagPÅÝ(“Þ㸗#ôârÉ÷^ö×áÕV“©Q&ù¸i[½ömØTÔïA" 3Äz‘-üJ}–ɯV¿¶•œÂ%éçü1Ùƒ2~áœÌí4ùÝ3ù8s8ç³…ëõâßUî½Ê5#Y¶Œ‹­ Æ|±?ÏRMM¥nüÒ$M™zpQ¿()–¤ÿ1ÿzÐyÚ9 ³AÒ7-Ëz¼örF”œh,>DÒLI'= ÚGss‹þòç43Kü{û¶‹=Ìb_w>Î'3tÔ]ñõi8´_ÖÆ¯0H¦Æ¯0Iæ˜üÃ)Å4Àd ·ä6{úÞñÚ·~cQ¿¡šjUš Á´µÃx·Âø‡KZÏùµ¨x¬û6´„A{ðĀɈñ›Å”±ŸË5(ãJþ´,K³gÍׇ¯-J…X|‚/YC0’÷­ë£ö7tÛmӵ߈þEý ¤ì•tCÄ4ø‡«t3톩“ô¶¤7$ýʲ¬íí2'Â0 $Ecñž’þ(é‚ gAûùø£µzèg¯«¾¾Á|içPLuM¥Î»î$™'Ik€Io|q‡Sœç²µ²xi2µÍäÞòâÕ ãÞ/S'—דÜ/óëiܺ]{×µCf¿am¡—d(¦-ÓúYÛC ¹´­ä”ñØÛoÝ7@ãw.ß{zîÜ×#Ðck…Ùµm·þöûw´aU3ôbû‘wÆçñôÓÆéºë'ªºº²¨Ï%e«¤ #¦ñfЃ€Î … I5>½EÒf‹d€@”¬h,–t¤[ƒží'ß­îU‹nH,ø…bü‚/Ê=sìäƒ5ãÚ‰ª¬¬H ¾8Ã!þa’láç~ÙÃ)^a”TK¦à‹whÇ;4ãß“šË»­Æë}Ùß®½k7ØÞsûg–í»ÇpMªFÚÂ0òn…±7¥¤Eçrh[ñktqk”‹’Ή˜Æ’ ŠA”¼h,~»¤K = ÚGK‹¥'ÿú¡žyúcµ}?åÓSl(fðˆþºìkÓ4h¿þ97¦¤Â!¹5Àø‡Il!—B6¹†S¼öËŽÉõõ$Χ߿qëv5ØÃ0H„a†{·Â´~ŽavßIØ?(“=´’¡ÑÅ”)xo¯Žç=sk¾±Z,Í~þc}üÆy`\ǹ…`Oj;7zô@Ývû©6¼_QŸ9Jλ’"ÓØô @±À²Å/’ôIµAÏ‚öóÉ'ëôàý¯©¾~Oj±B1UÕ•:çê :zòÁ¾a’lá–L 0ÎýÒÛ`Ò[Y2·Íxµ¼xíç}½{¿ìm5ÙöÛW·M kÖõY‡{Ô¨jÔ~Žf˜+ãNÉÒÐâÛ¢â.q†T2ÝÓ¯-&õüäsRÇÙ[hr¸§ãõ$ïŒïÒ‹ÍÖ¦5u‰7³ƒB0’tÆ™‡éšk'¨ªª¢¨Ï%ç)I×DLcOÖ+€2@”h,~¢¤¨¤!AÏ‚ö³}û=xÿ«úä“õ޼KG„bŽšxf\w’*«*ÓSÒƒ*™Sœ ,þ-éûy7Àäº_® 0^¯Çs¿Œ³'öÞ[·M{V†©ÞD[3Œ½Æ«Å< '/ÛýC+…eü[hTä=ç²el³¬˜¿F¯=ñ¾ö54:C0ޝu‹ÁÔÖV韾:E'N8°¨Ï%éIߎ˜FKЃí…0 (+ÑXü I³$ z´˲ôôSéÉ¿~¨–[ÞÅ‘Žqg8—ŠI=8¼¯.þ§i2r€#\âvñol±Oüƒ/™Ûfœûy_’2™‚/îý²iò}={ë¶i÷ªuE}Æá5ª=²­&‘ˆI|nöÖÿ@ŒG[LÆpIú9GhÅ'Ìb¿§ßºWhÅ3ÐÎgïäãÄó[š-Íž9OŸÎ^Ö¡!Ë’ÆŒ¤[oŸ®!Cúõ£ä´Hº=b=ÐÞÀ²ÅHzZÒÔ gAûZ¸`½¸ÿUÅã»]–BC1’½9&ÙSYU¡3®íÕæ#TU© £⣱µÂØ›RÒ‚"Žs9´­¸‚+ÞÏψÉ3(c?çh§ ûe¼Zlš›šõö3hîßç«¥©ÅñaY~¡÷q!I;vˆ¾÷ï3tðÁCŠúLQ’J:5b ‚èH4À²Åo’ô¤Ê gAûZ²x£î¿÷ÕmÝÕ¶æÅ$¼§kûËv*q\QÖôËŽ×øSµµ¢8[YÚSl­,^-*ö–ÿV–TL¶VûóÝûy^o›ÕÙã¼—g£ŒÇ9Ë’ölÞªË×õY†k{¨fÌè¶ Œ”oˆÄ?(c_·bÒÖ½]\A™‚÷Îùžé¯qûæz½òÇÙŠoØÞö~9¿·u§TP&$é¼óM]qåñª¨õy¢$½&颈il z £†]B4?KÒ’ú= Ú×Î{õÐO_Ó‡¬q¶d Å(ä,wI»¶í/Ç^‡;Jç\7IÕµUÞa’´PŒ;ä⊑+ˆ’)dc À¸ƒ*má”\B6þá–Ô~¹¿ž†M[µcÙš¢>ÇpÏZÕŒ9 ñ¶ÛZ¼1¾M,¹­;Z`ÂÙÂ)éÍ-öãÔó“ÏIûµÐäÂi]_6o•Þyæ556+­Æ‚ÉÔ ã:¶‡`dI}úôÐÍߘ¦cŽUÔ爒õ˜¤/ELc_Ѓ0 è2¢±øÑ’ž—4"èYÐþf=?_|ì=57[…‡bÜç=Úbúì­ ¾·p¯Zõ8dŒG Kò±w+LZs‹ÇºoCKØ'(ã Ýd ÄøÍb ÊØÏy·Ð¤‚2Kç®Ôœ™óÔÜØ¬¬-09{…`$©_ßZ}ýÖSu”IQVU/éÒˆiü#èA€ †]R4¯”ô¤›‚žãïûTøÝ»jljn]q‡b‡Úbú½tÞS´ß˜!y‡IìáÿV–TŒW+‹s¿ÔóÝûy^_@hÇ«mf׆:m_ôYQŸW¸WOõ7Æ»¡%CÛŠ3\’[Pƾ·ýî°‹g€Æ+(“éž{{ÍÒ´¯Y³Ÿ«•±Õ9`Úþò¼ÆJk‰±[ÒG×7n›®þý{õ™¡d­‘tnÄ4æ=Â0 K‹ÆâÿGÒ•Þ‚.ೕ[tßO^Ò† ; ¶vç'^\[L8ÒÉç£Ï8J–,W°Ä/äâŠq7À8Ûf¼÷óo€Iíç²qî—!ø’åõìZ¿EÛÚ! S{èGSJZ8Åq.‡¶Wp¥­&,ÇqÆ@:0¸^ IDATLžAû9G€'ì”Ù¶a›^ÿÓlÕ×íL½!y`R‡–ízçq8,]|Ùqºø’cÓƒ`è*>R"³.èA€ †]^4ÿ‚¤ßHªz´¿={õ«‡ßÐ;o/Wz;L–PŒ”W0æ€ÃöÓ9_œ¤š^=²6Àxµ²x5Àx…S25Àd»W¶¶˜Ô½¼®wï—¸fçº-Ú¶peQŸS¸WOõ<|l!ÿ Œ}݈I[÷jt »‚3öö ÊäsÏ%ï-×Ü>RsSKzF*®Ævl=uËí§é°Ã‡õ9¡¤½ éòˆiìÌz%ÐņÝB4Ÿ*éIFг c¼ü…zô×僧©¹u%ä ÅØ~$ ÆôêßS3¾8E#ê ›x_œ­,^á¯p‹WË‹WÆ;ìâßò’ùþîýRçv­Û¢ø‚E}>áÞ½Ôëð±éᔌM,¹­;Z`Â9b\ëö½SÏÏ¥…Æ'œ’šö5iö3sµú“5éoF¾-0îç¸ZaÌ£Gêë·NWß¾=ŠúŒPÒ–ôõˆi4g½èÀn#‹Sâÿ¬`г c¬Y½U÷þø%­û|[† L!m1Îç…B!M<÷hpö‘’J ÂØƒ'^ 0©kÓ[ì¡”dHÆ?dck’É£&ßÐήu›µõÓâÂ0½{©çc}Â%Â)¶™bƒ2ž-4írOgP&¾.®7ÿ<[;ã»Ro@ÁÛW ¦¢"¬Ë®<^ç_xŒ÷¯,ºKÒ¿ELã‚(%„a@·ŇHŠJ:1èYÐ1öîmÒ#¿xSo¾¾4±à ¾ß“ÚgÔ¸a:ëúɪíSë“x…Sòk€QûÙ_üö³]ï¤ÉÚI>wçç›U÷Éò¢>—ŠÞ½Ôû¨q¹µ­¸‚'öG¸%CCKØ'Ìb¿§=Ì’¸Ÿ+œã ÉxÏpH‹g/Ѽç«¥¹¥0éÇõÒ-·Ÿ¦q‡+êsAIÛ+éúˆiü9èA€RCt;ÑX¼VÒ%]ô,è8¯¿ºX¿ùÕ[Ú»·Iží0¹czö­Õ™×MÖ¨qÃr ¥Ø‚'ÞA{»Lî 0©ý¼C6Îýüƒ/^×ïX»Yuó‹ Ãôé¥>G³H¼[aüš[ü‚2ÞÁ½ÂÙ1™ïiÊØÏ%çhlhԻϼ¯µ ×)[&±ä¾¦í¯ ljã­¯Ýrªz÷®)ê3AI«“taÄ4Þ z UÜqÇAÏÐ©Æ ­mZ²±á Iý%M ztŒ¤ã'¨…Ÿ¬Sýö=­AïÐKæãÄš_0¦qo“¿¿R-Í-1v¨Bm†lQ÷šWÛLúµnVëše¿Æ³°\Ï·’ÏiÛ¤íœÕú|ÇÏß[¿K{6mÍ0sváê*õ6(kÛŠ=ä’kPÆj±cÜaÏWP&Ï{n][§W}]ukmï‘gÆñIäÜ“|Pëêë&ê†/MRuueQŸJÚrIÓ#¦1/èA€RE3 èÖ¢±ø­’î‘ztŒ}ûšôÛ_½­W_^”Xȳ&§`Œ$…BÚoÌuÃÕö­u´²$`ì­,mkž­1^­0îý¼[f²µ¼´´ØÎùÞß¹_ýšÚ[VÔçPÙ§—ús¸3œ’ š„3bü^ÚZ`Ârg Ää”±ŸK›W!-zg±b/Ï—•xÓ^·wŒíïqëAëñà!}tÛ·Nט±CŠúPòæH:?b›ƒ(e„a@·Å/”ôI=ƒžç­7–ꑇßPCCSjÑÞãxXx0¦Gï~íd:l?[Å+¨’8N…\2œ³…T²…\ìÏ÷ßÏ;dãÜ/unÇšMÚüÑÒ¢ÞÿÊ>½Ô÷ØÃ­0Žv˜°Gh¥5xb_·bÒÖ½]®àL†½ý‚2^÷Ü·gŸÞ{ú=­_ºÞñ:ÓÚ_‡>˜Œ×H'N<@_¹ùõêUSÔg€’÷¤¤k#¦±'èA€RG@R4?QRTµ ]ØúuÛuïÝ/jõª:e Áx­¹ƒ1ik‰…P(±~ìiGèÄsU(¤´pJ~ 0ÎpŠWØÅÙøâ·Ÿíú´½¡÷½êWmÔæ–õÞWöí­~ã÷o[ÉÔÐö¸.ÙÎ!ãZ·ïz~.-4‰=êVoÖœ'ßÕžúDf¡#0’¥ÊÊ ]sýI:kÆ‘E½÷( ?‘ôˆi´=PÃ´ŠÆâJš%éРgAÇillÖï~óŽþñ·O%©µÙ¥c‚1ì3®Ÿ¢žýzz´¼d ¾ø7Êd Ò¤‡]œáï†ÿ–™äõõ«6hÓ¼%é¯9«Ôw•}{«ÿqG´O2†V|Z<ƒ2®uG L8Ç@LŽ÷ ÉÒâ·ë“×>•ÕÒâóR3„]¼ÖÜšÖïk‡ ï§Ûþù xРßk”©fI·ELã§A”Â06ÑXÜô´¤iAÏ‚Ž5çåzøg¯kÏî}mkùclÖjzVkúÕ“´ÿ#ÓZYœAïVËdÉÒSDÈ&Õ6“~ýöUµñÃÅE½ß•}{Ë8þHï¶• -,Ž[H%v…V|Â,ö½SëÉ Kê8[ ÍÞÝ zÿé÷´qÅÆÔ‹j§ŒdÉþ5íI“Æè+_›¦ÚžÕE½ç(y»$]1hЃå†0 €K4¯–ôI_zt¬MëuïÝ/jŲÍÉ$L›v ÆH2O=LÎ/…C¶°Izð%—ÿ°‹ÿ~™`RûyÝ_ÚþÙmø`QQïuU¿Þ2N8*s+ŒOPÆÞÐâXÛZ`\!šì˜ô¶ïYBÚòÙ&½÷ô»jØÑÐújr ¿Ø²`$©ª2¬ë¿4Y§ŸuxQï5ÊÂI‘ˆiÌ z UÜqÇAÏPRÆ ­m^²±áiI•’¦=:N¯Þ5š6ýPíÞ½OË–´6~¸B1©¥|‚1¶…Ö?Û¬µ‹Öiä¸áªéYÝŽHœ´rËJe'ÒÎ)Ô¢°Ý°-TѺŸå&Ó½$[(#yÿã¸aÛí\·Åó½ÉUEMµzŽš\I†\ -^á”Lë^­0aŸë\¡›L{‡diÑ ôat®šö6z¼ßÅ`’ ûè¯ï}?¢c]ð{Œ²±@Ò©ÓXô @¹¢ ƒh,þ%I?W"ƒ.ìýwWê羪];÷¦s Æ8³‡cª{VkÚ'ésÿ¶V—dKâØ»ÆÙè’©Q&õüL 0þí2¶&™ÖÙ¶}¶AÞ/îßíWõë£̶æÿ@L¶¶˜ AW Æ7(㺧=(“<·wçÍ}ú]m^µ9‡ð‹mÁµîùý«kmÊ´Cô¥¯NUUE¼Ã(¯Jº8bÛ‚(g„a²ˆÆâgJú«¤>AÏ‚ŽµeóÝw÷‹Zºxcz&ï`ŒëÀuÙá“Õ„ ŽS(N ¾d §8ƒ/É Mzð¥íš–TÈ&=xãÜÏ;x#m[¹Nëß+2 Ó¿M<:z »Â)Ép‹k݈ñ[w?ßœq<Çëž{o^±Q<óžöînH½€Ã/ží/RZF’jª+ôůLÕ)§Zø‹rò{I7ELc_ЃåŽ0 @¢±¸)éyI#ƒž«¹¹Eúý=ÿìG©ü‚G¦=Â1GÐôk§ªÏ >®pŠWPEÎF—ŒÁ¹Úc¼C.~!÷½¶­\§uï¶C椣.¾ -®æG¸%œC &¹WØc½íúôvY–½þ‰–¼½(ðKb1§ŒíxäþtûwÎÒÈQFáo*ÊÉÓø~ÐC]a€EcñJbŽzt¼ysWég÷½¬;œ'r Ƥ–3‡cªjª4éò‰:ð˜Ñ¶ðJî 0þ2–ï~™Â1©ýRçâ+ÖkÝœO‹x7a˜Á“Žõ­ø4´xe\ëö Œ;Dãˆñ¸gÃŽ=úðéwU·f‹‰—bÂ/>k§ž~˜nøòÕÔTøn¢Œ4JúJÄ4~ô @WB ÑX¼¤¿H:;èYÐñ¶ÖíÔýw¿¨E Öû^ŠÇ´.›8V.ûÞ©õÌ-4›—­×¼çÞÓ¾=ûò ¿H9`$©GM¥nºùMžvH¡o#ÊËvI—FL㥠ºšŠ;î¸#èÊÆ¸¡µû–llø³¤á’Ž zt¬ÚžÕš:ýP5·´hñ‚u© D>Á˜ ëöpLÝÚ­ZýéZ ?x¨zôêÑv«T®¢u+ä8væ.B’%YöÀ•ü‘¼Þù|GøÃ µ:ïµ'¾Cõk6{¿¶UÔÖ¨×èáΆ¯@Œ+¸âXÛZ`\!šì˜ô¶˜eiáË1}ò÷yjnln{Ã2þÿƒò¿Ø×G8Hÿ÷® tÄQ# ~QVÖH:-bs‚èŠh†(P4ÿ7Iÿ!Ϫt5±y«õàO^R}ýžô“펑¤ªšJtÉDxܾ 0öÆ—¶v™Ôõ­û¤íg{œÖ(“¸Þ²,Õ-[§µïÌ/à]K©6újè”ñŽvw8%ìZI[÷j… û\ç Ý$Ï5ìØ­Ÿš­më¶æ×ú’iÝçÜg©ë¾4YUÕù¿q(Gó$1õAtU„aŠů’ôI5AÏ‚Ž·-¾KÜý}:­¤w *CÐ%ŸsŸ0F.>QáÊŠD`ÅTI·…\lÁ—¶pŒ-øâ ½¤B.îÐL[PÆu¯­K×jÍÛŇa†M;ÞÑúâÕ “Þ“!èâ Äøe\÷Ü´äs}<ó}564:‡l§ðK¢^ÇRmÏj}åÓuÒäƒ }ÛP~fIº"b;ƒèÊÃ)‹O‘ôŒ¤AÏ‚ŽgY–ž|ü}=ùøûJ}·rüpÈ€Ér¾ß°þšvíTõÒÏ£&=co€q†]rk€ñk”©[²VkÞ*2 3 ¯†Ÿr|z&ì ­Ø1~ëîçÛƒ3Žç¸öV‹¥E¯~¬ÏÞ_–À%Û9«í/IÒAÑmß9KC‡÷+äíByú¹¤oDL£9èA€®Ž0 @;ˆÆâã”h8(èYÐ9>­Õ?~Qñ­»=ò,>­1RöpŒëšŠª M¸h‚:aŒ-ãÝ“KË‹åz¾£L*xS·t­V¿+ô­’$Õ è§a§ïhh±7¹´µÀ„ä ·„sÄ$÷ û7ÍìÙ¶K==[Û7ăeû~4Çð‹ýòs"¦®¹q’*++ z¯Pv,Iÿ1ÿ z » ÐN¢±ø`IQI‚žcûö=zðÇ/*6oµm5äޱýH“C@æÀñiÂ%®ª°µÂ8Ã.^á–TËK¦àK²QÆÙ.“b z ;! ÐŽ¢±x­¤?Hº(èYÐ9,Kz批úËcsÔâù]›W8&±îŽ‘<2}÷Õäk¦ªÿpÃrI Ť7Ȥ®O»$ÎÛ»öÛ¼xV½þqïPBÍÀ~qÚ‰¶ ‹;¸Ê”ñY··¿¤Ö[ßó–-zé#­™·<} ¬ÁÇ×Ó\ë–tð¸aºý_ÎÖà!} {ƒPŽê$]1·ƒènô³h,–ôcI·= :Ï¢ëtÿÿþMu[v*sL†pŒïsR*ª*u\äx™xˆ#¸bo‹qaÒƒ/ÉÐKâœWhÆÞ<³yñ}öÚG¿7R" 3òŒ ®v—ôö—¶uWPÆ}.[ fw|‡bÏÌÑŽñìÃel}ñ>—\ …,{áx}áú“UQ.ðÝAZ&iFÄ4–=Іè ÑXüI÷Jâ_Èw;v4èg?~QÎýÌu&s8Fò,‚I÷8·¿9Z'^z²*ª+mAïgØÅ¿Æ/³eñj­|µ=Â0awð%bñ[÷j… »ƒ2©V˜ ViÁß?Pó¾&ç™Â-òi}I[JôéÝC7ÿó™Â¿/(K³%1-AtW„a:P4¿@Ò%õ ztË’f>ý¡þôè;jnjI,¦…YBžÝ‹þ™Ä5½öÑÉWO‘1b`[Å«Æ;ø’l”ñj…q6Êl^´Z+_™Wð{"I=õ×È3'¦‡]Âr5¿Øƒ.™1îu«©YK^š§Ï?^Ùz×L¡ÿó¾¡Ûá¡Gì§[¿{¶ê]Ø‚rõWI×FL£!èA€îŒ0 @‹Æâ'HŠJô,è÷8t˜#ìânq„c|‚/é2–6/\­/è1N†´Žë{ǃúkÔY')¶…X\¿uG€&ì Î$Ÿ³{ëvÍf¶vm©÷!Ãw >­/ÞO³ I\z‚.¿v¢**(}êf~,é;ÓàKu `„a:A4?@Ò,I‡< :Ñ®{õÐ=ÿÐû³—§Ci<Îy,dl‰‘F±¿N¸ìdUö¨v…b¤Ÿ{ðÅÙ(c{lI›¬Òr¯0Lz ê¯ýÏ>ÉÕü’ ¾ØÂ-á1ÉLk0fÃüÏ´ø¨¹±Ù€L¡Ï%+ía¿þ=õoŸ)süèÂÞ”«fI·FLãgA 0 @'‰Æâ†¤§%M zt®žýH=ò¦ššš•¹!&—€ŒÇbëa/£·&^5EF Nµ¼¸‚0éÁ—TŒeɤii=Þ´`•–¿ôAÁ¯_j Ã̘äh ‡]áu{P&¢Iœ³›´øhç«7Éhɰä|q/nŽÔ­ß=GÆ€^½~”­]’®Œ˜ÆÌ B EcñjI¿–tuг s­XºI÷þçóÚ¸a{b!¯L®!)\Ö‘g×!“w¶Ã´aœ 1Îg&uýÆ«´ìŹþ7ÍÊRíàþ}îdg L2ðöÄø¬'ÛbvmÙ®OŸ™­Ý[ëýné;‹ÿ5éçB¡.ùÂ]zõ…B…¾~”© ’΋˜FqI0íŽ0 @¢±ø]’þoÐs síÙ½O?¿÷šóæ€ÉõIéã/›¤ªÚGŒwð%qì ʤ‚4>ý¬5 S¸ÚÁ†8wRZûK[ÓKØÕã:gĬÿx…–½w³2¦-ú|EÚßè©[¾{ŽŽÓÒ¿¿_à«me°¡#SRí.ien‹ KVc“–üýmZè‘O(¨ Æyý«RsühÝòݳկÏü_,ÊÝ+’.Ž˜Æö à0 @€¢±ø’þ*©oг s­Z±Y?ùçµþó¸ï5‰Œû‹”t^Ä4Ö=€ü†(QÑXüJI¿•Tð(Àçk¶êž»žÓê•[2_XH¥‰í)¡PHŸbêS‘J–§Øƒ1–>ÿx…>7;ÿûØô:@‡\6Ý€IÜ;܌ٹn‹–Î|G{wìN=©¯.³|ßYYY¡k¾2M3._Àæè"ž—tEÄ4ÜÕCÊD8èà-bK:]ÒÖ gAç1j€þëÁktú 3™PI„CÜY¶sþ¸Y©?V‹¥¥¯|¬ÙüM{wìi ©¤þ(Jdgr¹OÆ,…$…’Zƒ0Éý×½»PŸ>þ²öÖïvÌæ)Ÿ×Ú¶WâÜÐaýt×}W„éÞ’tA ¼Ñ P⢱ø!’fIô,ÆÛ¯.ÒÃ?ù»öìËreÈñ#_Õ½zèèK&kÐ!#í0­a™u-קϾSئ­z ¨q—Oo Á„B!57ìÕŠæhÛÊõ…mjù¤™0eœ¾öí³Ô³EKÝ”%é_"¦ñ£ P<Â0e ‹–ôœ¤‰AÏ‚`lø<®{îzN+–n´­¦R/¡œ0¡Œ‡ IM>R‡œ1^–B²,KŸÏ[®OŸy»€©Sz ¨qWœ®p8„Ùùù&-~¶öíÜ“~q!Ç•m—¦žSUU¡nž®3Ï?¶±Ñ54Hº.bO=€özd1Í’¦Kz*èYŒa# ýðktöãYKJ=°dY~Ôö'Árþ±\Z,­xc¾Þýå Ú»}—B¡P"0ã¾.ß?²ËÒº9ŸhÑŸ_Ѿ»}¯µ½ÈÄÔm§ý_«ã9–4|„¡ÿ|ðZ‚0ÝÛI§„ºšaÊH4Kº[Ò7ƒžÁy÷Í%zèG³´kç^ÛªG5LÎm1ÞO¬ª­ÖQ—LVãî}šÿÔ[©³9îkÿê±×ð{Á­˜5[õ«“í6E|7éùÔÔâäÓ×W¾y–j{V~”»e’Ή˜Æ² оÔ¡h,þ I÷‰æßnkÓúíºçÎgµlÑúÔbÖJ– |N÷6@;6lÍg¼4U½j%ËRãî†ô“Y¿¢ÌrítuM¥n¼åtvîÑùŽˆ®åIDLcKЃh„aÊT4?_ÒŸ$õ z£¹©EýâUÍ|â}×™ÂB/%'§¯.S=Pßúþ…ÚÿÀÁ6ÊÂ’®‹˜†Gò @W@ ŒEcñã%Í”44èYœ¹ï,ÓOÿ{¦vÖûüÛßðK©¦b2|gésꔳÒM·Ÿm0Ð IDAT©šU3ÊÅÝ’¾1 ¾øº0Â0e.‹ i–¤ÃªÛT¯{~ð¬²Ö'ãR@𥣲2}%éý¤šš*}ù[giÚYG5Ê^³¤["¦ñPЃèx„aº€h,Þ_ÒÓ’N x¨¹¹Eÿêu=û§9Êùk¿¼/ù>!Ïïó¸|ÿƒë[?¸H#ö˜ß=ÐÕì’tEÄ4žzƒ0 @Å«%="éš gA°æ½»BüÇsªß¶[!ßìJGÕ¾´ÿï--K:=rŒn¼õLU×TvâL(Aë%1ƒ@ç! ÐÅDcñ;%ý{Ðs X[·ìнw>«­.èùþ!šöSÈW“µ=«õÕïÌФÓoÿPn>•4#b…ý’([„aº h,þEIKª z§¥ÅÒ_~ó†žüÝÛ²Z<¾L ¼Õã1›ÇÒc‡éŸï¼XÃF?JÝË’.‰˜Æö ÐùÃtQÑXütIOJêô,ÖüVê¾;ŸÕ¶­»‚¥`g_tœ®¿å UUU= ‚÷¨¤/GL£1èAƒ0 @Å”4KÒ¨ gA°¶mÝ¥û~ðŒæ°²ðMB6ÇñdÏÞ5ºù_#šxÊ¡ï.厈iü è!‹0 @Å÷“4SÒ±AÏ‚`Y-–žüÝ[úË#¯«¥Åõ½`¡A—öâñ=åÁ‡í§oÝu‰† ïÀ@(1’nŠ˜Æï‚@ðÃtÑX¼·¤¿H:'èY¼­Ö½ßJ[·ìz_ç]1A×Þ|º**ÃA‚àm—tqÄ4^ z¥0 @7Å+$ýTÒ?= ‚·cÛnÝç3š7gYW·gkLæï#{÷­Õ׿w¾N˜2®ï‰2¶JÒ¹Óø4èA”Â0ÝL4ÿ®¤ÿVû&P†,Kzæ±·õ§‡_Uss‹ã\¨ƒ;¼¾–wäH}뇗hÐÐ~{s”‹$1 A ´†膢±øå’~'©&èY¼Åó×è'ÿþWmÙXÈýC!é‚«'é _®ŠŠp 3 äÌ”teÄ4v=€ÒC ›ŠÆâ“$=+i`г x;ë÷è;ŸÑÜ·ÛV;ª&õdßþ=uË÷/Òø“ÆvнP†~&éÖˆi4=€ÒD ‹Æâc%½ iLг 4Dÿ4[¿ð%57ùäòÍÇdøúñðcGë›w]¢ƒûæ¹)º(KÒw"¦ñã PÚÃtsÑX|¤ç$ô,( Ë|®ï mZïýCá.¹aª®øò) ‡Ãr”I×FLã¯A ô†€¢±xIIº$èYPvïlÐOø¬æ¼² ]÷í? ·n»ó™'Ô®û¢¬m‘t~Ä4f=€ò@’¤h,’ô#Iÿô,(/<ñ®½÷ïjll*z¯£Ž?H·ßu©úìÝ“¡‹X*iFÄ4–=€òAÑXüë’î“Tô,( +¯×Ýÿö¸6¬ÙZÐóÃá°.ÿò©ºôÆi …Cí<ÊØÛ’.ˆ˜F]Ѓ(/„a&‹G$ýIR¯ gAiس{¯úá³zëÅùy=oÀà>úæ\®#ÆÐ1ƒ¡\ýEÒõÓhzå‡0 \ÒLIマèBöIúRÄ4 z(a”¬h,ÞKÒŸ%ô,@°MÒEÓx-èA á üDLc—¤ $ý,èY€2÷™¤“ Âè h†@YˆÆâß–ô¿’BAÏ”™¹’΋˜ÆÆ €ö@e#‹_*é÷’z= P&ž“tUÄ4v=´—pÐ¹Š˜Æ_%&iKгeàAI„ÐÕÐ €²Å–4KÒØ gJP‹¤oGLãž €Ž@e)‹”ôœ¤“ƒž(!{$]1§‚:J8è€BDL£NÒi’žz Dl–4 €®Ž0 ÊVÄ4$]!éGAÏl‰¤‰Ó˜ô ÐÑB–e=P´h,þ5IHªz “½)éˆil zè „aÐeDcñs%=.©wгäqI7DLcoЃ@g =Ð^"¦ñ¼¤iúÿìÝ[¬¥g]Çñßljµå`^LĤrŽ¢_.<° çCÛ§¥ tªR`{¼ ÀT%ä "&ìRö ´.:œ.z#à….cD(I)Òj_ìh›–ÚíEÇPK§ìé<{?ë¿×çs;½~ùßLfÒïz’¯õÞ{àÍIÎÂëÆË0ì;‹åüˆ$×$yBï-° îHòÓ8¼¿÷€Ä0ìK‹åü½I>œäY½·@CG’¼d‡OôÐËFï°¦qøÏ$/HòG§@+×'yšXw^†`ß[,ç×'ùíÞ;àüm’3¦q¸®÷€ÞÄ0¬…ÅrþÅ$'ù®Þ[à8}:ɹÓ8ÜÜ{À*Øè=öÂ4œäyI¾Ñ{ ‡Kr׋0B€£¼ ÀZY,çÇ'9œä‘½·Àwpá4oì=`ÕˆaX;‹åüI>–äÇ{o{q{’—OãpYï!«H ÀZZ,ç&¹2ÉY½·ÀÝÌIΞÆá³½‡¬ªÞ ‡iþ;ÉÁ$¿ß{ õ¯Iž"„¸o^†`í-–ók“¼5ÉÞ[X[_L2MãðõÞCV’,–ó‹’\šä{zoaí\ä¼iné= ‚Þ`Lãðá$ÏLòï½·°VÞ“ä! ÀÎyîf±œ›äãI~¨÷öµ;“¼v‡wõPîa±œ¿/ÉÕI~º÷ö¥[“šÆá£½‡T´Ñ{¬šiþ#ɳ’|¨÷ö’#É“<¨÷ʹ"ÉG_àmôLãp8ÉÓ’\ß{ ¥¼)É!! @;^†€ã°XÎOr8Ézoa¥Ý‘ä×§qØê=`¿ÃÀqZ,ç‡$ùp’g÷ÞÂJ:’äÅÓ8|²÷€ýh£÷¨f‡›“œ‘ä{oaå|5ÉS…0»ÇË0pËù·’üNffle’3§q¸®÷€ýL 'h±œ!ÉÅINî½…n>•äÜiŽô°ßmôÕMãð'IžŸä½·ÐÅŹëE! Àð2 4²XÎOr8É#{oaOl'¹p‡‹zX'bhh±œ–äcI~¢÷vÕíI.˜ÆáòÞCÖ[,çS“\™dê½…]1'98ÃçzXG½À~3Ã-I&yoï-4÷/Iž"„èÇË0°‹Ëù5IÞ_L³|!É4à ½‡¬31 ì²År>'É¥INé½…ûíª$‡Ž¾ú@G¾vÙ4IòÌ$7öÞÂýòî$/¬/ÃÀY,çÇ&9œä‡{oaGîLòšiÞÝ{ß"†€=´XÎMru’Ó{oá>Ý’äÐ4WõÀÿ·Ñ{¬“inJòì$ì½…cº!É3„0«I {l‡Û’¼4ÉïöÞ·ùR’'Mãð…ÞC¸w¶··{o€µµXοœä}IÐ{ ù\’ƒÓ8̽‡plbèl±œ_äCIÔ{Ë»<ÉÓ8ÜÞ{÷m£÷XwÓ8|<ÉS“\ß{Ëšº(ÉùB€¼ +b±œžäš$?Ö{Ëš¸#ɯMãpqï!ìœVÈb9?$ÉŸ%yNï-ûÜ‘$çNãð©ÞC8>½ß2ÃÍIÎHrIï-ûØuINÂÔäeXQ‹å|a’7ôÞ±ÏüM’3§qøjï!Ü?bXa‹å|~’$9¹÷–}à“I^<ÑÞC¸ÿ6zŽm‡K“5ÉI^Ø{ËŠ»)ÉÁi®í=€¶6zvn‡[’œä÷zoYa_Nò! Àþäe(j±œ_ämñ¥7w÷ù$/œÆá†ÞCØb(l±œÏNrY’SzoYMrh‡[{`÷øÆH(l‡&yF’{oéì]IÎÂì^†€}`±œ“äp’ÇõÞ²ÇîLòêiÞÓ{{C ûÄb9?4ÉUIžÚ{˹%ÉyÓ8\Ý{{g£÷ inJòœ$WöÞ²¾žäéB€õ#†€}d‡Û’œ—äM½·ì¢/%yÒ4_ì=€½w`{{»÷`,–óf’÷%9©÷–†>›äìiæÞCèC ûØb9??ɇ’<¸÷–.Kòòinï=€~Ä0°Ï-–ó“\“ä´Þ[NÀ§q¸°÷úÃÀX,çÌ]AÌØ{Ëqº#ɯLãpIï!¬1 ¬‰År~H’?MòÜÞ[vèæ$çNãðéÞCX½{c‡›“œ™ä½·ìÀuINÂpO^†€5´XίKò†$zo¹äÌi®ï=€Õ#†€5µX·’\’ääÞ[îæI^2ÑÞCXM½}LãpY’ç&™{o9êýI&! ÷ÅË0°æËùG’NòèN¶“üæ4oîôù"†²XÎߟd‘ä§öø£oKò²i®ÜãÏ (1 $Y,çS“\žäg÷è#oJrp‡k÷èóØ6zVÃ4·$9'É{öà㾜äÉBŽ——a€o³XίJòŽìÎêüe’Nãpã.ülö91 p¯Ëù`’Ë“œÒðÇ~$ÉùÓ8ÜÚðg°Fvã[€}`‡«’<=É ~ä;“¼XÀ‰ð2 pŸËùÑI>žäq÷óGÜ™äUÓ8¼·Ý*Ö•øŽËyHrU’§ço½%ÉK§qøóö«XG½«o‡9És“\q¿íëI~F@Kb`G¦q¸-É¡$íà?ÿû$OšÆá¯vwëæÀöövï @1‹åüÊ$ä¤{ùåÏ$9{‡oìé(Ö‚—a€ã6ÃÅIÎJrä¿ti’ç aØ-^†î·År~b’k’œ–ä Ó8¼¾ó$ö91 pBËù´$§OãðÁÞ[ØÿÄ0”±Ñ{씀2Ä0”!†  1 eˆa(C @bÊÃP†€2Ä0”!†  1 eˆa(C @bÊÃP†€2Ä0”!†  1 eˆa(C @bÊÃP†€2Ä0”!†  1 eˆa(C @bÊÃP†€2Ä0”!†  1 eˆa(C @bÊÃP†€2Ä0”!†  1 eˆa(C @bÊÃP†€2Ä0”!†  1 eˆa(C @bÊÃP†€2Ä0”!†  1 eˆa(C @bÊÃP†€2Ä0”!†  1 eˆa(C @bÊÃP†€2Ä0”!†  1 eˆa(C @bÊÃP†€2Ä0”!†  1 eˆa(C @bÊÃP†€2Ä0”!†  1 eˆa(C @bÊÃP†€2Ä0”!†¨ä3Ý IDAT  1 eˆa(C @bÊÃP†€2Ä0”!†  1 eˆa(C @bÊÃP†€2Ä0”!†  1 eˆa(C @bÊÃPÆI½üŸÍÍÍŸKò²$§tž²G’¼ekkëÚÞCŽÅ=Ûr϶ܳ-÷lË=Ûr϶ܳ-÷lË=Ûr϶ Þóí[[[Ÿé=äX Þó[[[Ñ{ȱlnnž›äqÏ&ܳ-÷lË=Û*vÏÿÊ]¾¯ò=ÏIòÊ$§öÞ²îÙ–{¶åžm¹g[îÙ–{¶åžm¹g[îÙ–{¶åžm¹g[îÙ–{¶åžm¹g[îÙ–{¶åžm¹ç‰¹9ÉE¶··{Éæææc’üsïÇé«I½µµõÍÞCîÉ=Ûr϶ܳ-÷lË=Ûr϶ܳ-÷lË=Ûr϶ŠÞókIéžÍÜäQ[[[·örO›››Hò•Þ;Ž“{¶åžm¹g[îÙ–{¶åžm¹g[îÙ–{¶µÊ÷<-Éu½w'÷lË=Ûr϶ܳ-÷lË=Ûr϶ܳ-÷lË=Ûr϶ܳ-÷lË=ÛrÏó•Þ Ž:%ɽG§ÿYÅÿ1é(÷lË=Ûr϶ܳ-÷lË=Ûr϶ܳ-÷lË=ÛªxÏoºgSß\Å8:êÁqϖܳ-÷lË=Ûr϶ܳ-÷lË=Ûr϶*Þs{…ïùÀ$«úwácYå{žšäöÞ#Ž“{¶åžm¹g[îÙ–{¶åžm¹g[îÙ–{¶åžm¹g[îÙ–{¶åž'æ¶“z/H’­­­¿ÛÜÜ|e’CINî½gþ-É;z8÷lË=Ûr϶ܳ-÷lË=Ûr϶ܳ-÷lË=Ûr϶ܳ-÷lË=Ûr϶ܳ­‚÷¼!ÉÛ{8–£÷|E’óãž'Ì=Ûr϶ܳ­‚÷¼1É;{8–­­­<úç»{6°µµõO›››$ù¥$ßÝ{ϸg[îÙ–{¶åžm¹g[îÙ–{¶åžm¹g[îÙ–{¶åžm¹g[îyb®Oò¶ÛÛÛ½‡ÀŽlô;%†  1 eˆa(C @bÊÃP†€2Ä0”!†  1 eˆa(C @bÊÃP†€2Ä0”!†  1 eˆa(C @bÊÃP†€2Ä0”!†  1 eˆa(C @bÊÃP†€2Ä0”!†  1 eˆa(C @bÊÃP†€2Ä0”!†  1 eˆa(C @bÊÃP†€2Ä0”!†  1 eˆa(C @bÊÃP†€2Ä0”!†  1 eˆa(C @bÊÃP†€2Ä0”!†  1 eˆa(C @bÊÃP†þ—½;ά¼óÿ}TÅR 0«Y…1Ð#ãM€eÚnlãt–žN:=n»O2™LÏt2s’é$Ç™$ãŽÓÓéLÒÓ9 xÇ#lcÀxaP€Ù 6T PP{é™?®ªJU%0KU]½ÒçsÎEÒûʺß[àsê^=ßçt e:†2 C€Ž¡ @ÇP† c(ÃÐ1”aèÊ0t e:†2 C€Ž¡ @ÇP† c(ÃÐ1”aèÊ0t e:†2 C€Ž¡ @ÇP† c(ÃÐ1”aèÊ0t e:†2 C€Ž¡ @ÇP† c(ÃÐ1”aèÊ0t e:†2 C€Ž¡ @ÇP† c(ÃÐ1”aèÊ0t e:†2 C€Ž¡ @ÇP† c(ÃÐ1”aèÊ0t e:†2 C€Ž¡ @ÇP† c(ÃÐ1”aèÊ0t e:†2 C€Ž¡ @ÇP† c(ÃÐ1”aèÊ0t e:†2 C`†*¥¼£”ò?•Rî(¥œ6Åûç—Rn+¥|¶”²´ŒoÖܶ°ë”RJry’+’ô%)[ÞšâÛ»’¼oâø¥”[’\•äëµÖU»?-À›Wj­mgàm(¥äi 0%™3Å·^k½w‡ÿÝ…Inžâ{7&ùN’«“\[k]½K¼ &Ãt RÊ>I>–¦ÓŸdþ.üñó’\:q¬-¥\Ÿ¦s}­uÝ.<À›¦ Ð!J) ’\œä3I>šdï=pÚ…I.Ÿ8V—R®MSŒùN­uã8?Àv”a¦±RÊÜ$L3æãIµg¿$sâXUJùZšbÌ-µÖñs³ˆ2 À4SJéJr^šÌåIl7Ñ”'ù‰cE)åËiŠ1?®µÖV“3Z±V`z(¥œ¦ó©$‡îâz­õÞÎwa’›wñyžJrM’«k­÷ì⟠  ЦRJošÌIŽÚ§ÚSe˜ÉI3-æêZëûñ<À,¢ °‡•RŽÏ¶̉{è´m”a&»/ÛŠ1?ßCçf ¹m˜ J)G$ùtšÌ{ZŽÓ†Ó&Ž]JùqšbÌ—k­ËÛte€Ý¤”rp’O¥)Àœ“¤´›hÚxïÄñïK)·¦)Æ|­Ö:Ún, ”ZkÛfŒRÊâ$ŸHS€¹0ÉœVmsz­õÞÉ/”R.Lrs;qv²)ÉwÓc¾Yk}¹å<À4e2 ÀÛTJÙ7ÉeI>“äÃIæµ›¨#ÍMrñı®”òí4Řëj­k[ML+Ê0oA)e¯$—¦™si’…í&šQöJ3]çI^)¥|+ÉUI¾SkÝÐj2 uÊ0oP)e^’¥)Àüz’ýÚM4+ì›äoLc¥”¯§™ss­us«É˜UGÆ&ùh’M½Ýߘâý?N24ÐÛ}×0Ë(üŽRJW’ Ó`~#ÉâVÍnÝIþîı²”ò•4ŘÛk­µÕdÐ!F‡úÎLò™$Oõô_9Åû_OrS’¯öô¯ÜÓù`º›—ä#iÖ \–fSÇÏ'Ù© “ä³Iþdpdì±4¿Ï¾z ·ûÁ=•`6Q†ØA)¥$yošYŸJ²´ÝDLáà$0q<]Jùr’«j­w· ¦ŸÑ¡¾SÒ<ç¸"É1/þ5¾ý}I>žä £C}7§Y¸óõžþá±Ý¦‰Á‘±9Ù~ãÌî7ù#ŽMòO“üÓÁ‘±²­óø®Ì 0›)ÃL(¥¼;ÍΨŸNrdËqxãŽHò“üãRÊ£™xˆXk]Ön,hÏèPß±ižq|&ÉÉoáGÌIòÁ‰ãK£C}7¦¹çþVOÿð+»,(Lƒ#c%Í&W$ùdšMw…S’üIš‰1w¤¹¿þò@o÷/wÑϘ•”a€Y­”rB¶íŒú®–ãðö—äŸ%ùg¥”‘4¯©µ>Ñn,ØýF‡úÞ‘¦sE’3wសd`âX;:Ôw]š{îo÷ô¯Û…ç€=npdì=iî¥?f3ÆÝ鬉ãߎŒ '¹*ÉWz»ŸßÍç˜q”a€Y§”òÎl+ÀœÖjv§Þ‰ã_•R~š‰Ýuj­Ï´ vÑ¡¾ƒ’\žæ9G_’²›O¹0ÍLòòèPß7ÓÜs·§xÓn>7ìƒ#c'¦™¦zEšM÷´’伉㋃#c7¥¹¿þÆ@o÷‹-äè8Ê0À¬PJ9$ɧÒ<ÈzoËqØó~mâø·¥”¦yˆøÕZë íÆ€7ot¨ï€$ŸHóœã¢$sZв(Éßž8FG‡ú¾šæžû=ýÃã-e€) ŽŒ•mgö¶g²9I>ßáµÍMò‘‰c})eëî:µÖ5­&€$£C} ’\’æ9ÇG“ìÝn¢7ì$˜äG‡ú~žæ~ûêžþáûZMÀ¬082v`’ËÓÜOŸ—ÎÝ8sï$Ÿž8^ûFš{ì›z»7µš `°8èx¥”…i„\‘fÈ^í&¢-HS¢úõ$¯–R¾•æ!âP­uC«É˜UF‡úæ&ù`šçO²¨ÝDoÛ;“üQ’?ê{8̈́֫{ú‡Öj*f”Á‘±EiHs_=ÓÖFîŸä·&ŽGƾšæ{x ·{¼Å\­™iáf‰RÊü4=®Hò±$û¶›hÚúa’/$¹Š÷nKò›ivjýµ=jšÛ'Ég&ŽK)ßHóñûµÖÍ­&`FêëJ³Síg’üF’ÛM´ÛœäŸ'ùç£C}÷¤Ùˆâšžþá§Ú@'Û;ÍÆ™ŸIrqšMgƒ“üÇ3ƒ#c_Nrõ@o÷OÛ°g•ZkÛÞRÊœ$ïOS€ùD’îvM[ëÓ”7¾Pk½÷üJ)g'ù\’O&™·³u²ç’|5ÍBáê/Ò¼M£C}g§yÎñ©$‡îáÓ¾§ø¦È´"ÉÁ{0GMò£4÷Û_éé^±Ï @‡›Ÿ¤?Û6Îܧ¥(ŸèíÞé¾zpdlOßWOöD’k’\5ÐÛ=Õ†™3Š2 0­•RJ’sÓ<Ⱥ<í=4êÏ&ùR’?¯µ>ÿV~@)å$¿—äw“´ ³Í4¿LóñêZëm‡ sŒõõ¦yÎqE’£ZŒ2]Ê0“'¹%M1æk=ýëZÊÀ42826'ÉEÙ¶qæí&J2=Ë0“-Ks}õ@o÷£m‡Ø”a€i©”rFšYŸNrxËq¦»'ùB’¯ÕZ7îŠXJYæÏÿsIÞ³+~æ öX&vשµ>Øv¦ŸÑ¡¾ã³­sbËq¶˜Že˜É6&ùNš…;×öô¯n9{ÐàÈØ–3?“fãÌé¶™ãt/ÃLvw’«’|y ·ûé¶Ãì*sÛ°E)å¤4²>世ãLw’|9É•µÖ;võ¯µ®Oò—Iþ²”Ò—¦óñøûãTŽMòÇIþ¸”ò@&vשµ>Þn,Ú4:ÔwDšgWÄFoż$—NkG‡ú®OsÏ}}OÿðºV“°Û ŽŒ™mg¾£å83Å{&Ž382v{šûë¯ ôv¯l7ÀÛc1#ЪRÊÑÙ¶3ê©-Çé+“üY’?«µ®Ø'¬µ'.¥žä$ù$={âÜè”$’äOJ)wfbwZë/ÛÀž0:Ô·4É'Ó<ç8'Ii7ÑŒ±0Í.À—'Y=:Ôwmš…;ßééÞ%SrhÏàÈØÉÙ¶nàØ–ãÌd[¦íœ›ä? ŽŒÝœæþúë½Ýc­&x J­µí À,SJ9,ɧÒL9«å8âÎ$W&¹¦Öº¡Í ¥”…I~3Í´¦_­&ÎÄî:µÖç[ÎÀ.4:Ô·8É'Ò,ع0ÉœV½qŸïéþ£_ê[‘äàò¼«’|-Í=÷-=ýÃã-çà ;&Û 0§´ç­øü@o÷N÷Õƒ#ct_½Å†$ßIs}í@o÷+-çxCL†öˆRÊ’4»w^‘伨õØ”fAÇ•µÖÛÛ³E­um’¿Hò¥”÷§)Å|,IW«Á¦¯’æ¿ùó’\YJ¹)ÍCÄoÔZ_l5oÉèPß~I.KóœãÃIæµ›hÖZœf‚íï$Y1:Ô÷•4SZÜÓ?l78€ifpdìi6μ"6ΜNæ'ùèıvpdìº4¿Óþö@o÷ºV“¼e`·)¥ìŸäãid} þîñF½äÏ“|©ÖúLÛa^O­õæ$7—RÞ™ä’üÝ$´™iš›“f‘Ô‡“üY)e(Í"ÁZë«­&àuõí•äÒ4Ï9.M²°ÝDì`i’ÏNOõ]“äêžþá{Ú0» ŽŒmÙ8ó3IúbãÌéna’ON/ŽŒ]›æwÚßèíÞØj2€”ZmŒì:¥”}’ ¤YÒŸdA»‰:Ê}I®Lò×µÖŽÜ]eâßÿßN³ðäÄ–ãt’5IÓì®sC­u}ËyH2:Ô7/ɇÒ,ع,É~í&Ú¥>ßÓ?üG;¾8:Ô·"ÉÁ-äÙ]Is¿}uOÿðÃm‡˜ GÆöOò‰lÛ8sN»‰v‹Ïôvït_=826Óî«·Mòµ4÷Ø·ôv·œ@xûJ) Ò_®HS„Ù§ÝDes’k“\Yk½µí0»R)åCIþ0É%±»Ï›ñR’o¤yˆxS­uSËyf•Ñ¡¾®$¦yÎñI·h÷™-e˜Éî˶bÌÏ[Î0£ ŽŒMÞ8óâ$óÛM´ÛͶ2ÌdË“|%ÉU½Ý?n; 0{Ím;ЙJ)sÓìàrE’'Ù¿ÝDg,É_$ùµÖ§Ú³;ÔZ¿›ä»¥”cÓLŠù­$‹Z ÕöOógõ[I^(¥|5ÍBÖZí®°Œõ•$ïMóœãSI–¶›ˆÝä´‰ã_õý8Íýö—{ú‡—·  3 ŽŒmÙ8ó3iŠ0{·›ˆ=ä$ŸKò¹Á‘±Ÿ'¹&ÉÕ½Ý÷¶š ˜uL†Þ°RJIr^š…!—'YÒn¢Žô`’/&ù«Zëš¶ÃìI¥”ýÒ<>›ä¸vÓt¤g’|9ÉÕµÖŸ¶`&ê;=ÍsŽO'9²å8{Úlœ 3•ñ$?HrU’¯õô¶œ`Z³qfc6O†y-gb"ë@o÷#m‡f>eàW*¥œ•f'—O%9¬å8h<ÉõI¾Pk½©í0m›(U]œä“|(Ii7QGz"k­÷· “ŒõfÁÎIÞÕrœ6)ÃìlS’惡çþfOÿðË-ç˜GÆlœ¹3e˜×wošûëkz»Þr`†R†¦TJ95Û†ÝrœNõR’ÿšä‹µÖ'Ú3•RNH3)æï$Ù§å8jY¶cm; Àt4:Ô÷Îl{ÎqZ»i¦ e˜×·.É·ÓÜs_×Ó?¼¶å<{ÜàȘ3_Ûç?}é>Ÿäw’¼/É_$ùö5×ÿá³q_½£¥¹¿þÊ@o÷ò¶Ã3‡2 °U)eq’æaÖI-Çéd$ùb’¿¬µ¾Òv˜NPJ9 Éo'ùƒ$Gµ§“Ý•æ!â—j­kÚЦѡ¾CÒ,Ö¹"É{[Ž3}þ³ßvCšÉ­ç$ù/IþÓo8÷®X´³£W’|+ÉUI¾ÓÓ?¼¡å<»ÍàȘ3…_>½*ÿõÏpï÷ýâø${OzëñßüÎ=èCý§ì·pïùmÅ›ÎÆ“ÜšæwÚ_èím9Ðá”a€­J)Ç&1Yâ­©InLò…$7VÉzKJ)]I’|.ÉE-ÇéT5ÉþµÖÕmØÓF‡úz’\žfÁÎùIºÚM4ýlÜ0ž;o~>×ÿÕÓÏ¿4ºaÉoo:íÜžMøÃö:êÄýZÉׯ’|=Í›{ú‡7·œàm;6ͽ´3_C­5wßñTn¼/Œüòu¿wáÂy¹à¢ó‘KOÍ!‡°‡vœI¾›æþú›½Ý~¿ ¼iÊ0ÀV¥”’äÅ$‹ÚÎÒA^Iòß’|±Öú³–³Ì(¥”SÒ”bþf’…-Çé$ÖZo;Àž2:Ô·(ɯ§Y´ó¡$sÛM4=½øÂ†üðºå¹í†yõåM¿òû8nß\pÙ!9ã‚%™3·ì„ie’¯¤Y¸s{Oÿ°_ºcpdìð$ŸNs?}FËq¦­5k6ä–ï=”¡ëïÏs+_ÞþÍ2Åýò¤õ˜¥$§~D.èMﻘòÛI’¬Kòí4Y¯èí^Ûr C(ÃÛ)¥ÜOrKk IDAT’ä‚¶st€Ç“üi’ÿ·Öúò¯úfÞºRÊâ$¿“ä÷“ÞrœNpM­õжCìN£C} “|4ÍŽµ'Ù«ÝDÓ×Ë^έ×.Ͻ·f|ó›ÿÐ~ÝóÒwÉÒô]º4‹ºç3Æ/’\“䪞þá»Û0•Á‘±ƒ’|2MæÜ$ê¯áÙg^ÌÐõ÷ç·ü,ëÖmÜéý×+¶Lµ$óÐÃHÿ%§ä‚÷¿+ öš· “Î8¯$¹6ÍÆ7ôvïü‡0AØN)åß'ù‡mç˜Æ¾—äÊ$××ZÇÛ3›”Ræ$ùxši1çµg:û_j­ÿ¦í»ÚèPßü$I³`çcIöm7ÑôµiãxîþÁ ¹õÚåùÅc¯l{£”7µÊ©&[WðÌ™[rúyæ‚ËÍ‘Çû£ÿM³hçêžþáem‡f·Á‘±î4¿gýL’÷'™Ón¢é«ÖdäÞ_ä†ëïÏȽ¿È¤/Ûã¹¹®S|Q“½÷žŸ÷à„|ø’SrÐAû½ÝÈ3ÝX’¯§™sË@o÷æ–óÓŒ2 °RÊßJòÿµcšY“䯒|±Öú`ÛaHJ)§§)Å|&É‚–ãL7®µ~·í»ÂèPßœ4 u®Hò‰$Ýí&šÞ^^µ!·}{enZ‘W^ܸÝâœm;Ö¾É:L´~gâ“#OØ/|ìœö¾žÌ™ká_áþ4‹v®éé~¢í0Àì082¶oš$®H³±„QŸ¯cݺùÁ-?Ëß~0Ï.qâÕ²Ã-tÙîÃÇœtHŽ;õÐÜv㲬~qí¶7^£ ³å“RJÎ8ãÈô_rrN>õ°]t%3ÚÊ$_I³ùÄí½Ý¾Ê0ÀöJ)''y íÓÄSIþc’¿¨µŽµ†•R–$ùÝ$¿—äЖãLÖZGÛðVõ•$ç¦Y°óÉ$µ›hú{úg¯äÖo=›ûn[•Í›ë¶âËäu;eë?¶~¹÷¾ssö‡Ê;ßµ_~ò½çòÐ]c©“Ë/Û5a¶‰Ùúùþ‹çåÜK–朜}÷Ÿ·{.nfùišE;_îé~¦í0ÀÌ282¶ É%iî§?šdïvMÏ­|97-Ë-7?’5k6dÇé2Õþ¥dÎÜ®œyÁqùÐoœžcN:$I²qæüä¦Gòݯݓ§{¾ùÞ)Öfn·^³ÉšÃïNÿŧ¤ïüc3þÜ]w3×ÓI®Irõ@o÷Ým‡Ú£ l§”2'Éê$ ÛÎÒ¢[“\™äÚZ«1» ”2/Éåi¦Å¼·å8mzºÖzdÛ!ÞŠÑ¡¾3Ò,Øùt’Ã[Ž3ímÞ\sßðh~xÝò<õè+]—²]çe»E;[×ó”üŽ…9÷âƒsúyfÞ‚®­ß2ºr}~4´2wÜü|֯ݔd뺜­¶üZ©ny£&sæuåôózrþGÉaGï³;.w¦OòÃ4Ř¯öô¿Ðr C ŽŒÍMò¡4÷Ó¿ždQ»‰:Ã÷?“¾ý`î¹ç©µ™Ò²ÕÔ7ÓI’ýö_˜ó?zJ.èÍ=¯}ÿûèýÏä¦oÜ—{o{<ãã;—_¶}=i;ŠZ³ï¾ rÑE'äÃý'¥çu~>Ûy4ÍýõÕ½ÝËÚìYÊ0ÀNJ)?Êì+¬Kò×I®¬µÞ×vÞºRÊYIþ0ÍîÁ³mÜ÷7k­o;À5:Ôwrš;W$9¶å8á•—6æG7®ÌíC+³zlc³.g»òKÙi"L™xï]ïéÎ998Çœüúk£6¬Ûœ»øB~|ãʼ°|]’í×ëlëÁl›Sks}â~éûèÒœúÞÅéêšj ]v°)ÉMI®JòÍžþá—ZÎLsƒ#c]IÎOs/}y’žvu†õë7eø‡eè†eyæ™±æÅ2ÅnÛ}Þüãðc–äýëÍ™—¹óæ¼ás®z~un½îÜ~ã²¼ºzív=˜$“vœØú¤Ötu•œyÖ‘é¿øäœpÂÒ7~‘Œ¤)Æ\3ÐÛýDÛa€ÝOØI)åKI~¯í{È3I¾”äÏk­váœAJ)KÓüwü»In9ΞòÔZÿEÛ!^ÏèPßÑÙV€9µå8ã—O¼šáëVäÞÛF³yÓøÖâK)ÙV~™üZšõ;{-œ“ÓÏ?0gð t/Yð¦ÎYkòØý/åÇß]™Çx9ãã[ÞØV„™4 ¦ù8ñ{§ý{ä}ýç½>({ï;÷í^þl±>É iî öô¯i90 ŽŒæ^úSIm9NÇxá…WòÝï<”ïßôH^]³¡yqÇ̤1«[î·»ºJzÏ9*çôÔsÒ!o+Æõ›rç­?Ë­ƒdÅÓ«&^­ÛÃl?†u»rÌ;\œôŸœ÷{t潉"ùišûë/ôv?Óv`÷P†vRJù{IþsÛ9v³Û“\™äkµÖMm‡a÷)¥ÌOòé4ÓbÎh9Îî6Pk½®í;ê;,ͽÙIÎj9NÇß\sÿOVå¶o¯È“¯NÙ©üÒ|½uÓÚ’”‰7\ºW~í¢%é}_Oæ/èzÛYFW¬ËO¿ÿ|î»}4ÖoW|Ù¶fg¢ 3©3w^Ééç˜ó.]š¥Gìý¶sÌ"¯&ùVš…;C=ýÃZδ`pdì´4÷ÒŸNrTËq:ÊíÈÐЃ¹óΧ›Í¶ŒMMvØLb»&²÷~ röOȹý'瀞}vy®Gï6Ãß~ Ëîz:u¼&ÛM]ݱ³íã¢E{åxW>ø¡ÓÝíþúMOòÃ4÷×_èí¶I*Ì Ê0ÀNJ)ïIrWÛ9vƒ I®Iò…ZëL¼>~…RÊûÒ”b>‘d&nK{X­õÙ¶C$ÉèPß’$—§Y´s^¶¬*áWZ³zS~ò½çrÛЊ¼¼jã¶õ:;”_Jiìlýº+9æ¤E9뢃rô‰‹vËŸøúµ›sßFsçÍÏçÅç×ï0¦ÙÕvr9¦nY×S“cNÙ/}—’“ÎêÞVàáx1É7’\•äû=ýÛ[ÎìFƒ#cÇgÛDÕ[ŽÓQ6nÜœÛo{§«äì³ß™þþ“rìqíöœ3̦$7¥)Æ|c ·û¥–óo“2 °“‰I¯$™×v–]dE’?KògµÖ•m‡¡}¥”w$ù½$?É-ÇÙUVÖZ—¶˜ÝF‡úöOòñ$ŸIrQfæF»Íò§Ödøú¹wx4›6ŽO_¶^¶û<™ø¼dþ^]9õìÅ9ã‚%Y|Ђ=’µÖäñ^Ê·¾Ÿ?¼zâµIå—ì0)fÒ{ÝKä}œ³.Z’…ûøOäMz.ÉWÓ,Üîéö‹>˜GƎȶÌé-Çé8«V­É÷¾ûP¾ÿýGòòêõ¯Q€Ù¹SºJN8ýð¼ïÃ'å¨ÛùUë†u›rÏðcùÑ÷Ê Ë_Ú~Üê¤ScŽ9úÀô÷Ÿ”÷žsTæÌyûSag™õInHs=8ÐÛ½¦å<À[  L©”rO’w·ãmº#É’|¥Öº¡í0L?¥”½’ü$ŸKrZËqÞ®¡ZëÅm‡fŸÑ¡¾}’ ¤Y°ÓŸdÏ´1fˆññšewŒå¶o¯ÈËVo-¸”I˜f*Ì…˜$,Y÷œw`N={qæïµûw­}-/¬X—»ðB–ݹ*×OZ—3iR̤©1[Š1óæwå=瘾K—æ Ã¶–¿ƒý2Íä«{ú‡ïl; ðæ ŽŒ-MòÉ4÷ÓçÄDÕ7íÑŸ=—¡—å§?y*›ÇÇ·Ü8¿vf¢$³pŸ9½ïØüÚNÈîÛÞLV“Ç|6?ùÞCyìþg¶n0±m—‰-ŸoÙ|b[9æ€ýæƒ|W>ø¡²h‘ûë·àÕ$ƒi&² ôv[_B˜R)å¿$ùí¶s¼“|-Éj­?n; £”rAšRÌeIÚ[AôÖý«Zë·˜F‡ú¤)¾\‘äcIön7QçYûê¦üô{ÏçöWæÅç×§tí\‚™r"L)9òø}óžóÌQ'.ÚºÙít°nÍæÜÿ“U¹÷¶òòª Óa²u¡Îve˜ñm%™$9öÔEé»ô¼ëô¦Õ5uÇÓìf{uOÿðm‡¦682¶8É'ÒÜO¿?‰qoÒ¦MãùñžÈ7.ËãOŒ6/n-Ál7Ju»L)%=K÷ÏYÞ÷•y ¦ï¤ÒU+_Î7ÿ,#·?– ë7M]Œ™¸áÞzo]kæÍíÊ{Ï9*ýý'稣zZ½†öb’o¤¹Ç¾i ·{sËy€×¡ L©”òûIþ´íoÂóIþŸ$ÿ©ÖúlÛaè\¥”#“ü~’¿—¤»å8oÆåµÖ¯µ˜¹F‡úæ&ù@š;O²»‰:ÓÊ_¬Ím7¬È]·¾MÇ·›þRº^» 3o~WN:〼ûܳø é=|§Ž×<¾ìåÜ3<šgžxubÎDf“äò$KZŽÓ‘jMºk,·}{Eyyb ÌD f»‰0eû÷J²¨{^zÏ90'ŸÙݑ喯˽·æ‘{Dzic}"ÌÎ¥˜ù{uåŒ —¤ï’¥9ð½Ú¾ŒNvg’«’üuOÿðжÃÀl482vO’w·£S=ñÄ ¹ñ†ó£?™M›ê¶ÂËT%˜-¯%™¿×¼œ|öÑy÷yÇ¥{ɾ­^ÃÛUk͓˖çî[ÍÓ?[1qo½ã´˜©K1‹»÷·>|b>ð²ï~Ó{siîz»?ßv`{Ê0À”&Š«3=Ç2oN3–öÊZëÛÃÌWJù`šRÌ¥™žÿŸx±ÖÚISl€2:Ô7’äÔ¶st¢uk6çŽï?ŸÛnX‘U+×OLÙVzéš4fò˜R’w½oN;gqŽ:a¿æý·öÕMyðαÜÿ“Uyå¥ÛÊ0“‹0“Ê0[?¦æ]ï> }—.Íñ§°uã_Þ´ßïéþRÛ!`6û«$³ídóæñüô'?ÏÐ Ëòè£+·]v.Ál+”‰‰0,Ù7§õ—Ï|gæï5ó†ð¬Zùrî~4ßùólÚ°©“í 0S•bæÏëÊûÎ=&ýý'çˆ#·}製Ý×·Øž2 ðšJ)Ë’œØvŽIV%ùÏI¾Tk}ºí0Ì>¥”c’üA’ßN²¨å8“Ý\k½¨íÀÌ4:Ô÷ß’ü¶st’çŸ]—áë—çÎ[^ÈÆõ›·Ÿ³C ¦L*ÁÌ_rüi¤÷ìÅéY:3§¡Œ×<±luF~4šåO¯ù•bêxÍøÄǃ[˜s/Yš3/\’ù{Mǽ*¦µszú‡Üv˜GÆþa’ßvŽN°zõºÜô½‡óÝï<”±±5¯S‚ÉN¯~ÜÁéí;.G¾kióþ ·~íÆ,»ãɰ$ç^rpzž™¥¡]ls’E=ýÃkÚ³ÑàÈØ…Inn;ÇtöÔÏG3tùmøñlÜ4>1AuÇLvzmî‚y9þô#rÊ9Çä€%ûµ}­¨ã5O=¼<÷ßþX–?ñB’ºS¦Žï\ˆ©µfÉûæ#ý'åý½÷™ßö¥Lg+z»—¶Ø™2 ðšJ)ÿ(É¿kéôãI“\Yký~Kàu•f›œþ$ŸKò‘´·ÇÐoÖZÿº¥s3ÜèPßyI~ÐvŽéjýÚ͹ãûÏgøúy~ùÚ”RÒÕµmL×ä‰0“'Át•,=|ïôž½8ïQ–I­9ñÌÅ9`iŽëÝ¿í˘ΖõôŸÜv˜­GÆöO2–Y1¯ä¯¹ëŽŸç†ëÈC¯ØaòˤÒËŘ}»÷ɉg“ãßsdæï5¯íK™6V­x)Ë~òxž¸ïÙ´qó”˜^¯Y0Nοà¸|äâ“sØ;ºÛ¾Œéè†ÞîKÚìLxM¥” ÓÞ5ÕZOjéÜð¦•RžMrHK§?±ÖúpKçf¸Ñ¡¾ý’¼‹v¶3ºb]~pÝŠüô{ÏeýºÍéš(¼Lžþ2¹³eÌܹ]9ö”E9å×zràRSM&ß\óÄC/çþŸ¬ÊsÏ®ÝV†¯ß21f<ß±$3^sð sþ¥‡äÌ‹–dÞü®¶/eºùï=ýëí0› ŽŒ=–䘶sL¯¾²>7ßôpnz0/¼ðʤÒK×Ó`¶?9jIN8û˜¼ãøƒ›÷™Òú5òè=Oå‘;žÈ«/­™²3eIf¼¦·÷°ô_zJÞýž#ãx«9ÐÛýOÛìLxM¥”ÒìPÓ†Wk­û¶tnxSJ)ó“¬K; Ã^M²¨Ö:Þ¹€Ybt¨ï‘$Ç·c:xäÞóƒo­È²;W%™(¼lW|™ôÚD)¦t%ûì7/'ŸÑN? ÷™ÛöeL{Ï=³6÷ß±*O.[͛ǧ˜ 3é󭙚½ö™›s>|pÎûèÒt/YÐöeLÿ¨§øÿn;Ìfƒ#c_IryÛ9ÚôË_Œeèú‘ ÿàѬ߰9#Uwšü²ãksæÍÍQ§žãÏ:*´¨íËè(u¼æ,Ï#?}"Ïÿb4)1ãã;|]sðÒEé¿ä”\pÑ Y¸pÖOßùÞØ™2 ðºJ)'9º¥Ó÷ÔZWµtnxÃJ)G'y¼¥Óß^k=·¥s³ÄèPßUI®h;G[6¬Ïß.·^»<+±6¥+éꚺøÒ5i Lé*9øÐ…9å×ç¨öK×[ª¾YkVoʲ»ÇòÐ=cYûÊæí¦ÁL.ÆlymËÇ$9õœÅ¹ð²CsÌ)³~±Ôû{ú‡oi;Ìfƒ#cÿk’ÕvŽ=­Öš{î|*7\7’ûGžÙ~úK×Ó_ºJJÙöþÞûïcÏ8*GŸvDæ/œßö¥t¼±/ågw>ž_,{&ã›6O9!fÛkã[?_¸×Ü\pÑ é¿ä”,=ô€¶/£-Gôv?Ùv`gÊ0Àë*¥´¹CÍéµÖ{[:7¼a¥” “ÜÜÒéÿ´ÖúٖΠ̣C}ÿ$ÉçÛα§­zn}~xÝòÜ~ÃʬyeSº&—_&&¾l÷±4ïϙە£NÜ/§œµ8K]ØöeÌ›7Õ<¾ìå›û´*ããuë”—Ée˜f½Îö¥˜…ûÎɉ§wçÄÓ»³÷¾sÛ¾ŒkÅ/×äÁ;Æòä#/g|ókO‡™\ŒI’}÷Ÿ—s/Yšó.]šý{fÍ®Â÷ôÛv˜íGÆJ²²í»Ûòg_ÌÐàH~ðý‡³vÝÆ‰òK×֢˖©/ÛMˆ)%sæÍÉa'–£ÞsTö?hÿ¶/cVß<žå.Ïw=™—5˜Z3±ÛĤBÌö¥˜ÔšC; ýíÍ{ÍkûRv·ïôv íÀÔ”a€×UJéOrCK§ÿl­õO[:7¼a¥”šäÿléô&(»ÝèPßâ$£mçØ6nÏ]·<Ÿ[®]žgžxuëëSavœ ³ä…9ùÌÅ9úÄE™3gölÚ¶W^Þ˜‡îËÃ÷¾˜uk6MY‚Ù±“$sæ–¼ûÜž\øë‡æ'ì×âì_íéþdÛ!€dpdì—Ik;Ç®Vk2r÷S¹aðÞÜ{×ÓÛ•\v.Ât5Ó^&Þßk¿…9â´wæˆSÌü½gͦÓ΋+^ÌÏïy2Ëy6uóæmSa¶dv.ÄÔññì³÷ü¼ÿC'¥à´,9xQÛ—±»üÛÞîÿ¹íÀÔ”a€×UJis‡šÿ«ÖúOZ:7¼a¥”?Oò;-œz}’ýj­[870ËŒõý<É‘mçØÕ^Ý^·<·{e^yyûÛ«fÝN™(Àl_ŠéšSrÔ ‹rò™Ý9ø{·”ž$Ù´qß±Ó”`¶|]ëx2^S’œqö;sÉe§çäÓoû2vµßèíþë¶CSS†~¥RJ[;Ô\Sk½¢…óÂNJ)§&ùX­õ_NñÞP’ìùT¹«Özf çf¡Ñ¡¾¯'ùxÛ9v•'—­Î-×>›{oÍøæW²c¦kNóù½çä„Ó»sÒédŸEóZHÎëyö©WóàcyêÑÕß¼­S7¿v!&IuÏOߥKÓwÉÒì×=£þ½ö÷ôߨv ûçIþ÷¶s¼]Ï­x)C×Þ“ïßø`Ö®Ý8q½CáeŠ"L™Ó•ƒŽ;4‡ŸvT|@Û—Áëß<ž•>›_Þ÷dV?÷Òv˜×*Äl™sÄ;{rñe§ç¼‹NÌüsÛ¾”]áÄÞî‡ÛLMø•J)míPó£ZëûZ8/lUJ90É¿Hò÷“üe­õïNñ=Ë’œ¸§³%ùϵֿßÂy€Yht¨ïŸ¥¹?êX›7ÕÜuëó¹õÚåyúÑW^óû¦*Â,>x¯œræâ{òþ3u‚ÈŒ²úÅyð®UùÙ}cY·vü b’dÎÜ’3.X’ .;$G·ïL¼ÛÜÓ?ü\Û!€dpdì²$ßl;Ç[õÀ=Oå†oÜ;òdj2Q|éš(¼Lš ³Cfþ>{å“Ì!§üÿìÝi”dç}ß÷ïÿ¹Õû¾Ï‚Ù0XÀ@‚$†$DŠÔPâP´©ˆ¶ìXŠô"öq";‰ùÄö‰äÄ›ŽP±OŽ_ø8ç$vÇr," I¦D q0Ì ö0;fëîé®Þ«ê>yq—ºÕ]=Ó³ÝÛ=óûœÓ¨íV=·nΙ[ýüžßZ;ÛŠ~r¦>šàÜÑ\>~. Ád‚/Q &ni¸?¤§»Ïù1öõ †F{‹~7jè=°w ,zGDDD¤9…aDDDäšÌì×ÿ¡€¡Ïxïï¸]Ù̬üUà×di¢_÷ÞÿF“mg€®üö.õW¼÷ÿ¼€qEDDDDä.4þ¾Ÿ~·èý¸Ó“Küöy~ç<åÉÊU·Ía‚v>ØË#O²e{gN{+·R¥òÞÑ)޽2ÁäåÅ5b»öôðÜÏná‰g‡pÁ† @Úðž¢wBDDDDD"ϙܜ*z?®ÇÒb•?ùƒc|÷?âôÉñ4ì’†_®„é`ËÞ íÞ‚ \ÑoEnÒâÌ<çß8É…7OR_Z=“^ÚcœÁ'ž½ŸŸþúS<ôè†;E}éÀÞ}Eˆˆ¬Na¹&3+j…šhóÞW [îbföSÀÿÂʶ—_ñÞÿËeÛãyíÛ2ŸôÞÿ¨ ±EDDDDä.3þ¾ÍÀ¹¢÷ãzœ|w†ïÿÎ9¿x™ZõÚ1‹V¶mïxøcýìyjž¾–öTòpæÃY޽<Á©÷ÊkÄôµò™¯læÓ?=Fwï†ú<äÊÉóP«Å˜8³¼9&”éíëà‹_ý?õgžb`¨»è·q5¿|`ïÀÿ^ôNˆˆˆÈꆑ51³¢V¨ù¬÷þÅÆ•»ˆ™õøUàjK¼>è½wÙs¿ |ë6îÞjŽyï+`\¹‹¿°ï;À—‹Þff¦*¼ôó¼øíóL/]×s·ß×Ícâžp[¤²òöëW8öÊÓ“×÷™¹ïÑ^žûÚûÔ ÎÙmÚÛöµ¡ý‹øÎBDDDDDVñü‘ÉüZÑû‘UYªrðŽñ÷c><~qYÛKÒ…aÌ5Þß>ÔÇÈ£÷Ò¿{ .ØMr,•ç¸üæ &Þ9Eua1ÀÄÁ˜&a˜$(8øÔsó3ßx†û÷l-úm4óĽ¯½"""²ºRÑ; """Æ!àKŒ»½€1å.aføeàï£kxJ³†¤¢>£‡ WDDDDDîn‡Xga˜3ïÏòýoãÕï_¦Z ×ü¼–VÇõóÈÓƒô ´®½$DîAÉñÈSƒìyrÓï—9öÊgOÌ®é¹ÇMsüØ4£m|ö+›ùô—Çèì^wvÓw"""""ëϺùwúÄ¥2¿÷ï_æ÷çUÊÓóÍ/ñ¹úõôÇ9zvlfè‘]tm æ¡V]û9¹ÜY¬£‘§bèñû™:~†ñ7>`q²Œ9Çğ%ð¡D—µZÈÁÿø/þþQîx+_ùÆ3|ê {Jë"Xµ¼YôNˆˆˆÈÕ©FDDDÖÄÌŠZ¡æ¿÷ÞÿƒÆ•;œ™}ø-àck|Ê%ïýŠÀŒ™ý&ðßÞÊ}[£ÿÊ{ÿÍÆ‘»Øø ûþ,ðï‹Þ0ôùÓ ¾ÿ­s¼lúºžÛ;ÐÊž'xà±~ZZÝmÚCÙ¨&//òæ¡IŽ¿1u]áªÖ6ÇÇ??Êç~v3›wtÞÆ=\³ËCû޽"""""Òèù#“÷ï¹ï;Í·ÿÍùÁ½I­æ£&˜¸ù7ÁÄÍ0Ù&˜ ½•þwÒÿðNZº×Åy¬c³g/1ùæÌž:Oa–5ĬhŽ C‡»ùÒŸý8?õõÓ;Phƒï«ö<]䈈ˆÈµ­»%ªDDDdÝ*j…5ÃÈ-ef;€ß~þ:ŸÚ¬Ô #"""""w—BÏEæÊU^zážÉK‹×õÜ­;ºØóäÛvw§÷ùP †I£þÁV>ý“c<µo˜wNñÖáIf¦+×|ÞÒbÈKß=ÏKß=σOôó¹ŸÝÌ£Ï b–ÃN7w¸°‘EDDDDäjŽÓ@oƒÿÃÿú_ñã?~;xYÖ“¶¿Ô¯·ö÷Ò¿ç^ºwoÃÅUµÀÈ5´ ±ilˆÊô,SoÀô»§—b²Í1àŒ‰Ë3ü›þ=~û_ü¿úwŽg¿ôXQoAÙ†‘µRF643ëþ&ð7€Žx‰õ†ñÀkŒ+"""""w¹¡ýOŒ¿°o(büú7qæƒÙ5o_jqì~¸—=OÒ7Ø @¨ù:²-­<5Èž'9u¼Ì[‡'9fnMÏ}çµ+¼óÚ¾þŸï⹯m¹Í{º*MÚY‡ìðÏ™| ølãÏÍ.¦Á—å?Q@¦Šéض‰Þ=»iß•NÖ€šB0r½:;è{òz{Ù㧘~ë*Så(üâãŒfà10™Q©Ô¨,U‹ÜsW‹ˆˆl ȈˆÈZ½O1+ÔlËy<¹™Ù/ÿ¸ç&^f=…aŽ{ï§ WDDDDD¢Æ‰Ï1pï`+¬! ÓÝÛÂC÷sÿ£ý´¶9@-0rã¶ïîfûîn&.-òök“|ðÎ4µêµ?O½q« š´#""""²~¦ 0ÌȦþ¦í/Q­etYêïeø¹g(õFͪÕ5œÿˆ\“tÜ¿‹Žûw1÷Ái&^:x,oq‹¯f oî/ru^-""²( #"""kâ½÷fVÄ 5j†‘ffO¿|ú¼ÜŠ0Œ™µ›oÁk_¯ÃŒ)"""""’8DAa˜Ñ¶knÓ7ÐÊO~mÝÑŸ@ÂÚíÞ+¹[ô¶ñÉÏobÓ¶.þþG× X ®áóz黑õ«°IöÛûÚ_ê­Q83jÓ3Lüéazž|„–ÁBÃr§ñž¹ã'™=öNt;ÁÔYÉ}`fŒlê+jOkÀ‘¢‘µSFDDD®Ç!òÃô™Y¯Z0äz˜Ù&à¿Hôî­Ð¬f+ànÑë_­B#"""""E*ìœdpäÚá‚©É%þ¿õ!>=ÈCà‚[uZ(w»™é ‡^ºÄéfÖ´ýÀ>¯·É4p¼¨ÁEDDDDäš ;¯ÙTÃ4þÐp»29ÅÄþ€¶[éÜs?®½Ð°¿Ü*Ç™;ö6Õ©CÌ 9ÌB¼3£Œ79ÇÐhaa˜·ìX(jpY;…aDDDäzõ¥ÜvàXAcËbfmÀ_þÐs‹_¾Y¦¨æ"…aDDDDD¤H…“¬¥ R 9üƒË¼÷ÆO~z„{vuÝæ=“;YµòÆ¡IÞz}’°võ6˜DP2z[oóž­êµ¡ý×¶£"""""R„·€ =ïG6÷§­ 1M®;céÌy*.Ó¶{'m;ïWÄ:²‘…só,¼}œÊ…ËàãŒ8°0 ¾`†aøL(«¨›RKPÔnëïñ"""„Â0"""r=†‘uË̾üc`÷mBa‘È{À Ð÷À#×.˜™®ð'/œclk'O>;Bß@aáÙ N¼;Íë?g~®z]ÏëjÅŠ+%Ò÷"""""ëØ½µçL>‘÷ØÃc}«4Ã$AV„bCß?Aå£ ´íÞIid(ïÝ– È×j,<ÍÒésP­aÎða¦…ߨLä ’`ŒÛ k…W‹ˆˆl ȈˆÈõx˜:r·¨Àlfö(ðMà ·q˜%àB“û‹ølžòÞ0®ˆˆˆˆˆCû†ã/ì{x6ï±FÖÖ ³Ü…³süÞ¿?Åý{úØó±AZÛ´’­\ÝÄ¥Eÿà—/,ÜÐóoð³z‹.rpY“C†ÙÔWºPoˆé`©'Ä!˜¤e(Çàƒï`Ë3ÓÖÙ†_ªàkaýó…Ç›1\\æø½å¢‘ë£0Œˆˆˆ\¯"¾”SF0³/ßöä<´Â0"""""" k­i[†™™®âxøÉ~î}¨—W^äW& Ã(Ä`.š¬cÎÒPÌÜL•Ã?¸Äè–î{¨ŽNýÉänuéÂ<ï½9ÅÜL‚3çÁÇsuœáãÏRO Ÿüü»ìÅL_©4}ÍÁ‘ÂÂ0G‡ö¬5¸ˆˆˆˆˆ¬ÙQ Jó÷†ÇzùðøÅ´ÆÌX,Ïáœáto侯}–ñwÏpñÐ;T–êA׊ñ¡§rá2µ©iJ#øΎ¼ßŽÉ{ª“W¨Ž_°V¾$Á(307›†Øô‰=t õ”΋3óévõv_dFÙ@ô—¹^Eœøo+`LYGÌì>àŸ_-h†iô°ä>ãp´o7.Ð93µϵ0Ú:ŸüÂ&z|€þáÎ|0“,<]šáÒp Œ_\`jr‰­Û»¹gg7A •lï³3>|ošÉñEš‚Ržô³”|nð×âxü“C<ú‰!ZZ\:alvºy¦Àf}o """"²Ø;°øü‘É7€Çó{d¬¿¡é…8 8Ã;ðÞðμÿº·qù؇\yï$ÞÓðœø$Ì¢fóq}XIÓïtáÜ<µÉ)|¥’¶¹ŸK{3ð¤!˜RwCßOߎ1J¥Á+猥™¹z¸*i"ÂSFDDD®Mÿê‘ëu ¨-9Žy™9ï}˜ã˜²˜Y/ð·¿´¸+§—ßafý@OÎûqÑ{.ç1EDDDDDVÚ°:þ¾£ÀÓy=Фq£ž@áéjåK_߯™gxõO.1=UI1fÄ 1Ѫ¶Þù33Œ_žgÛΆFÚó~[’£j5äÜ©Y.žŸ£Zõõσ·z Æ×Ã1»÷ôñä¾aºº[Òf¡ägfµ0LqÍ0š´#""""²q¦€0Ì𦾸Áƒ4VCj ‹¸Ö6œÃ J­%†¿î][?ú>óçÇÓà™ðCrÝ/.R½p×ÝIÐÝUo‘;†¯V©MÍà—!ôé—,Fb¨7”JôîÞÆÀÛ(µé%ÎA|= Ã,o‡ë-ê-Ö†,"""×Oa¹.Þû%3{x"ÇaKÀfàlŽcJÌÌ¿ü}`¬Ø½š7èFDDDDDîv‡(" Ó¤q£Võ,ÌWik/E“-’•Dͳug7›ïéä£WxóÐ$µšÇœe1Ñ¥sF­ê9õa™ñKólÝÖMg§þŒr'ñÆ//pþÜ,•J´æŠsÑjµxðÎGónâÌðHûô0Ûڣό£þÙ‰'ø¬†T3Œˆˆˆˆˆ\Û!¢¿‰æjx¬·1å`F¥w¤ßãÞ<­í-ôôuõNu^-""²è¯8"""r#‘o¢àÂ0w3Û|xªè}ÉPFDDDDDd¥BVÊ\­qcfºB{^1MžHæá¸Àxpï;îëáÍC“œú ‡â  m1°°PãÃ÷§éhcd´ƒRÉåùå6˜­páü óÕxáÚ¤¦Þ ã<àŒ¶Ž€=O ²ã¾îLø%3OÌ‘cš…a:ºJ´u¹¿G¢6çcE ,"""""7¤¿ý¥aêA3cqfŽ®Mƒõ ‚ïŒÀÞŒŽá~ZžÙËÌÙ Ìž<Õ0sÂÄŠ_XÄWj¸Öp:·Þ¨|µŠ¯Tðµ0mòÄí/fQ# ѹvÐÛE÷}Ûiïï&(¹†LC &þNf±<dZaÌ¢Ïh1NØ;0^Ôà"""rý†‘qøåœÇÜü ç1%Gf¶ øMàϽ/M( #"""""²R!ç(«5nÌLUÙL4)ÃùxJaÞ§-1í%žøÔ0;ìá­Ã“\™XŒƒ–†c²m1åòsóUÛèëmKÌ•£R ™Ÿgf¦BFM0Þû´ý%º4ÌCÐbÜ»»‡û÷ôQjuõù[ñDŸäÒ¬™™Z†)°æÍ¡ý‹\DDDDD®Ûë@äšíêç9IeifžÀA`B-.á¼áõ˒ѹu”–áAæNgéÒø²†C1ÞV*X ë ¨V‹š` |1‘\'ú½·´ÐvÏ£C”JIø…t’(Cˆ‰?[ËóÑëz¢pÍðX_QïVÙ`†‘QÄʯE$fÖüðßïN3ÞûÙ&÷ñ™,dÕe‘Uªäü·†U›a¦–âI> ,`sñd O´Ð¨Aß@Ï<7Æù³skŠ¥…Z¦& Æ$“4ÌH®G—¡3‚–;·Œ R9{žÚlÒð±2cI&.ñµ0Ï·,×Ë ï©·þ°¬ý'Þg´ŒѶi„RKÐг¢ &n„ 2Í0 å¹eá)-¬FÙ`ô¹E¬P£0ÌÈÌþQ̶¢÷å*šµÂ@þŸÉ+ÞûrSDDDDDdUCû.Œ¿°ï-à±<Çíê-ÑÚæXZlœ8Sžª.kòð™Ë¨ýÅã£ø¾±- ¶súÃYΞœÁC´:i2#m‹1Â0äJy¶Å€îÎV‚ ×…{å:,,U™«P­FŸ‘z ŒÅáp΃‡®žv=ØÇÀPk‚iz±t"™K£|¥If•ÀV4iGDDDDdã9DÎa3ch¤—KËõŒ…éy‚À}Üâ$m0†[v_ È´t´a»¶S›.S½8ޝV3‰Æ,:!ÃJ¾R¶•õ#nx± B˜|·>N2¥í0@ÐÓMËØÖÖŠ+¹•ákˆ ê×ñžÅÙ…ô;i+, £E&DDD6…aDDDäºyïgÍìàá‡UæbfOßö½/k°^Â0šÐ""""""ëÑarÃ@Ô¼qáô|Ã}å©¥(ô@Ò“LÒ ÅD“n|´ )QSH8¶ßÛÍØæN(3yy±‚IÛbêÁ˜Z虞_¤½¥D[©¿–¬5ïY¨T¨TCÀã pÑJ¶Q Ƨ¿Ó– `˽]lÚÒ‰ÍÂ/¡lå6‹ó5ª••«Œ¶æýÖš´#""""²ñþ|ÞƒöréR9ºŸ-–ãf>nñ.n†‰¯‡Þ¸¨¦q8BO7®£Ú•ijÓ3€¯`–ÿ8Ãu´ãÃ~nA¡˜uÀÚÛpííà=>ŒêuÍH*FVkk¥48€ëêÀœ‹›^H[vƒ&ÁçXY*Ï“„±ÒÕ+ÌŠl†ÑyµˆˆÈ£0ŒˆˆˆÜ¨Cä†YÏÍ!²Ff6ü}à—È·Yèf¬—0Œ¾x‘õèð—òt`¤IæJ%)$M0Ñýæ aÒÇ’‰ñ*¤fÐÚ°û>Ê›*œ;=ÃÂB­¡&šÔ½®3£êCÂZ…ørŠ{gò@ÕjTk5BâßuÒã=Îb  v°yk¥V«‡–…^p,kŠYÙSžZjº?ƒÅ4ÄDmÎ"""""²±ò7ÀáÑ^xã\&¨óÓsõЂτ‚zð%ðïB‚lXÆû((ý}¸®NjÓeÂùÅ8ëЊI®[K ®¿pq‰Z¹ µ• Èíem­=ÝXà¢LF¿3,ýÝ7Á}ÝÝQÃOòÉŠàKüù±úç(XŠq°43WÜøhq †ÇúŠ8ì8WÄÀ"""r㆑uø 9ާf˜ ÌÌZ¿üm °e\nЊ0Œ™À–œ÷CaY 9W]6(_YÊ´y$ÁÃÒ&˜(Ñð˜ù(ô­o Ý=-ÜÿP?“ã‹\º4O裆s– Ç$m1º0j›©:¨åx$Òâ ]ˆ¯Å¿#Oô;O”ïs:»JlÚÜI{G) 6¥í?Iø%ó“y,¹MC[ ÌLWšîÒ@“ÏgÞÚp¦ˆEDDDDä¦.bÐá±Þ4“, °8·5¨:Ã{Ã;7Ä¡ƒ ˆšaœ³zX&¨_£æ£Ö+•úzqÂÙ9|®l‡É„b\g;AWÕéjSåhE¹­¬¥Di koƒÐƒëÁ%>Lw£Fko£ÔÙ¥RÚîƒsõð‹5†a·<Ý—½±<ê-BÞã=E’Bþ_‘›£0ŒˆˆˆÜ¨¼¿2³.ïýlÎãÊM2³¯ÿ¸¯è}¹AÍša¶AÎû¡/ßDDDDDd=z âIŽš4oÌÎT }¶í%™´±¬ ‡bHW5Ëlïoô¶ÑÓÛÊÄÄår=h“%²ÁA‡‡Ð¨Í{¼B1·k×­DLýÎñà]Ô”m†ims ¶ÓÝÓ‡`XlÉ6¾,ŸŸ•4 ¥Á˜ø²<µJ¦˜f-¢!""""²Ø;0ñü‘É“ÀŽ<ÇMÖ/´ú‡Å™yÚz»â€‹Ãù0 1à}dðñuï’Ëè¾Ð¡sñ¹™Ç¼ƒ–Ao7áâ¾RYÑÓðã¥Á>‚Þj—'¨••÷¿-œ£44@ÐßK‡!Þ¡Õ[Z ‚)9\[VjÀÅmª†Yt}Íá[ùøÂÌ|=·ùbÆðH!aW‹ˆˆl@ ȈˆÈ*bbþ6àíÆ•`f{€o_,z_nR³0LÞME³À;9)"""""rMCû–Ç_Ø÷ð@žã6mÞð03U¥w %š”Çû$Üi‚Iš@ðQh"¹/³.ÎcA ††Ûééiejj‘Å¥Z€‰@M'p˜3\ Z:Õ9Xš ñažGåî´­=†• ¬yÂ0½$ 0pÑïÞ9£¯·žžV\`™Ö k…_VÛ6ûc”¯¬ Ã8gô µæ|TMÚÙÈ‘{¦'J! !,NÏÓÙß\îÍqØí( ³î™ÙðÀ_áÎø÷æzüP‰ˆˆˆˆÈºu˜¼Ã0«4oÌL-Ñ7ØRoûHB/$m1¤¡o†9WÚæ—f2ᘖVÇÐ`; ‹5fç*x|½&m‹!½¯­×hïq,LÕX˜ÖéÜ­à£c0 ¥ÓCOXói&jñõß…7:ÛKtwµ”\ÚÓ,ÐÒ<ü²r›•ÛÂL“f˜¾¡VœËµ()¡I;"""""×!àÏä9àðhoš?Hƒ(ÀBy.z‰B >0O‰:½«_†Ù€L|z-Pá=Þ¹èÒ;¬äñµ°Þ1»ì$Ì2÷Ý]î¦6>ÉÒÙóøj5ÏCtG º»hݾkoLJ|¡Ï¬ AŒ2³hqç° ªÃµøÄÚâ Œe›_‚•/ ?·ÃX67Ôçâq3­0ikQît^-""²Ý “EDD¤8‡È? #ë”™À_þ.0XðîÜ*Uà£&÷çýYÔo"""""²ž¾‘瀫…aÊS•hÒ†ù•0ŽL(&z‰&]ÔÛb¢ÕPÓÀŒÅ!g´µ´–«,Õjq&ŸÆ`LP2zÆZè€òÅ ‹³ ÅÜ3è*Ñ5àñ„ñ"Â8¢Ul],b`¹9 ȈˆÈÍ8 ü\Žã) ³N™Ù€o½/·Ø™UYòþ,jB‹ˆˆˆˆˆ¬g¹OÚi&ldæ¿$ák½ 3Ä—™êã—fâv‡'LÛb23pž¶¤ú"H IDAT¶€RP©Öð.L0Ù‰É}­ÆÈ½mÌ—kLž­P]T(f­:û¶´âJI Q›0ñªÃÞÀ9O«+Q .Zq¤?¤á¥f—¡—fá—å1åfa˜ÑBÂ0'†öœ,b`¹%rÿ[`GG+]ÝíÌÎ/Õƒ'fÌOÏe.q3Œ7|zY¿:Ÿ6ÈÔ2çBœ7j¡3Ì;¼÷˜‹/ã×±ZH8¿ˆ•ª¸ÎŽzCM¼/XtŽmΜ£û¾ítÝ3JùÝ“,^¾’÷!ÛP,ptïÜBÇö-x3j5;„5èúLèÈW*øù…¨Í'pц–\¦õ»é톰‹£~;h¼y@&Ý.¾onzžÆ/xŒá‘Bšaô÷x‘ Ja¹yOvQf1³ÝÀ?¾Vô¾Ü&§V¹_Í0""""""u¹O(µ8ºû[(OÖÃI8!m}YÖCÜð²<Ø’ άh„q@Šil“qæi j¡Ã[ˆ+eša’Ð…KZc { DÏ` Sç—˜8»DXÓJ¶«iëtŒìl§½' Vó„a€q`>sœ}ô; ªGBJ–†_‚-éï§ñ1âç4 ½¬ØÖÀ‡ž¹™ÊŠPÖ`1Í0úÞ@DDDDd;°wà£çLž6å9îÐhs§&â•"sSsú$Üi†Yv_à ,Ëx|ü|ï¡ïüŠ@LÚã=¾R¥zeŠ £×Ó•ž%A‡cœ3‚îNFžÞÃÒåI&ÞxŸÊÌ|ž‡lCèÚ:Bÿû°¶6ÂZH-ŒÎ]|Øñõ& _«N—ñÕjÔa,>qŽÎ— sÉýñï$vÉÞ¶úýõð Ûñemi‰j¥Zo§‰¿¯‰Z‹r§ój‘ Ja¹ Ãܥ̬ø[À_ ™å‘“õ†YÞÈq<‘ë2´ÿàøø ûN‘óyûàHÛ²0LÜ ³¬ g>ZÝ4 ´dƒ-DA¿ì¾lpÆà1¢É=fõ€3ðUGz\G<1$i$IÂVŸ2¼½-­\ø`‘+ç—òŒB0ÎW¿é$ª¨ÆW ¿hñ‚µa•Õ-i°%Ó“†—â×IÃ4 Ÿ…Æmg¦—‹Ã0õ4ÌÀhk‡N+ØŠˆˆˆˆl|‡€ŸÎsÀáÑNŸšˆnÄ'PsSsiÁF”[1|àÓf˜ÐGM aµu6†f¢û’ Lè-¾ÄI ï£Ð…÷ñùµ‹ÎójFmf–pnŽ ¿ë8â EÜê sÓÝ›‡˜~ÿ ão~HX©æyèÖ¥öFž¸ŸÖÁ>š§z|¦Q5i†ñÂjHmjšpf.ú}¤8ý"cåí¨·~1kÃq£Pc@fY‹Læ9³åyH»{³Í0 ȈˆÈÚ) #"""7Ì{ÑÌÎ[sr[NãÈ*ÌÌ€_þ9¯LTõ†9꽯\{3‘B"ç0ÌÀh'ßê…òT%mÁ–5¤–zLŠñf˜‹Â.QŸL4S¤Y8Æœ§ÞSÌøš±4í)µ{Úzƒúj©ñª¨õà…ÑÚîØñX£ÛÛ8ýÖ³WîîI;f0²£M÷uàkžË´ÁÔ›aœ7jUÏRÙãkѤ«zøeeèÅ~\e[Vl› Æ4f`¦\I·ÍP3ŒˆˆˆˆˆÜ˜Ãä†éIO„’ó›Ù©ùz“‡Ï´zx‡s!.0‚8 $0™ÐLè¢ÇÃL(¦æ ï]tþaÌa. ÄdÃ2¾V£ri7=ƒÄ:Û£óêô»Þ>8cè¡í îÞÌ¥×3þÞ™ÆêλD©£M»Ÿ¾][¨…†>[¼ƒwÑ‚ÎE …Ô¦ËTƯDA½ý%N]ívv±`yÐ%þ$h|I‚úsç§çëY˜ôsXX3Œ™Ù †‘›u˜Ã0ffÞß…ß`­föià·€§‹Þ—^~GÜŠÓŸã>è‹7Ù_ËsÀlè ic)_©d+q{HxÈ4Â82¡˜lè%¢‰H3æÓ Bæ Š©?V‡Ê|•Îþ€Ž¾ ¢ˆ&îdUíjá‘Ïö3~f‘SÇfYZó<„ëBÿX+;뢽ˆP«ùz&ž°“4íøªg~²ÆÒœFW ´XÃåÕÃ/«m»²]&ÙffªÚðxòmÕÀ¨Â0"""""rCrÿw}cG”ô¯VªT*m-qLvñqÐÅQ¨! Ë$—AIša’€L\Kâ3Í0iJ#>ÿó> ÇDa™paùÏPè¡kËVj‰1™…'’`FÐÑÆ¶O?ÊèÃÛ9ýƒ7(4‘÷¡,„9ÇØc»ØôÄýÔÂ0.UõiLZèbP™[`öÜ%ÂÅ%pd`2Í0M/£ÇW#9W%eo§—A68Ê€ÌÂôºi†™ÞÉ{P¹5†‘›uøJNcµ£À…œÆÀÌîþð EïKš5ÃäºÒ1šÐ""""""Cîç. ¡ƒx~Fµ²8_£µ=šÐµ½Ä0¾¾]pqõiõ&˜L8&Ó&³¼ &½tÑ” £ÞHãCcv¼ÆÂtHïX‰öž œpõ ;΢9@c»ÚÝÑÎé7g9ýöaíÎ_¤£'`÷“= nn% £6óQÈ…xÂT2yóÌMV™¨EÇÙÙª!•z eeåæ¶mܦ<µÔðyJÒ0ƒù‡aÎí?x>ïAEDDDDä–Ë? 3Ú“9Ñ!>ÿ1æ§çèë›<’°‹à}lˆ‚2qXÆ×/ÃlÂ×fjqƼÃ{¹øÒ[½-&ˆÁγ81ÍÒÄ4Ý[GèÙ2„Ëœ:W?GsÎèé瑯íc⃳œœ¯Ø;p÷­N"""r‡PFDDDnVÞ_ÊmGa˜\˜Yð7€¿ äþÓ:¡0ŒˆˆˆˆˆÈÚäÞj97äí±™© Cíx[Öú’[|fiÒ“¶Å°²¦IL2a# Ñdi0¨.yÆO.ÑÞ0xOA‹5NØq–†c‚VØýd÷<ÔÅ»?žââÉ…œh>J-Æ®'zØöpaè3-05Á8pÞ,”kLž]"¬‚É1«_6†TV ´ÐpÙ¼)¦Ù¶«·ÊÌLUã ´uttåþ§7}o """"r8°wàÄóG&'¼ÆlÖ 07=ÏÀæ(ìâ‰a#ô™Ö8 SËD—3|d|Ü*cøBsx·<C“¶˜8$“„cj!å“1aœÝ[éé‹C1õÀEr®íŒ>pc÷máÌ«ïrò‡oQ«Ôò:¤·]×p/÷}þ ú·ÕC0IáŽE‡Ïâ롯1}êÓg.ÄM0̓.k¹Ý4øÒtI>Mîk²ÝÜÔË›a††»¾ãɉΫEDD60…aDDDäf†y9ç1ï:föóÀo;ŠÞ—‚†©GrODDDDDä† í?xnü…}€±¼ÆXÖÀ‘„ÊÓ†7·g‚.dÂ+ÙÀJ“&MÌYŒˆš`’¶˜hre[b’±\”†1<ÞÃüT3S³ôojex{[ªHBÑÜ’ô¾ÎÞ€'jˆ‰sK¼qð åñJ^‡ô¶Ûöp=ÓKK»#Œ'í¯ …`¢óPY¹xb‘…r- ǸUÂ*I0¦ávôÃòÇ–Z·«o³üùXºÊ†k VФ‘;Éaàóy Ö†!=Á™›š«y?ÞC-ôi~Ȭ~ÝYÔ°:}a‚Ëïž¡ºTÂ/.9YNju¬ùm—­Ý©ßn ¶põ ‹­í¾Ù©ù¨h5ÉØ14Ús­Cq;ä¾À‹ˆˆˆÜ: ȈˆÈMñÞŸ6³ËÀpNCæÝÊqW1³¿|¦è}Y¦¼÷ÓMîÏó3ø–÷~>ÇñDDDDDDnÆ!àËy 66ÃXP°¸±£Í爷«7ÁÔ+>¬I[ ™l Q`cep&zñõû–•„g|͘<»ÄôÅ c»ÛÜœ ÅÄ+Ù:#$2º½±¿¸‰Ggxã¥+,͇yÚ[nhKÿÄ }£-Q¦Ϲ‰0É<(óVáü L_ŠƒEk «8‹Â/+¶­‡c²¥A·ìuš´Á¬l–±ès–N؉îO>“9SFDDDDäÎqˆÃ0ƒ]¸ÀEË=dÚ8f§æœF7äí/A6ìR¿Ä DM0qhÆû((ã¢×ñΨe_¼‹/Îa¼O«B£„DÒhl’ñÌ]žâÄŸ¼ÎÐÎ1ÆöìÀµ•ê¹øÜÏ% Nôwñ±Ÿû »>ùoü[R6 sÆÎgä/ ±dƒ-.j‚Á×DZ´ †zpÆ×_×/ËyðP]òœycŽñ3KlÛÓIÏ`K´àj&“„7œ3î{²—öpìÅIÞ{uú¼ñMëì)ñøÙþpaaÍÇ!˜èxF-0ñû áòéEΟKÃ2É‚´WkhɆU®hÉ´Æ4l³,ÓÐÔ´]f¦–€ú”XÙV”}w """"rçÈõß÷΃C]ŒÏ‘=»™½2×p ‹›`’F‡^Œ0 ÈÄᇆÐLˆ2ÎYÜc /q½IÞˆÛ`êaðίÄøšçòû1yò[÷îbìþ-QhÃ’°E¼àD|.8¼s”ÏÿêN½úG÷e¦ç®zlÖƒ±¶òø×>E×h?aè£62‡+nU1áü§_ÿ€ñÀqL¶åÅV¿m™Û+d\&IJ² &–·ÆAv;[žIBTÀ\y>§ÞÖ»¢­èö[ÞÈ{P¹u†‘[á ÃlHfÖü*ðw€¾‚wg½Ya­B#"""""Iîç0ý#mLœ_Ho¤Ùv–$Œâ㦗z0†z(ÆÅů” ¶ÔÛD’Wˆ^cEŒ«ïG³Fšd 0æ®Tyë¥)FîigÇc]´w™“Ìê«mŽy˜?ÑÇË߽̹ãë{ÒNP2ûÌìë&;…ˆÂ@ÑB¿?0百XáÄ‘fjih­ -Í/Yöûm¾MÓm‚1+Ûe0ci±ÆÒR˜îSòüÁü›a&†ö<‘÷ """""rÛä~^=<ÒÃøÄ\ÃyÑÌÔAWœóq¨%nüð†sçôõ# ÈdÃ2ÄA#ˆ_‡ô5kÑ+.æ-n‰Éb,ªM*Eã:”¤I¦¶Tãäßáò»gØõɇèß2˜i`µz@&¾~ï3²ãÉݼù«¼ý½#Ôªµ¼ù5õŒôòäןeËÞ„µ(Ñ[`|ܾVó\xó$§_?AX !–µ»¸«Üv+o7´Ã¸ô8¦á·,ü², ³â'¨?7ûœ…™üе>Œá‘î¼÷Ñ{*y*"""·ŽÂ0"""r+äù¥Ü¶Ǻ£™Yð ð@Ñû²N) #"""""r}ro¨mcâÂB}ÒPžZŠ&¾Äá‹l`¥¡ Ÿ ¬Ä«©fC4i[ ™PL¦&£10㓱š4Ò,ÎXh\:µÀ峋ìØÓŶGº²‹¯Æ+ØÖ'— njåË¿²•ÓoÍòÃß½ÄÔ奼ù5ÝûxÏüô}%ÂÐGm0¾,qñ2¶Þ`a®Æû¯–™8·½Ïe”ë ´Ø*Û®üYÛ¶Ö|[³ÓŒúg'ÙךaÔ #""""rgy˜ºòph¸Þ¹ØpßÌ•ù4Àà‡÷avñD—'ôÑãaɆe¢Ë ~Nô:Q@&p†!L0Ù@ iØ%M{¸8$ÓÐãñÎêÏÅ1;9ÃÑßý1#»Æ¸ßÃtöuFç IÆ¢sksF[G+O}ýÓ<ü¹Gyùß½ÈÉWßÏëp_UK{ øñ ̵ÐG‡€da‰8ŸŸNœºÈñ?}›…ò|j ‚ÆÆ—†×ä¶]óvà’cHc»Ëª—Iø…a™lfnz>óÎã“j|ôy̗ΫEDD68…aDDDäVÈs¾šan.„¹ša3sÀÖœÆ÷Àk9%"""""rÓ†öüpü…}“À@^cŽ´Äm.Ñœò•J= V¼Ï„X²Á–4°ÒvICލ ÆûLÐeY°ÅÅm2é™&˜tŒd?Èoê4aÍóÁëeΟçÁgzÛÙj[I’¶˜u³ã±nŽþñ$/÷2K a^‡|U#÷´ó™ŸcÓ½„5OF–ÌE ó>½V=ï¿Væô[³é<§z#7Ri²ÍÍm»ú63ÓÕèñÌû7†‘›s`ï@øü‘É×€gósh¸'¾V?Ùšï£Vïë!|ÜA©‡eÂÀÄÍ0.Ä>–ˆÛbê鎤ñÅš´Å¸¨¥¡-¦¾}ú\‹»ôÁyÆ?<ÏΧw³û™)µ¹yçDú6õñ¥¿v€Þ<ÍKÿÇ1qúr^‡½‘ÁCŸ{”O|cm½iL‚IïHÞîÜx™·¿ŒË§.c¶ºÄsËog/Ýšn§!– Iã‹Ù²ð‹- ÍÄá— yhfnz.ÎÀDßøø<|x¤çë–Óâ”"""œÂ0"""r+¼L½9Œ5jfmÞûÅÆ’»[³f˜Í@KNã¿ï½ŸÎi,‘[å0ðù¼m_Ö ³åJ^I›;\´½aqÛKý1V,^…4jri Ç8!4„^ƒ3†_£Y#M2–sF¸¬‘&Û~2?SåÐL0¼¥G?ÛOßpkqõV’¤-&pÆ“?9ÌCÏ ð§¿s70­¢›³ŽžŸþê(<;M` “ I€«€¢ ŒqöÝYÞþÑ4K µhu^—ïøX4â€Læ’$ tÕ@ —Ͷi¾íµhÌŒòT%}ÿÉs1É= £I;"""""wžÃä†éNÏiÒ<óå:û:¢ K|ñBgqÐ%Ódœwxd2AÜæ’ ÍÔV4¾[/ Äà­±-Æ2a3¼s a™°òþÞåÜÑ<ü{Ù¾wGÚºš,2‘´Ä8glÛ»ƒ_øÇ¿Ä±?8Ìÿ¯™/Ï_ã¨Ý:›ÚÊs¿òE†woJC0¸z&zÛQCÌÒ|…·þä N>‡´éÅâ„Oh¡!ã–cÖ„ÁV¾¤á—&÷­¸¿Éë΢ÀUü=LÑ £ój‘ Na¹iÞ{of¯ŸÍa8¶ÇsKînÍÂ0y6é‹7Ùˆ‘gf¤Ì¬èdzÓUºûZXÒ&–$ÔÒä±8hBXñÙÀÌŠ&˜zˆÅ–[\Š©¯pZo–il¤Y˜1ƒËgø£sž]vóèghï 'ë$ã½-üä_ÚÆÞÏ óý{–sÇgs9ö.0žøü0Ï|eŒ¶Ÿ„^ê-0ÎE&Ï-òúMpåâR<á(9^«P\c ¥aÛ$ “f¨eÜÕ-Éë4»yx¦ñ903]©‡`’OžAßPk.Ç>C߈ˆˆˆˆÜyrýw~óð1;5G÷@gÚä’„]¢€KÜ ã³A™øº7BµÉ¤¡™ –É„fBÃ×1–©AÉ6¾_ÜÚÂ2.:§Ÿ//rèw~ȉ—ßãc_y’ámÃi(#9ÇÎ4>ö3OóèO<ÆŸþë?æðó¯Ön_ kÏpŸû•/ðÐg¥æ=a\Ò“”æÄç¾ò>oüáQ–ªqLrÉ®‘Üoõ*œä±l5NÓÛ®ávC¨%¸Fø¥IX¦ip&Ó03;5·â3×ÝÓF[[®ÓYkÀ‘<‘[Oa¹U‘O¢@‚Â0r») #"""""rýç9ØÀHkcÈ!¾fºBÏ@KÓ&˜$¼âãÀJ³` q`Å!†ù•M0ÄM0>n“YÙSÎ8Œ°Ù~8É«, çøÐóÁëeN½=ËÞÏ ðàÇûêóX\6%ÝÙÉÏÿÚ¼ó£+üÉoŸ¥<±tÛŽû®½}<÷­ lj‹^RI/êšaÌ`a¦Â¡ïMpêÍÙx^ÎÕ(×VÁ5Û–L@&óz -3ÍC/ûP?ÄË·™¹RIßn¢o • dähx/ÏEDDDD$¹þpx¤›Æ³›ÈÌ•9¶8‹Ú\’F˜Bo+2nÙ}3|À²ÐLt_˜¹/tFÍ7k|‰Y¨7¾Dá•(,“¤Dâ繸Q&Ž1ï¢Å(\´?}™ïýo¿Ç®'wñäWž¢«¯3Í€4æAŒÎÞ¾ôW¿ÌÓžæ÷ÿÙwøà•÷oéñ.µ–øôŸßÇ'ÿügZJÔB Áãqq È’ÂUƒ‹œç•o½ÌÔÅéè½IËK¶í%s;>Ù5[ö¸ewÍn×/- ²Ä­?ñ± qð…ÆÇƒÆÛõí¬áùé¥3f®dÂ0ñw%Ãù·Â¼}`ï@~5@"""r[( #"""·Jž_ÊåH»S 8×ä~…aDDDDDD®.×s™¨&bÉ ÊS¶$Á’´¥¥1°Ò,Øgê Ѧ0i[ ™$ز¬ †ôùÑëG“pˆŸß,8ÙFšl`¦²òòïóÞ¡i>ñÓ#Üó@dÓ™ë†ñÐ'Ùýä?þöy~üݨ.ݺ•l7µóù_ØÁ®½½à=ž8“^Æ¿ ƒ0ô}q’c/NR«ùL¦Yð¤@¹ž†–µZêá—åÍ3õ`L½Ñ§¢i|NãÏÌteÙ¡7úGÛoÙq^£×‡ö¼}Ë‹ˆˆˆˆHQÞ¶kmx+ ÷ñyT&3se®Þæá‰.Ée|= ¸ø4ìzžÓšÉ¼N64ã!ô™KÒÔê]¼pD¶ñ%ɤM2qXÆY“¶ª&M2µ¼ò>§^ûÇ÷?ÁÞ/ìÅ•\|Þg ç¬ÎÁè½£üâ7ÿ3ÞýÓwxá·¾Íø™ñ›>Ö~á1¾ô_|™Þ‘>j¡' ã³ê¸Æ[‚ñ”'Êüðÿý1§Žž‚ ˆÂ. -.vã·-s{y»Œs+]²-/MZb[¹]cX&Ó"ß?se.þ¾ÄÒ6¢`V®ô÷x‘;€Â0"""r«ä¹ò«Â0r»óÞW›ÜŸçg/×Õ”EDDDDDn‘wY +ÁFWÎ 2 |¥’ E4V¼Ï„X–[¢‰5Ëî˶„d+> ±dƒ-.išIÆh ¶d›`’m’ÀL¶‘†x«¤ÕÆÌsåâ/ü˳ìØÓÅ'¿2Fïpë²w]ÿiiu<ûgîá±ÏòÇÿ÷)ÞþÑÍMÚië øô×îáÉ/ŽáDÉ¢(Üã!NþÔwåÃ#e~ôíKÌNU¢ EneHåz-«5´dÃ*Ù`ÊjÛ¬ºíjá—$“Ùg”¯,E¿Ÿ”g`$ûûÈ…&툈ˆˆˆÜì¨<dòðTãuvµÒÑÙÂÂb­áÔ²<9Gà,mr Ãy¿2ìâÎ…Qà! ÈÄ '>¨‡fBW|yh& ­1Ä’V£dÛbâsñ´-¦ˆIB/m1ñù?™ ÷T+5^ù—yçÅ·xöŸb÷S÷ÆA«·™d®ïùìÃ<üìƒüàß¾Ä÷þŲ0»pÝÇx˃[øês€íOì$ IC0ÞûìÛÄT*¼ú»‡xý{G k> ÂÄÁ‹Ã*7~Û­¼m™V˜ø±z£Ëò‹56¾\å§áyÖx¿sÆÌäìŠã4”3ŒÎ«EDDî ȈˆÈ­ò0tä0–Â0r»Zåþ¼>{§½÷—sKDDDDDä–Ú0aßkÀ³yŒ×Òêèê+±0[êA‡òTe•&–¸ „ưIò˜Ã(QС1ØÒŽqÉz¹†ùåÁÃǯѬ‘¦Ήç54ÁdCñê¶ËiN¾1Ë©·>à±ÏòäOŽÒÒîâ=Iþ3£w¨õA>öÅi¾÷~ÈÅ“+'›\ì}nûþ“mtv—ˆfù†àK½Æ3~n|ë<}8/.{;-¶Ê¶+6׳íÊçPo—qÑgffºÖpÌÆ–¢œhÒŽˆˆˆˆÈë9…a !œ=;ߊN,§'g£ðBl â ŠÂeaOè,nI2ñõÌ}AŒ‰^Ó¯ÍÔ|tòUo|!:·^Ñø<êm1I“L´CÚcsQàsËÂ2Fùr™ïþ¯ßeÛž{xî?ËÈöázAŠKšbâG©ÄOüÒs|âgŸæ;ÿô»üø[¯àC¿ú5¯’ IDATutóÓ¿ºŸOüìÇñ@-ŒÎ©ã¯pq3Ž8à­—Þæà¿ýsåù(´ñƒ–<á*·ÝnÛÕo[| ²­.+.­éífÁ—ôþ ñ¾êR•Å…•ëR+ #"""7@a¹%¼÷53;<“Ãp ÃÈíVtF_¼‰ˆˆˆˆÈFv˜œÂ0ƒ#mœ›k‚”¯,E¡†¤‰Å7i`‰WšÍVV6ÂX:±¦!0“ ¶$ášL`¥Y#M=TfâíÒ&˜tŒLp' cÄáœx›°æyí{ã¼ý£+<ó•Í<ô‰ÁúÆi¢$fpσ}ü¥ÿñcýã ¼øïN07]¹æqÝöpŸÿ‹»ÝÞI€i6Ñ' ÍÏVùñwÎóö®ÑJÁið$i]I/Ã%æ¨o{]–5Y®±­-Û–«lc³åjt,’ÃãÂ0j”¹såúïýá†0 €1=1GDÍ0õ`‹/ ^Ë2ñuo„ÎÇA#tį·Éd^;tÞ2/–†]_¢€‹™«‡eÒö¢“ó4,=¬áuƒ6§ß8Í¿þµÍã?ùŸý ûèìíHÏÿ–gIúFzø ÿÓ7xî/îã·ÿþïðþ«6=žA)à¹ÿtûÿò—híj# }Ô/Øá3»gæ9ÿÞG|ï_~Ÿ>¸ˆ9‹.-nm1«ßvIh({ûZ—nM·¯Úöb!˜ ½¯– œMB4Ùí ÊSóMŽšå†ñÀky("""·‡Â0"""r+"Ÿ0̶Æ»›Â0"""òÿ³wæq–\eÝÿ=§f¦3™IÒ7·'»$²Ø(d$È ¶b³åEäEÐWPQx4€ ú²¹ û‹;Ȧ€À€{  Y& IHÂdÏ,½÷lÝ}ëyÿ¨íœS§êÞ;Ó·z¦û÷ͧ¨[U§žsnÝâ󙪮oý!„=^Ó á®Ýu 3K¹Ä +¡$˜\€ÈX€TŒ%ÅXÂJžöâ 3¢ÉhÓåDšTªÉª”Æa‰;ù[bÉ4Ù8T‡æ;øúÇoÇ5—ìÇ“Ÿîý ­(, wŒ>õLüäãï…ï\x+~ð¥;wÊ‚ËiÛNÂS^ø`œó¸mp$÷ˆcàêoîÇe;ïÁâ‘8Oƒé[VqdwŽLœ©­·^¡Å–^ÂòK¸X˜uß^›ù0­m›ú;q#®k²CB!„BH£4z]ÝHsSréA£Lv‘4%™Çéö8cP’e"c §é0IÈh@štrKÄ$ׂšÊ+¢P“%¾d 0!YFJI2¢j×ÊE›Âx‰;\þ_W⇗\‡Ÿ{Ñv<îYçBÄ@Ä’@¤CøÈûáþýpÙ¯Àgþòó˜º{&?n£O}8žÿ†ç`ÛFÇYLîò¤"OÒõÂÔ¾ö¡‹qõ7˜È-ÆÀNiÉLœL|É&_dÉÚ‡E™ÞDHH|±^¢À:;¦n_{9,̺/4Én2„ÎÃróøhk®É !„2(ÃB!d%iꦓaÈ )É0"²Àé õO†B!„r"Óè5M–Èa…t`nz)—IœD˜,¥p’X4Obɤ•²8ã$Âu’`oƒ+¶h&Ì —.4gìDšR"Œ—S’s²DšTÜÙ{Û!|úonÄ99O|ÞYØ:øÆÇoÆÍWìlŠðøg=}æým”’ø’|–üó­×Íaâ3·afïK‚9¶Ô•Ú¶tØëº-aù¥^ž)K6‚…Ù%ç|óÏÆ¸º=6Ñ=Þ‡B!„r¢² @@ÔDg¡DŽ#‡—°xx †6À(r‘!ÿ¬HEA” 2–4§ÛãHS)&Y—KyMäÛU8“YÒ:yª ™%(Ëä‰/šîã 1ÉKœ±’d’}’}-Á—>øe\þÅËñK¿÷ œý¸‡NJzÍkË1Ö£ñ˜±Qü×ß W|åœÿºgâ‘?÷0Äš$Á }ÙEP“ߟè,/ã[ÿ~)¾õÉK±x¤‰êå•B‚1E\Möf “¶ H4Ùöð²q–}a%$¹äòK@x©”_ufÒdëÂZÙÖ¨ ÿÇB!kÊ0„BYIšŠk>YDÚª:ÙPdýq{`]“V£Ñç„B!„²Â\‡$¹¢;`xÛ¦’™°x¤ƒÅÅ6n4AÙÄVB² ò0”"¥Å’#ÂJ©/ƒ´C!„BÈÚçr4$ôC2ŒsÓ±í¾Ã–ì’™àE… “Ì5]q*NDÙgGš) 4¶4ÓÑL I%1ÐL„±R]|‰%‘e$c ŠD°±íM¯µ½$™L´¹nâzÜpéxÊ Ÿ€_xùÓpò)'p’(Mf4ÄZ¤Áˆhžs÷wã3óEÜ|Ån ŠÒ”)ÌšRj‹ýr6åËvbL¹¯’°Ò%é%OžñešT¢‰ìõ’®ÁÜÌÒ¹vz{Krmß¼®&„BÖ”a!„²b¨ê¢ˆ\ à§èîþà[0ÉàXM†7Þ!„B!k+Д 3’Ê0Þ3ó³K¹÷Ie¡D‹„g›XI,š%°„Åxi2N à+n"LÚ‡zuí¾29G%qGL¤qú2‰¸3?¹ˆ/ü¿pÖÙ÷à¼_θÿÖô9¦uàRûEô4#F×\r¾sá­8¼°TH%} -´í"´T´¯ jÚTµ…õJcOŘ¼m.Ê$ÓüÌbé\;½ÙT€÷!„BY\àÅMt42²%¸~~ú "#Щà"ˆ" V1šJ-iRˆ Œ10çi!™å²L6·k¦E&ȤýÀ‘Z$—]ê%“'°hò¡eRñÃO’E!ÚXµ Iûåå¾öáKðýÏ_†çüŸgâ‰ç?6¹–Dq ¥2L …Æéz$ל Ó øÜ»wâ;Ÿ½ *HD˜TT‘lL+¶lº/‹›.ã$ºH@~‘²c¢°0ö‰ûÌO,kUçàá³&„BÈ2 !„BVšËÑœ CÈ XPÕéÀzÊ0„B!„Ò;]Û oÛ\¿0³dI®°¢iŠ‹“Îb &K‚ 3–°¢©”R[¬4™DŒñÆ‘ÕϪ¨'ÌXI0Hk¸ã@!Þ@’v*Ä;nœÅGÿäø©óÎÄ“_ðœ|Š}¼²/äá {=wÞ8‹o|ü&ì½mÆ‘B¤~>¡E*Ú–›~Ú–÷Éh‚•SÌçg–ŠC”ƒ#ásp@tìj²CB!„BÈªÐØuõé§'©ê­Ÿ›:Š*izK$PMR?ÔHÈbͦ¢Œ-ÍØ² &«i¥ÉزÌr&½¨I®ÁK‹B-!¦H|I/êJ² ¬”õD›¤}!ÚdmŠTšùÉøÈëÿ —üÛ·ñÂ?{Î~̃_Z×üq'Æ×þõ|þ}_Æ¡…#@d &r/L)Æ–¥¿e)R\Bé.áÔ—DvÉå)K1!YÆn7?aÚt¢Áqûøhk“B!dpP†!„BÈJÓÔ4(ÃAJ…š;çøB!„BÈZ ±‡vNÞ„ Äu9$xH&”xÂJY6)D•<ÅJª’X±%ï#KiIû2‰ c'Ò”aŒ¦â')%Òdsc1ÔI¤±ÅÁU߸×wžtþƒðè§ßfƒ Š¹Éøø? ßß—<[S’Bº(Ž ƒ’Dƒ~ëõ+²Ô´¯-jÚøu ‰dåÓj6æ‡í±‰ÃMvH!„BY®DØY}ñ¶BD‘A«µS3î¥ÆìÔDF«¦óTŠˆÒ$…#¶˜HY‚L’*SÈ2q¤ˆRÙ%¶ö)öwe™8“YÒ}ÄI‹1éѱ啺ıÄK´K–K–‘p*Íî]·áÏÿìsñ¢7=ÃgœŠ8ŠX“²×}ûF|äO>»oÙ Il8©,&IeÉ—ÅZ6¡eØ.Þöþ—+eG^A.¹DY&ŠÒŒ¸õìýD€¹é¥s°=Ò¨ ×SB!k³Ú „BÈš£©”aÈ Xm†7ß!„B!k]–›èH8­]Næ˜Ï“a AÙÁ’7*ŠlÿBŠ( ÝjXÛƒòFžªÒ[ {ðk˜° räà2¾þÑáC|“w>©c™D—ùvüÓk/Å ßÛBŽN@©ý¾Þ¶ÔI”%_ 4*Ãð¾!„B!ë€ñÑÖ€››ê¯$#(03y \Œq„gŠÄK©H1EU׉¬í¹b'¡X)'bÄšGôpÒPò[*1®”âµ³ûô…UÅ¥]†k'~„8Vt:ÉÇÉôÅ~wß¼'­eÃ^Î.BMé¸ñÅeŽNŒ ýFùoú]%¼Î—iBI3Ùºƒó‡Ç~02²¥¡3¯« !„5eB!„¬4Wˆèç~ ôAÖ'«)Ą̃ê- ôC!„B!%M®¸¾©þ†G†9f§Ër„-_„Äg{YJ1¶lbÂòºÔôaw»+ÝT§§5²ç€ÂbGñ]}Y&ï:€½·Î#9hîtóåû±¼÷&´T(ý¤®ÔJ*ÎñöŽmðøã ×­{Y²qÛ,̤~—w® ”e¬‡v!„BY?4öïÿ‘v9™cfÿB‘ê\¢²ä”²ìâÜ 0þr•Tão7µË¾Ôo„Ä–úß+¸NÜuó3‡Ê'Ÿ6ž sE“B!d°P†!„BÈŠ¢ªÜÐ@WL†!ƒ¢$Ȉ8«¾yãB!„²–hì¡<™#s:ÌO/•’XœÉ‘bòƒ%¬”a,Y£R²€S£,”ôš&SÞVHG‘&c£¶çË+*´ƒ¤Òµ­%ÆÀ™—}h\Îqì2v0?»è{0Éù·­ÑdÞ; „B!dýÐØ¿ÿÛdŽÙ©P™àbK+u©0QTþ\'ÍØûJ&±X‰(åÄ—ÄHu±Úê•Ë(¹Dc× ‹6 šÈ/™Ó‰ctb…*zaLË©Œã|/k¬Y]cŠåìxÔÌ%—SÒ4ÉR]PÈOÁ¹µŸäñەχù©ƒÅ fÝÃid¬—LB!kÊ0„BMÜ”;SD66ÐY„’a׼òB!„BÈZ¢±‡ Z~2‡ó3K€j½l"Ht©3Ò‡>ºÉ&¨“R²°ÄGX1°Ä {»-çø5lù£ø.Aq'KXÉÐT‚Ñâ)”Á -¡©.™¥êw µ­Z¬ã–‰2ùo¢\AV½…™¥ÞοÁ¡à½B!„BÖÍ%Ã’9âX±0{¨6&2¹Å-*¥™Pšˆ-ÊDEBD‘ à–XŠövŠJ.kU‰6¾’l‹c¤É01–;qž£‚¢N6†Ò²ô¿,Þw2â­·ú’ê¾{NuÉ–sñÞoåÊ2Å~™,ƒtßb¿¹éöí‡E»]–±ÄÞñÑÖMuF!„ÁC†B!ƒ ‰›rÀ}臬?B2LSID| !„B!d-ÑØ5Îi#CùsÙ<Ž ó’lR)ÇØB‰/Ìø5ºH/¾á!A£{\Ìè–&#výÔ’ŒP¨ “-ŽWµÐÒ‹¤²B‹Õ5mü¾¡¥‹ð”§Ùâ‘wNÌÏ2Lvž‰§µ“anjMÌ7Õ!„B!dÕi.¦$#$W=³S¢‹Ÿür*LäJ%i& ÕDḬbŠ„“ ‰ÅGŠ$™²,ã‰&¹mÜZ¶Xb§ÂÄy:Œw¬2€åü{ÙÛýt˜rºŒ“è"ùEÇ? H3b­“ò﨤H²Ù²e›77öTþ=žBYcP†!„BÈ hêBS‚Y_P†!„B!„•áJxïú~2GÖéüÌbXœpXª“XÚ7—El¡Ã«ÑUX±·ÛÂL5êÄ[ºq^ k‰(iŒZT=ñįåÏ‹i¥…Gdé"½”å—ê6aQ)—ާû›Ï’aN>u#6llìÏmL…!„B!d1>ÚÚàŽ&újçÉ0nlÇÌäBnˆÊÒCH”‰"WŠ(‰QøsP”I?g2G‘šbK,™àbܹØâ‹ŸøbÉ2¶h“í#~?e 'ÖB€±çŠ¢½s{´‰0–¬ã.KËÅcà +nºK0FÜß§Ô.(¾„k%2Œ{Ž5˜ ðºšBYsP†!„BÈ hêe²ÒÄßPnâ\;à†ú!„B!„FH,nj¢¯ámCeíFSÆTHNÒK°ÒSšLa¥*MÆ‘J*¤ƒ"­¤[ 8R´³Å$&I„•ÓMR ¦®„ä뻇Çߥ^BK8…¦nìY[÷XTËo;?½$ÎP~ÈZÛK…ø B!„BÖ#\Œ´·úŽ`vò@)½% ÉuNŠL) %i¦®f¢G!ºd‹%ÄX©.]_ŒcÉ2Y]î 1ªÈ˜åN*ÄtâôÒKi1Ö²Øýfãª[öç¦Ïådî_T+…“ýNþúpxµÊrMd³“åd˜öH£2 ¯« !„5eB!„¬8ª:à–º¢ CVš{Tµüš×fε«T5n B!„Bi’F2N“alIAÌM-¹RJ•láH1‹ž°RJBñj”úªVàר“:j¤—äá–.5,q§8X±5%O=ÕË*eÁ¤ç„–@º JBQµ¤âÊ/ÝÓeBBKÝØÝ¶å6sÓ‹Pëé00Üü ^À‡v!„BY4r°õ”! EÉBv]­Àô¾Wjˆ,¹¡$¸ˆ#ÊÔK3¦œ¨iב\b)§ºI.Åç*‰%—e‚i1Ñ&_vÓbb:8•`Št…%íØcóÆžMÝÅ_”éU„1Îré·ð¦RòKhŸ|%¿8¿3¼Z®,3ãÈ0ɵõH{ké| ¼®&„BÖ”a!„2(šH‡¡ CVšÛ*Ö7q®1’™B!„²iä!ƒ¡“"lÞ²€ûÛ¹é¥a¥& &(Xô*¬Ô¤¸øBHtÓc"M­¸c|¹ÃýP-M…xR!´å—Þ%•Údã}·ô{Àû>Ç"´”ÛÚß±zì `~Æ~FòtX&b5ïB!„²þhì: Ý¶:’kž©ý ŽL‚‰REWi•ûÛë"»¦A!¤dRЏ‚K‘ãË2…Ä‚¼Mºo&©äµŠº®,ãÖµHƒéÄ1:qG½‹ÑrJK!Áøo†°ÇÚï² ,K¾™Àodÿ¦ø j¤_Ék…ꤿåòRç;²T1Ò\2ÌÌøh«‰—ºB!¤A(ÃB!dP4ñ° e²Ò¬¦ ÷ÐB!„BÖ"]뜶͓˜Z´„€°âÉ&¹ QJ+±Xº +pjÔH!ŽS!vô"çÔÔ¨L¤É“`üé…oGŸÌRÑÖ;öY² *·÷Û9çBõØý¶ç—ÑYVï¡4)ÃÜÞ›ØßTg„B!„ã†Æ®«GFÊ Y2L”J %©Å–*¢$¤,Í RªpD™HœD‘’t™ÆÁÂÌb"Z¥çV&^µ¶Q†!„B!„ œF^412â%t(ppá0,‡Ó`"WtqSF<á"*¦ËäÛ=¡Â«™ a‰%K\)„˜\~1–$“ &RQ«,Ú¸©4±d˜Ž‚Ê”–îË)/’¥ÅØã¶Óbé2Ƹ‰.R!"ĤRò‹„ÛF&üûزLVkvò@~-mOmÊ0„B9(ÃB!d ¨ê^w ¸›SEä´÷AÖ·Ö5‘@tª.uoF!„B!'$-wâ䨉]KzX6=,Û¿¶°“Ý$kìɲIÓtÊÇ;Kw)ÿFNJL•üR_ü„ r›$¦8¯€$q¦Õ:¹‰Ó  C!„¬I(ÃB!d0†œh„ÞVÜÄ9Æo„B!„µLc2Œå(äâÂüôb¥(RN`)'±˜„•°Xa -ÝJ’:GŸ&cÃ/µd¢GfuxSꘔú*Ë*®c÷ƒà˜{¨×Eh §ÐÔÉ3Ǥ¢ÏpÛä»ÍM/ªÎ[l£[OÛØÄé ðÞ!„B!ë™fd˜‘­Öõ!òËÆ©=ó¥4[€15‚‹½½ZšAY è¡¦#ƒdâˆXK&¯d *Æ8²‹+˸rL.ÍXuéĤÉ0q*ÄdS¬PØ‚Ž%Ԉݿ,+¸,©ãÉ/â L‘-ÅäëÝåRBWÇ—*ScRYffÿëlKîà´Z'Ãiâô>à†&:"„BH³P†!„BÈ ¡ CN4(ÃB!„BÈÊÓH¢ÅðÈ&'é³;³S‹õ)*²‰#FØÂGH¤¨Và+½'Òø¢G1Žj9ÇäòMµ,‚ô;Sa ù~…¬RLúJh±Iû¯<^2‹'´t—_j„–ªcšÏ«¿Ÿˆ`nj1}T'9N Åp»±T˜½í±‰;›êŒB!„rÜÑÈßGF¶xk’ëŸÉ} É5§'¨”ä–(üÙ•b\ŒS³j %“HšêRÈ+¶ÔbI,VÊŠŸ$#i K¶o.Ëd‰¥ºI*M¬@§£ÎwîE¦-Ô¸ÂÊÊ‹0ÆYî%ÑÅVª_,ù%²÷ËfPÈ5Ž,“ýÞÀÔ¾y/ÑWÑn7– sÕøh+nª3B!„4džÕ!„BÖ4”aȉÄAUÝXO†B!„BŽF®yZÛ†ò4µ¬˜\J&I>Qµå •qf¹ IDAT-æ¢Öº\öÐôá’D‰hºo¾M4‘= IÊJ¾ÍêË$"Š( éölž‹€ºuq¤¶H1MÛ}ØßÁúÎéq€žé"…ô+©tMf±Äxóné2ý -åd™ê±m“u³SKÞ¹…&eÞ7 „B!d}s €Y§ ²“ÓOß@U¡ªÉµ-€É=óÙA 6@¤‚8•Œ¦ÒƒJ.>äëŒ R¦û¨hhºN#ª&µ²}"ÿ3r C5‡jRKPªI.ÖL:W“\[ªBÕ@L:O÷5PÕT–Q@%ÿœmc’ûªPc¼Z‚8NdXi3¶c\É&O›ñÄž–M`Yò媤–\b ‰/}JûYûV 6v»¿éý (^Æ‘0ÒÞ:ÈSÚ†×Õ„BÈ…É0„B$M¼ù•2 Y)n¯X?ès¬`×€û „B!„U£=6q€=ƒîç”ÖÆä™—ô?¤ÿ[È0–Q#Y@l£JòpÓNB†“€”@$}v%œ“í ãoƒSCÒ‡‹êj$à¸5T¡ÿ’cÕ§Ðâ¿RÛ~E¯­%ÆÀ>.ÎoÐ]h©{uÛdš›\„ýˆ“ÞÖ˜ ÓHº!„B!äød|´¥®t?7F8íÔ“ŠéK&&÷Îç«2)ÅI„1^*Œ•’2ª¤‰êD¯Nd¥É˜T1¡Ä±¤”"ÕÅN‹gž¥ÄصÄN,)%VE'v§åNòÒ 7¥%¯çˆ1Ö²Øc6éþÞ²ýœ¹q–%•O"OX±ÒZ¢Àzq‹Ú™Š) ˆ6Q:®©½ V0mò¦‰öeB!„”a!„20Tõ6“î†2 Y)n«X?èsìzU=4à>!„B!dµøCÆNmmʬÈ<2@YtÊÝÄ™€èaB…/¥”·ÁGU Gº©Iú­Q<âLÕòË1 -V›^R\úZ¬ß–™8“É2¾hc+°Ü‰Ñ±§X¡Ù[-l‰&´,Öøü R[ÂqÖ×'ÂÀ’„Š$—òo“+ð$8óÈ[.êóH¿}T>'ÎÂòr€›¤Ónoiâ´ø’ B!dÍB†B!ƒfÐ7åî7àúdý°Z2 h!„B!„¬yè`xd“#+@K†©Vò¤‘n²EÙ¤6=ÅIi È –¼”4lÉ£²†-„–lœ@avXS7I¥¡¥Ü¶—„–Þ%_*B—ñ¸¢Œ=¹ÇÕ¯7?³U…ª:BÌðHcÉ0¼w@!„Bi人ÝÞ’^ô OðØ¿gÞi–[L"UX©1¹ QJuñ¥™pÂL^'BåþÙºj‰%_ ‰%_–¢]!“”“dŠ„Wˆ‰èt´4¨Lm)/ÛscÉ9Ö²wìb}'oÙOeé'ÑÅi¨SU+_'…49u€éý¬——Ö#Í$Ã,¸¦‰Ž!„Ò<”a!„2hýÇz&Õ¢J†´pÅZ!„B!ëF®}†G†’wŒÚÉ0û8m"$¶8i1¹Ã“MzVV&‘&X£Fð©«‘<…—'Ñr¢Š-‘Ô-=§¸E–îÒK±Ý_}_}·µ¿t>7½XzhG¡M%ÃÌøqB!„BŽk¹®Îåë…Sû’Ï)"nH"¨À•**’`üí•I3‘+ÄTI3¶”X¤Hu)Ë2eÁÅP¬ZY{XµbMä—厢§óŽB%?HÅ~¥eX–ð²5öLŒqâO­äcP!¿¶äâÈ/âG7•§B~‘Àº€è”}žÞ¿;m¨8ßI†¹f|´µÔDG„Biž «=B!„¬y}Sî¾"©jgÀýµOI†‘3œ4à~)ÃB!„BÖÉ0‰¨P<^1›‰ R´KˆQˆI„™BvQkŽäA(T’­“äsò°LÒ‹( ¹\¡E$M\¨h¹/£ÉÐÒ>Tì¾RÑ¢®ÓW:F¨[·è É8Ôú^‚t÷!”´§zI%¨R¤­¬`ŠKÏB m¥‡¶RѶ<®¹©%7@É ÖÚÖˆ sE{l¢üCB!„BÖ×8`ó ;É“a$»ˆVt–;˜:ˆáv!.DF F  *ˆ Š€XSñB3©"ûŒD–H?G*PD‘@ÓÏÉ\“Z*ˆ½}‚uŒ$×iF«*P5É…ºI/ú5FT¡j &+ F!j ªcR(“OHk%Û\“gµb ŽÝ˵ä~„±$WÈq$›ž–³œ]˜»í%a<ùE’R&ÅäëQÞÏ—]ÄÞ/] =QiŸbšÚ·`%¥/™P ÝL2 ÿO!„¬a˜ C!„A3è¸æ Îpd}p{`Ý “‡À•îƒB!„BVöØÄLºŸá‘M¹°¹ËKŠ…Y÷ ŽìÐsÂJM»RšŒWÃX5‚‚F}"MIB Õ )ß!ÿë–§€`Ò—ÐbÜ>Æê=°“L€äWR $}ˆ,¶c$e\afe…–ª6þo„@›ÙÉE UMß œ|ÊlÜÔÈŸÙøÐ!„B!$cà²üÈÈV¯2frïB©mP°Löö®¢‹-pT}¶…“¤›ä²„$ãÈ.¶ãÊ1&•f,‰&kïË2"ˆèt4bâ\ŒQ ¸ø5ö®±dšn˦‡åBαe#[v©ým²L¶-ù)/=ýÖù>‰4“ÈTéy•Þ°i7’ ð%„BÈš†2 !„BŠ&¯ödòÅçÜ2Àúd}ðïvÖ_ àëì—7Þ!„B!ë‰?ÔßÚ6d‰0ÉUÅìTY†)'‰RTªdŽa¥ç™R%u˜n5¼–` TÖP⎖&ûØ :™¥VhqäórNoB‹?®ê¶åifòˆ'Y)Zͤ¼w@!„B)øõA{dkê¿d×ÔÉçÉ=á÷ûE©TaË,¡Ï™ÑUÆÕ±åŒ(TÇ85É/vŠüâ§ÅXòJþ9,Ëı¢“NËÙçŽBa‰8â÷™.‹µlL²,ö²xÛ«—%—Oücã§¶xëÅ“z^Jò‹”×ÙRLî™/Wí‘-ƒ> àª&:"„BÈê@†B!M0ˆ›r×xºª>GUï@}²>XðJU}¡ª.ùUõU}€çøñúç-„B!„õÄÀ¯Z#Cyz‡Zé0³dÀ–EBI(®l”+Lu\´è©†Ÿ&ã%ÂT¤ÉtK¤ñåX5b-‹0™ ÓÐÒ½-m.¡¥Ô—±¾—#ÊX“W¯^~‘R[˜\r’†Tá‘¡žË)ÜÐDG„B!„‚¿dâÔSOÂÆé#…ù…50¹§œ dΈ/I ”êã&¤™^Lò:Ž,ƒRÍpâK‘ê’'¾äâ‹ä‘ޏ”e’íY2Œ3ʼn SÔô›,-Æx¤&›¼¨T/&´\Nwq“BX'¿¸²LäË3â-A$î²ý[8ë-A&÷Ì%/-ÉÑ4…hà\?>Ú:ÔDG„BY(ÃB!¤ Vò¦Ü€Wx”ª~uë’õÇ-ž¤ªèÖPU/ð0o¾Ó{t ü†5!„B!„G \†9iK„¡Í‘—âQ-ö”R#¬Øâ…/ÌøbK BíLUâ™™Jq§T£>‘FãÀC;ä!§z¡¥JRé§íÑI*eY¥»`Sˆ2öä¦ËÔÕSfö)IV É0WµÇ&:MtD!„B9!¸@é+M»½Å´&@@p1ŽÜ’‹¡$˜¨,U8“%Ê$i#¨ÜßžÄbJBJ0ñÅä‰/%Y&ÿœµI>e˜,qÕ–iRyÅ™‹•Lc/KZßK¶ÝXÛÓe?•¥8Þ}® Ô1%IÉ“iÄ—füvÉ¡XZì`~æ`v2å‚U»ÝH2 ÿO!„¬q(ÃB!¤ Vâa—€÷x¨ª~@Uù 9> àgTõ²^wPÕ#ªúvgø’ çc…É0„B!„õÄ º“á‘!K„I†™ýG*Û»b†+¬„D c %yÃO*©5Lö2ÙêÉÃ/¢‡S¿¾F"ð”ÛiU2Lú|“¶R)²¸BKmŠKIdé.½¸ÂOø{ø}õÝÖ¸ÇÊ>¶pp~K‹±sNA­‘Mƒ;‰ øÐ!„B!$g|´µàÚA÷3ÒÞšü%4È&÷VË0€/¨XÒD$Ž@QJ…ñŠ*Á%XÇ«é·Í$Wp±Sbl!¦]Šô+I&a,a%Ö²ÓéÄPŠ »¶¿,áe)$'ÆÚ–«,¬x¢‹Ö…ÚE6â'ËT‹L¡v"’ž;óÎù¤é熒aø÷xB!dC†B!MðCÇ=ûU$I0¿¯ªS+4&²>9 àwUõªZǶU½[U_àñ¾w c¹]U÷Ãþ„B!„rBÑ›ˆ\5è~†G69)P`z_u2 P!KxÒKP²ÈÅ™.Rе®$t«”s¬qÔI7v o]\• _PñŽ…/Ê¿ýѧ¸ô&´ ÐVzh+mÃãʘ™<’<¯[/°U`x[#É0|h‡B!„â3ðë„‘‘-Ž´ULíY¨ÝÇI ñ¤”Ê[p‰L@pAXâ¨Hƒñ哉0ÎÜ•]lQÅ•c¬D¯F&§Ä tâØ›@VKÜš=-g9›ÜöÉd§²D©ˆ’IEIbO&&Ùi-®Ø’¥»ø‚Œ+8E!A)$ÈXSÆäÞùüÅ ÉÍš6eB!„¬”a!„2pÒ—]G±ëÍž£ªOWÕÚ7܈ș"òaù¤ˆœzT%k<^U?XÕ@DΑÿ‘÷ŠH«®˜ª~Àü/wÅxxãB!„²øµPkdÈ‘4Fm2 €€á'± }«i½°‚ªµ).E WÖè§F( Æû^ƪa¤:G!´8¢ ¬y÷t™jIe„–Òñ¬ø}­6ùÒå˜…Ž«¸¿ŸSÆã¥öˆ»Þfrϲ)Kˆ§··¬ð™[â–ñÑÖ\÷f„B9‘¡ C!„¦è妜ø0€³Uõ/Uu±®±ˆ<ÀuÞÀ~mȃ|[D^u”c%k‡C~KU]UƒÙÝ"bDäM¾ àLkSÀÈU?_׉ªPÕ7x8€Ïö86¾Ý•B!„²|2̶¡"Å#.žß™¬½ÍÀ“&jd' ¥Jé"¬øÒMP̨Dªj”Ä”š4Õò;<¦Z¤é'™¥ZR©hkÉF…(ãKD½ -þ¸ªÛ–'›éýGŠD˜€&œÒx2Ìµí±‰î'-!„B!d½q€ú·=###[sF‹7$ ]ðGn‰Š´‘PŠI(åÄ[J5á¦ÃDcLIâÈ’T !ÆR2ÉDŒ%¾„d™"&Yâìº:¶¦Ž°j¤šÎ²-䨒MOËÉwHäxò ¼¹'¿ˆ»®q&$Íø²LöÛdË>“{æœD(0<¼Q4ðGWù÷xB!d@†B!MÑíFÃ¥§ª/UÕ{êŠÈ#Eä«.D"¾„ØàÝ"r‘ˆ´ú.Y\౪úÏU DäL$Ì›QýoãŸð5ù¬ˆToUý±ªžàçìê2>Þ|#„B!„¬G®pd$2L!.d 13û{‘aF¶mM<à$Ä õ¸2Š— bQd‰ÂOrqD™4“‹2Æ2Lš ã‰4&“^LvŸ‰.™d’J2"–,c\Y¦$ǤÉ0qŒNÇšâê\@«okÊ…ã­¯O„APT È/âÊ1Éqõeo.þúB:òE¥P*M• ³Ï|!V¥Óȶ­3gÅáu5!„²  C!„¦¸ÀR`ý^¤ªOTÕËê ˆÈé"ò~WxZý>I²Çãû-9ÑùæÚª"òt$çÒS{¬ù\׉ÈÛD¤ö~À£ü€ý&{UõÎû%„B!„5C{lb É=‚Ñ:ck!/¤ 13û{sp ,aaÅIGq¤—îi2!¤kšLV£Bì€=Öªiª&ÃhÏ"ËÑ%´Øâ‰»O½¤âŽ©z<Î1¨H—ñëÙ¿£Ïô¾#°ž×*Ðx* \ÑD'„B!„’>äßÙê$ydC/É0@!¿D©°b .!¹"$½”D™nÊŒ%ÚTíoœ> ‰¥˜["Œ-ËärL±-Of±„˜áëêä T¥ÃXâM.æxµ³öÆÚž&×ø©,vŠNéøÕ+Á©$¹FÜ$ž°4“ýæáóaòž9+&‰†iP†!„BÈÊ@†B! ªGØbÂaÿÀ9ªú‰º}Edƒˆ¼Àü€¨Ïîà["ò:‘ÞÛIV“þ—ª¾LU†ˆH$"o°À}Öðz7ŠÈKêÎ'Uí¨êßx(€÷X¶6óÆ!„B!d=3Ðk¢áv"*øC¯2LžS%]t“MÄ.ªkˆ+Ó8/Ž-¤— ”âI7Á¾¬¾ðQ› _èéEd€Ðs¨¯þÛú©2Åñ 1½ïH"Wå‚U’>Ô¼w@!„B©b × ›6mÀ©§n¶’<¨bÿ=½%ð/eÄ\Ê©0þ>ÅdJÂF°N$i&M,ÉKz)¥ÅdòJ@ˆñÓbâÊ—LHÑ6•hœe»ØcÈú6ζL ) +â +]„ßÈ«S)ÒTÕ²ú«úÓùÔž¹ÔIDU`¤†/™ „BÖ”a!„Ò$Ù͆OøIUý³*a!ÃJïx€Ó¡ï þ ÀiCrü² À¹ªúѪ"r€‹¼Çöoá3|Àw»¥©êŒª¾À(€/¥«yãB!„²žèC;&œÖÞ”<¯cI Óû{®a +e1D aÆc¼v~*I°R•&S‘HãJ1]ÒdJ5’)V”D˜ì ¶þ÷G>GÍw”Ђ@[_$ªIÊ)µ =Äò’bav©ªâäÈ­3.ÃÄ®t'„B!„–ÿ­qdd‹ó† UÅäžÞe‘@’‹—Búœ§É”„ëTÕ4aiÆ—Kòô+ñ¥XŒ#²äû¤ÂJ—E˜NG¡ðÚÚý•–³ìO¶c§²D^ÊN& •ÓZ‚‚ŒøÇ¼ù¥‹hb~æ/å"Lv>5 ÃÜ1>ÚÚ7èN!„²úP†!„BH“|ÀyªúU½µ®¡ˆ

à˱‚cx&€+Edû Ö$«Ï?øYU½¡ªˆ<‰Xµ’¿ýã|GD>*"÷©k¨ª?TÕ1ãHRi!„B!d½2ðÄ‹ÖC©S<»3½¯Çd˜”P ‚ò…8²I¥üa +e9CJÂJ©¯@" ìuâŽ]#ý¬‡v²dˆý]*¤[äÉEÉçué2ZœyÍØ­6ù<ÀìäÄ"&›N¼ s}{l¢ö2„B!„uÍÀe˜v*+Øé0“÷ÌöU#—("OJ1¾èâ‹V2Œ-ÊØu©2Ž|…… É¥–,ñ¥]²Ä;™¥H‹±–¥H†YŽctbͧå8²ëuOt ‹1öÜo_¤ÅÈ1 +…$™B.ò×çËâË6â¥örR”Ý °Ïœuiž3²mà2 ÓV !„ueB!„4†ª~QU¿Y×FDN‘¿p€g h(g¸XDÞ U¯þ$' s~UU_®ª‡C Dd£ˆü5€‘ $~À"òF9©®±ª~AU/À8!„B!äDájAvpú¶DVˆ­t˜™ýýÊ0¡¢”°Vjä[ éV£§4™@Ód4 ÛÉ0+!©x‚Œ“,ã± -u 4EÛ@ fö/‰0i´¶ \†a¢,!„B!¤’ñÑÖ4€²‘‘­N2 T1yÏÒË¢ž‰*`JGàâ'Ât«YH3Öt_2ù$“cLz½i§²ø²L²M5KYó)î(°Òe²¹)êT.ûí‹åàq“ûø‰»Þ_W}\‘÷9û 2&ï™RÆžÚ#§ËéÙ ”a!„ueB!„HÂKÜàlp—€·Ø)"g ¸/2.p®ª~²ªˆ<À%^‹DZ$[¼ÀEäü÷E!„B!',í±‰C~8È>Zir‡3µg±ï:EÚ˱+ey£,ÖT$ÂjbGHÎñd•|Œå¡d˜Ž#Ä¥—£“Tj'YÆ>v¡´œj¡Å?ÕmËSÓûäLvÙç×áC;„B!„n T¢ooÛš_eÉK‹Ë˜›î/ÄR$ ºD¶ ‘&Ô.Ùv_Žq„™®àÑ¥f‘ø’É-®ã¦Äø²L²o#x]­(ÚHV#ë§ïå$¥&‘OPñýP:^®°âÇnòŒ-È8"M@8ªa`rÏ\)†É0„BYI(ÃB!dÕ‘'ø>€p€+Eä© ÷KŽ÷x¢ªÞTÕ@Džä&ðãUÂü‡ˆ|CDFî›B!„BNúPBk¤²t˜¥ÅÌ-õ]«J6)ÉAé¢×4 kÂJHºñåGþ°¦€¸“$ÃøSòPJ¯ÒKY<é޶اB4 ô‰’ cOÒw=±ÚÖ1½ÏJ†±^Üô;\øÐ!„B!¤+½nØ´1ºÌOó€*nºö®¾k9é"žÌãÊ-¶ôDŒ ÁÅß§jÊöBL–S|Nå˜|î 1ÉçX厢Ór)¦>ñ¥ûrภœ¹-ÙÇ9ŠàwäRM)õÅ?޾üR!ËÔÉ0ªÀÍ×ÞŠ0Å9$FŽl=å¤ÝG}röW !„ueB!„¬"r–ˆ|À·:¾™p¾ªþ¾ª 5‘M"ònh5::—ó\."‘‘U!„B!„ ò¡ÙóËÿœ-h¬ˆˆcàßÜßw1G6©“RlAÃÛ†j[ô yzJÿ‰4%qÇâXÑéĈ;šOI2̱¤®Ô-%Y¥^RqåšjÁÖ÷ ¦Ê8ÂŒ=~©ua-,㇗MççOæÂˆ‘Ù¡Íѧû>‘úãÊ×'„B!„œø êºú:ÏøçÿwñïÙCòxï.ÂþÛe°ÞДd—B°@eZIÞ®$¸À­sÒLò‰drLžæb Y&»ÈÈ2±"`:ÍŘìKu$¼lê–íD˜r*KHN©VÂ<ù^+Ý8RM”üU,ÌÂ;_÷|çK×–„ªx9¾ÀÃü)€GªV²o|´uÇêB!ä8„{B!dU‘óÜà×Vy(À›‘H%«˜ª IDAT1g®òXH˜ïøUýlUy0¹êUªžÀ+üˆ)1„B!„â0ˆ7tÆþÀCÿóc·½ßÞ qòàÎEÿ¼×M8r¨ÓWáô–;<)¥Jæ°„•LÌpRUº¥ÉdH@ éµF– ÓIÚétq'û¾nòw€ÐâI*U‚M}Û´“ÉHåt™*n½qïüë±ûúùñÞoà]|!f÷\¼$¥DžœâK/‘x†½¿)Õ)Õ É7žt#Ƥ׌nâKj¤Œ-©X²Œ1ˆµ¸ž^¶®­U¬:öE¼)ÄHY|±Ûfí‚é8R‘ÖR#“_¤º]e-)ö•Š7LܸëN¼ñ7>‚+¿}3 @YªÒÛÆG[‡ÇG[op€èC¯ê ÓV !„ueB!„¬ ªz1€¿]íqx*€+Eä«=’£HÎ•íªº»ª‘ˆüO$7¶V3e(D àMªºkµB!„B!ÇW`etø&€G·Ç&^Þ›Øà6{£* q2]~É>¼ûuWã®Ý{.^.’rº +0]ä‘ô¡žÊiè! Ƙú¶Ô"’ ;&›;K¢±“Wªdƒ£Z¤¢mÐÒEÆ · Ë8!To~þn|à×ajïaı:"LÊmЛ¸À¹~À¾žO¦îð¡B!„BHWÆG[{ܽ¥:>à¡ã£­÷¶–ª{ º;K„±D@—OÜ„7¾ô#¸ñê»zî¨JJ)M¶(™€ä‚²ØáÉ6¡4•²0/ñÅXrJ"ÄH…Ä1ÐéÄ¥ ðÓ^Œ'ÁØò;ÙõíT–ÈÀVü´ÉÛù‰0ŽÄb¯ëò;DR})_W«;>ú}¼í•ŸÄä=s®H•5H¦ïfûŒ¶îm½Àü÷ўļ®&„BÖ”a!„²j¨êŸøMË«=3ì‘·ŠH´ÚƒYçLx–ª¾FU—B DdHD>àÓNkttÝ9àyªúÞÕ!„B!„O´Ç&æÜ´¥vx~{lâ¼öØÄUÙÊO¨Nø/»¡j"6h ì»ë0Þÿúkqé—öôÜQ&ƒdBI.–Øi#]„•BžÉ„ ¤©%]jˆ›&co+¥ŸÔ v ÕI…É&@k¥—áC;„B!„^9Ö뇯øéñÑÖ+ÇG[Sö†ƒwþ¹BõÑP½ÈIöˆ‹ÏS{æð¶W~;>þßþµS+¥%—]Êi.®Ü‚²¨á¥¥„ReìZ‘/b’—YHPˆÉoäo¡H¶Å:±–&M¾¬%ÄØbŒµ,®(“oOÛ„…O~‘òúÈ9n…LãK4ɾpŽ£œ"¿ßô7ô¯«ç¦â¯_û|êï¿…å原$‰½‡¡øƒw¼ùÍþ¹1>Úú.€Ÿð8vÉkiÄ„B9N¡ C!„UEUÿÀ/˜[í±x€7¸XDÎZíÁ¬S¾ à§Uõ U D䡾 àwUïìpžª~nµB!„B!Ç)ÇòÐÎ àaí±‰ÿ¨hóL } GúìE*Ä(tpá?íÆÇßuìôÔ©¤€„Å K &˜XrL¥´GX JÝi<éÆ@ìªÉ08ÆÔSŒ–<~úZÜô™zé¥_ÚÒñÑÖ¿8À;éít.Á—LB!ëÊ0„BYuTõ+¶¸}µÇ`;€+E䙫=u„"¹¹užªVž"òk~à§›X\àñªºRQ΄B!„²9š‡þÀǜӛxK{lâpUÃO¨êûþëI—½òí¼­µm(Ù9VÄ Äq‘³ëÒI¼ï‚kpç-ºvž‹¦‹”∡ÃôZ£,¶ä‚K?‰4Y$Öªd˜þ%•B<é&«Â|AÆŸ;õºK/…øãË/å)?™øÆEwáþüzÌL."N˜8=O2æQOjã­ì¥ïû¯'ÝVw~´Ç&nlMü2€_DroàhàC;„B!„^é÷ºzÉK#1>Úº¨®áŽ]ÓC;vMÿ1€_ü›Ûö/þê|œq¯SBi€*®þÞn¼ñ7?†ë¯º³v"¨]ÐUp‰¢€0SJ—ñÄŽjf"Š“ÒbÒô–|½+ËÄ–aT²”+m¦çe1¦Ho ŽÙ’Š$¨cË/²LIé"ÍØë2T~ø{xû«ÿ3ûJL6mÊÙø«÷þjôä§žó'.ß±kú¼ºsd|´µ0>Úz=€‡¸°§3»`À-}îC!„ñÞjE!„²jˆÈ}¼=óx”À;¼AU—V{0+ˆÜÇ1¼ÒìðbUýRUÙ à½~«±QõÇ7¢Ší0;u|ËN\ûƒ[‘½MBã8‹ä…ÆŠM ^ú¿·ã©Oxèø €×޶v÷p>þ<€wø©nm\<>Úzjí!„²F  C!„ã Ù àSHÞ y<ò]¿ªª·®ö@Ž•ãP†¹À¯©jå˜DäaHÎG65¨>ù8€—©êâj„B!„BŽw&wnoØßCÓ»¼ÀGÚcµԘܹýoð ùÛ¿þÙ»ðùíFÃ}ãlT¼Yõkáy¿ý`lÞUö£Š-½øÂL!´TÈ4ŽTS!Ì”¤—P_…8GVos+¦-ö£I `îîetŽÄG!©ô/´Ô·uÛ„Û†Û„…™düøº9|ò·`6Mƒ±ivüGÎ< /{ÃO⬇”lBò–Ù×´Ç&jߤœž“#þ/€ÿ  ú¤JøB{lb¼[MB!„BÉØ±kzÀé5M¾àU㣭Ëz¨õH$ÒÁÓêÚ}eç5øÈ¿|ËÒÄ”<9%}Â#Î}^ñÆ_Ài§Ÿ¬¡ª–”¢è,ÇX 2ÝÖyM"Í$5{mìÏÚé$ÂKœ 0ŽCãN.ÄlÚv:¢­åïw䎻Ñ9t$(ºT/'¢Œ‰Â’KIбå—^…«]H¦‰BÛz"À5?¸÷–˜:E黎0‰ £qŒ³ÎÆ«_û œuÿºS‡‘HWomÕÆõîØ5x9€¿Ð®iú®ñÑÖÖÕ"„BÈÚ‚2 !„BŽ;D$ð$73ŽG¦‘]x8ž9Žd˜À[ü…ªvª‰ÈKœÁ§PŽÞ àO•ÿÀ&„B!„ž™Ü¹ýV÷¯Ø|Àßx[{lb¡Kðopﺶ·Þ°€½ãLï=RH0yBŒÀD@ëŒ!üÊïÿî! {J‹—Ä[´S!̔ęš¾:ÂL­œ f°qsù-½ û–/&/õ=.„–¾ÛV·Q.¾è.|ý3w¢“¥ÁxLÜQ<úçFðÂWý†6wsWð5¯nM\Ó­áäÎí£H*«{Cí_´Ç&ÞÔ­!„B!„dìØ5ýU„å•;üñøhë=Ô8‰dð t—ø·îÞwÿÍWpÏÝs‰cL’“¦Äˆ18­½¯xã/à¾_°F§S¤²äé-VRËr*Èt–5eìÏ=È2ÒLXºIæq–üR!ÄØŸ7´NƒÙR–a–îÞƒøð"$*D—Lz 'Ä˶ìâË)Žì’aj¤™PÂŒß.ØŸµ¿ðÙ;>ö߈;$:7—aâiÚ·‡äO¦‰cØ æ¦áƒo݉®ºÐ8I‚IÓ`²T˜¡~óåOÆ“Ÿrv¿§RÆw‘¤}¿[û¦à]žámzÄøh뺣!„BN<(ÃB!ä¸FD~À¿Zí±Tð/PÕ®ço2ÌWüºªî­j "ð)klTý1àùªúåÕ!„B!„œˆLîÜþgHºÉ¸IÒFåK¬}ï à/üŽòE—츟ÿЭˆ;š§Âd2F–sÎÏ ãy¿ý œ¼µüÂѺ$˜ÊD˜NYX ‰-%a&˜S‘‡ÓWG,0›ÊÇdqV/k’н¤²2m«lÄ?¾nÿñw·`~fÉ‘‹ò©l»ÏIø ÎÁ}X~«oLx€¶Ç&–ëNîÜ>à¼ÀVkÓÚc·í!„B!뻦À¿¥‹ŸðG㣭[{ØïéHd‚Gë¾ñÕëñáù—;€ˆ‘TˆÉÒbç<ê,üÞŸü†Ûnk«› ã%µ,-ÇáíÝÖ¶gÒŒ[³¼Og9K…©b¢S¶@N*?ư¼ º¸äŠ0]ÄI—®ÂŠS#¾ÛÙõóä—l»¿o!Ý\wùmøÇ¿ú*æ§)0i*Œj"ÅÜï~ÃxõkžŽûÜwøXO'ðQŒ¶º>˰c×ô8€wx(€ƒNmuŽu„B9q  C!„ãÙà"íÕKs~KU?½Úé‡U”a:Hy»ªÆUDä·¤ïlnj`}r€gªê®Õ!„B!„œ¨LîÜþËv˜ð§þ¡=6QûÐÂäÎí'!yëíŽÚ\ȸãæøð_Þ€©½GòT˜,%&“*†G†ðüßy0îöVgß<&S’Xœ”–(㥾tj„/M&˜Ó©iÒ¹ )¤ì÷`yA¡þ$•jYÅj#ý -ýH/Å>Ög(.þüݸdÇ݈—Ý4û¸û”<ÿwŒM'EÇz:ÀuH„®¯tk8¹sû™ÞàŦÚc#+1B!„BÈúaÇ®ésÈ0¯m]ÒCûŸ@"÷Ñïcç§/Ï“`r&“bbÅÓþÇ9xÉËž„Wäš:cÀÛüíøhëH]û¦7x€§¶ÆVr„B9þ¡ C!„9ÀxÈj¥†øCU=¼Úé…U’aîðBUýVU9Àßxac£êŸ«ˆ0w®ö@!„B!äD&•.ðæöØÄtíŸà¯<`%ÇqäPŸ|ÿ͸êÛ“‰L‘¦ÂdrŒÁ†‚ŸÞ}ñägÞÛÉ¡)I,vJK§BTÉ¥Œêmj‰•ÂŒ•rN‚)ÄnˆÀs*C€Ä½§®ô“ÐÒµô.½¸‰5åùüì2.üÇc÷ óÁ4í6 ž÷òáqO;c%O§ŒÏxM{lâ¦n 'wn€ç´Ç&Þ0ˆB!„BÖ.;vM mU¾„0mw €?ðjœÐcçÈ‘e|èŸ&ðÍoÞä¤Ã@$]6HðÌ_9ç¿ôgE@âVøÌRÇKo©dºJ3i"ÌrŒ¥ ©¦j]‘¹“Î;1ä¤!Ȧ¥ãЙþ?{wW]ïüufÒ}¡Ót¡´ì« q »b(„Mv÷ TÜ÷ë½^ïÅŸzWäŠE„°DP‰€€¢Aö…–îiºoÉÌ÷÷Çd™ÌLÒ¤MòMÚ×óñsrΙsÞ3ÉLzÞçÓší¦ø’.XŸÿ>éËD—Â’LQ¦W“eÊ•iÊ”fV5¯å¿óæ<¹°m L „|ù¥½3ftøÐá¼å­z ÇKÀgk«27onÇºÆæ´Sa$IÚþX†‘$IÃF’$SÈ_HpXì,=ø'pfá¹ØA6'BæNàÝ!„eÝí$ÉÁäÇwï=h©ú®žüÏxuì ’$I’´½hª¯>¸8b ÏóÐïó»ÿK.:JÓbÒùòÅ^îÀiÚq:ǪôfK¾ÔRn"LùI0e§¾d»ÛV:‘fsåœÖ$GH•ù7¢M ©°¹I-}›Ð²¥…–Â}Rme™Íî“‚ŸZÅï~þ2kWµ”aÚß鳯pÁçöaúÎ:vùßÛÿª¬iX5'’$I’¤rÚÊ2ï%?ecú`œóÏ÷?ÇϯzM-Ù²…R û¼v~åLžšŸÀšÍ_Ú'¹´–_×’Í‘-[šé¡@³™RMK™2L.›k+¾dËb’‘#H*JG®fW¯\ÚŠ.¤Ré‚ïóÛËVÒEÅ—r…•ÎýÚŸ[vr© ó2pváárì\œ>ÀY¶F¾Bøfì ’$I’´=hª¯|ø°Ã`ŸÓ†7]ù"¿Y—I(ËiH§Žx83„ðTì Å¡ s+ðÞBsÞ\ì1€9¶ÖFà=!„ßÄ"I’$IÛƒ¦úêÙÀeÀ>±³S2õ¥³8ÓÓDšÂã®ÝØBk¶´ 3*]AE*Õµp’.(«$½-´ô¦ÈÒ·ÒKû{^¼mοVrÇ/_aýš,¹ÐY4*|wÜu,|fo¦ì4:ÂoR‰ßŸ¯¬i˜;ˆ$I’¤mG]cóhàóÀ€±‘ãtxð//pÕUaÆÖÎBL’@ª³³Ç~Ó¹è«ï`Ò”ñme•Â2LaA¥è±Ìrqi¦lA¦ìó»noiÍ‘m ä²9B.[ZˆÉ…|!¦HØÔš_ŸN‘äï¦A’j/Ãt~Ÿ..²T¤ÊL~i_î¦üÒÃD˜²e˜¢2M:â©Ç^憟<Àºµ»-Âì±û>ñÉ£™6m ÿþôàià“µU™»c‘$IñX†‘$IÃZ’$'’¿€`\ì,=X\BøEì …° ³ ø|áòÍœÿbàÛÀÈÈÐ_–§„ˆD’$I’¶uMõÕã€ãcg)´xþz~õÝçY2}Gù¢¸¤1aR§~`wvÍÄòÓYr¡¨ÐR¦0ÓQŠéf[.ZÊL‚É–ŸS|Î\Ö¬ÛDKk¶äõŽ9‚) §®”-§$”TÒ·"KOûvÿœü¶\€?×-àÑ{—v3…'¿|èqÓ8é½»R1¢ô޽­#_ˆùaì ’$I’¶ uÍià ࣱ³[´p%ß¿ü>æ¾¼¼L!&_Š7a4ïÿÌÑôæÝº`Z²ùRJKÛºlÛºÒ‚ÌæÖ³‡ç”)Ý„lrÙüc6KÈå­­PîÒËl6ÿúÒéÎi0íŘ¶ï“¶‚Ko +ÅÅ—’)1e¦Èt9~ÇsÚ·§€w^ûÞý¡ Cùi8mËÇçž÷FÒé!õ™`5pFmUæ÷±ƒH’¤x,ÃH’¤a/I’×·;ÆÎ²¿>BX; XæEà¬Âc=œ7\ œÜÏçîo/³CÏÆ"I’$IÛ‹¦úêw?FÄÎR¨eSŽß]5—Gï[Zv:L*ÉA?aGž´#„¤k‰¥ÜÔ—lai£|±¥¤ÄRfLç9zžS\Yµz#7•–aÆÉÈé­*©t<–+ÆtfJWzÜî÷Yݼ‰Û®y……s×–/å£F§9ý£{PuØä¿5›õ,p|eMÃK±ƒH’$IÚ¶Ô56øeç–ÄÓÒ’åÚ_>ÂÝ÷¦ðûtº£ôRnÊKº¨ SRv),É”+Ó”-ÃtÝoŲÕ\÷ƒûY0·©¨“#´-7’øp^ÿ†]ÿ—eó^N¨­Êü3vI’—eI’´MH’dWàN`ÿØY6ãà̱ƒ @æFàƒ!„•=œóPò“|víÇó„¿µ!„¥±ƒH’$IÒö¦©¾úàf`‡ØYŠ=þÀ2nºr.­³mŌҒƮûLàÔìÆ¸*ÊZJ +=M‚é:í¥›âL¶tJ×RMùÂÌŠÙ°±µä5N?ŠQ#Ó[V~éc¡¥pºL—mé$T—õùc&©„9ÿZÉï3õk³„P¾• e1 IDATt4s÷±œ÷é}¨œ>*ÂoÊfý8¥²¦¡9vI’$IÛ¦ºÆæ3€k€Ñ±³{ä¯s¹òÊÖ­oÉ`Ú&Å´—b’$a×½§òÁ/¼Ì”ñ¥”®—nÖõXšÉÑÒÈfó›+ÕhBÇWr9rë7ä§ÀKå /Ó`: 1ùï“^Lt)7¦ÇÉ/=L–)Þï©Ç^æw?ˆ ë7u`òÓ`:'Ãì½×T>þ‰£˜2eüàÿ‚l^#ù"ÌüØA$IR|–a$IÒ6#I’IÀMÀ1±³lÆàâ•1Côcf#ð©Â{8W|¸„!vwß2nÎ !¬D’$I’¶WMõÕ¿éÅ»ýèÒ¸öÒçYôʺ.%ŽÇ$aìÄ Nzïnì±ÿ„‚)-¥ÓYº+¶—cÊ[ÊN))γ GÓòõ¬__Z†ÉLÍèÑé¶BK÷E–ÒòKoöí,´lnŸŽ}“Îm!¸ÿö…<þÀ2Bè|ÅïÉ[gOç„ów%]1¤n‚Üî×À{+k6Å"I’$iÛVרüàV`Jì,Å–,YÍß¿^lê(Â$mÓaÚ> 2vÜ(ÎýØ|èn¥”öL~¹}ŠKûD—²e™¢çtW é2¦LA&› ù"L[!&·v¡µôsuRQA2¢¢³“J‘¤SÐV„é¶°R4%¦xÊKgA¦ø9íÛ{(ŤBÔ_÷(»ÿ¹ü4˜ö¯\èø> O|-gžõzÒéT„ߌÍú=pFmUfuì ’$ih° #I’¶)I’Œ®.ˆ¥~|(„å5ýT†y8+„ðÎSIþ®C³·ò\ƒá{ÀgBeæYK’$I’SS}õ àvàØYе¶ä¨ûÅ+<|Ïâ.%˜âÉ(‡7#kg@BIa¥ü´—®…•n‹-ÙÎÂLéÔ™öRMù‰0íçXºt=ëÖµ”¼¶ÊÌF©èßBK/ö)¿oç¶•Ë7rÇ/ç±xþºŽ×B××6zLg\¸¼)á·¢W.¾ZYÓà?ÎI’$IuÍ{w{ÅÎR¬µ5Çu¿~„»êŸî,Ä´M‡)ü¾ºfNyÏ¡$IÒÍÔ–re—®ÛóE—¶‰0½™0ÓM&—ÍrùBLvõj¦ÒÏÕɨ‘$#F¶`ºaR=Lqé¶üRÑý´˜Ž©1EÅ—â2ÍŠ%«ùí•°d~s— 0„@9È&ŒÅG/<‚ƒžá·¡W®>Z[•)m I’¤í–eI’´MJ’ä?€£æ/“ü}°OÜe˜_!¬éáÕÀuÀý‹Y›ðɱƒH’$I’:5ÕW®Nˆ¥œÆ‡š¸é'/±qC®kÙ#é,qÌÚc<'¿oW&LÑ¥¸ÑYh)Ó^Xév[7SbzšSü¸xÑZÖ¬i¡pvJ¦Mر#¤Ð²¥û>߸’?üv>Öçò“`BéëÞyïñœ÷©½˜4eT¬_‡ž´­¬i¸*vI’$IÛŸºÆæ)ä'ļ%v–rþö·WøÉ`íºMJHÚ&Ã~ÍÚ½’wú&O›˜Ÿ“Í‘m+¶´dËOr)-Í”YW°Ü²™íí!›ƒ\–Ö«7BÑ'ëÔ˜1¤F,)ÂJu)»¤‹Ê+é„tO%—‚ýÓE¥™rÇk/Ã<õÈKÔÿú6nhéZ‚)(Åì·ßt>ö±£˜f_j/x3I*M6›k+º„¢RL÷™Žåö‰0½~NgA&ds´,]NX¿¾äu¤'N 3Š$ÕY„IÚ .e§·”™þ’.*¾”L‰)™"ÓµL³béjnûß–-\Ñí4˜&Žæ¢‹Žäµî4ø?ìÞiN©­Êü9vI’4tY†‘$IÛ¼$Iîv‰¥^Î!<2Ð'Ú‚2Ì/€‹Bëz8æÑÀµÀŒ­K7(žf‡æÆ"I’$Iê¦úêÓÉ߀atì,å<ùh37þðE6¬oí2Q¥°3c×±œôÞݘ˜QRX)Wl))Ìô0 ¦d"L¶La¦íñ•—V³rEélgí2ž Fv[RÙl‘¥¸ÓQ˜)Ý·ô¸ùuÏþs÷Þ²€M³å—.Ó`r]÷›À¹ŸÜ‹&ütïü“|æÕØA$I’$©P]cóG+€tì,åüãñyüøÇ°zÍÆ®Sb ¾vÜy2ç~â(&OŸØ¥ØÒYpÉOriiÍ•ÝÞmA¦¨ Óõ8e˜l6вh)¹µëºÞ²#@Ef’±cHR©|&î(½”+¹”-Å–] §ÃôTši[ÿÔ#/ñÇ£uSk[ñ….Ó`öß‘‹>v“&‰õcÞœ—€ãk«2ÏÆ"I’†6Ë0’$i»$É àvàØYz¡øBá²U“Èe»›Óö˜í¡0S4M¦tL{©¦ô¸s_XÅŠå¥e˜]v›ÈÄFôºüÒ]¡¥ÛǤÌ>éüc¶5pÝBžzl9¹@—"Lû4}êN¼ý¬Y¤RCnHP»ßgTÖ4¬ŽD’$I’Ê©kl>¸;K9Ë—¯ãß¿gž]’/›¤J 1#Fठå ·ìYZvé2É¥½Óu{KOÛËLé²_k`ãÂÅäÖ¬-É^Q9™ÔØ1mSaÒù©0å&”+»N‚).Í”™,S81&ךã¾ß>Ê3½ÜuLÁr*ÓN;˜SO;8ÿ~MµµU™%±ƒH’¤¡Ï2Œ$IÚn$I2ŽüôNˆ¥—ê€÷„–ÄÁ{Y†iÎ !<ÓÃqfŸst?ÆH×ï !lŠD’$I’´ešê«÷"?vïØYÊÉewýzÔ-„¤ëd˜ÂI1‡>…#OÞ‰T’”–XŠ'ÂdK×u™ú’-³®°DS4%æ…çVÑÜ´¡$ûî{Ndâ¤Q=ZzSzILÆéÅ>ÍK7RÝ+,[¼B×)0¡íûqGpöÇ÷dŸƒvˆðSíµŸVÖ4´Æ"I’$I=©kl>„ü %gÄÎRN.øíçÖ[ P4%¦óû×UïÅìwJ*êœ “-3ñ¥\Y&ÛuâKûrK6G¶µm"L6mÍÑRTšYÿÊB²k֔䮘:…ôø±ÐV„)™úRQ¾ØÒYi_×^éúÜÎãu>wù¢•Ô_ó +–¬*[‚!À¤Fó±OÅþûÉw»ßçÖVeÖÇ"I’†Ë0’$i»’$IšüÈçÆÎÒKó€³Cö÷{Q†¹¸8„PzeLç1Þü ˜ÖÏñÊ…þ-vI’$IÒÖkª¯®nÞ;Kwžùû ®¿âÖ­ií(Á¤ Ê0I’0}ç1Ô¾{W&UŽêRl).Å”N{éa"L¶›ÂLÇ´xþé,_Vú‘Ï}v`‡Ì¨¢‰0½+´ô¼o¹I3ùǧÿÞÌýu iÙ”Ëç,(Á´?îñÚ œ{ñÞL˜4"ÂO²Wð•Êš†oÆ"I’$I½Uר¼ ù›M;Kwžh|•þà~V­ÞÐe2La)fÊN“8ý#GR9cR™²K×âKKkŽlûd˜nÊ0å'Ìt=ÎÚ¹¯Òº²m h’äK'ÀˆÓHO’N‘*.»–aº›S\š)ܯhLE:ÅÓ}†['Û’í,Á/À´—aªªfráEG2qâèX?ÆÞøð™ÚªL.vI’4|X†‘$IÛ¥$I> |›üŸÇ†ºVà«À·C?þÏ[e˜ÕÀC×÷ðÜ4ðŸÀ—>ïá‡C?D’$I’Ôšê«Gÿœ;KwV.ßĵ—>ÏÜg×$EÓaHR0jtšãΜž¯›ÔûI0¥˜n'ÂdËO‰ ¹À³ÿj¦iI×2LöyM†I“Gö©ÐÒÛÒKñs²­?ݶ€gÿ±¢³ò¯¥ý1IàØÓgò¶3f‘ Ý¿@lÞ[YÓp]ì ’$I’ÔWuÍ;7ÇÆÎÒ+Öóƒ+þÄSO.èRˆ),ÅTŒ¨à羉ªê½‹ 0å–n 2íëZZC[Q&¿¾ki¦ësV¿8Ÿ–æU%YGΜAzâ8H¥º”]ÒE%—ŠtBº¨ä²Ùý Ög[[yà¦ÇxáŸóº-Á¤S §Ÿq'|ÐPþL>U[•ù~ì ’$iø± #I’¶[I’œ\ éÛŸ¨.!,íƒuS†ù;pVaNÏ› \Þ9Á*àôÂ=±ƒH’$I’ú_S}uü?àó±³t'— Üý›ùÜ{ó«mê–b:'ÅTVÉ1§ìD*ê:õ¥hLGa¦p]¶¸S4&ÛuÝÓÿlféâõtÞã"ÿïEû˜!3yôf‹,½+½t–dŠ·5-Ù@ýoæÓ¼tC— 0e˜0©‚s?¹7{¾vb´Ÿ]/,N©¬ix vI’$IÚRuÍ#€+÷DŽÒ­7ÿöqnºé@(SŠH8àÍ{ðŽóÞLjDE[%_†ÉO„ mE—n 2ëºßÞÒš#ÛXùü+lj^YFî2“ôÄñ¤Ó©‚Kût˜â’Kûr׉0étQI¦¢ë„˜æ…+¸÷º‡XµlM¾Ó~ hûrd&åþûNäŸTŸ¬έ­ÊÜ;ˆ$Iž,ÃH’¤íZ’$on¦ÄÎÒK €sC÷oíÊ”a~|6„°±‡çÌ&ÇÝáò~Íf‡žˆD’$I’4°šê«?Bþ³m:v–î<÷Ï•üú{sX»ª%_IºNˆI’„©3FsÒ»weÒÔQ¥Å–l× /e§¾dCQQ¦è±­óäãËY²p}IÆýÊ0yjA&)(²¤ -IùÒKwå—ÂmOým9¾c!­›òw®-.Á„Øç IœóÉ=?qD„ŸT¯½Ì®¬ix6vI’$IêuÍ_¾;GOžzr!W\q+š×ç 0…¥òßOž>‘“>t$•3&uNé®ìR°½¥Ìº²e™l`ÅÓsÙØ´¢$ßÈÝv¦bÒ„®S^ -EÅ—rûU¤Û 1ešöbͳÏá‘»ɶf;Ë/бBàCvá£Áø Cú¾ ‹Úڪ̣±ƒH’¤áË2Œ$IÚî%I²p'°wì,½”%ÿÈÿ!ä¶ô e˜ÀûC7÷°op ðY:o;Ôý8!„° vI’$IÒàhª¯ž \Œ¥;«›[øÕeÏó¿Vµ•`’‚ëvòË#G¥yÛé3Ùÿõ™òa²¥ëºL‚)™SZŠi|´‰Å JË0¾~2•SGo¶ÐÒQzIŠöIì›tÝ·µ%ǽ·.`Î+:oVÛ1&_‚IR 5gÏâèÓfv\Ç4Dý¨­¬iè— ¾’$I’4TÔ56_\ Ù»¬Z¹žþàO4þ³skq!&=¢‚£O=¾ÙÖ@K{¡¥£Üº-Åt,eÚ&Ë´—f–?ù"–6—dµçnŒÌ´•aЦ»”–] §Ä´_ ¦Ã”fr›ZùË-ñÊSóóÃ]‹Š0!Ò©çœûfŸX5Ô?S?_[•™;ˆ$IÞ,ÃH’$I’T·o‰¥þœBX¼%On+ÃÜ œB˜ÛÃ~»¿Û’óDRœBX;ˆ$I’$ip5ÕW¿¸˜;KwB€{n˜Ï=7Ì'„®E˜ŽåðÆ Çž6+ÑKA)¦tL7ÛÚ 3eÊ1ÿøk‹æ¯+ÉvÐ+©œ>¦¤ôÒýä—î÷é,Ì$4-ZOýõóXÑ´©£øBûD˜!;TŽà]ŸÙ‡Ý_3!ÂO¥OnΫ¬i(mI’$IÒ6 ®±ùhàf`Rì,Ý nûÝ?¸á7‘ @ÛçéÂB IÂ>¯Û•cÏ=ŒôÈt×)/Ë-%™r¥™®ËË_`ý’â2L`ô>{0jòÄÒ‰0=•] Ë0ûµOŒi^°œnx˜µÍk;_|ÛuŸ¡myÊ”ñ\ü©cÙkïiƒö3ØB÷§ÖVeJ›D’$I}dF’$©M’$£k€3bgéƒÅä 1ìë“$BhéaŸ“«Ì'|W…Zc‘$I’$ÅÑT_½3ù)°¯¥'sžXů¾û<«Wlê(ÀPTŒ©Üq4']°“§êfLÛc[)¦Û‰0Ù®…™Ç\Ê‚yù2LBþ¦²‡:…);––azSziŸS¼­ñ¯Ëyð®E´¶æºLé¸v'^ó† ç\¼ã&TDúiôÚeÀg+k¶xZ¯$I’$ uÍû“ÿl½kì,=yö™E|ÿ²?²|ùºüÜü˜˜Îi1ÀS'PóÞ#¨œ™)˜ÓöX<-¦¨,Óe"LÁ~Kžu‹›JòŒÛoOFUîÐeªKa±¥´ Ó¾®­ S4湇žçñ{ Ù¶¡mS`òäó¬ßðÆÝøèEG1vÜÈAz׷صÀûj«2›b‘$IÛË0’$I’$I€oŸ‹¥rÀ%À„²ýqÀ$IF’>ÙÇ$øráÿÅ"I’$IН©¾z"pð¶ØYz²fe ×^ú<ÏþceÇ…:…bH`ÄÈÇžº¯}seÉ$˜âRLùI0]Ë1¹\ào,åÕ—×–äyÃ[§1uÆè^•^º+¿´ï³iS–ûny•9O®"ßyiŸ“ÏBþ'\° G²SÇÍ{‡¨ðÉÊš†+b‘$I’¤ÁRר¼#p;ðúØYz²zõ~|Å}<þ÷yùB í¬óËI©Š4o=ù^{Ä~e˜–ö2LG1¦  Ó㺋þök.+É2þ€½3uR¾ìRX†)œúÒö˜.*¾NÉnÜÄ£·>Æ‚gmŸ©ó ´}Ȧ¢"á¼ó£æ„!}/vÿU[•ù·Ø!$IÒ¶Å2Œ$IRI’|øŽ¥þ œBX°5I’dwàà ý’jplÞBøMì ’$I’¤¡£©¾zðSཱ³ô$øÃoçs×µó9:Ê0]‹1°ß!Ž;cg*F$EÓ^ÊL‚ÉÑVœ),Êtn{ôO‹™?·´ óÆ#¦1}§1eK/åË/å÷Yº`õ×ÏceóÆÎLÛ4Ú–3SGñîÏïîûNô÷¼ÖçTÖ4Ü;ˆ$I’$ ¶ºÆæqÀu@mì,= î¸íŸüæÚGÈfs]Ê0˰GÕ.yöa¤Gh+¸´^ŠÊ.-Ù@¶5GKÛölÛºöí }†µ¯.-É1±j_ÆLÍtN‚)˜“.*Ãt™S°_ó‚åüõ¦‡Y·r]ç‹ë˜“ÿ~ú޸ħßÎ{Nœ7x˵®­ÊüÀ·¯†Z{ó„$IF—d°ð"p|á¹ØA$I’$IC[S}õùäo1¤¯Y»ª•_]ú²¼£ SXŒ!ŠŠ„£O™ÉÁo™R:¦cZL¹‰0ͯ{ðžE¼òBiæ-oŸÁŽ3ÇäË-颲KRPz)š“¤`Ó†¸e>/=½ªóz¶òK{!&•†S>°;Gž4,þÔò40»²¦anì ’$I’4Ô56øŠ¥'k×lä'WÜË£Ìm»ÃDþsu~!ÿŸT:ÅNxñšüD˜lÛD˜Ö@6›lmÍu.w)Åäx¥á_¬ž·¸äÜ™7À¸é“;¦¿¤‹Š/]¦ÁL‰iÝÐÂã·=Â’uÓq“‰Àˆi.xß[y{̓ñ6n­ùÀìڪ̱ƒH’¤m—eI’¤ÍH’dgàN൱³ôуÀÙ!„y=í”$ÉÞä'à¼nPRõŸ‡“B¥³§%I’$I*£©¾úhàf`Rì,= î»ùUnûÅËd[CÛt˜¤­Ó~ÝN¾OâgÍbäÈtéD˜lù)1íÔ/äåçW—œûðwÌ`Æ.c»-½¤RmÅœö‚L[afѼõüþúWXµ¢…BÇ5;íì„SfŒæ}_Þ—÷CxÿœZYÓ°"vI’$IJê›ß ü;ËæÔßÞȯ~ñ ­­¹ŽRLq9fÖþ3©>û­¤GèRv)¿Ü¹nîŸYùò"Ú>¥· T¾ù@ÆïXÙQr)[ŠI'¤ ¶¯˜·”Çoý+Vo £ü“a3všÄ'?w»î>e0Þº­õà„ڪ̂ØA$IÒ¶Í2Œ$IR/$I²ð[àm±³ôÑrà=!„ºr“$9ø)0aPSm½›w…ÖÇ"I’$I^šê«_Cþ¦»E޲YsŸ]ÍÕß|–å‹7v¬ë¼v'ߊ™4e$']°Óg)(¾´O„éœS¼íþ;0÷¹Ò2Ì‘³wb§]Ç•üR¶ “$ü½a)ݽ˜l®­ .ÜisÈS8çâ½=6=oYùðþÊš†M±ƒH’$IÒPTר|(p05v–Íyqξ÷íß³dñªÎÕÐ¥3v‡±q^5•»L¥%Û>&ÐÒÚV†i[WX†yé¾²bîÂ’óM{ËAŒŸQÙYvi+Á”+äSðÒCÏðüOµÝX¢³üRøX}ä>|à£=zÄ@¾Uýå.àÌÚªLé8ZI’¤~fF’$©—’$\ ¼'r”-qð…B @’$c€ËFMµe.>BÈÅ"I’$Ižšê«§·oˆesÖ¯måÚKçðÏ›ÊnOH¥Ž:i&o8b ¹n&Á´O‹ m%™ûêðÒ3«JŽwLíLvÚm\÷Sa 7®Ïòûçñòs«KÊ/íFŒLñÎïÎ[gïØŸoË@úFeMÃ×b‡$I’¤¡®®±yOò7›Ø'v–ÍY¿n?¹â<ÜðB¾S¦“¤zÇÁìwäd³¡³Ó>¦5GK6G¶myÎgÅ‹¥ƒO¦~0všJº£øÒ^†iŸ“/Ãd7l≺¿Ò4wqç“;J0ùÿŒQÁ{?rǼ}ÿ{oúÙ•À…µU™lì ’$iû`F’$©’$ùðõØ9¶À£ÀYÀ(ààÀ¸qú,\BøAì ’$I’¤á¯©¾z,ppRì,½qÿm ¹åg/‘míþßuö>pŽ?{FŽN•L‚i/Åä²ùuüÝ|^xº´ ó¶Sf1k÷â2Lád˜üã‚—×r×õóX»ª¥Û<Ófá}_Þ—™»ë—÷`€µ®¬i¸:vI’$I.ê›+ßÕ±³ôÆÝw<Á5Wý™–Ööû.&½˜¶…ûìÄ›Îz+£G•”a 2Ïÿþo,áÕ’sÌ8òõLœ5µ üÒùØ>få+Kø×í°i톎â ä'­Òöí¬]2|ê Ç3k×Ê}OúI¾T[•ùVì ’$iûbF’$i $Ir>p02v–>Z TÃâ*”ë€sB·Å"I’$IÚv4ÕW§ÈONýXš÷­x IDATì,½1oÎ~~ɳ,[¸¡Û}&fFrâù»²Ó®c»L‚).ÇÜsÓ<æsž\YòÜwœÞ^†)³~]+÷Ü4Ÿy/¬éöÜ#G¥8ãÂ=9ô¸iýòzÁ<à„Êš†'b‘$I’¤áª®±9¾ |!v–ÞØ°¾…Ÿ]ñGî{¦L&¿¤^slûu Ùù‰0Óaž¾ý¯,{n^ɱw~û›Ùa—é%a²ë7ðÌí³bþÒŽî „.Ë£Fà;†#Ž}Í@¾üþ´8¹¶*Ó;ˆ$IÚ>Y†‘$IÚ I’ìÜ ì;Ë6êi`vanì ’$I’¤m[S}õiÀ¯€1±³ôÆ_î\ÄM?}‰–M¹n÷Ù}¿ ö.Œ“Îa²Sb~ã¼òe˜3vaç=Çu–`’„$•ðêÜ5ÜsÓ|Ö­iíö|3vËû¾¼/;î2¶_^ã x8±²¦aAì ’$I’´-¨klþð#`XŒ ýcý\ý£?±iSþ³n’Œ‡i+ÉLÝcG^Öá¤ÇŒ"›m› ÓšãÉ[bÙ³¥e˜]ke‡]§S‘NQQ‘P‘N±òåEùvFŽªˆýVôÖMÀ1µU™aq3I’´mKBwÿz!I’¤>I’$\|,v–aî!„¯Å!I’$IÚ~5ÕWO~Gþâaáá»—pã^`ÓÆ\·ûì²×xÞqæÎŒ[Á]׿ÂóO¬,Ùçø³va—½Æ3ÿ¥µÜû»WY¿®ûi03÷Çû¾¼/Ófv?fˆ À+k¾;ˆ$I’$mëê›gwÆÎÒ[÷ßý$?»ün6nh-š¨štÜTbònÓ©:ãž¾ëQÿknÉ1ö:åH’å¥úGhݸ)ÿI(X Ø}¯i|úk'±ãÌ̽šq)ð¹ÚªL÷|$ID–a$I’úY’$Ÿ¾ƒSøúªøpáêØA$I’$Ijª¯ü8;r”^[ôÊ:~~ɳ,|y]·ûŒ›PÁ;ÎØ™=ÚÌsO”d­9sgÏ_Ïã.ëñ\Õ'ìÈiÚ#‡ÍŸ?6TÖ4Ü;ˆ$I’$m/ê›'¿Þ;Ko½úJ—~ýV^y©}ðIA+¦mqäØQŒ7šµKKo21~æTÖ¼Z04¥L¦æäC¸àÂc1"ݯÙP¸¸¶*óÃØA$I’ Y†‘$II’œü 6·FlpzážØA$I’$Ij×T_—_Œ¥·6mÌqã^äá»w»O’À豬_[:õeìø Ö­é~Ìè±iιx/9bJ¿ä$MÀÉ•5 ‰D’$I’¶7uÍÀO÷ÅÎÒ[›6¶rõ÷ð‡ÛÿA¹2L÷+Ê\‹Y°j츑|ô 'pèûöOÐÁ±8§¶*S;ˆ$IR1Ë0’$I$I’CÛ€©±³ qó€BOÄ"I’$IR9MõÕ~TÄÎÒ[Ý·”ß\ñ×gûí˜;ï=ž÷}i_¦ÌÝoÇ/ÇWÖ4<;ˆ$I’$mÏ꛿ |#v޾høÃ“üôîbýºM$]z/%­˜"×d¶_ž¹×~3øô×OeÚŒIýs -jk«2Å"I’TŽeI’¤”$ÉžÀÀ>±³ Qÿ _„Y;ˆ$I’$I=iª¯®n&ÄÎÒ[K^]ÏÏ/y–W_\»ÕÇ:òäœúÝIWl!å!à¤Êš†e±ƒH’$I’ ®±ù<àçÀÈØYzkáüå\úµ›yé¹E5bz'N<óMœáÛHW¤ú?àÀy ˜][•y9vI’¤îX†‘$I`I’LnªcgbîÎ !¬‰D’$I’¤Þhª¯>¸˜;KoµlÊqó•/ÑpÇ¢-zþØñœ÷齨:¬²Ÿ“ ¸ßçWÖ4lˆD’$I’Ô©®±ùHà ;Koµ´dùÅåwóû[ú6 eüÄ1\ôå“xãáÃîÞ™÷§ÕVeVÄ"I’ÔË0’$Iƒ I’QÀ/€³#G*~ \BÈÆ"I’$IR_4ÕWÏ"_ˆ©Š¥/þþçe\wù6¬ëýGñÝö›À{¿´/“§Àdâ»Àç*küG0I’$I‚ê›÷#óÄÝ"G铇î}Š}ó6Ö­Ù¸Ù}÷}í,>ýÓ™²ãƒ¬_ýxmU¦%vI’¤Í± #I’4H’$I€K€/ÆÎQ¾BøVì ’$I’$m©¦úê‰ÀÀq±³ôŲ…øù7ŸeÞó=iM8æ´™Ô¾gWÒÉ ¥ëYà•5 ?ŠD’$I’Ô³ºÆæé@ðÆØYúbÉ‚fþçË7ðÂÓ ÊnO’„“ßõVÎý豤өAN·Õþ³¶*óï±CH’$õ–eI’¤A–$ɇ€±³ ²À»C×Ç"I’$IÒÖjª¯®~¼?v–¾È¶n¹ê%î¿uaÙíã&Vpþgöá€7e9ÙV[ œ]YÓp{ì ’$I’¤Þ©kl ü89v–¾hmÉòË+îæöë:o"1qÒ>þõwrÈ[ö‰nË´ª­Êü"vI’¤¾° #I’A’$5äï ;>v–AÒœBhˆD’$I’¤þÔT_ýà^ý2 4>Ôĵ—ÎaÝšÖŽu{0‘÷|q_&M1ÙYœXYÓð·ØA$I’$I}Sרœ.>;K_=ò§§ùÁ×ofͪõìÿºÝøô%g2yÚÄØ±új%ðÎÚªÌc‘$Iê+Ë0’$I‘$Ir0p°Sì,ì`vá¹ØA$I’$IMõÕçWêE²|ÉF®¾äY^~n5o?k'œ¿ ©Ô°êô< œPYÓðrì ’$I’¤-WרüIà»@*v–¾X¶hýñIN8ç0R©aàà„ڪ̿b‘$IÚ–a$I’"J’dp'p`ì,äaà¤ÂÒØA$I’$IHMõÕG·™ØYú"ÛXðÒZvÞ{X¯½8­²¦aeì ’$I’¤­Wר|*p-0&v–íÀßk«2 c‘$IÚR–a$I’"K’d"p#p\ì,ýì&àüÂúØA$I’$I MõÕû‘¿éÅî±³l®>PYÓÐ;ˆ$I’$©ÿÔ56¿¸ ˜;Ë6ìàìڪ̚ØA$I’¶†eI’¤! I’ à'Àûcgé'—Ÿ !äb‘$I’$i05ÕWOê€7Åβ ûzeMÃÄ!I’$IuÍ{¿Ùľ±³lƒ~ |¼¶*“D’$ikY†‘$IB’$ù ð_±sl…,ðÉÂb‘$I’$)–¦úê±ÀµÀ)±³lcZ€VÖ4ü_ì ’$I’¤Uר<¸8"v–mD¾P[•ùNì ’$IýÅ2Œ$IÒ“$ÉyÀÏ‘±³ôÑZàœB]ì ’$I’$ÅÖT_"?9õâØY¶+Ó*kîD’$I’48ê›GWçÄÎ2Ìm.¨­ÊÜ;ˆ$IR² #I’4%Ir$ù»Üdbgé¥E@má±ØA$I’$IJšê«/&_ŠIÅÎ2Œ½Ì®¬ix2vI’$IÒàªklN€ÿ¾;Ë0µ 8¹¶*ó`ì ’$IýÍ2Œ$IÒ•$É~ÀÀî±³lÆSÀìÂ˱ƒH’$I’45ÕWŸ\ Œeú;pbeMÃÂØA$I’$IñÔ56ø1P;Ë028¾¶*3'vI’¤`F’$iK’dP¼)v–nÜœBX;ˆ$I’$ICYS}õ›ÈÆŸ;Ë0r;pveMÃÚØA$I’$IñÕ56¿¸˜;Ë0ð ù‰0Ëb‘$I(©Ø$I’Ô½ÂàhàÖØYÊø%PcF’$I’¤Í«¬ix8x&v–aâGÀ)a$I’$Iíj«2¿ªWcgân޵#I’¶uN†‘$I’$I—Ÿˆ¥Í7B_‹B’$I’¤á¦©¾:Ü;Ë€ÏWÖ4üOì ’$I’¤¡©®±y&ppPì,CÐw€/ÔVe¼0T’$mó,ÃH’$ #I’\ \J¼ -À‡CWG:¿$I’$IÃ^S}õHàjàÜØY†˜ Àù•5 ¿D’$I’4´Õ56O ?å±³ YàãµU™Ç"I’4X,ÃH’$ 3I’œü3ȧ^¼3„ð‡A>¯$I’$IÛœ¦úêøð•ØY†ˆeÀI•5 Å"I’$Iê›+€ˆ%²µÀYµU™;b‘$IL–a$I’†¡$IÞÔÓé”ó€Ù!„ Òù$I’$IÚ.4ÕW¿ø P;KDϳ+kæÄ"I’$I~꛿ü7ÄÎÁBàÄÚªÌßc‘$Il–a$I’†©$IvîöàS=œBX0Àç‘$I’$i»ÔT_}p#01v–þœ\YÓÐ;ˆ$I’$iøªkl>¸;Ë úpBmUæ•ØA$I’bHÅ I’¤-Bx x ðç<ÍÀa$I’$I8•5 w‡ócgd7o³#I’$IÚZµU™ë€·Ëcg$ª-ÂH’¤í™eI’¤a,„ÐLþz¿€Ãÿ8)„°fŽ-I’$I’ TÖ44‡ÿŒe|8»²¦aCì ’$I’¤mCmUæò7”|1v–ö àøÚªÌÊØA$I’bJB±3H’$i+%I’ÿ|¹€/†¾ÝÇ’$I’$I}ÐT_=üÄ”šØYHøXeMÃOb‘$I’$m›ê›§·oŽeü{mUæ?c‡$I ,ÃH’$mC’$ùðc b ±¸ „pCÿ¥’$I’$I}ÑT_]üø`ì,ýl pVeMñƒH’$I’¶muÍc€kScgé'-Àj«2×Ä"I’4TX†‘$IÚÆ$Irð[`BŸÚœBøKÿ§’$I’$I}ÕT_ýEà ‰¥,N¨¬ix•$I’$IꫦúêÃß“cgÙÞYYÓ°*vI’$IÒö«®±ùdà×ÀØØYúàoÀ‰µU™E±ƒH’$ Eñé,I’¤^!¼ Ô÷°ÛMÀ1a$I’$Iº*k^Œ¥®&?Æ"Œ$I’$)ªÚªÌ­ÀQÀâÈQz«8Ò"Œ$IR÷œ #I’´K’¤øðÁ¢Mß>üBI’$I’†…¦úê©ÀmÀ¡±³ôÂ×*k¾;„$I’$I…ê›wî^9JO~\\[•ÉÆ"I’4”Y†‘$IÚN$Iò%à¿pqᇑ#I’$I’¤>jª¯ü 8-v–nl>PYÓðËØA$I’$I*§®±9ÜL~RÌP’>W[•¹4vI’¤áÀ2Œ$IÒv$I’³5!„Ûcg‘$I’$I[¦©¾:üð©ØYЬN­¬iøSì ’$I’$õ¤®±y$ð¿À»bgi³8¿¶*sSì ’$IÃ…eI’$I’$I’¤a¨©¾úcÀå@*v`.0»²¦áéØA$I’$Iê­ºÆæo_c)pRmUæáÈ9$I’†Ë0’$I’$I’$IÃTS}õIÀuÀ؈1N¬¬iX1ƒ$I’$I[¤®±ù}ÀOЧ˜][•y!¹%I’†5Ë0’$I’$I’$IÃXS}õ€ÛéNpNeMúç–$I’$©_Ô56¿ø-0qOÛœR[•iÄsJ’$m3R±H’$I’$I’$iËUÖ4< <=ȧþpªEI’$IÒpW[•¹¨æ Ò)¯ÞfF’$iË9F’$I’$I’$iÐT_= ¸8j€O•>[YÓpÙŸG’$I’¤AUר¼ppðžæ[À—j«2^¼)I’´,ÃH’$I’$I’$m#šê«GWçÐ)Ö窱i¸y€Ž/I’$IRTuÍã€ãûùÐYøÿìÝ{dgyðç[­Ð ëÅ1[†J kÙ©2`61Ž•ò"¼¶ˆ· ¸ ;[Ä.&‘œÇ8P‚ ILYvi‹„X8[\*vVÖ*$–ZVhe]ÐåÍ3kͶ˜™³RÏ9ýÍü~US5Ýç›ï<=gþØ··Ÿî¼vï®ï›ó¾[’2 À&shßîw$yËœ·ýf’ŸÙ¹gÿgç¼/,”Ë>!ÉLòæ´åíI^¸w׎Ëç´À–§ ° Ú·û•I~;ɉsØîš$ÏݹgÿWæ°tᲇ%É…IÚÃØæÏ“!Éo&9•%G’¼pçžýûÆKý¸ìÀá““|8Éy3‡¾“äçöîÚñ»ã§Øz”a¶˜Cûvÿr’‹’´w=ÉóvîÙÕ4© —8Ü’ü›$o\¾ëp’çïݵãSÓ¥ØZ”a¶ Cûv¿0É“œœä@–Š07N› úqÙïKòú${÷îÚqpê<[‰2 Àuhßîg'ù…$¯Þ¹gÿmSç€Þ\vàðö½»vÜ;u€­F€nl›: ¥ @7”aè†2 ÝP† Ê0tC€n(ÃÐ eº¡ @7”aè†2 ÝP† Ê0tC€n(ÃÐ eº¡ @7”aè†2 ÝP† Ê0tC€n(ÃÐ eº¡ @7”aè†2 ÝP† Ê0tC€n(ÃÐ eº¡ @7”aè†2 ÝP† Ê0tC€n(ÃÐ eº¡ @7”aè†2 ÝP† Ê0tC€n(ÃÐ eº¡ @7”aè†2 ÝP† Ê0tC€n(ÃÐ eº¡ @7”aè†2 ÝP† Ê0tC€n(ÃÐ eº¡ @7”aè†2 ÝP† Ê0tC€n(ÃÐíS¶ŽÖÚÓ“¼qêsôKUuËz‹Zk?’ä‡lXU¯°ß¹Iβ_¾]Uÿd½E­µ3“¼c„RU÷ÍsCsõÃg®z§ Œéì$—ObW%9kÎ{>/Éï \;äɺ ’¼õ¡ÇÅo'9Žû==ÉçSè,¢ IDATç¸ßFøF’ÇM C7$9}êëøëIÎyÏo$9iÀº—$¹d5ONò¥‡hc};Écæ¼çÿNò”9ï9o?‘䊩C›Zsõ'¹rÎ{}ÜæêÕõ0W?7ɾ©C‹iÛÔ`(eº¡ @7”aè†2 ÝP† Û§l)·'ù³©C¬ãº ØóHæû¸o™ó~áæ9ïwWÿ1sêº&É£§±Ž»7`Ï?KrÒ€u· Xswnò8Ž×W6`Ïy»cêÀ¦×Ã\}×ì9ôq›«W×Ã\}ûÔ€ÅÕªjê 0ȶ©ÀPÊ0tC€n(ÃÐ eº¡ @7”aèÆö©[GkíiI~qÀÒ{ªê6:ÏXZk?”ä5CÖVÕùöûé$?=`»kªêÝCλèZkߟäÍS瘣_¯ªë¦°ZkïNrꀥ¿UUWmtž±´ÖþC’,ýÏUõ'ëìõ}IÞ>ðÔ¿\U· \»ÐZkoKò¸©sÌÉ'«êcS‡ússõºóeOæù¸s®þÕª:4píB3W½kU5u`‹h­íIrù€¥wWÕÉg,­µs“üÞµUÕì÷¶$o°Ý§ªê9CλèZkg%ùüÔ9æèYUõÙ©C,‚ÖÚ­IN°ôùUõñÎ3–ÖÚ]IN°ô%UuÉ:{=5É—žúŒªºyàÚ…ÖZ;˜ä)S瘓÷TÕë§ôç8æêuçËžÌóqç\ý¤ªº~àÚ…f®z·mê0”2 ÝP† Ê0tC€n(ÃÐíS¶”k“¼}Àº{7:ÈÈfØãêŠë®Ÿã9§vsæû;œÚSX %9yÀºƒddḭ̈ÿ§ù€5·døÜ|ûÀu=øÍ$:Äœ|vê@·†ÎÕCæËžÌóqÏ\}ëÀu=0W]kU5udÛÔ`(eº¡ @7”aè†2 ÝP† Ê0tC€n(ÃÐ eº¡ @7”aè†2 ÝP† Ê0tC€n(ÃÐ eº¡ @7”aè†2 ÝP† Ê0tC€n(ÃÐ eº¡ Àqk­ÓZûhkíÒÖÚs§ÎL«µvfkíß·Ö.o­½¹µÖ¦Î½h­=¡µös5Àp­ª¦Î@GZkÛ’Üœä{—ﺩª?a$`b­µw'yÊ»~¼ªþxª<ГÖÚ»’¼qÅ]æj€uødŽKUÝŸä“Ôò×åÓ&À%¹cùû“˜0 ôæ“Iþbù{s5À>€‡¤µ¶#ɶª:4u`z­µ“<¾ªn˜: ô¦µ¶=ÉÌÕÃ(ÃÐmS€¡¶OØšZk'$yN’ï9to’+ªê–‘ó¼x%7%ùãšècõZkO²;.3=Éþ1sµÖNLrÞÊûªê’‘νè×éŒ$; pzÔZ{j’³¾Ë¡/VÕ‘³<+É®±äî$Ÿ¬ªÛFŠtŒÖÚII~2É£gÝ•¥\GFγ;É÷¯¸ësUuÝçu–µÖžœä‡“´™C«êÊ‘³ô:¯M’k¹úIž´Æ’©¯Ó#²tNŸ94i.`14¯ÇÆÖZ{U’·'9c•%÷$¹,É˪ꎑ2 ùGÑW“\PUÝè°8fß±`CµÖž™ä½Y½“$'&ùûIÞ5J¨áÎLòþåw©Ëû²vÁ"Iž˜äâÖÚSFI´øÎLòÖÚßñœïKrNÖ¾N?˜¥\cþý,¼ÖÚÉI.ÉÚE˜$ù¡$i­Í¾cë”NIòª$oë„­µ$yGVÁN’œšäÕI~i”P‹Ïu6­åOÎøÝ¬]„I’]I.]~£¿EqJ’W$ùÕ±NØZû™$¿–µçµ£s¤ymÉ”×iµ"L2Á¼,e`l/N²}Åí¯eé]~­ôÒ±B͸7ÇfúóÇNIrî!–_ ôü5rÝ´âØi3k·‚û³úu:9É Æ±|Vžk­ë4Úß@GÎJ²ò Žäعjå§“>1É–ìX_É™þï̱—˜ãÎÜþrÈõ¥™cS=·2¥®Ól®­x€ùyZ–fë£Öš« Éí+çµ/Ìs.š=—yíX=^§1ç}`l_ À†ú+?Ú·µVf9êPUýå“…­µ×'ù ó5›ë‚$N˜gjG\'€MéÓUµçèÖÚÅI^>]œ¿ôºªÚ—$­µÇåØ7?˜ÒÏWÕIÒZ{b’ë¦ ³z¸N‹” Ø|z˜«“cK:S2¯Ëuºá“aè†2 ÝP† Ê0tC€n(ÃÐ eº¡ @7”aè†2 ÝP† Ê0tC€n(ÃÐ eº¡ @7”aè†2 ÝØ>u`Ë{okíß­rì¾Q“À|ü•ÖÚ­+nŸ4sÜß5ÀÚ~rf®:u渹ŠýAkíÞåïÛÌ1ÓÀ<™«ÙŒÌÕÀƒ(ÃS;eùë»yϘA`NZ’ÓW9ö­$1 @¶gõ¹êª$WŒææ´5Žy ˜§µæê/$ùĈY`^Öš«ß=Z `¡l›:Àwq8É»’ü«©ƒÀ}&ÉyUuÓÔA:t’ßOò¢ªºgê00'7'ySU}hê À¦w’?Hò‚ªº{ê00'7'ùçUõþ©ƒÓðÉ0ÀÔÞš¥³¬tMUÝ1E˜ƒCIΞ¹ïöªºvŠ0út’×ÍÜ÷ͪúúa`N^•äOVÜ®$_ªªïL”ؼ¾Û\}KUÝ8E˜s5ð Ê0ÀÔ¾ZUWNæè^ÓËs›Ðµþ®€‘˜«ÙŒÌÕÀƒl›: ¥ @7”aè†2 ÝØ>u`Ëû­µ§½QULfÁ=²µvÑŠÛÏœ, k™½NWTÕ¾ÉÒôçÉ3sÕGªêÀdiß«[k{–¿?}Ò$¬eåu:RUÿrÒ4Àf6;W¬ªþt²4‹oå¼vÚ¤IX‹¹xe`lWÏÜ>gùë(e˜|'É5Iž¼|û´$¿2]V1ä:)ìîú$G’UUU’óZk?šä•IN™8ÒQ\ñý·gŽ}qæøì§Ûl˜ªúlkíÌ$?—äoÍ~z’+Ë ßɱ¿1­<ï3Çf¯Ó•gÉòuú$¯Hò£3‡½ËÀ:ªêC­µË³ôâ¿:søº "%K/¸XYÐùúŠïï̱3èM£$JRUw'ù±ÖÚÙI^œcÿ¯ç‘IÎ+ËŒÿ™¥w">êڑλÈ×éÙ­µ¿›¥w¯=qÅáÙçž–ªº´µöÉ$¯Éƒçê±æ³YkÍk³ÿç<æ¼vO’ç´Ö~"ÉKsì¼vJ’Ž•eÆTsõþ™Û=\'s5$iK¯G 7­µ ’\¸â®7UÕESå¦ÕZ{bŽ-]UUgM“úÒZ{\Ž-|˜«ض©ÀPÊ0tC€n(ÃÐ eº±}ê ÓZû¾$7¬¸ë„™%÷ŽX­µO$ù;GoÎö\¬af®že®X`Ê0ýhINZåØ-I>4b`1<"«?_ðoÇ 2WtjÛÔxØþ(ɹUõÿ¦,„’¼¡ª>:uèÐ×b®Xx­ª¦ÎÀ­µ’üµ™»o¯ª§ÈL¯µvf’SWÜUI®­ªû&ŠÝ0WôK€nl›: ¥ @7”aè†2 ÝP† Ê0tC€n(ÃÐ eº¡ @7”aè†2 ÝP† Ê0tC€n(ÃÐ eº¡ @7”aè†2 ÝP† Ê0tC€n(ÃÐ eº¡ @7”aè†2 ÝP† Ê0tC€n(ÃÐ eº¡ @7”aè†2 ÝP† Ê0tC€n(ÃÐ eº¡ @7”aè†2 ÝP† Ê0tC€n(ÃÐ eº¡ @7”aè†2 ÝP† Ê0tC€n(ÃÐ eº¡ @7”aè†2 ðÿÙ»÷ IË:_ðß7³ª»«úˆÜ¡i.Ò\tÁ‘›¹x‡Qª=:1¡äÄF¸NllhÄÆõ;ëžØ0fÏ„gâ$±ëlL—÷+†3ê8G3#ˆ\¦FT¡º«/uÉý£ªº²º²šj¦ðÍ>Ÿ?º2ß7+ë—Ù]ïóËçû<P aŠ! @1„a(†0 ņ Â0C€bÃP aŠ! @1„a(†0 ņ Â0C€bÃP aŠ! @1„a(†0 ņ Â0C€bÃP aŠ! @1„a(†0 ņ Â0C€bÃP aŠ! @1„a(†0 ņ Â0C€bÃP aŠ! @1„a(†0 ņ Â0C€bÃP aŠ! @1„a(†0 ņ Â0C€bÃP aŠ! @1„a(†0 ņ Â0C€bÃP aŠ! @1„a(†0 ņ Â0C€bÃP aŠ! @1„a(†0 ņ Â0C€bÃP aŠQÝ|óÍU’«’¼ºîb–¡“ä'ívûGur(­VëÄ$W$©ê®ežMò­v»½«îB–Òjµ’¼5ÉÆºkY†é$··Ûíê.äPZ­ÖYI.ª»ŽeúufÞ£ûë.d)­Vk(ÉÛ“ ×]Ë2L$ùA»Ýþ—º 9”V«ua’×Ô]Ç2=žä;ív»Sw!KiµZGfæÿÑÁºkY†½I¾Ûn·Yw!‡Òjµ®HrRÝu,C'ÉCívûŸê.äPZ­Ö±™¹-!¨=–äÛívûÙº YJ«Õj$¹6É+ë®e¦“ÜÕn·ï©»CiµZ§%ùý”q}ÿtf®öÔ]ÈRZ­Öª$oK²¡îZ–a2É?·Ûíur(­Vë¼$Ô]Ç2=™™÷èTÝ…,¥Õj­ËÌ{tMݵ,Ãþ$ÿ­Ýn?Qw!‡ÒjµÞ˜äôºëX¦GÛíö«»ˆCiµZGgæw}³îZ–a<3ã¥ßÔ]ÈRZ­–Þè kµZÇ'ysʸvz.Éßн6É+ê®e¦“ü¨Ýnß_w!‡ÒjµÎHrqÝu,ÓS™yösotMf®ÖÕ]Ë2L&ùïôF_›äܺëX¦'2Ó'éçÞè†Ì¼GWÕ]Ë2”Ò½4É©u×± $·Ûí¬»CiµZÇ$¹:e\ßïÊ̘¾Ÿ{£Ufþ>7Õ]Ë2t2Ó½»îB¥Õjœä²”q}ÿLf®ú¹7:˜™ßKGÔ]Ë2Le¦7úpÝ…J«Õ:'ÉïÕ]Ç2ý23ïÑ~î®ÍÌ{t¨îZ–¡”Þè’œYwËô/ívûê.âPZ­ÖQI®K2Pw-ËÐ÷½Ñ$iµZoNrBÝu,C)½Ñã’ü»”qíTBo´™™óz£+¤ÕjmIrIÝu,“ÞèÊÒ]yz£+ë÷F«›o¾ù«™™Ä]Šé$W´ÛíïÕ]H/­Vë-InMÝs¾Ðn·ÿ°î"–ÒjµîN9ÿ¹%3ƒ™ ÚíöCuÒK«Õú@’vʸèžóÉv»ýẋèe6óh’WÕ]Ëax2ÉÖv»ýTÝ…ôÒjµþc’Õ]ÇaúP»ÝþTÝEôÒjµNJro’õu×r~’äuív{_Ý…ôÒjµ>ä}u×q˜ÞÞn·¿^w½´Z­‹“|7Éêºk9 ßNò–~Ì´Z­ï%ySÝu†‰$µÛí;ë.¤—V«õ®$ÛSÆ„„9ÿw»Ý¾¹î"z™ k=’ääšK9¿Í̵ÓãuÒK«ÕúŸ“|²î:ÓÇÚíöÿVw½´Z­W$y8e,Æ0çÑ$çµÛí±º é¥Õjýç$Zw‡é}ívûÿ«»ˆ^f'xü0e,Æ0ç‡IÞØ¯=Z­ÖW’¼£î:C ½Ñ¯§ŒÅæè®,½Ñ•§7º²ú½7ú’ôåµò!ôsoôÕIîOŽçô{o´¤/{‡ÐϽÑßKòý”±Ü~ï~+3“KÑï½Ñë“|!z£+b6¬õÓ$[ê®å0ô{oôLò)ëú¾Ÿ{£Gd¦_„ã9ýÞý?“ôåxîú¹7zF’;’¬­»–ÃÐï½ÑÏ%éÛ¾XýÞ½"É7SÆ„ã9ýÞ½=å„^“þï¾/Éÿ“2ªÓϽÑUIv&9®îZƒÞèÊÓ]Y/¨7:äʧžM#3»®ôåEM’ËSV&oo4_ét:}×´\¿~ýê›nº©¤{“dø¶ÛnÛ^UÕÏë.¤—k¯½öuÇw\IÍ <÷Üs7WUµ¹î:z9þøã7^sÍ5%}Ø›$›¾ýío¹ªª¾¼¨¹ñÆß´qcIs“'Ÿ|ò­ªª/?\9ûì³»ä’KJ Â$Ék¾ð…/|í–[n¯»^Þ÷¾÷]½zuI¹ä‘Gù¿ªªêËÞð†7œ~Î9çõ:==}å§?ýé¯ÜrË-Óu×r°U«V5ß÷¾÷ý~Uõ«~ðî»ïþ«ªÚYw!½¼ùÍo>÷”SN)éÃÞìÙ³g[UUG×]G/G}ôºn¸áäºë8LG~ÿûßÿ|UUOÖ]H/ïxÇ;ÞpÌ1ÇÔ]Æayúé§ÿ§ªªú²q}Úi§sÅW”u1šœòo|ã«UUõåʼ###W®[WÂbHóüñÿ½ªª¾üðç‚ .8ùu¯{]IA˜$¹èoþæoEe@ IDAT¾vË-·ôÝÊ]UUUüÇüÖf³¨_õŸþô§ÿµªªŸÖ]H/—^zéÙ[¶l))“ÉÉÉw讨áÛo¿}´ªªÇê.¤—{£ccc-½ÑµéïÿþïõFWÐ/ùËÿÐǽÑW_rÉ%%}Ø›$¯ùâ¿øõ[n¹ewÝ…ôRbotçÎÿ¹_{£]tÑæ­[·–„Éôôô•ý×ýÕ[n¹¥ï&t6ÿèþèÍ¥õFï¹çžOWUõHÝ…ôRbotïÞ½ïéãÞèÚn¸¡¤ L’ùƒüà UUý¢îBz™íõ¾Ï{£¯¼âŠ+J Â$z£+®Ï{£'½îu¯+)“ôoô:½Ñ•ó¦7½é¬3Î8£¤ L_÷F×­[·zdd¤/gB ½Ñ’‚0ýÞ=òšk®))“è®8½Ñ÷šÌÌkÙ@’ÿ˜äÿH9+%ü$ÉhÝEÂ_&ù@’"f#MNNæÎ;ï\Õétúṟ±±Üÿý9ûì³ë.eÙ~õ«_塇zm’×Ö]K/·Ýv[Þþö·g` ŒÌÖ¾}ûòãÿøˆ$××]K/?þx{챜xâ‰u—²l³5¿±î:–rÛm·åª«®J£QƵ÷øøxî¼óÎcÓ§ïÑ|0[¶lÉÑG÷eß‘N§“‡~8Ï<óÌUuײ”Ûo¿=o|ãSÊjÏ>ûlî¹çžÓ’œVw-½Üyç9ùä“SJ#xjj*÷ÜsOcrr²/wVÜ¿î¾ûîœþùu—²lO=õTxà­I¶Ö]K/?úÑrÜqÇeÕª2ú–¹óÎ;‡Ó§¿—žzê©ìر#›7÷e¿ª§_üâÙ¹sçEu×±”Ûn»-×^{mJù°bïÞ½¹ë®»^‘>}îܹ3guV6mÚTw)Ëö³Ÿý,¿øÅ/.¯»Ž¥Ü~ûí¹ì²Ëй¾ßµkWî¾ûî’œPw-½Üwß}Ù¼ysŽ8¢Œ¾åôôt|ðÁŒ_[w-½t:ÜqÇyýë__w)ËöÛßþ6?ùÉOÎHrFݵôrÇwä„NÈÐÐPÝ¥,ËÔÔTî¾ûîA½Ñ•óë_ÿ:?üðI.¨»–^Jëîß¿?wÝu׆ôéµS‰½Ñ'žx"?ûÙÏôFWÈž={r×]wmJŸ¾GKìîܹ3O?ýt_~€ž”×˽÷Þ{j’S뮥—»îº+§œrJ1½ÑéééÜwß}‰‰‰·Õ]K/ÅõFŸ~úé<ðÀç$9§îZz)±7z×]w ¥O/•Ø}òÉ'óÈ#ôí ¹´Þè¾}ûôFWØc=¦7º‚vïÞÝ÷½ÑÓN;-GydÝ¥,‹ÞèÊë÷Þèüãœxâ‰z£+d×®]z£+Loteé®<½Ñ•õàƒæÜsÏýåºuëJYÐj:Éh»Ý>ìÅ”«N§“V«uT’ +_׊ë$y¬_·]žÓjµ2“L:ìNð7¾ñ?66ö;ÛæiïÞ½™˜˜ø]ý¸lhh¨ˆ_ÂÓÓÓÙ½»/ëZ Ùlfx¸Œ…d÷ìÙ“ÉÉɺËx^ÃÃÃE4Ù&''³gÏžºËx^ƒƒƒY³¦ŒÅÐvïÞéé¾Ûb‘µk×q¡811‘½{÷Ö]ÆóZµjUJX±Óéd÷îÝéÃE<¨ª*k×®-âCô}ûöeÿþ¾[¸g‘5kÖdp°ÿä.åÚ©Ñhdxx¸ˆ÷¨ëû•555•ññ¾Ü¨lbëãã㙚ê»Åc)åÚÉõýÊ+åú~ݺuEü^Ú¿öí;¬]¬k±zõê"&wu:ìÚµ«î2ž—ëû•çú~e鮼Rz£®ïWžëû•¥7º²ôFWžëû•UÊõ½ÞèÊ+¥7ZÊõ}I×N¥\ß—rí¤7ºòJé–òuí´²J¹v*éú^ote•rí¤7ºòôFWVI×÷…ôFÿÓÍ7ßü©ÌlžÒïv·Ûí_¿o¬ú½ørSUÕÿä¿Ô]PœÿÔétþ—º‹x±õLf ÃP aŠ! @1„a(†0 ņ Â0C€bÃP aŠ! @1„a(†0 ņ Â0C€bÃP aŠ! @1„a(†0 ņ Â0C€bÃP aŠ! @1„a(†0 ņ Â0C€bÃP aŠ! @1„a(†0 ņ Â0C€bÃP aŠ! @1„a(†0 ņ Â0C€bÃP aŠ! @1„a(†0 ņ Â0C€bÃP aŠ! @1„a(†0 ņ Â0C€bÃP aŠ! @1„a(†0 ņ Â0C€bÃP aŠ! @1„a(†0 ņ Â0C€bÃP aŠ! @1„a(†0 ņ Â0C€bÃP aŠ! @1„a(†0 ņ Â0C€bÃP aŠ! ðtÑEåºë®[tüø@N:é¤*XÂ0/çž{n>ñ‰OdçÎùçþç¼ãïXô˜}ìcyôÑGóÿøùÓ?ýÓlÚ´©†J^¸º à…Û²eKFFF222’³Î:kYßSUU.¾øâ\|ñÅùó?ÿóüÃ?üCFGGó…/|!O?ýô‹\1À¿0 @aN<ñÄÜtÓMÙ¶m[.¸à‚Ós5\y啹òÊ+ó—ù—ùÖ·¾•ÑÑÑ|ùË_ÎØØØ U °r„a ðªW½*ï~÷»322’‹/¾8UU­øÏÌu×]—ë®».{÷îÍ­·ÞšÑÑÑÜzë­Ù³gÏŠÿ<€B OuÔQùƒ?øƒŒŒŒäòË/O³Ùüýì5kÖäÆoÌ7Þ˜±±±|å+_Éèèhþîïþ.¿³:& ÐGÖ­[—믿>Û¶mË[Þò– Ö]RÖ¯_Ÿ÷¾÷½yï{ß›§Ÿ~:_üâ3::šï~÷»™žž®»<àeF fkÖ¬É[ßúÖŒŒŒä­o}k†††ê.iIGuTn¾ùæÜ|óÍyòÉ'ó¹Ï}.£££ù§ú§t:ºË€UI|vð» PƒÁÁÁ\uÕUÉ 7Üõë××]ÒaÛ´iS>ô¡åCúP{ì±|æ3ŸÉöíÛsçwÖ]°„Õ*SN&š—³ª13UgÂ&°°¤Æà«ÓXsvškÎÎþ§þk:½ Î7‡¶¦9ôºLï½?SûHg깚*x醸i4¹ì²Ë²mÛ¶Üxã9ꨣê.iÅœxâ‰ùÈG>’|ä#y衇2::šÑÑÑ<ðÀu—/{ƒä¤áfN]×ÌqC|éñ}ùíÄÂ4Ì1kùw¯Z•ÇÆ§²s×t~>>•) Ù@ªcÒzMšCg§jv}Îßs˜*Õǧ±úø ä-™Þÿ³Lí¹?Ó{Hgz÷ï°j€—>a€ÙÅ_œ‘‘‘¼ûÝïΦM›ê.çE·eË–|üãÏÇ?þñÜ}÷ÝÍg>ó™<úè£u—/UrÂÚf6¯kä„áfš®“ÕâÇWI›Éië›9m]3Óƒù—ÝSyd×TžØ3iÁ^Fª£ÒzM†ÎI5ðÊÃøÆ¤ªæÞÍÕ'§¹úä$×fzߣ™Üs_¦÷þ4é½K>Ë# ð"8ÿüó322’‘‘‘œtÒIu—S›óÎ;/çw^>ñ‰Oä‡?üaFGGóÙÏ~6ÿú¯ÿZwið’Ó¨’㇛ټ®™“Ö53Øxþï™WÍOÖ©’UdËÙrÄ@öNvòèî©<26•_ì™^¼è-¼TÍ#Ò:;Íá­i ;{pÁ#–ñ$UÒ8x@ÞIR¥1tZV­9-é¼-Sûvdjü¾Lí}0éL¬Ì x™†X!gžyæÌgœQw9}碋.ÊE]”O~ò“ùÞ÷¾—ÑÑÑ|þóŸÏo~ó›ºK€bUI^=ÜÈæõ9e]#«›Õã‹Ù}»³èt£Z|¼“dh°ÊÙGäì#2>ÙÉ#»¦²cl*¿Ú;½’/~çªÆÚ4‡_“æð9i¬:a&̲ð ¾,ãgV«èÖéº_u’ ¤9|fšCg&‰Lí}(Sã÷fjïÃIgê…½€—!a€ƒ“O>97ÝtSFFFrþùç×]NF.¿üò\~ùåùÔ§>•oûÛÙ¾}{¾üå/ç¹çž«»<(¦¡F6¯oæ´õ¨ÏÉ©zÞìyîØÌµՂ8LÕYø µ«ªœ{T#çnÌØÄtvŒÍc~³O0€2T¡4‡Îš À¬9%IcÑ0‹21³Ç»¿ô|D•Ts;ÃÌ©\'ét掯Jsí9iŸ“LïËÔžfƒ1;“kŠ0 Àa:öØcó®w½+Û¶mËÞð†ºË)ÚÀÀ@®¹æš\sÍ5Ù·o_¾ñodtt4_ÿú×3>>^wyÐWŽ^ÓÈéë›Ù¼~ ëVõÀô8º??)hîÜܼN:9ju#¯e#¾r0OíÆŒM˜¬@Mª4‡¶¤9¼5Ã[’jpöx÷vª½ÉK ´—Ž9x€,dW‹ƒ1óìÎLÕX—Ɔ 3¸áÂLOŽejü¾Ù`ÌãÏ_ÀË„0 ÀÖ¯_Ÿn¸!###¹êª«288XwI/ëÖ­Ë{Þóž¼ç=ïÉ3Ï<“/}éKÙ¾}{¾ûÝïfjjªîòàEµa°Êæ 9ýˆfŽ^ÝúÑæÞ{ïÍèèhFGG³sçκK€ 4’SÖ d󆜼¾™f5¿ûË¡Â/=ƒ/Uµ(¨²T¦ê}¦§™…kNšÛõ%ÍÛéTÕ|`¦Z’éÌýÜ…ótÒ™¸ÓIÕµ˜íL0æô#fþn&¦;Ù96™‡Ÿ›ÊÏwOņ1$I5øÊ Ÿ“µç¦ZuôìÁe`|]x»:8ز(è²Ô ûù ^b›×Îüî]agÉ3÷çC2Ý™ÙÛ3ìá˜N÷n1sÁ˜¡“²j͉ÉQ×ejÚ}o¦ÆïOgzü¼€þ% ¼ä½öµ¯ÍÈÈHnºé¦œxâ‰u—ËlëÖ­ÙºukþìÏþ,·ß~{¶oßžÏ~ö³yâ‰'ê. €—‘F•œ´vf˜SÖdpvQتZ€Y2üÒ|Y´Ìâ°Ë¡§­–¸Ý}¬QuÍËI×ówÍÍé®»3›xéÉ,\Ävá2s ÛÎíÓ½kLUu²ªªr摃9ãˆÁìšÎ#ÏMeÇØTžØ=¹€——j`cšÃçd`íÖ4Vmšô*spèåÀ yþ\µèÜAß“^ççvÐ% ¯’îaºš8ø9æ·Q=pÿ@HfA@fööõöE(cfŸ·9tjšC§&ÓoÍäž™¿7S{H¦÷úu@xI:묳²mÛ¶ŒŒŒäôÓO¯»jrá…æÂ /Ì'?ùÉ|ÿûßÏèèh>ÿùÏç׿þuÝ¥ðT%9~m3§oÈ©ë›Y307)gæì¹9U÷|œC‡_ ¾,X`öÀó7[ªÒƒU©=ö’éÌdf~nçÀ±ª«È®9:ét:³stæw™ ÇÆÌVÑ+“t24ÐÈk66òšƒÙ=1cSÙñÜdžÜ3}¨@Áªæú4‡ÏIsí9i®>!ÇÝá—E;À,\/Þùe©Z–`/ܹeQ¡‡zIÕ˜,w=xÁ÷tfw€9°¼D×öªéÚåeæ\u`%‰™'êtæv‹éúº 33ÎîÞ-&ÍÁ ¬Ý’áÓÓ™žÌÔž‡fƒ1%‰C¼ €þ% ¼dœrÊ)ÉÈÈHÎ=÷ܺˡTU•K/½4—^ziþâ/þ"ßùÎw2::š/}éKyöÙgë.€Â;ÜÈé²yÃ@†šU×Üœjá|C`–¿,ž£³øø£=®}žk»4ºž´3é®kvO§ëØüb³]!™ªZ23¿€íÁ˜ÙÇÍíÓé$ëV5rÞQœ»q »&:yø¹É<üÜTžÚ'Pºª1œæÐÙi®ÝšÆš“RU$SX`bépL`LW &³cðE»ÅÌýÝt:©«Ó\{^škÏMgj<Óã?Íäø½™Þ÷è|]}J(ÎÑG?üÃ?ÌÈÈHÞô¦7¥Ñh<ÿ7½Ì<ûì³ùÎw¾³èø­·Þš?ù“?ÉÀ€ËÀ$Y½zu®¿þú\ýõÙ½{w¾öµ¯ett4ßüæ7³oß¾ºË Ïµº‘Íë›9ýˆ183gá"µó–î]`ªÙ?ž7sPøeἜùƒÏËYx¿J×·õ´Ô¹îaæ47í¥êÌO€™ËÉÌfæïwd‡cf1];Á,ŒézÅîÍjæB1N²qurá+ó{G橽Óyxl2ŒMelÂdþöî4H®«¾ÿ÷ÜÛÝ3=û®m$dIÖbË«blLXMa6ÁP â@â`\ŽKyžÿ ’J%•ªTò"©h â$ Š18˜øÁaq$Ä€7ɲµX»¬Ñ:ûÚ3ÓÝ÷žÿ‹»»õô,š;#}?«oŸ{ιwz†ªœ™ó½?"""""ZtDzåF+S¹ÐRJÐ¥D&~±×ÛÓ`‚Ae”:¶Þ+²*“L³èÎwyêU_u¬ 0îªÛ¬¨!{=, L ñêc¤ˆtdd(FH;h£WC¯½zÍMÆŒÜ!¹0ógJ|ÁDDDDÉRò‹‰âO&}DDD‹M]]>úÑbçÎøÀ>À0GŒ#GŽà‰'žÀ¿þë¿bll,²O{{;{ì1|îsŸCssóßáÒ0<<ŒïÿûèêêÂÏ~ö3‹Å¤o‰ˆˆˆˆˆˆRŸØP«ãšºš+5{ï‚ bÜM9Î>¡>¬¶ìŒZñ%¼_'"ðÜ·ãïêëýå½Cè›0|ý6Š $B IDAT4¦ñÀÖ:8tâþ|$ÝÔ÷ÒwNÝë#ݧ۪罪1Îuœ¿W©ïÕù¤ôQûûúJ‰K“&Ž81f WäßÁˆˆˆˆˆˆ#th× •½zöZ@Ë(á><¢tF ÂØëêá[DG^üm¢äâ:f±mÝûÿA¾¶tË;]÷™øAÑ kï­úÞ·ÐVÜîšXúÞCª}•>j›»—ö‹ Œ—Þ§_qFî Œ‰0 â¿6"""ZLþVJù§IßÄåÆ0Ì"Ã0 ‘§ªª þð‡ñ©O} wß}7***’¾¥EIJ‰ÿøÇèììÄO~ò”ûÿße³Y<ðÀصk®¿þúË|—KWoo/žyætuuá—¿üeÙŸ/-]5)õµ:6ÔêhËêÊÃi½ KT%ÿÃlE`Ÿˆ À8çí–˜½9"¼wþ¹j‹÷¥×¢Ã0¿·­.²ÔR8¸>Vß:™ð^è`LxïN© Ìô¡g3)ó&NŒqrÌÄ”Á5=Ñå' eÖAÏnƒžÝ ¡eýg= µ” Á(Á_•ï5TE&b-ÔsÜqÔ{{šàú{ôÕÿ iä|méÖÛ‘]ÿûÁê“#Ôæ˜PŒrìÇ_½ciWOžp_gŠñ-ÂaúaL„1q²ØñEÑ"Á0 -<†aˆˆèj—Édð¡};wîÄ}÷݇êêê¤oiÑÃ7¾ñ <ñÄ8zôèœæzï{ß‹]»vá¾ûîƒæ”l¦sçÎáé§ŸFWW^y啤o‡ˆˆˆˆˆˆæQVXW£aCm +ª`”0K8#”}:Â·ÏÆ–ò„ZuÏŽRåEí?µo°=ü>P9&зóÕAôåüa˜M|ú:; #}/þ£ÀŸ•üï¥o?Žz T}A8ãlîñï»Q‚.ö·gšPŒ»_Ç:6MàlΪszÜ@ÁÍ#-½zå6hÙ­zµ?ðb‡Wf‚¾E´‚q2¡Î €Q*¿xˆ^t»ÿ(§âB1–‘WþdцɴÞì% ¹=Sú×Ó¾PLD@ÆŽ .¼}O¡ðæ[œcl—qíöºÛ Ù„Ûe¡ÆÄ“‡ Á¨/”ˆˆˆ’Ã0 -<†aˆˆèj¤ë:Þ÷¾÷açθÿþûÑÐÐô--j'NœÀ—¾ô%üË¿ü FFFæuîuëÖá±ÇÃg?ûY~¦qâÄ tuu¡«« Húvˆˆˆˆˆˆh2š@Gµ† µ:VUéМý8B({o„²OG Ĩ•`"B0þý8ÁŠ/Á÷þàŒ#*üâ5…û{­êAøížWцùýëëâöè¨/î©´FïÛ‰¨úb¿‰ Æø*è{p áÛßÅÇ…ÆúM {Ü ÆtçLù§2"""""¢YÑR+ Un…^¹"U§TqQƒ0NàÑmÁ*0ÁLÄq¨ Œ– `"Â/JÐÅz .ªCYÃÈË»Ãa˜¶;Ýð``\0ࢼ‰yÈDäB;ðŒ Y8_)Æ­ã\§D•©œ7 çaN‚1uÒ ~pDDD´ð†¡…Ç0 ]-„xç;߉O}êSøøÇ?޶¶¶¤oiÑû¯ÿú/ìÙ³Ï?ÿ¾´ººŸùÌg°k×.lÞ¼ù²^ëJpðàA7süøñ¤o‡ˆˆˆˆˆˆJH `mµ†õ5)¬®Ò kJà%PýE­Þ2«Œ¯2Ìôڌ㿈à^ß{ؽ:*üÃK¡0̦¦ ~{}ä8M<2tÁXÇáЋóÞÛ«#}ût ¥²gÇŠq«ÃØç¼=8ʼêx'8£´ç ‰·ÇMœ7pn„É?›•$ôVè[ìLS ÜâµL_ &ÐÐŒ¯?à Îø‚0Ê%b0Á~î?þ…vT&f¡=ò›]á0̲w"»1†±I÷å½r Yœ†P8¦T0Æ7Þ_ÅeÚPŒ¯Œ3ŸúŸ:ÿ?«Ùtç1óg`L‚™ Òô>DDD´`†¡…Ç0 ]én½õVìܹŸüä'ÑÞÞžôí,z¹\ßúÖ·ÐÙÙ‰ƒ.øõ…¸ë®»°{÷nÜ}÷ݾ'ÒR´W_}]]]øîw¿‹îîî¤o‡ˆˆˆˆˆˆèhÏjX_£cMµ†´æ¿¸Á–@àÅ Å ÐÞShÃ!Ø—£ö³þQöêø*Î@i…_ÜãˆÐKä^¯%xîïÓÃ4gðà V•XÿCiýGŠÜ·cÿ±g'6ÂøÇ»AgÌ4¡o_?®®*ã´OÀéq'ÇM\œ4£«ä]…„Ö­b3ôŠ­©Ö˜Ê/Á6”è%´ÑˆÁ(a—’ßz[Y¨»/êb:¸°ê²Ú×®öþÕCsz-¤9È"2ËÞ‰ªk?ëu .¤¡.µeTcD¨ÅéR:ãUbUÍÊâºìPŒ[ÆYoÃ/¾Ey MígÂÌŸ†9uFþ( §¢>T"""º<†¡…Ç0 ]‰¶mÛ†;wbçÎØ°aCÒ·³$œ9s_þò—ñÔSOapp0éÛlܸ?þ8þàþµµµIß΢'¥Ä‹/¾ˆ®®.|ï{ßCOOOÒ·DDDDDDtUVf5¬¯Ö°¶JGF^”PŠ×S &з¬LDÕ¸s8wèÜŸ#àDîÏq®øÂ§{”Åßý¦½ãÚ  Ãüá ±c¢C0^ƒ»ïFù'Žq6äø÷êȈý92æþPŒ ‰¹@9ŽÂD—˜(Jœ7q*g¢gŠK#""""¢«Ðj¡¥7C¯Ø‘Z¡„V4ká©9 Zá—] Æ ¶¸mê“$Ê Á¨í€º(`‚á7é"üo£Õ%9úÊß@ÏÞ=»Òœ‚1¾Z•DvÓñlp¿¦²à–ʱo!\t˘`Œ„·¦ˆ?þã?f¸©L†aàg?ûºººðýïCCCIßÑIh«XW­££ZC¥¥ÊK Ü¢¾"æ|°r üçÿ¡L¨ Œ“s ÿ¾øE(êö›à^œ`5W:°˜¦D×ÿöaÅ” 'úÒ `´6…ûoköÏ«YÔÆ¨‡ÕzÇêuŸŽôÍç Â(Áçœ3—^™Q(ƾfTÐ%Øe§Í´'7%0V4qz\âtÎÄ@W#""""¢+—UÐÒ› ¥·@K·û.q¡Äa¦ëDôB!w=Ø8Ç¥0Á ŒÚo¾¨c»«s ÍŠýGaŽ€¬u•ÒRƒÐ‘ª_ç´F-°ýÁ˜ˆc8&ˆ‰ ÆD„cJ†b‚c¥Òß”™®JŒµ˜vƒ6f‰Œ™‡Q83ÿÌâiň‡ˆˆˆæˆaZx ÃÑRÖÞÞŽO|âعs'vìØ‘ôí,“““øÎw¾ƒÎÎN¼þúëIßNÙ4MÃ=÷܃ݻwãø@Ò·³däóyüøÇ?FWWž{î9Œ'}KDDDDDDK^KF £JCG•@UJƒæ>]ÖyP­J‰Ä ê<á% £ö)'£îÕq6ßD`|AgP0#àþ«îÕ ¼Wû¦ ôœÉ¡ïìŠ3òsÌTêh]]…–ö,ô´ßNà¾ß{Ú“ãˈ}:2ôÞÿ@[5Ђ’¡˜È*0êqÔy>5&ØÏ”ÀHÁ ż=!1\äߨˆˆˆˆˆè * é¡e6CK­„ ´C0Ñ¡À­3m¿@è ß¹èê1€µ¾VÃ1ðú„0¡Åµÿ8°¨ö…f˜SC(öŸ„œ¬PžGå,DÅ0´Z ©¦k!´´sÒ×%ô&ê8މz VœQ¡ïÉ^˜&Ð7bAt°%¶ €4íP ¬;é3¦`Á,iœý; """š1†ahá1 CDDKMkk+>þñãSŸúî¼óÎÐSH)Þ¹sçðä“OâÿñÑÛÛ›ôíÌÉÖ­[±k×.|úÓŸFUUUÒ·³där9üð‡?DWWþã?þSSSIßÑ’ÑèÈ ¬­¨Mivðeš*0ˆÂøÏ{mN &¤qÂ+J8¦œŒZFØþý9"´/Ç~‰ÜŸ#‚ûu ¾. çíq ^œD¹Òt¦•X¶¦ÙÚT(c½x‰©œ“ÎÙ@8¦œ`L0S~(&^qæVÛ£ªÄÈ@u™AõÕ´ oçLœ™”[œ~‰ˆˆˆˆˆb¤¡éë!R› §ÖZ*:¼¢•ªô2]Xñ〈v¥Í]wO‚QÕj¿R˜À«/ôÀ@ÆÈÛ(õÅ&ZôÇ)D Ý4 Q1†TËzh™¥Ý¿¨–2¢=ˆ cÔà‹76ºê‹se!®c¤Ú&KµÃ/NØñýÌà8%ãT‘1'`Á,4ÏAùpˆˆˆh憡…Ç0 - øèG?Š;wâýï?t]Oú––”_ÿú×èììÄ3Ï<ƒbñÊ*÷ÛØØˆ‡z=öÖ®]›ôí,)###xöÙgÑÕÕ…ÿüÏÿ¼â~6ˆˆˆˆˆˆæC­¬É td5Ô§½@‹[ý¥TÐE}Åtÿy„Ú˜’!˜pß¾›ÈL\øÅ| †`œ™¤”¸0‰Koc|¸0§Ï¼®9ƒek«ÑÐZ ©îщ¨£nÈQ_ˆŒ2NJ_¿Y…b!'lã °`š K\Hfš@ŒµWÇkëÏK¼=)Ñ=)1Á‡ØÑ¢¤CÓ: ôMÐRë‘¶ÖŸš6» ŒŒñ·!6@»Äµ{sðψP›ú ¥-‚‘EúÂ+²Á?FÑŸßV`$ÕTC ôÚµþA¡·މ ÄxÁÆ ¸Ä…bÔqÊ‚;tqæ,UýEyoFõ‘%úDbœ÷ÆLãLã(¤¼÷¡Q<†ahá1 CDD‹Uuu5î½÷^ìܹwß}72™LÒ·´¤äóy|÷»ßEgg'^y啤oç²ÓuùÈG°k×.¼ûÝïNúv–œ¾¾>üÛ¿ý¾óïà—¿ü%L“»hˆˆˆˆˆèêU¥k*ÖdšÒ"^™qFXd€™f¼À búçs6ØøÆ8Lj¼„ÞÛsØcÜwŽí×)L™è=3ŽžîŠyåï?Â÷2-:2•ÚÖV£uUzZs÷ÃxøöîxO¨ îÇ f¼÷¾ ‹2G\(Æ ¦8Aœ¸ K¨JŒš‰½˜ö5ìRN ÆyíÉg&MœËS\ÒQ¢4ÑMÛM_ˆŠpˆÅÔ„Ñïcƒ0jÊÌ0î;ÐΫ2?”qÖ0ï¼R5Æ·˜VŽÍŠ}'€É*@T)s(ý#CdÌ_û DŽtóµ€Hy'%ÂǾpŒoÑì{õÎûƒ,¥B1þ1ýcƒ-ˆhSúÃ-³ ĘNÿa˜æ1Hó¤ì+ñÁ‘‚aZx ÃÑbRQQ»ï¾;wîĽ÷Þ‹ªªª¤oiɹté¾úÕ¯â«_ý*.^¼:ŸVrà 7`×®]øÝßý]TVV&};KÎùóçñÝï~]]]x饗’¾"""""¢Q©«*€5Z2Vx%*äRn&n¼µ‡&:Û¼@‹Û§T Ξ:ö?¤Ö_)F(q‚á§Ÿo¯€ÜH—ÞÇÀ¥IHSÚã¼Bí¬¨¨Òa%ŠùèĆïOHv€DÓZVfѶ¦ •Õ©˜=:J&¢­œ Œs½È Œ:Ξq6쨗ˆ ¢ƒ-qmf‰sq)CJ\ÊÝSò@’#""""¢! ÄJ±šv ²JðeA-ð~V}àoƒÚ¡¾Ñ!e(cÜcgܾñ¯Ö±9Öâ``4HÅ„e”6ûR•Ù4î¼{>pÿMè»8‚Ÿ>³o¾tJYËL8ì"s@å8Ò- ÒuPÃ/¾þQÁ˜`¸Å>.+ëV—)~1½ëÆö ´™Ñ}Ê ÄúH)!ÍA;sCá"""r0 C a""JZ*•Âûßÿ~ìܹýèGQ__Ÿô--I¯½ööìÙƒ§Ÿ~ù|>éÛYZZZððÃãÑGŪU«’¾%éÔ©SèêêBWWÞxã¤o‡ˆˆˆˆˆh^e°2¬®hU0³ Âhöæ—è>6D´Â/(1ÁñˆÁø3î¼Ö{ÎiW+¿({oœkJ ]šÀ¥39ŒÜÁB™Ä;ökY^‰wÞ³;ÞÛŠbÁÄo^èÁ¯~r #áßa¸Fr(î?@mS–­©B}k…P±ÿ‘Êé›^ÅD„[ìƒrC1îÜjH1ÁåzÓaÂcMSúç2KbÔ!%.æ³yàb0øç9"""""šgB,³0bûA—št™SFóÀšd™®j ¢û!Ø®Ìë ÁÏÁ ÔL€±ûI…£0Fóhö`„{ øßXZW4à}½ïº{+²Õ¾s—Îâ?¿¿/þä¦&"ö (û5ÝÐ `-2õ^¤—A¯i÷Ÿ/ñêîÿŒ ¸8ý” ‹:.vAT°%ªo Ÿ9M &¦Od Æ,ÝÇ}@Ê>+#Cb4üY]݆¡…Ç0 %Aw½ë]عs'>þñ£µµ5é[Z’ŠÅ"¾ÿýïcÏž=øÕ¯~•ôí,Z©T ûØÇ°{÷nÜ~ûíIßÎ’uøða7sôèѤo‡ˆˆˆˆˆhVRX‘Ve€¶4Ò¡–™a´ˆ¾%ƒ.¡K| &Øîlމ Í DÆ·'xñÞ»{mœ¹í¶bÞDïÙúÎN ?e(›}Ô1Î/E#lÜ^;>´ ›nlíå1 ‰/ àW?¾„îcc¾ª.N ÅÝŸ£¾J‰Š*m««Ñ´" =å„uᘈ`ŒbrÞ·GF«¡çZ¾ НMmwžœb Ì%ì¢Ìçbœ{A Æ Æ À¹ÎF ëØÝ‹ãë¨Á÷ˆ À¨gcEôœÉaðâ$L)•=AJ Æî?n|W3Þq×2´®¬,ë{töä8~óÓøÍІ“ñöÙ¸/R ½H@ךVV¢­½Uº/¬âôq^e`N¯š‹7&:ã‹«ü‚ÈöRU`¼~‘a—@¥_…_°&ª-º¯£`cÎæÞ‚ûñÅh€Ð6Ú˜†˜N Œ/Ø¢_bÎGa¢*ÄÄŒq˵Úá™@è%ŒqîÙ×®´C0îú:zQû:{~cü<Š Ìf)ßu}¯ötÎJ»¢2…ï½ï¾÷z¬XÓ4ãï—”_y¿øoâ­}Ýêoб‘ã@Eéæ ™Zw ·Ä…bÜy¢B1Þ˜i«Ä˜3 ÄX ìYbJU‡1#úG­¢%¤‘ôm,Io¼ñ:;;ñío““üÊ\,_¾<òyä,[¶,éÛY’þðÿ_ÿúד¾ """""¢H¬Ê/«2V%˜Tà᩾à‹p™[fú>Êq°êK(ÔâÄ”‚‰ªãßÏãÀH)0Ô;‰ÞîƆò‘ã|åsml­Ào½¿ 7½«•Uú¬¾ocüúó^¼ú‹^Œ (ûL¢-J[]sÚVW¡¶)ãç„N¼qjè¥ÌPL Ÿ¶)»JLT &z)1nVÓ{eJçóV0¦¿8«o]¡jáV€-Ót޳¨A–Rçü}Ê ÂDT•‰ ½Økêè~ð·«a–ÈÐ BáµJ HŽÂô>·˜Œ;Î~il©ÅwoÃ;îÚŒªšŠ¹\<;ˆ_þð^ýïcÈO©ODV~?ÌRëCªq9ôꕾón—P8¦T¥x&²½dØÅîg‡T¼ë˜þ€ÍŒ1füySB:a˜¨`N,Rž…)CÊSòsý-% ÃÐÂc†ˆˆÚç?ÿyüÍßüMÒ·±d†çž{øÅ/~‘ôí\q2™ >ùÉOb×®]¸õÖ[“¾%åÆoÄþýû“¾ """"""—Ð’²0+3@FÄôSÂ%n…-:ø¢‰`%. 3ó°ŒïâúÂ(}­¯): Ì8}xoLôŸ@ïÙ S¦tvÇÀ @¹§Žkk±ãý­ØtCƒ/3FQâÐ+ƒxùg=¸p:§Tˆ W·HTT¥ÐÚ^…æ•ÖÆ)Àw>*Ũo£Ï´_{L°mþqÕ]¢1ÑaûØô÷)eÂÎås`Á""""¢«T47SæÕp‰x™]&¾hÑâB/1UcÔnd?„Û‚_W0 ÎÅ }Ç §*!DMx.xëq_eë·¬ÀwoöдyZXLŒOᥟÁ¯~rƒ½£V£/ Ç( o)û¡ÕT ݼ îM«Á—@•˜P(Fª×´M~ †]B–ˆqåbÔÀKð¼=‡TÂ0Ö{Óz_Rž)AÊ·p±MDDW<†ahá1 CDD í®»îÂOúÓ¤ocÑÂ?ýÓ?áË_þ2NŸ>ôí\î¸ãìÞ½÷ß?R©TÒ·³¨MMM¡¶¶…B!é[!"""""BS hÏ+Ó@¥Vºï´A­ôùèvåœSeƩТMt ¶¡t Æ ·û"Ø&&39^Dow—&­ $ûrûúÂ1@*­ãºßjÄŽ÷¶¢uev~¿¡gOŽãÕŸ÷â­}C0Mçé¯Êžg“ ü]h^‘Ek{Òö†¯Ÿ;>>Y&pïúQá—ˆàJd¿ù ÄÄ…aÊýݸiU‹9—FŒyúFÑ"U M¬·0+á†Ê¥ §š‹TÑ” /%‚2áàKÄùrƒ0ZĘÐ<ð·#º]¨ïãB0BÀ¿€âày Ø¡e|á ½ø_Sén¸c=ÞùÁ­X±¶i¾å1M‰Ã{ÏàÅŸ©Ãá_`{¯2r¤9 Q9‰tóFˆT•5a(ãÆ„C1Áê1QÁe|TØe¶˜¨ /¦>2cz×›‘¤‡––iJ~_¥^{í5VÒ!""""¢DÕëVfU¨š&ã_Jaâ*ÀxA˜ˆsšòv&Z)¤)Y &*(ƒ¨ó…eœ¯ðÆ ÷M¡çì8F ¡ûV qÞCuiÜô®Üp{3²Õ û ‰Ñ¡öýoö¿ØÜ˜õ4U7à¡„Z¼}4^ø£®¹­íU¨mL{ûmœñð÷拨âb *+ãkC¸-.ìR²W ¦t`&x~FŸ»acÎæ­ ] 2b]¦@™ ë 7Èâ…a¼àŠRÑ¡_/DSv&.<Û†˜~Î::ÜׂP<c4–@¸Æ[C{ó8Ç@mC5n{ÿµ¸å=Q][9·oã]ìÄK/Æþ_ŸD±`¨‹å’ÁiæÔR+¡W¯‡\¡7\âÎlAtØ¥T˜Å€™i Æô¿ªã¼7íþîñl1Ž)˜ò¤<)ÏÁþ°‰ˆˆ® ÃÐÂc†ˆˆ’pæÌ¬^½:éÛX4¤”xþùçÑÙÙ‰^x!éÛ![ee%xàìÚµ Û·oOúv•§žz ?üpÒ·ADDDDDW™ZÝ ¿´§}æãÝ ŠLÑ„°÷ï”8_N&lÑÔp ʈè~ÞƒhÃ}ƒ5#ì¦!Ñ>‡Þ³ÈOÞxM/Âã!€öõ5¸å·[°áú:hš˜ó÷r.ŠE‰Ã¯ bïÿô¡çü„úYkS œ‡µ‚-¨¬N¡µ½ Ë+Ý€2G äU1¦¬ ìû@Ĺa•P ÆôŸ‹­㼟¦ÿlÿT7dxc&Œ!""""ZbRb-4±gs! IDAT±B¬0‹…µÊDÑ¡M‹²ÄVŒ‰ Ê”ÂC0å†e[ &€ðB0Ò˜D¡ï(ädB«sÃ/ÞX¸cÔŒ«Ö·à¶lÁ–›×@Óg>ºLrcSØû?ÇðêÏ`t(gE€`¨„UHÙ ½¶ ©Æ°¼ñ¾`LUbbC2Áj.sÄ”u>zQÃ0¡ëÏÉLyR‡”æ8Q↡…Ç0 %á?ø>ò‘$}‰Á׿þu|éK_ÂñãÇ“¾*á=ïyvíÚ…û>Ç_ _þèþ_ýêW“¾ """""º Ti^˜ú9,Ç|aûIµ¡Ê0J8Ä{Óg&A˜à9¨Á˜é11çÝ 5p«ÈÄ…`¦rEôžÍ¡ÿâ$¤)£çÔ”À½gGOkØ|Snº³m«²sþ^^gOŽcß/ûpüà¤aúöÁ¸¡–`Äô”†æ••hi¯B:£¹{W‚!—`Řø Lø< •=6ña—é1n»Yº¯©|}¡J1îÞû¹ê/ZÁ˜óy`Šú#""""Z¤4±Æ®Ó =?ÓF†Y4_è$¾bŒÝ·œ L\F³ƒ3îÂÙ©BëXsÖ·jŸaµÂíæD/ŠýÝf„ÈøÂ.Ñk­§4l¾e-v¼w3V¬mšŸÏþ22M‰#ûÎàÕŸÁÙ½¼µ±?Ø¢„b¬NæDeéæ©l À‚p¨J›éÍ” »¨ï͘>3 ÄDU€±á¾ùMÓ»¾;oÆì`Ì1HÙ;ó-†ahá1 CDDIøË¿üK|ñ‹_Lú6sìØ1<ñÄøÆ7¾ÑÑѤo‡f ££=özè!444$};‰¹í¶ÛðòË/'}DDDDDt…ªÔ€Ui+Ó˜šû|¾àŠˆ)/ 3» L©*2î+¢æ÷ÚÙO Ê8ý‚á˜Bï™Fó‘Á—ðýYÔÔ¥°ýöf\[²5óð X£CìÿU¼<ˆÉœ„ñ jÅ—úÖ ´®®Fu]*ЉÂÄV‰qŽƒãc,%‚/Ó„Y‚}Õ LÉÊ1¦¾ù ô€s+SàŸ‰ˆˆˆˆ'P¡ÝM¬P1ÿpÃ(jX%PÕe¦c”0LyA˜` EDW•Q‚*ÑA˜¸~@qðŒÑQ´zÁ5<ƒˆqªë²¸áÎ ¸ñP]W9ÿŸÿ¸Ô=ˆ×~qoí}FѰ×jð‘á)óÚRMíвmÖyß8'H‚iÃ.±á–é1¾63Ô'6ðâž‹¨cjü÷£ŒŸg#òLóU,ÍJDDKÃ0´ð†!"¢$Ü{ï½xî¹ç’¾%¥Ä /¼€={öàG?úøÿ-mÕÕÕøô§?]»vaË–-Iß΂2 µµµ˜˜˜HúVˆˆˆˆˆè S­7UÍ)û«óD ¬„.J0$XÅ%t‰ªò¢ÙÁš™a¢*ÎD^"‚3žWÆÖ~þ è=›ÃÔ„ø:Õ@Lx®k²¸áöl¸®š>Ÿß…S,˜xkßöÿºý—¦üÁ@DpÄ9—­I¡uuÛ*!”` üášÈ LÔùè~f‰sqÓ,5‡2®TÆŒž>™z À«ã@‘¿ú"""""JŒË k÷_®Éí€KTÕ%Ì2ÓŠ1Óeb‚0¾ MdÀEmƒ}ð÷QªÁÀœD±ÿ̉„V˜c¼¹ÚÚ›pÓ»7aÓ«¡ëÚåùüXntoüúÞ|ñ8ÆG&LSñÅi‡ È^huµH5¬WÂ/qcbæ‘v ;„b†Æ•Ę‘}â+À8דJé¯.ãf‚læÝŠÆ¿\†y‰ˆˆ.†ahá1 CDDIXµjΞ=›ôm,ˆññq|ó›ßDgg'Þzë­¤o‡.ƒ»îº »wïÆ=÷Üã>íçJvàÀ\ýõIß]ª4àƒõó;g0°¢Zæ%£„K¦ „çPC-¥4ñëkò“&zºs¸ƒiÀWýÅý:#*Âèi ×Õcû;š±¬=;¿~ÂΞÇþ_÷ãô[#þàK0✳÷µ¤ÒM+³h]U…TF+?肨pÌübL3ø jkk“¾­ËfïÞ½Iß]¡r&—@fžöêDìw P>)Ñõª‰øk”„ ]·D ÆÝ«cäÑÓÃpÿ”ÎÑt/ü¢…B0Öûªš¶íh¶¨ª±þts9‚IZÙQ…•UÌãÍ—ðÖÞALMšÖ^aí[&`ÚÇRX!£(qéíq\z;‡†Ö ´®®BU]Úë Ø?;RØá»Í´ûYœcëUóõï ÝÙ÷š&ìïzýÀ{¡ôW®¯¶»ãì¯C«Î|6„!""""J^RBˆ¦ù6 ñ…C•SÜÐ ï£ÿó[‚A˜ˆ±±A-~LT[qøÌ‘!­b™o|ü@eM%¶üÖ:\wÛzT×[—(Íùý¼™k¶·ãšíí¸Ô=€7_<Ž“ÎÁ,n¶ö‚[ «h²rJ"öDj©¦5Ð*೎–ÖÓ<¤„°s*°JÂ[ÕB`j¾5Í£î€Ðy!¬Õ·ÓÏ_ïzB™È]ÞÛkiw~û+˜÷ê0}ó:ÍV†YdX†ˆˆ’ò£ýúЇ’¾y÷óŸÿxî¹ç`šWö/»(Zmm-|ðA<þøãذaCÒ·3ïþäOþ{öìIú6ˆˆˆˆˆè õÎZ u« ”¸A-¢ÝÞd£Vzñ…W´ˆÊ1jH%¢êÌL‚0š½1ÈÝoƒÒýMCbàâz»s˜7¬°‹æ¯€õ^ ue%¶ßÖŒk®«‡®‹i?Ç+I!oâÈþ!¼ùR?†úò¾j1nå3â½ dëRh[]†¶ J5”®ðâUb‰¯cFŒ÷U†1c*Á¨ï͘ó‘íÖœÁê3óåäðFnþæ#""""¢Ùѵ÷CˆMó7¡/„¢ù+šæ?§†Uì¶PÅ-®Ê‹Q1Æ;7§ Œ}^šŽAæ JW˜qÿ³ÖäM+°íö ذ½zJŸ¿Ïw ÊNâÐË'ñÖ+§096QÑVÕ‰@E@´ºz¤êו¬*ã¯Ð2M…3<‡[ÅeV`"ªÇ(ó¹çƒ×'†ùŸòؼÍGDD´X†ˆˆˆ®ûöí»bÂ0øö·¿ÎÎN¼ùæ›Iß%lttxâ‰'pÏ=÷`×®]øà?˜ômÍ›}ûö%} DDDDDt*ÎO1U_ š¨ÕX¼ÿÜÛjásþÿìñQó–ÈLw.\(LšèéΡÿü ô‚4º~q‚> iÞœzJ`Ý–Z\[3–µgÝOèJ«3=%°õ–Fl½¥Ý'ÆðæKè>>fm^«cZŸ·izU_&F‹8}`©Œ†–UY´´WAOkö&÷ù±Ê±÷jU±ªÆÏù«ÀxÔÊ.1•`œ÷Òºõ¼tÎ[ûµ|„´æT«ÏÌçƒì†y›Šˆˆˆˆˆæ@ÊÞyÃx„Â"Â]LcÚ`Iüûiá³ Â8cÌüŠý§! õZCtšˆù5]ÃêkW`ë;®Á²µ-¬‚%æ^ f:él7¼{3®»sN8‹Ã¿9 C¾ÀŠ»*ÖH ®º*eÌa‰©¡ƒÐ²©–"ª4*¬av FYGUˆÑa*+liýœJe2w¼õK¢ø 0v á.á$¤P;¸'¬yæû!ñ²w~ç#""¢yÁ0 öîÝ›ô-ÌYww7¾ò•¯à©§žBÒ·C‹Œ”Ï?ÿ<žþylÙ²?þ8>ó™Ï ºº:é[›5)%^ýõ¤oƒˆˆˆˆˆ®`ó±‘>2°¢¾ÆbbÚc‚.Q•gæ-£¼Ž äÑs&‡á¾Išfýç«þâT¯±«ÄTU§°å¦l½µ ÕµÖŸg¤qu`â´wT£½£ÃýyxuG÷cjÊ€4­ð‹4­,N8Æ9.$.œÇ…“ãh\V‰Ö5UÈÖ¦àí– ‡]œsdd &º]Ù#à„ÎËÀyáfs!) Ôp´9bþ^;TœŸyˆˆˆˆˆhn$úæo2{}ê[lÃ;žó½W2jøÄW ²`Úª03 ÂØ×+Žž1<a¶Z›[Á&t­ÀØŠl×Ü´×îX‡êú*@Ѹº0q:®kGÇuíè9Ó#/ŸÄ™Ã aUQnUÓJÁ ¹Ù9!‘?Ó ‘Aªi-DºÁ7·?3M FÏ+ PÖ×þP à>xB8«rç":,#¥´qÆ;sÎË»‰áy˜‡ˆˆˆæ›˜÷,͉âO&}DDtõY¿~=Nœ8‘ômÌÊ‹/¾ˆ={öàÙgŸE±È¿ðSùðÐCá±ÇCGGGÒ·3cÇŽæMóø)"""""¢€ø@ÝÜæP«¢8!·jŠDQ$j_-:È5gÜùÒ™Ò¡gÏ”ÀÀ… ô¼ÃäXÑ«üâ«£´)¡˜æe•¸nG6l«‡ž F((J~ÊÄÑýC8ðêFòÖlMiU‹‘Ò=6¥ÝfJ˜¦Õ§¦>¶µU¨k­„€ÝGZãü¯ö\‘çÂí¦îgÆœ^Ó4#æ5ã#Úæú'<ÀݽMDDDDD”¨ Rúgç>/”¢ù*šVâœ8QCAMéë„Q4ÿ{_ÐE _¢‚0šHÅÁ£0Ç%„hðjâ7Öu­u¸vÇzt\·zZŸûgxÊLàøk§püõ·‘ÏM¹•bܪ1N@Æ”°ßÖyÓô~èõÐkÖøû*güï͘ó¦{ìž·¯'•vë¾Ìر¡{T¯wnޤ¼Ã|v¾DDD êo¥”šôM\n Ã,2 ÃQ’ÑÐÐ0}ÇE`jj ]]]èìì¼"ªÚP²t]Ç}÷݇]»vá=ïyOÒ·S¶§Ÿ~;wîLú6ˆˆˆˆˆè ÷á`¶7ÈjqB$n ES‚1j_-d)”Q߯1à LaÊ@_÷z»s(%4ÍÚ8ó:U`Õ`4] cS¶íhÄŠ5Uóû ¹ŠH tŸÃÁ—pöô8¤‚1•‰óÞÄX¯é mkªÐ¼* =%bB/ñ˜PˆÆŒÈLx ŒSƒ0n&¦ †eæbÈ~12Oß """""š3]ÿ]ÔÏmÍ¡D…Z4M  ÏÇ)á—`ÀF­9¯|ñÆÇaÌâ(Ч€©@dý×,q¡iX¾a6Þ²m­óó EgžÃ±×Nb¤g8‚‰Ÿç0Q%nÜ=>cSüg^3ú:j0G Ó” ˸mÊùRçæÀ”`š¿œŸoѹ*Â0©¤o€ˆˆˆ×_}Ñ.\¸€'Ÿ|_ûÚ×ÐÓÓ“ôíÐÂ0 <ûì³xöÙg±}ûvìÚµ <ð*++“¾µ’öíÛ—ô-ÑU`Øšgñ×'Tëÿ”ý51e¬q¡ce ”ù§ µ¨U^¦»MŒÐsfƒ'!¥vñ‚0áª0N¦²*…Í7ÖcëÍM¨©O°ötÐì­^_ƒÕëk0Ø7…C¯àØ›ÃÈçM÷s•€öωóZÌ›8{tçOŒ¡iE­«³¨¨NV8a4H˜n›õªAÀTû ᫼—ÒúYTÛepœ5Òçg^BJ!üc¥ÖÙ9ì×fe""""¢ÅEöba˜àbÙ^ÇúƒïÕ…µzNxsºA%X VŒ)„1ÆÏ¡8Üa4¢%>P¨<“ªLcíõk°þ¦T7TŠE.¬çÀêmíX½­½gúqⵓ¸tâÓ‘ؽ4@J 0%„f¯Áeä¸D~ô4P1†TS´tµâu~œHMxóì÷Bþß“ØkaçÇÓšKxc…u$„·Š‡ÖêÙ¾&¤p¯ï?'ýçæ²À–½³KDDD—Ã0DDDäÚ»wï¢ Ã¼üòËØ³g¾÷½ï¡P($};t{ã7ðÐCáóŸÿ<~øa<úè£hooOú¶"±*-„¡Ù†a»øÂ(vŸiÃ,ˆ[â¿À¾ u?Ž/ð¼¤ÄÐ¥)ôœÉa|ØûÝƒæ ¿¨•`¼ö¦Ö lÛÑ„ ÛêJk¬J!4ê›2¸ýƒËqóo·âèþ!zu#Ãkƒ‹)aGG`BÀÚgcZ ‰¾³9ôÍ¡¶)ƒÖÕU¨mÎØ?,Þ÷HÙjã¾ ;èbýPI7¼Hõ| (#¼ ÝV@@Ø}ݹí9VÆîëí²®3‡Í:CƬ‡Ñe e/„¸fö¸¸k鸱w÷"4Îÿ%Εž0Q<s¬È&­Å^˜GaUijšk°î¦õhßÚŽTÆú%DÑàºúrj\Õ„[W5!7œÃéý§qæ3(LæÝ +¦dÑ 4§Ê - LU¢p~HDª¾Zu»€Q‚*ð‡Z ¼XÏ0„êà`XÆYW;ç`¯Éƒç Œ“s-  †aˆˆˆ+1—_¢ÓüB<àɤˆ®N<ð¾õ­o%}®B¡€gžy{öìÁK/½”ôíÐU*•JáþûïÇîÝ»qÇw$};>­­­èëëKú6ˆˆˆˆˆè ·&Ü\=³1NÀDvˆD 8ÕTÜPŠæ„Sümîx§]þyKÍ9ƒóFA¢ÿÜúÎæP˜ò?mVÓ4=„ÞñÚµØvk#VvÌð¢9“xûØ(½:ˆóoÃ4iJ˜¦„4a¿J˜f8˜”ÉêhiÏ¢qEšnÍ%¥„i¿ZïÓ96¥ÿ½”¥Ï™Þù$¾ño$rm¢™¸té¾øÅ/â–[nÁ½÷Þ›È=ìÝ»7‘ëÑÕG1€Æ2ÿ¢`=ÖÛ_£S|¯ôÓæõòÞþyá›/â:0 ƒ&0p~…)³äýƒ0«¯©Áõ;ѾÞÛ¬UI†’WQ©aûmM¸nG#NÅWp±{& €ˆ ÄŒä1:G¦JGÓÊ,ê—UX?w€=VدÒþù´ÞKHë§WH¨™1)­ÑÑc%a7 û:R áÌ( û>f¶_gÈ(¿/-)û ÄÌÃ0ö€p×˾v'Äuì,¨•źÚ/ê½NiäP8 ™Ë² вnˆ& qÃ3ÖqÃêV¬Ü¾ÍkÛÜNÑ(½6§Å!]“ź;¶`Í­qéÈYœã&†ÆSƒÐLHkÁ a H V»0!¡Cæ›P¼T€ÔÞ„^[TÝzëgÉý9¶VÕìu³ý^H· €»Ž¶ÎÙÿ8‹oa¯ž¬ÑÒ>'íÅ´³ð–öõfóàxÙ7ó1DDD´`†!"""Ÿ½{÷&†Y³fM"×%š­$f†!""""¢…4\fÆÛ/#” þ½4ba—ÈÐL äâÎQê?©\Cç&1Ô3UV€Å Ád*4\»½ÛnmB}S`2\°„tlªCǦ:ô]œÀWqüÐ07Q*ùœ‹ÇÇÐsj Ë+Ѱ¢© p/ö†ámÙ³çF µX{”°Œ´Ã.¾=;V€Æ ¾8AëœÕG:×’ÂŽÏ”g¨XvW"""""Z@RöBˆŽòDU¼E¶ˆ9e„Ú®ösÂ5¾`Œw,§zP¼9Uˆz«Œ[íÅî§V§±C1Z:…–kÛ±üºT5Õ †f°®¡EDÓкe Z7¯Æ`w/.¾q Ãݽ€0ÝóÂ4­PŠ& L@j`šfŒAÆà1hÕèõzÖýñ”¾§@À=vÃ2¾sJ°Eç=iÂZ_»sXknwá>‹§MH0 CDD´˜1 CDDD>ûöíKìÚ ÃÐR“äÏl’ÿ[%""""¢«O9U&|•Z î£q6 8›s _¼sjøñ¥1±R`l0Ás“È Êþ5M ¾9ënmƦíõÈTèP28A‹_S[%~ûžØñîVÞ7ˆƒ¯ "7Zœöûjç&0pn5M4¬¨@e]ÚM²ç_éU…üÁ§Œð”YÆ Ò8çÔ‡Û–c˜á-""""¢EiÆëÕP‹½ŽjV€ñ\àÃY‹G„kœs0FO¡8’ƒ(Ö¢Ñ 88á¡Ùý4;ãd*êªÐ¶mZ6¯Aª" (¹®¾’Ô®lEíÊVL ¡çÀ)ôé†Y(ÚA(@šÞòs%Í*˜£&ÌáKÙèõË¡U´*•]”ðŠ›m)lQÊBk½,”vkЫÃHHÙ?Ÿ]. ÑO’Õ&†¡¥¤¦¦‰\»§§çÎKäÚDDDDDtu*wc½/´¬Þ8Î9Oð „^ ôQC4Á@Œ4$†{¦0ta…)sF__ûú\¿£ k6Ôz„™MA‹\e6…›îhÅ ·µàÄá¼ùÊzÎåÊ;6ÇØ@™*õË+QÛ’vƒ.^•;ccœ}7RÂmó‚/JÀ}òmðœ·_gæÕaÊ °Ñ“ra˜’Uaü—påDö ŸóŽ¥9cèŒ1U¢Þ ¹hÊð‹Ó^³¢­ÛÖ¡¾c¹ûà‹b‘ ë+Yº¦ «Þ± ËoÞ„þ#Ýè=x ù‘q;$e&¼§>ø‚2)ȉÆ'€ô›HÕUA«é€óK+D„ž á;çT‡Q¯¨㬵çPFÊA,½JDD´˜1 CDDD>D>ŸG&“Yðk3 CKI’?¯I†Öˆˆˆˆˆèê4b¸åŒ¬ ãn¨ VoQΩ¡—ðií°Lh¼°qÆ&MŒ\˜ÄHorU\R) ×5àúMhl­`=tF¥¥G×l­Ã5[ëpél^À©·F˪”Ïè=9Žþ3u­¨m«€–Qª9S¸/¯: "ª¼ÂÞÐ#!}°•Òî/Âã¦û7>x™ˆˆˆˆh±0 ;}×’Ua <5Âyõ2j·Ç…4æT?Œ‘ 5€¬4M©=!S IDATB@Këh¸fš·­G¶©`(3ÄOWMGÓ–4n^‹Ñ3—ÐwèÆÎõZ?zš°6¢ /£°«Ç Pb¯ ÙZM©ºuZE ØâU˜Q«¼X¯p¾½ê0…hf_¦wþ>'"""º,†!"""Ÿ|>àæ›o^ðk¯\¹º®Ã0øèJZü†!""""¢«‰!Q¨ÓãûX“õB/nhÅ©qNØçb+ÆøÂ2þ@ÌÄp#§01\˜Ñ×R]—ƶ›±ùÆTTZ_ÐLB4tåh[™Åûî[…ñ÷qhï Þz}“Óÿ^Ê,J ]˜ÄÐÅIT5¤Q»¬Õº?øbïÀq«¼H% ¦TyJF­2#„Rmf†Õa†øÐZ""""¢EMÊ>±ºt'µj B‹éøª0¾"æBÂ?cd r²Ðê 4 Ð4¯ˆQSÕY4Úá½ÒzÈfÁ`²ímXÝÞ†©Á :ácÝ@¡ &„Ð aBƒ¦[ÙE•0‡$òCç Uå ×/‡H7yOPª¿ˆpu'ô¢ônˆ&²:LY•afPɉˆˆˆÁ0 …ìÛ·/‘0Œ®ëXµjΜ9³à×&š©$Ã0ûöíKìÚDDDDDtõ*†ñW…QB0j¨Åêè;§<¸ÖW)&¬½OÁFû§0zi …©™m´YÞ^…­·4¢cS»‡Âä^­Ná–wµâÆÛ[pâð0¾6ˆžÉéJ 7X@n°€L•Žš¶ ² ksŽóàYáp‹€Ò_QF(ç Ý}9þMyÕa†øœ""""¢EM¢Ó…aìì±pÃÁª/ÎëôUaÈ<ŠC§aŒÂ¨´Z%P£m4»Ý Çhȶ5¡aëzÔt¬´*~(²,%EÐkkÑzÛõhºñZ }ÇO£0:+c‡YìßÿH'¬@š)˜£µ0GFŠóÐëk g×xÕ\”PL¨ú  T‡‰8ï«ce¦ ÄH0 CDD´Ø1 CDDD!{÷îÅg?ûÙD®½f͆ahѸþúëñ…/|ûØÇBçX†ˆˆˆˆˆ®6ÃE™p{(Ì¢„`PFU/ £œþsÒ†ÎM`¼¿Ó(£® ¬ß\‡-77¢¹­€U†[u(ŠÀ†­õذµÏæphï Î-ça±Èç œž€–šDus5Ë+¬ŒRn/$#e°:L0@£î×)¯:Ì0Ã0DDDDD‹š”½ÎÿãM}zÄ4—™V…1&.Áè¯D¨ò‹¯ÊŒ7·Hé¨^· õ[Ö£¢¥`˜`…U*‡žBÝ–kP»y=ro_Àðᓘ¼ØgýœjÂú9ªHdšêÓT 'kQœ(@_o­§Ý_9ëh»Ê‹µ¦F :ŒóЖ@u)ÂA™¤ì½<Ÿ ͆aˆˆˆ($ÉöI ˆÍÍÍø«¿ú+<üðÃ8tèPdŸ¤~V‡††pòäÉD®MDDDDDW·¸js® ãl°‰:gÏo&F{òeßkUM ×noĵÛP™µÊÙHV¡X¶² ËVVal¤€·öâèaä'§O™˜E‰ÑKS¨Yž±ÿ·áU€±öå8¡ûUy¨mtu;3ƒê0CŹýDDDDDtÉé«Mx•`J^Ôê/ÓV…€H×bT ½ˆˆPŒž­Díæu¨ÙÔ=k=\¢Xäšf¯¢}9ÚÚ—#?0ŒÑÃ'1~ª²aZ|°ÃXÖrÙ®Þ’*Ø `Q^u'(WFisƒ21‹k‰a…ùlˆˆˆhö†!""¢7Þx†a@×õ¿öêÕÓ”ƒ&ºŒR©}ôQ|á _@cc#ÄV*Jêguß¾}‰\—ˆˆˆˆˆhذ+T(mî~÷‰›Âm‡Ó7®*ŒÝ Ô¹”s^@HW”zd®§ey%¶Ü؈µk¡iÖ“O«¥9¨ªIáæw¶bûmÍ8yx‡_Äð@é`––Ð4kótþw!½ê0îXçb«ÃH¥:Œtöÿ)aElÂ?Û&ç<Ñ¢fm²Ï#²ü*€Ð"ÚiCTàJ_oLTU-] !Æ|Õ_BUa4ìÚ•È^{ d:…â *´MG«¯CõÖ (ŒŒaêRŸý»!;~‰´¡ «Â- ÃQH.—Ñ#G°uëÖ¿6+ÃPR>øÁâþá°eË_{\&©ŸU†aˆˆˆˆˆ()E Œ@òì 7ãÛs£lÐq÷çDT~QúGƒrN´”€Y,½G¨©K`†æ—¦ TצËê›Êh^;ã­}®duõ¶öqaa”¹‚â*8Ñâ"e„X>¡¬‘£+¼ rÁtc¼v¡Wz¡j0j(füØÛ˜8{ Õ×]‹ÊŽUÞ|Ds EŒ:†‰ã§Ãô~¡ä,t…½þuÃ0°,2\ÆWý%.ôbAܘø¶,£‚%a"""Š´wï^†a誰qãFüýßÿ=>üáGž Ã!ÐÞÞ~¹o-ÒÞ½{¹.`m´wÂ0QÁ§Ý ÇÌ¡* ü×Ie4ä‹¥wú÷^œÄ¾{ë7×áÆw´ [Å?ƒÐÜðÚ‹=8wz¼¬þzFóí±q«&ͨ:Œ€€tƒ0ˆœ+¼_g¸8_7]>}ˆÃøÂ+‘^Ô¾ê˜`?ÿ±6H ‹•JU@­ãügæ {ý &NŸEvÛ&¤š.÷ÇBW*)1Õ}“o€œœ²Úìà•4aZÕP½Ÿq‘J¹}CÕa„´+Ê(A™éB/6!däƒ&¬+±2 ÑRÀ¿Q¤½{÷â÷~ï÷üº ÃÐB©««Ã_üÅ_`×®]ÈdbJ#: ³|ùò’c.'†aˆˆˆˆˆ(IÃà= jñbDÄigWÆyMUhÈçÊ+{qò­œ91†m77aóöh:Ÿ`K3WÈ›8¸wGÞšQ¥¡T…û¶@LE/øb¿z{y V‡qÚ½ê0ê>+D£be""""¢¥AÊ^/Ô∪æWáE ®8çcC2Ê m†ž‰Å8ÇÆèÆ_z魨ظZeÅeúTèJTÆÔ‘0FF!MiÿÉÁ(Áw,œ`‹€H§Ýß;ÅW‡Q‚2NÐŽ8•gX†ˆˆèŠÁ0 EJjÃ=Ã0t¹iš†|ý×¶¶¶iûG…a’ú9Íår8räH"×&"""""€!¥ê„»·Æ~ÚsãTy˜¶TUßž¤2ÚŒîµX0±ÿ¥>œ8<Œ›ÞÑ‚UÕ3OW/)SGFðÆ+ý˜œ˜yº$ÑàVvb«Ãxí”PŒt÷íØ!@i·žz+ý Ã-Ñí…»Xö8XP‡B2B „Ç(•6œÀKÊ÷” çb±ÿ9ózúQFfõJ¤ÛWBè3[§ÓÕÅœœBþÔzúà–GuŸúàý :Á÷Øî' ÒYeA¬„^ü‹ç@èÅ vÅ„^DL›/3`rÁ?3"""š9†aˆˆˆ(Ò믿éþq~á444 ¶¶£££ z]º:ÜyçØ³gn¾ùæ²Ç,¦0ÌþýûÿöÞä±­ËE‰b7Aâ$q ôY]Õ]U™oÿxïe¾ÌÊên\Õhðû‰heæË—Ge%#ô ¿Ïû"Š¢u¹6!„B!„&ðëh$]S“’Z¼¾±à"^½ÃÊ©0ðÏ/@±œ_d£”¬˜ÚQoâÛÿpÛvöâÎ7nÆàðú$}’Á…sK8ôÝó˜žZ^5 ¦Ó»”¬ï²Æt¿Ç%Àøý%þ.¯¿™ XÖÀ6 „B!dC õ €Rå{aÜ8YRc排LFbi“dНOrÌÞGîÇÉï=‹åùZ:yÆÿÓ'N¡9u¥];PØ÷¹ÏáCúÐE†!N:ÕÖ¾^2Ìz%6B!„Bˆ£¡Zô‰Ô‚¸Fa%©%iO$˜<&?aËAî=½óC»ð¡¼øÃùÜý"€(`êL_ÿ›“¸ñ–AìݰIï IJTkáÙC³8ñJQ¨“:¯F)Ám÷Ž`óhßøëöß Še•$»xé0i±Åô5í¦Ÿ+èqíÆ£1²K[b tÛäµs­¶[!„B!„\³hh}"cf3%¸de—Ì Úk»hI€*–¶¥Âýc›pçGÁ©‰pæÉçY‘!-ר¿V —¡u~¥Û z{®Îc"Špf“§¡Íx¼ 7†õSŠ (÷aÇwbdïvœýÞ³)AKÛÁnP2“@h¬œôâÌ~ŠŒ“^ì <–^VJš±hŸÜD!„kÊ0„BéÈÄÄe²¡éííÅÇ?þq|üãGOÏÅÿ{úôi´Zí•$”a!„B!¯eæB ¿à×Ôx \{g©e-M6aF+ùòŠðö÷ã¶{ñØßŸÁù3KéýÊìˆ2':öÒάáæ[‡±óÆþøþÈk“0ÔxåÅy¼üÂ<šÍ(–§D‹©¯ÉØ0;oêÛtF¶–ñƒ'¦sÏY,©ä¶é0Z´ùo a’´#Âä¤Ã¸zØûñEØB7ˆ2³áUzH„B!„«‚ÆyÆâmñ־ؒ¤·ÄÛ—k•dD Å@¢T*Œˆ Y­¡wlÛïÝ‘ý»qê»?ÄìK'½™,<)Æìu­Žå—^A0<„ÂèH!" r}--¡uf Ñb:м÷E{Ò¥¶Ü½£wÜ„b±€@jͦµ$ÇHФ ò~4Z!éÅ—^P›72"L§}4˜ C!„l(ÃB!¤#øÀ>Ðõë®—h@®/~ê§~ ð€ñññK>DZcÇrÛ)ÃB!„B^Ë̆ÀN _x‘5 /kh\?[¸S(çË0Õù&D€í»zñÞŸÛƒçÍàûßœB}±×^(e—"PJÐji¼ðÜ:QÅ͆1²¹|eÙL©ã¥ççP_l%bŠru7:^×)áàÃc¸q߀iAu®ÙvN PVˆ4­ã'°˜IlMaN[Ú‹¶)2qmŽí×I”Éœ2 !„B! =•\<9%n3+ñ€º=ýe%I¦½MD Šƒ€Ì!¸Û~j h%(õU°ó¡»1|ë8óijX>?—‘bÚŽªhÔj(Œ #ðî\Ïè0DxaáB5–`|Å.`&)سc÷Ü‚R_AÁüF£Ac¡†ä}´¿#M;@Nä—ÎI/HÄi=÷¾Æ 5ÞÄ’s¹ÏÅdB!dÃ@†B!™œœ\—ëR†!—ý÷Þ‹G}<ðÀeŸëZ’a“!„B!×s!: /f-Nv¯‹•Z’z·.qMR‡Ó.ÐKAªPÁQoÆIJi¸k7íÄä·§ðì¡ÙøJyI3Vf¨×B<óÔ46–±{Ï *=œÁöµÀbµ‰W^\ÀÜÌ2¢&=HJÙ„/¦TQ¸óàf¼î ›Þ;$æÝËR(óJ´öëuV[àÕêĉ1ke\Q˜k·%„B!„\ÃhØ‚{_zqË„7ˆo0/Éä´ÒDÍP±°`d˜z,'ÐJзe»ô f_9 ?x ÑrÃ<)FHhÍÎ#ªÕ †† *œxâºEkDÕE„óUè0L‹/J ‘]·ïHyó¶Üµ½[†P²"Œ(,/Ôá&E‰Óa‚(~ϵ—ãÍ ‘ßO"aL_ i?Îý7ä'ÃÔ,®×“%„BÈEB†B!Y¯ Ê0äRÃïþîïâç~îç TþlÁ˵$Ã>|Íf{‘ !„B!„t›Ù–W“Jx‘T­+XHú&mñ1q{"ÐøçŽeÛV()4—£ÔýTçš6ÑCÇ“}–Ê o|ëöß9Œ'¿5…ÓÇkV‚13‘Æ VŒ™›ià™§¦1vC/¶ÝЋ à ¶×#­f„“'ª˜:»„(ÔV‚Ñæ=ÓV€Q€Ò”Æž[‡pÏý[ÐÓ_0éBʾ7ʼ¸yÉ0…²JjpÌ6 { 'ʘÿ^\‹@‹Î$ƬM”»ÑÐÀbÔv;„B!„k­/ˆ™±´[wE¸Á3’e:~5u`»$#™s  –Ý—È,"Xž¯9A ”T¬îÞ†žm[1ûÂ1,¼|2‘<™&"Âáìt©Õß 8ñÄõ„n4-."jšD tï=M„­ ·‚¡ý7b`|A  V‚bÌöòB q‹{_‹n=#¯xe›ô$L›ô’ôObb¼}™6MuóqB!ä2¡ C!„ŽLMMáĉعsgW¯K†\ ¥R ¿ök¿†ßú­ßÂààà=wž ÓÓÓƒ-[¶\Ñ묅õ’Ó!„B!$ËR,iA/Ð&·$59ILJxIv›¥Ý™j÷šxòZS´S,dWwcŠD™"†Á‘Þúî8ulOï‚I‘±ŒK‹q‰1©³5ÌÍ.cÛ ½á ¶× ZÓç—pöt ­V%”­£±©0æ½0É-[·Up×›¶`ÓÖŠ‘`’º®¤¦G rd˜b9H’‘\:L,¹x2 \]Ž©ÖKxIf±õExÉ0í¢Ì\ËõB!„B6´ž†¨Q¤¤ =Ó„]¶¥¿´ 1È ÞvVœ š@èÆÑ¦½1_C´h»èÀ¬GÅÃv£²sóÏÃòùoÀdOºÕB8¿U.AÊ%ï¾É†$Š--C7š™T•äû7cUzoÜŽ=7 X,@©LŒM„ ” j45C{>'©¤P€›m"–^tžôï~<&bø."¸siw©T0LœØD!„ eB!„¬ÈÄÄD×e˜ñññ®^l\Þóž÷à _øn¾ùæ«rþ<f½ÞOÊ0„B!„k‰Ù–FoAµÉ-pé0^[®ð' ø“†&RM61Ƶ* ˜OßËÂ\3>^lÑ„Øb'ÅlïÃèö}~Gž™CØŠÒ’Cœ#çO-bvfcc½¨TøO)™ÅÅ&Ϋay9ŒSWœ£aE½=Üz÷vÞÔ¿þìÉ¿g@jÔk­¶ëË&­ÖÖëFtª6Gääkv¬(¯^G¬D£me!&e Y¦ÂB!„²!ѸÁh»À‚Ì2#»¤Ó_pÅ?OJ¬I‹ RÐБ'²@°´PódØTÒ&½#°RL©·‚á;÷aiz‹G#¬/#/!Æ­ëV :Š …$PWÿ¡’+Žn…Эi@ Ù1«÷jû}7 Ï”z* ‰øÒ&ÄfY¯ÖS2•_¤X\2Œ/¶dÛRóB$ûbi&žœH%ĸÁuê|€ÖL†!„B6üB!„¬Èää$~üǼ«×ܹs'”Rˆ"þ+>Éç¶ÛnÿøE¼ã︪×É“aÖ+¹hrrr]®K!„B!y̶€vÝ—[Òõ:«/pµ’­é‰‹zü‰eA©Ò^4Sošb ¥ã4ŽD^°JC{oÂŽûñâáYœ<¶h¤'ÅÄKSŒÑl†8uºŠþþF†ËX°³¡h¶"LÏ,¡¶ØDi+;ÙÚ­“u%(*Á®½Øs`…¢ÊÈ/þ_"ÄTç¹A,…²ÊH,NxñÓ^IŒñD™¸(Ǿÿ¾#V€ÑÞ10÷3×âïh„B!„lL¦ r+ò–d3ÕÖ–“/½ˆ·O¼}")( )ñ1"‚åÚ2Dk^ŒVF"ÐJiˆ ( @Ýyõ³Óhœ: DQ2öW)D‘FÅÙhJ‚13 %RA4T_/*;·£4Ô‡BAA)$òK`+å-­ Ó¬ÖaÞA 5 )öùèT Œq<é%þ½)›ÏJ‘/´¥É`2 !„²¡  C!„Y4Šb±ˆmÛ¶áÔ©S]¿6¹¶Á§?ýiüò/ÿ2 …«ÿe¯& C:t¨ë×%„B!„NÌ´+·ø©ºŒðb–’®ã±±÷M¤„b9h»—(Ô¨W›èí/šDOŠñRblC¹à¶×oÂÎ=ýxñ‡s˜›mØ~® #‘bDõ¥S-ô÷—Ð×SJVrÍ¡µFu±‰êbQh l (Ô¹ØdQÀض n¾u•Þ‚—$¹K÷žB€ÅùfîõKóŽšzœ4—ÕDWKdE™ä\I]Ž“fÜ1€ýo’B!„²á0)%5®N¯1uLZ˜ñÚâ'¼}îÜÅ"tÝ;§moTë( öÆi0*ð’a´@+@‰ £Aet‚¡A4ÏM¡53—œÏOŠQéu­ºRйF‘@A‚Ú‰0Q”‘_7 ·nFaó Š_R)C’l~»,/,Ún"¯ˆTi #½˜1§D—ö6_~A2¡…[Ï9È´žo „B¹f¡ C!„Y0Âeâ‚¿ôK¿„Ï|æ3ؼysW®Y­V133ÓÖ¾2ÌsÏ=‡z½ÞõëB!„BH'f[º]nqÒJ¦- c[3…:ñê)Ò…>ñ1Š•v0é0}Åt"Œòj~´“b9f`¨„»nÁÔÙ%¼úÒ<š(–bb B!>g­ÞB£¡¯RD©d}Yn¶°¸ÔBزߥұô"ÚÚh› Ó?TÄM{1´©¥²òK"½Ä)E1¦:—/ÃËAòþÇ59NÎJÒ\Ö$Ê´µåijØ¥‡L!„B¹¢h}ÁüŸ¨dð/$ÓæÆÉyÆî“ŽÇdÚ bÅ’Á|c¡Žžá>h¥­ô"ˆ¬c·ôÚ‚RlE0<„ÖÔDKKI*LÛŸ‚)fÑrƒR̵‚RP=e3SH¤!Qd&j°ï‰Žß; ­‚¡A¶Œ@ŠÅD~‘´ ¨¬cÚ\ûòB=ù1)–W4¤4D~z Ò"K[¢‹ÛŸaܘ<“&cÏã§Éè©0„BÈFƒ2 !„BVäĉ˜ššÂÖ­[»zÝ]»váñÇïê5ɵÉÃ?Œ/}éK¸ãŽ;ºzÝãÇ綯‡ ³^R!„B!„tb1P±ÿÊ©©“WÒÕúr‹«sDž‘Ì1È1”Ê*÷~æšØ¶ÓéXZ0ë(\±ƒ¶ŒV0¼©„³'ë8szÑÔI(ÄÉ0¢JL Qo4ÑŠB”‚cb® "­±Ôj¡F´•_¬d¥íºcJ%…Æû°u[‘`”“ž< Ë}ÿqR âwÊ-:É0•Jn[cêjì{¿fÇÊ.¾(ãª{ü…t>f¶•ÔýB!„B6Mh=‘MH ˆ³É/“aòÚ<1&ÞíyR? ¤Ò> X®Ö¬°  tdÅ3Æ1I0nV”iA¤T¹„â cˆª5„³óÐQ˜’b|ñFD€JA¥Œ¨VG´´tµ2Y }½r9N‚ÑnRX Æ}wZ zzŒ AÊ%ˆ L’Ëå—¬,cd˜ä7-Èâ÷y )0î7žd" ;ºY!M¦]¢1IM„BÙHP†!„BȪLNNâïxGW¯¹Â¹¶Ø³g>ÿùÏã½ï}ïº\ÿرc¹íëñnNNNvýš„B!„²³-m…¤ÅÔÎørKº ®‰TàÖ‘wL¦ÎG (õtH†™ky:NËÈ&ÁˆÀN´kÒ5â6‚@aûÎ^lÚZÁ™“‹˜›m@¬£Ä‰NŽ"h4ÐBA+(­h"¬„*B¨#@4”À|avRem‹`D À–­½ÛÞ‹BÑKÿqï¯BJŒ‰å—ŒãÞ›…¹FÛíAˆ¸6yµ›áXIG‹ÎÔñˆw R‰Fz…c ³-¾€„B!„ld´ž‚Ȧ5¤¼ ½´}ãeê8¿%ç<)2•t´×\š¯!PhDÚ Kƒ(T[ ZÃ,•FËX2P½=JQµŠ¨¶Ë0¹RŒR† úzÎÍC/··ÈÕCõ÷"è Б™d"ù®_ÈR50©T D+›$viª ž\$i…¼~K uO‚±×VÍX`I'ºÀޱӉ.Ù˜$i¦ƒãÇÌÄû­™ C!„l4(ÃB!dU&&&(îÑßßO~ò“øõ_ÿu”Ëåu»kI†a2 !„B!äZdºl÷ëq¼zWÔ IDAT³)©6WÈ#éNþbÅcDU¨@…éâÿ…ÙfR§¡ììŸ^L"ÅØ´å®–Ì 1©!ã»û±yK çÎÖÑh„V‚qçv‚„)Üц–*hÖêt¤¤¡ D:I€Q€è$F  •` ¯ˆ­c=¨Tó~Ä"”'½¤–É_ª¯'Æä%Ã+Aüþú"Œ©2ïc\Ÿ›P¤mRŒ WžÉÖòøÇ¸.3­«ýÀ !„B!W­Ï8`6ü”dš–dÜäkM‹ñ…)TiA¤œH"XZ¨[éÅ&ÂFv1©0Éz¤5e’aAƤÉDZ™1ŒÖP}}På2ÂZh…mRŒm)•PÛŠ¨VGë t‹ƒ«‰ê© °yR, &²â  ‘•P`~7Q€Tz z*€Rvlm–qòKО“ú›“I†©Ï×ì9{KC7.ö„—ä’tse¤ωܒê—ZÏe˜ C!„l<(ÃB!dUÖ£Ÿ2ÌkÁÏþìÏⳟý,¶oß¾Þ·ÓQ†ïê}h­ñÔSOuõš„B!„²fš¦°ÀÔÒ´§¿¤êmüô¸º?EFÚjs²Ç¸R%ÀÒbº fa¶“J„Q‰„àfMÒ@L”N§pˆ §·€ñÝýX˜obvvÉÔJxÉ0ffS$Å%@*@«„ËL鸚*‚ ˆ4EN‚1‰)‰c ÄJe…‘‘ zûŠP 9òKû_<óŠ}żsŠe+®«±iDfÂZûžIÊ‹n?&Ýæ'Ä )F²m9·B!„BÙ@èhÊw_<¡ÅÛÈl{í±ã¯KZž‰—n¿ZPNÆà"¨ÏÕbF)$ËÀkS‚@+h!ðe­íR-Ð6%AÕÛ4[ˆZ­øwÄ 1éu5Ðò@?ZÓ³h]˜6@rÅR…Ñ-úûŒÿfûûŒ¶)-Vº* ¥"¤˜ýžIË.ÙõÀ—ard°\uÉA:yI‹*H„•ËIñ' H93hÝ‚Ö3Ýþ:!„r™P†!„BȪLNNvýš”a^[ÜÿýxôÑGñÆ7¾q½o%&O†E¥Réê}=zsss]½&!„B!„¬…™&à iÒ"ŒŸþÒ.ÉHêo׿äã&‹-U–Ó÷2?ÛHa\ÍC,4˜ˆAZz‰÷¹¢eF mM…`` ˆÞÞ¨-™ôe ?âÄe®¥ ‚JY5å¹a“Å:W’BYPHÁ&E0U+*ITq‰0A ”Ðß_‚Rí"‹¿l—_ÖÒ¹2L©$õ6È,®“«Ù•³b!&}Lr¿–'©Ôq«À\‹ï!„B!™8"wv ¯}!fµ¾â#HÐBIΠ>_³‚‹À¸,þR) L2LJš ÒM‰‹ke3•‚.P"Ða˜Ü«/¨ôzat ›‡Ñ8uá ÿ½ôr¥PÛŠâÖÍÐ0I«©÷EÜvòÞIAA‚üÁµŠ¿«”ì¢léö¬ ãú5ëFN±ß»v¿Ó‹éûÒÞÒaråqcksLÜ'O”‘¤]GçáÞ !„²A  C!„Uy饗0??ÁÁÁ®]“2Ìkƒ;và÷~ï÷ðá85[ѵ@ž ³ïåz$3B!„BÈZXhi„”ÝÎKI×å䤿¤Ú:‹5~mF±´ÝKu®™ÔkÄRŒ+z°õ éÅM )’°KØ‚S¡”+zzЍ՛hEaF–H‹1ÅA¥¯€åj„ÅéЈä’ ‚¾ÍûŒ…:–^D™d¥›!åJ½=E‚l²K"²øË¼>ù}“}KµÂVÔv¯ÅJ'·IGÛwÍï’”—$5&®¹IÕå$ 1iqÆÜÛ\ËxA„B!„ Œ^†Ö  y |GÅ,ç´ÅëY9&ç\âõ 4yÂêó5/É™„A1&P´Ë2:"-ˆ”4 •N 1&Fˆ"@G€ ¼Á¼u+Æ”J¨ìÙ Ô±ôÊI„‹µË{Ö¯QJ[7¡´s;t¡m¢Vã±®<fÀ…bg˜p‚’(#¸ßBR²‹¿-^ŠP,¿ Õ?P@u¡ž–TìŸ{¼ù .Bnñe7@ÇJ}“ýZŸëÖ×A!„+eB!„¬ŠÖ“““xË[ÞÒµknÞ¼½½½¨ÕøcÖõH¥RÁoüÆoàŸøúúúÖûvr¡ C!„B!+£L74¶Uƒ%a<±%Sœ#¶£´µù"LZ¬ñ7Ê92ÌR-DØŠ qꋲ3ƒæ&ÁPæ>cQÁ“ :‘j@ Ðß[B«bÙÎb+ ñ„¨þ,§½#zG,œk¡:Ýâ䢉(``ký› Ð0ŒVöû„•at"Æ‚år€BAÙ´‰¿Q0ß·Ê—^Ú¿ÿÎ}D€ê|Ë+¤I(U”­«I–T}ã¤Rc2µ9Rcâÿu €i&B!„r}‚!nøëÆÅY &3Ø–íðËï+…ºåÆAf_«"\n"(ÌœJ $Ãh$Éñz"Ë(X”ii1ƒ%°Æ ¢¬ØFˆ–— ŠE R†‘<Ʀ(¨Á~ Ý}sç±xô¢F{Z'i§8ؾ›w!èïCj„‘¶†XñELB®¶ß¿n4 ÃÐH/. F¹ïÄK‡Q*‘_DR2L:-¦C»=fi¡nïÅ~í=©RQ)oðÖý™#Rko žw\öZCGSW÷Ë „BÈU2 !„BÖÄÄÄDWeÀˆÏ=÷\W¯I®>ïÿûñ¹Ï}7ÞxãzßJG´Ö8qâD[;eB!„BI3ÓÔØÖ£¼R›üôI2FJzñ;ûmi±ÆŸ ¶ØÓ.Ã@€…ùF6•™E¬4à’``ä‚DбI0Ê]EÇ’BZœ3“-Œ€P”(´¢‘h¨L2L"b˜ÂŽMã% Ž1}¢ú\x¥ýuMÿæFv”  Š4¢Ðˆ-JP:®k%PPP Jyu9bä—6±ÅûŽT²/eâï/9Ov ±IDh÷›J=^2ŒÎì÷–¤6ÇÊXðÖc!&`¼‰j3`¦uÕ¿B!„BHÐÑ9@n±[ù‹/ƈøíÉy’.’sÇÇúç(–¡—2‹I‡Jd­ T'ȸD%±4)³?R‰(ieÇ?Z)3.Ò¾#ˆ–—Fª¯R.'÷+ž8a×{oEÿ¶-¨¾| ¯œ2)'¤ \ÂÐþݨlߊÈJ0f\md˜D>æ;Ðõº• T’#íÛ"+Ë/ß.9rL`e˜ùzrÓâÒi4¤4œü´Ö˜¶zQÆkwUö¿AB!„l8(ÃB!dMLNNvýšããã”a®#îºë.<úè£]—ª.…3gΠÑh´µwý^Öã¿=B!„BY+ÓM[à‰-’»/iKíH[›¤jÜF¹¢R÷§uÌ6°iKÉ /N`Ȉ-.íEÛ⊸ÀFÛ¢—ãêA¬0c‹*bqFk$@ÔÒЈ +SØÂX¨°BF¥Oaç­½XœmáÜËKhÔ£Kè×1•þ£{*¨ô+D…F`å–€h²ß‡nA¤Òb‹$ïÄJBK›¼ä÷ñĘT’•fªóÍT±™£TV‰ô"HR‰/åŦÆÀÖèxÅ:N€‰‹q<©&©Ùq+fu†É0„B!„\Ä…øþX#o=g,ÒIžikϤÍH±'œ<#ÀÒBÃÛ†ìqß.6¥%È®ñ%Œ(sŒ“f Ú%Ã(»ÔÊŒ³¬ƒ(D8;].A B‚ 5¶Sv즔 (0rëMÚ½Óϼ„ÅÓç/ãÉ__ˆRÞ·ƒûvA‹B¹”UÐc¾¯ÐŽ£Fáü’é³–¾n¹0׊ûk[•S,P ˆ¢lŽ©³ñ_Yg´¸˜Ôë÷7éEðj{ÒçÌ5#„ta!„B¹.Ðz5úÓci £Ì’^Ï‘gRso¿mW¥AˆTaâNŹ0¨ÏÕmº L"LJŒI×(­#sL,Ëh›*#Љ‚VíBŒKˆIÒb4Dk´fæÎ/ <º…‘Á̤NŽ1ë7lÁÐŽ-˜~áÎLA¸Ü¼_Ɇ¡gd;Þ†ž±MC§Á(ûH5ÑÚŒYÃÍó3hLÏ›qm R¢KV|ÉÛÎ_‹³5“£tÙ$—£Y&Š+<¤¤™$9Ä 2&Æ1“NbvŠ—ãË20Rh“S?7ƒ¥© ߸#7ŽÅ¿ ¸V'Ȉ Œãž½çœÄ‘¯>…úLõ }KëËæ½Û±ïm÷ gda¤M ìã´ò‹›ì£µÜÄ…#'Q=;c¤– 0_ºK}q³uÄ)0¶mßXd‘tL AОøý$#Ï(AuÁO…Aò»L¡„Î"Ìe¶û#vq¿çDÐáÔú|¡„B¹l(ÃB!dÍt»0||<. ×&J)üÂ/ü~çw~[·n]ïÛ¹bäÉ0Ý–³¦¦¦pâĉ®^“B!„B.… ¶ ßÕӴ׿HjFZGj–Ú¸-9I[gÈ”*‰|ãê2æšV¬Ñ)qB[aE€6±ÅÌ~jï¿C lŒKòW3K1®  ˆ2‰4Í%S/ÔÑ?RÀèž *}'q¸¢;‹mIaÿ}C¸ñö~<óíYœ-Ì·¿ îÓ:~'c§EL¡ 3mö¹˜=¹ÒKòðà%ƈç±PÃdB!„B®/tt6GΘº#úJvÝ6ÐòÇ8‚Úüx‚‹Mù°ëA`Æ;A,Èø²ŒYFÊc'Ì„6¶Ä .¢ìRù&-Ĉ‰9ñâN¢(Âô‘X8~c·ïÆÐöMñøÍ‰0Ê[ßvë8¶íßW/~ãh5Zñ0¯ú6â¶GÞ€-ûn@QAÃK€qi0 ˆB`úèiL¿tÚüFaãsâ´+·$ÛÙýíÛN8J%¿¨´ìÒÖæÿɱ®­>_Ï|J;R.ö¦[ý±ôUX×áó½ „BeB!„\‡F³ÙìZòG¹\Æèè(Ξíð£YWzè!<ú裸ûî»×ûV®8ׂ ÃTB!„BÈFa¦¡i@¹)/SkÓžò’µ^IFÚÚÜ®rOÚ€¨¥Q¯·ÐÓxi/ùb tF˜±ý’´¤…™X°±òŒöÏ‹øüÚ¦É$âMrÕ馰y¼‚í{+¶@ÇMÄšˆ1¢€Þ¡þØVLŸ^ÆSÿ0™³KùjÖ±ÝÜõð& l." ÍŒµÐ°•:V±É0aSãÔ‹5ÌžnÆÌJ -iù%¿dúÀ‰1yÒ‹K”q}ã„/yF€ê|3uM÷–z‚Xp1 à¯Æˆ‘®âIi]³·Ë3H˜8EÆî[hi4£«õÍB!„BÖÍz @oþ€¹c:Œ×å"×¥P€n¥wjh,-ÔÑ3ЧºÄË@ÌoA&Y7Ë@ t¤Éè@ÌzD¢R‰/FˆAbshK0b“d’´ ­ÍzÇ¿ûfG‡°óî½( ÷™±¤Ø`·®UpË[ïÀ÷íó_y¯>y$3P»v)VŠ8ðö»qã›oD†ÊŠBÖi‰'_PÌž¾€SO¿ŒF½ ”}~âKÞ¶¬º(ØtÄé.Jo§—N~A[2Œ“ijóuÄ–7*–Ò@"«¸Ù :¤º¬ØîŸ¤S;4¢ð\7¿RB!„\a(ÃB!dÍ4 <óÌ3]•víÚEæc÷îÝøÜç>‡|àë}+W…¥¥%LMµÇ w[†™œœìêõ!„B!äR 50×ÔØ¤—ò’W›#®xÇkÈ“dÄkñÛJ=AJfqëÕ¹&zû ñ ²)‰Å[ ¬h ³ÂŒ=g,ÅXÁ%–*ÒI0NЉeÿZ6‘&é L½²„™“ ì8Ћ±Ý/¹žta䘭ã¼ãØ—-੯Nci1¼ü/¬ ôqï;6cǾ^“™g™¤Áè¸h' g_©ãÌ‘:¢H[ f¡¥ƒô’MqÁ }:öõdÚd%¨Î5skÉJ• V.Ç—“'½¤ëv<®-{>`º±A*·!„B!Ež… n2k–Z²rLFšé$Ó@ …²7IN¼8WCßp¯—ê’¤» Vn±‚Œ'ËDFà’abiFAé(–f¢œÄ(±â‹xi1 ÚŽ!}!&±?ÎÎâÙ¯|£ûnÀø={Q¨ãt±.%¦w¨÷ýˇ°ïÁ[1ùÿ>†ó/_»u"‚=o:€×½û>”ú*C0Òfn 稸$Q¥±<³ˆW¾ gç€@F̳„ýüíKµ¦íXb r_D2ò‹d¤é(ÍÔæëñ˜\ÇNŒ†*ÙÁ¯? nß\µ}MÐáµûB!du(ÃB!䢘˜˜èº óÄOtíz¤3½½½øÄ'>ßüÍßD¥RYïÛ¹jä¥ÂL†!„B!„•¸Ðˆ°¹¢ÚëlâMiÛסk[‹´u”+^2ŒTg›ÛÑ &ñµ­Ø‚Œ°K/€—öâÉ1ñG2i©}±㤗Œ0㮥Ü-JœHÓjDxù©œ{¥Ž=÷ `xk)%_¸‰[]áÈ-oÂÞ»pèk3xæÛ³ˆÂkS„(–îü‘Üöæaˆ¢ÐˆæsÙÔûœD3§xùЖk‘™˜V]ªÐ"úúrÑ}ÛÉO†I§™šqñ.9é0ÈÔóFÐ>Qmª«ë (ÃB!„r]b óoº²'ͼ}7¦Ôm`Ç?Am®nÒ]<ñ%²2ŒK‰Ç­A"¾ZA«/ËØ4—H Ûæ&¾(3~ŠÓbœí!6aÔ *YF •ÂgŸ;飧±ûÞ›±ýöqˆ¨d²OŽQJ°õ¦1¼ó7Þ‡W¿ÿžü³ï 6S½²Ïû2»åÜ÷¡†á[ Fi?0Î'Š–šxù‰#8ûüÉøÇ'´Ø™<±%»½61¦“ø’ˆ.ÙfÏS›«yŸÚ½€usß:Jˆ/z]:¤Â´÷×L†!„B64”a!„rQLLLàçþç»v½n ¤ÁOÿôOã÷ÿ÷±cÇŽõ¾«eB!„B¹x.4ô rKš8Fü6»ô rR ^?+ˆg#8ÙfaΉ Y±E *V´da±Å +IÚ‹[œ\£Ÿ7•“I‚qçM]KÁ“r‹3-ú‡ŒÞXÁ¾{Ð3Pð’Q\R‰ù+Uü±­¸íMCøÎ_Ná•g®¡böß7„ƒïÚ‚J_€(‚vì3‡-vrbLm¡‰#OÌcæl#‘`l" TZDY›Ð²6‘eµ¾’鋜}q2Œ×/(*EŽmÍ—v‰Å¾:ΊI¯OfÕ6¸"žd?eB!„B®O¢ð,RÁ«×ÛÐko÷–ª<„s™“›d—äâÄ#¸XAFû¢Œ ²û#­ã¥`Eÿx#͘t#Ä@´9¼Ä³îË2€V6-&+ËØþÍåŽ|ëœ~æUÜòÐíØ²{«¹IN«ìøN‚½oÚ=o¸‡þê <ý7O"l¶.õk»"ôoÀýÿò!ì~Ã>D‘‘`’‰‹V"“?x/÷´Z‘‘`âÁn¾KEâ?”ì¶Jm§$–`ÑEÖ(ÄØ„™E'ÃØß]Ì8»aŸ†gdtXúòËŠ11íÇGL†!„B64”aQï³ IDAT!„rQt»@Ÿ2Ìúrß}÷áÑGÅ›Þô¦õ¾•®qüøñÜön¾‹sss8zôh×®G!„B!—ËùeíÕÍHRZÓ¡'Õ3S—“'Óˆw°(”TAâIkÍiĈ Ê -N:A"7XaE€¸V"%Ì8aùb 2i2âê2âk9©Æ~º¶û°RŽ;¿=ÇÙ—ë˜zu 7Ý՛c%‘¸ex¬ŒwÿÒ8Ž=»ˆúog0}fù¾±+Ƕ›zñ–lÃèî ¢P#Š´ùÜVüqi0Jk4šŽ|ÇŸ[4ÏX!_V±bLv •®áY]dYYz‘T_É•_²×ª:áÊ{S]RQbžÎâ‗ÜÉi];0q™Ž­ï™nDWæ $„B!„\S$)ùòJþ¨Ù¯Ðž×G ½Ð8AÙŒ‹ìùgk&Æ%Â(m¥–´ ãÚ‚À2qšLJšèˆ<)&Ò‚ÐtÈ.ðRb´—#^,еBü$Q±,S½°€‰?{ c7oÇ­ßMý©‰'l@ ”‚ž"~èÜñö;ðØú^üÎóñm] å"î}ïAÜõžû A€(2£H´¥ÁˆÓ¯žÅ¿úTg!A_âôÉl»ýâíWyÛÉRb‘Å&‰MÿQ°â âý{/¼þI?Iï–‹³uOb±¨Ð,;9-~ûÅöÉY×á   „BÈÆ…2 !„B.ŠC‡!Š"(¥ºr½ñññ®\‡¤Ù¶m>ûÙÏâ#ùˆýÑóµC§d˜n¾‹O=õT)™FåJ€ÆR˜Ú·0×LI/RI,ÚJ)íI0‰°’J„qbK,ŸD+K8±E;a±P¡­8c¤šŒ0ã_KiˆD¡Æ‘ïÏãij5Üöà0Æô&·ÚWˆ"ì¾­ãÿËÍxúë3xüËg±\ ×öe]!ú‡‹xà}ÛpàCpñ/âD"mDóÙLÿWŸ©â¹ïΡÙÐPNl¹TI%%ÊÀe¼}+-ùç]YžqßïÂlÓJ\:î_êµ2Œ[Ä$À¤êl$™ä¸ã_Ì»”Ý­ïYli,u÷ë&„B!„t Wœ/ª’»5¹e¥öŽ}¤HÙ®› ³5›êbD(h±Å¦ê@#²L¤‘H9²LrOš‰€È&¼ˆV&=Ó¥Åh/-F+›´êË1V–Q’È4pi1 ÐÀ™#§pîÅÓ¸ùà>xËm(TJ±ã$ ±ËÁ±a¼ûã?‰Ó?<ޝýÑǹ—»“rë[_‡?ò#èˆÓ`û±EC‰‘`´µ™*žþ»§pæ¥3Fr gõ$?\̶xÛ.Æû!bÅ”—œ”˜@Úû¥dï$É0É‹ à œÝ,9®“s‘h¦ÂB!Ê0„B¹(jµžþyÜzë­]¹“aºK¹\ÆÇ>ö1|ò“ŸÄÀÀÀzßκ'ÃlÚ´ }}}]»‡n'0B!„BÈåÒŒ€¹¦ÆH)©¦‰ k<%Þë„o™&1brg®P²2Œ¿a¶‘’MVâ¶¶$'*øI0H¤ +¬À—i|±E!¾F"Ó 9O,Ť“fâûPVÜ ^mቿ9£‡ÊxýnƦmåTŠÄÎïÜýð88‚Çþâ žþæèèêN®P(*ÜûÏGqß#£(–¼ê[§+i›3u|O}uó¦à%%Á\º¤²j_OŒAjéý­ ã$ï@zßBœ “P®6ëG·×ã¬P»“—ïòj×™k\hp B!„B®_4¢ð‚ ùwòµÈ-¶çê˼1¶4ÛÚfj‰È”ֱРœø¢Mú‡A,Èø²Œ_"O†‰¥{žHÛ¯K|mÆÐ©´+É´¥Å8iF2i1&IF´ Š"¼ð­gqlò(îzçÝØsï^ã‚8DY1ÆŠãwîÆÏýŸ¿ˆ§ÿvßü㯡6»¸Ö‡QlßÞþ?¾Ûo݉Ц¬jx 0V$Ò h-5qø€#ßy`D¥Ns¹˜íìñ™t»/It1KJ~é(¾d™œc%X®.#Š¿°ƒph È+gµûòÊ©vo×Jx}¢eB!d£C†B!ÍÄÄe˜ëŸüÉŸÄç?ÿyìÝ»w½oe]É“aºýR†!„B!„lDÎ/G)å'É®V·ãù29ÇH¼ðÅ™ro€Å¹¤KœÚ¡Ð–Ä¢%I-Òb‹“b”DÈO‚-D±ZM®Ø? H%ÒÄ×râMJÎAê>œ8sþÄþû8‰=wàõoÛŒÞÁ‚:|SÇ®Wú‹xøgvá®ÅWÿóq{va•'~iÜò†¼åƒ;1¸¥—“.2qŸS°8ÓÄ“w'^Xô$˜•„–¼¿öd–ö¾S\°BŸX0²÷åDøé2*}­ÆRˆ–Ÿ‚d)U‚d#§§ Y[Œi3ŒÏ…åö{ „B!„\?èÖY ”÷ï“n|ÜIviïš¿;sÃcazѤ·(#´ør‹V@¤DqúK"È$ â'È6ÍÅG+AhÓ`’Ä@+Ý&Ä@K:-F…¥ÅeH Ü Ú›ÍÞ¼³hVÛ–•·ÅHNŸêÒ¶”ÜíX~‘t[6Efq¾ž80öòZU*¯ú ;·;I2æw™øñ8òä,¾þ'¯böÜ•ù=etW/þðnŒ€©Ðqz†WI"´ lE˜üê4žùö td¥’«)´¤ü Î}²×‚¿\!­&c¨.´r?C©'¶œÚHš;$À¸ý^ÍŽK€ét2&ÃB!„r}£]ZE›ô’ÊÒË ú×–—›h.· Vpña¬àb“aœØx’‹DÊŒÏci&(­ T”’f"mLˆDˆqf„$‰/¢Ì$ZCDåÈ2ˆ“abYƦ¼ú¢Í…cçñ×_üKì»ïf|ßA lê·ãA/!ÆŠ½ƒ=x×ÇÞûÿÅAüÍ—þÏ?öü%>` (xð§ÄCù+%#ÁD:l#Z›uÎ=‹Çþô1\89cR\¬Ð’,¸§ºX¡eå¥ZÓöŠi/’–`‚¸Í{7” :I4f¹8»ˆÄ†IƸRìË}~+N8±æ>YÝ:sß"!„B®E(ÃB!䢙œœìÚµDãããxñÅ»vÍ× ›6mÂg>ó|ô£E«ðáøñãmmÝ”ajµžþÒH%„B!„õâüR{Z…WG“[“#ÙN¹Ò»ÕROÔMxûªó- M„r ,žÄâ‹JCAe¤—xi…mÓdò’``Ód€(“H›HŸEg„/ 0rMú>Q@³á»sÏ>>‡7ýÄvÝ:à}÷“ç°ï #Øs÷0žøÛ3øî—O¢±ti3ØöñàûÇqç[GÍý¸ªóÑÌ'w5$8òä¾÷•),U[¶€ÆÜÿ•ZR"Ë*ÒK»üÒ¹Oû1Þ½)Au®™ûœÊ6&[VWâdD™Ôf‰&Eü¼ ç)ÃB!„r]µrÒ*.UtÉ##ÐH¡í†n<`q®†‘±¡$Ʀ»èˆœ xÉ0™¶@)è ÊH3Ú 0A,ÍBíI,’.":I|ÑFÚЩ{œ’¶$Ñ*–L´=/”B#ÁËOÅ~ìõ¸ç]÷ P(Ä%(•È1"‚Ñ›FñóÿÇÏã…ǞǗÿðË8÷ÊÔE=î×½õvüØÿônŒÜ° a¤ƒäv´ý-@‰`a¦ŠoýÉcxñû/*0i0fg,¸?Q®Ýþx Q&+άQŒi_¼”— §-'ù%÷X?f®žû¬Ty(y5¯ˆÓÍCëüû „BÈÆ2 !„B.šnÊ0€(Ã\9 …>úÑâÓŸþ46mÚ´Þ·sM155…z½ý¯nÊ0O?ý4ÂðÊÄlB!„BH7ñ ôe•*Î{e…­4F@XqÅ:ÕÙ†7‘$°x²‰—ÄâX´«±V‚h_œña”‘^K1.Éù”Ÿãî+‘cüDš”0#0É2iÜrþBûÇÎý}xà'·cx¬©‹yëAAáþ߉;Ã7ÿôUþÖ¹Õ¥ ‹ ¯ÿÑðæ÷ޣܫRLû94ΫãÛ~çO,¥’TbYEIR—ÿ™6¸}+-íòËêBK~ ÍJòŒÿ}å÷­Î5óü,”*þ$#ùvËj΋“®Vc)Ô¨µ(ÃB!„r=£Ãó0vŠº¼­Q QÅ„©`QsàÂL ›·[ÁÅK†Ñ&ýÃ$Á8AFÇÒLd÷GndÒÇ;iÆœ'ÒžÄ/ÕVf‰_ÁÅ%¾ˆÖvBŒ´ús’dZ¾óßÇ¿výÌ?Ã7ßÿœ_¢”YWÜöÐÜöà-øÖù6¾òïÿõ…¥Ÿëö›·á½ÿî'°ïà͈< &Nƒq¿I5[øî_<'þja&#«$Œ½±x@«)&Ó7ù ¶Uj;%µù’K,¿ä/ä—ìßÂl­íyi´ …^è(oÌ»–™$¼Þž$ÓI˜ÑyÒ!„B6”a!„rÑÌÎÎâèѣسgOW®×MázgË–-øú׿ŽÛo¿}½oåšäرc¹íÝ|'&&ºv-B!„B¹’,‡ M¡RNµMžAíâõÉë&ñÿ˜¾¥žÀß/æši‰%/‰¥SŒ­ Œ°â„™”(‘V:&Áè¬0ƒäšJ{R.ÚirÅŽ?·ˆÿúû/âö7ãà#ÛPê- –a2}Ãe<òoöãî·ïÀWÿÓK8õâüJ_#öܽ ?òá½Ø´­‚8ò%E"ÆÔf›xü˧ñÂĬ­§¹Œ„OIDOžYEhÉ H«Ë/‰ô‚úø}æ›íXE+ÃhW›³BN\„#öËtôÍ+ع°L†B!„ëŸQx*ØqåN¹Òx¼4 ÑÖ^­QŦ±hD@im¥›£J+( 2=Æ—f"•ìO¤#ÈD‘x‹‘^ÚÓb¬$§Å$B 42i1^¢ <ÑFk›0cúÍ_À_þá—qè+;ñö_|¶ïƒK†QVFQJˆ@• xÛ¿~+ÞôÞûðå/ý-¾õÿ<Þ&oô õâ={'üà›„vööDiˆžûösøúÿýMÌO/š$˜”cÅém±ãÔœíT:Œ·mEqâL¼,%–Uìw*°R ¬Ø‚ôþ ½(ä 2‚” (A5G†òÚò^ä+3.ŽZg®Èy!„²¾P†!„BÈ%111Af²eËŠ0+@†B!„B.óˆÊé™ksSb$w5ÓGVÜ_ªÞ¾Dˆ©Î6!ÐiaE[ae¥$'¬¸;ðÅ–Xp±ç0×H‹-°)1€9G^Œ^Lét6ÕFˆ²‰4‘ÆÓ_?¾7ƒƒï¹·?°5y’ç—X"Û÷âÃÿë=øácçð?9ŠêLjÚ_lÚÞ‹‡æfÜt׈mѶ¾D·aSã©<‹'ÿþ,Âfd%˜µ$´¬,©¬˜Ì’I—•fÜrµt™vùe%Á&é¯Ou¶™yÛ€bÉ)¹â§Ô£òÖ×T¯³™æür´ÊI!„B!׺u(­Q†YAtY ª<à\ÛIçg½T#=VDÑA 2FvÑVtD± cE · ¬ cfò¤™Ð&¹ÁÅȺ-ÕÅ&¾(?-Æ%ÉH,ºˆÖТ æ›“È2é$™WÇø·ÿ¯än¼í_¿#½0®ˆ'‹XÙcpóþÕÿöA<ü¯ÄŸüöŸãùï¾(¼õÃà'>öz{Ea¤c§Ç¥Á¸±è™—Îâ+ÿþpìÙ“Fj ´§¶È•ÛN%ƨ¶í¬°²ZÒK'¾d¤™ô¹œ,“ c/­û[G»¿ßmcäË—b˜ C!„\P†!„BÈ%199‰÷¿ÿý]¹eÒ-Ž?žÛÞÍwprr²k×"„B!„+Í…¥{»s-¥…²BêDN`a¶™–0”/Å8Á!-½ia%I„Ɉ-:9ožØ‚¬°â e4RMZÎI%ÒdÄĉ0NΑ8‘Æ]ci1Ä×þó1úúÞò¡ÝØyË R•P~Q”Üþà6Ürß(ÿËcxâ¯_EPTxà}7áõïØ À$•¸8;Ixirßú³¨Î4LŽº¡%# \l2˪}3‚ŒK–If:Ë8‰üҹϬ+ÌI¬'e­T‚“ÞßÞ{mÇ›ÿ=ß`2 !„B!¯¢Ö«w»2Hè:€þTóüt A`“Hùb‹¶K›b׃ÐÚ$„è I“I/,&&+ÍDÖI_$–]Ò‰/HÉ1¢•üBÙ4NíÉ2bÅÿ¼öYÑ& ñý¿šÀ3_;Œ‡?ò<ðþƒ‚ç“X·Ä‰7¾n'þç?ý·˜ø»§±mÏVܰo;"­¹4û;‚öD˜ÅÙEüÝý#&¾ò4´²é.mi-ê2¶ÕêÛâ]O©t¢‹äÈ/yâK/Ì9Ç™cæg½÷Oì÷áJH.kE3†B¹.  C!„K¢›é”aH·ÈK†) ؾ}{W®ßl6qøðá®\‹B!„B®ç—W.XÈM‰Ií_yOv¹ ¾Ø‚ @€ùÙF¾P¢² ,žÌ’VÚ„™XXh{޶$3mœ8“#¶x‰5Úž#u-'îØ£µ“1¼ûȤÚ8qçÂÉ:þìóÏbï=›ðÐwcpK’#öºfY,ðÏ>¸w=¼År€ž¢­ÐÑÊN4Ο¬áò NYð$˜ËZòþVJfiïÓ¹ï 4Aq⌗<“¹¦dªsÍÌ;©Qªt­< pÉ0„B!„¼&ÐÍn§V,#+ÃÌM/¦d$B‹¶©.ZÃ$Â(On‰¥_–É“ftŽ4#h9éE+3vÓ:#±h;i„ZSâK,Ë´KbQ&>Ö¦ÒÔ«Ëøëÿý+xâÿ{?ñëïÂmî7 1v,œ•@Þøî»Ì÷¦„ˆ˜dl©µB|ã¿<†øãob¹Þ4ŒY.=FålËÅmK’â’—î’Ÿúbd—X~‘v)&O–Q"[!–³“Mº&ÂD‹ÐÑBW®E!„« eB!„\”aÈõHž ³sçN(¥ºrýÇ£ÑèÿL!„B!€©«Q¨/™¥GÉÉ0 ³ÍD:ñ’XÚ’`€L‹-TÉÈ&È+‰ôâ_×cÜyÒ‰4m‰09‰4m×Râ%Á µÏ}ó9’¶'¦ñò¡¼þŸïÀl'Šå‚pjÝ3ÞóÕþºÙXª¶ðØ_¼ŠÃÿd ±LMžÐ²IåÊ-kIqÉ^ ™åŠâŽcQƼ,ÕùVæA!kÕ÷÷jyòkDóM&ÃB!„òZ ψ€µäÃØô‘ËA«fÛ)æ§cI" ÊÉ.þº†edr¤™(0i2)i&uNO Ñ@äd{žlª 4¼”˜¬,““øâb|qÆK’ÑÐmçœ}å<þèWÿ#nðþÅ¿{¶Ý´55†ô%h ŠÌµu*8üÍçðçøW8b”—㥴XÁVºißV9û%³ÿâ·;Ê.)ə䗴,YyöØä|ézî;(…bç÷{mkF·º-›B!äjA†B!—ĹsçpòäIìØ±ãª_k||üª_ƒ _†ùÿÙ{óhKŽúÎó‘o+©´ƒ´ÁBB kÐØ,>Ø pLÓ0î±#› ^›Ö€ ¶9Cc›eÀƒ146j í–eK4Fì;I …§½ÚKK-oß—{3~óGDdFDFÞ{_Õ{¯T¯¾N*3###ãæwy+>ùÝNk;%3B!„BÙ –»‚å®`÷ð€³ps²ÎÈXóå ³Z, ¤˜œlâ“X² ,ÊKX2‰0°"¡0ã¯UI1öXøfØZΉÅèZ^ÎI>CÝN(çJ€²+øþ??ŒÛ¯9€ŸyíÓñìÿí {½êž{£Áü‘x"‰)[¾þ(¾ÿŽX[)«4ÛçZ‰U´•MZ6$²4ä—ÞN|NØ·øØÒ| 1õ=ò·37a/ï}¢üñðŽ(ÌôK^"„B!„ì ¤ éNB ?i[.§2¡ó³+Pp©!>½%Hr1N€1ZÕé/-ÒLx~%Íø²Hšq2Œ ’_\BLã$q’LFbñõê´'Ɉ@!H‹û\/A½\*ÍßÙƒ^ûC¼ô?¼¯zë+°û¤]Õ³¦V@áúZ§É ‚ý÷À?þÙUØsý=€. Š¶—fTi•Sí§"K*ÊšÓ_‚„—B%‰1u"L^šIÒaɦР‹³ËÙ1¨‡`¤nÎs±éîß”v!„rä¡ C!„Cf|||[d˜ãŽ;§v¦¦¦¶üZäØ&'Ãl§Œ5>>¾m×"„B!„­brÕ`÷ð&lVV0²«ù†ÜκÁêrc»ŠZ,ñB MbQÚÚµt‚@Š X`e“èX ¬(4Å–êZ®œØR‹7¶\" ’ÏÐwB9ǵ±4»Žùä1þÕÇðsÿáœyöɈ $/ÄH´ýàmÓøæe÷bfÿ²{Klo¥)«ÄrL(ÍTi+m¯Ð’O¡é%Ïøº*+¿¤×\˜ë g­ŒôK†ñ÷y&ìL®nAò!„B!äq‹é@q82L˜Ó'=F¯Â”KóË8þ¤ãjÙEj¹Á .E ÈØµTҌѵ cªó½4ÓhBi¦$¿Ø•*ñ%HuiJ,^– ÓbÄ%̤i1^‚iKE›²,ñ•K¿‰ï}á&üûK^…Ÿ}ÝOCkû¤nÄ&Ê[ç–ð…ü+¾ñ߯µOƒºè#§4e—HŠ‰Ä˜P¢‰ë¶J6-û‘°Ò"¾4Å–ü’«S$íh­°Ð"èáÝ}óà„/§È½¨B:”a!„Âþk!„Bv:Û™b±éäØd}}û÷7ôb2 !„B!„lŒ‰µí›°?Ú""øt˜¬HÌÉJ^ÜhˆþxÜF,mmde\u½JäÐù6ªkE}l¹VÐþc÷ÎãïÞs3¾üÉ;±8»Öz?gö/áü¿·ás¼Óû–Uš‚ÉÀ -™t¤òLI¥WŠKÛwŸ—_ò}ë‹sëÈM¾L†Ù&·ño‹B!„rä1á„ýÍ Š”æ¶mV`af…“|Jˆß?ª$­ µŽ“EŠZŒh,€Q·i¥µ{.sâH(zx9D× *V±Ò ´—Mü¹¡0â·ëcʵ›¶UÕ®=?¹€ÏþÁåøÐ>1‚²”F F0ñÈþàg߇¯}ö+ÜôLiÑì+wÂÏèöUã?‡¯¯{¯U’Úb›P(4Üw‚ä;bÑD˜"h'* ¾Û…™œ #У'o|(âß“a!„eB!„2”aÈNâ‘G±?F&lר3ÆàÖ[oÝ–kB!„BÈV²åéÁ³[›ˆ°0×±bE› ÑH'i—^ZSCú%œ„²G¿6ÚÄ–@é)î4ú‘H7€w~g?>ýŽïÙ𕵬,®ãÓïø>îŸ\hiq”Tú&³b ’uó¾õZzõ½™,×Y˜_‘ìGáðØ ÿÔÖgv΀“w¦(ÃB!„rL!}~«G¥–í ¢FŽÏ–ÏM/7S@B¹¥ÐÉå—¦,“IÉ 3HD”¦àRÉàRI,*h*‘ÄŸ“¶•m)Å‹6ŽLÀÔ2LiPÁâÌ2g–LiQßW-ÇÃÏ쯥گÊ*=S]ü~%¾ ùÞbY¦>ÏË2pçÚãó‘ ã­¬*þ§_ºKJÿ:þZ«r¶ƒ„B9*:Ò „BÈÑËøøø¶]‹2 ÙjöîÝ›-ß®±w÷Ýwcy9 M!„B!G‘a€:ôº­2ÌLÇŠ ZA¹•H%Gˆ'›Ø‰ʵo¥‰¥­ þ˜‚Rqm(׊½†=ɾ’J R÷G#¸FØÛ^ÕAж¿–í‡P”)‰®%tÖJ;CÄh‡é”]³ùBK —N2KkÝ@ŒñÉ2uÂL»ôßÃÞ}‡g×ãL CÃ:;á¦ß$œ~stÒã]f×7óUЄB!„Ç;¦{ )q„â.ýƒræ9,jNÛôÈ©)ëU IDATI0Xlôanz …V­ìû´‚'6 Z¤&•ôR¸ºZlʈÁù… åÚ²ÇMØNh©Û4¢!"P¢ ZC‰@DÛç`Ñî㈕W’cJÑåÛÐ " 'ˆØNÙçH®’ú:JCiT /Ю¾±¿}”FÜóŸTwÖÿL¤¸„âΦïëæ¾Rù}'öD‰.*#¿¨X„i•™Tp^pNÑãœù饯8¬Úõ¦J/ï;¢Ä%B!„õ0†B!‡ÌÞ½{155µ-×¢ C¶š#-ÃlgÒ!„B!„l% ÁZ¹‰“ö%» uoiMÞ„»0»Þ”¢$‘þI0=“Xú´Jëõ3¢62I{‰ Ò’Hã'8U7I’ÅÝÄ#"´uIqÙ°ÐÜèä%/ËÍw s`j“¥MÆj¿‡ÃÔšÙ¬¦!„B!G ²)§Ü ý×Ù¶jèx@ºòÙ©¥†ÔÐL‚± !Å"„. ŸJ’œ¶n{#Ll SWª”˜pÝ7ñ%L‹ E•¹N¦]e%$SºTã–R`¼d¤ês³ûiâË@û:³¯6¶¯\ZKô=Åé.õì«ø;o¤È´È2© 37UË0öçÐé?®rK¦¼ío%(§ C!„ì,(ÃB!ä°Ø® ü”aÈVóðÃgË)ÃB!„BÈÆiK‡‘>ÓùÛ¶ÑUÿ6Öy— “9B "#OèP–h3êä‘ÃMIÅ–XXqíô‘7tŸ6ì$œ1%#ÎÔ÷³¹„m¦ëA$•-ͺƒ$´4%•¶ïH%uѧ?±(ƒÆ½X˜ “aìýÕ}FçÆÆr/&VËC:B!„rt“NÜŘ6IæPÓ5DÂÄ[avr1]Ð*¸TÂC‘fŠTžÁ@ÒLئ—9¼ˆRK,ãßtÉ2©$¨$B ¼p£ƒöCY&iK(©$¿#•ˆÓHiÑÁ¾ ûàÛíµŸ®õ!í7d•“W|©,“‘fT\^äê)…¹é¥ú§‡Mî=4¹e£eB!dGA†B!‡e²SÈ%ÜtÒI8ñÄ·åú”a!„B!;‰6f++‚9vkaf=IHé“¢RɉXÒ/ Æ·ÑKØØ@šLkªÊ i2™6ªÏˆ; "ˆÿg XšI>OS©4îóa¤¸dE–þÒKôyƒï³×µ6Rw~¶“Œ²“aÐŽÎ Ç'×¶ïoŠB!„òøA:ûüV²Nê Æô­£ÖÇf&—ò‰0E3%¤(ò2Ë¡J3Ṫ’XjA¤N=©“R²‰/!Æ×Óbœ8â¶•O¥ %›c` ’þ©¸ŸÏ‘]râK*Ê *Âèh¿ñ½èø{iÜÿÜ9UY*¿äe/ˬ,® ìf^ö04” ÊüXM“ûÖÉ”›.eB!d'1Ô¿ !„BH;ãããÛrÊ0d«ÉÉ0Û9în¹å–m»!„B!„l5¡ #((¿¨`oƈJµw'ŒXš÷vlý¹éu'’XÁC´@ ¢2»F%‹h(I)(%v ÄuÉ•Uk+ˆ%AY$ØH]€¸zѵÜ5%Aß|?´¸Oˆª¢$èOÐ(Àµ}fíÚ­ct¢›™—U6 ©dUê´•MLqXhA¦® ®ŠêvÖ«Ëex«†Ç|*Qªc5·/¸E&)©ÇܶÉÕÃxí-!„B!ä¨%J† Ý3³}¾³Ï}pÏ‚Uyø>H¹.š™\¬¤S(hqòƒ_»²BÛ¤”B+Ha·EÛçqe·0N¸0Õù€•´iËl[pç º¢ëþj % ¥ÝZàžÿ5DJÛ5ÄI,¶Sî]»¦âÛR¾-eëiW_Üï¢ìó¼kWA£4bŸåUýµ‘d•P‚©Þ`Q?\ët?‘jZ÷uf_Uû©d4øÒ&δ”mí ó3ËÁ«QC#®(}0–öòp-iy~²éNB!;Ê0„B9,¶+ÍâŒ3ÎÀðð0:NÿÊ„GR†¹ÿþû1;;»-×"„B!„í ‘ “-9Á¥1'=ŽÌÜ#»tuܳ4ߘZiÈ&n2E(”ˆ;÷ĵ¡¤)Îäd/ňVìùVh‰„™PØÐÔ‰…•ºþ0ãÚÓZÁ@ªû‰;¾?®f?š³Aìì/¿4“ -¡£TÉ2Á±-ZzÉ=ͺqÅÙµj†2ËÈhÜ=4çäô¢íÌá¶k­ÓëL†!„B!äXD'Å"óBЍ©¤ß°œúô=­»0ۉǠ»]#cEs®Y4~¥:¶±1Ÿ0™&-B!„BŽ)¤³ÏoÅëT@R­Wyn{dWRhÌN.RJ º©P†,S ñv$¹$ÇE·å%¦Ä’b*Y$\¼£ZÚ å•®ƒc¥‘†cT–ï·¤¼(ÿ9ÃúI:L&]&JtQíBLzßuT¾n(=5Ž;Y¦Ð sSKÕ3u=;PC»ã¡ õ>R×€² 0”a!„eB!„6”aÈÑN.ؾ1·]C„B!„²L´Là—h‚+kTjÛmÎè+šÅÌO¯G²ÉÀ)*™£!”¤ÂL*ΤÂLÚœt“Š-iƒ´‰;-B Vˆ Ùt¡¥]ô–^Chñ÷¡ ŠKÜäÛk¶k—…™õz>M0ÖFFUvŒ‡#5»¹yjýÆ>@†B!„cSÉ0è/ºdžóç5…=|B"Xf¦3D-84—Z”)t‹tQIubItNÒfx\iZ|I%–$]E©Xi1AzK6S'ʤ¢MœØR–Æ 1né–¥1AÂvÙ×ì«Þû*l×îk—¬ÓV|ºKFQíßa«H£â:i½Ù©E¤×"ËñPLGjúrŠÃØ–.eB!d§1t¤;@!„£ŸíJµxêSŸº-×!Çm2Ìv9&ÃB!„Bv"¡ #”ˆ71še'&ø*®(8ˆT}€“a€èÍ¢`~¦öD;ñE ( Ê”Ôu5((I)(%n2Œ¸¾eÊ'«À&•@A¤L¢~hÀöCÄžÛ¸–¶TAªûõC×·A‰‚¸6ª~T×°7V)@¼ô‘™a¢ qzLKNo¡¥MRÙHÝÁ%•Üùõ9½ûn¿§Œ Ê3®½ù™:Æß¹¡wƒªD˜¤BÏT$ÉÍ/‹_Ì\5'˜X£ C!„BȱŒM³HŠ«èôa9X÷,OžÁÐ#'¡Ä$ Eý|-ÀÌÄ" ­ …²BV0$ÁjÉÂo ªsêmû ,ºnG +M®Û´;.A;]Qîs8éCÄ . %€hmŸÍµ]C‚ú¢ío¢ì9Õ¹QJÞ£l=ˆ¶÷S+(ÑN†ûîÖ… d/â„û•“î«`?]§ÇûíÛuCbR±ÌI1Nš)‚ýxo'”˜ZSc´ÂìäR0²ý}[¯·3i.‡]^/aºùÓ#„BÈQeB!„6Û5‘ŸÉ0d«8’É0>ú(<¸å×!„B!„íæàŠMñ“l€@p æä‡ò“s‚£ðN‡.€bXCŒÔ2sÓë‘Øâ%ñ2D ›@baF”X!Â5—g"ÙâæÅrLu}÷yšâLЩ˲×ê#ç„ÒKÚ/ç(<û*áð\ß·P©—(m¥UdA³½>BKS~@h‰®×ûZ®ë>çüÌ:â&NÙq72ZÄÃ5›½L˜æÏ'ÆTG˜¢ C!„BÈ1t÷7Ä•CÚ©^È 2¾‚.Yp¼¿2Áô„K† ˜BD{¹N”±Û¦P(²ÒŒd¤+^HpN(ÝTòM(ȸµm».ÑNb©¤UÉ.®£6ñEÉ1J´û À 1Vvñ²Œrç„íÖ¢ ”Fiì îXi$›Ò¢‚D™ÁD—^¢L¯}í÷Kti$¸¨fº,_² 3>&•eìzfb!­ìØPp ÿ(6òdW¦{r'B!äh@éB!äègÏž=XYYÙòëP†![ÅÃ?Ü(+ŠO~ò“·üÚL…!„B!„ìTfÖ JIæ'dæ/T‡ê(Œf¸F0ÿÁ®ãFFu• #"æ§ÖjÁA‡sP2òƒ“b #•Bz‰±’M?IÚh¹$’6¼€’´‹Ö62×òŸSŒ›Ø.æÐ$•$Q%eú¤ËÔíö—^ZÒÏÞ£Þ2N¾®]æ¦×ƒ!lÚð˜nŽådÞN(Æ4^J›œëÇuú·1³fÐ¥ C!„BÈ1” ³„ÃJËH62Ï(v{Õ¶cêÀŠ"#RdR@Rá¢H—"–/z¶l‡ç.½D¹^2±†}HÕ^ÑU4ÅÖóçk÷<«ë:Ú%º4Úò‚ P–S J#Õ¶1’‘UB F×}û¡TÐÿA÷uf¿îc[RKußsâËß«?·!Ò´´Sh…²4Xœ_E:íËFrc1ÝnçñžoC:ûA!„eB!„6eYâöÛoßòëP†![E.æÌ3ÏÄÐÐÖ)Žoù5!„B!äH`˜\q³ø3ónlqó@¾^óH8×ax¬p"A]gvj½);蜑VÚê…²GNàЃµÑ&¶ÄrI‹ÀÊ&mItŒ`’EúH*‡(´D¢ ‚uÿt™vIeãBKÚ¯¸nÏ……ÙNðÖZ7æ|2LFâªFkcxKt¬mÀ‹« L2†B!„7‘¿- cA&<ÞV@ЩwÝ2upòrK ªÄi!h•*Òd‘l›•dŒ`¡«}/~ä%–$5ÅK(^Ž‰Ö ªEˆiŠ6ö˜@£ D˜Òº¥À´¦´Tm«–}ö_Û}•쇟/Zëh_UŠKkQqJKó;òé.ü’È2=å—TœIΟZŠ­‹CÃÑ8”èºO*LVêÊÿ Ê0„BÈŽ„2 !„B6…íH·  C¶Šœ ³]ãÉ0„B!„ÌĪÈJ*"͉ Õ4…`ÂC.)£)Øã#£º>æ–¹i;§§l¢{ˆ½„•èx]ÖH„é%¬´´É=iJ/-‚¢6‚sýŒ¦té!…Äi5@^NÉ¥¸ ²b ¢5ú߃„–°N6µ'éW]Way¡ƒ²+Aò]FÆŠÆøm³¾ò/«M¯9Æÿ B!„BŽmLgŸÛjKÅšÐÉvZ–{XÑ&¬@03¹ôH ©E™J˜(t6 ¦)Í´´Š2E*É 8?D‹ÎH,^: 䥓sT”6‰,‘4£Pƒni¬ S JcPŠÔ“Súï§i1µèSÕÊ{' †ú +ñ÷Ê2öÞ'MFª)T¸ßlGk…¹é%û› zVÃcî™»ù@-A½ê7#¿-!zÐnþ}åRý B!d'A†B!›ÂvLè?á„pòÉ'oùuȱeB!„BÙ&VËz§%ÆK/cù—ÔF ù²‘±¢‘ܱ¶Rbu¹D3%$#Çô’:œ¨¶6z¥¸ÂJSÜ´$]%'}èµ!"nЏ·®ÚI%‡%´4ä”ÞÉ,í’JÛ÷TÆZ”I“vòBKëwÛ·.0?³žÂ#£º9·&¬ãE®–qíLö‘o›2 !„B!pÉ0@"TGûŠõÉ¡H¸4¨¢¨;ÜÒét17³ YÁ¥)¥)F¤Ç3¢KfòHiÆ_³@Z$–*M%”eêzáùi’L%ÍäD ’`ºe-ŘR)-ý÷õD`_«øsøã™´™(•EÅ÷½Ÿ ÕSíõZÛQh¶¥f&ƒqX<=´;»Ï’ŽgiŒçz[`ºÓ?B!„ì(ÃB!dSØ® ýL‡!›M·ÛÅc=Ö(ߎ±699‰‡~x˯C!„B!GŠƒ«&û’Z‰&7䎥eõ¤ˆÆ©.¥£)#sÓVdH“`┓D¨È¦´·QI‘”Ñ”/´ÚhVЧ å&”4Ódbé:n·Ñ_7ñÄÿÏïoThiOféqí†ü2ˆ¬¢¢ußÏž~ŸÉ÷:p{ ˜ŸéòP 3<ªƒñNÚÉaÉëLAœ…L®6ߌK!„B9ö0ýÍIÿ• P׫«Hôì]?WgÄ‚ -UŒ&W¶åSìq…† É-AYoi&#Ëø4“FLK;Á¶rÝÍÄ…|âK3I&’N!&x ¯~ PZA´vi0Áâöý5¢ó²û:³¯òûªÞ>WÐ?ÿ™´F}"‰%—TXiÈ.Eó~ÇâKF¤ÉIKÚÉ0î'ˆjüŠ@ž? gÆe»à ÓÆKu]éNÒiýû"„BÈÑ eB!„l wÜq:­ÿñ€2 Ùl{ì1”eÙ(ߎ±6>>¾å× „B!„#ÉÔªñ€:-hÌohÎcÔ—Iê×ÂȘ®'÷ø¤æ¦êTFÂH«€'ÁdQ"¹¢=M&N>É%Á¤m n#8ÖTL¤É‰%Ó\`ZúÔ+Å¥Md9´„–ú³¦²J{¿âï©w¿jQ&\Ò丽ùéõ`²Ž_ZÀjZÁ3ssˆ]¡$s·3»n°n(ÃB!„B)gYÃÀ©¨‹{ÖMŽ«áã*IÁ¿RË0@3&—Ú’Ku‰¥¤Â(Y£‘JR¨†È¡*A$M|É .U K ¸ÔÒ‰ŽDŸ$S§Ä¨J¼ñÉ0ÕbÆ N¥©„ýt_ ¸¯£}ßϸ¾r"L"¿¨Z‚©ïê㺾÷mÒL½]×óß[ãûiœãd˜‰EÔÖŠ‹«€®ÆŸdÇ%âuTÖò÷¼‘Âød%B!„ì8(ÃB!dSX[[Ã]wݵåס C6›½{÷fË·c¬mW¢!„B!„)JfÖÊx*Nc.ƒsšoµ­N“ªvcŽÃðhÑHî€ ‘aB!$Vr…e‰œ0“Ê9ÿ൭ w mbMоîÓ†9rm4?k<ù¤^Òkú%J[ٰȲÉBK$Ùôl6^7M•Q˜›^_0 ;‘hhD×r—ÄópP•I¦,®_ gI3a€ÉUÓüC „B!„³˜Îþ¼Pm÷ªµÄç„)3jäĤQ»L\Œú’&ä\*ù¥È%‹mBE*ºÄm!–/à 0ÍÄ•b´­}JL"³xáĵ+JÕi0ÁbD"ñÅ/ƒ‹/yÑePQ¦ñÝä„Vš‰=µ4^–AV®©ÖE-ÛLM,ÖòŠsb–“±üZ¼Me°”£„àoB:û2!„²  C!„Mc;&öS†!› eB!„BÙZ®¸ ýMi¨Ê€x3šàà $­T·Áðh¥bFh!é%+PT2I›L‘Ê"a;¶‘•sê~À÷µUik#N¼ÜÒ*à ̒$ª ZǶMhA¦® ®j©ÛìûÜT§!YYùª“âÇdsXsÐêÒ†$Ó¨oÛš  C!„B 0Õ„þ¶4Œp»iåKpŽøÄí¨áÝ)ÒÂÔ:H„‰¢]¦(tSÌÈ‹.yi#l¿Ð:ÓN i¨œÄâßRQK,¨êÄrL-ÍÄõÂó£v•BYšæb$‘`‚>¨ ]¥âëd÷õûµ¨“TP¦Úïo4Ó›zÈ6Áõ¦«1< «NsÌVi/áv~ÌGÏÚÁù©<ÃdB!dçB†B!›er4B†B!„B¶?¡?L€i¦Ã aH³Bcþƒ?¬ uy%ìÅñÂH›¬‘M`iÊ&±$’Ibé%b rmè^m$É%‘\’i£ñYÜuEòKF09¤öN”QÕ:'ýô–TOhiÖíÑ÷ 07½æR‡¤ºMã:¿ñ`Ž®hÂYnL×¹yl”a!„B!!ÒÙÁ¤€z#”ªu/yF"KáUAC†Д[ +¬N°]ÒE‘—'ÚfŠ e¤u)T‹Ä¦ªø´¥ÅDbItN*ËÔ" ´®aŒT)1¦”$µÅ¥ÓD×wû*Ø×Úî«p_ÇÓu|\Uò a%HkɉK*¾÷=SdzÉ/ª÷yÓ Õo6õï¦wñàr4³XZ–Ô¥ C!„ì\†Žt!„²sßòkP†!›MN†Ù½{7N9å”-½îüü<î»ï¾-½!„B!„<˜X5v~ƒ²û+¯Ø2ÄʨÊÔˆ¨¨LT§¹BMëè®—Õ‹k!Àìäz£?^XlCJyDA”´¢Ü„ å:l'ªHp¾m"Ñ1Q J‹=±­ºFp-í?¶ª>GÔ׆r8êkÔׂkCIPV‰¶=qŸÅ~w/©¿‘ùÁz—%•D‰’e²"Ï¡ -muTR™:³“ëA*Œ@D02¦[ĬXøŠõ.Ô’ ‚cQýøŒIÊ0„B!„ÓÙ=K‹­¢«‡e÷𜔹çT zðÎ<Œ¯U²‚¸çÙ©ƒóþX#+DAk±"„(ˆ“/ü¶øu¡ªmS(­ÜùNØ@ qÛEt> ZUÛFÛvD+”¢ ¢¡´ØµDk{[Dœ,ãï‹“IDÛû©ÝZ4DÛß¶ bEÑ”MI(¥º9Uû ÙF¥i1u_"‘G…ç¶'ÂÀ¥æÄé.™”UK0 Y©*÷ëvêö ïÇÉ>@*Ä,-¬b}µ¼Ãݬ¢h ]nëð:z¸N%¯P¨¤œ$yY !„Bv ”a!„²iÜrË-0Æ@ë­ Ÿ{êSŸºem“c“‡~¸Q¶ãì–[n‰ÞÐD!„B!;•jB °ˆRN æé(/ÉØÉ<–!hªšÇãËFÆ4–ç½´`ÏÉÉ0@"–hqmÛ >‘lâÄ/¬H%JòŠŽ…•†ôâ¯+¢’ky¹¦VR饇¸Sõ1”bqÇ˺wÊÒ^Ìë0 4A݆ÈrøÉ,í’J[ÝZŒ©EÕ\ ´¤ýj¯/ÝŽÁòB·zs­Œ+j±%œÍÑ‘FY…;1z‰mÒÆBÇ`¥äï„B!„éNÒdÑ`n<`‡ÇÑ^¬ô¡Ü³u(Öt]ÛRµ;u`1Û§B+'¥Øçj£Š0 2.Õ%-Ó¨—"dìZ*iÆT‚Lx~\V8)Fk#ÊÉBÚÞ­ëÏ®uCpQûBŠDˆ¨ú\×–=†ê÷€2óÜfŒdR]z¥¼èú¸rûÊ%Óè`ß×Áq·Ÿ¦²´%ºô-Ë´ãS~ÒD™ªLÕÒL¾žOŠ-*Fê±æÇsò ]ÿ›ºDÛÕZ‚ýLZŒYß×㯊B!G;[7S•B!ÇKKKøÑ~´¥×xò“ŸŒ¢(¶ôäØ"— ³ D?øÁ¶ü„B!„òx`Ýf]bKœ¤¦dHF*ÊDÒ¹öü ld´¨çé¸e~¦c'¡$d¥ J‰(‘M+ –JÐhGEë^ýBCAã>m¤=Ô›Z‡¸±ç_B[µp«qЍL$ïUyý· "eB!d'C†B!›ÊVOð/ŠguÖ–^ƒ[P†!„B!„­çàŠØ/'/¸U"„ÄÂA8i'¨ãÊFÆŠ:FìÛBMi°0ÓÉö)”Â9&9a%K"饙xI)-’G-ß´I!ímT×Ò}Úh‘n ì[jM™,Fâ6tý™6&²d>k?¡%÷]ôTâ>µ÷ ¹ï4·nH;¶lvjÝÍÑ'dÙÅ&à5ýE‚ÿ¤e¡øI`‰X3A†B!„’A:û›¼D"—”Ñ–ž<°H ÃõÛ‚v§.dû”KÉ *íÒŒÎH39A¦E¼¨ÎC-Û„L$ÄÔ²K(ŸÄrLâ¶ )Nò(KƒÒ»öÛF‚öÂ/á ²¯£}¿Äõ•a’4 FN’)ê}ŸÖÒ8/+Èäe§¨¬Ñ‡DL0y`1’`üÀÓûÝP¬Çb^ØBKYØ’2{ È!„²¡ C!„Me|||˯±¢96XXXÀììl£|;ÆØvü­B!„BÈã…‰y.ñ‰ææä`ÒÔŸ %ÃŒé@X@õÆÑÙ©õ|§T-B´ %Vòi2hœÛ[Xi´ÑKé%îT} û¼¹6I‡ñuáëfûþ¦È²BKîse®Õ».2u"±(`nr½ž«Œ©áQÕxs•þâ'‘Ec¸.‹æébX*ÖP†!„B!„äÈ'ò*â28–¹ô—fŠŒ=g¥,vCM†B!„B,¦œL Ñ Ê=‹¸çTÔϳÕ³{6´»ÕÃx½De" jä$@fjqA)½eÀÊ¢ŠÂöC´†ˆ ÊŒ+Tˆ)ÄK¨ÊŠBAÄÊ-¶@\™qLj•0\Y³M+iQ€(ˆh(m?Ÿý¬N,q‚‹}öSˆ(Ñv_k'^õEÛg{­Ð-*¹¥ñÏ£>uFå÷C9§ÚWî[)ÇÊ'hJH½Ò[É%’_Yi&•eÒTš© ÕxªŸ…W3W"ÂÄյĿq"+ΈÒÝ7ø!„BŽJ˜ C!„Meff<ðÀ–^ƒ2 Ù,Ž” ³ J„B!„òxbµ,tªLŒÆK=ã2AcîCxõ9UZ=¤¡‹ê`-ÃôH†òÒESÞHÄ ŸÒKʈSòmDÂHZO÷i#L‚Ѩ¤•AÚ0¦ùæZ1^¶ ÅÞ).–T´Š?w´¤É:Zâ~Öw϶03±^ÏËqËðh‘¾6Ÿd’KBòçTÿ©M0†B!„Ò†”0݃~'/Dò@ äRc$ÞJ ²‚:EÆž7}°· $òEÑL‹É%Á„BF‘$É4aЦx‘¶™G•þ¦Áx±Ä'¾¸™0©¥JaÑ$¥´ 71¥‘`11®ða\ý–4ñE%û­ 19Q%¾ÿµ°‚ø>©,“¬UZ¤ý"S2!Sæëk? u·³Ñxõã2¯®^šþÒ*Î@`Ö÷öwE!„£Ê0„BÙt¶:†2 Ù,r2ŒR OyÊS¶ôºÛ‘ D!„B!7l:ŒÝ®¤°šó ½ƒœTà¥8QA1~î„`v¢w2 P‹/¡ +±¤Ñ&›4ÅŒH¬ikCåÛˆ„”É*Q-ò’6L)Ù¥Ÿôr(’J݇~²J=?¨eT~µ7ˆôÒ&¿4—ÙÉ5ˆ‘(ihd´æ™I<¦ˆ[á›hý—Ì9^ ÿVV(ÃB!„BÚ‘Î~4E˜@ è+½$õCa¦zþY ÊmÝÉó}û–¦¤i!9ÁE¡p‘È-NÞh$˜äÚ Å¤ÍJb©ÖÊ2•S«ÒX!Z»L˜`”%‚4—d­|:L áT’Nr__Ç•sÒT–T:ê™ü¢Z¶ƒ{ÛHšQA[*•fâä™"™‘Ú픘›ZL„-” ’`€f*L0^ãˆÕ¦$“߀éR†!„Bv:”a!„²éluêe²Yäd˜3Î8###[z]&ÃB!„BŽE®”¨'*Ä"@˜ŽnVò’sZD™‘±"ìµf&z'Ãx”›¸‘—;¼œŒ|Ñ&¬dêiôIH¤IŨ~Òk£ì6“aÊRZ…–CK]Ùˆ¬Ò"#e¾ „÷©%]f#í…톈8¦zq­Sã:+¼T¢–ÓõË“#á%+„EsГk”a!„B!í˜ÎþúÙ¸z.©eþÒKRÿœœ£:Õ¹þ™gj@V¨h$ÁMiÆ ,õùµd¡£6›²LS¤I¥™HbñoY¶ëÄ•bri1P Ý̳ui$n_'×ÓÉ!ÒýJŒ©iü1/Ð4…•äóç$—œ8“HC¡ “ißMóziêêôÄ"ÄH=NÝ8TCE2%;“dâ1_=¯w(ÃB!;¡#ÝB!„ì<(ãÉÉIÜxãòÓO?}K¯ÛétpÇwlé5!„B!äñˆO†QÊŠJDÊÏ_Pa™@  ”@DA¥Çá_"êê‰@”²¢‚ Zf'û'î_^(®ÝZ^qÉ)Ús“,Âc¢ÄÎ[±=„ NÌh­` °SCü5ì1¿׆½†?\K+h \#¸–†ï”ÄÇLiÛ ‘²ž´‘%’T6"´Du{K*±ˆÓ.ãTuz¥ÊTÂLøYUêÂ`i¾ƒÎºI’†€á1—>1Õü'·´% E©GñËjQOÖ±+„B!„Ò†t÷£~À$Êu™àðeÊ&q(ûm·àa%xHÖv{êÀBu‰^(e“\D+ hq’‹x™"(Ó …(ˆ†[kHa ®L ÛO£UtNµ](hqí â·E ZEí”â…ˆ¶M ”h{/´vÏkNvDÚý!Vô­«gyÿb‰ê»À‰e/·ôÜ×Ñ~º„RL˜ÊR¸Ô–ê¾T2Q¼_׋S\²Vù%iúˆ6)SbéÅ .º­Çh%·Ñƒvi+–dÒ‡l”˳°¿,B!„0†B!›Îøøø–µ}÷Ýwã—ù—·¬}rlpÍ5×à /ÄÝwßÝ8vûí·ã’K.Áüü`o6Ú(wÝuÖÖ›ˆE!„B!; ?Á¿—(`ç:H4×!ü9á›>ƒù#^Tp“"Ä–»X[)êc.E¥§¸Q%±´ˆ>±ÄZ(Á:¼F/!QM9dÐ4™øXi¦ŒÿæÚf{H>O/Ieó„ô¨£¢:mu‘©[iºLÊìäz=ŽÜXFÆt<^ƒA‰0©ð½6œ£#šÀZ)˜ïø¿ B!„BibºBKk]ÕR7/ãä˜\‹ÆMˆ‘J¸bᥞ‹Ó_x‰D°h0†B!„Òé@:“v³UzA,½$©¾LšÙöœb$‘ìñ©ƒ'mD’F¦°QèZ¤h‘frbLZVâK}.2ÒŒ“XœŒR‹/Ú>j·öbJU/”e‚”­Q–¦¹‰E›ÆZû:³¯Z÷uz_´Mw(Ñ%ÂJ-ÏxD2`‰ìÉUy¹£]V±Ÿ§ì6“aLW¢Ï;PB‹OUIdž^}ܤrÈu[îKã^¸u†™Éõ ¦oÃcE2þ¤¹8-ÂKú"fß¾˜\B!„BH?Lw»ôÄ¢‹O傇èÆÃ·;ìD…¡ã‚6j1Á¦| †R¡Œ¢+é¥0Ð.ŠŒÀJ-E,uhSô•f|BŒO|ñr‹a²²ŒÝ®ê„B P¿`§®V/›ðõÃkåöÕ€û¶V>A‹(„ƽËI.­÷)·NN¸ …§6¦Ì7¤+Á”î#¼Äã9¯¶¿¡¢ËL†!„BŽ (ÃB!dKØŒ ÿßþö·ñS?õSøÍßüMLLLdëhÍÿ;Cúóo|^x!¾öµ¯µÖ)Š"[>>>ŽŸù™ŸÁë^÷:ìÝ»÷°ûB†B!„r,3±j_NÏaæ‡P”©Ê{‰vòÃðhQ•‡é03“ƒ%ÃxzË&’,I,-"F(¬4e •¥Uꈥ›PîèÕT¯d˜Þ).‡"©D©7Ñ’ö/‡ú-ͺýûð{kcvb-H„½?ZahDGK<ž}J‘$å¨&踢¨~…ký_àA!„B!ÒÙï6RI –Wªã‘ˆ€úÅÑ9q]=²»y.“û—a€PvACÆÈ%ÁÉñÖ”’"bmf¥'m¨Zˆ©"Xývp¬R!Æ'¹ˆÖ( 4‚®[ü~õƒ€NLý~Ÿ˜æ~NTA´®“Zü½†»õ~˜îRí«ôxù¥E–é%ÃLîŸ Ä?¦Vb+cµÓg,»ÓãßµÁdB!䨀³G !„²%Œò¹=ô^ûÚ×â%/y n¹å–lÓO?—^z)n»í6üÄOüÄ!_‹ìlʲÄ{Þó¼ìe/Ãþýû[ë½þõ¯ÇÃ?Œw¼ãÉÖ¹âŠ+pÞyçá=ïy–——©?ÆÜzë­‡t.!„B!„ì|2Œ„‰~ÝC ¨ßúY)1Uáˆá1Uµ¦Ãl$$‹†°‘=zK/ƒ´Ö6]£‡t“ˆ%‘¢áÞ\k÷É$ÃiP+u¥—Ìãëä™äÞÖí &ìäå—æÒÆÌÄZ#fdL×c1{âFe\îÇg-vIµÖ—èobrÕlh¬B!„BŽMªd˜(ÃlMÓeTççÒaÔÐñÕƒu(%l$°Ï]© ÒKpI¥‹¢!Í !elTš)ŠúaYy9Æ'¶èPˆñBJ(ΨZŽQªñ¢‰²A-ÓTm'×RªÞ÷×TÉ~%áèFºKšÊÒSbÉœ›Þ¯ø<$ 4mÒ Ü¹½ÇÀäþù`¬¹±§Öã±›¦ÂDÙM9`Ö å̆Æ*!„BŽN(ÃB!dK8”ô‹¥¥%üñÿ1Î;ï<\yå•Ù:###¸ä’KpÏ=÷àÍo~3Î?ÿ|Üpà øµ_ûµÃí2ÙaìÛ·]tÞûÞ÷˜üD’±±1üõ_ÿ5.¿ürœyæ™øÀ>€;O~õ«³õWVVðÞ÷¾Ï|æ3qùå—o¸O?úѰ´´´áó!„B!d§0Lô÷aêù~;HÒº~s®NÝ”Âð¨ví×é03”a€ŒlÈ&Y¹"’b€85¥ÙF,—äÒdR‰$”fr‰0A½z‚Ž[ü~Ú¯¥® .«4%•>BK$È„‹Ê~/„œ–u/f®E©002V$rV¯´¢º¼J€‰Æs ÙCèÁ캀B!„Búaºé9&Þ®ë /Dà "˱0#O†Ât˜DJI•P€I“Jêóuu¼êök3]T(µhÉ.a*K,Ç4Å–¬ c¤:¿j3|(¯®íôU•:㯗Ê:Ù¤H,}„—ôÜ"i§U,jkKÕçö{¾žÚ?ü~ãm‚}?†k±%› ƒdŒѸ ·M·ýE™„BÙYP†!„BÈ–ðÐCazzz º"‚Ë.» Ï|æ3ñ¾÷½«««Ùz¯zÕ«pÇwàCúN<ñĪ|×®]øÔ§>…Ë.» 'œp¦ôŸÝ\}õÕxÎsžƒo}ë[­uÎ;ï<Üpà øßø¨üÏx®ºê*|å+_Áù矟=÷‘GÁÅ_Œ½èE¸ùæ›îסHb„B!„²“XèV»&IÄ_ÞÙLبÓa¹‰DS#ºªk_b+˜>x(2L*iä„•I0YÑcPa¥GL*‡ô’n4qÇn›n,Á˜R ¥ $²´§®jBK*ö .´DÒŽNîKNž Ä!ôž«ƒéƒ6Æ„nʰNç"—$ãAŠQ2ž¸Ü58¹f^ŽB!„BZ‘UH9Ë©™4$‚8&"£ß`mß7`Ö&Ñ@pçâ–ëïßpw#É"“h’¦då]'Ã4’Qzµ©‘I˜QIâ‹Ot-¦¸‡ÒZP‰ÅQ ei2‹ÄmUmÔûþAUéÆCr$ß ’NP–Hò²Ÿ9+È$âKÑçÞi­PdÚ ï}ë5‚Ïÿ×ë°¶¼Þ[ʹûÑÛ“‘_€ø‡¡Xr‰Ra│ñ˜eB!äX2 !„B¶ŒA&þßxãxá _ˆ_ù•_Á£>š­ó¬g= W_}5þùŸÿçœsNk[_|1n¾ùf\xá…‡ÜgrtÓívñ®w½ ?ÿó?‰‰‰ÖzoxÃpÓM7á‚ .h­ó²—½ ·Ür >ö±áÔSOÍÖ¹öÚkñ¼ç=ozÓ›pàÀ¾ý£ C!„B!ÀÄšM‡©iÎ׉æåØú>)&Ÿ³²nð…Îã¾…nu-Ÿ óÀ] øÚ•Vm JšÄÉ¡tHUJK"a„²a%'½ j#/œDH›<’I“ Saêt˜L©&–T6Yhé#ãô®›ïW(¿„‚Luƒ+?q?æg:0b'ïxn8¸Šo<°„N)µÔ’£ÑøßVŸ‹^“«ùd[B!„BÉa:ûby HÍ,Æ?«øz‚îÜ]X¼ã}X}è!éø¸,ϯâÃÿésø‡e9ø3ŒRqZKº­5š©$9I#:§)¸èÑñF;I›uâ‹ [j!¦N‰ÉÉ2Ú¾dÂÄ‹M† E˜~kÔwi1®Î@i-•°‚äX-ÍÄ2QP®‚}•Ê6i*¯gËT‹ 37½„?Û•øü¥ßd*¿].?Œå~Ë÷|fu"»Ò¯­©0ÒÇ0†B9f  C!„-c||¼õؾ}ûð«¿ú«xÁ ^€ë¯¿>[ç”SNÁG?úQÜvÛmxùË_>Ð5Ï9ç|ï{ßÃoýÖoRŸÉÑË#<‚—¼ä%øó?ÿóú0 Çw>ó™ÏàoÿöoqüñÇ÷mshho}ë[qÏ=÷à·û·QE£Žˆà3Ÿù Î9ç|ðƒÄúúzk{½þ&!„B!äXabÅ‚A ]àËƒÔ w~šSÁõ¬à×Má»{—±\K0”]ƒ½l/>õÿìÁâ\gCý­¤^bG«°§É´ a¥­XÊÙ@"ï#cêT˜*F$–_¢$•¶Ïö½Ççk-ª¥.±n},>§¥N ]Á_¾ó\ÿ•N¤Š_Xàêûñ‘ïO㎃k}SaÂy:a½PèòãT ”a!„B!Ât 4ô=0k±rß_cùžÃ¬ì³§ug#Á ”b¾tÙ xßoý¦, ÜßHÐH•BëXnÉH3­¢L°íÛÑ™$˜H¾qÛ•|âD—8-Æ +Õ:bDÙß$šÏרdœèÒ{_µîgåÕç~$¢P.¦U¬i´ãfRY ­©0wÞ´ïþ¿þîºé!û£Ln ugÝÙÛ°xçû°öØUr­1nK… ǹý;°„B9  C!„-#—‚±¶¶†÷¿ÿý8÷ÜsñÙÏ~6+-E·¼å-¸çž{ð»¿û»ÚÐuGGGññW^y%N:é¤Cî?9zøÒ—¾„ /¼×^{mkóÏ?7ÝtÞøÆ7n¸ýSO=õW…[o½]tQ¶ÎÂÂÞùÎwâüóÏÇ¿øÅlÊ0„B!„L¬š@D@5Á ÑüœD&¸o¦ƒÝ8ƒ«î^ÀrÇŠKÉõÄØ‰(Æwß:‡ü§Ûpïíó÷·’2´J„L‰î#¶ôi£’Pi2ýiR96j©%M…1¥@JLh Òj Û>{r_T]wp‘¥wÝø=ê4$› 7{ý¿oÇc.A ì’ülåÇÖÌJ‰¿¿sŸ¾uûmQ” Œc¬-&¬?±–¹!„B!„äîHHÓ3ZÓaÂòr«]…¥þ9ºswDíw—o…YßßHõðÛ÷ÜþÞýƿŮ½o þ*åÓIt#Ý¥!ÈäD—‚K}}äŽX)ŠZB‰’Y´‚r¸>¹¥’U¼,£TC„ñI1Ê·éÄ–ïk(­ó"J )¡ S$âKõYs÷!'Û¨ŒH“¹o9ÆÁç>u->ðöÏavj)? \ºÍ¦Õ뾆¥=ïÃúô ÕyÛ˜bñK‚rûV”¤œÚÈŸ!„BŽb(ÃB!dËHe˜/|á xö³Ÿ?üÃ?Äââböœ—¾ô¥Ç'>ñ œvÚi‡uý_üÅ_Ä~ð<ïyÏ;¬vÈã—N§ƒK.¹¯~õ«15ÕþƒÖ›ßüfÜxãxÖ³žuX×;ÿüóñÕ¯~_øÂpöÙggëÜ{ï½xÍk^ƒ—¿üå¸óÎ;«òx333‡u}B!„BÙ L®™:ÙÁ|·Ó|qm3fz¥ÄåwÎãÓ·ÎâÀR7jÿ%×#UÒÇütŸzï|õŠG`’ä6O‚‰Å_'+˜ ˜&I‡ÕF]¯ìf&ëteƒ²JIÅ‹2áÞ·¥Ï (½4îENzQª±Né¬\ù‰ûñ»k«Æ‰0ÁgwHß+ûÀlŸŸÅ—î]Âr'”`š’W-ÄäÇ})ÀÌ:“a!„B!ƒ#åþô­ƒ¥Ã@ bЙ½Ë?ú3t&¿ HÙl¿;µƒŸBwá¦$ÙÕöÒü þâWá²}ÝN³+sÔGQÄòE#FgÄ\ J ý¤™ð\å%' T¨ZEI-þX(Ë”¥±é0ÁbŒôI|Ñ}a~f­\wêu}Ý£¢HÎ Ò]å™{Ö&¿¤MÈÌä"þìw¯ÄUÿí{0]“•§Ä¬c}ú*¬OnclHwkP3zd IDAT\Žåû?ŠrùÁd¼fRa‘«¶ž)Õ/H„BÙéP†!„BÈ–qÏ=÷`aawÜq.ºè"üÂ/üî¿ÿþlݧ?ýéøüç?¯ýë¸à‚ 6­?þã?Žï~÷»ø½ßû½Mk“<>xðÁñâ¿þð‡³ C°{÷n\vÙe¸ôÒK±k×®M»ök^óÜu×]xÿûßN8![ç«_ý*.¼ðBüÎïü¦§§³II„B!„r,2·.X7¨çêToûŒ“4ré0ë]Á×\Â_ý`{¦Ö³íw\à&¥ Ê·ç_,j…c_»òQ\ú¾b~¦Ó·Ï½d“fK3‰%,Vò‰,±<Ò*ªø:I$‹ïï[E™ËÉË™«ß1BYfzÍ`@7‹B!„Bb–!å†ÓaÊåû±òà_bí±+ ÝüK,=zìt Ÿñ ¨]óéÔ‚ƒ±Úâ¸ÿç7ã?¿õ1±¯kVJé‘ ce‘\R)ĵْÓoŠº:ñE)1n­5”“cB!F¬Sšx1âê¨Zž‰öÓuxÜ%´ô='§´ +©üR—7D£H–‰¥›¨Ü¥ï„Üöýñî_ýï¸û–Gi*LšÃЩÃ~¹PCÇ÷fåa¬<øq¬=v9¤3—z¬©³±ºµÓ¯NUWõ¯®È07}k_üôCX[)«ïÑ”µ(»OÁÓ.8 VK\u÷šë/N¶«ÀEOÝ…;¡€æ„#Õ¶1RsòÍ纸æ`ÿö !„B!$dø„ÿzäœJ¬@"VØ[.åÖ§¯F¹x[ßvÕÐnŒžõo1òÄE(éL£;= ¥NvÂH-x¡ã¸vá×þàexÞÏ<£gûe)è–Ý®_»í®A·´ëNiPvðxÖkž“-ëtJAéÚÌï–SHY¥”%¤4€±k)]™;¦´Æ Ïxjó³­¬aáÞ½P…tUèjZGûv­]y½?4¤1T( Å]ª*/‚ãCCVª÷‡ "¨Õ ˇšõ²×KڵߡÁç.½_¾üFH)€1µ(Umˆ:€á'œ ¨a»ßYÄÚc_ÆúÄwì›Kz¡G0|òÏbøÄ(\ÂŒ{ã‰Ou5Æ•Ûuwñ_Q®õã„BÈ1ÀDäŽt'¶Ê03(ÃB9VPJá oxÞÿþ÷ãÌ3ÏܶëîÝ»¯ýëqýõ×oÛ5Oí2Ìúú:.¹ä|ìcëYï-oy >ò‘`lll›zÜtÓMxÛÛކ뮻nÛ®I!„B!G+/|â0.8u8_¼S§øcû–K|ýáì[Ê¿h#äôã ü»sOÀ¹§V"ˆ`ï]ó˜|tÅ–ù7ÄVk (~öÕgá¢_z2t¡ZÛ¯¤†HhI×µ°Ò( —²YÖ\ÊPªÉ\++½íäÄNý±áÆg3]ÁÔƒC”TCh N¾n»ôÒf\ú€õUƒ«þëƒÿ±cŒ@œùã»qÆÓw/ µÂÊ­ûWñ?ï[ÄÜZ!ë쓆ð’'áäí¤/Æä„à»ë¸k®ÿ'„B!„¡]/D±ëENziÊ)Ð @Ý…kÑ™û. }$|¥1rÚ‹1rÖ+¡†Ž«ÛñmJ‰ÎÔÀœ]£Þ¶ë—ýû qño½CÃEö2"ÈË09Ù%s¼Óµ),WVº²øœœ Ó~¼Ó5VÖðRŒ å·ä¥Ž{Ú“ŸÍ¬®aùÁG+ñÅ‹.Õ~áE¢">îÊuVXñÛ©°â%/¬´K,Ís&¬Ê6™ö”¦.àãïýWÜsûc Æo¯C.`èäsÀ' ™åǰúèçQ.ÜÝwœ«¡“1rÊ+ w=»n£jÓ’Œ`}î³’é0„BŽfèHw€B!Ç?ýÓ?~ô£xþóŸ¿í×þ7ÿæßàšk®Á»ßýn|èCjMò ?î»ï>¼îu¯ÃÍ7ßÜZçÄOÄ¥—^Š_ú¥_ÚÆžYžûÜçâÚk¯Åßÿýßãï|'yä‘mï!„B!„-L¬Ù‰(ˆPD %‚…p;ì™îŸ–±kHáçžv<^ð”]ÒÊ=ï+ˆ(­ð´ N‰§âÁ;ç Æ^G `;YÀ·¾ø¼{¯û³qÒ©#Ùë(ÀI:J×}…Šùë*Øß”ØÏ©”_[YÃ@  ÜGwí((%mÃL”½9PJªcðÒ&êGp--®uÀžj÷LW¢”0%*á¤Z«ºOñ¢¢5T®®j©›ÜÇìÔÍ÷ ÉÚ~û÷ï]Æ?üå}8øèŠ•_Üœ#Rí k<ý9»O®ä'±F .8}Ïa/8}îâæêxÉÆn &×ø!„B!dã˜îAúÁÏ=[ŠØçÁrétæ¾ )çû¶Uì>£gý(ÆÎ°{òˆ”*0üÄ Ð]¸fe4F÷ì¤t]ÿkÿt+î¹sÞúžWâIOn&±*ZA4 ¢ ZA »m´ (ŒØ"h©_f¡]YQ(ˆ(ÕùuYݦ@\™ÑîåQ›qYQ(”âä±ç)­íç ÑâʵýM@)”eóYÎ ÒyjQ¨ÚwªJÇ"‘ruŠðÕ‚h¿PÍò¢÷íºHöµ†;78/m¿ðeAyàûƒëÀ§Þÿ,έ¹©ì2‹¡“O=˦¸øã¨Ÿ±õè8îéoAgî6¬ï» f}ªulJwkÿ=ú4 Ÿô è¡'Á<©Æ¦ÝïBÊɾcB!;}¤;@!„c‡³Î: ÷w‡ë®»îˆˆ0ž¡¡!|àÀ—¿üe<á O8bý ƒsÅWà'ò'{Š0Ï}îs1>>~DD˜‹/¾wß}7þäOþ»ví:¢}!„B!„Ç+Sk~®ª9vBD×¾w`ŸÞ³ØW„Q xÞ™cxÛsOÅ ž<;ïÆM¬p,üþigíÂO¼ð ;~È¥­¸cÆ/ÀCw/âãïºwÏö¼h$e„IVÔˆå’TÚ¨ÊtNöP­mÔJÒ¶6ª>¥”e²i (ÏUË%Jƒ -éçÍß§ÔÍŸÓRÀ _ŸÀ'ß³[±óp\’ŽÿîÅ'œ2‚g¿ð 8áÔ‘¼´"‚!­ð¿ÿØ.¼õ'OÆùOÈKS#ÀÍëøìÝK¸}ºNÒ Æ¿`z€´B!„BI‘ò@õð"ÁƒŒY k“ŸÆúôÿè+Âè‘'bì©o®ûuè‘ÓQ=°¸tËàá¨Ú:ñl rŒLW¢ƒ„)bðÐâór|ï›÷ä¯ë‹EQK…3¢¥hÖ–ªLGÂGÑÒfØŽÒÚ>Gj¤âøÄ mÇ=c‹©z Ãs2û*Þ¯>C²]d>c£,¬œß¨—‘l"ùÅÉ2ERσË>ñüïþg,ͯòKÊöcäIOƒ=-CÉ{l脟Àqg¿#§ÿ[(=Ús¬šµ±vðo°>û%H¹œ¾qÒÀÔUB!äXBñmè/”RÿÀ9Òý „B6›óÎ;7Þx#vïÞ}¤»ñè£ââ‹/Æ5×\s¤»²-œwÞyسgÏ‘îÆÀ¬®®â÷ÿ÷ñÉO~²g½·½ímøà?ˆ‘‘Þ“P¶›Ûo¿Ïþ󱺺z¤»B!„B!+´~õì]r“,”[ß·Pâ»û×°ÐéÿoO?i¯xúqxÒñCn.‰rsGì›Tu Dè@ìÝ3ÉGW  W7|S/zå¸èµOAQ¨ÆµÅØ7½Š;ÏÇ­«²É1 ÎLÙ㘘²YÖ¸VÙ,K¯ÙÖ±Óügòk[¾½¤–4T(r)'€ 3¹JΨëV‡K^òª ð+¿ýbŒŒE}øÿÙ;÷(+ªÝ»êœ~ÐÝ4ݼDEÄ ˆ¯ÑȨsÕh4&^˜8ɬÌ8×13c2Kgn¢Iœdicr1jâ[#Ѝ ˆ DTÀˆ Ò<š†~¿Î9U{ß?êµëuºQà4ðý–EUíÚ{Ÿ}ªª×rwׯ>¥Ë’°l‰‚¥`[[²”[®üãEËBå*Ôg¨,©^¶²mÀ–PR¶ eK@ºk[BI€@fd}켪|VS3`šÎ¹0]±&´ojåξ0 d2S c03†³í­MfÆYëå¦v<“I®gFŽg2f¤¿^¤?Ó4ÐÚ܉»ÿûE¬[µÍ•_Ü´)] JAÙ9ˆÊndj'ø¢Œ/Âø’T Ð@É@¢qûQ…ä›çÂêX ÷Enàrdª¾ ³â$@ @)عwaõ¼8ðB!dÿæV¥Ô ¥Äž†É0„BÙ+|ôÑGøÁ~€\npýaÿCÁ‚ ð“Ÿü†Áÿ5L¬Y³“'O.*ÂÔÕÕá™gžÁoûÛA'ÂlÞ¼W^y%EB!„BI@*`gÎö_6»£WbÆú>¼°©¯_fX¹ÿ}T5¾=©#+M 0úN…QP~‡0?®Gœ0 ÂðÒA‚¤O’x}Î6üù¿?BÛŽ|l A:JJK(-&!ÉDKWIL@1D¤ÿ„zŸ2‘Fh‰0Ò]œýO“ºâ×5R¾—6ÆPêŒH¨›p.‚6Åhô2¯îÖ ½øãâƒ74Fª@n‘ ™2£N®Ç˜#ªb)0±{HÛœ{÷Ðê þþØ|åð!¨ÊÆÅ)æ>‰g6ôá¥-9t¼77Í9¾µ–B!„òé‘V vïÈ·þq"Œ@¦æTv²Ã΀ó¡>©ÖSf¼Ô$¤{€ì¨ã *; ìÞpJˆ'J(…Wž?ÿ—§°uSkx$"x9…©%ž¤¥Â8©/‘ÔSOƒ‰¤ÌDû1õD˜hú‰€a~B B)1Î$VZ2Œ€ó Žè¢T$ÆHHˆ‰¯ƒToìî¹ñÏüq‡S]¢é:AºK8ñs“p¾¢©4Ë­ÃMWOú¶ù©?á4 %[`ÖU"LB"LÑ}8÷—0«Q>êRTú`TVü6V9X]óoýdá7fû§ø "„BȾ “aL†!„²¿óå/Ï>û,êëãoH)5óæÍÕW^‰¦¦¦Re±¯$Ã<öØc¸úê«ÑÕÕ•ZgòäÉxâ‰'0nܸ½8²±bÅ |õ«_Å–-[J=B!„B´|ydãkL¼½ÓÂGíVïûD™)pÚ˜rœzP²F Z„`49e å¹^ëÞmCo·~hÄ}ˆFCjL\òã1éäa¡ñ8/1MK`‰§¾uRR_ìhY$ÆŽ¤ÏD?KK“)–H£$ †H×0Ѿ­`u ,Ûž‡ÝÏ À u_›Á;-¬l§C!„Bùt™#¡d3”lë¿nù8” ¿FùÁ‘—~`<DòF4=FÚaµlƒ0Fj)3†Öò!eøûûœþ·ý1)Ø^Š‹MjÑÊüíH2Œ{¼`9/}°,…Bìx¤ŸÔÔ™ ®òÛ{ü´w­€LmMì«‚«µ Ât…Ót×à&ÀD÷ 39½%c¦§µd´ô—XŠLRLJ¹™òyOßÿÌ|ßÈuEWøQ~ÚËV”œÓO| IQþ¶—&S,1F†ÚY+Ph} ÊîÀÏÁP²Jîܵ B!dÿå€H†¡ 3È  C!ä@`âĉ˜3gŽ8âˆR%ƶmÛpå•Wbþüù¥Êa°Ë0===¸öÚkqÿý÷§ÖBàG?ú~õ«_!›ÍîÅÑ Œ¹sçâ›ßü&:;;K=B!„BÔÔ— tY yÙÝc볘zH%ªËD ´¸‚‹¡%…øÒD(AE„ê„ÚP ›Ww¢ysS× ¿-Õ)&ÿ¯Ñ8÷[‡Ẩ.Wè²I’°’$¶Ä„™±%º–RAÅÄ™„ϲ‹È9e ']²§˜ÐÒȲËuÓE–4éÅ—š’ê˜Î±|ŸÄ¬‡6`ÕÒÖØ9õÏR8øˆjŒ:¼Ê—šbÒKJ¹.ÄòŒ×¯³ßÒ'ñÊ–>¬ë°ú½·«2€N‹¯#„B!„ì9„Y‹ì°sa9."µxé'ÉÒ‹'±LDrÑä…ÂŽu&Ú„…gž7 ßýáT”•g8s*+I†q×…¨“$Ëô'ÐD¤™BÊqoÛ¶¤#|¤ 1JÁ¨ªŠkeY©âKÒ¾.»˜y%$»$É0E¤™Xy&^/éóv6uâþÿ™‡ 7k"Œ&¯H¥za”÷"S;A“Y¢L’ £Ë.zzPT²ñ·e…ö×`u-TÿólB!„ø2ŒQêB!äÀcõêÕ˜³fÍÂm·Ý6(E˜{ï½]tEB!„B-ùþE˜1CLüÝ„!8ï°J É8ÏB@)8+h2 ôç,"K * ²/„Àa“†âˆÏ×Á0D8=ÄM”Þx¹ þåGhÙž ‘l¹Ã{NÈ)ƒöŒ‘.èxÏ9iÇBǃ2è}xÒI¤_Dûˆöë~–m«Ä%©¯PŸÑïñ™ê¦×‘~ ]hMø|[7ôྛWù"ŒÒ$ é +Ù2G\Ñž£ÝOú½’vŸ¹»±ûJ_×– \|x%¾~x%êË‹ÿ)®ÛRa!„B!{‘E¦z*ÊGþ˜“‚ïÚú~Â=¢Ç!yDe'¤ÝNÿð„©ðê‹«ð³kžÂ– -ÜR˜Aj«–Þj˜†€iºk}qÛxû†V–Ög¨M‘>…a8é7F # ÃÜɨó „ð¢´I¿V_Ÿ¾@dº©·Þ÷5CcGè<øßÁ}ñ‡¡­õsZ’Ϋˆô¥-Ë­Ã-×=*Â8×r2Æ$‹0J½‡tépd­ù›à&„BÑ  C!„’ÐÜÜŒ³Î: 3fÌ(õPb†Ÿþô§˜?>>øàRç€àÀ)§œ‚•+W¦Ö9ãŒ3°bÅ \xá…{qdC)…ÿüÏÿÄ?ýÓ?Á²ø6B!„Bù¬TgÎ;´ßü\%F 1Ý"’Ä…¨œ€p[}pêGݨrsÚTÖd|Æ—bܤ–- ݸ÷ç«°òíVQ‘#"sD¤˜¨àQLXp®‚h¿Qé&Ò‡´U|‘*ARIZ¢‚NºÐ®[\zI”_Rê„ÚCàÍùÛñà¯× µ9KÒ‘njÏÐáe8úKÃQU›-*³Dï!…äãÐîA1yflµ‰Ë¨Ä—G—¡Ü{÷‡ˆB!„rÀc”‹òáW#Su ÌÐä9YP@Â1Äê:û2¼/ÃÇ35ã‘©¯´›#©ž#±yýNüìš§°pî*É(!¹%*tDäý¸Þ&,¸ .~ôÓ§iŠ 1DZUüɸ—ž£¤Œ-Êg„ûB-Gk„—¬š$¬ ,¬­Ü“fL3*ˈ¨<·-Âç+A®‘–Ä´{^Çýÿ3½Ý¹TFª­(=FY]ò½!ÓöN…‰üB']ÒrîAa E¶ö(v%Dft©~¬!„2È  C!„’ÑÛÛ‹Ë.» wÜqG©‡’ÈÔ©S±bÅ œþù¥Ê~Kww7¾ûÝïâûßÿ>zzzë!ð_ÿõ_xå•Wp衇îåöO.—ÃßýÝßá–[n)õP!„B!dŸ'#€/ŽÈâÛG Á‘CÍd1!ôÜDrª‡BJyD„‰–—U8ú”9vˆŸ £ 1Òz»-LÿÃ:Ì~x#¬‚ÔÒI’$HŠIDö2Ù¤>ü$•"}èRLº8#­ÛЧÂHK…SW¢Bާ~„–d‘¥xbLÿòKü3=ɦ·ÇÂô{ÖaÞS[`d¢¥pÈ„j|îóu03"$AõwO½‡ï±ðýiàøº ¾=¾ÇË€J !„B!dO#2!;ôJd«/‚Õ)R "Ct_…%–˜ä€¸ôiod‡¢lôQPb+ ìˆã¹Þî¿}þxË<äú ±D“˜Ü¢‹2©ÒLRÒŒk“´$%¥8òŠáέ=ÆpæÀ~"Œ{~¤t$_¢1™ÆŸÀrMRRKÒ¢ß5©MjÛ¨dú¾Žt³c[;îø¯™Xôâª@tŠˆ0Jöåí(u#ùI•ªŠïG%™˜¬…àþ™±(«½ ™ªó ÄRý˜B!d)õ!„r`#¥Äu×]‡††üö·¿…a .WwäÈ‘˜3g~ýë_ã'?ù S?v#ï½÷¾ùÍobõêÕ©uF…Gyçž{î^ÙÀiiiÁ%—\‚×^{­ÔC!„B!„}ž#ªMœ62‹¡e„¡ˆàyÀ‘\ ”îC"\®„ÛJ@BÁ@d_;îôì ¡0ö¨¡Z_Ž ¶;Œ;F€„ …·ÿڌ͟táÿó¨]å#pÆéJ[Ãy¬;>á• gÛ_Nû@ ÑŽ¹i/€‚PÊí#ôY†óm êßU G‰"ˆŒ& —_B’Š.ïè"KLØé_dA‘:iu¡klèÆs¬G{KÁ—”ûÜQ°-7pø±µR“-"¸¸ÏîáýØsbL’‰Š1Ê àô‘YLjbqs½2v !„B!ä³bdA¶êgÒæÎM¼¹³;óUΖsÌEJ(Ãðç“~]¡ÂûþtREö‡BhîwÚ dG»kd*À0œº€!¡¤ÅóV£aÍv\ó“ópðau`*i&`(WÜPžâWžÜán;keÊ-S¦€RÊéËëÇŒn»ý˜Îï"LÃi£ áüŽA (åœSîZÎäÑÿ¶Á¦/θâ‹Fl_ˆâKH~I_ŠÊ/"¡¯„~–-ú3þ´¹¾BDn‘Á¶Ý ³î e‡¤ËRþ¾,"¾ AvAôÍ¡²ä#³ìæ‘(t= %;>óÏ!„BöM×Ó¦„B9`¹óÎ;ñõ¯=5¤”!pýõ×cáÂ…;vl©‡³_pÏ=÷àK_úRQ欳Ί+­³nÝ:œvÚia!„B!d7pèg”Eµ›Ú¡'k(W€‰J@1!mIN󈥄(…Úå˜ô¥á24IQ~jÌÖ½¸÷«ðþ-‘´—hJKXð0Š$Áxi,ðSZRÄ’ô-Áqá¦ÜD‰HBË„–ˆûì¨ÈRtÌéÒK¬.€·æoÇc¿]‹ö…P Œ.ÂÔŽ(Çѧ ‰01Ñe ’‹þBÚÐó9Á=…"÷˜û¬†eÎ=(‹º2fÄB!„Bv?²° VßÒÐäEÅ&4ˆ‹@°ïOšKì™Xž–ðaVC¦n”½=HÑä (‰­[ð‹kŸÂÂVÁ4#‰0‘T˜@_7q1ãBHr"L¤ÓI“ñö½4á&½xk%eâK„ ­ @Ke ÒZà +¥¸øÂŽV/–ö"ôúÁù*&ÎXÓï}Oܵ0.Âxi7JB¡ÙÑGÁ(«-.¨F9žØ>|E¥¥OÊeVÏŠ0„BÈeB!„ fΜ‰©S§¢©©©ÔCIdÊ”)X±b.ºè¢ReŸ¥££—_~9®¾újôõõ%Ö1 ?ûÙÏ0oÞ<Œ3f/p`¼ñƘ$Ê/ú¤[?¦ì.仞€´Ö•êB!ƒÊ0„BT¼óÎ;˜ÍÍÍ¥ !„B!„ìWlì–˜µ9‡nK%ˆ éK²BÒZÆ™t!™P#O#chi*®|áJ1Ë^Ûûµ;·õ%Ë"îC'ý +"QIL`‰&¸øi,zºK¼i%$ÃØ*"´D$•¤ÏÛ¥º"¹®ž.=?þ9qúؼ®ýÏÇX·²ÃOÑ×JºÓIuqheäZìÞø4BL¼<ôl<¹«-¯0³1æœÜû?`„B!„ ;¿ …®g™ˆH–'ÞIud—4!&1áÈŽ<¢²ÝŽ@áÄ|úB†’ o/\‹ÿþ·§±eýNMN1¹ÃÔeÄE—ˆôḛ(ãô‰Ôö^™žê‚bÉ0J…Ä—¨[TrˆÀ}’Ú¦ô³üõOp÷ÏžGÓ¦6÷ÚI_‚ñ®¥²·Ã¬ŠÌÐñák¨]×~E˜~î“]i¼ûGY;PèzÊœ/Y%„BÈÞep>aH!„šõë×cÊ”)xå•WJ=”Tþýßÿ‹-ÂøñãK=”}‚ßÿþ÷˜2e Ö®]›ZçÜsÏÅŠ+pÖYgíÅ‘íwÜq.»ì2ôöö–z(„B!„²_Òœ“xvc-¹¨£I ØuFzÇ5ÉaW„¥€šúrsêpTÕ–ùŒò׎Ó´¹÷ÿê#¼÷FKH\ *E“OŠˆ!ž@JZ‰Ë1F1¹Äݶe<Æ–*"´$'³$Ë/©›^'*Ï„…gýæ¼íxòîOÐÑšwÎDF’R¡vd9&ž:•Õ™T&íú†d)Ù0³+÷ {Ïm하¹9΂*ÉÏ!„B!äÀC>A¾ó/PvW²ÔRTT@?¢B85&Qˆ)"O˜Õ‡Á¬¯w„·½/ŸbÆö-møõŸÁ«/|èÊ¥·)I0úñhšLTšÑ…˜4iFW|©Å›À&%ÃHH3údßÝ +öÍpyTrñë¥É4Å!`å-ÌøÓëxöÏ‹Ï\Iú’s­%‘=Fv¨,]n˜,2ñxê½¹wda=òAÉŽRÿxB!d@†B!ƒ’¶¶6œwÞyxôÑGK=”TN9å,_¾—^zi©‡2hikkÃ¥—^Šk¯½¹\.±Žišøå/‰¹sçbÔ¨Q{y„CJ‰k¯½×]w¤äÛ[ !„B!dOÒe)<»)‡-=v¿ÒB²ØßOZ#VÞ¿0‘)3päIusx¤Ò„ MÊÈõJÌzpf=¸…‚,"}ˆ°‚¤z!i&=M&&ÌDûˆH(I©0ád˜¨Ð‚к˜Ð®[\zñÊ¢ò‹~¼·ËÂŒûðú Û`dH~ñ¤(`ìQ58üØa0 $Üůk´1é*¼ørUBH(_Ûeá…Æ eípR5t E„7á$ýø.1š£¼zRAdª=hÛúÐÄ‹BÁÆ“÷¾Ž?ß6¹ÞBjRJÒ¶Ÿ&“fIúéSQ„'ĸÉ0‰"ŒRîÜÜI“n]ç÷ÙEßaá'\Ï+ï;C ×3E¸ÓhnlÃ}7ÏÁ»‹×Åαr¥ewATt!;â8@Á½A)ùšÆë¤&)…ô¢àX4µÈÛ·s Ðù ’Ÿ; „BÈI¦Ô „BI#ŸÏã;ßùðÓŸþ´ÔÃI¤¶¶Ó§OÇ]wÝ…ýèG©ÂÇÈ[o½…o}ë[X¿~}jC=ùË_pÆgì½í"===¸âŠ+0sæÌR…B!„BòRaö–þft&Öf(!\Ù@À‘œµc^((åîG»k) CÛ‡€¡wÖð·% ¿ 0f|5ª‡•cýÊ6X–ôË ¥ §§÷—´ q}7.ù‡ñ1¦PB(MüPÁÚpÚCie¾Ø¢  gÚW^ÂÆ&ü‡n´Ï2”ûM„rd˜Jtœ‰é2ÅS\ŠI/ÉòKÒâÔÝ´¶sŸØˆ®vË}` AûUye‡[‹ŠªLQ*]ŠŠ 2¡—ݦ´ígAPwyKoï´vß!„B!„ì"J¶#ßñ(²Õ߀Q6ΛÞþ|Ó©žÃ}€p눗€2œÙuðYî|RÁMw´ „rfÚÒ™¿fG»kT·Ì(Wt&‰J¬X¼›>ÙïþÛÙ8düp(PJ@™Ç¦[æmKåüÀPžàÛ«kZ?þvÐaÀc”+—([¾ð¢^z  ´TWšq=©E—a’^Ìh¹ˆ×)ÖÖ“c–¿ö1^~r)¬‚‘™4YÅnBføXˆLu²ü¤—¥%Äô'D¥Ô ŽËÔ¶vÏë°z톟B!„ìo0†B!ƒžo¼ßÿþ÷Q(J=”T®¹æ,Y²Gyd©‡2(øÍo~ƒ3Î8£¨sá…bÅŠƒZ„ijjÂÔ©S)ÂB!„BH X°-wvŠ¿84a ¿ÜV¹õôŸ(“&?H·®”Ávu]Giª‡•ÅÒa¤ ØRaGcýz V,Ú©I&II*^Š‹&£ M&,¥Dú(’Hc[ ¶^¤­ù%)¡E{ ØDÇ›žO–IlÜs¢–¼Ü„÷­CW[Á=§‘s,êFU`âÉõ¨¨2c×UªO' $‰Ú}•VÏ–ÀkMa!„B!ƒ•C¡óIعârBäÍÞ¼§øq]ªˆ'ÄøÒ„ž>ÂÉ3fõX˜#FBÚÛ‚>ô©°³©wþt^›³¢ˆLbša™ÄŒˆ%fJ’L4!Ætëzi2Þ¶!„0Á%%Æ9né0¹_ù%I|1‹·¶±ržûÓëxá±7aå­Ð¹ ®© …FdGO**„®Ç®Š0ÅÚ„Ž#vʆÕ5›" !„BR¡ C!„}‚x\p:::J=”T¾ð…/`éÒ¥¸âŠ+J=”’ÑÒÒ‚‹/¾?úÑRå¥l6‹Ûn» ³fÍÂðáÃ÷òΪU«0yòd¼óÎ;¥ !„B!„м½³€[ó°e‚t€ˆœ(¹èÏì¤ 1ñ6Z] ÿaýX&+pä‰usDµÓ‡ _ØPî:Ÿ³1÷ñMxîõ(ädX.)"¬à’T/"§ÄÒU|)FÄ$”\âK&ZReMÂñå]2RÆ‘yº;m<}_Þxy;lË—3Fø¢vôP6©0$“ §¸K1±)&Âô““ a¥‰UJ]‰9[òØ™“Ÿéž'„B!„=…Õó”ÝŽLÍù*x|PÎÄÙÝWÎ\5õx0S†t§Ï†VàÎx´>œb.é,Î^¸ÙÇÂîÞÙÝa Mh£°òõز~.¿æopÈ#)FP†„©”(S@…¶iÊI”&”˜†r%¯·2„3ç3¤!`ze¹#Š2Üù±sBDDÀ‰%¾aÉÅL‘]tYÆO©ÑË…#׬xm ^}n9ì‚ ›À‘WìmÈŒ‘©J‘Q(¨„Ê’’‚vU„‰öáîK»…ö'¡ìŸæ'„BÈ“a!„²OñþûïcòäÉX¾|y©‡R”üàxóÍ7qôÑG—z({¥n½õVL:µ¨sÉ%—`ùòåƒ^„yôÑGqÞyçQ„!„B!„AÆæ36äЙ—’biRiÏU¤·õ_~*U døýÅE /¤jX“¾TšúrH©`kI&^²ÉÎí}xäö5XþÚŽÄ$˜@INgÑÓdâ‰0á>E·½´’a,•Ü&´DD–Ô·ÑÒeܱ*,y± ÏÜ߀î΂Ÿ®¤Á8KýA8êäz”1“E¾fÑd»/ú¹gú_¢ 2;ûlÌØ˜£C!„Bôع÷\Ù ¯ŸtŽÉ!E„P )!E… •,H˜CF¦~4”µ5!ÕÄ©ÓÖÜ…{ÿû¼6çý@I’Mô”•XLX,qdmïm 'z5aQ!±D—ä´š¤$½N¨žˆ·-ä ˜uÿëøëôw`ç­P²‹Ÿöb[Pb+²M‚0‡i0±kä&ÜD¯·,~ýSE˜b÷Xh…­(´=L†B!‚2 !„Bö9qæ™gâ…^(õPŠrüñÇãwÞÁUW]Uê¡ì1š››qÁà†n€eY‰uÊÊÊð»ßýÏ<ó êêêöòw›o¾ßùÎwÏçK=B!„B! ´ä$¦oèCsŸ= !F)GRðd…@zH©ë¦âLX ‘2I 1M>? Q㈾Ԭ …—ŸÚŒçîo@¾ÏŽK/!¡%A2Ñ’TÒÄ“ôtá'ÃDe[ª‰,ýH/"R7Uìqwwðô}ëðÖ_·CZ®8$ŒËvkÆS‹±G×ÂÖ(z-"×QJMlJ•ZŠ‹0ºèn_6uÙxvSÝ–*áO!„B!„ YX|Û#Pv{q&Mn)&DèÒ„Œ´qÞ@áÊ-‘zRù†0+=èX(£ Pv¤#žÈ‚…—žxÞ1}ݹ@r‰H/ád]:1b¢‹™¶$H1þïôE)gbîŠ0!‰Å@d?šî’ ¿ˆ°“$ÍlßÔ‚¿Üþ">yw£v.ƒó)«bH²ÃA8ùEêí°<#¥/Æ HrÒD™~Å—¨„#ìÜÇÈ·?%»JýãA!„}Ê0„BÙ'éêêÂE]„{î¹§ÔC)JUU|ðA<øàƒ¨ªª*õpv+ .ĉ'žˆ¹sç¦ÖùÜç>‡Å‹ã‡?üá^Ù®S(ðýï7Þxc©‡B!„B!¤z,…g6ôa}§ð3)©a%š#cI"ˆõ¬µ>d¼ž']Œ7G\L™b\¹CÚ «W´ãÁÛÖ`Û¦žDa%,½ ôz)âL(±%Ò„p“k‹’*Ed).½ˆˆô’,¿$÷Ó°ºß¹[ÖõÄΓ·_Q•ÁÄ/ǰQåq)ž•—TÒõß&ÔO‘ûlU›…9[rÈ3†B!„²¡ìfä[‚,lK0ÿµÔ–bBLb²H‚øà‹.2½ž{Ì›÷AJdë'A )@Ùm‘vìññŠMøãM3±éã퉩.ŽÌb$.ˆ§³ô—ÐâHM†›#’Do_åü‚P}3ÚN ²xoáj̸óetìèJ`œs%ím0GŒ„Yu¨{=ãrKªàº6Ò?÷Ú/WÒ´óRT„Q VïR:¦ªPê B!„ìCP†!„BÈ>‹mÛ¸úê«qà 78¿(Ä\uÕUxûí·qüñÇ—z(Ÿ)%n¾ùfœsÎ9hllL­wÙe—aÙ²e8ùä“÷âèvŽŽ\pÁxàJ=B!„B!¤ Ù›úð~‹‘’• 1Ñ”—é)1 Cj²8úÔá:¼ ÒFHö°]¥µ9‡Ç~»ï¼Ú—XR¥—´$DDÄûpESa¼‰‰2Éý%Ë/ÉÒK¸®s®Í݆Ym@O§–`´$ác*1ñäz”UÚ3V rRÚ5“áë­ï/E„IjÞl.à•myÈÁý«)B!„BIEÉ.äÛ…Ì­M úb4Ùe`"ER=Oà'‘Ä9nVŽAfÄH»1,øb‡DçÎn<òë¹X<ç="’Àbj¢‰\ S$§Ê˜aQ&*ÍxŸ­/PÒ™üj©3zºKLªIë?Ô&»W'ß›Ç ¾ŠÅ³–CZ2Q‚,@‰m(} „Q$×x×$”NˆIºVA=¤ÆH™|¥L¿W"ý:çÃêz'ׄBÙ5(ÃB!dŸçÖ[oÅW\\.Wê¡eÒ¤IxóÍ7ñƒü ÔCùÔ455áÜsÏÅ7ÞÛ¶ëTTTàî»ïÆ“O>‰¡C‡îåî›6mÂé§ŸŽyóæ•z(„B!„Bv`á¶7哆12.@ørK¤½'¼8Ï|DDŒHJŒ—6cf |î„:rd H1Úb$ÌØ‚gþÜ€\¯­%¹$%‰²J°m¤¤Éøõ `[ñdÛVa™Åý,_dñö½þÆM¯ˆ×éj/àéû°ôÕæX Œ³íô}ø±ÃpèÄ@hçÖMƒ ®Nˆ).Çx×ÅkŸœþÓÏ}äîÛRáåÆ<–îäk !„B!û*|ûS°{—% büy› '‚x)$Ú¯—"áxI'JBå(}”Ñ% A[w"®¤„mÙxeÆr<ñÛ—ÑÛ•KH‚ÑSXaRÒat)Æ4à÷‘˜ £„0 DD~‰ö/öùI‚LóƘñÛ±ñÃ-q‘Å=Ên‡¨* [?I“`’„£pRW–tÍŠËNœ4`FoŸ»÷ÍRÿB!d…2 !„Bö ¦M›†sÎ9;wî,õPŠRYY‰{ï½?þ8jjjJ=œ]bþüùøüç?ùóç§Ö9ꨣðÆoàꫯދ#ût,_¾“'OÆ|Pê¡B!„Bù ,ÛYÀÜÍ9Xr"ÀÒ_”öŒ†Ö.­­/g¸‚†T‘ÏU5v&~±ÙrÕ>@>~¯ݶë{\EhÂI‚x¢I/Ñä•þÒdBI,JZÒåI¤&Ê$}>аª¹s-¶nè‰}i;箢*ƒ‰§ ǰQåîóLQy%œ ˆJArŒ.4éÇ!&é^(rÿ@A!Øï³$fnêÃÇV‰ï~B!„BÙ(:çÂêZPDˆÑ\< %TÇM ‰Hqq&¥^Tž‰‰6ÙúI0ª$¤Õ/dоae#îÿÅLlZÓ”*›˜fXT‰¥Âh‰,fHP1ü—Q$É0ÊV€+Í8ò üt½Ïø:m¢É0~;!ðþÂðü= ÐÕÖŠ´ë#íFd††9äà°£]Kï¥a9fWÒ|RD¨´:FÙÝÈ·=™û¨Ô7>!„Böa(ÃB!d¿aÑ¢E8í´ÓðÉ'Ÿ”z(ýrÅW`éÒ¥øÂ¾Pê¡ô‹mÛ¸ñÆqî¹ç¢©©)µÞ·¿ým,]ºŸÿüç÷âè>sæÌÁ™gž‰ÆÆÆR…B!„BÈn`m‡…g×÷¡×’ý 1zâKq!FKIê+)%FF ~eu“¾4ÃF–»mU,)¦½%¿Ü¹o-h†€'˜$$¼D¤#Ez %¼hBKR*Œ-•›æ’ ½D>7H~ñ>#)­þ1)^½ Ï?º=ÝV<Æ•bF2¿X‡² 3|­¤~ý<9)áÚ% . eI)AEîåKN@G^bƆ{dIïyB!„BÙSX=o Ðþ -_`PRb”Ч²ô'Køí"I$¡”˜H]¼ù 3¤‚Q9Ù‘‡@Ù[]yÆíW“RºÛ{ðä/aÉœwaáD3žÀ’–Ê—fà” eKgñ^¢a;㈠7ÑD˜°ü""ÒŒH”f ½y¼üЫxgî»P–íË?ÞçK'1ÇhBvÔq€Q—\!ÆO’‰ÈIii0ñÔ™¸DS45Æ«£³v"ßúdas©owB!„ìãP†!„BÈ~Ånjɓ'cÉ’%¥J¿yä‘X²d ®¹æšR%•ÆÆFœ}öÙ¸ùæ›!eòC•••øÓŸþ„G}ÕÕÕ{y„»ÎÿøG\|ñÅèêê*õP!„B!„ìF¶öÚ˜ÞЇ¶œÝ¿Ø ‚¤‘pêHB—\býêB…'\ ø,÷˜aㆱ‡Êa<ŖζUX8³Oß·}ÝvX6‰$´@—SŒ4)%žäM…ñ’YeMz‰‹2)©5ZÝöÖ<¦ß»+ïðÅýûÚ¶3î#N†Cª"V´ÔOˆ _‡èµÓå¥b²“vdT’Š÷á]¿¦^Ó7ô¡5O†B!„²cçV!ßö”Ý$†KýI-Q™"6Âeºä¢¥ÄøõõωK1YdG ˜;™wdþûl<ýôÓ¥J¿”——ã÷¿ÿ=¦OŸŽÚÚÚR'Äܹsqâ‰'âÕW_M­sÌ1Çàí·ßÆ?üÃ?ìÅ‘}:”R¸þúëñÏÿüϰm»ÔÃ!„B!„²hËK<ÕЇ­=ý 1žT¡oK¤èÉ/Áó@K‰ñ?/IâK1#­ÄÄSë‘­0bœíµ+;ðàm«±y]w, FK‚ñذ0£×·­¸ c[*A~Idâò‹žã”­ý OüþclÛÔ“"à( ©É`Ò—†cèÈrÿ¡¥Ð¹Ô¥%Mˆñ¥—c¼k—$6éý†dïy f]§…g7ö¡×R¥½É !„B!d/! ›iÁj‰'‚ô'BDäŠôzþ¤9EØPaC†$ H…LÝQ0j G®ˆ$¥xi1›WoÅc¿š…Ímu¥ÄäÃ0|é%$ÌD¤=ÍÅp‹ž c(.ºˆâe†V.üóî½=‘œ»™c`TŽ..Áô'¥&Ç T˜)~Ø}"ßö8”ì-õíM!„ýÊ0„BÙ/éëëÃe—]†Ûo¿½ÔC—^z)–/_ŽSN9¥ÔCeY¸á†pÁ ¹¹9µÞ÷¾÷=¼ýöÛ8öØc÷âè>}}}¸üòËñë_ÿºÔC!„B!„²‡é³žYß‹µí… 1±2ÿA‘bõ4™B†Ë=¦?)¦²:‹I“‡£ntE\Lq×­L»ë,y¹ @$f’`yF@À=;wîÄ×¾ö5,Z´¨ÔC!„B!„²—°ðÂæN/(œ4¢  €@¡5‚m¥\Ó‘z€RB(_(PJ¸]((áõ(¡ÜOn ømœ‡cÆ? 5u=ظªÒŽ )ŽñÚì­Øøq'.üö8TVe´ôg¼ÂpÆèôíŒQ ¥É3 Âp¾‹'«D‘¶J”^BNL~‰Ë3m;óxqÚF4oíóŸADHÊd Œ?®CG–îó5 îAh“{I|ya!("=!¡,QŽr%m½¨)‡w[ø !„B!äÀEÉ^äÛCvèÅ0+&9efÔ€ %†:sU¥¥•ºi·ž3oÕzp焟wÂ[{sA}®í÷ï·qûDÙQÇÂj[ÕWa”ùý8Ÿí|æ;/¾‡-oÃÙßý2*ª+!Ey¢‹3ÿ7 @™J (ÁÚ-“`p„ø KNƒ1ã¢)’…›æ†&¼ýÌ[èëîƒ?± Mš©Ú‘Z £rb µ€hbŠ{–C}ÇÂBSp#¬]»§vEB!„B9@YÔ”Ç+[sŽl¡’B”›>‚P*ˆ^Ï{yj,F†ëúo§Õúõžû2h$ÅíFR‰I“‡£¬ÒLLˆ‘¶BÃG]xð¶Õظ¶3%­EDR`RR] K…±m[ªPÒ Ü¾à§Ë ’Bï{õ»mx⮵hÚÒK»ñ–ª¡N"N͈òðùð®‹{®œó®%½Hí\ûõ‚ë!ÝóO|âI?É"ŒÞAs7÷Q„!„B!„P í3`u¿‘ @H­"i0ñz‘=åÄ/—Z ‰tûõRGô¤·›^âµËÔ ³6 i·j &úgIl]Û„é·Î–U¾ ’šc&‹-~2LtQ †Rgüv)⋾¬zå¼öèBôuöh 0^úŠ“#ÕVdG £bdP®´´¥˜9¿¡ôí:…Ò`ôòˆ0~ŸRvùÖia!„²Ç  C!„‚çŸS§NŶmÛJ=”qñÅcùòå˜2eÊÿ¬B¡€ë®»_|1ZZZRëýã?þ#Þ|óMLœ8qiw°dÉœvÚiøøãK=B!„B!%äý–žßÔ‹¼–i"H dM’Ð… ]¼ÐëF™"Åh"'Âx2NEUÇœ6î„” ¶DLŠél+`Ú>Áë/l \9%,¤@ bŒaFÒŠK*ÊRáöiÒ‹/ÅÀe,[aþ3›1wÚ&äzí˜ÈãÉ6¯ÂQ§ G¦Üð¿»/ùç,,Á„©_+ømÒ¤_vòúIodô:)…KáÙ ½X×i—öæ%„B!„A†Õ5…޹€´#ò‹L•#à ¾\1ôz^Ýäò@Š‘šÐ!µÏ¤£|8ÊF`kèó•&­äºz1÷Þùx{ÖR¥`˜ÀbêÛžÔb",͈4Fºr úY‡%œ|W=ü V¿ú!œ_ èçNºcÏC”íDÙÈc!D&øNJ;Úvš[d¸mèˆGÈK!aF»¦~»ùÖG óŸ”ú¶%„BÈ~ eB!„0,]º“'OƇ~Xê¡ ˆÃ; .Äõ×_ïÆDï~pÆgàŽ;îH­SSSƒ'žx÷Üs***öÈ8v7Ó§OÇÙgŸ;v”z(„B!„Bë;mÌhèEwAÆE—XjH8$&X$¤Ä/K ×O’b¼µRÎy¯^†cNêú² GKĉËBºè¢¥éhòŒŒ1~J«­£_ÃjK·éëûÐQP%»O !„B!d_@æ×"ßú”Ý•ž“$R$¥Ä(=õ%"Є¤˜°Ô¡§Ë„ËÐa³®J¶hǃEI…í Û1ëöç±åÃM®ô?&šà¢/Å“aÒÛyb€Â꿾7ÿò*rÝ}ÉýI …mÈŽ< ¢lDXþÑ©%çèr‘ÔE%˜¨t” )ùß+é:ËØu–¹uȵ> %;J}›B!ä€2 !„B8ÚÚÚpþùçãá‡.õPÌùçŸ+V`êÔ©Ÿ¹¯\.‡k¯½—^z)ÚÚÚRëýË¿ü /^Œ &|æÏÜضk®¹?þñ_¶B!„B!: Óú°±Ó ‰.Á¶»–aIB—gôºz¸‘$ÅH-E&$ÂhÒ‡&Æ”É`âäzŒ;$ôtY§»£€iw‚…³¶B)Mf I1B“Yœ²$FYðë!!F_[‰—žÚ„ŸÜ„|Ÿ­¯`œBO¨ÆQ'ÕÃ,¾°<›¤BçÀ?ž Áx×$xöFiÏîé1A}¯MDfRÁ8£BÌšv 37ö!gów „B!„2¤µ ùÖ¡ ÍQB†Ä•PrŒ&Møu#bŒ/VĤ˜Hýs”wÜkcŒl=²#‡2¶…SU4Ù#ß“Ã+üKg¾ („Å3,±x‹òe`R©ò‹ž“ëìÅ[þë¯ '¾¤#¡d(oCvÄ1€ÈD`$Â2.ºx²D(A'$ÁD’zB×+œúâË6Å€¤„Ýó.òmÓ•+õíI!„„L©@!„R …®ºê*444ছn*õpÄÁŒùóçãç?ÿ9~ùË_BJ¹Ë}´¶¶bÊ”)X¶lYjaÆáÏþ3¾ño|–áîUº»»qùå—ãùçŸ/õP!„B!„ rr¶ÂÌ}8ûàrL–uKá<àá&¢øe€óЇpÞØ*@ @8u„³)œúÊÝöê)wÛi ÷3œz•X‚}x})gc' EM]6|ØÛJ5ðƼ&lZÛ…‹¾;ÕµY7ÑEî[f¡9eB§!´>l©Rä—°³£©/<±­Íé¶dË ~|-jêÊ ¡éœMÀPÜq+ïÜ*PÐ÷#Ç” Úª /ånèíUB˜ãn/Ý™ÇÛ ¼ƒ!„B!„x(»¹Ö‡PV{)Œ²Ã! ´—2h5ù3ÂsQ¿®[Ç™oÊ™h»skmë·qê:/tðÚ)îtêÕq'†ÂDvø1°:×Av—¢ Ú‡;sr«_ýÍ Û1ùŠ/£²¶ ʤr%0”€a¸CJú›½’N²ŒáÔ3ôµé¬w~²Î~…¾œ÷µàÍœ½‰¯B;2Ãêa” ¤½nÒÚ¯£½±"4WZ{mÒ oΖ`ܱDÄo^®—Y]¯Âêy}@÷ !„BÈîBð­Ùƒ !ÄÕî.õ8!„‰«®º ÷Ýw²Ùlÿ• óçÏÇ·¿ým455íÖ~O=õTL›6 ‡~øníwO²mÛ6|õ«_ÅÒ¥KK=B!„B!û_Y†SGeñ"$~xÏÄ„Å÷am;©>ür§_ÿùšhnÅÐ~¤È÷Úhx¯=éÒFÅ_¹â0|nÒP'qE"HTq×V^âÞ_}k[Y•Áÿ<†!œT÷A}ýáÒV,œÝ˜,å¸ ^†qÇÕÂÌnIŠ“°ï>{b$­Ìª6 37ö!gËD¡Â“XtÁ%$uè²LTŠñeÈ!Æë'AŒQºãÔ…>²‡ŸP 3#R¿ÓÒW›ñÄ]kÑÑVÐ_ȤԤ ä™Ûú0ík±æý¶ÔvÙ Ÿ;©#Ç ž»‰H>q1H“YBçáã2Øö$ï|)í<…ê%‰L^ t$ž^߇Ýögºw!„B!„„±º_C¡c ì°ä¢t©C\´I¤&d„¥É *MþúHc|™D—c d‡O‚Ò ){ý6žØâ %ë¯Â«˜ƒÞ–N˜†€i ˜î $’$áÉ0þ´|¼Ëœ‹ÎÆÚ85FJHÕ ³®fÍøÐ÷ ‹=ý0Ú:‡¢bQ1 FOƒ έwNµ_–@YmÈ·>Yàßë !„R:(ÃB!„¸x)#Ë–-+õPŒaøÉO~‚ àCÙåöS¦LÁŠ+pÑEíÑí9~øaœþùûTš!„B!„ÁËænÓúБ—¾”¡§Ä(© ¾ÐȾؕbT$õ$Q RLŘH¢ŠTÀÐå8òÔz šþR‹m›zðèkðñÊv#,¸¤H3N½ÞnÅÓúí-ùÔ6CG”ã¨SêPY›õšñ„ =Æ[Tì|¢~Ž¢I0~ûH‚LXR*ž£°£ÏÆÓ }Ø™“Ÿå–!„B!„’‚{ù¶i€ì 'š¨þD –:¢RL$1FÉHZLš«îǬ‡ìð­ÚXÃbLÛ–xåÎYh|¿AK‡‘T˜`ñ$H‰õó—aÕ³¯£Ð› 0!‰&³e£ÆÃÈ KNÅñŸ~ÿ»Êä~ücúùVÚµI–Tì¼Ê|#òmAÙ;J}»B!ä‡2 !„BˆÆÖ­[qæ™gböìÙ¥Ê.qæ™gbÅŠøÊW¾2 úB\ýõX¸p!ÆŽ»‡G·{ùùÏŽ«®º …B¡ÔC!„B!„²Ñ’“xª¡M=2$WDE ½<&d$H1¾ ê#žã׉&ÆøŸH9R)dË qÒ0Œ8lHêwÊõÙxþ‘ øës[ ¥ûÖÚ"2 \ &Ÿ·ñÒS›ðêœFØ–J«Š1ªqØñC!LÈ:¡ô–þ„ö=ÁÈ—ô¾"çÜ¿6Z;çü$$õ¸ç~c—…g6äЕò!„B!„ìda=r­CÚm¡„/ FéBŠ/·hi'IRŒ.k$Ê"IbLT Ë1Þç s(²#>d›ºvDV‘V_ËžXˆž] ¸ÂK±d˜|{V>þ2¶.[–‚üEA©>Õ]ÈÖ(Ãý.aù%gTÊwÒeŸhNäx¢ã%áè×D…ÛhíìÜÇÈ·?%»K}›B!„P†!„B‰ÒÝݯ}ík¸ûî»K=”]bĈ˜={6n½õVd2™Ôz#GŽÄœ9spË-·­7Ø( øû¿ÿ{üìg?+õP!„B!„ì§ôX ÏlèÅúN;2ôT’¨Ü¢‹zÚKDhñS^´´’¤´˜@üÐE›h_*x®ÀAGTaÜñµ0³éòywÉNL»{-Ú[rF² #à.Í[û0ýÞuødUGje&Æ¡õ‡VFR[¢i.ý 0ÊßÚ‡e#¥']‚Ñ™ 5'R®‚þW¶0{syI†B!„BöÊÞBÛÃù­a¡CK"QÚ~¢£ 2*½ÄŰ“ Ä$lûi-2u“ jz!U_$í%h³ñ­ÕXr÷,ô4·%Ê0Pm«7`å#sѽ­Å/דf””P¢™újC‹/¡ïXŠ 0‘ó+ÎÞGšã·ÓÚ¸Ÿiõ¼ƒBÇÓ€â‹+ !„28Jñ—þƒ !ÄÕö­'o !„ý˜ÿøÿÀ­·Þ !н6uð±dÉ\~ù娏qc¨|êÔ©xüñÇqðÁ—hdŸŽööv|ãßÀ‚ J=B!„B!À™•Ḻ,„€»8¿ð¶=yÚv¨Ž»lÂù'ÖÖk¬EB™S®ÿŠB«ŠBNb˪Nô´§?RVnàÌ Ƽ›cÇ*«28ñ´áxsÁvÈ"ÂÈÐe3±¦) × þܤ ÿéÉÛöþ¥Ü”{Ð?îÕQz ÕÅëÃ?æn{â‹×.a‚6o6°t'Ô!„B!„’ ²ÈV FùgÞ¬Ovµ}ÿ˜?‰vçÐÑúÞ¶¶áÉwÂÚÙöçÔ¡¿ÿëuœcÊꀵ³°‡!tPß4 Gñ(·ÜIO ¡Â;¢¢™º£Ãúõü mP¬OžÃçPÝ ^h2í¯U0©&Ñn?JÛI0 $¬®°ûÞ!„BönUJÝPêAìi(à 2(ÃB!ƒË.» ?ü0***J=”]¢¥¥ßûÞ÷0sæL†ÿûÿ/nºé&˜¦Yê¡í7nÄ\€•+W–z(„B!„B0¾PŸÅ”ÑeÚ36¹%E„ñÄ—h;ÿ8‚¶A›¸ãÕCb¹¿H1 hÞЃ{>ëW! ÑGT¡nL…ö ÷°MP/IŠ ?³£žÝ Ë,ÐD§I²f|áÆÝ¶°`kwX»÷dB!„BÙE2Uÿ fÅIàRTŠ>Áö·…¿¾±rýDÄ—ØK1CûVëj¨Þ:øBÕ‹½P3Y†Q"s¨‚YuX上lFä};"¨éÅ_»u•Š´ëW‚ÑÚÉ ]³ ókŠ|_B!„ B(ýeB!dp2eÊ<÷Üs1bD©‡²ËÜyç8æ˜cpÎ9ç”z(»Ì²eËðÕ¯~[·n-õP!„B!„ |®ÆÄß\ŽŒ—[D‘´—t&,Ôøu¼ÔSe · ÷„cÞ~wk«»`$ve•&ÆL¬FEuÆ/‹þyIÿ{S4ý%^`t©Åk;^D‚ÂBŒ³ænÉ¡±w÷œB!„B!Ÿ³âTdªÎ‚7ù&QŠÑRbBí¼úEÖ"*ÄèÛ±‰x°¯ÏµížM°Û% Ê¢LnbŒÙ†ÌðC 25N©.º„6U?ÛZ"k&HÑÖýI0~[·Žì†Õù4¤Õø)¾7!„BJ e²÷¡ C!„ ^&L˜€^x&L(õPfÏžo}ë[èîî.õP!„B!„àTià+‡–£Ò¹EDžÙ1)&e´äÄEšà™œpYðlN‚0£}›­•—ض¦ =í…ÏôÝkF”aô„j¦×¿ ‰0ñ—Ô&È/þvT€Ab Œ×´åù70B!„Ble‘­º0²(.ÅŽ˜$ëo¤ðæÃÚD9M"r ™xGŽ;Ês3` ûßXAT¶!S?P†_¦FxbínhÛ1ùEߎ¬c)0F©H› JAÙ;Qèœ%Û>Åw&„BÈ €2 ÙûP†!„B7#FŒÀsÏ=‡)S¦”z(û5øÃðÃþ¶m—z(„B!„B ¶LàÂC*0¬Ü“Ut&YŠ ‰0¡gv1&T}^G/ó’&È$в©;7õîò÷†ÀÈñCP;º@øÙœ`__ܘü¢—G¯‹TIfŒS5¨»½×Æ [òèµù÷/B!„B¬™C©þ„1$žø’ÿÅéi1Nµt&YŽqÛûIû VÛj¨îÚètDf£r¬Þ b;!Ç%AxIÛÖo?A„ ¥Á8ut P…MÿŸ½{²«®ïÆÿÙ3“`J@‚/« KV˪V•ǵñQ­-¸¼×ÖÒ»@Û&.—˶ËvÁ²]ÈÒ®´®Öâ¥Ô´è<€@Ëõp3” 0I&™ëÙßßgÎ̹ÍÌIrföìÉëµÜsöþîïÙû³'üá7ù¾÷7F®ŒHC='0 Ã0÷„a`þ[²dI|ë[ߊßþíß.º”'¥þçû·[t)ÐbIog½ô¨xñÒž˜|ñl›•b¢éÜD[cH¦93ùYw͉µãö™¦n “{†öŽÆÓ¼£ç\´´7^¼jY,>º·a²MjÚi=n ¿Ädx¥µm<ÄRß¿é¸a•˜©B0µë¥[*qÓΑóO_ó^Ösl,ZöÈz_Øli ÅÔÎÕ¯Ó|®þ³®O»Ucš÷Û·eÆUyÿh¤ü¨éŸoñÞè{áK#ë]Öæl㪫զ)‚/õÇucãÖ·JÔú¥öýÚfšC0‘"òá‡bôÀµáÅ•PrÂ0Ì=a(‡,Ë⢋.Š?û³?+º”chh(>ò‘Äå—_^t)0¥Þ,âí/^¯:¦o|Õ—˜2Q›—Ó¼2LtŒ©ûQ?§m@¦©­ù°2šâ™Ç÷ÇàžÑiŸoÙŠÅqÂ+ެ§úíö/¬m\"¦¾Ï´á—¦`ªçš1“«ÀÔ_oºLJ÷÷Ŧ]£á_½J$[‹^ð¿£§ïe“Á–º·Jdõo˜˜bÕ—)Wƒé$Sß?:oK•QyvG¤‘åm*E¶loô{r4ܨÝ<Í™Úê^ÑøfŠö+ÀTûN± ÌxÛ丽é»)EehsŒ ý¨Í3%$ Ã܆€rùÃ?üÃøêW¿½½½E—Rj»wïŽ÷¾÷½qûí·] täô‹âÔöUƒ/1U(&¢¶ÊKCàe¦`L}ßhœƒ3U@¦á|›öš=OEÿχZæÛd=YÿŠ¥±ì„Å'RÛݺy6õs¢Í~]¯¦‰9ir®NCÛņ~©i®N5“§ˆÍ»Fãþþ±ö À<×}GŸ½‹ÇÃ#Í«½Œ¸³i1­Á˜ºï·¶'ö2/†b&¤Ûóhäû^=Õî½ÃÑ{ÜâèYò’é¹e嗉㧛ãõo¢h ¤ÉÁuëgý*0õm «ÈTbôÀ‘Ü7}Ý@™a˜¾¢ (³õë×ÇŽ;bÆ ñ‚¼ èrJéÑG5kÖÄc=Vt)бM»GcÏhŠ7¿hÑÄê/YŠHYŠ,U'ऑeiü³^I‘Æ?#²”EÊ"²”Æ?#R-S»VŒÏO¿Gm¾K–¥†¹2µù=)vZ3Çœ¸$Žú…¾Øõø¨Œä±hioœðª£cÑÒÞ‰¹0u—nhh~ÅZãüœÔøÝ†ý¦`¢}¦~Ï”!˜ñ§’ƒe IDATý±<âÿ>5ÛöWÚþPc1vàêHùžè=êÿ«Ž|'Éã˜i¼-˲h·|¦‰ãê¸9Òø|"Sk«]³Ö ܉PMCh¥uUÖ¾c~9ò£vFåÙ}#ÑwüË#ë}Aó`9¢e4Ý´ÚKÃî”ëÖÕ_êkló™¾×‚I)E¤‘;pUäcÛZj˜ï¬ 3ÏXÊéu¯{]\sÍ5qâ‰']J©ÜvÛmñÞ÷¾7ž}öÙ¢K€CrÒ zâÌ‹z¢qe˜¦Õ`Ú­3yÜ´bLÔ?«ŸgÓØ'ê&è4´Í\w>–â¹m¢gQO÷ò%‘õLý¥vÿ”Ô|©ÛIu_jw3s¦ú™šæê¤†ë¨äñvŽÆ3CùÌ @)ô,:5ú–ž‘¯´Ò¼JLÃj1õ+Á´ ²¿“ãñ†óuíÂ. ÓµóሞÅÓwJS´¬øR×8]ø¥ñm Ÿµ1ôTA˜‰±x>cû¯ˆ”ïšæá€’:"V††™g„a ¼N:餸Á~¿ò+¿Rt)¥ðÿññÑ~4†††Š.ËŠ£zâ7_²(^ÐW›¬Ód™œ“S?§M0fâÇ4ᘺë6h7g§åÜô)™Ô4Ù¦õ|óNûàKs߉Õ]jMÓ`jÇíV“©ïIqýΑØ7ê߸šžÞWFßÒÿ5.‰ê¸%S7Hž*S¿ß®-¢1 Ó°;CÛAk~©;hȺ4u§ ¿T´]¦ÍgJ“ßM•gbìÀ•‘ÒÀ¡?0Ÿ Ã0÷„a Ü–/_ßûÞ÷âïxGÑ¥Ìk_þò—cíÚµ­‘%µ¬/‹ÿyââ81ÈÒnµ˜h Æ´kkŽ©kšâ¥µYkÛa˜ µ¤6m­Çõšæ9:m0õA™¦Ìø kúìÌãÆ§FbØ‚0 VÖó¢è[ú¿#ëYÖhÉZVi¿L69¯»ðTû?šNO3ºžià=í?…§hý§òÔ<À®;Õº2Lj ÄL€iX&"ÛcC×D¤‘(1aæž0 ”ߢE‹âë_ÿz|üã/º”y§R©ÄyçÿðÿPt)Ðu‹{"Î|ñâxÉÒž¶«ÁÔb*cª}[Ú'›kWkÿÂÚ):Ôü"Ú6©®µÍ¼œhžÜÓ²Ìøv«ÀÔB0õá™Ç÷UâG»G£âŸ¶¼,û…è[ò¾Èzo]áeÊ`L»Ïê~V·ß0VΚÎíB0‡½:ÌT+±¦Ö¶†ôä—ZÂ/õûm0 ƒêZfô¾)"¼e¸#" ÓWt Íèèh|⟈­[·Æ_þå_]μ100gŸ}v\{íµE—³b$¸~çHœ±¢/^ý }‘eÕÉ*Y)‹”ED¤È""KÕ½ZŸÈªmµ•dRŠÈ²Ú„—êõ³lüÛir®NmÕ”Ú\vój²ƒœ¬“Z¯2q­©çè´¾Õ¶yõ—ñKÌ€i|amõº÷öWâ'ÏÔsP^)í‹Ñ¡ Ñ·ø]ÑÓwÒø 85|¦‰ãñ1t\§,ËYmÌZ;_ݯŽ×ëÝa“†¶†Ãy°6m×NõÇS†_ê¯5E¦ö9þ½±‘Û#½óðŸ`ž†˜%õWÛ¶m‹ú§ŠE‹]N¡vîÜïz×»âî»ï.º˜UyЏu×Xì‹xí±½ãst²È²4viÆDÔæêdãŸÕöÉù8Õ^í2Õóµy-YC[͔ᖴÎÑi ½4÷›:üRWK›¶ÆÖV*yĦçÆâ‘}•C~J* ÇØðFozGôôR7b&ƒ11„Éj𺶈ÖýÉ€L4 €›‚2uíõ3×ß²3yª)ÓÒ·þ¸e¿~lÞ&“šûEeøÆÈ+[:, „afÑ·¾õ­xâ‰'âŠ+®ˆc=¶èr ñÀÄš5kâ‰'ž(º˜3w??ûFS¼iE_ôŽO°É²ê-)ƒ1“ósRÓËkÇû×Vމºy8ÙäŠ/“¡™æ·ÈvWûLÝ='~Ôï7­þ2±ŸÚÌ×Iõóub$OqË®±øù`ÞíG 4ò¨ŒÜ)ß½‹VGmu—öÁ˜ˆˆ)« ®ëV‰Éóãñˆ†•bbâ£.(S3ÞuKS´kŸ"3cøeâ»i2h“"" ÅØÈ5‘òŸdÑóŸ0 À,»ùæ›ãMozS\{íµñŠW¼¢èræÔ7ÞøÀbÏž=E—sî±JìKñ¶-Š£zêB01¾ÚKmBNÝœ¬]8&jss²‰PÌD $›œšÓôÛ‰°Ì¡J oêÛwZ‚/õÕï·®h“&éÔ¿¸6ÅþJŠ›ž‹çFf!Õ@éäcwF¤½Ñ»èí©/R-à2þ9x©½I¢’‰¨ ÇDÔÝ/”˜Xeµ’ïSßÍí#MsØ.\Ó´"kë@ºq?Õ·ëÞ0‘"RÚ•‘«"¥ç¡n€ùO`<øàƒ±zõê¸æškâ×ý׋.gN\zé¥ñ©O}*FGG‹. ³s(kwŽÄ™/ê‹e}Y¤úÕa¢~~N6ˆiމÚÜœÔúÂÚ‰ÐÉd*¦!,SÓé|éÂ/©¥­õ8µœk ¿ÔŸ¯›¼óühŠŸ‹A&å•-‘Ò@ô-Z‘ŽW1iü3ÆÇ×Õqfs8&¢6ènXi¥.$ѸòêdXf¼o³æñöŒCÙÖ—EL´w‚©þ˜¿Ôµ5ažŠ±Ñk"ÒàL”VOÑ)žzê©xË[ÞW_}uѥ̺/~ñ‹ñ‰O|B"¢4ÅžÝÃ)Rž"OuŸ)"Ï#RJ‘çÕ­º_ë’§Éþi|¿z\;_ÛÆûä“}¶|òüT[>Åw[ϯâ’W·ês4ö©=Wí\ësÅÄ3U?«ý6˜ÇuO ÂÐVÊc#—GÊ÷Ô—-Ÿ)ÏÇÇšÕÏÉAjÞ¸_?H­;n/_/Õ¶Ô¸5¯›Ï×¾—×Õ51°®¯¥]©©¦¼î™òº¿hüä•ÇbläJA`ÁËRkĘeYvnD¬/º`öôööÆ%—\üÇ\t)]722¿÷{¿ßþö·‹.æ¾,âß/[šEŒ¯S· Ëd[u7¢a?kiŸhm³êKVߨéª05 /œm¿TLskýuÛ½¼¶aõ—úkÔ­"óè@w<_™ù%ºGGoß»"Ë^49n®$·ÛŸ€WÖ—›Ü3µªvó5ëWy™è’ZÏÕ¯fÓ¸ kÔÆãy~oä•Û¢uäa.J)­+ºˆÙÖWtGšJ¥çw^lݺ5¾üå/GÖí¿<+H¼ÿýï›o¾¹èR`^K7ï‹7Û'/뉔Ed)"ÕB0)UÛb|.KV µÔ&ÁdY㜙,«Í‰ÉÚª½-]Ñ8_'µÌßi«“¦loÄDÄ={*ñÀ¾¼;…p8•±+£·÷ÙʈHãƒâ4þ1>èŽlr`:©îW‡­õñÚùº LKx¥ƒ—O¤)&[SÓù鎧؟ÌÁ¤ˆH‘Wn‹<Ý7EQ 0 @Aþîïþ.¶mÛßùÎwbÉ’%E—sX¶oßkÖ¬‰|°èR`^Kqg%ÆR¼nyo5Ç’ÒÄ$›Z8fr?EÃü›ñ‰;ótšú49”÷p´»N­þæy<©i©˜)Ã/ã “suRä)bÓó•Ø6赬±¨T®‹žž7GOö+ÕÁl6þR‰ê :&Â1µPLC@¦Öoü|í8êÇÅÍá—CxùÄTá˜víÓ„bÃ/õûcQÉoŒ”¶vXÀ P ï}ï{ñä“OÆ÷¿ÿý8ᄊ.çüøÇ?Žw¿ûÝñÔSO] ”ƃy TRœ~loôõD¤”Õ­ôR ·L¬1‘hÉÆ“&µd¢zX7og¼_ݽ¦ ¶t"ÕïM³LãñTá—É/¤1’Güð¹J<3"À¡J‘ç?ŠÈöFOÏéuƒÐñÙ䊫ƒíHu+¿4†`êW_¸P6¹;õr0ík›î°¡±]è¥v¢þ¸e?•üÚH陃¨ `a†(ئM›âôÓOk¯½6V­ZUt9åꫯŽ~ðƒ±ÿþ¢K€ÒÙ1˜â@¥ÿã¸ÞXÒ;9Ù%›xYmV7'gW‰½cÓÈÓ½‘ò}ÑÛóŽh˜Ù°ŠÊø‰€Lí8êÒã£í‰tÖ46NÍÓšò½Í+ÏÔµ7·Íðv‹ý‘W~)öÎP ÀÂÔStD<þøãñÆ7¾16nÜXt)ûÚ×¾ï{ßûaà0ìIqÃî±Ø;š"¥j &Ï«ó]ò”"Ï«íym›8WÛR¤¼ºå ý&ÛS^=®n1ÍÖæ;m®9Ù^­%å1Ñ'¥Éó)MÞ/Õ=Ëî‘•üêˆ>´gX úfîÀ\Ž~ðƒ±mÛ¶X»vmÑå´Œ|ä#ñ½ï}¯èR`AÎ#ny>ÓŽÉâeK²È"‹ˆñy1YŠ,&çÈdÕS‘RÖp,K11¦Í|š,kmk6Ó<œÖó©¥­þ8EŠñÿÅ£ƒ)îÝ—Ú•]“boT*WDoÏY‘e']NWåé¿#Ïï(º €yA`žI)źuëbëÖ­ñ÷ÿ÷ÑÛÛ[tI±k×®xÏ{Þ›7o.ºX*)âö=)N‹8ùèˆÈ¢‰IÕÜKÖŠ©…djšÃ2“²†ó3kìØî{©©[ªýLMWHyDÜ7âÑA1æÊpTò«£·çí‘e¯.º˜.È#Ïyz¨èBæ a€yêÿñcÇŽñïÿþï±lÙ²Bkyä‘GbÍš5ñøãZ îÛŸb%ů-_!&‹ˆ‘EŠÚb0!™‰ƒl"Ónõ–è`U˜Z×éO¥6!˜h‚©®SIwîKñäH‡÷€®©D%¿!zzöEOöÚ¢‹9 £QÉÿ+Rz¢èB敞¢ `j×]w]œqÆñä“OVÃÆãôÓO„€9ôøPÄm{SŒä)Rž"¥yJ‘çyDžª[Êc¼m¼OÝ–j[Þá–êîÕ|­2sßLJ#Â@‹{«˜ôä”}òô“¨ä7EÄ!,Õ @Ç„a¸JЏkÄ£Cíϧˆ¸ÿ@u“ƒ€é G%¿:Rz´©=<¿9òüÎBª8Òô]sãÿ FÈ#N=:"o«¤ˆïØ9ZhiP"yTò£§g_ôd¯‹ˆ‘¨äÿ)ý¬èÂŽÂ0G­ÃƒyÄ^1›"ž+º*(Ÿ<¿#RÖ»"¥çŠ.àˆ" p„yj4â‡û"FSu¥àФôpÑ%‘„aŽ@{*EWphzŠ.:% @iÃPÂ0”†0 ¥! @iÃPÂ0”†0 ¥! @iÃPÂ0”†0 ¥! @iÃPÂ0”†0 ¥! @iÃPÂ0”†0 ¥! @iÃPÂ0”†0 ¥! @iÃPÂ0”†0 ¥! @iÃPÂ0”†0 ¥! @iÃPÂ0”†0 ¥! @iÃPÂ0”†0 ¥! @iÃPÂ0”†0 ¥! @iÃPÂ0”†0 ¥! @iÃPÂ0”†0 ¥! @iÃPÂ0”†0 ¥! @iÃPÂ0”†0 ¥! @iÃPÂ0”†0 ¥! @iÃPÂ0”†0 ¥! @iÃP}EyŽ>úèXµjUÑetÍÃ?ƒƒƒ3ö[¶lY¼úÕ¯îèš÷ßT*•iûœp ñÒ—¾´£ëÍwyžÇ}÷Ý7c¿Å‹Ç)§œ2ÍÇ<öíÛWtP*Â0Àœ;õÔScÓ¦ME—Ñ5¯}íkãž{î™±ßë_ÿú¸ùæ›;ºæqÇýýýÓöùЇ>_|qGכ‡cÉ’%3ö{ÉK^wß}÷T47Î:문þúë‹.(©/~ñ‹±téÒ¢ËèŠë®».n½õÖŽúvúÜ—]vÙŒ/^8á„ⳟýlG÷-ƒ¯ýëñÓŸþtÆ~ŸùÌgâE/zÑT4û6nÜ×\sMÑesLJè‚ .ˆåË—]FWô÷÷w†éô¹ï¹çžÃ0Ç|¬]»¶£û–Áõ×_ßQæSŸúTœ|òÉsPÑì[²d‰0 zŠ.:% @iÃPÂ0”†0 ¥ÑWtÀ¶hÑ¢èíí-ºŒ®Èó÷îÝ»ã/þâ/ºv½²øÚ×¾Vt ‡¥§è SÂ0”†0 ¥! @iÃP}E,l£££1<<\t]q0Ï122ÒQÿ‘‘‘Žï½P~£££÷[(ϼPžæƒ,¥Tt ÔɲìÜ2ó IDATˆX_t0›^ùÊWÆÚµk‹.cZÏ>ûl|þóŸïê5W­ZŸùÌg:ê{ÁÄààà´}Þþö·ÇïüÎït£´Ys×]wÅ?ÿó?wízÇ|üõ_ÿu×®7FGGãÓŸþtÑepdº(¥´®è"f›0Ì<# À‘`õêÕ±iÓ¦¢Ë˜ÖöíÛcåÊ•]½æ[ßúÖ¸ùæ›;ê{ÜqÇEÿ´}Î?ÿü¸øâ‹»QÚ¬Ù°aCœsÎ9]»ÞÊ•+cëÖ­]»ÞlŽ%K–]pؾ}{,_¾¼è2¦uÆgÄý÷ßßÕkvúÜ¿û»¿W\qÅ´}~ù—9îºë®n•6+öìÙ¯xÅ+ºzÍ;ï¼3V­ZÕÕkvÛoýÖoÅM7ÝTtPFGD¦¯è€ƒ·|ùòy†éíííú5;}îÅ‹ÏØ§··wÞÿgÃ1Ç3ïŸ{Ñ¢EE—Ìc=E† 4„a( aJC€Òè+º`a{×»Þ¿ú«¿ZtÓºå–[bóæÍ]½æ{Þóž8å”Sfì÷àƒÆUW]5c¿ßÿýßã?¾¥ÍšË.»,vìØÑµë½å-o‰ÓO?½k×› wÝuWÜtÓME—PJ=ôPœuÖYE—1­ÁÁÁ®_ó¾ûîëø¹fìså•WÆ–-[·¬Yµsçή^ïé§Ÿž÷ÿíT*•¢KŽ{öì)º„ÍÆ©Óç™±O¥R™÷¿ÇÙ¨oïÞ½óþ¹GGG‹.˜Ç²”RÑ5P'˲s#b}Ñu@·\zé¥ñ±}¬è2¦õ¹Ï}..¼ð®^ó»ßýnœ}öÙ3öÛ°aCœsÎ93öÛ²eKœ|òÉÝ(mÖ¼ímo‹[n¹¥k×»ð cíÚµ]»Þl¸ä’KâüóÏ/º ¨¹(¥´®è"f[OÑ@§„a( aJC€Ò† 4„a(¾¢ ¶Ë.»,î¹çž¢Ë˜ÖÆ»~Ío~ó›±yóæû=üðÃ]ïoþæoâ…/|áá–5«{ì±®^ïê«¯Ž§žzª«×춻ᄏèJkÉ’%±råÊŽú>üðÑRšÝ‚æÈÑG'tRG}yä‘Èó|Ú>Çw\üâ/þâŒ×ŠmÛ¶utßùnÑ¢EñªW½ªè2ºæ‰'žˆýû÷]”J¶Pþñh¡È²ì܈X_t0›V¯^›6mê¨ïÒ¥Kchhh–+šo}ë[ãæ›oî¨ïqÇýýýÓö9ÿüóãâ‹/žñZ÷Þ{oüÚ¯ýZG÷ïV®\[·n-ºŒ®9묳âúë¯/º  ¤Ö­[K–,™±ßå—_<ðÀT47ºùÜ+V¬ˆóÎ;¯£û~å+_™q¬^çw^¬X±¢è2ºbóæÍÆÖÐ袔Һ¢‹˜mV†€Z·n],_¾|Æ~[¶lYpa˜n=÷Š+â‹_übG÷½ôÒKTæä“O.ºŒ®¸ä’K„aàÔStÐ)aJC€Ò† 4„a(¾¢ ŽWt ‡¥§è SÂ0”†0 ¥! @iÃPÂ0”F–R*ºêdYvnD¬/ºè–åË—ÇÒ¥Kgì788{öì™ƒŠæF·Ÿ{ÅŠÑ××7c¿½{÷Æ:ªq¾[¶lY,[¶¬è2º¢R©Ä®]»Š.€…Һ¢‹˜m3Ϩ8 {öìYP!—Nuû¹wïÞݵk•ÅÀÀ@ ]0Ïô]tJ€Ò† 4„a( aJC€Ò† 4„a( aJC€Ò† 4„a( aJC€Ò† 4„a( aJC€CÖÛÛ§žzjœvÚi±xñâ¢ËŽÂ0² 6Ľ÷Þ›7oŽÛo¿½èr tŽ=öØ¸à‚ býúõñá¸èrJ¡¯è(¯_ú¥_šØùË_}}}166V`EP.ú§Ÿÿüç#"âÜsÏG}4î¸ãŽ‚«˜ß„a8dýèGãýï,]º4®ºê*A8H=ôÐÄþÐÐPlß¾½ÀjÊ!K)]u²,;7"Ö]07N<ñÄXµjUüä'?‰¢ËÊí¢”Òº¢‹˜mV†(ÐÎ;cçÎE—P=E²2 P˜c=6>ô¡Ň?üá8ñÄÎåy·ÜrKüË¿üKüèG?š³šî»ï¾8æ˜c¦<¿k×®¸ì²ËâÛßþvìÞ½{Îꊈ8í´ÓâŸøDüÆoüFôöö6œ{úé§ãßþíßâ;ßùΜÖõðÃÇQG5qü†7¼!víÚ5ë÷-ëŸS‘u Û1ǯyÍk"˲†öÇ|NÆiõ^ýêWÇŠ+¦‡U5:å”SZÆ•EÕµjÕªxá _8qHªòÎøo†aT@Ë‹ò&HGEf5kԽ꺻É^µb—ZÆÝ5Ñd“˜Š×¨¥IÝh¢hLûQã†ÚZͽ¹ÙÒ(#FÑøÐè‚D]A˜èû8—ÑÌÐO?òùTu§OSýµ„3¿Óßs(ýüç?/577·ûóGKKKéÁ,3¦l™î¿ÿþý¹hùòå¥ï~÷»eÿ¼Î9çœÒK/½Ôa®×_½ô­o}«¬™xà6Î=÷ܲ¼ïÝwß]Ñë´`Á‚ŠZ'Œו* ±«Õ£OŸ>ñúë¯Ç²eË¢±±1N9å”Ô‘ø¸à‚ ¢¾¾¾S¯ýéOº‹Óì¼qãÆÅW¿úÕ²½ßwÜñ‘«û¶çC‰K.¹¤ ‰òPîuºí¶Û¬P6UUU1kÖ¬8ýôÓcÏ=÷l÷5555qê©§ÆìÙ³;|M p@\yå•qÁ”í=§L™wÜqGŒ;¶Ã× 2$®¹æš8çœsÊ–«’¥\§ñãÇwøšÖéüóÏ/[. ²(Ãð±&L˜C† ‰ˆˆž={ƱÇ›8Ÿýû÷o³=cÆŒ8öØc[­ûúõëWîx­¶Ïtýõ×·Ù÷áÿ†]iû÷jiii“ë†nhóÚýöÛ¯l¹*E¥¬ÓöŸý‡×éùvÇuºÖ!‡Òæüí¦M›bõêÕ­–––Ö}ãÇÏ}îs)bƺuëZ3­Y³¦Í¾ú§*[Ž‹/¾8ºuëVq¹*E¥|;³Nå¼PYjR ò=þøãqÅWÄ”)Sâµ×^‹o¼1u$>…þô§?Åܹs[·7nܘ.Ìv¶Ï4|øðd9¶·eË–6¹ÆŒ“.L…Èa*%ðéQ]ÝözØ<òHœx≭Ûwß}w›;œ|øõåòùÏ>þã?þ#""úôéÓæåÌôá÷:ùä“[n8p`¼õÖ[IrU ëäD€U*•âšk®I TbȆ2 Ù¨IØ= 0 Î<óÌ8餓¢{÷îmö566Æý÷ß>ø`¬_¿¾,y¦OŸßüæ7;Ü_*•âÙgŸ{î¹'/^\–L¨ªªŠ)S¦Ä™gž#FŒøH®ùóçÇ}÷ÝWÖ\Ç||ík_kÝž7o^\uÕU»ü};³NøÃâÞ{ïE‹íò<Û«ªªŠ£>:¾ô¥/ÅÈ‘#?’kþüùq÷Ýw—=|Ú)ûܘ1câÙgŸž={vøšÓN;-þð‡?DCCC´´´ìòLƒ ŠN8a‡¯9ñÄãÛßþvœ}öÙqÏ=÷ìòL¸é¦›ââ‹/Þa®ï|ç;qæ™gÆ}÷ÝW–Lûᅴϫ\¥¥Î®Ó·¾õ­øò—¿wÞygYrEDüøÇ?ޝ|å+î?æ˜câòË/³Î:+î½÷Þ²å€O»êÔ€O¿»îºk‡E˜~øámî>R)f̘ýúõ+Ë{M›6m‡E˜íÝ|óÍÑ«W¯]œ(7ÞxcÙÖiòäÉ;,Âloƌѻwï]œvî ìr#FŒh³}É%—ĦM›""âÐC /¼°ußðáÃË­Õã?Þæ.+_ÿú×[s÷êÕ+ú÷ïï¾ûî.Ï1räÈ6Û>úhÌž=»Ý\ûî»oôíÛ7Ö¬Y³ËsUŠ­Ó>ûìS¶u6lX›í­SïÞ½cß}÷Õ«Wïò\°;P†ÊîöÛoõë×GDÄi§Ö¦ “Ê¢E‹â'?ùIëö¹çžû‘O ,¨È\©X' :uè,e²¡ @6”aȆ2 ÙP† Ê0dC€l(ÚÔ""N<ñÄèÓ§OëöÞ{ï0 üåjjjâÊ+¯lÝ®««K>E”a€Šp 'Ä 'œÐî¾?þñeN¹nݺÅw¿ûÝ÷/Z´¨Œi€ÝÁÔ©ScñâÅ­Ûƒ j³¿T*•;üÅfÍšMMM±õgííù3 »/e ¢­[·.Î>ûìÔ1 K=ðÀ1kÖ¬Ô1€O™½öÚ+>ó™Ï´»oùòå1wîÜò‚.0dÈ÷ùÙv_Ê0@Exî¹çâå—_nóÜóÏ?·Ýv[466&JŸÜ–-[böìÙmžknnŽ{î¹'yä‘D©€ÝÑ‚ â‚ .ˆÕ«W§Ž]bÆ 1sæÌøþ÷¿Ÿ: ˆ2 PfÍš7ÞxcêÐeZZZâôÓOOØ<÷ÜsqÕUWµyîí·ßŽyóæ%J¹ï|ç;±páÂÖíR©óæÍ‹wÞy'a* 5eøxûí·ãHºÔï~÷»˜;wnê@…©N:K€lÔ¤ì~¾ð…/DKKKDDLœ81qøË=:N?ýôÖí~ýú%LŸnÊ0@ÙÍš5«Ã}o½õV“@×8餓⤓Njw_SSS¬^½ºÌ‰òÔ£GèÓ§OëöêÕ«£T*%LTÙ¶ÿ¬zôè‘0 ;²ý:mܸ1ššš¦€Oe b,Y²$¾ÿýï§Ž]êòË/ÆÆÆÔ1*Ò† Úl_{íµqíµ×¶n4(V¬XQîXkÆ ±Ç{DDÄ{ìáçÍ µýŸë¯ÓÌ™3ãÜsÏM Ø] 2$.¼ðÂÖí9sæÄ’%K&ªl§žzjŒ3&""zõê•8 Ù~šššvxV`÷¡ ”ÝÓO?Ýæª®7nŒÙ³gÇÝwßÍÍÍ “Á'³bÅŠX¶lY›ç^{íµ¸é¦›âÉ'ŸL”  òÝvÛmqÉ%—Ä AƒRGÉ•W^?üáSÇàc\}õÕñãÿ8u `7ñöÛoGsssëCÇŽ·ÞzkëþóÎ;Of;K—.m³}饗¦ ÂíhV®\© D„2 ÀôéÓcýúõ©c@—ù×ý×øçþçÔ1²³jÕª8î¸ãâ›ßüfœqÆѽ{÷Ô‘*Ú~ô£xÿý÷ãòË/Ñ£G§ŽCf̘MMMqÙe—µ^µ`WyóÍ7ã²Ë.‹›o¾9ªªªRÇ©xßûÞ÷â”SN‰±cǦŽÂX' 3”a€d/^çœsN\tÑEQ[[ÛfßêÕ«“d6lX‡_ ºï¾ûâhÝÞ°aC¹bÅ–-[âöÛo;î¸#z÷îÝfßyç—ì®1 hóy•kÝ*yî¸ãޏóÎ;?²N7n,[`÷qË-·Ä£>—_~yŒ9²Í¾+V$É´hÑ¢xì±ÇZ·W­ZÕúëM›6µÙ÷ú믗-׺u뢮®.¾øÅ/ÆYgÕæÂµµµ1yòä²eÙÞÂ… £OŸ>­ÛåZ·Å‹g·NÛgvoÊ0@rMMMÑÔÔ”:FDì¸Ì±qãÆä…†R©ï½÷^›ç𛛥IWZÊqv•ŋǗ¿üåÔ1Z]uÕUqÕUWµ»oíÚµqÌ1Ç”7ÐvZZZbæÌ™1sæÌ6Ï80Þzë­$™®¸âŠ$ï{Ýu×Åu×]×î¾J]'€T§¥ @6”aȆ2 °ËmÙ²¥ÍöÒ¥KcÅŠ±bÅŠ¸ë®»¥ªLþ¬ …BëgµbÅŠ8üðÃ%c{Ö Ò©Iøô»å–[â{ßû^ëö€Z½ï¾û¦ˆT±~ùË_Æo¼ûï¿DDôìÙ3zöì™8öë_ÿ:–/_C† ‰ˆ®Smmmªhì&jjjâꫯnÝ®««K˜ ¼”a€]îºë®‹îÝ»ÇE]ýû÷O§¢½÷Þ{qê©§Æ~ðƒ8î¸ãRÇ¡ï¿ÿ~üÍßüM\sÍ5qâ‰'FUUUêHìfjjjâßøF‡û_|ñÅ2¦€<ÝÿýÑÐÐݺuk³¯T*¥ˆ@'U9`«,UUUFÄ­©sÀ®Ð£G˜0aB›âÀªU«âå—_.{–~ýúÅAÔº½råÊøÏÿüÏÖíqãÆÅ>ûìÓºýüóÏÇúõëËšñ3ŸùÌGîœ3kÖ¬6¹GŒK—.ÝåYú÷ï#GŽlÝ.׺å°N#GŽüHÉkáÂ…±víÚ²æ`÷²çž{Fsss»ûî¿ÿþ8ãŒ3Êœò3wîܘ>}z»ûþñÿ1nºé¦2'è×—J¥IbWsg lš››ã©§žJ#""Þ}÷Ýx÷Ýw;ÜÿÒK/•1Mû–,Yò‘çššš$‰xçwâwÞ)ûûæ°N¯¾új¼úê«©c°›Ù¼ysÌœ9³ÍsMMMñ³Ÿý,ž|òÉD© k×®[o½5n¾ùæÔQØe€Ì´´´Ä¹çž›:díë_ÿzôíÛ·u»T*ÅSO=ï½÷^ÂTt†2 °Ûyúé§SGàªN:K€lÔ¤@ÇÆŽ“&MjÝîÛ·oÂ4é)ÃT°Ï}îsqà 7´»oÍš5ÑØØXæDiU§À's饗ÆêÕ«SÇ(+w†¨`þóŸã±ÇkóÜ+¯¼3f̈çŸ>Q*€tªJ¥Rê l§ªªêˆ¸5u ;×—J¥IbW«N:K€l(à e²¡ @6”aȆ2 ÙP† Ê0dC€l(à e²¡ @6”aȆ2 ÙP† Ê0dC€l(à e²¡ @6”aȆ2 ÙP† Ê0dC€l(à e²¡ @6”aȆ2 ÙP† Ê0dC€l(à e²¡ @6”aȆ2 ÙP† Ê0dC€l(à e²¡ @6”aȆ2 ÙP† Ê0dC€l(à e²¡ @6”aȆ2 ÙP† Ê0dC€l(à e²¡ @6”aȆ2 ÙP† Ê0dC€l(à e²¡ @6”aȆ2 ÙP† Ê0dC€l(à e²¡ @6”aȆ2 ÙP† Ê0dC€l(à e²¡ @6”akðX IDATȆ2 ÙP† Ê0dC€l(à e²¡ @6”aȆ2 ÙP† Ê0dC€l(à e²¡ @6”aȆ2 ÙP† Ê0dC€l(à e²¡ @6”aȆ2 ÙP† Ê0dC€l(à e²¡ @6ªÎ?ÿü¿ˆ«#bÿÔa:¡ÏFÄiÅbqmê0í) #âEÄ_GDÕÎþþ-[¶ÔnÚ´©G—ëÀ† â©§žŠ¥K—–ë-wÚ˜1câÐC=öØ#u”U*•â7Þˆ9sæD©TJ§]½{÷ކ††0`@ê(ÒÜÜ¿ýíocåÊ•©£tè°Ã‹ƒ>8jjjRGùX[¶l‰W_}5ž|òÉÔQ:Ô¿ÿ¨¯¯¾}û¦ŽÒ)k×®ßüæ7±fÍšÔQÚÕ­[·8òÈ#cÔ¨QQ]]ùØÍ›7ÇÂ… ã…^H¥Cp@y䑱Ï>û¤ŽÒ)ñÐCņ RGi×{ìõõõ1lذ¨ªÚéC§²kii‰gžy&^yå•ÔQ:4jÔ¨8ì°Ã¢G²R~b¥R)V®\<òHlÞ¼9uœví½÷ÞÑÐЃN¥SÖ¯_O<ñD¼ñÆ©£thüøñqÈ!‡D÷îÝSGùX¥R)–-[¿ýíoSGéPß¾}£¡¡!öÛo¿ÔQ:eݺu1gΜXµjUê(íªªªŠ‰'ÆèÑ££[·n©ã|¬Í›7Ç’%Kâ™gžI¥CŒúúúèÝ»wê(²fÍšxøá‡cݺu©£´«{÷î1iÒ¤8ðÀ³9vzá…bÑ¢E©£thøðá1qâÄèÙ³gê(ò_ÿõ_ñðÃGKKKê(íêÑ£GÔ××ÇСCSGé”7ÆïÿûŠŸN˜0!öÜsÏÔQ>V.³Ñúúú8p`ê(’Ãl´®®.>øà,Žïs˜î·ß~Q__ýúõK¥S*}6Z]]'NŒƒ:(›ãûJŸ<8&Mš½zõJ¥S*}6Z[[“&MŠ#Fds|_é³Ñ<0?üðlŽïW®\¿ùÍo*v6º×^{E}}}pÀ©£tʆ âw¿û]EÏFÇŽ&LˆÚÚÚÔQ>V³Ñ>}úÄäÉ“£ÿþ©£tJSSS<úè£;ˆ8âˆ#b̘1Ù;UúltÀ€Q__}úôI¥S*}6ZSSÓú݇Ž6mÚÏ?ÿ|EÏF‡'NŒ½÷Þ;u”N©ôÙèž{îÙú݇ä0=ztÔÕÕ™v‘^½zE}}} 4(u”NÉa6zè¡‡ÆØ±cÍF»ˆÙhת®®ŽÏ~ö³O 6lDDTþð#š#âÆb±xýÎþÆšˆ¸)ò(Â|à³ñµˆøŸ©ƒtàìˆøâ'ýÍÕÕÕe|ÔÖÖÆôéÓ[–-[6§Tÿ ×ÖÖv;ê¨£Ž«ÎáÜÛxàñÎ;ï,X°`Á›©³´çˆ#Ž8xÈ!y|#!ZÿŒ¾ÿ‹_üb^ê,íéׯ_Ï#Ž8bZê;cܸqñæ›oÎ_¶lYENÙ0`@ËØúÔiÓ¦½ý«_ýê¹ÔYÚ3lذ~ãÇŸ˜:ÇΘ8qbéõ×_¼±±±9u–öL:uÊÞ¹LƒbëuòäÉËæÎ»8u–ö|ðÁŒ=z\êU[[S§NݼtéÒ9---w†²ºººjêÔ©ÇÕäÐÐÜfèСqØa‡-~æ™g–¥ÎÒžºººƒ†~`êU[[ÇsLó½÷Þ[‘g(÷Þ{ïÚ†††cSçØ£GŽ+V<÷òË/¿:K{&Mš4aðàÁyL,£õø~Õ¿ÿû¿ÏO¥=ƒî}衇6¤Î±3êêêâÏþó¼+V¼Ÿ:K{Ž:ê¨ú¾}ûæq¶7¶Y§L™òÆC=´0u–öŒ5jàÁ|hêU[[ [–-[öغuë6¦ÎÓž©S§Nß3‡3iÛ <8Ž<òÈ?Í›7ïÕÔYÚsÈ!‡Œ5jÔèÔ9:Ël´ëå0šK[+ò˜Nœ8Ñl´ 5446pàÀÿ–:GgUúltèС}'L˜pdê;câĉ¥åË—?¾jÕªJÕ«W¯<®•?3fÌþcÆŒŸ:Ggå06mÚ±ÝsøÒ6C† ©ôÙ訹X,6¦ÒžB¡0;">Ÿ:ÇÎ:th±T*UäEX …´ˆ˜Ùœü©®®n<ãŒ3þªX,nIåà …BuD<“RgÙcÇŽ½ú‰'ž˜™:G{ …™qOê;£{÷î/™v­úúúK^|ñÅÇRçhO¦³ÑGJ¥ÒߦÎÑžŒg£_(‹ù¥ãLg£÷•J¥KSçhO¦³Ñ ÷wwB±X\Ÿ:K{2Þ0gΜ¥ÎÑžLg£ËÍF»V]]ݿ̟?ÿÁÔ9Ú“élô© žöˆE‘ßlô¼%K–TämËÌF»–Ùh×3íZf£]Ël´ë™v-³Ñ®g6ÚµÌF»žÙh×Êq6ãô0j"â"⢈Èá*¥ˆø¿QÁCÁb±xo¡Pè‡GDWôX·¥Ñ‘b±¸®P(œçFÄ^‰ãtƦˆøE±X¬È"Ì6×EĆˆ•:H'-ŽˆÛS‡èH±X|cÛÉŠˆ|n%6³R‹0Û|5"^|Ššó#âg©Ct¤X,>_(þ6"þ:"*ÿ~Ö«#â§•Z„ÙæKñ•ˆÈឌ¥ˆx4"þ-uŽ‹Å_ …³#bJäqì´"*ûØiã¶ÿç ‘ÃU:7GăÅbñ¡ÔAvà–Ø:Tyü}-"~š:DGŠÅâ»…Báäˆ83ò8¡¶1"î-‹Y„ÙæŠˆX¹\ÅgADÜ•:DGŠÅâ+…Bᔈ8-ò ­ˆ»*õdï6F^_ôx""îO¢#ÅbññB¡ð±õÎÉ9œô}7"Š•x²7"¢X,nÙöyæ4}("H¤#Ûf£="âˆÈãØé͈øIêÙ6=%¶ÎFs¸Céæˆø·b±X‘'{·¹."ÖGÄA©ƒtÒ+QL¢#ÎF×GÄÏ*õdï6_ˆeq@ê ô\DTä—"ÚÌFOŠ­çD+Ýšˆ¸½R‹0Û|)".ŽˆýRé„RD<³SéȶÙèY±u6šÃñý;QÙÇNÌFψ^©ót–ˆøßÅb±"/´Í-±õ¸~\äq|¿,*{~¿*³ÙhKDü¼X,Vdf›+bëìaxâõRDÜ™:DG2œ6E³Ñ—"b`ê ôûˆ¸7uˆŽl7=.òøîCclýîC¥ÏF/Œˆî`d6ÚõÌF»–Ùh×3íZf£]Ïl´k}âÙhUÞá Ú•Ãf "”aȈ2 ÙP† Ê0dC€l(à e²¡ @6”aȆ2 ÙP† Ê0dC€l(à e²¡ @6”aȆ2 ÙP† Ê0dC€l(à e²¡ @6”aȆ2 ÙP† Ê0dC€l(à e²¡ @6”aȆ2 ÙP† Ê0dC€l(à e²¡ @6”aȆ2 ÙP† Ê0dC€l(à e²¡ @6”aȆ2 ÙP† Ê0dC€l(à e²¡ @6”aȆ2 ÙP† Ê0dC€ÿÇÞIZÞùÿ>}@ÓœEq4 q D¢„q)9F€T€J·Pk¼vxbvìÙñ1މ‰ux<ŠñzvÖ±k¯G³3k{û¯×ºR‚„ÎB „@J!b@ j’äjhúz÷7›ªnè†î~ë­ú|‚·«*³:ó›ÕÝüÞ|¾ïÐÊ0´†2 ­¡ @k(ÃÐÊ0´†2 ­¡ @k(ÃÐÊ0´†2 ­¡ @k(ÃÐÊ0´†2 ­¡ @k(ÃÐÊ0´†2 ­¡ @k(ÃÐÊ0´†2 ­¡ @k(ÃÐÊ0´†2 ­¡ @k(ÃÐÊ0´†2 ­¡ @k(ÃÐÊ0´†2 ­¡ @k(ÃÐÊ0´†2 ­¡ @k(ÃÐÊ0´†2 ­¡ @k(ÃÐÊ0´†2 ­¡ @k(ÃÐÊ0´†2 ­¡ @k(ÃÐÊ0´†2 ­¡ @k(ÃÐÊ0´†2 ­¡ @k(ÃÐÊ0´†2 ­¡ @k(ÃÐÊ0´†2 ­¡ @k(ÃÐÊ0´†2 ­¡ @k(ÃÐÊ0´†2 ­¡ @k(ÃÐÊ0´†2 ­¡ @k(ÃÐÊ0´†2 ­¡ @k(ÃÐÊ0´†2 ­¡ @k(ÃÐÊ0´†2 ­¡ @k(ÃÐÊ0´†2 ­¡ @k(ÃÐÊ0´†2 ­¡ @k(ÃÐÊ0´†2 ­¡ @k(ÃÐÊ0´†2 ­¡ @k(ÃÐÊ0´†2 ­¡ @k(ÃÐÊ0´†2 ­¡ @k(ÃÐÊ0´†2 ­¡ @k(ÃÐÊ0´†2 ­¡ @k(ÃÐÊ0´†2 ­¡ @k(ÃÐÊ0´†2 ­¡ @k(ÃÐÊ0´†2 ­¡ @k(ÃÐÊ0´†2 ­¡ @k(ÃÐÊ0´†2 ­¡ @k(ÃÐÊ0´†2 ­¡ @k(ÃÐÊ0´†2 ­¡ @k(ÃÐÊ0´†2 ­¡ @k(ÃÐÊ0´†2 ­±¤é³•RÞ‘dU’·WU5¹ûÿ—$‡&¹*ÉÍUUmØÍ`Aêö‡$ùpê¹ý¿LMŒý×mÜÿíÔ3ûUSc?Ùý)`Ç zý“|0É'’|z|rú?muÿ²$ßÏh柜¾w÷§fS†WJ91õBšUIÞ:ºù¾Wøö’üÃÑñD)å3I®L2]UÕ¦]›–n¸w’÷§^ ôÞ${Œîúo¯ð[NLògIþ¬ÛÞ™z‘ÐÕScïꬰ#½Îò$S©ß§¾4Éž£»®}…ßrB’O&ùä ×ùAfŠ1íâ¨À6(Ã(¥“äãíó:æ $¿=:)¥\“䪪ªnß9)`áéö‡{&¹,õÌþ¾$Ë_çC6:þu·?¼5õ"¡k¦&Æß)A` z=’L¦žyߟdï×ùPo1èunËh柜~t§^“2 °Û”ROrEê‹gíä‡?"É&ùÃRʃI®N]Œéïäç€y§Û.Irqê™ýCIöÛ‰_’œ;:þ÷nøõÔ‹„>751öäN|x™A¯³8ÉE™™yØÉOqöèø·ƒ^ç›I®LòÙñÉéÁN~`e`—*¥”䣩O,ž—dÑnxÚc“ü³$ÿ¬”rOFÛSWUuÿnxnh…n¸(Éù©gö¤ÞuWÛ¼é¢$ÓíoL½Hè ScÏí†ç`ô:%I'õÌû±$]”äÂÑñ׃^ç¦ÔïU_;>9ýÌnx~XP”a€®”²’¦>±xqšýŽ“’üË$ÿ²”rgê“WWUõpƒ™ 1Ýþð¬Ô3ûIo0ÊÒ$—Žºýá—SÏí_žš[Û`.ZjÐë¼333²$É¥£cí ×¹.õÌû¥ñÉéÌó†2 °S”R–'™J}bñÒ${6›h›Nÿº”rkê+Ï~ºªªÇ›»V·?œH=³¯JrLÃq¶e¯Ô;Ë~4ɳÝþðÚÔ‹„nšš[ßh2æ´A¯ó¶Ì̼oi8ζ,KòáÑñÜ ×ùbê™÷†ñÉéu&€S†^·RÊI&“|"ufïfm·’äÜÑñïJ)_O}²ñsUU=Ùd0ØYºýá[3³èĆãìˆ}“üýÑñd·?ülê¹ýëSc›MÀœ0èuŽËÌÌ{rÃqvÄ>I~}t ½ÎçRϼ_ŸœÞØh2he`‡”R'¹(õIÅ%9 ÙDoØæ×sQ’¿)¥Ü˜úd㪪z¶Ñd°ƒºýá‘I>žzn?­á8;ÃI~kt<Öí¯I=·ß651V5š €ÝjÐë¼)33ï ÇÙÆ’üæèx|Ðë|:õÌûíñÉi3/¼eà5•RJ’óRŸTüh’ƒ›M´Ë,MrùèÀf IDATx¡”òåÔ'¿\UÕÚF“À+èö‡‡&ùXê[ÏI½#ê|´"Éuûë“\551vW³±ØU½Î!©ß£þD’weþμ‡&ùÝÑñóA¯su’«Æ'§¿×l,˜»”a€WTJygêÌÇ“ÑpœÝm¯Ô'U?šäÙRÊRcn¬ªj}£ÉXðºýáX’¤žÛ/L½óéBrT’?NòÇÝþð¾Ô3ûUSc÷6 €7jÐëäégÞwgáͼoNòGIþhÐëÜŸÑÌ;>9}O³±`nQ†¶PJ9%õIÅUIŽm8Î\±o’ÿntI>zfoêNINHòÉ$Ÿìö‡?ÈL1æ¡FS°Ý½ÎÞIÞŸzæL²G³‰æŒã“ü‹$ÿbÐëü03Ř›ÍS†RJ9>3˜“Ž3טä·FÇc¥”O§>áxkUUU£É˜wºýá²$—§žÙ/O½“)¯ìí£ã/ºýám©gök¦&Æm6[ô:{&¹,õÌû¾$Ë›M4ç2:þ|ÐëÜžÑÌ;>9ýH³± Ê0°@•RŽLrEê‹§7§­V$ù½Ññ³RÊÕI®ªªê®fcÐfÝþpi’KRÏìL½c);îìÑño»ýá7“\™ä³Scƒfc,\ƒ^gI’‹SϼJ²_³‰ZëÌÑñ¿ zo¥.Æ|f|rú‰fcÀî£  H)åÐ$K}bñÜ$¥ÙDóÊQIþ8É—R~’ÑöÔUUý¸ÙX´A·?\”ä‚Ô3ûG’Œ7›h^Y”äÂÑñ×Ýþð¦ÔsûµScÏ4˜ `Aô:‹’œŸ™™÷ fÍ+›Ï'\䯽ÎÍ©gÞÏON?Ýh2ØÅ”a`ž+¥Œ¥>¡¸*õ¢ÅZÞšäO“üi)¥Ÿ™bÌO›À\ÓíÏI=³,Éa ÇY–$¹tt¬íö‡×¥žÛ¿451öB£Éæ™A¯sVê™÷Š$‡7g!X’ä½£ãßzëSϼÝñÉéçM»€2 ÌC¥”}’| õ‰Å÷&YÚl¢mbtüÏ¥”ï¤>ÙxMUU¿l6Méö‡§¦žÙ?žäèfÓ,hË’|xt<×í¿˜zn¿ajbl]£ÉZjÐëL$ùDê™÷˜†ã,d{&ùàèX3èuºI®LÒŸœ6ó0/(ÃÀ9mæ U”a eJ)‹’\˜z!ÍG’Øh Þ¨%I&GÇ‹¥”ëSŸlìVUõ|£ÉØaÝþð°$K=·ŸÓpÞ¸C’ü“Ññónxu’«¦&ƾ×l,€ÝoÐë¬È–3oi6oÐÁI~gtübÐë\“äÊñÉé;šÛGZ ”RRŸL\•úäâŠf±‹ì™äƒ£cM)¥›äÊ$½ªªÖ5š €WÔíÇS_°bUê]@5›ˆ]äÍIþ(ÉuûÃû“\äÊ©‰±{š°ë z“|8õÌûk1óÎWoJòO“üÓA¯ó@ê 8^5>9}w³±à•)ÃÀVJyG꓊OrTÃqؽöNýg¿*ÉS¥”ϧ>áxsUUM@ºýᾩ/f°*É%I–6›ˆÝìø$’äOºýá3Z$451ö`³±Þ¸A¯³o’¤žyß3ïBó–$ÿ<É?ô:wg¦ó@³±`KÊ00Ç”RNÌL â­ Çan8 ÉoŒŽÕ¥”ϤÞ1fºªªªÑd H·?Ü+ÉåI>‘ä²$ËšMÄqÊèøónøÝÔ3û5Sc4 `û ze©gÞU£{5›ˆ9âmIþU’5èuîH]Œ¹z|rúÍÆe˜J)Çd¦3Ñp涃“ü£ã‘RÊÕI®ªªê»ÍƘŸºýáÒ$ïM=³ É>Í&š[–ñÉEI–?ÿÈŸ=×t–9â£ãßtûÃo¥^$ô™©‰±ÕÍÆx¹A¯³4õÎ/›gÞ}›M4·üz)%ÉÞÿ­ªÌ¼µ3FÇÿ:èu¦3šyÇ'§Õl,ªâbâÐŒRÊáI®H}bñ¬†ãÌE÷UUµrëK)ÿ>É?n Ï\÷@’ÍŘ6 Íºýáâ$¦žÙ?’d¬Ñ@sÐc¿|êwþà·þ˲$¿›ä$ÿù”Sßü·òçr±†—ÛäæÔ‹„>?51ötÃy€lÐë,Ê–3†«_üÃ?ýwlLò{IOòÿ|ø²ÿð§ÿéô»Ž6mLòÕÔ»¤~~|rú©†ó°€(ÃÀnTJ9(ÉGSŸXUUUë;K)+’üöè8t7gk‹¥^`sUUU×t€6èö‡%É9I>‘äc1snÓ/¦×íç+½»_ܸ±Ús«»«SO?²\:õö¼ý´£RJ#纓ôRÏíÝ©‰±5 ç€A¯S’œ™™wE³‰æ¦Õ¿\›o|ñ—™þòck7n¨–m}ÿÊÓÈï?,'Ÿy ™wÛÖefæýâøä´™€]Jv±RÊþI>”ºsQ’%Í&š³~‘äo’üǪª¯õÍ¥”=’|<É$9}gk³ï¥>ÙxuUU?o: À\ÓíOK=³<É‘ Ç™“ª*éßõp®ëþ ý»Îö¼­pødò}9ÿÝ+³lÙÒ]²Ö$馞Û{Sc/6œ˜g½Î;23óÕpœ9©ª’ûîz*_ÿÂ/sÏw‡Û5ó|ø²œ?uXÎ~Ï¡Y¶|ñ®ÙNÏgfæ½~|rÚÌ ÀN§ »@)ey’©Ô'/M²õ•R™qK’O%ù\UU^Ï”RÎM]Šùp”^I•äÛ©·§þLUU7œ 1ÝþðÄÔ3ûª$om8Μµvíú|ó«÷¥wÝóËGžz]±|ù¹ð¢•™¼ü”rè~;9á¼òt’ϧ^$tóÔÄØë:G0èuVffæ=¡á8sÖºµó›Wç›_øeûù ¯ë1öÜkqξä\ðþÃrð{íä„óÊÓI®Mý^õÍã“Óf^v eØIJ){&™L}Rq*ÉÞÍ&šÓÖ¥^Üñ©ªª¾·³´”ò¦$¿“ä%ßY;mLòµÔŸ«ªjØp€]®Û“™Å@ Ç™Ó~õø3é]ww¾~ó½yþùu)%IÊxÄ*IÉig•K/?%o›8bç¿V'ùLê¹ý[ScÞÈ^Õ ×9:33ïÛ›M3· [›o}é±ÜzÃãya͆¤”—O¼¯4WÛø²ªRJrâc¹àý‡gåiŒæh^Á™5óŽONoj8-¦ o@)eI’w'ùD’%Ù¿ÙDsÞcIþÏ$ÿaWîLRJY–äï%ùýXàôZÖ%¹1õÉÆ/TUõ\Ãyvšnxx’+R/:«á8sÞÝ?|$×釹ë·³Å[[,âÙÞ=ÛZ!Tò¦7eò²SÒ9ÿøì¹§ ^_Ã#I®IråÔÄØw›Ìƒ^ç°Ì̼g7gλ¿ÿt¾ñÅGó£ï<ùÒˆZ¶üå%¯VfÙr©]µù¿—¾<äM{åü©ÃòÎwœ=÷Z¼sÂÏ_›gÞ«Æ'§oo: í£ ;¨”R’œ—ú¤âG“Ül¢Vøn’¿Lò骪ÖíÎ'.¥\˜ºóþ$Î6¾º’|)u1溪ªÖ6œ`‡uûÃ’|$õ…+ÎK²¨ÙDsÛ‹/nÈô7ïOïú»ó‹Ÿ?UßøÒ¢Ÿò Ý—úÆãN>,ï¹â´¼bÿÜô¹»ò›ïËÆ ›ò²"L²åʠч½÷Þ#ï¾xeÞ3yr:hŸõ’æ³SÏìWMMŒý°é0Àî7èuÆS¿G½*Éù1ó¾ªõë6厯­Î·¾ôhýÙ 3%—²åè»ù«Ù½˜7·O:—¯ÈÁ‡-Ë·{çû· ²aý¦Ùcíè“™xó§U•,[¾8g]|HÎ{ߊŒ¯X¶‹^á¼ò`’«“\9>9mæ`»(ÃÀv*¥œ™ú¤âIŽh8N¬OòÙ$YUÕmM‡)¥äŸ$ùï“Ðh˜vx6ɵ©ÙÜTUÕú†ó¼¢n¸_ê[W%¹8‰íF^ÃO<—o¸'_ýʽY³fÝK‹}ÊÖ—¿Ýêë%KçŒ ÏÅ9-ǬßùÊêÜvããyv¸ù­Óª.ÅÌ*ÁŒnÝ^¥”äÄ3ÆrþÔa9~bÿ]ðjç¥{2ºÄøä´™€W¤ ¯¢”rJê+É~<ɱ Çi‹ÕIþc’¿©ªê—M‡ÙZ)eï$?õn1'6§-©‹MW%ùFUU›În¸<ÉûR/º,ÉžÍ&j‡ÿø±ô®ÿQîøîC[öS¶yyÜ™ûö[žó/{[.˜:%û-ÕçØ°acîøúý¹ùóßÏ÷º¾qö“Í^)4뾪ªrÔÑ㙜<9ïê¼%K—Úàu;}/õÌ~õÔÄØÏ›¼qƒ^g¯$S©gÞK“ØZd;•äʪªÖ6f{”R.Iò©Mm½Ô‡m{4ɧ“\UUÕ­M‡–n¸G’÷¦¾pÅû“ìÝl¢vX¿~cn¹åÜл'?{h°íâËìËâÎúü¨ãÎS9ãüã³xÉŽ/ÔyðÇåk_üA¾ÿíŸfÓÆÍ×V˜µR¨zy)&U•}÷]–‹.>!_rb<Ðóvª’Ü’ºó驉±_5œØƒ^góÌ»*õ̻ϫÿ’dÃúM¹ó›ƒL_÷X}hM’Ñ®§³Ê.›Ë0e«aV¹)%%£1·Ì̹/}=š‰-*YùŽýsæE‡äÈãwNßèÙ§Öç{ßXï}㉬yvÃe˜dT„©êOf—cJIN>s,ËW䨓öÛ)Yˆ-fÞñÉi3/À¥ À‚UJ94ÉÇRŸX<'vÙÃ$ÿW’¿®ªjÞlE\JÙ7u!æw“ßpœ¶¹/3Ř{›´[·?,IÞ•ºó±$Z;àþŸü*½Þrûí?ËÆM£÷^©üòÒÇdù¾ËrÖE+ó®÷ž”ýwÑn,ë×mÈÓä–ë”GÌ`f].·ªf}=«sì±erò¤œ}αYò:v©YÀÖ%¹!õÜþÅ©‰±çÎ Ú ×1ó¾?»ïÙL_÷X~xÛ0Õ¦ê¥_f—_ʨ3{g˜½ö^’S;åôóÊ~î±K²mÜPåGw óݯþ*ÿüùÙ#í¨S½ôuUU3;ÆTÉaG/Oç²yÇyãY²ÔÌ»Ö%¹1É•I¾8>9mæX@”aXPJ)¦¾Šìª$&YÜh öùQ’O%ù¯UU=ßt˜]¥ÔgJ/KòûI.‰¢ÔŽúAfŠ15œh‘nxzê‹V\‘äÍ Çi• 6å¶[Ì 7Ü“dær¸õÇm•_6ï³âÍæÜÉ“rê¹oÉÒ=vß©’ïy4·ÜpO~ü½‡_Z4»3{¡ÐÌet“ö_–‹.Z™‹/Y™ý÷ßk·å'^Hò¥ÔsûuSckÎ Æ ×9=õûÔ™w‡lÜPåßdúËæ>ÿRᥔ²ÅÎ/3»ÂÌ”c>|YθðàœüαÝZ2ùŃkrÇ×Vç¾þÓ©6V3å—ÌÚ%fVfó×Ë÷Y’³.9$çLšýwQigÛb柜6óÌsÊ0Ì{£Ý>>úÄâ{’,m6QëlJòå$YUÕÍM‡ÙÝJ)'&ù½$ÿ É®¹,îüv[ê“×TUõhÓa€¹§Ûžœzf_•丆ã´ÎÓO¿¯Üton¾ùÞ<õôÚW.ÀÌ*¿$%eQÉÊw¼9ç\rRŽ9qE3áG†«ŸËí_½7w|ã'Yûüº-vƒyy1ffåÐ’Å‹röÙGgòÒ“sì±5÷Úë™$צžÛoššÛÐp˜w½Ž™÷ xö©õ¹õ†ÇsÛM¿Êš§××ãí¢Ù¥—2³Lf>/‹’ãÞ¶N;ÿ yü>¿†»¦ŸÈ¾=ÈÚ5gÆÜYe˜-¿®?–E%o;k,ç]¶"G°o£¯¡¥¶˜yÇ'§Í¼ó2 óR)eY’ËSŸT¼<‰Ë„î¸g’üßIþªªh:LÓJ)$ùÍ$¿›äèfÓ´Ò¦$ßL}²ñ3UU Î4¨Û¾%õ•p?‘äm Çi¥|"7ôîÉ­·þ46nÚ|ÙÛ—½¬3Z)´lùÒ¼£s|Î|÷ 9à fmmý‹òƒ[Ìí7ß›'{z«Ýb¶QŒ™µ[ÌñÇœÉKOÊ™gÅ‹wß•~ç‘A’Ï&¹2É7§&Æ65œZkÐëlžyW%9¥á8­ôó¿{.Ó×=–þ­OfÓÆj‹ÒK)%eѬÝ_f½{îµ$§œu`N}×xö›c»ªlX¿)?¾ó©Üõ­'òÄ£kS¥ÚF&3;Èlš¹ýˆc—ç]—–Sß5žÅKJÓ/¥6ϼW%ùÆøä´™`žP†`Þ(¥,M½ó˪Ô;Á¸<Êëó“$•ä?WUõ\ÓaæšRÊ¢$ïOòI.l6MkmHrSê“×VUõLÃy^—RÊŠ,¬¿?­ªê;ÛûÍ£+WìÀão¬ªêÓ;ðøN2·ÞÅØuvôgsb’·ïšï~í¾9mæh9eZ¯”rz’ßNòá$6§­ª$7$ùT’^å¶K)e"Éï'ù{I¬°y}^Lr]’ÿ§ªªnÓavD)e2ÉõMçØþ¶ªª¸½ß<Ú¡ë…xü«ªÚîG¥”§’ì¿ßf;ú³ù“üÅ.Ì3×üaUUÿ®éÀ¶uûÃEIþqêÅ@çeT×`Ç<ûìÚ|õæûrÓM?ΓO¾°Ì–å—¼´H¨ä˜“ËéžcVÖÊŸþpõ³¹ó÷çîÛ̺µëF½—Y»ÂÌ.ÅÌ*É,]²(çž{l&'OÊQG7úZî¡Ô³øë©‰±_4œe‡”RJÒi:ÇntgUUoï7—RŽÈŽ-ÒüiUU?ØÎÇ>2Éi;ðØm7]UÕÛóþ^Àü2èu̼;ÁsϬÏm7þ*·Þøxž®ßª3*¾Ìú<³î?æ„}óösÊ‘ÇíÓÊŸþ3Ãuéßúdîþî“Y÷ÂÆ- 0³w‹Ù4ë¶MÉ¢Å%ç˜Îå+òæãæÖ®¯-óPF3ïøätÛfÞ7%9®é»ÑCUU=´½ß\JÙ'É;ðøÏUUuÇv>öIÎÝÇn»íþÙ$I)ee’»0Ï\s÷öž`×P† õJ)’äj:GK=—äo“üUUU÷5¦­J)ãIþQ’ßIò¦†ã´Õ—«ªz_Ó!v„2Ì«S†Ù©”a^2 ÌqÝþpu’ƒšÎÑF?ûÙ“é]ÿ£|û–²~æ™ËÞn«³ù¶$K—-ÍÉg“SÏ;>cÏs×­]ŸÝþP¾ÿ­Ÿä©ÕÏ%©¶Ü-æ¥b^~ûÊ•‡fòÒ“sÆGeÑ¢®Žš.™šûJÓ!vDùÿÙ»óè¸ÎûÌóß÷½U…})¬Ü%’¢(’"µ[’M[J”ØôÂØ9ÉL<™égNÒI:ÛtÏéLÒ§g¦§·xÒ9éØé“Œ“9q’NâLÒ‰í0¶é}£mÅ’HqEQ”ÄE܉}ªîoþ¸·6”Ѝ žOR…ÂŽo]d¼Åû¼sO_OzUôÓfö' ÝØ9÷aàS‹Øÿ'Ììç¸ïŸ\ľWº0³o,dC½.EDDjOßÁ½šóÞ¢‹¯ŽqèóWxþPù¼áøòLY#Œ+ ÀÔÕ{v<˜e÷c´wf’~·ÅÌtÈKÏrô{}ô_›šÕ 3·!¦<³q[ {ßßËžÇ; ÍyoÑwî;´Òæ¼ÿ ðŸ“Gý_föoº±sî~àÈ"öÔÌî_à¾×5 ­ >7ι?~j醳ìü¨™}&éAˆˆ¬f©¤ ""rNz+ЫÀþØÌ†’ÌJgf}Ào:çþQCѯïHvT+Ž~EDDDDj×à‡“ÄJ†ÆsÏžã _xS/^)`¼“Œ£­«™=︋ÜI¦> …hj€KÜûö­ìz| çN]áè¡3\8}%n…ÌÃ/Ã(-vêÔ5N½x…ÎÎfÞýîüàm§©©.¹'³2iÞ.""""2?Íy! ãO÷sèsW8{j¤pñÞÅÓÞY!˜²F˜öÎ »ëäžÚÉÔùâþjArì|8Ë·³\83ʱ§û9{z$ Â8ÃÌÅ÷ã©oá6„ gFùËÿ<Â?9ÏÛßÓËcï-ôSZi4çY¡†‘Z 7&îkÀÇ€0³Ú¸f1³ð×À_;ç" Å|¨%‰––~EDDDDj×ataЛ›âë_}‰/~é$}7Æ*0¥ sÛaplØÖËîwleÓö5Åv˜\„`æ³a[/¶õ2pm„ãß=ÃéÃçÈMç*B1.ÆX±5ÆÓ×?Ƨ>õ û·‡Ù»w+ûÞ{/6f“~:+Á¹ý{²ýIBDDDDd™ÒœwÆGr<ý¥«|ç WêŸÁǘBØ¥2S‚ÙxW3»í`Ó]-ÄS^Â|²Ïg)­ßÜÌúÍÍ õOsâûýœ:2ÀôdH8;ߺB£ƒ3|ñ¯.ð忹Èý{;x×Ö²~KSÒOg%8×¹ïæ¼""""+”Â0""²â™ÙçÜe`mÒcY¦&€?>nf'’ÌjafÏ?åœû5àç€_Ö$;ªem1Å"""""²²(üþ^}€ƒŸ?Á¡oŸaj:_Öü^|åç…L*â®6±ëñ­d{Zȇµ±*îB´t6óöý÷óÐíâ¥çÎròéW‹C1ч‹Ã1¥PŒ1=òÕ¯žæ«_y‰{ï]Ǿ÷îäÁ‡ï(‰dý‹ˆˆˆˆÜœþ^~—ÎŽsès—yî7Èå, ÁïÀù(ìâ|Ùçq&ñl¿¿{ɒ튛= Í «Dk{š·¿»—‡ŸèæôÑAŽ¿ŸÁ¾éRSŒ3,Œn KŸ‡aÈs߸Á³_»Î;Zy×Ö°ûñ¼×œ÷&ô;,"""²‚) #""µâ ÃÌvø}àÌL+™$ÄÌ®ÿÖ9÷›Àü*ðH²£ZvúÍì\Òƒ‘%£ðû,fÆ‘çÎsðóÇ9~ür1ôâÊš`Jm0•Ííìxt w?t'™ú4PÛ-0 ¤v>¶•náü©+¼ø¯påµëep­š[à<`pâ…Kœ8q‘ctW¤ IDATžîÞ³o'O>u*xE¿Ã"""""7§¿—g1ƒÿØÏ·\æÌñá¨õÅ;‚ Ôúâ½›u?úZkGš]wpÏýmdêÂp%`æ‘J;v>œeÇCY.¼2ʉï÷sᕱ¨&ZÿÊšbãõ!œ=5Âk'‡iëÌðŽ÷­áíï饱E— ΢ßa‘LÝŠˆH­8 ¼/éA,ß>|ÚÌj¸ ze1³à/€¿pÎ=FŠù1 èÀ–­¶#""""RÛÎÃ@kÒIÚÄø4ßøÚK|ñ '¸zu¼?7ô2_Lï]ÜóèV6n_Sl0Yí!˜ù¬ßÖËúm½ \æÔ÷_åì‰ ä¦ó€á¼U¶Ä„†#Ä€k×Gø¯ö4óWÏòÎ'ïfßûîeÝúö¤ŸÎr¡y»ˆˆˆˆÈÍiΛËñ½ƒW9ô¹«ô_ŸÄ{µÀÄm/…PŒóàã L¡fýæ&î}¤ƒMÛZ(”v†šòαaK3¶43xcŠžàôÑ!f¦£KÌ•(´Ä€a8†ú§ùÜŸãà_^àá'»xâGÖ±öÎÆäžÈò¢9¯ˆˆˆÈ ¦0ŒˆˆÔŠÕþÅð)àãf¦•K–93{xÚ9·øgÀ?º“U¢ôš©aû÷díÀ±çw%=–¤\¹4ÈÁÏŸà›_‰ÉÉ\1Sl)k„)c¼Ã§î¼ww?¼•öÞ躪\¢5^å4w¶ðð{ïc÷“;xåÈ9^~îU&†'*[b<`‡c,4&§s|ù‹/ðåƒ'ØsßFÞûÝÜ÷À¦âÅX«ÔjßMDDDDä¦:÷²¾ƒ{W÷œ÷Âßúì%¾ÿµëÌL‡ø¸íÅû²æ—yÚ`RiǶÝíìz$KGw]´3³¨éDÞP[G†·¿»—‡ÞÕÅé£Cœx¶Ÿ‘Ì8µÄ@Ôã B‡ùœñô—®ñ݃WÙ¶§'>¸ŽÝuhÎ+""""+–Â0""R+Vë—€?>afדŒ,Ž™]þµsîß? ü p²£JÄjýýYM³Ê. 2ƒcGÎsðsÇyþÈyŒ¸ñÅ;p~Þö—Âc - lyp3[ºÆ ¹¼–ĽA&ÅÝneÛ#[¸xú2/?ó*}¯÷—µÄ„ŸZçÁÌCh€qìèŽ9ÏÚµmì{ÿnžxêêëW]Áë•ý{²—“„ˆˆˆˆÈ2·*ç¼'ŸàŸ½Ä©ÃƒÑ´6À`J0•¡˜æ¶ ;ÊrÏ}íÔ5„ù„ŸÐ •Nìz¸ƒupþÌ'žéçÒÙñ¨%¦,Qs Î0çÀÁËLJ9}tˆÎ5õ¼kÿZO M«îRÂ+ûiÎ+"""²‚­º¿`ED¤6™Ù9ç\?БôXªäÿÍÌf’Œ¼5f6|ø¤sî]D¡˜A¢«ž†1³ƒÀê^'é ˜Ù$Kx~̬}©ö½Ò™ÙG&=‘YVM#äÔä ßüÚ)þÃ1.]št™„ñç¢f˜Žõlyh3ëî^‹÷ÑŸÓ¹œB0·Ëš»Ö°æ®5 ^â•ç^åâ‹—s`q0†Ðp„˜'ZB7ô8o\¾<Ä'ÿèÛüÕŸ?Í“OÝþ÷ï¡wm[ÒO§ZVÍﮈˆˆˆÈ[°jþnžÏóô—®ò­—¹~iˆ§¶Þ•0³Za ­ÙØÈ®‡;¸ãîæâœ7 Us»lÜÚÌÆ­Í \Ÿâ…gû9sbˆ™i+†`ÂÐá‰Öƒð†£ïÊ$Ÿþ£×øÜ=Ï£OuóÄ×Ñ»±!ɧRM«æwWDDD¤V9S·¤ˆˆÔçÜW€§’Çšþø˜™}?éÁÈÒrÎm~øj;ä5 ´šþ(©iŽ Ü OzKéÚ•a¾øGùÚWN21ž‹`ʃ0>¾”a<>XwÏ:6?°™ö5Ê|WÓÔØçŽãÜѳLŽNF3CÌJ̰0,}ÝàÁ‡7ñÞý÷±ûMI?¥ööïÉþë¤!""""²œõÜ[ósÞë'øæß_æé/_cj¢TãRÂø ¼ýÅÅ¥¨ŽtÚ³eW+÷>œ¥³·>Ág°úLNäyéè 'Ÿ`th†0 04,Œ‚Hå÷ œƒí´óä‡Ö±óá,®¶—üû­È9¯s®hMzU4jf£ ÝØ9—º±ÿ3ë[à¾=гˆ}¯t >7ι6`Õ$ê€x\IˆÂ0""R3œs¿üˤDZ®ŸþÀÌTÑ»ÊÄobýODm1»ÎR8dfïLz"""""²´€jðBO</üýó<÷ý³˜#jy©Âø²˜R(&ÓTϦÝw°iÏÔ5Õ%ý4Vµ0rååËœ{þU/C/ÅL!e¢¯XȆ YÞû#÷óΧvPW—Jú©,…Û¿'ûwIBDDDDd9ë;¸·&ç¼fpêð ßüì%N>;ÀìKÌ M0s[a ¹5ÍŽ³Üs–úÆ ™' @t9wz”žéãÊ…‰(cq&oq@fþ–žîõ <±-½»‡º†šü9þXç¾CšóŠˆˆˆ¬` ȈHÍpÎ}øTÒã¸þJ«€sî)àW÷Sh¯^ù>nf¿šô DDDDDdé86ð4ðhÒ㸦§r|ûk/òùÏáõóý•­/qø¥Ø3+ÓÒÛΦûï¤wÛ:|P+S»Ú1te€óÏŸåÚ™KX>,†^æÄ”Â2MM~ð=»xÏþûéî­©…Y7ïß“=›ô DDDDD–»¾ƒ{kfÎ;5‘çû_½Æ7ÿþ2W/LÌ»Í|Aï=ë¸÷‘6ooÁûÚ®Y‰n\ä…g8srˆüLX ÁXþ怺†€ÇÞÝÃ?²Žîu5Õð³¹sß¡³IBDDDDnÂ0""R3œsÛSIã-ÊŸ& Jz0²<9ç¶¿ ü4ЖðpÞª˜ÙŸ&=YzŽ üðóIã­è»>ÂÁÏá«3::] ¼Ì ÂÌn„ñ§ë®ulس™¶µÙ¤Ÿ†,ÀÔØ$—ŽŸãÒ‰sLOUb !˜Y C¼ƒGßÊ{?ô;÷lLúi¼Uû÷d;’„ˆˆˆˆÈJÐwpóÞ¸2É·þþ2Oé*cù›nçøÀƒ0©”cëÎVv=ÜA÷Úš*Ç©Yã9Nääá~ÆFr Ä@ô³ßùH–'?¸Ží´ãVvÞi sß!ÍyEDDDV8…aDD¤f8ç<04'=–[Ðüðûfv!éÁÈÊàœk>BŒ¹;ÙÑܲûÌìXÒƒ‘¥wàØÀϘô8nÅ‹Ç^çóŸ~Žg¾{†ÐïãðK†q~þ Lª!ÃÚ]w°öÞ;©k®©•SW0rýåK\<úc7oˆ‰d,þ:aÈ[ºyï‡àOí$I%ýTnÅ×öïÉ>•ô DDDDDV‚¾ƒ{Wìœ÷¥çùæg/sâûy³ËÈʃ0Íiv<ØÎ޲46¯È9Ϫæ×N sâÙ®^_P ¦`ÍÆÞõÁu<úT7™ú  £½í¾Ö¹ïæ¼""""+œÂ0""RSœsßö&=ŽE8|ø 3›¿cZäM8ç°øà=ÀJYƒgh1³\Ò‘¥wàØÀCÀ³Ic¡ffò|ç+/ðùOæµW®á☨ÆWaÊZaœw4v¶±fÏfºïZ‡O­È Bd×û¹|ü5^½‚…ae+ŒÍĄŶ˜–Öz~øý÷ñž=HGWKÒOc1~{ÿžì¿Lz"""""+AßÁ½+jÎ;=òÌ×®ñÍÏ^æò¹ñ}O4õut¯k`÷Û:ز£• X)ÿ,)oæÚ¥ N<ÓÏ+'‡ÉçlA€†¦ïëå]XCçšµÈowî;¤9¯ˆˆˆÈ §0ŒˆˆÔçÜLjËY>ff_Oz0R[œsÛ‰šb~Šåß’ôŒ™½-éAˆˆˆˆˆHu86PŒé¤ÇòFúoŒð¥ÏæËžgxxbNó‹‹C0øR Þƒ÷dï\Cï½›iY×™ôÓ%45:ÁõÎrýÅsä&§‹M0!˜ø±òæ˜ÀãïÜÎû~ìa¶ïÞôÓXˆŸÜ¿'û©¤!""""²ôÜ»"æ¼צøÖ?\æ»_¸ÊøèÂ׫óÞ±eG+»ßÖAï†Æ%¡$m|$ÇÉÃý¼px€‰E¼FœƒÝuðä×±í¾¶%ámó“ûiÎ+"""²Â) #""5Å9÷à“Iã&?þ‹™½–ô`¤¶9çÚ€ÿø%`KÂù™?4³ŸKz"""""R=Ž <Ü—ô8æóò ùÜß|Ÿï}óT´úé|·Á8ï ê2tîwiÑA«I˜ËÓÿòë\?ñ“ýÃqð¥²fþ LÈÖ»×ð¾„w<µ‹TzÙ¶íØ¿'{*éAˆˆˆˆˆ¬}÷.Û9ï™Ã|ã3—8þ½þ7~Ô7ìx Ë®³4µ.ëœÜfùœqæäÇŸé§ïê䢾wÝ<ñÁu<òƒÝ¤3~‰Fø–íèÜwHs^‘Na©)ι=ÀѤÇ1Ë)à÷€?5³±¤#«‹sÎ jLz*ááÌöófö‰¤q«âs›IzoAÞÌf–òιÅt¡›™M-bßu€[ü¨–…E=×ÅrÎ,ó•çÞÄŒ™å“„ˆˆˆ,Çþøé¤ÇQÏåùîWOò¹¿þGΜº\ ½Ü¬ý¥üñúl+»6“½k~ù†¤JF/ÞàÆ ¯2|îê¼a˜ò†,Ç„!íÙF~øCñž}˜öÎeUð:´îß“ “ˆˆˆˆˆÈJÑwpﲚóÎL‡<÷ë|ã³—¹øêâþ™º£»Ž]wr×®6R©•úÏ1r»\¾0Î Ïösöô0‹¹Ô°±%Å;ö­áû×í®[º.ÞÐÚ¹ïæ¼""""+œÂ0""RSœs)¢úéÅ\€½ øðqàK¦ÿÁ•eÀ9w/ðËÀ?ÀÛÌ왤q«œsûˆ~ÏWª?5³,ÕÎã ÌÄ"¾eÊÌüßnçÜ °":Ö籨çºXι_~s©ö_ÿÜÌ~7éAˆˆˆÈÒ8plà—ˆŒHÔPÿ_ú»gøâ§Ÿe o, ¹Ä/.»à=ÎÍ}¼yã:vm¡y}wÒOC–¡é‘1úO¾ÆàKç §§ç6ÅÌ ÃB2©Àóö§vòþŸxŒ»v®Oúi|gÿžìÞ¤ñV8ç2@GÒãx †Íl|©vÏÛÛñ-ãf6¼À}7°rçìKµˆ…^—"""µ­ïàÞe1çì›æÛÿp™ï~þ*£Ã _Í9ØtW »ê`í&5ŸÊ\£Ã3¼xd€—Ž25¹ðuͼwìy{O~p[ïm]Â.Øw:÷ZÑs^‰¤’€ˆˆÈídf9çÜqà‘„†0ü ð{förBc™—™~Î9÷ÀÏ¿lJh89àxBÇ‘äNò௞ºÄ?|ê{|çË'ÈåÂÊæç¢ðË<÷ƒLšÖmwоc3™Ö&€èûEfñ t=´“Ž=w3|æƒ'_ejh\ˆsó!„çÀ¼ƒœsär!ß:xŒo}þ(Ûv­çÿÃã<þÔ.‚Tb­C‰þ®Þ&o¾žô Þ‚,åB>µˆí?üü·ý à“‹Ñòñ£Àg–hßz]ŠˆˆÔ¶DÿŽ~íäßøì%žÿNa~ák5fêîÞÝÆŽ²´´EÅój­G™«©9ÅÃïìæþÇ:yåÅaN`àÆ›çÈÃÐxþPÏêcÃÖ&žüà:z²‹TÚWaÔóZñs^çÜ/°²Çû¨™}t©vîœÛ |{ßrÜÌÞ¹À}÷§oi`ËŸë­pÎý>ð“Kµÿ*ø13ûjÒƒ‘…SFDDjÑ’ Ãü¶™ýÛ„Ž-² fÖü–sîià› ãE3›LèØ"""""’œ£@Týj3ã7>ò frù¸å¥‚¹ÙGº­™Ö{¶Ð²m>½>£Œ,„ó4m»ƒ¦mw0~ñC'_aâõ«8æ8âûį7ˆäô‰×ùõ×üo¿ý“<ú;“zG’:°ˆˆˆˆÈ –àœ~ï7N03½ð9k[G†tp×ÎÖb(!Ô”WÀžm÷¶³íÞv.Ÿãä‘^u[@†êõWÆøóßy™ú¦€ûÞÞ¹ôƒ_-ÌyëXÙœõK¼ÿ€ÅŸ–Elë¹ïåf1ÏõV4²²ÏO:鈈Èâ( #""µ(ÉU<6&xl‘ÅJªj`µY¼ý{²cŽ œî©ö±stö¶qõÒÀ7ÁxGúZvn¥a}/8G‹ZUW¤\fM7Ýkº™aäÔkŒ¾|›ÎQ¿D¯?°øsç†ÑÕ›èuš·‹ˆˆˆˆ,Rç¾Cc}÷&4ç…ö® ×/½ùZt67qÏýYÖmj*>¦9¯ÜªÞõô®oddh†—ŽpæäÓSožªê讫ÂènJs^‘¡0ŒˆˆÔ¢$߸H2\ ²XI†·jaµ¹5‡Ià €®µí\½<8§ÆùÒýºžNÚ{€ ±ž\Þ]$·‡kj¢å]¸tŠá£/qÆ9ðàB‡9‹^“8ºÖ´'5Ô)àdRYá›óf»ëÞ4 Ó³¶GÞÕCsk 5ߕۧ¹%ÅýwáljgûßtûlObaÍyEDDDjˆÂ0""R‹Ž9’ùß9…ad%Q3Œˆˆˆˆˆ$á0ð“I¸{m{Y ¥@ ¥0Ìô®}îë4Æm›qOb¨Rƒ¦¯^gäùÉà¼ÃÂR3 PЂt&M[GÓîo ß¿';“ÔÁEDDDDV¸Äæ¼ \»<ÁßÿùYvLg<Ímé*Œj^Ç;÷ÒœWDDD¤F( #""5ÇÌ&s/»8¼Â0²’$õz5àù„Ž-"""""ÉK¬)²{MûÜV˜²PŒ‹o- ?y†Ésiص̚ž¤†,5 ?6ÎÄ /1sõz´òrEøœsV| šƒ®ÞÄZa@m®"""""oEbOwt/¬i#Ÿ7N<ÛÏ+/óÀc]ÜywËLjÙ`ßÏ}çW/Ž/ø{² |­.ÍyEDDDjˆÂ0""R«“L¦Ñ9×if} [d±’ Ü1³‘„Ž-"""""ÉK좃®5m@)ôRùÁœ¦˜prŠñ#'˜êÌR÷V‚–Äš:d²\ž©WÏ1}î"æ‹á+‹Ã0Qð%Á…` ¯Å®µ‰†aÔæ*""""rë›ó.¤¦ÜÄXŽï~õ /äÁ·wÓÙS¿D#“Z45™çij}œ99„Ùâ¾w±¯ÕÛLs^‘¢0ŒˆˆÔªÃÀO%tìM€Â0²$†ÑŒ"""""«Øþ=ÙÇ^6WûØ¥f*š`Þè>Αbì™çɬ[CæÎ¸´ÞZ—76såÓ¯] œš,¾”…®â&˜âëÑÊ_—F÷š¶$‡¯y»ˆˆˆˆÈ-êÜwh ïàÞDæ¼·Ú¶Ñwu’¯|æ›ïnåÞ‡;©onóȤ–˜¯žæ…ÃýLNäoi 7ÃhÎ+"""RCô/v""R«’|cªÖ•eÂ9÷ß#fvpÖãm@k2£ª™7¿<ô Þ‚þ%Þÿ‹;?á"÷ÿN`¥þkÌbŸëbý1pðM·Z¾.&=©ŠÃ$paPך¶YAÀ9zØÆØµÆ® ÆÅ0ódf®^#×?@fã:Ò½]q¨A¤$?2ÊÔk¯ŽA–µ Q|Í9ç0©† k¾‡óß8·ÃX˜qt­I¬&Kêà"""""5"‘9oÇMÚ6î}¤ƒ¾+“\¾0~ÓïuÞqþÕQ®\œàîÝmlÝÞŠ÷šóJ¥ëW&8q¸Ÿ¡þiÂТöÓ›´Â44¥xð]|çKWæ|íf¯Õ*МWDDD¤Æ( #""µêyÀˆ.k©¶¤Ú6DŠœs÷Þ¼gžM’|ÖDÆÌFˆþ[#ó03c Ï™_ª}¯tfv ¸–ô8DDDDÞÄàǪ}Ю޶y[aêšØüîG¸zâ,—¾w‚™‰éRƒÇì0dúü%r×ûIoXKÐÚ\í§!ËMÏ0}é ùþÁŠŒsDâŒ3\àéܹ… í"œœâü7£0Ly;L‚Í0§öïÉN&uðÛìMzoÁÄïÿoYÜù™ZĶ |fqÃYVÆ–pßz]Šˆˆ¬‰ÌyÛoÒ¶Q×ðÁŸÚÌ™†xú«Wž©øºóÑÜÅ{ÃÓǹxnŒ{vgéYÛP¡Ë27>–ãÔ±®^'Ì[ôš1p,_™†ñc÷#<¸·›ñÑܼûK°æTç¾Cµ2çýo¬ì«>»Äû?üÀ"¶]Ķý‹Ü÷r³˜çz+> üÉc))0'"²Â( #""5ÉÌFs/w'pø Sç\7ðïŸ|üðùy6M2 £æ$I$$_WŸ¦¥½‘‘‘©RØÇôè8Þ;ºwÞIÛæu\~î4}'_V7uçg‡b œžfúì|k3éÞn\&ÄS’¤…!¹¾r7ú!_ÁxaÜòBE3LÓ†Ö?~/M­gôÆ@’¡¢¦«7±0LM,``f9`0éq,Wf6Ã3›¦—bß+^—"""«F"Wgê<Í­é9a—Ñᜇ­;[ÙtW G¿wƒ£ÿØGn&*²÷¼pq¨r<DZgoÐÙ]Ï];ÛhjÖœw5ÊçŒs¯ sáµQr3†w<˜ÎbÊÚa6ÝÕÂcOõÐÞY‡ópýÒ̼ûÍödªø,*ÔÒœ÷uàõ¤Ç±\™Ù(ð%Ú÷ôRí»˜Ù)àTÒã‘ÕCa©e‡I& £f©:ç\øeàÿf_1sažoIêuzÞÌú:¶ˆˆˆˆˆ,‰]|ÐÕÛÎèèµbÆ9ÇôÈw„ÒõiÖ>ºƒö훸òì)Æ.^+kùˆÃ0¾t?gúìëí­¤²mÑRº²*äGÇÈ÷õNÇ+ÝÃRqYq†qΑjn ç¡{hÛÔK*ðxïðÞ13:Qúž²v˜®äšajæÂ ‘%öwu¶§nNflh&Îí;Òxpo7Ûv·ñý¯_ãìé‘(Ôåú‹Û¹xÞ;80Å‘§¯³vC›6·JkλZ\»2ÎÙ3ÃLM†XÜã,úðÌ\| míýÁ^6ni*6 9ç™? Ó‘\3Œæ¼""""5Fa©e‡'p\…a¤ªœsï~Ø>Ï—ûÍllžÇ“zê FaÿžìÕÇ.ëª}ì®5mœ}õåa…©‘¨&¢‹9ï¨okbÃ0r©ëGO33217S¼ùáÂñ ‚ö|ScµŸ–T‘MÏ"œœ†0Œš]ˆ-QËKÔãœÃ¥Ú¶ßAÇöM¤2A1}Àt†™ÝÓÕÓšÔÓÓ¼]DDDDä-êÜwèjßÁ½‰Ìy³Ýu\83ZñØÈÐLÜøbqû©ÑÒ–æ~d=W.Œóì·®3Ø?mã©Çøx¾ríÊýS¬ßÔLwOC±SjÏØè ç_adx†0´RPÊ(½F ¼7R™€Ýt°ý¾v‚”/®QxËethþ0L»Â0""""r›( #""µìHBÇUFªÂ9wQæ½o°Ùù›<žÔë4©ßKY~ŽÀ…Aݽ­®Êpqø`²Ð cD!…ÀáãûMk;©ëzƒ¯^døôyÂ|XÖBÙ}fä‡FǧZšpi½_SÂüØ8áÄd)Sh¡t¿ðÚhܰ–ö{©Ž ðxW Áx…®¦GÆ+eœ£µ­‰L]"¯žOâÀ"""""5(‘9o¶'3ç±Ñá™âTÅ Ó×8Ó»¡‘÷}x¯œâÄsýLO…¥¹Ky[Œƒ04.že o‚uë›inIWûéÉš™ ¹riœþ¾IÂТâ[ó.š®zpfQ&€­;ÚÙýHu A± ¦ð^‹‹oG†ç†aZÚÓ¤3‰4 iÎ+"""Rƒô/q""RË’ZÕc­s.mfó/s"ò9çÚÿøEàÍÞe^na­¶#"""""‡÷Wû ]½ms‚,–Ï“›š"ÈÔaÞaæ0O|,ð´n^OÃÚ†^¾ÀÄå¨YÆ•…bÊÛbóä‡Gpu|]x-™»ÒÙôtÔ“ÏSÞ*T ±”=–io¥åž;©oo&øbLD˜òv˜é‘‰â~¢pE¯ÑdœÙ¿';’ÔÁEDDDDjL"sÞŽy7ò9cb"G}CªÔã¬8ÁÁ–mlÜÒÌ©£ƒ¼vz 8¸è¶¬-fj*äܹZÛ2ôô4’N'lÛÄÌèïÆ¹™0½”5À˜‹›aº×Õ³ûáNÚ;2ÅLåG)3_3L6¹V˜3ûiÎ+"""Rc†‘šefýιsÀU>´Ög«|\©qÎ9ü,ðï®~›Â0"""""²\%2?(„aܬ«5¦G&hì®[aâö޲†˜ pX]š¶{î¤~}#¯¼N~xdÖ¾f…bryÂp—JãRAOWÞ" Cl&6ÜŒ IDATa>z ¾¨ÇˆB0Åv ¨«£þÎõ4övJy?+ü¯®\þØäÈ8Pj…Á9ºÖ´&õt5g¹}ùû:Û3Ð`d8GCS ‡#žÑ€¹ŠpL:ãÙõP›¶µpêùn\ˆžb(&š×€÷0>6Ã… ôµÕÑÖV‡×B+Îøø }}“ÌL磰K±ÆJÓÔø±¦æÛw·³vcc)(5+üRþ–Fç ÃÜä5ZšóŠˆˆˆÔ …aDD¤Ö¦úaˆ‚g8®Ô(çÜ“Àï÷-ò[ç„aœsQ`«Ú®™Ù¥Ž+"""""ËSBa˜ÖŠV˜H†iéíˆ[aâfs„ÞGXI77Òºë.&û™|ý ÌÌÌ^µòÃB,geÇ“# £ÛB&n‚qÄ!™žNê×õÎqð…8ðB~)}^~;52j,¾ ͹$›ataˆˆˆˆÈí³¬Â0£CÓô®k(k„qà g… 4ßqÎhnIóÐ;º¹qu‚—_br"Íq\Y0&ÇŒŒN31™£­µŽÆz]жÌäB†F¦˜œÌ†Ñ\Ô{+4ÃÄ?MÛ[¹ã®‚ÀÍ ½‚0̺uÀèðÜ0Ì|íEU¢9¯ˆˆˆH Ò DDDjÝàG8nR­Rcœswÿ øñ[ÜÅ|Í0ë€$–$ÖŒ"""""R´Oöüc}@g5ÛÝÛ:o“ËÔÈxR°¸µ#oŽÀ{ÌB‚²€ŒyÃG]GAK Ó×ú˜¹ÑÃæì·âÃ{Ž0ŸƒÐªù´e¡œÃ΃…¥ŸgôC¥2DåA{ éµ=¤ê3ŸÓüRø˜ýX้)Â0œœ‚îžÄšaŽ$u`‘ZÓ¹ïÐù¾ƒ{«>ç½YÐ`th¦¬±£¬ÆGsSEþËÚb ³§lg=Ïñúk£„fq¦l7„02:ÅÔtަ† ©ÀWïIË‚™ãS9Æ'fâLp²8ãÁà 3è]ÓÀæm­Ô5D ?8ÿü½ƒŠ[*[„ŒåÉçç¾÷‘`3Œæ¼""""5Ha©uI]|¯0Œ¼%ι&à7€ÿ¨ »š/ “Ô볦Â0ι½Àÿ»ˆoùŠ™ýÒRg¹qÎe€c‹ø–)3[pó‘sîûÀb®ÛcfÓ‹Ø~ÅrÎý,Ñ;V‹ÿhf–ô DDDä–~¨šlïh"HäC#N­€ƒ©‘q‚À›aB‹=ÂÀæd¢ÐLÜð‘ò¤z:ñí­ä¯ß ?:^„™sß;|ºry©)0…b– —ÉàÒéègba1ücJ!'sW—!ÝÕAÐÜ„÷¾tqó„_ÜÜpŒ£ñkÊûÅYÔ^”Œšš·‹ˆˆˆˆ,UŸó¶d3)G>W9ך‰‚ 80‹C1T4”Úb(f¼w¬ßÔDwo=¯Ÿ£ïúD±Æç;…ÖGÞŒÑÉi2iO}*O–…™|žÉ™¹¼á}4õuÞEAάx¿¹9Í›[hnËà}yã ¥·RŠ 1³nãPÌèðüÿ,—U3ŒˆˆˆˆÜF ȈH­Kê WV8çœþGà£ÀúÛ°Ë冩µÕvší‹ØþÔR d™ò,îüL-rÿwm‹Ø~5-AÖÉâÎýJבôDDDä-9L•/ rÎÑÙݵk#Å‹9pŽÉ‘‰Š B``ÞXܸ(#á]ñ~‡bï Âõö´M’ëÄfrÎÏ ÅdÒuÂÉ)‰I…bä2i|Scôs ÃèGºâEaPÁ©Žv‚Öâ+‚ðžRø%ˆ/óå·ód¦GƉ_€ñ2¼Ñë£+™f˜óû÷dû’8ðRqÎ= |}ßòÿ™Ù‡—h8ËŽsîÃÀ§ñ-Ÿ0³Ÿ_à¾?|rûþ¿Íì×±ýŠu ¯Ë•î§ÍìO’„ˆˆH‚˜óB{W}W&+œ‰Ã 5yà°BÓKÜS :xÎ á}HgîÜÚBÏš.^e|,`¨ÇÂy3&ÂiØjú'šåÇœ1Cž|¼èƒñ0à Í0Α©ó¬YÛHGw}±ˆ›…^*>\Ŷ8ÇèÐ̼ãI( s¾sß¡Z›óþ8°˜…ÿÒÌþp©Æ³Ü8çîbq [ž1³ŸYà¾;€¿[ľ¯¬²÷~Ø—ô8ªè×ÌìûIBDd5SFDDjš™]vÎ]ÖTùÐj†‘Esν øðØmÚå pyžÇÕ #"""""ËE"ó„®ÞV®]-aÀ194NࣀK`ŽÐ,5nË |) šsPWGª§‹p|‚pt,:àÜ«D Ëæ47â‡G¢PŒTK¥ÚZq™¨ ÆÂ0ºp‡8S|}D·¾©‘ ¥— Š§ÊÆ*Z`‚òÇ}é5ÄŸOŽL”7]l†#©0Œæì"""""·_"gg»o†)7X)ô`…PLY8ÆCÔ©êp}­¡1ÅÖmm NsýÚù|X M¸8Hãâ†MïÀ‚Ð.ç±\õÏŪæ”ºòe-0Ä 0q3Œ7À;::ëèî©'Hù7 ½Ì ¿ÌÝfäfa˜žLOBQ-Îy7O,bû§—j ËT3‹;?í‹Ø6³È}Ÿ[͵àw~V:-Ü("’0…aDDd58 ¼¯ÊÇTFÌ9·–¨ æŸÀmí ¿hfá<'ñú4³W8®ˆˆˆˆˆ,oÉ„azZKZ9œƒñáñ(À€YX0sQLñ~tÆÛ…]4â}ÉGàÌãêñ™4áÄ$6=MáÊWÞ/™ëÒŽTW'áÔ¹¾Áx{Y2ޓʶ´4E-0BXjfâûÑE<¤|c.•ÂAô3‹›~üœ@Œ›Ó3»¦pjd<>Ž_A¢-Û”ÄY©µ6W‘å ‘9oGÏÜæ‘Áé(´bQëee#Œo8\4§-ÌÄs—»8‹¾ÖÚ–¡©9ÃàÀ$CCñ¾ãPLa¡€b[Œß`¸Ð‘7B…b–”s4:\Â,ïðÞ0£ø(4ø83š›ÓtvÕ“Î…ÔyZ`*C/ó…_f‡gæk†I¥=-퉄a4ç©Q ȈÈjp…adrÎÕÿøWD+“Ünçoòx¯O½Á("""""ó9Œ-Õ³B.eÁ—`žàË|ÃÅׂÅ¡uö´ó8UV‹«äŠˆˆˆˆ$-‘9o¶{nØ`|,G>Ok *¦, ½o}ÔcXš( ÌÌj“ñÙlÍ͆†&™œÎG!˜¸fv[ŒÏ8RõŽüL ‡˜¦¼·]¦É“nŽ~~a>j€ñ>^ÌÃF†ò +839<^6Âè5ÑÕ½ke,ˆ. ¹Í:÷²¾ƒ{«>çÍÎÓ ƒÁèð mÙteLzÁÍÓã-ÎTf¬„ð8R)èÈÖ3526>MˆçM…ÀDÔÍ‹RMŽúæ€É¡<CyMyoƒtƒ§±3ˆÞ—0‡,.#õßB€§¹1Ecc‚)´úx¢0”wÅÛ(Ô4èevøeöÛcó4ÃÌûÚ¬ÍyEDDDj”Â0""²$õÆÆ&àxBÇ–eÊ9·ø]à«p¸å†ÑŒ"""""r3‡©ò…A]Ý­Ó0. '4¶7—Z`¼‹ qð%0ù <,cÝ–=–7‡™Çy‹nÍ0ïqQÛKBT6ÄPÞãðé€Ì†µÔõt0uþ"¹Á‘jž¢šáë2Ôm\‡Ï¶caˆ…ÑÅZÄr—¤-„aÂ0þƲeŒg5Âàý6¾Â.åÍ0Añ~)392^v¥P4ž®žÖ$NÓÕý{²—’8°ˆˆˆˆÈ*Põ9o¶{nàÀ9š¦½#SÙ㢄ÅÖÊÊV²àŒYYÂÊÚb™´'ÕRÏôtž©0·Â·ŽÂ1ñc4w§hìH1r5ÇäˆjbnE*ãhéIQ×ì óMi ð`ýl¢@Ll© ê3)‚ ðDe eÞÐKy0¦”¡x[ü¹ÎjŒÊÍoÇ<¯Í*¸Ú¹ïæ¼""""5Ja©yfvÖ97d«|h…a¤È9× ü;àŸA•;' ãœkÚ«tür ȈˆˆˆÈÍT}¾ÐÝÓ2§Å¹¨&ð3•ºÑýÐC8B³(È`eÍ…ûeš¨& Ä࢖‘øÊ¢è~>O85K¸úú9 1…PŒ÷Ž ±ÌÎmä‡}åùñÉjŸ®ÉžÆMk©[ßKˆ# ¼¹¸¨ô3·B&Ÿ'œž‰.ð ÊZ`â Lág⼯¹îoŽñA´Ma;©±éx°®xÑYWoK§Ksv‘¥Sõ¿·;æißpÎ12”‹Ãs›`¼wQ£K´5ÎÊ3q#Œuk–µÅ”…c¼Ãcd2žT>ÃL˜/…k ë ø²Æ锣ks†©Ñþ‹ÓÌL„U>[+“÷޶5iZºS˜A˜/_Jï£\‹¦¹Ôù(ãýÜ—ÙA–ò¦—Òíü¡—âÏ·, “ËãsÃ0 5ÃhÎ+"""RÆ‘ÕâÕiâ(—Dû†,3ιðÏ€CõYó5Ã$ñº^Jà¸"""""²2©ö;{Z*B'ÇÄðÄ<G€Yd0O),c.n…0þž(4ãÈGàÌÇ«±ú(Sh‰1æsä§GðøúºŠ+Qf‘êÊÒÐeâÂe†Ï\ ÌiÕÜ›i\×Më¶; “& òÑZæ!\袌 C±qÈ磥‰ƒÂI/¿Z+ú!‚1ÞS ¿å¡ædŠÛ•·ÄxÇÄÐdißfñÈ]ÜZTuUÿYEªþ÷ö|Í0ÄÍ0Q%šƒ8+4Á”7”‚-…&˜Rp¢,Dã£õ% ¡+fŠm"Fš€04Ì…¸TY3L¡Æ•æKMíÍ _áÆù)ò9›û€¶ž4›êð)·Áq.)j€1JÁƒ ôx\©¡ç&–…^f…g˜u[x|lxfî”—›¼6—žæ¼""""5LaY-Sý0ÌÆ*O–çÜ»ßv$4„å†9jfµ¸ŒÓyà‹Øþù¥È2•cqçgf‘ûÿc qÛÏ]~ªvaqç~¥;–ôDDDä-{˜ê«uÀ†† MMõŒO”š9p01<^a€ ãU£  sÂ2Þ¢p„•‡f ÂBÆ<†EÅ!™b[LÞÈŒNL´µáëÒQàÂE .V)-Z·¬§uSƒ/žeøÜÕÊ«JV¹ºl »ï"ÝÞB>Œ.ŠNµ‹yŠm0Fñ¼»¨æ'ºØ+>ï8?ëóR[OEø¥ìgÌÅgÎã“#Å ¬x5‘ÑÕ£f‘Sõ9o]C@csŠñÑèŸF SŽ‘¡R@8°â‰ZPË[bŠ·qLa>;§ Æ9ðQ›ŒB›õµBp&ç ó†o—*`Jm1ç¿êÈ®Ípíµ)ú/NiÊ[¦±-`í¶ꛣQZÔüb®Øã\Ô CáØŒÇÇçwv åfA–7jŒ)}Ï·ÊŒÏ?·²â|­EU 9¯ˆˆˆH SFDDV‹$ÞàP3Ì*åœÛüð„‡²\Â05ù£™~>éq,Wf–c Ï™ý‹¥Ú÷Jgf_¾˜ô8DDDDjÿžlîÀ±cÀÛªyÜΞÆÏ÷—=â/, 1XàŒ( Sh„) ¾„ea˜Ù¡™0,,wkQ-‰3ðnV[L’™É‘»z ßÜDª£ÑÅAe+åWÍ­¯£÷¡{èØ¶«‡_büú`5Oݲ“jÈгç.ZîX[‚±¸àÅâÀJá±Üè(áàP ü<Á—òÏ+¿^† üìp̬6˜Y0åM¯Û ”7Ã( s~aÛŸYª,Sϰ¸óóÂ"¶ýÞ"÷½šVj^ìër¥û^ÒIZç¾C¹¾ƒ{«>çÍöÔÃ0…Ãh1 Sj‚±B%ž›8+ ±Ä¡˜òÐ V˜±òýù(:ƒ•7Dû³Ð1=bÓFC[P Oø²Æ˜8Ôy6ìl¤ûÎ:^?9ÎðÅ®§V[Òõž ÷4’]›‰B0ùB8©PdóB#jn̘‹~^Ñ9½Y‹ËZ*ÛbÞhÛÙ!Êï—K¨¦V缯Ÿ]Äö‹™ÓÕ‚!w~^[Ķ“‹Ü÷µEl[ íI¢Š®&=‘ÕNaY-†‘%çœkþwàW€LÂÃ2³‘yOâu¹š.h‘[s˜*_ÔÕÝÌ…óýñE Q3ÌØPÔ zG`ŽÐ—µÀÄ™¨D$nˆñŽ ˆZ`Ì;³9¡™|Üã¼E·æmN &Jnø¨­ddºÚIuf£\‹¸P ÇxGCG+[ßý6†Ï_áò3§˜›¬æ)Lœ <Ý»î¤çÞ-XT†` á—BÉA81ÎÔÕ~™™(äaðå'xöç®øy¼Iøe¾àË<ßã½+6Ã_ˆT¸,0Ìàþ=ÙÅ\ð±b˜Ù%àÿIzË•™½BtñÔRìû%॥Ø÷J§×¥ˆˆÈªUõ9o¶»Ž‹¯Ž…<‚cd`¦XqÆÜ&˜8D‹6ÄA˜ŠFoQp&n“™· Æ;œÍÌDùI™ÌÑÐИ ÊBesªx:ÖÔšbÇ;Ú¸2͹c£LŽå«y ç½cíÝ ¬¿»1:wa‚ñà,úa¼#7aŒõå±|©mÇy¢†_öØZ*Ã/o¼méç_yëŒ EM¼…)o¡&[ýf˜ÁÎ}‡juÎ{8ô8–+3{ øÐí{p©ö] ÌìãÀÇ“‡ˆˆ¬ ȈÈjñ20 4Wñ˜ ìÎ9ü4𞄇S0_+ ¨FDDDDD–§ª‡è»{Zˮޜc|p¢,à7Â-AYÈÅ¡·âva1 ãñ>¬Í„-µ[ ĸ²Ê’8±á<Î…cœÇÂ̹83çj7m„Áû¹í.ŽŠÏKaJŸÏ ËAôºðÞ1>\j†q.wWw5×p)Ò"""""K¯êwg»£0LyÛG.21ž£¾!UÙã£&˜B˹Y­/…`‹Q€(o‚‰gÕ6+0S HXY[Lé{ó3Ð~šñfOç†:êš|)ˆQ ÇÄ‹xÇæ=Ml¸»—ŸáâéñjŸÒªhéH³ý±V²kêóÑœ×~qÆÇ‹i`ÆÐÕF®ÏÄçéæí-od™µmY0¦Ð,CYˆ¦òX¥cö;:4S\|$j†±âk²Ê4ç©q ȈÈjr˜ê†aRÀZàõ*SªÄ9· ø-à'’ËM,—0Ì f6]åcŠˆˆˆˆÈÊsÈQÅ÷¬;+Â0¯üš ­77Á€y‡‡]¡EÍ a`s2Þ;|üu+†f¢ý„æ£æó†+´Å`XyXƇc M2ž©®>wŠÖõÝtlY‹ R¥¬F|Š/jhmd×eø¡­¼üåà _¨Ö)]Ré†:¶¼ó^ÖÞ¿3ȇqL”/*íî^ë§ÿ•KägòÄ-/ÎÅm0>¾ 'þܹÒ×ýÜÏË]*Â/oòÌÞnN3 ”·ÃÌyMV‡. YzUŸóf Í0qP¡0õÊÑИª ³ÄM0Væ´ÄZ_Š¡˜yš`œ7ÍÄÁ™Š¯9‹q›ŒÅûp&GB^?9N[O†î;êp)_œçúxÝÏ}ë›SÜ÷lÞÝ̉o2p¥6þ2SïÙþhw6Å ?Ä!%q LtÁèn\˜"ÌÞx£ð oØâr³@ o°M)°äâ Œ«ø|d8W±?¨l+ª"ÍyEDDDjœÂ0""²š$ñFÇ&†©)ιFà×ↄ‡óFæ„aœsX_åqè FySû÷d§x¸¯ZÇìên. =”'»¶½Ô8¼y¼ñ#ˆ2E $•¡™ÒýRh& È„¡‹aJ¡—¹m1qH¦ØS ÄX>dèüUF.Ý gû:îèVÇu®Šñe™ŽÝ<þ3ïáÒÑW9ý•#LNVëÔÞVÎ;îxÛv¶>qA]š|häó…_8gñª¸ÑsŸãʉsL¢6˜òäŸuåŽwÅ`LÅDÞƒ1Þs“ð !—Šð‹›'8”>š(®¸L|‘QWÂ0"""""µ¨sß¡©¾ƒ{«:çí(4ÃÄÿ¿ð£Ã3ô¬¯›\*^¬0-*ZffœE­›ÞJûµY™â~¢ÐKt æg¢ð Åc˜9¯L3t}šÞÍ to¬«h†)6ŸÄÙµu<ñá5\85Ɖo 01š¯Ö©½­œwl½¿…·‘J;ÂÐóÑsõx‹›e£ç=1”çòé &GóqcΛ…_Þ$ÐRz™~¹yx¦F‡fâÐB´¢@ÔÒBé±òÛY•Ò6eÁ–b[ QP¦¼ ÆQ<V¹ÿùipæàâKãô]œúÿÙ{ó0MŽúÎóû‹ì®¾¥®~«u«‡Ñ`„„Á€iŽÆlÀ·=;ö¬ûY¯wgmïx|àõ3Þg†µýس;ÞÖ³¶1æ0‡Á`ކn]è@è@G·ººî>ªêÍßþ™‘‘oUµúÍ·Zõýð¼ä›™‘ñæ›ÆoÇ'¾Ø÷Üí¸pïXœBRÉ1vØüôëvâiÏ݉;¿4»¿<þ²vu‹Ÿ4—A IDATÍ,)"NXðB PMä+¬XeÅÃâ ê$˜@l “`àÒdÜ6fœìØ:D§çú¸ûæYì¹t žþ‚ض«¨ä #vlåŘ͛€½f®¹þ|í““xàŽù®nóYqAo3^r`W\³e(Ku >8 ÆßO÷ÛÀ£÷Ä£ß<‰²tŸÛÀ¥œºrAÈéÙ¤¸ä„–Áò 2e¥ÚÎÏ.ÙåF’çhÉ0·ö☗B!ä)eB!U]‘Û\ßa³çC‚iAD.ðo`˜6£íÍšY2LÀm·I!„B9éT¦7F°gÏLž8 ¸TX˜>‰ÂX±E6ÆÔrKQ¥¦²LNšÑŒ4#XöF‡ÀØ_k9ÆØ}'e¨º¥`#YF¢$™Ébê¡c¸bÿU¸òEÏ€nb›LdÜj¹Æ.¸èB¼ê¿#ŽÞý0¾öW‡0ýè‰.oùŠlÞ6†ýoº×¼z?Ô”¥z?¨š0es섩野á[_½§N[‰Å‰0ðÉ.áMð˯¸/Õ~Q$¢‹“]ÇÂWF–ñ×ø×ÉÙSÁÌ¡z’X¯{† XB!„Òy/Ü3†™‹õˆW\2Œ7öô‚C ¶RL Ìd’`¼èÐH„ñb‹&ÂLÕ†O‹‰…­ä×]œxô N<¶ˆ+®ÝŽ«ž¿›6òGµµRÌ®Þf¼æG/ÅãœÂ—>x “žéò–¯Èæ-ßõº®»q+Á„)0FpCQÅä#§qÿ‘yœ9Ù¯Ò`Z…–@Œê"’eÖ&´´—•–²õkafÙ~ïÁgè(dŽy !„B6”a!„l4£[†É0ç!"2àü:€Îg¢œúÉïúy¼GUO®\ŒB!„B·(Ñáb{w:ðËäÎM¬%…c A¡¨™P–Q#( …ÑXš1…½>M˜1 ”^fq‚ŒDi1Îü¨RbRYƯ[ 1e¿¿~ŽÞý0žõŠçàÒk.‡ˆK†q/ã&\~Ý>\ñ¼Æ=Ÿ½_ÿÀÍ8³pº«[žEDðìW>׿ýFŒíÚŠ²ú}Di0ªÀÉ©y|óówbêÑ@a\š‹@œØ"NlñÇý¾$çÛ÷¥JyA"¿ Ù&Ç%H‘ifNΞJïÅÄÄήo='B!„ÒyÇ/ÞŠÙ©Å(¡cnf±I4Hn©RZbaE5#̸ñ%\ŠK-» %qvIÛJÒd¢öÅ&ÒVyðŽy°EX>³ˆ{¾p¾í¨ÔŒ]B7Hxñ/‘c’Y=ILn¿™îË/E ËÄòK,Ë©<#ÀÂŒ_7Â~ EQŒïÙÞõíïúw2B!„B6,½‡æ'?qc§cÞ={ÇðàÝÖDgÄÌO-×Ò„“Mª!q%Ç *¡E\Z *aE]âji&Á nK3ÂŒO„iI¤ñõ#X<ÝÇmŸÂCw.àºWŽ£wÙ–j!ˆJñûBpÝM{põõ»ñå¿{·}våƼ—>s;¾ç—ââ}[(´T¨[(C]Z¬ï÷Ò)Å]7Oãá»7=›d–6I%Te#AÕ6”hRѦ®·>7?½äžˆšM›lRQÇpÌK!„²  C!d£Ñõä|Ê0ç "ò\ÿ ÀëFÝ—sÀC-Ç»~ù#!„B!d­F—2L&‰caö4 êÒ_€¢Ä¨Q¨;VçKƒDši 4^š) A_%H~±©&U⋨“e`—‡õ6H$Ë„i1êf¬`3ýè |ñ¿~ûö_…ç½v?¶ïÚyõ{Áö ¶ãÕ?û}xá^„Ïþ—Oá¡[èäÞïÚ{^ùS¯ÁÕ7>ýÒ®Š«áG $˜RK<ðõûp÷çïÄÒ™e (¢—j+>ÆÄûN‚‘ EÆ7Áy·ï'R5ä—µËÔc ±2Œ›ÜåAÆž‰¶OÝqÀ7ºlB!„Òí˜wü¢-±´`a~ Z†‰q‹O‚Q'ªD‰0‰°RK/N^©Òb`E/̤I0×õ£*÷CÅK#‚éc‹øü_žçîÀþWcÇ®MÕ9Ÿôé--Û7á{Þqžÿ==|î/ÅwÌvrïwŽoÆMo¿ ×¾t7\ü«ýL0ªî7{ŸÅý·Ìáî›g°´X: f5É,M¡%•^)³¡%-S½œƒP©¤ûš›µéC@]ÿ…½±êXGpÌK!„²A  C!d£q€et÷ÿ÷ˆÈU]è¨=²FDdÀ»üž:­†É0„B!„µrÀwÕXoï.À­ŽëQUœš?mlƒ1ê¤)¼ìb`ÔNN) +ÈøXš¨;ï¥™Ò 2*(éaNÚ_jÁÅ'ɈšjõØPˆq3–*ƒD!xð–oá‘o<ˆç½ú:\sãs`67™%X5×]²÷éá]¿ûc¸ïæ{ð™ÿüIL?65”{¾iËf¼ü¯ÀKèÍE%Á¨(ŒX FªIAÀ±o=ŽÃý:æŽÏ¦€aŠ‹IR]BÓ'Ù––*-ÆDç¼cŠDYå±"/ÈÌOŸjÜ—‰‰]C¹ß¸ãàþñ¥®%„B!dƒÓé˜w|ï–꽸ÿRæ–°k÷æ Æoí¢ ¥O‚qbK,K¨“ú:±N˜0P”UZL ̈ØEàÖPDíWm9)Æ@P&‰4^ÜyèÎy|ç›'ñ¼vã¹/ßbS=ÌKÙsÉ6üÀ/> ß¾mŸýÿÁÔ㧇rÏ7m6¸þ ã¥o¼›ÆÜ§ô4nWŒÿÜÀãœÄ‘ONböÄ’¦6…–v‘e-eSªÞ®&]¦¾¦½ŒßÎÍ,ן×mÆ/Ú‚Ž¹£wàǼ„B!€§Ê„OB!dU¨êi¹ Àó;lv€»:l¬)ü ¿  7âîœkÖƒ £`2 !„B!dít*ÕOLìŒ&õøÙ<óÓ'±s÷vha ZZ±Ea·FQªTÒ¤² jÆ'Â8)Æ§Íø„™e/±¨±+ì&‚Kšøâ…kŒ8áÚ1U’Œ½ÆTu-/.ã–Æý_¹/yëõØwݾj•Y/p„ﯽé9¸ö†gã+ý%|þ½ŸÅâ©Åsv¿¯{í~¼öç^Ø4˜¾ò‹ø#Àì‰9|íCÿ„‡ïüŽ`L¤·xyeµû&Ú÷¯¸¼}Ya•àdï œÌ+¶õ~U.gÐ"ÈØã Ó'“;#èeRІ ° „B!¤{:ý;|ÏÞ¦€ æf–pÁøÄXÓ%VâD'gh,Ì4Å_&“c´§Éä’`%Á¸m’Hƒ M¦¿Tâ–<ûŽÌâ%&ðôç»E/¼¹Q½·{ÏxÁn\uÝn|ý“Çð¥=‚ÅSýsv¿¯yé¼êW₉1·H…·`4*'ÌM-á«}ß¹÷d-Á„i+­"K,´ Lqiˆ,+K/õ5a{ƒÛJËÎO/V÷Û 1¹gqÈpÌK!„²A  C!d#r”a64"òÿ Àu£îËhÈ0"²ÝJ?ßVÕ™Û#„B!„<5èTªŸØ› v–ÆÜôI\VŒjðáÄS 'Ƶr„,SÔÉ0¥;_úz"iÆ^_zÑE%’XêÄ8Cħ¿„²  FYF\ÂŒÔåh3w|ŸþÏÿ€+®½ /ç ØsÙxµb®—?|bŒÙ´¯ü‰Wá»Þ|=>õÇŸÀ‘±ÎYrùs.Ç›~é ®|þ¾H‚ï¢ï²‹‹‹8ü±#øÆgïD¿T—³ñ%·/­bL¸/¹4˜"sLšÇ" &‘_jiÆNÞZ˜?e'‰nöZ1«[¸€!„B!ÝÓéßáã{· Mó3K±È+©l +ªÄ‰-p <$ÇBqÆ—ãÊEmy)¦êGØgßÊ­°cè@Ü™ŸZ§ÿÛc¸ì™Óxù[.ÆžK·Æ:xo ÁKÞx)žwã^|áýãöÏÓòâ¢};𚮸f—äÂÝ Æ}®þ¥ÅGþá8îøâ” „5þó%’Š3u‚L$ʘ¤lCdY}ŠK›ÐÒ.Ø„ßk³lY*N.,×·Ü}þÝÝË0óB!„l(ÃBÙˆð¶×e€ˆ<Àïxë¨û2drÉ0WvÜ®¶C!„BY3÷O}ä¶©\ÕE{½^N@ÌOt).a’‹M)TPÄ‚ŒO„i‘f w},͸d™RªT—j&L%±8IF›x”Ê2R•ƒO™1N’ ’dì$!+{|ç®Gðþßú+<ÿÕÏÃËÞþ2lÞ¹µZuÖx9ÆMº¹ð¢]xÇ»ßßõ |ø÷>Œn{pM÷wWo'Þð ðâ7_ÐïkfcàÝ…›G…{¾x7¾ü¯âäüi+©øŽøä'º¬~?½>°2ûµÄ¼$s,'Í$×øcErlaú¤Ÿ å&DÙQ½‰Oîa^;·B!„Ò1½‡¦&?qãèhÌ;¾wK%„ÌM/U ,Ñú\•S -R%ÁÔRŒØñ½Ú¥½äå˜\"M³¾ŒœãÛRuÛsÞw ïÿ߯s¾{/}ÃÅØ²c“ë‘ÿïúµý‚1¼þŸ= /zíeøôŸ} ß¹gvM÷wû®Í¸ñ‡öaÿ«.v"ýèÆ¸4?Yæè½á3ïýŽ=xÜÊ<…q“›ÜÖͰ'¶ˆYVÞ—UîÛdû™‘È/@šúb2’KC~iy-ÌœÊÞ³Ž“aúnë²AB!„BHEgcÞ­; lÝ^`ñLYK.æ§­, RZÐM; ÕJxaaE½0ˆ-¨„{JØ¢DH¦>-F3ÂL(çT⎭WKà_œÂ½_ŸÁKÞp žwcEhA¡!$ÀEOÛþ×ûqÏWã³ñmÌNžx_M!xñ÷]†Þº[¶´–^*´jê±oŸÄ?ðŽ?rÚ¦²šœü’C$•U‹,ƒh¼2BK\‹Œ“”ñÛù™e aèZ†á˜—B!dA†BÈFäÔ¿¾t“aF„ˆ€Ÿð».qwºd=È0Œž&„B!„œ-‡¼­«Æz;ñÈ#Óѱ٩…:F]"L”꤇ê½\BiÆž¥ˆ¤™ÒÔ×—NpÑ ÕÅ&š8‰ÅOJQq×ÄBŒMˆ‘$-ÆOrò‚Á©ùÓøôŸ~·}òV¼ög¾OÁÓªÉ0ÆI#¡ìñÒ·|^üúçã“ÿ×gðúXJ$"Øÿšçáí¿òýè]ÑC©Š~ßN’ %/ÂÌŸ˜ÃgÞû9ÜõÅ{S¸4ñp[7CÊ„³t’„ÿJ¯•\]¹ýŒ¸"ùEb9¦pßu^šARÝÎÏœD=1(~;䮃ûÇóV!„B!dØt:æÝ½w Ž=üù/ÀìL SI/mI,F«”\‹V’`‚D˜ M&'¶À%Á¸®ei*)Ɖ3­âÄŽ•ݹÅS}|áýàŽ/Ço¿ûžs¡o%ü Õûk^vžù¢½øêGÆW?ò0–ûûùŒöðê}ö\ºV‚qc; „±÷b~z 7ðÜ{x*`Ö(´4ä”ÁÉ,m’JkÙJ˜A ÊÄÉ3a›ñ÷߬oÞ=[7ýß;ö¤žã5rWïÀ!Žy !„B6”a!„l8TuNDîpuGMR†"òrïð’Q÷¥cæTu:sœÉ0„B!„ó…Nåú‰‰xäÑ éD¬ cQ+=¨ßÁ{£µìRI3‚RÑdLr¬ˆŲWœ¬ÑL|A%±Ä‰/’¤Åø2€ˆÖ²Œøº¤*çe™cÇ_ü«÷áÚ®Áëö5è]>y(þ½`ÛŽ-øÿéxÕ»^Ž¿þÝák¿pÙÕ—à]¿þ¸ö†g£,²T  |Aµzoi‡þêËøâû¿‚å¥>PSZš).’œOÓbl²Kµ/âV¼Í¤Ë˜à¼ˆ1‘ðSÉ/EæX.ù%smô*âkæ§OæŸÃ½Ê0\À‚B!„ÑÑéßãã{·à‰GNÕ€¹©¥H’HÅ/¬¨ÔbI$¶I,aê'¼8“+Q"Œ‰“`¼àQµ$ÒÔH“$ÒDâŽhÐÇúØÔãgð¡?¸O¿îBÜôŽ}¸pïVDRLðÚ4fpÃÛžŽý¯º Ÿ}ßý¸ëKG{.ÝŽïýñ«ñŒìF œ#Õ=_^*qø“áð§G¹ìú´¡¥=™¥M~šòËàt™PhiŠ-I[Æ}o‘(¾êzæg뇯¾%]'ÃpÌK!„²  C!d£r”až’ˆÈåþ-€AôÛ†áá–ã]>‡¨ê±Û#„B!„<µèT®ïMì°oü$3“6¦té.e!0ªÕ±*õ£$—Jšq‰0NšÑ aF ôõD‚ŒÑ¥J|iJ,Væ€[ù¶N|Q7Hƒd˜Z–AF´±ÒÌÝ_¼÷~ù›xÅ}7¾÷'n¦[­ìáä‘PþØ{e¿ð'ÿîùÊ}xôÞÇñÊwÝSˆ•`Ür¸•ÛSM|ãswâãò˜9>g%–¢¨ 5¶A"LµŸžgé8QÆû•c*ÆŸóåRaÅÎJ~YAxI¯-’zB‘f.#Ãlß>†mÛ:]%— XB!„2::ý{||¢–ü?œÎM/F’I-” Vr² "a%“#°ãÎ*¥%”4\}UZ ª4™\"«¥[ÆâNýyÂ4™\"—s¾uû øÆíxÁ÷^‚—½ù ŒmsÓæ|ÝvíÙ†ƒ?^ü}Wâèsxák.‡ úg}VÁ½ÿ4‰Cx Ó‹±82@RY½È²ú„–œ<Ó”_ÚûU—Ü÷ªŒûœó3KÛ²mÇ&lÙV¬ùÙ}pÌK!„²  C!d£rÀ;;jëJUÍþ&FÎ "²À¿ð«vŒ¸;£ä¡–ã]Ê0ü‘B!„rÖÜ?þøGn›z À¥]´71ÑLä8sz ‹§—°iË&¨ '§¨)Ý{/»JE c¼,Ó"Íêê eU+Ê”â_‘Xœ$“J,*N|Ie)1u’L*Ú@‚vD°¼\âsþùؼñç_‡—¼éEñäšDyÞ Wãy¯¸Ú~þÒI0¨\ª;Þó(>ø>†oßö0¤0‘œ¦´ÄûrVû~N½¿B)Æ +î»1p"‹ûÞªï/Þ/ ò‚ŒÄBLC°1‚¹©¦ ÓË<ƒC†ãvB!„BFDïÀ¡Ç'?qcgcÞÝ{Ç®¸x¦Äâ™>ƶQL3Å’KbQ'¬ˆSCÂ$¿ã¯ÖJz‰Å›”*ði1q?|[¹DšTÎQx§Ù/çˆ*Ê>ðõ¿ w}é Üð¶«p݇Խõ¦ pù³Çqù³Ç]­-˜Êˆ±ý>öà>÷¾oãÑûgaÜ" ‘8’ITi¤­¬Id‚ÐHKƒ›Aeçf–£gMìžètñ€c^B!„ eB!•.p1€Ç;lsC!"?à÷ù%b¬9cå—4IÆŠ/ͺ R 0¢ /Í J‰™œÃû~óýøÒ_ߌüÕ·à/¼*šüb ¬bì!çÁ8§ÆMX0?½€¿çøò‡Û‰8…Uò)-+‹/fåe@ùZ¸‘a¥‘ü’_i¦ð’Læxµ/ÈÊ0mÏàP·tÙ !„B!¤AgcÞñ½[‚½ZŠ™›YÆÄÅ…•ŒO`‘j<—JlX $=—+êÇ„¡Øb| ¢úÃdTRŒ=§i[¦)îTÂŒ ’^ A½^Ü i89»ŒOþß÷â–O?†WÿØ3qùÕºû#ÉýŠE"ˆzÿ [ÏÿæÛøÆ¡£µô²j¡%yb ªm Ðt$´¤¯ZRZ©¬`nz1yÒÒgpèpÌK!„²Á  C!d£Òõdý}  sΑx€WŽº/눆 #"àÊûÀÕv!„B!O–#èhbPœÊQOט:‰‹.ß -¼Ø$¹@©V¤¨aAÆþ½Ñ2’f w},ÍÔu–ÆŠ-šIu±É/¨Ób$e$N|©ei16¦N”É‹6a*̓·¿ÿ#ˆ—|1ÞþË±ç’ ݤû2ÆnÑ/ÝD%;ù¨\îãÓïý<>öÇŸÆ©“‹. &™)cœœöMn?Üšä|n?-_ïgY¥ Š4OU¯B0;µÐx;–aî?¸|¶Ë !„B! :óîžÈ‹óÓ‹Ø{É–H,1FQ"JjÙÄË(ê’^rb‹/cGÖ±ØR Æ×`¥”†Øâ… H‚ úáÄøZ4#çx)ÆÉ9­âG˜Çû~û\ûò‹ñ=?üL\°g«ûi 4Fà¢ðDz_âëŸx_þðCX:³ì$˜Õ$³ä…–|ÙÁé2pò ‰¦MRY‹Ð’/›ïW\˜›^Ê<ƒ&ÃÜß;pˆc^B!„ eB!U‘‡Ð]ZÆ>_í¨­§<"²Àïøç°Ó€HM.æbØ„¢®  C!„By²t6®˜˜Ø‘=>{bÁ¥¶ ª÷ 'µ„ïsÒŒVÒLé¯5a@Ô³¬‚Ê,qRŠM7ñ+õšY&(¯ÆN2J’dD*b`¯SË2¢ÙTô_þÐ×qä“·ãÍ?ÿ:øÙWÃlƒÂÏR¸ à¶Ï|ïû¿Å±‡NXù¦pi,¤´¿ïd©Å˜j_‚}c2ûr–û6™Æ +ˆå—"M}Iä—Dr)¢k¿Îœ\ÂÒ™åÆ³ÖëåŸÁ!Á1;!„B!£§³¿ËÇ÷æÿ‰pnzÑ ªÕð3JbñÒI"¬4Ä–JX©‡± ±E 3©Ø¢a½A?Œd†‰4DÓ"îˆÚD˜–Dß–1@ Á]_:Šû¾v/;¸/}óUØ´¥ýŸ ï?rÿøßîÅôÑSvHmrÉ,-B‹äÊNqY“¤’2Q²Œ—fVZõ½ùësgNõ±´XfžÁN“a8æ%„BÙ`P†!„²‘9Œner‘Wø € GÜ•õJN†éòù;®ªwØ!„B!ä©Ig“öìÙq‡›a`æÄ‚•S  …TI.e!(œìRª“& QÍH3‚Â]_T‚L ËøzBAÆmK5ÖQÍ$¾H%»Ä‰/ˆ$Qu´’]¼,#AJL(Ë´¥ÒΜ<ƒ¿ù½¿Ãçÿòfüë¿ùÑ»t7úª(UñG?ÿÿà«9bëS_Ò”iImñçÒý\Ù³ÞoÊ.Fmëä_UÂIK¦¾`ß×55}2û vœ ÉA„B!„ŒžÎþ.¿pϘ•榗êáe$”b‰ñ ,ÄŠ-•°’I`ñÒ„‘:ÑÔK,a[•°âÛHÄ“&Á´ˆ;®”—cr‰4^ÎÑP˜…`i±CómÜöÙÇð#¿y=.˜ØV-úàß|ønÇÝ7­Dœö´•XVy2É,g'©´•­Å˜Z”‘æ6©«væfš©0@çÉ0óB!„l0¸’:!„L—?„\Ùa[Ou®E˜AŒZ†9Òa[„B!„§(÷?àDm…Áøø¶Æñ™ Ùt"y½ŠP¢ˆËÆ©#ñûðºÂ%•ˆ{Õ"‡KŒMì{_&JW©f4ùë]¢Š;%°4ꪅuUõxâ¡ILŸC¿TôûŠ~©(KEY÷~ÐM’‘ÖT–ÁûîmJÕ IDATé6“#îÞäöÍ ý0&ù^‹Ì÷%ùcƒ`=¡,37}Ò%éÄP†!„B!dcÑ;p¨³1¯)Œ{¡ÌN-ŲE%BäDŠZ h&‹À¹‚:2Ò„1ƒë°cÀÁuˆ[¼ÀžoIFñÏ@DÜp·Yf'Oc~ú´»_ñëÑ{gMf‰î]ShiëëZ¥—¦¤²rÙè{ÊŠ--÷0d’ïÏ4ë›d˜pè»{‚É0„B!dxP†!„²‘érÒ>“aH”¾“9ÞåóÇ !„B!çŠÎÆí½ÞN¤–Âôñ…HpñÂD%<ƒ¥¾!ÌdSGBAÆTû^JÉK,¡àáe™Z€‘hH%I]Õ¬¤J´ñe¼ âeמ£tL¿,±Ü/ÑïÛ}µL&¼„’Më6-o2ç“ÙFÕ}ð³bñ%,ëË™ñ%+0å¾ÛÌ~‘Ô“+77•O†éMìÚ³‹XB!„²>èìoó\2ÇÜÔb‹8§ƒd“Lñ#'›¤ÂJCÀÈJ7íu4ä’ª-bÇ qÇo3Ÿ¡Bá~'p/Õêwƒ¨þ¤:m¥å³™ZzY›ÈÒr - ù¥ýž×e}/I™äÌg’aÀøÞN“a8æ%„BÙ`P†!„²‘érÒ>eÒ«j.šÉ0„B!„ó‘ÎÆí=+#Tó\`e˜*ÙÃÄi/Ea‚÷©à"±(““fBQ¦H%™P´1$“‘Xi¥J‹1É5¥Í4E› .Š6A›°2L¿¯(ÝË§Äø…k)¥)§´ï§åÛöM´ïgEÉ6Á+¬°â¿S$ ’­TåÒD˜"_ªc$©Ù©ÄëãÚvÆÇ·wõ¨?|pÿøñ®#„B!„ ¤³1ïn'#„£‘Ù©¥LÂJNzifAzH‹@±BŒ?‡UÔaV¨Ã&•´}$Ÿ5#ÝTò¿C^‚)íËí7åš’J’¨R%Ö4$4>SSdŽÐ’½gI[ƒËÖ¯Ùéæ?S#¸`Og2Ìý‡8æ%„BÙ`lu!„Q¡ªŠÈQwÐeÒµg2 !„B!ä|¤³ñE#™C™óÔÒDYŒZy¢T­%E-¸¸óê·…}¯F …BU FPúzŠðzÀh]§½(U5€Q»Uµ’ŠÚúD Ô(D TbŒ•zÄ–³°’ˆ¨@Õ@ŒÚ­*Ôˆ½Výµ®Q+¸÷þœ¨@E\*Œ[~Ñ\­ä”³]‹/Í­‰÷%-ïλ2ya%‘_$<•eІ<w-*é&Lš=q²~ÀããÛQ­[Æ1;!„B!ë‡îd˜‰-•Ûá™^T­ˆÓ‰(´ìØPÜÅ¢bLjþœ+£ˆ­3(Ô•³I£ QTmøm%r;~­ëEÕ;ÞµãO¨kÓõ®ŽºúXýylýõõa?Ùô¯ðÿ±wÆß:ßgTÛ³Of‰eTÛjXÝž.S 3kZdE¡eme%*;7µW \0¾Ù&ßvǼ„B!&ÃBÙètõƒÈE"²µ£¶ÈÆeÔ2Ì€û:j‹B!„òÔ§»d˜‰ce©˜›9'Â8‘¢Jqi¤ºxÑ"•(lÊ‹ ®ë ë ShüûJI_¤%ñ¥™$#.Õ%’MŒ©g±˜zÆM,Ó–J#U2L¿T,û÷} gëÔ}K÷MØf¸ŸžO·iy“9ß¾_}Éû8&Ÿî~?áõk3õø2Ó'ÏY/óì N "„B!dýС $sT'ŠùÙåXt(`„ÆÊi2h\˵HÑ”%cI"”M uH£ŽŒ”r–ÂÊà:šýÅŠuä>\N‰:RǾh]·+;8™e-eÏRR1õýB Ïä¿£ÁBK^~²âRÒ¯Ù©Å:Aǽ"køpÌK!„²¡ C!d£Óåê ] dãÒaDd€½µÏÕvq0 ŒB!äÉspÿ¸¸¥‹¶b!¡ž45¹'¿$I0&8ËÈÈMÑ¥ñjlŒ—Q2‚K^b T"‰%R¢º¼ø2@´ ôK› c…+Å”}…†õHP¯ûNÀ‰f0¥ÂŽ$}jÝ7+œ·[[}(¯ ÚÖß©ÿîüñ4åÇד9žH3ásfOœ¬1»R®¢×­ Ãq;!„B!ë„ÞCyÇ!Ázg§–êÔ‘¬˜§´ŠlÒ7š &¶2‰4ëh‘nÖ1H2 î êcp¬ºS%*)F5óó©+y‘åìSWÚ>×ʲJ=Ì®EÉo£úV'ìø²ªŠ…Ù¥Æ3Ö± Ã1/!„BÈ„2 !„eòT"— Óe"`$ùW"ò€yùªˆðû !„BžŒ3z;Ý¢¥qØåôó­ .&‘r²L*Ídë)šuÖõ –m$'±„"H(±HKZŒ Rbò‰/u½Ar‹¯#YJE ã^Ë¥B¶çûœìK’ ã·Ñg ö%Ø7é~º χ‰0Íž†Ä$ùc9Ù%”`âï:•eìvnzªe¼ 3€‰F*ÑÐ8vpÿø#]5FÈzD,׉ÈOŠÈM\È‚B!ë€NƼ»÷n ¤|Tïç¦[…•†Ñšâ’È&Ù4™¤ŽU¥ÉdêXKšÌ*Rm‰;ÕM _ÐL=9‘e°ôË/ ²4ëY‹¬âË4Ëæ…–ÆýKä™´¾PÚY˜]Bé¸×î‰-]<âp¬wàǼ„B!Ê0„B64ªúmS5×¥”@6&9¦Ë‰øŒž&7‰æ×\ ðÿl¤"„B9ÿédbÐÎ[°eKaw‚‰AS“óÙTSd’D¤ºÁ¶Mš1E›lQ×™—X$P|y ÊWâKN–i&ÏÄ©-µ¨bSa4Hˆ±¯:&·5™ý4å%šMÕÜD—t¿)ÂØërI-FâïfÐ}OËDß›ä¯IÍN¹T˜Ä†™˜è,† Xü€ÛüWŸð§#í !„BHG§oß¹ c[ì±pD2;µØ%Ö$¬4ÅŽ¦XÓ’“©£,rrⶪ>æ…JîÈ}†è³æÏUi0Ñ«té*ÉçNĘìýZ£È’&ä¬Zh‰Ê6Ë4˶—‘´Ì€T™¹™åêùòϘ¢™J4D8æ%€ˆü†ˆÜ%"‹ÈûD¤Óx&B!dP†!„Bº›ÀÏt2lF)ÜpWGm².QÕÓ¾ð©u‡B!ä©Bg“â„;}ãÄóH È%Ád¤™VQ¢ÈEó}x~`âKN É.õ5q]•”¥Å8ÑÆ‹0nOÙ%û¾°²œ²ö}íGL(ü„ÒL ÂØT§¸Ô÷>No©¿ Ô’K›L3@| ™Â½Ÿ™\h<_€K%ê.`Að²ö !„Bº¦³1ï…[¦ÂÌäÒi¢<ò"ÆjÓd€i)«VHƒÄª%'¬CK{Ê ƽ_Ih Ä„ý ÷ä>#åÎЂe$*ÓV™²bŪÀ´ò)D»÷v– Ã1/ÙðˆÈ•~Àµ.ð.ß?ÒNB!@†B¡ CžœTÕÉÌñ®ž»ÛTu¹£¶YÏðBo°WU¿8âþB!„œïÜ+ß^Ï'tÔ³7N<1ß”R¥Uˆ0ñ5±4ƒ¨Îìõa;Á{ „/¬ÔâK.ñÅd…˜êÚ ®J:ñuIXW ™ƒÒÉ/• ㄘ'+º4÷Ó­‰÷1¦:ïŽ&w‘VB)¦ÈÉ2’Ê3p××¥rûžg&ªÉ@õKƒçnèp•\B€÷ølRø?øåÑv‡B!¤»1ïî‰1¨Œ¨*ŠÙgVN‚‰„’æ¹:¥½É&¹Â N\Yc"MXG( d%’ªþ6É£S¢4˜ %Æ9(Ùú‘l³/#ÑýB˜ÓúùbYgõB‹¬IhY¹¬´”榖ì¯)¡påž»Žà˜—à1û à–õ…Bé Ê0„BHw?ŒP†!Ãäá–ã]=wü‘ªZªê­ªú‘AB!„¬ƒûÇ—ÜÞE[½Þ@5&ÎÅrK¤„„ïM&É¥h µ”aš‰0™W*Âø——XV—øK,µ4㥑´®¸\}}\o_á˜Ò¾œ£e› íJÜIÏÚ¦åMæ|°/ñ~.©%’˜a%MwÉ%ÁdÓaBÉ&úþ¼tLO. ´uÛfìØÑÙ*¹·“ ªÞ«ªoPÕ=ªúRUýÀ¨ûD!„MïÀ¡ÎƼ»'Æ­;`zr1+\䥎œP’K¡#'bÙ${m2´K%“Uב$ÁHÚ•äÕ Õù¥]9«„–P>2â„×ÿ–ûß&©äúsöeÛ?ßìÔRõ\y)fl[m;6uñxó·xé ¼ÀOx¦ªÞ;Ú^B!糿8 !„u eòTà¡–ã]=wŒž&„B!„ ‹Ã^2ìF&&Ò„ÅÉù3X<³ŒMc›PA©. ¤”H.þ½Û…@(Œ@ Õjì15-¥Za¢,£^Êðïí¶0a=€ªØW ”Æ@U!ê¶Æ¸IMj%Û`¢U1j·ªP#õµ°[¨±³VLZ¯«Ã¸kÕ%ÔšÞ²z¢Œ R[Ül™ú¸Ä©5­ûiù¶}ÓØ—D8(µÈ*Ëe®‰äÉ”s2ÓÔñùäF¡ËT˜éƒûÇ¿ÕUc„B!„5Ñɘw÷Ä–JÍ÷CÇÓ'ûX:ÓÇæ±"ZçŒQ”ˆj Ch°…SÆÇjÑC Fa (Uëc¢õÖÂŽ7Ãö!Z¥³ Çša? PÕâêˆÚ2â¤[Gܸë] ¯£2‡bVYZ¤—³I]( „¢L"Ϥ2PÜ—ÁÂN³ìàOg§Î@]ê\òÐî^g©0Ó½‡8æ%€ªžð¡Q÷ƒBé&ÃB!À7,tÐÎ6™è ²1µ ÃÕv!„B!â“ñF¯·³ž¤wL›³¢C‘$¶˜8 &Mt©EdeŠ´Î°S ª'—dR-k$JHi¦Å4S]¢Dÿ>H’‘l]qZLYºd˜àµÜW¨} Û¨ÚIÎåö&À˜ÌyIÎÇ©,öºïAü÷:½ÅdÊ…i/ñuíßS(ÈLŸT1±§3† XB!„²~édÌ;ž&ø÷3'–ª!*‘#IXiKQ©Ä‹BÅJuH¾ŽH:i$Á¬¾ŽZÎIëˆË™ªî3@”õÍB  lYê¾®FzÉË/ƒ%•¸ ]V ú”d¢mXßÊÒK3§.33¹˜Œy]Q7pÌK!„²a2 !„ ª–"r+€:hn€ã´C6m2Ì•´ÝY„ûzED €W8`s¦ÈÃÞ§ªvÚ±ù /^EÑ[¼_UçW,ÙbÿÕá•Þ ÷Ëù#°÷÷;v,ADöøäðWUõ/FЗ]þ·U=àƒªú•!wiÕˆÈ8€w¸6sºðUÕÅN;F!„QÒɤ†ÞÄNTÑ&ÕÅä±y\þ´=•ÜPŸÞ¢VvñI.E £bCVTlŒԥŔî|]O• „ 5PSV 3j…KsÑàX¿‘øh&Õ*qZŒ‰/'¾øº|BŒû VŽqÉ4b úe‰~?^%W¡È¥´Ø 2`ã…ñ²Ž8Y'(ï÷MºnMrÞ =«Ny‘ü±PŽñI?‘‰O©,“ßžxbõ$ªð™ëN "„B!dýÒÉßëi2Œ33¹ˆ½—mµc)(Ê*AÅ‹Z‹@Àœ›ø´w,L‚qb ;¶t×Fm…@õç|në“`Ô.Ä ¢ÐHHqýH’fr‰4H’`ªzŒaBs¨¦JdÉÊ/ƒ…–³K]Y½¬Ò”TVZ"¡©%]¦®·ýóÍN.E#^uÏ\GpÌK!„²¡ C!„X£;† d4d¹ÀÖÚ¾SUÏtÐκDDÞà÷\±BÑ'"ðS.žx¼V2X (" àWTµbŸ""oð‡®Z¡èÿ."à'Uõ‰¡w,Ï~19ö^Ë0vdúÒÆ¯ŠÈ7üŒª~~ˆ}ˆˆŒø#?`пü€Iy·ªþA'#„BȨ¹VÂêïÙaJ‡ŸÂ!˜<:À¦ˆ¨…—\ TK+·¸ce*ȨOr©Å+¸ØÕP”©ß—ª•TSV¢MX§=Vª±SK,Á /¿ˆ8ñŬN–1êÄ—P´QhP—M†‰‡ ØÙQN|©’kÂ}‘üy©÷Åû+ˆ/¹ý¬ü"™c‘äRk“fr‚Mk=A{‹§—pj¡^%×ÞgE¯×Y2̆þ-Ê-`ñ}~í‹,<àϼWUì°{nÁžkV(ÖðØñæ‡G½P€KÂþQØûûÜL‘Àçü¿þVUOwؽù0ì³P¡ª]üv–ëË=ž¶B±eŸ„½wUÕ¥¡wlî·ÆðÈ/`±®žMB!ä<¢“1ïî½["¿CU¡fNØâ«„#ÔbK,ÅÒ Ðøœ:aE¬6ÑD˜ñRŠQˆmÕµ +êê°mÄb‹•bœ¸mdÄWG¶îs¥Æí»ÎAÆu¹®Fi3M¹äܤ®¬-¡¥MVYÐ"IDŸ§™*ã_‹§û8}º?Êd˜ =æõˆÈËÜÀdNß àãë`LñÓ.^¡X àª~©ƒ.­¹vqÌ"sú^7ê9"²À$‡?«ª_A_.ƒ;®Ä€Œðß÷ˆÈoE~áÙ%Øÿ[º³Û^BeB!ÄÒÕ$û:j‡lÊ0©‘“:š²ªó9‘"?Z¸1jKû‰@’­##˜d?C$§ ªC-«dOh  l‘S‹#Q½&P²é2ôµJ˜YÐ"-eq–eësñ5q™Ù‹î¹Òê?Pí*fCyEäû`€XI„€ ¿à·†Ù§sȳü™ˆ¼iT‘›`b\I„€q¿‚Õ ¤f좢Ÿa?Þ û›Åj~°»Àß»Å= !„Œ&ÃB!–;œÁðWd2  àáÌñ®ž·#µ³ɉ07¸/Øÿ·ˆ#€×“> àšäØ`\ôŒ²¿¹¶_ àÁþo#žH3ÊÈÖ;¿àßû¯†M* YOß÷ÍÞ–{l…k!„òÔ借v#{z;0=sºZ!ª8~t.*ãe‹BÅ…¬¸¤–B\‚‹ob|’KYŒj-kø„50¦tuºT™´—STu"ª§,¥JuA•ä"IZŒBT‚´1v E&-Æ%Ê H‹Ñ:y¦,e?^%×..¤¶B œ¼oMf?½~@y öÉ&µ´¥µ4$i–i»6M˜©ëŠ¥¿šœÒdUôºI†¹õàþñQ­øº¸4sìӴЏj…kFÅ1ر‘g3€7&eFÙß´í)骨߿Â5Äò8€¯û[ÐL¾¢»î4H¿·I‡‚}Ÿˆ<èB!„´Óɘw÷Ä,Ì.G a2 à†Y 'x$‰0Æ%Á$I,$ Ib±Ãl1° ,Ð -¦nË.z Ù$/a¨[‚DšF"L&‘&j«‘ƒ¨vGÑÇù×"Œä¶«Nh©ä—Z ª®ÉH<ÕgnD+‰,ƒËÆ×„Ÿµ½ï³'ãT÷ï&æÖÞCyÌû¬ýßFßà7†Ð—añFQÛ°ö‹|€_B_6φ§pïˆÚ_«xµÀë1ºþBqP†!„B¨ê’ˆÜໆÜe2 Ž©ê™Ìñ.ž·À-´s>q\U÷;"rj”Y û "2ªØæÕ2™Üß“£ìÌyÆ|rï¦FÙ™U°˜y>GÕB!„ŒžN)'&vâ[ßšt{v‚Ïd"ÈØ$5‚Ò…Ú­QŸJâß;Q‰-…Q´(ÙEQ‰®©Þ‡õ81ÆÖ© i¦ïfyÁEP“J,jg'½X›ÇJ2jÓU*YF ĸ$1‰,#è—Šå~ý¦Ád(;‰Hª$›Bc’ýôüj÷Mc_d òKN|)V_$S×€zºN›æQùB‚^¯“d˜œæÚÆ/¨êÝ~GDþÀ¿aqDUßêwDd7¬p²^ùfØ_m+L"¾’|×— ¹ Äz⎤¿[¬çßÀ!„õN'·ïžÃwî_pcC;4™NdÀ PH‹lb]€Gfd·@ƒ@¡š3^lqÓËEê% Æ”‰°RK9A[•ãÅZð¨åœX܉ÚòrŽÆõZ‡¦NõŒîMNd‰Ú͉'gŸºm½(¾*Y¦Nçiˆ,­©>’ôÛ«ë»/;3µI0Þº°›d˜>æÍÍý|Q²ÿ_σ)†×5s;âE%»H@øðŒ²¿¹¶_ üÎ?pà ×˯øû`ÿüZRf=}ßA,Ž]ào“2œM!ëþ1!„Rs”aÈùÉC-ǯì í{Uu~åb„B!„ò¤¸VÆj2ÜDog5{CU œ8>ge’@ú¨d‡ÂNþ)Ü$ +¨¸ô£( › S‹-š‘fÂë“„­ëQ/ÝAšLPwiìŒ:ñE*Ù%N|û<¦–e¤N|ñåP‰3âd™X´)KE¿T·*°›ëâVvO>ÁÅŸoÝ7+ì§[ÛNšÊR8a%Ni1þ傌„åüR4Å—TœidN<1tEáÝ»·¢(: :Üèƒ!„B9èdÌ»{b¬Z$Á‹ >Õ#\‹ªB²I0¨E/› =‰¥k¢$–8MÆ7&ÒÔRm!”^rŽ«#'¶Ôâ­#—HS'ÞØÏ ¢n-î‹¿O¡2ìÔ••Ë&"N(Æ‚L,ÐøÏ^oŬ,½ÔÛ¸ÜÌäb$X©»v¡(‚›7<8æMPÕh!KYÏÿ–2Óßõ¾ ÂmªzÚïˆÈÜ Â$âÁðû‘ïegVÁ‰¤¿§&„2::ù—B!ä<¡‹J.‘Í´C6ãéêà IDATm2LòÕ‘Ú „B!„lpîŸpï°ÛéM¸¤Ž Á£¿TbúD30’# 4E‰ÂD"…O _•@‘-ê¤Ôé¯E£Nc$P\rŠ{%«ˆ¸Õdk‘$”MĽãS\’ºÜµýè÷ËîÕï[9ÆÎT’ ­ F\}¾¹ý[ô¯îÏ a%MwiMt do£ãâä“‘kl #˜<:[M òÏÕDoç°g'B!„²Îé8Ôɘw÷Äq‚GY1?³Ô(ÛL% …‰qÂÔûÙd”¤Ž†àaâ:"Y£º¾Y/ZëÈ´ÕRGՖ룖ŠÒuûŠþ²Ý4éûZ„–•SW’ÊY•]AhIÓeL|ïòÒK[Ó“gÜ3åbw7©0Ǽ„B!Ê0„BHM“ú €+:h‡l,F)ÃðFB!„BHW }Ü>1±ÓNÞ¨<ìûÉcÍEEBÅ4¤—JŠˆ¤™L’H(µ9Q¦–*²‚G!ÑùH>1^|1Õ6+Ëø2-BL5cÈ_+b“aúÍÜÄ™°,ÂzM8›ÆÔ} –¨$¾äöãD—ø}‘¹W¹„—¨\îÚ•^’©ËMš<:WÏ6sV%^ —Eßè¢!B!„BÈ“fècÞñ½[ªaI5DQÅÌäb£lS®¨… dd“z˜¤‘ ¨#'¬´×‘”3k¨Ã ªNþhÖQ:&}5Ä×õ¤$•F™µ”M¡Õ -ÍÄŸäþ5䙺,˜9¾¥Â@Ñ• Ã1/!„B¡ C!„Ü ßA;] dcÑaDd €‹;h›2 !„B!¤+†>þ˜˜ØÍ ò“8&6e ”]’d˜–$˜J”(2¢EѼÞd®i—f\:L$±˜D€Ie™¦ÓL‹©Ó`ªkAYýR/E»¼âgàØzêó‘“‘hj'sÒûˆz¿ˆV"9i âKV¤Iê*KÅÔñy„‚•ªb¢掃ûÇ›K<B!„BÖ#CóªÖ nÜ;=y&[~PŠJ›l áð.#p VÕ‘—JÐkšÒª!æjå8Æyƒ$Ô~_ë!lÐ/äú¶‘Ê% IeBK›$´bÙ|¿lýç,KÅ̉ÅhýU+^uÀ½‡8æ%„BÙàlu!„õ‚ªž‘»\7ä¦(ÃsM.æ ÒAÛ]$*B!„BÐÁÄ ÞÄNØ©I1¹dÀN )Œ@@ @UPÀ¨2ü{X9ý/T ( º÷v«Pw¬tGÕ×c A¡€ºrj-}õ2ŠBU b F!j ¢cœè£VzQÔF!*Põ׈*Ôˆ[1ØŠ(о–6 &B3"ŒÉì;'Ü÷ç¥e_¤!óH*»„ûRo¤õTÇã}ëÅõ’ì;©M~ e`êøúËýú~»ÙA½C}–\À‚B!„ó‡¡ÿýî“aÂU—ìÑ‚‹)¶l-Gh½5  ŽU2‡Ú1Ô]/v\êÏUeѺ^{.h˵cSw>j˵ë­%­úèëÕ´­ª –ŠrYãmõ»YI¥E°©ÒbrOKRMVÞÉ -œÒ*´dD–eó×´”0?½„þr*X)vOt"ÃpÌK!„B(ÃB! ‡1|æÊ!×O69¦ éêAU=ÑA;„B!„t ã_pÁVŒm.°¸\ÚÉ0¨jk2 ¤Ãh-XX±EœcŠ2‚¢J£iÆÀhY×ãĘºÎ îP¾1 ãÚA$µH%»¸JìD!5PõrŒ“e ¬cßÔ²Œ—Q\½eè÷ËÌ‘:Å¥±5On?JŒ1Ù¤–µ +¹DŸ4Q¦Hö +×TÛÂnX‘*aŠÞ^Ê0„B!„ˆ¡yw^¸›7ôûZQT1=9H†A’ %õ9uЏTÌPlñŠ1‚Òæ‰ªÁõ¨„·<…•N±Å‹$Š2[ª¶¼¸;¤åÔ⎓^âŽëG$ÁÁp®URÉ'´ P\RŒ—_¢²IªNU_#Ig-"K³¬$e1 LZLO.Fb•­vï;GOí@8æ%„B!0£î!„²Îè"å‚É0ä\3*†?0B!„B:ãàþñv;½Þކ¼0ytvà5E"T4$ /c¬‘}¡QvÅ:]ÂLZ—‹G±³gŒOfq[c%­ø™6&˜Õœ³i,Ôå'õûŠ~ð^OqñåÃ}Yå¾Yq_$¼©Äbe—"xŸ_Ú™¢E°iûeü¬ “GçªrTï'&:‘a˜æJ!„BÈyBïÀ¡NƼNŒAË:ÁC˜>~fðE©á… “—$ꤓPÉÉ9Ñ"IK å‹J8YeF"¡$?já¤YGY*ʾ¢¿lǺ¥{¹æ[Ä“s—ºR• c¢¾šú7D–ÖÏU÷+’VÙ÷ðþ{f&ƒD@K Œw“ Ã1/!„B¡ C!„$t1¹Ÿ2 9—œðDæ8eB!„BÈS‘¡C&z;ÜDTBÌ dÀN ñi$•R„’š2ENp)b±£QO¦ø1@šÊ(ÒbªYAYYÆ$BŒD‰-ýV‚)c!~©]‰Ë·ï›Ì¾$å¥qÞ~´8•¥5­¥…Ÿî’J,ˆî]6Y&'È´H3žÉcs€[¹^.è _†é¸uØB!„BÎ)Cóîžk¤xLoO†RQ##k ’)ÜXk%a¥U&YIº‰ÄdäŽXÉŠ'lR%Ý”NˆqRŒßj«È2@hIe•UI*+Ü×H~ >_$ÌÔÃóPd‰ïk{ßëk2bŒcúø™ ÆI1¥bü¢¡Ë0óB!„”a!„”[PÍP”aȹä;ªš{f»xθÚ!„B!¤k†>1¨7± .¦’Ž?>8E 4•˜8&#ͬ(ʘº“I‚‰¥—#µSI'Pâ—J€‰„˜@L©dSÉ1¥É0AB Â:Å¥ºH°oÒýpk2û¦q>…÷Iâ÷µ°‚DX‰¥™ú;ð²L*×$çÛ® DÀ&Ãø¤!u"Ì–±»vmÊóp÷Áý㧆Ý!„B!äœ2ô1ïøÄ–X^(SÇVH†A(V¬ ›rL”€’K7Y¥°‚HXY!Ád€ôR÷£]Î1®a*LøÑ5-+§®4$•³*›‘U²÷.óù >~H3éç ˜>¾-ƒµؽ>M—IÓRÄ7a¥–Oš‰/ab‹KqI2qZL]¾_jóÕ÷›$˜5ãë¬e–ðLË~*ѸýXXA‹À‚DXÉI,Á±–$žªŒ4eSiŒ4ž‰É£³îYBõ,Ùô¡¡Ã4WB!„BÎ?†þwüøÞ ¦JôPL_\ñÚH²h$°„rL*U´$±4ÒdqäI¤É„Ò u`Å:Ê6 f9Nˆñ7"’TBq$ý\n‹Æ}Ê -ˆ¶ƒ„–lŠË@§.‹eÒzÒtŸ”éã‹Á³dGÙ½wìÜ<¬ƒá˜—B!„  C!„äèb¦ÃsŨdþÀH!„B霃ûÇðø0ÛèMì¬VÉ­f8qlnU×9Y"'N$©% Á%H"i]Ú¤™Xº•X¼\’\ÄÉ&©“VlSO _¥V³€êTw$ûþ|˜c‚ýPÒ1â&%²K¸/qzKaB1ÉO®ÄÛê^£q_Ò4ï¿4]œ8ê%ª:¦×c2 !„B!¤IïÀ¡¡yÇ/sò‚F‰ÓÇϬ®‚T¸ˆ„– &‰lÒ2²u¤bKóÒ~䤛°ŽyIZªM‡ _},©RLCVIû&ËdeŸ).¥—‘e…²ñ5uÿ£sêd˜Z®ßËdB!„Ò”a!„&”aÈùDC†‘€íCn—?0B!„BFÅPÇ#{wÖŒ[!ª˜<º:FI"—É-•ãSebY&0ÒL‘©«!‰Ä 1^*i 1µì‚ =¦JtiÈ2R%Á¤/"ñ¦–iV±/Á¾‰–ÖŒiQÒtœêxX.º¦¾ßiÒŒ‘𾦲ÌàmÊéSK˜Ÿ9™ÅÄ[©[|9}N†Yî—P „'¶¬¼ošûU=v¿!¥÷DZîyrÏŠÌ5ÙúVñ*‚zrø4! ä*t#ÃÜpÿøêXB!„BÈzb¨cÞÝNTP·øƒOˆYu2 Bq#')(™$–:e€8c׉5­òM{šL£­Ìµ1ï²ÝÆâI*¿äe•¸ì*„–¶û“Ü“Jdiù>š²*é¥)¿4û–Í1=¹%ÂøW2Ìý½‡8æ%„B!€M£î!„²ÞPÕã"ò0€+‡ØÌ0ë&‹QÉ0\m‡B!„2*†:Ù"ø ZÂ%Á¤øöWZåœ%³„e³2P-Ñ4¤—J0jï{}MFŒÉ0ýÄ¢ªTQ–V¬€ñ‹†.ÃpÌK!„B*(ÃB!yc¸Â “aȹb2Ì”ª~{ÈmB!„BHCOªœ˜ØÙ¹ÓN±bÖ’ 8£ÐZvQ{ÌJ-N–)YFQI3¥—aª÷9iÆÀh™H3a^¾©ë)\Ôˆ“3þöî<¾Žºúÿøë3“®´…4ìPö} ˆ©ÊjDÂ"² úEÀ]õ§È* ‚î ìŠ,A DvPºei ´iºoÉóûcæÞ;3wîMÒ6¹Iû~>ó¸÷Î|fæÜ›‹ö“Ì{N>ƒyáÕGž+,“׸ÌqÅ Mq\9³ßŸ_Òa n½Ñ½ú.­us¼úüßóµëcá¼ÎXw蘵´WÇ(†&¢€Š— ›»¡XÔÕ$ ½P ¶Çx††RŠÁŠÇ‹+.”¬syáÒÁ–’àà¬|pA`¥s^+ֳ▞tféÍØÒ..ñPLfǘ(“ í¤B3ñ÷WFÇìe%]a _:ÃhÎ+""""^µ  úú( ÃȪ0ÛÌ–d¬ïëï—î¶#"""""UÓT_; èèËsÔ­7*y5‡³{†ð=/ b$»ˆ”,~i #¾ïC…ŧìþñu~ü˜Å®,ÎÅžG!ÏÃEXŠ!–x§–üs\`ärÉ¥+] ”ïâA/ŒéY†xØÅ•¾Ï¬Ï4ósÎ8Nb\Ég˜ ¿¸ÒõžWþ¹íï;ÃäC1£nÝ>ï £ ƒDDDDD©ºÆÖiôñœwlV»y¬XgÈ}d0²ºŒe‚#YŒ¬c”í¼’}Œb×–Ê]Rp`tA.¹ÄϽB!•¬Ïc¥Æ–“®«PŠ.ùs‹Oç½pl9sg-+é ãÔ®7´×ߥ^ÒœWDDDD †ɦ0Œ ï”Yß×ß/ý‚QDDDDDª­Oç%ë®;*b€9ïÍ+Üå´§ÂüH,xµd\Â@!t·’2A™Øó’ãxÏ÷ÂGxÀð"ÏK†O¢çx±°Œ ²DÛ‚tåÂ;åæ‚0“ËåoßëÅŽë’WÔÄŸùÚK¼NÃ/.c]Ö¸ fürû–Ù§’Ù3óa ß§1c†Û!þ 7{Hóv‘Á­OÿM_»~±s‡Yüèø`Y¯ç¼”.2Â1•^¾CI™cxåŽQØ(†=’•Ä›•DÇJmÊZHñn0Q˜&¿ÝËz]|t…÷…\þó$ ¯P؆‰HŒ/Žs‰ý •Â/eÂ2ñ¥Ò…AÓ&½Ï«OOKt…Á`ÑÂemÀm+ôÍì™w›êkg÷áñEDDDD¤ïõéœwú‹~“F`й< õïõú`éN0ÉðFF÷‘’Fùc„ÇI##âyÐ]è…nŽá¢ybþA¼jWñ¹#+ð“¿±÷íâçKv_!ó½vÓÅ¥Bè¥\¥»0N"ô’u¼ ¦¿±ˆI/ÎŬØ`É¢\ŸÏyë[5ç‘…aDDD2˜Ùtú&Lðw`'3ûQ[Öoû™Ùï²6šÙmÀ¶À@gœ_wÛ‘jë‹yIp6°Û«/½ûp1ÀP 3üåðËïßÃâ…Ëz|Ðü5épK¼“K²ó™KâI²ºÊ¤C3%ÝdRÇ$:)„U¼d%ˆ)tЉÂ2Q¼0(¶€#Ùå¥Âk{í¥®ŒŠÂC"ƒÙÛMõµ­ÍmN.6èí· ]$""""2ø­ê9ïõÀë[Ã9/îíø€Ât%€¶'Û™þæ">ÿÍm·Í¨ ²°|Ø„pí\<@bÑ\ÏG8Ï.n#šÃ‰má  p8³Ø¶|¨$ìâbá.Åó‡s\Ññ=AªŽ €\—S!…će^²B*ŰJO-e;ÛÄF… K¼“NbŸÒ%z) ¿”Ö›eÉ¢ýõ´=ÙN ;ÂX< z ®±µµ½¥As^és Ȉˆ”·*Â0³¿3³ÞÝBG$iðu3»®7;™Ù É9÷IàÀŽ+YÇKf¬ä1VwßèfûŒ~©BdðÛ¸¸›13û£¦ ž]™SÞ¿€s›êk_N¬5{ã~3;4qŽ™áÀ3f͘ËgÞÊñ_ùÇîÙ£‚.~1ì] ðc™øó|@Æ=Ï ÍX!4d'ÄÉeº,ºRÉsD‰Ân0†YR) Ëfäðr%½„—%:Àx¯]å×.ü\ÝZJ]æëBÈÅe„X2:îTê,S)4“öúkïñ«53{Ƽ’ŽB±çÓ1»9¿OS}mü¡¹­ã¯ÀùÀ9ÀÐ{³éÂ î½æ*Ýæ8–푲>îœëî¿ý·$""²âVÕœ÷àܺÆÖWRë_îͯ°ÀÂ{@Ž9ï/ã×?˜À¡ŸÇøÃ6êщ\FI[<¢(„‹fòá•Bp&XÉ ¶„ÁbljΙ¶ÉÀL¡Ž¬pN±sNE£f§Î¹¨ ¤ÿIŸ½ïнêÌ[)ü’ߴĻ˔é´S ¿dcRÞ™ºˆ›¯œBûûKÃïJ`…UÌt 0ç­kl €?´·4hÎÛœs'§VõìN."’¶Mê¿§žý¢ˆˆô;¯Úˆˆˆ `/¬Ä¾]À/mÍìzad%Möém&ÎÌê ÉØ±µèŒ+Ç€S«]„ÈjbpUµ‹‘êˆB/­Ä!Þ>ÓT_{`IX<ý'‹1;ŒÀ¾cte…r9n¾úQ®<ïÎ_Úí K…8übÐ"ºðýìç…‡ $‚^a»ï•_J:¥xa\¾K‹^Dä¢ÇxX%hqùÎ0‹‹‚-Ù^^WìÐR¬P|?.– ?¿ŒM|œK‡mRŸoa\ég–öÀíÏqÁWncöŒyXè_îÇl÷Åïþä¹ôþMõµó›êk¿ì 4¯Ð7ºhe~Ÿ%¡?U»‘ÕÀà¶j!""2XE!‚•óUרzPF†[̇ß!ü»v¡3L>èÐÕpßoóçË&³daW÷gtÅ@FfÈ#šc• €Dá \åcT ÄÃ"™Á”rÝWÛÃÇ0 “\r¹ ø^{hY±Î,ÝÍ ´Ä;Æ”}ïùúSgb?»´Ö¼Çu?|•ö÷—aלÀÂÏ(æ~`÷[ÌJæ¼u­óë[5çí?J-Û§¶¯Ìµ"k’ýHþ·tQƘ9ýZ‘ˆˆdRg‘òVô¢ÿ ;x¼ÖÝ@çÜ>À%Àf¦?´K–[€3Ìla¹ιý€Ÿ¿4³ÛË3³.àjçÜÍÀÀ—¿—õ( ³âþ \jfÿ®v!"ƒÜà/À%f¶¬ÚňˆˆHU=OøGÉÞX\ü¢©¾¶â¿%n¿ÿÜ!€›4aæòk®x¨fvû¢pƒ…w¬µ ¼sì ­¯sþoâ«ÿïÓl»Kåú¾ÃÌxà›#Htm‰uo‰¯ó¾9,ÚÇ¢®.­ ;ÍXx¬ü>~úyt?ÖYÆ,ê.Þ×òa¼èѼð.¾f˜å»ÅxÑÝ|ûä.Š1âÁ¯×A\Vð%Ö­%£»Kf—¬}Sa¤’3.ëXùÐMñ­¼Eó—ò›‹â…Ö©å:Áà{Žã¾°/MGí±À97²Ò÷£©¾v*pxs[Ç!„Ý]wªø…*5«©¾öÝ^î#I­À÷«]„È ·8ÇÌ&U»‘An¥æ¼u­ç¼×<°ß€7^¿ü†Ë&×t|°, 78„-]ŒWŸí`Æw_ásçlÃfÛUnT“¬@²K²K´ XòÝd\t[çb'˜â6s—ïö%u{‰u}Iu¤Ils.ì€Z¨1~þعÈ%ÃÑØÞZzdéf¬K¥Â˜ôqˆ?fvŒ)†‰ˆÍy—,ìâ¯×½Á„g;rùÀT8ßµè³ñ|Çá'oÎGo²Ð9Öf—û~Ô5¶NooiXá9o]c«æ¼+§øf°KÇ IDATµ‹YMü—X7,©…aDDDÊ0³7œssuz¸Ëàfv_ws—'þJéãιý3ÍlÑŠÖ,«•%À×Ììå8çð]Â`K ðQçÜY„l.Z1³và+ιë»*Ћºt·îLK­[dfSªP‹È`öpZÆú·ÌLw­è]X߀?ç5Õ×Îìnps[ÇÀÀÖÛï´—þòx®»úž}zf† Ï0 Ã"íïÏç³ïà³§íǧOØ+óNªy^ÔµÄÌE¡R—p]à9<Ïð}GËX¾;LqïÅ2ùãDσôq|‡gžà™#aœyáûó¢Çè8. Ëä1XtQPÎJß`þê¥üÕ4ñî2™¯½Äët`%+äR¬d^ʆ_Ê„e2ƒ4åöý`§¼:“kÿßý´¿?? ¿Ä:Â䟯»î(ÎþÖ!l·Ã†Ç]~\ÚT_»¸Üw¤©¾ö¡æ¶ŽÝ€3ŸµÝ}g#ºEÏÜ,H­[Ü`fOT¡‘Áhð¯Œõ¯×›YÙ‹ EDD¤ÇVhÎ[רÚ휷½¥ápÂ9ï6[í<†ï]»;7_9…¶'ç„a‡( bÎa̵Œßþô59nSƶQÅ9o"Xâ…g¥a¢`K>°’Ì$‚-^2°RzɟÊǵh{á\ùpQØ7QGáÉãtY1bÅ÷ç{æV¬5:û’³Ìî%^iØ„T`%«Lþ8Vº³C1ùP ±n/çòF>œCiQp'Î r˼D™÷˜èº’ì¾B|]oº¸tzIîS¬©|À¦òX§´­ÿ˜ÉC·O§«3(`ÌÂPŒ…Á˜]÷ËIßÜ–‘£߃ÀSÚ[¾[רzK¹ïb]ckpM{Kƒæ¼«Þ§2ÖÍ6³gû½‘ÁퟄÁÑ´—̬Ûੈˆô¯Úˆˆˆ p•º`À€mÍìòaŽ& 9üŒÒ LÞöÀSι/­H±²Z¸Ø«› ÌÇ) ÂäyÀ©ÀdçÜ·sC+ÐÌî"lC}aûôr^1³ÎJÇéGCûåL'¼ñľÝašÛ:Æ6·u\C8×:¨Ü¸Cߟ\të¯?:¼B$0 ·D–—ž|“óO»•ImÓËžÏ÷¾-…€†2üx8#úHvKI‡8Çñ“?ñ3Â"¾Kvlñ¢[Úz^jqçyÅ0‹säÌÈF.[‚èŠ"/uµNáu¼cŒWòº·¿X!5¶šI+–I…k%û…ŸSrý‚¹K¸â¼{¸ã7­aÆÂŸ¿Eaž/|q_¾uÞ§ÒA˜¸qÀ-Ím­Ím{Vún6Õ×¶7Õ×~Øì. qêæ*""""²úèÉœ÷$`¿î‚0í- µí- W/‘ ÂÄ}âÈùÆ•õŒ]Xz ¤Èäçrí÷_aÚÄt³Å¢b'”X˜£Éê–’“” ¸Ô1Š ññ©}{vŒBXÄ# äJ—øû[¡@K*“Ê ÏT´ä?³Ô{.SOoÆ.ZÐÅ_.ŸLË­ïÒÕ„Ý`,úÙGßσϜ±%_úñŽé LܦÀÍí- O´·4ìUé»YרÚ^רª9ï*df-‹‚0"½7½ÌO ˆˆ 0 ȈˆTVîî"­À‡Íì43û Òœsõι¶èÁ9‡¿qÎÝæœÝ«je0[üŸ™bf™m£sžsîGÀ#ÀÆ=8æà2àUç\S¥f¶ÌÌ.¶n¤Ðì;A¿`‘#êœñrƦ¥„7¢Ø¾©¾ö¦¦úÚ¬ù Ím~s[ÇW)ÀYô ›úÖÛ®Ï%WÃÞûlYÀXª;HǬ\üõ¿sÏMÏ„A‰çRáXð¢ÞHeJ—dX##èâ'1åB3ñ ‰‹1Å®.ù×ù«qŠaËA.(YŠÝ_¢ý˽v±®0ž—ìÄâ2Â/ñí‚=‰ð‹K®/ÊZ\òóžøÒtÎ?ýÚþ7 ‹ ¬Š2Ö[4?½èHmÚ­§_ãý€gšÛ:þÐÜÖ±A¥Mõµ¯4Õ×|x£Ì0Ý%WDDDDd5uΨ8ç­kl½¹®±µìœ·½¥Áooiø*0ø=˜ón¶í(¾ó«ÝÙmß±QG0-0¯½“?]<‰Çî™IÆ”7 ”¤(‰ÐK¥ÐG¹ÀJÖ1*tP‰N*#+¸ãAtÓ‡âû_ç»Ö”v[‰Ÿ§| %Ñ™%3ôS Æ:ÌT ò$C/¥á—Òºâc§M\À¯Ï•É/ÎK â?ûÚõ‡sîåõìdOþL À¾ÀÓí- loiذÒÀºÆÖWê[5ç‘^SFDD¤²ô/TÞŽ7³ñfVñ—-ιus×EÇøÄ œû8àyç܇V`_\^&ìóçrœs?¡ûÑiÛ÷:çtÎíTi ™Í4³“¶UÓ/EDDDDd IÏSþìØT_ûæúÚE•vlnë8ˆð®¸¿Æöæ¤#Gåëß>„SNo`H EQ8& †ÜùÇ'¹ì;÷0¯£ôžY¡¿L×–¬ç…n2%¡º”'|îb˜(±SìêRè>Zô>‹É„¯‰.ÅG¯û×.Þ­¥´»Kv×—d`%–ñ½2ï=ÉØ'Ý}Æ9¸÷æg¹ä›§cÖÂDø%‚Úû#[rÉŸe«mÖïÍW À_¦4·u|§¹­£bwצúÚrÝ]çQþ‚!œ2ç¼u­?¬kl­8çmoi8°ûi¯ç¼#Öòùâ÷wàè/o‰ç»B(&?÷ £«ËøçßÞåÏ—MfÑüÎ’cÄ+ÉÐG,â¹T0Rá®ä2iJB7©c…@L.gäºÂÎ0ŽT ¥LèťƔ†SzÐÅ%ó}'Ã>…@Kü=”ù<Šá—Ø9qü§y&7\2™yíË‹á C0u‡©ÿhß¹f76ßnTo¾Já à`r{KÃwÚ[*Îyë[5ç‘^QFDD¤²I„;–ÿØÞÌn¯´ƒs®Æ9wá]e¿Lïƒ qÛÿuεÇíwÀGÌlb¹ιƒY}àJžëà%çÜÕιÚJÍìÂ;ÔžDØf†‘'?Oy øDS}í1MõµÓ*íÐÜÖ±us[ÇÝÀÃÀÎ+sòCwæ§Ɇކè‘bÇãÕçÞæü/ÝÆ„ß-Ù?ÄðcŒTÀÅóÊ…fbÇðË«ÌR®»J>“ïãò¯Sò¡ ˆ-]°”ê2ÓÍë²a—Dx%Õ9'–ñýtx†hßâñüôñÝqHl<ϱpÞR.?ï^îüãÿrAâç] Æßã‹§íÇ׿}#GV¼¦§;£KW›Û:¯4°©¾vYS}mº»ë •º ‰ˆˆˆˆÈ ”˜óÖ5¶Sר:­Òí- [··4ÜüØeeN>þ°øú廲î†Ã ]a‚€D穯Ìç×çOàÍ JöÏîvÒÓN0A“XÈ£´#LO»ÉdwGIùðý挠+ZrQ¦Û@ËŠufénlÙ@KfÐ'ù~Ÿ•Wüœ/èä¦+&óÈߦÓÕ~Æû{¾Çg¾´_üþöŒXke.{(Ìy'´·4Qi`]c벺ÆÖ’9o¥.H""""²æRFDD¤3 ˆÚL›ÙOÌlI¥ñιFÂ.W묢2†×8çîtέªcJõ-N0³/•û^9ç|çÜÀƒÀ«è¼5„mЧ8ç¾êœ+û[K ÝLø‹Æ €¶UTƒˆˆˆˆˆÈªòpð¡¦úÚÇ* lnëÝÜÖq ð*PñÂ‹ÞØbËu¹è²£Ùw¿­“ÝBòá˜À˜×¾K¿uwÝø4AP¼v#Ò(¿Ä·W º”t—)÷¼$tC1lãÎebRÝbJ‚0ÑÒË .V—Ëxï~Æçã²×UúÜâaštX&kÜä¶éüø+·3á¹wÀ‚ØÏ5(üœ7Üp \t$7®T¦*màžæ¶Ž‡šÛ:*¸©¾vfS}íÉ„Ý]o\•EˆˆˆˆˆÈ€P˜óÖ5¶Vœó¶·4Œnoi¸˜pÎ{äª*`“­Öâ›WíÆãë ]aò]CòCæwtrãÏ'ñï»f„s§Hf°£JÂYÇ(ÉŸƒu“ÉÝX`äÒKÎbï«\ ¥A– c]j,ƤCê1Ù-&\¦M\Àõ?~©¯Ì/v€ÉQüP·ápιlƶáªú:l ÜÝÞÒðp{KCÅ9o]cë̺ÆÖ“ÑœWDDDD*¨©v"""™]ÒÝçÜvÀ•À§û°”ÏrÎgfO÷áy¤ï½kfSË pÎm Ü |¬j¨#l‹þeçܹföH¹f¶øQÕ±::Ý97+öºÅÌ^¬Z5«ŸSœs3c¯÷ªZ%Ò×6sÎ}/¾¢'ÿŸ,"""k–¦úÚW€W*inëpÀÿ«ô ޼#†ðµs`ç]6æÆždyg^À˜çá0rÜõç§™øò Îüþ!¬3v$1Ìwøæ0ÌwaÓ‘h}þy`†ï9‹u1ñžEÏ-:–…á–Äq¼Øq|Ã7GàÅöõ=< ¢ç˜óÀ³ðÑ,¼ÉÂã;Ï‹:߸’ÏÂ8¢ÀL><ãÊ¿Nw©)é\ãz*7ÆO'±Î/]pß-ÏòÛžÃrA*c… Ì~ûmÅ©_ψCúâ+p0ðbs[ÇõÀ›êkç”ØT_û ðL_²ºáÌb3[^µjV/¾næ³Æ¨Iý¬ÍÌæU­‘ÕT]ck·sÞö–†>ŸóáóùonǶ»~ÀÝ¿“\Îp„ ;Â;19Ç£÷Ìà­I 8úË[1zp®ä<‡3Üù|7Q çÌ8n+>¢9ht|gÑ>Îa®ØÏpQÅ1D¡‹!vŽðÑ A ë°üùuG‰Ö8Ï Ç”„iº ²T½¸ÄØX¥R((3üR9hcf<~ïû<~ß r9 A˜ðþÅ Ì uó•­6b¥ºÁTrðb{KÃõÀë[ËÎyë[5瑲†Y ι1„!³>»ú!f  Õ9÷=3»²Î'«ÞµÀ7ÍlY¹Q‡¡¿ëöC=»ÿtÎÝÕõz?œsu2=cÝ7R¯ç 올Ï÷ì~¯BúËt`·Øë- ÿx§0ŒˆˆˆôJs[ÇG«é§õíÀ¶Û­ÏU¿ø3gF×Ç1x¯½ð.çé6ÎøÞAìº×fQ>$Ö•ÄžgQÐ%Zç;|ó0/H…f’š0à?Nih¦pœxXÆ, Êx?Z—3‡™‡ó,|4 ߇E廤¤¸ðЦè¢#WñÑ‚(Q…Ï"ß­¥ø:ùÛÏe„_\z\vgœÄ¾Î±`înüÅ#L~yF|Ia† ñ9ùä}ØÿÀúã+Uœ|®¹­ãGÀõMõµ¹þ8ñj¤ôK é›Ìœ \ßµ¬ŽÒŸï^@G5 ‘>—þYïGòg½ Þ刈ˆ@{KÃG_îóísÈúl¾ý(þrùdfÍXŠá¢$äC1Ž7'.àúOà¨Ó·d›]ÆÅ@LºËI!¼â…™³T`&l‰Vâa—âcL1#˜‰+œ±X˜&+œw‚À°ôG@ ¥]df¼èýx±m½éâÒƒŽ1¥!›r›äØEó;¹ûÓxkâ‚Bø%„1£¦ÆãˆS7gŸC6èÓïRìã< ø\{KÀëë[5ç]Iι/§VÝkf3ªRÌêé4ç\Wìõ¸ªU"}mûÔOfv{Õª‘²¼j ""29ç<çÜiÀà›ôO&op…sî^çÜØ~<¯¬œyÀgÍì¬rAç\sîà~ú'wðªsîçÜè~>÷ efªv«+3{økµë~s°¸ÚEˆˆˆÈ꡹­cÓæ¶Ž›ÿÒÏÝÇm6–‹.9’ñã· ¯Ä‰B# TÌïXÌßoæ¯ü¹\Pè†â:£x‰.'…`H*ÐQÒÝ$ÖYÅÂ"ùuùíé@Izÿüs-…[Ýz±[Þz†AÉ‚ƒ(’¼MnF‡˜wuÉ¿.„WHÕœ Ë÷ˇeˆöM½÷Ø~“Ú¦sÉ7þV1³ñÆkó³ è¯ LÜXÂî®/6·uØß'äîÞ­v«±k«]€ôý¬EDDö–†MÚ[nž Ÿ‚0ym>’s^Ïž_·4L‘3‚,œ×ÉÍWNá‘¿M'¢ðIf@¤B°$+Ô‘Ø^z /J)¡›c¸hŽX|?É%+€Òm %ö¾I<Òm½ñÐ Æt7öÍ×ðû '–ÂÆzŽàìËvé¯ L\aÎÛÞÒpPŸ|›±îºÔ²]¿V´zÉú|¯!ùùîÔ¯I_Jÿ¼÷!ù³þI¿W$""=¢0ŒˆˆH/9çÆÏ¿Ö¯b)MÀ‹Î¹}«XƒôÌ3Àfvg¹ιqÀcÀw!Ñp»? ‹Î?Ù9wŠs®Zu 6Çvˆú Ú…¬¦¾|˜YíB¤o™ÙT`ù÷’^œ »Ã¸x˜Øëè8é®,%á—øöØû* ͸غØ>¾—þ,âû?_ÌøÇ­ÏrýÏ`ÁÜ%eƒ0ã?¶ ^|$ã6«­Ö× ¢î®Ímw7·ul]ÍB 3›œ¨n0³›Ÿv‘Õ˜™ý°ÓÚòj×"""²&koiÞÞÒðC`2á¿s«ò·¼¡Ã=Ž?{Ž;kkj†¸D¨Â‚0äŒÇÿñ7^:™ùs–—8< 2BÉPL¹àLV%¬)Ûi¥4ˆR¬‡DH$¿är~à%YÊwhéq—Øý$òAâá¡’Ï‚TÍÙ3ã?Í3¹ýÚ×Y8¯³lfϭǹ—ïÊF›¬ÆW*oàáö–†»Û[4çí™K7ª]ÄjìWÀÄj!ýæ«Õ.@DDVLMµ Lœs—ß®v1ã€Çœsç—™Yi¯f©¶«€ï˜Yg¹ι&àÂ»Þ NqÎdfú#wf6¸À9w9°}Æwú¹¤J¾ \{88{½°O+ꆙ-.uÎ]ì@év¾M/rL™ì‘Z7§…Þ¹&]Ë{©×OdŒy³Ï*ê3{8Þ9· °^5k‘Á§¹­ccÂãlQåR >þ‰íØfÛõ¹úªñλsÃ@Œçá¢[UL~y:?<ã¾ôÝÙeÏÍ0ÏXÔÍÄwF1Ô‘žZç{ó=ÌÌsaCÏa¾Xú('¶‰Î>Æícž‡™áÌÃ0œ9̼ðÊ ¬_C$º¿¸ÔëâÕ=žG*°’ìî’Ù&š)éS6øR¾ÓÌüŽÅÜò«Çxsâ{Qø%|Oñ ̰¡§œÚÀÇ>¶m?{*:hlnë8¹©¾ö¶j3ЙÙœsÛGûe iëç’*¹ˆß†ùµÔöeÀ/Sëþ×§uÃ̾㜻8•ìÓÏ%UrçB¦?’ü]àË©í‹(ýY?Ó§uÃÌΉºZŸJiW벿û‘U£½¥aÀÍy÷Ú=6Ûn7]1…÷ßYB­÷€ü´÷­É ùÍÿ{#NÝ‚mw]çòÝUžg8œ×á,öÎm]4ͯKt?ñ G` …Xñуðá1âç/œË C.ù{<„Ÿ\Ô €üôwȪëâRÂÉêX“ð)eâKò\ æuÑ|Ã[¼ûÆÂ(S ¿äŸûCŸ=u+>|À€ú“Ì@c{KÃÉu­šóV`f œs‡Þ¸ñsèZÐUÊÌ–:ç>œ|Zå’¤™Ù=ιã€ó€Ý«]ˆˆôœÓ5³"""=çœÛ¸سڵdh¾`f³ª]H_rÎ}™°é@78ÅÌî-7À97„ðn-_ï·ªzn6p¸™=YíBD*‰B2‰ kÌL]DDDDÖPÍm'^`< þ8½|y7üéI}tJ!$’ï–’Šxžã“GïÁQÿ·7tu]¹ ö=ï èÊ…YÛsñqÖÅ=ÏutæJÇY.€ >ærX`]Ùa˜ »Çøx~ô˜|íù5¾£¦ÆÃ÷5¾GMMøèGëk2ýظššèua]z{~Ÿüþ±m¾crÛ»Üq}+‹,-„`,ìÞ=7nmÎ9ç6Þd~ÿÎôÀ­À)MõµêÈ!šs.ý?¿4³s«RŒˆˆˆÈ ×ÞÒ0 ç¼Ëîùã4ž~dVá.ºÙ‹nRà<øè'7à€£6Æ9…2ˆ:”Ö+í\b©n&–³’'‰Ç\éqçÊQ6’옻”®® ä½®½Ö0ü¯ðÞï³ìcøþ=¯hénLå}ºûæ„Üó[,^˜K}FÅ÷¸þ¸œômÙ`ÓUøÖtëVà”ºÆVÍy{È9·9°cƦ§Í¬Z7ïKpÎí Œ‰­škfÿK9ðc«Þ6³ ýQ_%ÑüvÍØô3’×M2³ú§ª$çÜX`ïÔêIfÖï7Ctέ |4µúE3{/6f°sjÌãf¶¨¯ëëNÆw`¡™µV£©La‘^rέÜVíZ2Ì>gfU»¾2HÂ0OÇ›ÙÛå8ç¶$ü¥1L5³©Õ.D¤; ȈˆˆHZs[ÇÇ ïþ_[íZÒžh}?üá¿,]ÖÝñÕ+ÞæÕs8çØjÇ ùÒwbÌØµ²Ã0eÃ.ÅpKW—ÑÙËtö: Sº=—Kb‚¥KËt†qA?ˆñ!—t&Xñóãâᗬ핎—Zïœñð__ õWÁ, ÂDo8`;¾ðû0t耼©êEÀùMõµú x Ȉˆˆ¬Zí- vÎûBëlþþÛit.ÍBÅÐHÖØdëQ|æ´-S;¤4ĨäÊo³‚\vˆ%Š)»­ªÉÓÆìö%tv–†aÆ®=‚ššr!˜žYz~©<&:НÃàñÌä™Ï §»ÑûN‡‚öÚ=ŽìL«r)%ökØš /:œÍ7« ÃA€…W¢@`ñú„÷øé×þÆËϼ…ï¹Ââya—?ºxÆ÷óe/ùíñcä÷/“ÂÏsx¾Ãó¼ä±üüÅ5œ>z‹Õ_ÂpWèxC>ð½öÓu¦Þ£ç*¿¯ô¾‰u.v¬ŒãÌëXÄï.l)a‚x&ü ^ÃYg}œÓNoˆA˜.àô¦úÚ(#""""²fªkl} Ø—8çÝ£a]ιt6Ú|­B¨$ÝÝåÝ© ùýÏ^còKó ¡ü="œsÅÇXˆ¦d[4í,l¯x ʃÄ9’Ljw),9ƒÂ˜Œš¢…ÄczLrl~©Ç¬1Ùc‹Ë‚ŽNnûÕëa&ª7Þa'Œ!C=Ž?{kŽùÊV1Óœ^רúaDDDD¤§Ü¿jEDD3Ë™ÙYÀ·‰üxÈ9·aµ‹YƒÌ>mfß5³®¬ιaιk€;uúµºž¹8ÈÌÚ«]ˆˆˆˆˆˆÈÊhª¯} Øx¦Úµ¤m´ÑÚüô‚&:pû°+‰…§„¡Œ0³hÁ®ûY ûÓ˜%Áß÷ŠA’’€‹Ke²B3… Œ?\œá IDAT—š¡dçE¡/Å‘ÃYP “– ¼ 'êrƒç%^çïlëG!œð°ÅPŽçÕ–^Û/rIi2Þc~™üâ;\÷£ûxgê¬èó?ëBˆ'0¶Ø|,]tûî·uµ¿&Y‡5Õ×þ¾Ú…ˆˆˆˆˆHuÕ5¶Nd€Îy×Ýh8_½h'ö9dƒDˆ$¿X`,^˜ã¯×½ÁÃwL'ÈY"ÐBV$Š!;dâeFâÛ“Ç( ¦xÉc‘ë*Öë2r9K+Zò¡šòášžZ²Â3ÉpMö˜×_Ï_®œÌô7%BHAŽÂ{Ø`³‘œ}é.ì1~Ýê~I²-«klÕœWDDDDzEa‘•`fWÇK«]K†sU»5À€ÝÍìrœsÛÿÎê·ªzç2àx3ˆße‘^kª¯}øpO•K)1dˆÏOÝ—sÎþ#†ùaW˜T¸ÄãßÍ/såy÷2wÖÂD@%I\b!‘xPÆ'˜ñžOÙðˆŸqLbœçAÑÕ5±ÅŠWð¤:Âê8“`Iwtñ Ï‹u†ï)–‰‡j\Ô9'z´Àxð¶g¸íW²dÑÒBà(ÿçI‡¼?ùéal¸á˜j=²Lšêk¬v!"""""20Ô5¶Ø9oÍ#OÛ‚“¾±-C‡y±Î$Ã1ñÌ¿>àÏ—Ofîì啌N*%A“TG˜J]bÊ#«›Œ+Ô™ëJ†b€žuqIdHgâu–ÖX ¿tßU&—3½g÷üiKæ’á£XW›¼_»hgÖÛxx¿eMÆ×5¶jÎ+""""½¦0ŒˆˆÈJ2³;;ƒ 4:ç.pÎùÕ.f5?0³éå9玞>Ô_…õB83êh3к‰ˆˆˆˆˆ¬”¦úÚÅÀg€kª]K–ì³%_r$[nQ…3¢.%VìZòÖ”¸ô[§í©i…€J1à’ì S °d„eòa?˜I'Ým%ŠÁ1fÅzã ŽpŒ‹ºÃDû$:º¸ò˜tÀ§¤ó‹ËëÇöɯ›×¾/}§þ9±Ø}'6²0À3rx çž³?'ŸòQ† ¿:y øHS}m[µ ‘¥®±5?罺ڵdÙuŸ±œóó]Ùd«‘±î0a Æ‚°cÉŒi‹ùãÅyíù¹¥•T°…DЄŒà Ñœ´rè…Ä1²ƒ&ùúÒ˪èâR|ŸÉ€ ñ÷xÄÞ_ñ=Ì›³œ;~ý:Ï?>»z±\²+ÌС'~}Ž:} j† ÈËÛ€Ô5¶¾TíBDDDDdprºæQDDdÕpÎm <l[íZÊøð¹J¡ÁÀ9÷eàºj×¼œdfÿ,7À97¸ 8£ßªê…Àqfvµ é)çÜáÀØØªÏÇǘ™ë×¢DDDDdPhnë8¸‚x“¨®®€[n~š–_+\áâÒW¼8Ç~ŸÜ‘ÃNÚœ£+gtutu]¹ õ˜…uv•¼µqCjÀóp¾ Û¸Pã;jj<|ߣ¦ÆQã‡ëüÂóâz?¶½¦&¾¯«8.¾}Ê‹ïðÀÍO±lÉòB÷—0Sì³õVuœ}öþ¬·þè*üÔ{äAà˜¦úÚÕ.DdE9çÒˆü¥™[•bDDDDVcí- vΛË÷ÿåmZï/ì:^¼|X%züÐø:ö?jSü°*–xäƒ)éu±Ç WºÎ‚Ø>9 ¯K¶D!’âº7§ÎgÉ’.ˆÿÅÉ`Ë-Ç0d˜Ö…VÂNª®°®üc1ìÒÓ±åö™òò|¹ó]–-ÉXX³‰÷µñ–kqâ7¶¥nƒaUûÙwãAà˜ºÆVÍyeÐrεŸŒ­šdf;T«‘5‘Â0"""«s®¸h¨v-e̾`fT»5@Â0ÿN4³÷Ê pÎmÜÔ÷[U½38ÌÌ^¨v!"½áœ{ح¹fVÛ_õˆˆˆˆÈàÒÜÖqp30¢Úµdyö™·øÍoZY´xy1ã%1›n¹.ŸûÚ'Xg½Ñ‰ÀJg:“KZÏ+h*‡fÂ0Ìòïc%n,nHM‚ Ã0^™ÀJþÑÏ¾Ôø.œ)ŒË¯Ko÷ÁŒGïzžŸR Á˜vƒ1 0>õ©ù܉{ãûî:±¼ß_iª¯-M‰ Pι}€'»v•™}½?êYÓ´·4 è9ï«Ïtð·_¿Á’Å]8 ‡DÏÁúãFrÄÿmÎ:ë K…Wb!–©0Kv°¥$0 Ö” Îä×M8—%‹K§c[m»Æy+dÉSyŸâ¶ 0þsßL^~jN!Ä‚0@`Æ~òé/l†_3`ï÷{à̺ÆVÍyePqÎ Ä[ ÿ Ø3öZa‘~¦0ŒˆˆÈ*æœÜWíZÊ0àçÀÌlÐýr©Êa˜ðSàgf”äœ;‰°ÆQýUX/½jfïT»‘ÞêAæ3»¡ŸÊ‘A¨¹­ã#@3°^µkÉ2{ÖB®¾æQ¦N•êCáõ°C9êÔýØeï-Ê„]’a˜Î®°£KgV¦âºòÛ—¿3[ž†Y]¼¡C£Î0QW˜nB.Å.1Ѹxø%k{™ã-h_Ä}7´2ëݹ‰ L¼̨µ†rƗdz瞛õÿ·g øAS}íÅÕ.D¤·z†é>¢›³ˆˆˆˆôö–†½ ç¼ëW»–,sg/ãæ+§òöÔ…x®üpŽBט¡Ã|9nSvÚ³6bI?– ½$C1e3©n2ém“^í`ñ¢Ò?¥o·C-Æ{-+~©Wâ}ÄW\?é¹·¸é²f½ÓÕ•ÿÜ‚Âëm·Y—‹.>b a–'*#«©eÀ7„é[u­O3€ç¼ë¬;Œ3/؉5m„YHɇZòË–æ¸ïÏoñÀmïÐÕ„c±Çhñ(³-z…HpeÆÅ;Ó$›²Ã6©…Œ:H<¦ÏSzìü /âYcâc'½8[¯™Êï.‰}^?·œ±éÖ£8÷ç» ä Ìrà$ad5w~µ YÓ¨3ŒˆˆHrÎ\K²Mê@2‡°‹Â½Õ.¤§ªÔæAàóf6«ÜçÜÎÀÀNýVUïý 8ÃÌJoÝ+2H8çöƤV/ZÍ,W…’DDDDdjnë Ü Œ¯v-å¼ðü;\wÝc,\¸É€Ì‚Io,ÍÃl±)nèPœï+•‚-~l{MMôº»q¾Ã¯ñ˜?{ßô_æÌœG1CЉ–Ñ£†qæW?Æî»ëçŸ\¯¼ÚT_; ïÜ,"""""ƒS{KÀŸóÎk_Î-WMåÍפ1ÅPÌ¡>½ ;ï][ìØ’±Ä.¹Òu%Á™\OéÍpç †ëmDDDVG ȈˆôçÜîÀ?€«]KÏǙٛÕ.¤’~ üœ`fOT¨eTTËIýPÏŠZœjf7U»‘¨¹­ÃçU»–r‚À¸ãögi¾· #ê %¡˜úý¶æ“'||\.ê ¾3B1e4±ÐL˜ ·Ï›ð:¹%KKj¶ÕæxÇáy^±ÓK*ÄR) S2.’‰mŸúü4Zï~ž®å]@²L~Ùa‡ 8ëìý;v­~ýyõÒS@SS}mÙn´""""""+ª½¥Ávïû~µk)'Œ‡n—Ý9=šãf„bìôá±tô&Ô ñŠ!–©0KF×—ŒpL" “+ ̼ð¿Ù,˜·¼¤Ö=>²ÃGÖô8Ð’ýu¾)7Æ9&¾ÐÁc÷ͤsyP‚1 ;Âl±ýhNúƶ¬]7´ ?µ{hªklý Ú…ˆˆˆˆÈêIa‘~âœGˆÙµÚµT008qgµ )§ŸÂ0÷'›Y{…:ê ;þlßǵ¬Œ¹ÀQföhµ èšÛ:N~ ÔT»–rÚ^z—k¯}Œó—F˜ÒN1u¯Í‘_ú8µ¬]v‰=ï̹h]Ih&+,“ ÍÌyy2¹Å¥a˜áÛm…6¬x)íè’Þ}G˜D'? ×X.àÉ{žcêóoE˜èo± À‘GíÎgùžçúïÔ{w'6Õ×.©v!"""""²zkoi8ðo¬vÎ;ù¥yÜúË©,œ×LbA˜|ט±ëãðÿÛœº ‡'.¹b‡—J`ò™t'˜â˜ðùsO|À‚¹É0ŒÞo}†¬éUè¥ÛðKll®ËxìÞL|qn, ÃDûµ 'lŠçè9ïÝÀçê[5ç‘>ãU»‘5…™½4W»– Öþæœû•snXµ‹©‚Nà[ÀáÝaÎ ¼së@ÂLöUFDDDDD¤gšêk4 ª]K9õ»mÊ¥—ÅŽ;n€…WìÝ‚ fOïà† ïã•ÿNÅóà k¼èšÂâ;üØkßsøÑ:ßsx>Åç…Gû»ÂyS ©syà¹âþ~ÉñòëÓuF¯]qÝÜ÷æqï51å¹iáûòï?(¼ÿ1£‡sÞ÷9ö¸=zæ*ೠˆˆˆˆˆH¨klý=pxλÝnkó+êÙz—19Ë\Úß[ÊM¿˜BÛ“sò÷…(†eÒšD˜& ›ØîJ­³ÀÈåŒ\-ÑùÔ>™ÇsÅûW¸rç,ÛþþRn»öu&<ßž;GI #Ö©çïÀ¡'èA˜_G+#""""}MaDDDú™s®ø ðÅj×Ò€cÍljµ ‰ëÃÎ0Ó€ãÍì© çü8®ο*= ffïW»‘Á¦¹­c7Âή›T»–rÌŒ;ÿú<¿óŒðâ y5°ãÞ[qàñ{ãÕÔD^Â.0¹\@g¡ûK¾óK¼#Lj]Æö÷Ÿ™@×¢ÒkZFì¼=CFËîòRÒ%¦Øõ¥Ð¦L·˜×Ÿ{ƒ§ï{‘\W.ѳ¨C ì²ËÆ|õìO°Î:#ûé'±BàܦúÚkª]ˆˆˆˆˆˆ¬yÚ[êûÐs^xøŽwyøöw£9oiÀ;챇³)C†z±Ž0±n/¹t÷—ìN0ù.2ñqÿû×ûÌ›³¬¤¶°#תIt|Éîüâ2Ç$Ç×½úÜÿÇLº:Ã9®a' ¬0ÞzçÑœôÍmS;´ß&½_¯kl½ºÚ…ˆˆˆˆÈšAa‘*qÎ\Pí:º±ø’™ÝVíBòú( sðE3›[á¼î¶^Åç^ÕîN0³ÅÕ.DDDDDDd°jnëØ”0S_íZ*yõåüêê1wÞ’BÆÅÂ08Gíksè©ã©ÝpX˜%|)Y†e’¡™ä>ïýï:–N=×ÚmG†Ž†_²Â.±õ~Mêu*,SSãa]]<Ýü<ÓÚÞO ÂXôÜsŽ£ùG½G140-Nhª¯½·Ú…ˆˆˆˆˆÈ𫽥aÂ9ïnÕ®¥’×_™Ï_®˜Â‚Žå…L¡{ áÔ·v½aö…-Xãá‰`‹ÅÃ1¹ôºTp&g%aš'žÉÜöå%5?xCFŽ’h)ÿX~[ggÀ£÷Î`rÛÜât׊˜üÍ>vS>yÂ8ö”—ÅÀ‰u­wW»YsxÕ.@DDdMef?>”þmà Üêœû­snDµ‹é˳Íì3Ýa¾<ÉÀÂ\¥ ŒˆˆˆˆˆÈÊiª¯}hªv-•ì¼ëÆ\zùÑìºëÆ„WîX„WÍïÍå¶Kïç•ÖÉø~x¡Žç9¼øóŒuù±~|ñ‹Ï͂¹â‹çÂ;áú‰cS|ô3Ö»ä¹òÛç¾7—~ýO¦½ôVôþòç ß'A@í:#8ÿGŸæ3ŸýÐ@¼|BA©¶ºÆÖéÀxàÁj×RÉÖ»Œá[WÕ³Ýîk“‹º¸¹h‰:¸´°Œ›1™Zg‡¡“Œ.2ùàJ¤!¹ÍŶyÅu?Wa ÀsÐÝñòÁÂcö˜Y3—pÛµS™ôâÜ0°'{¾Ö˜¾ü“hüÜ€Â|ì¯ Œˆˆˆˆô7u†©2çÜ';“¬SåRºó2p¬™M¬f«°3ÌëÀqfö\…s­üøÌ*8__ €o™Ù/ª]ˆˆˆˆˆˆÈꤹ­£¸8µÚµTbfÜý÷øÛmÏn‘Kì`›mÁÇÛoˆvyéŠ:¾ä¬ðØÙ;ÂÄ·¥Æ½óØ ,Ÿ¿¨¤–uöÞ¡k £Æ÷’Ýa²º¿DYã^öu^zð%‚\P¸.Dá­rÙm÷q|åìý3fÀß¿ã5àЦúÚiÕ.DDDDDD$¯½¥¡ø5pzµk©Ä ¹s:÷ßô6ƒ%ÄB/8Ø®~Ça^ªÛKªLÔ-Æ‚|¨†ä¶½o:sf-+©åÀ¦M9z^¡3 e:¿·y®tìËOÍቖ™tuYÙŽ0Ûí¾Ÿÿæ¶Œ^gHä½58´®±õÍj"""""k…aDDDçÜŽÀýÀU.¥;‹€¯˜ÙŸ«UÀ* ÃÜœnfó+œgoàvþÏd p’™ý½Ú…ˆˆˆˆˆˆ¬®šÛ:~\@3°&N˜ÉÕWþ“ŽŽÅQ¥®$³öº£9èäñÔn46 ¶Å`L!ì­‹o‹mï̼õÈs™a˜ÚîÁ°QÃð‹ïðS!—ßÃO…aâã¬3ÇsÍÏ2}â»™,¼°èØ>ÌáGí1ÐïŒ ð(pTS}mÙŽ´""""""ÕÔÞÒpp!|Îûæk ¸áÒÉ̽¬¤LþFcÆåð/lΆãFFdŠ¡Ë Çä²3Üó.s>( Ã|Ô¦¬5zHvè¥ìc±;MçòÜ5×__€É?wÎñ©Çqðq›†9ï€#ë[;ª]ˆˆˆˆˆ¬™¼j """`f¯ûÏT»–n¬Üèœû“sndµ‹YK3Íì¸n‚0ßZøA˜YÀþ ˆˆˆˆˆˆô­¦úÚ “€åÕ®¥’vÚˆK¯<†Ývß Œèv¸Ìû`>w_ùŸ„ï;üèÂ/þÄô ï$jŽ®^ÂcìØ‘üø‚Ã9â3ƒ"sðIaDDDDDd «kl½8(M [î8šï^³;íU]rF.Z‚9cî¬eÜüË)<óج0(ãQ¢”hŠ!ç‘ØÎ_ ô8Å%¹Âc¸ýýéK¸åê©Lyy^¢þøóÑë ᬋwæãEæà`aDDDD¤šÔFDDd‰&·‡W»–x 8ÖÌ^éÏ“®Dg˜IÀqföR…cnšV¬º~5 8ÔÌÞ¨v!""""""kŠæ¶ŽwµÕ®¥3h¾ûn¿é)r‘¿‚ÆÅ»ÅàØ¼~ Ç~oè¨ûK¾Lêy¾#L—‘ËtvL}à)–Í]Xrî >ña†ŽQìúR“êëãû^áù´g§0á‘— r¹¨# þ~=î¹×æœyÎŒ5¼Ï?ÃUàgMõµ?¬v""""""=ÕÞÒ0¸[íZºó¯¿ÏàÞ?M#×e…Jlº‹sŽmvCã ã>¢&Ñ &ßý%«#L~LËo3ûý¥É^9Ÿ>~sF‰w†!Ñù%Ý Æ‹B8/>ÙξGÐ$›ŸFÝ`vÚ«–Ï{[FÒïŸç ¸øa]c«.<‘ªRFDDd€qÎyÀUÀת]K,Î6³ß÷× W0 saG˜Ò«tŠÇݸ ·åõ—Ç#ÍlNµ ùÿìÝy˜du}.ð÷ôllFË’Eа*$7–\5Òb %X" ŠÁëÅ%ÆHŒ&j£"*î F£q "ÍÒà†Zq¿êm£  ²6 3 ÌLÿî=+3=3Ý}úÌ|>Ïsžâ©9ËÛõ§ê¼¿/ÀÖfhdl¿$&Ù³î,÷å.»>ï÷%¹ùæ·Ã+—•]£³ÃwÈN<$Øíë-À¬ÿ½ñ\~þ÷³dlá:×|ð“È6÷Û.sæ¬]†™;§ÊœÅ—•ïÏ™3ñ¥Kó‹óœ®¸nòËÊ×9UžýüƒrÄ‘ûOëç5E–%yq¯Ó:«î ktxpßLÜóîUw–ûò»ËïÈYï¸,·Ü°ö@›5Ë1ô€yé=oìºÇv«Š/«J/ã%eù=K1¯üûïróuKÖ¹fï9{ä~÷Ÿwïå—5^ï^2ž¯ýÇïsåe W•_’Õ·½I20§Jïù»çÐgîÖ„i0Ë’¼¤Ýí²î $uÖVJ/¥¼2É«“Œ×ç>l›äãUU}¶ªªê³‹“œ\Jy0Õ„×'ùvšQ„ù|’§(ÂÔ£×i]–äÀ$?ª;Ë}yø~»äg—G?f÷d¼dÅÒ·«¶2^²ðæ…¹ðå²ïüwæ Tëns&♳âáž•ÛúΗå㨪 Tëî¿Ö6gâõö?Œæ»Ÿ¸$×_~mÊšç)eÕëŽÚ!ÿtÚÑM)ÂÜžäpE ©ÚÝþ噸çýaÝYîËîûî¿ûàþyäÁíµÞŸ¸¥,_^rëèÝùÜû¯È¿~cªL”d&Ê2+þ{`í÷²âu|y²|yYg[½Oµú«Î·v纫çßÞÿ?ùõ/oÏøò囲v¦µÓ‚¼ê]È“mDfa’#a˜M”a`–*¥œ‘ä™™˜¾2Û=;ÉO«ªšMO¦ü*ÉcK)|¥ªª3±²ÑiIæÎT°ÍðŽ$Ï.¥ÜuŸ{0mzÖIž˜ä«ug¹/Ûï° ¯{ãyÞÉgÎ@•²ªÄ²ºÌ2¾ly~rÞséÙßÌÒ%w¯*«¬Üæ¬(°¬.ÈTIOY~m||Å1¹Çkµv¡¦ªòÛ\–|æ›Yrë¢uK0ãçúó÷Ìiï;.û<|çº?ÆÉø}’Á^§õµºƒlŽv·S&îy¿Rw–û²íösóÂ7î—c_ºWæÎ[ÿcpË——\:ô‡|ñ£¿É‹–ݣIJ¢3°ö{eE™æž[îQzY³ü²ê5ÉO¾}S¾ü±+³ðÖ¥Ìþˆ˜¿;sÿìù'÷›¦OgJ]“d°Ýí_RwX“2 Ìb¥”¯dâ‹ÆëÎ2 Kòƒªª^Zw$g'ùóRÊ/7´CUUOHòó$ÝKµé–%yQ)åÔRÖ\+€ºô:­ÅIŽNòþº³LÆáG¼ó˜ì´ã)+Ê&+·•”kyu†ß;”[®¾iUqe /+Š2Õú&ÃŒg ÊÚå—jírÌò%wçg_üNþç›#)Ë–¯šPSÆWjæÎ©ò‚’×¾áðl¿ý‚º?ºÉøy’{Ö/ê0ÚÝþ™X¸ñŒº³LÆ!Op^sú#²ã®ÛlpŸ«.[˜O½ëò\så¢u¦ºdU)fâµ”‰I.÷ܪjõ>Õ@’•Ešï-¹syÎýôUùÞ%×g||ý?ëΙ[åèùO²Ýýš°^cþ_’ÛÝþHÝAàž”a`–+¥ü0ÉAI.¯;Ë$,Hò¡ªª¾XUÕýk¸þIžWJ9©”²x};TU5PUÕ?$ùF’]g4ݦY˜¤WJùxݼ1-V IDATAX[¯ÓïuZ§$yU’ñºóÜ—½¾sÞùrÀA{­Q`)kcJÝ‘o|x8—û¿Ö*ÄÜs›˜âR&^Wnã%ÕÀºSeVžç¶knÊϺ87ÿæë-ãd|<»ìrÿ¼õ]ǦÛ{dÝ×d]”äñ½Nëu˜Jín¼Ýí¿:É+Ó€{Þ‡î³C^æþyÔ!Úà>wܾ4_øÐ¯óý¯Ý°Æ”—jÝr̆¬Ø'ë9æ¿]”?óŠ\}Å<¼½Ë6yõ{:yâ3šð3u’äâ$owû×ÖÖG ”re’Ç%ùnÝY&éØ$?­ªê13xÍ‘$)¥|fC;TUµs’K’¼%Éœ™ ¶®MòøRÊpÝAذ^§õ¾$Ç$¹³î,÷e»íä5ÿ´œôҿȼ9ëîR–-ÏÈ…ÿ7ý³¿ž¥wÞµjÌš[ÊÓ\–¯žê2§Zs"ÌŠ­J®þþ¯òóÏ]š»n_¼VgÍÿ>èñËi8!{î³SÝÓd}4I¯×imøI'€†kwûHrT’õ.F8›,ØvN^ð†}sü+÷μùë,®”ä?/¾>_þèo²hÑòUS^ª5Ê1Ù@!fõ>«‹0I•_zc¾röUY´pÙ³í?ØÎëÏÜ?»?|‡ÍÿCgÆÇ“<­Ýí/¬;lˆ2 4D)å–$OIòïug™¤½’ügUU§ÌÀµ>šä€RʧçTUuh&F8:y¦ÂH’K)ÿ¯î Ü·^§un’¿HrcÍQ&å°Þ#óÖÓËλüѪ©0+Ë-+K*7\vM¾ù¾ó2öÛ&&¼ÌÉ“aÖ-Ñd|<e¢3'¨²ìÎ%ùÅ—¾ß~g$eùòÕ…›5¦ÑÌ;ÿóŠ'åUo8<Ûn;¿îf2J’¿ëuZ/éuZËë0ÝÚÝþy™¸ç½¡æ(“rðSwÉkÏèd§‡l»Á}®þõùÌé—çê_ß1QlHªê^'ìU‚©’;-ËyŸ¾*?úÖ)eýÇÌ7c_¶WNþûý²íöMX¯1%É©ínÿEínÃ혔a AJ)w%yN’wÔe’æ'9£ªªs«ªjMÃùoOr|)å%¥”%ëÛ¡ªª9UU½%avž† Óá’$ƒ¥”kêÀäõ:­%90Ék˜MöÜg§¼óƒ'æàCö]]h)kUÆsçm‹ÒÿøÅ¹â[#©VN{™³Æd˜{l+÷™SU¹ý÷7ägŸº8cW]wýVO„Ùu×äíï;!O>¼S÷Ç1Yw%9¡×i½³î 3©Ýíÿ8÷¼ÿ]w–ÉØmÏíóú<2=tÃÓGß±,ç|âÊ|ÿ’듲¢ì2lh4ÌŠA0©ª*×^uG¾ð‘ßäš«mðü;îºM^ûÞNé=x³þ–tW’ç´»ý¦<ÀVN¦L85É‹’4e%–#“ü¬ªª§ðœ?MòèRÊ6´CUU»&ùF’Hsþ¿ç“IŽ(¥7 Ð@½Nëª$%ùNÝY&cÛíæç”SÈ‹_õ”ÌŸ7°j*Ìê­¤,_žË¾öÓüèìK²tñ’‰É0ë™ 31fb…Ük¾÷‹üê‹—fé‹×sΉórèŸä:1»ïµcÝÃd&9´×imð»€-Y»Ûÿm’Ç%¹´Þ$“3›9yîß<,ÏyõÃ2Áú..%ùá7oÌ—?qe-\ºzòËzT+þáÇ—Þ˜ó?û»Ü¹hÃ?×?ú ÊëÏÜ?Ù{ûÍþ;fÈ-IžÒîöÿ½î 0YUÙÐŒF`Ö«ªê°$_Jr¿º³LÒ²$§&ywÙÄÿ ©ªêÅIþ,É߬˜”³¡ýºI>¤)OÔ”$o,¥¼½î l¾¡‘±IÎNrBÝY&ëê+oÊéo=/×^=ºê½êO-Øa›tžyH.þI^?¶Î9ö=þÐü¡?’…×ܸÖûßL|°`Á¼œüÊ'ç‰ÝGLùß0~“䩽N늺ƒÔmtxp~&ù;±î,“uýÕ‹sÖÛ/Ïu¿[¼Á}¶Ý~nžrÌCò£oݘë¿î~G>oüèÒsÝÕ>Ǽù9æ%{æà§î2%¹gÈ•Iowû˜t +)Ã@ÃUUõÈ$$Ù­î,áÂ$Ï/¥Ü¼±VUµ])eƒß.VU57ÉÛ’üm64¿zö¹;É J)Ÿ«;Sghd¬ÊÄ=ê©ug™¬»–,ÍÇß{q¾}É/W¿y»ëªH5g ãË–¯süÀ¼¹_ºtݯø)â¡{´óš|F²ûƒ¦0õ´û~’§÷:­þ`K6:<øÖ$o¬;Çd-½{<_úЕùþÅ7lx§*™;w Ë–Ž¯óOsç­ÿý•v~è¶9éÔý²ëÛMEÜ™òÃ$Oowû7Þçž0Ë(ÃÀ ªªÝ2Q0éÔe#\›ä„RÊw§ê„UU=4Éç31š»)Æ’<£”òºƒ0=†FÆ^˜äÃIæÖe².½h$Ÿ8ã’ܵdé=Ê0³îDYëåIG<2'Ÿò—™¿ 1C’üG’{Ö’ºƒÌF£Ãƒ'%ùhtÏû“oÝ”Ïà7¹ëÎuyØT=t§÷×{eþ6s¦ìœ3à+IžÓîöï¬;l eØBTUu¿$_JrXÝY6Âò$oJrZ)eÃKèLBUU½$ŸJòÀ)È5S®Jrx)岺ƒ0½†FÆËÄ}ûýêÎ2Y×üîæœþ¦srõU7es†¯n³í¼¼øµOÍãÿòϦ.ÜÌxO’×õ:-?¤Ü‹ÑáÁ§$ùr’?ª;ËdÝxí9ëí—çÚ+mÖyæ/ȳ^¾wxÊNS”lÆœ‘äµín³~§€:)ÃÀ¤ªª¹™Xiö…ugÙH_Krb)e£G/WU5/ÉiI^3婦גô6åo ™†FÆ™ä‚$»Õe²î¾kY>ùÞá|ãüŸoÒñ{ì³s^óÖc²ëC›´vE–'9¥×i}°î M1:<øˆLÜó>´î,“µôîñœó±«Ò¿àúM:þÁ»o—“NÝ7»üñvSœlZ'yu»ÛÝA`s)ÃÀ¨ªªS“¼-›³lëÌ»>ɳK)ßšìUUí‘ä I;M™¦Ë¹™ø[›ØÊ Œí–äÂ$º³lŒï^ü‹|ô_.È’;ïžô1yÔ£ó‚S˼ùs§1Ù”[”äø^§u~ÝAšftxp×Lbö¯;ËÆøÙwoÎçÎøu–,^>éc:lçû²½2oþÀ4&›r‹“<»Ýíµî 0”a` UUÕ IÎN² î,a<É[“¼¥”r¯ã˜«ª:*ÉYI0Á¦Ðû’¼æ¾þ>¶\C#c÷Kò¥$‡ÕecüáêѼçï¿”ß^±rÅÜ{®Á1ñ{öÛ/ÈËN}zwèÿšÑ|Sàú$OëuZÿ·î M5:<¸C’/&yjÝY6ÆÍ×/ÉYo¿<¿¿âŽ{ÝoÁ¶srü+öÎcž¸ã %›27$éµ»ýצŠ2 lÁªª:$SHZugÙH—fbrÊu÷ü‡ªªæ'yw’WÌt¨Í4žäÕ¥ã¦ÈÐÈØÜ$Nòº³lŒ¥w/ËÙïÎÅÿ±þggöÞo×¼æíÇf—‡É;Ò°{Þ‘ïæ³§ÿ:‹ïX¶ê½Á#vÉÑ/Ú3óæÔ˜l“|;ÉQín¬î 0Õ”a`+PUÕNIÎKr@ÝY6RIrZ’7%9&ÉÇ’üQ­‰6ÞIz¥”Õ€ÙihdìÙIÎN2¿î,ãúknÉ{^ÿùÜpí-yù›ÎOüÓº#mŠO'ya¯ÓZZw€-ÑèðàqIþ5É‚º³lŒ[n¼+g¿ãò\õâœpÊ>yÔ!ª;Ò¦øl’“ÚÝþÝu€é  [‰ªª¶ÍÄ—]GÕe\•æM¶I&ÆM^J¹ªî ÌnC#c‡$97I«î,cÙÒå¹ýÖEyàŽM[»"IòO½Nëë°¥<8ÉW“´ëβ1–/+YxëÒ<àAZ»b¥nwûo¬;L'eØŠTU5ä=I^Uw–­À·“UJ1n€IÛ/É…iæ‚M²4ÉÿéuZÿZw€­ÅèðàÃ’\”dﺳlá–%yI»ÛÿdÝA`º)ÃÀV¨ªªW&yo’º³l¡>›ä¤RŠqÓl”¡‘±’ %ylÝY¶P·%9¦×i}£î [›ÑáÁ%9/ÉAugÙBÝžäØv·IÝA`&x¶B¥”÷'9:É⺳lþ9ÉsaؽNëÆ$‘äÜš£l‰®Nr°" @=ÚÝþÍIž”ä?êβº&ÉãaØš(ÃÀVª”òÕL<\sCÍQ¶Ë’¼°”òÆbô›¡×iÝ™ä˜$ï«;Ëä§IìuZ¿¬;ÀÖ¬Ýí/Irl’÷Ôe òó$¶»ý‘ºƒÀLª<« [·ªªöHrQ’ýêMÒh·'9¶”b•¦ÔÐÈØ)INÅ­6ÇIŽëuZ‹êÀj£Ãƒ/ÏÄBsêÎÒ`ÃIžÕîöÖfš2 ªªZI¾’ä ugi k’QJ±ÊÓbhdìI>›d»º³4Ї“¼¢×i-¯;ë|Z’Ï'Ù¾î, ô±$/owûËêuP†’$UUÍOrV’çÔ¥A~žäi¥”këÀ–mhdì±I†’ìTw–†(Iþ¶×i½»î Ü»ÑáÁG'9?É.ugiˆ’äÔv·ZÝA NÊ0ÀZªªzk’7Ö£†“<«”bÜ43bhdlÏ$&Ù¯î,³Ü’$ÏíuZ_®;“3:<¸{&îyÿ´î,³Ü]IþªÝí¾î P7e`UU”ä£IæÖe–úX’——RŒ›`F Œµ’œ›äº³ÌR7'9²×i}¯î lœÑáÁû'9'É“êÎ2KÝ’äínÿ»u€Ù` îÀìSJ9+ÉáIn¯;Ë,S’¼¡”òbEêÐë´Æ’<%ÉçêÎ2 ]‘ä E€fjwû·%é&ùtÝYf¡+“¤«™ lPUUÈÄ(ê‡Ôe¸+É_•RŒ› vC#cU’·%9µî,³Äfb"ÌhÝAØ|£Ãƒÿ˜äÍuç˜%~˜¤×îöoª;Ì&Ê0À½ªªj×$$Ù¿î,5º%É‘¥”~ÝA`MC#c''ùH’¹ug©Ñ“<¿×i-©;SgtxðùI>žd^ÝYjtN’ÛÝþu€Ùf îÀìVJùC’Ç'¹¨î,5ùM’ƒa˜zÖ'“‘daÝYjò®$Ç+ÂlyÚÝþ¿&yj’ÛêÎR“÷&9VÖÏd`Rªªš“äCI^Tw–ôƒ$O/¥7 À¬642ÖÉÄdׇÔe†,Oò×½Në#u`zþ¯$&ù㺳Ìñ$¯jwû¨;ÌfÊ0ÀF©ªêõIÞ‘¤ª;Ë4;'ɉ¥«ìÐC#c»e¢óȺ³L³;’×ë´.¬;3ctxðÁIÎOò¨º³L³ÅINhwûçÕf;e`£UUu\’M² î,Óäô$¯+¥Œ×6ÆÐÈØý’|)Éaug™&×%9¢×iý¬î ̬ÑáÁí“|!Éug™&7$éµ»ýך` î@ó”R¾äÉIFëÎ2ÅÆ“¼¢”òZEš¨×i-Lò´$¯;Ë4ø¯$(ÂlÚÝþ¢$G&ùpÝY¦Á'9P&Ïd`“UUõð$&Ù»î,S`q’ãK)Cu€©042ö†$ÿœ¤ª;Ëøz’gö:­Ûê@ýF‡ÿ&É¿d˸ç½4ÉQínÿÖºƒ@“(Û¥ªª“œ—äÀº³l†ë“ôJ)?©;L¥¡‘±’œdAÝY6ç’¼¨×i-­;³Çèðà3“|&É6ugÙ ÿ–ääv·wÝA i”a€ÍVUÕ¶™ø’ñ˜º³l‚_%9¼”ò»ºƒÀt{|’s“<°î,›àͽNë-u‡`v|\’¯&yPÝY6ÁÛÚÝþ?ÔšJ˜UU $yW’×Ôe#|+ÉÑ¥ã¦Ø¢ Œí›äÂ${Õe’îNòÂ^§õ™ºƒ0»{Þ‡Õe’–%yq»Û?«î ÐdÊ0À”ªªêåIÞ—dNÝYîÃg’¼°”bÜ4[…¡‘±’œ—䀺³Ü‡[“Ýë´¾Uwšatx°‰ 1×å>Üžä™ínÿku€¦¨;°e)¥|0ÉQIÕå^¼¥”ò•ä©In›®K$ùÛRÊKa`òzÖX’¿LòÙi¼Ìÿ$9P€™ÔîöoKrx’OMãe~“ä E˜&õ¨ªêÏ’\ä§ð´K’<¯”ò¥)<'lu†FÆÞ–äï§ø´ý$Gö:­[¦ø¼0i£ÃƒoJòOS|Ú$yz»Û¿iŠÏ l€2 P›ªªœäü$š‚Ó&9²”òŸSp.Øê Œœä#IæNÁé>Ÿä¯zÖ]Sp.Ø,£ÃƒÏMò‰$ó§àtç$9±Ýíß9ç&i îÀÖ«”r]’C21!fsü:ÉAŠ00uzÖ'“‘äöÍ<ÕiIž­ÀlÑîö?“¤›äÖÍ<ÕéIŽU„€™g2 P»ªªæ$ù@’—nÂáßËÄD˜›§6$C#cL,dñúKñ¯1ÿ¦&‹Oµmû±Ú#RJùBD<9ŽÀG"bWÛ¶§jé§”rOD|)òüa»ïoÛöojYH)剈¸¿öŽ%x&"^ß¶ítí!ý”RŠˆ/DÄÆÚ[4omÛökµ‡ôSJ¹:"¾¯¯½e žhÛö­µG,¤”ò¡ˆøtD¬­½e@bþ÷ü³µ‡ôSJÙODÄ/Wž²ŸoÛöµG,¤”ògñ‡‘ãq2æß;¯=¤ŸRʯFÄ?Ež‡i·mû¹Ú#RJùRDüfä8°EDüODÜÙ¶í¹ÚCú)¥Ü9TDÌ‚«mÛ¬=¤ŸËà¯GÄ+OYŠÿŽˆ7µm;[{H?¥”G"â/#âêÚ[4óÿ=÷ÖÒO)esD|-"e ¾Ø¶ížÚ#RJùXD|,r#"ÎÄüϥõ‡ôSJqí˜Ûh·ÜF»ç6Ú-·Ñn¹vÏm´[n£Ýsí–Ûh÷ÜF»å6Ú-·Ñî¹vËm´{n£ÝrížÛh·.ßF¿ÛjoP†ÛèW"â-µw,Á°ßFßó·ÑkkoÐlD¼eÈo£_‹ˆ_«½e ¾Ú¶íÐþž*¥üND|.r|8XÄOy‰ˆ#ךˆˆÇJ)ŸÆO¹ü ™ÞÐDDÜ011ññ¦iþ¥ö~zè¡ÇÖ¯_ŸåaoDD333óñ¦iž«=¤Ÿ;wî¸ë®»2=숸cll챦iöÕÒÏž={_½zu–‡½#/^ütÓ4kéçî»ï~ý­·ÞšéaoDÄ[víÚõÈÁƒ‡ò“|ÞûÞ÷~xdd$ËÃÞˆˆ5gÏžýlÓ4^{H?÷Ýwß[·nÍô°7"âwGGGÿ}rrrèþ¬ZµjdÏž=jš&ËÃÞˆˆÑÉÉÉO6Móµ‡ôóŽw¼ãý7nÌô°7æææþ¸iš§jïègÇŽ×Ý{ï½×Þ±D·ÿQÓ4_¯=¤Ÿ‡~øñuëÖeyرlzzúO›¦9Q{H?wÝu×í;wî|cíKt÷w¿ûÝßkšf(ÿr×{ÞóžÇW®\™åaoDÄÊóçϦiš?©=¤ŸÝ»wß{ã7fzØñî›o¾ùß><”ŸÎûÈ#<¶lÙ²,{#"®9}úôgš¦ùëÚCúyûÛß¾gtt4Õm´×ë=¾zõêoNMM Ý'ömÚ´iíƒ>X"bYí-Kà6Ú-·Ñî¹vËm´{n£ÝrížÛh·ÜF;æ6Ú9·Ñn¹vÏm´[n£Ý{÷-·Üò•±±±¡ü}Ÿñ6úÒK/}¶išÏ×ÒOÒÛèGÜF;uÃÄÄÄ'š¦ùçÚCú¹|ÍÂDD4³³³ŸòÛèÐþ¥ýÜ166öá¦i†2|ݳgÏGV¯^%„‰ˆX~ñâÅÏ ùm4Sqÿ®]»~ûàÁƒ¯YøÚëõ¾ù3üòßùdÜpà ±fM†o²žwöìÙxöÙgÿ®öŽ…üà?ˆÛo¿½öŒõz½xê©§Þo®½¥Ÿ}ûöÅ<##yÞ:½ð Íäääµwô355?þñcÇŽµ§ lvv6öïßÿ¾Xâ}ûöÅý÷çú»]Ï?ÿüÕ1¤?—ÆÇÇãäÉ“1:šçùä¥K—bÿþýˆÖÞÒÏÓO?÷ÜsOíKò½ï}ï–Ò×èw¾ó¸é¦›âª«2|“õ¼ .ÄÓO?ýWµw,äСCqçwÖž±$ßþö·=†ô5ºÿþزeK¬\¹²ö”:u*><”Ÿx166·Þzkí›››‹¼+"ÞU{K?{÷î·½ím±lYžç“GŽY155õÚ;úùÉO~Ç­[ó´n£Ýsí–Ûh÷ÜF»å6Ú-·Ñî¹vËm´{n£ÝrížÛh·ÜF»ç6Ú­3gÎÄØØØ—kïXHÆÛè“O>ùΈxgí-ýd¼?~|Äm´;333qàÀDÄP~›fÆÛèøÃëcH.e¼NOOÇ>Y{ÇB2ÞF:´+†ô5šñ6zîܹ8tèÐß¾ÆÿšŸå›Z¿yÞ<Í;é,õ5½^/J);#âW"ÇWÛù¦W{ÈB.;ÌoDÄÏýOÜ{÷îý‹ÙÙÙMƒþósssqôèѸxq(C¿WmÞ¼9Íá3gÎĉCù ¯Z³fMlݺ5–/þ/0šñññ¸tiXû·yÛ¶m‹uër”“““qêÔP~»å«®ºêª¸þúëSü{zz:ÆÇÇcnn®ö”-[¶,¶mÛ–âb¯×‹'NÄË/¿\{Ê¢6lØ£££Ñ4ÃÿÖéÂ… qôèÑèõ†ö­SŒŒŒÄöíÛS‚{½^;v,Ο?_{Ê¢®»îºØ¸qcŠ×èÙ³gcbb¢öŒE­Zµ*¶mÛ–â/zÌÍÍÅøøxLOå·¿jË–-qõÕ9>\îôéÓqòäÉÚ3µvíÚØ²eKŠ÷÷3331>>33C÷]¯jš&¶mÛk׿øðè_|1^zé¥Ú3µ~ýúؼysŠ÷÷SSSqäÈ‘¡~¿|ùòؾ}{¬Z5ü€Øëõbbb"^yå•ÚSuíµ×ƦM›R¼w:wî\;v¬öŒE­X±"¶oß+V¬¨=åŠÜF»ç6Ú-·Ñî¹vËm´[n£Ýsí–Ûh÷ÜF»å6Ú=·Ñn¹vÏm´[n£ÝrížÛh·2ÝF¯¹æš¯Ñ—_~9^xá…Ú3å6Ú½­[·¦‰³O:“““µg,*ÓmôÒ¥K1>>³³³¯é¿§×ëýÔÿ,¥¬ˆˆÝ±¹»E¯©}mÛ.ùÛµša>þ±tMÓü("R}õ30ïg‰aþ¿þt .Æ€4Ä0¤!† 1 iˆaHC @bÒÆ€4Ä0¤!† 1 iˆaHC @bÒÆ€4Ä0¤!† 1 iˆaHC @bÒÆ€4Ä0¤!† 1 iˆaHC @bÒÆ€4Ä0¤!† 1 iˆaHC @bÒÆ€4Ä0¤!† 1 iˆaHC @bÒÆ€4Ä0¤!† 1 iˆaHC @bÒÆ€4Ä0¤!† 1 iˆaHC @bÒÆ€4Ä0¤!† 1 iˆaHC @bÒÆ€4Ä0¤!† 1 iˆaHC @bÒÆ€4Ä0¤!† 1 iˆaHC @bÒÆ€4Ä0¤!† 1 iˆaHC @bÒÆ€4Ä0¤!† 1 iˆaHC @bÒÆ€4Ä0¤!† 1 iˆaHC @bÒÆ€4Ä0¤!† 1 iˆaHC @bÒÆ€4Ä0¤!† 1 iˆaHC @bÒÆ€4Ä0¤!† 1 iˆaHC @bÒÆ€4Ä0¤!† 1 iˆaHC @bÒÆ€4Ä0¤!† 1 iˆaHC @bÒÆ€4Ä0¤!† 1 iˆaHC @bÒÆ€4Ä0¤!† 1 iˆaHC @bÒÆ€4Ä0¤!† 1 iˆaHC @bÒÆ€4Ä0¤!† 1 iˆaHC @bÒÆ€4Ä0¤!† 1 iˆaHC @bÒÆ€4Ä0¤!† 1 iˆaHC @bÒÆ€4Ä0¤!† 1 iˆaHC @bÒÆ€4Ä0¤!† 1 iˆaHC @bÒÆ€4Ä0¤!† 1 iˆaHC @bÒÆ€4Ä0¤!† 1 iˆaHC @bÒÃðìÝydÕ}æýçÜ›Y{U/Õû ½Ð, Í*@B¤–  !H3²G¯G#¿ MÌ8Þ°ãµb4ñ¾~cf"Ž %#‡¶Æa{H‘‘Œ±0–ÚŒ$vz¡n–Þ»ºöʼçý#ïrîÍ›YÕÝÕ]ÕßO•÷ž{ÎÍ“Y-‡>ÏýÀŒA3aÌ„a0c†ÀŒA3aÌ„a0c†ÀŒA3aÌ„a0c†ÀŒA3a¨Hì IDATÌ„a0c†ÀŒA3aÌ„a0c†ÀŒAœV-Z¤»ï¾[?úÑtÑE¥®mÞ¼YO<ñ„¾ð…/hÞ¼y-š!g0SW\•{É+,‘ñºNñ„˜}E£Þ‚©k/iqÛì€ÓM¡Õ˜7ožn»í6Ýu×]ºþúëåû¾$ÉóÒÿA±P(hóæÍÚ¼y³¾þõ¯ëñÇW¹\Öw¾ó ¶bꜧÏ}îsÐ#<¢r¹¬'žxB•JeZÞ€3×¶\~çFùçËø½9»€LmPcdâkVRA…®ó¤Îó$;¡êè몎¼¬êØvÉVóïÀIÐîÝëkm¯e]^Ýr7:7yiIž1r#/sÛ.k÷tYQÇí8Z Æ LŒNÂ0à¤*‹Ú¼y³J¥’n½õVõõõÔ÷ëëëÓç?ÿy}þóŸ×ôðë\.ë©§žRPª€,¯¸¸€éÚ(S˜¶fvÿ¸§ ²0µGåšäÄ:íj—ß}¡üî e«£ F_Ueø%coJb£`ú=é¬n_kû|­ìòå™ìjפ^2’ñL­[¼„MÖ²ýžú;<}haQ{G’`ÌP…õ.p2†ÓÎó<}ìcS©TÒg?ûYõ÷÷·dýýýú⿨/~ñ‹zï½÷ôÐC©\.ëé§ŸnÉ|8]˜B¿ü®*tn”i[µ¦^rF…¯+ÃÈ8•aòªÊXɺä÷\*¿çRÙêªÃ¯¨:ò¢‚±·óÓPãiU·¯õ½­êõUlP¦ÑÒ·qe˜ôxëÜÁ8™—Å]¾wùúð"齑ª¶ Tµs°ªÑ*Á`º†Óæê«¯V©TÒç>÷9-]º´ÕÓIYºt©î½÷^Ý{ï½Úµk—|ðA•Ëe½ð ­ž§„ñçÈïÚ(¿ëByíîºÝälö©{\nÌzùŒ12ÙÝAñ ðGÜld­d =*ô}H…¾ÉVT~QÕá—Œ¿{ Ÿ p&󌴢Ë×ú>_g÷ú*FU\"F2MÊ¿˜lç¼÷ðjëØÜ^q@Æ&Á#-ëöµ¬Ë×G­´{¸ªíG«zóhUãÁ`:†'äâ‹/V©TÒwÞ©³Î:«ÕÓ™’³Î:K¿÷{¿§ßû½ßÓ믿®r¹¬r¹¬×^{­ÕS`Z¿G~çò»/”×¾BƸU]2—F¿Í^÷šT†‰®ÙÌÆÿˆ¯·ÍZ™âys®Q¡ïÙÊU‡Â`ÌÄÞæóœqŒ¤eafM¯¯ßÈdÖµ–¹¹„˜tLô ‰d½[¿ô5î27^ Y­îñµºÇWe‰ôö`UÛ*Ú5TU%hþ94F³sÏ=W¥RI¥RI6lhõtNȆ ô•¯|E_ùÊWô /¨\.ëÁÔ®]»Z=5Ž‹ñ:åw/¿ëBùg«¶óÆÙÍ“ÝÙ“·Ó§Y0¦Ùn¢èZ^ŸÔ#tMºÍ97F2m ä¯SqîuªŽïUuèWª¿$[9Øx^€YoI§§u}­ëóÕ]¨=¡ñ2×ä^OõÍ4èë9ãâ/Ù¢¨©e¯M–¼aHÆZ©h¤µ}­éó5Q•v…Á˜·†ª¢` plÀ)9묳â̦M›Z=“ââ‹/ÖÅ_¬ÿñ?þ‡ž~úi•Ëe=ôÐCzï½÷Z=5šóÚåwž«B÷…ò;ÖJžóŸÿaꞘ›Š©?Éí¶›TÕ›>L 7å…b2¿}±üöOJó6+ߣÊ`­bŒ­äÎ0»,èð´¾Ï×ú¾¢z‹&gi›z©;w¹žóРÍ$i˜¤^lúý¬d•ž§µµ€L|,£ö‚tΜ‚ΙSÐXhç@UÛªÚ=T¹`r„a@CK—.ÕwÜ¡R©¤«®ºªÕÓ9¥®ºê*]uÕUúã?þc=õÔS*—Ëzøá‡uàÀVO €SßyN-Ó¹AòŠa{NàÅiK…YœMCÊ6l÷í2™k&ÉØL0&ÞdSA[ÛöËdŒ‘×¾Bmí+¤ù7({+ Ƽ, åÏ 0#Íkó´~NAëû|ÍkO¼…_-mMrà¾4nK]ÏTVuä-…­ûž6Ýž,y Œ5ñ8YòÖÑá{:o®§óæ5RµÚ>PÑöŠÞÍ8ã†)ýýýºýöÛU*•tíµ×ÊK=ÑõÌãyž®¿þz]ýõú“?ù=ñÄ*—Ëzä‘G40Àh§˜ñåw¬‘ß}‘üÎódüö°Ý侚ôŽ Õïü1éãÔµÔ'Gþ[AXÆÆ€lý½­’ARz‡$cÒ§‚L”‰‚1g«­ã,IÿFÕ᪠½¨`äUÙ`4~€ÓZoÑh}_Aëû ZØY[{æ†_ÜJ³e®Ó¹n©[W5&·9nô<“®Öb³ïã>"¬c’ ŒædL¼ü5ÎR·¶î*]4¿¨ ç5T±Úv¤¢mí%¸ÃõõõéÖ[oÕ]wݥ͛7«Pà_ò ÝxãºñÆ5::ªú§Ò< G}T###­ž`Ö2ò:ÎR¡û"ù]çËø]as£L&üR·#¨~§Pîƒo< ×6h—©1îûŃl¦É„!›ôÏ£DV²áýâŠ1V6zônœºñåwŸ#¿k½TU}£V1fäuÉŽçÏpZè*$˜%]ù˜dy› ¿¤–¼¦.œâ¼Ä'™^SfÜ߯I—ä½¢u³©{„­‡ëZ› ÇX›|f®‹{ŠF—,(êâþ¢Ú>PѶªŽŒØé Àª««K7ß|³J¥’nºé&µ···zJ3JGG‡n»í6ÝvÛmÔw¾ó•Ëe=þøãg£ àDyí+äwmT¡ûB™BoØ\€1©@ Â/‚/é“ÀÍôk†ñ$·jŒuž™ëŽ 7ô¤ªÖXÏÕFÇÑ® …Çq8&ª£ú`Œ_ßužü®ó¤`\•á×Uú•ª£Û%[iðá§R‡o´¦××9s ZÞíGÏVP*“©þÒ4üR·N¯[›=Ó¡®BLƒ¾ñrצ^RÉYÞ†÷¶Ö¦B2î3 LN8FQ8FI¨& ÆÌk÷tù‚6]¾@:0ZÕöª¶­èÈxªf pÆ À¤­­M7ÜpƒJ¥’n¹åuww·zJ³BOO~ã7~C¿ñ¿¡C‡éïÿþïõÀèÉ'ŸTµZmõô3ˆW\"¿ûBù]Ê+έíÂiV&7ã<)·Qˆe²pKÞŽ è’× =Ù½Ôà¾Iˆ%‚‰úÆ!Ó<ã¼Öc¢ 2ÖJ~» =ªÐ}¡l0¢ê𫪽¨êèNIÛê©ZÌøsåwm”ß½Q^ÛÒp3Ï$!wÛ?/SÿXÝèG¼é(Û®Ìaþãn%5¨ #c2׌óh\)>±îœã]AµKqÆiÃ-Ñv£]?að%Œ1q…˜œj1’¼B¼¾©Ð{…l娪Ã/Ö‚1ã{ò?`Ê<#­ìöµ¾Ï×Ù=µù&³Ìuצµó¦˜((“S»Ð|yk4Ùr·®=ç9á·rŒS5¦¾bŒê«ÅDßIxlŒ‘)öÉô}X…ÞËNTuø%UG^R0ñAþgÔ1’–wyZ×WК^_~m½› ¼¸K^§ Œ L9“»Ä5jºÜunÔ`E묩\öL\Á%;&Y׎’PŒ‰Ï“çAØp™kâv7Ðb¢€‹œÐKøm$ášÚØÚº8|„Ò¡_Òª_+{|]»Xzg¨¢mU½5TÕDÐèKfÂ0Ìp7nT©TR©TÒÚµk[=LÁºuëôå/Y_þò—õÒK/ÅÁ˜;v´zj€if¼NùçÕ0«%ãÅá•hÃO}&/ünjXù%cܱÙGä6Ø”pÉîŠ;7ø°Ég1îûHáÎ ›zÿZq—¨ÒKÔÕ¦2µCÙpŒÒUc…^geâkáøx£Q^(&zLoÛ|ŠU¡ï£²{U ƒ1¶r0ÿóÀnI§§u½¾ÖöÔU4á¶I&zÉ«÷û%Á™lø%w‰½GÞ5·Ù½aª{No#y&{#?Â}ïx©^¨'!™¨ºKR1Æ ¼˜Á˜x=œ©#/§­±¹¡#ÉxVgõ´º§ ‰Àê­Áª¶TõÎpUU Æ`# À ´nݺ8sÁ´z:87nÔþáêÿðõì³ÏêÐC=¤Ý»w·zj€ãeÚåwlßµQ~ûÉó%§Â‹‰B#S Á¸Õ]Ž%“ ¿Äé”d#RtÞø±¹Ù±¡°úKn¿ìµÔΠt0&žsp‘’ /ÉŽ¡Tµ—(ÔRŒq0qµ˜dgQ|×…blm‹Pí)»V¦m‘ŠÅëUì»NÁø{µŠ1£¯ÈVäv8C,h0}¾z‹ž³|bfÒ@LƒŒ[Ù%¾f.ióÂ.ží}ÿf×–T[vùkã0ÔÇKX“Žqƒ1¦¶6nŒ±áÚ6 ÏØð9¦i(&Z·yFëz ZÛëk¬*í¬hÇѪöŒ Æ`†! À ±råJÝyç*•Jºì²ËZ=œ—_~¹.¿ürýÑý‘~üã«\.ëïþîï´wïÞVO 0Sß¾^^Çò;ÖËxÅ$Ìî šZÆ Â¸ÕcœþÑqóL6(ã¶9÷TÎyΆ!·[~™pC“gâ @õï“ToqÒ/I[‰Ã1u¯n0&Üè“<.7üÜ6ÉØ0ðânJ…b’Kñ4£¤×¶L^q©Šs6«:öŽª#/+}E6Êý`¶™Ûf´¶Ç׺¾‚æ¶™p­é®óϧ‚‰Ö‚ +ÂÈ]GÙkÉú3µÄM-aÓšcáy9âõc-x"9¡˜ðÓÏb° Ã1nÕ˜Új4'#§L¸‰ªÅh²PLX‘FÉwøVú :§¯ ‘J 7í¬êý‘@Îj8m†à4¶xñbÝ~ûí*•JúÈG>Òp³ fcŒ>úÑê£ý¨¶nݪïÿû*—ËúÖ·¾¥Ã‡·zz€˜'¯}üŽ äwl¼ö$Ø’ ¾˜Üö$Ì’¹– Á¸×”¾WƒŒÉÛõ“Ûÿ›³™ºƒú{eÛ—¹lg§’§ÓÖ-IeÉ µ„›‰œj1ÖFUcÒ™¨Ÿu1nµ˜p~©PLT&çìP2Ṫ΄á¿}•¼¶•Rß§ŒíRuôe£¯ÉÚÑüïf¨Þb-³¶×W›ç,Y³ŒMB1q˜¥A¦aÕ˜x-ë\Wr]Ùs%ïç¶¥MvÉ›€1yG –¼^|Á&?£enxâ.m“¥n’‰ª»Dï…clhiŒ ûEkå¨âKt}*¡˜Ú:8¬0ÝÕÔ&×YðtþOçõùªXí¬jÇ` }cAþœÃpš™7ož>ó™Ï¨T*éú믗ïû­žZÈ÷}}ò“ŸÔ'?ùI}ýë_×w¿û]•Ëe}ç;ßÑÐO €SÏÈ+®–ßq¾¼Žse¼N'Üâ`â Bn[²kÇdúÕ…`rªÁÔ…`œ°LdÉd”¾Wüâbšœg%IyOÃúÕ]3N5ç¹²6Úüíö©['À'câkùÁc“±qµ%÷¬ ÅØ0¿•3FѦ£¼#O^ÇÙòÚÏ’únT0ºC•Ñ—Œo“ìxþ÷§¹.ßèìOk{|-êˆ0Qø%vÉ„[Ü>“‡`WÉV€itž§ƒ/õK^“9ÏhvÍéâyΪЦûGY/'­³ÔuB26êkSáŽÖÄ6/†Vâj1Š‚.ÉwPЉgŸ„i’ ©Ñ:Zaµ™°¿1ê.JçtÁi`"ÐÎÁ@oUupœz18½†à4ÐÓÓ£_ÿõ_W©TÒ§>õ)µµµµzJ8 µµµé–[nÑ-·Ü¢ááa=úè£*—Ëzì±Ç466ÖêéÀ¬æVÈk?¯ößS }8ãeC/ªÁÔ`â0K]%˜œê1™ ŒqÛêv)ÝÇiK…^R;~²çÎØèÌór¿#c<Ïs³$Jï ƒ1n[\õEõ™ºpLú5 ÆØpOR)&¼—œÐLN(&§Ô˜ÔôT‰1a&}¼Žõjk_'ªŽmSuì;%[Éý®àtÑáIguûZÓãiI§'/~‰ƒ-™À‹[&Zë&K^7Üâ_êC0îRX¦>@£Ôym`ãe®qŽ•›mh~©«šê´»Ë[)y䃉לѲ7é›,{­³l5Î7 ´$ïeÃ@L¦bŒœj1q¥ÔZ…™†¡˜h\¦‰¿©°bLRç&üââ>µ+}EO›æ]4××áñZŘ7‡ TÆ õÃÐ"ºé¦›T*•tóÍ7«³³³ÕS:íT*é #ÕjµE39ýtuuéŽ;îÐwÜ¡ýýßÿ½Êå²þå_þ¥î{ã/–ßV À˜Âœú*/yá–¼j0u¡–d‡Ð”C0yU`²ãÂ!Š‚8Îynø%µÁǤOsC156Ú8ä÷Èï¼PÁØNÄ󨻔 Á˜$0c¢ê.ѱœP‹‘‰Â*Q¨%'c¢*/FÉ"'äR{ún}(&?)7]Üþr·EGÖi yEùçÉk?W ÆT{CÁø« &vI ò¿P8ÅÚþñŸ¢Î<ï¾û®zè!•Ëeýìg?kõtà´e¼9ò äÏ•W\$ÉH^³Ð‹Óæ5ë#%Á70S߇Y¦‚q‚0É{ä¼&»‚ꞎÛü8þ‘*ªzCÁÑ )˜ÛäÛ’éWaþz™bwæZÎ.¡Ô¡t&Ž™$“ «Dï• Å¤ƒ1Ö ½¸—ú`K^[£Œ$„!ÉÚÀyßÚq *{]Aå5Ùê{M¾K81ž‘–µÕåie—§¢—µx©€Jã@Œò®+~q2nŸ©„`ÒÏ{p/¹çÉ=äÜ'º—òÚãI‹{:6RÕÞ·‡t`ψª•ü½tÆHsuhñª.õÌk“­X“þ©mx©%°SÅÔqƒ.ym1jØÏîy רÊa•×T^— öÃ÷ ùŒ¤ÅíFgu­êôÔæGÁ—IªÀ(?“:vÂ.ŠÛ2}ã5mãL´þœz &Ÿ^æšø3Ë}õ!çÔHûÇôÁ[Ã:²o옾ã®Þ‚­îÖü¥ò<“~îClI.õKÞlÕ'“ZòÚd¼t‰®ç„baRýâel~¨%Û7ˆþ†^R÷ÉÉTé½±@»F¬öŒZ5È  Â0“# 3ˆ€Öºä’KT*•tçwjõjþ︙W_}U[·nÕ_ÿõ_khhè„ï7þ|ýöoÿ¶î¾ûn­Zµjf8{½öÚk*—Ë*—Ëzýõ×[=8uL§Ä_Ee IDAT“,uÓa9Ç©ÐJ¶*Ø2I§_0i«‰@zw,ÐÛ#Ò{ãVU¶+L a˜É†™eÃÀ©wî¹çªT*©T*iÆ ­žÎiÍZ«Ç{L÷ÝwŸžx≓ò¾ïëÖ[oÕ–-[tíµ×ž”÷˜Mžþy•Ëe=øàƒzë­·Z=8 ÚäykäùçÈø«$ã×_ša\Â6/ü{ÏK‚(yÁ˜Üj09m™~u!˜lŸl˜A˜TŸF![ÕÄm Çdìüä+4uS`S/5ƒR縊 Ö˺†bêÂ1 1És³¡—¨O&ãô­«üÒ¨=7“ž‰úÍÆÕ‡b²˜¸bLu¯‚ê²Á6Y{ô¾wg’yiU‡ÑêNO]~}xÅË À4 „ÁéX3IàE údïç†`ÜЋÛW™óì²Ö ¿¤—·™öð`|¤ªÞÒþ=£ªN¹}¦$»ÜµµyÎ]Ò¡Å«ºÔ3·-¹­oÃã¼pLýR7„qƒ+JU‹9–PL²ôµÎ²7\‘ÛÖ O_ rûׇf&iϨÕÛcV{Ç¥`Š_;À™ˆ0ÌäÃÌ2„aàÔ8ûì³uçwªT*iÓ¦M­žÎio``@ßøÆ7ôµ¯}MÛ·o?eï{ñÅkË–-ºë®»ÔÑÑqÊÞw&²Öêé§ŸV¹\ÖC=¤÷ß¿ÕS€P1«åyçÈóWK¦Ø0ør®²ö]Y»]Ý)i´þ—`Vêö¤íµÌœÂäA–fA/\/æ÷É´)§­.üb’ehÎÉ ×L-“^î¦0a”%Y¯:ËßhÍT­¾?¢ÞÖèP¥. -‘]ÑýV®ëÑ57-ÖEî—ïí|e@?þÇ÷õʳ‡µ5hj»]¼|MÂ)²R±ÍÓ‚]Z¸¢KÅv/^˦–¼™PKrïúpKt-}Ü,“hÉô™JFŠ?w’i0®i &¨ÑŒT­ÞvKÝçmœÁÃLŽ0Ì,C¦×‚ ôÙÏ~V¥RI×^{­<Ïkõ”N{ÖZýó?ÿ³¶nݪú§Òéôï…BA·ß~»¶lÙ¢«¯¾ºÕÓ™&&&ôÄO¨\.ë‘Gii¨ ê³\Ƭ—gΖÔ6ç…]¼IÃ0 ƒ0^³ÐËd}Ôxœ[éeJ!˜LE×”\kòjŒ$k5qð UŽÈ˜Î÷¨ä»Ë|ÇÑ¡EËçê㿾I¾á|uvµÕý6‚Àê…Ÿìп|ëm{qO­1„‘R»†’M<ò:+*.8GÆïpº¹»¢óè¢d‰8ÇMC1uAšc©3Y¸åX1AN&'0×¾mY»[Ý&kwI¯û}˜Ù:=iy›´¢Mšë;Á/ ¦¤-S Âä†^šbâ¥h³@Lº=Zgº}”é¯ÔXgŒÓWÑu%×óÂ/ÑRv|´ª½ï ëÀžU*Ö¹W4 ¹—{ß7Úxå|}øÆÅZ¹®'÷÷qxÿ˜þõŸ÷êÙïïÓÈP-­á.y­“hq—›ÆHówhÑÊ.uõq™ 1Ù`Lxž^º:A˜èN(&\*×WqqÇ×µ7 ¸¸÷šZØ¥YŸZQÔl&}.I#A-³{\:RÍýuœÃLŽ0Ì,CN\__Ÿn»í6•J%mÞ¼Y…B¡ÕSš†††ôWõWúêW¿ª×^{­ÕÓ™ÔW\¡-[¶èŽ;îP[[ýÔÕc=¦x@ÿøÿ¨‘‘‘VO Àʘ¥2f<³VRgöbq*ÃÔ_R׌ñ2çSÂäݳQXƨI¿hOº-Úåc2ã£Ï™„`ò0n;1¤‰ÛdG:d¼žä»’;N™öšó.]©ë}“6^±:¹ç$vïܯïû—zæo¨2îì\qÿN"µk¨öØq™Â!篒׵0nOcêw )·êK80 ¢¤ï‘tQNÛ1V wö &ªq«Ã¸×Rª²ö-v»¬}KÐfªvS À,o“ú¿¦N…\<÷<Ri„É Í4 ÂDýåh”ôSv¬ê1&^›N1“ˆqB+É7€‘¤¡ÃúàaÙ7PÜû)¾ŸâFRw_A—|¡>ôñEêWœÒïhb<Ð ?9 §ÿy¯öíqÖ«ÙpŒ’µbíP]}E-ZÙ¥y‹;dŒ»tÍc’Kt=½äuB1îØ¼ Œûn8%Õ6ÙõUcrÂ,Óˆ‰ V¥ÝÒžqé(Áp†! 39Â0³ a8>]]]úô§?­R©¤o¼Qííí­žÒŒñæ›oêk_ûšþâ/þBGŽiõtŽÙ’%Kô¥/}I_úÒ—´xñâVOgÆÔ·¿ým•Ëe=þøãš˜˜hõ”ÌrÆ,T­ÌZIùOimdÉ ºœ@&‚™<ã¶©I?çšrú†Ÿ1Ǥv%mñ8IÕá÷U9°G¦Ú/yÅä{r¿³L›1Fmí}èú ºöæ µdå¼ãþ½ Œè§¿¢=ö²Ž’œ§Ú¦ƒ16óÈšýòûúT˜»¦öùâÍ>y˜&¡˜°O*“ ¬Èíß$DãƒÆÁ™ ¨Ý/°²6 Çäb²Õ_²mµã ¿® Y»+¬óޤà¸wN¢‘–µIË‹ÒÂbúYR´®u¯|CÕ£Ã2faªÝ‰_Œæ/êÕGn¼@W}â\uvO_%Õj5Яž~S?üÇõÖë{•Y¤$ ã´¹!–à°¼®@…d¼¶øz2&މB)u¡˜ì˜Lˆ&/Ø’ Ð4¯î’3nʘ ÿz|D»ˆÒ×›S`wÊÚí²vœ/@‹Œ´¤(­h“%¯A¿FAÏ›Zfò˱W1jÔ¯YøÅ ¥4¨£ô˜ÔqüjT´w÷°öïVuÂf–ÔÉýê*ËøFç]¡R©¤Ûn»MsçÎmõ”f”‘‘ýÍßü¶nݪ—^z©ÕÓ9i®¾újÝ{ï½úìg?«B¡0ùÄ>øà}ó›ßT¹\ÖOúSñ•QŸŒY†`æÃÀ(„â[f*×sC.^Ò¦¼1j„™¤Ÿ”髺ÀLtž\“luTûßm“1}ÊÙ5” Ô$ßúš –ê#7\ ó/[%Ï;¹·²{Ç~ýø»/ëWOïTu"| B* cã <µkµWŒÊŽ¨Ð¿J^ç‚—ôñä•_”Óµ7©þ’×4è3¥@L“ëAœÇ˜03e# ìY»MÖ¾b¿@ÇÅ“´8 À,)Jþ$K¯æ¡•ú@LóJ19×¼(lr A÷U úe*Ǩ®oƒŒÓ/úüŠÆI˜ÐÞw†txïXrݹ§œ÷N*ÃH]=múH¿.»v¡úæ§õwš5>èŧêÙìÓÆ”¬o£åªM-'ãsIÝsŠZ¸¢Ksv(z˜ÍŽ“¨‘pÉœ§úeÚ…YÒ×§z9–@L†É Ödû$çSa%ƒ1ïŽKãüõ4˜EÃLŽ0Ì,CêctÍ5×è®»îÒí·ß®… ¶zJ3ÎÛo¿­ûï¿_þ箃¶z:§ÌòåËõ;¿ó;úÿñ?jÁ‚­žÎŒóÎ;ïèÁT¹\Ö/~ñ‹VOÀi­GžY`û𺰊—®4­ö7ÙþS Âä\²Ao á5nk‚1FÕ¡T=´G¶:OÆ´¥0&|qï!Ú ºøÃkuõ§Î×’•óNìWxŒègßM?ÿþë<<"7 “<Ò6ÜÀ“ªòÈšýòûæ¨0wM*“ ¹8`êC-î}sÚ`òª³LG ƽž}0(“¾T¤9öo^Ý®ZŘ}'þ‹ÐQ­òËŠ6ii±Vfª<¯yå÷úqaÜàŠ—£ä½_ÃL*€â\—êŽÓ¡—ìy‚‰×²ÖêУڷ{XÃG+Éò8‚1©1Ñ\.ëÐe[¨ .Ÿ§B±Qí“ÄJo¾: gŸÚ§7_;*V.I…W2¡“híZl÷µ`y§ú—uÊÿÀL5Ý3ã¶çV„ÉT—™$s¼˜8ü4¾GÒ'}ý¿víöŒKïNH¶E€Ž0ÌäÃÌ2„a qÅW¨T*éÎ;ïÔòåË[=éG?ú‘î»ï>=òÈ#ªV«­žNËtttè®»îÒ–-[tñÅ·z:3Ò¶mÛT.—U.—õÊ+¯´z:N òÌÕªÀ,=þÛ¸“a7$Sbñ¦„ñrî× “s¤K…Xê0éÐŒT9¸]ÁÑAI ëC4éGì¦^çÌïÖß Ë®=G]=í'ð;œÕJ —žÙ¥ŸýË«ÚóæþZc*Тt0&Þ)$Ùà¼.«Bÿ¯˜ŠIvÅ›…rƒ.N{Ó@L^˜e²@Œh™,𒺤ïÔ‚0Éññb¯YGj¡˜`›¬÷}$Œ¤þB-³¬Mj;Žík©€‹—„‰ÎbòÂ,õ!š¼`‹ÝWSÂÄa–ú6å¿ lu™Zßä¸2hÿžaíß=¢ÊD.Éó0qõ™ð? ¬Ý8G—\»@«Öõœø/sÚ;¦ç~¼_/ÿüÆÇªN¦Q0¦öjŒÑ¼%Z¸¼Kݾ¤œPŒrQ£À‹œàLf\HrÆÔYb_b‚Ìy^`&È<ILÔ*Ƽ?!UÙ" f Â0“# 3ˆp¦»ð ãÌÚµk[=illL<ð€î»ï>½ð ­žÎiçÚk¯Õ–-[të­·Ê÷ýVOgFzñÅã`ÌÎ;[=§T»¢ãxùB H±ÃÓ‚e]ê_Ö)¿`rC0ÉÒ¹Iuå[šµM^¦y fÒÊ0Aƒ÷ Â`Î4™°Ò»ãÒž ißDí»8]†™a˜Y†0 €3ͦM›¨^r‚ž~úiÝwß}zøá‡511ÑêéÌ8]]]ú·ÿößjË–-ºà‚ Z=+-X°@‡jõT¦lýÆ‹ôÙÿãK­žÆ)óÒ/žÑ£ó)÷ïìêÒ½ÿßM¹ÿøØ˜þø÷ÿó”úú¾¯ÿüßÿH…bû”ï?“ iëü_Sîÿ©ÏÜ¡K?zÝÉ›ÐiæÊ£—öÓVO4à™óäy×H*LÿÍë+Ùª/^]¥YŘæa˜ã Â4­"“jS][r©Þ¡êÑ-”³ë§v¹c”Ü_R÷œ.mºf6}d­ºz:¦ÿû?E*U½öÜÛzî©×µo÷aÕžj[ˆ‰«»¤þ9$Ó%ûÏ•ŒŸ¹®Æá—Ü~Aí8¬Ì’ÌÁ ¸ä…f¦ˆ êÆ7¬ŽoX=fÚYY»]Õà_N½Ož+VèöÛooõ4N™Ý»wëïþîïŽiÌøÿAÝÝÝSîÿ—ù—˜ZÅ ;ï¼SK—.=¦ùÌdû·;å‡ -Y²D¥Ré$Ïèôq<6˜)|#]×+õúÓ{_/|ä\œ K]¥˜LÅ—I+Å8UVša²¡—¤²K“ª1r,ùIªV¬öïÑþÝÚ˜’¹¸çØ Äœµ¡W¸_+×öh:ŠÎ¶ÊÁ½cúå¿ÐëÏÖÄXHqC$a(Fž4q§®èT{Wí¿¹¤,‚0Š–ÒÙ0J^æÄ1q[“Š/s=ȶ[öèÚt³ÒÏ¥ƒ•é¿÷É´eË-[¶¬ÕÓ8eî»ï>½÷Þ{Sî¿yófmÞ¼yÊýðƒè»ßýî”ú^vÙeúÜç>7å{Ït¿øÅ/ôÍo~sÊýù³ Ó0ÌäÃÌ2„aœi:::tôèQ 'aSÍ,6>>®‡zH[·nÕ3Ï<ÓêéÌŸøÄ'´eËÝ|óÍò¼™ñä¡ÓÅîÝ»µråÊVOã˜Üýû_Ö×þûÿÛêiœ2OýêU]·iêÕ·Ö³AÛ^mÊý‡«VÝ…©ýïfîܹ3*8u¢Nêo›úߦýìÅ—õ¡gN¥´ÿóÿùïúúWþïVO4à™såyן¬›×Â-q %X9¶Š1F&yäìÔ‚2Í‚0^æ¼i¦>Т`B^—)ÈxsR×ëC0N»1Z²ª__»^ë/Z!ÏŸ]kÓ=;öé…oÓŽ—öÈV@ŠSí%7 KÅ£*ôŸ-Ó67iw«Ä“Ü#’q*Í1©ó Éõ©T€É„i¢ÀL™Û4«…až˜öûžL×]wž|òÉVOã”yê©§tÝu×Ó˜÷ß_‹/žrÿ³Ï>[»víšRß§Ÿ~ZW^yå1Íg&»ä’K¦üÀ¦«®ºJÿú¯ÿz’gtú8ž?›Ì$7Ì‘:¦·øiL©>š^šer¯w&'ô¢œ¶l?Õ·EŸqd°¢}ï ëе* qø§A&ú>Ú:Ót±vÿôߘŽT§/ Fò—µIÀ¤®2KZÉiÏ}B¦¾½ÁýÔèšœI‚0Göjï;Ã<<_ܯ‹®î×›¯ èŧjÏ›Cr–©²ÆÊZS „kUk¤ÁCã:zpLÅ_‹VtiþÒNy¾dÃ5¥Ö£ñ«œã¤Í“••Q½fTû a›—×Gµ5¬{÷3éwŒ˜L£;ÞXþ÷’ô}§û¡ß+ ΰ ÒÃf¼çž{Ž0Ì$ž}öYmݺU>ø ÆÇÇ[=YoçÎú/ÿå¿è¿þ×ÿªßüÍßÔ=÷Ü£ 6´zZ§µçŸ¾ÕSpX{HRUÒÔ+ÝM*ivÉô÷êC3&Ó¯>è’Ó¿.ãÅm «¿ÔÝÓ‹ß·2°KÕ#‡e´@Æ,’ü©…`:{;tÞ‡Öèü+ר»·C’T©Î® Ay:{;õ¡_Û¨K?~žÞxþm½ôÓí:ôÁÙxƒLíS{ö­3Ò—±‹U=dU=ø¢L—¯âüõ’)8ýÆ«Ýʆ¯ &Ä$á—ô}l½€‰wþ$÷7‹…›œÜR-°c²aSë;Í›ƒNZ¨ ˜áW¥ÅÅé¹W] $üýtÀ¤IPÆ Ää‡Yœe²Ž?ãÅëp5á¤ûW&íß3¬ý»‡51ÔÆùa€Çs*Þ¤ªÂÔ^W®íÑEWÍתu=ñ÷dÏ€5ïÙçôêìszuàƒQ½øóCzãW‡U™°µ`L†b#c¬‚ÀÄçcUíÞvTïî8ªùK;µ`E—Ú»|ʼnš†A˜è; C,¦: çšg& Äx² 2Á#£èA&Óß ¼d¯›l»Ú§wÉ{¤zRž)€Sˆ0 `Æ{þùç©,癢R©èá‡ÖÖ­[õÓŸþ´ÕÓ9# êOþäOtÿý÷ëSŸú”î½÷^Ýpà ñÓ 2 0[²ö@-à1] 5Ê{\®Ô$S?fòŠ1aÐ¥iÆ4Â4¨îbmE•o(–Œ™+ce‚5’q3îøþeótþÕkµfã ù…ÚSq'fY˜)1Fë/]­õ—®Ö»;÷é•Ý®w^_AÄ›}Lø]?J7jë—¶Ü%µª8L±7v‰Þ&j À4Ä„s1µKÑŸÑìøœ 0ž‰‹ÍäV© Ë„›ƒœ°Ìt¡2 ïHezî“TY™bu—L¥q5™hÉÚ¨ªËÔƒ0Â3ù÷“F‡ªÚûö¾?Z E“ ½¸•`íÞ½»ÕÓp²Ø}é '"³C¨q Ea¿FáÕUl‰wÕ…SÔ<“íß Ü ¾­Ê‘ƒ2ÁÉ,lr//5®½«]ë.]­s.;[]}’¤J… Atövé’O\  ?ºA;õŽ^f§ Ÿ^ke¼L•˜ |6®W‚Eªî·ªìQ^OQÅyëÓ5 Ä„›Îò+ÆH2É3pSãPKRQÆ©#Å›~Ra™è8|ÂrRY&}íDQhl8&¬T<5o]ØE&»œŒÛ” ž4 ¼x^~ûd•aŽ7T¥ý»‡´÷í!MŒaàÅd‚/᱊1ž´ì¬n]xÅ|­Zß«hyTWi’j֜ۧ5çöiß{#zù™CÚþÊiB²a°ErªÄÔ^ä«ñѪÞy}@{¶ ªY‡®êR[§/yµpI-ØR{—lµ—8“jwŸá\‹+ØúJ1ñ¹Q<*ùlQ—ô7Lc⊨µ•út<‚Ê03aÀŒ788¨mÛ¶iÆ ­žÊ)W­Võío[÷ÝwŸ~øÃ¶z:8ºï¾ûôÕ¯~U7Ýt“î½÷^mÞ¼¹ÕÓj‰çŸ¾ÕSpYMÓfz“­ãK™kéI³kõ}³×¼Æc³á•lÆVU9¸MÁp ižŒY”ªöb¼œ{‡×ç,š£s®X£Õ,—_¨=·ReGДùžÖ\²Zk.Y­÷vîÕ¶gvê½ÄUbâÍUž'cl`%/±óµØ.Ó1¢Âü52~·¤&ORà^ÂÎñõx#œàŠÿüÆRU^jÏÇû$»ƒ’°L¼[,kkÓ†ÙwÂ÷f³ÃUiáqî¾Ê†]¢p‰œóø9J-“@K^å˜Fí 1Þ1aj¯cÃí}kXöŒ(°’çIžV|1Q FÉ«©½Û<­ß8W\1Oó¶K’¬î*—³[ÿâ]{óR]qýB½úüa½ú‹C¬H&YïFëI„¡IAhïÛÃzÿ­!Í]Ø®E«»Õ3¯(ÉÈ Çd«½4 ÄdVÀ’œ€KNàEŠ–¼aÐÅ ÉX[ßnÓÕcÂÿiÈ]]ŸÈŸ™@Òa€0 `Vxî¹çΨ0Ì¡C‡ôçþçºÿþûõÖ[oµz:8AèÑGÕ£>ªóÏ?_÷Üs>ÿùÏ««««ÕS;ež{î¹VOÀIdí%Û.ŽS& RÛdš_K…erÂ,áX7€’³»(ÕÖ4(ãaìÄQMzSë‘L_|‰ÆyuUi¢sãyZº~©Ö]v¶®ê¯}’*B0'báªZ¸jŽÒŽçÞÔ[/¾£ÊØD-í ’j•Y¬'VÆ $Û-;Ú¥‰=¤Â6ùsËïZ2I &xQ}…OêÍV€QmÃX*,cMrnÿ‰ó26¾o|-~ÏðÚ î&›¶00K©_¦.ì’ ¢4 ¹D™ºq9÷ÈyM_â 2õc›aŒiß[Ã:²LR-ìâÅ¡§L&Ó;·Mç_:W6ÍU{gí¡A•̉øÿÙ{ó K®»Þó{Næ]jߺªz-u·Ö–¬­eÉòò°ðÇÈƒÃØ Œ 0ÆÆÈà <¼„  vËŽ €ÀÀ˜?~™ä‡ CóÀ^º$µZ-©ÕêE­^j¯ºUu×Ì3œ“™'óæ­ºÕ]U·êÖ÷Qμ'OžÌΛÖ¯ú|Î7—wpχp׃xå…œüÞ,&/õï&„­¹è÷M øseÌM”ÑÑíbx¬{òúûj ÄØbJ$¨$>+ó9ExQ*%é"L< îQ'ÀÄÊa(e©‚k]# ÞõœM!„B¶ ”a!„´ãããx÷»ßÝêÛØpNž<‰Ç{ û·‹åååVßYgžþy|àÀoýÖoá~áð+¿ò+8xð`«okÃÙ®2L­Rnõ-l*•Rqg¬í×ÇžW[ãø;‡j¥²¦þ^ug=ËââR«oB!«âA©Y1tíC“„‚ÉþuRÊ*ÇB© Ž%ljK*Éýè3bçzK¯Á›Ÿjƒ€Ü•rnB„1É2™|cwáÐ=ÑÙ§G¨Ö8%c½É÷v⎇îÀ-o¼ž»€³ÇÏbyn JêdøJ¯kkR^-Å(ßjÃð¦<Ôð,œž<ܾµlb¢˜q`ÆQ €0F"˜œdVÂM—e”yÅÍ„¦äÌ 3!¨îØõÊ0Û4¦R©àêÕ«­¾McfffÍçLLL¬©¿ç5¿dòôôôŽzþÕjµé¾|7 !„öcîš“%âr‹@$º'K\4b‹3Vœ]8O…i,Â(Oaúr “¯.£´ý;„ŒÉ/vLÔ¾g¬w¼~7ÜÜ )õŸSq͇uEôáÆ#}˜¸TÄÉïÏàì©j5_×®–cW‰ÊW(.Öpáù\:½ˆ¡}ÚßLNFBŒ‘N¤’`R„– AFÄEû¸-ÂÚKTë» JÚ¨-~®-˘òûšËÞ¹müÏi/¾øb«oaS)×öïÔSSSkzFk©gffðÌ3Ϭé~¶3.\XS¾›„BZP̘l+„çÜÐêû „Íæá‡ÆO<ÑêÛØ‚äÇ{ ÿú¯ÿÚêÛ!›ˆã8xûÛߎG}=ôP«ogøùæ›ñòË/·ú6ÖL6›Åàà`«ocÓXZZB¡Phº¿ã8nº¿çy˜œln’•£££M½Ý©T*kš<Òßß|>¿w´µ˜œœ\Ó¤,B!„´Gþ0„¸ÆDטP"£½ÄlÔnÉ%ˆI,ö±è¼Ô1CIE"ž“ül .P¨Í½ ©¨þæ®aŽ÷ õàཇ°ïÈ~8g]Ÿ9Y¥&ÎNàÜøYLŸÔ3h”|JE‚ ”‚òýð¸Þ_‚è¬À8 !;Ç”õYéY^á~0fò~tÜ'¸¾òëïeÕcÖ˜×D5ï¯×ó‘B!„Òvô8Àýk;'Lt¹(¢}¥©Ä¤iOi‰sµÇ®ÛäñJÑÇÔÅeÌ\*ÂK,Ú ¥€t"ŒÐûnFà¦;úpûë04ºsþÍb+±¼Xéã³xa|ËK|_Aù0[ßÚ·ËF!€¾á†t¢³/WJ™Ò3ú¬ËOóÙO|ú§¶+S*ÇÇô“×òíãimúœká™eàìÎZûB!Û¥ãðÈ P†i3(ÃBv*ƒƒƒ˜žžnõm¬+óóóøò—¿Œ/}éKxå•WZ};¤ÅÜu×]xôÑGñ3?ó3m5É}aaýýýà“B!„ÒÞHq¤|óµž\"¹E†‰,fQ$¨ŸÓŽÕÉ.éi-Ñ8éª-¡6{ª”ÐÕ¤l£÷‡â†{ahl׺>grí,Î,âüøY\>uQ§-¦I'uBŒü*‡Û¿2?—^2 |=y±qRd[ÈIeó“ã$Î[#J]€ç?¾O›B!„öAøoý€»†)jR³¦CšI2¶”"eBV‘–cË3²>ÙÅ>7-ù¥nl!°8[ÁÔ«E,L—”rB:úž“)0ݽÜ~t·Ý3€|'}Ø x5…3§ðÜ÷f0}¥“`|ßÈ% !& £ÇÅÐþNô g!R…[x©“[”J—aüt™ÆOŽa·%Ï ešô{_' Àì6N‡!„BÈ΀2ÌêP†i3(ÃBv2gÏžÅÁƒ[}×Í‹/¾ˆ/~ñ‹ø›¿ù,..¶úvÈchh¿ôK¿„~ðƒØ¿«oçºyòÉ'Û:õ†B!„¢bù¿]ˉ)é.¶ &©ýl¡%&©¬t,™4Osñ‹WàÍO@U ô¸ D˜øN.‹½wÀþ;¢³¿ký2Yjå*^;yŸ=‡ÒÂòêBŒÝîÎÂéé„ÓsHOk*e¦IY&õXúyö9דã«À÷¿»þ™B!„6ã¿ôCns}#é¤^\‰%»$c¶ôs"&¥O ¾¤‰2VÒŒò毖1}±ˆÒRcK ^„Ýß;^?ˆC·õ@JÎ×Ûª\¹¸Œ“ß›ÁÙ ð=¥VbÀÍH ìÍcpo2#Ê0¶ð’šô²BLt~ºø—iâ×[k:ŒðOs€Çi“„BÙâP†YÊ0meBÈNæë_ÿ:yä‘V߯5¡”Â?ÿó?ã±ÇÃ7¿ùM¦dUq]ïxÇ;ðè£âÍo¾ÆÕ•·Ÿÿüçñ‘|¤Õ·A!„BÙp2p_\ûi\b©0Ò’X’Ÿ‰*ÉÄ–”qìëA¡Vx~¡ xýÖ}Yç4¿³¿{ï>„ݷ퇓irvi9J)LŸ½Š×ž=‹¹‹Sé2‹¯ R¥“d—§ÿ0„ÈêsVKyip<.ãØ)0ñkÇaVJ•YžÿM(Å´bB!„BVã®Nàp®¹¾2)«X /+ 2¶ì²bbLj»}­¨OpN­ìcæR ³—‹ðj+× R HGoWâÆÛ{qÇë0¼§cž$Ù,ªxþø,^|zÅ¥ZSB  íÑ3œÃàÞä{œ…;Õ¥¡ÔKx©—eÒ`’"Œ¾ÎÚÒa<àß®ÿ9B!„l4”aV‡ÿòF!¤m8~üø¶“añ×ý×øâ¿ˆ—^z©Õ·C¶µZ _ûÚ×ðµ¯} GŇ?üa¼ë]ïB.×äoÚ·ããã­¾B!„BȦP…Âú›?ÅLÎ1ÿ˜­0‡i¡„Ê(Ö±p?3­_¢¯ùQ^µ¹³ð—3ª  AÇ–gâ"Lÿ #Ø{çA ŒÐ«ŽÖjþú=R²áô lKÓ\:qS/]„_õÌŠÉ$ |%øBúº]uÃ/(x ¯Aä pû÷Bf‡ Ì;,„~èwæ³PˆÞuJA¡'ô„ïpž‚€ÇDÐG)„ PæzײðŠšZû9„B!„ì@æjšø'º°„ETƒÚ%­n¶ŽY5D(°ai,‚ú8Ù'W VæZ×(ÎW1s©ˆÂtÅ*Rˆ0]Ý9:€#GÐÙ¥§ž)–»ÛŠ®î îÿ¡ÜûÆ]xùù<÷ÝiLO”õûµ‚£°0QÆÂD=.öæÑ5”ƒ0õ¬ŠS¥ DôYA™w[…e-¥ÛTp®2}ÍÂ$A™Ž®¬cÌ)*ëfKßyïš!„BÙ‚0¦Í`2 !d'ó¶·½ ?þx«o£)Μ9ƒ/}éKøò—¿Œ….9BÖ‡‘‘¼ÿýïÇ>ðìÙ³§Õ·Ó¯{ÝëpòäÉVß!„B!dpä@ˆ›š?aµT˜“_̾¦Oòœôd½ïW&áÍ]*õ"K~‰îë­“u1|ëFï<ˆŽþî{˜¤%ÔJLœº€«ÏCeq9žÄ$´øA LÖ¢ÛDf²·N÷àÃ¤ÅøVÚL”ðR?F4výy’c®7¦Œš÷å|œ„B!„´ }ð_{Wï—L…‘¦žµ“\ÒR\‚Ä;ý%-1&6¶uŽÝ¦*˜½TBy©ÖôŸQJ‘½y¼î!>Ò ÇáÕíÆ¥óK8ñ½œ©°jB›•èÛGßh•P±ä–xš‹ãûRcœc%ÀØç'5ÉeàLù!„BÈ&Âd˜Õ¡ ÓfP†!„ìdvïÞË—/·ú6Vä‰'žÀ±cÇðo|¾ÏåqÈÆÉdðÎw¾þð‡ñÀ´úvR,ÑÓÓÏãÒ;„B!„줸R>Ø\焜“Z‚ý¢ÌêM£c€W8‡ÚB¢Ö×PxRÖŸëëÆÈ±ë¶p²™}¤å(_aîÜe\=q‹WfR¥•HRñ#±ÅWPNNàô†™òŠuþJbKÚuW’h‚1›ù3ª×àùÿ°ÁO’B!„ö@ø‰½mD$¤³FCš“\d”ô"CAÆjK2ѸV›9ϯø˜¿ZÆü•ÒšD)éÅ÷`÷þÎë~VdëS˜«â¹ïÏà…ñYTÊÍÏièÞ•Cßî²N$®ø‘³šø’vNÐ?M¤I“dš){ÿg˜nÞ#„Bi”aV‡2L›A†²Ó¹téÒ–KÄX^^ÆW¾ò<öØcxþùç[};d‡ñ†7¼>ú(ÞùÎw"“ÙZ²žzê)¼ñolõmB!„B6 !öÑ?Ù\çX¢Kó©0uÉ/ Òbì1•*Ã[8¿ Õ•^ÒäJ2Ý{waøu‡Ñ76¢Ç&;Žå©yL>÷ æÎ\‚_ó,ùÄH+‰„˜Hf)Ctáôí…Ì ¬*¶$S`6:ÆWOÃ÷¿³ OB!„öà¡^ ßi|<&½XÒJ“ZRÓdâ‰11A&qNy±†ù+e,ÍTšŠïppÛ=¸ã¾tõn­c$›Cµâã¥s8ùýÌMWÖtn¾ÇEïhÀ’\|S÷ÚâËÚ`éåÚÓaþiXƒF!„Ò2(ìe˜6ƒ2 !d§óøããmo{[«opþüy|éK_Â_þå_bvv¶Õ·Cv8{öìÁ>ð¼ÿýïÇÈÈH«oð§ú§øà?ØêÛ „B!„ly¸ÎϯÞ-E^i” S'¸¤¥À4hüê ¼ù+ð‹]*cƷƈ]7j—ý7íÇà‡‘èÙøÇF¶µb³/žÇôógQ[*YòIJRŒ-«ø>DnN_/œÎ+ˆ-¶s­é0Öy«àùO@©Ó›ðä!„BiîéæÒ5• #ãi.Í$Æ„Œ•#…°t÷lØøÍâì – üWB!¤=)Xнr73ù'¶/`’W¬ý°na;â}ÌÄ¡à˜¿tÞü"T¹=ñ˜P¬©ßÏôt¢ÿÈ!ôß2'—Ôjþú?&²=Éd0ðº›ÐûaÎ]ÆÌÉWPš˜‚„!$|#mùP@øn©r/jW|ÔœSpzœžC€p¾ïJ™]ýÏ^ú}ÆöPP¦]¥DìxSËäªÉõ~B›J6›Åàà`«oãš)—˾¸Îðð0g…¥ËLNN6ý»ÎÁÁAd³Ùk½µ–355…Z­¶!cg2 mÈØ›A¥RÁÌÌL«oƒBْ̯ðŸJA]+b?"~ °úSÖFç5>&Âد),L–±8Y†Wm~qd!€±›zpÇÑAìë ÛK^bØw°ûvc~¶‚çÏàôsó¨VVA¼Š¹×J˜¿\Fç@Ý#Y¸y ¡pÞ}ÂÔ® BéVeŽ©”cᘫÜÓJW· ·Þz+:::Z}×Ì©S§P.—7lüÝ»wc÷îÝM÷¿zõ*._¾ÜTßÁÁAŒ]ë­µœ©©)\¼xqÃÆç»I!¤0¦Í`2 !d§óÈ#àë_ÿzK®],ñàƒâÙgŸmÉõ Y+?ò#?‚ù—iÙõï»ï¾m-ļÿ7>†/þáï·ú6®™'ÇOàGî»kÃÆ?|ÓÍxᥗšî¿ì)ôgš“[úúú093MúÚfÌT}ìÎ5?áh­ü?ǃ÷Þ³aão4ùÌâKŸø¿Z}„BÙ ùcâPãa*ŒâbÉ*É$™’ #섘àõÔSxÃÞpwÖzî½÷^<ýôÓ2öƒ>ˆï|ç;2öfðä“O⡇jõmB![’xkJxh °ÈkM…iæfÎ/£8[mÊ}ÈæÜrgŽÜ;€îÞÌú= ÒöT+>^:1‡SOÏ¢0W]Ó¹¹n}:àdE]ÊK˜ã7H€ixL™²×Œá7þ‹p²œ.]ïh-O?ý4î¾ûîV߯5säȼð 6þïüÎïàSŸúTÓý?ûÙÏâcûXS}ßûÞ÷â¯þ꯮õÖZΟýÙŸá—ù—7l|¾›„²þ0fu˜ C!¤­håÄúŽŽ¼´†‰ß„´š .´ìÚÕjÏ=÷\Ë®¿¸®‹Ì6.72îÆ–RÊ5=ŸµôB #·ïÃßè÷&—ÍnëwÓÙ¦‰?„Bi¥¦V–a8Ïö²¸°–ÎöÃ$˜d*L4ˆ• ¨j¨u&1F,=F@ftÚ¾ÛoDv° ¶¯@6w »Þ|/î=‚…Ï¡ðâ+¨-—´påÛ‰G°Þ_øø¥¢9¦bé/«¦Ã¨D:ŒRº_,»»Â 9¥¦ÁwB!„µ±àéÿŠNþz^„5«]Ò®’ #V?&ÇŠsµ¦E˜¾Á,ŽÜ3€oï…k*[I $‰ã ¹w·Ý3€‹gqj|—/,7unyуò„u 0&Jè6–³Òaô9ÊÔÌQœ~ý¹6H†!„B!”a!„´çÏŸÇÌÌ [rýàôéÓ-¹6!k¥•ñ½'OžD¥RiÙõ !„B!­Aarå–^Ò$K"€}Ž5†5¦Èäâc§H1ÂuÑw×-èºå œ|P«ùëþÈ#›EÏ· ûö›°|î"æŸ>…ZaIOΑðõd6¥gü@áÒŠ‘^”‘b,©E™ÏÁdŸ@”±Ž§ˆ2ÇJŸ´êßSB!„BHž ÐkÃ7–`ìõ±Å®}ëÅÊ\Ó1<ÀÍIT‹+ÏòÙÛ»ß0„=c]a›bÉK®“ý»±ÿ`7æ¦Ë8ùƒYœ95¿ê9™œþ*'ÈT(¾"Œ]ÆñZ„ =„àï•B¬†Ðut óµõøSB!„­eB!mÇøø8~øá–\{llŒ2 Ù6´R†ieŠ!„B!¤u(5Õø` ¥¬&¼Ä’`šK…d¦BTê„ûGùŠW¦àîEÆÍlÀ ;¿\Añê ¼b9|gä;ù"ãXïuZ:L°z. ÐH”‰ä-Ê(3TãIA€•þžB!„B2Ÿaìú5*sWI…I „˜`,;&<&ܬ@µ¸òýÍN•1uµ„áÝŽX¹3!kdnº‚«¯­ž#$ ].úL€Y5F ”b¬õ!¢t% žSô C!„BÚ Ê0„BÚŽãÇ·T†!d»@†B!„²ù,(è¨?”a‚¹ÿu‹•[fSa ‘íÄL4ù(™$#„¨LÎ`ú‰o£ãà~tÜ~3d.»aOƒì|ÅW.`ùÔËPAJjð>Š0«Ü2L6ý²’é0IùqQ¦îU/×0†B!„ue®0%d}id¿Ø /)©0uŒ]ÚŠ†Çܬ`åÈ‹jÅÇø·§púä<î{Ó0öê^§?OLˆÒ IDAT9ÙÉÌM—ñýŸlJ„'#CÁKA%Örh&Æ.…µT#DýX0RLì^WO"„B!ÛÊ0„BÚŽVN²§ C¶­|_ÇÇÇ[vmB!„BHkQjB$ê‘„Ô_7Þ&ì?Á6–ªKr±Îq»9cõÿk  tá5”/O"Ë!doØMȨMN£xê4üÂàû‘œ%¢D#ÁØïl¦Ãø.)K0ág5é%ÙfÍ Å›:!ƃR³›û!„Bi’íCq%ølK- d™´Ä˜pÁˆØ9"6–›“Mßçâ|OþKؽ¿Gß4Œ¾A.AÖN¹äáÙïNãÌ©ùFk-¤âædô›ÅVL‡QA2ª ````%Àè¿*¦Æ6 2Ai0·²/F!„B¶!”a!„´”aiŽV½¯¾ïã™gžiɵ !„B!­Ga õõˆgúXÛU$™:á%¨~!· áw&ÎOûÑç(ÏCéÅ3¨¼v¹›ÁØÀ'CÚ ©ˆòéWP›ž5 Œb¿“*¹ôs(ÀÈLwŠÀ“ƒæ¤[´ÌÄ!a-¡«WÙµQj€¿IO‰B!„öbÞ’aV•ZÂöà¿×a•õ‰1RaY~-2LÀ•‹Ëøÿýó™Ø1!8Ð’ûjez!„B!d  ¦âŸë—´M´!’ ¬¶†’Œ•J7Á9. jñ™EN.ƒ;öÇqîÉq̾üZB„ALŠñæP|öy¸£ÃÈì…pœõ>d{¢jS3¨¾v~¥À¬p+%àûzß’½òÃý{뽘>y“'^F˜#„[¤£e`É/ éEheUé‘<ƒè˜–f’ŽÄßOB!„BÈš˜¯=ÎÊ 0QÙš’ö’*ÐXýëJhÝ–É¥×§oü_Fá{Àw¿5âr­îxp?ժ‰LãÂ+Ü~ï vp±´XÃóOÏàÊÅeø¾ ß›ºš€tî¼·ÜÕÿþçgêŽgr2|wWK‡I[âýÍâV+  „‚P¦Ÿ¹Ï²”„J!„ÒvP†!„Ò–?~¼%2L«äBl8€Ï~ö³x÷»ß 8vìX]Ÿ‘‘är¹Í¾5ÀøøxK®»Þ|íËŽ3'žnõm\3ΟßÐñ/^8ÿ‰Ÿlº©Tjºïââ"~ì¿ýĶ]™laaaCÇÿÿù³Ø½gï†^c#ùϧ¾Óê[ „BÈ£°  ªI„5»GÄföÀš%”h ­&ÉDÇEFB•íô ¶\F¶'›âM˜»0WÿýJ³ Ö ¥„h 69 ~îîQ¸ýÑý‘‰¿´ŒêkWà-`bŽ€ð#yżGN>‡=¯?‚á;ÁÍH\yê¤%`™‰úÑâ£ý(:;;Ãö .ÔõmeŠQ»$ÃLNLàŸÿ§V߯–¥T*mØó©Õjøæ7ß±Û§ÐÏ!„Ò¾(5!öé)²I\lôDˆµH2É~ú|áf³‡ô·X„ÛÛ…ÞýøõS/œÇÕñ—à•«–8£'ûÊóQ½tµÙ9dF‡!;¸jîNCUk¨MNÃ[(¾J¼sÁg#f9GnÀèÑ›‘ëÈAºR ” KˆÞGsŽë‡x¢÷umÒ‹&ƒº¶©F)>”šnÍÃ\gJ¥Î;×êÛØÒ¼úê«6öåË—7lìíN¹\æ»I!„´9óBˆ—»Qê‹F˜ÿÞ_)E&jáa?Äe7+Q«Ä£/ªÈå<øð(n»§O=qÎ,êñ¤ù ¤! %0=QÄwgÊ8p°c‡{à8\bG¡€+—–ñÊéy”‹Ú"Rè²U*³¤ð}…]9<øð(öê ߣŅJêЙ¬ŒÞk“è‚0õaŒþ{ bå-,)FG‰Æk¢Ä˜¨äm'¦RI¶DS«Õ6Lúð<ž×F/Ó:Ãw“BH+  C!¤-iådûP†!›Î»Þõ.üáþaªä’&ô2Ũ]’a!„B!׎ÂöEò¬mCé%Z"WXmé’LJ‘ɧŒ#PYZF¶¿Žð]‰ÁÛn@÷ {0ñì,¼üªqDxn(ÈHTª¨¾v²»îÀ„Û|ÒÙ¦(…Úü¼¹À÷cï“‚ ßeÞÑ®½»°ëÞ[Ð9Ð×H0ŽÐÛÊbÑ$¿ï \ÌÞ …•k’^‚Ä=(E ‰wSj'tB!„r=ÌÕ–¸Ñ: «/Á)‰sf½@#D¬LÖín®^†)ÌkÆ”èÌáGê^=³„ï>y…¹ªat‰+1ÆX ¯]XÄÔdc‡z0<Ú±¾‹lI œ¹€ÂBž§Œ£"yJ™$!ä;$îzpGî€ãŠ(ÅH‹óÕÔñ3yG×ËJצ±rúZñõÒÓ^¢ô˜`íˆ@¬±Ö‘0±ÀüÆbB!„A†BH[rêÔ)”J%äó›¿*ëØØXÛ$_­ÏÑ£GqìØ1¼å-oI=îû>.^¼X×Þªd˜³gÏbnn®%×&„B!„l”šŒ&Y3„5»'˜àc{2QÇäVDc­ Ɉl7„(EÂŒé_],‘Êp ¤@&ŸÁèÑ[Ñ{x¦ž}¥ÉÙh&“•6&ÅK¨–' {ºàtuZÒNøÅ’N‚©iÄ_„^—9Øw{:0øºѳw8”`ì¯X†ï«è½2É/"ã"˜,W/½Ä“abKß&ÚVhbi30mS-y¦„B!„´,û@·»á%ìM§kIŒ€LN¢TˆßN†1’@¸öîÂÞ±ƒxá™9<÷ý™Hz0bLô#P«*œ;SÀôDûÇzÐÕÙ€'GZM¥âáÒÅ%LO•à{Z ‘º•B—›&F¸éö~Üý†!ä;H)¢÷Øl—êí'# øª^l]¦ZI1vÚ‹R‰’¸±(´”Àœ§6çAB!„M…2 !„¶¤V«áĉ¸ÿþû7ýÚ­’ ÈÎbdd¿÷{¿‡ŸÿùŸ‡”²a¿+W® Z­_u§Uï)E1B!„B@™I÷öŒ ¤¼bÍø©[ê„XâLrÉ\kbQ¶ekr†þ©–µ  ¤¤íçz»0úÆ»°xyó/œ…W,[÷kK5úþRª\ìì„Èr‚P» jÔò2Tµj‰)Ö{i&–"ã çð~ôÚ‡LFê÷IšwË’aÊ‹EK¬RPFˆ™¼+%é%%F'Ë@‹4B4—ΊäåS†!„B!d=˜¯=fFVjÂKRx‰„ eCXk3û"üÏý <Éäê“J sU-µ €æ¤#qÛ=8xKžûþ ο\Ð}E ňPˆ(=œyyý9ŒîîD&Óøß(ÉöÁ÷¦§J˜œ(¢Vóã 0*ØW€†÷tâî7 ¡0áha ¶@eÞÓBJ2Œ›s"‰Ë[ Œc$ÓåºESƒ–Ô!„BHûA†BHÛrüøqÊ0¤íÈf³xôÑGñ‰O|½½½«ö¿páBj;eB!„BH+Q˜„=[ÂH%ÀŠBL0Ë'žþK&HéŒôwr€¬"»F¹`’a”€’0[åè}_£ƒÈõ¡pþ –/\|e][ÄïC)øÅ"Dµ™Ëš¥TɶD)¨J~¥ ø~L| V µÓar{FÐsãdóY8#´㘟@Š©,.›@˜`L3V¦+˜ÍcI2+I/ˆf¥ 4€V[$Ä¡')L¶è!B!„Ò^ÌÖ€ýH/±õê…—à¸-¼Ä×zˆÎ©O…ÑÛL¾¾ö¬U}”‹>²yÕÔRAÉ”Èu¸8úæa¾­Ïý`³Ó%-Á˜Z&”cLéR(T°¼\ÃЮ<úûsQyM¶‹‹ULMQ){T” ¤ ÓUÂ}®^GîÀÞ±.K|±„­`kŽ-¦È0™œ ëÙàý‡Òu¯0 /Ó^¢z5e̱F¢L츾¦€À\©0„B!í eB!mK«&ÝS†!ÅOþäOâÿøqóÍ77}eB!„BÈÖDA©)H¹GáÿØËæZ³~í$¥—ðœ„$ƒzIF8Àχç !PZXŽ¥Áè­€TÄ  ¥$ºÇö 72„¥ó—P™šµä^3&Å”«ŽœúzÉÇWP^ ð}#»“Ï´ø) |½ïôö ãà>äz»àºúý eûGBŒN$²g¼éqd¶¶¬\%ºÄÚÍœK¦Æ$¤}-¥¬kýw’B!„rýÌÕò ,yÅ|°…—`³²ðb%¢Œnͦ$ÃÀâBCù°€R…c SCô fñ¦‡GqùÕeœ>9rÙ‹RBtRŒ „P˜-ai©Š<:;8m;Q©z˜-¡X¬Á÷Ìw«)UX_*ÓæfÞÔ‹C·ôÀqeB~©ÿ•HðÎæ+u×Íä´°¥×u0i.æ]Ò\”R‰ÒW½)§ QÖXú]Úæ¼Íz²„B!d³a%B!¤m¡ CÚ…#GŽà _ø~ôGtÍçn5f||¼%×%„B!„l=¦ì ,–lLëÉY?uBLÔl‹‘Lg„ãE³&L¿raY'ÃHßQpL2Œod-Êû€“Ë óð¸#»P¾xþr1”Òg‚@ÏÐ~ÈÖ&øþ”%Á˜‰_ÊGô~)‘Ë"»{¹]ýp“ò‹°Ó`êʋŸÐ" |· Jù)Ò‹h˜¦Æ ™O g %Ú”? ~Õ^B!„BÈÚ R(Rå»”µŽ7+¼Ô¥ÌXMZ2  :víé0µCpžN©Ôé‘l!°{'†wwàü™.ž[Ô刡#% …®k|¥0;WÄrÑEow®ËdÔ­Œï+,.W°´\ƒï)#Áèï^§ÀDÉ0R)ŒèÄ·ö"×áBR”ˆ~‡comA¦ZöP)ûu×Ï䜔µâi.+‰2Q[”.eŽÛ4mL†!„Bi_(ÃBi[Nœ8Z­×ÝÜÿ»£ CÖ‹üÎïü>øÁ^ó{œ&Ãär9ŒŒŒ\ïí­™K—.áêÕ«›~]B!„BÈEM¦Ê*‰escmBD}#7&žþ?'9ÛH®<›´Q\(†‚‚£$”ô!Gé•P•P&FšÈtu7„7·€ÚäTÍ«“bBÉGU«é¾dk!%dÖ  |_ÏðòýH~±S\ÀÙµ ™áAH×AŠò [ö+/,‡ï‹23|„[¶gE‰.F„±]ꤗà]S &&†D›šláƒ'„B!¤½(ú@YiòJ¸ðC$ÁÄEQWÆ®˜2ŽdòéÉ0…ùª>WÚAc•Ï¡£‚8xSvïëÄù3LO–BFˆHŒ cjž¹Å2òYÙL´°Ù2”«5ËUxž‚4ïC(™FH-Æôôepè¦>ôôgÌwëwÖwþÄ…˜Å…Zê=–F€IIsYM”‰·™s`—¹æÝ¶ÚæÒo‡B!„´”a!„´-årÏ?ÿ<îºë®M½îîÝ»‘ÍfQ©ÔÇþÒ Žãàýï?~÷wCCC×5Vš sàÀ–üºUiM„B!„­‰RS¨“U’"L¬-œæcϪk ņD4yHÂu¡*ÖlxU^¹'›R ¾Ê ޵¯"©Á1‚Œã ¯²»ÞÌjó…H~‘ )B ù”ïCKP¥˜–#dGÂÍèD_…sBY%|¿dOœÁAÈ\‘Z~I¦Â$åQß^*£w<˜Ù#káuTL` f!š„„ô¤Åú™[¬Qá;Ü×IM„B!„õb¶ªÐá˜Ú¨“W¢A›%¼ˆôsDÐOÄK‰ E&“•&Ñ2ž‚Ê0É$ ¬‚cZŠ «jäòn>ÒÝ{+¸x~Åb͈0¤Å ÂÈ1U߇ªTu]¸‚)1[>*ž‡šçG"‹:ýEPF@‘@6ã`ïþ.ìɇßm\~I¦ÀëXÐW 0Ÿž<šÍ'“a¢4—¨¼Mˆ2Ê$ÅõlØf%¢sìZØóEþê…B!¤m¡ C!¤­9~üø¦Ë0Bìß¿¯¼òʦ^—´?üÃ?Œ/|á ¸óÎ;×e¼4¦UéEí&Ãüø¾ðù/4Ýÿøó§ð£G×ç{ÝŒÝpŽ¿x¦éþKÕnèÉ7Õ·»»g®NÃqÒW8KRô|ìAµ\nú~¶3÷/ÿŠ·þÐ[[}›ÆG>ñ)üßô™Vß!„B®¥¦xÜh"‚IA–ð5Æ& ÕÍ ÏAà¸XûÑ8"“5bÂÙBåÅ"ºveÃÔŽ0 F ãè}ß0¾%ÈøR/§ê ôCvwÁ››‡_® 6#DHÀ–c2È\~© oqY'MGvuÀéìÔ +JAøzžtf$˜P¤ÊÀéï…ÌçGÏô …—Ä~<&M– d=9G 7Âñ#Ù%™Þ“_P'Âè1léÅLpˆ‹5ö8frj³d˜7½éMøú׿Þtÿû·Ã{Þóž ¼£­Ç³Ï>»¦äàû￯¾újS}üqÜwß}MýðÃãäÉ“M÷ßÎ=zßøÆ7Z}›Æ·¿ým¼ãïhõmB!-a¶ ìëÂ‚ÝØBÓaÄÚÒÎ Kd$Æ „Ù¼Dy9>ó_Ë0Fˆ%Â@*}®Rqa&¨UŒÏÒÝ›Á­w `fª„«W–á›þB ^ ¨ JøJBø¤Àw|Ô|?ú¢}!à8#£9 ïî€ãJ#:!’ÒKІÄ68V˜O_84“—æ'·Ô%ÀÀeÌ«¦Ø„mAÊQý9vÛœgܘ6â?ÿó?q÷Ýw7Ýÿ®»îÂK/½´w´µøøÇ?ŽüãM÷ÿ£?ú#|âŸhªïÏþìÏâ/þâ/šû+_ù Þ÷¾÷5Ý»³Öws»óÀàÙgŸmõmBÈŽ‡2 !„¶æøñãxï{ß»é×£ CÖÄáÇñ¹Ï}<òÈºŽ»•d˜ñññ–\w£èëëÇP®9F6ðn¶Ù\~MϧÃm~u0×u1Ò™mºÿ²ï >k²½Ù¿g÷šžýv§«»«Õ·@!„kƇR3Õë–Æ&E‡­‰ÉsⳄâmÖ¸"ÓiÆfoèq*…"zFúè‚DŒ€T&ÆH1Ž%È(©PÓæ „ë€,•á/-Aù*œ¤ŒØ³Gdg'dgü…Ex‹‹í7Cc‹";òý}Ž|ed$e}7@ø9nw¢³Bj©I !e˜ö⤊/¨d‚~ð}T–JˆÌ-sm× [„BAÙÒ‹´è¢'ÿ$å–(M&6+i" ”h;&›Íbtt´éþƒƒƒx7[“‘‘‘5=£f¤€¡¡¡5Édšî»ÝY뻹ÝÙ‰·!„€Ùš™ì+/DØfš"Á%[¾ω¥ÈØç “wêe˜¹J”öbJ‚( Æl¥‘   TB˜±ÒdvåÐÓ—ÅôT óóåhÍlƒ´8¤‰ð( (®±9@攣ú;*\O!H†èés1<Ò‰lN׸uÒ‹%Æ ¶µ~I1‹óµúÛ’@&ëh‘ ú÷)ÂJs±Ûì26eì?_<¦þ;u.=¤f[“ËåËåšî/åÎJir]wMÏg-5©ã86v;°Öws»³ÓþnBÈV…2 !„¶¦UI­’ Èö£»»¿ýÛ¿_ÿõ__÷_ ,//czzº®É0„B!„­‚R“b‰Ù?‘´%gY}C1Æ–gD°_¥B@f{à‰¥ðœR\XÖ‚‹2É01ÙE 2Žð•Š…ؾ¯¤^•T —…ã:ðK¨jµî>l)FH gh²·µéYøKËöÌw:"›;<™ÏJAù~øÝ(ë} &ÏÈœ ‘ËA¸®þ¾‚™^ìK„AlÉ/ˆÉ1ŽJó¥pÒ™ Þ¥ 3øo¥»4L†=û1*êOœˆ0XTis¿B!„BÚœÙjTâFJ‹]öŠô27lue±QÝ›j‚s²¹ú‰¹…Ùj”äK‚1¢‹%ÇD} Qí¢Çp\`x¤}}YÌΔPªxQêHLŽÑbŒ#dð+@uIQŠÙ@ܧS‹G¾©e£ëU%¡²9‰Á<::]#Á$S`‚á6­Oø}›ïR XI2Y'Ed1c(UצÅ,{­]Ðê¶úsìÚ7'Ó!„BH{B†BH[óÌ3ÏÀ÷ýM·ñ)ÃÕBàç~îçðû¿ÿûسgφ\#-hÍû9==Ýð~!„B!;åO"šµcH^,3&ýxRžIëk¶2ÛˆEö…K ËFj1Ò‚cÉ.Ž€£´ ã(%åèt-Íè}ß×b‹Rг.¤„Èe \~µÝŸ%ÅØ?2ŸEvÿxK˨^™€*×O!׆p¸#Cpú-Á _Ìä. &]rÀq ÇHKz†O”ÿqOˆ±a’må²õÝG+.‹LGBtAŠ“”_‚?¤uÎ ¢L°:.ÌaߟشïB!„¢§Pñ¼^ojÔ¸Àb«2 IA‰¯›ÃDaoºdòõ‰~K…*”H vŒ%)&’âL GDM&+1<Ò‰b±†ÂbE'~˜ºG˜¦Šd:²]åå˜õ$Ó!ï“ày >L©©Œ¤¤"1Æ]=Ytue!c©.°ä—ÒKìGÄú"¢ )q,™¼¬K{‰—¬ñ6Ý×H/A‹ o}jL4v<5f¶ “a!„BHeB!mÍââ"NŸ>[o½uS¯{àÀM½Ù^<øàƒxì±Çpÿý÷oèuÉ'­x?™ C!„BIC)k~"ÍeeáÅ$µoRˆ±ÎB”ÑRJ Ëpa’`‚DeD?dŒ,“fô¾ãxJ‹Béó´£ ]Ê÷ŒÓÍõ³IàôvÃíëAmjÕKPž·^|ç!2»áîp¤–`|W9É’N¤+é@è™A–cÄ¥XòK$¹Èd[Ú#P.í› ¥‘ëFh²Ø3€Š0ñ¾B(s<)½¨‰1ZJ#„B!„¬7³U`kK/†°ì­OŒ‰‹0"vLÔµ‰º±sõ2 ,ªèéË"™#¥€ô$˜`«¤¾’€²úDrL>ï"—u°\ª¢\ñŒc’F¤ù1RŒ”@×.ý–¦j¨,Qйœ¬@÷°‹L^À÷|O§P$Lz-Âd˜Žœ‹ÎŽ“"²¬"½ÔË/ûæë ”l>H†1òt*„•cµ…BŒ9?*‘Íù±Ô˜ºü_`2 !„BH[C†BHÛsüøñM—a˜ CÒØ·o>ûÙÏâ=ïyOø‹êd+%ÃŒoú5 !„B!®Ÿ IDAT[åO™I4õ‰®vÙJ2ˆ&þÔÏZIžIôu*€êŠDËóEKVd ©|#8‚Œ€r“f|)à8€¯|)µ` ¥ž˜¡ÌŸO*@IÀ÷ j5ˆŒk®:)F˜%ts»‡‘DùÕK(]™Z‡'¾³Èôõ ãÐ~ Ÿ‡ç©H&1t>oUó(À‘f¦=³'XÒ8_LjD$¿8F’öV„ï‘4S*­ï[QE@fúÃûŠË-–ëaõIeìYAúÔ˜JQ†!„B!d#˜©*ìí05HXÓ¢aúK}l—¸Ñ vÙkDz2 ,ÎWÑ;Õç2‚°aD]L$;µÂD™0u2¨iÐ‘Ë ëº¨ÔüRÂõ óùPаg+è:nÝ7D×¾QNŸGeva½~ÛâtäÐsÓ2»ày ¾¯W2ö}3™& 'n©J~¥ªS_¤„VŒQ:Lð„â‹ýcÉ.RÀ¢NŠq,Y¦TXÖ“xÂï\¢ 8.„¯Ë-áDÄ„–†}í˜FíþDòB!„BÖ™ªIm4Ÿí²a›ˆum"¥\Ž:'‡LK†B`q¾¥zH _ÅSb­I‚QP)I0‘8Há›ú˜”9×ç xP1!&¨›l1¦³ßA×@' UÌ^ªÂ÷(ŬFïpû2€Ôi0Ê”4 0ʈGA(²Â“ÑL|݇t¡%.¿¤ 2I‰Öv¹à…‹:Ødóz![VI ,¡ôSîZ¥¬h¬TKª‰Jâ`Gï꿃„B!¤¡ C!¤íiÅ$|Ê0$à§~ê§ð¹Ï}7Üpæ_;M†Bggç¦ß eB!„BH#”?]ˆMáiFˆAÔÜ0&Mž€p”K<Š‹%@©¸ì¢L"Œc 2Ѿ¯©“a"AF§ÉøJê aJŒ-Ä@I¨jµrNg¢»+. ¹Âš0ÔÛ‰áûoGyb³ÏŸE­X^ß/¢ Žƒ¾› ûà^øð=-Á(R镊U(ž¨RÞÒ2ŒÉ=l!¢‡/âŸCùEÄeG&ä'¥MDmÅ…"6 ­ï4q(aD$Z%gÿ¤ž—h‹µ ( J-­÷WA!„B0[Q [E$?ưÓ_,ßÅ*qãbMØ–¾™|zòja¾ ; FåN±&OcÆ¥¨¸0£Œü „2òE Ìèû•BBø ~UA䌊0æÚFŠ‘ŽÀÀ¾,úvg1u®Œ¹+•ëyìmKgŸ‹ÑóÈvJøfá(À—z¡Žð;Uæ;« 8¾„” ‘E óüõÌwlu¼rr bÛxŸÅ…jØn;1Ù¼ƒ íżf±˜HˆI¬!LjL¢Þ$-ИæXòÌlu³¾B!„Ò*(ÃBi{ÆÇÇ7ýšÝÝÝÀììì¦_›l î¹ç|á _À[ßúÖ–ÝCš Ó Q«P(àå—_ÞôëB!„B¶ÊŸp»þ`OZm?šù}¶·+áf€Jü R@y±„|o”‚\Œ”l«M 8JBIŽ-Ë(e¶zv‘ Rb¤Ù*©'™cBxð—á/á ôAtvhÑÂLJŠ]{‡Ñ³gæ_~³/œ‡ïyk}ämIï »1ðºÃÙ,!d«ñw÷wxÇ;Þ±©×|ûÛߎüÇÜÔk’Ö‘Édð¡}ŸúÔ§Ð×××êÛR (—˱ö_ýÕ_Åc=¶©÷rìØ1üÚ¯ýÚ¦^“B!„²9d{>¤'Ìé@„b‚lØ®'é¬ÜaÎO´ûÅ xÓ~°ül(Füл߄wŽÁóª5µšš§ô¶¦Pó’mWM›ò|(ß<Êó_o•ç‡ûÉcð²½èܳ nÆttšˆãDÉ"ö~qz¯}ç–&çZýmn™Î<ö=púï…ç+xž‚ï+k߇çéϾ¯PœœCirÊWŽ£¿wǤ¿Ä>;V{ôY:®#à8®+àZ[Çp]}ûÿ¾¯l|ý.ˆü Ü¡Û_ÏlRæ8”e¶QÿíJé÷¨ÉöÚò?À¯nõ×I!„BHÛò†A·÷º¦daZ‡½•F\Äi¤ƒ@¾±­NˆeÿÊ3s˜½ª'‚KG×Ã{;ðs¹¾¯tIà+(_Á÷ ·v›øÖ‹Î‰ŽYãxˆ}Ž_ÃHÖ¹2#нËE¾[êE%¤ÐÛpß,,`RX_{q_X†ïíœ9nÃcy¼« ™œÔß©yí­®}jÉÇâd Õ¢¦¹ÈØÖ¼3)ÛfúDÛ()f¥¾OþÓeŒÿÇT˜b£àd$î|ë0”R¦œUð•y?”ygbmºO|?lóUÝXºôÆ©øøÇ+;g±ì˜aÒ`”€AJŒã£<=‡êìºöíB÷î!39JX¥¢ýžÑAÜñŽ·`ú¥Wqá;Ï£²Ôüê—Û é:Ø{ÏØsôÀ‘ðövq¾V¼Ù¼ŒÒ^`•³ayª`‚¶Xé ]ã ¥êÊÜÔ’Ø´÷!„BH{C†BÈŽ “ñ)ô?·Þz+>ÿùÏãÇüÇ[}+u\¸p!µ½ïåøøø¦_“B!„²½Ðòë$' 5:žºŸ"Õ˜vát@a9ë¥ùe#¸¨zÙE 8PŽ€2Jh Ã’f|©û2:×WROÒ JJ=CEB ”¤ŠBIøž‡Â¹Ë(^ÆàûÐ9Ø£'¾„+‹Øþèí7`äÖý¸øÝSxõ{/Á÷üµ[˜á[öãð[ïB¶§3L}‘RO|±Ÿ€_¬`æ•K(Í,Dé/–Übd0Ó AúP4³'úì˜U˜¥YåÖI_P/ȈziƑŅ¢ž¤Ì23vD¦39(’Xló%œõ“®á~ŒÜv™®|èjÄ< ¸n7½õn¸ç&œþ×q\}áÕëùj¶=£ý¸õ½}Fà'$˜( ÆLÔò}̹„¹ “ú»•É´‘HƒÑé~(f˜Då)Ì]®`aªŠ‘ƒy ìΆµ˜Þ"”c¤Ú›ÇyW^=µˆSßžGyÙ»®ï§ÕHGàÆ{{pËë{!]ßSða¤³È†€”úû*-z¸úJ å%/¬WE !Éh‹à¹m+-qùeõt™@z±·öñÂ|566d;œ@µB˜†j톈(¦.4µNzPÖXÉĘi&ÃB!„ì(ÃBÙ\¹r—/_Æž={6íš”aÚ)%Þ÷¾÷áÓŸþ4víÚÕêÛY‘­"Ã<û쳨Õj›zMB!„BÈöCyW¯QjIÊ1MÊ4²jõÑíKsK‘ì$Â8c’aAFiÆìûRÁqü˜ #!¥©<_„‰/J©Ptfad™@ˆÑs;´0#”‚‚ÄÒÄ,ÎNÌb×á=¹í„£E F J1]Cݸï§3çþöÞ<Þ’ª>÷~Öª3öHC3uÓ-S ˆŒ‚‚q6cˆ^ã‹1W_CŒ¯æ^õõs ^%NxoÞ7šI…8¢ˆÄ #ät3O2u7ÐÝgž‡½wýîµVÕZU«öÞ§»ÏÞ§û<ß|65­ZµvÕ:ñ¬Óë[ÏŠLAâI¨Ž•(š,v¦P`–OÙ~4Þ¯" ÄþD£Ê\•Ù ¢®Ž,F.‘#ÈDY2LlŽÇ‘™|ÂL,*•]ÒHmDQNZŒN&im&‚HfH"kTgçðô]`à±í8êìã±êÕ‰¤£ì›r3)&Š6w"Ž:cøáÝxìÎ!ñ✲îÄ8ý çbùÁ«#ö+'¶ìíS‚êÌ,ž¹ç·èj'T!½Ö–1b Ò„˜²íü2©'©N¥÷3ÒɳNîq¶?MrʧžD†Qé¤/5 /±¤S‚æ·tgAJÅ©Q†!„B!¤ Î!Wf¬êú/é¨ÕŽuy±Å7j”7âíìÑБ/?@#sF´ÈD”,¥ÅVDÂŒ&)Æ•] Ú$ÍXEArÂŒB&Ř4ïúf9¸}CÏÍbÃñËpÄ ËaYbŒC8¸¿íp<÷Ä4~ýý~ŒìšÛÝGµ t/‹púÅ⸳V¢Çb¤IÓ`´(“~ mŸÁÓ÷N`v:NÓ` -ŽôÒ(Å¥Lh)+“ÝeDå‹2˜¯8ufÏ´kY”d™Ôo›2pÔù1²ÙgJÙ4' &epŽ©0„B!KÊ0„B– ­N¨ˆ¢ëÖ­ J dñ³|ùr|èCÂ5×\ƒžžžv7gÞ„ú];ÒŠ˜ C!„Bi©í02L˜Ü rƒû›YO÷utA*ÒdŽ„éÑi¬>tDq¤ Í›WÓD˜È\"#ÈDbañ | F‹˜Q@-ޱ}ËSضå)ÔâJGÉ$#´(óÚàt»îR'i2Þ¶“ü_´/¹DeÉ0Ž,EYBÌäè4üÙ=€Ò±/±¸3yre®»¸3‹5‡')+‰à¢!Ql’`l"Œ 6Lœ 2F~ð¤#BèLIÒa!Æ&Ãd‰/6%FCi³@´„?&Ecç£Ïbà‰çqô™ÇâÈ36AE:M†QNJŒÖ kŽ8¯üÀë°mË“¸ë_îÄèóí“"º–uãŒ×ÿ^ôŠS!f²“Ÿ“L¨Ñ*búýâ!LÏ@EÚ$¸3q´y;­YWyÑ¥(¾„¶ýD=r…—Y&Ê—3ç*LÏ8wÀÌ$Šr»æ-¼4¸Ñ¹2qmW'B!„BöCÎÄ|•þ'ŒJ­Î¾ôX¶Cy;Šuw/‹P™‹‘Èf¼;NíP:K‚#ªx‰09a%“^Œ¼’¦ÅØ1œ¤K¥%Áˆ_¯×m¥¿¢35Ü{û0Z7‰Î9¬í2i$vÌë #S.<Çu~ýý]xàø}cŸ ǯÀËÞxZ×…¸&ˆccxhL Lrï*³1»{ Û 2Ñ''«4âYK/Ù9îõê_Ë–«¤Û™XtuG°Á·6û%4”-îs`BXiFJÄœ=D†B!dÉ@†BÈ’á™gžÁàà :è –]³Id÷9묳ðùÏgŸ}v»›²GÌÌÌ ¿¿¿°¿Õýñ¡‡ÂììlK¯I!„BÙw‰«;3Àáã.‹3råüÕâzVêZ ?fQ˜™Jd†ˆEAk1R‹‚Ž®GQ"ÆD© ãÊ2É2Ö®ƒ4a¦fD˜bâ‹ÊÒbR!F9±(™@“”1©1F–©Ujxücû½OáE¿{2ÖŸpD– £ŠrÇQg‹£N?÷ÿð?ñ›oþ sS­Ã)¥pâ%§à¥o9Ý+zQ3“‚ļ Wç¾öØ®Üÿãû0´}0ùþQ&º$“·’+³xŒV^Ù,6§(Ñ@å$#3Å™´œò¥W’™›Nd&Óa'‘ut¥}0} n=Y¥TŒQ¹t™@AHuçž=@B!„BHÓÔ©ìNƤ¥rKŽz‰1Þ¾€aÓÕÈÄ…±‘JšDbÓYl‹Ö ±M‚1b‹/]˜ñš½RNlI/41|±%½–Î%ð®3,ƒIÑPˆs‰4ƒÏÎáçß܉#O\sz–Gf¨§9&iseN:ÿ Üùç±íщù<²=fõÁ]xÙ×á˜SWÂZ/iú‹IzµCQÔ€§î›À£¿Eµ"‰ã}áfé~Ï2¡%“_K/Eɦ¼ŒÊ•É—©¶ºº£Dl2}ÂòÚ¡«{óT8ÆÝ´Cߤ·ǃ³”a!„B– ”a!„,)6oÞŒ‹/¾¸e×£ ³opøá‡ã“Ÿü$Þö¶·!}ÛÒ>LYQ«ûc___K¯G!„BÙ·I’ac²f†iÍåœrºk5jØ @{E&F¦EI’K¤äbR]D$ÂD ±•[A&[O–‘V(K“‘H%ë1+H|A.-&±A”I’ÉÒbÄH3HÎ…M‹IΛ›Æ=7Ý…g^p0N½üt¬9|y£¬ã‚¨ä2QG„3^÷RϬ IDATR¼øwOÂ/¿òSÜÛ–LÖX 6œô\ø½k<Ô“`€äû¤Îf§gñÀOîÇS}O%;´MwqS]Œø¢rÛö¸*Ù67Cc(MÑqew[eû3ù^ù(·­•¿=5:LJ¥Ó5;{Š7JÁ‘YJ–®üR7éÅ?/ùy#„B!„´ŠÙvkÔÀ*oáRŃ¡÷?$K…îÞÞ) ˜«&Ã+á ˜“6 Æ +E±Å– $Â8×ð„»ž¦Åøõº‰0!qGâDÙöè$Nô\|õ+ð—½q,¨Õ’7Þ Ìmp'Õ Æã¿z÷ÿä~Tf«@¤Sy¥`ôìɶ—£3ùEù‰.‘‘ |A&—ü¢ŠÇuä—™ wÇ®•Y &¾8û÷¤Œ!f2 !„B!-e`6Æq@&¼C%8dUÙ2(ƸeJŽw÷Fű`r¼Šå«:`“X²–LzIå#¬ˆ•7òI0 ‰|!¹}®8£“Á‰Bò¢•K¤I¥#Îø"…‚Ò’~'ÀˆJP™ôýxOl׌õ›–¥òÒüš¬AÇž¾GŸ²÷ܺ¿þþó¨ÌÖÊoàî €Ÿ»ç¿q=–¯ê0²†Æhvø912‡{nÀ³¿J%˜úÉ,¡—"‹+Æh•Š2¾0SZŠòK¸ŒÊ•ÆM2Œû$ºzµ{ ÁEÙx—Ò˜†ï}0eÜt¦ÂB!„,-(ÃBYR´zr>e˜ÅËë_ÿz\wÝu8ꨣÚÝ”½eB!„BȾŠTwÑÑÉF3B‹K3e¼‚ À,ór3sc|xÊ$ KrqÄ—DpÉÒ_BÒL$¢ã4a&eA%Ö ‘ÙWkø’ÌLJ-‘DàHÌG–Q朼,@ ¤¦ðø]â™ÍOâÔËNʼn/?ÚLZ±ò†R™È±î¸uxÇÿz'ºý~Üö¿oÅÈŽ‘fol)]½]8ÿmàwÞrtG„Z-™ì"ÉÜ å|E lx;~ó­ß`t×T9"Œ†RYŠK²­šÜÖ ·­ä'¿ø²K¤ë‹/e‚LdÖ' 2LÒïT÷êâî½5'/ÉÄ5Hm`/UN!„Bi†² úéU•ƒ=&Ù᜖«'YØ4Ž|JÇÄh+Vwù{z.‰%‘*¬Ð¢Ò$+ňVTÚ®d’c±Å¦Å8ÂŒ×{€œc¯%Ùwí¯àÇÿü,6ž°g_q0VÔøû€‚‚BÔ¡ðÒ+ÖáÄóÆÏ¾¹þ²¯Œ»ÖoZ‰‹ÞúvÔ2 /Á¤$;ªs1úþ}Ý5b‚a-A9¥<™%$²ÔZ ?ùêÓxþ‰ñO ÌÊ»pÁï‰~ç $L6XS&&ÉÂ#wàž`fªš¦Á4+´4–_P_ziVh ‰66¹ÆdRi&®OMVQ‹MÒ‹²BŒBWoGÚA]ÆÞš WpQÙ]ôO(ˆ2~=õ~Ö!„BÈþeB!KŠÇãããX¹reK®Gfñ°víZ|üãÇ»Þõ.DQ |?"$ÃpÀ-ë÷@ò³611ѲëB!„Böâêg«\bñ({ ®W&¼®"œ€ñ‘ih¸Ò‹“£% Èhh‰ìL(J“e־ƼéÕ¤ÄX©C)tôváÒ«/Áï¼þ,Üòù¢ï‡Í¿ddã‹7à5ù{ØøâˆcI&ÄÀÌ[Éy?•™ þã[wãÞ¿±JGfBŽ2“±LŒX”™i“nëü¶»Ôm]8ž¦Á8’K>ÝÅK‡Q¾ì’f²„+Ë#SY?L'òL׿™él ½#Éø?g„B!„VP‰ÑŠ`Mwµ%on仇•·ðÖz–E…½ ÀøhYJ‹/¶xI,Ú$ÁÀObÉ + p’`9ÆI“ ‰-0I0v„J¤I¥#ΔŠ;HÒXã°åŽA %Òä“fĈ3¥âŽy„w¦Çk¸ýëÛqÿχpþÖá°£Wän–/Çœxî¡xá™ã×ß݆{~°ÕJy²Èq/=/¿òh¬:° f¤[jkLŽÌá®ï>‡ßnMÂK‰*^ÚJ©Èâ -uS\ "Kcé%;ǽ^ýk…ÊNŽVüÎhd©®Þ:2LɽóvÊ” 2Ó5ÁT2 !„BÈR‚2 !„%G___Ëd ‘xà–]d\z饸ìg?‹N8¡ÝMi)”a!„B!û*Rd@ÏžWÖÌ|¡În ê69&F¦°ò€e­Ò$—DŠOI…H)D© ãÊ2‰ø;2L^š‰ÅH6ñÅNF*H,ÚOˆÉ,7-&I’Q&•&Ÿ<Ôâ¿ùÎÝxðŽðò?zN¿ô”tb‹õP298öŒ£ð¡›ß»¾u7¾ý7·`l`<½—]¸øà•W_ŒÎžîd•aLLâõ$“˜¶?°·}évì|º?io¤›’W|)&;îI3y‰&û2¾Dc¶}aÅOwqRdMº¯Dšž tÄ=¨Sç=¹CL†!„B!¤= ÌÆØ4ò†µŽwõt`vª’¹ÆG*™Ä’ %ð„•lâ +$À+b¤W–€+¬išL(‘ÆÔ’Ž%}q'ûÞJêˆ;Pèß:…›>ó8^ø’qÎëÖcÅšîÀÍK.ÐÙÝóßtN¾p~úõ'ðØoú½{yè‘+pÑmÂ/\T‚) Ã’6Tçblþñôýdâjœ¦±6”TRIFE+[YšOq©'´„÷9–—MR‡œÛkÎër“aÌU)÷ݹ«Ý¬3Ôµ•’4HU Sa!„B–"”a!„,9Z=IŸ2LëÙ´i>ó™ÏàŠ+®hwSÚ¶mÛ ûZ-ÃlÞ¼¹¥×#„B!„ì?ÄÕÐÑ Šš[æ‹êZ™.Ö?>2…õVneåÉ-¢ØÓô—LÉšd_ä2‘Isq¥™Z!ñ@ª $µJRq&•e”‚XF¹² 2ÑF¬h£YFkLŽNá–Ïý}ßÿO¼ê=—â¨S6"M‰I}’d;Ò /ûý³ñÒWŸŽ[¾ø#Üö÷?Å)ˆ7øµ8hÈcAKvI×óQÀXÿ8~ôwÿŽ~ö¨I‚Ññ%/Æ„¶•™ˆãlÛãnZŒv¶cÓe”)ãÉ.î¶Êö§òK¯|”?OÁ_¦‚ 07SAe¶Zì‡Qn"Ðn÷h4˜)@ µþe!„B! ÁÀL’8¢ pË6çw÷hÌNù‡ÆGæ¹ÂI‚)&°ØsT!‰EŒ°¢Ìø#Irñå¥íÙ’J/¾8£’ñ.lZŒß{­P"M^Î %ÒxâL¬ðèÝCxbË^réa8ýëÐÑ©‘šî=S ܋׾ï$l}x·å1LŒÌáeo>'½ü°äûÙ°K!È)¢ðø=Cøå·¶ar¤â%¾ø’Ên -ž(gÙ8]ÆYË/eeÃí²eÆG+Ù½0÷5êPˆ:bIúJ~ÄêŽbCãb︳^6üœ-Oõ!„B!û'”a!„,9Z=IÆ -½ÞRfÕªUøÈG>‚÷¾÷½èììlwsÚ®]»033SØßê~H†B!„²»ÄÕÐÝfÐ]«c¢0ah|h2I‰œd1²ƒd2D"¸˜d+͘}V ‰µ¤RMœ 2ZÇž4‹€óÞ´/瞘0COW '´ÔOf ¥¸4!²8b ¼¥ó©#´¥b»üvgÇ&¬ ãà¥Âzìnü<„Œ&ÃB!„,=(ÃBYr<üðØ™™AOOOK®×êDŽ¥ˆÖïxÇ;ð‰O|‡rH»›ÓV¶nÝÜßÊ~øôÓOchh¨e×#„B!„ì_HuGÉ„güìªs9 #º¼ÊG‡'E"1"/ &Ir‰µBÁˆ2&-$/͘}îù™4##ÀØ}±V¨‰ö,+¸(%Yâ‹$bJ"ËØÈ7ñÅO’Q¢Mu&%F9²ŒBì1+ËÜûãðàᢷ½ —¼ãô,ëòÜWôXyÀr@€ØLF±á5J%ž”¶Üv¾ÿÅad`"Ie‰4Ò”o™ß¯¡”np¼l[·•ò¶•ÊÉ/9ñ%/È>‘›ü⟪o|dª¤.Û»»qÙÏ!„B!dÁ™© &*‚UݹÁí|ƺó(›‰ÙI³Ó5Tæâ$ň%J‹)e…’L6±2Š˜¤—ØbË([‹ä„™TŠQ“&S[¬T8I0N;lš­ErŽ•bŒœwƇfqËß>Ž-›vâÂ+ÆÁ/Xan‘#Ƙu¥ºztv ž…`j¼‚_Þü úåN¤é-{*´ä”úÉ,å’JIÙT˜#ÊøÉ3î5³zë ;ã#¾ £tu—É0å4Òdê`2 !„BÈ’ƒ2 !„%GµZÅ}÷݇³Î:«%×£ ³°œþùøüç?ÓN;­ÝMY,†©0„B!„=!®îÜ;5)Ϧ à'sŒ NeInL”¬GFŠIDeü‰$•fbs<ŽÜóý„+ʤҌ±8 œT™%M|AAbI_ŠBLb§Ø”˜¼,£Ñ&K¥©ÌÖð£¿ûwüÇ·ƒ×_s9μâ´d¢ ”uhi+æPsßœLŠÙöÐv|óÚïàÉû· &ÊfÉRZ`D•Ôºq·ë&ÀèÀ¶j¸™Ô–ìYÃ,Ù¶¿´¢ ²LP¦É}&Êd˜îUõ^l;•ävQ†!„B!¤½ôÏÆXÕ­Ãç%Å4.ÜÝ[’5w›äÄ+ä„•‚Ø’ +pêɉ-âÔ«œD˜ôn½Èa¬œã$Òat‰¸£$I„)I¤±×zö±Q|õ£›ñâ—†óßt4zWå;•y*K"QH®  VôÝö,~ýÝgPƒ©+óZÊ“YÊä (¿Ô—U\¡¥(¶ä®¥ÍsòD÷£ õåeèì)öõF²Ëî2 Æ+L†!„BYjP†!„²$éëë£ ³³qãF|úÓŸÆ›ßüæv7eQ±d˜¾¾¾–]‹B!„²ÿ!Õ@ªòQ %Q˜)´;é1j®°kth2‘S4|ÙE’}‰à"Fjqd ÑÐ:†Ž"sN$ÅzbÏK3q¬‰Å&¹¨\ZL™Ä¢“{à¥Å8‰2pD›TˆAZ.m2 gdç(þþš¯áίÿoùèëqÔI Ò9A‰f–RÂØÀ8nþô-¸ëÛ÷˜IHQý”íl+³mD(•×ÎqoÛ]ꦶS‰% ˆ+Jåä•“fŒü•I3V–ñåšp2Œ@w®Jž÷|IÏiò\¤B†B!„vÒ?ã˜U­¹V– cIÌã£xh74bO(qÄmX‰Å[Ra%Àb óò¥Ü—'8×J…{œØ¢óI0Ž0ãŠ;¦”•cB‰4VÎG˜îûéóxä×ý8÷ GâôK6@w¨ô>…ÿÀ ðÄæÜñõßbt×´_frˆÒ*K[©#©4/²Ì?¡ÅÝW”_ÊÛ••­ßöìùfŸZ-Æôdµp·BBÖBÑ?C†B!d)B†BÈ’¤•“õ)Ãì]–-[†~ðƒøÀ>€ÞÞÞv7gÑ’a¢(Âúõë[ÖÊ0„B!„=CWwBGG )³ÅΈi> Æ/¦j…"#ƒ“¹$˜T“bD‰âTId1¢‹Bœ 2æ|Gš‰Œ£uX𩉕6lâ Tˆ*‘Xlb‹a”†ÒHÎ1 1™,SL’Q¢{“‰6¿½çIü×ü ^öæ³ñÆ^5'G-Nžˆ Z©áÖ/Ýï~áG˜™®@EfVL£”•m[ÑÅ~’‰D™ðOŒÑ91¦9ª\|Iå—&öé@=^¹œh36adÒÌèjfÒNù¥É9?{-y‰B!„²[ ÌÆ-»VW!•#Ïe‚Š+”’X’!àË&Y"ŒM`ÉdO˜Q­v® $/Ψd¼‹p"½–Ö 1üD_±I©qÇ^K+hbñ¯?7]Åí_ý-îýÉs¸ð_ˆ£O=8x?Ÿ›Äí_} Oß7˜I0õ$•@¢J!me^"Ë-é²¾`Ó¨ìäXñE#Il 3ØÂŸ-B!„²x(ÉÝ$„Böo6oÞܲk­_¿Zór÷ŸúÔ§ð‘|„"L !fݺuˆ¢Öý¡‘2 !„B!dOoÂþ<Ó/ å¥î©** 4Ó“³¨ÍÕ’ô#¯e¥›4âžç}œº‚©$Füðä W"±³m´+‚h?qE;¯¡Õ¾|â×kRWÜt¯¼ö„‰wþë]øÚGoF,‚¸&ˆk1j± Ž;ÿõ×øÆµßÅÌÔܼåå\§ðì ,•ÏK4õ¥_ÊÉ +uåØ*W'aÆ>û±¡É@om܇]Qf^t+µ!@”!„B!­a`¦Î„ý½lÑÕ%Cޱ‘J@xp$2éÁ¦¤ Gð(DB’‚u¸í€×ÆriÃý~ªŠ#‹¾ >7…›>µCÏO&Câä ¸ñôá©{ç%©Ëæ¿oö‘.ó÷ºB eUe“2ã#ÅTèìnÝ<‰~Ê0„B!KÎÌ%„²$¹ÿþûQ©TZr­ÎÎN~øá-¹ÖR £ƒÁvõÉ0­L'Ú±cvìØÑ²ëB!„BöOâJn\áN*KÐh8i¨D’‰:ƒŒOŇ àR/=¤D”ȤëôD”TÑÉDm–©4’eŠ‚‹ÊוŠ6Ê?וT\YÆÞ©XP3ŸjMP« âX ±y›ð¼EØVÅmUr\9Çuh;[ª¼Ì¤>‡D^Az<Ò&È)Ÿ•SÞùé2×'¼d˜€ UÅÞ–^ ˜º ?W„B!„–3YLU÷Â/üͤK*›Ì‘•ã#•œØ’^B„0¬°R&khûN‚’:̱TúIö êPaaÃJêˆ;©|ãÜÚ8`ÒID-“^ê'³Ì§lýtx÷®~ºÌ|…–bÙp»ü²Égb´8÷BN†iÔsw÷x+S—!„BÈâ2 !„%Éìì,zè¡–]¯•2YÚ´[†a* !„B!do ÕÍÉ{¡Œêì –žr¤¥–œà9)#eÒŒ+š•f2‰ÅÊ-*“Y´Îä•‚àÒ ñ%MIñ“dT°®œhƒdÎUl$˜Zl—1b‘y§´¸òÎ^ÙVÎv>]Fëú)/”˜H•<+§ODùýÊ‘iL9ˆ`|dªØÑÉD»Ó›)#UÊ0„B!„,úóé0óqcæó~qe„¬ÄØðœ#X„’Fr"F©L¡rudÌ·Žœ€á óH¤ÉËP*w~‰ì¡sc3ÿcî_ýd–²6Î?Åe^’JNñ’e‚RRXh)k{ñ;ËŒRHÐÙ]”a‚j ŒÎíåh%B!„²O@†BÈ’¥•“ö)ÃV0;;‹]»vöS†!„B!„ìkÄÕ]öàže󤸮»WfÛÎñ‘ÁIOvð>‘+¸ÄŠi&N¹4“”÷%K‹±rŒ•eH,nW´qSVœrÁTÓ&ÒdWˆüTGÊQ*°Ô{q[·•s=s,Kt $¸”Š/ñ)wNYŒýLŽM#Žs €Šr ¸>îÇù4 ”ña2 !„B!‹ƒþ™ZÝã¡¡@SA’ÐÉ®]8g|hΗš”MàîË—³"FÙÄ +A©¢^ŠKz _z)H%¥ò‡/ä¿+œú³H‡q®ÙŒÐ²'É,»'©Ô{†p’eœûà.sõ!pÍ|ÛmÙ±‘ŠÈ+@g—NÊûm±7v”Ê•˜÷jÀ*!„BÙw  C!dÉB†ìolÛ¶ ø+!eB!„BÈ>‡Ô Õ~R2ñåÒ@]™ (è®ÕðÄóÒ×ÑI_|ˆê‹E©…¤‘ùJ3Q¤|‰EYéÑ=r 1YÆK‹±uåÒbœt•ü±h#b$˜Zœ~âX Òz 3dö(F7±­êo+óL´“êRXªàvúÜTñ•õ‹|²ÌØðT±PÝ~ozYBAŽÉ–L†!„B!dq0O†išF:A±tgOTxùÃèp€/ŠÀ•MÊRTÉ&…:Ê¥Œù +õë(¶ ë'Ò(@ÉÿÅÙR¤X6'5•â²ÒKQRi\6;''üÔiWzÏÜg˜»×eõÏÏUérSašƒ·³Ñû"ìõvÿgŠB!„ìët4.B!„ìŸlÞ¼¹e×¢ CZÁÖ­[ƒû[ÙÿZùsE!„BÙ¿‰+; :K&Yj~KI&™P€ÌXîÕ?<8(RI¤@´‚D€ˆB¬¢ˆEAk+µÀ¬kh‰8HZWr¾¤K·N#ÔÀTr IDATaˆ2D!Ö:™ˆ£4”ˆ(@4 ¦’dŠèdrŽ6KÑ (ˆØsMy+›ˆ*;¦-…º NyÑi2LþvÆ‚Æ)-V´ m§Â»Ýh©›Ú®›ö¢| &J÷e²LdžwA¢qË©¼lceädÛ‡ÕµÂÝ wõù¬—œ+ÕQH<]RB!„ÒJúÍÄ};<²Ñ«‹ Ó• ŒÔXˆk‚©‰ –­ì€ˆ‚RbÆg’‰:9_‰$Ãi•”ƒ]je^`¡”‚(qÊÑC  I½¢r×2¯pVæÅ J‰SÎ5üz½ki@‰m{öRiD'ÈÊä®¥ÍØV²ï—¾%#½i¦žìãˆ-®4’St&½ÌOdñ…–Fé2aY¥\´ÉÊ6–q’{éˆ1¹åøHÅÜ©ì¾uõ8}/ß;½ÛH‰ñ«ªÓÇ(ÃB!„,](ÃBY²lÙ²qCë…J£ CZA»e˜¡¡!<ýôÓ-¹!„B!dÿ'®ì€;m›$ÔÄ:æuî42&™ð320á o™ˆ2‰ü ‘†Hœˆ-VšÑ‚ØŠ4©4ãÊ2Èš´N#Èx²Œ *™ˆ‚€à¢D Ž“$£X(RŒcS‡Ö¹ºB¢-“H-b&DÕjâßkâÓdJ‹Ý¶â‹ýäE[>,Ê4'Â@…Ä'½%î’&¿¥™’´ŸB=‰,i…±ÁIï^Ùî^BbQ>õµQ¦ S&®0†B!„ÅÂXE0[ôt°é85dÇØÝeï€Àè'i=Ý=QÐ)žÃòUžô’¥•øÂJ&´¸B šÜ»®n]èw!æ—w.Õ?K†B!d©²ð³ !„EÊää${ì±–\kÆ -¹YÚ”É0­êL…!„B!„ìM¤ú¼]ó—…·³†÷K^(¨w-T û†ú'R!"Š29¢ ID¹$g”“&Üzt¯®p¢HöQ‰Ya&éh_öÐÎ+hÇ”R<‘$T´#­8çÚº”#¡˜c¢ÆýTk‚8–y§¶dŒ6ßÃΨ±mK4õ¥ímçŸWHrIŸE@x)•_Jd™H3:4™tQ7­³Pº§¬Sûxj5Øø‘*eB!„Býu“,æ§Ô;žOç°edž+¾àà&}xòDNæð„åHÅÄ”L–ÈÉ"¥¢F¾_ð€ÛŽIJ¡(ä“ZP¿› ã}â¦$•¢Ð’û8÷éM´Ë 3óZTIÙ¢ÐÒ\YU(;=YEe.ö=":mßsþ>ãöU¯ßÖéÄÒ LU€á9Ê0„B!KÊ0„B–4}}}-¹“aH+É0+V¬Àš5kZr}Ê0„$tvwãÐG¶»„B!ûQ^n ¥…Øãº gå³^F<‰ÅJ#Ú_¦BŒ#‹8çgrŒ#Ú¨¬.ÿ:Y½" µ8ö…˜8NniS"Œl»×Ïm»é0Vî±Çµ9®Ýíl©Ò{nD#eRx4r²äï9!,È( ßê‰3#ƒ“(¼]X¦ý®XgÝëÞM”ϯ3†ŒÞÞÞv7B!Ä“a’¡jã:x¿çç×ò³'JÝ;$ÆS&/_ÔEÂÂJX6Aá\[³ÂJ±¤QÈË9È—óGö€ˆÍGÒe¨™ü_š*[?]æ;@»Çš“TBÒKóeó÷ͽ~?&[º"–¸ÿ tõô<ïO8Å‚¡?ë ÍÆˆ› !û5p–/_Þ¸ !„²A†BÈ’¦U“÷:è 8É‚’aZ)bµJ.#d1ó“{¶`ljÛŸ~ ÏŒMá¨Ôî&B!„ì»HRÜM&Qo¤ýó¨Uk˜ ˆ. .®(„™‚à_˜h¢NXÉÓcÄJ/žÄâË„[—/ÄÀ 7Ú©?—J#ÁĨÅfY“dòI.•%¼­v[©Ü¶›£ ÛóV´VˆTNžÉË4¹º¬,““k¼óF'u6Ü'ݥ䓎旔&%Q†!¯{ÝëðØcajj <ò.¹ä’v7‰B!K˜þi#Z„g\ÜóB[OÔDÊß`tx®¾P¢})#(HÒdÊe“€XãÈ…có¨#MY):Ò6–ÔáH&Pö¦Ú}Nâ‰,õ“YÔ<Ê¢6»Ï)øL -¡´Ÿ‚M–f‘›åS&”FiÔ_WÝÁF†&ƒòDPpɉ0Í .ÍÔi?ÊJ,*KuÉD“L)&¾è@ZŒ#™xi1F´Qιi]ɺ@™4˜Lˆ‰kÉÔ”P:‹+Òìþ¶n¼­œëií'º¨€ü¢ê?Ÿ H£üýõÒÜÏÈÀ¤ófó*f‡ûf¾—íõéÀ~‰'!ñxI!B–üà±iÓ&ÀqLJk®¹¦Í-"„BÈRÆNàý:þ¿S:ÔM¥z³iÓa²„ÁØM†Éd¤G‰”RO¤p„•¢ÈÑ|šŒ/“ìNårG³‰4PæF¹H‘%"Ëž¥®„êi,«d.ÈD^zõ5'ì¸e¡&F*™´å¤uöDÅw”„zµùOú§P·¯“3@†¼á oÀÉ'Ÿ ¥:::ðš×¼Ç{l»›E!„´Ê0„B–4­J†Z+%¥É¶mÛ ûZÕï&&&ðøã·äZ„,V}ø! OL¦Û±7|ùÿoc‹!„Bö}¤ò¼³QV¨äxéì ¢P£:–Û¹aéŸH•f—HûòDöA}i&ôqE™(«'K|QAÁ%K‰É%¾˜ò®8£L’Š'ž¤u9¢#Î(­ €aœO,ˆcd3dö(F¶Õü¶•›ÖRLw §¾$²KúœT E&ôÜœrQàœêlÓ“³…®«´*ôÅt)¹íÐþ²YE¹uïçˆ%Ì­·ÞZw›B!¤•ŒÌŨØ9ü% 0H€ ¾‰‘ îꎌ@ ¶VŒ Í$Ý„l’%°”ˆf|ÕHXASi2 ¤Gài¾dÇtHFQPéMõ?~RNþܲPî:ͦ®ÌWVq%•¦„OñïMH*J;ÀØÈ\ÖOMŸS‘ &åË‘Lwi”#&Ãà–[nÁÈÈHº}ï½÷â‰'žhc‹!„ÖÑÑîB!ídxxO=õŽ:꨿e² `jjª°¿UýîÞ{ïEódiS­V±îàµxù%¯ÀºGâ;߸ƒýýín!„BÈ>M’ #€(@ •ÌüQª¸Î2°_$y‹+àTaÖu÷*Äã“ÉyNzÇ`ÿD"5H"¢H¤ ¢ é: Z!6ÇãHA‹ Òʬ#[ìº$‚†xuÂÔëÖ)™T‘Ö£¡%F,:ù>¢ ZC‰@DCiˆDZ’¥Áæhˆ([‡V[N›¥èdb’W¯¹ŽÖi2Œrž• Â=ÇÌŒÉĜжW¹ãóß.•]ïþþ.õ«ÑÅ~öùçðùÿùIüòG·´¡uÿû†›pÊ©§Õ-#lÞr/®ûÿ;žydq<×å«VãÏþê#xÕåW #p·>û,¾ð©kq×m?lCë2Î<ç\|îï¿âíûînÁÿ¼æ½-oËigž‰/~å_–›œÀ?~ùËøÖ?~ •ÙüäÏöpîůÀÿý¡¿ÂºuÅÿÿ5[­â–ü_¾îZŒöïjCë!„Ò¤ò<Ð{’Ù P@%³$”2…’]©HPX·e³:D”ÙŸH5;ã%=ÑÊ0i Ñ1$JÊ‹VˆÅI‚+Í8뒹뀈‚謉±$2E,Žt!ŽˆcŽ‹SOU”ù>Fb1Ò‰@DC Z DCD’T1÷À– h•œ“ž+¥¡´™X¥’rdU­&Pîs ™ÆiW3ÛªäxºßÓ¹²~BLÓ©.v;_²ûžG¾,“ge˜só’”sž‘™†&̽vnX< ¨CÌMsnbHx±ËºBLþǪ2F)…óÎ;W\qº»» ÇŸþyÜpà ¥/i¯{ÝëpÁ4,÷è£âÆoÄÐÐP ZÕ§žz*ÞøÆ7bÅŠ…cÃÃÃøÆ7¾‡~¸ -óùøÇ?ŽU«V¥Û;wîĵ×^Û–¶|èC¡‡Z·LǸóÎ;ñƒü•J¥E-«OGG.½ôR\tÑEˆ¢¨püÉ'ŸÄ 7Ü€þþþ6´ŽBÙ÷šQ3ÔR0ã0•Œµœ!p6¶ƒÜäßs”¨ä˜©Ï±uA)€®› #©° F­ #yˆ#BH"aHn_ºLƳʴÃîóe“¤½J$w ³Ô@RCRGáúJ%ãU(h˜4Ò|;4Öbêð®eÚsoêµö» Fq %å"K‰ô²7RWBéùÉOâ‘Giy[.¼ðB\uÕU Ë=ûì³øÚ×¾¶(þ^`yéK_Š7½éMX»vmáØôô4¾÷½ïá¶ÛnCµZmCë!„”A†BÈ’gçÎxî¹ç°nݺ½ÎG¥”óvNBö¡ ‡v:;;üÚ÷ßÿ’ìêï¿‚?»êÑ©òBÇ7^ø}<98†Ë.8¿}ðþÖ5Ðá¢óÏÅqëkXîÜãÁÕ¿ÿzÜqïC¸üì—´U’¸îËÿ„÷üñ¡§Îý=çø£ñæß=ŒâU/?O¶éþsì±8çø£½};ÏnK[Ž>¦Ø–2.{ɰó³ŸÁ»ÿì½øÖßÿí·¬œMÇŸ€Û~þK¹vMÝr¾ø…øè5ïÃõ_»ÿííWòW !„%@\1“ù݉?¹%3`’±·2Ç“É0¦ A2ÑÅ)këRŒ˜ R)flds³Utuw×BA;L$ ¢­ÜbijG QPš‘¢ì"I"‰8ç¸ÒM*ßxç$ËX’·­*ˆ6K*µ¨Tv1 M’VÌ$(+Ç(Ñ3ÑID'÷3•e”9Ç© µš™LäÜÛtbRšÖ¢÷`[·• o«$]ÆKtQùÅ=n?Q8Ñ% œ9çêQyiF¥ÒÌpÿ²Nl'ñÌ:>‹};n‰ð’Ÿ5”÷d¼²~qåùyü´í\~ùå¸þúëqÔQGÕ-÷×ý׸í¶ÛpÕUWa×®öˆ÷\pÞ÷¾÷5UösŸû¾þõ¯ãÝï~7ffÚ7f?õÔSñÏÿüÏ8ùä“ë–ûØÇ>†»ï¾o{ÛÛð裶¨uEÞõ®wyÊ£>Ú6檫®ÂqÇ×°Üûßÿ~ àãÿ8®¿þú´¬œ·¿ýí¸öÚkJ<×]w¾ùÍoâOþäO055Õ¢ÖB!û&±ƒ35º,Ê^6à KͨÖÈ&ÙPØ}7Dzšï TaèÜÑÁŽŸ°ÊT†ŒT!H1KW6±bK&nˆ#½¡DrÂŒ2u»²INXɤâÔ›Ê1¶ÓŽTjñ嘴’íËÚ‘ÏÚdˆÿ]’k'â…楗°üR_Rñ¯çœ:’JHñ–ùïÝ\Û‘[ÚÏøð’¦ Z᪳[g}ÓŽƒócÙT’q·V’q÷zåýêŸYºÿFtÄGàæ›oÆYgU·Ü;ßùNŒãÃþ0¾øÅ/¶¨u>+V¬hJŽ€?ýÓ?ŶmÛpÕUWáŽ;îXà–•³råJüË¿ü ®¸â ó7Æ0oûÛñÅ/~×_=þò/ÿ²mÿnyê©§îñ?ýÓ?µE†9î¸ãš~Þþð‡ñ‹_üW^y%¶mÛ¶À-+礓NÂM7Ý„¾ð…uË]}õÕÀÕW_›o¾¹E­#„Òݸ!„²ÿÓŠt˜îîî†ÿPHÈî’aZ•FÔªt¥ÅÈ›ÞþNüÅ;ÞV_„1(Ç´ ?¸ý§ Þ®½A‡.9õEø»›¾Ó¶6¼åïÄ5ÿ媺"ŒE8níj|ï'?]ðvíÚÓüÿþÖ®ßж6Üñó_4a,+#…þÑà÷þË»¸U„BY He‡÷ÉAÈÊ3$•[ìnäËŠQ§S¯=ÜeE ‰QxÝ-å?‘òêjºÎÈ­'IˆQæ“%ªØ¤#“˜u[Æ•G’Ù+ÚO]ÑÙ1eêJES—¨Å1jqŒj-ùÔâ±Èüaœ¶úÛªÉí,-F›{’Ý7?Ý%˜£ügT(_§Ï¸ûwe’Šé‚JiuçM¸’Œ”ÎÊ÷}g×ÜÒM†9öØcñ­o}«¡$麗]v¾óöçCWWþøÿŸýìgÛÖ†+VàöÛoo(ÂXÎ<óLüä'? ¦‰ú¬]»_øÂðš×¼¦mm¸è¢‹ðÿðMý}»³³W^y%þöoÛ÷ B!d_b×t«‘ý¦_ã¡pZXÌŽ‚4à•OÄÎîÈaD€G†a¢ž¤¡(ÜãÊ.åÒ!\^"1ë^ÂIɵ´¿ùöæê}‡|žt’ ÞüOP~©/´ì^êJó²JQRi,´¸bLYºLVoýï7:4—ö§¬o ºz"o¸š [ úKT ³ûFfcTbï¬%Å 7ÜÐP„±¬\¹×_=Î=÷ÜnÕÞaÆ ¸å–[‚é­â3Ÿù ^ýêW×a,ÝÝÝø‹¿ø ¼ãïhAËö?Î;ï¼¶Š%J)|ÿûßo(ÂXÖ®]‹o¼±eóq!„4†2 !„`óæÍ-¹Î† í›dLöoB2L«úÛR–a.¾ì•hüç/Ÿ49Ù±pæi§¶íÚ¯x嫿}Α¸-Y¬îPxɶåÚ«V­Âúµó{v‘^vÑÅ Ô"B!„,&$ž€Ä(LüO  (·ʆdŸêìñ›ów{{‚r‹ÎÉ-©@°LáŠQ‰0ãI¾Ì‘¯ÓJ"a‰E„˜T˜ÑŽ$£•“ÈR¬Ëml2Lþ#ö-Âé¹öºõ¶óK=ÏídéßWSb\9Æ Eùýáz²ý¡çQxN商&3™Åö7-uú-2y¦DxqŘ i…¶îíÔ•ù'´„®Õ¬Ðâ–)<ÿü³vž06Tñ+ÛM»ºu&jåú¤·Ïí¤eÃ`ÓÿóêŸ)¦÷,%Î8㌖œÓ.z{{ñ’—¼¤m×ßßïïbãÌ3ÏlÛµ9äy‹-Qá´ÓN[ B™/”a!„´n2?ß @‚¹¹9ìØQ|Ók«ú[«d²ÅˆÖÅ_§_ÿ–?Äᇞ~þó±'¼ãͼ=¦ULÕb¯­‡~8¦«5¯L;Ûº¿¿ûê×zí}àÉgÚв}“ëo¸Ù»w_ýfñ ;Qàž·‚гþ'·{í½òÊ+ç-žŸ'B!„,,RÙNÀ$a¤óTÒõ€DPpªs…Ž)’a‚ Y¢\–qSC¢’˜ü¾Ðù‘w¾®#±8òKZÆH$FpQÊ‘TœrnÚL&ž˜d+ÁÄæSÄ'q&$º„Ä—¼(Ó¬£½íFÂQ!ù%tNAšÉ=#ç§òKN–Iž›-Œ O£V­Á›±#eÓ1‚}9 u•õ©wNRÂR%4θøâ‹½qÆ—¾ô¥¦ÎkGy¤×Þ;î¸Ã;Þ憮}õÕW{íýà?ØÔy¸ë®» £É³Øž÷qÇçµ÷Ö[omx!„BŠôÏÄá¡­7p÷¹Ã)ìsOsS8ºzt*鋱F†üd Ž”ROÀp†ÁD˜œ°RHIÑ~…k•H7È×>РŽôZî÷”Øù»€ýÄÅöh˜—J8í |—¼@–Tö²ÐRRÆNeeÃíò’qÌwšõSattZ[ÆïÂY·Í:uø’+ŸÿùHú}ÿìÒ–aòÿ†ûµ¯} ½½½éçøãoxN;ùÀ>àµ÷Ío~s¡L;Û›¿öo~󯽽½½ Ï!§œrŠwï¾üå/·»I)¡çö‰O|Âk綾^ÚÔy„BÚCG»@!„,(Ã}™íÛ·;o„ÍhE«V«¸ï¾ûü:ûCÃÞœTÉÉ%‹ DªP_ZL  ym®Öïý]lLNÏx÷njz¦­iÌ\µæµwxx¸­!„BH»‰çžGÔ³)]’_h“Y*€(@¥êm ¶ IDAT(ˆHú’ézèA"St­FM† Òz’a€$UD´‚D*™ô¡bIä‡8RÐ’”±ëZ;Kç¸Ø¥SDeêôÏIE QiÉù@,*ùNZ’¼ZCIRŸR¢J4DI"µXñG›òæ|% "JK²hÜ.sk5A>*36÷Ò•U¼ÙB©\ã7MmëÀ¶J·=ÉE¥£ øR&Ι´®P=Qà\§Üpÿ„ó"agPG·/héÄ4³ÙÎlµ8‹È)›;'®ìÌ$ƒƒƒþ¸hjª­iÌÎ;13“ÝææŠ“£££Þýkckö-Ê^v³˜ÙµkFFFÒíÙÙÙ:¥ !„RÆ •aÒaª@”J†[îÐUÙ¡°ß:ûà“•‘í¾®îȈ0æ\F沓 ™€!Žü ‰ü`Æé¾t‰d, ’À1[ŸVP’Ûç^K'ßFIàúJZ `ËÚ¡À´%×ÒÉ)»_¹vh AÇÞW¼{“-ËÄO~q’T2™& «¸’MÓB‹*)‹Ý,›‰ì2\fd`Ij‹˜ôAgw2Q\±¥DÚò„.÷#Ý'¹òYK=&O­VóÆ‹ý÷ójµêµ·R©´±5¯½d~ÌÍÍy÷¯¶Èÿ?ß?ûßc!d©ÃWòB!¶nÝŠÁÁÁ¿e²lݺ5¸¿ýíá‡æ}!„B! ŽTŸwÄmqæüÛu ‹éëIóû²sÒ}ª™ô› 3a”‚Ÿäat¤‚©0Ú9^HÑIʋΟ_¯瓦¥a$K|É &ŽL’O’QFZñ’XÜ´#ÑØ4÷cE?íÅÙ¶¢ŒM¨q·íq7寶Ñ[jo[¥÷ÂÜKe侀ŒrÛžü‚‚äRH‘ ˆ/éýo Ú õ#o±ˆTDz\¿D¡¯ú}>ßÿ~\¨Ç¬Vž«ÿƒE!„Bi;U†æjáPHØ¥†°Þ>‘ô˜»â–ïì‰2éÆ|ªÁÄxqz½•4ùD»"…#Yh÷|ÿ\¸"H ŽT2Ñ(FÜzJXÜö”}»^R‡ÔqMP«Á|’íÐuB˦Zœï ]r÷:ÿ}‰,õËúçdío$ã(ŒÎe}×|ºz´ÿò½tØê‹-Þ0ØíÇâucgŸÿ²‡Ê0„B!”a!„”V¤ÃP†! A;e˜Í›7/ø5!„B!$®Ø·åçf!Û]”Š/Šiy±f:+ofq )(¥DM ©p¡=Á%YGÝóÓz¢b Š2ŸLvÑŽS\R©$•]œô圛Ê2É9¢jµØ|¬ 'É0¹Ô–bLn¦‘m£Vù™9Y"Œ Õ•l×Mu +Qºï^f÷= Õ¨d©À䟗õ‹d{p×x:)($€î^ë«%ý×M“)뿞<“­g?7„B!„ÅÌ®édR¿8@*äd—¼@#y™ÀNtukGXÈ^16~Û½+d”ʥŠ/›Ô•Bæ!¬ (”¨úuÔwÜ:œ}q ÄF€q?@kSWlÛà Fö»ºRQHd)ÈHÅveç4–^lw #sÙ{H̲³;ÊõO§_öÙŽê÷ÙÜßk²UÀø\Œ™ZîoC„B!dIB†B1´bR?e²´S†i…DF!„B!R…ÄS%¯u1ü}"Ùl 75¦¬aŽ)ÌyB î+mW™”åR]Rᢠ¶8b…s,~”“,¢\*[§•KЉ/ª$ñ%K‹QÞÒIpq“^´‚žc¥˜X 6özÞvIÊ‹Ê%ÒØk+§|>]Fk?•E• 1y¹¨ü¢ÂeëJN*/¿¨Tš±û$2•#Á$}°õf}4í†Mˆ0¡d#ÛÿÓe²A†B!„}ƒþé¸Îûüßý‹Cañ‹HnŸwõF‰,c¶íg¤T†©'”äÄ+e”H)ZׯCiøÂG=é%'¶øm4õ„„ŽœPÙÀgz²Š¹™Z¡_uöDÁ¤—Ð>·/»é/Á÷œ8/…èŸe* !„BIèhw!„Å“aȾJH†éííÅÚµküÚ”a!„B!­B*;€èh@ ’7²BP "b^Jj׳c©½ÇžÓÌ÷K:Ýèà\®?%+ݪ0Dõí—lŸ—|äte ;ï|H¥?3„B!dÉÃdB!ÄЊIý‡rzzzü:di’aZ!^‰¶lÙ²à×!„B!„ I¹pߊ[LÑp×C¯…·/KÉêR‘Î šú*³UŒL—¶+”iÈ‘ŸèR6¢°PQ–0Y)¦Aò‰'˜8Ò‰2‚I–㤱XáD»â‰B>IÆ&³doÈÍ>"0e${®R%ËüñFÛʈ09ùEù©,~òŽyNÎv!™'POú,É0’e,ƒ»Æ2)ísséÛ™KÓ_>æ§eÇòiGqeNú?ì½y˜]E÷ÿ­:÷vwö…l@a {X”°ŒqÈ óâ‹âOYTqtFqaW"‚aßAd“EPÙ$d#!!d_;½$Ýéõö½§ê÷ÇÙªÎrowHrÓÉ÷ó<ç9÷Ô©S§îéj¥:õ9_B!„BúÞÂþXb†‘’‘”ì” {*‘ÒŽÖÈå%dðB¿Lk–¦Bf¿’²…!C$X’I,R¦‹KmGÙÔ*È&†cJ¶4Ò7a–°RA2)#½DýÈ–s¤ñ´‚%ÁRŒÙÒú˜Öëšlée»-©{ô¢nz¿Û‡RŒOKsO(U…cJù:Ç’[¿°¤ÝXúK$Ä”¿¦‰2 !„Bñ¡ C!„øh­1wîÜ~Ÿ!)=‹µk×&ÊvÆ8ÛiJ„B!„ JõæªD«# é%35&ñªÜ„@£5 ò¢Uá5Í [Ëö-UJII‰'Á$aÒ l9£B›æ=…!Äø+{"ù%Ep¾bìk½sZøÉ0JE›« 4Œ•3æõ}=–)Ç"<ÎJj ŸSšøRáÙÇ™4Á&MLŠßÏ‘‘ ÓS(¡­µËV ½ïa¿îæ«rË \ñúáø¶Ï©@#„B!„ô »Ulšª ¹%=í0¦ ˆêeÉ3ù:ÇJð€®,Ã1"SÐ(/›XI,YRFa%.ݘòˆ9M—=ÒÛ°…ï¼R‘cnæ÷O‘UdÚwô÷á}Ë'ÓTZDFÝ "K™º™Ï"­ŽAKSÁKÐB¹¼Œ½ÇļÌT£`¼Ç.KæŠ]ÓYÒè(™ŸB!„ìÉP†!„B (ÃþÆæÍ›ÑÞÞž(§ C!„BÙÝХ̀î @¤K/ѹrÒK”ÔaË52?Ä>ç/Ø(— ` Ž!h”I…±¤2™“²eÉ7Ä’L|Ib !%”OŒ$C–Ñp• ã*ÿÙÆïc^´)‚6c"Ž/¼Ø{i _>q¤ŸÖ"b)-1ñ%Hw1–˜,“H‘ÉØ²®µž¹Aó¦¶p ÁOÂÉ%å­h•[º$ƒ¸$cŽãx}@—6õá·‹B!„Rm»LA@ôˆðÐ` –?Ÿ!ÏÔ„2L”æ±¥±P±o–‘H`‰ ¦’%¶$Òdb‚ˇH“±ÄDH´!SÚP.I¨®«‘%ÅSWÊ (~¿!cu­ï“SÊ<óÊ"KzŸÍºÙ‚Sòž&ž ¥ ©0Ñô×^‚²hìfÈ^ö O\ÓX`* !„B‰ÈU»„BÈ®ÄÎXÜO†lOÖ¬Y“ZN†B!„²û¡¡Š› k÷óE há­†Á^™ÐÐZ@0ÎÁ—6¼•FYn0€v"j[k4õV†Ñž ¡´'a8Ž€Ò†ä¢aíG@û×hGBk-½2-´£ý¶¤ÈÄgoïH£©¡­´””Þ÷×þÞ—Y µ'½x7¤†ÐZK©½½ÖÐRD×ÂÛk!P ÞŠk 4"‘&Xå#«›|á&euN…DrPea1Y%’e<)&ѤH5Ž0³å%Sˆ1iÚ$ ™r•†ÈÕÙ‚ ` /i’L<ý%M )(Ê0„B!„ô+‚doªª¡!ÂÏBˆØ”×<ï_o á×Ó€öçͯõçtþ|Q  ½µˆRQ#—Ïðb!´/QhO6€€wï ÁÂ+ƒôçæ¾\¡ý6„С<xóQøm„÷›«Âû¢f»:èOÐÿA„톟„ô_L`¶ëïµßFt(&夈'Û/u%¬kŠ1¦ÌcH@ ‘%SŠúeÿlz×wû8[{l¹JioŒÅ…ÿ ö¾‡(Ý((ê…ÓÞ(Õȼ¦©‹2 !„B‰`2 !„b°3÷O˜0a‡ßƒì9dÉ0;cœíŒ$%B!„B1ÑʼnôŒò †hͨ•¶•kÕÞ#h»¹>Êãø©.Vb‹‰„¤š›“”.¬Ô'£ÉDGZíFRŠ-—_0‰R\dJZŒ!£„R‹„Fò-¹%WC‹‹RS^d”ò"b÷ Î #MF&ã©,iÉ,™ÏÐ,Ki§b["’f«@ºIއ(&XÉã·üìqŽ× ’Lx.>¶5t± Ð¥^YB!„BÈ®Ac··ÀßL† d€¬ôŒP&°¦:9ÅðOÖ ÈyŒ ¦žôÑÚÜÛt˜ô$–dKzJ¹6„Dy¹$&$ÚE¤È¶HÝ+Þ†·©xj ƒø½Ë-qY¥W’JV]$êÆ¿Oü;ÄEëš2}®IcbD2L´åk¤ð’ø“Œ¦¿„Sgc‡ã8º†É0„B!Ä„2 !„b°xñbtuuíÐ{0†lOª• ³fÍ477ïÐ{B!„BHU¬G´"Cp)+½À_}ŽK û€æM½“a„ˆ§‘ø²„c;ŽŸpâ¤mNïïz¦•Dm !ÍÄ—HD‘–®t‘"\=cI)¾¼¢!à*…’±¹JAi]k¥º˜i/±cCÖ ÄkuŽÑÏ„Dd>cCr±äa>/S>*óœc×8Æ5YâŒHYÔ¼i«1Þ‚MAÖ ±®Äg{ìöI’Ñ€*nìÕx%„B!„ì:t»[{¢3„.€/ ¤I€! çM ÑZšz©0Zî ccaºQEáž‚ò¨=¦ÂB!„8”a!„;:ñbÀ€5jÔ½ÙsH“av†pÅdB!„BHuPPnCEy ‘°ÄŠ øª¡PL¹¼- h ­467´õº—vZIмQ&ƺÆ\`µY. &M”ñbŒÄ)¢$˜¸,“ciÆ»Vk„L°¹¾ “iRe/ŽExl +‘ìâŸË¥ìįI“fíg<Óøý™a H†1ǤD1”³z/¼ Ó‰1›¼F•z=V !„B!»Q2ŒŽOmí´åé2A2XÒ«' QS“L‡iiì½ TM¤-n¤Š-YGx>*K$ÂH‘hÚ°dXšLB‘¾,”’ “* $n»Wš/e¦‚Ð’.²”OŒ©,¿$ï™rŒs´4Œt¡hN¤EcXÇ}ùlªðb–#9æ›(ÃB!„”a!„;c‘?ÓaÈö‚2 !„B!dOCëýqéájósXW§]“hD®öÊ ¯^Ó¦­}êg d$aÌ$')ÍxR„iµ™”e’"M\ W)rŠ)ªC’"Uˆ ®ÕÂO†Qö¦}FˆX;Aûá±0ÎÇ÷öyÊ'ˆ +FZ‹“R.2žE\l©$¿ˆd™)6eŽSí%Ã$ƤP†ü£qá°êe¥™+ˆ´»Ð…>UB!„BÈ®Az‘š’–WeÂò ±Ã¨¯šÞR13fKcwß:š-Rä˜rò† ’S*¤ÉdµáK&Éä•Þ¶Q.ÁExsÜ”dÀ¾_¯e)BùŪK¬ Û«”–ÓK‘%K´‰®©œ.“Å–ÆB” £¢1›«É÷–„Ò–“*¼Th˜ C!„BâP†!„Bb,\¸Åbq‡Þƒ2 Ù”J%lܸ1Q¾£ÇצM›°aÆzB!„BÉBëÃ>:Z=Ø* HDdS6ˆ}ÖZCä…m˜"Bs}ï“aoÑH–ˆ‘–\’H„IH3È7Œ¶LQÑHH3ÉÄ#-Æbà‹)fª‹ÑjW)¸®½) ãc“Á[ÉS!dnÉç&" &zæ†,#Íç‡X;Q{ްíçi”‚L[·t¢Øã&ÅÇIŒU+…ȸâÂK4¶£Ä#X׫@#„B!„ô;:JECˆ‰‰-v¹1@0…ÐþÔ ™£}í ¦Î1êJ›ú– ˜"‡-R$RQÊ&Á¤·ŠÚÖùté%)–TN¤Ñ)©0ÊÕòKº¬b×í…ÐcâÒN\zA™g—%½$å—d¿ÌºåØÒØãI0*šÇæjü—[„ãTÛv1d®`¬Úc8Pf¢±¯cc¿©@†B!„ØP†!„Bb ¼÷Þ{;ô”aÈö`ݺuP*ù¿=¾æÎ»CÛ'„B!„r¨R½¿"I¡ÑçH0öÑkIÃÕ:Ö†pÚ+5üs ë[úÜWS¨HMsñ% '&ÆdŠ.Y²ŒÑŽc]'m‰„c +Œ"#9&Ly‰d ‘ú–\­ƒ…<ÁuÒ>"¼gÔ¾ˆ$œà¼OeÉJt©X–ÒN<µÇ”i,YF¤'Ò8þu¥aCKlùãKJKÈÊ”³H.¦ð’—qŒ2 !„B!ý›Æ‚J[`|Ö¡P`N ")&)ÑDõ †Ô¯dåjô•(á¤w²I$Z¤Ô EÊÂJj²‰u}†ð‘%îÄÚpRe!ty¡ÅP¶[2Küû'äŸèÙ%¤Yî¹Äå—1¦ Í»£ñè×±±‹PˆAlÌ"V/Ëö÷¯„Ö@Qi´öô}œB!„ÝÊ0„BH sæÌÙ¡í777ïÐöÉîOCC¾ño¤žkllÜ¡÷ÞÑ¿„B!„Rí6pË'dx',i¦l:Œ_^Ü2íïþ7”Ûi\ç{æ¾7ñü#ïô¹¿–èâ$Ó]GF¢K†4“•&c–9†ø]‹iF؉/¡ˆâ‹+¦ÀÊ2Ò’eBFÙ›RÚ®/DòX˜÷ Ú”Ö¹@Œ‘2.¢ÄDÑË2'vlÔsbׄeiÉ=F=QfeÐûó×áÆ>iŸàs÷ª'PXÿàÓŬpìÚc3,ùøy]¢ C!„BH¦©K!ÔB ìrM I1¶Tà•o-(<²°ÛÐÞKk@+ Ð¥ðÛ½‡–¦¾%Ä$¤4QÃ/ÂéŸL“?|£’À!D˜´6‚$•,±Æh_f´¡Uò宫!°­BKo’YúR7™âbJ1©Ï8’ÌþÇe&ãûeP**<6c–ÌmVðþà³¶ËÅ-ïlƆ¶R(ÁØïqˆþ“œÎê”i®¶¦ÍÍ…èn„B!„xP†!„BRØQ‹ýgÏžSO=>øàiŸì¼üò˘H–üÏnç:t¾ÿkt}pT¡ ºÔ’Hâ(õ”pÿ /aúžDG[w¯»+„)£ÈPz‰ä $E—Ã’Z[nqâ¢MYiÆ—9|!&Úû"L\– ÊDtNž[¤€¨^ »XÇÒ:6»¾ðEóûÃQ‚ïˆØwŽÒZì碌Ļ^Z2#Rž¡±¥M¥ñÔ½oâ¿¿ù0¶4´%“[´†*6¡°îi´/ºÅ-óâ¯Àµ…—x*LØlÉËH™Ñ¥M}úu"„B!„ìZ4T¦ Î`O‡£„Žä9×ÕxuU'~ñzfmèBGì~ÚŸ¯xo+þ÷ÊXüNßRQÓS\l!£¼€‘%’ˆ˜Ôa¶Ó·Dš¸PôÑ»¬k•J¦Â(WÛ*©¤Ôùpu³ë”ý®æ35ÅëçæÕM›ºñëï/ÄÌç7yÏ(f¦tX¹¥ˆßÌÚŒ?,iCG›H&Ц°c&Àã6)ƒAk4v«>MB!„²g@†BIa{/ö¯¯¯ÇE]„O<o¼ñÆvm›ì9(¥pÍ5×à“Ÿü$êëË¿éõÏþ3Ž>úh|÷»ßEKKßþh] Ê0„B!„j£J›`Ê-IqÀ¯˜l9FÛѽî÷èXòÿPj[¶¯‹[,F«à³ÂìW?À¾z?–-ÚØëþF2 l)## Æ‘f:ILðˆI3¦Ó;iÆ—99Å^i1AJLˆ “ab›Ö@¶ßËØùèX¤È'…K^‰=g—fbå©’LÚuÁ›ƒãlÝÒ‰ÿwåãxôÖ¿A•”!\b–*B»íÞ.4£kÅèüàF¨®u ù*5&KðòÏkÕ ­»’#„B!„ô»U|%À„©/æg#Q#vnqS7¼½ZÞŽ‚ëÕhÝ/H‡ÑZ££µˆ»¶ÏÞ·®ÛË Ž@:É’3RX’Š-ƒ$Û(—¼bJ/HkC–kÃD ¼ðÁßÂd³K*±SWÊ -¶ØSNhI•ˆ*È8 ù%µOv;ö5é?æ9¯5aúU °aU~»6¨ IDAT'” Æ=F‚±¥50kc7nx{ ^_Û…’"±ËN…ñÿ:ÓæT7ßMÊ0„B!$I®Ú „BvEæÏŸ¥¤üpÞhOO¦OŸŽë®»mmmÛ©wdOdãÆøÒ—¾„W^y¥××”J%LŸ><ðþë¿þ _|1ÇùPýhiiÁÊ•+?T»;ÿ}Ãt´´^zž*dϱ´êBOÓC¨u&rƒND.‘Øá]üî¦W±xîZ\rõ™<´®lŸCéB¢E ¶ß11EÇ”R§H3Þy­ýv}¶¤Oqåß7düû@ h 1ОôâI0"&Çx ›Â·{k‘ø ¨¤„±T_t©|ì%Ãxò bò b{‘!¬Ää—Þl¦€“e‚„àØ'¸÷MxàŒ?>µÞ‚ púé§ãsŸûV­ZµM}ÚÖß â¡üë¿ý[µ»AÈnÁœµõ¸é§?¨v7!„R%”Û `È0Äû³êiD÷º»Ñ½öβ" ˆÜ ˜xêú?C Ú#AyÂC >Ì{c®¾è~,}wCÅ~[‚F"Ä0[êHÛâu³ÚŒÚò¤˜x;ž]â¯È‘Ò_ãïQEˆ ½EøÉ0J{›«ÃÏž‹$’‰/"vœ™“&ª¤È/–c_J—fkv[q¹ÆI)7™€–æüì»ãwÍ„vƒñ`H+JºQ·5¦`Фƒ3pBÙñ¡Ý.6=®Uÿ ·ã}«MK|IßÐÚ“Äȇâ›ßü&eB¶J)\vÙeÕî!„Òoi*¨ô” má9ÏÉŸ]_Àoç¶`ÖÆò" ;®ÿvê^8ñã£1vÿV;¡ô 4:Û\<ð«ðÇ{×À-•o4!„˜ )YâFjZŠ!fTDd¹6DØô± íús]cS®N•^lI%’Uz#´Dß-þ\é3f?Ï5öÜüsIù%Ù/³®É;¯6ᦫ¡~m§—”£`lÞX2²G: _=uþñ€AÈÇ^ gyK·¿»YÓ…BI¥ü)G[I0Æ´›{ÜŠãš”ç…^ÀïÿûjwƒÝ‚[n¹³fͪv7!„øP†!„B2èë¢ÿÍ›7ã[ßúŽ=öX¼øâ‹©u†Žn¸ï¾û.¦M›7n^|ñE\sÍ5’ÿ×L<Ö­[‡©S§âg?ûY´¸+F]]n¹å<üðÃ:t(à¼óÎÃûï¿ÿøÇ¨«K+ñã?ŽÃ?W_}5:::úÔ/&Ãl;Ë66àëßú¾ëöjw…~M{ÑŃÏýÓNþ(”ëV»;„B©ºº´Ù^.ŠÒ[ 5´êFOÓ³èZ3nÇ’òí 5cÿƒú)ò£N4 îƒÜØq€hTŠô 56ojÃûQ<óà,dLá¼æE”4 )Ž)¸ÄÓP2¤Ç–b¢Œƒd:JiFH3ÉE$„˜HZñÊ4Dbaëj(\를xMЦ“k¢{ÉD*‹Œ‡Ø÷MKwI|Ž=3+iFm‰¸4c'Ò8ÆŸlÎ^ƒ«¿ö Ï]kË*Ê­p†;Șh gðAtø¿£nÿó rCÊCÕÓˆîõw£°ñ^èžFoȧŒmÿDX®]&Ãl+|ð.¹ä<üðÃÕî !ýž¹sçâÜsÏÅ믿^í®B!ý–ÆneˆÆþ#šûçVµqÇ¢6<¿º]„•}‡äpé #ðÅ£†bh­ ‡ Å!Ç@./¡T”ú¡ ´†R¯ÿ©·üô=lnÈH»ô‰ –ðV¬ÄKzÉ[¬6’â‡)ôµPPñû ”'¿Ä7mIhú”ÌbÖ-'¿ß%ZÌç˜ñ,"ù%EŒÐÓ­ðèoWàñ[V §Ë ÇC” ãIAû<‡œà›œ>yÀ |gÊH=º¶ìQ˜½©€[¶a^SJ¡B*Œö'hÂl+MMM¸îºëðÅ/~1sÝ!¤w¬Y³ßÿþ÷qÅWT»+„B rÕî!„²«Ò[Æu]ÜrË-øÉO~‚Í›7§Ö‘Rââ‹/Æu×]‡Q£F¥žÿéOŠÓN; _úÒ—°qãÆÕwÒ¿yöÙgñå/ÍÍÍ™u&Mš„GyÇsLâÜÀqíµ×âk_û¾÷½ïáÑGMÔéîîÆõ×_{î¹?ÿùÏqþùç{¸­“a*sÑ·¾ƒ…sß±ÊZ7oÆÒÅïU©G„ôO欭ǥ_ü¼]¨5̃BWWu:E!„] ]Úጄր€€ÿÐÁ Šbû\”Zÿ íV~@n葨Ýç³Æx«A‚×ròcBqób 8Ð9o‡D¸RC¹ Üö:Ï[K¯þ' > õ>R H- ¥ö¤í Ž€£%´Tp´€–€v´õPÒ¾FjD‚‹ÿ9hÇkÐÒhGzíh) üóJyrŠ·ØDFßKK@jí]/  µ„àº*ñÝ”ÒѪ_¥ˆ1ÒH™1¤‘&¬Ää—4É%MœqbÇÆµ©"MŠ ¿ŸJi<~×LüñÁYPn°"È[ d~Öbòc…yhÕ€üÈ“6=ŸGOÓ+€Î¼ÝÎ÷ÑÕµ ù!'ÁòqQ“ £: U{Åq¾§sñÅcÙ²eVYww7Þ~ûm(•Ó„l>ó™Ï ½ÝþßÖÖV¾L‡BÙ44áËB»ð9Ön…W7tcYkådÃÁ5Ÿ:` Žß{¤?'ôÐÐ6¦Gž: ËçmAGkþ´Px÷ÓÐX¿¢7ÿp>{ñD5edú)ÅŸŸ{ÒˆŽöþK„N9 Þ÷Ú(ó.ðöþÜTûGp¯èþ€?:”=ýÐÞµÚoü—RH™ª á=¯ÊB˶%³Tª›*´d¦ãØ©:©ò‘)ì¨_Ó‰‡o\ކõ]ž¤á RÁäj$8f8ÈGi.þ~X­Ä¹G Á‰[êðÜŠllÏ›]%¿¬éƼÆ"NÛ»û’V* `¼ûAk48_«Ä“O>‰üà‰òU«V¡»»» ="¤ÿróÍ7㦛n²Ê´ÖX¶l\¾¬‘Bv9(ÃB!ôæí^|ñE|ç;ßÁ¢E‹2ëL:Ó§OÇäÉ“+¶7uêTÌ›7\p^xá…>õ—ôŠÅ"~øÃâW¿úUÙ·²œþù˜1c\¶½ý÷ß<ò^{í5\~ùå˜7o^¢Î† pá…âæ›oƯýkL™2%³½ŽŽ¼ÿþû½ÿB{(‹.Ĭ×ÿ^ínÒïéè*ðw‰B!eQ¥Mµ‡yò‹ðÅ¡îYbëóPÅúŠíÈÚq¨Ýûl8C&y cüFa›´VÈ<nw=TËVg˜w?,¤ñ*/œµ?úúC¸ìÇgâðÉû&î'„—Ú¢¥„ÖÊ“R$àhdt j ,sLA&&ͨð¼N‘f’M Ý8Ž€«}QEkO|ñå¡¥·€HJÿÑx‹\•œ·* Knñ¤—è8¾™RŒ™Êâ„ 9AJ ¢çKkId„-µ¤Ê/q‘¦‚h³¹±¿½îÏX:½%¸ØIAEˆÚVäG¨àu…¨A͸O#7b z6>RÛÂìª]·¾ŽRû<ä†~΀ÉḴRaJ•Ç:fÏžú÷BHßùûßÿŽ–––jwƒBÙ-iíÑ(º@ãI Á? ”¬ú"æ6õÀ­òàà¤}à´ýb@N©2þK$à #Ðù:‰ÃO…uK·bÓªNon-ÜXitu”ððo–cÊ{m˜vþäò2qÏà}¾²J'ŒáÍ/E õ@SpCXѾ°"‰-ˆ +¡ô÷0î%½÷ebuNïÅaíû+7èX’Þ -½Y*Ô±º(S'ÞÌ}jbL$Ñ@³^jij÷¯A±à§Á(„Œ— YƒŽ'/¡LiÁôÔ+ÛoXO†¹õÝxiM:ŠÙ"Kc—‹ÇVtâ ¡9üÃØ É‹H°A”€ÔT`¢I%Z[[±dI…DdBH¯hjjâï!„ô#’³B!„ZZZ°råÊÔsË—/ÇÙgŸ3Î8#S„™8q"{ì1¼üò˽aÆŒƒ?ÿùϸþúëá8Î6õô?V¯^üãøå/™) 8wÞy'î¿ÿþŠ"ŒÉÇ?þq¼óÎ;¸í¶Û0f̘Ô:o½õN>ùd|ùË_Ɔ RëÌŸ?ŸoI%„B!„ì2h·>&ºÔŠâ–ÇPhº·¢#œ¨{6ð]8ƒ±Ä‚¸ä,‚ÖpŒCnì¾ÐØdß_)?¡C¡¥©?¿â ŸOÔÑZã¾ûîäI“pýõ×£P(Xç{“–D!„B!; å6D¯U=(v¼ŠBó-p»—¿PH䇂¯B~øÉÐÂBö±µÈ= È7º”’¢ ]…'ÿùÞShÝÜ™èFª”’"¸HS”qdŠäb‹eÛ*'ßHxÒ‹/«@⊿—"c •÷Ã-X%#yÆn+iÒŽe¼ïÒKwéU¢‹y­°ËãeÙÏáýã­¹ã ÜðÃgÐÞÚ•ÄlD~ìDȺіì‡ø±Ý†3ð` ØÿrÔŒþ9 ü¸/Ö£gË}(¶þÚÝÉ8.eB!„Bv' * 6v)<º² /®/ ³TÞ‚5ÀÁŒÏ:Ãkeа Ó¦-–$3lt-Ž:eË{r„/Á(CŠ©_݉[~úÌÜœèCªˆÑ a²ŒøŠ(e¤’ éDÆÛ½kÃ?§T$À›rƒTØ’JL 峬‚Ð’.¿”—g’’M–`“]·~unùÉ{x÷ÍæØÏX‡É0¹‰C?2ã”!Àø‚U˜âbˆ1j¤À'&ÔáëG ÅAÃreÇ®«wš‹xhEÞßZ Çè–‚®(B!„=Ê0„BHFk{z(þçþ'! Þ.¸à,]ºW_}5êêê>ôýÿáþóæÍÃYgõ¡Û"»===¸üòËñÙÏ~[¶lɬwÑEáí·ßÆGñ¡ï9lØ0üò—¿ÄÂ… 3ÇU{{;®¾új~øáxâ‰'Âò¸F!„B!UEwA¹­p{¡§åv¸¯{bJœ£nßo!?êÓžt­øI$Àd‰ 檡ÜÈà ‡Úmõ“B"A"HyoÎüècá;k­¾CöHK‚I—[”9»^¢-Çn+=ÅNˆñ ¥ 1Á %ÀXmZûÒŒ°ÛÈ<öRh<ù2*¿Ä$§‚mR"CÚÒÔŽŸ_õ<÷ðOü ¶*üYkU€¨Ý‚ÜØ£!DÎ’¡’c&. v,‘vêö»¹¡'EÏ9·°=-·¡Ôùw@÷@S†!„B!d·¢©[¡£¨ñâÆüau7ºË'cÔå>¹ß|íÈ!˜84g¥jiÓ“IÑq¾VbÒ‰{aïyeVbˆ—RètñØ-+ðÔ]«QŒ%wâ 2„Ñ+a%)t$Åš Á&¥ Kd)“H£b©0Ál£ÐûÎ0¥”Ôšr"Kây¦ô§7ugýµw\ç¥ûÄ€‚t˜¡{Õàð“÷ á5ÉJˆ±Ç40¼V✃áóÂȺòóÝÎ’ÆËõ=øÃÚºš n{!„BÈžeB!¤ sæÌÁÌ™3qâ‰'â«_ý*êëëSëM™23gÎÄ}÷݇}öÙg»öa¯½öÂ3Ï<ƒ_üâ©i¤²bÅ œrÊ)¸ñÆ3ë <÷ß?î¼óN 8p»ÞÿÐCÅÿøGüéOÂa‡–ZgåÊ•8çœsð‰O| ,  C!„BÙå(uü¥Žg¡U[Ùz"·jFŸ‡Ú±_†Ì›éèU"Læ9¥!ŒE~Ìxh½Ñ{=nxN…u[7·ãÿþ4¿û-(½Î4SÖp’òG–(ã×$ÄŽ i&M” >CBLÞ"# F oÁ„/ˆÄ6À¿FD×–=NÊ.RÀÚGâKPÏ/wìã Ý%<ñóeä—Øñ‚·VáÚo>‚åïÕZY’S$Â4#7¼ÎðCRÆ2åóµËÉÄ@ˆ:ÔŒ< u{²î ò¿º·û ô´Ý­Z?Äo!„B!dWcu‡ÂïWwcY[y@ à¸Q5øúƒqüèsLñ~ŠG%‰Á·ö=x9~œœÓBB!ÆõŽßyµ·_»º­¾eÉ&¶$‚i#KXIkQ° mØâŽRv*L°%%•Œ{–ZR“bDì»Àeʉ;¶ô’þí~uw+<6cž{p-Š=Úþ™jï»CkŒ?x:nœ\ïÓ…‚1Ô1…¬àšý‡8¸pÒ`LݧµŽ(;¶»ž^߃ٛ)ÃB!„l(ÃB!eøë_ÿŠSN9³gÏN=¿Ï>ûà¾ûîÃÌ™31eÊ”Ö!®ºê*¼öÚkØÿýwØ}ÈÎáÑGÅqLJwÞy'³Î1ǃٳgãüóÏß¡}9óÌ3ñî»ïbúôé>|xj—_~Ç<,X°CûB!„B!}¥’Q‹üÐ3P7ö_áÔZVx‰‹ ééFꋹÉÔŒ=È7C»E»ÝP pñÔ³ðó«žÄ–¦¯{IÉ%”V'-éÄeœ¤ä‘L˜-|ô¢Í@T–ã%¹ X$”‘ c]#ü4óØk¢D˜d*Kš¬’XR®'û:Äh’ÒŒVÝñ:nþ¯?£ck·õóóDå/äÙ€š1AÔî•>.TÖˬ<'r£P;êÔìõÿAäF~¸ßB!„BH¿£ 4Jº|ý;8ÿA8}_O,0¦ ¡â¾Œ 3td-Ž8yÏû)"¦ã}®_Û‰Ûþs1æý½9ì_"%KJ)“‚xqaÆŸÓe%Á„‰0½H¤‘~Z!5ÆL]ɺY')§ô"Å%µ°Î…ò‹Œ=»Ô$œ(gãêNÜqíb¼7{Køs3“~”«‘¯•8ô#{aÌþË TÈ7i’Œ7ƒ:ÇŽªÁWˆ£GæQ^‰:Ý ¿„B!d&WíB!»2Åb1µ¼®®W\q~øÃbРA;­?'tæÎ‹‹.ºO>ùäN»/Ù>twwãŠ+®ÀŒ3ÊÖ»ä’K0}útÔÕÕí”~år9\~ùå8ï¼óðãÿ·ß~;\×~ÃNü˜dó¿3nE[[´éŽ7ãÑ»ï¨bv/~sûèêè'Žß·Š½!;’IöÆóoÏ ë·´àËÿtz{D!„þ…€3àX䆜á  ¢ä À[Eâ/èáš ÅFp¤ø§„ßvx-(Ò;Ÿ1 ª»¥–ÈÜpO‘Zùox…Â’ùëñãKÆ7þý óÑý|qCCj_ÚÐ¥­=qC;€ÖZú‹›ü2¥$øŒ¨'ø,á8 Z{bLØNئ·WF;JJï;J ,\Ðþ;¶Tr1Š€†W;ùâ‹”¡¬„ „™Ô4‘àR)ÑźNd×KÛ¶4´áî_½„ÕËŒ#éG+(]€¬í@~è1¾¼¯$¾d'Æ$,óœS{(ä¨Pêx¥ö¿º°]Sö4Î;ï$öNb¶néÂÿ^ý þùÜãqÎW§À‘Z*hG@ùL(·‚ŒtŒÏ¡(cH3R§H3:”f"AÆlÓ+s¤ÝNɳdà¿fBkh-!¤ÿX¥Ï^kCv‘‰Õ]ýõÖñªU«(ÃB!;˜¼øÈ¨&¬AΟ²iáÍy£W6ø/)Ðãc /†4¾ðA„åžÞ`k o·÷ƒ1dD V,l[Ô !F˜ÿúflXÙ‰Ï]v ÆŽ`È,ž˜!¥×žÐQ™%Ìo>+´]f¥¨H ¥c2M(Õ „¶ïïI9Þ÷óÝ(ÓJ§½ÿ!L®I -}YÊÔ±ºq¡¥œ<ƒØ>bº»JxîµX:¿5`´‚%ÂÀ¾‡ ÁèñË /(#ĤíÀ8ŽMwÃñ8²Fà_&Ôby[ o6±µÈùnoX·n:(úwéÉ“'còäÉáñêÕ«)Ã|Ö­[g=Ï}÷Ý?ýéO«Ø#²£hooGkk+† –vÚi8í´ÓÂãW_}•2 !„ìÂÈjw€Bé/Lž</¿ü2{챪‰0&ßþö·ñÆoàÀ¬vWH|ðAœp eE˜ã?sæÌ©šcrÌ1Çॗ^Âã?Ž8 ÚÝÙ¥ùå5?Æ¢Õë«ÝÝ–Ÿýäj,]·¡ÚÝ ;B¡€o_~yµ»A!„~ŽÃô/Èù„3&3i#¾ò¢2«×«Äe ‘C͘£€|3´*xâHp/_¶P®Æ³¿Ÿƒë¯|›Û"Gr☟-Ñ#.d Yí82« )yÅ“¯ ]¤/©ä¦u˜ú"ü•7ᱟã-ÊÉJkA†°‚Œzð¿G\ž-B鯉·ãhWáñ;ßÀÝ¿|±¼£7 fìA5#*Š0Ѧ’çÑÛ™ô±1¹Ag¢fè…¹ñUümë<÷Üsxúé§«ÝÝ–E‹ᦛnªv7ÈN⦛nÂÂ… «Ý B!dE˜4ÔÁ¨Å±#òþË‚—:DÂBR6H¦tÄÒ;ÒR=âûX*Èà58ò¤Q2¢&Jq5” hד,×wãŽÿZ‚9¯6eK$A‰ŒKÁùHê0“P,Y¤R†’.øíÉèZ7ü>Ñæº*º_YùÖ¾œô"¬º†ÈRFzI—_ÒE› +;p÷ÏÞ·Dajj%=aDB„ÉœêfmÖØËJˆÉH’ñ¯;`ƒÏíW‹î•Cž++òõ¯Ýû»Ù!|ûÛßFGGGµ»Avííí¸œÿNM!ýþ§#!„ÒKN9å|ìc«v7,N8áÌ;Ÿÿüç«Ý’BWW¾þõ¯ãüóÏG{{{f½o}ë[˜9s¦õæ–]iÓ¦á˜cŽ©v7vyN9ö(Ìxða´÷0¶b{£µÆ”cŽÂmý=¥jw‡ì`îºíVœ{ÞùX²zmµ»B!„~ŠÌ ™?4& ‚dPæYç‘*À$޵Fnø¡p†å¡ÝÍ¡0ÕUÐJჅðãKùo¯./·Ÿ=DŸ#ÙEÆ>'6'Þ–´® äG A‘'ÂÀb ½­TbtTOˆ(&vœÚ/‘Òç¹'’xìD˜Ìïk´Õš7µáÆ?ƒ7^XìKJÊa”†v»€ÚVÔŒ=ÐNB„I۲嘘ØbŽ+ uœeA!Ç@Öž À©Æ¯Z¿â /ĵ×^‹Í›7W»+»%ßÿþ÷qå•Wbýz¾(dw§§§Ó¦MÃo~ótvvV»;„BÈÇà¼Àñ#s¨“"E(°Å—`ÎZQ„©°W)ÂŒ2Î;y‰CŽ}ì•™²…/Äô\ýéOãá‡Æ AƒªÝ•3fÌÀW\îîîjwe‡rË-·à’K.©v7*òÞ{ïáÜsÏÅ¢E‹2ë >wÝu>ûÙÏîÄžõކ†|æ3ŸÁÛo¿]í®ôjjjpð¤ÃåÖ¯CË.²èfÂþ1dèÐð¸X,âƒ%‹­:‡v8òù|x¼uëV¬[½jgu1“ÚÚZxÈ¡áñ{æY¾ôFäN rDüòÂÀAƒ0ñ@[jklØ„ÆM›v~_Äă¶ÊÖ­]‹­-[Âã½FÂØ½÷±ê,û`)zvÿÙoâD 2Ô*ëêîÆÊ–V©G„Bé/ÈšÉÈ<#’/ŒdÈ ­$’2‚Ä“`ʼn0óÚà¼qÎ>N»Þ?Z—Pj\!÷)Û—Os,þï—§@(•J®¶öÅ’B©¤Qr•}¾RYø9*+–¼7Û3Οݒ/º¸ Úu=¡§X„.¥,ÐÚO‘€ìãØp$r9œ#s$œœô>û{'ü/®‹öNpì×sœòçƒý‚·VâÉ;g¢»«'’[”!œ(í6Á92?Ì—QaââKBŠRYõUòZõ#’_Tt¬¢c·ð.J]/P;ù7¬ÿ2xð`œp ‰9å²e˰nݺ*õ澈ĮøñvâÏk¯½¥¢Ÿó1ǃ‘#G†Ç»Äßnòù<Ž;î8Hi/Xûìg?‹ïÿûVÙᇎ%K–ìÌî…œrÊ)¨©© «ùüN<ñD 80´9G„Ò‹,»7ž±“QG˜ÏÊÞ'Ú)³7ë:KxXñÞÖŒgë½Äb߃c¯}Äd–è³)>%„í·•U_ÙÇÊ—¥âõ”ŽR‡‚¶»J/l,¢¡Àùn_˜0aBb K±XÄòåË«Ô#›|>Ÿx1è¦M›°eKôï–ƒN̉׮]»K¤³Œ;#FŒH”/^lÿ;û­·ÞŠK/½tguËbÔ¨Q5j”U¶fÍšª¼Ì`øðá7nœU¶bÅ ôôô„ÇiÏ´Z+ˆsàZ;¼¿¬Y³¦J="„ìéh­«³ªAf7ƒ2 !„ìxN8áüñLLÞvæÏŸsÏ=K—…ûƒ sÏ=÷à›ßüfÙ?,L™2?ü0&Nœ¸ó:ÖKÞÿ}L›6 +W®¬vW©ÈÜ¥Ëqì!†ÇÕ”a!„BȮ̈üàϲÎV¤/¸aK(±WÓšÂK¶ “~¾œ!Pjùºg0„¬MÞÛ_sÀ¤±øú÷?‰á{ 2d_N±d[–)–ùùñ8á´ÑaBI ¬˜©%qy%bRÏ)/µ¥¬0£´%ŤÞËÚÝÔØ‰R))cŒ1NN¤K/©rJ/…K˜IžK¶ŸÞÎú•øãýkÐÞR E“ø³ª©ËaâQÃP7ÈÙfFkÿfW1q&ã:[†ÑhéÑx~c¶¹–‘ôâën«)ÃBÙ}¡ Sf B!}äwÞÁ”)SÊ&~T‹É“'ãwÞÁyçWí®ì‘tttà /ÄW¿úÕLF+®¸ûÛßvIæµ×^ÃÉ'ŸL†B!„ÒoQ¥èiû´Û"6 !5”*[Òƒ•ðám¹á‡ÀV í6‡B„ö (/-dÅ’M¸îÛaÁ[«àHÇ›®”ÒÉøÔs¢ÏŽ#ÂëÃÍ_\Ó—6Ç{¤Ÿ¤ø}×ö¦u(¢$$)­¶Ã{8±þH)ÒË‚7 §µã…Ïã™Á¿Æ«ß\ߊ[®}6aÌŸ‘ žPÛ†ü˜£‘%Âßµ¼“r¯Ÿ1ŽlÆ<.¡Ôñ,EB!„Bö`J xaCn)EâL™!kKÊ éûä5¦°/WF]Ç‘8ø˜Ø÷ !¡ ‰)ÞV,hüù¡µxâ¶•(t»‘`#á&)ÝØçSÎ²ŽŒ•¥´™rm¼ éË9)[VÛ÷ñsæ½ì{ÂÜ'ú•þÝ<sÞÚÈ·^lÀ#3V ­¥è=o7Œ¢mø˜:LúèÈ>‹0i{ Ìy˜ã2{`üØÔ¥ðôzŠ0„B!¤ïP†!„B¶5kÖàÔSOÅK/½Tí®$õ©OYqÄ„B!„ÒÑnŠm÷C—{%'$ÅôJ\(+ÄÂ…6êÉÚ‘È=Zm°Û’A´Bg{7nýÙ xìÎ7 ”J‘Z éÃülI1(+Í$Ú”")ß›'·øÉ:þwSÖ&€P|±Eo%L»‡Qž.¹D¢N¼ŽÕ–H¿FJ3WàÖÿ|›ÖnÅheÈHÚm€3brCÈSÊÉO•Ä—DMZ}À[ ¿¶ŶGáöìz/f!„B!„ì\4€×‹x£±˜-¼À âBIÁNÿð§Æð¯‰ 1*ºF©H޳ß@L:a/ÔÔÊHÄpá§»xÛâÙ[pç/AýšNC 1¤—˜ØK AŠ8¯Ž!´”—^Ì{Ø Â$™ø—^’òKRzIÊ/ñziòŒ]"­¿Þ¾«£„'n_‰¿ÿ©nQYòKðì`¿Ã†bÿ#†AÈ4Aª¼“™ƒhüSY{üÄ$Û_ÞV³zPp)ÂB!„¾C†BÙFZ[[qæ™gâÞ{ï­vWRùÚ×¾†Y³fáˆ#ލvWv{n»í6œxâ‰X²dIfSO=óæÍç?ý騳Þsýõ×ã¼óÎC¡P¨vW!„B!d» UzÚ€êYUY€)w¬RΧ1‘Ð’ÞF$½(@KäÇä·@»]^*‰VQZ‰ßÞ+\ˆ~ð467´%¤Kn‰}N•fÒ„“ŒT;UÆK\þf'ÃÄ6­c+zd˜*ã +Aª b}Alô‘äbJ3"å¤<·èâé{fâÉ»^GO¡h JÁÏJ)h½ù±“ óCË M½aRR¬c ò¸ ÊÜ­èÙúTiMõ~™!„B!» ¶”ð†JqIé¢Ë6íU Cd$Ĩ Ž}Ý€¡9vâH U—H' c¶4öàÞ_,Åì—Ó…LaÅN“AªLb'§”m#%ÕÅU®›Ü€ÊÒKªÈR¡®%ô˜òOÑX»¬÷ß°«ÞoóŸoj¥ÂÔp0é##1rÜ€ÔŸs85îõØ06•%R•K²%šy›‹øk}ô`!„BȶB†Bù‹E|å+_ÁþçV»+©y䑘5k¾ò•¯T»+»%mmmøâ¿ˆK.¹ÝÝÝ©u„øÿø¼òÊ+˜0aÂNîaeJ¥.¾øb\}õÕÞÆC!„B!» ºÇKÔè~7Ed@FU´Ÿ.m†‘*Cøi$FYnØAp†„v}ACYíj¥°fy#~ñ½?`ÁÌ• ÁÅq"™ÄÉeÂT'&ʤ&ÂÄÚq¤”á1„ðå$Ra<ɾ0#¢t?!&]X‰É/"Yî˜)7þÞIÈ3ð¯®kÞØŠ»®ó__¥Á‰0P ºÔQ׎ü製Õ8JÙbS†ÔRY„‰Ÿ¸L“&XY×û‹ÉŠQÜz´Û\å_$B!„BȮȊvO¯éFW))¤¤î‘&BTHQژʘL\v°Ë¤#qàÑÃ0þÐ!ÞtË4”Ÿ¼R**¼øè:<~ëJºÜTá#J‹É’^ÒÓdÌ$¤¦ÉĤ£ ô5¶UY‚}yéÅú~ ù%]ž1ëBk¼ùÂ&€”^»Á%èîèÁ½7ü'Ÿq8>sÁ‰‘ ¢½„íHh­üÏ€ÖÞ}µF¸W¡àHí‹#Ú.s¤ÑŽ ÚÑÐŽ€ÒZJ¨à= J¥øíêð^A/¹ÆM‰*1g ƒ—A2M„–Jé2Édï\G[ Ï?¼ëVtDÉ=*JíQÊû.û>#ÆðËPA\©$Âô^°ê;ÇÕxqcÖt¸rôB!„B†BÙnÜ{ï½X»v-žxâ 6¬ÚÝIpÁà£ý(Î=÷\¼ûî»ÕîN¿ææ›oÆ•W^‰B¡Yç´ÓNÃC=„}öÙg'ö¬÷¬_¿ÿüÏÿŒ T»+„ô‰_Üz'†Žï3nl{C!„Bún×ë€jAnÈ?C è`ῦ'X«@(æª÷]ˆvåßÊXÈa–y wò£†»uTw-„í¯ŠÆ ™™/,Æê¥ øÒ·¦bø˜!¡ £´Žd(Õ%øJ3† ãèPšQA;ŽN2öõ€ò;®Sd¡HéõY !!ÂdT–ZD¶è’)¿‚[tñüobñìUñW׋ -6!?öHï‡.±ú¡´¢1FAû‚Œ]GEíôF„ÉiŒöÜ®wPêx1”„ô>ò‘`üøñáñäÉ“«ØB!„=‡­E'VwcÚøZì3ÐABjQÚ{Y’³Œ„ø’%Ä„W{e ÂcüY¢ÿÙßko¾+ 0`H‡¸Ö,ÙŠ- Ý€ö„!©½—7´4õàÁéËð±OÉŸcK,†Ø‚@HÑiç)Æë‡Ö)ÂŒ€!ÅeFªK´’ ‘üZb‚ ,qFzM21Æ’~2ê¬ù  Ï?²íÅP~ÑÊ—a4 •Fí 8jjäÒ¥—DRKRVQ½:Ý3-aÈÜÑq{QáOë{ÐTH{Á!».£GÆYgUínB!$Ê0„BÈv䥗^©§žŠçž{ûí·_µ»“à°ÃÃÛo¿Ë/¿·Ýv[µ»ÓïhmmÅ×¾ö5<þøã™u¤”øÑ~„Ÿüä'pg'ö®÷ÌŸ?guÖ¯__í®Òg¾uÑ—Q›ËþÝêìá[“ !„BH6na´jC~èÿ…À@[xñeïXA(Ù'!&X–Åê$˼#?Gà =¢®î–z9Ú¿——V5áÆ«ŸÂÙ‚£§í8ÚOr1e¿L92e‚DG@j )•—Æâ_“ÚŽc$ËÒŒ¢ˆ˜Ø74aàK0¦°âH_ЈI2ѱU/Ü‚vd¼ã¦-xîž×±¥áÿgïÎÃäªë|Ωêî,=! ȪŒ "1€Ì #8£Î8Ãxïxg†‘Ñ«wf”Ç\pTPG@d—-av’ ‹Ⱦ§ÓÞ«êœßý£ªNýÎVÕtútwÞ¯ç©ÔY~çÔ·ªzžñGÏùî :¬Ä»°tË™`”o}WBE©•ºÛüô1IÇÔ Æø¾J]Ëë{vÕÀÈqÑEéüóϯ;¦··w˜ªØ»ôyFw­éÓ‡ç´èÐÉyÕæœ•yš±Ö#!—] Ä„ºÀ4ØææÍ}çMšÚ¬uotÊ÷ÊZL%㸒)úzôÎ ZóF—æÿå7!§j'˜jÅT0å.1µªjáÕº©TC/A·¡S9‡S9Kù5*û¼ä0Ì`»¸$ZœH@Fn-DSÝ ÚøFzú¾Mzáñ­åL~©aÊ¡˜sÆk¿C'U¾î:¡ $ì2€ Œ©t†Q½sÔ¦ÜÛû|-X߯®7~ÀèsÈ!‡èꫯ®;¦­­m˜ª6·ñ0¯¼òŠŽ?þx-Y²$ëR7NW]u•n¼ñFMš4)ërFçž{NÇ{lÝ Ì¾ûî«|Pÿñÿ1bƒ0÷ß¿>ð„Á˜d$}õk_Ϻ Œp~q í¿‘ïµ7ìБ¸ß¯Žð+ûë)_¹;wùX_nÓd5ís¨ŒÖK¾Wî.âÛçöUè-èæŸ.Òï~µX^É«u‚©GrN(0’s]årÕåêC u\±O=OyYŽd|?þ0•‹¬Ž0êòâ$o³Ã1®ë(ª±VÿË‹Wè·?¼_;6wŸµ&U¦´I¹iÓ”›x@ƒïg€Û¬ï9º‰]Âá—Ê÷/û˜¢Š;ï ƒ1íg?û™V¯^uc–g¤Ö÷kɶB8¬b°žšºÄƒ µÎiç±–}cMykãüJ‘û×aï›®æñyù•ÐI¹‹‚õ•/ïÔ5—-׺7»­IB°Ä›¸ 3J ¢4:G5ŒâHžoäyñG%K3 ..Ñó+ò\olµ¹Žºvuû/ÞÔó‹¶Ê/U?#…>;ÇqtÐ;§è€Ã'¹'ßúîÊÏÖwV Ñ„÷GÃ.ÂØÛ•tˆÚ˜µÝž~·¶ Ƭ5kÖèÒK/ͺ öJ„aØ6mÚ¤SN9E÷ÜsOÖ¥¤ºà‚ ´dÉ{ì±Y—2â]~ùå:餓ôÖ[o¥Ž9ýôÓµlÙ2vÚiÃXÙàüò—¿ÔÙgŸ­ÎÎάK†ÜæÎn}ãÒèê}?ëR0 o›Ší×Ê/lhЩ#%Q \Ô N¡ŒZÐ¥üˆ†[ª¡ ¿v¬5Í|—ÔÒ)Sê®:|?ŠyáÑåúùÜ£í›:‚0I5ô몒pÉ…ƒ.I¤ãÊ]rüØ£|']·ˆI ¿8)˜„ NZh&WY.ö—´ð׋õÈ­ÏÉ+TƒCvÆH^IÆÙ¤¦}”“Ÿ’Lu¿ž±CJÑÀLôûL ˤý]$S} ¯[…öä–güÀžÑ××§ÿùŸÿÑ¿üË¿d] À^á©­E=º±¿2uljðCëÉ¡™Úý’B&Ô±¤¾‚‘ÆOÌëÈã¦kÚìqò}É‹†b|£mýö¿Wêé7«œ>‰vO‰‡JÜh—•¤PJõø”s8®S‹Tk²f A–Xø%}Lü;lãhÕòNÝðß+´þ­ëó©={¾Ñ¸‰y~Ü M™ÕþN‚P’ýFC/µï¬^À©a¦îyŒþØ^Ò‚uý*øYþ_°gctÏ=÷èœsÎQGGGÖå°WrŒ!q=–8޳JÒÛ³®P–ËåôãÿXÿûÿï¬KIÕß߯‹.ºHW\qEÖ¥ È•W^©ÿõ¿þ×°¼V[[›>ÿùÏë®»îJ“Ëåôïÿþïúú׿.×™9ccŒþïÿý¿úÏÿüϬKvÛŸ]ð7aBhÛ¶-[õà=wfTF5§I͓ϕÛrXè*–j˜£¶¾ŠÆq¢ûcWÁXc”z\m›Â·— îfëÈ;Uܾ^nnVê±M-MúØ_¯wÍ;D%ϨTòUò|•J•å’om7*–|yž¯bÉ„÷…–Måñý½ÛÚÕ»zCìãÌM™¤ü¾ûÈq]årån4ù¼«|å9—s•Ï;åõœ«\¾üœ¶Ç©ë„ÆmßÒÎ IDAT¸Cýæ)íÜޕнE’ŒäuÊiÍ)7qÿʘÊv{\ìXS›tJ ?¥‰aüÚøÒv:n’ñÚ‡ïïØCN=õTÍ;7´­T*é¾ûîÓ¶mÛ2ª `ïõöÖœÎÜ¿EÍ9'¼pSneZê6mĶ)ºÍZV|›T[Þ¾¡Wk–ï”1ªÕåÚÏÒA‡OÒÇþò@M˜˜/k*M‚ÐJt[å&¾/¯òìWB$Á²"cjÛ^xr«z{J±ÏóØãg©¥%'Ç­oìŽ{vdž‰ï3Æè©6kéâmñ°‰:™¹ßíè$ɱ§¸¦2íµ‚*ªt²÷‡Ç¥‡ŸªÓàp·™¤cžÙZÔ Û‹ÃùgìS¦LѼyóbÛW¬X¡+VdP`oaŒq²®a¤# 3Ɔ€‘颋.Òe—]V¾He„ºí¶Ûtá…ª½}d_|1\a˜'Ÿ|RŸþô§µfÍšÔ1ûí·Ÿn¸árÊ){¼ž]Õß߯ÏþóºñƳ.F(GM­QnÂûêb·zeN`‹*·—•äÖ ¿X¡—zá©vwØâ¶Wä˜}Ëç—âçt¤£ç¢üÅñÊår*Úa˜Ðrd[Jh¦˜xLù¹gëu¿¹.öIæ¦NQóœÙr*—ZØ%9Ð’Ï;å€LB&gË9ÊYû_}ò =³àEù%«›Nõ·ŽÊ²ïoRÓŒ¹rr$Ù!•Ú˜òï#ámÉ%l wwxÆH•0Œ_X«bÇ­2¦wOÿ‘ØKÍçêœÇ©µi`˜êT3=Ó(c³æ´µpL<Ó×]Ò›/µ«¯§®Í­»ur^ó?óvðŽÖ ØÅ(y_¥“Jj`ÆêHc|£çߢžîxæ}'q¹„ðKýÐKùy`cº: ºÿæµÚ´¶7ÜÙÅ Á¸yWo?b²¦Ìj‘ ¹„Ã/Õ›=$b¬e•? ÉXÓÜaìn1•:=ßèá½¾3þ9`àÃ462o_Àóýï_ŸúÔ§Ô××—u)©>ñ‰OhÉ’%zÿûߟu)™2ÆèÒK/Õ©§žZ7ó±}LË–-ÑA˜¶¶6qÆa .£b×*u>¤Ê•& »yÈ·C~ð‚•„©Ÿ×¥—^ª{ï½W3gÎæ îÍ7ßÔ‰'ž¨Ç{,ëR`T(õ>«bÇí’_lˆ©†]*!‹h") ÎDÃvPÆ ŸT~Ú4ù¥M•L-ÈQ½beÛ†ºö;÷ê¥ÅoÄ‚.ÕÐI8àR ¹Dö»•;Ó&e× 8öC¦r‡á†_R‚/IÇn[צßýø­~y]ø}W>+ãû2^‡Ü E5Í8*9”ìc#Aës~ÿÕ×Q$ÌýÎC5V ¥î§TÜù;ÉxYÿÙØ tn{«Okº¼AbBaŠhÐÅO UÁ ;”a|k¬¯`þ[™^Ëq¥ƒŽš¬ƒŽš"ɉ…@|ÏÈ+=¹p“núÙ›êî,Zc“ £pWšês(È?‡©pì‡ï™P#×Ú¹jÁU^WV°&-œ£à¹ü^»g£\¿Z½Ý¥ äyáPЬý'èð÷MWSK.ÁSÙà;¨|¶¾õÙa¤¤ï:²-˜7'„]Œi„ÙYðuûê~­ïa¾ €áA€aôÔSOiÞ¼yzã7².%USS“~øÃê®»îÒôéÓ³.gØ<öØc:æ˜c´páÂÔ1x {ì1}õ«_-ß¡g„zæ™g4oÞ<-_¾<ëR`Tñú—«Ð~½Œ×Ý »GBðÁêãׂ3êc­]Õ„b”oUÓì#%g£dJ‘Î%•°EQ÷_÷”üê1y…R¤ûŠ.µn.¹\8´’‹Xr9GŽd½žõ0¦|~§ö:A7G‘×Wåõkãb¡§|Ü«O,׫~¯î¶®à3ªur©a6*7c_¹Þ)…>kù¬SB/uCM‘q¾o½ŽÚ_SûŒŠ;ªÔýHÖêö2ßèî5}zuGi€˜ø¶ä K-8c"!—h—˜ð¹ªç ‡b¦¿mœŽ:~ºÆMȇ;£x –W¿Þ¥k.{]«–wÖ¶„)õ‚,áÀJøukÇ1©–äŽ/Õ®4µ×’®«cGA·\µR/>¹=ñ5}¯äÝSµß¡“Âß0²Ã/Ñn0¡ï)ˆ©ó}VÆ×¾¿äñÕ Ìæ^O·­îÓŽ‚Ÿñ_;ö&„af+V¬Ð¼yó´xñâ¬K©ëœsÎѲeËtâ‰'f]Êåû¾.¹ävÚiZ¿~}ê¸üãZºt©æÍ›7ŒÕ ÞwÜ¡}èCÚ²eKÖ¥À¨ä׫°ãZ™Òöp Æ LÔ JØA?t îcjWY¯khB¡£üŒwÊß/ùñ׫/^{ö-]ÿŸ÷hÛ†µ€KÎ]rJìÆbwƒ íw”†q¤ÊùÒ;¾TC.¹ÔÎ0µ°L©¿ Gó¸^¸ïEù%/!,ä—;ù¸[Ô4ûrÜ–Ú÷|~-t”±¿‹x7Œ™ìïÌ~h ßH~¿ í7Ëë[šõŸ8€½”o¤ßoè×Ó[ ñK½@DjÐ%)8S/õ”L¶äØë† Û·o×é§Ÿ®›o¾9ëRê:à€´hÑ"]|ñÅ#ºʮڼy³>úÑê›ßü¦zªGA&ŠT+O?´Y7]±Rí…Zè%©KL(ôR¿‹Kr‡–rÈ#-ôâDB/ª3Æ+=rçz-üíõõxVØÇzmßhöÛ'ê°÷NS¾Å …`¢vj÷àH7kïÆúCßuÐq5„ùC[Q ×õ«HCd€0 éëëÓ\ Ë.»,ëRêÊçóúîw¿« hæÌ™Y—3d~ÿûßë˜cŽÑC=”:fîܹZ¼x±¾ò•¯ ceƒçû¾þáþAÿøÿ(ßç¿2ÀP0~¯ í7Èë}%9ðà‡Õ+SâA—h·?õ|ÁØÐ¶„PŒ5ÞÉWÓì#er›%¯duj©/ŠZtóÓzàW‹Tê/†‚.‰aR‚+Õ㜴Î0Æ]]r‰ÁÅ2µn3ågÇ‘–?þG=|õ#êéèŽ`ªÏ¾Ù¨üÌ9rÇÍ…„ÊŸ_RÆ~v`©^7˜„›¾Ã`_q‹ m×È/mÎúOË;JºkuŸúJ~BÀ¥:Å5±°Dx9ÚùÅ [ØRT;“„º˜j×Zž:»EGΛ©ñ­ùX—˜êòš]ºæ{Ëõæ«åŠk?â¡Ù`Üx¸%­3LRx¦~øE±±íÛ ºéÊ•zé™¶x¦ò:nÎÑ;ަ9‡¶JªNwÃÁ¢Úç /™än0éuú‰k‡ŸžØÜ¯Ç7d2ü[ÀÞ0 2Æèâ‹/Ö¿øÅÔÎ$#Å™gž©_|Q§œrJÖ¥ìÏóôÿþßÿÓgœ¡M›6¥ŽûÄ'>¡¥K—ê¸ãŽÆê¯§§Gçwž~üãg] Œ=ÆSqçïTê~²NWJ+´éüb]‰¡ŽH(¦:¾rlÓ´#å´e¼ÎJx$ü0¾¯KVë–ËîÕ¶uÛC;˜ë c…XªÁÇ‘jh¬0Iµ3Œ~qÂÇÛç«m/?{ûõÄõë½$¿äÅ0å÷QòÛÔ¼Ï;å8-Áû¯uÃ@&Ròãßgj ÉþL#a¨jÖ¹üþ7Õ¿ã×2þάÿ’ f]·§[ßêÓÎB$ã§'¢Ûüxp"Ú%¦¸°‚¡s„C1µi[¸ãIóøœŽ<~ºf0A¾'+£ ‹JOgI·þüM=zç?pqíPJB`%Å8’£Z÷™Èý4¿8±±¯-k×o²B[7ô¦{Z§6é¨y35iF‹2A ¦Ú¥ÚEÇîàê¼éSû^¾ÏX &%ekоtÿº>½ØVÊúÏ{9Â0ŒW^y¥>þñ«««+ëRêš3gŽ~øa}ãß뎾ÿ±aÃ}øÃÖ·¿ýíÔ*---ºâŠ+të­·jÊ”)Ã\áàlÞ¼Yüàuçwf] Œi¥®GTìX µÔº…$‡dŒ5®€ &ž±ÖqáPŒº©†QL-è‘?Gù™³%³Ù «„Ã$ÛvêÎËïÓ+ý1ÂÄ;¸„·å"¡×Q蜵Î0 ŸÖq&´½Òfûê­úý•hóЉAãûòýå&9ÊO;¬ÖùÆX!•à3ª‚‰“jǼŒÿ­e¯÷EÚo’LÖ¾ª­ß×ÍoöjS·F$]â_Â! »{I0¶â¨2BcüÚ¸`Ù lÔ‚ FÆqtà“uȱSå¸NbÄ÷Œž}x‹®ÿñÚ¹£À¸’B`Â1•n2~¤[Kõu‚Ž2)LJÃ/µG©hôÐíëôÀÍkÕ×ëç³k÷|£·ÒªÃÞ;C¹f'èîbüjˆ¨òýð÷P ¸ÔG~0.`Jìôcuë þñÎ3=%£ß­îÕÊΑ}³OìFßU¬ŒQ ,Ð)§œ¢7f]J]¹\Nßþö·uÿý÷köìÙY—3`÷ß¿Ž9æ-Z´(uÌ;Þñ=õÔSúû¿ÿûa¬l×üñÔ 'œ çž{.ëR`¯àõ-UaÇM’×_ ¢$v ®:‰³B±0†²¨Xj!ŽêC¡ñvG’j·§EMû%å·J~)Ô}¦ñ‹%=}ÇszèQ©¯î““ÕÁ%!(“«†aâÝgœXg'|.'Œq\éõÇ^Õ“¿yT};{j!ëY¾/ãlRÓÌýå´ÌŠtñcŸ£J Á˜àû YBŸ{jç˜z]ÊcK‹TÜy¤äqÀHÒS2º}u¯Vv”¬PK8DaZj_ÂI»‘D2Aw‘„PL­³‰øîwP>vê¬qz×I35qJS¨ƒ‹g=¯«[×\öšÞøCGÃN0Õm²Â-¾_ «Ø¡•phÆ‘*á™êsp^·öšm[útÓÏÞÐËϵYµZaß(ßìêðã¦ëm‡L”¯Zç—Xƪ„ºÂØÁ¡ph)±Œ/ÅBKÕeëµÂA¨òòŽ~_·½Õ«Í½Ìw02†`Yºt©Ž?þx½üòËY—ÒÐé§Ÿ®eË–éÃþpÖ¥ÔU*•ôµ¯}MûØÇ´uëÖÔq\p–,Y¢c=v«Û5‹-ÒI'¤U«Ve] ìUüÂJv\'ãuÖéã˘´Eƒ°…n±C1Ö±µn(öùÂÁãûÊO;Bn«'™‘.+µÉê—ÖèÎïß­ík¶Y7½äÜÈ£²Í‘‚n-öCÆ(çª~©v‰±žsvHF*öôé™ëÕk‹^–ïYç =ú¥æ65Í|§¤|$ yßÁçÒ cW¡î1µ@K¼sL4ì @ù’WR±ãN•zžÈúO¥äK ÖöéÅí…pø%% QÓÚh×—Z¸¥6]KÅßXS1«[Le½©ÅÕáÇÏоs'JRø5*!“ž®’nÿŸ·ôÐíëäyõ;ÁD3Æ:ýªÁ™hÀÆ u‚©n^y¡M7þd¥¶nì¯v¬Ð$MžÙ¢£Nœ©Öi͵.0ÕÏÄê c‡Žê…`|븴n0Aè%©sŒ‰†šjçÚÐíé¶U}ê(šŒþJ€8Â0Œ0k×®ÕÉ'Ÿ¬‡z(ëRÚwß}õÀè[ßú–r¹\ÖåĬ]»VüàõÝï~·|K‚ñãÇëç?ÿ¹n¼ñFMš4i˜+¼ë¯¿^gœq†vìØ‘u)°WòK›Uh»F¦¸9t±B0ñ0…îîb¯…b:¾„B1vø¥z¾ä`ˆ|_îø}•›ñ6mªuB‰„MºÛ:uß÷é‹^©„^tt‰vq é cwq*çsjá˜í«6ëñ_< momI8W¹Nßo—;9¯ü”CÓ0A8(úÕ Á$}Ñ€R¤#Œ‰|¿ÑïØø½*´ß(¯oäßà’Im*èñMý¡pJ5PIT·'t‰1VG븆¡˜ S=‡±¦zÕu#i¿Ã&é|Søò7;óü£[uÝåËÕÞÖêØRëã„»º8 ‚+ÑG,𒈑ã¨XðußMkôà­ëTè÷Bá—*Ç‘ö;t’}Ï4åšœÚgá+ôþkSÝ”LõsµŽµ³©}'Vh)ržÐ÷jm{½£¤;×ô©Ï#€‘…0 #PGG‡æÏŸ¯k®¹&ëRr]Wßüæ7õûßÿ^sæÌɺœÀ=÷Ü£cŽ9F‹/NsÄGè™gžÑßýÝß ce»î’K.Ñg>ó …¬K€½šñwªÇuòûÞŒt\Iê’Ð%¦ÚÄ m4 ÅD;˜XÁP $ß”Ÿ§EM³Þ)5m“ñ‹Ök×~ÉÓ’»Ÿ×£W?¬boA¹œbr‘1nåâ àB(»;Š‘ÕùÅ ÃXaI+½¤çoX¤BWoJ×_F›Ô<ë@¹-3ë`Løý†>ë}&†`ìàM-8ú®¢ß«b aJí*´]+¿¸&ë?MØm˶µpmŸŠž‰#ì@E-ØtIêB ÂÔ ÅSáZÆîŽtK±:ÆLžÙ¬#çÍPë´æÔ÷³y]¯®¹l¹^[ºÃê“ÒÙÅuÊSŤÎ0‰áYÏŽ¶mêÓ?Y¡×–µ§ÖÓ4.§C›®}š¼oßÀX¡•êÜ×…:Áø‘Œlñ­ïªzŒT :Ä$„cªõø¾ô¶‚Xß/r0‰Ã0B‹E}þóŸ×¿ýÛ¿e]Ê€œzê©Z¶l™Î<óÌLë(‹úçþgsÎ9jkkK÷¹Ï}NÏ?ÿ¼Ž>úèa¬n×”J%ýíßþ­¾ùÍof]  Êô«Ðq“¼ÞSº…X_ì‹Ψ…2…b¬c‚PLB·;t1)‡>òSWn²$¿£òˆ„O|_^]«û.¿[ÛWo‰wƒ 2îÀ:øµ.0Õ.1Åî^-¹á½õä«‘×¶º±øýrƵ—<Ê×À„>»HøÈ°ÄB0v¸ÅÔÎëSûNªç¬…cÊõú… *ì¸FÆÛžñ$ •;KºcU¯º‹~<$aw±–C—„ E£PŒÚˆv‹I ÆT¶å[\½ã½Ó´ï܉©ï§Ðïëî_¯Ö·¬“Wò¥j'7Þå%zŸ„ê#)üb÷Ò³Ûuó•+Ô¾­?µŽÉ3[tÄ Ó5arSð™Å0Õ.0Ágc¬m)`ì0’R²?ëHà%šñÃßeõó}tc¿žÚRú?0`ˆ†`„ûÖ·¾¥Ï}îs£¢ȬY³´`Á}÷»ßU>Ÿö×_µj•N>ùdýð‡?L3aÂ]}õÕºöÚk5qbú)vîÜ©ùóçëW¿úUÖ¥b|;ïU©k‘u…ŒÝ•¤ö¨v+Iì<Ò0c@ìã¬n1iÁ˜ê]_}_î¸}”ŸµŸälN³”Çô´wé‘+ï×òG^’ë*Ô&ç:rs’#¥‡aœZÆ>¦íÍzöW÷kÇš-VðÅ„Ž7¦M¹©ã”Ÿ|Hèý…:ÞØŸS´+N¤ƒŒÌ?ßX÷˜¤Î=ñÎ1~ÿë*´ÿFÆïÎú†Ü¦^_·¾Õ§ý^8üé0RíS ÇT-áŽ$B1öqÑn1IÁ˜Z·#ÉhßCZuȱӔoN¿îŧ¶ëúÿzC;¶öׂ,n¹#Œc]’8Jè$ãHÅ~O÷Ý´VÞ½A^)¹}ŠãHs¤ƒ™"7ç„Þb&ô9ÔºÄÔ ÁD>ßà>ÑÎ> Ý`BÝbŒQÁ3ºgMŸ^i/íþ°†`¸îºëtæ™gª½=½òHá8Ž.¾øb-Z´HpÀ°½îí·ß®c=VÏ>ûlê˜w½ë]zþùçõ×ý×ÃV×îX·nN>ùd=øàƒY—¨£Ô³XÅŽ;%¿îTbdÂE’ Å$t>©mƒ1ÁsåjV~ÖQÒ¸2~AÆK¥”<½|ß-¾ú!{úƒ®0Õ€‹ë(ÔQ¦úpŒQ.î(ãÈhÕ£/ê¥[S±»/öZAøÄÝ¢¦}æÊišV늓ð‰`Bá—Úr¸ƒŽŸþy&~ÖwŒ·ê6F^Ïó*tÜ&î `ìê(”1ºK•GB—˜P&THh#…Ø—`zku‚‰cjSjǶNoÒaÖiÍ©ïiëÆ>ýæG¯ëKÚÃá–J(&é#§|®ß^¹R+^éH=®y\Nïxï4Í<`¼u_«#LbÆ ùöû7韧Ý9ÇkLµkO¤LBhÆ÷¥Î¢¯ÛW÷iM··[;Àp À(ñÈ#褓NÒêÕ«³.e@N<ñD-[¶LçœsÎ}B¡ /ùËúÄ'>Q7,tá…êÙgŸÕ‘G¹Gë*Ë–-Óñǯ—^z)ëRàõ¿¢BûoeüÞô.1VÈ¢zñÉ€C1¡ˆ°±ÇEƒ1Ñ K-’Ÿt¨rSó’:"¡,oY¾Nüø.µ½µ)†q$É‹t†ñ|9’\§˜q;{ô‡ÖÚgþ˜ú¾ß/wB§šf%™\âû¶;¼ÄCAÑn9ÕÏ'ú¦tÚ —’»Î„B3ÆW±ó!»”|Ç_Kú<£ß­îÓòö’p w©X‚/Á´Ë ¾ø !Ž ;Jõ¸ZèÃTƒ7Á#˜.Ú]eʯ•ovuð1S5{îÄÔ./Å‚¯…¿]£nY'¯ä‡ƒ.)ŸC9,#©òüÒ³mºýÞÔÎ…ÔÏnò¬½ãýÓ5nR>~ ßÇ„>›¤.0ÑÏ¢Q¦öY߇uL<ÄT^ÞÖçé¶·ú´­Ïßí¿`8†`yõÕWu 'èùçŸÏº”™>}ºîºë.ýà?PSSÓŸåÊ•š7ožþû¿ÿ;uLkk«®¿þzýâ¿Ðøñㇼ†=aáÂ…úÀ>  6d] `üâvüZ~±=R©9¬°E9,S?cB!–ê8?ìHÆØ¡;@c½¶Û­YÂA˜èº Hâá_Fû4A¿{ªòÍé—ǽò|›®ÿï7Ô¶¥_ªv|IS Ëú}ÝwÓ=qßFy^òMWšsh«|çd¹nµæZø%Þ&é}ÙA•껓LZÆ+ÇYÇTÏWûޤµ]%ݱº_]%nü€Ñƒ0 £Ì¦M›tê©§êî»ïκ”û§ú'=ñÄ:è ƒ†ìœ7Ýt“Þóž÷hÉ’%©cŽ9æ½ð Mõ¢ª IDATú‹¿ø‹!{Ý=íç?ÿ¹Î9çuuue] `o»Š×Ê/nŒt ‰„,ñPL¨‹LpµJ¤[LR0&14îc|_Ž“SÓŒ£äLØ)ùý‘ðG%TãyZþÐR=û«ûUìî•ë(ê©<S~¬yd‰–ßñ¸J=}Vç˜pÐFM[Õ<ë¹M“kï!l±ëO À$……’ºè„>S;S[B0ÁgicŒ|¯K…öëå–gý'™yjKAlì—g…*ª—Ú”Õî~R'c"aj$˜¾Õ Æ„¦ÖµpIpN_?µIïxß4µNoN}Om[úuãOVèÕ%;Ô £-útËÏWê­å©ãšÇç4÷Øiš6g|-  ïT§Ý¦öØAŸhðÇ·—‚ :ðDŽ«³B6¾Ñ«íEݳ®_Ÿ FÇþGìXâ8Î*IoϺÀžçº®þë¿þK_úÒ—².eÀÚÛÛõ·û·ºýöÛwù—_~¹^{í5]uÕUuÇ}ñ‹_Ôå—_®–––]~­ádŒÑ×¾ö5]zé¥Y— N“šZÏ•ÛòŽòeƒ‡T¹Ýle{m]ŽÊÏr*O•«pªÇV–à˜úÏÁE<öÕèmòzûÔ½¹-~`õ§§_î$_¹Ö·×¶Iµ“cMh»©nkðlŒu.û98Oely`e_e»¬}¦š‘Li»Š7Ëxíñ÷{¡'ætæþ-jΕ'ŽNe®ZžÚVç´•íR0Åt'<Õ­ì¨ms"SÛȺjÝ[’§·Nx{ð´mM¶®êQ½Kå÷TmXÝ­Îöblß»O˜¡—žm“_'02yV‹æÖ*7çÔ¦¼Õ)«ìù­= 6ñileÅ„¦½&4m­W;ÖÔÆZÇVçÁµé® óÌÖ¢^ؿȞ1¦N\a˜1‡0 ì}þéŸþIßûÞ÷亣§áÛW\¡‹.ºHýýýƒ>vܸqêëëKÝ?eÊýâ¿ÐŸÿùŸïN‰Ãª¿¿_õW¥›nº)ëRCÊQ~âéʯB—H0&=£ZFJ|X0¦ú:vi)¡SRqûëRaFõ0E!pÉu(?}¶œ¦)‘!ö¸HøÅ“ø\ ²H‘«€‚çZÆ>ÖÁXÇZcŒ1ò‹kUÜy›dÒÿ[ìfŽsuÖþ-jmr­{8 <#)~\0ÆI˜â:V Æ~®ÍWS2•a=Emx­SÅ~H? Çu4ûà‰šú¶q•-áàK|ÙŠÇDæ¶v &¶­’h ß"‚ Æ•4µéní\Æy¾ôȦ‚^ßY’ÏC0Lc„aÆÂ0°w:ï¼óô›ßüFãÇϺ”[²d‰Î?ÿ|­X±bÈÎù¾÷½O7Ýt“>øà!;çžÖÖÖ¦sÏ=WO<ñDÖ¥öܸ㔟ø!Éq+üX—F¡˜à.¹éY…® žÂ¡˜d¼®7åïl–”—uÀ.¨ü1®MMÓŽœÊÍ<"¿M„~«ˆ†^bÛ"!–è³f m³º¿$†`*ëÕ»æúý¯ªØu¯$o7Þ?Œ]­yGgТ™ãr’ìû?Xa;#sßh(ÆÂ$c*ƒ£á˜Úrr@F’¼’Ѧ׻ÔÕV’Ï y|NsŽhUËÄ|°-<å5¡õX÷—ÊŠ ö×D»ÀTºÄؘH™´Œ‘ÔïÝ·¾_z†6€¡E¦1Â0c aØ{p ºë®»4kÖ¬¬K°;wê _øÂtDù‡ø]vÙejnn‚ʆÇÊ•+5þ|½þúëY—ØÃܦÃÔÔzŽäæ+]B1’µ¯º]áqRüتHP¦vžàŸ„eëü!ŽLi‡JÛ·JÞä]ãNA¹©’;þ@…:ÀÈ^^ìåhø¥¼’úlBÇ¥…`¬í !#¯ïi•zíúû€½D³ëè£sšu@k®Ü&t˜Ê>Ùûeu‚‰ÝçÁ‰Mo“Â1IÓÜhHfÇú^m[ݽWàLžÕ¢}™(7ç(z‘"Ý`¬ ñ©k8cZìó„ºÀTv¤…`d-Ûᙣëû´£À5ƒ#a˜ÆÃŒ1„a`ïvÈ!‡hÁ‚:ì°Ã².eP®ºê*}å+_Q__ß 6mš®¾új{î¹{ ²=çé§ŸÖÇ?þqmݺ5ëRÃÄÍÏQ~Òyrœ‰AÐ%Š‘‚Î0ªÝ17©[L­³‹u•OZ™ê¹‚•àŸp(&´.Éx*îx]ê6ø7ÜÔ¡üôýää[­óERÖë†_¶™ðÕ?µçJøÅD·%…`d$ã«Ôý ¼þeƒ¿°—ré”ÙÍ:rj>ºÔ Å„îïP ±¤u‹Q|Lmúê$Nm2 ûû:KÚøz—Jýƒë⸎ö9x‚&íÓRç¾áà‹½ ¿Ã0Õ ‹5¾: –¥ÄŒî³¥×ÓÂõõz\/0†iŒ0ÌC0}útÝyç:ù䓳.ePþð‡?èSŸú”–/_>àcN8áýö·¿ÕÛß>ºþ_ßm·Ý¦Ï~ö³êííͺÀ0sÜ©jjý¤œütÙ—Än/VǘÔn1 ÆÔYŽÞ7Œ©ðzVÉkw%3ެ¾Ü‰;•Ÿzxä<ÑLe5)ä’¶º8(%êS=ÖÇ(!c$¿ b÷ò‹o à=¢Þ;#¯÷Ïl[ŠI Â$cÊÿ$5C­ìI¼×CrSTG~ÉhËÊnu·ô›Çç4û°‰jŸ ¶EïóÝ–~©-,£HW˜p ¦vž¤Œ1F«º<ý~cA%.5Ã4FfŒ! ¤––]sÍ5ºà‚ ².ePº»»õÅ/~Q×]w]ÝqŽãèŸÿùŸõï|GMMMÃTÝÐøá¨ù—‘ïîîB€1ħ¦‰&·iÿêmpí[âwÆMëòâÔ Ä(rÁPj8f ëÁ¦òvSêPiÛf™Ò¤ô·æöË–Wnüþ•-µ;ÔÆ¤_Rö™H &í9Ö¦zŽ`$c$ãuªØ}›Œ·%õ½;trNšÝ¬œkw€±B0V˜¥6•Méì·ÆIÉá˜`9ù>NlgxµcS¿ÚÖô$Ï_+&ÍjÖ̃&”[áØìKl[m=~‘Âá•`|J¦¬ Mu­Î0Õóûx#½Ü^Ò“[‹Ñ{S`„# Óa˜1†0  Êq}ç;ßÑ¿þë¿f]Ê ]}õÕúÒ—¾¤žžžØ¾3fè׿þµæÏŸŸAe»Îó<}å+_ÑW\‘u)€!§¦‰“Ûtd(cw†qÒ1‰`ůüI ÇXçJ[OÛ&IÆS©ýu™î©ñCšw*7c9¹‰)Ǧüa¢ ¥„_ìåÄLõ\I]`Ù^[6ÞÖrÆïL®0(sÆ»úè~Íjqà†i_âÓÞZ&Ú!&|¿‡h×Ó`Hb@&´?qE*t{Ú²¢[¥þð Ýœ£éWë «[j4ìbm7‘{L´ûKpŽ˜¤.0Õóû#!_ÒÓ[‹z©½­£a˜ÆÃŒ1„aQ_øÂô“ŸüDù|>ëRåÕW_Õ§>õ)½òÊ+Á¶“O>Y7Þx£ößÿ:GŽ<ÝÝÝúô§?­»ï¾;ëR#LnÜ”k9>Òí%pqêbì+{œè­që„cªèU@I?«$c¼ž5òvÉo’däNîR~ÊaŠ 5üS–ˆ _dŸ/%S]·»ÀD¶ÙË^qµJ=wJ¦\'`—Lmvô±9-šÜ\ ¥Ä»Á„§»ÉÁ˜Êpkš›Ð5Æ:g°š‚IIÂØ›}Ïhûêõ´%IÍãsšyÈD5s:«Ôæ®Ñ}ñ¨¡ˆLdÚ›€±Î“Ö&ØW]¯,—|éáÍ­êòbU`t Óa˜1†0 É™gž©[n¹E­­­Y—2(===ú?ÿçÿèꫯÖ×¾ö5}ë[ßR.—˺¬AÙ´i“Î9ç=ÿüóY—¡Üæ?Q~üé’ÜpðžÚÇî¾nâ³c_å Â8¡§äL4(g¼N•v¬WnÒ¹-o«?6~Qh5z;]“teu!Q´3ŒBW™øD¡ÀLõw¿ð’J½ª|¯\ÀPŸstæœfÍçZÓ\Çžæ&t‹‘ƒ1ÕF”W¬)­˸Ä×ãÜFsÞ®­{=Mݼ7¾?ýÞádLlz[98ù>&aªîS~¶Â3±Î1F}žÑý‹ÚÒÇ|`4# Óa˜1†0 Í1Ç£{ï½WsæÌɺ”A{ë­·4wîܬË´W_}UóçÏ×êÕ«³.0¹ù¹Ê?Grš‚»å†¯ò‰_ñ“Œ‰+{¼ÂcBC¢ûm ¿·Ø›RjH ÀTVêbâá)~=6’ aì1^ßby…§ÓŠ ‘¼#¶o³š˜‹„Y*sßÈ6©N0&ø'Ž‘"ËVGkl[TÚΗ×E§¶ám¦¶™G»¿Ô–“0Õu»›Lh¿‘Ú‹F÷o,hg‘kF;Â0†cÃêÙÿýµ`Á}ôÑY—2æ=òÈ#:ï¼óÔÞÞžu)€QÂqg)?áÏä8­•ð‹Ý F ˜h0Fá[Û&_-$ûê'²žŒ©³©®ØÏÑÀKe5ú;Eü* ð²±/J ÀXÏ&tuPI¥Þä—þ8È7ØUޤy3›ôΩ¹òºÕ Æî3`Lh[mSޱ6+ñû=$„e!|ŸߞеüÔ8übï7Ñ M´{Le½:~S¯¯7ÔOC€10Lc„aÆÂ0€F&Ož¬[o½UùÈG².e̺îºëtá…ªP(d] `”qœIÊÿS9¹YÕ Ás(¸’Ð)ƾj(ÈÄ$…c‚ÓÔY²+¿·Ä/ò ï¶w˜ðÕD¡«€Êÿák[ÝL¨3Œ$¿O¥¾»ä{ëvá½v×»¦äuü̼U§µŽÞFƒ1 ‡gl« Šn¯m®¬Ç2‰3ÜFÓÞ”¹m´jù)<§Ow“Ã/ååx¦zƤ.1Õç7»<=¶µ(KÆ Â0†cÃ"ŸÏ몫®ÒßüÍßd]ʘó­o}Kÿöoÿ–u€ÑÌiV¾ål¹ùÊêv}‰c*ÿ¤t)\B¿ÀljlH ÆÄÇD4ü¹Á$I¾Ô6'…_ìcR0Õ1Õ „ü•ú~'ã·5*°4ÑÕ÷iR®2· u‚@0&©kL°+% c:€én|€i4áM˜îÖ¦ºiÝ`ªË‘ð‹µb`¢]`ìPÍ:<=ßVª_#FÂ0†cÃãßø†¾ýíog]ƘP,õ…/|A×\sMÖ¥ÆW¹æÓ”kzWy5!c?a—ÔLtÙÈ$ïïÚ…ß[êýþ`]¤äàKhH´ûKy¹^¦:Þ÷6«Ô§dzÿCnV‹«ÌÎk|Þ‘ÝÝ´6µMÆ$n«çXËñ×Këzº+S])iº›Þ5|ÿ“>õ5&iÚS ÆÔ1¾‘žÜ^ÒëÞ®½Œh„a# 3Ɔ Ö_þå_êW¿ú•š››³.eÔêèèÐ'?ùI=ôÐCY—cÜüqÊ5Ÿ(ûâ ÆÁ)ˆI\®J Á¤ßIwW„Â.ÁÆÈB,ø_®Ýפ<ÛãŒüÒ›ò %q‡\I&å1»ISšÃsÙè½kΚŽ m·×ã“Ú¡šçÚC0Ñà‹µ ¿T6Ô¦»&a[¼ƒLÁ7ztkIë{ý!{YÃ4FfŒ! اžzªî¸ãM›6-ëRFµk×jþüùzùå—³.0F¹¹#”kþ°¤\åª:Á˜”mñ€LõÈbʆH ¿X+Ñm‘+„bá{9òîcä—^”W|,^`Dhq¥ÓöiÒ¾ã\IÑ鬓<ÕMÇÔžœÄPŒõfŸs€Lâ|6²)‚ Y¢cMd\{W Ñt{F¿ßRR[ù.ÀXF¦1Â0c aÀ®:âˆ#´páBtÐAY—2j,]ºTgu–6nܘu)€1Îq÷S¾é,ÉW»‚§–ˆ©…]bûÒ—†!˜„ßXú³KâOi ™È]t#·¿Uúr4S~öåŸï-`±€¬äé¤y<±ˆ©¥WÂSÜ:á˜Êxë)!ã¤OwQ8übÂÛ*+ñõÚ–ø4×DŸ†»È©­hôð–’º=®ùëÃ4FfŒ! سgÏÖÝwß­ãŽ;.ëRF¼ èüóÏWWWWÖ¥öŽ3M¹¦sä8S**ÿDžC!'t‚äeû\)íAƒ|O°/º-:(zÒÂ/örQ^ñAùþÊAÖ ÈÒ{¦ätô”\x*ë8uîù ÇÿTד[Â$Ýb—˜ÄÅІúÁ—ʈ¤F¨•9n4³¡ÏhÑö’ŠþnÖ€Q0Lc„aÆÂ0€Ý5aÂÝpà :÷Üs³.eĺòÊ+õ¥/}Ižçe] `¯3A¹üYrÝÙåUǾ¸'²l]ᓱϑ¶>”’~“0Ñ+ˆLd³ mOÂô¨T¼WÆlâ¢ÃáÐVW'LË•ƒ,Ñ{?H Ã1JØìIl~š2ÿ­n®sYIÚY÷¾&mú„]ìíÑŽ0+º}=½Ã«WÆÂ0†cÆ‚뺺üòËõå/9ëRFcŒ.¾øb}ï{ß˺À^-¯\î 9î\IÖE?Ië)= “´?Á`B2õ~{°¯ø ·¯ª,Ô]®]Hdüòý{dÌÎ×qæŒstÊŒ¼šYS]'ej޳¤ßë!=(³»’:¡ÆŸÿ#’ï÷`‚½¡ið²O/wÒ`oC¦1Â0c aÀPúÊW¾¢üàr]7ëR2×××§Ï}îsºå–[².IŽ\÷$¹îŸTW«ÿDÂ1µíÉ™èØð1Cq‘Pøgˆèmp­…Äà‹½nºÅHÆß Ï_(©÷‹dnZ“£ÍÈiB¾27 þiޱ7œö¦Hšäòº„û>„:¾DÇÔ ¿”—|#=µÃÓª^®ï؆iŒ0ÌC0ÔþìÏþL×_½ÆŸu)™Ù¾}»Î=÷\-^¼8ëRqwËuç©vUõ»ˆ ´$„bB‹IÛ¢ú»KÂoI¡˜ºÛ’Ã/¡ ‰Ì yþÃ’¼Ö &ä¤NÏiZsuZëpšÖ%&º/´Úî$ï ]J ÁDwÛÁ—Êz4ü"Õ¦¼ýžôøO[ \Û°·" Óa˜1†0 `O8þøãu×]wiŸ}öɺ”a·bÅ ÍŸ?_o¼ñFÖ¥ÈqVÎý°¤|ÒNk9ø'²+¥[Lê Ö)¦áOÉ!˜X÷{=åw ß,•ï?Ýè£T“#<-§}[¬ Lhšëħ´±)nÂÛ®\^˜~ VLl[|š¿ØËݞѣmžv–v¡6Œ„a# 3Ɔì)sçÎÕÂ… uøá‡g]ʰyòÉ'uî¹çjÛ¶mY—@]Ž3[9÷c’ØÙÕ‰ü~í“2l`W …wHþÂă3þ½Â—ï?.ß¼:Àñ€ÑÊ‘tÜW¯b¢]P£sW'½!jl%uSª´)nâ¾`ê›|©¬®o/=¾ÃWŸ?ˆ¢0&†iŒ0ÌC°'MŸ>]wÜq‡N9唬KÙãn½õV}ö³ŸU___Ö¥0 Ž&ËÍ%GS‡àd{à÷•!ù=¢(Ï@Ƭ‚sF‹£&::ºÕµ½Ä;ž*áÞ)7yH¹'ÄÀÄÂ/õo ‘| ެ¬¯ï÷õT‡‘Çå|a˜ 3Ɔìi---ºúê«õéO:ëRö˜ïÿûúêW¿*þw`ôiQÎý˜çmY²tËóÈ:¸ÀÞèíã7É‘ëý_Êœp®%)$Þ>´Ò:¢ÆB1Á?ÕåZߘ½FË:Mrçì•Ã4FfŒ! Žãè’K.Ñ׿þõ¬KRžçéË_þ²~úÓŸf] »!§œ{šçY2dŒÙ.Ï_ ©+ëRšÕäèÄ)Žš…C0•V/¡«úÍ_ÒÃ1öŽäkëÒ.¹³/µm&ÞM¦²ÉHúC—¯7zë €½a˜ÆÃŒ1„aÃé /ÔÏ~ö3åóù¬KÙmÝÝÝ:ÿüóuï½÷f] CÂuOë›u»Í˜uòüû%².0LÊI'Ov41'Ù‰'øÇZ­8uÃ1»*èïb¢Ûj+áLyÍ3ÒsFë™î a˜ÆÃŒ1„aÃí£ý¨n¹åMš4)ëRvÙÆuöÙgkÉ’%Y—Àr£äºäf]Ê.ñÍkòýE’ü¬KŒ -®tâ$GÓòi!§A0&.íJúW×Õ ÀÄZÄ[ú}éÉN£¥z'ÀÞŒ0Lc„aÆÂ0€,¼ûÝïÖ½÷Þ«ýöÛ/ëRí•W^ÑüùóµfÍš¬K`pœ•sÏÔ”u)ƒâûÏÊ7/d]`„Ê9Òq¥·5KA×—¤LÃðË`®14Ö¿‰»âû"Á˜Î’ôT—ÔÍ}Pa˜ÆÃŒ1„aYÙo¿ýtï½÷êÝï~wÖ¥ ØÃ?¬óÎ;OY—Àå83•sçKš˜u)àËó–1od]`„s$=A:¸%²=vÙ`<,3dLrD&é²¼í%é™.©À%{h€0Lc„aÆÂ0€,Mš4I·Ür‹>úÑf]JC×^{­þîïþNÅb1ëR&­Ê¹óå83².¤Ž~yþ}2fCÖ…F‘CÆIï?ø¬K<4Sßî\j·® -é–h€ Ó˜›u`ìèììÔÙgŸ­_þò—Y—R׿ÿû¿ë¯ÿú¯ Âö2]òüßɘuY’ȨSžwAÀ ­ì“žë’¼A†UŒÜcW½Þ'=ORt†cè )¾þõ¯ë’K.‘3Ø[éìAÅbQ^x¡~ýë_g] r座ÊuŽÈº€1[äù $õf] `›–—Nh•ZFÈÏÔFÒ‹=Òªþ¬+ÀhCg˜ÆÃŒ1„a#ɧ?ýi]}õÕjiiɺuttè¼óÎÓÃ?œu)Œ®ó^¹îû³.CƬ’ç?(©”u)€1`¢+Ík•ZsÙÖQ2ÒsÝÒæb¶u`t" Óa˜1†0 `¤9å”StÇwhúôé™Õ°zõjuÖYzå•W2«€‘ÈqUÎ=M’›Éëûæ%ùþb•ï• ÀÐhv¤ã[¥ùl^¿Ï—žê’:¼l^£a˜ÆÃŒ1„a#Ñᇮ èàƒö×~á…töÙgkÓ¦MÃþÚŒŽ3G9÷LIÃÙÙÕÈ÷Ÿ’o^Æ×ìM\Iï™(íß<¼¯»Ó+azýá}]Œ-„aËæVo`¯²|ùrÍ›7OÏ<ó̰¾î=÷Ü£SO=• u³Ažw‡Œ:‡éKòüû Âö(_ÒóÝÒë}Ã÷š[ŠÒca€á@ ‹-[¶èCúî¸ãŽay½Ÿþô§úÓ?ýSuwwËë0šíçÝ&c¶ìáWê•çß%cÞÚï@Ù«½Ò²Éìá×YÝ_îSÚÓ/@a0Œz{{õÉO~R?úÑöØkctÑEéïÿþïåyÞ{Æž^yþ2fÕ9»Q»<ïv³yœ€4«ú¥§÷`På½ÒÒaܨqŒá‚%Žã¬’ôö¬ë ‘/ù˺üòËåºC—ÍíëëÓg?ûYÝzë­CvNö>Ž\÷$¹ÎÑCvFc6ÊóJê²s0XSrÒ¼ViÜýLíKZÚ-­- Íù€*cŒ“u #a˜1†0 `49÷Üsuà 7h„ »}®mÛ¶éãÿ¸žzê©!¨ ¸ÎŸÈuO”´{¿µ³Bžÿ°$:¸²7Þ-b&çvïúh]vÙeú¾ µk×f]°8š&£Y—ÀÊ9R³#õrßd„0Lc„aÆÂ0Œ^„as³.(Â05Ã`Ô €Qƒ0 F Â0àÿ³w/½QÝi‡_—/Ø ˆ- á_08$Q‰€¢ …(õ¦¥ÙÌÖÒ,æÌj6³Íìø-B"%³É*Šf“6‡0@¸$CÂe¸È‚m\³@¨™¤Œ«Õ‡œóv?Ï:¯þªãÔy«~§ 1 iˆaHC @bÒÆ€4Ä0¤!† 1 iˆaHC @bÒÆ€4Ä0¤!† 1 iˆaHC @bÒÆ€4Ä0¤!† 1 iˆaHC @bÒÆ€4Ä0¤!† 1 iˆaHC @bÒÆ€4Ä0¤!† 1 iˆaHC @bÒÆ€4Ä0¤!† 1 iˆaHC @bÒÆ€4Ä0¤!† 1 iˆaHC @bÒÆ€4Ä0¤!† 1 iˆaHC @bÒÆ€4Ä0¤!† 1 iˆaHC @bÒÆ€4Ä0¤!† 1 iˆaHC @bÒÆ€4Ä0¤!† 1 iˆaHC @bÒÆ€4Ä0¤!† 1 iˆaHC @bÒÆ€4Ä0¤!† 1 iˆaHC @bÒÆ€4Ä0¤!† 1 iˆaHC @bÒÆ€4Ä0¤!† 1 iˆaHC @bÒÆ€4Ä0¤!† 1 iˆaHC @bÒÆ€4Ä0¤!† 1 iˆaHC @bÒÆ€4Ä0¤!† 1 iˆaHC @bÒÆ€4Ä0¤!† 1 iˆaHC @bÒÆ€4Ä0¤!† 1 iˆaHC @bÒÆ€4Ä0¤!† 1 iˆaHC @bÒÆ€4Ä0¤!† 1 iˆaHC @bÒÆ€4Ä0¤!† 1 iˆaHC @bÒÆ€4Ä0¤!† 1 iˆaHC @bÒÆ€4Ä0¤!† 1 iˆaHC @bÒÆ€4Ä0¤!† 1 iˆaHC @bÒÆ€4Ä0¤!† 1 iˆaHC @bÒÆ€4Ä0¤!† 1 iˆaHC @bÒÆ€4Ä0¤!† 1 iˆaHC @bÒÆ€4Ä0¤!† 1 iˆaHC @bÒÆ€4Ä0¤!† 1 iˆaHC @bÒÆ€4Ä0¤!† 1 i´5²g`ãããoEÄ?EDïrÿí•+WŽ<~üxÕ‹Ÿª¹{÷îÅÄÄD,..–5Âs­Y³&êõztww—=ʲîß¿'OžŒ………²GijõêÕ±cÇŽX¹reÙ£,kvv6&''ãÑ£GeÒÔªU«bçαjUi—nË>|§NŠ”=JS===Q¯×㥗^*{”e=zô(¦¦¦bff¦ìQšZ±bEÔëõX»vmÙ£,knn.¦§§ãÎ;eÒTggg¼öÚkÑßß_ö(ËšŸŸ³gÏÆ­[·Ê¥©ŽŽŽØ¾}{ ”=ʲâܹsqýúõ²GiªV«Å¶mÛbÆ ÑÖÖVö8Ïõøñã¸xñbüøãeÒT[[[ŒŒŒÄæÍ›+–‹‹‹qéÒ¥¸råJÙ£,ihh(+–F#®^½/^,{”%mÞ¼9FFF¢V«ö30F\»v-Î;Wö(Kzå•Wbtt4ÚÛÛËå¹Fܼy3Μ9Sö(KZ·n]ŒEGGGÙ£>Þÿ-ݼúê«/v ,..ÆÄÄDÙc4uäÈ‘_nxªV«Å7ß|SöM>|8Ö¬YSö-[¹re|õÕWeÑÔûï¿Ÿâ ØS½½½ñå—_–=FSŒÍ›7—=FËúúúâóÏ?/{Œ¦Þ~ûíØºukÙc´lÆ qâĉJ.Mßzë­ØµkWÙc´lÓ¦MqüøñJ.MwíÚ»wï.{Œ–mÙ²%Ž?^ɥ騨Xìß¿¿ì1Z688Ÿ|òIÌÎΖ=Êo Å{ï½Wö-ŽÏ>û¬’áÆãСCeѲááᘙ™‰7n”=Êoô÷÷ÇáÇË£e###1;;[Éè­··7>ú裲ÇhÙÈÈH<|ø°’_¾éêꊣGV~YúÔÈÈH,,,Tò #µZ-Ž9Rù/Š<Ë®¨8ííí•Ý}øá‡)>D~Ê®¨8vEű+*ÎúõëãĉQÅÂíÞ½;vîÜYö-³+*Ž]Qqª¼+N·+:qâD%¿fWTœþþþøàƒÊ£evEÅyº+úþûïËå7º»»ãèÑ£eÑ2»¢bUyWôñÇÛ$Û®¨»»;¾þúë²ÇhêСC±nݺ²Çh™]QqúûûíŠ 200Ÿ~úi%wE{÷îz½^ö-Û¸qc?~<?~\ö(¿aWTœíÛ·Û¤€]Ñ?4J«þ8>>þƱcÇþûwþw[ñQDü:z7ÏÐ߯¾ˆ¨öãY~¥ª7Ø•:˯UuÞZ­–êæ?¢ºgéβª×xD¤x:˳¼.‹ÓÑÑQÉ&"ßYvuuUö,³]ãU>Ël¯ËÎÎÎÊže†§Y=«V«Uö‹èÙ^—mmm•}’f¶³Œ¨îû¢ŒgYÕ×eOOOÙ#üŪüº¬êßò¥Tõ>Ò®¨8µZ-ÅÓgŸUÕ¿—ùþÿSÕk<"ß}dU¯ñˆ|¯ËöööJ~¹!"ß}d•÷Ù®ñ*Ÿe¶k¼Ê»¢lgé=Qq슊UÕ÷Eβ8===Ñh4Rí8ª|g:LjêÞGÚÇ®¨XÙöëU½Æ#òÝGVõÈ÷¾¨£££²»¢lgéž¼8vEÅñº,T÷_|ñ¯mmmÉ“Sþ¥Ñhüï ›èÏšýÜzW[UÿÀógãããÿÿË^wîÜy­Ñh”v7qýúõ8yòd<|ø°¬žkpp0víÚe²¬[·nÅÉ“'ãþýûeÒÔ¦M›âÍ7ßLqózçΘ˜˜ˆ»wï–=JSëÖ­‹½{÷¦¸ázú“Å·oß.{”¦^~ù娷o_Š7÷ïßÉÉÉJ>!,âÉ“:ÞyçK•Ä©S§â§Ÿ~*{”¦V®\Hñ“ÅOf÷‡~({”¦ºººâàÁƒ)ž 477ÓÓÓqéÒ¥²Giª££#8kÖ¬©ü$óóóñÝwßÅùóçË¥©Z­ï¾ûnôõõUþ,âÂ… ñí·ß–=Ê’öíÛ—âgvãâÅ‹1==]Ù…Êž={bÓ¦M•þð&âÉY^¹r%¦¦¦*ùô ˆˆ7Þx#†††*–F#®^½SSS1??_ö8MÕëõ­ô‡7OÎòÚµk199YÉ'1EDlݺ5êõz¥?T|êçŸމ‰ »¢ØçöíÛ111QÉ' G7&†žœ†Ý.€§§Øí€ºÖÚÖ–$Y[]ݹV©Tv>—Ëåt´·gqq1½½½K’”JÎg«ÕjúÀÏ& ³Ÿè.?CwwWÞyçÝü×ýgfgg“$•ÊöÎýr¹”¶ö¶´¶µ¦±±1)’îîîûkk«úÀÏVÚí¨‹‹K)Š"çÏ_ع¶½ý×0L[[{sâÄH677ÓÛÛ›þþgv­=Õz€½Éd˜}ÅQkÀ¿nmm-333éïïOGGg>|˜••ÕT«Õ”J¥ô÷÷gii)mmm©Õj9x°?CCCI’J¥’ÅÅ¥üm¿¢T*¥©©)ëëë»´# ™ À6>>ž$9sæL’dss3cccI’îîîtuu¥¹¹9ijjÊ3Ï<š 355•J¥²ó;år9¿ùÍoÒÒÒòt7Ô=“aösa€ŸëÎÄD~õ«_åĉI­–ËŸ}–ë×®edd$EQ¤¿¿?---Y__Ïv¾w÷Î^EcccÞ~ûíÔjµ,.,èa?‰É0ühÛÛÛÙØØH’œÉ¿ÿû¿§R©äÎÄD’¤««+ innΡC‡’$ÓÓÓ¹uëV’¤¥¥%ïðAö÷çÊÕ«»³  ®™ ³Ÿ8V ølnn¦(Š´´´¤­­-o½ýv>ûìrާT*¥V«¥µµ5¥R)›››ùøã?§–ZÚ;Úóî»ï¥µµ%•J%Ìé_?™É0ühår9Y\\ÌÊÊJFGo¦§§'##'såÊ•$IQihxt&ÛW_}•µµµ´··çƒþ-³³3ùæ›o2??Ÿjµº›[ê”É0ûŠ£Õ€Ÿ¦¯¯/§NÊ'Ÿ|’ííí466¥\.§Z­f~~>wîÜÍúúFΟ?ŸÿøÿÈúúzN:•¦¦¦looç›o¾Ikk[Þ~û|ñŹuëVÞyçÌÍÍEïøWÃðw-,,¤¯¯/GÍØØØÎõ™™™´µµecc#£££9wî\Ο?Ÿ?þñ­+•Jy÷ÝwsùòåLOO'Iz{{3::úÔ÷ì Â0ûˆ³Õ€ŸªZ©dyi)ƒƒƒÿ›ËæÆFVWVrxh(7oÞÌÜÜ\ÒÜÔ”ÍÍÍu'ŽÏÌôtf¦§S*Šôõõ¥©©)ææë]”ËåT*•§¸3 ^ Ãì'Ò0À¿`k{;I‘ßös{b"ï½÷^Ì?H{{{Š¢ÈÐᡌ'IJ¥rΜ=›/¾ø"#'Ofll4Ï>¥¥¥¬o¬ïô.FFF’½¹+ûêKi· àÿß¶··ÓÒÒœ$ÙØØH¥RICCCªÕJsôèpÚÚÚ’$çÏ_HssK’䥗^LKKKzzz2:z3ÌôôT’¤³³3ï½÷~Î{!·nïÊÞ€úc2̾b4 ðÓ­¬¬¤±±)I‘Z-Y^^NWWW’"W¯^Íû￟µµµ´¶¶¦¹¹9ƒƒƒ¹{÷nNœÉòòr¦¦¦’9þBjµZÆÆÆsúôó9wî\J¥Rþò—¿¤R©F/ø1L† IÒÓÓóƒ×gggS*•ÒÔÔ”äQ¦¯¯/É£I1ããã­_]]Í¡C‡REÊårš››322’¡¡¡ÌÎÎæµ×^Û Â¬¯¯çæÍ›Ot_ÀÞb2Ì>â,5àyã7òåÕ«™˜˜xìúüƒ©V«éèèÈüƒ™ŸŸÏÑ£GÓÒÒ’¦ÆÆÜ»w/§OŸÞY¿º²’£GŽ$y¤Y^ZÊû|$éîîÎÜÜ\*•Jz{{síë¯S­Tô1€Íd’$ããã9{î\ÚÚÛ»^©TòàÁƒœ8~r$ÝÝݹqãF*ÕŠ𓘠@’d}}= iiiÉ{⦅gž9´sozz:“““yíµ×SE&&&ÒÙÙ™ÖÖÖlmm§(%ZVVV20ðè{ihhÈÄĬ­­&Iº»»S*=jQ>å{É0ûŠcÕ€§±±1o¿ýv>ùä“ܾ};IòÅ_ä·¿ým^ý\¾|9§OŸÎéÓ§sûöí¬­­¥¥¥%«««…hªÕj8Z-IŠ,..å7¿Îôôt–—Fÿø©„aö­$àŸùnjK­VKQyñÅsïîÝT*•¬®¬äøCÞ~ûí¼ýÖ[¹}ûvN:•#Gޤ½½=I²¶ºšÃ§Níü^CCCFoÞL­ZM‘ääÈHZ[[óÙgŸé]ÿ’ÒnÀÓÕÜÜœ‘‘‘Å÷ã(ß]«V«™››KSSSž}öÙû óóùǦµ­-ÇŽK’tuu¥\.ï¬ùÛÏ÷îÞÍÜÜ\300ó.dvf&“÷ï?©í{œÉ0û‰ãÕ€$›yîôétuwå³Ï>{ì^QyøðaÚÛÛ3==•¶¶¶<æLîܽ“•••$ÉâÒbþó?ÿß¼ôÒKzìûµ¿ù|íڵܽ{7¿yóÍLMMæ…Îgbâv._¾œZjzÀ¿Äd€}èÖ­ñŒŒœÌ™3g¾7!fii) ó©Vkùúë¯233“—_~eçþààPóÑGå£>ÊÆÆz’dss3MMMI’™™é,--å•W^ÉÜÜ\^xá|îÝ»›O>ù$•Jåk*Šâ§Õü-a€}èÖ­[I’3gÎæ·¿ý_9x°?IR©TÒÒÒ’ÑѱúÁûKfÑ:þÖÂÂBúûû3;;›¶¶¶œ>}:›››ijjJ¹\Ne{{§¿ðÕ—_æÈ‘#9}út¾úòË<˜›Ëàà`*ÛÛihxÔrZZ\LkkkªÕjZZZRE._¾œñ±±$ßïU477çÕW_Í3‡åÆ™¼_?ø§„aö±¢(R.•23=™¢ÈñãÇ“$Cƒƒ™˜˜xlíØèhNž<™Ñ›7344”…ùùÿ›I0[[[IM„™ÍåO?ÍêêêÎýžžžtvv¦­½=ímm940–––ܾ};W¾øâÉoØ„aöG©?à@oo&§&399™ÎÎŽôõÌñÇ3qç¯a˜Æ¦Æ¬ol¤V«åÌÙ³™žžÎ‘#Gv¦Â,//§åÛ©0ŸþyÆÇMƒihlÈððpNœIWW×>ÿÆëúÀ& °ÏU«Õ´··§R©äË/¿ÌÉ“Ïfhh(Ï?&_ýU’¤££#ÃÃGSÉððpnÞü&MM©Õj)Š"W®\É277—ññ±´µµåÔ©ç2<<œ†††T«ÕÌÍÍfii9ÝÝÝéììLccc–——³´´´Ëo¨'Â0ûŠ#Õ`¿jllÌ… òé§Ÿ¦V«=vojj*ÛÛ•lllfmm=/^Ì{ï½—3gΤ\.çêÕ«ÙÜÜJ­–”ËÚK/½ôr®^½šwÞy'£££™œœÌàà`®_¿žãÇOäüùóihhÈ;w2>>ž¤T*e`` Õj5½½½I’»wïFø)„aöm$Ø¿¶·¶244”驩ܹs'É㽃µµµlomíüÿÉÅ‹yÿƒròäÉ,/-}˜ÙÞ™ÓÛÛ›Áܽs'c££)’ܸq#Οϡ$ÉÖÖV²¹±‘j¥’r©”æææ;v,IR©TrûÖ-= à')ív<«««9yòû×WV2qûvŠâ¯±”‡æóÏ?O¹\ÎÐÐP8û÷î=¶æÙS§299™ååå´¶µå½÷ÞÛ Â$¦Ñܸq#KKKI…cÌÍe}}=IrõêÕ¬®®>©í{”É0û‰cÕ`_[]]ÍÀÀ@ºº»³´´˜Jµš$™œšÊÆæÆ£EÓO¸sg"9yòd›šrçÎŒåèÑáT«Õ466æÂ‹/fîÁ\ÒÔÔ´óÝ……ù\¹r%³s³;¿Ù××——_~%™™™ÉèèÍïõ/Š¢H­V{’¯¨s&ÃìßMaJ’¬­=úaaþ×wvvæÎ‰Ü¾}+Ì™3g²¾¾‘«W¯äáÇIMéííÍ¡C311‘ñññ,,,ì\;sæl^xá|Z[[³¼¼œK—.=ö¬¢(òüógÒÖÖöËmØ“„aö‰­­­$Éàà£àÊêêZ’GA”¿õÝÿKKKéííÍÌÌl&&n§¹¹9LQ”rïÞÝ$I¥RÉôôt<˜$©Õj©V«ÙÜÜL¥RÙùÍññ±E277—?ü}Ö××vîuvvæ½÷ÞKggGVVVžÐ¢a· àé)RüóEÀžÕØð¨5ÔÝÝ“¶Ö¶¬};)¦³³+óì¬+Rdxx8wïÞÍ­ñ[9räH666399™þþþÌ?xácÇ’$÷ïßOoo_ÊårjµZ–——søðálmnfòþdŠ¢È±ãÇóüéÓ¹s÷n®^¹’Z­¶Ó·812’sçÎe}}=W¯|¬ŸüSÂ0ûDCcãÎçãÇ端¾ÊÚÚZúz{ÃEš››óÎ»ïæ“‹sïÞ½œ9{6«««Y^^ÎÈÉ“;‘•ssÚù^WWWfgfòàÁƒ|˜jµúô6ì)Â0ûŠ#Õ`¿ú.IJººšJ¥’¥¥¥tttäÕW_Í¥K—òþûïgxøXnݺ•$)•JinnICCc._¾œ—_~9µZ- m/MOO§¡¡a'h³´´”ÅÅ¥<ÊÓ©Õ’µµõ¬­­'™û?*z¼oÑÔÔ”¶¶¶,,,<¡7ìÂ0ûˆ( ì_Û[[I’‰‰‰èéÉj’Û·nå…óçsôèÑŒŽŽæÌ™3¹ï^¶¶¶R*Š=z4CƒƒÙØÜÌèèhº»º²¾±‘Ç'If¦§sî…vž188˜ÆÆÆŒŽfrrò±)3OQ9vüxžþù\ûúë, ÃÿDi· àÉ+•ËI’Þ2~ëVÌÍett4w&&òì³Ïfvf&µZ-¯¿ñFÊårªÕjôô¤³«+ÌÐÐPÊ H’Ôjµ,//§½½}çËËËÍÔÔÔ Â´´´äÍ7ßÌ… ÒÔÔ”õõõ'³y`O1f?1ö­††Ga˜C¹üÙå,//¥(ùü/Ÿ§«»+/¾ôb>ýôR^{íõ¼þÆëùòË/³°¸˜½½ÙØØHGGGjµZJ¥Gg­ÍÏϧ©¹)IR­V³¶¶–J¥’ÖÖ–465fccãÖ300—^z9EQdjj*ÝÝÝ™šžÒÏþ)“aö¶¶¶$ICCC†‡‡³µµ•Z­–J¥’?¾˜††Æ<ûì³ùóŸÿ”zsúôé”Ë¥466¦©©)³³³immMQü0ËËË9Øw0½½½iniIËÿñ÷Ý4™$ÙÚÚÊØèh®¬d}}=÷îÞÍ_|¡ühÂ0{\___J¥RVVVÒÐÐÅÅÅlnläW¯¾š?ýéO™›}4ÕåúµkéééÉÙsçrñâÅ|üñÇyíµ×ÒÒÒ’õõõ´´´$IîON¦V«¥T*e`p0o¾ùf›š{æÖÖV¶¶¶²´´”­­­llldjr2“““©V«©ÕjiimÍÕ«WS«Õžú;êW¡¹° :4äþn×<]gÏËÉ“'S©T255•j¥’›7oæõ7ÞHQùýï~—$IcccÞ~ç´¶¶æøCZ[[óê¯R©´ó{ßhÞ|ë­8p «««¹5>žù……¬~;ñåïõ Š¢HoooæççS­VŸÊþ€_܉ɩ©ñÝz¸É0ûI±Û»¡§§;IrÿþýtuuåÆëÙÚÞÊÅ‹çÍ7ßÊ+¿úUþô§R«Õ²µ½•?þsÞyçݼúë_çßK—>ɯ~õjJ¥R6773;;“çž{.ÈÒÒR¦¦&“¢H¥RÉÆæFj©}¯/ÑÐÐgŸ=•ááá\¿~-sæ’";Sg~¬Ò?_@=+—Ë©Õj™™™ÎÜÜ\Š¢ÈÚÚZòÙg—sðàÁ<÷Üs;ëWVVòÉ'ÓÖÖ– .drr2ŸþY’dròÑúãÇO$IÚÚÚÒßߟjµšÍÍïM{ihhȉ'òoÿöÛœÏûìò®¼ ~ Ãì#EŠÝ.ØÕj5¥R)ûfjj*WVR*J©ÕjI’ׯ§­­-¿þõ¯óÉÅ‹éèèÈÊÊJ–—R­Vó ç³0¿Éû÷37;—‘“'“$9qbä>wa~>£cc™šœL­VK{[{Ž?ž–––\¿~=µjMøI„aö¸é©©ôôôdss3ëëë©U«ß[ó—Ï?OScc^ýõ¯síÚµ ¦»»;ó¤ïàÁ¼üÊ+ùð÷¿O’ôôô$yvyøðaró›oR­VS.—S.—ÿú¬o7É£É1ÃÇŽåСC¹uëV®_»öt^°§Ãì'U€}irj2Ï>ŽÎÎlMÜþÁžA-µ\úôRÞxãœ>}:›››Y^^NWWW’¤¹¹iç{ÝÝÝI’íííllldzz:ëë©T*ßÿáo¿344” ^LCCCÆÆFsõêU½ à_RÚíxrìÏúúzVWWÓÓÓý×V«Õ|üñŬ¬¬¤¥¥%H¹\N’¬®®%Iš››ÓÖÖ–Z­š††Gç®ÍÌLÿp&IQ”22r2.¼˜¤–K—>y„ø™ °‡9s&ss³¹ÿ~FFFÒÚÚšµµµÇÖtvv¦R©duu5ÛÛ[ùä“‹yçwwÂ.I²¼¼œ$Jò(ä²½½•jµšcÇŽåîÝ{ÙØXßYßÕՕÇäðáÃiiiÉââB.]º”ÕÕÕ$I{{{Š¢ÈÇŸô+öa˜}¤H±Û%OQcccººº²¼¼œ/¯^Íàà`Ž ˵k×[÷pùaž?s&³33)•ËY^ZÊÕ+WòâK/í¬™ð EŠ9rdçÚÂÂBfggS«V3<<œ¦¦¦455¥««+IM›Ë×_}•jµš†rCN>ûl†‡‡ó»ÿú/ý à'†Ø£ö÷§(…M¶¶¶òé¥K¹ð⋹~ýzjµÚcko\¿ž7ßz+÷ïÝË©S§rk|<ËËË;¡–¹¹¹´µµ¥§§gç;ýýýéïïìw666²º²’;™››Ëääd¶··“$‡röìÙ455åâÇï\ø)„aö¨g¾ ª´µµ%IóñŸÿœ–––¬­­=¶¶R©ä³Ë—óö;ïäáÇyñ¥—vÖ¬¬¬dmm-ÃÃítou5kkkY__O¥Ryìw3tøpŽ9’þþþ¬¬¬ä¿ÿøÇ<|øðInØÃ„aö“b· ž¦¾ƒ“$===)•K©V«ÙØÜxtóÛ¾Accc’¤©©)Ë—óõ×_åìÙsI’ÖÖÖ$ÉÌÌtR$­ß†j>|˜O?½”åååï?´HÚÛÛsèС<óÌ¡8p ¥R)•Jåÿcï>»ÛºÒ4aߘE*˜Ê²$[Ñårê®îžžžùá3³ÖÛÓÕå*gå,QsAx?P‚E‰ÓU%Šæu­e 8gŸ½ŸðöºÏ“±±±\¿~-ëëëö-€ÿ2a€ß ¢(Úa–R©”ÁÁÁÌÎξ1n}}=‡Α#G21ñ<+++™ššÊþAš$yþüy’dff:ß|³gÏž¥Õj¥R©¤¿¿?½½½éééM__oÒÛÛ·eGåÆë›!€¿’0 ÀoÐË ÌKûöíÛ6 “$OŸ>MµZÍ¥K—255•®®®ö¹f³™™™™$ÉäädJ¥R<”#GŽäСC)•J[æZ__ÏôôT††ö¥\.çæÍ›¹sçößøî€½Lf)Rìt À[ÒÝÕ½åý¡Cïåþ½û?9þÞÝ{)¥|ðá‡ÙØØhŸžžN³ÑLoo_>ýôÓtww§££#ÉfPf~~>³³³™Ÿ›ËÜÜ\666òûO>I©TÊ÷ß}—ÇÛ£þ¦„a~ƒº_é ³²²’áááT«Õ¬®®þä5wîÜI©\ÎéÓ§³ººšjµš©ÉÉ$É|þþþ4ŒåÉ“'™Ÿ›K£Ñh_?44”øÇLGGG¾úê«<Ÿ˜ø±žîî e||üïp·À^Rúå!ì6]]]í×óóóI’ÑÑÑ_¼îÖÍ›¹ï^ª/Â4“SSééíÍèèhZ­VÆÆÆrÿÞ½ÌLOo Â=z4ÿø‡?¤T*åË?ý©„éëëËG¿û]þíü¬¬¬ü-oØ£t†ÙKŠ.x[^ Ãtvvfcc#‡ɽû÷~ñÚ7o¤¯¿?YZZÌùó²±±‘›7o¤Õj¥·¯7ÍV3+++éèèÈùóçsôè±<{ö,×®]ÍÚÚZR$ÇŽÏåË—“$÷ïßËÂâ‚ý à¯& ð´±±Ñ~]­V3;;›¤··7ËËËís==½Y]]M«ÕÜr}­¶šz½ž$)•ŠÌÎΦV[Ëääd{ìÑ£GsîÜù$É×_ññg)Š"Ì™3g24´/Éfgš7nþ]ïØ;„aöZ€½c½¾Ö~=ùüy:::’$‡GçÎÛísµÕ•œ={6÷ïÝËÆÆFŠ¢H«ÕÊã±±T«ÕIf¦g2¿p?«++I’þþþ\¼x)ÃÃÃyöìi®]½šz½ž"ÉþýûsôèÑ &Ižs&'NœÈâÂB¾þê«LLL¤««+ïŸ>“ãÇŽ¥ÚÓ“$Y^^ÎÕ+W2==ý²ˆ·wóÀoš0 ÀoP½^o¿®Õj)—Ë™|þ<£‡§¯¿?K‹‹I’J¥’ååå<Ëþð‡Ü»w/ÿü/ÿ’‡æÁýûI’R©”“§Nåý÷ßÏôÔTþóL«ÕÊðÈH>ýì³8p EQ¤^¯çáÇö,333;rßÀoŸ0Ì^âk°gÔÖjíׇÊýû÷3>1žÑÇ3::šÛK‹)Š"½}}IZ)JEææærîܹT*•tww'EÒÙÙ™Ï?ÿ"ÝÝÝ™M©\Îÿð©T*Y__Ïììlnݺ•ÙÙ™ÌÍÍ¥Õj%IŠRÑ~ ð·$ ð´¾¾žV«•¢(288˜õ¬­­eiiq3 sûV:::’´rüø‰wþ|æçç7/.æé“'9{ölÖ××S®TòôéÓttt$IÆÇÇ3<2’ÎÎÎ çŸþùŸ300°eî¢(2´o_N:•¦\.gll,333oï€=©²Óð;]ð6-,þ†Îá#GòäÉã$Éí;·óßþÛ¿æÔû§299™Fc# óéííÍÔôTΟ?Ÿååå,,ÌçС÷òøCnܸ‘é马¬¬$I–——Ój5ÓÙÙ™µµµÜ¼yÃ~ðw' 𵺺šT*›[BgÏžÍììLVVVR«ÕòàÁƒœ‘ÃGŽäòåËY[[Ëÿý÷Ïäää6+Ù‡ÞŽÒNÀßÏúúz®]»Ö~?44”f³Ù~?öèQ666ÚïæçÓßߟ•••466200 .$I®^¹’õõõ$ÉáÇS­VßÒ]üHg˜½ÄÙ`Ošœ|ž™™é dpp0ÝÕîÔjµ$I+­Ôjµôõõ¥Ñhdeu%ÝÕîÜ¿?Ï'Ÿçø§”Ëå<~<–ɩɤHÎ;Ÿäßÿýÿ³ÿ¼u:Ãì×®]Ë7REŠbk‚emm-I²°°$©××3??—?þ8Õj5«««¹yófŠ¢ÈåË—sâĉܺu3­Vë­ß€Î0{ˆ³ÀÞµ²¼œGËËY\˜Ïg?È÷ß×>WíîN’,,̧Hrçöí¼ÿþûÉââB¾ùú›4|ü»sðСLLŒçùÄ„½`GÃì)¶¤`¯›ËòòJz{û²¼¼œR©”jOO’daa1I‘£GæÈÑ£yüøqnÞ¸‘$ùäÓÏ222’ÕÕÕ\ùáJì;;¥´ÓðvÕëõ,//'IzzzR›Á–™éé$IgWWþøÿ‘kW¯¦ÑhäòåËI’tuuåü… ©Tþøã”Ë•¬­­å/ùs»SL’LOOçêÕ+ùàƒ…a€·NfÑx]wwW’Í}„r©”$I¹\Ù ½\ù!kkkoì3ÌLOç/þÒþðÖ Ãì)¶£€­ª/:ô’ ¦(Š4›Íܾ};>|1jû=†ÆOžø{†ØÃ*I’F£‘ÁÁÁ$É·ß|“ééé, à' Ãì%̼¦TÚÜ@˜žžÊ™3g³¼¼œé™iû À;«´Ó°“Š´Z­,//ghh(OŸ>Ùé‚~–Î0{ˆ¸¯«­®¦Z­¦··7•Jž=}jOx§é °‡--/%Iö ejz*õz}‡+øy:Ãì)žãlµ´¸†Ú7œÙÙ¹ØOÞu:Ã]]]9yòdvº”]©££#===í÷•J%'OžÌÉ“'3::ú7[gqi)EQdhh(µZío6/Àß‹Î0{‰¹¼“úúú288”J¥œùùùÌÍÍm;n`` ûöíK­¶–™™é¬¯¯¿1¦»»;##ûSÉôôtVWW·kß¾}Ìòòr&''·œ»páB:;»òí·ßl{í矑¹¹Ùܾ}ûgï«»Ú3gÏæÖ­›YX\øÙ±kgΜMooo:;;ÒÑÑ‘V+Y_¯gqq)Ïž=ÍÂÂÛ­çÿUµZÍþðO)•J¹víjž>}šŽÎŽœ9{6I2??ŸgãÏþ&k­¬,§Õj¥Z­¦V[µŸ¼ó„aö{Wïž?<—ŽŽŽÌÌΤ^¯ç䉓©®çúµk[Æzÿýôöôf|b<}}}9yòÓ|ÿÝ·[:y çä©÷óäÉãTÊå|tù£Ü½{'ÓÓÓí1##ûsâäÉÌÌLgue5GŽÉáÇóýwßµÇôõö¥»ZýÉß•S¯×ñwçâ'^¿ HOOïkG{34´/GÍ­[7óxlì-WõëU«Õ”J¥öë×?¿"»Ï´Ùhduu5===©­®ÚOÞyÂ0°ƒ>|°%Ð2þìY>ÿâ‹T«ÕvW—‘ýû3Ð?ï¾û6I259™Z­–>ø0ß¿b©T*9ûÁ‡ùú«¿´;ÆÌÌÌä“O?Ëÿãÿ¦Ùl¦(Š\¸x1þòOí5'&Æsù£ße``àï–ò_õýwߦ(Š ŒäÈ‘£)Š"gΜÍÓ'OÒl6wº¼mÍÎÌäÚÕ«éèèÈÓ§Oþîë--.¦««kÛnCïa˜=ųÜÞ5µÚZ^ÿývzj:ÊÇ“$'NœÌÝ;w¶Œ›ŸÈ¹sçÓÕÕµµµ9r4ããY_ßh[]­eyy9½—ñgÏR­ö¤V«½±æÌôtöï?……Åתûu½_:;;S.—³ººšR©”}ûöeffæ•ë7û˜tvv¦¿¿?«««YYYÙvÆ—cjµZVVVÒjµÚçÊårº»»³ººšf³™îîîtW«™Ÿ›Û2îõÚ§§gÒl6óüùd††ö¥··7år9]]›sU«Õtww§Õjenn.ÝÕjF†‡399™z½ž$)•JéëëKêõzæççÛç’¤¿¿?•ÊöÛ.F# ?®“dnv6•J%û†‡S©T2;;›Ú‹ðS’ttt¼ø®jéèìÊÆFc›ïcó}_:^¬½¾¾ž¥¥¥E‘îîî4›Í”J¥´Z­¬¯¯§Ñh¼Q_¹\Nmm-µZ-]]Ý)ŠÍy_ iE‘$ÉÒÒRFJ¥R:»º’V+ÙØØxcÞþþþ”Ë嬯¯§V«mùÌ*ÙØ&|ÓÑÑ‘r¹œEÖjµm¾[`¯†€wL}}½¬(•JéééÉüüü–1­V+«++ÈäädFöïÏÍ7Þ˜kyi)Cƒƒö,«««éîîNWWWÖÖÖÚcö8ÇccÿåzO:•æûï¾Ëï?ù$•J%ÿûý¯öùRQä£>ʃÛÇfggså‡Úáˆ}ÃÃùàƒÒÛÛ›F£‘J¥’ÅÅÅ|÷í·íZGFFrù£òÍ×_çýÓ§388˜$Y[[˽»wóôéÓŸ­³ÚÓ“jµš$Y]]mwÞ9rôhNœ8‘V«•¿üùÏùìóÏSE–––R¯×ÓÛÛ›~÷»ôôô´çjµZ¹qýz{ÍsçÎeàE=¯[Z\ÌŸþô§Œ>œS§N%I®]»–sçÎ¥T*%IšÍf®üðC&''“$CCCùèw¿K’Œ=z”[·nm;w_¾øâ‹E‘F£‘¯¿þº]ßÀÀ@Î_¸+?üR¹œjww<˜åååܹ}»Ýæe`¦V«eph¨ {ôhs¾¾8p ÏŸ?Ͼáátttdjj*Íf3ÇŽËþýûó§ÿüÏ¿ïR)'OžÌÚÚZæÒh4ÒÛ×—sçÏgll,Ï^|fGN©\Îý{÷¶ÜÓÆÆF.]¾œÅÅÅܹ}ûg¿S`o†ÙK4†Ø2>>žIWw÷f‡Žm~ã]Z^JWwWRd³cJmõqKËË9xð@R$­´rûöí\¸x!<Èüü|Nœ8™¥¥¥ÌÌÎlmäòê¿?åÅùf«•J¥’ /fjj2ÏÓJ«}þä©S™ššÊþçS¯×säÈÑœ>}:.^È·ß~›$Y]]ÉØØ£LOOgmm-ƒƒƒùä“OsôØÑܽ{·½N’\¼t)ããÏrõêÕttTráÂÅœ;>sósÛvœ¹üÑåtwWÓ××—$Y\\ÌÕ«W~¬¿Ùܼ¢Èå.·;£¤H*•|úÙgéèèÈÆÆF&&&²ÿþtuuåü… YZ^ÊÂÂÂÏ~VkõúæçÿJ‡“ .¤Õj¥Õj¥(Š”J¥œ;>3³3›Ý[^¯Øæ»(’¢TäâÅ )Š"­V+W®ü……ùöØù…ù4LMOµ/{<–'Næó/¾È—_þ)i¥•ùùùtttäùó‰$yÑ™eóš£ÇŽåÞ½»©×ëY^YNgggûÜâââfšVs³¦¢Èù çóðáÃ,--µ×]\ZÌääó µ¯-JEŽ9’õõõ<~üc«•V¦¦¦²´´hoØ–0 ¼CªÕjªÕjff¦“l†\^íâòª¥¥Á„$•J¥êxÕòòR:;´ß?K©Tä£~—V«•ÅÅ…|ûí·[‚ÿ¯Z­VÊåò‹ÉÕ7Î×jµ\¿~­]߃÷3<<œ‘‘ýéïïÏââbjµÚ–Î.óó󙟟ËððÈa˜f#Éfãö‹Ž!««ÉØØ£œ;w>CCû¶ ÃìßàÏäeW”ÍyüܺººóàÁýÌÌÌfyy9'NœHGGG’äÏþ2+++)—Ëù×ýï)•J9~üx®\¹’¯¿þº¢éííÍïÿIÊårêõz®_¿öâsj¾RÃr¾þú«”Ëå|úégéêêJgggúúúÞèôSN:•¾¾þ$É7255µåüvßi³ÙÌýû÷20П“'OåΗW¶Žm4¯Î”ÇäÁƒûIÒîæóãu?^Ûßߟ¤Ø„yuÎééé-Ç®\ù!—.]Îúúz&&Æ_©ýÍ¿e€—„aöOx·•J¥|øÁ‡¹sûÖ¿é¶ZÛ6I’ŽŽJÖëë?ÛÈ¥³£#ö¹ãǧÚÓ“?þñ?REŽ?ž?þ8ׯ]û1tÓúéù~ÔzåüæOŸ<ÞöšgÏž¦Õln97=5™}ûö¥¿¯?K‹‹I6=ÊÐÐP:;»Ò×ןJ¥’Ò‹Î'yžÚ2×üÜ\’¤§§gÛõoܸžÎÎÎ exx$ï½7š‘‘ýùãüßllläÕ0dzgÏrïEø&I†÷ 'Ù r¼ÿþéöñf³™R©”ÞÞ¾Iš/Â#]]]¹térÊåòf·–~H}míºÆŸ=Ëz½žõ$333M²†Z˜Ÿß®Ì–c]9qâd’djj2Ïž>yóÞ_|^Û}&“ÏŸçð‘£[þÎJE‘¾Þ¾”JEF;XôèáÃ|úÙç)•ŠÜ¿wï5Z?6ʾ¡}YZ\üÕ{kµµ|÷Ý·ùýï?Icc½–yù÷boØNi§ ’¢(rþÂÅJ÷‹knß¾•¹¹ÙmkzµÍËï'IJůۺéîîN©´9vddú~Õu/--/o©=IŠR‘îî® ¦»Zm_]]Í·ß|#‡l m§ÚÓ“råÍ¿Ãîîîœ9{6ÇŸØò}–Ë¥,-.懾υ‹—288˜$iþŠ€ß>aöÏOxW}øá¹ÌÎÌdjj*¯þž»¶VOµ»;EQÚìŽòŠÞ¾¾¬>\KRdµVKooß– M’ôõõ¥¶ZKRäàÁC™˜˜Èë¿OMMåƒ?l_]]M©TJWWwjµÚ–±ÕžÞ$yÑ5äõž4¯÷òØ|½ÚغæÐ‹Ž+«««IŠ\¼t)õz=þòË4^tYéìêÊððÈ+ó¾9÷ϯŸ7Ž//-eß¾}I’<{ölë5­­s¯®®¦««+Íf37®_o×öÒfg™Íñ|x.¸ÑcIDAT›aŽ'çñØãŸ©ùõº·¯÷§î«Õjåé“'9rôhŠ¢È… óç/¿Ü²I;XóægÒÕÙ•ÅÅÅ-54ÍLOÏl¾+¶®¹´´œ¯¾ú*Ÿ|úifggÛ¡¢¤x1jóÿK‹‹9pðàkÖjkéééÍÒâÒ‹†5›ó—Jå$EæfçríÚµ\þèwùæë¯_žô†¶§3 ì°Ó§O§V«åéÓ§oœkµZ™››k8^zÙÕca~>Iò|b"zãúÞ¾¾ŒOL$ÙìnÒÓÓóÆ˜žžž-A›¹A‡#G¾1öè‘#iµZ¯„!~ÙèáÃotwÙ?2’V«•ÅÅÅttt¤Z­f~~~Kؤ¯¯ïW¯ñK*•J<˜ÃGŽ´½ÚÎÜÜ\’Í@Ͼáá,--err2sss©×ëíóGŽÉáÇ“l…ž?ž}ûöeß¾}ú›ÝÇK‹‹‹¹yófû{èííÍéÓ[»¶”¶éìóÒÈÈÈ‹`Ô¦¢´uËèÕ¿‡—hVWW3öèQ^toyyÝ«×NOOg```Ûï®Ñh¼&*½zíÔTnÞ¼™ß}üñOvCHt†Ù[<< àsâĉ”ʥܽw÷'Ç}46–?ü0ó_Õœ>s&ccci¥•ÉÄó‰|qòdÆÇŸeii)IrðàÁ¬­­eee¹=æâÅKyúôI»ãK©Tʉ“'óôé“öúSÓS™››ËñãÇÓj5óüùó”J¥ŒŽÎ{££Ëò‹9ßðʱr¹ôâßr.^º”ÇDz±±‘£G¥¯¿?>Hmm³Ž¥¥Åìß¿?}ýýY_¯çرãíI¹RNs½ùK hÞ|ýÂÿ·{#Œ377—ñ‰ñ_lÊòðჼ÷Þ{éîîÎèèhFGGÓh4R.—“$_~ù§¬­ÕsöƒÚ×ôôôä÷Ÿ|Ò~ßl6óþÏÿþÙuÞ8þKÍb^»}ûV>ÿü‹E‘cÇgrj*ss›™R¹´Yçk×íß ­´2==Õ>W*•R*í÷ýýýY\\LQ9xè`ÆÇÇ“$™šš~íºRû}m­–Û·oåÒå˹qãz;,”lv›yù÷š$]]é®vg~a¾=fròyÊåRÎ;Ÿï¾ûÖÞ°-a˜=Ä~À»edÿþ¼ÿþéÌÎÎäã?Þr®ÑhäÊ?$IæóxìQ>ûìóÌÍΦ··7sósy<ö¨ýÛo«ÙÌ•¾ÏÅK—²°°˜J¥’V«•kW¯´Ç,ÌÏçÎíÛùô“O³²ºšµZ-û†‡óôÉ“gÏ~“'OåäÉSíšîÞ½“±G¶ÍŸ¼ž×(¿èúqõÊ9õþé|òɧ›µ¶Zypÿ~<¸ßïî½\¼t)_|ñEZ­V¦§¦rçÎíœ=ûA:::²±¾¾e½_³~ûü‹ L³ÙÌÊòržÏ×ëO²íܯÞOµ§'E’•••ö½¾¬ëçl¼Ìl·ÎvÇ_s»c­V« y}ý׿‡_²ÿ\þè£,ÌÏ端þò«¯ö´SwîÞ{°S‹ë ;äç‚?5~iiñgÇ´Z­,//ýâ˜ÕÕÕ_µf£ÑÈââϯùS÷Ñjµ¶„26666»üʵZ­Ö–Ëëï_õúñV«•õõõŸ ýšú_×jµ²²¼¼íñŸªë׬³Ýñíæü©u~íú?ehh(IÒÑÙù_žàm†ÙSŠ.xÇ4_–:::b/Ø „aöûWÀk^v•©T*éìêL½^ßáŠ~^i§ `ç”Ëåöëþþþ¬à×ÑfÑxÝàà@ûõ±cÇ23=½ƒÕü2aö°¾¾»ÁìÛ7œÞ¾¾¬à—é ³§è ü¨§§'[Ž?v<ׯ_ß¡Š~™Î0{TÿÇ:”îîî¨à×Ñf/ÑxEÿÀÀÇŠ¢È±ãÇsûö­¨à— Ãì!²0À«úûú¶=>::šG¤^¯¿åŠ~Yi§ `gôõ÷·_×jµÌÎÎfff&Irìøñ* àg ÃìAÝÝÝ)—ËI’çÏŸ§Õje}½žÅŅܺy3££‡ÓÙÙ¹ÃU¼©²Óð6;]ðŽèëH’LMMåùÄD&ÆÇÛ]aºººÒl6³ox$ãã;Y&À„aöYà…¾¾¾4›Íܽ{'µZ-år9§ÏœÎèèá”Ëå´Z­ dbBx·ÃìA½½½™››K­VKggg>þø÷©V«™œœÌØØXz{{R­VwºL€7Ãì!Ã/uvvdyi9¥¢ÈÅ S­Vsçöí<}ú$I²º²œf³ixçÃìAµÚZVVVrìøñ æñã±v&IÆVðÓJ;]o_­¶š¤•£Ge½^Ïý{÷ÞÓÕÕõö ø:Ãì)ÅN¼#Öjkyÿôé”ËåBOoOººº30Пîîªýà# ³‡Ø«^Z«Õòäñã9z4ËËËí}„Å……œûâ|ºººòàþ}û À;§´Ó°3=z˜µµµttt$IJ¥R>’r¹œV«•gÏžîp…oÒ`j4¹~íZÎ;—F£‘þþT*•4,-.fdÿþLŒït™[Ãì)ÅN¼c–––òýwßgpp0Õj5F#333i49vüxÊåÍp À»Bf/‘…¶ÑJ+sós™›ŸÛrüÑ£‡›/ì1ïa˜=Ä>°Û•vºøµ„aØ5„aØ5*;]oS±ÓüU„aöY`—†ÙCda€Ý®´ÓÀ¯% À®! À®QÙéx‹Šb§+ø«Ãì!¢0ÀnWÚéà׆`׆`רìt¼MÅNðW†ÙC Y`—+ítðk ðkðkðkTvºÞ¦b§ ø«Ãì!…, °Ë•vºøµ„aØ5„aØ5„aØ5*;]oOQ;]À_Egv av av avÊNÀ[T;]À_Ef…v»ÒN¿–0 »†0 »†0 »Fe§ àí)Šb§Kø«è À®! À®! À®! À®QÙéx›Š.à¯" ³‡²0À.WÚéà׆`׆`׆`׆`׆`׆`׆`׆`׆`׆`׆`׆`׆`׆`׆`׆`׆`׆`׆`׆`׆`׆`׆`׆`׆`׆`׆`׆`׆`׆`׆`׆`׆`׆`׆`׆€ÿ¿}; ôÿu;ý!°!ð!ð!ð!ð!ð!ð!ð!ð!ð!ð!ð!ð!ð!ð!ð!ð!ð!ð!ð!ð!ð!ð!ð!ð!ð!ð!ð!ðù,¯ ‰ÈIEND®B`‚fifengine-0.4.2/doc/logo/fife_logo.svg000066400000000000000000005345041341615052600176440ustar00rootroot00000000000000 fifengine-0.4.2/doc/templatefiles/000077500000000000000000000000001341615052600170555ustar00rootroot00000000000000fifengine-0.4.2/doc/templatefiles/sample_unit_test.cpp000066400000000000000000000037121341615052600231430ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // 3rd party library includes #include "fife_unittest++.h" // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder using namespace FIFE; TEST(foo) { CHECK("Blank Test for foo. Please provide an implementation"); } int main() { return UnitTest::RunAllTests(); } fifengine-0.4.2/doc/templatefiles/samplecpp.cpp000066400000000000000000000035331341615052600215510ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder namespace FIFE { Foo::Foo() { } Foo::Foo(const Foo& from) { } }fifengine-0.4.2/doc/templatefiles/sampleheader.h000066400000000000000000000050351341615052600216630ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_POSSIBLESUBNAMESPACES_FOO_H #define FIFE_POSSIBLESUBNAMESPACES_FOO_H // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder namespace FIFE { // FORWARD REFERENCES /** A one line description of the class. * * A longer description. * * @see something */ class Foo { public: // LIFECYCLE /** Default constructor. */ Foo(); /** Copy constructor. * * @param from The value to copy to this object. */ Foo(const Foo& from); /** Destructor. */ ~Foo(); // OPERATORS /** Assignment operator. * * @param from The value to assign to this object. * * @return A reference to this object. */ Foo& operator=(Foo& from); // OPERATIONS // ACCESS // INQUIRY protected: private: }; // INLINE METHODS // // EXTERNAL REFERENCES // } //FIFE #endif fifengine-0.4.2/engine/000077500000000000000000000000001341615052600147175ustar00rootroot00000000000000fifengine-0.4.2/engine/core/000077500000000000000000000000001341615052600156475ustar00rootroot00000000000000fifengine-0.4.2/engine/core/audio/000077500000000000000000000000001341615052600167505ustar00rootroot00000000000000fifengine-0.4.2/engine/core/audio/actionaudio.cpp000066400000000000000000000113711341615052600217560ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // Platform specific includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/log/logger.h" #include "util/base/exception.h" #include "actionaudio.h" namespace FIFE { static Logger _log(LM_AUDIO); ActionAudio::ActionAudio() : m_name(""), m_group(""), m_volume(1.0), m_maxVolume(1.0), m_minVolume(0.0), m_refDistance(1.0), m_maxDistance(1000000.0), m_rolloff(1.0), m_pitch(1.0), m_coneInnerAngle(360.0), m_coneOuterAngle(360.0), m_coneOuterGain(0.0), m_looping(false), m_positioning(false), m_direction(false) { m_velocity = AudioSpaceCoordinate(0.0, 0.0, 0.0); } ActionAudio::~ActionAudio() { } void ActionAudio::setSoundFileName(const std::string& name) { m_name = name; } const std::string& ActionAudio::getSoundFileName() const { return m_name; } void ActionAudio::setGroupName(const std::string& name) { m_group = name; } const std::string& ActionAudio::getGroupName() const { return m_group; } void ActionAudio::setGain(float gain) { m_volume = gain; } float ActionAudio::getGain() const { return m_volume; } void ActionAudio::setMaxGain(float gain) { m_maxVolume = gain; } float ActionAudio::getMaxGain() const { return m_maxVolume; } void ActionAudio::setMinGain(float gain) { m_minVolume = gain; } float ActionAudio::getMinGain() const { return m_minVolume; } void ActionAudio::setReferenceDistance(float distance) { m_refDistance = distance; } float ActionAudio::getReferenceDistance() const { return m_refDistance; } void ActionAudio::setMaxDistance(float distance) { m_maxDistance = distance; } float ActionAudio::getMaxDistance() const { return m_maxDistance; } void ActionAudio::setRolloff(float rolloff) { m_rolloff = rolloff; } float ActionAudio::getRolloff() const { return m_rolloff; } void ActionAudio::setPitch(float pitch) { m_pitch = pitch; } float ActionAudio::getPitch() const { return m_pitch; } void ActionAudio::setConeInnerAngle(float inner) { m_coneInnerAngle = inner; } float ActionAudio::getConeInnerAngle() const { return m_coneInnerAngle; } void ActionAudio::setConeOuterAngle(float outer) { m_coneOuterAngle = outer; } float ActionAudio::getConeOuterAngle() const { return m_coneOuterAngle; } void ActionAudio::setConeOuterGain(float gain) { m_coneOuterGain = gain; } float ActionAudio::getConeOuterGain() const { return m_coneOuterGain; } void ActionAudio::setVelocity(const AudioSpaceCoordinate& velocity) { m_velocity = velocity; } const AudioSpaceCoordinate& ActionAudio::getVelocity() const { return m_velocity; } void ActionAudio::setLooping(bool loop) { m_looping = loop; } bool ActionAudio::isLooping() const { return m_looping; } void ActionAudio::setRelativePositioning(bool relative) { m_positioning = relative; } bool ActionAudio::isRelativePositioning() const { return m_positioning; } void ActionAudio::setDirection(bool direction) { m_direction = direction; } bool ActionAudio::isDirection() const { return m_direction; } } fifengine-0.4.2/engine/core/audio/actionaudio.h000066400000000000000000000144211341615052600214220ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_ACTIONAUDIO_H #define FIFE_ACTIONAUDIO_H // Standard C++ library includes // Platform specific includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "model/metamodel/modelcoords.h" namespace FIFE { /** The class for holding audio data per Action. */ class ActionAudio { public: ActionAudio(); ~ActionAudio(); /** Sets the name of the sound file */ void setSoundFileName(const std::string& name); /** Return the name of the sound file */ const std::string& getSoundFileName() const; /** Sets the name of the group to which the emitter is added. */ void setGroupName(const std::string& name); /** Return the name of the group to which the emitter is added. */ const std::string& getGroupName() const; /** Sets the gain of the emitter * * @param gain The gain value. 0=silence ... 1.0=normal loudness. */ void setGain(float gain); /** Returns the gain of the emitter * * @return The gain value. 0=silence ... 1.0=normal loudness. */ float getGain() const; /** Sets the max. gain of the emitter * * @param gain The gain value. 0=silence ... 1.0=normal loudness. */ void setMaxGain(float gain); /** Returns the max. gain of the emitter * * @return The gain value. 0=silence ... 1.0=normal loudness. */ float getMaxGain() const; /** Sets the min. gain of the emitter * * @param gain The gain value. 0=silence ... 1.0=normal loudness. */ void setMinGain(float gain); /** Returns the min. gain of the emitter * * @return The gain value. 0=silence ... 1.0=normal loudness. */ float getMinGain() const; /** Sets the distance under which the volume for the SoundEmitter would normally drop by half (before * being influenced by rolloff factor or max distance. */ void setReferenceDistance(float distance); /** Return the reference distance. */ float getReferenceDistance() const; /** Sets the max distance used with the Inverse Clamped Distance Model to set the distance where * there will no longer be any attenuation of the source. */ void setMaxDistance(float distance); /** Return the max distance. */ float getMaxDistance() const; /** Sets the AL_ROLEOFF_FACTOR. Rolloff factor judges the strength of attenuation over distance. * * @param rolloff Rolloff factor. You'll need to do a lot of testing to find a value which suits your needs. */ void setRolloff(float rolloff); /** Return the AL_ROLEOFF_FACTOR. Rolloff factor judges the strength of attenuation over distance. */ float getRolloff() const; /** Sets pitch multiplier. Can only be positiv. */ void setPitch(float pitch); /** Return pitch multiplier. Can only be positiv. */ float getPitch() const; /** Sets inner angle of the sound cone, in degrees. Default 360 */ void setConeInnerAngle(float inner); /** Return inner angle of the sound cone, in degrees. */ float getConeInnerAngle() const; /** Sets outer angle of the sound cone, in degrees. Default 360 */ void setConeOuterAngle(float outer); /** Return outer angle of the sound cone, in degrees. */ float getConeOuterAngle() const; /** Sets the gain when outside the oriented cone. */ void setConeOuterGain(float gain); /** Return the gain when outside the oriented cone. */ float getConeOuterGain() const; /** Sets the velocity of the SoundEmitter in the virtual audio space. */ void setVelocity(const AudioSpaceCoordinate& velocity); /** Return the velocity of the SoundEmitter in the virtual audio space. */ const AudioSpaceCoordinate& getVelocity() const; /** Sets the playing mode */ void setLooping(bool loop); /** Return playing mode */ bool isLooping() const; /** Sets Positioning-Type * Default is false * * @param relative If set to true, the emitters position will be interpreted relative to the listener object * */ void setRelativePositioning(bool relative); /** Return Positioning-Type */ bool isRelativePositioning() const; /** Sets if the sound should use the instance direction */ void setDirection(bool direction); /** Return true if the Instance direction is used, false for undirected */ bool isDirection() const; private: std::string m_name; std::string m_group; float m_volume; float m_maxVolume; float m_minVolume; float m_refDistance; float m_maxDistance; float m_rolloff; float m_pitch; float m_coneInnerAngle; float m_coneOuterAngle; float m_coneOuterGain; AudioSpaceCoordinate m_velocity; bool m_looping; bool m_positioning; bool m_direction; }; } #endiffifengine-0.4.2/engine/core/audio/effects/000077500000000000000000000000001341615052600203675ustar00rootroot00000000000000fifengine-0.4.2/engine/core/audio/effects/soundeffect.cpp000066400000000000000000000766531341615052600234210ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes #include // Platform specific includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/log/logger.h" #include "util/base/exception.h" #include "soundeffect.h" namespace FIFE { /** Logger to use for this source file. * @relates Logger */ static Logger _log(LM_AUDIO); SoundEffect::SoundEffect() : m_effect(0), m_slot(0), m_effectType(SE_EFFECT_NULL), m_enabled(false), m_filter(NULL) { alGenEffects(1, &m_effect); } SoundEffect::~SoundEffect() { alDeleteEffects(1, &m_effect); } ALuint SoundEffect::getEffectId() const { return m_effect; } void SoundEffect::setSlotId(ALuint slot) { m_slot = slot; } ALuint SoundEffect::getSlotId() { return m_slot; } SoundEffectType SoundEffect::getEffectType() const { return m_effectType; } void SoundEffect::setEnabled(bool enabled) { m_enabled = enabled; } bool SoundEffect::isEnabled() const { return m_enabled; } void SoundEffect::setFilter(SoundFilter* filter) { m_filter = filter; } SoundFilter* SoundEffect::getFilter() { return m_filter; } Reverb::Reverb() : m_density(1.0f), m_diffusion(1.0f), m_gain(0.32f), m_gainHf(0.89f), m_decayTime(1.49f), m_decayHfRatio(0.83f), m_reflectionsGain(0.05f), m_reflectionsDelay(0.007f), m_lateReverbGain(1.26f), m_lateReverbDelay(0.011f), m_airAbsorptionGainHf(0.994f), m_roomRolloffFactor(0.0f), m_decayHfLimit(true) { m_effectType = SE_EFFECT_REVERB; alEffecti(m_effect, AL_EFFECT_TYPE, AL_EFFECT_REVERB); } void Reverb::setDensity(float value) { value = std::min(value, 1.0f); value = std::max(value, 0.0f); m_density = value; alEffectf(m_effect, AL_REVERB_DENSITY, m_density); } float Reverb::getDensity() const { return m_density; } void Reverb::setDiffusion(float value) { value = std::min(value, 1.0f); value = std::max(value, 0.0f); m_diffusion = value; alEffectf(m_effect, AL_REVERB_DIFFUSION, m_diffusion); } float Reverb::getDiffusion() const { return m_diffusion; } void Reverb::setGain(float value) { value = std::min(value, 1.0f); value = std::max(value, 0.0f); m_gain = value; alEffectf(m_effect, AL_REVERB_GAIN, m_gain); } float Reverb::getGain() const { return m_gain; } void Reverb::setGainHf(float value) { value = std::min(value, 1.0f); value = std::max(value, 0.0f); m_gainHf = value; alEffectf(m_effect, AL_REVERB_GAINHF, m_gainHf); } float Reverb::getGainHf() const { return m_gainHf; } void Reverb::setDecayTime(float value) { value = std::min(value, 20.0f); value = std::max(value, 0.1f); m_decayTime = value; alEffectf(m_effect, AL_REVERB_DECAY_TIME, m_decayTime); } float Reverb::getDecayTime() const { return m_decayTime; } void Reverb::setDecayHfRatio(float value) { value = std::min(value, 2.0f); value = std::max(value, 0.1f); m_decayHfRatio = value; alEffectf(m_effect, AL_REVERB_DECAY_HFRATIO, m_decayHfRatio); } float Reverb::getDecayHfRatio() const { return m_decayHfRatio; } void Reverb::setReflectionsGain(float value) { value = std::min(value, 3.16f); value = std::max(value, 0.0f); m_reflectionsGain = value; alEffectf(m_effect, AL_REVERB_REFLECTIONS_GAIN, m_reflectionsGain); } float Reverb::getReflectionsGain() const { return m_reflectionsGain; } void Reverb::setReflectionsDelay(float value) { value = std::min(value, 0.3f); value = std::max(value, 0.0f); m_reflectionsDelay = value; alEffectf(m_effect, AL_REVERB_REFLECTIONS_DELAY, m_reflectionsDelay); } float Reverb::getReflectionsDelay() const { return m_reflectionsDelay; } void Reverb::setLateReverbGain(float value) { value = std::min(value, 10.0f); value = std::max(value, 0.0f); m_lateReverbGain = value; alEffectf(m_effect, AL_REVERB_LATE_REVERB_GAIN, m_lateReverbGain); } float Reverb::getLateReverbGain() const { return m_lateReverbGain; } void Reverb::setLateReverbDelay(float value) { value = std::min(value, 0.1f); value = std::max(value, 0.0f); m_reflectionsDelay = value; alEffectf(m_effect, AL_REVERB_LATE_REVERB_DELAY, m_reflectionsDelay); } float Reverb::getLateReverbDelay() const { return m_reflectionsDelay; } void Reverb::setAirAbsorptionGainHf(float value) { value = std::min(value, 1.0f); value = std::max(value, 0.892f); m_airAbsorptionGainHf = value; alEffectf(m_effect, AL_REVERB_AIR_ABSORPTION_GAINHF, m_airAbsorptionGainHf); } float Reverb::getAirAbsorptionGainHf() const { return m_airAbsorptionGainHf; } void Reverb::setRoomRolloffFactor(float value) { value = std::min(value, 10.0f); value = std::max(value, 0.0f); m_roomRolloffFactor = value; alEffectf(m_effect, AL_REVERB_ROOM_ROLLOFF_FACTOR, m_roomRolloffFactor); } float Reverb::getRoomRolloffFactor() const { return m_roomRolloffFactor; } void Reverb::setDecayHfLimit(bool value) { m_decayHfLimit = value; alEffecti(m_effect, AL_REVERB_DECAY_HFLIMIT, m_decayHfLimit ? AL_TRUE : AL_FALSE); } bool Reverb::isDecayHfLimit() const { return m_decayHfLimit; } Chorus::Chorus() : m_waveformTriangle(true), m_phase(90), m_rate(1.1f), m_depth(0.1f), m_feedback(0.25f), m_delay(0.016f) { m_effectType = SE_EFFECT_CHORUS; alEffecti(m_effect, AL_EFFECT_TYPE, AL_EFFECT_CHORUS); } void Chorus::setWaveformTriangle(bool value) { m_waveformTriangle = value; if (m_waveformTriangle) { alEffecti(m_effect, AL_CHORUS_WAVEFORM, AL_CHORUS_WAVEFORM_TRIANGLE); } else { alEffecti(m_effect, AL_CHORUS_WAVEFORM, AL_CHORUS_WAVEFORM_SINUSOID); } } bool Chorus::isWaveformTriangle() const { return m_waveformTriangle; } void Chorus::setPhase(int32_t value) { value = std::min(value, 180); value = std::max(value, -180); m_phase = value; alEffecti(m_effect, AL_CHORUS_PHASE, m_phase); } int32_t Chorus::getPhase() const { return m_phase; } void Chorus::setRate(float value) { value = std::min(value, 10.0f); value = std::max(value, 0.0f); m_rate = value; alEffectf(m_effect, AL_CHORUS_RATE, m_rate); } float Chorus::getRate() const { return m_rate; } void Chorus::setDepth(float value) { value = std::min(value, 1.0f); value = std::max(value, 0.0f); m_depth = value; alEffectf(m_effect, AL_CHORUS_DEPTH, m_depth); } float Chorus::getDepth() const { return m_depth; } void Chorus::setFeedback(float value) { value = std::min(value, 1.0f); value = std::max(value, -1.0f); m_feedback = value; alEffectf(m_effect, AL_CHORUS_FEEDBACK, m_feedback); } float Chorus::getFeedback() const { return m_feedback; } void Chorus::setDelay(float value) { value = std::min(value, 0.016f); value = std::max(value, 0.0f); m_delay = value; alEffectf(m_effect, AL_CHORUS_DELAY, m_delay); } float Chorus::getDelay() const { return m_delay; } Distortion::Distortion() : m_edge(0.2f), m_gain(0.05f), m_lowpassCutoff(8000.0f), m_eqCenter(3600.0f), m_eqBandwidth(3600.0f) { m_effectType = SE_EFFECT_DISTORTION; alEffecti(m_effect, AL_EFFECT_TYPE, AL_EFFECT_DISTORTION); } void Distortion::setEdge(float value) { value = std::min(value, 1.0f); value = std::max(value, 0.0f); m_edge = value; alEffectf(m_effect, AL_DISTORTION_EDGE, m_edge); } float Distortion::getEdge() const { return m_edge; } void Distortion::setGain(float value) { value = std::min(value, 1.0f); value = std::max(value, 0.01f); m_gain = value; alEffectf(m_effect, AL_DISTORTION_GAIN, m_gain); } float Distortion::getGain() const { return m_gain; } void Distortion::setLowpassCutoff(float value) { value = std::min(value, 24000.0f); value = std::max(value, 80.0f); m_lowpassCutoff = value; alEffectf(m_effect, AL_DISTORTION_LOWPASS_CUTOFF, m_lowpassCutoff); } float Distortion::getLowpassCutoff() const { return m_lowpassCutoff; } void Distortion::setEqCenter(float value) { value = std::min(value, 24000.0f); value = std::max(value, 80.0f); m_eqCenter = value; alEffectf(m_effect, AL_DISTORTION_EQCENTER, m_eqCenter); } float Distortion::getEqCenter() const { return m_eqCenter; } void Distortion::setEqBandwidth(float value) { value = std::min(value, 24000.0f); value = std::max(value, 80.0f); m_eqBandwidth = value; alEffectf(m_effect, AL_DISTORTION_EQBANDWIDTH, m_eqBandwidth); } float Distortion::getEqBandwidth() const { return m_eqBandwidth; } Echo::Echo() : m_delay(0.1f), m_lrDelay(0.1f), m_damping(0.5f), m_feedback(0.5f), m_spread(-1.0f) { m_effectType = SE_EFFECT_ECHO; alEffecti(m_effect, AL_EFFECT_TYPE, AL_EFFECT_ECHO); } void Echo::setDelay(float value) { value = std::min(value, 0.207f); value = std::max(value, 0.0f); m_delay = value; alEffectf(m_effect, AL_ECHO_DELAY, m_delay); } float Echo::getDelay() const { return m_delay; } void Echo::setLrDelay(float value) { value = std::min(value, 0.404f); value = std::max(value, 0.0f); m_lrDelay = value; alEffectf(m_effect, AL_ECHO_LRDELAY, m_lrDelay); } float Echo::getLrDelay() const { return m_lrDelay; } void Echo::setDamping(float value) { value = std::min(value, 0.99f); value = std::max(value, 0.0f); m_damping = value; alEffectf(m_effect, AL_ECHO_DAMPING, m_damping); } float Echo::getDamping() const { return m_damping; } void Echo::setFeedback(float value) { value = std::min(value, 1.0f); value = std::max(value, 0.0f); m_feedback = value; alEffectf(m_effect, AL_ECHO_FEEDBACK, m_feedback); } float Echo::getFeedback() const { return m_feedback; } void Echo::setSpread(float value) { value = std::min(value, 1.0f); value = std::max(value, -1.0f); m_spread = value; alEffectf(m_effect, AL_ECHO_SPREAD, m_spread); } float Echo::getSpread() const { return m_spread; } Flanger::Flanger() : m_waveformTriangle(true), m_phase(0), m_rate(0.27f), m_depth(1.0f), m_feedback(-0.5f), m_delay(0.002f) { m_effectType = SE_EFFECT_FLANGER; alEffecti(m_effect, AL_EFFECT_TYPE, AL_EFFECT_FLANGER); } void Flanger::setWaveformTriangle(bool value) { m_waveformTriangle = value; if (m_waveformTriangle) { alEffecti(m_effect, AL_FLANGER_WAVEFORM, AL_FLANGER_WAVEFORM_TRIANGLE); } else { alEffecti(m_effect, AL_FLANGER_WAVEFORM, AL_FLANGER_WAVEFORM_SINUSOID); } } bool Flanger::isWaveformTriangle() const { return m_waveformTriangle; } void Flanger::setPhase(int32_t value) { value = std::min(value, 180); value = std::max(value, -180); m_phase = value; alEffecti(m_effect, AL_FLANGER_PHASE, m_phase); } int32_t Flanger::getPhase() const { return m_phase; } void Flanger::setRate(float value) { value = std::min(value, 10.0f); value = std::max(value, 0.0f); m_rate = value; alEffectf(m_effect, AL_FLANGER_RATE, m_rate); } float Flanger::getRate() const { return m_rate; } void Flanger::setDepth(float value) { value = std::min(value, 1.0f); value = std::max(value, 0.0f); m_depth = value; alEffectf(m_effect, AL_FLANGER_DEPTH, m_depth); } float Flanger::getDepth() const { return m_depth; } void Flanger::setFeedback(float value) { value = std::min(value, 1.0f); value = std::max(value, -1.0f); m_feedback = value; alEffectf(m_effect, AL_FLANGER_FEEDBACK, m_feedback); } float Flanger::getFeedback() const { return m_feedback; } void Flanger::setDelay(float value) { value = std::min(value, 0.004f); value = std::max(value, 0.0f); m_delay = value; alEffectf(m_effect, AL_FLANGER_DELAY, m_delay); } float Flanger::getDelay() const { return m_delay; } FrequencyShifter::FrequencyShifter() : m_frequency(0.0f), m_leftDirection(0), m_rightDirection(0) { m_effectType = SE_EFFECT_FREQUENCY_SHIFTER; alEffecti(m_effect, AL_EFFECT_TYPE, AL_EFFECT_FREQUENCY_SHIFTER); } void FrequencyShifter::setFrequency(float value) { value = std::min(value, 24000.0f); value = std::max(value, 0.0f); m_frequency = value; alEffectf(m_effect, AL_FREQUENCY_SHIFTER_FREQUENCY, m_frequency); } float FrequencyShifter::getFrequency() const { return m_frequency; } void FrequencyShifter::setLeftDirection(uint8_t value) { value = std::min(value, uint8_t(2)); value = std::max(value, uint8_t(0)); m_leftDirection = value; alEffecti(m_effect, AL_FREQUENCY_SHIFTER_LEFT_DIRECTION, m_leftDirection); } uint8_t FrequencyShifter::getLeftDirection() const { return m_leftDirection; } void FrequencyShifter::setRightDirection(uint8_t value) { value = std::min(value, uint8_t(2)); value = std::max(value, uint8_t(0)); m_rightDirection = value; alEffecti(m_effect, AL_FREQUENCY_SHIFTER_RIGHT_DIRECTION, m_rightDirection); } uint8_t FrequencyShifter::getRightDirection() const { return m_rightDirection; } VocalMorpher::VocalMorpher() : m_phonemeA(0), m_phonemeB(10), m_phonemeCoarseA(0), m_phonemeCoarseB(0), m_waveform(0), m_rate(1.41f) { m_effectType = SE_EFFECT_VOCAL_MORPHER; alEffecti(m_effect, AL_EFFECT_TYPE, AL_EFFECT_VOCAL_MORPHER); } void VocalMorpher::setPhonemeA(uint16_t value) { value = std::min(value, uint16_t(29)); value = std::max(value, uint16_t(0)); m_phonemeA = value; alEffecti(m_effect, AL_VOCAL_MORPHER_PHONEMEA, m_phonemeA); } uint16_t VocalMorpher::getPhonemeA() const { return m_phonemeA; } void VocalMorpher::setPhonemeB(uint16_t value) { value = std::min(value, uint16_t(29)); value = std::max(value, uint16_t(0)); m_phonemeB = value; alEffecti(m_effect, AL_VOCAL_MORPHER_PHONEMEB, m_phonemeB); } uint16_t VocalMorpher::getPhonemeB() const { return m_phonemeB; } void VocalMorpher::setPhonemeCoarseA(int16_t value) { value = std::min(value, int16_t(24)); value = std::max(value, int16_t(-24)); m_phonemeCoarseA = value; alEffecti(m_effect, AL_VOCAL_MORPHER_PHONEMEA_COARSE_TUNING, m_phonemeCoarseA); } int16_t VocalMorpher::getPhonemeCoarseA() const { return m_phonemeCoarseA; } void VocalMorpher::setPhonemeCoarseB(int16_t value) { value = std::min(value, int16_t(24)); value = std::max(value, int16_t(-24)); m_phonemeCoarseB = value; alEffecti(m_effect, AL_VOCAL_MORPHER_PHONEMEB_COARSE_TUNING, m_phonemeCoarseB); } int16_t VocalMorpher::getPhonemeCoarseB() const { return m_phonemeCoarseB; } void VocalMorpher::setWaveform(uint8_t value) { value = std::min(value, uint8_t(2)); value = std::max(value, uint8_t(0)); m_waveform = value; alEffecti(m_effect, AL_VOCAL_MORPHER_WAVEFORM, m_waveform); } uint8_t VocalMorpher::getWaveform() const { return m_waveform; } void VocalMorpher::setRate(float value) { value = std::min(value, 10.0f); value = std::max(value, 0.0f); m_rate = value; alEffectf(m_effect, AL_VOCAL_MORPHER_RATE, m_rate); } float VocalMorpher::getRate() const { return m_rate; } PitchShifter::PitchShifter() : m_coarseTune(12), m_fineTune(0) { m_effectType = SE_EFFECT_PITCH_SHIFTER; alEffecti(m_effect, AL_EFFECT_TYPE, AL_EFFECT_PITCH_SHIFTER); } void PitchShifter::setCoarseTune(int16_t value) { value = std::min(value, int16_t(12)); value = std::max(value, int16_t(-12)); m_coarseTune = value; alEffecti(m_effect, AL_PITCH_SHIFTER_COARSE_TUNE, m_coarseTune); } int16_t PitchShifter::getCoarseTune() const { return m_coarseTune; } void PitchShifter::setFineTune(int16_t value) { value = std::min(value, int16_t(50)); value = std::max(value, int16_t(-50)); m_fineTune = value; alEffecti(m_effect, AL_PITCH_SHIFTER_FINE_TUNE, m_fineTune); } int16_t PitchShifter::getFineTune() const { return m_fineTune; } RingModulator::RingModulator() : m_frequency(440.0f), m_highpassCutoff(800.0f), m_waveform(0) { m_effectType = SE_EFFECT_RING_MODULATOR; alEffecti(m_effect, AL_EFFECT_TYPE, AL_EFFECT_RING_MODULATOR); } void RingModulator::setFrequency(float value) { value = std::min(value, 8000.0f); value = std::max(value, 0.0f); m_frequency = value; alEffectf(m_effect, AL_RING_MODULATOR_FREQUENCY, m_frequency); } float RingModulator::getFrequency() const { return m_frequency; } void RingModulator::setHighpassCutoff(float value) { value = std::min(value, 24000.0f); value = std::max(value, 0.0f); m_highpassCutoff = value; alEffectf(m_effect, AL_RING_MODULATOR_HIGHPASS_CUTOFF, m_highpassCutoff); } float RingModulator::getHighpassCutoff() const { return m_highpassCutoff; } void RingModulator::setWaveform(uint8_t value) { value = std::min(value, uint8_t(2)); value = std::max(value, uint8_t(0)); m_waveform = value; alEffecti(m_effect, AL_RING_MODULATOR_WAVEFORM, m_waveform); } uint8_t RingModulator::getWaveform() const { return m_waveform; } Autowah::Autowah() : m_attackTime(0.06f), m_releaseTime(0.06f), m_resonance(1000.0f), m_peakGain(11.22f) { m_effectType = SE_EFFECT_AUTOWAH; alEffecti(m_effect, AL_EFFECT_TYPE, AL_EFFECT_AUTOWAH); } void Autowah::setAttackTime(float value) { value = std::min(value, 1.0f); value = std::max(value, 0.0001f); m_attackTime = value; alEffectf(m_effect, AL_AUTOWAH_ATTACK_TIME, m_attackTime); } float Autowah::getAttackTime() const { return m_attackTime; } void Autowah::setReleaseTime(float value) { value = std::min(value, 1.0f); value = std::max(value, 0.0001f); m_releaseTime = value; alEffectf(m_effect, AL_AUTOWAH_RELEASE_TIME, m_releaseTime); } float Autowah::getReleaseTime() const { return m_releaseTime; } void Autowah::setResonance(float value) { value = std::min(value, 1000.0f); value = std::max(value, 2.0f); m_resonance = value; alEffectf(m_effect, AL_AUTOWAH_RESONANCE, m_resonance); } float Autowah::getResonance() const { return m_resonance; } void Autowah::setPeakGain(float value) { value = std::min(value, 31621.0f); value = std::max(value, 0.00003f); m_peakGain = value; alEffectf(m_effect, AL_AUTOWAH_PEAK_GAIN, m_peakGain); } float Autowah::getPeakGain() const { return m_peakGain; } Compressor::Compressor() : m_active(true) { m_effectType = SE_EFFECT_COMPRESSOR; alEffecti(m_effect, AL_EFFECT_TYPE, AL_EFFECT_COMPRESSOR); } void Compressor::setCompressor(bool value) { m_active = value; alEffecti(m_effect, AL_COMPRESSOR_ONOFF, m_active ? AL_TRUE : AL_FALSE); } bool Compressor::isCompressor() const { return m_active; } Equalizer::Equalizer() : m_lowGain(1.0f), m_lowCutoff(200.0f), m_mid1Gain(1.0f), m_mid1Center(500.0f), m_mid1Width(1.0f), m_mid2Gain(1.0f), m_mid2Center(3000.0f), m_mid2Width(1.0f), m_highGain(1.0f), m_highCutoff(6000.0f) { m_effectType = SE_EFFECT_EQUALIZER; alEffecti(m_effect, AL_EFFECT_TYPE, AL_EFFECT_EQUALIZER); } void Equalizer::setLowGain(float value) { value = std::min(value, 7.943f); value = std::max(value, 0.126f); m_lowGain = value; alEffectf(m_effect, AL_EQUALIZER_LOW_GAIN, m_lowGain); } float Equalizer::getLowGain() const { return m_lowGain; } void Equalizer::setLowCutoff(float value) { value = std::min(value, 800.0f); value = std::max(value, 50.0f); m_lowCutoff = value; alEffectf(m_effect, AL_EQUALIZER_LOW_CUTOFF, m_lowCutoff); } float Equalizer::getLowCutoff() const { return m_lowCutoff; } void Equalizer::setMid1Gain(float value) { value = std::min(value, 7.943f); value = std::max(value, 0.126f); m_mid1Gain = value; alEffectf(m_effect, AL_EQUALIZER_MID1_GAIN, m_mid1Gain); } float Equalizer::getMid1Gain() const { return m_mid1Gain; } void Equalizer::setMid1Center(float value) { value = std::min(value, 3000.0f); value = std::max(value, 200.0f); m_mid1Center = value; alEffectf(m_effect, AL_EQUALIZER_MID1_CENTER, m_mid1Center); } float Equalizer::getMid1Center() const { return m_mid1Center; } void Equalizer::setMid1Width(float value) { value = std::min(value, 1.0f); value = std::max(value, 0.01f); m_mid1Width = value; alEffectf(m_effect, AL_EQUALIZER_MID1_WIDTH, m_mid1Width); } float Equalizer::getMid1Width() const { return m_mid1Width; } void Equalizer::setMid2Gain(float value) { value = std::min(value, 7.943f); value = std::max(value, 0.126f); m_mid2Gain = value; alEffectf(m_effect, AL_EQUALIZER_MID2_GAIN, m_mid2Gain); } float Equalizer::getMid2Gain() const { return m_mid2Gain; } void Equalizer::setMid2Center(float value) { value = std::min(value, 8000.0f); value = std::max(value, 1000.0f); m_mid2Center = value; alEffectf(m_effect, AL_EQUALIZER_MID2_CENTER, m_mid2Center); } float Equalizer::getMid2Center() const { return m_mid2Center; } void Equalizer::setMid2Width(float value) { value = std::min(value, 1.0f); value = std::max(value, 0.01f); m_mid2Width = value; alEffectf(m_effect, AL_EQUALIZER_MID2_WIDTH, m_mid2Width); } float Equalizer::getMid2Width() const { return m_mid2Width; } void Equalizer::setHighGain(float value) { value = std::min(value, 7.943f); value = std::max(value, 0.126f); m_highGain = value; alEffectf(m_effect, AL_EQUALIZER_HIGH_GAIN, m_highGain); } float Equalizer::getHighGain() const { return m_highGain; } void Equalizer::setHighCutoff(float value) { value = std::min(value, 16000.0f); value = std::max(value, 4000.0f); m_highCutoff = value; alEffectf(m_effect, AL_EQUALIZER_HIGH_CUTOFF, m_highCutoff); } float Equalizer::getHighCutoff() const { return m_highCutoff; } EaxReverb::EaxReverb() : m_density(1.0f), m_diffusion(1.0f), m_gain(0.32f), m_gainHf(0.89f), m_gainLf(0.0f), m_decayTime(1.49f), m_decayHfRatio(0.83f), m_decayLfRatio(1.0f), m_reflectionsGain(0.05f), m_reflectionsDelay(0.007f), m_reflectionsPan(AudioSpaceCoordinate(0.0, 0.0, 0.0)), m_lateReverbGain(1.26f), m_lateReverbDelay(0.011f), m_lateReverbPan(AudioSpaceCoordinate(0.0, 0.0, 0.0)), m_echoTime(0.25f), m_echoDepth(0.0f), m_modulationTime(0.25f), m_modulationDepth(0.0f), m_airAbsorptionGainHf(0.994f), m_hfReference(5000.0f), m_lfReference(250.0f), m_roomRolloffFactor(0.0f), m_decayHfLimit(true) { m_effectType = SE_EFFECT_EAXREVERB; alEffecti(m_effect, AL_EFFECT_TYPE, AL_EFFECT_EAXREVERB); } void EaxReverb::setDensity(float value) { value = std::min(value, 1.0f); value = std::max(value, 0.0f); m_density = value; alEffectf(m_effect, AL_EAXREVERB_DENSITY, m_density); } float EaxReverb::getDensity() const { return m_density; } void EaxReverb::setDiffusion(float value) { value = std::min(value, 1.0f); value = std::max(value, 0.0f); m_diffusion = value; alEffectf(m_effect, AL_EAXREVERB_DIFFUSION, m_diffusion); } float EaxReverb::getDiffusion() const { return m_diffusion; } void EaxReverb::setGain(float value) { value = std::min(value, 1.0f); value = std::max(value, 0.0f); m_gain = value; alEffectf(m_effect, AL_EAXREVERB_GAIN, m_gain); } float EaxReverb::getGain() const { return m_gain; } void EaxReverb::setGainHf(float value) { value = std::min(value, 1.0f); value = std::max(value, 0.0f); m_gainHf = value; alEffectf(m_effect, AL_EAXREVERB_GAINHF, m_gainHf); } float EaxReverb::getGainHf() const { return m_gainHf; } void EaxReverb::setGainLf(float value) { value = std::min(value, 1.0f); value = std::max(value, 0.0f); m_gainLf = value; alEffectf(m_effect, AL_EAXREVERB_GAINLF, m_gainLf); } float EaxReverb::getGainLf() const { return m_gainLf; } void EaxReverb::setDecayTime(float value) { value = std::min(value, 20.0f); value = std::max(value, 0.1f); m_decayTime = value; alEffectf(m_effect, AL_EAXREVERB_DECAY_TIME, m_decayTime); } float EaxReverb::getDecayTime() const { return m_decayTime; } void EaxReverb::setDecayHfRatio(float value) { value = std::min(value, 2.0f); value = std::max(value, 0.1f); m_decayHfRatio = value; alEffectf(m_effect, AL_EAXREVERB_DECAY_HFRATIO, m_decayHfRatio); } float EaxReverb::getDecayHfRatio() const { return m_decayHfRatio; } void EaxReverb::setDecayLfRatio(float value) { value = std::min(value, 2.0f); value = std::max(value, 0.1f); m_decayLfRatio = value; alEffectf(m_effect, AL_EAXREVERB_DECAY_LFRATIO, m_decayLfRatio); } float EaxReverb::getDecayLfRatio() const { return m_decayLfRatio; } void EaxReverb::setReflectionsGain(float value) { value = std::min(value, 3.16f); value = std::max(value, 0.0f); m_reflectionsGain = value; alEffectf(m_effect, AL_EAXREVERB_REFLECTIONS_GAIN, m_reflectionsGain); } float EaxReverb::getReflectionsGain() const { return m_reflectionsGain; } void EaxReverb::setReflectionsDelay(float value) { value = std::min(value, 0.3f); value = std::max(value, 0.0f); m_reflectionsDelay = value; alEffectf(m_effect, AL_EAXREVERB_REFLECTIONS_DELAY, m_reflectionsDelay); } float EaxReverb::getReflectionsDelay() const { return m_reflectionsDelay; } void EaxReverb::setReflectionsPan(const AudioSpaceCoordinate& coordinate) { m_reflectionsPan.x = std::min(coordinate.x, double(1.0)); m_reflectionsPan.x = std::max(coordinate.x, double(-1.0)); m_reflectionsPan.y = std::min(coordinate.y, double(1.0)); m_reflectionsPan.y = std::max(coordinate.y, double(-1.0)); m_reflectionsPan.z = std::min(coordinate.z, double(1.0)); m_reflectionsPan.z = std::max(coordinate.z, double(-1.0)); ALfloat vec[3] = { static_cast(m_reflectionsPan.x), static_cast(m_reflectionsPan.y), static_cast(m_reflectionsPan.z)}; alEffectfv(m_effect, AL_EAXREVERB_REFLECTIONS_PAN, vec); } AudioSpaceCoordinate EaxReverb::getReflectionsPan() const { return m_reflectionsPan; } void EaxReverb::setLateReverbGain(float value) { value = std::min(value, 10.0f); value = std::max(value, 0.0f); m_lateReverbGain = value; alEffectf(m_effect, AL_EAXREVERB_LATE_REVERB_GAIN, m_lateReverbGain); } float EaxReverb::getLateReverbGain() const { return m_lateReverbGain; } void EaxReverb::setLateReverbDelay(float value) { value = std::min(value, 0.1f); value = std::max(value, 0.0f); m_reflectionsDelay = value; alEffectf(m_effect, AL_EAXREVERB_LATE_REVERB_DELAY, m_reflectionsDelay); } float EaxReverb::getLateReverbDelay() const { return m_reflectionsDelay; } void EaxReverb::setLateReverbPan(const AudioSpaceCoordinate& coordinate) { m_lateReverbPan.x = std::min(coordinate.x, double(1.0)); m_lateReverbPan.x = std::max(coordinate.x, double(-1.0)); m_lateReverbPan.y = std::min(coordinate.y, double(1.0)); m_lateReverbPan.y = std::max(coordinate.y, double(-1.0)); m_lateReverbPan.z = std::min(coordinate.z, double(1.0)); m_lateReverbPan.z = std::max(coordinate.z, double(-1.0)); ALfloat vec[3] = { static_cast(m_lateReverbPan.x), static_cast(m_lateReverbPan.y), static_cast(m_lateReverbPan.z) }; alEffectfv(m_effect, AL_EAXREVERB_LATE_REVERB_PAN, vec); } AudioSpaceCoordinate EaxReverb::getLateReverbPan() const { return m_lateReverbPan; } void EaxReverb::setEchoTime(float value) { value = std::min(value, 0.25f); value = std::max(value, 0.075f); m_echoTime = value; alEffectf(m_effect, AL_EAXREVERB_ECHO_TIME, m_echoTime); } float EaxReverb::getEchoTime() const { return m_echoTime; } void EaxReverb::setEchoDepth(float value) { value = std::min(value, 1.0f); value = std::max(value, 0.0f); m_echoDepth = value; alEffectf(m_effect, AL_EAXREVERB_ECHO_DEPTH, m_echoDepth); } float EaxReverb::getEchoDepth() const { return m_echoDepth; } void EaxReverb::setModulationTime(float value) { value = std::min(value, 4.0f); value = std::max(value, 0.04f); m_modulationTime = value; alEffectf(m_effect, AL_EAXREVERB_MODULATION_TIME, m_modulationTime); } float EaxReverb::getModulationTime() const { return m_modulationTime; } void EaxReverb::setModulationDepth(float value) { value = std::min(value, 1.0f); value = std::max(value, 0.0f); m_modulationDepth = value; alEffectf(m_effect, AL_EAXREVERB_MODULATION_DEPTH, m_modulationDepth); } float EaxReverb::getModulationDepth() const { return m_modulationDepth; } void EaxReverb::setAirAbsorptionGainHf(float value) { value = std::min(value, 1.0f); value = std::max(value, 0.892f); m_airAbsorptionGainHf = value; alEffectf(m_effect, AL_EAXREVERB_AIR_ABSORPTION_GAINHF, m_airAbsorptionGainHf); } float EaxReverb::getAirAbsorptionGainHf() const { return m_airAbsorptionGainHf; } void EaxReverb::setHfReference(float value) { value = std::min(value, 20000.0f); value = std::max(value, 1000.0f); m_hfReference = value; alEffectf(m_effect, AL_EAXREVERB_HFREFERENCE, m_hfReference); } float EaxReverb::getHfReference() const { return m_hfReference; } void EaxReverb::setLfReference(float value) { value = std::min(value, 1000.0f); value = std::max(value, 20.0f); m_lfReference = value; alEffectf(m_effect, AL_EAXREVERB_LFREFERENCE, m_lfReference); } float EaxReverb::getLfReference() const { return m_lfReference; } void EaxReverb::setRoomRolloffFactor(float value) { value = std::min(value, 10.0f); value = std::max(value, 0.0f); m_roomRolloffFactor = value; alEffectf(m_effect, AL_EAXREVERB_ROOM_ROLLOFF_FACTOR, m_roomRolloffFactor); } float EaxReverb::getRoomRolloffFactor() const { return m_roomRolloffFactor; } void EaxReverb::setDecayHfLimit(bool value) { m_decayHfLimit = value; alEffecti(m_effect, AL_EAXREVERB_DECAY_HFLIMIT, m_decayHfLimit ? AL_TRUE : AL_FALSE); } bool EaxReverb::isDecayHfLimit() const { return m_decayHfLimit; } void EaxReverb::loadPreset(const EFXEAXREVERBPROPERTIES& prop) { // reflections and reverb pans are always 0 vectors, skip it setDensity(prop.flDensity); setDiffusion(prop.flDiffusion); setGain(prop.flGain); setGainHf(prop.flGainHF); setGainLf(prop.flGainLF); setDecayTime(prop.flDecayTime); setDecayHfRatio(prop.flDecayHFRatio); setDecayLfRatio(prop.flDecayLFRatio); setReflectionsGain(prop.flReflectionsGain); setReflectionsDelay(prop.flReflectionsDelay); setLateReverbGain(prop.flLateReverbGain); setLateReverbDelay(prop.flLateReverbDelay); setEchoTime(prop.flEchoTime); setEchoDepth(prop.flEchoDepth); setModulationTime(prop.flModulationTime); setModulationDepth(prop.flModulationDepth); setAirAbsorptionGainHf(prop.flAirAbsorptionGainHF); setHfReference(prop.flHFReference); setLfReference(prop.flLFReference); setRoomRolloffFactor(prop.flRoomRolloffFactor); setDecayHfLimit(prop.iDecayHFLimit ? true : false); } } //FIFE fifengine-0.4.2/engine/core/audio/effects/soundeffect.h000066400000000000000000000762241341615052600230600ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_SOUNDEFFECT_H #define FIFE_SOUNDEFFECT_H // Standard C++ library includes // Platform specific includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "model/metamodel/modelcoords.h" #include "audio/fife_openal.h" #include "audio/soundconfig.h" namespace FIFE { class SoundFilter; /** Base class for Efx sound effects. */ class SoundEffect { public: /** Constructor */ SoundEffect(); /** Destructor */ virtual ~SoundEffect(); /** Return the OpenAL effect handle. */ ALuint getEffectId() const; /** Sets the OpenAL auxiliary slot handle. */ void setSlotId(ALuint slot); /** Return the OpenAL auxiliary slot handle. */ ALuint getSlotId(); /** Return sound effect type. * @see SoundEffectType */ SoundEffectType getEffectType() const; /** Enables or disables the effect. * @param enabled A bool to indicate if the effect is enabled or disabled. */ void setEnabled(bool enabled); /** Return true if the effect is enabled, false otherwise. */ bool isEnabled() const; /** Sets the additional sound filter. * @param filter The SoundFilter or NULL. */ void setFilter(SoundFilter* filter); /** Return sound filter or NULL. */ SoundFilter* getFilter(); protected: //! Effect object id ALuint m_effect; //! Effect slot id; ALuint m_slot; //! Sound effect type SoundEffectType m_effectType; //! Effect enabled bool m_enabled; //! Additional filter effect SoundFilter* m_filter; }; /** The environmental reverberation effect. */ class Reverb : public SoundEffect { public: /** Constructor */ Reverb(); /** Sets density, controls the coloration of the late reverb. * Lowering the value adds more coloration. * @param value Range 0.0 to 1.0, default 1.0. */ void setDensity(float value); /** Return density value. */ float getDensity() const; /** Sets diffusion, controls the echo density in the reverberation decay. * @param value Range 0.0 to 1.0, default 1.0. */ void setDiffusion(float value); /** Return diffusion value. */ float getDiffusion() const; /** Sets gain, is the master volume control for the reflected sound. * @param value Range 0.0 to 1.0, default 0.32. */ void setGain(float value); /** Return gain value. */ float getGain() const; /** Sets gain hf, tweaks reflected sound by attenuating it at high frequencies. * @param value Range 0.0 to 1.0, default 0.89. */ void setGainHf(float value); /** Return hf gain. */ float getGainHf() const; /** The reverberation decay time. * @param value Range 0.0 to 20.0, default 1.49 seconds. */ void setDecayTime(float value); /** Return decay time. */ float getDecayTime() const; /** Sets decay hf ratio, the spectral quality of the Decay Time parameter. It * is the ratio of high-frequency decay time relative to the time set by Decay Time. * @param value Range 0.1 to 2.0, default 0.83. */ void setDecayHfRatio(float value); /** Return decay hf ratio. */ float getDecayHfRatio() const; /** Sets reflections gain, the overall amount of initial reflections * relative to the Gain property. * @param value Range 0.0 to 3.16, default 0.05. */ void setReflectionsGain(float value); /** Return reflections gain. */ float getReflectionsGain() const; /** Sets the reflections delay, the amount of delay between the arrival time of * the direct path from the source to the first reflection from the source. * @param value Range 0.0 to 0.3, default 0.007. */ void setReflectionsDelay(float value); /** Return reflections delay. */ float getReflectionsDelay() const; /** Sets late reverb gain, the overall amount of later reverberation relative to gain. * @param value Range 0.0 to 10.0, default 1.26. */ void setLateReverbGain(float value); /** Return late reverb gain. */ float getLateReverbGain() const; /** Sets late reverb delay, the begin time of the late reverberation relative * to the time of the initial reflection. * @param value Range 0.0 to 0.1, default 0.011 seconds. */ void setLateReverbDelay(float value); /** Return late reverb delay. */ float getLateReverbDelay() const; /** Sets air absorption gain hf, the distance-dependent attenuation at * high frequencies caused by the propagation medium. * @param value Range 0.892 to 1.0, default 0.994. */ void setAirAbsorptionGainHf(float value); /** Return air absorption gain hf. */ float getAirAbsorptionGainHf() const; /** Sets room rolloff factor, similar to rolloff factor it attenuate the reflected sound * (containing both reflections and reverberation) according to source-listener distance. * @param value Range 0.0 to 10.0, default 0.0. */ void setRoomRolloffFactor(float value); /** Return room rolloff factor. */ float getRoomRolloffFactor() const; /** If decay hf limit is enabled, the high-frequency decay time automatically stays * below a limit value that’s derived from the setting of Air Absorption HF. * @param value True or false. Default is true. */ void setDecayHfLimit(bool value); /** Return if decay hf limit is enabled. */ bool isDecayHfLimit() const; private: float m_density; float m_diffusion; float m_gain; float m_gainHf; float m_decayTime; float m_decayHfRatio; float m_reflectionsGain; float m_reflectionsDelay; float m_lateReverbGain; float m_lateReverbDelay; float m_airAbsorptionGainHf; float m_roomRolloffFactor; bool m_decayHfLimit; }; /** The chorus effect essentially replays the input audio accompanied by another * slightly delayed version of the signal, creating a ‘doubling’ effect. */ class Chorus : public SoundEffect { public: /** Constructor */ Chorus(); /** Sets the waveform to triangle or sinus. Controls delay time of delayed signals. * @param value True for triangle, false for sinus. Default is true. */ void setWaveformTriangle(bool value); /** Return if wavefrom is triangle. */ bool isWaveformTriangle() const; /** Sets the phase, difference between the left and right LFO’s. * @param value Range -180 to 180, default 90. */ void setPhase(int32_t value); /** Return the phase. */ int32_t getPhase() const; /** Sets the rate, the modulation rate of the LFO that controls * the delay time of the delayed signals. * @param value Range 0.0 to 10.0, default 1.1. */ void setRate(float value); /** Return the rate. */ float getRate() const; /** Sets the depth, the amount by which the delay time is modulated by the LFO. * @param value Range 0.0 to 1.0, default 0.1. */ void setDepth(float value); /** Return the depth. */ float getDepth() const; /** Sets the feedback, the amount of processed signal that is * fed back to the input of the chorus effect. * @param value Range -1.0 to 1.0, default 0.25. */ void setFeedback(float value); /** Return feedback. */ float getFeedback() const; /** Sets the delay, the average amount of time the sample is delayed before * it is played back. * @param value Range 0.0 to 0.016, default 0.016. */ void setDelay(float value); /** Return delay. */ float getDelay() const; private: bool m_waveformTriangle; int32_t m_phase; float m_rate; float m_depth; float m_feedback; float m_delay; }; /** The distortion effect simulates turning up (overdriving) the gain stage * on a guitar amplifier or adding a distortion pedal to an instrument’s output. */ class Distortion : public SoundEffect { public: /** Constructor */ Distortion(); /** Sets edge, the shape of the distortion. * @param value Range 0.0 to 1.0, default 0.2. */ void setEdge(float value); /** Return edge. */ float getEdge() const; /** Sets gain, to attenuate the distorted sound. * @param value Range 0.01 to 1.0, default 0.05. */ void setGain(float value); /** Return gain. */ float getGain() const; /** Sets lowpass cutoff, to limit the amount of high frequency signal * feeding into the distortion effect. * @param value Range 80.0 to 24000.0, default 8000.0. */ void setLowpassCutoff(float value); /** Return lowpass cutoff. */ float getLowpassCutoff() const; /** Sets EQ center, the frequency at which the post-distortion * attenuation (Distortion Gain) is active. * @param value Range 80.0 to 24000.0, default 3600.0. */ void setEqCenter(float value); /** Return EQ center. */ float getEqCenter() const; /** Sets EQ bandwidth, the bandwidth of the post-distortion attenuation. * @param value Range 80.0 to 24000.0, default 3600.0. */ void setEqBandwidth(float value); /** Return EQ bandwidth. */ float getEqBandwidth() const; private: float m_edge; float m_gain; float m_lowpassCutoff; float m_eqCenter; float m_eqBandwidth; }; /** The echo effect generates discrete, delayed instances of the input signal. * The amount of delay and feedback is controllable. */ class Echo : public SoundEffect { public: /** Constructor */ Echo(); /** Sets the delay between the original sound and the first ‘tap’, or echo instance. * @param value Range 0.0 to 0.207, default 0.1. */ void setDelay(float value); /** Return delay. */ float getDelay() const; /** Sets the delay between the first ‘tap’ and the second ‘tap’. * @param value Range 0.0 to 0.404, default 0.1. */ void setLrDelay(float value); /** Return LR delay. */ float getLrDelay() const; /** Sets damping, the amount of high frequency damping applied to each echo. * @param value Range 0.0 to 0.99, default 0.5. */ void setDamping(float value); /** Return damping. */ float getDamping() const; /** Sets feedback, the amount of feedback the output signal fed back into the input. * @param value Range 0.0 to 1.0, default 0.5. */ void setFeedback(float value); /** Return feedback. */ float getFeedback() const; /** Sets spread, that defines how hard panned the individual echoes are. * @param value Range -1.0 to 1.0, default -1.0. */ void setSpread(float value); /** Return spread. */ float getSpread() const; private: float m_delay; float m_lrDelay; float m_damping; float m_feedback; float m_spread; }; /** The flanger effect creates a “tearing” or “whooshing” sound. */ class Flanger : public SoundEffect { public: /** Constructor */ Flanger(); /** Sets waveform to triangle or sinus. Controls the amount of the * delay of the sampled signal. * @param value If true triangle is used otherwise sinus, default is true. */ void setWaveformTriangle(bool value); /** Return if waveform is triangle or sinus. */ bool isWaveformTriangle() const; /** Sets phase, difference between the left and right LFO’s. * At zero degrees the two LFOs are synchronized. * @param value Range -180 to 180, default 0. */ void setPhase(int32_t value); /** Return phase. */ int32_t getPhase() const; /** Sets rate, the number of times per second the LFO * controlling the amount of delay repeats. * @param value Range 0.0 to 10.0, default 0.27. */ void setRate(float value); /** Return rate. */ float getRate() const; /** Sets depth, the ratio by which the delay time is modulated by the LFO. * @param value Range 0.0 to 1.0, default 1.0. */ void setDepth(float value); /** Return depth. */ float getDepth() const; /** Sets feedback, the amount of the output signal level fed * back into the effect’s input. * @param value Range -1.0 to 1.0, default -0.5. */ void setFeedback(float value); /** Return feedback. */ float getFeedback() const; /** Sets delay, the average amount of time the sample is delayed * before it is played back. * @param value Range 0.0 to 0.004, default 0.002. */ void setDelay(float value); /** Return delay. */ float getDelay() const; private: bool m_waveformTriangle; int32_t m_phase; float m_rate; float m_depth; float m_feedback; float m_delay; }; /** The frequency shifter is a single-sideband modulator, which translates all * the component frequencies of the input signal by an equal amount. */ class FrequencyShifter : public SoundEffect { public: /** Constructor */ FrequencyShifter(); /** Sets the carrier frequency. For carrier frequencies below the audible range, * the single-sideband modulator may produce phaser, spatial effects. * @param value Range 0.0 to 24000.0, default 0.0. */ void setFrequency(float value); /** Return carrier frequency. */ float getFrequency() const; /** Sets left direction, selects which internal signals are * added together to produce the output. * @param value Range 0 to 2. 0=down, 1=up, 2=off, default 0. */ void setLeftDirection(uint8_t value); /** Return left direction. */ uint8_t getLeftDirection() const; /** Sets right direction, selects which internal signals are * added together to produce the output. * @param value Range 0 to 2. 0=down, 1=up, 2=off, default 0. */ void setRightDirection(uint8_t value); /** Return left direction. */ uint8_t getRightDirection() const; private: float m_frequency; uint8_t m_leftDirection; uint8_t m_rightDirection; }; /** The vocal morpher consists of a pair of 4-band formant filters, * used to impose vocal tract effects upon the input signal. * Phoneme values: * 0=“A”, 1=“E”, 2="I", 3="O", 4="U", 5=“AA”, 6=“AE”, 7=“AH”, 8=“AO”, 9=“EH”, * 10=“ER”, 11=“IH”, 12=“IY”, 13=“UH”, 14=“UW”, 15=“B”, 16=“D”, 17=“F”, 18=“G”, * 19=“J”, 20=“K”, 21=“L”, 22=“M”, 23=“N”, 24=“P”, 25=“R”, 26=“S”, 27=“T”, 28=“V”, 29=“Z” */ class VocalMorpher : public SoundEffect { public: /** Constructor */ VocalMorpher(); /** Sets phoneme A. * @param value Range 0 to 29, default 0. */ void setPhonemeA(uint16_t value); /** Return phoneme A. */ uint16_t getPhonemeA() const; /** Sets phoneme B. * @param value Range 0 to 29, default 10. */ void setPhonemeB(uint16_t value); /** Return phoneme B. */ uint16_t getPhonemeB() const; /** Sets phoneme coarse A, used to adjust the pitch of phoneme * filters A and B in 1-semitone increments. * @param value Range -24 to 24, default 0. */ void setPhonemeCoarseA(int16_t value); /** Return phoneme coarse A. */ int16_t getPhonemeCoarseA() const; /** Sets phoneme coarse B, used to adjust the pitch of phoneme * filters A and B in 1-semitone increments. * @param value Range -24 to 24, default 0. */ void setPhonemeCoarseB(int16_t value); /** Return phoneme coarse B. */ int16_t getPhonemeCoarseB() const; /** Sets waveform, the shape of the low-frequency oscillator * used to morph between the two phoneme filters. * @param value Range 0 to 2, default 0. 0=sin, 1=tri, 2=saw. */ void setWaveform(uint8_t value); /** Return waveform. */ uint8_t getWaveform() const; /** Sets rate, the frequency of the low-frequency oscillator used * to morph between the two phoneme filters. * @param value Range 0.0 to 10.0, dfault 1.41. */ void setRate(float value); /** Return rate. */ float getRate() const; private: uint16_t m_phonemeA; uint16_t m_phonemeB; int16_t m_phonemeCoarseA; int16_t m_phonemeCoarseB; uint8_t m_waveform; float m_rate; }; /** The pitch shifter applies time-invariant pitch shifting to the input signal, * over a one octave range and controllable at a semi-tone and cent resolution. */ class PitchShifter : public SoundEffect { public: /** Constructor */ PitchShifter(); /** Sets coarse tune, the number of semitones by which the pitch is shifted. * There are 12 semitones per octave. * @param value Range -12 to 12, default 12. */ void setCoarseTune(int16_t value); /** Return coarse tune. */ int16_t getCoarseTune() const; /** Sets fine tune, the number of cents between Semitones a pitch is shifted. * A Cent is 1/100th of a Semitone. * @param value Range -50 to 50, default 0. */ void setFineTune(int16_t value); /** Return fine tune. */ int16_t getFineTune() const; private: int16_t m_coarseTune; int16_t m_fineTune; }; /** The ring modulator multiplies an input signal by a carrier signal in the * time domain, resulting in tremolo or inharmonic effects. */ class RingModulator : public SoundEffect { public: /** Constructor */ RingModulator(); /** Sets the carrier signal frequency. * @param value Range 0.0 to 8000.0, default 440.0. */ void setFrequency(float value); /** Return carrier frequency. */ float getFrequency() const; /** Sets highpass cutoff at which the input signal is high-pass * filtered before being ring modulated. * @param value Range 0.0 to 24000.0, default 800.0. */ void setHighpassCutoff(float value); /** Return highpass cutoff frequency. */ float getHighpassCutoff() const; /** Sets waveform used as the carrier signal. * @param value Range 0 to 2, default 0. 0=sin, 1=saw, 2=square. */ void setWaveform(uint8_t value); uint8_t getWaveform() const; private: float m_frequency; float m_highpassCutoff; uint8_t m_waveform; }; /** The Auto-wah effect emulates the sound of a wah-wah pedal used * with an electric guitar, or a mute on a brass instrument. */ class Autowah : public SoundEffect { public: /** Constructor */ Autowah(); /** Sets attack time, the time the filtering effect takes to sweep * from minimum to maximum center frequency when it is triggered by input signal. * @param value Range 0.0001 to 1.0, default 0.06. */ void setAttackTime(float value); /** Return attack time. */ float getAttackTime() const; /** Sets relase time, the time the filtering effect takes to sweep * from maximum back to base center frequency, when the input signal ends. * @param value Range 0.0001 to 1.0, default 0.06. */ void setReleaseTime(float value); /** Return release time. */ float getReleaseTime() const; /** Sets resonance, the peak, some times known as emphasis or Q, * of the auto-wah band-pass filter. * @param value Range 2.0 to 1000.0, default 1000.0. */ void setResonance(float value); /** Return resonance. */ float getResonance() const; /** Sets peak gain, the input signal level at which the band-pass * filter will be fully opened. * @param value Range 0.00003 to 31621.0, default 11.22. */ void setPeakGain(float value); /** Return peak gain. */ float getPeakGain() const; private: float m_attackTime; float m_releaseTime; float m_resonance; float m_peakGain; }; /** The Automatic Gain Control effect performs the same task as a studio * compressor – evening out the audio dynamic range of an input sound. */ class Compressor : public SoundEffect { public: /** Constructor */ Compressor(); /** Sets compressor on or off. * @param value True or false, default is true. */ void setCompressor(bool value); /** Return true if compressor is on, false otherwise. */ bool isCompressor() const; private: bool m_active; }; /** The Equalizer providing tonal control over four different * adjustable frequency ranges. Low, Mid1, Mid2 and High. */ class Equalizer : public SoundEffect { public: /** Constructor */ Equalizer(); /** Sets low gain, the amount of cut or boost on the low frequency range. * @param value Range 0.126 to 7.943, default 1.0. */ void setLowGain(float value); /** Return low gain. */ float getLowGain() const; /** Sets low cutoff, the low frequency below which signal will be cut off. * @param value Range 50.0 to 800.0, default 200.0. */ void setLowCutoff(float value); /** Return low cutoff. */ float getLowCutoff() const; /** Sets mid1 gain, cut / boost signal on the “mid1” range. * @param value Range 0.126 to 7.943, default 1.0. */ void setMid1Gain(float value); /** Return mid1 gain. */ float getMid1Gain() const; /** Sets mid1 center, the center frequency for the “mid1” range. * @param value Range 200.0 to 3000.0, default 500.0. */ void setMid1Center(float value); /** Return mid1 center frequency. */ float getMid1Center() const; /** Sets mid1 width, the width of the “mid1” range. * @param value Range 0.01 to 1.0, default 1.0. */ void setMid1Width(float value); /** Return mid1 width. */ float getMid1Width() const; /** Sets mid2 gain, cut / boost signal on the “mid2” range. * @param value Range 0.126 to 7.943, default 1.0. */ void setMid2Gain(float value); /** Return mid1 gain. */ float getMid2Gain() const; /** Sets mid2 center, the center frequency for the “mid2” range. * @param value Range 1000.0 to 8000.0, default 3000.0. */ void setMid2Center(float value); /** Return mid2 center frequency. */ float getMid2Center() const; /** Sets mid2 width, the width of the “mid2” range. * @param value Range 0.01 to 1.0, default 1.0. */ void setMid2Width(float value); /** Return mid2 width. */ float getMid2Width() const; /** Sets high gain, cut / boost signal on the “high” range. * @param value Range 0.126 to 7.943, default 1.0. */ void setHighGain(float value); /** Return high gain. */ float getHighGain() const; /** Sets high cutoff, the high frequency above which signal will be cut off. * @param value Range 4000.0 to 16000.0, default 6000.0. */ void setHighCutoff(float value); /** Return high cutoff frequency. */ float getHighCutoff() const; private: float m_lowGain; float m_lowCutoff; float m_mid1Gain; float m_mid1Center; float m_mid1Width; float m_mid2Gain; float m_mid2Center; float m_mid2Width; float m_highGain; float m_highCutoff; }; /** The EAX Reverb is similar to Reverb but supports more options. * There exists already over 100 presets for it. See SoundEffectPreset. */ class EaxReverb : public SoundEffect { public: /** Constructor */ EaxReverb(); /** Sets density, controls the coloration of the late reverb. * Lowering the value adds more coloration. * @param value Range 0.0 to 1.0, default 1.0. */ void setDensity(float value); /** Return density value. */ float getDensity() const; /** Sets diffusion, controls the echo density in the reverberation decay. * @param value Range 0.0 to 1.0, default 1.0. */ void setDiffusion(float value); /** Return diffusion value. */ float getDiffusion() const; /** Sets gain, is the master volume control for the reflected sound. * @param value Range 0.0 to 1.0, default 0.32. */ void setGain(float value); /** Return gain value. */ float getGain() const; /** Sets gain hf, tweaks reflected sound by attenuating it at high frequencies. * @param value Range 0.0 to 1.0, default 0.89. */ void setGainHf(float value); /** Return hf gain. */ float getGainHf() const; /** Sets gain lf, tweaks reflected sound by attenuating it at low frequencies. * @param value Range 0.0 to 1.0, default 0.0. */ void setGainLf(float value); /** Return lf gain. */ float getGainLf() const; /** The reverberation decay time. * @param value Range 0.0 to 20.0, default 1.49 seconds. */ void setDecayTime(float value); /** Return decay time. */ float getDecayTime() const; /** Sets decay hf ratio, the spectral quality of the Decay Time parameter. It * is the ratio of high-frequency decay time relative to the time set by Decay Time. * @param value Range 0.1 to 2.0, default 0.83. */ void setDecayHfRatio(float value); /** Return decay hf ratio. */ float getDecayHfRatio() const; /** Sets decay lf ratio, the spectral quality of the Decay Time parameter. It * is the ratio of low-frequency decay time relative to the time set by Decay Time. * @param value Range 0.1 to 2.0, default 1.0. */ void setDecayLfRatio(float value); /** Return decay lf ratio. */ float getDecayLfRatio() const; /** Sets reflections gain, the overall amount of initial reflections * relative to the Gain property. * @param value Range 0.0 to 3.16, default 0.05. */ void setReflectionsGain(float value); /** Return reflections gain. */ float getReflectionsGain() const; /** Sets the reflections delay, the amount of delay between the arrival time of * the direct path from the source to the first reflection from the source. * @param value Range 0.0 to 0.3, default 0.007. */ void setReflectionsDelay(float value); /** Return reflections delay. */ float getReflectionsDelay() const; /** Sets reflections pan, the 3D vector that controls the spatial distribution * of the cluster of early reflections. The direction of this vector controls * the global direction of the reflections, while its magnitude controls how * focused the reflections are towards this direction. * @param coordinate A 3D vector with values between 0.0 and 1.0. */ void setReflectionsPan(const AudioSpaceCoordinate& coordinate); /** Return reflections pan. */ AudioSpaceCoordinate getReflectionsPan() const; /** Sets late reverb gain, the overall amount of later reverberation relative to gain. * @param value Range 0.0 to 10.0, default 1.26. */ void setLateReverbGain(float value); /** Return late reverb gain. */ float getLateReverbGain() const; /** Sets late reverb delay, the begin time of the late reverberation relative * to the time of the initial reflection. * @param value Range 0.0 to 0.1, default 0.011 seconds. */ void setLateReverbDelay(float value); /** Return late reverb delay. */ float getLateReverbDelay() const; /** Sets late reverb pan, the 3D vector that controls the spatial distribution * of the late reverb. The direction of this vector controls the global direction * of the reverb, while its magnitude controls how focused the reverb are towards this direction. * @param coordinate A 3D vector with values between 0.0 and 1.0. */ void setLateReverbPan(const AudioSpaceCoordinate& coordinate); /** Return late reverb pan. */ AudioSpaceCoordinate getLateReverbPan() const; /** Sets echo time, the rate at which the cyclic echo repeats itself along * the reverberation decay. * @param value Range 0.075 to 0.25, default 0.25. */ void setEchoTime(float value); /** Return the echo time. */ float getEchoTime() const; /** Sets echo depth, the cyclic echo in the reverberation decay, which will be * noticeable with transient or percussive sounds. * @param value Range 0.0 to 1.0, defult 0.0. */ void setEchoDepth(float value); /** Return echo depth. */ float getEchoDepth() const; /** Sets modulation time, the speed of the vibrato (rate of periodic changes in pitch). * @param value Range 0.004 to 4.0, default 0.25 seconds. */ void setModulationTime(float value); /** Return modulation time. */ float getModulationTime() const; /** Sets modulation depth, the amount of pitch change. * @param value Range 0.0 to 1.0, default 0.0. */ void setModulationDepth(float value); /** Return modulation depth. */ float getModulationDepth() const; /** Sets air absorption gain hf, the distance-dependent attenuation at * high frequencies caused by the propagation medium. * @param value Range 0.892 to 1.0, default 0.994. */ void setAirAbsorptionGainHf(float value); /** Return air absorption gain hf. */ float getAirAbsorptionGainHf() const; /** Sets hf reference, determine respectively the frequencies at which the * high-frequency effects created by EAX Reverb properties are measured, * for example Decay HF Ratio. * @param value Range 1000.0 to 20000.0, default 5000.0 Hz. */ void setHfReference(float value); /** Return hf reference. */ float getHfReference() const; /** Sets lf reference, determine respectively the frequencies at which the * low-frequency effects created by EAX Reverb properties are measured, * for example Decay LF Ratio. * Note: Should be less than 1/10 of HF Reference. * @param value Range 20.0 to 1000.0 , default 250.0 Hz. */ void setLfReference(float value); /** Return lf reference. */ float getLfReference() const; /** Sets room rolloff factor, similar to rolloff factor it attenuate the reflected sound * (containing both reflections and reverberation) according to source-listener distance. * @param value Range 0.0 to 10.0, default 0.0. */ void setRoomRolloffFactor(float value); /** Return room rolloff factor. */ float getRoomRolloffFactor() const; /** If decay hf limit is enabled, the high-frequency decay time automatically stays * below a limit value that’s derived from the setting of Air Absorption HF. * @param value True or false. Default is true. */ void setDecayHfLimit(bool value); /** Return if decay hf limit is enabled. */ bool isDecayHfLimit() const; /** Load presets into the EAX reverb. * @see SoundEffectPreset */ void loadPreset(const EFXEAXREVERBPROPERTIES& prop); private: float m_density; float m_diffusion; float m_gain; float m_gainHf; float m_gainLf; float m_decayTime; float m_decayHfRatio; float m_decayLfRatio; float m_reflectionsGain; float m_reflectionsDelay; AudioSpaceCoordinate m_reflectionsPan; float m_lateReverbGain; float m_lateReverbDelay; AudioSpaceCoordinate m_lateReverbPan; float m_echoTime; float m_echoDepth; float m_modulationTime; float m_modulationDepth; float m_airAbsorptionGainHf; float m_hfReference; float m_lfReference; float m_roomRolloffFactor; bool m_decayHfLimit; }; } #endif fifengine-0.4.2/engine/core/audio/effects/soundeffect.i000066400000000000000000000215331341615052600230520ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module soundeffect %{ #include "audio/effects/soundeffect.h" %} %include "model/metamodel/modelcoords.i" namespace FIFE { class SoundFilter; enum SoundEffectType { SE_EFFECT_NULL, SE_EFFECT_REVERB, SE_EFFECT_CHORUS, SE_EFFECT_DISTORTION, SE_EFFECT_ECHO, SE_EFFECT_FLANGER, SE_EFFECT_FREQUENCY_SHIFTER, SE_EFFECT_VOCAL_MORPHER, SE_EFFECT_PITCH_SHIFTER, SE_EFFECT_RING_MODULATOR, SE_EFFECT_AUTOWAH, SE_EFFECT_COMPRESSOR, SE_EFFECT_EQUALIZER, SE_EFFECT_EAXREVERB }; class SoundEffect { public: SoundEffectType getEffectType() const; bool isEnabled() const; protected: SoundEffect(); }; class Reverb : public SoundEffect { public: void setDensity(float value); float getDensity() const; void setDiffusion(float value); float getDiffusion() const; void setGain(float value); float getGain() const; void setGainHf(float value); float getGainHf() const; void setDecayTime(float value); float getDecayTime() const; void setDecayHfRatio(float value); float getDecayHfRatio() const; void setReflectionsGain(float value); float getReflectionsGain() const; void setReflectionsDelay(float value); float getReflectionsDelay() const; void setLateReverbGain(float value); float getLateReverbGain() const; void setLateReverbDelay(float value); float getLateReverbDelay() const; void setAirAbsorptionGainHf(float value); float getAirAbsorptionGainHf() const; void setRoomRolloffFactor(float value); float getRoomRolloffFactor() const; void setDecayHfLimit(bool value); bool isDecayHfLimit() const; private: Reverb(); }; class Chorus : public SoundEffect { public: void setWaveformTriangle(bool value); bool isWaveformTriangle() const; void setPhase(int32_t value); int32_t getPhase() const; void setRate(float value); float getRate() const; void setDepth(float value); float getDepth() const; void setFeedback(float value); float getFeedback() const; void setDelay(float value); float getDelay() const; private: Chorus(); }; class Distortion : public SoundEffect { public: void setEdge(float value); float getEdge() const; void setGain(float value); float getGain() const; void setLowpassCutoff(float value); float getLowpassCutoff() const; void setEqCenter(float value); float getEqCenter() const; void setEqBandwidth(float value); float getEqBandwidth() const; private: Distortion(); }; class Echo : public SoundEffect { public: void setDelay(float value); float getDelay() const; void setLrDelay(float value); float getLrDelay() const; void setDamping(float value); float getDamping() const; void setFeedback(float value); float getFeedback() const; void setSpread(float value); float getSpread() const; private: Echo(); }; class Flanger : public SoundEffect { public: void setWaveformTriangle(bool value); bool isWaveformTriangle() const; void setPhase(int32_t value); int32_t getPhase() const; void setRate(float value); float getRate() const; void setDepth(float value); float getDepth() const; void setFeedback(float value); float getFeedback() const; void setDelay(float value); float getDelay() const; private: Flanger(); }; class FrequencyShifter : public SoundEffect { public: void setFrequency(float value); float getFrequency() const; void setLeftDirection(uint8_t value); uint8_t getLeftDirection() const; void setRightDirection(uint8_t value); uint8_t getRightDirection() const; private: FrequencyShifter(); }; class VocalMorpher : public SoundEffect { public: void setPhonemeA(uint16_t value); uint16_t getPhonemeA() const; void setPhonemeB(uint16_t value); uint16_t getPhonemeB() const; void setPhonemeCoarseA(int16_t value); int16_t getPhonemeCoarseA() const; void setPhonemeCoarseB(int16_t value); int16_t getPhonemeCoarseB() const; void setWaveform(uint8_t value); uint8_t getWaveform() const; void setRate(float value); float getRate() const; private: VocalMorpher(); }; class PitchShifter : public SoundEffect { public: void setCoarseTune(int16_t value); int16_t getCoarseTune() const; void setFineTune(int16_t value); int16_t getFineTune() const; private: PitchShifter(); }; class RingModulator : public SoundEffect { public: void setFrequency(float value); float getFrequency() const; void setHighpassCutoff(float value); float getHighpassCutoff() const; void setWaveform(uint8_t value); uint8_t getWaveform() const; private: RingModulator(); }; class Autowah : public SoundEffect { public: void setAttackTime(float value); float getAttackTime() const; void setReleaseTime(float value); float getReleaseTime() const; void setResonance(float value); float getResonance() const; void setPeakGain(float value); float getPeakGain() const; private: Autowah(); }; class Compressor : public SoundEffect { public: void setCompressor(bool value); bool isCompressor() const; private: Compressor(); }; class Equalizer : public SoundEffect { public: void setLowGain(float value); float getLowGain() const; void setLowCutoff(float value); float getLowCutoff() const; void setMid1Gain(float value); float getMid1Gain() const; void setMid1Center(float value); float getMid1Center() const; void setMid1Width(float value); float getMid1Width() const; void setMid2Gain(float value); float getMid2Gain() const; void setMid2Center(float value); float getMid2Center() const; void setMid2Width(float value); float getMid2Width() const; void setHighGain(float value); float getHighGain() const; void setHighCutoff(float value); float getHighCutoff() const; private: Equalizer(); }; class EaxReverb : public SoundEffect { public: void setDensity(float value); float getDensity() const; void setDiffusion(float value); float getDiffusion() const; void setGain(float value); float getGain() const; void setGainHf(float value); float getGainHf() const; void setGainLf(float value); float getGainLf() const; void setDecayTime(float value); float getDecayTime() const; void setDecayHfRatio(float value); float getDecayHfRatio() const; void setDecayLfRatio(float value); float getDecayLfRatio() const; void setReflectionsGain(float value); float getReflectionsGain() const; void setReflectionsDelay(float value); float getReflectionsDelay() const; void setReflectionsPan(const AudioSpaceCoordinate& coordinate); AudioSpaceCoordinate getReflectionsPan() const; void setLateReverbGain(float value); float getLateReverbGain() const; void setLateReverbDelay(float value); float getLateReverbDelay() const; void setLateReverbPan(const AudioSpaceCoordinate& coordinate); AudioSpaceCoordinate getLateReverbPan() const; void setEchoTime(float value); float getEchoTime() const; void setEchoDepth(float value); float getEchoDepth() const; void setModulationTime(float value); float getModulationTime() const; void setModulationDepth(float value); float getModulationDepth() const; void setAirAbsorptionGainHf(float value); float getAirAbsorptionGainHf() const; void setHfReference(float value); float getHfReference() const; void setLfReference(float value); float getLfReference() const; void setRoomRolloffFactor(float value); float getRoomRolloffFactor() const; void setDecayHfLimit(bool value); bool isDecayHfLimit() const; private: EaxReverb(); }; } fifengine-0.4.2/engine/core/audio/effects/soundeffectmanager.cpp000066400000000000000000001000021341615052600247240ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // Platform specific includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "audio/soundemitter.h" #include "util/log/logger.h" #include "util/base/exception.h" #include "soundeffect.h" #include "soundfilter.h" #include "soundeffectmanager.h" namespace FIFE { /** Logger to use for this source file. * @relates Logger */ static Logger _log(LM_AUDIO); // Effect Slots LPALGENAUXILIARYEFFECTSLOTS alGenAuxiliaryEffectSlots = NULL; LPALDELETEAUXILIARYEFFECTSLOTS alDeleteAuxiliaryEffectSlots = NULL; LPALISAUXILIARYEFFECTSLOT alIsAuxiliaryEffectSlot = NULL; LPALAUXILIARYEFFECTSLOTI alAuxiliaryEffectSloti = NULL; LPALAUXILIARYEFFECTSLOTIV alAuxiliaryEffectSlotiv = NULL; LPALAUXILIARYEFFECTSLOTF alAuxiliaryEffectSlotf = NULL; LPALAUXILIARYEFFECTSLOTFV alAuxiliaryEffectSlotfv = NULL; LPALGETAUXILIARYEFFECTSLOTI alGetAuxiliaryEffectSloti = NULL; LPALGETAUXILIARYEFFECTSLOTIV alGetAuxiliaryEffectSlotiv = NULL; LPALGETAUXILIARYEFFECTSLOTF alGetAuxiliaryEffectSlotf = NULL; LPALGETAUXILIARYEFFECTSLOTFV alGetAuxiliaryEffectSlotfv = NULL; // Effects LPALGENEFFECTS alGenEffects = NULL; LPALDELETEEFFECTS alDeleteEffects = NULL; LPALISEFFECT alIsEffect = NULL; LPALEFFECTI alEffecti = NULL; LPALEFFECTIV alEffectiv = NULL; LPALEFFECTF alEffectf = NULL; LPALEFFECTFV alEffectfv = NULL; LPALGETEFFECTI alGetEffecti = NULL; LPALGETEFFECTIV alGetEffectiv = NULL; LPALGETEFFECTF alGetEffectf = NULL; LPALGETEFFECTFV alGetEffectfv = NULL; // Filters LPALGENFILTERS alGenFilters = NULL; LPALDELETEFILTERS alDeleteFilters = NULL; LPALISFILTER alIsFilter = NULL; LPALFILTERI alFilteri = NULL; LPALFILTERIV alFilteriv = NULL; LPALFILTERF alFilterf = NULL; LPALFILTERFV alFilterfv = NULL; LPALGETFILTERI alGetFilteri = NULL; LPALGETFILTERIV alGetFilteriv = NULL; LPALGETFILTERF alGetFilterf = NULL; LPALGETFILTERFV alGetFilterfv = NULL; SoundEffectManager::SoundEffectManager() : m_device(NULL), m_active(false), m_createdSlots(0), m_maxSlots(0) { } SoundEffectManager::~SoundEffectManager() { // SoundEmitters are destroyed beforehand for (std::vector::iterator it = m_filters.begin(); it != m_filters.end(); ++it) { delete *it; } for (std::vector::iterator it = m_effects.begin(); it != m_effects.end(); ++it) { delete *it; } } void SoundEffectManager::init(ALCdevice* device) { m_device = device; if (alcIsExtensionPresent(m_device, "ALC_EXT_EFX") == AL_FALSE) { FL_WARN(_log, LMsg() << "ALC_EXT_EFX not supported!\n"); return; } // Slot functions alGenAuxiliaryEffectSlots = (LPALGENAUXILIARYEFFECTSLOTS)alGetProcAddress("alGenAuxiliaryEffectSlots"); alDeleteAuxiliaryEffectSlots = (LPALDELETEAUXILIARYEFFECTSLOTS)alGetProcAddress("alDeleteAuxiliaryEffectSlots"); alIsAuxiliaryEffectSlot = (LPALISAUXILIARYEFFECTSLOT)alGetProcAddress("alIsAuxiliaryEffectSlot"); alAuxiliaryEffectSloti = (LPALAUXILIARYEFFECTSLOTI)alGetProcAddress("alAuxiliaryEffectSloti"); alAuxiliaryEffectSlotiv = (LPALAUXILIARYEFFECTSLOTIV)alGetProcAddress("alAuxiliaryEffectSlotiv"); alAuxiliaryEffectSlotf = (LPALAUXILIARYEFFECTSLOTF)alGetProcAddress("alAuxiliaryEffectSlotf"); alAuxiliaryEffectSlotfv = (LPALAUXILIARYEFFECTSLOTFV)alGetProcAddress("alAuxiliaryEffectSlotfv"); alGetAuxiliaryEffectSloti = (LPALGETAUXILIARYEFFECTSLOTI)alGetProcAddress("alGetAuxiliaryEffectSloti"); alGetAuxiliaryEffectSlotiv = (LPALGETAUXILIARYEFFECTSLOTIV)alGetProcAddress("alGetAuxiliaryEffectSlotiv"); alGetAuxiliaryEffectSlotf = (LPALGETAUXILIARYEFFECTSLOTF)alGetProcAddress("alGetAuxiliaryEffectSlotf"); alGetAuxiliaryEffectSlotfv = (LPALGETAUXILIARYEFFECTSLOTFV)alGetProcAddress("alGetAuxiliaryEffectSlotfv"); if (!(alGenAuxiliaryEffectSlots && alDeleteAuxiliaryEffectSlots && alIsAuxiliaryEffectSlot && alAuxiliaryEffectSloti && alAuxiliaryEffectSlotiv && alAuxiliaryEffectSlotf && alAuxiliaryEffectSlotfv && alGetAuxiliaryEffectSloti && alGetAuxiliaryEffectSlotiv && alGetAuxiliaryEffectSlotf && alGetAuxiliaryEffectSlotfv)) { FL_WARN(_log, LMsg() << "Failed initializing slot function pointers\n"); return; } // Effect functions alGenEffects = (LPALGENEFFECTS)alGetProcAddress("alGenEffects"); alDeleteEffects = (LPALDELETEEFFECTS)alGetProcAddress("alDeleteEffects"); alIsEffect = (LPALISEFFECT)alGetProcAddress("alIsEffect"); alEffecti = (LPALEFFECTI)alGetProcAddress("alEffecti"); alEffectiv = (LPALEFFECTIV)alGetProcAddress("alEffectiv"); alEffectf = (LPALEFFECTF)alGetProcAddress("alEffectf"); alEffectfv = (LPALEFFECTFV)alGetProcAddress("alEffectfv"); alGetEffecti = (LPALGETEFFECTI)alGetProcAddress("alGetEffecti"); alGetEffectiv = (LPALGETEFFECTIV)alGetProcAddress("alGetEffectiv"); alGetEffectf = (LPALGETEFFECTF)alGetProcAddress("alGetEffectf"); alGetEffectfv = (LPALGETEFFECTFV)alGetProcAddress("alGetEffectfv"); if (!(alGenEffects && alDeleteEffects && alIsEffect && alEffecti && alEffectiv && alEffectf && alEffectfv && alGetEffecti && alGetEffectiv && alGetEffectf && alGetEffectfv)) { FL_WARN(_log, LMsg() << "Failed initializing effect function pointers\n"); return; } // Filter functions alGenFilters = (LPALGENFILTERS)alGetProcAddress("alGenFilters"); alDeleteFilters = (LPALDELETEFILTERS)alGetProcAddress("alDeleteFilters"); alIsFilter = (LPALISFILTER)alGetProcAddress("alIsFilter"); alFilteri = (LPALFILTERI)alGetProcAddress("alFilteri"); alFilteriv = (LPALFILTERIV)alGetProcAddress("alFilteriv"); alFilterf = (LPALFILTERF)alGetProcAddress("alFilterf"); alFilterfv = (LPALFILTERFV)alGetProcAddress("alFilterfv"); alGetFilteri = (LPALGETFILTERI)alGetProcAddress("alGetFilteri"); alGetFilteriv = (LPALGETFILTERIV)alGetProcAddress("alGetFilteriv"); alGetFilterf = (LPALGETFILTERF)alGetProcAddress("alGetFilterf"); alGetFilterfv = (LPALGETFILTERFV)alGetProcAddress("alGetFilterfv"); if (!(alGenFilters && alDeleteFilters && alIsFilter && alFilteri && alFilteriv && alFilterf && alFilterfv && alGetFilteri && alGetFilteriv && alGetFilterf && alGetFilterfv)) { FL_WARN(_log, LMsg() << "Failed initializing filter function pointers\n"); return; } m_active = true; // create max effect slots for (uint16_t i = 0; i < MAX_EFFECT_SLOTS; i++) { alGenAuxiliaryEffectSlots(1, &m_effectSlots[i]); if (alGetError() != AL_NO_ERROR) { break; } m_freeSlots.push(m_effectSlots[i]); m_createdSlots++; } // fetch maximal slots per source alcGetIntegerv(m_device, ALC_MAX_AUXILIARY_SENDS, 1, &m_maxSlots); // prepares the presets createPresets(); } bool SoundEffectManager::isActive() const { return m_active; } SoundEffect* SoundEffectManager::createSoundEffect(SoundEffectType type) { SoundEffect* effect = NULL; if (type == SE_EFFECT_REVERB) { effect = new Reverb(); } else if (type == SE_EFFECT_CHORUS) { effect = new Chorus(); } else if (type == SE_EFFECT_DISTORTION) { effect = new Distortion(); } else if (type == SE_EFFECT_ECHO) { effect = new Echo(); } else if (type == SE_EFFECT_FLANGER) { effect = new Flanger(); } else if (type == SE_EFFECT_FREQUENCY_SHIFTER) { effect = new FrequencyShifter(); } else if (type == SE_EFFECT_VOCAL_MORPHER) { effect = new VocalMorpher(); } else if (type == SE_EFFECT_PITCH_SHIFTER) { effect = new PitchShifter(); } else if (type == SE_EFFECT_RING_MODULATOR) { effect = new RingModulator(); } else if (type == SE_EFFECT_AUTOWAH) { effect = new Autowah(); } else if (type == SE_EFFECT_COMPRESSOR) { effect = new Compressor(); } else if (type == SE_EFFECT_EQUALIZER) { effect = new Equalizer(); } else if (type == SE_EFFECT_EAXREVERB) { effect = new EaxReverb(); } if (effect) { m_effects.push_back(effect); } return effect; } SoundEffect* SoundEffectManager::createSoundEffectPreset(SoundEffectPreset type) { std::map::iterator it = m_presets.find(type); if (it == m_presets.end()) { return NULL; } SoundEffect* effect = new EaxReverb(); m_effects.push_back(effect); EaxReverb* reverb = static_cast(effect); reverb->loadPreset(it->second); return effect; } void SoundEffectManager::deleteSoundEffect(SoundEffect* effect) { disableSoundEffect(effect); if (effect->getFilter()) { removeSoundFilterFromSoundEffect(effect, effect->getFilter()); } for (std::vector::iterator it = m_effects.begin(); it != m_effects.end(); ++it) { if (effect == *it) { SoundEffectEmitterMap::iterator effectIt = m_effectEmitters.find(effect); if (effectIt != m_effectEmitters.end()) { std::vector::iterator emitterIt = effectIt->second.begin(); for (; emitterIt != effectIt->second.end(); ++emitterIt) { (*emitterIt)->removeEffect(effect); } } m_effectEmitters.erase(effectIt); delete *it; m_effects.erase(it); break; } } } void SoundEffectManager::enableSoundEffect(SoundEffect* effect) { if (m_freeSlots.empty() || effect->isEnabled()) { if (m_freeSlots.empty()) { FL_WARN(_log, LMsg() << "No free auxiliary slot available"); } return; } ALuint slot = m_freeSlots.front(); ALuint filter = effect->getFilter() ? effect->getFilter()->getFilterId() : AL_FILTER_NULL; m_freeSlots.pop(); alAuxiliaryEffectSloti(slot, AL_EFFECTSLOT_EFFECT, effect->getEffectId()); effect->setSlotId(slot); effect->setEnabled(true); SoundEffectEmitterMap::iterator effectIt = m_effectEmitters.find(effect); if (effectIt != m_effectEmitters.end()) { std::vector::iterator emitterIt = effectIt->second.begin(); for (; emitterIt != effectIt->second.end(); ++emitterIt) { if (!(*emitterIt)->isActive()) { continue; } activateEffect(effect, *emitterIt); } } } void SoundEffectManager::disableSoundEffect(SoundEffect* effect) { if (!effect->isEnabled()) { return; } alAuxiliaryEffectSloti(effect->getSlotId(), AL_EFFECTSLOT_EFFECT, AL_EFFECT_NULL); m_freeSlots.push(effect->getSlotId()); effect->setSlotId(0); SoundEffectEmitterMap::iterator effectIt = m_effectEmitters.find(effect); if (effectIt != m_effectEmitters.end()) { std::vector::iterator emitterIt = effectIt->second.begin(); for (; emitterIt != effectIt->second.end(); ++emitterIt) { deactivateEffect(effect, *emitterIt); } } effect->setEnabled(false); } void SoundEffectManager::addEmitterToSoundEffect(SoundEffect* effect, SoundEmitter* emitter) { if (emitter->getEffectCount() == m_maxSlots) { FL_WARN(_log, LMsg() << "Maximal effect number for SoundEmitter reached"); return; } m_effectEmitters[effect].push_back(emitter); emitter->addEffect(effect); if (emitter-isActive()) { activateEffect(effect, emitter); } } void SoundEffectManager::removeEmitterFromSoundEffect(SoundEffect* effect, SoundEmitter* emitter) { SoundEffectEmitterMap::iterator effectIt = m_effectEmitters.find(effect); if (effectIt == m_effectEmitters.end()) { FL_WARN(_log, LMsg() << "SoundEmitter can not removed from unknown effect"); return; } bool found = false; std::vector::iterator emitterIt = effectIt->second.begin(); std::vector::iterator emitterEnd = effectIt->second.end(); while (emitterIt != emitterEnd) { if ((*emitterIt) == emitter) { if (emitter->isActive()) { deactivateEffect(effect, emitter); } emitter->removeEffect(effect); effectIt->second.erase(emitterIt++); found = true; } else { ++emitterIt; } } if (!found) { FL_WARN(_log, LMsg() << "SoundEmitter could not be found for the given effect."); return; } } void SoundEffectManager::addSoundFilterToSoundEffect(SoundEffect* effect, SoundFilter* filter) { if (effect->getFilter()) { FL_WARN(_log, LMsg() << "SoundEffect already has a filter"); return; } effect->setFilter(filter); m_filterdEffects[filter].push_back(effect); if (effect->isEnabled()) { disableSoundEffect(effect); enableSoundEffect(effect); } } void SoundEffectManager::removeSoundFilterFromSoundEffect(SoundEffect* effect, SoundFilter* filter) { SoundFilterEffectMap::iterator filterIt = m_filterdEffects.find(filter); if (filterIt == m_filterdEffects.end()) { FL_WARN(_log, LMsg() << "SoundEffect can not removed from unknown filter"); return; } bool found = false; std::vector::iterator effectIt = filterIt->second.begin(); std::vector::iterator effectEnd = filterIt->second.end(); while (effectIt != effectEnd) { if ((*effectIt) == effect) { effect->setFilter(NULL); if (effect->isEnabled()) { disableSoundEffect(effect); enableSoundEffect(effect); } filterIt->second.erase(effectIt++); found = true; } else { ++effectIt; } } if (!found) { FL_WARN(_log, LMsg() << "SoundEffect could not be found for the given filter."); return; } } void SoundEffectManager::activateEffect(SoundEffect* effect, SoundEmitter* emitter) { if (!effect->isEnabled()) { return; } ALuint number = static_cast(emitter->getEffectNumber(effect)); ALuint filter = effect->getFilter() ? effect->getFilter()->getFilterId() : AL_FILTER_NULL; alSource3i(emitter->getSource(), AL_AUXILIARY_SEND_FILTER, effect->getSlotId(), number, filter); } void SoundEffectManager::deactivateEffect(SoundEffect* effect, SoundEmitter* emitter) { if (!effect->isEnabled()) { return; } ALuint number = static_cast(emitter->getEffectNumber(effect)); alSource3i(emitter->getSource(), AL_AUXILIARY_SEND_FILTER, AL_EFFECTSLOT_NULL, number, AL_FILTER_NULL); } SoundFilter* SoundEffectManager::createSoundFilter(SoundFilterType type) { SoundFilter* filter = new SoundFilter(type); m_filters.push_back(filter); return filter; } void SoundEffectManager::deleteSoundFilter(SoundFilter* filter) { disableDirectSoundFilter(filter); for (std::vector::iterator it = m_filters.begin(); it != m_filters.end(); ++it) { if (filter == *it) { SoundFilterEmitterMap::iterator filterIt = m_filterdEmitters.find(filter); if (filterIt != m_filterdEmitters.end()) { std::vector::iterator emitterIt = filterIt->second.begin(); for (; emitterIt != filterIt->second.end(); ++emitterIt) { (*emitterIt)->setDirectFilter(NULL); } } m_filterdEmitters.erase(filterIt); SoundFilterEffectMap::iterator filterItt = m_filterdEffects.find(filter); if (filterItt != m_filterdEffects.end()) { std::vector::iterator effectIt = filterItt->second.begin(); for (; effectIt != filterItt->second.end(); ++effectIt) { (*effectIt)->setFilter(NULL); if ((*effectIt)->isEnabled()) { disableSoundEffect(*effectIt); enableSoundEffect(*effectIt); } } } m_filterdEffects.erase(filterItt); delete *it; m_filters.erase(it); break; } } } void SoundEffectManager::enableDirectSoundFilter(SoundFilter* filter) { if (filter->isEnabled()) { return; } filter->setEnabled(true); SoundFilterEmitterMap::iterator filterIt = m_filterdEmitters.find(filter); if (filterIt != m_filterdEmitters.end()) { std::vector::iterator emitterIt = filterIt->second.begin(); for (; emitterIt != filterIt->second.end(); ++emitterIt) { if ((*emitterIt)->isActive()) { activateFilter(filter, *emitterIt); } } } } void SoundEffectManager::disableDirectSoundFilter(SoundFilter* filter) { if (!filter->isEnabled()) { return; } SoundFilterEmitterMap::iterator filterIt = m_filterdEmitters.find(filter); if (filterIt != m_filterdEmitters.end()) { std::vector::iterator emitterIt = filterIt->second.begin(); for (; emitterIt != filterIt->second.end(); ++emitterIt) { if ((*emitterIt)->isActive()) { deactivateFilter(filter, *emitterIt); } } } filter->setEnabled(false); } void SoundEffectManager::addEmitterToDirectSoundFilter(SoundFilter* filter, SoundEmitter* emitter) { if (emitter->getDirectFilter()) { FL_WARN(_log, LMsg() << "SoundEmitter already has a direct filter"); return; } emitter->setDirectFilter(filter); m_filterdEmitters[filter].push_back(emitter); if (emitter->isActive()) { activateFilter(filter, emitter); } } void SoundEffectManager::removeEmitterFromDirectSoundFilter(SoundFilter* filter, SoundEmitter* emitter) { SoundFilterEmitterMap::iterator filterIt = m_filterdEmitters.find(filter); if (filterIt == m_filterdEmitters.end()) { FL_WARN(_log, LMsg() << "SoundEmitter can not removed from unknown filter"); return; } bool found = false; std::vector::iterator emitterIt = filterIt->second.begin(); std::vector::iterator emitterEnd = filterIt->second.end(); while (emitterIt != emitterEnd) { if ((*emitterIt) == emitter) { if (emitter->isActive()) { deactivateFilter(filter, emitter); } emitter->setDirectFilter(NULL); filterIt->second.erase(emitterIt++); found = true; } else { ++emitterIt; } } if (!found) { FL_WARN(_log, LMsg() << "SoundEmitter could not be found for the given filter."); return; } } void SoundEffectManager::activateFilter(SoundFilter* filter, SoundEmitter* emitter) { if (filter->isEnabled()) { alSourcei(emitter->getSource(), AL_DIRECT_FILTER, filter->getFilterId()); } } void SoundEffectManager::deactivateFilter(SoundFilter* filter, SoundEmitter* emitter) { if (filter->isEnabled()) { alSourcei(emitter->getSource(), AL_DIRECT_FILTER, AL_FILTER_NULL); } } void SoundEffectManager::createPresets() { EFXEAXREVERBPROPERTIES prop1 = EFX_REVERB_PRESET_GENERIC; EFXEAXREVERBPROPERTIES prop2 = EFX_REVERB_PRESET_PADDEDCELL; EFXEAXREVERBPROPERTIES prop3 = EFX_REVERB_PRESET_ROOM; EFXEAXREVERBPROPERTIES prop4 = EFX_REVERB_PRESET_BATHROOM; EFXEAXREVERBPROPERTIES prop5 = EFX_REVERB_PRESET_LIVINGROOM; EFXEAXREVERBPROPERTIES prop6 = EFX_REVERB_PRESET_STONEROOM; EFXEAXREVERBPROPERTIES prop7 = EFX_REVERB_PRESET_AUDITORIUM; EFXEAXREVERBPROPERTIES prop8 = EFX_REVERB_PRESET_CONCERTHALL; EFXEAXREVERBPROPERTIES prop9 = EFX_REVERB_PRESET_CAVE; EFXEAXREVERBPROPERTIES prop10 = EFX_REVERB_PRESET_ARENA; EFXEAXREVERBPROPERTIES prop11 = EFX_REVERB_PRESET_HANGAR; EFXEAXREVERBPROPERTIES prop12 = EFX_REVERB_PRESET_CARPETEDHALLWAY; EFXEAXREVERBPROPERTIES prop13 = EFX_REVERB_PRESET_HALLWAY; EFXEAXREVERBPROPERTIES prop14 = EFX_REVERB_PRESET_STONECORRIDOR; EFXEAXREVERBPROPERTIES prop15 = EFX_REVERB_PRESET_ALLEY; EFXEAXREVERBPROPERTIES prop16 = EFX_REVERB_PRESET_FOREST; EFXEAXREVERBPROPERTIES prop17 = EFX_REVERB_PRESET_CITY; EFXEAXREVERBPROPERTIES prop18 = EFX_REVERB_PRESET_MOUNTAINS; EFXEAXREVERBPROPERTIES prop19 = EFX_REVERB_PRESET_QUARRY; EFXEAXREVERBPROPERTIES prop20 = EFX_REVERB_PRESET_PLAIN; EFXEAXREVERBPROPERTIES prop21 = EFX_REVERB_PRESET_PARKINGLOT; EFXEAXREVERBPROPERTIES prop22 = EFX_REVERB_PRESET_SEWERPIPE; EFXEAXREVERBPROPERTIES prop23 = EFX_REVERB_PRESET_UNDERWATER; EFXEAXREVERBPROPERTIES prop24 = EFX_REVERB_PRESET_DRUGGED; EFXEAXREVERBPROPERTIES prop25 = EFX_REVERB_PRESET_DIZZY; EFXEAXREVERBPROPERTIES prop26 = EFX_REVERB_PRESET_PSYCHOTIC; EFXEAXREVERBPROPERTIES prop27 = EFX_REVERB_PRESET_CASTLE_SMALLROOM; EFXEAXREVERBPROPERTIES prop28 = EFX_REVERB_PRESET_CASTLE_SHORTPASSAGE; EFXEAXREVERBPROPERTIES prop29 = EFX_REVERB_PRESET_CASTLE_MEDIUMROOM; EFXEAXREVERBPROPERTIES prop30 = EFX_REVERB_PRESET_CASTLE_LARGEROOM; EFXEAXREVERBPROPERTIES prop31 = EFX_REVERB_PRESET_CASTLE_LONGPASSAGE; EFXEAXREVERBPROPERTIES prop32 = EFX_REVERB_PRESET_CASTLE_HALL; EFXEAXREVERBPROPERTIES prop33 = EFX_REVERB_PRESET_CASTLE_CUPBOARD; EFXEAXREVERBPROPERTIES prop34 = EFX_REVERB_PRESET_CASTLE_COURTYARD; EFXEAXREVERBPROPERTIES prop35 = EFX_REVERB_PRESET_CASTLE_ALCOVE; EFXEAXREVERBPROPERTIES prop36 = EFX_REVERB_PRESET_FACTORY_SMALLROOM; EFXEAXREVERBPROPERTIES prop37 = EFX_REVERB_PRESET_FACTORY_SHORTPASSAGE; EFXEAXREVERBPROPERTIES prop38 = EFX_REVERB_PRESET_FACTORY_MEDIUMROOM; EFXEAXREVERBPROPERTIES prop39 = EFX_REVERB_PRESET_FACTORY_LARGEROOM; EFXEAXREVERBPROPERTIES prop40 = EFX_REVERB_PRESET_FACTORY_LONGPASSAGE; EFXEAXREVERBPROPERTIES prop41 = EFX_REVERB_PRESET_FACTORY_HALL; EFXEAXREVERBPROPERTIES prop42 = EFX_REVERB_PRESET_FACTORY_CUPBOARD; EFXEAXREVERBPROPERTIES prop43 = EFX_REVERB_PRESET_FACTORY_COURTYARD; EFXEAXREVERBPROPERTIES prop44 = EFX_REVERB_PRESET_FACTORY_ALCOVE; EFXEAXREVERBPROPERTIES prop45 = EFX_REVERB_PRESET_ICEPALACE_SMALLROOM; EFXEAXREVERBPROPERTIES prop46 = EFX_REVERB_PRESET_ICEPALACE_SHORTPASSAGE; EFXEAXREVERBPROPERTIES prop47 = EFX_REVERB_PRESET_ICEPALACE_MEDIUMROOM; EFXEAXREVERBPROPERTIES prop48 = EFX_REVERB_PRESET_ICEPALACE_LARGEROOM; EFXEAXREVERBPROPERTIES prop49 = EFX_REVERB_PRESET_ICEPALACE_LONGPASSAGE; EFXEAXREVERBPROPERTIES prop50 = EFX_REVERB_PRESET_ICEPALACE_HALL; EFXEAXREVERBPROPERTIES prop51 = EFX_REVERB_PRESET_ICEPALACE_CUPBOARD; EFXEAXREVERBPROPERTIES prop52 = EFX_REVERB_PRESET_ICEPALACE_COURTYARD; EFXEAXREVERBPROPERTIES prop53 = EFX_REVERB_PRESET_ICEPALACE_ALCOVE; EFXEAXREVERBPROPERTIES prop54 = EFX_REVERB_PRESET_SPACESTATION_SMALLROOM; EFXEAXREVERBPROPERTIES prop55 = EFX_REVERB_PRESET_SPACESTATION_SHORTPASSAGE; EFXEAXREVERBPROPERTIES prop56 = EFX_REVERB_PRESET_SPACESTATION_MEDIUMROOM; EFXEAXREVERBPROPERTIES prop57 = EFX_REVERB_PRESET_SPACESTATION_LARGEROOM; EFXEAXREVERBPROPERTIES prop58 = EFX_REVERB_PRESET_SPACESTATION_LONGPASSAGE; EFXEAXREVERBPROPERTIES prop59 = EFX_REVERB_PRESET_SPACESTATION_HALL; EFXEAXREVERBPROPERTIES prop60 = EFX_REVERB_PRESET_SPACESTATION_CUPBOARD; EFXEAXREVERBPROPERTIES prop61 = EFX_REVERB_PRESET_SPACESTATION_ALCOVE; EFXEAXREVERBPROPERTIES prop62 = EFX_REVERB_PRESET_WOODEN_SMALLROOM; EFXEAXREVERBPROPERTIES prop63 = EFX_REVERB_PRESET_WOODEN_SHORTPASSAGE; EFXEAXREVERBPROPERTIES prop64 = EFX_REVERB_PRESET_WOODEN_MEDIUMROOM; EFXEAXREVERBPROPERTIES prop65 = EFX_REVERB_PRESET_WOODEN_LARGEROOM; EFXEAXREVERBPROPERTIES prop66 = EFX_REVERB_PRESET_WOODEN_LONGPASSAGE; EFXEAXREVERBPROPERTIES prop67 = EFX_REVERB_PRESET_WOODEN_HALL; EFXEAXREVERBPROPERTIES prop68 = EFX_REVERB_PRESET_WOODEN_CUPBOARD; EFXEAXREVERBPROPERTIES prop69 = EFX_REVERB_PRESET_WOODEN_COURTYARD; EFXEAXREVERBPROPERTIES prop70 = EFX_REVERB_PRESET_WOODEN_ALCOVE; EFXEAXREVERBPROPERTIES prop71 = EFX_REVERB_PRESET_SPORT_EMPTYSTADIUM; EFXEAXREVERBPROPERTIES prop72 = EFX_REVERB_PRESET_SPORT_SQUASHCOURT; EFXEAXREVERBPROPERTIES prop73 = EFX_REVERB_PRESET_SPORT_SMALLSWIMMINGPOOL; EFXEAXREVERBPROPERTIES prop74 = EFX_REVERB_PRESET_SPORT_LARGESWIMMINGPOOL; EFXEAXREVERBPROPERTIES prop75 = EFX_REVERB_PRESET_SPORT_GYMNASIUM; EFXEAXREVERBPROPERTIES prop76 = EFX_REVERB_PRESET_SPORT_FULLSTADIUM; EFXEAXREVERBPROPERTIES prop77 = EFX_REVERB_PRESET_SPORT_STADIUMTANNOY; EFXEAXREVERBPROPERTIES prop78 = EFX_REVERB_PRESET_PREFAB_WORKSHOP; EFXEAXREVERBPROPERTIES prop79 = EFX_REVERB_PRESET_PREFAB_SCHOOLROOM; EFXEAXREVERBPROPERTIES prop80 = EFX_REVERB_PRESET_PREFAB_PRACTISEROOM; EFXEAXREVERBPROPERTIES prop81 = EFX_REVERB_PRESET_PREFAB_OUTHOUSE; EFXEAXREVERBPROPERTIES prop82 = EFX_REVERB_PRESET_PREFAB_CARAVAN; EFXEAXREVERBPROPERTIES prop83 = EFX_REVERB_PRESET_DOME_TOMB; EFXEAXREVERBPROPERTIES prop84 = EFX_REVERB_PRESET_PIPE_SMALL; EFXEAXREVERBPROPERTIES prop85 = EFX_REVERB_PRESET_DOME_SAINTPAULS; EFXEAXREVERBPROPERTIES prop86 = EFX_REVERB_PRESET_PIPE_LONGTHIN; EFXEAXREVERBPROPERTIES prop87 = EFX_REVERB_PRESET_PIPE_LARGE; EFXEAXREVERBPROPERTIES prop88 = EFX_REVERB_PRESET_PIPE_RESONANT; EFXEAXREVERBPROPERTIES prop89 = EFX_REVERB_PRESET_OUTDOORS_BACKYARD; EFXEAXREVERBPROPERTIES prop90 = EFX_REVERB_PRESET_OUTDOORS_ROLLINGPLAINS; EFXEAXREVERBPROPERTIES prop91 = EFX_REVERB_PRESET_OUTDOORS_DEEPCANYON; EFXEAXREVERBPROPERTIES prop92 = EFX_REVERB_PRESET_OUTDOORS_CREEK; EFXEAXREVERBPROPERTIES prop93 = EFX_REVERB_PRESET_OUTDOORS_VALLEY; EFXEAXREVERBPROPERTIES prop94 = EFX_REVERB_PRESET_MOOD_HEAVEN; EFXEAXREVERBPROPERTIES prop95 = EFX_REVERB_PRESET_MOOD_HELL; EFXEAXREVERBPROPERTIES prop96 = EFX_REVERB_PRESET_MOOD_MEMORY; EFXEAXREVERBPROPERTIES prop97 = EFX_REVERB_PRESET_DRIVING_COMMENTATOR; EFXEAXREVERBPROPERTIES prop98 = EFX_REVERB_PRESET_DRIVING_PITGARAGE; EFXEAXREVERBPROPERTIES prop99 = EFX_REVERB_PRESET_DRIVING_INCAR_RACER; EFXEAXREVERBPROPERTIES prop100 = EFX_REVERB_PRESET_DRIVING_INCAR_SPORTS; EFXEAXREVERBPROPERTIES prop101 = EFX_REVERB_PRESET_DRIVING_INCAR_LUXURY; EFXEAXREVERBPROPERTIES prop102 = EFX_REVERB_PRESET_DRIVING_FULLGRANDSTAND; EFXEAXREVERBPROPERTIES prop103 = EFX_REVERB_PRESET_DRIVING_EMPTYGRANDSTAND; EFXEAXREVERBPROPERTIES prop104 = EFX_REVERB_PRESET_DRIVING_TUNNEL; EFXEAXREVERBPROPERTIES prop105 = EFX_REVERB_PRESET_CITY_STREETS; EFXEAXREVERBPROPERTIES prop106 = EFX_REVERB_PRESET_CITY_SUBWAY; EFXEAXREVERBPROPERTIES prop107 = EFX_REVERB_PRESET_CITY_MUSEUM; EFXEAXREVERBPROPERTIES prop108 = EFX_REVERB_PRESET_CITY_LIBRARY; EFXEAXREVERBPROPERTIES prop109 = EFX_REVERB_PRESET_CITY_UNDERPASS; EFXEAXREVERBPROPERTIES prop110 = EFX_REVERB_PRESET_CITY_ABANDONED; EFXEAXREVERBPROPERTIES prop111 = EFX_REVERB_PRESET_DUSTYROOM; EFXEAXREVERBPROPERTIES prop112 = EFX_REVERB_PRESET_CHAPEL; EFXEAXREVERBPROPERTIES prop113 = EFX_REVERB_PRESET_SMALLWATERROOM; m_presets[SE_PRESET_GENERIC] = prop1; m_presets[SE_PRESET_PADDEDCELL] = prop2; m_presets[SE_PRESET_ROOM] = prop3; m_presets[SE_PRESET_BATHROOM] = prop4; m_presets[SE_PRESET_LIVINGROOM] = prop5; m_presets[SE_PRESET_STONEROOM] = prop6; m_presets[SE_PRESET_AUDITORIUM] = prop7; m_presets[SE_PRESET_CONCERTHALL] = prop8; m_presets[SE_PRESET_CAVE] = prop9; m_presets[SE_PRESET_ARENA] = prop10; m_presets[SE_PRESET_HANGAR] = prop11; m_presets[SE_PRESET_CARPETEDHALLWAY] = prop12; m_presets[SE_PRESET_HALLWAY] = prop13; m_presets[SE_PRESET_STONECORRIDOR] = prop14; m_presets[SE_PRESET_ALLEY] = prop15; m_presets[SE_PRESET_FOREST] = prop16; m_presets[SE_PRESET_CITY] = prop17; m_presets[SE_PRESET_MOUNTAINS] = prop18; m_presets[SE_PRESET_QUARRY] = prop19; m_presets[SE_PRESET_PLAIN] = prop20; m_presets[SE_PRESET_PARKINGLOT] = prop21; m_presets[SE_PRESET_SEWERPIPE] = prop22; m_presets[SE_PRESET_UNDERWATER] = prop23; m_presets[SE_PRESET_DRUGGED] = prop24; m_presets[SE_PRESET_DIZZY] = prop25; m_presets[SE_PRESET_PSYCHOTIC] = prop26; m_presets[SE_PRESET_CASTLE_SMALLROOM] = prop27; m_presets[SE_PRESET_CASTLE_SHORTPASSAGE] = prop28; m_presets[SE_PRESET_CASTLE_MEDIUMROOM] = prop29; m_presets[SE_PRESET_CASTLE_LARGEROOM] = prop30; m_presets[SE_PRESET_CASTLE_LONGPASSAGE] = prop31; m_presets[SE_PRESET_CASTLE_HALL] = prop32; m_presets[SE_PRESET_CASTLE_CUPBOARD] = prop33; m_presets[SE_PRESET_CASTLE_COURTYARD] = prop34; m_presets[SE_PRESET_CASTLE_ALCOVE] = prop35; m_presets[SE_PRESET_FACTORY_SMALLROOM] = prop36; m_presets[SE_PRESET_FACTORY_SHORTPASSAGE] = prop37; m_presets[SE_PRESET_FACTORY_MEDIUMROOM] = prop38; m_presets[SE_PRESET_FACTORY_LARGEROOM] = prop39; m_presets[SE_PRESET_FACTORY_LONGPASSAGE] = prop40; m_presets[SE_PRESET_FACTORY_HALL] = prop41; m_presets[SE_PRESET_FACTORY_CUPBOARD] = prop42; m_presets[SE_PRESET_FACTORY_COURTYARD] = prop43; m_presets[SE_PRESET_FACTORY_ALCOVE] = prop44; m_presets[SE_PRESET_ICEPALACE_SMALLROOM] = prop45; m_presets[SE_PRESET_ICEPALACE_SHORTPASSAGE] = prop46; m_presets[SE_PRESET_ICEPALACE_MEDIUMROOM] = prop47; m_presets[SE_PRESET_ICEPALACE_LARGEROOM] = prop48; m_presets[SE_PRESET_ICEPALACE_LONGPASSAGE] = prop49; m_presets[SE_PRESET_ICEPALACE_HALL] = prop50; m_presets[SE_PRESET_ICEPALACE_CUPBOARD] = prop51; m_presets[SE_PRESET_ICEPALACE_COURTYARD] = prop52; m_presets[SE_PRESET_ICEPALACE_ALCOVE] = prop53; m_presets[SE_PRESET_SPACESTATION_SMALLROOM] = prop54; m_presets[SE_PRESET_SPACESTATION_SHORTPASSAGE] = prop55; m_presets[SE_PRESET_SPACESTATION_MEDIUMROOM] = prop56; m_presets[SE_PRESET_SPACESTATION_LARGEROOM] = prop57; m_presets[SE_PRESET_SPACESTATION_LONGPASSAGE] = prop58; m_presets[SE_PRESET_SPACESTATION_HALL] = prop59; m_presets[SE_PRESET_SPACESTATION_CUPBOARD] = prop60; m_presets[SE_PRESET_SPACESTATION_ALCOVE] = prop61; m_presets[SE_PRESET_WOODEN_SMALLROOM] = prop62; m_presets[SE_PRESET_WOODEN_SHORTPASSAGE] = prop63; m_presets[SE_PRESET_WOODEN_MEDIUMROOM] = prop64; m_presets[SE_PRESET_WOODEN_LARGEROOM] = prop65; m_presets[SE_PRESET_WOODEN_LONGPASSAGE] = prop66; m_presets[SE_PRESET_WOODEN_HALL] = prop67; m_presets[SE_PRESET_WOODEN_CUPBOARD] = prop68; m_presets[SE_PRESET_WOODEN_COURTYARD] = prop69; m_presets[SE_PRESET_WOODEN_ALCOVE] = prop70; m_presets[SE_PRESET_SPORT_EMPTYSTADIUM] = prop71; m_presets[SE_PRESET_SPORT_SQUASHCOURT] = prop72; m_presets[SE_PRESET_SPORT_SMALLSWIMMINGPOOL] = prop73; m_presets[SE_PRESET_SPORT_LARGESWIMMINGPOOL] = prop74; m_presets[SE_PRESET_SPORT_GYMNASIUM] = prop75; m_presets[SE_PRESET_SPORT_FULLSTADIUM] = prop76; m_presets[SE_PRESET_SPORT_STADIUMTANNOY] = prop77; m_presets[SE_PRESET_PREFAB_WORKSHOP] = prop78; m_presets[SE_PRESET_PREFAB_SCHOOLROOM] = prop79; m_presets[SE_PRESET_PREFAB_PRACTISEROOM] = prop80; m_presets[SE_PRESET_PREFAB_OUTHOUSE] = prop81; m_presets[SE_PRESET_PREFAB_CARAVAN] = prop82; m_presets[SE_PRESET_DOME_TOMB] = prop83; m_presets[SE_PRESET_PIPE_SMALL] = prop84; m_presets[SE_PRESET_DOME_SAINTPAULS] = prop85; m_presets[SE_PRESET_PIPE_LONGTHIN] = prop86; m_presets[SE_PRESET_PIPE_LARGE] = prop87; m_presets[SE_PRESET_PIPE_RESONANT] = prop88; m_presets[SE_PRESET_OUTDOORS_BACKYARD] = prop89; m_presets[SE_PRESET_OUTDOORS_ROLLINGPLAINS] = prop90; m_presets[SE_PRESET_OUTDOORS_DEEPCANYON] = prop91; m_presets[SE_PRESET_OUTDOORS_CREEK] = prop92; m_presets[SE_PRESET_OUTDOORS_VALLEY] = prop93; m_presets[SE_PRESET_MOOD_HEAVEN] = prop94; m_presets[SE_PRESET_MOOD_HELL] = prop95; m_presets[SE_PRESET_MOOD_MEMORY] = prop96; m_presets[SE_PRESET_DRIVING_COMMENTATOR] = prop97; m_presets[SE_PRESET_DRIVING_PITGARAGE] = prop98; m_presets[SE_PRESET_DRIVING_INCAR_RACER] = prop99; m_presets[SE_PRESET_DRIVING_INCAR_SPORTS] = prop100; m_presets[SE_PRESET_DRIVING_INCAR_LUXURY] = prop101; m_presets[SE_PRESET_DRIVING_FULLGRANDSTAND] = prop102; m_presets[SE_PRESET_DRIVING_EMPTYGRANDSTAND] = prop103; m_presets[SE_PRESET_DRIVING_TUNNEL] = prop104; m_presets[SE_PRESET_CITY_STREETS] = prop105; m_presets[SE_PRESET_CITY_SUBWAY] = prop106; m_presets[SE_PRESET_CITY_MUSEUM] = prop107; m_presets[SE_PRESET_CITY_LIBRARY] = prop108; m_presets[SE_PRESET_CITY_UNDERPASS] = prop109; m_presets[SE_PRESET_CITY_ABANDONED] = prop110; m_presets[SE_PRESET_DUSTYROOM] = prop111; m_presets[SE_PRESET_CHAPEL] = prop112; m_presets[SE_PRESET_SMALLWATERROOM] = prop113; } } //FIFE fifengine-0.4.2/engine/core/audio/effects/soundeffectmanager.h000066400000000000000000000151271341615052600244060ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_SOUNDEFFECTMANAGER_H #define FIFE_SOUNDEFFECTMANAGER_H // Standard C++ library includes #include #include // Platform specific includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "audio/fife_openal.h" #include "audio/soundconfig.h" namespace FIFE { class SoundEffect; class SoundFilter; class SoundEmitter; class SoundEffectManager { public: /** Constructor */ SoundEffectManager(); /** Destructor */ ~SoundEffectManager(); /** Initializes the effect system */ void init(ALCdevice* device); /** Returns true if sound effect module is active */ bool isActive() const; /** Creates SoundEffect of the specific type. * @param type See SoundEffectType */ SoundEffect* createSoundEffect(SoundEffectType type); /** Creates EaxReverb SoundEffect and loads the specific preset type. * @param type See SoundEffectPreset */ SoundEffect* createSoundEffectPreset(SoundEffectPreset type); /** Deletes given SoundEffect. * Deactivates for SoundEmitters are automatically done. */ void deleteSoundEffect(SoundEffect* effect); /** Enables given SoundEffect. */ void enableSoundEffect(SoundEffect* effect); /** Disables given SoundEffect. */ void disableSoundEffect(SoundEffect* effect); /** Adds given SoundEmitter to the specific SoundEffect. * Note: A SoundEmitter can only have a limited number of effects, usually 4. */ void addEmitterToSoundEffect(SoundEffect* effect, SoundEmitter* emitter); /** Removes given SoundEmitter from the specific SoundEffect. */ void removeEmitterFromSoundEffect(SoundEffect* effect, SoundEmitter* emitter); /** Adds given SoundFilter to the SoundEffect. * Note: A SoundEffect can only have one SoundFilter. */ void addSoundFilterToSoundEffect(SoundEffect* effect, SoundFilter* filter); /** Removes given SoundFilter from the SoundEffect. */ void removeSoundFilterFromSoundEffect(SoundEffect* effect, SoundFilter* filter); /** Internal function to do the OpenAL calls to activate the SoundEffect for the SoundEmitter. */ void activateEffect(SoundEffect* effect, SoundEmitter* emitter); /** Internal function to do the OpenAL calls to deactivate the SoundEffect for the SoundEmitter. */ void deactivateEffect(SoundEffect* effect, SoundEmitter* emitter); /** Creates SoundFilter of the specific type. * @param type See SoundFilterType */ SoundFilter* createSoundFilter(SoundFilterType type); /** Deletes given SoundFilter. * Deactivates for SoundEmitters and Effects are automatically done. */ void deleteSoundFilter(SoundFilter* filter); /** Enables given direct SoundFilter. Only SoundFilters for SoundEmitters are meant. */ void enableDirectSoundFilter(SoundFilter* filter); /** Disables given SoundFilter. Only SoundFilters for SoundEmitters are meant. */ void disableDirectSoundFilter(SoundFilter* filter); /** Adds given SoundEmitter to the specific direct SoundFilter * Note: A SoundEmitter can only have one direct filter. */ void addEmitterToDirectSoundFilter(SoundFilter* filter, SoundEmitter* emitter); /** Removes given SoundEmitter from the specific direct SoundFilter. */ void removeEmitterFromDirectSoundFilter(SoundFilter* filter, SoundEmitter* emitter); /** Internal function to do the OpenAL calls to activate the SoundFilter for the SoundEmitter. */ void activateFilter(SoundFilter* filter, SoundEmitter* emitter); /** Internal function to do the OpenAL calls to deactivate the SoundFilter for the SoundEmitter. */ void deactivateFilter(SoundFilter* filter, SoundEmitter* emitter); private: //! Inital the presets void createPresets(); //! OpenAL device ALCdevice* m_device; //! If sound effect module is active bool m_active; //! Holds handles for effects ALuint m_effectSlots[MAX_EFFECT_SLOTS]; //! Maximal created effect slots, can be different to MAX_EFFECT_SLOTS uint16_t m_createdSlots; //! Holds free handles for effect slots std::queue m_freeSlots; //! Maximal effect slots per Source ALint m_maxSlots; //! Holds all SoundEffects std::vector m_effects; //! Holds SoundEffects together with the added SoundEmitters typedef std::map > SoundEffectEmitterMap; SoundEffectEmitterMap m_effectEmitters; //! Holds all SoundFilters std::vector m_filters; //! Holds SoundFilters together with the added SoundEmitters typedef std::map > SoundFilterEmitterMap; SoundFilterEmitterMap m_filterdEmitters; //! Holds SoundFilters together with the added SoundEffects typedef std::map > SoundFilterEffectMap; SoundFilterEffectMap m_filterdEffects; //! Establishes the relationship between SoundEffectPreset and EFXEAXREVERBPROPERTIES std::map m_presets; }; } #endif fifengine-0.4.2/engine/core/audio/effects/soundfilter.cpp000066400000000000000000000107221341615052600234330ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes #include // Platform specific includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/log/logger.h" #include "util/base/exception.h" #include "soundfilter.h" namespace FIFE { /** Logger to use for this source file. * @relates Logger */ static Logger _log(LM_AUDIO); SoundFilter::SoundFilter(SoundFilterType type) : m_filter(0), m_type(SF_FILTER_NULL), m_enabled(false), m_gain(1.0), m_hGain(1.0), m_lGain(1.0) { alGenFilters(1, &m_filter); CHECK_OPENAL_LOG(_log, LogManager::LEVEL_ERROR, "error creating filter"); setFilterType(type); } SoundFilter::~SoundFilter() { alDeleteFilters(1, &m_filter); } ALuint SoundFilter::getFilterId() const { return m_filter; } void SoundFilter::setFilterType(SoundFilterType type) { if (m_type == type || isEnabled()) { return; } m_type = type; if (m_type == SF_FILTER_NULL) { alFilteri(m_filter, AL_FILTER_TYPE, AL_FILTER_NULL); } else if (m_type == SF_FILTER_LOWPASS) { alFilteri(m_filter, AL_FILTER_TYPE, AL_FILTER_LOWPASS); } else if (m_type == SF_FILTER_HIGHPASS) { alFilteri(m_filter, AL_FILTER_TYPE, AL_FILTER_HIGHPASS); } else if (m_type == SF_FILTER_BANDPASS) { alFilteri(m_filter, AL_FILTER_TYPE, AL_FILTER_BANDPASS); } CHECK_OPENAL_LOG(_log, LogManager::LEVEL_ERROR, "error setting filter"); } SoundFilterType SoundFilter::getFilterType() const { return m_type; } void SoundFilter::setEnabled(bool enabled) { m_enabled = enabled; } bool SoundFilter::isEnabled() const { return m_enabled; } void SoundFilter::setGain(float gain) { gain = std::min(gain, 1.0f); gain = std::max(gain, 0.0f); m_gain = gain; if (m_type == SF_FILTER_LOWPASS) { alFilterf(m_filter, AL_LOWPASS_GAIN, m_gain); } else if (m_type == SF_FILTER_HIGHPASS) { alFilterf(m_filter, AL_HIGHPASS_GAIN, m_gain); } else if (m_type == SF_FILTER_BANDPASS) { alFilterf(m_filter, AL_BANDPASS_GAIN, m_gain); } } float SoundFilter::getGain() const { return m_gain; } void SoundFilter::setGainHf(float gain) { gain = std::min(gain, 1.0f); gain = std::max(gain, 0.0f); m_hGain = gain; if (m_type == SF_FILTER_LOWPASS) { alFilterf(m_filter, AL_LOWPASS_GAINHF, m_hGain); } else if (m_type == SF_FILTER_BANDPASS) { alFilterf(m_filter, AL_BANDPASS_GAINHF, m_hGain); } } float SoundFilter::getGainHf() const { return m_hGain; } void SoundFilter::setGainLf(float gain) { gain = std::min(gain, 1.0f); gain = std::max(gain, 0.0f); m_lGain = gain; if (m_type == SF_FILTER_HIGHPASS) { alFilterf(m_filter, AL_HIGHPASS_GAINLF, m_lGain); } else if (m_type == SF_FILTER_BANDPASS) { alFilterf(m_filter, AL_BANDPASS_GAINLF, m_lGain); } } float SoundFilter::getGainLf() const { return m_lGain; } } //FIFE fifengine-0.4.2/engine/core/audio/effects/soundfilter.h000066400000000000000000000072471341615052600231100ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_SOUNDFILTER_H #define FIFE_SOUNDFILTER_H // Standard C++ library includes // Platform specific includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "audio/fife_openal.h" #include "audio/soundconfig.h" namespace FIFE { /** The class defines filters. Lowpass, Highpass and Bandpass filters are possible. * Note: On Lowpass filter setGainLf have no effect, same with Highpass and setGainHf. */ class SoundFilter { public: /** Constructor * @param type The filter type. */ SoundFilter(SoundFilterType type); /** Destructor */ ~SoundFilter(); /** Return the OpenAL filter handle. */ ALuint getFilterId() const; /** Sets the filter type. * @see SoundFilterType */ void setFilterType(SoundFilterType type); /** Return the filter type * @see SoundFilterType */ SoundFilterType getFilterType() const; /** Enables or disables the filter. * @param enabled A bool to indicate if the filter should be enabled or disabled. */ void setEnabled(bool enabled); /** Return true if the filter is enabled, false otherwise. */ bool isEnabled() const; /** Sets filter gain. * @param gain The gain as float, range 0.0 - 1.0. */ void setGain(float gain); /** Return filter gain. Default is 1.0. */ float getGain() const; /** Sets filter high frequency gain. * @param gain The gain as float, range 0.0 - 1.0. */ void setGainHf(float gain); /** Return filter high frequency gain. Default is 1.0. */ float getGainHf() const; /** Sets filter low frequency gain. * @param gain The gain as float, range 0.0 - 1.0. */ void setGainLf(float gain); /** Return filter low frequency gain. Default is 1.0. */ float getGainLf() const; private: //! Filter object id ALuint m_filter; //! Filter type SoundFilterType m_type; //! Filter enabled bool m_enabled; //! Gain float m_gain; //! High frequency gain float m_hGain; //! Low frequency gain float m_lGain; }; } #endif fifengine-0.4.2/engine/core/audio/effects/soundfilter.i000066400000000000000000000040111341615052600230730ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module soundfilter %{ #include "audio/effects/soundfilter.h" %} namespace FIFE { enum SoundFilterType { SF_FILTER_NULL, SF_FILTER_LOWPASS, SF_FILTER_HIGHPASS, SF_FILTER_BANDPASS }; class SoundFilter { public: SoundFilterType getFilterType() const; bool isEnabled() const; void setGain(float gain); float getGain() const; void setGainHf(float gain); float getGainHf() const; void setGainLf(float gain); float getGainLf() const; private: SoundFilter(SoundFilterType type); }; } fifengine-0.4.2/engine/core/audio/fife_openal.h000066400000000000000000000047161341615052600214000ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_FIFE_OPENAL_H #define FIFE_FIFE_OPENAL_H #define AL_ALEXT_PROTOTYPES // Standard C++ library includes #include #include #include #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #ifdef LOG_ENABLED #define CHECK_OPENAL_LOG(logger, level, msg) if (AL_NO_ERROR != alGetError()) { logger.log(level, msg);} #define CHECK_OPENAL_LOG_DETAIL(logger, level, msg) {ALenum error; error = alGetError(); if (AL_NO_ERROR != error) { logger.log(level, LMsg() << msg << ", Error#: " << error);}} #else #define CHECK_OPENAL_LOG(logger, level, msg) #define CHECK_OPENAL_LOG_DETAIL(logger, level, msg) #endif #define CHECK_OPENAL_EXCEPTION(msg) if (AL_NO_ERROR != alGetError()) { throw Exception(msg); } #endif fifengine-0.4.2/engine/core/audio/soundclip.cpp000066400000000000000000000205661341615052600214650ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // Platform specific includes #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/exception.h" #include "util/log/logger.h" #include "loaders/native/audio/ogg_loader.h" #include "soundclip.h" namespace FIFE { static Logger _log(LM_AUDIO); SoundClip::SoundClip(IResourceLoader* loader) : IResource(createUniqueClipName(), loader), m_isStream(false), m_decoder(NULL), m_deleteDecoder(false) { } SoundClip::SoundClip(const std::string& name, IResourceLoader* loader) : IResource(name, loader), m_isStream(false), m_decoder(NULL), m_deleteDecoder(false) { } SoundClip::~SoundClip() { free(); // delete decoder if (m_deleteDecoder && m_decoder != NULL) { delete m_decoder; } } void SoundClip::load(){ if (m_loader){ m_loader->load(this); } else { //no loader specified so find one to use if(m_name.find(".ogg", m_name.size() - 4) != std::string::npos) { OggLoader loader; loader.load(this); } else { FL_WARN(_log, LMsg() << "No audio-decoder available for file \"" << m_name << "\"!"); throw InvalidFormat("Error: Ogg loader can't load files without ogg extension"); } } assert(m_decoder); //should be set by now m_isStream = m_decoder->needsStreaming(); if (!m_isStream) { // only for non-streaming buffers SoundBufferEntry* ptr = new SoundBufferEntry(); // iterate the bufs and fill them with data for (int32_t i = 0; i < BUFFER_NUM; i++) { if (m_decoder->decode(BUFFER_LEN)) { // EOF or error break; } // generate buffer and fill it with data alGenBuffers(1, &ptr->buffers[i]); alBufferData(ptr->buffers[i], m_decoder->getALFormat(), m_decoder->getBuffer(), m_decoder->getBufferSize(), m_decoder->getSampleRate()); CHECK_OPENAL_LOG(_log, LogManager::LEVEL_ERROR, "error copying data to buffers") ptr->usedbufs++; } m_decoder->releaseBuffer(); // push the buffer information to the vector m_buffervec.push_back(ptr); } m_state = IResource::RES_LOADED; } void SoundClip::free(){ if (m_state == IResource::RES_LOADED) { if (m_isStream) { // erase all elements from the list std::vector::iterator it; for (it = m_buffervec.begin(); it != m_buffervec.end(); ++it) { if ((*it) && (*it)->buffers[0] != 0) { alDeleteBuffers(BUFFER_NUM, (*it)->buffers); } delete (*it); } } else { // for non-streaming soundclips SoundBufferEntry* ptr = m_buffervec.at(0); for(uint32_t i = 0; i < ptr->usedbufs; i++) { alDeleteBuffers(1, &ptr->buffers[i]); } delete ptr; } m_buffervec.clear(); } m_state = IResource::RES_NOT_LOADED; } bool SoundClip::isStream() const { return m_isStream; } uint32_t SoundClip::countBuffers() const { return m_buffervec.at(0)->usedbufs; } ALuint* SoundClip::getBuffers(uint32_t streamid) const { return m_buffervec.at(streamid)->buffers; } uint32_t SoundClip::beginStreaming() { SoundBufferEntry* ptr = NULL; uint32_t id = 0; for (uint32_t i = 0; i < m_buffervec.size(); i++) { if (m_buffervec.at(i) == NULL) { ptr = new SoundBufferEntry(); m_buffervec.at(i) = ptr; id = i; break; } } // create new sound buffer entry if (!ptr) { ptr = new SoundBufferEntry(); m_buffervec.push_back(ptr); id = m_buffervec.size() -1 ; } ptr->usedbufs=0; ptr->deccursor = 0; alGenBuffers(BUFFER_NUM, ptr->buffers); CHECK_OPENAL_LOG(_log, LogManager::LEVEL_ERROR, "error creating streaming-buffers") return id; } bool SoundClip::setStreamPos(uint32_t streamid, SoundPositionType type, float value) { uint64_t pos = 0; // convert position to bytes switch (type) { case SD_BYTE_POS: pos = static_cast(value); break; case SD_TIME_POS: value /= static_cast(m_decoder->getSampleRate()); case SD_SAMPLE_POS: pos = static_cast((m_decoder->getBitResolution() / 8) * (m_decoder->isStereo() ? 2 : 1) * value); break; } if (pos > m_decoder->getDecodedLength()) { // EOF! m_buffervec.at(streamid)->deccursor = m_decoder->getDecodedLength(); return true; } // set cursor position m_buffervec.at(streamid)->deccursor = pos; return false; } float SoundClip::getStreamPos(uint32_t streamid, SoundPositionType type) const{ uint64_t pos = m_buffervec.at(streamid)->deccursor; switch(type) { case SD_BYTE_POS: return pos; case SD_SAMPLE_POS: return pos / (m_decoder->getBitResolution() / 8 * (m_decoder->isStereo() ? 2 : 1)); case SD_TIME_POS: return pos / (m_decoder->getBitResolution() / 8 * (m_decoder->isStereo() ? 2 : 1) * m_decoder->getSampleRate()); } return 0.0f; } void SoundClip::acquireStream(uint32_t streamid) { SoundBufferEntry* ptr = m_buffervec.at(streamid); for (int32_t i = 0; i < BUFFER_NUM; i++) { if (getStream(streamid, ptr->buffers[i])) { break; } } } bool SoundClip::getStream(uint32_t streamid, ALuint buffer) { SoundBufferEntry* ptr = m_buffervec.at(streamid); if (ptr->deccursor >= m_decoder->getDecodedLength()) { // EOF! return true; } // set cursor of decoder if (!m_decoder->setCursor(ptr->deccursor)) { return true; } // Error while decoding file? if (m_decoder->decode(BUFFER_LEN)) { throw Exception("error while reading from audio file"); } // fill the buffer with data alBufferData(buffer, m_decoder->getALFormat(), m_decoder->getBuffer(), m_decoder->getBufferSize(), m_decoder->getSampleRate()); // update cursor ptr->deccursor += m_decoder->getBufferSize(); m_decoder->releaseBuffer(); CHECK_OPENAL_LOG(_log, LogManager::LEVEL_ERROR, "error catching stream") return false; } void SoundClip::quitStreaming(uint32_t streamid) { // release the buffers SoundBufferEntry* ptr = m_buffervec.at(streamid); alDeleteBuffers(BUFFER_NUM, ptr->buffers); ptr->buffers[0] = 0; } void SoundClip::endStreaming(uint32_t streamid) { SoundBufferEntry** ptr = &m_buffervec.at(streamid); delete *ptr; *ptr = NULL; } void SoundClip::adobtDecoder(SoundDecoder* decoder) { m_decoder = decoder; m_deleteDecoder = true; } void SoundClip::setDecoder(SoundDecoder* decoder) { m_decoder = decoder; m_deleteDecoder = false; } SoundDecoder* SoundClip::getDecoder() const { return m_decoder; } size_t SoundClip::getSize() { return 0; } std::string SoundClip::createUniqueClipName() { // automated counting for name generation, in case the user doesn't provide a name static uint32_t uniqueNumber = 0; static std::string baseName = "soundclip"; std::ostringstream oss; oss << uniqueNumber << "_" << baseName; const std::string name = oss.str(); ++uniqueNumber; return name; } } fifengine-0.4.2/engine/core/audio/soundclip.h000066400000000000000000000107301341615052600211220ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_SOUNDCLIP_H_ #define FIFE_SOUNDCLIP_H_ // Standard C++ library includes #include // Platform specific includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/resource/resource.h" #include "sounddecoder.h" namespace FIFE { /** Different types of audio-file positions */ enum SoundPositionType { SD_SAMPLE_POS, SD_TIME_POS, SD_BYTE_POS }; struct SoundBufferEntry { ALuint buffers[BUFFER_NUM]; uint32_t usedbufs; uint64_t deccursor; }; /** Class to handle the buffers of an audio file */ class SoundClip : public IResource { public: SoundClip(IResourceLoader* loader = 0); SoundClip(const std::string& name, IResourceLoader* loader = 0); ~SoundClip(); /** Does this SoundClip require a streaming mechanism? * * @return Returns true if streaming is required, false if not. */ bool isStream() const; /** Returns the number of buffers used by the SoundClip * (only for non-streaming sound clips) * * @return Returns the number of buffers. */ uint32_t countBuffers() const; /** Returns the array of buffers for queuing * */ ALuint* getBuffers(uint32_t streamid = 0) const; /** Starts streaming the soundclip * @return Returns the streamid */ uint32_t beginStreaming(); /** Fills the streaming-buffers with initial data * * @param streamid The stream ID */ void acquireStream(uint32_t streamid); /** Sets the stream position * @return True if position is invalid (EOF has been reached) */ bool setStreamPos(uint32_t streamid, SoundPositionType type, float value); /** Gets the stream position */ float getStreamPos(uint32_t streamid, SoundPositionType type) const; /** Refill a processed buffer with new data * * @return True if file was EOF * @param streamid The stream ID * @param buffer The OpenAL buffer ID */ bool getStream(uint32_t streamid, ALuint buffer); /** Quits Streaming */ void quitStreaming(uint32_t streamid); /** Ends streaming, invalidate also the stream id. */ void endStreaming(uint32_t streamid); /** Adopts a decoder to use so DONT delete it */ void adobtDecoder(SoundDecoder* decoder); /** Sets the decoder to use so DONT delete it before this SoundClip is done with it */ void setDecoder(SoundDecoder* decoder); /** Returns the attached decoder */ SoundDecoder* getDecoder() const; virtual size_t getSize(); virtual void load(); virtual void free(); private: // is stream? bool m_isStream; // attached decoder SoundDecoder* m_decoder; // when loadFromDecoder-method is used, decoder shouldn't be deleted bool m_deleteDecoder; std::vector m_buffervec; std::string createUniqueClipName(); }; typedef SharedPtr SoundClipPtr; } #endif fifengine-0.4.2/engine/core/audio/soundclip.i000066400000000000000000000035171341615052600211300ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fife %{ #include "audio/soundclip.h" #include "util/base/sharedptr.h" %} %include "util/resource/resource.i" namespace FIFE { class SoundClip : public IResource { public: ~SoundClip(); bool isStream(); }; typedef SharedPtr SoundClipPtr; %template(SharedSoundClipPointer) SharedPtr; } fifengine-0.4.2/engine/core/audio/soundclipmanager.cpp000066400000000000000000000276031341615052600230170ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/log/logger.h" #include "util/resource/resourcemanager.h" #include "util/resource/resource.h" #include "soundclipmanager.h" namespace FIFE { static Logger _log(LM_RESMGR); SoundClipManager::~SoundClipManager() { } size_t SoundClipManager::getMemoryUsed() const { size_t totalSize = 0; SoundClipHandleMapConstIterator it = m_sclipHandleMap.begin(), itend = m_sclipHandleMap.end(); for ( ; it != itend; ++it) { totalSize += it->second->getSize(); } return totalSize; } size_t SoundClipManager::getTotalResourcesCreated() const { SoundClipHandleMapConstIterator it = m_sclipHandleMap.begin(), itend = m_sclipHandleMap.end(); size_t count = 0; for ( ; it != itend; ++it) { if ( it->second->getState() == IResource::RES_NOT_LOADED ) { count++; } } return count; } size_t SoundClipManager::getTotalResourcesLoaded() const { SoundClipHandleMapConstIterator it = m_sclipHandleMap.begin(), itend = m_sclipHandleMap.end(); size_t count = 0; for ( ; it != itend; ++it) { if ( it->second->getState() == IResource::RES_LOADED ) { count++; } } return count; } size_t SoundClipManager::getTotalResources() const { return m_sclipHandleMap.size(); } SoundClipPtr SoundClipManager::create(IResourceLoader* loader){ SoundClip* ptr = new SoundClip(loader); return add(ptr); } SoundClipPtr SoundClipManager::create(const std::string& name, IResourceLoader* loader){ if (exists(name)) { FL_WARN(_log, LMsg("SoundClipManager::create(std::string, IResourceLoader* loader) - ") << "Resource name " << name << " was previously created. Returning original SoundClip..."); return get(name); } SoundClip* ptr = new SoundClip(name, loader); return add(ptr); } SoundClipPtr SoundClipManager::load(const std::string& name, IResourceLoader* loader) { SoundClipNameMapIterator nit = m_sclipNameMap.find(name); if (nit != m_sclipNameMap.end()) { if ( nit->second->getState() == IResource::RES_NOT_LOADED ) { nit->second->load(); } return nit->second; } //was not found so create and load resource SoundClipPtr ptr = create(name, loader); ptr->load(); if (ptr->getState() == IResource::RES_NOT_LOADED){ FL_WARN(_log, LMsg("SoundClipManager::load(std::string) - ") << "Resource name " << name << " was not found and could not be loaded."); remove(name); } return ptr; } SoundClipPtr SoundClipManager::add(SoundClip* res) { assert(res); assert(!(exists(res->getHandle()) || exists(res->getName()))); SoundClipPtr resptr(res); std::pair returnValue; returnValue = m_sclipHandleMap.insert ( SoundClipHandleMapPair(res->getHandle(), resptr)); if (returnValue.second) { m_sclipNameMap.insert ( SoundClipNameMapPair(returnValue.first->second->getName(), returnValue.first->second) ); } else { FL_WARN(_log, LMsg("SoundClipManager::add(IResource*) - ") << "Resource " << res->getName() << " already exists.... ignoring."); } return returnValue.first->second; } bool SoundClipManager::exists(const std::string& name) { SoundClipNameMapIterator it = m_sclipNameMap.find(name); if (it != m_sclipNameMap.end()) { return true; } return false; } bool SoundClipManager::exists(ResourceHandle handle) { SoundClipHandleMapConstIterator it = m_sclipHandleMap.find(handle); if (it != m_sclipHandleMap.end()) { return true; } return false; } void SoundClipManager::reload(const std::string& name) { SoundClipNameMapIterator nit = m_sclipNameMap.find(name); if (nit != m_sclipNameMap.end()) { if ( nit->second->getState() == IResource::RES_LOADED) { nit->second->free(); } nit->second->load(); return; } FL_WARN(_log, LMsg("SoundClipManager::reload(std::string) - ") << "Resource name " << name << " not found."); } void SoundClipManager::reload(ResourceHandle handle) { SoundClipHandleMapIterator it = m_sclipHandleMap.find(handle); if ( it != m_sclipHandleMap.end()) { if ( it->second->getState() == IResource::RES_LOADED) { it->second->free(); } it->second->load(); return; } FL_WARN(_log, LMsg("SoundClipManager::reload(ResourceHandle) - ") << "Resource handle " << handle << " not found."); } void SoundClipManager::reloadAll() { SoundClipHandleMapIterator it = m_sclipHandleMap.begin(), itend = m_sclipHandleMap.end(); for ( ; it != itend; ++it) { if ( it->second->getState() == IResource::RES_LOADED) { it->second->free(); } it->second->load(); } } void SoundClipManager::loadUnreferenced() { SoundClipHandleMapIterator it = m_sclipHandleMap.begin(), itend = m_sclipHandleMap.end(); int32_t count = 0; for ( ; it != itend; ++it) { if (it->second.useCount() == 2 && it->second->getState() != IResource::RES_LOADED){ it->second->load(); count++; } } FL_DBG(_log, LMsg("SoundClipManager::loadUnreferenced() - ") << "Loaded " << count << " unreferenced resources."); } void SoundClipManager::free(const std::string& name) { SoundClipNameMapIterator nit = m_sclipNameMap.find(name); if (nit != m_sclipNameMap.end()) { if ( nit->second->getState() == IResource::RES_LOADED) { nit->second->free(); } return; } FL_WARN(_log, LMsg("SoundClipManager::free(std::string) - ") << "Resource name " << name << " not found."); } void SoundClipManager::free(ResourceHandle handle) { SoundClipHandleMapConstIterator it = m_sclipHandleMap.find(handle); if (it != m_sclipHandleMap.end()) { if ( it->second->getState() == IResource::RES_LOADED) { it->second->free(); } return; } FL_WARN(_log, LMsg("SoundClipManager::free(ResourceHandle) - ") << "Resource handle " << handle << " not found."); } void SoundClipManager::freeAll() { SoundClipHandleMapIterator it = m_sclipHandleMap.begin(), itend = m_sclipHandleMap.end(); int32_t count = 0; for ( ; it != itend; ++it) { if ( it->second->getState() == IResource::RES_LOADED) { it->second->free(); count++; } } FL_DBG(_log, LMsg("SoundClipManager::freeAll() - ") << "Freed all " << count << " resources."); } void SoundClipManager::freeUnreferenced() { SoundClipHandleMapIterator it = m_sclipHandleMap.begin(), itend = m_sclipHandleMap.end(); int32_t count = 0; for ( ; it != itend; ++it) { if (it->second.useCount() == 2 && it->second->getState() == IResource::RES_LOADED ){ it->second->free(); count++; } } FL_DBG(_log, LMsg("SoundClipManager::freeUnreferenced() - ") << "Freed " << count << " unreferenced resources."); } void SoundClipManager::remove(SoundClipPtr& resource) { SoundClipHandleMapIterator it = m_sclipHandleMap.find(resource->getHandle()); SoundClipNameMapIterator nit = m_sclipNameMap.find(resource->getName()); if (it != m_sclipHandleMap.end()) { m_sclipHandleMap.erase(it); if (nit != m_sclipNameMap.end()) { m_sclipNameMap.erase(nit); return; } assert(false); //should never get here } FL_WARN(_log, LMsg("SoundClipManager::remove(ResourcePtr&) - ") << "Resource " << resource->getName() << " was not found."); } void SoundClipManager::remove(const std::string& name) { std::size_t handle; SoundClipNameMapIterator nit = m_sclipNameMap.find(name); if (nit != m_sclipNameMap.end()) { handle = nit->second->getHandle(); m_sclipNameMap.erase(nit); } else { FL_WARN(_log, LMsg("SoundClipManager::remove(std::string) - ") << "Resource " << name << " was not found."); return; } SoundClipHandleMapIterator it = m_sclipHandleMap.find(handle); if ( it != m_sclipHandleMap.end()) { m_sclipHandleMap.erase(it); return; } assert(false); //should never get here } void SoundClipManager::remove(ResourceHandle handle) { std::string name; SoundClipHandleMapIterator it = m_sclipHandleMap.find(handle); if (it != m_sclipHandleMap.end()) { name = it->second->getName(); m_sclipHandleMap.erase(it); } else { FL_WARN(_log, LMsg("SoundClipManager::remove(ResourceHandle) - ") << "Resource handle " << handle << " was not found."); return; } SoundClipNameMapIterator nit = m_sclipNameMap.find(name); if ( nit != m_sclipNameMap.end() ) { m_sclipNameMap.erase(nit); return; } assert(false); //should never get here } void SoundClipManager::removeAll() { //should always be equal assert (m_sclipHandleMap.size() == m_sclipNameMap.size()); size_t count = m_sclipHandleMap.size(); m_sclipHandleMap.clear(); m_sclipNameMap.clear(); FL_DBG(_log, LMsg("SoundClipManager::removeAll() - ") << "Removed all " << count << " resources."); } void SoundClipManager::removeUnreferenced() { SoundClipHandleMapIterator it = m_sclipHandleMap.begin(), itend = m_sclipHandleMap.end(); int32_t count = 0; for ( ; it != itend; ++it) { if ( it->second.useCount() == 2) { remove(it->second->getHandle()); count++; } } FL_DBG(_log, LMsg("SoundClipManager::removeUnreferenced() - ") << "Removed " << count << " unreferenced resources."); } SoundClipPtr SoundClipManager::get(const std::string& name) { SoundClipNameMapIterator nit = m_sclipNameMap.find(name); if (nit != m_sclipNameMap.end()) { if (nit->second->getState() != IResource::RES_LOADED){ //resource is not loaded so load it nit->second->load(); } return nit->second; } //not found so attempt to create and load the resource SoundClipPtr ptr = load(name); return ptr; } SoundClipPtr SoundClipManager::get(ResourceHandle handle) { SoundClipHandleMapConstIterator it = m_sclipHandleMap.find(handle); if (it != m_sclipHandleMap.end()) { if (it->second->getState() != IResource::RES_LOADED){ //resource is not loaded so load it it->second->load(); } return it->second; } FL_WARN(_log, LMsg("SoundClipManager::get(ResourceHandle) - ") << "Resource handle " << handle << " is undefined."); return SoundClipPtr(); } ResourceHandle SoundClipManager::getResourceHandle(const std::string& name) { SoundClipNameMapIterator nit = m_sclipNameMap.find(name); if (nit != m_sclipNameMap.end()) { return nit->second->getHandle(); } FL_WARN(_log, LMsg("SoundClipManager::getResourceHandle(std::string) - ") << "Resource " << name << " is undefined."); return 0; } } //FIFE fifengine-0.4.2/engine/core/audio/soundclipmanager.h000066400000000000000000000270661341615052600224670ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_SOUNDCLIP_MANAGER_H #define FIFE_SOUNDCLIP_MANAGER_H // Standard C++ library includes #include #include #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/singleton.h" #include "util/resource/resource.h" #include "util/resource/resourcemanager.h" #include "soundclip.h" namespace FIFE { /** SoundClipManager * * An interface for managing images. * * @see IResource * @see IResourceLoader * @see IResourceManager * */ class SoundClipManager : public IResourceManager, public DynamicSingleton { public: /** Default constructor. */ SoundClipManager() : IResourceManager() { } /** Destructor. */ virtual ~SoundClipManager(); virtual size_t getMemoryUsed() const; virtual size_t getTotalResourcesCreated() const; virtual size_t getTotalResourcesLoaded() const; virtual size_t getTotalResources() const; /** Creates a blank SoundClip but does not load it immediately * * @param loader A pointer to the custom resource loader. The * default is NULL. If this parameter is present the resource * will use the loader to load instead of the default built in * functions. * @return A SoundClipPtr to the newly created SoundClip * * @see SoundClip * @see OggLoader * @see IResourceLoader * */ virtual SoundClipPtr create(IResourceLoader* loader = 0); /** Creates a blank SoundClip but does not load it immediately * * @param name The resource name. Typically a filename. * @param loader A pointer to the custom resource loader. The * default is NULL. If this parameter is present the resource * will use the loader to load instead of the default built in * functions. * @return A SoundClipPtr to the newly created SoundClip * * @see SoundClip * @see OggLoader * @see IResourceLoader * */ virtual SoundClipPtr create(const std::string& name, IResourceLoader* loader = 0); /** Creates a blank resource and loads it from disk * * This function will create the SoundClip if necessary and load * the clip from disk. If the SoundClip is not defined it * will call SoundClipManager::create() before loading. * * @param name The resource name. Typically a filename. * @param loader A pointer to the custom resource loader. The * default is NULL. If this parameter is present the resource * will use the loader to load instead of the default built in * functions. * @return A SoundClipPtr to the loaded SoundClip * * @see SoundClip * @see OggLoader * @see IResourceLoader * */ virtual SoundClipPtr load(const std::string& name, IResourceLoader* loader = 0); /** Add an Image to the manager * * This function will create a SoundClipPtr and add the SoundClip * to the manager. The manager assumes ownership of the SoundClip * so DO NOT delete it. * * @param res A pointer to the SoundClip * @return A SoundClipPtr to the added resource * * @see SoundClip * */ virtual SoundClipPtr add(SoundClip* res); /** Checks to see if a SoundClip exists * * This function will search the manager for SoundClips * that match the parameter * * @param name The name of the SoundClip * @return True if the SoundClip exists. False otherwise. * */ virtual bool exists(const std::string& name); /** Checks to see if a SoundClip exists * * This function will search the manager for SoundClips * that match the parameter * * @param handle The handle of the SoundClip * @return True if the SoundClip exists. False otherwise. * */ virtual bool exists(ResourceHandle handle); /** Reloads a SoundClip * * This function will reload a SoundClip if it is managed * by the manager. If not it creates an entry in the log * specifying that the SoundClip could not be found. It will * load the SoundClip if it is not already loaded. * * @param name The name of the resource * */ virtual void reload(const std::string& name); /** Reloads a resource * * This function will reload a SoundClip if it is managed * by the manager. If not it creates an entry in the log * specifying that the SoundClip could not be found. It will * load the SoundClip if it is not already loaded. * * @param handle The handle of the resource * */ virtual void reload(ResourceHandle handle); /** Reloads all SoundClips * * This function will reload all SoundClips managed by the * manager. It will load a SoundClip if it is not already loaded. * * @todo It might be beneficial to supply a parameter to * only reload resources that are already loaded * */ virtual void reloadAll(); /** Loads all unreferenced SoundClips * * All SoundClips that have no external references will be * loaded into memory. * */ virtual void loadUnreferenced(); /** Frees a SoundClip from memory * * The SoundClip is not deleted but it's data is freed. * This calls the SoundClip::free() function and it is * up to the resource to properly free it's memory. The * manager keeps a reference to the SoundClip in case * its required in the future. * * @param name The name of the SoundClip * * @see SoundClip * */ virtual void free(const std::string& name); /** Frees a SoundClip from memory * * The SoundClip is not deleted but it's data is freed. * This calls the SoundClip::free() function and it is * up to the resource to properly free it's memory. The * manager keeps a reference to the SoundClip in case * its required in the future. * * @param handle The handle of the SoundClip * * @see SoundClip * */ virtual void free(ResourceHandle handle); /** Frees all SoundClips * * This calls the SoundClip::free() function for every * Image the manager is managing. It does not remove * them from the manager. * * @see SoundClip * */ virtual void freeAll(); /** Frees all unreferenced SoundClip * * This calls the SoundClip::free() function for SoundClips * that have no external references to them. It does not * remove them from the manager. * * @see SoundClip * */ virtual void freeUnreferenced(); /** Removes a SoundClip from the manager * * This removes all references to the SoundClip from the * manager. It does not however guarantee that the resource's * destructor is called. If the client has any left over * references to the resource it will not be freed. * * @param resource A SoundClipPtr to the image to be removed * from the manager * * @note This is useful if you want to remove ownership of a resource * from the manager * * @see SoundClip * */ virtual void remove(SoundClipPtr& resource); /** Removes a SoundClip from the manager * * This removes all references to the SoundClip from the * manager. It does not however guarantee that the resource's * destructor is called. If the client has any left over * references to the resource it will not be freed. * * @param name The name of the SoundClip * * @see SoundClip * */ virtual void remove(const std::string& name); /** Removes a SoundClip from the manager * * This removes all references to the SoundClip from the * manager. It does not however guarantee that the resource's * destructor is called. If the client has any left over * references to the resource it will not be freed. * * @param handle The handle of the SoundClip * * @see SoundClip * */ virtual void remove(ResourceHandle handle); /** Removes all SoundClips from the manager * * This effectively removes all references to all SoundClips from * the manager. If there are left over shared pointers to * any resources they will not be deleted. * * @see SoundClip * */ virtual void removeAll(); /** Removes all unreferenced SoundClips * * This effectively removes all SoundClips that dont have an * external reference. The resources will be deleted. * * @see SoundClip * */ virtual void removeUnreferenced(); /** Gets a shared pointer to the SoundClip * * If the SoundClip is not defined it will attempt to create * and load the SoundClip based on the name (it assumes the name * is a filename) * * @param name The name of the SoundClip * @return A SoundClipPtr to the SoundClip * */ virtual SoundClipPtr get(const std::string& name); /** Gets a shared pointer to the SoundClip * * If the resource is not defined it returns an empty * (or invalid) SoundClipPtr and makes an entry in the log. * * @param handle The handle of the resource * @return A SoundClipPtr to the resource * * @todo This should throw an exception instead of an * empty SoundClipPtr * */ virtual SoundClipPtr get(ResourceHandle handle); /** Gets a SoundClip handle by name * * Returns the SoundClip handle associated with the name * * @param name The name of the SoundClip * @return 0 if the resource name is invalid * */ virtual ResourceHandle getResourceHandle(const std::string& name); private: typedef std::map< ResourceHandle, SoundClipPtr > SoundClipHandleMap; typedef std::map< ResourceHandle, SoundClipPtr >::iterator SoundClipHandleMapIterator; typedef std::map< ResourceHandle, SoundClipPtr >::const_iterator SoundClipHandleMapConstIterator; typedef std::pair< ResourceHandle, SoundClipPtr > SoundClipHandleMapPair; typedef std::map< std::string, SoundClipPtr > SoundClipNameMap; typedef std::map< std::string, SoundClipPtr >::iterator SoundClipNameMapIterator; typedef std::map< std::string, SoundClipPtr >::const_iterator SoundClipNameMapConstIterator; typedef std::pair< std::string, SoundClipPtr > SoundClipNameMapPair; SoundClipHandleMap m_sclipHandleMap; SoundClipNameMap m_sclipNameMap; }; } //FIFE #endif //FIFE_SOUNDCLIP_MANAGER_H fifengine-0.4.2/engine/core/audio/soundclipmanager.i000066400000000000000000000056071341615052600224650ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fife %{ #include "audio/soundclip.h" #include "audio/soundclipmanager.h" %} namespace FIFE { class SoundClip; class SoundClipManager : public IResourceManager { public: virtual ~SoundClipManager(); virtual size_t getMemoryUsed() const; virtual size_t getTotalResourcesCreated() const; virtual size_t getTotalResourcesLoaded() const; virtual size_t getTotalResources() const; virtual SoundClipPtr create(const std::string& name, IResourceLoader* loader = 0); virtual SoundClipPtr load(const std::string& name, IResourceLoader* loader = 0); virtual SoundClipPtr add(SoundClip* res); virtual bool exists(const std::string& name); virtual bool exists(ResourceHandle handle); virtual void reload(const std::string& name); virtual void reload(ResourceHandle handle); virtual void reloadAll(); virtual void loadUnreferenced(); virtual void free(const std::string& name); virtual void free(ResourceHandle handle); virtual void freeAll(); virtual void freeUnreferenced(); virtual void remove(SoundClipPtr& resource); virtual void remove(const std::string& name); virtual void remove(ResourceHandle handle); virtual void removeAll(); virtual void removeUnreferenced(); virtual SoundClipPtr get(const std::string& name); virtual SoundClipPtr get(ResourceHandle handle); virtual ResourceHandle getResourceHandle(const std::string& name); }; } fifengine-0.4.2/engine/core/audio/soundconfig.h000066400000000000000000000141151341615052600214410ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_AUDIO_CONFIG_H #define FIFE_AUDIO_CONFIG_H // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/fife_stdint.h" namespace FIFE { /** Sound filter type */ enum SoundFilterType { SF_FILTER_NULL, SF_FILTER_LOWPASS, SF_FILTER_HIGHPASS, SF_FILTER_BANDPASS }; /** Sound effect type */ enum SoundEffectType { SE_EFFECT_NULL, SE_EFFECT_REVERB, SE_EFFECT_CHORUS, SE_EFFECT_DISTORTION, SE_EFFECT_ECHO, SE_EFFECT_FLANGER, SE_EFFECT_FREQUENCY_SHIFTER, SE_EFFECT_VOCAL_MORPHER, SE_EFFECT_PITCH_SHIFTER, SE_EFFECT_RING_MODULATOR, SE_EFFECT_AUTOWAH, SE_EFFECT_COMPRESSOR, SE_EFFECT_EQUALIZER, SE_EFFECT_EAXREVERB }; /** Presets for EAX Reverb */ enum SoundEffectPreset { SE_PRESET_GENERIC, SE_PRESET_PADDEDCELL, SE_PRESET_ROOM, SE_PRESET_BATHROOM, SE_PRESET_LIVINGROOM, SE_PRESET_STONEROOM, SE_PRESET_AUDITORIUM, SE_PRESET_CONCERTHALL, SE_PRESET_CAVE, SE_PRESET_ARENA, SE_PRESET_HANGAR, SE_PRESET_CARPETEDHALLWAY, SE_PRESET_HALLWAY, SE_PRESET_STONECORRIDOR, SE_PRESET_ALLEY, SE_PRESET_FOREST, SE_PRESET_CITY, SE_PRESET_MOUNTAINS, SE_PRESET_QUARRY, SE_PRESET_PLAIN, SE_PRESET_PARKINGLOT, SE_PRESET_SEWERPIPE, SE_PRESET_UNDERWATER, SE_PRESET_DRUGGED, SE_PRESET_DIZZY, SE_PRESET_PSYCHOTIC, SE_PRESET_CASTLE_SMALLROOM, SE_PRESET_CASTLE_SHORTPASSAGE, SE_PRESET_CASTLE_MEDIUMROOM, SE_PRESET_CASTLE_LARGEROOM, SE_PRESET_CASTLE_LONGPASSAGE, SE_PRESET_CASTLE_HALL, SE_PRESET_CASTLE_CUPBOARD, SE_PRESET_CASTLE_COURTYARD, SE_PRESET_CASTLE_ALCOVE, SE_PRESET_FACTORY_SMALLROOM, SE_PRESET_FACTORY_SHORTPASSAGE, SE_PRESET_FACTORY_MEDIUMROOM, SE_PRESET_FACTORY_LARGEROOM, SE_PRESET_FACTORY_LONGPASSAGE, SE_PRESET_FACTORY_HALL, SE_PRESET_FACTORY_CUPBOARD, SE_PRESET_FACTORY_COURTYARD, SE_PRESET_FACTORY_ALCOVE, SE_PRESET_ICEPALACE_SMALLROOM, SE_PRESET_ICEPALACE_SHORTPASSAGE, SE_PRESET_ICEPALACE_MEDIUMROOM, SE_PRESET_ICEPALACE_LARGEROOM, SE_PRESET_ICEPALACE_LONGPASSAGE, SE_PRESET_ICEPALACE_HALL, SE_PRESET_ICEPALACE_CUPBOARD, SE_PRESET_ICEPALACE_COURTYARD, SE_PRESET_ICEPALACE_ALCOVE, SE_PRESET_SPACESTATION_SMALLROOM, SE_PRESET_SPACESTATION_SHORTPASSAGE, SE_PRESET_SPACESTATION_MEDIUMROOM, SE_PRESET_SPACESTATION_LARGEROOM, SE_PRESET_SPACESTATION_LONGPASSAGE, SE_PRESET_SPACESTATION_HALL, SE_PRESET_SPACESTATION_CUPBOARD, SE_PRESET_SPACESTATION_ALCOVE, SE_PRESET_WOODEN_SMALLROOM, SE_PRESET_WOODEN_SHORTPASSAGE, SE_PRESET_WOODEN_MEDIUMROOM, SE_PRESET_WOODEN_LARGEROOM, SE_PRESET_WOODEN_LONGPASSAGE, SE_PRESET_WOODEN_HALL, SE_PRESET_WOODEN_CUPBOARD, SE_PRESET_WOODEN_COURTYARD, SE_PRESET_WOODEN_ALCOVE, SE_PRESET_SPORT_EMPTYSTADIUM, SE_PRESET_SPORT_SQUASHCOURT, SE_PRESET_SPORT_SMALLSWIMMINGPOOL, SE_PRESET_SPORT_LARGESWIMMINGPOOL, SE_PRESET_SPORT_GYMNASIUM, SE_PRESET_SPORT_FULLSTADIUM, SE_PRESET_SPORT_STADIUMTANNOY, SE_PRESET_PREFAB_WORKSHOP, SE_PRESET_PREFAB_SCHOOLROOM, SE_PRESET_PREFAB_PRACTISEROOM, SE_PRESET_PREFAB_OUTHOUSE, SE_PRESET_PREFAB_CARAVAN, SE_PRESET_DOME_TOMB, SE_PRESET_PIPE_SMALL, SE_PRESET_DOME_SAINTPAULS, SE_PRESET_PIPE_LONGTHIN, SE_PRESET_PIPE_LARGE, SE_PRESET_PIPE_RESONANT, SE_PRESET_OUTDOORS_BACKYARD, SE_PRESET_OUTDOORS_ROLLINGPLAINS, SE_PRESET_OUTDOORS_DEEPCANYON, SE_PRESET_OUTDOORS_CREEK, SE_PRESET_OUTDOORS_VALLEY, SE_PRESET_MOOD_HEAVEN, SE_PRESET_MOOD_HELL, SE_PRESET_MOOD_MEMORY, SE_PRESET_DRIVING_COMMENTATOR, SE_PRESET_DRIVING_PITGARAGE, SE_PRESET_DRIVING_INCAR_RACER, SE_PRESET_DRIVING_INCAR_SPORTS, SE_PRESET_DRIVING_INCAR_LUXURY, SE_PRESET_DRIVING_FULLGRANDSTAND, SE_PRESET_DRIVING_EMPTYGRANDSTAND, SE_PRESET_DRIVING_TUNNEL, SE_PRESET_CITY_STREETS, SE_PRESET_CITY_SUBWAY, SE_PRESET_CITY_MUSEUM, SE_PRESET_CITY_LIBRARY, SE_PRESET_CITY_UNDERPASS, SE_PRESET_CITY_ABANDONED, SE_PRESET_DUSTYROOM, SE_PRESET_CHAPEL, SE_PRESET_SMALLWATERROOM }; /* The max. length of a decoded audio data * for which streaming is not used. (bytes) * Has to be <= than BUFFERLEN * 3. */ const uint32_t MAX_KEEP_IN_MEM = 3145728; // The number of buffers used for streaming. const int16_t BUFFER_NUM = 3; // The length of one buffer. (bytes) const uint32_t BUFFER_LEN = 1048576; // The max. number of OpenAL sources. const uint16_t MAX_SOURCES = 64; // The max. number of OpenAL effect slots. const uint16_t MAX_EFFECT_SLOTS = 32; } #endif fifengine-0.4.2/engine/core/audio/sounddecoder.h000066400000000000000000000076351341615052600216120ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_SOUNDDECODER_H #define FIFE_SOUNDDECODER_H // Standard C++ library includes // Platform specific includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "soundconfig.h" #include "fife_openal.h" namespace FIFE { class SoundDecoder { public: virtual ~SoundDecoder() {} /** Returns the decoded length of the file in bytes */ virtual uint64_t getDecodedLength() const = 0; /** A stream or not? * * The decision if we decode the whole audio file in one buffer or use a * kind of streaming depends on the value of MAX_KEEP_IN_MEM from * soundconfig.h * * @return Return true for a streaming decoder, false if the sound is * decoded in one buffer */ bool needsStreaming() const { return getDecodedLength() > MAX_KEEP_IN_MEM; } /** Sets the current position in the file (in bytes) * * @return True, if the positioning was successful */ virtual bool setCursor(uint64_t pos) = 0; /** Request the decoding of the next part of the stream. * * @param length The length of the decoded part * @return 0 (False), if decoding was successful */ virtual bool decode(uint64_t length) = 0; /** Returns the next decoded buffer. * * The length of the buffer is returned by getBufferSize(). */ virtual void* getBuffer() const = 0; /** Returns the byte-size of the buffer returned by getBuffer(). */ virtual uint64_t getBufferSize() = 0; /** Releases the buffer returned by getBuffer() */ virtual void releaseBuffer() = 0; /** Tests if the audio data is stereo data or mono. * * @return Returns true if the audio data is stereo, false if mono. */ bool isStereo() const { return m_isstereo; } /** Returns the openAL-Format of the audio file */ ALenum getALFormat() const { if (m_isstereo) { return m_is8bit ? AL_FORMAT_STEREO8 : AL_FORMAT_STEREO16; } else { return m_is8bit ? AL_FORMAT_MONO8 : AL_FORMAT_MONO16; } } /** Returns the bit resolution */ int16_t getBitResolution() const { return m_is8bit ? 8 : 16; } /** Returns the sample rate */ uint64_t getSampleRate() const{ return m_samplerate; } protected: bool m_isstereo; bool m_is8bit; uint64_t m_samplerate; }; } #endif fifengine-0.4.2/engine/core/audio/soundemitter.cpp000066400000000000000000000564041341615052600222070ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes #include // Platform specific includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/log/logger.h" #include "util/base/exception.h" #include "util/time/timemanager.h" #include "soundemitter.h" #include "soundmanager.h" #include "soundclipmanager.h" namespace FIFE { static Logger _log(LM_AUDIO); SoundEmitter::SoundEmitter(SoundManager* manager, uint32_t uid) : m_manager(manager), m_source(0), m_directFilter(NULL), m_soundClip(), m_soundClipId(0), m_streamId(0), m_emitterId(uid), m_group(""), m_samplesOffset(0), m_active(false), m_fadeIn(false), m_fadeOut(false), m_origGain(0.0f), m_fadeInStartTimestamp(0), m_fadeInEndTimestamp(0), m_fadeOutStartTimestamp(0), m_fadeOutEndTimestamp(0), m_playCheckDifference(0) { if (!m_manager->isActive()) { return; } resetInternData(); } SoundEmitter::~SoundEmitter() { if (!m_manager->isActive()) { return; } reset(); } void SoundEmitter::setSource(ALuint source) { if (!source && m_source) { alSourceStop(m_source); // Release all buffers alSourcei(m_source, AL_BUFFER, AL_NONE); alGetError(); deactivateEffects(); } m_source = source; if (m_source > 0) { m_active = true; activateEffects(); syncData(); } else { m_active = false; } } ALuint SoundEmitter::getSource() const { return m_source; } bool SoundEmitter::isActive() const { return m_active; } void SoundEmitter::update() { if (!m_soundClip || m_internData.soundState == SD_STOPPED_STATE) { return; } if (m_fadeIn || m_fadeOut) { checkFade(); } // non streaming if (!m_soundClip->isStream()) { if (getState() == SD_STOPPED_STATE) { stop(); } return; } ALint procs; ALint bufs; ALuint buffer; alGetSourcei(m_source, AL_BUFFERS_PROCESSED, &procs); while (procs--) { // needed for correct cursor position float samplesOffset, newOffset; alGetSourcef(m_source, AL_SAMPLE_OFFSET, &samplesOffset); alSourceUnqueueBuffers(m_source, 1, &buffer); alGetSourcef(m_source, AL_SAMPLE_OFFSET, &newOffset); m_samplesOffset += (samplesOffset - newOffset); if (m_soundClip->getStream(m_streamId, buffer)) { // EOF! if (m_internData.loop) { // play again from the beginning m_soundClip->setStreamPos(m_streamId, SD_BYTE_POS, 0); m_soundClip->getStream(m_streamId, buffer); } else { // check if the playback has been finished alGetSourcei(m_source, AL_BUFFERS_QUEUED, &bufs); if (bufs == 0) { stop(); } continue; } } alSourceQueueBuffers(m_source, 1, &buffer); } CHECK_OPENAL_LOG(_log, LogManager::LEVEL_ERROR, "error while streaming") } uint32_t SoundEmitter::getId() const { return m_emitterId; } void SoundEmitter::setRelativePositioning(bool relative) { if (isActive()) { alSourcei(m_source, AL_SOURCE_RELATIVE, relative ? AL_TRUE : AL_FALSE); } m_internData.relative = relative; } bool SoundEmitter::isRelativePositioning() const { return m_internData.relative; } void SoundEmitter::setDirection(const AudioSpaceCoordinate& direction) { if (isActive()) { ALfloat vec[3] = { static_cast(direction.x), static_cast(direction.y), static_cast(direction.z) }; alSourcefv(m_source, AL_DIRECTION, vec); } m_internData.direction = direction; } AudioSpaceCoordinate SoundEmitter::getDirection() const { return m_internData.direction; } void SoundEmitter::setPitch(float pitch) { if (pitch > 0.0) { if (isActive()) { alSourcef(m_source, AL_PITCH, pitch); } m_internData.pitch = pitch; } } float SoundEmitter::getPitch() const { return m_internData.pitch; } void SoundEmitter::setRolloff(float rolloff) { if (isActive()) { alSourcef(m_source, AL_ROLLOFF_FACTOR, rolloff); } m_internData.rolloff = rolloff; } float SoundEmitter::getRolloff() const { return m_internData.rolloff; } void SoundEmitter::reset(bool defaultall) { // remove effects and filter if (m_directFilter) { m_manager->deactivateFilter(m_directFilter, this); } std::vectoreffects = m_effects; for (std::vector::iterator it = effects.begin(); it != effects.end(); ++it) { if (*it) { m_manager->removeEmitterFromSoundEffect(*it, this); } } // release buffer and source handle if (isActive()) { alSourceStop(m_source); alSourcei(m_source, AL_BUFFER, AL_NONE); alGetError(); m_manager->releaseSource(this); } // reset clip if (m_soundClip) { if (m_soundClip->isStream()) { m_soundClip->quitStreaming(m_streamId); m_streamId = 0; } m_soundClipId = 0; // release the soundClip //SoundClipManager::instance()->free(m_soundClipId); m_soundClip.reset(); } // default source properties if (defaultall) { resetInternData(); if (isActive()) { syncData(); } } if (m_group != "") { m_manager->removeFromGroup(this); m_group = ""; } m_samplesOffset = 0; m_fadeIn = false; m_fadeOut = false; m_origGain = 0; } void SoundEmitter::release() { m_manager->releaseEmitter(m_emitterId); } void SoundEmitter::setSoundClip(SoundClipPtr soundClip) { // equal clip if (m_soundClipId == soundClip->getHandle()) { return; } detachSoundClip(); m_soundClipId = soundClip->getHandle(); m_soundClip = soundClip; attachSoundClip(); } SoundClipPtr SoundEmitter::getSoundClip() { return m_soundClip; } void SoundEmitter::setSoundClip(const std::string& name) { SoundClipPtr clip = SoundClipManager::instance()->get(name); setSoundClip(clip); } void SoundEmitter::attachSoundClip() { if (!m_soundClip->isStream()) { if (!isActive()) { return; } // non-streaming alSourceQueueBuffers(m_source, m_soundClip->countBuffers(), m_soundClip->getBuffers()); alSourcei(m_source, AL_LOOPING, m_internData.loop ? AL_TRUE : AL_FALSE); } else { // streaming m_streamId = m_soundClip->beginStreaming(); m_soundClip->acquireStream(m_streamId); if (!isActive()) { return; } // queue initial buffers alSourceQueueBuffers(m_source, BUFFER_NUM, m_soundClip->getBuffers(m_streamId)); alSourcei(m_source, AL_LOOPING, AL_FALSE); } CHECK_OPENAL_LOG(_log, LogManager::LEVEL_ERROR, "error attaching sound clip") } void SoundEmitter::detachSoundClip() { if (!m_soundClip) { return; } SoundStateType state = getState(); if (state == SD_PLAYING_STATE || state == SD_PAUSED_STATE) { stop(); } if (isActive()) { // detach all buffers alSourcei(m_source, AL_BUFFER, AL_NONE); CHECK_OPENAL_LOG(_log, LogManager::LEVEL_ERROR, "error detaching sound clip"); } if (m_soundClip->isStream()) { m_soundClip->quitStreaming(m_streamId); m_streamId = 0; } m_soundClipId = 0; m_soundClip.reset(); } void SoundEmitter::setLooping(bool loop) { if (m_soundClip && isActive()) { if (!m_soundClip->isStream()) { alSourcei(m_source, AL_LOOPING, loop ? AL_TRUE : AL_FALSE); } else { alSourcei(m_source, AL_LOOPING, AL_FALSE); } } m_internData.loop = loop; } bool SoundEmitter::isLooping() const { return m_internData.loop; } void SoundEmitter::play() { if (m_soundClip && isActive()) { alSourcePlay(m_source); } m_internData.playTimestamp = TimeManager::instance()->getTime(); m_playCheckDifference = 0; // resume if (m_internData.soundState == SD_PAUSED_STATE) { m_internData.playTimestamp -= static_cast(getCursor(SD_TIME_POS) * 1000); } m_internData.soundState = SD_PLAYING_STATE; } void SoundEmitter::play(float inTime, float outTime) { float zero = 0; m_origGain = m_internData.volume; if (!Mathf::Equal(zero, inTime)) { m_fadeIn = true; setGain(0.0f); play(); m_fadeInStartTimestamp = m_internData.playTimestamp; m_fadeInEndTimestamp = m_fadeInStartTimestamp + static_cast(inTime * 1000.0f); } if (getState() != SD_PLAYING_STATE) { play(); } if (!Mathf::Equal(zero, outTime)) { m_fadeOut = true; setGain(0.0f); m_fadeOutEndTimestamp = m_internData.playTimestamp + getDuration(); m_fadeOutStartTimestamp = m_fadeOutEndTimestamp - static_cast(outTime * 1000.0f); } } void SoundEmitter::stop() { if (m_soundClip && isActive()) { alSourceStop(m_source); rewind(); } m_internData.soundState = SD_STOPPED_STATE; m_internData.playTimestamp = 0; callOnSoundFinished(); } void SoundEmitter::stop(float time) { m_fadeOut = true; m_origGain = m_internData.volume; m_fadeOutStartTimestamp = TimeManager::instance()->getTime(); m_fadeOutEndTimestamp = m_fadeOutStartTimestamp + static_cast(time * 1000.0f); } void SoundEmitter::pause() { if (m_soundClip && isActive()) { alSourcePause(m_source); } m_internData.soundState = SD_PAUSED_STATE; } void SoundEmitter::rewind() { m_internData.playTimestamp = 0; m_samplesOffset = 0; if (!isActive() || !m_soundClip) { return; } if (m_soundClip->isStream()) { setCursor(SD_BYTE_POS, 0); } else { alSourceRewind(m_source); } } void SoundEmitter::setGain(float gain) { if (isActive()) { alSourcef(m_source, AL_GAIN, gain); } m_internData.volume = gain; } float SoundEmitter::getGain() const { return m_internData.volume; } void SoundEmitter::setMaxGain(float gain) { if (isActive()) { alSourcef(m_source, AL_MAX_GAIN, gain); } m_internData.maxVolume = gain; } float SoundEmitter::getMaxGain() const { return m_internData.maxVolume; } void SoundEmitter::setMinGain(float gain) { if (isActive()) { alSourcef(m_source, AL_MIN_GAIN, gain); } m_internData.minVolume = gain; } float SoundEmitter::getMinGain() const { return m_internData.minVolume; } bool SoundEmitter::isStereo() { if (m_soundClip) { return m_soundClip->getDecoder()->isStereo(); } return false; } int16_t SoundEmitter::getBitResolution() { if (m_soundClip) { return m_soundClip->getDecoder()->getBitResolution(); } return 0; } uint64_t SoundEmitter::getSampleRate() { if (m_soundClip) { return m_soundClip->getDecoder()->getSampleRate(); } return 0; } uint64_t SoundEmitter::getDecodedLength() { if (m_soundClip) { return m_soundClip->getDecoder()->getDecodedLength(); } return 0; } uint64_t SoundEmitter::getDuration() { if (m_soundClip) { //convert to milliseconds double samplerate = static_cast(getSampleRate()) / 1000.0; double bitres = static_cast(getBitResolution()); // convert to bits double size = static_cast(getDecodedLength()) * 8.0; double stereo = (isStereo() ? 2.0 : 1.0); double time = ( size / (samplerate * bitres) ) / stereo; return static_cast(time); } return 0; } uint32_t SoundEmitter::getPlayTimestamp() { return m_internData.playTimestamp; } bool SoundEmitter::isFinished() { if (isLooping()) { return false; } if (isActive()) { return getState() == SD_STOPPED_STATE; } if (getState() == SD_STOPPED_STATE) { return true; } // roughly check, in the case the clip do not plays (is not active) return (m_internData.playTimestamp + m_playCheckDifference + static_cast(getDuration())) <= TimeManager::instance()->getTime(); } void SoundEmitter::setCursor(SoundPositionType type, float value) { if (!m_soundClip || !isActive()) { return; } ALint state = 0; if (!m_soundClip->isStream()) { switch(type) { case SD_BYTE_POS: alSourcef(m_source, AL_BYTE_OFFSET, value); break; case SD_SAMPLE_POS: alSourcef(m_source, AL_SAMPLE_OFFSET, value); break; case SD_TIME_POS: alSourcef(m_source, AL_SEC_OFFSET, value); break; } CHECK_OPENAL_LOG(_log, LogManager::LEVEL_ERROR, "error setting cursor position") } else { switch (type) { case SD_BYTE_POS: m_samplesOffset = value / (getBitResolution() / 8 * (isStereo() ? 2 : 1)); break; case SD_SAMPLE_POS: m_samplesOffset = value; break; case SD_TIME_POS: m_samplesOffset = value * getSampleRate(); break; } alGetSourcei(m_source, AL_SOURCE_STATE, &state); if (state == AL_PLAYING || state == AL_PAUSED) { alSourceStop(m_source); } m_soundClip->setStreamPos(m_streamId, type, value); // detach all buffers alSourcei(m_source, AL_BUFFER, 0); // queue the buffers with new data m_soundClip->acquireStream(m_streamId); alSourceQueueBuffers(m_source, BUFFER_NUM, m_soundClip->getBuffers(m_streamId)); if (state == AL_PLAYING) { alSourcePlay(m_source); } CHECK_OPENAL_LOG(_log, LogManager::LEVEL_ERROR, "error setting stream cursor position") } } float SoundEmitter::getCursor(SoundPositionType type) { if (!m_soundClip || !isActive()) { return 0.0f; } ALfloat pos = 0.0f; switch(type) { case SD_BYTE_POS: alGetSourcef(m_source, AL_BYTE_OFFSET, &pos); break; case SD_SAMPLE_POS: alGetSourcef(m_source, AL_SAMPLE_OFFSET, &pos); break; case SD_TIME_POS: alGetSourcef(m_source, AL_SEC_OFFSET, &pos); break; } if (m_soundClip->isStream()) { switch (type) { case SD_BYTE_POS: pos += m_samplesOffset * (getBitResolution() / 8 * (isStereo() ? 2 : 1)); break; case SD_SAMPLE_POS: pos += m_samplesOffset; break; case SD_TIME_POS: pos += m_samplesOffset / getSampleRate(); break; } } CHECK_OPENAL_LOG(_log, LogManager::LEVEL_ERROR, "error getting cursor") return pos; } void SoundEmitter::setPosition(const AudioSpaceCoordinate& position) { if (isActive()) { alSource3f(m_source, AL_POSITION, static_cast(position.x), static_cast(position.y), static_cast(position.z)); } m_internData.position = position; } AudioSpaceCoordinate SoundEmitter::getPosition() const { return m_internData.position; } bool SoundEmitter::isPosition() const { double zero = 0; return !(Mathd::Equal(zero, m_internData.position.x) && Mathd::Equal(zero, m_internData.position.y) && Mathd::Equal(zero, m_internData.position.z)); } void SoundEmitter::setReferenceDistance(float distance) { if (isActive()) { alSourcef(m_source, AL_REFERENCE_DISTANCE, distance); } m_internData.refDistance = distance; } float SoundEmitter::getReferenceDistance() const { return m_internData.refDistance; } void SoundEmitter::setMaxDistance(float distance) { if (isActive()) { alSourcef(m_source, AL_MAX_DISTANCE, distance); } m_internData.maxDistance = distance; } float SoundEmitter::getMaxDistance() const { return m_internData.maxDistance; } void SoundEmitter::setVelocity(const AudioSpaceCoordinate& velocity) { if (isActive()) { alSource3f(m_source, AL_VELOCITY, static_cast(velocity.x), static_cast(velocity.y), static_cast(velocity.z)); } m_internData.velocity = velocity; } AudioSpaceCoordinate SoundEmitter::getVelocity() const { return m_internData.velocity; } void SoundEmitter::setConeInnerAngle(float inner) { if (isActive()) { alSourcef(m_source, AL_CONE_INNER_ANGLE, inner); } m_internData.coneInnerAngle = inner; } float SoundEmitter::getConeInnerAngle() const { return m_internData.coneInnerAngle; } void SoundEmitter::setConeOuterAngle(float outer) { if (isActive()) { alSourcef(m_source, AL_CONE_OUTER_ANGLE, outer); } m_internData.coneOuterAngle = outer; } float SoundEmitter::getConeOuterAngle() const { return m_internData.coneOuterAngle; } void SoundEmitter::setConeOuterGain(float gain) { if (isActive()) { alSourcef(m_source, AL_CONE_OUTER_GAIN, gain); } m_internData.coneOuterGain = gain; } float SoundEmitter::getConeOuterGain() const { return m_internData.coneOuterGain; } SoundStateType SoundEmitter::getState() { if (!isActive()) { return m_internData.soundState; } ALint state; alGetSourcei(m_source, AL_SOURCE_STATE, &state); switch(state) { case AL_INITIAL: return SD_INITIAL_STATE; break; case AL_PLAYING: return SD_PLAYING_STATE; break; case AL_PAUSED: return SD_PAUSED_STATE; break; case AL_STOPPED: return SD_STOPPED_STATE; break; default: return SD_UNKNOWN_STATE; break; } } void SoundEmitter::setGroup(const std::string& group) { if (group != m_group) { if (m_group != "") { m_manager->removeFromGroup(this); } m_group = group; if (m_group != "") { m_manager->addToGroup(this); } } } const std::string& SoundEmitter::getGroup() { return m_group; } void SoundEmitter::syncData() { setGain(m_internData.volume); setMaxGain(m_internData.maxVolume); setMinGain(m_internData.minVolume); setReferenceDistance(m_internData.refDistance); setMaxDistance(m_internData.maxDistance); setRolloff(m_internData.rolloff); setPitch(m_internData.pitch); setConeInnerAngle(m_internData.coneInnerAngle); setConeOuterAngle(m_internData.coneOuterAngle); setConeOuterGain(m_internData.coneOuterGain); setPosition(m_internData.position); setDirection(m_internData.direction); setVelocity(m_internData.velocity); setLooping(m_internData.loop); setRelativePositioning(m_internData.relative); if (m_internData.soundState == SD_PLAYING_STATE) { uint32_t timediff = TimeManager::instance()->getTime() - m_internData.playTimestamp - m_playCheckDifference; if (m_internData.loop) { timediff = timediff % getDuration(); } float time = static_cast(timediff) / 1000.0f; attachSoundClip(); setCursor(SD_TIME_POS, time); if (m_soundClip && isActive()) { m_internData.playTimestamp = TimeManager::instance()->getTime() - timediff; alSourcePlay(m_source); } } } void SoundEmitter::resetInternData() { m_internData.volume = 1.0; m_internData.maxVolume = 1.0; m_internData.minVolume = 0.0; m_internData.refDistance = 1.0; m_internData.maxDistance = 1000000.0; m_internData.rolloff = 1.0; m_internData.pitch = 1.0; m_internData.coneInnerAngle = 360.0; m_internData.coneOuterAngle = 360.0; m_internData.coneOuterGain = 0.0; m_internData.position = AudioSpaceCoordinate(0.0, 0.0, 0.0); m_internData.direction = AudioSpaceCoordinate(0.0, 0.0, 0.0); m_internData.velocity = AudioSpaceCoordinate(0.0, 0.0, 0.0); m_internData.playTimestamp = 0; m_internData.soundState = SD_UNKNOWN_STATE; m_internData.loop = false; m_internData.relative = false; } void SoundEmitter::checkFade() { uint32_t timestamp = TimeManager::instance()->getTime(); if (m_fadeIn) { float delta = m_origGain / static_cast(m_fadeInEndTimestamp - m_fadeInStartTimestamp); if (timestamp >= m_fadeInEndTimestamp) { m_fadeIn = false; setGain(m_origGain); } else { float gain = delta * static_cast(timestamp - m_fadeInStartTimestamp); gain = std::min(gain, m_origGain); setGain(gain); } } else if (m_fadeOut) { float delta = m_origGain / static_cast(m_fadeOutEndTimestamp - m_fadeOutStartTimestamp); if (timestamp >= m_fadeOutEndTimestamp) { m_fadeOut = false; stop(); setGain(m_origGain); } else { float gain = delta * static_cast(m_fadeOutEndTimestamp - timestamp); gain = std::max(gain, 0.0f); setGain(gain); } } } void SoundEmitter::addEffect(SoundEffect* effect) { bool added = false; for (std::vector::iterator it = m_effects.begin(); it != m_effects.end(); ++it) { if (!(*it)) { (*it) = effect; added = true; break; } } if (!added) { m_effects.push_back(effect); } } void SoundEmitter::removeEffect(SoundEffect* effect) { for (std::vector::iterator it = m_effects.begin(); it != m_effects.end(); ++it) { if (effect == *it) { (*it) = NULL; break; } } } uint8_t SoundEmitter::getEffectCount() { uint8_t counter = 0; for (std::vector::iterator it = m_effects.begin(); it != m_effects.end(); ++it) { if (*it) { ++counter; } } return counter; } uint8_t SoundEmitter::getEffectNumber(SoundEffect* effect) { uint8_t number = 0; for (std::vector::iterator it = m_effects.begin(); it != m_effects.end(); ++it) { if (effect == *it) { break; } ++number; } return number; } void SoundEmitter::setDirectFilter(SoundFilter* filter) { m_directFilter = filter; } SoundFilter* SoundEmitter::getDirectFilter() { return m_directFilter; } void SoundEmitter::activateEffects() { for (std::vector::iterator it = m_effects.begin(); it != m_effects.end(); ++it) { if (*it) { m_manager->activateEffect(*it, this); } } if (m_directFilter) { m_manager->activateFilter(m_directFilter, this); } } void SoundEmitter::deactivateEffects() { for (std::vector::iterator it = m_effects.begin(); it != m_effects.end(); ++it) { if (*it) { m_manager->deactivateEffect(*it, this); } } if (m_directFilter) { m_manager->deactivateFilter(m_directFilter, this); } } void SoundEmitter::setCheckDifference() { if (m_playCheckDifference == 0 && getState() == SD_PLAYING_STATE) { m_playCheckDifference = TimeManager::instance()->getTime() - m_internData.playTimestamp; } } void SoundEmitter::addListener(SoundEmitterListener* listener) { m_listeners.push_back(listener); } void SoundEmitter::removeListener(SoundEmitterListener* listener) { std::vector::iterator i = m_listeners.begin(); while (i != m_listeners.end()) { if ((*i) == listener) { *i = NULL; return; } ++i; } FL_WARN(_log, "Cannot remove unknown listener"); } void SoundEmitter::callOnSoundFinished() { std::vector::iterator i = m_listeners.begin(); for (; i != m_listeners.end(); ++i) { if (*i) { (*i)->onSoundFinished(m_emitterId, m_soundClipId); } } m_listeners.erase(std::remove(m_listeners.begin(), m_listeners.end(), (SoundEmitterListener*)NULL), m_listeners.end()); } } fifengine-0.4.2/engine/core/audio/soundemitter.h000066400000000000000000000306631341615052600216530ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_SOUNDEMITTER_H_ #define FIFE_SOUNDEMITTER_H_ // Standard C++ library includes // Platform specific includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "model/metamodel/modelcoords.h" #include "soundclip.h" namespace FIFE { /** State of the audio file */ enum SoundStateType { SD_UNKNOWN_STATE, SD_INITIAL_STATE, SD_PLAYING_STATE, SD_PAUSED_STATE, SD_STOPPED_STATE }; /** Listener interface for SoundEmitter. */ class SoundEmitterListener { public: virtual ~SoundEmitterListener() {}; /** Called when a sound finished playing. Or stop() was called. * @param emitterId The id of emitter. * @param SoundClipId The id of sound clip aka ResourceHandle. */ virtual void onSoundFinished(uint32_t emitterId, uint32_t soundClipId) = 0; }; class SoundEffect; class SoundFilter; class SoundManager; /** The class for playing audio files */ class SoundEmitter { public: SoundEmitter(SoundManager* manager, uint32_t uid); ~SoundEmitter(); /** Sets openAl-source. */ void setSource(ALuint source); /** Return openAl-source. */ ALuint getSource() const; /** Return if the Emitter is active / have an openAl-source. */ bool isActive() const; /** Called once a frame from the SoundManager. */ void update(); /** Returns the emitter-id */ uint32_t getId() const; /** Sets Positioning-Type * Default is false * * @param relative If set to true, the emitters position will be interpreted relative to the listener object * */ void setRelativePositioning(bool relative); /** Return Positioning-Type */ bool isRelativePositioning() const; /** Sets the distance under which the volume for the SoundEmitter would normally drop by half (before * being influenced by rolloff factor or max distance. Default 1.0 */ void setReferenceDistance(float distance); /** Return the reference distance. */ float getReferenceDistance() const; /** Sets the max distance used with the Inverse Clamped Distance Model to set the distance where * there will no longer be any attenuation of the source. */ void setMaxDistance(float distance); /** Return the max distance. */ float getMaxDistance() const; /** Sets the AL_ROLEOFF_FACTOR. Rolloff factor judges the strength of attenuation over distance. * * @param rolloff Rolloff factor. You'll need to do a lot of testing to find a value which suits your needs. Default 1.0 */ void setRolloff(float rolloff); /** Return the AL_ROLEOFF_FACTOR. Rolloff factor judges the strength of attenuation over distance. */ float getRolloff() const; /** Sets the sound clip to be used by this emitter. * @param soundClip SoundClipPtr of the sound to be used. */ void setSoundClip(SoundClipPtr soundClip); /** Get the current sound clip used by this emitter. * @return A SoundClipPtr of the sound clip. */ SoundClipPtr getSoundClip(); /** Sets the sound clip to be used by this emitter. * @param name The name of the sound to be used. */ void setSoundClip(const std::string& name); /** Reset the emitter, free all internal buffers * * @param defaultall If set to true, emitter position, velocity, gain and type will be set to the default values */ void reset(bool defaultall = false); /** Releases the emitter */ void release(); /** Sets the playing mode */ void setLooping(bool loop); /** Return playing mode */ bool isLooping() const; /** Plays the associated audio file. */ void play(); /** Plays the associated audio file with fade in and / or out. */ void play(float inTime, float outTime); /** Stops playing the audio file and rewinds to the beginning. */ void stop(); /** Stops playing the audio file after time with fade out. */ void stop(float time); /** Pauses playing the audio file. */ void pause(); /** Rewinds the associated audio file. */ void rewind(); /** Sets the gain of the emitter * * @param gain The gain value. 0=silence ... 1.0=normal loudness. */ void setGain(float gain); /** Returns the gain of the emitter * * @return The gain value. 0=silence ... 1.0=normal loudness. */ float getGain() const; /** Sets the max. gain of the emitter * * @param gain The gain value. 0=silence ... 1.0=normal loudness. */ void setMaxGain(float gain); /** Returns the max. gain of the emitter * * @return The gain value. 0=silence ... 1.0=normal loudness. */ float getMaxGain() const; /** Sets the min. gain of the emitter * * @param gain The gain value. 0=silence ... 1.0=normal loudness. */ void setMinGain(float gain); /** Returns the min. gain of the emitter * * @return The gain value. 0=silence ... 1.0=normal loudness. */ float getMinGain() const; /** Tests if the audio data is stereo data or mono. * * @return Returns true if the audio data is stereo, false if mono. */ bool isStereo(); /** Returns the bit resolution */ int16_t getBitResolution(); /** Returns the sample rate */ uint64_t getSampleRate(); /** Returns the length of the decoded length in bytes */ uint64_t getDecodedLength(); /** Returns the duration of the sound clip in milliseconds */ uint64_t getDuration(); /** Returns timestamp of the last play start in milliseconds */ uint32_t getPlayTimestamp(); /** Returns true if clip is finished. */ bool isFinished(); /** Sets the cursor position in the audio file */ void setCursor(SoundPositionType type, float value); /** Returns the cursor position in the audio file */ float getCursor(SoundPositionType type); /** Sets the position of the SoundEmitter in the virtual audio space. */ void setPosition(const AudioSpaceCoordinate& position); /** Return the position of the SoundEmitter in the virtual audio space. */ AudioSpaceCoordinate getPosition() const; /** Return if it is a positional SoundEmitter. */ bool isPosition() const; /** Sets the direction of the SoundEmitter in the virtual audio space. */ void setDirection(const AudioSpaceCoordinate& direction); /** Return the direction of the SoundEmitter in the virtual audio space. */ AudioSpaceCoordinate getDirection() const; /** Sets pitch multiplier. Can only be positiv. */ void setPitch(float pitch); /** Return pitch multiplier. Can only be positiv. */ float getPitch() const; /** Sets the velocity of the SoundEmitter in the virtual audio space. */ void setVelocity(const AudioSpaceCoordinate& velocity); /** Return the velocity of the SoundEmitter in the virtual audio space. */ AudioSpaceCoordinate getVelocity() const; /** Sets inner angle of the sound cone, in degrees. Default 360 */ void setConeInnerAngle(float inner); /** Return inner angle of the sound cone, in degrees. */ float getConeInnerAngle() const; /** Sets outer angle of the sound cone, in degrees. Default 360 */ void setConeOuterAngle(float outer); /** Return outer angle of the sound cone, in degrees. */ float getConeOuterAngle() const; /** Sets the gain when outside the oriented cone. */ void setConeOuterGain(float gain); /** Return the gain when outside the oriented cone. */ float getConeOuterGain() const; /** Returns the state of the audio file */ SoundStateType getState(); /** Sets the group name. Adds the emitter automatically to the group. */ void setGroup(const std::string& group); /** Return the group name. */ const std::string& getGroup(); /** Adds effect. Used from SoundEffectManager. */ void addEffect(SoundEffect* effect); /** Removes effect. Used from SoundEffectManager. */ void removeEffect(SoundEffect* effect); /** Return the number of effects. Used from SoundEffectManager. */ uint8_t getEffectCount(); /** Return the number of the given effect. Used from SoundEffectManager. */ uint8_t getEffectNumber(SoundEffect* effect); /** Sets the direct filter. Used from SoundEffectManager. */ void setDirectFilter(SoundFilter* filter); /** Return the direct filter. Used from SoundEffectManager. */ SoundFilter* getDirectFilter(); /** Activates effects if the Emitter got the openAL-source. */ void activateEffects(); /** Deactivates effects if the Emitter loses the openAL-source. */ void deactivateEffects(); /** Sets the time difference between play and the first check if it's playable. */ void setCheckDifference(); /** Adds new SoundEmitter listener * @param listener to add */ void addListener(SoundEmitterListener* listener); /** Removes associated SoundEmitter listener * @param listener to remove */ void removeListener(SoundEmitterListener* listener); private: /** Internal function to attach a SoundClip to the source */ void attachSoundClip(); /** Internal function to detach a SoundClip from the source */ void detachSoundClip(); /** Updates OpenAL with collected data. */ void syncData(); /** Updates fade in and out. */ void checkFade(); /** Resets collected data to defaults. */ void resetInternData(); /** Calls the Listeners if a sound finished */ void callOnSoundFinished(); //! Access to the SoundManager SoundManager* m_manager; //! The openAL-source ALuint m_source; //! Applied direct sound filter SoundFilter* m_directFilter; //! The attached sound clip SoundClipPtr m_soundClip; //! Id of the attached sound clip uint32_t m_soundClipId; //! The id of the stream uint32_t m_streamId; //! The emitter-id uint32_t m_emitterId; //! buffers OpenAL data struct internData { float volume; float maxVolume; float minVolume; float refDistance; float maxDistance; float rolloff; float pitch; float coneInnerAngle; float coneOuterAngle; float coneOuterGain; AudioSpaceCoordinate position; AudioSpaceCoordinate direction; AudioSpaceCoordinate velocity; uint32_t playTimestamp; SoundStateType soundState; bool loop; bool relative; } m_internData; //! the group name std::string m_group; //! saves sample offset for played stream parts float m_samplesOffset; //! is active bool m_active; //! fade in clip bool m_fadeIn; //! fade out clip bool m_fadeOut; //! original gain float m_origGain; //! fade in start time uint32_t m_fadeInStartTimestamp; //! fade in end time uint32_t m_fadeInEndTimestamp; //! fade out start time uint32_t m_fadeOutStartTimestamp; //! fade out end time uint32_t m_fadeOutEndTimestamp; //! time difference between play and first check uint32_t m_playCheckDifference; //! holds pointer to applied SoundEffects std::vector m_effects; //! listeners for sound related events std::vector m_listeners; }; } #endif fifengine-0.4.2/engine/core/audio/soundemitter.i000066400000000000000000000100021341615052600216350ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module soundemitter %{ #include "audio/soundemitter.h" %} %include "model/metamodel/modelcoords.i" namespace FIFE { %feature("director") SoundEmitterListener; class SoundEmitterListener { public: virtual ~SoundEmitterListener() {}; virtual void onSoundFinished(uint32_t emitterId, uint32_t soundClipId) = 0; }; enum SoundPositionType { SD_SAMPLE_POS, SD_TIME_POS, SD_BYTE_POS }; enum SoundStateType { SD_UNKNOWN_STATE, SD_INITIAL_STATE, SD_PLAYING_STATE, SD_PAUSED_STATE, SD_STOPPED_STATE }; class SoundManager; class SoundEmitter { public: uint32_t getId() const; bool isActive() const; uint8_t getEffectCount(); void setSoundClip(SoundClipPtr soundClip); SoundClipPtr getSoundClip(); void reset(bool defaultall = false); void release(); void play(); void play(float inTime, float outTime); void pause(); void stop(); void stop(float time); void rewind(); void setGain(float gain); float getGain() const; void setMaxGain(float gain); float getMaxGain() const; void setMinGain(float gain); float getMinGain() const; void setLooping(bool loop); bool isLooping() const; void setRolloff(float rolloff); float getRolloff() const; void setRelativePositioning(bool relative); bool isRelativePositioning() const; void setPosition(const AudioSpaceCoordinate& position); AudioSpaceCoordinate getPosition() const; void setReferenceDistance(float distance); float getReferenceDistance() const; void setMaxDistance(float distance); float getMaxDistance() const; void setDirection(const AudioSpaceCoordinate& direction); AudioSpaceCoordinate getDirection() const; void setVelocity(const AudioSpaceCoordinate& velocity); AudioSpaceCoordinate getVelocity() const; void setPitch(float pitch); float getPitch() const; void setConeInnerAngle(float inner); float getConeInnerAngle() const; void setConeOuterAngle(float outer); float getConeOuterAngle() const; void setConeOuterGain(float gain); float getConeOuterGain() const; bool isStereo(); int16_t getBitResolution(); uint64_t getSampleRate(); uint64_t getDecodedLength(); uint64_t getDuration(); void setCursor(SoundPositionType type, float value); float getCursor(SoundPositionType type); SoundStateType getState(); void setGroup(const std::string& group); const std::string& getGroup(); void addListener(SoundEmitterListener* listener); void removeListener(SoundEmitterListener* listener); private: SoundEmitter(SoundManager* manager, uint32_t uid); }; } fifengine-0.4.2/engine/core/audio/soundmanager.cpp000066400000000000000000000453571341615052600221550ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // Platform specific includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "audio/effects/soundeffectmanager.h" #include "vfs/vfs.h" #include "util/log/logger.h" #include "util/base/exception.h" #include "soundclipmanager.h" #include "soundemitter.h" #include "soundmanager.h" namespace FIFE { /** Logger to use for this source file. * @relates Logger */ static Logger _log(LM_AUDIO); SoundManager::SoundManager() : m_context(0), m_device(0), m_muteVol(0), m_volume(1.0), m_maxDistance(50.0), m_distanceModel(SD_DISTANCE_INVERSE_CLAMPED), m_state(SM_STATE_INACTIV), m_sources(), m_createdSources(0), m_effectManager(NULL) { } SoundManager::~SoundManager() { // delete all soundemitters for (std::vector::iterator it = m_emitterVec.begin(); it != m_emitterVec.end(); ++it) { if ((*it) != NULL) { delete (*it); } } m_emitterVec.clear(); // delete all sources alDeleteSources(m_createdSources, m_sources); // delete effect manager delete m_effectManager; if (m_device) { alcDestroyContext(m_context); alcCloseDevice(m_device); m_device = NULL; } if (alcGetError(NULL) != ALC_NO_ERROR) { FL_ERR(_log, LMsg() << "error closing openal device"); } } void SoundManager::init() { m_device = alcOpenDevice(NULL); if (!m_device || alcGetError(m_device) != ALC_NO_ERROR) { FL_ERR(_log, LMsg() << "Could not open audio device - deactivating audio module"); m_device = NULL; return; } m_context = alcCreateContext(m_device, NULL); if (!m_context || alcGetError(m_device) != ALC_NO_ERROR) { FL_ERR(_log, LMsg() << "Couldn't create audio context - deactivating audio module"); m_device = NULL; return; } alcMakeContextCurrent(m_context); if (alcGetError(m_device) != ALC_NO_ERROR) { FL_ERR(_log, LMsg() << "Couldn't change current audio context - deactivating audio module"); m_device = NULL; return; } // create and initialize the effect manager m_effectManager = new SoundEffectManager(); m_effectManager->init(m_device); // set listener position alListener3f(AL_POSITION, 0.0, 0.0, 0.0); ALfloat vec1[6] = { 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}; alListenerfv(AL_ORIENTATION, vec1); // set volume alListenerf(AL_GAIN, m_volume); // create max sources for (uint16_t i = 0; i < MAX_SOURCES; i++) { alGenSources(1, &m_sources[i]); if (alGetError() != AL_NO_ERROR) { break; } m_freeSources.push(m_sources[i]); m_createdSources++; } m_state = SM_STATE_PLAY; } bool SoundManager::isActive() const { return m_state != SM_STATE_INACTIV; } ALCcontext* SoundManager::getContext() const { return m_context; } void SoundManager::setVolume(float vol) { m_volume = vol; m_muteVol = vol; if (isActive()) { alListenerf(AL_GAIN, vol); } } float SoundManager::getVolume() const { return m_volume; } void SoundManager::mute() { if (isActive()) { alGetListenerf(AL_GAIN, &m_muteVol); alListenerf(AL_GAIN, 0); } } void SoundManager::unmute() { if (isActive()) { alListenerf(AL_GAIN, m_muteVol); } } void SoundManager::play() { m_state = SM_STATE_PLAY; for (std::vector::iterator it = m_emitterVec.begin(); it != m_emitterVec.end(); ++it) { SoundEmitter* emitter = (*it); if (!emitter) { continue; } emitter->play(); } } void SoundManager::pause() { m_state = SM_STATE_PAUSE; for (std::vector::iterator it = m_emitterVec.begin(); it != m_emitterVec.end(); ++it) { SoundEmitter* emitter = (*it); if (!emitter) { continue; } emitter->pause(); } } void SoundManager::stop() { m_state = SM_STATE_STOP; for (std::vector::iterator it = m_emitterVec.begin(); it != m_emitterVec.end(); ++it) { SoundEmitter* emitter = (*it); if (!emitter) { continue; } emitter->stop(); } } void SoundManager::rewind() { for (std::vector::iterator it = m_emitterVec.begin(); it != m_emitterVec.end(); ++it) { SoundEmitter* emitter = (*it); if (!emitter) { continue; } emitter->rewind(); } } void SoundManager::setDistanceModel(SoundDistanceModelType model) { m_distanceModel = model; if (!isActive()) { return; } switch (m_distanceModel) { case SD_DISTANCE_NONE: alDistanceModel(AL_NONE); break; case SD_DISTANCE_INVERSE: alDistanceModel(AL_INVERSE_DISTANCE); break; case SD_DISTANCE_INVERSE_CLAMPED: alDistanceModel(AL_INVERSE_DISTANCE_CLAMPED); break; case SD_DISTANCE_LINEAR: alDistanceModel(AL_LINEAR_DISTANCE); break; case SD_DISTANCE_LINEAR_CLAMPED: alDistanceModel(AL_LINEAR_DISTANCE_CLAMPED); break; case SD_DISTANCE_EXPONENT: alDistanceModel(AL_EXPONENT_DISTANCE); break; case SD_DISTANCE_EXPONENT_CLAMPED: alDistanceModel(AL_EXPONENT_DISTANCE_CLAMPED); break; default: break; } } SoundDistanceModelType SoundManager::getDistanceModel() const { return m_distanceModel; } void SoundManager::setListenerPosition(const AudioSpaceCoordinate& position) { if (isActive()) { alListener3f(AL_POSITION, static_cast(position.x), static_cast(position.y), static_cast(position.z)); } } AudioSpaceCoordinate SoundManager::getListenerPosition() const { if (isActive()) { ALfloat vec[3]; alGetListenerfv(AL_POSITION, vec); return AudioSpaceCoordinate(vec[0], vec[1], vec[2]); } return AudioSpaceCoordinate(); } void SoundManager::setListenerOrientation(const AudioSpaceCoordinate& orientation) { if (isActive()) { ALfloat vec[6] = { static_cast(orientation.x), static_cast(orientation.y), static_cast(orientation.z), 0.0, 0.0, 1.0 }; alListenerfv(AL_ORIENTATION, vec); } } AudioSpaceCoordinate SoundManager::getListenerOrientation() const { if (isActive()) { ALfloat vec[6]; alGetListenerfv(AL_ORIENTATION, vec); return AudioSpaceCoordinate(vec[0], vec[1], vec[2]); } return AudioSpaceCoordinate(); } void SoundManager::setListenerVelocity(const AudioSpaceCoordinate& velocity) { if (isActive()) { alListener3f(AL_VELOCITY, static_cast(velocity.x), static_cast(velocity.y), static_cast(velocity.z)); } } AudioSpaceCoordinate SoundManager::getListenerVelocity() const { if (isActive()) { ALfloat vec[3]; alGetListenerfv(AL_VELOCITY, vec); return AudioSpaceCoordinate(vec[0], vec[1], vec[2]); } return AudioSpaceCoordinate(); } void SoundManager::setDopplerFactor(float factor) { if (isActive()) { if (factor >= 0.0) { alDopplerFactor(factor); } } } float SoundManager::getDopplerFactor() const { if (isActive()) { return alGetFloat(AL_DOPPLER_FACTOR); } return 0.0; } void SoundManager::setListenerMaxDistance(float distance) { m_maxDistance = distance; } float SoundManager::getListenerMaxDistance() const { return m_maxDistance; } void SoundManager::update() { if (m_state != SM_STATE_PLAY) { return; } AudioSpaceCoordinate listenerPos = getListenerPosition(); double maxDistance = static_cast(m_maxDistance); // first check emitters for (std::vector::iterator it = m_emitterVec.begin(); it != m_emitterVec.end(); ++it) { SoundEmitter* emitter = (*it); if (!emitter) { continue; } emitter->setCheckDifference(); bool active = emitter->isActive(); bool clip = emitter->getSoundClip(); bool plays = !emitter->isFinished(); // remove active without clip or stopped if (!clip || !plays) { if (active) { emitter->update(); releaseSource(emitter); } continue; } bool inRange = true; if (emitter->isPosition()) { AudioSpaceCoordinate emitterPos = emitter->getPosition(); double rx = listenerPos.x - emitterPos.x; double ry = listenerPos.y - emitterPos.y; double rz = listenerPos.z - emitterPos.z; inRange = maxDistance >= Mathd::Sqrt(rx*rx + ry*ry + rz*rz); } // remove active not in range if (!inRange) { if (active) { releaseSource(emitter); } continue; } if (!active && !m_freeSources.empty()) { setEmitterSource(emitter); } } // then update active for (std::map::iterator it = m_activeEmitters.begin(); it != m_activeEmitters.end(); ++it) { it->first->update(); } } SoundEmitter* SoundManager::getEmitter(uint32_t emitterId) const { return m_emitterVec.at(emitterId); } SoundEmitter* SoundManager::createEmitter() { SoundEmitter* ptr = NULL; for (uint32_t i = 0; i < m_emitterVec.size(); i++) { if (m_emitterVec.at(i) == NULL) { ptr = new SoundEmitter(this, i); m_emitterVec.at(i) = ptr; break; } } if (!ptr) { ptr = new SoundEmitter(this, m_emitterVec.size()); m_emitterVec.push_back(ptr); } return ptr; } SoundEmitter* SoundManager::createEmitter(const std::string& name) { SoundEmitter* emitter = createEmitter(); emitter->setSoundClip(SoundClipManager::instance()->get(name)); return emitter; } void SoundManager::releaseEmitter(uint32_t emitterId) { SoundEmitter** ptr = &m_emitterVec.at(emitterId); if ((*ptr)->isActive()) { releaseSource(*ptr); } delete *ptr; *ptr = NULL; } void SoundManager::deleteEmitter(SoundEmitter* emitter) { releaseEmitter(emitter->getId()); } void SoundManager::setEmitterSource(SoundEmitter* emitter) { std::pair::iterator, bool> ret; ret = m_activeEmitters.insert(std::pair(emitter, m_freeSources.front())); if (ret.second == false) { FL_WARN(_log, LMsg() << "SoundEmitter already have an source handler"); } emitter->setSource(m_freeSources.front()); m_freeSources.pop(); } void SoundManager::releaseSource(SoundEmitter* emitter) { if (emitter->isActive()) { std::map::iterator it = m_activeEmitters.find(emitter); if (it != m_activeEmitters.end()) { m_freeSources.push(it->second); m_activeEmitters.erase(it); emitter->setSource(0); } else { FL_WARN(_log, LMsg() << "SoundEmitter can not release source handler"); } } } SoundEffect* SoundManager::createSoundEffect(SoundEffectType type) { return m_effectManager->createSoundEffect(type); } SoundEffect* SoundManager::createSoundEffectPreset(SoundEffectPreset type) { return m_effectManager->createSoundEffectPreset(type); } void SoundManager::deleteSoundEffect(SoundEffect* effect) { m_effectManager->deleteSoundEffect(effect); } void SoundManager::enableSoundEffect(SoundEffect* effect) { m_effectManager->enableSoundEffect(effect); } void SoundManager::disableSoundEffect(SoundEffect* effect) { m_effectManager->disableSoundEffect(effect); } void SoundManager::addEmitterToSoundEffect(SoundEffect* effect, SoundEmitter* emitter) { m_effectManager->addEmitterToSoundEffect(effect, emitter); } void SoundManager::removeEmitterFromSoundEffect(SoundEffect* effect, SoundEmitter* emitter) { m_effectManager->removeEmitterFromSoundEffect(effect, emitter); } void SoundManager::addSoundFilterToSoundEffect(SoundEffect* effect, SoundFilter* filter) { m_effectManager->addSoundFilterToSoundEffect(effect, filter); } void SoundManager::removeSoundFilterFromSoundEffect(SoundEffect* effect, SoundFilter* filter) { m_effectManager->removeSoundFilterFromSoundEffect(effect, filter); } void SoundManager::activateEffect(SoundEffect* effect, SoundEmitter* emitter) { m_effectManager->activateEffect(effect, emitter); } void SoundManager::deactivateEffect(SoundEffect* effect, SoundEmitter* emitter) { m_effectManager->deactivateEffect(effect, emitter); } SoundFilter* SoundManager::createSoundFilter(SoundFilterType type) { return m_effectManager->createSoundFilter(type); } void SoundManager::deleteSoundFilter(SoundFilter* filter) { m_effectManager->deleteSoundFilter(filter); } void SoundManager::enableDirectSoundFilter(SoundFilter* filter) { m_effectManager->enableDirectSoundFilter(filter); } void SoundManager::disableDirectSoundFilter(SoundFilter* filter) { m_effectManager->disableDirectSoundFilter(filter); } void SoundManager::addEmitterToDirectSoundFilter(SoundFilter* filter, SoundEmitter* emitter) { m_effectManager->addEmitterToDirectSoundFilter(filter, emitter); } void SoundManager::removeEmitterFromDirectSoundFilter(SoundFilter* filter, SoundEmitter* emitter) { m_effectManager->removeEmitterFromDirectSoundFilter(filter, emitter); } void SoundManager::activateFilter(SoundFilter* filter, SoundEmitter* emitter) { m_effectManager->activateFilter(filter, emitter); } void SoundManager::deactivateFilter(SoundFilter* filter, SoundEmitter* emitter) { m_effectManager->deactivateFilter(filter, emitter); } void SoundManager::addToGroup(SoundEmitter* emitter) { if (emitter->getGroup() != "") { m_groups[emitter->getGroup()].push_back(emitter); } } void SoundManager::removeFromGroup(SoundEmitter* emitter) { std::string group = emitter->getGroup(); if (group == "") { return; } EmitterGroupsIterator groupIt = m_groups.find(group); if (groupIt == m_groups.end()) { FL_WARN(_log, LMsg() << "SoundEmitter can not removed from unknown group"); return; } bool found = false; std::vector::iterator emitterIt = groupIt->second.begin(); std::vector::iterator emitterEnd = groupIt->second.end(); while (emitterIt != emitterEnd) { if ((*emitterIt) == emitter) { groupIt->second.erase(emitterIt++); found = true; } else { ++emitterIt; } } if (!found) { FL_WARN(_log, LMsg() << "SoundEmitter could not be found in the given group."); return; } } void SoundManager::removeGroup(const std::string& group) { if (group == "") { return; } EmitterGroupsIterator groupIt = m_groups.find(group); if (groupIt == m_groups.end()) { FL_WARN(_log, LMsg() << "SoundEmitter can not remove unknown group"); return; } std::vector emitters = groupIt->second; for (std::vector::iterator it = emitters.begin(); it != emitters.end(); ++it) { (*it)->setGroup(""); } m_groups.erase(group); } void SoundManager::removeAllGroups() { std::vector groups; for (EmitterGroupsIterator it = m_groups.begin(); it != m_groups.end(); ++it) { groups.push_back(it->first); } for (std::vector::iterator it = groups.begin(); it != groups.end(); ++it) { removeGroup(*it); } m_groups.clear(); } void SoundManager::play(const std::string& group) { EmitterGroupsIterator groupIt = m_groups.find(group); if (groupIt == m_groups.end()) { FL_WARN(_log, LMsg() << "Unknown group can not played"); return; } std::vector::iterator emitterIt = groupIt->second.begin(); for (; emitterIt != groupIt->second.end(); ++emitterIt) { (*emitterIt)->play(); } } void SoundManager::pause(const std::string& group) { EmitterGroupsIterator groupIt = m_groups.find(group); if (groupIt == m_groups.end()) { FL_WARN(_log, LMsg() << "Unknown group can not paused"); return; } std::vector::iterator emitterIt = groupIt->second.begin(); for (; emitterIt != groupIt->second.end(); ++emitterIt) { (*emitterIt)->pause(); } } void SoundManager::stop(const std::string& group) { EmitterGroupsIterator groupIt = m_groups.find(group); if (groupIt == m_groups.end()) { FL_WARN(_log, LMsg() << "Unknown group can not stopped"); return; } std::vector::iterator emitterIt = groupIt->second.begin(); for (; emitterIt != groupIt->second.end(); ++emitterIt) { (*emitterIt)->stop(); } } void SoundManager::rewind(const std::string& group) { EmitterGroupsIterator groupIt = m_groups.find(group); if (groupIt == m_groups.end()) { FL_WARN(_log, LMsg() << "Unknown group can not rewinded"); return; } std::vector::iterator emitterIt = groupIt->second.begin(); for (; emitterIt != groupIt->second.end(); ++emitterIt) { (*emitterIt)->rewind(); } } void SoundManager::setGain(const std::string& group, float gain) { EmitterGroupsIterator groupIt = m_groups.find(group); if (groupIt == m_groups.end()) { FL_WARN(_log, LMsg() << "Unknown group can not set gain"); return; } std::vector::iterator emitterIt = groupIt->second.begin(); for (; emitterIt != groupIt->second.end(); ++emitterIt) { (*emitterIt)->setGain(gain); } } void SoundManager::setMaxGain(const std::string& group, float gain) { EmitterGroupsIterator groupIt = m_groups.find(group); if (groupIt == m_groups.end()) { FL_WARN(_log, LMsg() << "Unknown group can not set max gain"); return; } std::vector::iterator emitterIt = groupIt->second.begin(); for (; emitterIt != groupIt->second.end(); ++emitterIt) { (*emitterIt)->setMaxGain(gain); } } void SoundManager::setMinGain(const std::string& group, float gain) { EmitterGroupsIterator groupIt = m_groups.find(group); if (groupIt == m_groups.end()) { FL_WARN(_log, LMsg() << "Unknown group can not set min gain"); return; } std::vector::iterator emitterIt = groupIt->second.begin(); for (; emitterIt != groupIt->second.end(); ++emitterIt) { (*emitterIt)->setMinGain(gain); } } } //FIFE fifengine-0.4.2/engine/core/audio/soundmanager.h000066400000000000000000000266741341615052600216230ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_SOUNDMANAGER_H #define FIFE_SOUNDMANAGER_H // Standard C++ library includes #include // Platform specific includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "model/metamodel/modelcoords.h" #include "util/base/singleton.h" #include "fife_openal.h" #include "soundconfig.h" namespace FIFE { /** Distance model from OpenAL */ enum SoundDistanceModelType { SD_DISTANCE_NONE, SD_DISTANCE_INVERSE, SD_DISTANCE_INVERSE_CLAMPED, SD_DISTANCE_LINEAR, SD_DISTANCE_LINEAR_CLAMPED, SD_DISTANCE_EXPONENT, SD_DISTANCE_EXPONENT_CLAMPED }; /** SoundManager state */ enum SoundManagerState { SM_STATE_INACTIV, SM_STATE_PLAY, SM_STATE_PAUSE, SM_STATE_STOP }; class SoundEffectManager; class SoundEffect; class SoundFilter; class SoundEmitter; class SoundManager : public DynamicSingleton { public: SoundManager(); ~SoundManager(); /** Initializes the audio system */ void init(); /** Returns true if audio module is active */ bool isActive() const; /** Returns an openAL context */ ALCcontext* getContext() const; /** Sets the Master Volume * * @param vol The volume value. 0=silence ... 1.0=normal loudness. */ void setVolume(float vol); /** Return the Master Volume */ float getVolume() const; /** Mute */ void mute(); /** Unmutes to volume before mute() was called. */ void unmute(); /** Plays all SoundEmitters. */ void play(); /** Pauses all SoundEmitters. */ void pause(); /** Stops all SoundEmitters. */ void stop(); /** Rewinds all SoundEmitters. */ void rewind(); /** Sets the distance model. */ void setDistanceModel(SoundDistanceModelType model); /** Return the distance mode. */ SoundDistanceModelType getDistanceModel() const; /** Sets the position of the listener (alter ego). */ void setListenerPosition(const AudioSpaceCoordinate& position); /** Return the position of the listener (alter ego). */ AudioSpaceCoordinate getListenerPosition() const; /** Sets the orientation of the listener (alter ego). */ void setListenerOrientation(const AudioSpaceCoordinate& orientation); /** Return the orientation of the listener (alter ego). */ AudioSpaceCoordinate getListenerOrientation() const; /** Sets the velocity of the listener (alter ego). */ void setListenerVelocity(const AudioSpaceCoordinate& velocity); /** Return the velocity of the listener (alter ego). */ AudioSpaceCoordinate getListenerVelocity() const; /** Sets factor for doppler effect. */ void setDopplerFactor(float factor); /** Return factor for doppler effect. */ float getDopplerFactor() const; /** Sets the maximal listener distance. * If it is larger the emitter turns off, or on if it is smaller. */ void setListenerMaxDistance(float distance); /** Return the maximal listener distance. */ float getListenerMaxDistance() const; /** Called once a frame and updates the sound objects. */ void update(); /** Returns a pointer to an emitter-instance given by emitterId * * @param emitterId The id of the Emitter * */ SoundEmitter* getEmitter(uint32_t emitterId) const; /** Returns a pointer to an allocated emitter-instance */ SoundEmitter* createEmitter(); /** Returns a pointer to an allocated emitter-instance * * @param name The name of the SoundClip. */ SoundEmitter* createEmitter(const std::string& name); /** Release an emitter-instance given by emitter-id * * @param emitterId The id of the Emitter. */ void releaseEmitter(uint32_t emitterId); /** Release given emitter * * @param emitter The emitter-instance to destroy. */ void deleteEmitter(SoundEmitter* emitter); /** Release the source handle * * @param emitter The emitter-instance. */ void releaseSource(SoundEmitter* emitter); /** Creates SoundEffect of the specific type. * @param type See SoundEffectType */ SoundEffect* createSoundEffect(SoundEffectType type); /** Creates EaxReverb SoundEffect and loads the specific preset type. * @param type See SoundEffectPreset */ SoundEffect* createSoundEffectPreset(SoundEffectPreset type); /** Deletes given SoundEffect. * Deactivates for SoundEmitters are automatically done. */ void deleteSoundEffect(SoundEffect* effect); /** Enables given SoundEffect. */ void enableSoundEffect(SoundEffect* effect); /** Disables given SoundEffect. */ void disableSoundEffect(SoundEffect* effect); /** Adds given SoundEmitter to the specific SoundEffect. * Note: A SoundEmitter can only have a limited number of effects, usually 4. */ void addEmitterToSoundEffect(SoundEffect* effect, SoundEmitter* emitter); /** Removes given SoundEmitter from the specific SoundEffect. */ void removeEmitterFromSoundEffect(SoundEffect* effect, SoundEmitter* emitter); /** Adds given SoundFilter to the SoundEffect. * Note: A SoundEffect can only have one SoundFilter. */ void addSoundFilterToSoundEffect(SoundEffect* effect, SoundFilter* filter); /** Removes given SoundFilter from the SoundEffect. */ void removeSoundFilterFromSoundEffect(SoundEffect* effect, SoundFilter* filter); /** Internal function to do the OpenAL calls to activate the SoundEffect for the SoundEmitter. */ void activateEffect(SoundEffect* effect, SoundEmitter* emitter); /** Internal function to do the OpenAL calls to deactivate the SoundEffect for the SoundEmitter. */ void deactivateEffect(SoundEffect* effect, SoundEmitter* emitter); /** Creates SoundFilter of the specific type. * @param type See SoundFilterType */ SoundFilter* createSoundFilter(SoundFilterType type); /** Deletes given SoundFilter. * Deactivates for SoundEmitters and Effects are automatically done. */ void deleteSoundFilter(SoundFilter* filter); /** Enables given direct SoundFilter. Only SoundFilters for SoundEmitters are meant. */ void enableDirectSoundFilter(SoundFilter* filter); /** Disables given SoundFilter. Only SoundFilters for SoundEmitters are meant. */ void disableDirectSoundFilter(SoundFilter* filter); /** Adds given SoundEmitter to the specific direct SoundFilter * Note: A SoundEmitter can only have one direct filter. */ void addEmitterToDirectSoundFilter(SoundFilter* filter, SoundEmitter* emitter); /** Removes given SoundEmitter from the specific direct SoundFilter. */ void removeEmitterFromDirectSoundFilter(SoundFilter* filter, SoundEmitter* emitter); /** Internal function to do the OpenAL calls to activate the SoundFilter for the SoundEmitter. */ void activateFilter(SoundFilter* filter, SoundEmitter* emitter); /** Internal function to do the OpenAL calls to deactivate the SoundFilter for the SoundEmitter. */ void deactivateFilter(SoundFilter* filter, SoundEmitter* emitter); /** Adds the emitter to group. * Called from the emitter after a setGroup() call. * * @param emitter The emitter-instance. */ void addToGroup(SoundEmitter* emitter); /** Removes the emitter from group. * Called from the emitter if new group is different as the old. * * @param emitter The emitter-instance. */ void removeFromGroup(SoundEmitter* emitter); /** Remove group and resets the group for the affected emitters. * * @param group The group name. */ void removeGroup(const std::string& group); /** Remove all groups and resets the group of affected emitters. */ void removeAllGroups(); /** Plays all emitters of the group. * * @param group The group name. */ void play(const std::string& group); /** Pauses all emitters of the group. * * @param group The group name. */ void pause(const std::string& group); /** Stops all emitters of the group. * * @param group The group name. */ void stop(const std::string& group); /** Rewinds all emitters of the group. * * @param group The group name. */ void rewind(const std::string& group); /** Sets gain for all emitters of the group. * * @param group The group name. * @param gain The gain value. */ void setGain(const std::string& group, float gain); /** Sets max gain for all emitters of the group. * * @param group The group name. * @param gain The max gain value. */ void setMaxGain(const std::string& group, float gain); /** Sets min gain for all emitters of the group. * * @param group The group name. * @param gain The min gain value. */ void setMinGain(const std::string& group, float gain); private: typedef std::map > EmitterGroups; typedef EmitterGroups::iterator EmitterGroupsIterator; /** Sets the source handle * * @param emitter The Emitter pointer. */ void setEmitterSource(SoundEmitter* emitter); //! emitter-vector, holds all emitters std::vector m_emitterVec; //! OpenAL context ALCcontext* m_context; //! OpenAL device ALCdevice* m_device; //! volume before mute() was called float m_muteVol; //! volume to support setVolume-calls before initialization float m_volume; //! distance that removes a active Emitter float m_maxDistance; //! Selected distance model SoundDistanceModelType m_distanceModel; //! State of the SoundManager SoundManagerState m_state; //! Holds handles for sources ALuint m_sources[MAX_SOURCES]; //! Maximal created sources, can be different to MAX_SOURCES uint16_t m_createdSources; //! Holds free handles for sources std::queue m_freeSources; //! Map that holds active Emitters together with the used source handle std::map m_activeEmitters; SoundEffectManager* m_effectManager; //! A map that holds the groups together with the appended emitters. EmitterGroups m_groups; }; } #endif fifengine-0.4.2/engine/core/audio/soundmanager.i000066400000000000000000000170741341615052600216160ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module soundmanager %{ #include "audio/soundmanager.h" #include "audio/fife_openal.h" %} %include "model/metamodel/modelcoords.i" %include "util/resource/resource.i" namespace FIFE { enum SoundDistanceModelType { SD_DISTANCE_NONE, SD_DISTANCE_INVERSE, SD_DISTANCE_INVERSE_CLAMPED, SD_DISTANCE_LINEAR, SD_DISTANCE_LINEAR_CLAMPED, SD_DISTANCE_EXPONENT, SD_DISTANCE_EXPONENT_CLAMPED }; enum SoundEffectPreset { SE_PRESET_GENERIC, SE_PRESET_PADDEDCELL, SE_PRESET_ROOM, SE_PRESET_BATHROOM, SE_PRESET_LIVINGROOM, SE_PRESET_STONEROOM, SE_PRESET_AUDITORIUM, SE_PRESET_CONCERTHALL, SE_PRESET_CAVE, SE_PRESET_ARENA, SE_PRESET_HANGAR, SE_PRESET_CARPETEDHALLWAY, SE_PRESET_HALLWAY, SE_PRESET_STONECORRIDOR, SE_PRESET_ALLEY, SE_PRESET_FOREST, SE_PRESET_CITY, SE_PRESET_MOUNTAINS, SE_PRESET_QUARRY, SE_PRESET_PLAIN, SE_PRESET_PARKINGLOT, SE_PRESET_SEWERPIPE, SE_PRESET_UNDERWATER, SE_PRESET_DRUGGED, SE_PRESET_DIZZY, SE_PRESET_PSYCHOTIC, SE_PRESET_CASTLE_SMALLROOM, SE_PRESET_CASTLE_SHORTPASSAGE, SE_PRESET_CASTLE_MEDIUMROOM, SE_PRESET_CASTLE_LARGEROOM, SE_PRESET_CASTLE_LONGPASSAGE, SE_PRESET_CASTLE_HALL, SE_PRESET_CASTLE_CUPBOARD, SE_PRESET_CASTLE_COURTYARD, SE_PRESET_CASTLE_ALCOVE, SE_PRESET_FACTORY_SMALLROOM, SE_PRESET_FACTORY_SHORTPASSAGE, SE_PRESET_FACTORY_MEDIUMROOM, SE_PRESET_FACTORY_LARGEROOM, SE_PRESET_FACTORY_LONGPASSAGE, SE_PRESET_FACTORY_HALL, SE_PRESET_FACTORY_CUPBOARD, SE_PRESET_FACTORY_COURTYARD, SE_PRESET_FACTORY_ALCOVE, SE_PRESET_ICEPALACE_SMALLROOM, SE_PRESET_ICEPALACE_SHORTPASSAGE, SE_PRESET_ICEPALACE_MEDIUMROOM, SE_PRESET_ICEPALACE_LARGEROOM, SE_PRESET_ICEPALACE_LONGPASSAGE, SE_PRESET_ICEPALACE_HALL, SE_PRESET_ICEPALACE_CUPBOARD, SE_PRESET_ICEPALACE_COURTYARD, SE_PRESET_ICEPALACE_ALCOVE, SE_PRESET_SPACESTATION_SMALLROOM, SE_PRESET_SPACESTATION_SHORTPASSAGE, SE_PRESET_SPACESTATION_MEDIUMROOM, SE_PRESET_SPACESTATION_LARGEROOM, SE_PRESET_SPACESTATION_LONGPASSAGE, SE_PRESET_SPACESTATION_HALL, SE_PRESET_SPACESTATION_CUPBOARD, SE_PRESET_SPACESTATION_ALCOVE, SE_PRESET_WOODEN_SMALLROOM, SE_PRESET_WOODEN_SHORTPASSAGE, SE_PRESET_WOODEN_MEDIUMROOM, SE_PRESET_WOODEN_LARGEROOM, SE_PRESET_WOODEN_LONGPASSAGE, SE_PRESET_WOODEN_HALL, SE_PRESET_WOODEN_CUPBOARD, SE_PRESET_WOODEN_COURTYARD, SE_PRESET_WOODEN_ALCOVE, SE_PRESET_SPORT_EMPTYSTADIUM, SE_PRESET_SPORT_SQUASHCOURT, SE_PRESET_SPORT_SMALLSWIMMINGPOOL, SE_PRESET_SPORT_LARGESWIMMINGPOOL, SE_PRESET_SPORT_GYMNASIUM, SE_PRESET_SPORT_FULLSTADIUM, SE_PRESET_SPORT_STADIUMTANNOY, SE_PRESET_PREFAB_WORKSHOP, SE_PRESET_PREFAB_SCHOOLROOM, SE_PRESET_PREFAB_PRACTISEROOM, SE_PRESET_PREFAB_OUTHOUSE, SE_PRESET_PREFAB_CARAVAN, SE_PRESET_DOME_TOMB, SE_PRESET_PIPE_SMALL, SE_PRESET_DOME_SAINTPAULS, SE_PRESET_PIPE_LONGTHIN, SE_PRESET_PIPE_LARGE, SE_PRESET_PIPE_RESONANT, SE_PRESET_OUTDOORS_BACKYARD, SE_PRESET_OUTDOORS_ROLLINGPLAINS, SE_PRESET_OUTDOORS_DEEPCANYON, SE_PRESET_OUTDOORS_CREEK, SE_PRESET_OUTDOORS_VALLEY, SE_PRESET_MOOD_HEAVEN, SE_PRESET_MOOD_HELL, SE_PRESET_MOOD_MEMORY, SE_PRESET_DRIVING_COMMENTATOR, SE_PRESET_DRIVING_PITGARAGE, SE_PRESET_DRIVING_INCAR_RACER, SE_PRESET_DRIVING_INCAR_SPORTS, SE_PRESET_DRIVING_INCAR_LUXURY, SE_PRESET_DRIVING_FULLGRANDSTAND, SE_PRESET_DRIVING_EMPTYGRANDSTAND, SE_PRESET_DRIVING_TUNNEL, SE_PRESET_CITY_STREETS, SE_PRESET_CITY_SUBWAY, SE_PRESET_CITY_MUSEUM, SE_PRESET_CITY_LIBRARY, SE_PRESET_CITY_UNDERPASS, SE_PRESET_CITY_ABANDONED, SE_PRESET_DUSTYROOM, SE_PRESET_CHAPEL, SE_PRESET_SMALLWATERROOM }; class SoundClip; class SoundEffect; class SoundFilter; class SoundManager { public: void init(); bool isActive() const; SoundEmitter* createEmitter(); SoundEmitter* createEmitter(const std::string& name); void deleteEmitter(SoundEmitter* emitter); SoundEmitter* getEmitter(uint32_t emitterId); void releaseEmitter(uint32_t emitterId); ALCcontext* getContext(); void setVolume(float vol); float getVolume() const; void mute(); void unmute(); void play(); void pause(); void stop(); void rewind(); void setDistanceModel(SoundDistanceModelType model); SoundDistanceModelType getDistanceModel() const; void setListenerPosition(const AudioSpaceCoordinate& position); AudioSpaceCoordinate getListenerPosition() const; void setListenerOrientation(const AudioSpaceCoordinate& orientation); AudioSpaceCoordinate getListenerOrientation() const; void setListenerVelocity(const AudioSpaceCoordinate& velocity); AudioSpaceCoordinate getListenerVelocity() const; void setDopplerFactor(float factor); float getDopplerFactor() const; void setListenerMaxDistance(float distance); float getListenerMaxDistance() const; SoundEffect* createSoundEffect(SoundEffectType type); SoundEffect* createSoundEffectPreset(SoundEffectPreset type); void deleteSoundEffect(SoundEffect* effect); void enableSoundEffect(SoundEffect* effect); void disableSoundEffect(SoundEffect* effect); void addEmitterToSoundEffect(SoundEffect* effect, SoundEmitter* emitter); void removeEmitterFromSoundEffect(SoundEffect* effect, SoundEmitter* emitter); void addSoundFilterToSoundEffect(SoundEffect* effect, SoundFilter* filter); void removeSoundFilterFromSoundEffect(SoundEffect* effect, SoundFilter* filter); SoundFilter* createSoundFilter(SoundFilterType type); void deleteSoundFilter(SoundFilter* filter); void enableDirectSoundFilter(SoundFilter* filter); void disableDirectSoundFilter(SoundFilter* filter); void addEmitterToDirectSoundFilter(SoundFilter* filter, SoundEmitter* emitter); void removeEmitterFromDirectSoundFilter(SoundFilter* filter, SoundEmitter* emitter); void removeGroup(const std::string& group); void removeAllGroups(); void play(const std::string& group); void pause(const std::string& group); void stop(const std::string& group); void rewind(const std::string& group); void setGain(const std::string& group, float gain); void setMaxGain(const std::string& group, float gain); void setMinGain(const std::string& group, float gain); }; } fifengine-0.4.2/engine/core/audio/soundsource.cpp000066400000000000000000000111271341615052600220270ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // Platform specific includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "model/structures/instance.h" #include "util/log/logger.h" #include "util/base/exception.h" #include "actionaudio.h" #include "soundmanager.h" #include "soundemitter.h" #include "soundsource.h" namespace FIFE { static Logger _log(LM_AUDIO); class SoundChangeListener : public InstanceChangeListener { public: SoundChangeListener(SoundSource* source) { m_source = source; } virtual ~SoundChangeListener() {} virtual void onInstanceChanged(Instance* instance, InstanceChangeInfo info) { if ((info & ICHANGE_LOC) == ICHANGE_LOC) { m_source->setPosition(); } else if ((info & ICHANGE_ROTATION) == ICHANGE_ROTATION) { m_source->setDirection(); } } private: SoundSource* m_source; }; SoundSource::SoundSource(Instance* instance) : m_instance(instance), m_audio(NULL) { m_emitter = SoundManager::instance()->createEmitter(); m_listener = new SoundChangeListener(this); m_instance->addChangeListener(m_listener); // inital data setPosition(); } SoundSource::~SoundSource() { m_instance->removeChangeListener(m_listener); delete m_listener; SoundManager::instance()->releaseEmitter(m_emitter->getId()); } void SoundSource::setActionAudio(ActionAudio* audio) { if (audio != m_audio) { if (m_audio) { m_emitter->stop(); } m_audio = audio; if (m_audio) { updateSoundEmitter(); m_emitter->play(); } else { m_emitter->reset(); } } else if (audio && !m_emitter->isLooping()) { m_emitter->rewind(); m_emitter->play(); } } ActionAudio* SoundSource::getActionAudio() const { return m_audio; } void SoundSource::setPosition() { if (m_audio) { m_emitter->setPosition(m_instance->getLocationRef().getMapCoordinates()); } } void SoundSource::setDirection() { if (m_audio && m_audio->isDirection()) { m_emitter->setDirection(m_instance->getFacingLocation().getMapCoordinates()); } } void SoundSource::updateSoundEmitter() { m_emitter->setGain(m_audio->getGain()); m_emitter->setMaxGain(m_audio->getMaxGain()); m_emitter->setMinGain(m_audio->getMinGain()); m_emitter->setReferenceDistance(m_audio->getReferenceDistance()); m_emitter->setMaxDistance(m_audio->getMaxDistance()); m_emitter->setRolloff(m_audio->getRolloff()); m_emitter->setPitch(m_audio->getPitch()); m_emitter->setConeInnerAngle(m_audio->getConeInnerAngle()); m_emitter->setConeOuterAngle(m_audio->getConeOuterAngle()); m_emitter->setConeOuterGain(m_audio->getConeOuterGain()); m_emitter->setVelocity(m_audio->getVelocity()); m_emitter->setLooping(m_audio->isLooping()); m_emitter->setRelativePositioning(m_audio->isRelativePositioning()); m_emitter->setPosition(m_instance->getLocationRef().getMapCoordinates()); m_emitter->setSoundClip(m_audio->getSoundFileName()); m_emitter->setGroup(m_audio->getGroupName()); } } fifengine-0.4.2/engine/core/audio/soundsource.h000066400000000000000000000055261341615052600215020ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_SOUNDSOURCE_H #define FIFE_SOUNDSOURCE_H // Standard C++ library includes // Platform specific includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder namespace FIFE { class ActionAudio; class Instance; class SoundChangeListener; class SoundEmitter; /** Interface class between Instance / ActionAudio and SoundEmitter. */ class SoundSource { public: SoundSource(Instance* instance); ~SoundSource(); /** Sets the ActionAudio. Owned by Object. */ void setActionAudio(ActionAudio* audio); /** Return ActionAudio. Owned by Object. */ ActionAudio* getActionAudio() const; /** Sets the positon of the SoundEmitter, called from Instance. */ void setPosition(); /** Sets the direction of the SoundEmitter, called from Instance. */ void setDirection(); private: /** Moves data from ActionAudio to SoundEmitter. */ void updateSoundEmitter(); //! Associated Instance Instance* m_instance; //! Actual ActionAudio ActionAudio* m_audio; //! Related SoundEmitter SoundEmitter* m_emitter; //! InstanceChangeListener for position and direction SoundChangeListener* m_listener; }; } #endiffifengine-0.4.2/engine/core/controller/000077500000000000000000000000001341615052600200325ustar00rootroot00000000000000fifengine-0.4.2/engine/core/controller/engine.cpp000066400000000000000000000323571341615052600220150ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes #include #include // 3rd party library includes #include #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/exception.h" #include "util/log/logger.h" #include "util/time/timemanager.h" #include "audio/soundmanager.h" #include "gui/guimanager.h" #include "vfs/vfs.h" #include "vfs/vfsdirectory.h" #include "vfs/directoryprovider.h" #include "vfs/zip/zipprovider.h" #include "eventchannel/eventmanager.h" #include "video/imagemanager.h" #include "video/animationmanager.h" #include "audio/soundclipmanager.h" #include "video/renderbackend.h" #include "video/cursor.h" #include "video/devicecaps.h" #ifdef HAVE_OPENGL #include "video/opengl/fife_opengl.h" #include "video/opengl/renderbackendopengl.h" #endif #include "video/sdl/renderbackendsdl.h" #include "loaders/native/video/imageloader.h" #include "loaders/native/audio/ogg_loader.h" #include "model/model.h" #include "pathfinder/routepather/routepather.h" #include "model/metamodel/grids/hexgrid.h" #include "model/metamodel/grids/squaregrid.h" #include "view/renderers/quadtreerenderer.h" #include "view/renderers/gridrenderer.h" #include "view/renderers/instancerenderer.h" #include "view/renderers/coordinaterenderer.h" #include "view/renderers/floatingtextrenderer.h" #include "view/renderers/cellselectionrenderer.h" #include "view/renderers/blockinginforenderer.h" #include "view/renderers/genericrenderer.h" #include "view/renderers/targetrenderer.h" #include "view/renderers/lightrenderer.h" #include "view/renderers/offrenderer.h" #include "view/renderers/cellrenderer.h" #include "video/image.h" #include "engine.h" #include "version.h" #ifdef USE_COCOA #include #include int32_t main(int32_t argc, char **argv) { return 0; } #endif namespace FIFE { static Logger _log(LM_CONTROLLER); Engine::Engine(): m_renderbackend(0), m_guimanager(0), m_eventmanager(0), m_soundmanager(0), m_timemanager(0), m_imagemanager(0), m_animationmanager(0), m_soundclipmanager(0), m_vfs(0), m_model(0), m_logmanager(0), m_cursor(0), m_destroyed(false), m_settings(), m_devcaps(), m_offrenderer(0), m_targetrenderer(0), m_changelisteners() { #ifdef USE_COCOA // The next lines ensure that Cocoa is initialzed correctly. // This is needed for SDL to function properly on MAC OS X. void* cocoa_lib; cocoa_lib = dlopen( "/System/Library/Frameworks/Cocoa.framework/Cocoa", RTLD_LAZY ); void (*nsappload)(void); nsappload = (void(*)()) dlsym( cocoa_lib, "NSApplicationLoad"); nsappload(); // Create an autorelease pool, so autoreleased SDL objects don't leak. #ifdef OSX_109 Class NSAutoreleasePool = objc_getClass("NSAutoreleasePool"); m_autoreleasePool = class_createInstance(NSAutoreleasePool, 0); #else objc_object *NSAutoreleasePool = objc_getClass("NSAutoreleasePool"); m_autoreleasePool = objc_msgSend(NSAutoreleasePool, sel_registerName("new")); #endif #endif m_logmanager = LogManager::instance(); } EngineSettings& Engine::getSettings() { return m_settings; } const DeviceCaps& Engine::getDeviceCaps() const { return m_devcaps; } void Engine::changeScreenMode(const ScreenMode& mode){ m_cursor->invalidate(); m_imagemanager->invalidateAll(); // recreate main screen m_renderbackend->createMainScreen(mode, m_settings.getWindowTitle(), m_settings.getWindowIcon()); if (m_guimanager) { m_guimanager->resizeTopContainer(0,0,mode.getWidth(), mode.getHeight()); } std::vector::iterator i = m_changelisteners.begin(); while (i != m_changelisteners.end()) { (*i)->onScreenModeChanged(mode); ++i; } } void Engine::init() { m_destroyed = false; FL_LOG(_log, LMsg("Fifengine v") << FIFE::getVersion()); FL_LOG(_log, "================== Engine initialize start ================="); m_timemanager = new TimeManager(); FL_LOG(_log, "Time manager created"); FL_LOG(_log, "Creating VFS"); m_vfs = new VFS(); FL_LOG(_log, "Adding root directory to VFS"); m_vfs->addSource( new VFSDirectory(m_vfs) ); m_vfs->addProvider( new DirectoryProvider() ); FL_LOG(_log, "Adding zip provider to VFS"); m_vfs->addProvider( new ZipProvider() ); //m_vfs->addProvider(ProviderDAT2()); //m_vfs->addProvider(ProviderDAT1()); FL_LOG(_log, "Engine pre-init done"); // If failed to init SDL throw exception. if (SDL_Init(SDL_INIT_NOPARACHUTE | SDL_INIT_TIMER) < 0) { throw SDLException(SDL_GetError()); } TTF_Init(); FL_LOG(_log, "Creating event manager"); m_eventmanager = new EventManager(); m_eventmanager->setMouseSensitivity(m_settings.getMouseSensitivity()); m_eventmanager->setMouseAccelerationEnabled(m_settings.isMouseAccelerationEnabled()); m_eventmanager->setJoystickSupport(m_settings.isJoystickSupport()); FL_LOG(_log, "Creating resource managers"); m_imagemanager = new ImageManager(); m_animationmanager = new AnimationManager(); m_soundclipmanager = new SoundClipManager(); FL_LOG(_log, "Creating render backend"); std::string rbackend(m_settings.getRenderBackend()); if (rbackend == "SDL") { m_renderbackend = new RenderBackendSDL(m_settings.getColorKey()); FL_LOG(_log, "SDL Render backend created"); } else { #ifdef HAVE_OPENGL m_renderbackend = new RenderBackendOpenGL(m_settings.getColorKey()); FL_LOG(_log, "OpenGL Render backend created"); #else m_renderbackend = new RenderBackendSDL(m_settings.getColorKey()); // Remember the choice so we pick the right graphics class. rbackend = "SDL"; FL_WARN(_log, "Tried to select OpenGL, even though it is not compiled into the engine. Falling back to SDL Render backend"); #endif } FL_LOG(_log, "Initializing render backend"); m_renderbackend->setColorKeyEnabled(m_settings.isColorKeyEnabled()); // we always set this to false //m_renderbackend->setAlphaOptimizerEnabled(false); m_renderbackend->setImageCompressingEnabled(m_settings.isGLCompressImages()); m_renderbackend->setFramebufferEnabled(m_settings.isGLUseFramebuffer()); m_renderbackend->setNPOTEnabled(m_settings.isGLUseNPOT()); m_renderbackend->setTextureFiltering(m_settings.getGLTextureFiltering()); m_renderbackend->setMipmappingEnabled(m_settings.isGLUseMipmapping()); m_renderbackend->setMonochromeEnabled(m_settings.isGLUseMonochrome()); m_renderbackend->setDepthBufferEnabled(m_settings.isGLUseDepthBuffer()); m_renderbackend->setAlphaTestValue(m_settings.getGLAlphaTestValue()); m_renderbackend->setVSyncEnabled(m_settings.isVSync()); if (m_settings.isFrameLimitEnabled()) { m_renderbackend->setFrameLimitEnabled(true); m_renderbackend->setFrameLimit(m_settings.getFrameLimit()); } std::string driver = m_settings.getVideoDriver(); if (driver != ""){ std::vector drivers = m_devcaps.getAvailableVideoDrivers(); if (std::find (drivers.begin(), drivers.end(), driver) == drivers.end()) { FL_WARN(_log, "Selected video driver is not supported for your Operating System! Reverting to default driver."); driver = ""; } m_devcaps.setVideoDriverName(driver); } // init backend with selected video driver or default m_renderbackend->init(driver); // in case of SDL we use this to create the SDL_Renderer driver = m_settings.getSDLDriver(); if (driver != ""){ std::vector drivers = m_devcaps.getAvailableRenderDrivers(); if (std::find (drivers.begin(), drivers.end(), driver) == drivers.end()) { FL_WARN(_log, "Selected render driver is not supported for your Operating System! Reverting to default driver."); driver = ""; } m_devcaps.setRenderDriverName(driver); } FL_LOG(_log, "Querying device capabilities"); m_devcaps.fillDeviceCaps(); uint16_t bpp = m_settings.getBitsPerPixel(); m_screenMode = m_devcaps.getNearestScreenMode( m_settings.getScreenWidth(), m_settings.getScreenHeight(), bpp, rbackend, m_settings.isFullScreen(), m_settings.getRefreshRate(), m_settings.getDisplay()); FL_LOG(_log, "Creating main screen"); m_renderbackend->createMainScreen( m_screenMode, m_settings.getWindowTitle(), m_settings.getWindowIcon()); FL_LOG(_log, "Main screen created"); #ifdef HAVE_OPENGL if (m_settings.getLightingModel() != 0) { m_renderbackend->setLightingModel(m_settings.getLightingModel()); } #endif FL_LOG(_log, "Creating sound manager"); m_soundmanager = new SoundManager(); m_soundmanager->setVolume(static_cast(m_settings.getInitialVolume()) / 10); FL_LOG(_log, "Creating renderers"); m_offrenderer = new OffRenderer(m_renderbackend); m_targetrenderer = new TargetRenderer(m_renderbackend); m_renderers.push_back(new InstanceRenderer(m_renderbackend, 10)); m_renderers.push_back(new GridRenderer(m_renderbackend, 20)); m_renderers.push_back(new CellSelectionRenderer(m_renderbackend, 30)); m_renderers.push_back(new BlockingInfoRenderer(m_renderbackend, 40)); m_renderers.push_back(new FloatingTextRenderer(m_renderbackend, 50)); m_renderers.push_back(new QuadTreeRenderer(m_renderbackend, 60)); m_renderers.push_back(new CoordinateRenderer(m_renderbackend, 70)); m_renderers.push_back(new GenericRenderer(m_renderbackend, 80)); m_renderers.push_back(new LightRenderer(m_renderbackend, 90)); m_renderers.push_back(new CellRenderer(m_renderbackend, 100)); FL_LOG(_log, "Creating model"); m_model = new Model(m_renderbackend, m_renderers); FL_LOG(_log, "Adding pathers to model"); m_model->adoptPather(new RoutePather()); FL_LOG(_log, "Adding grid prototypes to model"); m_model->adoptCellGrid(new SquareGrid()); m_model->adoptCellGrid(new HexGrid(false)); m_model->adoptCellGrid(new HexGrid(true)); m_cursor = new Cursor(m_renderbackend); m_cursor->setNativeImageCursorEnabled(m_settings.isNativeImageCursorEnabled()); FL_LOG(_log, "Engine initialized"); } Engine::~Engine() { if( !m_destroyed ) { destroy(); } } void Engine::destroy() { FL_LOG(_log, "Destructing engine"); delete m_cursor; delete m_model; delete m_soundmanager; delete m_guimanager; delete m_animationmanager; delete m_imagemanager; delete m_soundclipmanager; delete m_eventmanager; // properly remove all the renderers created during init delete m_offrenderer; delete m_targetrenderer; std::vector::iterator rendererIter = m_renderers.begin(); for ( ; rendererIter != m_renderers.end(); ++rendererIter) { delete *rendererIter; } m_renderers.clear(); delete m_renderbackend; delete m_vfs; delete m_timemanager; TTF_Quit(); SDL_Quit(); #ifdef USE_COCOA objc_msgSend(m_autoreleasePool, sel_registerName("release")); #endif FL_LOG(_log, "================== Engine destructed =================="); m_destroyed = true; //delete m_logmanager; } void Engine::initializePumping() { m_eventmanager->processEvents(); } void Engine::pump() { m_renderbackend->startFrame(); m_eventmanager->processEvents(); m_timemanager->update(); m_soundmanager->update(); m_targetrenderer->render(); if (m_model->getActiveCameraCount() == 0) { m_renderbackend->clearBackBuffer(); m_offrenderer->render(); } else { m_model->update(); } if (m_guimanager) { m_guimanager->turn(); } m_cursor->draw(); m_renderbackend->endFrame(); } void Engine::finalizePumping() { // nothing here at the moment.. } void Engine::addChangeListener(IEngineChangeListener* listener) { m_changelisteners.push_back(listener); } void Engine::removeChangeListener(IEngineChangeListener* listener) { std::vector::iterator i = m_changelisteners.begin(); while (i != m_changelisteners.end()) { if ((*i) == listener) { m_changelisteners.erase(i); return; } ++i; } } } fifengine-0.4.2/engine/core/controller/engine.h000066400000000000000000000151531341615052600214550ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_ENGINE_H #define FIFE_ENGINE_H // Standard C++ library includes #include #include #include // Platform specific includes #ifdef USE_COCOA #include #endif // 3rd party library includes #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "enginesettings.h" #include "video/devicecaps.h" namespace FIFE { class SoundManager; class RenderBackend; class IGUIManager; class VFS; class VFSSourceFactory; class EventManager; class TimeManager; class Model; class LogManager; class Cursor; class RendererBase; class Image; class ImageManager; class AnimationManager; class SoundClipManager; class OffRenderer; class TargetRenderer; class IEngineChangeListener { public: virtual ~IEngineChangeListener() {} /** Screen mode has been changed */ virtual void onScreenModeChanged(const ScreenMode& newmode) = 0; }; /** Engine acts as a controller to the whole system * Responsibilities of the engine are: * - Construct and initialize engine internals * - Clean-up when the program ends * - Act as an entry point to the engine subsystems */ class Engine { public: /** Constructor */ Engine(); /** Destructor */ virtual ~Engine(); /** Gets settings class for engine */ EngineSettings& getSettings(); /** Gets device capabilities */ const DeviceCaps& getDeviceCaps() const; /** Changes the screen mode. * This should be called instead of the renderer's setScreenMode() function. * It takes care of any objects that need to be re-created after switching * screen modes. * * @param mode A valid ScreenMode retrieved from FIFE::DeviceCaps::getNearestScreenMode() */ void changeScreenMode(const ScreenMode& mode); /** Initializes the engine */ void init(); /** Explicit destruction of engine */ void destroy(); /** Initializes the continuous processing of the engine * Call this only once in your program */ void initializePumping(); /** Finalizes the continuous processing of the engine * Call this only once in your program, after you have called * initializePumping + (pump() * N times) */ void finalizePumping(); /** Runs one cycle for the engine */ void pump(); /** Provides access point to the SoundManager */ SoundManager* getSoundManager() const { return m_soundmanager; } /** Provides access point to the EventManager */ EventManager* getEventManager() const { return m_eventmanager; } /** Provides access point to the TimeManager */ TimeManager* getTimeManager() const { return m_timemanager; } /** Sets the GUI Manager to use. Engine takes * ownership of the manager so DONT DELETE IT! */ void setGuiManager(IGUIManager* guimanager) { m_guimanager = guimanager; } /** Provides access point to the GUI Manager */ IGUIManager* getGuiManager() const { return m_guimanager; } /** Provides access point to the ImageManager */ ImageManager* getImageManager() const { return m_imagemanager; } /** Provides access point to the ImageManager */ AnimationManager* getAnimationManager() const { return m_animationmanager; } /** Provides access point to the SoundClipManager */ SoundClipManager* getSoundClipManager() const { return m_soundclipmanager; } /** Provides access point to the RenderBackend */ RenderBackend* getRenderBackend() const { return m_renderbackend; } /** Provides access point to the Model */ Model* getModel() const { return m_model; } /** Provides access point to the LogManager */ LogManager* getLogManager() const { return m_logmanager; } /** Provides access point to the VFS */ VFS* getVFS() const { return m_vfs; } /** Returns cursor used in the engine */ Cursor* getCursor() const { return m_cursor; } /** Provides access point to the OffRenderer */ OffRenderer* getOffRenderer() const { return m_offrenderer; } /** Provides access point to the TargetRenderer */ TargetRenderer* getTargetRenderer() const { return m_targetrenderer; } /** Adds new change listener * @param listener to add */ void addChangeListener(IEngineChangeListener* listener); /** Removes associated change listener * @param listener to remove */ void removeChangeListener(IEngineChangeListener* listener); private: RenderBackend* m_renderbackend; IGUIManager* m_guimanager; EventManager* m_eventmanager; SoundManager* m_soundmanager; TimeManager* m_timemanager; ImageManager* m_imagemanager; AnimationManager* m_animationmanager; SoundClipManager* m_soundclipmanager; VFS* m_vfs; Model* m_model; LogManager* m_logmanager; Cursor* m_cursor; bool m_destroyed; EngineSettings m_settings; DeviceCaps m_devcaps; ScreenMode m_screenMode; OffRenderer* m_offrenderer; TargetRenderer* m_targetrenderer; std::vector m_renderers; std::vector m_changelisteners; #ifdef USE_COCOA id m_autoreleasePool; #endif }; }//FIFE #endif fifengine-0.4.2/engine/core/controller/engine.i000066400000000000000000000141311341615052600214510ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fife %{ #include "controller/engine.h" %} namespace FIFE { class SoundManager; class EventManager; class TimeManager; class IGUIManager; class RenderBackend; class Model; class LogManager; class GuiFont; class VFS; class Cursor; class RendererBase; class DeviceCaps; class ScreenMode; class Image; class ImageManager; class AnimationManager; class SoundClipManager; class OffRenderer; class TargetRenderer; class EngineSettings { public: ~EngineSettings(); void setBitsPerPixel(uint8_t bitsperpixel); uint8_t getBitsPerPixel() const; std::vector getPossibleBitsPerPixel() const; void setFullScreen(bool fullscreen); bool isFullScreen() const; void setRefreshRate(uint16_t rate); uint16_t getRefreshRate() const; void setDisplay(uint8_t display); uint8_t getDisplay() const; void setVSync(bool vsync); bool isVSync() const; void setSDLDriver(const std::string& driver); const std::string& getSDLDriver() const; void setInitialVolume(float volume); float getInitialVolume() const; float getMaxVolume() const; void setRenderBackend(const std::string& renderbackend); const std::string& getRenderBackend() const; std::vector getPossibleRenderBackends(); void setSDLRemoveFakeAlpha(bool sdlremovefakealpha); bool isSDLRemoveFakeAlpha() const; void setGLCompressImages(bool oglcompressimages); bool isGLCompressImages() const; void setGLUseFramebuffer(bool ogluseframebuffer); bool isGLUseFramebuffer() const; void setGLUseNPOT(bool oglusenpot); bool isGLUseNPOT() const; void setGLTextureFiltering(FIFE::TextureFiltering filter); FIFE::TextureFiltering getGLTextureFiltering() const; void setGLUseMipmapping(bool mipmapping); bool isGLUseMipmapping() const; void setGLUseMonochrome(bool monochrome); bool isGLUseMonochrome() const; void setGLUseDepthBuffer(bool buffer); bool isGLUseDepthBuffer() const; void setGLAlphaTestValue(float alpha); float getGLAlphaTestValue() const; void setScreenWidth(uint16_t screenwidth); uint16_t getScreenWidth() const; void setScreenHeight(uint16_t screenheight); uint16_t getScreenHeight() const; void setDefaultFontPath(const std::string& defaultfontpath); const std::string& getDefaultFontPath() const; void setDefaultFontSize(uint16_t defaultfontsize); uint16_t getDefaultFontSize() const; void setDefaultFontGlyphs(const std::string& defaultfontglyphs); const std::string& getDefaultFontGlyphs() const; void setWindowTitle(const std::string& title); const std::string& getWindowTitle() const; void setWindowIcon(const std::string& icon); const std::string& getWindowIcon() const; void setColorKeyEnabled(bool colorkeyenable); bool isColorKeyEnabled() const; void setColorKey(uint8_t r, uint8_t g, uint8_t b); const SDL_Color& getColorKey() const; void setVideoDriver(const std::string& driver); const std::string& getVideoDriver() const; void setLightingModel(uint32_t lighting); uint32_t getLightingModel() const; void setFrameLimitEnabled(bool limited); bool isFrameLimitEnabled() const; void setFrameLimit(uint16_t framelimit); uint16_t getFrameLimit() const; void setMouseSensitivity(float sens); float getMouseSensitivity() const; void setMouseAccelerationEnabled(bool acceleration); bool isMouseAccelerationEnabled() const; void setNativeImageCursorEnabled(bool nativeimagecursor); bool isNativeImageCursorEnabled() const; void setJoystickSupport(bool support); bool isJoystickSupport() const; private: EngineSettings(); }; %feature("director") IEngineChangeListener; class IEngineChangeListener { public: virtual ~IEngineChangeListener() {} virtual void onScreenModeChanged(const ScreenMode& newmode) = 0; }; class Engine { public: Engine(); virtual ~Engine(); void initializePumping(); void finalizePumping(); void pump(); EngineSettings& getSettings(); const DeviceCaps& getDeviceCaps() const; void changeScreenMode(const ScreenMode& mode); void init(); void destroy(); SoundManager* getSoundManager(); EventManager* getEventManager(); TimeManager* getTimeManager(); void setGuiManager(IGUIManager* guimanager); IGUIManager* getGuiManager(); ImageManager* getImageManager(); AnimationManager* getAnimationManager(); SoundClipManager* getSoundClipManager(); RenderBackend* getRenderBackend(); Model* getModel(); LogManager* getLogManager(); VFS* getVFS(); Cursor* getCursor(); OffRenderer* getOffRenderer(); TargetRenderer* getTargetRenderer(); void addChangeListener(IEngineChangeListener* listener); void removeChangeListener(IEngineChangeListener* listener); }; } fifengine-0.4.2/engine/core/controller/enginesettings.cpp000066400000000000000000000223651341615052600235740ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes #include #include // 3rd party library includes #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/exception.h" #include "util/log/logger.h" #include "enginesettings.h" namespace FIFE { /** Logger to use for this source file. * @relates Logger */ static Logger _log(LM_CONTROLLER); const float MAXIMUM_VOLUME = 10.0; EngineSettings::EngineSettings(): m_bitsperpixel(0), m_fullscreen(false), m_refreshRate(60), m_displayIndex(0), m_vSync(false), m_renderDriver(""), m_initialvolume(MAXIMUM_VOLUME / 2), m_renderbackend("SDL"), m_sdlremovefakealpha(false), m_oglcompressimages(false), m_ogluseframebuffer(true), m_oglusenpot(true), m_oglMipmapping(false), m_oglMonochrome(false), m_oglTextureFilter(TEXTURE_FILTER_NONE), m_oglDepthBuffer(false), m_alphaTestValue(0.3), m_screenwidth(800), m_screenheight(600), m_windowtitle("FIFE"), m_windowicon(""), m_defaultfontpath("fonts/FreeSans.ttf"), m_defaultfontsize(8), m_defaultfontglyphs("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.,!?-+/():;%&`'*#=[]\\\""), m_iscolorkeyenabled(false), m_lighting(0), m_isframelimit(false), m_framelimit(60), m_mousesensitivity(0.0), m_mouseacceleration(false), m_nativeimagecursor(false), m_joystickSupport(false) { m_colorkey.r = 255; m_colorkey.g = 0; m_colorkey.b = 255; #if defined( __unix__ ) m_videodriver = "x11"; #elif defined( WIN32 ) m_videodriver = "windib"; #elif defined( __APPLE_CC__ ) m_videodriver = "x11"; #else m_videodriver = ""; #endif } EngineSettings::~EngineSettings() { } void EngineSettings::setBitsPerPixel(uint8_t bitsperpixel) { std::vector pv = getPossibleBitsPerPixel(); std::vector::iterator i = std::find(pv.begin(), pv.end(), bitsperpixel); if (i != pv.end()) { m_bitsperpixel = bitsperpixel; return; } FL_WARN(_log, LMsg("EngineSettings::setBitsPerPixel() - ") << " Tried to set screen bpp to an unsupporded value of " << bitsperpixel << ". Setting bpp to use the default value of 0 (the current screen bpp)"); m_bitsperpixel = 0; //default value } std::vector EngineSettings::getPossibleBitsPerPixel() const { std::vector tmp; tmp.push_back(0); tmp.push_back(16); tmp.push_back(24); tmp.push_back(32); return tmp; } void EngineSettings::setInitialVolume(float volume) { if (volume > getMaxVolume() || volume < 0) { FL_WARN(_log, LMsg("EngineSettings::setInitialVolume() - ") << " Tried to set initial volume to an unsupporded value of " << volume << ". Setting volume to the default value of 5 (minumum is 0, maximum is 10)"); m_initialvolume = 5.0; return; } m_initialvolume = volume; } float EngineSettings::getMaxVolume() const { return MAXIMUM_VOLUME; } void EngineSettings::setRenderBackend(const std::string& renderbackend) { std::vector pv = getPossibleRenderBackends(); std::vector::iterator i = std::find(pv.begin(), pv.end(), renderbackend); if (i != pv.end()) { m_renderbackend = renderbackend; return; } FL_WARN(_log, LMsg("EngineSettings::setRenderBackend() - ") << renderbackend << " is not a valid render backend " << ". Setting the render backend to the default value of \"SDL\"."); m_renderbackend = "SDL"; } std::vector EngineSettings::getPossibleRenderBackends() { std::vector tmp; tmp.push_back("SDL"); tmp.push_back("OpenGL"); return tmp; } void EngineSettings::setSDLRemoveFakeAlpha(bool sdlremovefakealpha) { m_sdlremovefakealpha = sdlremovefakealpha; } void EngineSettings::setGLCompressImages(bool oglcompressimages) { m_oglcompressimages = oglcompressimages; } void EngineSettings::setGLUseFramebuffer(bool ogluseframebuffer) { m_ogluseframebuffer = ogluseframebuffer; } void EngineSettings::setGLUseNPOT(bool oglusenpot) { m_oglusenpot = oglusenpot; } void EngineSettings::setGLTextureFiltering(TextureFiltering filter) { m_oglTextureFilter = filter; } TextureFiltering EngineSettings::getGLTextureFiltering() const { return m_oglTextureFilter; } void EngineSettings::setGLUseMipmapping(bool mipmapping) { m_oglMipmapping = mipmapping; } bool EngineSettings::isGLUseMipmapping() const { return m_oglMipmapping; } void EngineSettings::setGLUseMonochrome(bool monochrome) { m_oglMonochrome = monochrome; } bool EngineSettings::isGLUseMonochrome() const { return m_oglMonochrome; } void EngineSettings::setGLUseDepthBuffer(bool buffer) { m_oglDepthBuffer = buffer; } bool EngineSettings::isGLUseDepthBuffer() const { return m_oglDepthBuffer; } void EngineSettings::setGLAlphaTestValue(float alpha) { m_alphaTestValue = alpha; } float EngineSettings::getGLAlphaTestValue() const { return m_alphaTestValue; } void EngineSettings::setScreenWidth(uint16_t screenwidth) { m_screenwidth = screenwidth; } void EngineSettings::setScreenHeight(uint16_t screenheight) { m_screenheight = screenheight; } void EngineSettings::setDefaultFontPath(const std::string& defaultfontpath) { m_defaultfontpath = defaultfontpath; } void EngineSettings::setDefaultFontSize(uint16_t defaultfontsize) { m_defaultfontsize = defaultfontsize; } void EngineSettings::setDefaultFontGlyphs(const std::string& defaultfontglyphs) { m_defaultfontglyphs = defaultfontglyphs; } void EngineSettings::setWindowTitle(const std::string& title) { m_windowtitle = title; } void EngineSettings::setWindowIcon(const std::string& icon) { m_windowicon = icon; } void EngineSettings::setColorKeyEnabled(bool colorkeyenable) { m_iscolorkeyenabled = colorkeyenable; } bool EngineSettings::isColorKeyEnabled() const { return m_iscolorkeyenabled; } void EngineSettings::setColorKey(uint8_t r, uint8_t g, uint8_t b) { m_colorkey.r = r; m_colorkey.g = g; m_colorkey.b = b; } const SDL_Color& EngineSettings::getColorKey() const { return m_colorkey; } void EngineSettings::setVideoDriver(const std::string& driver) { //TODO: validate the video driver m_videodriver = driver; } const std::string& EngineSettings::getVideoDriver() const { return m_videodriver; } void EngineSettings::setLightingModel(uint32_t lighting) { if (lighting <= 2) { m_lighting = lighting; return; } FL_WARN(_log, LMsg("EngineSettings::setLightingModel() - ") << lighting << " is not a valid lighting model." << ". Setting the lighting model to the default value of 0 (off)"); m_lighting = 0; } void EngineSettings::setFrameLimitEnabled(bool limited) { m_isframelimit = limited; } bool EngineSettings::isFrameLimitEnabled() const { return m_isframelimit; } void EngineSettings::setFrameLimit(uint16_t framelimit) { m_framelimit = framelimit; } uint16_t EngineSettings::getFrameLimit() const { return m_framelimit; } void EngineSettings::setMouseSensitivity(float sens) { m_mousesensitivity = sens; } float EngineSettings::getMouseSensitivity() const { return m_mousesensitivity; } void EngineSettings::setMouseAccelerationEnabled(bool acceleration) { m_mouseacceleration = acceleration; } bool EngineSettings::isMouseAccelerationEnabled() const { return m_mouseacceleration; } void EngineSettings::setNativeImageCursorEnabled(bool nativeimagecursor) { m_nativeimagecursor = nativeimagecursor; } bool EngineSettings::isNativeImageCursorEnabled() const { return m_nativeimagecursor; } void EngineSettings::setJoystickSupport(bool support) { m_joystickSupport = support; } bool EngineSettings::isJoystickSupport() const { return m_joystickSupport; } } fifengine-0.4.2/engine/core/controller/enginesettings.h000066400000000000000000000275721341615052600232460ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_ENGINESETTINGS_H #define FIFE_ENGINESETTINGS_H // Standard C++ library includes #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/exception.h" #include "video/renderbackend.h" namespace FIFE { class NotSupported; /** This class defines the engine settings on engine init * */ class EngineSettings { public: /** Constructor */ EngineSettings(); /** Destructor */ ~EngineSettings(); /** Sets bits per pixel * @see getPossibleBitsPerPixel */ void setBitsPerPixel(uint8_t bitsperpixel); /** Gets currently set bits per pixel value */ uint8_t getBitsPerPixel() const { return m_bitsperpixel; } /** Gets all possible bits per pixel values */ std::vector getPossibleBitsPerPixel() const; /** Sets fullscreen / windowed mode */ void setFullScreen(bool fullscreen) { m_fullscreen = fullscreen; } /** True, if set to fullscreen. False = windowed */ bool isFullScreen() const { return m_fullscreen; } /** Sets refresh rate */ void setRefreshRate(uint16_t rate) { m_refreshRate = rate; } /** Gets the refresh rate */ uint16_t getRefreshRate() const { return m_refreshRate; } /** Sets display index, starts with 0 */ void setDisplay(uint8_t display) { m_displayIndex = display; } /** Gets the display index, starts with 0 */ uint8_t getDisplay() const { return m_displayIndex; } /** Sets Vsync. Synchronized updates with vertical refresh rate. */ void setVSync(bool vsync) { m_vSync = vsync; } /** True, if vsync is enable, otherwise false. */ bool isVSync() const { return m_vSync; } /** Sets the used SDL render driver. Values depends on platform * and is useless for the OpenGL backend. * If none is set, SDL use the first one that supports the requested flags. * @see DeviceCaps::getAvailableRenderDrivers() */ void setSDLDriver(const std::string& driver) { m_renderDriver = driver; } /** Gets the used SDL render driver. * Default is a empty string, that indicates SDL chooses the driver. * @see setSDLDriver() */ const std::string& getSDLDriver() const { return m_renderDriver; } /** Sets initial engine sound volume * @see getInitialMaxVolume */ void setInitialVolume(float volume); /** Gets initial engine sound volume */ float getInitialVolume() const { return m_initialvolume; } /** Gets maximum volume that can be set */ float getMaxVolume() const; /** Sets name for renderbackend * @see getPossibleRenderBackends */ void setRenderBackend(const std::string& renderbackend); /** Gets currently set renderbackend name */ const std::string& getRenderBackend() const { return m_renderbackend; } /** Gets currently set renderbackend name */ std::string getRenderBackend() { return m_renderbackend; } /** Gets all possible renderbackend names */ std::vector getPossibleRenderBackends(); /** Sets if fake alpha is removed in SDL renderbackend */ void setSDLRemoveFakeAlpha(bool sdlremovefakealpha); /** Tells if fake alpha is removed in SDL renderbackend */ bool isSDLRemoveFakeAlpha() const { return m_sdlremovefakealpha; } /** Sets if images are compress by video driver in OpenGL renderbackend */ void setGLCompressImages(bool oglcompressimages); /** Tells if images are compress by video driver in OpenGL renderbackend */ bool isGLCompressImages() const { return m_oglcompressimages; } /** Sets if OpenGL renderbackend should use FramebufferObject (when available) */ void setGLUseFramebuffer(bool ogluseframebuffer); /** Tells if OpenGL renderbackend should use FramebufferObject */ bool isGLUseFramebuffer() const { return m_ogluseframebuffer; } /** Sets if OpenGL renderbackend should use NPOT Textures (when available) */ void setGLUseNPOT(bool oglusenpot); /** Tells if OpenGL renderbackend should use NPOT Textures */ bool isGLUseNPOT() const { return m_oglusenpot; } /** Sets texture filtering method for OpenGL renderbackend. */ void setGLTextureFiltering(TextureFiltering filter); /** Gets current texture filter which uses OpenGL. */ TextureFiltering getGLTextureFiltering() const; /** Sets if OpenGL renderbackend should use mipmapping. */ void setGLUseMipmapping(bool mipmapping); /** Tells if OpenGL renderbackend should use mipmapping. */ bool isGLUseMipmapping() const; /** Sets if OpenGL renderbackend should render only monochrome. */ void setGLUseMonochrome(bool monochrome); /** Tells if OpenGL renderbackend should render only monochrome. */ bool isGLUseMonochrome() const; /** Sets if OpenGL renderbackend should use depth buffer. */ void setGLUseDepthBuffer(bool buffer); /** Tells if OpenGL renderbackend should use depth buffer. */ bool isGLUseDepthBuffer() const; /** Sets alpha test value for OpenGL renderbackend. */ void setGLAlphaTestValue(float alpha); /** Gets current alpha test value which uses OpenGL. */ float getGLAlphaTestValue() const; /** Sets screen width (pixels) */ void setScreenWidth(uint16_t screenwidth); /** Gets screen width (pixels) */ uint16_t getScreenWidth() const { return m_screenwidth; } /** Sets screen height (pixels) */ void setScreenHeight(uint16_t screenheight); /** Gets screen height (pixels) */ uint16_t getScreenHeight() const { return m_screenheight; } /** Sets path for default font */ void setDefaultFontPath(const std::string& defaultfontpath); /** Gets current path for default font */ const std::string& getDefaultFontPath() const { return m_defaultfontpath; } /** Gets current path for default font */ std::string getDefaultFontPath() { return m_defaultfontpath; } /** Sets size for default font */ void setDefaultFontSize(uint16_t defaultfontsize); /** Gets size for default font */ uint16_t getDefaultFontSize() const { return m_defaultfontsize; } /** Sets glyphs for default font */ void setDefaultFontGlyphs(const std::string& defaultfontglyphs); /** Gets current glyphs for default font */ const std::string& getDefaultFontGlyphs() const { return m_defaultfontglyphs; } /** Gets current glyphs for default font */ std::string getDefaultFontGlyphs() { return m_defaultfontglyphs; } /** Sets the title of the window */ void setWindowTitle(const std::string& title); /** Gets the current window title */ const std::string& getWindowTitle() const { return m_windowtitle; } /** Gets the current window title */ std::string getWindowTitle() { return m_windowtitle; } /** Sets the icon that appears in the window title bar */ void setWindowIcon(const std::string& icon); /** Gets the icon in the window title bar */ const std::string& getWindowIcon() const { return m_windowicon; } /** Gets the icon in the window title bar */ std::string getWindowIcon() { return m_windowicon; } /** Sets whether to use the colorkey feature */ void setColorKeyEnabled(bool colorkeyenable); /** Gets whether the colorkey feature is in use */ bool isColorKeyEnabled() const; /** Sets the global colorkey to use for images */ void setColorKey(uint8_t r, uint8_t g, uint8_t b); /** Gets the global colorkey setting */ const SDL_Color& getColorKey() const; /** Sets the video driver. Values depends on platform. * If none is set, SDL chooses it. * @see DeviceCaps::getAvailableVideoDrivers() */ void setVideoDriver(const std::string& driver); /** Gets the video driver. * Default is a empty string. * @see setVideoDriver() */ const std::string& getVideoDriver() const; /** Sets the light model */ void setLightingModel(uint32_t lighting); /** Gets the currently set light model */ uint32_t getLightingModel() const { return m_lighting; } /** Sets whether to use the frame limiter */ void setFrameLimitEnabled(bool limited); /** Gets whether the frame limiter is in use */ bool isFrameLimitEnabled() const; /** Sets the frame limit */ void setFrameLimit(uint16_t framelimit); /** Gets the frame limit */ uint16_t getFrameLimit() const; /** Sets mouse sensitivity */ void setMouseSensitivity(float sens); /** Gets mouse sensitivity */ float getMouseSensitivity() const; /** Sets mouse acceleration * if mouse acceleration is enabled, * then the mouse sensitivity is used as speed max. */ void setMouseAccelerationEnabled(bool acceleration); /** Returns if mouse acceleration is enabled or not. * * @return True if mouse acceleration is enabled, false if not. */ bool isMouseAccelerationEnabled() const; /** Enables or disables native image cursor. * @see Cursor::setNativeImageCursorEnabled() */ void setNativeImageCursorEnabled(bool nativeimagecursor); /** Returns whether cursors set to an image or an animation are drawn natively. * @see Cursor::setNativeImageCursorEnabled() */ bool isNativeImageCursorEnabled() const; /** Enables or disables joystick and gamepad support. */ void setJoystickSupport(bool support); /** Returns whether joystick and gamepad support is enabled or not. */ bool isJoystickSupport() const; private: uint8_t m_bitsperpixel; bool m_fullscreen; uint16_t m_refreshRate; uint8_t m_displayIndex; bool m_vSync; std::string m_renderDriver; float m_initialvolume; std::string m_renderbackend; bool m_sdlremovefakealpha; bool m_oglcompressimages; bool m_ogluseframebuffer; bool m_oglusenpot; bool m_oglMipmapping; bool m_oglMonochrome; TextureFiltering m_oglTextureFilter; bool m_oglDepthBuffer; float m_alphaTestValue; uint16_t m_screenwidth; uint16_t m_screenheight; std::string m_windowtitle; std::string m_windowicon; std::string m_defaultfontpath; uint16_t m_defaultfontsize; std::string m_defaultfontglyphs; bool m_iscolorkeyenabled; SDL_Color m_colorkey; std::string m_videodriver; uint32_t m_lighting; bool m_isframelimit; uint16_t m_framelimit; float m_mousesensitivity; bool m_mouseacceleration; bool m_nativeimagecursor; bool m_joystickSupport; }; }//FIFE #endif fifengine-0.4.2/engine/core/eventchannel/000077500000000000000000000000001341615052600203215ustar00rootroot00000000000000fifengine-0.4.2/engine/core/eventchannel/base/000077500000000000000000000000001341615052600212335ustar00rootroot00000000000000fifengine-0.4.2/engine/core/eventchannel/base/event.h000066400000000000000000000100241341615052600225220ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ /*************************************************************************** * Note! FIFE event channel borrows heavily from ideas of Guichan library * * version 0.6 * ***************************************************************************/ #ifndef FIFE_EVENTCHANNEL_EVENT_H #define FIFE_EVENTCHANNEL_EVENT_H // Standard C++ library includes // #include #include // 3rd party library includes // #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder // #include "eventchannel/source/ieventsource.h" namespace FIFE { /** Base class for all events */ class Event { public: /** Constructor. */ Event(): m_isConsumed(false), m_eventSource(NULL), m_timestamp(SDL_GetTicks()) {} /** Destructor. */ virtual ~Event() {} /** Marks the event as consumed. */ virtual void consume() { m_isConsumed = true; } /** Checks if the event is consumed. * @return true if the event is consumed, false otherwise. */ virtual bool isConsumed() const { return m_isConsumed; } /** Gets the source of the event. */ virtual IEventSource* getSource() const { return m_eventSource; } /** Sets the source of the event. */ virtual void setSource(IEventSource* source) { m_eventSource = source; } /** Gets the timestamp of the event */ virtual int32_t getTimeStamp() const { return m_timestamp; } /** Sets the timestamp of the event */ virtual void setTimeStamp(int32_t timestamp ) { m_timestamp = timestamp; } /** Gets the name of the event */ virtual const std::string& getName() const { const static std::string eventName("Event"); return eventName; } /** Gets attribute string of the event */ virtual std::string getAttrStr() const { std::stringstream ss; ss << "consumed = " << m_isConsumed << ", "; ss << "src = " << m_eventSource << ", "; ss << "timestamp = " << m_timestamp; return ss.str(); } /** Gets the debugstring of the event */ virtual std::string getDebugString() const { std::stringstream ss; ss << getName() << std::endl; ss << getAttrStr() << std::endl; return ss.str(); } private: //! Indicates if the event is consumed. bool m_isConsumed; //! The source of the event. IEventSource* m_eventSource; //! Timestamp of the event. int32_t m_timestamp; }; } //FIFE #endif fifengine-0.4.2/engine/core/eventchannel/base/ilistener.h000066400000000000000000000045011341615052600234020ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_EVENTCHANNEL_ILISTENER_H #define FIFE_EVENTCHANNEL_ILISTENER_H // Standard C++ library includes // // 3rd party library includes // // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder // namespace FIFE { /** Base Listener */ class IListener { public: /** Indicates if the listener is active. */ virtual bool isActive() { return m_active; } /** Changes the listener status. * @param active The value to change the listener to active / inactive. */ virtual void setActive(bool active) { m_active = active; } virtual ~IListener() {} protected: IListener() { m_active = false; } private: bool m_active; }; } //FIFE #endif fifengine-0.4.2/engine/core/eventchannel/base/inputevent.h000066400000000000000000000115361341615052600236130ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_EVENTCHANNEL_INPUTEVENT_H #define FIFE_EVENTCHANNEL_INPUTEVENT_H // Standard C++ library includes // // 3rd party library includes // // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder // #include "event.h" namespace FIFE { /** Base class for input events (like mouse and keyboard) */ class InputEvent: public Event { public: /** Constructor. */ InputEvent(): Event(), m_consumedByWidgets(false), m_isShiftPressed(false), m_isControlPressed(false), m_isAltPressed(false), m_isMetaPressed(false) {} /** Destructor. */ ~InputEvent() {} /** Checks whether alt is pressed. */ virtual bool isAltPressed() const { return m_isAltPressed; } /** Sets alt to pressed. */ virtual void setAltPressed(bool pressed) { m_isAltPressed = pressed; } /** Checks whether control is pressed. */ virtual bool isControlPressed() const { return m_isControlPressed; } /** Sets control to pressed. */ virtual void setControlPressed(bool pressed) { m_isControlPressed = pressed; } /** Checks whether meta is pressed. */ virtual bool isMetaPressed() const { return m_isMetaPressed; } /** Sets meta to pressed. */ virtual void setMetaPressed(bool pressed) { m_isMetaPressed = pressed; } /** Checks whether shift is pressed. */ virtual bool isShiftPressed() const { return m_isShiftPressed; } /** Sets shift to pressed. */ virtual void setShiftPressed(bool pressed) { m_isShiftPressed = pressed; } /** Marks events as consumed by widget library. */ virtual void consumedByWidgets() { m_consumedByWidgets = true; } /** Checks whether event is consumed by widget library. */ virtual bool isConsumedByWidgets() const { return m_consumedByWidgets; } /** Marks events as consumed. */ virtual void consume() { Event::consume(); } /** Checks whether event is consumed. */ virtual bool isConsumed() const { return Event::isConsumed(); } /** Gets the source of the event. */ virtual IEventSource* getSource() const { return Event::getSource(); } /** Sets the source of the event. */ virtual void setSource(IEventSource* source) { Event::setSource(source); } /** Gets the timestamp of the event. */ virtual int32_t getTimeStamp() const { return Event::getTimeStamp(); } /** Sets the timestamp of the event. */ virtual void setTimeStamp(int32_t timestamp ) { Event::setTimeStamp(timestamp); } /** Gets the name of the event. */ virtual const std::string& getName() const { const static std::string eventName("InputEvent"); return eventName; } /** Gets the debugstring of the event. */ virtual std::string getDebugString() const { return Event::getDebugString(); } /** Gets attribute string of the event. */ virtual std::string getAttrStr() const { std::stringstream ss; ss << Event::getAttrStr() << std::endl; ss << "shift = " << m_isShiftPressed << ", "; ss << "ctrl = " << m_isControlPressed << ", "; ss << "alt = " << m_isAltPressed << ", "; ss << "meta = " << m_isMetaPressed; return ss.str(); } private: bool m_consumedByWidgets; bool m_isShiftPressed; bool m_isControlPressed; bool m_isAltPressed; bool m_isMetaPressed; }; } //FIFE #endif fifengine-0.4.2/engine/core/eventchannel/command/000077500000000000000000000000001341615052600217375ustar00rootroot00000000000000fifengine-0.4.2/engine/core/eventchannel/command/command.h000066400000000000000000000074421341615052600235350ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_EVENTCHANNEL_COMMAND_H #define FIFE_EVENTCHANNEL_COMMAND_H // Standard C++ library includes // // 3rd party library includes // // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder // #include "eventchannel/base/event.h" #include "commandids.h" namespace FIFE { /** Class for commands * Commands are arbitrary events e.g. send from one subsystem to another */ class Command: public Event { public: /** Constructor. */ Command(): Event(), m_commandType(CMD_UNKNOWN), m_code(0) {} /** Destructor. */ virtual ~Command() {} /** Gets the type of this command * @return type of this command */ CommandType getCommandType() const { return m_commandType; } /** Sets the type of this command */ void setCommandType(CommandType type) { m_commandType = type; } /** Gets the code of this command. Meaning of code depends on the command type * @return code of this command */ int32_t getCode() const { return m_code; } /** Sets the code of this command. Meaning of code depends on the command type */ void setCode(int32_t code) { m_code = code; } /** Marks events as consumed. */ virtual void consume() { Event::consume(); } /** Checks whether event is consumed. */ virtual bool isConsumed() const { return Event::isConsumed(); } /** Gets the source of the event. */ virtual IEventSource* getSource() const { return Event::getSource(); } /** Sets the source of the event. */ virtual void setSource(IEventSource* source) { Event::setSource(source); } /** Gets the timestamp of the event. */ virtual int32_t getTimeStamp() const { return Event::getTimeStamp(); } /** Sets the timestamp of the event. */ virtual void setTimeStamp(int32_t timestamp ) { Event::setTimeStamp(timestamp); } /** Gets the name of the event. */ virtual const std::string& getName() const { const static std::string eventName("Command"); return eventName; } /** Gets the debugstring of the event. */ virtual std::string getDebugString() const { return Event::getDebugString(); } private: CommandType m_commandType; int32_t m_code; }; } //FIFE #endif fifengine-0.4.2/engine/core/eventchannel/command/commandids.h000066400000000000000000000045141341615052600242320ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_EVENTCHANNEL_ICOMMANDIDS_H #define FIFE_EVENTCHANNEL_ICOMMANDIDS_H // Standard C++ library includes // // 3rd party library includes // #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder // namespace FIFE { /** Types for different commands */ enum CommandType { CMD_UNKNOWN = -1, CMD_QUIT_GAME = SDL_WINDOWEVENT_CLOSE, CMD_MOUSE_FOCUS_GAINED = SDL_WINDOWEVENT_ENTER, CMD_MOUSE_FOCUS_LOST = SDL_WINDOWEVENT_LEAVE, CMD_INPUT_FOCUS_GAINED = SDL_WINDOWEVENT_FOCUS_GAINED, CMD_INPUT_FOCUS_LOST = SDL_WINDOWEVENT_FOCUS_LOST, CMD_APP_RESTORED = SDL_WINDOWEVENT_SHOWN, CMD_APP_ICONIFIED = SDL_WINDOWEVENT_HIDDEN, }; } //FIFE #endif fifengine-0.4.2/engine/core/eventchannel/command/icommandcontroller.h000066400000000000000000000060671341615052600260140ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_EVENTCHANNEL_ICOMMAND_CONTROLLER_H #define FIFE_EVENTCHANNEL_ICOMMAND_CONTROLLER_H // Standard C++ library includes // // 3rd party library includes // // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder // #include "icommandlistener.h" namespace FIFE { class Command; /** Controller provides a way to receive events from the system * Using this interface, clients can subscribe themselves to receive events * Also command sending is possible */ class ICommandController { public: /** Adds a listener to the back of the listener deque * Listener will be notified via the corresponding events * @param listener listener to add */ virtual void addCommandListener(ICommandListener* listener) = 0; /** Adds a listener to the front of the listener deque * Listener will be notified via the corresponding events * @param listener listener to add */ virtual void addCommandListenerFront(ICommandListener* listener) = 0; /** Removes an added listener from the controller. * Listener will not be notified anymore via the corresponding events * @param listener listener to remove */ virtual void removeCommandListener(ICommandListener* listener) = 0; /** Use this method to send command to command listeners * @param command command to dispatch */ virtual void dispatchCommand(Command& command) = 0; virtual ~ICommandController() {} }; } //FIFE #endif fifengine-0.4.2/engine/core/eventchannel/command/icommandlistener.h000066400000000000000000000046121341615052600254500ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_EVENTCHANNEL_ICOMMANDLISTENER_H #define FIFE_EVENTCHANNEL_ICOMMANDLISTENER_H // Standard C++ library includes // // 3rd party library includes // // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "eventchannel/base/ilistener.h" namespace FIFE { class Command; /** Listener of command events. * To be able to listen for commands you must make a class which inherits * from this class and implements the onCommand function. */ class ICommandListener : public IListener { public: /** Called when a command is received from a command source * @param command command coming from command source */ virtual void onCommand(Command& command) = 0; virtual ~ICommandListener() {} }; } //FIFE #endif fifengine-0.4.2/engine/core/eventchannel/drop/000077500000000000000000000000001341615052600212655ustar00rootroot00000000000000fifengine-0.4.2/engine/core/eventchannel/drop/dropevent.h000066400000000000000000000073201341615052600234460ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_EVENTCHANNEL_DROPEVENT_H #define FIFE_EVENTCHANNEL_DROPEVENT_H // Standard C++ library includes // // 3rd party library includes // // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder // #include "eventchannel/base/inputevent.h" #include "eventchannel/source/ieventsource.h" namespace FIFE { /** Class for drop events */ class DropEvent: public InputEvent { public: /** Constructor */ DropEvent(): InputEvent(), m_path("") {} /** Destructor. */ virtual ~DropEvent() {} /** Gets the path for the file that is droped. */ const std::string& getPath() const { return m_path; } /** Sets the path for the file that is droped. */ void setPath(const std::string& path) { m_path = path; } /** Marks events as consumed. */ virtual void consume() { InputEvent::consume(); } /** Checks whether event is consumed. */ virtual bool isConsumed() const { return InputEvent::isConsumed(); } /** Marks events as consumed by widget library. */ virtual void consumedByWidgets() { InputEvent::consumedByWidgets(); } /** Checks whether event is consumed by widget library. */ virtual bool isConsumedByWidgets() const { return InputEvent::isConsumedByWidgets(); } /** Gets the source of the event. */ virtual IEventSource* getSource() const { return InputEvent::getSource(); } /** Sets the source of the event. */ virtual void setSource(IEventSource* source) { InputEvent::setSource(source); } /** Gets the timestamp of the event. */ virtual int32_t getTimeStamp() const { return InputEvent::getTimeStamp(); } /** Sets the timestamp of the event. */ virtual void setTimeStamp(int32_t timestamp ) { InputEvent::setTimeStamp(timestamp); } /** Gets the name of the event. */ virtual const std::string& getName() const { const static std::string eventName("DropEvent"); return eventName; } /** Gets the debugstring of the event. */ virtual std::string getDebugString() const { return InputEvent::getDebugString(); } private: std::string m_path; }; } //FIFE #endif fifengine-0.4.2/engine/core/eventchannel/drop/idropcontroller.h000066400000000000000000000054741341615052600246710ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_EVENTCHANNEL_IDROP_CONTROLLER_H #define FIFE_EVENTCHANNEL_IDROP_CONTROLLER_H // Standard C++ library includes // // 3rd party library includes // // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder // namespace FIFE { class IDropListener; /** Controller provides a way to receive events from the system * Using this interface, clients can subscribe themselves to receive events */ class IDropController { public: /** Adds a listener to the back of the listener deque * Listener will be notified via the corresponding events * @param listener listener to add */ virtual void addDropListener(IDropListener* listener) = 0; /** Adds a listener to the front of the listener deque * Listener will be notified via the corresponding events * @param listener listener to add */ virtual void addDropListenerFront(IDropListener* listener) = 0; /** Removes an added listener from the controller. * Listener will not be notified anymore via the corresponding events * @param listener listener to remove */ virtual void removeDropListener(IDropListener* listener) = 0; virtual ~IDropController() {} }; } //FIFE #endif fifengine-0.4.2/engine/core/eventchannel/drop/idroplistener.h000066400000000000000000000045301341615052600243230ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_EVENTCHANNEL_IDROPLISTENER_H #define FIFE_EVENTCHANNEL_IDROPLISTENER_H // Standard C++ library includes // // 3rd party library includes // // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "eventchannel/base/ilistener.h" namespace FIFE { class DropEvent; /** Listener of drop events. * To be able to listen for drop events you must make a class which inherits * from this class and implements its functions. */ class IDropListener : public IListener { public: /** Called on a file drop event. * @param evt DropEvent that describes the event. */ virtual void fileDropped(DropEvent& evt) = 0; virtual ~IDropListener() {} }; } //FIFE #endif fifengine-0.4.2/engine/core/eventchannel/eventchannel.i000066400000000000000000000262771341615052600231630ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fife %{ #include "eventchannel/base/event.h" #include "eventchannel/base/inputevent.h" #include "eventchannel/command/command.h" #include "eventchannel/command/commandids.h" #include "eventchannel/command/icommandlistener.h" #include "eventchannel/drop/dropevent.h" #include "eventchannel/drop/idroplistener.h" #include "eventchannel/joystick/joystick.h" #include "eventchannel/joystick/joystickevent.h" #include "eventchannel/joystick/ijoysticklistener.h" #include "eventchannel/key/key.h" #include "eventchannel/key/keyevent.h" #include "eventchannel/key/ikeylistener.h" #include "eventchannel/key/ikeyfilter.h" #include "eventchannel/text/text.h" #include "eventchannel/text/textevent.h" #include "eventchannel/text/itextlistener.h" #include "eventchannel/source/eventsourcetypes.h" #include "eventchannel/source/ieventsource.h" #include "eventchannel/mouse/mouseevent.h" #include "eventchannel/mouse/imouselistener.h" #include "eventchannel/sdl/isdleventlistener.h" #include "eventchannel/eventmanager.h" %} %include "eventchannel/key/key.h" %include "eventchannel/text/text.h" %include "eventchannel/source/eventsourcetypes.h" %include "eventchannel/command/commandids.h" namespace FIFE { %feature("director") IEventSource; class IEventSource { public: virtual EventSourceType getEventSourceType() = 0; virtual ~IEventSource(); }; class Event { public: virtual void consume(); virtual bool isConsumed() const; virtual IEventSource* getSource(); virtual int32_t getTimeStamp() const; virtual std::string getDebugString() const; virtual const std::string& getName() const; virtual ~Event() {} private: Event(); }; class InputEvent: public Event { public: virtual bool isConsumedByWidgets() const; virtual bool isAltPressed() const; virtual bool isControlPressed() const; virtual bool isMetaPressed() const; virtual bool isShiftPressed() const; virtual ~InputEvent() {} private: InputEvent(); }; class Command: public Event { public: Command(); virtual ~Command(); CommandType getCommandType(); void setCommandType(CommandType type); int32_t getCode() const; void setCode(int32_t code); virtual void setSource(IEventSource* source); virtual void setTimeStamp(int32_t timestamp); }; %feature("director") ICommandListener; class ICommandListener { public: virtual void onCommand(Command& command) = 0; virtual ~ICommandListener() {} }; class KeyEvent: public InputEvent { public: enum KeyEventType { UNKNOWN = -1, PRESSED = 0, RELEASED }; virtual KeyEventType getType() const; virtual bool isNumericPad() const; virtual const Key& getKey() const; virtual ~KeyEvent(); private: KeyEvent(); }; %feature("director") IKeyListener; class IKeyListener { public: virtual void keyPressed(KeyEvent& evt) = 0; virtual void keyReleased(KeyEvent& evt) = 0; virtual bool isGlobalListener() const; virtual void setGlobalListener(bool global); virtual ~IKeyListener(); }; class TextEvent: public InputEvent { public: enum TextEventType { UNKNOWN = 0, INPUT = 1, EDIT = 2 }; virtual TextEventType getType() const; virtual const Text& getText() const; virtual ~TextEvent(); private: TextEvent(); }; %feature("director") ITextListener; class ITextListener { public: virtual void textInput(TextEvent& evt) = 0; virtual void textEdit(TextEvent& evt) = 0; virtual ~ITextListener(); }; %feature("director") ISdlEventListener; class ISdlEventListener { public: virtual bool onSdlEvent(SDL_Event& evt) = 0; virtual ~ISdlEventListener(); }; class MouseEvent: public InputEvent { public: enum MouseEventType { UNKNOWN_EVENT = -1, MOVED = 0, PRESSED, RELEASED, WHEEL_MOVED_DOWN, WHEEL_MOVED_UP, WHEEL_MOVED_RIGHT, WHEEL_MOVED_LEFT, CLICKED, ENTERED, EXITED, DRAGGED }; enum MouseButtonType { EMPTY = 0, LEFT = 1, RIGHT = 2, MIDDLE = 4, X1 = 8, X2 = 16, UNKNOWN_BUTTON = 32 }; virtual int32_t getX() const; virtual int32_t getY() const; virtual MouseEventType getType() const; virtual MouseButtonType getButton() const; virtual ~MouseEvent(); private: MouseEvent(); }; %feature("director") IMouseListener; class IMouseListener { public: virtual void mouseEntered(MouseEvent& evt) = 0; virtual void mouseExited(MouseEvent& evt) = 0; virtual void mousePressed(MouseEvent& evt) = 0; virtual void mouseReleased(MouseEvent& evt) = 0; virtual void mouseClicked(MouseEvent& evt) = 0; virtual void mouseWheelMovedUp(MouseEvent& evt) = 0; virtual void mouseWheelMovedDown(MouseEvent& evt) = 0; virtual void mouseWheelMovedRight(MouseEvent& evt) = 0; virtual void mouseWheelMovedLeft(MouseEvent& evt) = 0; virtual void mouseMoved(MouseEvent& evt) = 0; virtual void mouseDragged(MouseEvent& evt) = 0; virtual bool isGlobalListener() const; virtual void setGlobalListener(bool global); virtual ~IMouseListener(); }; %feature("director") IKeyFilter; class IKeyFilter { public: virtual bool isFiltered(const KeyEvent& evt) = 0; virtual ~IKeyFilter(); }; class DropEvent: public InputEvent { public: virtual const std::string& getPath() const; virtual ~DropEvent(); private: DropEvent(); }; %feature("director") IDropListener; class IDropListener { public: virtual void fileDropped(DropEvent& evt) = 0; virtual ~IDropListener(); }; class Joystick { public: enum Hat { HAT_INVALID = -1, HAT_CENTERED = 0, HAT_UP = 1, HAT_RIGHT = 2, HAT_DOWN = 4, HAT_LEFT = 8, HAT_RIGHTUP = 3, HAT_RIGHTDOWN = 6, HAT_LEFTUP = 9, HAT_LEFTDOWN = 12 }; enum ContollerAxis { CONTOLLER_AXIS_INVALID = -1, CONTOLLER_AXIS_LEFTX, CONTOLLER_AXIS_LEFTY, CONTOLLER_AXIS_RIGHTX, CONTOLLER_AXIS_RIGHTY, CONTOLLER_AXIS_TRIGGERLEFT, CONTOLLER_AXIS_TRIGGERRIGHT, CONTOLLER_AXIS_MAX }; enum ControllerButton { CONTOLLER_BUTTON_INVALID = -1, CONTOLLER_BUTTON_A, CONTOLLER_BUTTON_B, CONTOLLER_BUTTON_X, CONTOLLER_BUTTON_Y, CONTOLLER_BUTTON_BACK, CONTOLLER_BUTTON_GUIDE, CONTOLLER_BUTTON_START, CONTOLLER_BUTTON_LEFTSTICK, CONTOLLER_BUTTON_RIGHTSTICK, CONTOLLER_BUTTON_LEFTSHOULDER, CONTOLLER_BUTTON_RIGHTSHOULDER, CONTOLLER_BUTTON_DPAD_UP, CONTOLLER_BUTTON_DPAD_DOWN, CONTOLLER_BUTTON_DPAD_LEFT, CONTOLLER_BUTTON_DPAD_RIGHT, CONTOLLER_BUTTON_MAX }; ~Joystick(); int32_t getDeviceIndex() const; int32_t getInstanceId() const; std::string getGuid(); std::string getName(); bool isConnected() const; bool isController() const; uint8_t getNumberOfAxes() const; uint8_t getNumberOfButtons() const; uint8_t getNumberOfHats() const; float getAxisValue(int8_t axis) const; int8_t getHatValue(int8_t hat) const; bool isButtonPressed(int8_t button) const; private: Joystick(int32_t joystickId, int32_t deviceIndex); }; class JoystickEvent: public InputEvent { public: enum JoystickEventType { UNKNOWN_EVENT = 0, AXIS_MOTION, HAT_MOTION, BUTTON_PRESSED, BUTTON_RELEASED, DEVICE_ADDED, DEVICE_REMOVED }; JoystickEventType getType() const; int32_t getInstanceId() const; int8_t getAxis() const; float getAxisValue() const; int8_t getHat() const; int8_t getHatValue() const; int8_t getButton() const; bool isController() const; virtual ~JoystickEvent(); private: JoystickEvent(); }; %feature("director") IJoystickListener; class IJoystickListener { public: virtual void axisMotion(JoystickEvent& evt) = 0; virtual void hatMotion(JoystickEvent& evt) = 0; virtual void buttonPressed(JoystickEvent& evt) = 0; virtual void buttonReleased(JoystickEvent& evt) = 0; virtual void deviceAdded(JoystickEvent& evt) = 0; virtual void deviceRemoved(JoystickEvent& evt) = 0; virtual ~IJoystickListener(); }; class EventManager { public: EventManager(); virtual ~EventManager(); void addCommandListener(ICommandListener* listener); void addCommandListenerFront(ICommandListener* listener); void removeCommandListener(ICommandListener* listener); void addKeyListener(IKeyListener* listener); void addKeyListenerFront(IKeyListener* listener); void removeKeyListener(IKeyListener* listener); void addTextListener(ITextListener* listener); void addTextListenerFront(ITextListener* listener); void removeTextListener(ITextListener* listener); void addMouseListener(IMouseListener* listener); void addMouseListenerFront(IMouseListener* listener); void removeMouseListener(IMouseListener* listener); void addDropListener(IDropListener* listener); void addDropListenerFront(IDropListener* listener); void removeDropListener(IDropListener* listener); void addJoystickListener(IJoystickListener* listener); void addJoystickListenerFront(IJoystickListener* listener); void removeJoystickListener(IJoystickListener* listener); void addSdlEventListener(ISdlEventListener* listener); void addSdlEventListenerFront(ISdlEventListener* listener); void removeSdlEventListener(ISdlEventListener* listener); EventSourceType getEventSourceType(); void dispatchCommand(Command& command); void setKeyFilter(IKeyFilter* keyFilter); void setMouseSensitivity(float sensitivity); float getMouseSensitivity() const; void setMouseAccelerationEnabled(bool acceleration); bool isMouseAccelerationEnabled() const; bool isClipboardText() const; std::string getClipboardText() const; void setClipboardText(const std::string& text); Joystick* getJoystick(int32_t instanceId); uint8_t getJoystickCount() const; void loadGamepadMapping(const std::string& file); void saveGamepadMapping(const std::string guid, const std::string& file); void saveGamepadMappings(const std::string& file); std::string getGamepadStringMapping(const std::string& guid); void setGamepadStringMapping(const std::string& mapping); }; }; fifengine-0.4.2/engine/core/eventchannel/eventmanager.cpp000066400000000000000000000540101341615052600235010ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/exception.h" #include "util/log/logger.h" #include "util/math/fife_math.h" #include "eventchannel/joystick/joystickmanager.h" #include "eventchannel/key/key.h" #include "eventchannel/key/keyevent.h" #include "eventchannel/key/ikeyfilter.h" #include "eventchannel/mouse/mouseevent.h" #include "eventchannel/command/command.h" #include "video/renderbackend.h" #include "eventmanager.h" namespace FIFE { static Logger _log(LM_EVTCHANNEL); EventManager::EventManager(): m_commandListeners(), m_keyListeners(), m_textListeners(), m_mouseListeners(), m_sdleventListeners(), m_keystatemap(), m_keyfilter(0), m_mousestate(0), m_mostrecentbtn(MouseEvent::EMPTY), m_mouseSensitivity(0.0), m_acceleration(false), m_warp(false), m_enter(false), m_oldX(0), m_oldY(0), m_lastTicks(0), m_oldVelocity(0.0), m_joystickManager(NULL) { } EventManager::~EventManager() { delete m_joystickManager; } template void addListener(std::deque& vec, T& listener) { if (!listener->isActive()) { listener->setActive(true); vec.push_back(listener); } } template void addListenerFront(std::deque& vec, T& listener) { if (!listener->isActive()) { listener->setActive(true); vec.push_front(listener); } } template void removeListener(std::deque& vec, T& listener) { if (listener->isActive()) { listener->setActive(false); for (typename std::deque::iterator it = vec.begin(); it != vec.end(); ++it) { if (*it == listener) { vec.erase(it); break; } } } } void EventManager::addCommandListener(ICommandListener* listener) { addListener(m_commandListeners, listener); } void EventManager::addCommandListenerFront(ICommandListener* listener) { addListenerFront(m_commandListeners, listener); } void EventManager::removeCommandListener(ICommandListener* listener) { removeListener(m_commandListeners, listener); } void EventManager::addKeyListener(IKeyListener* listener) { addListener(m_keyListeners, listener); } void EventManager::addKeyListenerFront(IKeyListener* listener) { addListenerFront(m_keyListeners, listener); } void EventManager::removeKeyListener(IKeyListener* listener) { removeListener(m_keyListeners, listener); } void EventManager::addTextListener(ITextListener* listener) { addListener(m_textListeners, listener); } void EventManager::addTextListenerFront(ITextListener* listener) { addListenerFront(m_textListeners, listener); } void EventManager::removeTextListener(ITextListener* listener) { removeListener(m_textListeners, listener); } void EventManager::addMouseListener(IMouseListener* listener) { addListener(m_mouseListeners, listener); } void EventManager::addMouseListenerFront(IMouseListener* listener) { addListenerFront(m_mouseListeners, listener); } void EventManager::removeMouseListener(IMouseListener* listener) { removeListener(m_mouseListeners, listener); } void EventManager::addSdlEventListener(ISdlEventListener* listener) { addListener(m_sdleventListeners, listener); } void EventManager::addSdlEventListenerFront(ISdlEventListener* listener) { addListenerFront(m_sdleventListeners, listener); } void EventManager::removeSdlEventListener(ISdlEventListener* listener) { removeListener(m_sdleventListeners, listener); } void EventManager::addDropListener(IDropListener* listener) { addListener(m_dropListeners, listener); } void EventManager::addDropListenerFront(IDropListener* listener) { addListenerFront(m_dropListeners, listener); } void EventManager::removeDropListener(IDropListener* listener) { removeListener(m_dropListeners, listener); } void EventManager::addJoystickListener(IJoystickListener* listener) { if (m_joystickManager) { m_joystickManager->addJoystickListener(listener); } } void EventManager::addJoystickListenerFront(IJoystickListener* listener) { if (m_joystickManager) { m_joystickManager->addJoystickListenerFront(listener); } } void EventManager::removeJoystickListener(IJoystickListener* listener) { if (m_joystickManager) { m_joystickManager->removeJoystickListener(listener); } } void EventManager::dispatchCommand(Command& command) { std::deque listeners = m_commandListeners; std::deque::iterator i = listeners.begin(); for (; i != listeners.end(); ++i) { if (!(*i)->isActive()) continue; (*i)->onCommand(command); if (command.isConsumed()) { break; } } } void EventManager::dispatchKeyEvent(KeyEvent& evt) { std::deque listeners = m_keyListeners; std::deque::iterator i = listeners.begin(); for (; i != listeners.end(); ++i) { if (!(*i)->isActive() || (evt.isConsumedByWidgets() && !(*i)->isGlobalListener())) continue; switch (evt.getType()) { case KeyEvent::PRESSED: (*i)->keyPressed(evt); break; case KeyEvent::RELEASED: (*i)->keyReleased(evt); break; default: break; } if (evt.isConsumed()) { break; } } } void EventManager::dispatchTextEvent(TextEvent& evt) { std::deque listeners = m_textListeners; std::deque::iterator i = listeners.begin(); for (; i != listeners.end(); ++i) { if (!(*i)->isActive()) continue; switch (evt.getType()) { case TextEvent::INPUT: (*i)->textInput(evt); break; case TextEvent::EDIT: (*i)->textEdit(evt); break; default: break; } if (evt.isConsumed()) { break; } } } void EventManager::dispatchMouseEvent(MouseEvent& evt) { std::deque listeners = m_mouseListeners; std::deque::iterator i = listeners.begin(); for (; i != listeners.end(); ++i) { if (!(*i)->isActive() || (evt.isConsumedByWidgets() && !(*i)->isGlobalListener())) continue; switch (evt.getType()) { case MouseEvent::MOVED: (*i)->mouseMoved(evt); break; case MouseEvent::PRESSED: (*i)->mousePressed(evt); break; case MouseEvent::RELEASED: (*i)->mouseReleased(evt); break; case MouseEvent::WHEEL_MOVED_DOWN: (*i)->mouseWheelMovedDown(evt); break; case MouseEvent::WHEEL_MOVED_UP: (*i)->mouseWheelMovedUp(evt); break; case MouseEvent::WHEEL_MOVED_RIGHT: (*i)->mouseWheelMovedRight(evt); break; case MouseEvent::WHEEL_MOVED_LEFT: (*i)->mouseWheelMovedLeft(evt); break; case MouseEvent::CLICKED: (*i)->mouseClicked(evt); break; case MouseEvent::ENTERED: (*i)->mouseEntered(evt); break; case MouseEvent::EXITED: (*i)->mouseExited(evt); break; case MouseEvent::DRAGGED: (*i)->mouseDragged(evt); break; default: break; } if (evt.isConsumed()) { break; } } } bool EventManager::dispatchSdlEvent(SDL_Event& evt) { bool ret = false; std::deque listeners = m_sdleventListeners; std::deque::iterator i = listeners.begin(); for (; i != listeners.end(); ++i) { if (!(*i)->isActive()) continue; ret = ret || (*i)->onSdlEvent(evt); } return ret; } void EventManager::dispatchDropEvent(DropEvent& evt) { std::deque listeners = m_dropListeners; std::deque::iterator i = listeners.begin(); for (; i != listeners.end(); ++i) { if (!(*i)->isActive()) continue; (*i)->fileDropped(evt); if (evt.isConsumed()) { break; } } } bool EventManager::combineEvents(SDL_Event& event1, const SDL_Event& event2) { if(event1.type == event2.type) { switch (event1.type) { case SDL_MOUSEMOTION: if(event1.motion.state == event2.motion.state) { event1.motion.x = event2.motion.x; event1.motion.y = event2.motion.y; event1.motion.xrel += event2.motion.xrel; event1.motion.yrel += event2.motion.yrel; return true; } return false; } } return false; } void EventManager::processEvents() { // The double SDL_PollEvent calls don't throw away events, // but try to combine (mouse motion) events. SDL_Event event, next_event; bool has_next_event = (SDL_PollEvent(&event) != 0); while (has_next_event) { has_next_event = (SDL_PollEvent(&next_event) != 0); if (has_next_event && combineEvents(event, next_event)) { continue; } switch (event.type) { case SDL_QUIT: { Command cmd; cmd.setSource(this); cmd.setCommandType(CMD_QUIT_GAME); dispatchCommand(cmd); } break; case SDL_WINDOWEVENT: processWindowEvent(event); break; case SDL_KEYDOWN: case SDL_KEYUP: processKeyEvent(event); break; //case SDL_TEXTEDITING: // is buggy with SDL 2.0.1 case SDL_TEXTINPUT: processTextEvent(event); break; case SDL_MOUSEWHEEL: case SDL_MOUSEBUTTONUP: case SDL_MOUSEMOTION: case SDL_MOUSEBUTTONDOWN: processMouseEvent(event); break; case SDL_DROPFILE: processDropEvent(event); break; case SDL_JOYBUTTONDOWN: case SDL_JOYBUTTONUP: case SDL_JOYAXISMOTION: case SDL_JOYHATMOTION: case SDL_JOYDEVICEADDED: case SDL_JOYDEVICEREMOVED: { if (m_joystickManager) { m_joystickManager->processJoystickEvent(event); } break; } case SDL_CONTROLLERBUTTONDOWN: case SDL_CONTROLLERBUTTONUP: case SDL_CONTROLLERAXISMOTION: { if (m_joystickManager) { m_joystickManager->processControllerEvent(event); } break; } } if (has_next_event) { event = next_event; } } } void EventManager::processWindowEvent(SDL_Event event) { if (dispatchSdlEvent(event)) { return; } CommandType ct = CMD_UNKNOWN; switch (event.window.event) { case SDL_WINDOWEVENT_CLOSE: ct = CMD_QUIT_GAME; break; case SDL_WINDOWEVENT_ENTER: ct = CMD_MOUSE_FOCUS_GAINED; break; case SDL_WINDOWEVENT_LEAVE: ct = CMD_MOUSE_FOCUS_LOST; break; case SDL_WINDOWEVENT_FOCUS_GAINED: ct = CMD_INPUT_FOCUS_GAINED; break; case SDL_WINDOWEVENT_FOCUS_LOST: ct = CMD_INPUT_FOCUS_LOST; break; case SDL_WINDOWEVENT_SHOWN: ct = CMD_APP_RESTORED; break; case SDL_WINDOWEVENT_MINIMIZED: case SDL_WINDOWEVENT_HIDDEN: ct = CMD_APP_ICONIFIED; break; default: ct = CMD_UNKNOWN; } if (ct != CMD_UNKNOWN) { Command cmd; cmd.setCommandType(ct); dispatchCommand(cmd); } } void EventManager::processKeyEvent(SDL_Event event) { KeyEvent keyevt; keyevt.setSource(this); fillKeyEvent(event, keyevt); m_keystatemap[keyevt.getKey().getValue()] = (keyevt.getType() == KeyEvent::PRESSED); // if event is not filtered it gets dispatched, even it is a function key if (!m_keyfilter || !m_keyfilter->isFiltered(keyevt)) { if (dispatchSdlEvent(event)) keyevt.consumedByWidgets(); } dispatchKeyEvent(keyevt); } void EventManager::processTextEvent(SDL_Event event) { if (dispatchSdlEvent(event)) { return; } TextEvent txtevt; txtevt.setSource(this); fillTextEvent(event, txtevt); dispatchTextEvent(txtevt); } void EventManager::processMouseEvent(SDL_Event event) { if (event.type == SDL_MOUSEMOTION && (!Mathf::Equal(m_mouseSensitivity, 0.0) || m_acceleration)) { uint16_t tmp_x = event.motion.x; uint16_t tmp_y = event.motion.y; if (m_enter) { m_oldX = tmp_x; m_oldY = tmp_y; m_oldVelocity = 0.0; m_enter = false; } float modifier; if (m_acceleration) { uint32_t ticks = SDL_GetTicks(); float difference = static_cast((ticks - m_lastTicks) + 1); m_lastTicks = ticks; float dx = static_cast(tmp_x - m_oldX); float dy = static_cast(tmp_y - m_oldY); float distance = Mathf::Sqrt(dx * dx + dy * dy); float acceleration = static_cast((distance / difference) / difference); float velocity = (m_oldVelocity + acceleration * difference)/2; if (velocity > m_mouseSensitivity+1) { velocity = m_mouseSensitivity+1; } m_oldVelocity = velocity; modifier = velocity; } else { modifier = m_mouseSensitivity; } int16_t tmp_xrel = static_cast(tmp_x - m_oldX); int16_t tmp_yrel = static_cast(tmp_y - m_oldY); if ((tmp_xrel != 0) || (tmp_yrel != 0)) { Rect screen = RenderBackend::instance()->getArea(); int16_t x_fact = static_cast(round(static_cast(tmp_xrel * modifier))); int16_t y_fact = static_cast(round(static_cast(tmp_yrel * modifier))); if ((tmp_x + x_fact) > screen.w) { tmp_x = screen.w; } else if ((tmp_x + x_fact) < screen.x) { tmp_x = screen.x; } else { tmp_x += x_fact; } if (tmp_y + y_fact > screen.h) { tmp_y = screen.h; } else if ((tmp_y + y_fact) < screen.y) { tmp_y = screen.y; } else { tmp_y += y_fact; } m_oldX = tmp_x; m_oldY = tmp_y; event.motion.x = tmp_x; event.motion.y = tmp_y; m_warp = true; //don't trigger an event handler when warping SDL_WarpMouseInWindow(RenderBackend::instance()->getWindow(), tmp_x, tmp_y); m_warp = false; } } MouseEvent mouseevt; mouseevt.setSource(this); fillMouseEvent(event, mouseevt); fillModifiers(mouseevt); if (event.type == SDL_MOUSEBUTTONDOWN) { m_mousestate |= static_cast(mouseevt.getButton()); m_mostrecentbtn = mouseevt.getButton(); } else if (event.type == SDL_MOUSEBUTTONUP) { m_mousestate &= ~static_cast(mouseevt.getButton()); } if (dispatchSdlEvent(event)) mouseevt.consumedByWidgets(); dispatchMouseEvent(mouseevt); } void EventManager::processDropEvent(SDL_Event event) { // only dispatched as DropEvent //if (dispatchSdlEvent(event)) { // return; //} char* tmp = event.drop.file; std::string path(tmp); SDL_free(tmp); DropEvent drop; drop.setPath(path); drop.setSource(this); dispatchDropEvent(drop); } void EventManager::fillMouseEvent(const SDL_Event& sdlevt, MouseEvent& mouseevt) { if (m_warp) { return; } mouseevt.setX(sdlevt.button.x); mouseevt.setY(sdlevt.button.y); mouseevt.setButton(MouseEvent::EMPTY); mouseevt.setType(MouseEvent::MOVED); if ((sdlevt.type == SDL_MOUSEBUTTONUP) || (sdlevt.type == SDL_MOUSEBUTTONDOWN)) { switch (sdlevt.button.button) { case SDL_BUTTON_LEFT: mouseevt.setButton(MouseEvent::LEFT); break; case SDL_BUTTON_RIGHT: mouseevt.setButton(MouseEvent::RIGHT); break; case SDL_BUTTON_MIDDLE: mouseevt.setButton(MouseEvent::MIDDLE); break; case SDL_BUTTON_X1: mouseevt.setButton(MouseEvent::X1); break; case SDL_BUTTON_X2: mouseevt.setButton(MouseEvent::X2); break; default: mouseevt.setButton(MouseEvent::UNKNOWN_BUTTON); break; } if (sdlevt.button.state == SDL_RELEASED) { mouseevt.setType(MouseEvent::RELEASED); } else { mouseevt.setType(MouseEvent::PRESSED); } } if (sdlevt.type == SDL_MOUSEWHEEL) { #if SDL_VERSION_ATLEAST(2,0,4) if (sdlevt.wheel.y > 0 || (sdlevt.wheel.direction == SDL_MOUSEWHEEL_FLIPPED && sdlevt.wheel.y < 0)) { mouseevt.setType(MouseEvent::WHEEL_MOVED_UP); } else if (sdlevt.wheel.y < 0 || (sdlevt.wheel.direction == SDL_MOUSEWHEEL_FLIPPED && sdlevt.wheel.y > 0)) { mouseevt.setType(MouseEvent::WHEEL_MOVED_DOWN); } if (sdlevt.wheel.x > 0 || (sdlevt.wheel.direction == SDL_MOUSEWHEEL_FLIPPED && sdlevt.wheel.x < 0)) { mouseevt.setType(MouseEvent::WHEEL_MOVED_RIGHT); } else if (sdlevt.wheel.x < 0 || (sdlevt.wheel.direction == SDL_MOUSEWHEEL_FLIPPED && sdlevt.wheel.x > 0)) { mouseevt.setType(MouseEvent::WHEEL_MOVED_LEFT); } #else if (sdlevt.wheel.y > 0) { mouseevt.setType(MouseEvent::WHEEL_MOVED_UP); } else if (sdlevt.wheel.y < 0) { mouseevt.setType(MouseEvent::WHEEL_MOVED_DOWN); } if (sdlevt.wheel.x > 0) { mouseevt.setType(MouseEvent::WHEEL_MOVED_RIGHT); } else if (sdlevt.wheel.x < 0) { mouseevt.setType(MouseEvent::WHEEL_MOVED_LEFT); } #endif } if ((mouseevt.getType() == MouseEvent::MOVED) && ((m_mousestate & m_mostrecentbtn) != 0)) { mouseevt.setType(MouseEvent::DRAGGED); mouseevt.setButton(m_mostrecentbtn); } } void EventManager::fillKeyEvent(const SDL_Event& sdlevt, KeyEvent& keyevt) { if (sdlevt.type == SDL_KEYDOWN) { keyevt.setType(KeyEvent::PRESSED); } else if (sdlevt.type == SDL_KEYUP) { keyevt.setType(KeyEvent::RELEASED); } else { FL_WARN(_log, LMsg("fillKeyEvent()") << " Invalid key event type of " << sdlevt.type << ". Ignoring event."); return; } SDL_Keysym keysym = sdlevt.key.keysym; keyevt.setShiftPressed((keysym.mod & KMOD_SHIFT) != 0); keyevt.setControlPressed((keysym.mod & KMOD_CTRL) != 0); keyevt.setAltPressed((keysym.mod & KMOD_ALT) != 0); keyevt.setMetaPressed((keysym.mod & KMOD_GUI) != 0); // currently gui/super keys keyevt.setNumericPad((keysym.mod & KMOD_NUM) != 0); keyevt.setKey(Key(static_cast(keysym.sym))); } void EventManager::fillTextEvent(const SDL_Event& sdlevt, TextEvent& txtevt) { if (sdlevt.type == SDL_TEXTINPUT) { txtevt.setType(TextEvent::INPUT); Text t(sdlevt.text.text); txtevt.setText(t); } else if (sdlevt.type == SDL_TEXTEDITING) { txtevt.setType(TextEvent::EDIT); Text t(sdlevt.edit.text, sdlevt.edit.start, sdlevt.edit.length); txtevt.setText(t); } else { FL_WARN(_log, LMsg("fillTextEvent()") << " Invalid text event type of " << sdlevt.type << ". Ignoring event."); } } void EventManager::fillModifiers(InputEvent& evt) { evt.setAltPressed(m_keystatemap[Key::ALT_GR] | m_keystatemap[Key::LEFT_ALT] | m_keystatemap[Key::RIGHT_ALT]); evt.setControlPressed(m_keystatemap[Key::LEFT_CONTROL] | m_keystatemap[Key::RIGHT_CONTROL]); evt.setShiftPressed(m_keystatemap[Key::LEFT_SHIFT] | m_keystatemap[Key::RIGHT_SHIFT]); } EventSourceType EventManager::getEventSourceType() { return ES_ENGINE; } void EventManager::setKeyFilter(IKeyFilter* keyFilter) { m_keyfilter = keyFilter; } void EventManager::setMouseSensitivity(float sensitivity) { if (sensitivity < -0.99) { sensitivity = -0.99; } else if (sensitivity > 10.0) { sensitivity = 10.0; } m_mouseSensitivity = sensitivity; } float EventManager::getMouseSensitivity() const { return m_mouseSensitivity; } void EventManager::setMouseAccelerationEnabled(bool acceleration) { m_acceleration = acceleration; } bool EventManager::isMouseAccelerationEnabled() const { return m_acceleration; } bool EventManager::isClipboardText() const { return SDL_HasClipboardText(); } std::string EventManager::getClipboardText() const { std::string text; if (SDL_HasClipboardText()) { text = std::string(SDL_GetClipboardText()); } return text; } void EventManager::setClipboardText(const std::string& text) { SDL_SetClipboardText(text.c_str()); } void EventManager::setJoystickSupport(bool support) { if (support && !m_joystickManager) { m_joystickManager = new JoystickManager(); } else if (!support && m_joystickManager) { delete m_joystickManager; m_joystickManager = NULL; } } Joystick* EventManager::getJoystick(int32_t instanceId) { if (m_joystickManager) { return m_joystickManager->getJoystick(instanceId); } return NULL; } uint8_t EventManager::getJoystickCount() const { if (m_joystickManager) { return m_joystickManager->getJoystickCount(); } return 0; } void EventManager::loadGamepadMapping(const std::string& file) { if (m_joystickManager) { m_joystickManager->loadMapping(file); } } void EventManager::saveGamepadMapping(const std::string guid, const std::string& file) { if (m_joystickManager) { m_joystickManager->saveMapping(guid, file); } } void EventManager::saveGamepadMappings(const std::string& file) { if (m_joystickManager) { m_joystickManager->saveMappings(file); } } std::string EventManager::getGamepadStringMapping(const std::string& guid) { std::string mapping; if (m_joystickManager) { mapping = m_joystickManager->getStringMapping(guid); } return mapping; } void EventManager::setGamepadStringMapping(const std::string& mapping) { if (m_joystickManager) { m_joystickManager->setStringMapping(mapping); } } } fifengine-0.4.2/engine/core/eventchannel/eventmanager.h000066400000000000000000000207571341615052600231610ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_EVENTCHANNEL_EVENTMANAGER_H #define FIFE_EVENTCHANNEL_EVENTMANAGER_H // Standard C++ library includes // #include #include #include // 3rd party library includes // // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder // #include "util/base/fife_stdint.h" #include "eventchannel/command/command.h" #include "eventchannel/command/icommandcontroller.h" #include "eventchannel/command/icommandlistener.h" #include "eventchannel/drop/idropcontroller.h" #include "eventchannel/drop/idroplistener.h" #include "eventchannel/drop/dropevent.h" #include "eventchannel/key/ikeycontroller.h" #include "eventchannel/key/ikeylistener.h" #include "eventchannel/key/keyevent.h" #include "eventchannel/key/key.h" #include "eventchannel/text/itextcontroller.h" #include "eventchannel/text/itextlistener.h" #include "eventchannel/text/textevent.h" #include "eventchannel/text/text.h" #include "eventchannel/mouse/imousecontroller.h" #include "eventchannel/mouse/imouselistener.h" #include "eventchannel/mouse/mouseevent.h" #include "eventchannel/sdl/isdleventcontroller.h" #include "eventchannel/sdl/isdleventlistener.h" namespace FIFE { class ICommandListener; class InputEvent; class IJoystickListener; class Joystick; class JoystickManager; class MouseEvent; class KeyEvent; class IKeyFilter; class DropEvent; /** Event Manager manages all events related to FIFE */ class EventManager: public ICommandController, public IKeyController, public ITextController, public IMouseController, public ISdlEventController, public IDropController, public IEventSource { public: /** Constructor. */ EventManager(); /** Destructor */ virtual ~EventManager(); void addCommandListener(ICommandListener* listener); void addCommandListenerFront(ICommandListener* listener); void removeCommandListener(ICommandListener* listener); void dispatchCommand(Command& command); void addKeyListener(IKeyListener* listener); void addKeyListenerFront(IKeyListener* listener); void removeKeyListener(IKeyListener* listener); void addTextListener(ITextListener* listener); void addTextListenerFront(ITextListener* listener); void removeTextListener(ITextListener* listener); void addMouseListener(IMouseListener* listener); void addMouseListenerFront(IMouseListener* listener); void removeMouseListener(IMouseListener* listener); void addSdlEventListener(ISdlEventListener* listener); void addSdlEventListenerFront(ISdlEventListener* listener); void removeSdlEventListener(ISdlEventListener* listener); void addDropListener(IDropListener* listener); void addDropListenerFront(IDropListener* listener); void removeDropListener(IDropListener* listener); void addJoystickListener(IJoystickListener* listener); void addJoystickListenerFront(IJoystickListener* listener); void removeJoystickListener(IJoystickListener* listener); EventSourceType getEventSourceType(); /** Process the SDL event queue. * This is to be called only by the engine itself once per frame. * It passes appropriate events to their listeners */ void processEvents(); void setKeyFilter(IKeyFilter* keyFilter); /** Sets mouse sensitivity * The sensitivity is limited to the range -0.99 - 10.0. */ void setMouseSensitivity(float sensitivity); /** Gets mouse sensitivity */ float getMouseSensitivity() const; /** Sets mouse acceleration * if mouse acceleration is enabled, * then the mouse sensitivity is used as speed max. */ void setMouseAccelerationEnabled(bool acceleration); /** Returns if mouse acceleration is enabled or not. * * @return True if mouse acceleration is enabled, false if not. */ bool isMouseAccelerationEnabled() const; /** Returns if clipboard have text or not. * * @return True if the clipboard contains text, false if not. */ bool isClipboardText() const; /** Returns the clipboard text as UTF-8 string. * * @return UTF-8 string or an empty string if the cliboard have no text. */ std::string getClipboardText() const; /** Sets clipboard text. * * @param text The text in UTF-8 format. */ void setClipboardText(const std::string& text); /** Sets the joystick support to enabled or disabled. */ void setJoystickSupport(bool support); /** Return the joystick with the given instance id. */ Joystick* getJoystick(int32_t instanceId); /** Return the number of joysticks / gamecontrollers. */ uint8_t getJoystickCount() const; /** Loads controller mappings from given file and if possible, it opens the related controllers. */ void loadGamepadMapping(const std::string& file); /** Saves controller mapping for given GUID in the specified file. */ void saveGamepadMapping(const std::string guid, const std::string& file); /** Saves all controller mappings that were used during the season. */ void saveGamepadMappings(const std::string& file); /** Return the controller mapping for given GUID as string. */ std::string getGamepadStringMapping(const std::string& guid); /** Sets controller mapping from string and adds or updates the related controllers. */ void setGamepadStringMapping(const std::string& mapping); private: // Helpers for processEvents void processWindowEvent(SDL_Event event); void processKeyEvent(SDL_Event event); void processTextEvent(SDL_Event event); void processMouseEvent(SDL_Event event); void processDropEvent(SDL_Event event); bool combineEvents(SDL_Event& event1, const SDL_Event& event2); // Events dispatchers - only dispatchSdlevent may reject the event. bool dispatchSdlEvent(SDL_Event& evt); void dispatchKeyEvent(KeyEvent& evt); void dispatchTextEvent(TextEvent& evt); void dispatchMouseEvent(MouseEvent& evt); void dispatchDropEvent(DropEvent& evt); // Translate events void fillModifiers(InputEvent& evt); void fillKeyEvent(const SDL_Event& sdlevt, KeyEvent& keyevt); void fillTextEvent(const SDL_Event& sdlevt, TextEvent& txtevt); void fillMouseEvent(const SDL_Event& sdlevt, MouseEvent& mouseevt); // Listeners std::deque m_commandListeners; std::deque m_keyListeners; std::deque m_textListeners; std::deque m_mouseListeners; std::deque m_sdleventListeners; std::deque m_dropListeners; std::map m_keystatemap; IKeyFilter* m_keyfilter; int32_t m_mousestate; MouseEvent::MouseButtonType m_mostrecentbtn; // m_mouseSensitivity is the mouse speed factor - 1, so a value of 0 won't // influence mouse speed, a value of 1 would double the speed and // -.5 would make it half the speed float m_mouseSensitivity; bool m_acceleration; bool m_warp; bool m_enter; uint16_t m_oldX; uint16_t m_oldY; uint32_t m_lastTicks; float m_oldVelocity; JoystickManager* m_joystickManager; }; } //FIFE #endif fifengine-0.4.2/engine/core/eventchannel/joystick/000077500000000000000000000000001341615052600221605ustar00rootroot00000000000000fifengine-0.4.2/engine/core/eventchannel/joystick/ijoystickcontroller.h000066400000000000000000000055501341615052600264520ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_EVENTCHANNEL_IJOYSTICK_CONTROLLER_H #define FIFE_EVENTCHANNEL_IJOYSTICK_CONTROLLER_H // Standard C++ library includes // // 3rd party library includes // // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder // namespace FIFE { class IJoystickListener; /** Controller provides a way to receive events from the system * Using this interface, clients can subscribe themselves to receive events */ class IJoystickController { public: /** Adds a listener to the back of the listener deque * Listener will be notified via the corresponding events * @param listener listener to add */ virtual void addJoystickListener(IJoystickListener* listener) = 0; /** Adds a listener to the front of the listener deque * Listener will be notified via the corresponding events * @param listener listener to add */ virtual void addJoystickListenerFront(IJoystickListener* listener) = 0; /** Removes an added listener from the controller. * Listener will not be notified anymore via the corresponding events * @param listener listener to remove */ virtual void removeJoystickListener(IJoystickListener* listener) = 0; virtual ~IJoystickController() {} }; } //FIFE #endif fifengine-0.4.2/engine/core/eventchannel/joystick/ijoysticklistener.h000066400000000000000000000062041341615052600261110ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_EVENTCHANNEL_IJOYSTICKLISTENER_H #define FIFE_EVENTCHANNEL_IJOYSTICKLISTENER_H // Standard C++ library includes // // 3rd party library includes // // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "eventchannel/base/ilistener.h" namespace FIFE { class JoystickEvent; /** Listener of joystick events. * To be able to listen for joystick events you must make a class which inherits * from this class and implements its functions. */ class IJoystickListener : public IListener { public: /** Called on a axis motion event. * @param evt JoystickEvent that describes the event. */ virtual void axisMotion(JoystickEvent& evt) = 0; /** Called on a hat motion event. * @param evt JoystickEvent that describes the event. */ virtual void hatMotion(JoystickEvent& evt) = 0; /** Called on a button pressed event. * @param evt JoystickEvent that describes the event. */ virtual void buttonPressed(JoystickEvent& evt) = 0; /** Called on a button released event. * @param evt JoystickEvent that describes the event. */ virtual void buttonReleased(JoystickEvent& evt) = 0; /** Called on a device added event. * @param evt JoystickEvent that describes the event. */ virtual void deviceAdded(JoystickEvent& evt) = 0; /** Called on a device removed event. * @param evt JoystickEvent that describes the event. */ virtual void deviceRemoved(JoystickEvent& evt) = 0; virtual ~IJoystickListener() {} }; } //FIFE #endif fifengine-0.4.2/engine/core/eventchannel/joystick/joystick.cpp000066400000000000000000000133651341615052600245330ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes #include // 3rd party library includes #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/exception.h" #include "util/log/logger.h" #include "util/math/fife_math.h" #include "joystick.h" namespace FIFE { static Logger _log(LM_EVTCHANNEL); Joystick::Joystick(int32_t joystickId, int32_t deviceIndex): m_joystickHandle(NULL), m_controllerHandle(NULL), m_instanceId(-1), m_joystickId(joystickId), m_deviceIndex(deviceIndex), m_guidStr(""), m_name("") { } Joystick::~Joystick() { close(); } int32_t Joystick::getInstanceId() const { return static_cast(m_instanceId); } int32_t Joystick::getJoystickId() const { return m_joystickId; } void Joystick::setDeviceIndex(int32_t deviceIndex) { m_deviceIndex = deviceIndex; } int32_t Joystick::getDeviceIndex() const { return m_deviceIndex; } const std::string& Joystick::getGuid() { return m_guidStr; } const std::string& Joystick::getName() { return m_name; } void Joystick::open() { if (m_joystickHandle) { close(); } m_joystickHandle = SDL_JoystickOpen(m_deviceIndex); if (m_joystickHandle) { m_instanceId = SDL_JoystickInstanceID(m_joystickHandle); char tmp[33]; SDL_JoystickGUID guid = SDL_JoystickGetDeviceGUID(m_deviceIndex); SDL_JoystickGetGUIDString(guid, tmp, sizeof(tmp)); m_guidStr = std::string(tmp); openController(); const char* name = SDL_JoystickNameForIndex(m_deviceIndex); if (isController() && !name) { name = SDL_GameControllerNameForIndex(m_deviceIndex); } m_name = std::string(name); } else { throw SDLException(SDL_GetError()); } } void Joystick::close() { closeController(); if (m_joystickHandle) { SDL_JoystickClose(m_joystickHandle); m_joystickHandle = NULL; } m_instanceId = -1; m_deviceIndex = -1; } bool Joystick::isConnected() const { return m_joystickHandle && SDL_JoystickGetAttached(m_joystickHandle); } bool Joystick::isController() const { return m_controllerHandle != NULL; } void Joystick::openController() { closeController(); if (!SDL_IsGameController(m_deviceIndex)) { return; } m_controllerHandle = SDL_GameControllerOpen(m_deviceIndex); } void Joystick::closeController() { if (m_controllerHandle) { SDL_GameControllerClose(m_controllerHandle); m_controllerHandle = NULL; } } uint8_t Joystick::getNumberOfAxes() const { uint8_t number = 0; if (isConnected()) { number = SDL_JoystickNumAxes(m_joystickHandle); } return number; } uint8_t Joystick::getNumberOfButtons() const { uint8_t number = 0; if (isConnected()) { number = SDL_JoystickNumButtons(m_joystickHandle); } return number; } uint8_t Joystick::getNumberOfHats() const { uint8_t number = 0; if (isConnected()) { number = SDL_JoystickNumHats(m_joystickHandle); } return number; } float Joystick::getAxisValue(int8_t axis) const { if (axis < 0 || !isConnected()) { return 0; } if (!isController()) { return convertRange(SDL_JoystickGetAxis(m_joystickHandle, axis)); } SDL_GameControllerAxis sdlAxis = static_cast(axis); return convertRange(SDL_GameControllerGetAxis(m_controllerHandle, sdlAxis)); } int8_t Joystick::getHatValue(int8_t hat) const { if (hat < 0 || !isConnected()) { return HAT_INVALID; } return SDL_JoystickGetHat(m_joystickHandle, hat); } bool Joystick::isButtonPressed(int8_t button) const { if (button < 0 || !isConnected()) { return false; } if (!isController()) { if (SDL_JoystickGetButton(m_joystickHandle, button) == 1) { return true; } return false; } SDL_GameControllerButton sdlButton = static_cast(button); if (SDL_GameControllerGetButton(m_controllerHandle, sdlButton) == 1) { return true; } return false; } float Joystick::convertRange(int16_t value) const { float range = static_cast(value) / 32768.0f; if (Mathf::FAbs(range) < 0.01f) { return 0.0f; } if (range < -0.99f) { return -1.0f; } else if (range > 0.99f) { return 1.0f; } return range; } } fifengine-0.4.2/engine/core/eventchannel/joystick/joystick.h000066400000000000000000000130411341615052600241670ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_EVENTCHANNEL_JOYSTICK_H #define FIFE_EVENTCHANNEL_JOYSTICK_H // Standard C++ library includes // 3rd party library includes #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder namespace FIFE { /** Represents a Joystick and if available the Gamecontroller. */ class Joystick { public: // Hat positions. enum Hat { HAT_INVALID = -1, HAT_CENTERED = 0, HAT_UP = 1, HAT_RIGHT = 2, HAT_DOWN = 4, HAT_LEFT = 8, HAT_RIGHTUP = 3, HAT_RIGHTDOWN = 6, HAT_LEFTUP = 9, HAT_LEFTDOWN = 12 }; // The list of axes available from a controller. enum ContollerAxis { CONTOLLER_AXIS_INVALID = -1, CONTOLLER_AXIS_LEFTX, CONTOLLER_AXIS_LEFTY, CONTOLLER_AXIS_RIGHTX, CONTOLLER_AXIS_RIGHTY, CONTOLLER_AXIS_TRIGGERLEFT, CONTOLLER_AXIS_TRIGGERRIGHT, CONTOLLER_AXIS_MAX }; // The list of buttons available from a controller. enum ControllerButton { CONTOLLER_BUTTON_INVALID = -1, CONTOLLER_BUTTON_A, CONTOLLER_BUTTON_B, CONTOLLER_BUTTON_X, CONTOLLER_BUTTON_Y, CONTOLLER_BUTTON_BACK, CONTOLLER_BUTTON_GUIDE, CONTOLLER_BUTTON_START, CONTOLLER_BUTTON_LEFTSTICK, CONTOLLER_BUTTON_RIGHTSTICK, CONTOLLER_BUTTON_LEFTSHOULDER, CONTOLLER_BUTTON_RIGHTSHOULDER, CONTOLLER_BUTTON_DPAD_UP, CONTOLLER_BUTTON_DPAD_DOWN, CONTOLLER_BUTTON_DPAD_LEFT, CONTOLLER_BUTTON_DPAD_RIGHT, CONTOLLER_BUTTON_MAX }; /** Constructor * @param joystickId The identifier for the Joystick. * @param deviceIndex The index number from SDL2. */ Joystick(int32_t joystickId, int32_t deviceIndex); /** Destructor */ ~Joystick(); /** Return the instance id of the joystick. */ int32_t getInstanceId() const; /** Sets the instance id of the joystick. */ int32_t getJoystickId() const; /** Sets the device index of the joystick. */ void setDeviceIndex(int32_t deviceIndex); /** Return the device index of the joystick. */ int32_t getDeviceIndex() const; /** Return the GUID of the joystick / gamecontroller class as string. */ const std::string& getGuid(); /** Return the name of the joystick. */ const std::string& getName(); /** Opens / activates the joystick and sets values. */ void open(); /** Closes / deactivates the joystick. */ void close(); /** Indicates if the joystick / gamecontroller is connected. */ bool isConnected() const; /** Indicates if this a controller. */ bool isController() const; /** Opens / activates the gamecontroller, only possible with valid GUID mapping. */ void openController(); /** Closes / deactivates the gamecontroller. */ void closeController(); /** Return the number of axes. */ uint8_t getNumberOfAxes() const; /** Return the number of buttons. */ uint8_t getNumberOfButtons() const; /** Return the number of hats. */ uint8_t getNumberOfHats() const; /** Return the current value for given axis. * @param axis For joysticks the index number, for controller see ContollerAxis. */ float getAxisValue(int8_t axis) const; /** Return the hat value (see Hat positions), for given hat index. */ int8_t getHatValue(int8_t hat) const; /** Return the current value for given axis. * @param button For joysticks the index number, for controller see ControllerButton. */ bool isButtonPressed(int8_t button) const; private: /** Converts the int16 in -1.0 to 1.0 range. */ float convertRange(int16_t value) const; //! SDLs joystick handle SDL_Joystick* m_joystickHandle; //! SDLs controller handle SDL_GameController* m_controllerHandle; //! SDLs joystick id (different from device index) SDL_JoystickID m_instanceId; //! Our joystick id int32_t m_joystickId; //! SDLs device index int32_t m_deviceIndex; //! The GUID as string std::string m_guidStr; //! The name of the joystick / controller std::string m_name; }; } //FIFE #endif fifengine-0.4.2/engine/core/eventchannel/joystick/joystickevent.h000066400000000000000000000126041341615052600252350ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_EVENTCHANNEL_JOYSTICKEVENT_H #define FIFE_EVENTCHANNEL_JOYSTICKEVENT_H // Standard C++ library includes // // 3rd party library includes // // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder // #include "eventchannel/base/inputevent.h" #include "eventchannel/source/ieventsource.h" #include "joystick.h" namespace FIFE { /** Class for Joystick events */ class JoystickEvent: public InputEvent { public: enum JoystickEventType { UNKNOWN_EVENT = 0, AXIS_MOTION, HAT_MOTION, BUTTON_PRESSED, BUTTON_RELEASED, DEVICE_ADDED, DEVICE_REMOVED }; /** Constructor */ JoystickEvent(): InputEvent(), m_eventType(UNKNOWN_EVENT), m_instanceId(-1), m_axis(-1), m_axisValue(0), m_hat(-1), m_hatValue(-1), m_button(-1), m_controller(false) {} /** Destructor. */ virtual ~JoystickEvent() {} /** Return the event type. */ JoystickEventType getType() const { return m_eventType; } /** Sets the event type. */ void setType(JoystickEventType type) { m_eventType = type; } /** Return the instance id of the joystick. */ int32_t getInstanceId() const { return m_instanceId; } /** Sets the instance id of the joystick. */ void setInstanceId(int32_t id) { m_instanceId = id; } /** Return the index number of axis for joystick, or the Joystick::ContollerAxis for controller. */ int8_t getAxis() const { return m_axis; } /** Sets the axis index number or the Joystick::ControllerAxis. */ void setAxis(int8_t axis) { m_axis = axis; } /** Return the axis value, range is -1.0 to 1.0. */ float getAxisValue() const { return m_axisValue; } /** Sets the axis value. */ void setAxisValue(float value) { m_axisValue = value; } /** Return the hat index. */ int8_t getHat() const { return m_hat; } /** Sets the hat index. */ void setHat(int8_t hat) { m_hat = hat; } /** Return the hat value, see Joystick::Hat. */ int8_t getHatValue() const { return m_hatValue; } /** Sets the hat value. */ void setHatValue(int8_t value) { m_hatValue = value; } /** Return the button index for joystick, or Joystick::ControllerButton for controller. */ int8_t getButton() const { return m_button; } /** Sets the button index or Joystick::ControllerButton. */ void setButton(int8_t button) { m_button = button; } /** Return true if it is a controller, false if only a joystick. */ bool isController() const { return m_controller; } /** Sets to true if the event is for a controller, otherwise false. */ void setController(bool value) { m_controller = value; } virtual void consume() { InputEvent::consume(); } virtual bool isConsumed() const { return InputEvent::isConsumed(); } virtual void consumedByWidgets() { InputEvent::consumedByWidgets(); } virtual bool isConsumedByWidgets() const { return InputEvent::isConsumedByWidgets(); } virtual IEventSource* getSource() const { return InputEvent::getSource(); } virtual void setSource(IEventSource* source) { InputEvent::setSource(source); } virtual int32_t getTimeStamp() const { return InputEvent::getTimeStamp(); } virtual void setTimeStamp(int32_t timestamp ) { InputEvent::setTimeStamp(timestamp); } virtual const std::string& getName() const { const static std::string eventName("JostickEvent"); return eventName; } virtual std::string getDebugString() const { return InputEvent::getDebugString(); } private: //! Event type JoystickEventType m_eventType; //! Joystick instance id int32_t m_instanceId; //! Axis index int8_t m_axis; //! Axis value float m_axisValue; //! Hat index int8_t m_hat; //! Hat value int8_t m_hatValue; //! Button index int8_t m_button; //! Is gamecontroller bool m_controller; }; } //FIFE #endif fifengine-0.4.2/engine/core/eventchannel/joystick/joystickmanager.cpp000066400000000000000000000275071341615052600260710ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes #include // 3rd party library includes #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder //#include "loaders/native/input/controllermappingloader.h" //#include "savers/native/input/controllermappingsaver.h" #include "util/base/exception.h" #include "util/log/logger.h" #include "util/math/fife_math.h" #include "joystickmanager.h" namespace FIFE { static Logger _log(LM_EVTCHANNEL); JoystickManager::JoystickManager() { // init joystick and controller systems if (SDL_InitSubSystem(SDL_INIT_JOYSTICK | SDL_INIT_GAMECONTROLLER) < 0) { throw SDLException(SDL_GetError()); } // create loader/saver for controller mappings m_mappingLoader = ControllerMappingLoader(); m_mappingSaver = ControllerMappingSaver(); // add already connected joysticks / controllers for (int32_t i = 0; i < SDL_NumJoysticks(); ++i) { addJoystick(i); } // enable joystick and gamecontroller events SDL_JoystickEventState(SDL_ENABLE); SDL_GameControllerEventState(SDL_ENABLE); } JoystickManager::~JoystickManager() { for (std::vector::iterator it = m_joysticks.begin(); it != m_joysticks.end(); ++it) { delete *it; } SDL_QuitSubSystem(SDL_INIT_JOYSTICK | SDL_INIT_GAMECONTROLLER); } Joystick* JoystickManager::addJoystick(int32_t deviceIndex) { Joystick* joystick = NULL; for (std::vector::iterator it = m_activeJoysticks.begin(); it != m_activeJoysticks.end(); ++it) { if ((*it)->getDeviceIndex() == deviceIndex) { return joystick; } } std::string guidStr = getGuidString(deviceIndex); for (std::vector::iterator it = m_joysticks.begin(); it != m_joysticks.end(); ++it) { if (!(*it)->isConnected() && (*it)->getGuid() == guidStr) { joystick = *it; break; } } if (!joystick) { joystick = new Joystick(m_joysticks.size(), deviceIndex); m_joysticks.push_back(joystick); } else { joystick->setDeviceIndex(deviceIndex); } joystick->open(); addControllerGuid(joystick); m_joystickIndices.insert(std::pair(joystick->getInstanceId(), joystick->getJoystickId())); m_activeJoysticks.push_back(joystick); return joystick; } Joystick* JoystickManager::getJoystick(int32_t instanceId) { Joystick* joy = NULL; std::map::iterator it = m_joystickIndices.find(instanceId); if (it != m_joystickIndices.end()) { joy = m_joysticks[it->second]; } return joy; } void JoystickManager::removeJoystick(Joystick* joystick) { std::vector::iterator it = std::find(m_activeJoysticks.begin(), m_activeJoysticks.end(), joystick); if (it != m_activeJoysticks.end()) { m_joystickIndices.erase((*it)->getInstanceId()); removeControllerGuid(*it); (*it)->close(); m_activeJoysticks.erase(it); } } uint8_t JoystickManager::getJoystickCount() const { return static_cast(m_activeJoysticks.size()); } void JoystickManager::loadMapping(const std::string& file) { m_mappingLoader.load(file); // check if one of the joysticks can now be opened as gamecontroller for (std::vector::iterator it = m_activeJoysticks.begin(); it != m_activeJoysticks.end(); ++it) { if (!(*it)->isController()) { (*it)->openController(); addControllerGuid(*it); } } } void JoystickManager::saveMapping(const std::string guid, const std::string& file) { std::string stringMapping = getStringMapping(guid); m_mappingSaver.save(stringMapping, file); } void JoystickManager::saveMappings(const std::string& file) { std::string stringMappings; std::map::iterator it = m_gamepadGuids.begin(); for (; it != m_gamepadGuids.end(); ++it) { stringMappings += getStringMapping(it->first); } m_mappingSaver.save(stringMappings, file); } std::string JoystickManager::getStringMapping(const std::string& guid) { SDL_JoystickGUID realGuid = SDL_JoystickGetGUIDFromString(guid.c_str()); char* mapping = SDL_GameControllerMappingForGUID(realGuid); if (!mapping) { throw SDLException(SDL_GetError()); return std::string(); } std::string stringMapping(mapping); SDL_free(mapping); // add missing platform if needed if (stringMapping.find_last_of(',') != stringMapping.length() - 1) { stringMapping += ","; } std::size_t platPos = stringMapping.find("platform:"); if (platPos == std::string::npos) { stringMapping += "platform:" + std::string(SDL_GetPlatform()) + ",\n"; } return stringMapping; } void JoystickManager::setStringMapping(const std::string& mapping) { int32_t result = SDL_GameControllerAddMapping(mapping.c_str()); if (result == 1) { // check if one of the joysticks can now be opened as gamecontroller for (std::vector::iterator it = m_activeJoysticks.begin(); it != m_activeJoysticks.end(); ++it) { if (!(*it)->isController()) { (*it)->openController(); addControllerGuid(*it); } } } else if (result == -1) { throw SDLException(SDL_GetError()); } } void JoystickManager::addJoystickListener(IJoystickListener* listener) { m_joystickListeners.push_back(listener); } void JoystickManager::addJoystickListenerFront(IJoystickListener* listener) { m_joystickListeners.push_front(listener); } void JoystickManager::removeJoystickListener(IJoystickListener* listener) { if (listener->isActive()) { listener->setActive(false); for (std::deque::iterator it = m_joystickListeners.begin(); it != m_joystickListeners.end(); ++it) { if (*it == listener) { m_joystickListeners.erase(it); break; } } } } void JoystickManager::processJoystickEvent(SDL_Event event) { bool dispatch = true; JoystickEvent joyevt; joyevt.setSource(this); if (event.type == SDL_JOYAXISMOTION) { joyevt.setType(JoystickEvent::AXIS_MOTION); joyevt.setInstanceId(event.jaxis.which); joyevt.setAxis(event.jaxis.axis); joyevt.setAxisValue(convertRange(event.jaxis.value)); } else if (event.type == SDL_JOYBUTTONDOWN || event.type == SDL_JOYBUTTONUP) { joyevt.setType(event.type == SDL_JOYBUTTONDOWN ? JoystickEvent::BUTTON_PRESSED : JoystickEvent::BUTTON_RELEASED); joyevt.setInstanceId(event.jbutton.which); joyevt.setButton(event.jbutton.button); } else if (event.type == SDL_JOYHATMOTION) { joyevt.setType(JoystickEvent::HAT_MOTION); joyevt.setInstanceId(event.jhat.which); joyevt.setHat(event.jhat.hat); joyevt.setHatValue(event.jhat.value); } else if (event.type == SDL_JOYDEVICEADDED) { joyevt.setType(JoystickEvent::DEVICE_ADDED); // Note: In this case it's the device index, instead of instance id Joystick* joy = addJoystick(event.jdevice.which); if (joy) { joyevt.setInstanceId(joy->getInstanceId()); } else { dispatch = false; } } else if (event.type == SDL_JOYDEVICEREMOVED) { joyevt.setType(JoystickEvent::DEVICE_REMOVED); joyevt.setInstanceId(event.jdevice.which); } else { dispatch = false; } // Dispatch only if it's not a controller, SDL sends events twice. // Only exception for added and removed events. Joystick* joy = getJoystick(joyevt.getInstanceId()); dispatch = dispatch && (!joy->isController() || (event.type == SDL_JOYDEVICEREMOVED || event.type == SDL_JOYDEVICEADDED)); if (dispatch) { joyevt.setController(joy->isController()); dispatchJoystickEvent(joyevt); } // Remove it after event dispatch. if (event.type == SDL_JOYDEVICEREMOVED) { removeJoystick(joy); } } void JoystickManager::processControllerEvent(SDL_Event event) { bool dispatch = true; JoystickEvent joyevt; joyevt.setSource(this); joyevt.setController(true); if (event.type == SDL_CONTROLLERAXISMOTION) { joyevt.setType(JoystickEvent::AXIS_MOTION); joyevt.setInstanceId(event.caxis.which); joyevt.setAxis(event.caxis.axis); joyevt.setAxisValue(convertRange(event.caxis.value)); } else if (event.type == SDL_CONTROLLERBUTTONDOWN || event.type == SDL_CONTROLLERBUTTONUP) { joyevt.setType(event.type == SDL_CONTROLLERBUTTONDOWN ? JoystickEvent::BUTTON_PRESSED : JoystickEvent::BUTTON_RELEASED); joyevt.setInstanceId(event.cbutton.which); joyevt.setButton(event.cbutton.button); } else { dispatch = false; } if (dispatch) { dispatchJoystickEvent(joyevt); } } void JoystickManager::dispatchJoystickEvent(JoystickEvent& evt) { std::deque listeners = m_joystickListeners; std::deque::iterator i = listeners.begin(); for (; i != listeners.end(); ++i) { if (!(*i)->isActive()) continue; switch (evt.getType()) { case JoystickEvent::AXIS_MOTION: (*i)->axisMotion(evt); break; case JoystickEvent::HAT_MOTION: (*i)->hatMotion(evt); break; case JoystickEvent::BUTTON_PRESSED: (*i)->buttonPressed(evt); break; case JoystickEvent::BUTTON_RELEASED: (*i)->buttonReleased(evt); break; case JoystickEvent::DEVICE_ADDED: (*i)->deviceAdded(evt); break; case JoystickEvent::DEVICE_REMOVED: (*i)->deviceRemoved(evt); break; default: break; } if (evt.isConsumed()) { break; } } } EventSourceType JoystickManager::getEventSourceType() { return ES_ENGINE; } std::string JoystickManager::getGuidString(int32_t deviceIndex) { char tmp[33]; SDL_JoystickGUID guid = SDL_JoystickGetDeviceGUID(deviceIndex); SDL_JoystickGetGUIDString(guid, tmp, sizeof(tmp)); std::string guidString(tmp); return guidString; } float JoystickManager::convertRange(int16_t value) { float range = static_cast(value) / 32768.0f; if (Mathf::FAbs(range) < 0.01f) { return 0.0f; } if (range < -0.99f) { return -1.0f; } else if (range > 0.99f) { return 1.0f; } return range; } void JoystickManager::addControllerGuid(Joystick* joystick) { if (!joystick->isController()) { return; } std::pair::iterator, bool> ret; ret = m_gamepadGuids.insert(std::pair(joystick->getGuid(), 1)); if (ret.second == false) { ++ret.first->second; } } void JoystickManager::removeControllerGuid(Joystick* joystick) { if (!joystick->isController()) { return; } std::map::iterator it = m_gamepadGuids.find(joystick->getGuid()); if (it != m_gamepadGuids.end()) { --it->second; } } } fifengine-0.4.2/engine/core/eventchannel/joystick/joystickmanager.h000066400000000000000000000124401341615052600255240ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_EVENTCHANNEL_JOYSTICKMANAGER_H #define FIFE_EVENTCHANNEL_JOYSTICKMANAGER_H // Standard C++ library includes // #include #include #include #include // 3rd party library includes // // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder // #include "loaders/native/input/controllermappingloader.h" #include "savers/native/input/controllermappingsaver.h" #include "util/base/fife_stdint.h" #include "ijoystickcontroller.h" #include "ijoysticklistener.h" #include "joystickevent.h" #include "joystick.h" namespace FIFE { /** Joystick Manager manages all events related to Joysticks and Gamecontrollers */ class JoystickManager: public IJoystickController, public IEventSource { public: /** Constructor. */ JoystickManager(); /** Destructor */ virtual ~JoystickManager(); /** Adds a joystick with the given device index. */ Joystick* addJoystick(int32_t deviceIndex); /** Return the joystick with the given instance id. */ Joystick* getJoystick(int32_t instanceId); /** Removes the given joystick, can be reused. */ void removeJoystick(Joystick* joystick); /** Return the number of joysticks / gamecontrollers. */ uint8_t getJoystickCount() const; /** Loads controller mappings from given file and if possible, it opens the related controllers. */ void loadMapping(const std::string& file); /** Saves controller mapping for given GUID in the specified file. */ void saveMapping(const std::string guid, const std::string& file); /** Saves all controller mappings that were used during the season. */ void saveMappings(const std::string& file); /** Return the controller mapping for given GUID as string. */ std::string getStringMapping(const std::string& guid); /** Sets controller mapping from string and adds or updates the related controllers. */ void setStringMapping(const std::string& mapping); // Implementation from IJoystickController. void addJoystickListener(IJoystickListener* listener); void addJoystickListenerFront(IJoystickListener* listener); void removeJoystickListener(IJoystickListener* listener); /** Creates and process joystick events. */ void processJoystickEvent(SDL_Event event); /** Creates and process gamecontroller events. */ void processControllerEvent(SDL_Event event); /** Dispatches joystick / controller events. */ void dispatchJoystickEvent(JoystickEvent& evt); // Implementation from IEventSource. EventSourceType getEventSourceType(); private: /** Return GUID for given device index as string. */ std::string getGuidString(int32_t deviceIndex); /** Converts the int16 in -1.0 to 1.0 range. */ float convertRange(int16_t value); /** Adds GUID from controller. Needed for saving. */ void addControllerGuid(Joystick* joystick); /** Removes / decal controller GUID. */ void removeControllerGuid(Joystick* joystick); //! Loader for gamecontroller mapping. ControllerMappingLoader m_mappingLoader; //! Saver for gamecontroller mapping. ControllerMappingSaver m_mappingSaver; //! All active / connected Joysticks. std::vector m_activeJoysticks; //! All "known" Joysticks. Useful if a user reconnect a Joystick. std::vector m_joysticks; //! Map to hold the relation between Joystick InstanceId and JoystickId std::map m_joystickIndices; //! Each sort of gamepad have a GUID from SDL. Indicates the number of gamepads with given GUID are connected. std::map m_gamepadGuids; //! The Joystick listeners. std::deque m_joystickListeners; }; } //FIFE #endif fifengine-0.4.2/engine/core/eventchannel/key/000077500000000000000000000000001341615052600211115ustar00rootroot00000000000000fifengine-0.4.2/engine/core/eventchannel/key/ikeycontroller.h000066400000000000000000000054611341615052600243350ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_EVENTCHANNEL_IKEY_CONTROLLER_H #define FIFE_EVENTCHANNEL_IKEY_CONTROLLER_H // Standard C++ library includes // // 3rd party library includes // // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder // namespace FIFE { class IKeyListener; /** Controller provides a way to receive events from the system * Using this interface, clients can subscribe themselves to receive events */ class IKeyController { public: /** Adds a listener to the back of the listener deque * Listener will be notified via the corresponding events * @param listener listener to add */ virtual void addKeyListener(IKeyListener* listener) = 0; /** Adds a listener to the front of the listener deque * Listener will be notified via the corresponding events * @param listener listener to add */ virtual void addKeyListenerFront(IKeyListener* listener) = 0; /** Removes an added listener from the controller. * Listener will not be notified anymore via the corresponding events * @param listener listener to remove */ virtual void removeKeyListener(IKeyListener* listener) = 0; virtual ~IKeyController() {} }; } //FIFE #endif fifengine-0.4.2/engine/core/eventchannel/key/ikeyfilter.h000066400000000000000000000044171341615052600234370ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_EVENTCHANNEL_IKEYFILTER_H #define FIFE_EVENTCHANNEL_IKEYFILTER_H // Standard C++ library includes // // 3rd party library includes // // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder // #include "keyevent.h" namespace FIFE { /** Controller provides a way to receive events from the system * Using this interface, clients can subscribe themselves to receive events */ class IKeyFilter { public: /** Check whether a keyevent should be filtered out. * @param event They key event. */ virtual bool isFiltered(const KeyEvent& event) = 0; virtual ~IKeyFilter() {} }; } //FIFE #endif fifengine-0.4.2/engine/core/eventchannel/key/ikeylistener.h000066400000000000000000000061561341615052600240010ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_EVENTCHANNEL_IKEYLISTENER_H #define FIFE_EVENTCHANNEL_IKEYLISTENER_H // Standard C++ library includes // // 3rd party library includes // // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "eventchannel/base/ilistener.h" namespace FIFE { class KeyEvent; /** Listener of key events. * To be able to listen for key events you must make a class which inherits * from this class and implements its functions. */ class IKeyListener : public IListener { public: /** Called if a key is pressed * If a key is held down the multiple key presses are generated. * @param evt KeyEvent that describes the event. */ virtual void keyPressed(KeyEvent& evt) = 0; /** Called if a key is released * @param evt KeyEvent that describes the event. */ virtual void keyReleased(KeyEvent& evt) = 0; /** Indicates if this is a global listener * Global listener can also receive events that are consumed by widgets / gui. * Default value is false. */ virtual bool isGlobalListener() const { return m_global; } /** Changes the behaviour of the listener to be global or not. * Global listener can also receive events that are consumed by widgets / gui. * @param global The value to change the behaviour of this listener. */ virtual void setGlobalListener(bool global) { m_global = global; } virtual ~IKeyListener() {} protected: IKeyListener() { m_global = false; } private: bool m_global; }; } //FIFE #endif fifengine-0.4.2/engine/core/eventchannel/key/key.h000066400000000000000000000225021341615052600220530ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_EVENTCHANNEL_KEY_H #define FIFE_EVENTCHANNEL_KEY_H // Standard C++ library includes // // 3rd party library includes // #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder // namespace FIFE { /** Represents a key. */ class Key { public: /** Codes for different keys */ enum KeyType { INVALID_KEY = SDLK_UNKNOWN, ENTER = SDLK_RETURN, ESCAPE = SDLK_ESCAPE, BACKSPACE = SDLK_BACKSPACE, TAB = SDLK_TAB, SPACE = SDLK_SPACE, EXCLAIM = SDLK_EXCLAIM, QUOTEDBL = SDLK_QUOTEDBL, HASH = SDLK_HASH, PERCENT = SDLK_PERCENT, DOLLAR = SDLK_DOLLAR, AMPERSAND = SDLK_AMPERSAND, QUOTE = SDLK_QUOTE, LEFTPAREN = SDLK_LEFTPAREN, RIGHTPAREN = SDLK_RIGHTPAREN, ASTERISK = SDLK_ASTERISK, PLUS = SDLK_PLUS, COMMA = SDLK_COMMA, MINUS = SDLK_MINUS, PERIOD = SDLK_PERIOD, SLASH = SDLK_SLASH, NUM_0 = SDLK_0, NUM_1 = SDLK_1, NUM_2 = SDLK_2, NUM_3 = SDLK_3, NUM_4 = SDLK_4, NUM_5 = SDLK_5, NUM_6 = SDLK_6, NUM_7 = SDLK_7, NUM_8 = SDLK_8, NUM_9 = SDLK_9, COLON = SDLK_COLON, SEMICOLON = SDLK_SEMICOLON, LESS = SDLK_LESS, EQUALS = SDLK_EQUALS, GREATER = SDLK_GREATER, QUESTION = SDLK_QUESTION, AT = SDLK_AT, LEFTBRACKET = SDLK_LEFTBRACKET, BACKSLASH = SDLK_BACKSLASH, RIGHTBRACKET = SDLK_RIGHTBRACKET, CARET = SDLK_CARET, UNDERSCORE = SDLK_UNDERSCORE, BACKQUOTE = SDLK_BACKQUOTE, A = SDLK_a, B = SDLK_b, C = SDLK_c, D = SDLK_d, E = SDLK_e, F = SDLK_f, G = SDLK_g, H = SDLK_h, I = SDLK_i, J = SDLK_j, K = SDLK_k, L = SDLK_l, M = SDLK_m, N = SDLK_n, O = SDLK_o, P = SDLK_p, Q = SDLK_q, R = SDLK_r, S = SDLK_s, T = SDLK_t, U = SDLK_u, V = SDLK_v, W = SDLK_w, X = SDLK_x, Y = SDLK_y, Z = SDLK_z, CAPS_LOCK = SDLK_CAPSLOCK, F1 = SDLK_F1, F2 = SDLK_F2, F3 = SDLK_F3, F4 = SDLK_F4, F5 = SDLK_F5, F6 = SDLK_F6, F7 = SDLK_F7, F8 = SDLK_F8, F9 = SDLK_F9, F10 = SDLK_F10, F11 = SDLK_F11, F12 = SDLK_F12, PRINT_SCREEN = SDLK_PRINTSCREEN, SCROLL_LOCK = SDLK_SCROLLLOCK, PAUSE = SDLK_PAUSE, INSERT = SDLK_INSERT, HOME = SDLK_HOME, PAGE_UP = SDLK_PAGEUP, DELETE = SDLK_DELETE, END = SDLK_END, PAGE_DOWN = SDLK_PAGEDOWN, RIGHT = SDLK_RIGHT, LEFT = SDLK_LEFT, DOWN = SDLK_DOWN, UP = SDLK_UP, NUM_LOCK = SDLK_NUMLOCKCLEAR, KP_DIVIDE = SDLK_KP_DIVIDE, KP_MULTIPLY = SDLK_KP_MULTIPLY, KP_MINUS = SDLK_KP_MINUS, KP_PLUS = SDLK_KP_PLUS, KP_ENTER = SDLK_KP_ENTER, KP_0 = SDLK_KP_0, KP_1 = SDLK_KP_1, KP_2 = SDLK_KP_2, KP_3 = SDLK_KP_3, KP_4 = SDLK_KP_4, KP_5 = SDLK_KP_5, KP_6 = SDLK_KP_6, KP_7 = SDLK_KP_7, KP_8 = SDLK_KP_8, KP_9 = SDLK_KP_9, KP_PERIOD = SDLK_KP_PERIOD, APPLICATION = SDLK_APPLICATION, POWER = SDLK_POWER, KP_EQUALS = SDLK_KP_EQUALS, F13 = SDLK_F13, F14 = SDLK_F14, F15 = SDLK_F15, F16 = SDLK_F16, F17 = SDLK_F17, F18 = SDLK_F18, F19 = SDLK_F19, F20 = SDLK_F20, F21 = SDLK_F21, F22 = SDLK_F22, F23 = SDLK_F23, F24 = SDLK_F24, EXECUTE = SDLK_EXECUTE, HELP = SDLK_HELP, MENU = SDLK_MENU, SELECT = SDLK_SELECT, STOP = SDLK_STOP, AGAIN = SDLK_AGAIN, UNDO = SDLK_UNDO, CUT = SDLK_CUT, COPY = SDLK_COPY, PASTE = SDLK_PASTE, FIND = SDLK_FIND, MUTE = SDLK_MUTE, VOLUME_UP = SDLK_VOLUMEUP, VOLUME_DOWN = SDLK_VOLUMEDOWN, KP_COMMA = SDLK_KP_COMMA, KP_EQUALSAS400 = SDLK_KP_EQUALSAS400, ERASE = SDLK_ALTERASE, SYS_REQ = SDLK_SYSREQ, CANCEL = SDLK_CANCEL, CLEAR = SDLK_CLEAR, PRIOR = SDLK_PRIOR, RETURN = SDLK_RETURN2, SEPARATOR = SDLK_SEPARATOR, FORTH = SDLK_OUT, OPER = SDLK_OPER, CLEAR_AGAIN = SDLK_CLEARAGAIN, CR_SEL = SDLK_CRSEL, EX_SEL = SDLK_EXSEL, KP_00 = SDLK_KP_00, KP_000 = SDLK_KP_000, THOUSANDS_SEPARATOR = SDLK_THOUSANDSSEPARATOR, DECIMAL_SEPARATOR = SDLK_DECIMALSEPARATOR, CURRENCY_UNIT = SDLK_CURRENCYUNIT, CURRENCY_SUBUNIT = SDLK_CURRENCYSUBUNIT, KP_LEFTPAREN = SDLK_KP_LEFTPAREN, KP_RIGHTPAREN = SDLK_KP_RIGHTPAREN, KP_LEFTBRACE = SDLK_KP_LEFTBRACE, KP_RIGHTBRACE = SDLK_KP_RIGHTBRACE, KP_TAB = SDLK_KP_TAB, KP_BACKSPACE = SDLK_KP_BACKSPACE, KP_A = SDLK_KP_A, KP_B = SDLK_KP_B, KP_C = SDLK_KP_C, KP_D = SDLK_KP_D, KP_E = SDLK_KP_E, KP_F = SDLK_KP_F, KP_XOR = SDLK_KP_XOR, KP_POWER = SDLK_KP_POWER, KP_PERCENT = SDLK_KP_PERCENT, KP_LESS = SDLK_KP_LESS, KP_GREATER = SDLK_KP_GREATER, KP_AMPERSAND = SDLK_KP_AMPERSAND, KP_DBLAMPERSAND = SDLK_KP_DBLAMPERSAND, KP_VERTICALBAR = SDLK_KP_VERTICALBAR, KP_DBLVERTICALBAR = SDLK_KP_DBLVERTICALBAR, KP_COLON = SDLK_KP_COLON, KP_HASH = SDLK_KP_HASH, KP_SPACE = SDLK_KP_SPACE, KP_AT = SDLK_KP_AT, KP_EXCLAM = SDLK_KP_EXCLAM, KP_MEMSTORE = SDLK_KP_MEMSTORE, KP_MEMRECALL = SDLK_KP_MEMRECALL, KP_MEMCLEAR = SDLK_KP_MEMCLEAR, KP_MEMADD = SDLK_KP_MEMADD, KP_MEMSUBSTRACT = SDLK_KP_MEMSUBTRACT, KP_MEMMULTIPLY = SDLK_KP_MEMMULTIPLY, KP_MEMDIVIDE = SDLK_KP_MEMDIVIDE, KP_PLUSMINUS = SDLK_KP_PLUSMINUS, KP_CLEAR = SDLK_KP_CLEAR, KP_CLEARENTRY = SDLK_KP_CLEARENTRY, KP_BINARY = SDLK_KP_BINARY, KP_OCTAL = SDLK_KP_OCTAL, KP_DECIMAL = SDLK_KP_DECIMAL, KP_HEXADECIMAL = SDLK_KP_HEXADECIMAL, LEFT_CONTROL = SDLK_LCTRL, LEFT_SHIFT = SDLK_LSHIFT, LEFT_ALT = SDLK_LALT, LEFT_SUPER = SDLK_LGUI, RIGHT_CONTROL = SDLK_RCTRL, RIGHT_SHIFT = SDLK_RSHIFT, RIGHT_ALT = SDLK_RALT, RIGHT_SUPER = SDLK_RGUI, ALT_GR = SDLK_MODE, AUDIO_NEXT = SDLK_AUDIONEXT, AUDIO_PREV = SDLK_AUDIOPREV, AUDIO_STOP = SDLK_AUDIOSTOP, AUDIO_PLAY = SDLK_AUDIOPLAY, AUDIO_MUTE = SDLK_AUDIOMUTE, MEDIASELECT = SDLK_MEDIASELECT, WWW = SDLK_WWW, MAIL = SDLK_MAIL, CALCULATOR = SDLK_CALCULATOR, COMPUTER = SDLK_COMPUTER, AC_SEARCH = SDLK_AC_SEARCH, AC_HOME = SDLK_AC_HOME, AC_BACK = SDLK_AC_BACK, AC_FORWARD = SDLK_AC_FORWARD, AC_STOP = SDLK_AC_STOP, AC_REFRESH = SDLK_AC_REFRESH, AC_BOOKMARKS = SDLK_AC_BOOKMARKS, BRIGHTNESS_DOWN = SDLK_BRIGHTNESSDOWN, BRIGHTNESS_UP = SDLK_BRIGHTNESSUP, DISPLAY_SWITCH = SDLK_DISPLAYSWITCH, ILLUM_TOGGLE = SDLK_KBDILLUMTOGGLE, ILLUM_DOWN = SDLK_KBDILLUMDOWN, ILLUM_UP = SDLK_KBDILLUMUP, EJECT = SDLK_EJECT, SLEEP = SDLK_SLEEP }; /** Constructor * @param key value of the key */ Key(KeyType key = INVALID_KEY): m_key(key) {} /** Destructor. */ virtual ~Key() {} /** Tells whether the Key can be represented as a string. */ bool isPrintable() const { std::string name = getAsString(); if (!name.empty()) { return true; } return false; } bool isFunctionKey() const { // ToDo return (m_key >= F1 && m_key <= F12) || (m_key >= F13 && m_key <= F24); } /** Gets the value of the key. */ KeyType getValue() const { return m_key; } /** Gets the string representation of the key, encoded as UTF-8. */ std::string getAsString() const { std::string name(SDL_GetKeyName(static_cast(m_key))); return name; } private: KeyType m_key; }; } //FIFE #endif fifengine-0.4.2/engine/core/eventchannel/key/keyevent.h000066400000000000000000000102361341615052600231160ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_EVENTCHANNEL_KEYEVENT_H #define FIFE_EVENTCHANNEL_KEYEVENT_H // Standard C++ library includes // // 3rd party library includes // // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder // #include "eventchannel/base/inputevent.h" #include "eventchannel/source/ieventsource.h" #include "key.h" namespace FIFE { /** Class for key events */ class KeyEvent: public InputEvent { public: enum KeyEventType { UNKNOWN = -1, PRESSED = 0, RELEASED }; /** Constructor */ KeyEvent(): InputEvent(), m_eventType(UNKNOWN), m_isNumericPad(false), m_key(Key()) {} /** Destructor. */ virtual ~KeyEvent() {} KeyEventType getType() const { return m_eventType; } void setType(KeyEventType type) { m_eventType = type; } bool isNumericPad() const { return m_isNumericPad; } void setNumericPad(bool ispad) { m_isNumericPad = ispad; } const Key& getKey() const { return m_key; } void setKey(const Key& key) { m_key = key; } virtual bool isAltPressed() const { return InputEvent::isAltPressed(); } virtual void setAltPressed(bool pressed) { InputEvent::setAltPressed(pressed); } virtual bool isControlPressed() const { return InputEvent::isControlPressed(); } virtual void setControlPressed(bool pressed) { InputEvent::setControlPressed(pressed); } virtual bool isMetaPressed() const { return InputEvent::isMetaPressed(); } virtual void setMetaPressed(bool pressed) { InputEvent::setMetaPressed(pressed); } virtual bool isShiftPressed() const { return InputEvent::isShiftPressed(); } virtual void setShiftPressed(bool pressed) { InputEvent::setShiftPressed(pressed); } virtual void consume() { InputEvent::consume(); } virtual bool isConsumed() const { return InputEvent::isConsumed(); } virtual void consumedByWidgets() { InputEvent::consumedByWidgets(); } virtual bool isConsumedByWidgets() const { return InputEvent::isConsumedByWidgets(); } virtual IEventSource* getSource() const { return InputEvent::getSource(); } virtual void setSource(IEventSource* source) { InputEvent::setSource(source); } virtual int32_t getTimeStamp() const { return InputEvent::getTimeStamp(); } virtual void setTimeStamp(int32_t timestamp ) { InputEvent::setTimeStamp(timestamp); } virtual const std::string& getName() const { const static std::string eventName("KeyEvent"); return eventName; } virtual std::string getDebugString() const { return InputEvent::getDebugString(); } private: KeyEventType m_eventType; bool m_isNumericPad; Key m_key; }; } //FIFE #endif fifengine-0.4.2/engine/core/eventchannel/mouse/000077500000000000000000000000001341615052600214515ustar00rootroot00000000000000fifengine-0.4.2/engine/core/eventchannel/mouse/imousecontroller.h000066400000000000000000000055071341615052600252360ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_EVENTCHANNEL_IMOUSE_CONTROLLER_H #define FIFE_EVENTCHANNEL_IMOUSE_CONTROLLER_H // Standard C++ library includes // // 3rd party library includes // // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder // namespace FIFE { class IMouseListener; /** Controller provides a way to receive events from the system * Using this interface, clients can subscribe themselves to receive events */ class IMouseController { public: /** Adds a listener to the back of the listener deque * Listener will be notified via the corresponding events * @param listener listener to add */ virtual void addMouseListener(IMouseListener* listener) = 0; /** Adds a listener to the front of the listener deque * Listener will be notified via the corresponding events * @param listener listener to add */ virtual void addMouseListenerFront(IMouseListener* listener) = 0; /** Removes an added listener from the controller. * Listener will not be notified anymore via the corresponding events * @param listener listener to remove */ virtual void removeMouseListener(IMouseListener* listener) = 0; virtual ~IMouseController() {} }; } //FIFE #endif fifengine-0.4.2/engine/core/eventchannel/mouse/imouselistener.h000066400000000000000000000115171341615052600246760ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_EVENTCHANNEL_IMOUSELISTENER_H #define FIFE_EVENTCHANNEL_IMOUSELISTENER_H // Standard C++ library includes // // 3rd party library includes // // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "eventchannel/base/ilistener.h" namespace FIFE { class MouseEvent; /** Listener of mouse events. * To be able to listen for mouse events you must make a class which inherits * from this class and implements its functions. */ class IMouseListener : public IListener { public: /** * Called when the mouse has entered into the event source area. * @param evt describes the event. */ virtual void mouseEntered(MouseEvent& evt) = 0; /** * Called when the mouse has exited the event source area. * @param evt describes the event. */ virtual void mouseExited(MouseEvent& evt) = 0; /** * Called when a mouse button has been pressed on the event source area. * NOTE: A mouse press is NOT equal to a mouse click. * @param evt describes the event. */ virtual void mousePressed(MouseEvent& evt) = 0; /** * Called when a mouse button has been released on the event source area. * @param evt describes the event. */ virtual void mouseReleased(MouseEvent& evt) = 0; /** * Called when a mouse button is pressed and released (clicked) on * the event source area. * @param evt describes the event. */ virtual void mouseClicked(MouseEvent& evt) = 0; /** * Called when the mouse wheel has moved up on the event source area. * @param evt describes the event. */ virtual void mouseWheelMovedUp(MouseEvent& evt) = 0; /** * Called when the mouse wheel has moved down on the event source area. * @param evt MouseEvent that describes the event. */ virtual void mouseWheelMovedDown(MouseEvent& evt) = 0; /** * Called when the mouse wheel has moved right on the event source area. * @param evt describes the event. */ virtual void mouseWheelMovedRight(MouseEvent& evt) = 0; /** * Called when the mouse wheel has moved left on the event source area. * @param evt MouseEvent that describes the event. */ virtual void mouseWheelMovedLeft(MouseEvent& evt) = 0; /** * Called when the mouse has moved in the event source area and no mouse button * has been pressed * @param evt describes the event. */ virtual void mouseMoved(MouseEvent& evt) = 0; /** * Called when the mouse has moved and the mouse has previously been * pressed on the event source. * @param evt describes the event. */ virtual void mouseDragged(MouseEvent& evt) = 0; /** Indicates if this is a global listener * Global listener can also receive events that are consumed by widgets / gui. * Default value is false. */ virtual bool isGlobalListener() const { return m_global; } /** Changes the behaviour of the listener to be global or not. * Global listener can also receive events that are consumed by widgets / gui. * @param global The value to change the behaviour of this listener. */ virtual void setGlobalListener(bool global) { m_global = global; } virtual ~IMouseListener() {} protected: IMouseListener() { m_global = false; } private: bool m_global; }; } //FIFE #endif fifengine-0.4.2/engine/core/eventchannel/mouse/mouseevent.h000066400000000000000000000157401341615052600240230ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_EVENTCHANNEL_MOUSEEVENT_H #define FIFE_EVENTCHANNEL_MOUSEEVENT_H // Standard C++ library includes // // 3rd party library includes // // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder // #include "eventchannel/base/inputevent.h" namespace FIFE { /** Class for mouse events */ class MouseEvent: public InputEvent { public: /** * Mouse event types. */ enum MouseEventType { UNKNOWN_EVENT = -1, MOVED = 0, PRESSED, RELEASED, WHEEL_MOVED_DOWN, WHEEL_MOVED_UP, WHEEL_MOVED_RIGHT, WHEEL_MOVED_LEFT, CLICKED, ENTERED, EXITED, DRAGGED }; /** * Mouse button types. */ enum MouseButtonType { EMPTY = 0, LEFT = 1, RIGHT = 2, MIDDLE = 4, X1 = 8, X2 = 16, UNKNOWN_BUTTON = 32 }; /** Constructor. */ MouseEvent(): InputEvent(), m_eventType(UNKNOWN_EVENT), m_buttonType(UNKNOWN_BUTTON), m_x(-1), m_y(-1) {} /** Destructor. */ virtual ~MouseEvent() {} /** * Gets the button of the mouse event. * @return the button of the mouse event. */ MouseButtonType getButton() const { return m_buttonType; } void setButton(MouseButtonType type) { m_buttonType = type; } /** * Gets the type of the event. * @return the type of the event. */ MouseEventType getType() const { return m_eventType; } void setType(MouseEventType type) { m_eventType = type; } /** * Gets the x coordinate of the mouse event. The coordinate is relative to * the source event source. * @return the x coordinate of the mouse event. */ int32_t getX() const { return m_x; } void setX(int32_t x) { m_x = x; } /** * Gets the y coordinate of the mouse event. The coordinate is relative to * the source event source. * @return the y coordinate of the mouse event. */ int32_t getY() const { return m_y; } void setY(int32_t y) { m_y = y; } virtual bool isAltPressed() const { return InputEvent::isAltPressed(); } virtual void setAltPressed(bool pressed) { InputEvent::setAltPressed(pressed); } virtual bool isControlPressed() const { return InputEvent::isControlPressed(); } virtual void setControlPressed(bool pressed) { InputEvent::setControlPressed(pressed); } virtual bool isMetaPressed() const { return InputEvent::isMetaPressed(); } virtual void setMetaPressed(bool pressed) { InputEvent::setMetaPressed(pressed); } virtual bool isShiftPressed() const { return InputEvent::isShiftPressed(); } virtual void setShiftPressed(bool pressed) { InputEvent::setShiftPressed(pressed); } virtual void consume() { InputEvent::consume(); } virtual bool isConsumed() const { return InputEvent::isConsumed(); } virtual void consumedByWidgets() { InputEvent::consumedByWidgets(); } virtual bool isConsumedByWidgets() const { return InputEvent::isConsumedByWidgets(); } virtual IEventSource* getSource() const { return InputEvent::getSource(); } virtual void setSource(IEventSource* source) { InputEvent::setSource(source); } virtual int32_t getTimeStamp() const { return InputEvent::getTimeStamp(); } virtual void setTimeStamp(int32_t timestamp ) { InputEvent::setTimeStamp(timestamp); } virtual const std::string& getName() const { const static std::string eventName("MouseEvent"); return eventName; } virtual std::string getDebugString() const { return InputEvent::getDebugString(); } virtual std::string getAttrStr() const { std::stringstream ss; ss << InputEvent::getAttrStr() << std::endl; ss << "event = " << mouseEventType2str(m_eventType) << ", "; ss << "button = " << mouseButtonType2str(m_buttonType) << ", "; ss << "x = " << m_x << ", "; ss << "y = " << m_y; return ss.str(); } /** Returns string representation of given event type */ inline static std::string mouseEventType2str(MouseEventType t) { std::string s("unknown"); switch (t) { case MouseEvent::MOVED: s = "moved"; break; case MouseEvent::PRESSED: s = "pressed"; break; case MouseEvent::RELEASED: s = "released"; break; case MouseEvent::WHEEL_MOVED_DOWN: s = "wheel_moved_down"; break; case MouseEvent::WHEEL_MOVED_UP: s = "wheel_moved_up"; break; case MouseEvent::WHEEL_MOVED_RIGHT: s = "wheel_moved_right"; break; case MouseEvent::WHEEL_MOVED_LEFT: s = "wheel_moved_left"; break; case MouseEvent::CLICKED: s = "clicked"; break; case MouseEvent::ENTERED: s = "entered"; break; case MouseEvent::EXITED: s = "excited"; break; case MouseEvent::DRAGGED: s = "dragged"; break; default: break; } return s; } /** Returns string representation of given button type */ inline static std::string mouseButtonType2str(MouseButtonType t) { std::string s("unknown"); switch (t) { case MouseEvent::EMPTY: s = "empty"; break; case MouseEvent::LEFT: s = "left"; break; case MouseEvent::RIGHT: s = "right"; break; case MouseEvent::MIDDLE: s = "middle"; break; case MouseEvent::X1: s = "x1"; break; case MouseEvent::X2: s = "x2"; break; case MouseEvent::UNKNOWN_BUTTON: s = "unknown button"; break; default: break; } return s; } private: MouseEventType m_eventType; MouseButtonType m_buttonType; int32_t m_x; int32_t m_y; }; } //FIFE #endif fifengine-0.4.2/engine/core/eventchannel/sdl/000077500000000000000000000000001341615052600211035ustar00rootroot00000000000000fifengine-0.4.2/engine/core/eventchannel/sdl/isdleventcontroller.h000066400000000000000000000055501341615052600253620ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_EVENTCHANNEL_ISDLEVENT_CONTROLLER_H #define FIFE_EVENTCHANNEL_ISDLEVENT_CONTROLLER_H // Standard C++ library includes // // 3rd party library includes // // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder // namespace FIFE { class ISdlEventListener; /** Controller provides a way to receive events from the system * Using this interface, clients can subscribe themselves to receive events */ class ISdlEventController { public: /** Adds a listener to the back of the listener deque * Listener will be notified via the corresponding events * @param listener listener to add */ virtual void addSdlEventListener(ISdlEventListener* listener) = 0; /** Adds a listener to the front of the listener deque * Listener will be notified via the corresponding events * @param listener listener to add */ virtual void addSdlEventListenerFront(ISdlEventListener* listener) = 0; /** Removes an added listener from the controller. * Listener will not be notified anymore via the corresponding events * @param listener listener to remove */ virtual void removeSdlEventListener(ISdlEventListener* listener) = 0; virtual ~ISdlEventController() {} }; } //FIFE #endif fifengine-0.4.2/engine/core/eventchannel/sdl/isdleventlistener.h000066400000000000000000000045441341615052600250260ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_EVENTCHANNEL_ISDLEVENTLISTENER_H #define FIFE_EVENTCHANNEL_ISDLEVENTLISTENER_H // Standard C++ library includes // // 3rd party library includes // // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "eventchannel/base/ilistener.h" union SDL_Event; namespace FIFE { /** Listener of SDL events. * To be able to listen for commands you must make a class which inherits * from this class and implements the onSdlEvent function. */ class ISdlEventListener : public IListener { public: /** Called when an SDL event is received from SDL * @param evt SDL event */ virtual bool onSdlEvent(SDL_Event& evt) = 0; virtual ~ISdlEventListener() {} }; } //FIFE #endif fifengine-0.4.2/engine/core/eventchannel/source/000077500000000000000000000000001341615052600216215ustar00rootroot00000000000000fifengine-0.4.2/engine/core/eventchannel/source/eventsourcetypes.h000066400000000000000000000041041341615052600254200ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_EVENTCHANNEL_EVENTSOURCETYPES_H #define FIFE_EVENTCHANNEL_EVENTSOURCETYPES_H // Standard C++ library includes // // 3rd party library includes // // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder // namespace FIFE { /** Types for different event sources */ enum EventSourceType { ES_ENGINE = 1, ES_FIFECHAN_WIDGET = 2, ES_CEGUI_WIDGET = 3, ES_LIBROCKET_WIDGET = 4 }; } //FIFE #endif fifengine-0.4.2/engine/core/eventchannel/source/ieventsource.h000066400000000000000000000043041341615052600245060ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_EVENTCHANNEL_IEVENTSOURCE_H #define FIFE_EVENTCHANNEL_IEVENTSOURCE_H // Standard C++ library includes // // 3rd party library includes // // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder // #include "eventsourcetypes.h" namespace FIFE { /** Representation of event source (a thing sending events) */ class IEventSource { public: /** Gets the source type of this event * @return source type of this event */ virtual EventSourceType getEventSourceType() = 0; virtual ~IEventSource() {} }; } //FIFE #endif fifengine-0.4.2/engine/core/eventchannel/text/000077500000000000000000000000001341615052600213055ustar00rootroot00000000000000fifengine-0.4.2/engine/core/eventchannel/text/itextcontroller.h000066400000000000000000000054741341615052600247310ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_EVENTCHANNEL_ITEXT_CONTROLLER_H #define FIFE_EVENTCHANNEL_ITEXT_CONTROLLER_H // Standard C++ library includes // // 3rd party library includes // // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder // namespace FIFE { class ITextListener; /** Controller provides a way to receive events from the system * Using this interface, clients can subscribe themselves to receive events */ class ITextController { public: /** Adds a listener to the back of the listener deque * Listener will be notified via the corresponding events * @param listener listener to add */ virtual void addTextListener(ITextListener* listener) = 0; /** Adds a listener to the front of the listener deque * Listener will be notified via the corresponding events * @param listener listener to add */ virtual void addTextListenerFront(ITextListener* listener) = 0; /** Removes an added listener from the controller. * Listener will not be notified anymore via the corresponding events * @param listener listener to remove */ virtual void removeTextListener(ITextListener* listener) = 0; virtual ~ITextController() {} }; } //FIFE #endif fifengine-0.4.2/engine/core/eventchannel/text/itextlistener.h000066400000000000000000000047421341615052600243700ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_EVENTCHANNEL_ITEXTLISTENER_H #define FIFE_EVENTCHANNEL_ITEXTLISTENER_H // Standard C++ library includes // // 3rd party library includes // // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "eventchannel/base/ilistener.h" namespace FIFE { class TextEvent; /** Listener of text events. * To be able to listen for text events you must make a class which inherits * from this class and implements its functions. */ class ITextListener : public IListener { public: /** Called on a text input event. * @param evt TextEvent that describes the event. */ virtual void textInput(TextEvent& evt) = 0; /** Called on a text edit event. * @param evt TextEvent that describes the event. */ virtual void textEdit(TextEvent& evt) = 0; virtual ~ITextListener() {} }; } //FIFE #endif fifengine-0.4.2/engine/core/eventchannel/text/text.h000066400000000000000000000056301341615052600224460ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_EVENTCHANNEL_TEXT_H #define FIFE_EVENTCHANNEL_TEXT_H // Standard C++ library includes // // 3rd party library includes // // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder // namespace FIFE { /** Represents a text. */ class Text { public: /** Constructor * @param text pointer to the UTF-8 text * @param start point of the text edit event * @param length length of the text edit event */ Text(const char* text = 0, int32_t start = 0, int32_t length = 0): m_text(text ? text : ""), m_start(start), m_length(length) {} /** Destructor */ virtual ~Text() {} /** Tells whether the Text can be represented as a string. */ bool isPrintable() const { if (!m_text.empty()) { return true; } return false; } /** Gets the string, encoded as UTF-8. */ std::string getAsString() const { return m_text; } /** Gets the start point of the text edit event, cursor position. */ int32_t getStart() const { return m_start; } /** Gets the length of the text edit event, * the number of characters to edit from the start point. */ int32_t getLength() const { return m_length; } private: std::string m_text; int32_t m_start; int32_t m_length; }; } //FIFE #endif fifengine-0.4.2/engine/core/eventchannel/text/textevent.h000066400000000000000000000065731341615052600235170ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_EVENTCHANNEL_TEXTEVENT_H #define FIFE_EVENTCHANNEL_TEXTEVENT_H // Standard C++ library includes // // 3rd party library includes // // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder // #include "eventchannel/base/inputevent.h" #include "eventchannel/source/ieventsource.h" #include "text.h" namespace FIFE { /** Class for text events */ class TextEvent: public InputEvent { public: enum TextEventType { UNKNOWN = 0, INPUT = 1, EDIT = 2 }; /** Constructor */ TextEvent(): InputEvent(), m_eventType(UNKNOWN), m_text(Text()) {} /** Destructor. */ virtual ~TextEvent() {} TextEventType getType() const { return m_eventType; } void setType(TextEventType type) { m_eventType = type; } const Text& getText() const { return m_text; } void setText(const Text& text) { m_text = text; } virtual void consume() { InputEvent::consume(); } virtual bool isConsumed() const { return InputEvent::isConsumed(); } virtual void consumedByWidgets() { InputEvent::consumedByWidgets(); } virtual bool isConsumedByWidgets() const { return InputEvent::isConsumedByWidgets(); } virtual IEventSource* getSource() const { return InputEvent::getSource(); } virtual void setSource(IEventSource* source) { InputEvent::setSource(source); } virtual int32_t getTimeStamp() const { return InputEvent::getTimeStamp(); } virtual void setTimeStamp(int32_t timestamp ) { InputEvent::setTimeStamp(timestamp); } virtual const std::string& getName() const { const static std::string eventName("TextEvent"); return eventName; } virtual std::string getDebugString() const { return InputEvent::getDebugString(); } private: TextEventType m_eventType; Text m_text; }; } //FIFE #endif fifengine-0.4.2/engine/core/export.h000066400000000000000000000042101341615052600173360ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_EXPORT_H #define FIFE_EXPORT_H #if defined _WIN32 || defined __CYGWIN__ #ifdef FIFE_EXPORTING #ifdef __GNUC__ #define FIFE_PUBLIC __attribute__((dllexport)) #else #define FIFE_PUBLIC __declspec(dllexport) #endif #else #ifdef __GNUC__ #define FIFE_PUBLIC __attribute__((dllimport)) #else #define FIFE_PUBLIC __declspec(dllimport) #endif #endif #define FIFE_HIDDEN #else #if __GNUC__ >= 4 #define FIFE_PUBLIC __attribute__((visibility("default"))) #define FIFE_HIDDEN __attribute__((visibility("hidden"))) #else #define FIFE_PUBLIC #define FIFE_HIDDEN #endif #endif #endif //FIFE_EXPORT_H fifengine-0.4.2/engine/core/gui/000077500000000000000000000000001341615052600164335ustar00rootroot00000000000000fifengine-0.4.2/engine/core/gui/cegui/000077500000000000000000000000001341615052600175275ustar00rootroot00000000000000fifengine-0.4.2/engine/core/gui/cegui/base/000077500000000000000000000000001341615052600204415ustar00rootroot00000000000000fifengine-0.4.2/engine/core/gui/cegui/base/ceguiinputprocessor.cpp000066400000000000000000000260221341615052600252630ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // 3rd party library includes #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "ceguiinputprocessor.h" namespace FIFE { CEGuiInputProcessor::CEGuiInputProcessor() { initializeKeyMap(); } CEGuiInputProcessor::~CEGuiInputProcessor() { } bool CEGuiInputProcessor::onSdlEvent(SDL_Event& event) { bool consumed = false; switch(event.type) { case SDL_KEYUP: case SDL_KEYDOWN: consumed = processKeyInput(event); break; case SDL_TEXTINPUT: consumed = processTextInput(event); break; case SDL_MOUSEWHEEL: case SDL_MOUSEBUTTONUP: case SDL_MOUSEBUTTONDOWN: consumed = processMouseInput(event); break; case SDL_MOUSEMOTION: consumed = processMouseMotion(event); break; default: ; } return consumed; } bool CEGuiInputProcessor::processKeyInput(SDL_Event& event) { bool consumed = false; switch(event.type) { case SDL_KEYDOWN: if (m_keymap.find(event.key.keysym.sym) != m_keymap.end()) consumed |= CEGUI::System::getSingleton().getDefaultGUIContext().injectKeyDown(m_keymap[event.key.keysym.sym]); break; case SDL_KEYUP: if (m_keymap.find(event.key.keysym.sym) != m_keymap.end()) consumed = CEGUI::System::getSingleton().getDefaultGUIContext().injectKeyUp(m_keymap[event.key.keysym.sym]); break; default: ; } return consumed; } bool CEGuiInputProcessor::processTextInput(SDL_Event& event) { CEGUI::String character(event.text.text); bool consumed = CEGUI::System::getSingleton().getDefaultGUIContext().injectChar(character[0]); return consumed; } bool CEGuiInputProcessor::processMouseInput(SDL_Event& event) { bool consumed = false; switch(event.type) { case SDL_MOUSEBUTTONDOWN: { switch(event.button.button) { case SDL_BUTTON_LEFT: consumed = CEGUI::System::getSingleton().getDefaultGUIContext().injectMouseButtonDown(CEGUI::LeftButton); break; case SDL_BUTTON_RIGHT: consumed = CEGUI::System::getSingleton().getDefaultGUIContext().injectMouseButtonDown(CEGUI::RightButton); break; case SDL_BUTTON_MIDDLE: consumed = CEGUI::System::getSingleton().getDefaultGUIContext().injectMouseButtonDown(CEGUI::MiddleButton) ; break; default: ; } break; } case SDL_MOUSEBUTTONUP: { switch(event.button.button) { case SDL_BUTTON_LEFT: consumed = CEGUI::System::getSingleton().getDefaultGUIContext().injectMouseButtonUp(CEGUI::LeftButton); break; case SDL_BUTTON_RIGHT: consumed = CEGUI::System::getSingleton().getDefaultGUIContext().injectMouseButtonUp(CEGUI::RightButton); break; case SDL_BUTTON_MIDDLE: consumed = CEGUI::System::getSingleton().getDefaultGUIContext().injectMouseButtonUp(CEGUI::MiddleButton) ; break; default: ; } break; } case SDL_MOUSEWHEEL: { // mousewheel up or down int32_t wheelChange = event.wheel.y; if (wheelChange != 0) { #if SDL_VERSION_ATLEAST(2,0,4) if (event.wheel.direction == SDL_MOUSEWHEEL_FLIPPED) { wheelChange *= -1; } #endif consumed = CEGUI::System::getSingleton().getDefaultGUIContext().injectMouseWheelChange(wheelChange); } break; } default: ; } return consumed; } bool CEGuiInputProcessor::processMouseMotion(SDL_Event& event) { return CEGUI::System::getSingleton().getDefaultGUIContext().injectMousePosition(static_cast(event.motion.x), static_cast(event.motion.y)); } void CEGuiInputProcessor::initializeKeyMap() { m_keymap[SDLK_1] = CEGUI::Key::One; m_keymap[SDLK_2] = CEGUI::Key::Two; m_keymap[SDLK_3] = CEGUI::Key::Three; m_keymap[SDLK_4] = CEGUI::Key::Four; m_keymap[SDLK_5] = CEGUI::Key::Five; m_keymap[SDLK_6] = CEGUI::Key::Six; m_keymap[SDLK_7] = CEGUI::Key::Seven; m_keymap[SDLK_8] = CEGUI::Key::Eight; m_keymap[SDLK_9] = CEGUI::Key::Nine; m_keymap[SDLK_0] = CEGUI::Key::Zero; m_keymap[SDLK_q] = CEGUI::Key::Q; m_keymap[SDLK_w] = CEGUI::Key::W; m_keymap[SDLK_e] = CEGUI::Key::E; m_keymap[SDLK_r] = CEGUI::Key::R; m_keymap[SDLK_t] = CEGUI::Key::T; m_keymap[SDLK_y] = CEGUI::Key::Y; m_keymap[SDLK_u] = CEGUI::Key::U; m_keymap[SDLK_i] = CEGUI::Key::I; m_keymap[SDLK_o] = CEGUI::Key::O; m_keymap[SDLK_p] = CEGUI::Key::P; m_keymap[SDLK_a] = CEGUI::Key::A; m_keymap[SDLK_s] = CEGUI::Key::S; m_keymap[SDLK_d] = CEGUI::Key::D; m_keymap[SDLK_f] = CEGUI::Key::F; m_keymap[SDLK_g] = CEGUI::Key::G; m_keymap[SDLK_h] = CEGUI::Key::H; m_keymap[SDLK_j] = CEGUI::Key::J; m_keymap[SDLK_k] = CEGUI::Key::K; m_keymap[SDLK_l] = CEGUI::Key::L; m_keymap[SDLK_z] = CEGUI::Key::Z; m_keymap[SDLK_x] = CEGUI::Key::X; m_keymap[SDLK_c] = CEGUI::Key::C; m_keymap[SDLK_v] = CEGUI::Key::V; m_keymap[SDLK_b] = CEGUI::Key::B; m_keymap[SDLK_n] = CEGUI::Key::N; m_keymap[SDLK_m] = CEGUI::Key::M; m_keymap[SDLK_COMMA] = CEGUI::Key::Comma; m_keymap[SDLK_PERIOD] = CEGUI::Key::Period; m_keymap[SDLK_SLASH] = CEGUI::Key::Slash; m_keymap[SDLK_BACKSLASH] = CEGUI::Key::Backslash; m_keymap[SDLK_MINUS] = CEGUI::Key::Minus; m_keymap[SDLK_EQUALS] = CEGUI::Key::Equals; m_keymap[SDLK_SEMICOLON] = CEGUI::Key::Semicolon; m_keymap[SDLK_COLON] = CEGUI::Key::Colon; m_keymap[SDLK_LEFTBRACKET] = CEGUI::Key::LeftBracket; m_keymap[SDLK_RIGHTBRACKET] = CEGUI::Key::RightBracket; m_keymap[SDLK_QUOTE] = CEGUI::Key::Apostrophe; m_keymap[SDLK_BACKQUOTE] = CEGUI::Key::Grave; m_keymap[SDLK_AT] = CEGUI::Key::At; m_keymap[SDLK_UNDERSCORE] = CEGUI::Key::Underline; m_keymap[SDLK_RETURN] = CEGUI::Key::Return; m_keymap[SDLK_SPACE] = CEGUI::Key::Space; m_keymap[SDLK_BACKSPACE] = CEGUI::Key::Backspace; m_keymap[SDLK_TAB] = CEGUI::Key::Tab; m_keymap[SDLK_ESCAPE] = CEGUI::Key::Escape; m_keymap[SDLK_PAUSE] = CEGUI::Key::Pause; m_keymap[SDLK_SYSREQ] = CEGUI::Key::SysRq; m_keymap[SDLK_POWER] = CEGUI::Key::Power; m_keymap[SDLK_SLEEP] = CEGUI::Key::Sleep; m_keymap[SDLK_CALCULATOR] = CEGUI::Key::Calculator; m_keymap[SDLK_MAIL] = CEGUI::Key::Mail; m_keymap[SDLK_COMPUTER] = CEGUI::Key::MyComputer; m_keymap[SDLK_MEDIASELECT] = CEGUI::Key::MediaSelect; m_keymap[SDLK_AC_STOP] = CEGUI::Key::Stop; m_keymap[SDLK_AUDIOPLAY] = CEGUI::Key::PlayPause; m_keymap[SDLK_AUDIOSTOP] = CEGUI::Key::MediaStop; m_keymap[SDLK_AUDIOPREV] = CEGUI::Key::PrevTrack; m_keymap[SDLK_AUDIONEXT] = CEGUI::Key::NextTrack; m_keymap[SDLK_AUDIOMUTE] = CEGUI::Key::Mute; m_keymap[SDLK_VOLUMEUP] = CEGUI::Key::VolumeUp; m_keymap[SDLK_VOLUMEDOWN] = CEGUI::Key::VolumeDown; m_keymap[SDLK_AC_BACK] = CEGUI::Key::WebBack; m_keymap[SDLK_AC_FORWARD] = CEGUI::Key::WebForward; m_keymap[SDLK_AC_HOME] = CEGUI::Key::WebHome; m_keymap[SDLK_AC_BOOKMARKS] = CEGUI::Key::WebFavorites; m_keymap[SDLK_AC_SEARCH] = CEGUI::Key::WebSearch; m_keymap[SDLK_AC_REFRESH] = CEGUI::Key::WebRefresh; m_keymap[SDLK_AC_STOP] = CEGUI::Key::WebStop; m_keymap[SDLK_NUMLOCKCLEAR] = CEGUI::Key::NumLock; m_keymap[SDLK_SCROLLLOCK] = CEGUI::Key::ScrollLock; m_keymap[SDLK_CAPSLOCK] = CEGUI::Key::Capital; m_keymap[SDLK_F1] = CEGUI::Key::F1; m_keymap[SDLK_F2] = CEGUI::Key::F2; m_keymap[SDLK_F3] = CEGUI::Key::F3; m_keymap[SDLK_F4] = CEGUI::Key::F4; m_keymap[SDLK_F5] = CEGUI::Key::F5; m_keymap[SDLK_F6] = CEGUI::Key::F6; m_keymap[SDLK_F7] = CEGUI::Key::F7; m_keymap[SDLK_F8] = CEGUI::Key::F8; m_keymap[SDLK_F9] = CEGUI::Key::F9; m_keymap[SDLK_F10] = CEGUI::Key::F10; m_keymap[SDLK_F11] = CEGUI::Key::F11; m_keymap[SDLK_F12] = CEGUI::Key::F12; m_keymap[SDLK_F13] = CEGUI::Key::F13; m_keymap[SDLK_F14] = CEGUI::Key::F14; m_keymap[SDLK_F15] = CEGUI::Key::F15; m_keymap[SDLK_LCTRL] = CEGUI::Key::LeftControl; m_keymap[SDLK_LALT] = CEGUI::Key::LeftAlt; m_keymap[SDLK_LSHIFT] = CEGUI::Key::LeftShift; m_keymap[SDLK_LGUI] = CEGUI::Key::LeftWindows; m_keymap[SDLK_RCTRL] = CEGUI::Key::RightControl; m_keymap[SDLK_RALT] = CEGUI::Key::RightAlt; m_keymap[SDLK_RSHIFT] = CEGUI::Key::RightShift; m_keymap[SDLK_RGUI] = CEGUI::Key::RightWindows; m_keymap[SDLK_MENU] = CEGUI::Key::AppMenu; m_keymap[SDLK_KP_0] = CEGUI::Key::Numpad0; m_keymap[SDLK_KP_1] = CEGUI::Key::Numpad1; m_keymap[SDLK_KP_2] = CEGUI::Key::Numpad2; m_keymap[SDLK_KP_3] = CEGUI::Key::Numpad3; m_keymap[SDLK_KP_4] = CEGUI::Key::Numpad4; m_keymap[SDLK_KP_5] = CEGUI::Key::Numpad5; m_keymap[SDLK_KP_6] = CEGUI::Key::Numpad6; m_keymap[SDLK_KP_7] = CEGUI::Key::Numpad7; m_keymap[SDLK_KP_8] = CEGUI::Key::Numpad8; m_keymap[SDLK_KP_9] = CEGUI::Key::Numpad9; m_keymap[SDLK_KP_PERIOD] = CEGUI::Key::Decimal; m_keymap[SDLK_KP_PLUS] = CEGUI::Key::Add; m_keymap[SDLK_KP_MINUS] = CEGUI::Key::Subtract; m_keymap[SDLK_KP_MULTIPLY] = CEGUI::Key::Multiply; m_keymap[SDLK_KP_DIVIDE] = CEGUI::Key::Divide; m_keymap[SDLK_KP_ENTER] = CEGUI::Key::NumpadEnter; m_keymap[SDLK_KP_COMMA] = CEGUI::Key::NumpadComma; m_keymap[SDLK_KP_EQUALS] = CEGUI::Key::NumpadEquals; m_keymap[SDLK_UP] = CEGUI::Key::ArrowUp; m_keymap[SDLK_LEFT] = CEGUI::Key::ArrowLeft; m_keymap[SDLK_RIGHT] = CEGUI::Key::ArrowRight; m_keymap[SDLK_DOWN] = CEGUI::Key::ArrowDown; m_keymap[SDLK_HOME] = CEGUI::Key::Home; m_keymap[SDLK_END] = CEGUI::Key::End; m_keymap[SDLK_PAGEUP] = CEGUI::Key::PageUp; m_keymap[SDLK_PAGEDOWN] = CEGUI::Key::PageDown; m_keymap[SDLK_INSERT] = CEGUI::Key::Insert; m_keymap[SDLK_DELETE] = CEGUI::Key::Delete; } } fifengine-0.4.2/engine/core/gui/cegui/base/ceguiinputprocessor.h000066400000000000000000000054261341615052600247350ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_GUI_CEGuiInputProcessor #define FIFE_GUI_CEGuiInputProcessor // Standard C++ library includes // 3rd party library includes #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder namespace FIFE { class CEGuiInputProcessor { public: /** Constructor. */ CEGuiInputProcessor(); /** Destructor. */ ~CEGuiInputProcessor(); /** Injects input to the CEGUI system. * * @return A boolean value indicating if the event was consumed or not. */ bool onSdlEvent(SDL_Event& event); private: /** Process a key input event. */ bool processKeyInput(SDL_Event& event); /** Process a text input event. */ bool processTextInput(SDL_Event& event); /** Process a mouse input event. */ bool processMouseInput(SDL_Event& event); /** Process a mouse motion event. */ bool processMouseMotion(SDL_Event& event); /** Initialize the key translation map. */ void initializeKeyMap(); /** Holds translation of key scancodes from SDL to CEGUI. */ std::map m_keymap; }; } #endif //FIFE_GUI_CEGuiInputProcessor fifengine-0.4.2/engine/core/gui/cegui/ceguimanager.cpp000066400000000000000000000067241341615052600226730ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // 3rd party library includes #include #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "base/ceguiinputprocessor.h" #include "util/time/timemanager.h" #include "ceguimanager.h" namespace FIFE { CEGuiManager::CEGuiManager() { #ifdef HAVE_OPENGL CEGUI::OpenGLRenderer::bootstrapSystem(); dynamic_cast(CEGUI::System::getSingleton().getRenderer())-> enableExtraStateSettings(true); #else throw GuiException("CEGUI can be used only if opengl is enabled!"); #endif m_inputProcessor = new CEGuiInputProcessor(); m_lastTimePulse = TimeManager::instance()->getTime() / 1000.0; } CEGuiManager::~CEGuiManager() { delete m_inputProcessor; CEGUI::OpenGLRenderer::destroySystem(); } void CEGuiManager::turn() { injectTimePulse(); CEGUI::System::getSingleton().renderAllGUIContexts(); } void CEGuiManager::resizeTopContainer(uint32_t x, uint32_t y, uint32_t width, uint32_t height) { CEGUI::System::getSingleton().notifyDisplaySizeChanged(CEGUI::Sizef(width, height)); } bool CEGuiManager::onSdlEvent(SDL_Event &event) { return m_inputProcessor->onSdlEvent(event); } void CEGuiManager::setRootWindow(CEGUI::Window* root) { m_guiRoot = root; CEGUI::System::getSingleton().getDefaultGUIContext().setRootWindow(m_guiRoot); } CEGUI::Window* CEGuiManager::getRootWindow() { return m_guiRoot; } void CEGuiManager::injectTimePulse() { double timeNow = TimeManager::instance()->getTime() / 1000.0; float time_pulse = float(timeNow - m_lastTimePulse); CEGUI::System::getSingleton().injectTimePulse(time_pulse); CEGUI::System::getSingleton().getDefaultGUIContext().injectTimePulse(time_pulse); m_lastTimePulse = timeNow; } } fifengine-0.4.2/engine/core/gui/cegui/ceguimanager.h000066400000000000000000000063141341615052600223330ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_GUI_CEGuiManager #define FIFE_GUI_CEGuiManager // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/singleton.h" #include "gui/guimanager.h" namespace CEGUI { class Window; } namespace FIFE { class CEGuiInputProcessor; class CEGuiManager : public IGUIManager, public DynamicSingleton { public: /** Constructor. */ CEGuiManager(); virtual ~CEGuiManager(); /** Updates and renders the gui. */ virtual void turn(); /** Resizes the top container. * * @param x The new starting X coordinate. * @param y The new starting Y coordinate. * @param width The new width. * @param height The new height. */ virtual void resizeTopContainer(uint32_t x, uint32_t y, uint32_t width, uint32_t height); /** Receives input and converts it to librocket format, then it forwards it * to librocket. */ virtual bool onSdlEvent(SDL_Event& event); /** Sets the root window of the gui system. */ void setRootWindow(CEGUI::Window* setRootWindow); /** @return The root window of the gui system. */ CEGUI::Window* getRootWindow(); private: /** Inject a time pulse to CEGUI. */ void injectTimePulse(); /** Input processor. Converts SDL input to CEGUI input. */ CEGuiInputProcessor* m_inputProcessor; /** Last time pulse injected to CEGUI. */ double m_lastTimePulse; /** Our root gui window. */ CEGUI::Window* m_guiRoot; }; } #endif //FIFE_GUI_CEGuiManager fifengine-0.4.2/engine/core/gui/cegui/ceguimanager.i000066400000000000000000000004211341615052600223250ustar00rootroot00000000000000%module fife %{ #include "gui/cegui/ceguimanager.h" #include "gui/guimanager.h" %} %include "gui/guimanager.i" namespace FIFE { %feature("notabstract") CEGuiManager; class CEGuiManager : public IGUIManager { public: CEGuiManager(); virtual ~CEGuiManager(); }; } fifengine-0.4.2/engine/core/gui/fifechan/000077500000000000000000000000001341615052600201765ustar00rootroot00000000000000fifengine-0.4.2/engine/core/gui/fifechan/base/000077500000000000000000000000001341615052600211105ustar00rootroot00000000000000fifengine-0.4.2/engine/core/gui/fifechan/base/gui_font.cpp000066400000000000000000000135111341615052600234270ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // 3rd party library includes #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/structures/rect.h" #include "video/image.h" #include "video/renderbackend.h" #include "gui_font.h" namespace FIFE { GuiFont::GuiFont(IFont* font): m_font(font) { assert(font); } GuiFont::~GuiFont() { delete m_font; } int32_t GuiFont::getStringIndexAt(const std::string& text, int32_t x) const { return m_font->getStringIndexAt(text, x); } void GuiFont::drawString(fcn::Graphics* graphics, const std::string& text, int32_t x, int32_t y) { if (text == "") { return; } int32_t yoffset = getRowSpacing() / 2; const fcn::ClipRectangle& clip = graphics->getCurrentClipArea(); FIFE::Rect rect; rect.x = x + clip.xOffset; rect.y = y + clip.yOffset + yoffset; rect.w = getWidth(text); rect.h = getHeight(); if (!rect.intersects(Rect(clip.x,clip.y,clip.width,clip.height)) ) { return; } Image* image; if (isDynamicColoring()) { SDL_Color color = getColor(); setColor(graphics->getColor().r, graphics->getColor().g, graphics->getColor().b, graphics->getColor().a); image = getAsImage(text); setColor(color.r, color.g, color.b, color.a); } else { image = getAsImage(text); } image->render(rect); } void GuiFont::drawMultiLineString(fcn::Graphics* graphics, const std::string& text, int32_t x, int32_t y) { if (text == "") { return; } int32_t yoffset = getRowSpacing() / 2; const fcn::ClipRectangle& clip = graphics->getCurrentClipArea(); Image* image; if (isDynamicColoring()) { SDL_Color color = getColor(); setColor(graphics->getColor().r, graphics->getColor().g, graphics->getColor().b, graphics->getColor().a); image = getAsImageMultiline(text); setColor(color.r, color.g, color.b, color.a); } else { image = getAsImageMultiline(text); } FIFE::Rect rect; rect.x = x + clip.xOffset; rect.y = y + clip.yOffset + yoffset; rect.w = image->getWidth(); rect.h = image->getHeight(); if (!rect.intersects(Rect(clip.x,clip.y,clip.width,clip.height)) ) { return; } image->render(rect); } void GuiFont::setRowSpacing (int32_t spacing) { m_font->setRowSpacing(spacing); } int32_t GuiFont::getRowSpacing() const { return m_font->getRowSpacing(); } void GuiFont::setGlyphSpacing(int32_t spacing) { m_font->setGlyphSpacing(spacing); } int32_t GuiFont::getGlyphSpacing() const { return m_font->getGlyphSpacing(); } void GuiFont::setAntiAlias(bool antiAlias) { m_font->setAntiAlias(antiAlias); } bool GuiFont::isAntiAlias() const { return m_font->isAntiAlias(); } void GuiFont::setBoldStyle(bool style) { m_font->setBoldStyle(style); } bool GuiFont::isBoldStyle() const { return m_font->isBoldStyle(); } void GuiFont::setItalicStyle(bool style) { m_font->setItalicStyle(style); } bool GuiFont::isItalicStyle() const { return m_font->isItalicStyle(); } void GuiFont::setUnderlineStyle(bool style) { m_font->setUnderlineStyle(style); } bool GuiFont::isUnderlineStyle() const { return m_font->isUnderlineStyle(); } void GuiFont::setStrikethroughStyle(bool style) { m_font->setStrikethroughStyle(style); } bool GuiFont::isStrikethroughStyle() const { return m_font->isStrikethroughStyle(); } void GuiFont::setDynamicColoring(bool coloring) { m_font->setDynamicColoring(coloring); } bool GuiFont::isDynamicColoring() const { return m_font->isDynamicColoring(); } Image* GuiFont::getAsImage(const std::string& text) { return m_font->getAsImage(text); } Image* GuiFont::getAsImageMultiline(const std::string& text) { return m_font->getAsImageMultiline(text); } std::string GuiFont::splitTextToWidth (const std::string& text, int32_t render_width) { return m_font->splitTextToWidth(text,render_width); } void GuiFont::setColor(uint8_t r,uint8_t g,uint8_t b, uint8_t a) { m_font->setColor(r, g, b, a); } SDL_Color GuiFont::getColor() const { return m_font->getColor(); } int32_t GuiFont::getWidth(const std::string& text) const { return m_font->getWidth(text); } int32_t GuiFont::getHeight() const { return m_font->getHeight(); } void GuiFont::invalidate() { m_font->invalidate(); } } fifengine-0.4.2/engine/core/gui/fifechan/base/gui_font.h000066400000000000000000000064401341615052600230770ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_GUI_FONT_H #define FIFE_GUI_FONT_H // Standard C++ library includes // 3rd party library includes #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "video/fonts/ifont.h" namespace FIFE { class GuiFont : public fcn::Font, public IFont { public: /** Constructor * Takes the ownership of given font */ GuiFont(IFont* font); virtual ~GuiFont(); int32_t getStringIndexAt(const std::string& text, int32_t x) const; void drawString(fcn::Graphics* graphics, const std::string& text, int32_t x, int32_t y); void drawMultiLineString(fcn::Graphics* graphics, const std::string& text, int32_t x, int32_t y); std::string splitTextToWidth (const std::string& text, int32_t render_width); void setRowSpacing (int32_t spacing); int32_t getRowSpacing() const; void setGlyphSpacing(int32_t spacing); int32_t getGlyphSpacing() const; void setAntiAlias(bool antiAlias); bool isAntiAlias() const; void setBoldStyle(bool style); bool isBoldStyle() const; void setItalicStyle(bool style); bool isItalicStyle() const; void setUnderlineStyle(bool style); bool isUnderlineStyle() const; void setStrikethroughStyle(bool style); bool isStrikethroughStyle() const; void setDynamicColoring(bool coloring); bool isDynamicColoring() const; Image* getAsImage(const std::string& text); Image* getAsImageMultiline(const std::string& text); void setColor(uint8_t r,uint8_t g,uint8_t b, uint8_t a = 255); SDL_Color getColor() const; int32_t getWidth(const std::string& text) const; int32_t getHeight() const; void invalidate(); private: IFont* m_font; }; } #endif fifengine-0.4.2/engine/core/gui/fifechan/base/gui_font.i000066400000000000000000000056711341615052600231050ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fife %{ #include #include "gui/fifechan/base/gui_font.h" #include "video/fonts/ifont.h" %} %include "video/fonts/fonts.i" namespace fcn { class Graphics; class Font { public: virtual ~Font(){ } virtual int32_t getWidth(const std::string& text) const = 0; virtual int32_t getHeight() const = 0; }; } namespace FIFE { class Image; %feature("notabstract") GuiFont; class GuiFont : public fcn::Font, public IFont { public: GuiFont(IFont* font); virtual ~GuiFont(); int32_t getStringIndexAt(const std::string& text, int32_t x); void drawString(fcn::Graphics* graphics, const std::string& text, int32_t x, int32_t y); void setRowSpacing (int32_t spacing); int32_t getRowSpacing() const; void setGlyphSpacing(int32_t spacing); int32_t getGlyphSpacing() const; void setAntiAlias(bool antiAlias); bool isAntiAlias(); void setBoldStyle(bool style); bool isBoldStyle() const; void setItalicStyle(bool style); bool isItalicStyle() const; void setUnderlineStyle(bool style); bool isUnderlineStyle() const; void setStrikethroughStyle(bool style); bool isStrikethroughStyle() const; void setDynamicColoring(bool coloring); bool isDynamicColoring() const; Image* getAsImage(const std::string& text); void setColor(uint8_t r,uint8_t g,uint8_t b, uint8_t a = 255); SDL_Color getColor() const; int32_t getWidth(const std::string& text) const; int32_t getHeight() const; }; } fifengine-0.4.2/engine/core/gui/fifechan/base/gui_image.cpp000066400000000000000000000054121341615052600235440ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/log/logger.h" #include "video/image.h" #include "video/imagemanager.h" #include "gui_image.h" namespace FIFE { static Logger _log(LM_GUI); GuiImage::GuiImage(): fcn::Image(), m_imgPtr() { } GuiImage::GuiImage(ImagePtr img): fcn::Image(), m_imgPtr(img) { } GuiImage::~GuiImage() { } void GuiImage::free() { ImageManager::instance()->free(m_imgPtr->getHandle()); } int32_t GuiImage::getWidth() const { if(!m_imgPtr) return 0; return m_imgPtr->getWidth(); } int32_t GuiImage::getHeight() const { if(!m_imgPtr) return 0; return m_imgPtr->getHeight(); } fcn::Color GuiImage::getPixel(int32_t x, int32_t y) { FL_PANIC(_log, "GuiImage::getPixel, not implemented"); return fcn::Color(); } void GuiImage::putPixel(int32_t x, int32_t y, const fcn::Color& color) { FL_PANIC(_log, "GuiImage::putPixel, not implemented"); } void GuiImage::convertToDisplayFormat() { // empty on purpose // Since we don't need any conversions - this is just a proxy. } } fifengine-0.4.2/engine/core/gui/fifechan/base/gui_image.h000066400000000000000000000046241341615052600232150ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_GUI_IMAGE_H #define FIFE_GUI_IMAGE_H // Standard C++ library includes // 3rd party library includes #include #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/fife_stdint.h" #include "video/image.h" #include "video/imagemanager.h" namespace FIFE { class GuiImage : public fcn::Image { public: GuiImage(); GuiImage(ImagePtr img); ~GuiImage(); void free(); int32_t getWidth() const; int32_t getHeight() const; fcn::Color getPixel(int32_t x, int32_t y); void putPixel(int32_t x, int32_t y, const fcn::Color& color); void convertToDisplayFormat(); ImagePtr getFIFEImage() const { return m_imgPtr; } protected: ImagePtr m_imgPtr; }; } #endif fifengine-0.4.2/engine/core/gui/fifechan/base/gui_image.i000066400000000000000000000040751341615052600232160ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fife %{ #include #include "gui/fifechan/base/gui_image.h" #include "video/image.h" %} %rename(GcnImage) fcn::Image; namespace fcn { class Image { public: Image(); virtual ~Image(); static Image* load(const std::string& filename, bool convertToDisplayFormat = true); virtual int32_t getWidth() const = 0; virtual int32_t getHeight() const = 0; }; } namespace FIFE { class GuiImage: public fcn::Image { public: GuiImage(); GuiImage(FIFE::ImagePtr Image); int32_t getWidth() const; int32_t getHeight() const; }; } fifengine-0.4.2/engine/core/gui/fifechan/base/gui_imageloader.cpp000066400000000000000000000072041341615052600247340ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "video/image.h" #include "video/imagemanager.h" #include "video/atlasbook.h" #include "video/renderbackend.h" #include "gui_imageloader.h" static const uint32_t ATLAS_SIZE = 512; namespace FIFE { GuiImageLoader::GuiImageLoader() { m_atlasbook = new AtlasBook(ATLAS_SIZE, ATLAS_SIZE); } GuiImageLoader::~GuiImageLoader() { delete m_atlasbook; } fcn::Image* GuiImageLoader::load(const std::string& filename, bool convertToDisplayFormat) { ImageManager* imgManager = ImageManager::instance(); if(imgManager->exists(filename)) { return new GuiImage(imgManager->get(filename)); } // load demanded image ImagePtr tmpimg = imgManager->load(filename); if(tmpimg->getWidth() >= ATLAS_SIZE || tmpimg->getHeight() >= ATLAS_SIZE) { return new GuiImage(tmpimg); } // look for a place for an image of given size AtlasBlock* block = m_atlasbook->getBlock(tmpimg->getWidth(), tmpimg->getHeight()); // if it can't fit, we need to add new 'page' if(block->page >= m_atlases.size()) { m_atlases.push_back(imgManager->loadBlank(ATLAS_SIZE, ATLAS_SIZE)); // because we gonna update texture on-the fly (via TexSubImage) // we cant really use compressed texture RenderBackend* rb = RenderBackend::instance(); bool prev = rb->isImageCompressingEnabled(); rb->setImageCompressingEnabled(false); m_atlases[block->page]->forceLoadInternal(); rb->setImageCompressingEnabled(prev); } // update atlas page with given image m_atlases[block->page]->copySubimage(block->left, block->top, tmpimg); // we dont really need this image anymore tmpimg->free(); imgManager->remove(tmpimg); // create shared image and return it ImagePtr img = imgManager->create(filename); Rect region(block->left, block->top, block->getWidth(), block->getHeight()); img->useSharedImage(m_atlases[block->page], region); return new GuiImage(img); } } fifengine-0.4.2/engine/core/gui/fifechan/base/gui_imageloader.h000066400000000000000000000044161341615052600244030ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_GUI_IMAGELOADER_H #define FIFE_GUI_IMAGELOADER_H // Standard C++ library includes // 3rd party library includes #include #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "gui_image.h" namespace FIFE { class AtlasBook; /* Image Loader. */ class GuiImageLoader : public fcn::ImageLoader { public: GuiImageLoader(); virtual ~GuiImageLoader(); virtual fcn::Image* load(const std::string& filename, bool convertToDisplayFormat = true); private: AtlasBook* m_atlasbook; std::vector m_atlases; }; } #endif fifengine-0.4.2/engine/core/gui/fifechan/base/opengl/000077500000000000000000000000001341615052600223745ustar00rootroot00000000000000fifengine-0.4.2/engine/core/gui/fifechan/base/opengl/opengl_gui_graphics.cpp000066400000000000000000000211501341615052600271070ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // This needs to be here, before Fifechan includes gl.h #include "video/opengl/fife_opengl.h" // 3rd party library includes #include #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src dir #include "util/log/logger.h" #include "util/base/exception.h" #include "gui/fifechan/base/gui_image.h" #include "util/structures/rect.h" #include "video/image.h" #include "video/imagemanager.h" #include "video/opengl/renderbackendopengl.h" #include "opengl_gui_graphics.h" namespace FIFE { static Logger _log(LM_GUI); OpenGLGuiGraphics::OpenGLGuiGraphics() { mColor = fcn::Color(255, 255, 255, 255); m_renderbackend = static_cast(RenderBackend::instance()); setTargetPlane(m_renderbackend->getWidth(), m_renderbackend->getHeight()); } void OpenGLGuiGraphics::updateTarget() { setTargetPlane(m_renderbackend->getWidth(), m_renderbackend->getHeight()); } void OpenGLGuiGraphics::drawImage(const fcn::Image* image, int32_t srcX, int32_t srcY, int32_t dstX, int32_t dstY, int32_t width, int32_t height) { const GuiImage* g_img = dynamic_cast(image); assert(g_img); ImagePtr fifeimg = g_img->getFIFEImage(); const fcn::ClipRectangle& clip = mClipStack.top(); fifeimg->render(Rect(dstX + clip.xOffset, dstY + clip.yOffset, width, height)); } void OpenGLGuiGraphics::drawText(const std::string& text, int32_t x, int32_t y, uint32_t alignment) { if (mFont == NULL) { throw GuiException("OpenGLGuiGraphics::drawText() - No font set!"); } switch (alignment) { case Left: mFont->drawString(this, text, x, y); break; case Center: mFont->drawString(this, text, x - mFont->getWidth(text) / 2, y); break; case Right: mFont->drawString(this, text, x - mFont->getWidth(text), y); break; default: FL_WARN(_log, LMsg("OpenGLGuiGraphics::drawText() - ") << "Unknown alignment: " << alignment); mFont->drawString(this, text, x, y); } } void OpenGLGuiGraphics::drawPoint(int32_t x, int32_t y) { const fcn::ClipRectangle& top = mClipStack.top(); m_renderbackend->putPixel(x + top.xOffset, y + top.yOffset, mColor.r, mColor.g, mColor.b, mColor.a); } void OpenGLGuiGraphics::drawLine(int32_t x1, int32_t y1, int32_t x2, int32_t y2) { const fcn::ClipRectangle& top = mClipStack.top(); x1 += top.xOffset; x2 += top.xOffset; y1 += top.yOffset; y2 += top.yOffset; /*Point pbegin(static_cast(ceil(x1 + 0.375f)), static_cast(ceil(y1 + 0.375f))); Point pend(static_cast(ceil(x2 + 0.625f)), static_cast(ceil(y2 + 0.625f)));*/ /*if (x1 == x2) { y2 += 1; } else if (y1 == y2) { x2 += 1; }*/ Point pbegin(x1, y1); Point pend(x2, y2); m_renderbackend->drawLine(pbegin, pend, mColor.r, mColor.g, mColor.b, mColor.a); //m_renderbackend->putPixel(pbegin.x, pbegin.y, // mColor.r, mColor.g, mColor.b, mColor.a); m_renderbackend->putPixel(pend.x, pend.y, mColor.r, mColor.g, mColor.b, mColor.a); } void OpenGLGuiGraphics::drawLine(int32_t x1, int32_t y1, int32_t x2, int32_t y2, uint32_t width) { const fcn::ClipRectangle& top = mClipStack.top(); m_renderbackend->drawThickLine(Point(x1+top.xOffset, y1+top.yOffset), Point(x2+top.xOffset, y2+top.yOffset), width, mColor.r, mColor.g, mColor.b, mColor.a); } void OpenGLGuiGraphics::drawPolyLine(const fcn::PointVector& points, uint32_t width) { const fcn::ClipRectangle& top = mClipStack.top(); std::vector npoints; fcn::PointVector::const_iterator it = points.begin(); for (; it != points.end(); ++it) { npoints.push_back(Point((*it).x+top.xOffset, (*it).y+top.yOffset)); } m_renderbackend->drawPolyLine(npoints, width, mColor.r, mColor.g, mColor.b, mColor.a); } void OpenGLGuiGraphics::drawBezier(const fcn::PointVector& points, int32_t steps, uint32_t width) { const fcn::ClipRectangle& top = mClipStack.top(); std::vector npoints; fcn::PointVector::const_iterator it = points.begin(); for (; it != points.end(); ++it) { npoints.push_back(Point((*it).x+top.xOffset, (*it).y+top.yOffset)); } m_renderbackend->drawBezier(npoints, steps, width, mColor.r, mColor.g, mColor.b, mColor.a); } void OpenGLGuiGraphics::drawRectangle(const fcn::Rectangle& rectangle) { const fcn::ClipRectangle& top = mClipStack.top(); m_renderbackend->drawRectangle( Point(rectangle.x + top.xOffset, rectangle.y + top.yOffset), rectangle.width, rectangle.height, mColor.r, mColor.g, mColor.b, mColor.a); } void OpenGLGuiGraphics::fillRectangle(const fcn::Rectangle& rectangle) { const fcn::ClipRectangle& top = mClipStack.top(); m_renderbackend->fillRectangle( Point(rectangle.x + top.xOffset, rectangle.y + top.yOffset), rectangle.width, rectangle.height, mColor.r, mColor.g, mColor.b, mColor.a); } void OpenGLGuiGraphics::drawCircle(const fcn::Point& p, uint32_t radius) { const fcn::ClipRectangle& top = mClipStack.top(); m_renderbackend->drawCircle(Point(p.x+top.xOffset, p.y+top.yOffset), radius, mColor.r, mColor.g, mColor.b, mColor.a); } void OpenGLGuiGraphics::drawFillCircle(const fcn::Point& p, uint32_t radius) { const fcn::ClipRectangle& top = mClipStack.top(); m_renderbackend->drawFillCircle(Point(p.x+top.xOffset, p.y+top.yOffset), radius, mColor.r, mColor.g, mColor.b, mColor.a); } void OpenGLGuiGraphics::drawCircleSegment(const fcn::Point& p, uint32_t radius, int32_t sangle, int32_t eangle) { const fcn::ClipRectangle& top = mClipStack.top(); m_renderbackend->drawCircleSegment(Point(p.x+top.xOffset, p.y+top.yOffset), radius, sangle, eangle, mColor.r, mColor.g, mColor.b, mColor.a); } void OpenGLGuiGraphics::drawFillCircleSegment(const fcn::Point& p, uint32_t radius, int32_t sangle, int32_t eangle) { const fcn::ClipRectangle& top = mClipStack.top(); m_renderbackend->drawFillCircleSegment(Point(p.x+top.xOffset, p.y+top.yOffset), radius, sangle, eangle, mColor.r, mColor.g, mColor.b, mColor.a); } void OpenGLGuiGraphics::_beginDraw() { fcn::Rectangle area(0, 0, mWidth, mHeight); fcn::Graphics::pushClipArea(area); m_renderbackend->pushClipArea(Rect(0, 0, mWidth, mHeight), false); } void OpenGLGuiGraphics::_endDraw() { m_renderbackend->renderVertexArrays(); // Cleanup fcn::Graphics::popClipArea(); m_renderbackend->popClipArea(); } bool OpenGLGuiGraphics::pushClipArea(fcn::Rectangle area) { // Render what we gathered so far m_renderbackend->renderVertexArrays(); fcn::Graphics::pushClipArea(area); // Due to some odd conception in guiChan some of area // has xOffset and yOffset > 0. And if it happens we // need to offset our clip area. Or we can use Fifechan stack. const fcn::ClipRectangle& top = mClipStack.top(); m_renderbackend->pushClipArea( Rect(top.x, top.y, top.width, top.height), false); return true; } void OpenGLGuiGraphics::popClipArea() { // Render what we gathered so far m_renderbackend->renderVertexArrays(); fcn::Graphics::popClipArea(); m_renderbackend->popClipArea(); } void OpenGLGuiGraphics::setColor(const fcn::Color& color) { mColor = color; } } fifengine-0.4.2/engine/core/gui/fifechan/base/opengl/opengl_gui_graphics.h000066400000000000000000000066341341615052600265660ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_GUI_OPENGL_GRAPHICS_H #define FIFE_GUI_OPENGL_GRAPHICS_H // Standard C++ library includes // 3rd party library includes #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src dir namespace FIFE { class RenderBackendOpenGL; /** Overrides Fifechan Graphics to enable usage of normal fife images & related facilities */ class OpenGLGuiGraphics: public fcn::OpenGLGraphics { public: /** Constructor */ OpenGLGuiGraphics(); void updateTarget(); virtual void drawImage(const fcn::Image* image, int32_t srcX, int32_t srcY, int32_t dstX, int32_t dstY, int32_t width, int32_t height); virtual void drawText(const std::string& text, int32_t x, int32_t y, uint32_t alignment); virtual void drawPoint(int32_t x, int32_t y); virtual void drawLine(int32_t x1, int32_t y1, int32_t x2, int32_t y2); virtual void drawLine(int32_t x1, int32_t y1, int32_t x2, int32_t y2, uint32_t width); virtual void drawPolyLine(const fcn::PointVector& points, uint32_t width); virtual void drawBezier(const fcn::PointVector& points, int32_t steps, uint32_t width); virtual void drawRectangle(const fcn::Rectangle& rectangle); virtual void fillRectangle(const fcn::Rectangle& rectangle); virtual void drawCircle(const fcn::Point& p, uint32_t radius); virtual void drawFillCircle(const fcn::Point& p, uint32_t radius); virtual void drawCircleSegment(const fcn::Point& p, uint32_t radius, int32_t sangle, int32_t eangle); virtual void drawFillCircleSegment(const fcn::Point& p, uint32_t radius, int32_t sangle, int32_t eangle); virtual void _beginDraw(); virtual void _endDraw(); virtual bool pushClipArea(fcn::Rectangle area); virtual void popClipArea(); virtual void setColor(const fcn::Color& color); private: RenderBackendOpenGL* m_renderbackend; }; } #endif fifengine-0.4.2/engine/core/gui/fifechan/base/sdl/000077500000000000000000000000001341615052600216725ustar00rootroot00000000000000fifengine-0.4.2/engine/core/gui/fifechan/base/sdl/sdl_gui_graphics.cpp000066400000000000000000000171111341615052600257050ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // 3rd party library includes #include #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src dir #include "gui/fifechan/base/gui_image.h" #include "util/base/exception.h" #include "util/structures/rect.h" #include "video/image.h" #include "video/renderbackend.h" #include "sdl_gui_graphics.h" namespace FIFE { static Logger _log(LM_GUI); SdlGuiGraphics::SdlGuiGraphics() { m_renderbackend = RenderBackend::instance(); setTarget(m_renderbackend->getScreenSurface()); } void SdlGuiGraphics::updateTarget() { setTarget(m_renderbackend->getScreenSurface()); } void SdlGuiGraphics::drawImage(const fcn::Image* image, int32_t srcX, int32_t srcY, int32_t dstX, int32_t dstY, int32_t width, int32_t height) { const GuiImage* g_img = dynamic_cast(image); assert(g_img); ImagePtr fifeimg = g_img->getFIFEImage(); const fcn::ClipRectangle& clip = getCurrentClipArea(); Rect rect(dstX, dstY, width, height); rect.x += clip.xOffset; rect.y += clip.yOffset; fifeimg->render(rect); } void SdlGuiGraphics::drawText(const std::string& text, int32_t x, int32_t y, uint32_t alignment) { if (mFont == NULL) { throw GuiException("SdlGuiGraphics::drawText() - No font set!"); } switch (alignment) { case Left: mFont->drawString(this, text, x, y); break; case Center: mFont->drawString(this, text, x - mFont->getWidth(text) / 2, y); break; case Right: mFont->drawString(this, text, x - mFont->getWidth(text), y); break; default: FL_WARN(_log, LMsg("SdlGuiGraphics::drawText() - ") << "Unknown alignment: " << alignment); mFont->drawString(this, text, x, y); } } void SdlGuiGraphics::drawPoint(int32_t x, int32_t y) { const fcn::ClipRectangle& top = mClipStack.top(); m_renderbackend->putPixel(x + top.xOffset, y + top.yOffset, mColor.r, mColor.g, mColor.b, mColor.a); } void SdlGuiGraphics::drawLine(int32_t x1, int32_t y1, int32_t x2, int32_t y2) { const fcn::ClipRectangle& top = mClipStack.top(); m_renderbackend->drawLine(Point(x1 + top.xOffset, y1 + top.yOffset), Point(x2 + top.xOffset, y2 + top.yOffset), mColor.r, mColor.g, mColor.b, mColor.a); } void SdlGuiGraphics::drawLine(int32_t x1, int32_t y1, int32_t x2, int32_t y2, uint32_t width) { const fcn::ClipRectangle& top = mClipStack.top(); m_renderbackend->drawThickLine(Point(x1+top.xOffset, y1+top.yOffset), Point(x2+top.xOffset, y2+top.yOffset), width, mColor.r, mColor.g, mColor.b, mColor.a); } void SdlGuiGraphics::drawPolyLine(const fcn::PointVector& points, uint32_t width) { const fcn::ClipRectangle& top = mClipStack.top(); std::vector npoints; fcn::PointVector::const_iterator it = points.begin(); for (; it != points.end(); ++it) { npoints.push_back(Point((*it).x+top.xOffset, (*it).y+top.yOffset)); } m_renderbackend->drawPolyLine(npoints, width, mColor.r, mColor.g, mColor.b, mColor.a); } void SdlGuiGraphics::drawBezier(const fcn::PointVector& points, int32_t steps, uint32_t width) { const fcn::ClipRectangle& top = mClipStack.top(); std::vector npoints; fcn::PointVector::const_iterator it = points.begin(); for (; it != points.end(); ++it) { npoints.push_back(Point((*it).x+top.xOffset, (*it).y+top.yOffset)); } m_renderbackend->drawBezier(npoints, steps, width, mColor.r, mColor.g, mColor.b, mColor.a); } void SdlGuiGraphics::drawRectangle(const fcn::Rectangle& rectangle) { const fcn::ClipRectangle& top = mClipStack.top(); m_renderbackend->drawRectangle( Point(rectangle.x + top.xOffset, rectangle.y + top.yOffset), rectangle.width, rectangle.height, mColor.r, mColor.g, mColor.b, mColor.a); } void SdlGuiGraphics::fillRectangle(const fcn::Rectangle& rectangle) { const fcn::ClipRectangle& top = mClipStack.top(); m_renderbackend->fillRectangle( Point(rectangle.x + top.xOffset, rectangle.y + top.yOffset), rectangle.width, rectangle.height, mColor.r, mColor.g, mColor.b, mColor.a); } void SdlGuiGraphics::drawCircle(const fcn::Point& p, uint32_t radius) { const fcn::ClipRectangle& top = mClipStack.top(); m_renderbackend->drawCircle(Point(p.x+top.xOffset, p.y+top.yOffset), radius, mColor.r, mColor.g, mColor.b, mColor.a); } void SdlGuiGraphics::drawFillCircle(const fcn::Point& p, uint32_t radius) { const fcn::ClipRectangle& top = mClipStack.top(); m_renderbackend->drawFillCircle(Point(p.x+top.xOffset, p.y+top.yOffset), radius, mColor.r, mColor.g, mColor.b, mColor.a); } void SdlGuiGraphics::drawCircleSegment(const fcn::Point& p, uint32_t radius, int32_t sangle, int32_t eangle) { const fcn::ClipRectangle& top = mClipStack.top(); m_renderbackend->drawCircleSegment(Point(p.x+top.xOffset, p.y+top.yOffset), radius, sangle, eangle, mColor.r, mColor.g, mColor.b, mColor.a); } void SdlGuiGraphics::drawFillCircleSegment(const fcn::Point& p, uint32_t radius, int32_t sangle, int32_t eangle) { const fcn::ClipRectangle& top = mClipStack.top(); m_renderbackend->drawFillCircleSegment(Point(p.x+top.xOffset, p.y+top.yOffset), radius, sangle, eangle, mColor.r, mColor.g, mColor.b, mColor.a); } void SdlGuiGraphics::_beginDraw() { fcn::Rectangle area(0, 0, mTarget->w, mTarget->h); fcn::Graphics::pushClipArea(area); m_renderbackend->pushClipArea(Rect(0, 0, mTarget->w, mTarget->h), false); } void SdlGuiGraphics::_endDraw() { // Cleanup fcn::Graphics::popClipArea(); m_renderbackend->popClipArea(); } bool SdlGuiGraphics::pushClipArea(fcn::Rectangle area) { fcn::Graphics::pushClipArea(area); // Due to some odd conception in Fifechan some of area // has xOffset and yOffset > 0. And if it happens we // need to offset our clip area. Or we can use Fifechan stack. const fcn::ClipRectangle& top = mClipStack.top(); m_renderbackend->pushClipArea( Rect(top.x, top.y, top.width, top.height), false); return true; } void SdlGuiGraphics::popClipArea() { fcn::Graphics::popClipArea(); m_renderbackend->popClipArea(); } void SdlGuiGraphics::setColor(const fcn::Color& color) { mColor = color; } } fifengine-0.4.2/engine/core/gui/fifechan/base/sdl/sdl_gui_graphics.h000066400000000000000000000065731341615052600253640ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_GUI_SDL_GRAPHICS_H #define FIFE_GUI_SDL_GRAPHICS_H // Standard C++ library includes // 3rd party library includes #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src dir namespace FIFE { class RenderBackend; /** Overrides Fifechan Graphics to enable usage of normal fife images & related facilities */ class SdlGuiGraphics: public fcn::SDLGraphics { public: /** Constructor */ SdlGuiGraphics(); void updateTarget(); virtual void drawImage(const fcn::Image* image, int32_t srcX, int32_t srcY, int32_t dstX, int32_t dstY, int32_t width, int32_t height); virtual void drawText(const std::string& text, int32_t x, int32_t y, uint32_t alignment); virtual void drawPoint(int32_t x, int32_t y); virtual void drawLine(int32_t x1, int32_t y1, int32_t x2, int32_t y2); virtual void drawLine(int32_t x1, int32_t y1, int32_t x2, int32_t y2, uint32_t width); virtual void drawPolyLine(const fcn::PointVector& points, uint32_t width); virtual void drawBezier(const fcn::PointVector& points, int32_t steps, uint32_t width); virtual void drawRectangle(const fcn::Rectangle& rectangle); virtual void fillRectangle(const fcn::Rectangle& rectangle); virtual void drawCircle(const fcn::Point& p, uint32_t radius); virtual void drawFillCircle(const fcn::Point& p, uint32_t radius); virtual void drawCircleSegment(const fcn::Point& p, uint32_t radius, int32_t sangle, int32_t eangle); virtual void drawFillCircleSegment(const fcn::Point& p, uint32_t radius, int32_t sangle, int32_t eangle); virtual void _beginDraw(); virtual void _endDraw(); virtual bool pushClipArea(fcn::Rectangle area); virtual void popClipArea(); virtual void setColor(const fcn::Color& color); private: RenderBackend* m_renderbackend; }; } #endif fifengine-0.4.2/engine/core/gui/fifechan/console/000077500000000000000000000000001341615052600216405ustar00rootroot00000000000000fifengine-0.4.2/engine/core/gui/fifechan/console/commandline.cpp000066400000000000000000000107741341615052600246430ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/time/timeevent.h" #include "util/time/timemanager.h" #include "commandline.h" namespace FIFE { using namespace fcn; CommandLine::CommandLine() : fcn::TextField(), m_history_position(0) { m_blinkTimer.setInterval(500); m_blinkTimer.setCallback(std::bind(&CommandLine::toggleCaretVisible,this)); m_blinkTimer.start(); m_suppressBlinkTimer.setInterval(2000); m_suppressBlinkTimer.setCallback(std::bind(&CommandLine::startBlinking,this)); } CommandLine::~CommandLine() { } void CommandLine::toggleCaretVisible() { m_caretVisible = !m_caretVisible; } void CommandLine::stopBlinking() { m_suppressBlinkTimer.start(); m_blinkTimer.stop(); m_caretVisible = true; } void CommandLine::startBlinking() { m_suppressBlinkTimer.stop(); m_blinkTimer.start(); } void CommandLine::keyPressed(fcn::KeyEvent &keyEvent) { fcn::Key key = keyEvent.getKey(); int32_t keyType = key.getValue(); if (keyType == Key::Left && getCaretPosition() > 0) { TextField::keyPressed(keyEvent); } else if (keyType == Key::Right && getCaretPosition() < getText().size()) { TextField::keyPressed(keyEvent); } else if (keyType == Key::Down && !m_history.empty()) { if( m_history_position < m_history.size() ) { if( ++m_history_position == m_history.size() ) { setText( m_cmdline ); } else { setText( m_history[m_history_position] ); } }; } else if (keyType == Key::Up && !m_history.empty()) { if( m_history_position > 0 ) { if( m_history_position == m_history.size() ) { m_cmdline = getText(); } --m_history_position; setText( m_history[m_history_position] ); }; } else if (keyType == Key::Delete && getCaretPosition() < getText().size()) { TextField::keyPressed(keyEvent); } else if (keyType == Key::Backspace && getCaretPosition() > 0) { TextField::keyPressed(keyEvent); } else if (keyType == Key::Enter) { if( getText() != "" ) { if(m_callback) { m_callback( getText() ); } m_history.push_back( getText() ); m_history_position = m_history.size(); setText(""); } } else if (keyType == Key::Home) { setCaretPosition(0); } else if (keyType == Key::End) { setCaretPosition(getText().size()); } else if (key.isCharacter() || static_cast(key.getValue()) > 255) { TextField::keyPressed(keyEvent); } stopBlinking(); fixScroll(); } void CommandLine::drawCaret(fcn::Graphics * graphics, int32_t x) { if( !m_caretVisible ) return; graphics->setColor(getForegroundColor()); graphics->drawLine(x, getHeight() - 2, x, 1); graphics->drawLine(x+1, getHeight() - 2, x+1, 1); } void CommandLine::setCallback(const type_callback& cb) { m_callback = cb; } } fifengine-0.4.2/engine/core/gui/fifechan/console/commandline.h000066400000000000000000000055511341615052600243050ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_FIFECHAN_ADDON_COMMANDLINE_H #define FIFE_FIFECHAN_ADDON_COMMANDLINE_H // Standard C++ library includes #include #include #include // 3rd party library includes #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/time/timer.h" namespace FIFE { /** A Command line widget */ class CommandLine : public fcn::TextField { public: typedef std::function type_callback; /** Constructor */ CommandLine(); /** Destructor */ ~CommandLine(); void keyPressed(fcn::KeyEvent& keyEvent); virtual void drawCaret(fcn::Graphics * graphics, int32_t x); /** Set callback on pressing the ENTER key */ void setCallback(const type_callback& cb); /** Toggle the caret visibility */ void toggleCaretVisible(); /** Start blinking the caret */ void startBlinking(); /** Stop blinking the caret for a few seconds */ void stopBlinking(); private: type_callback m_callback; std::vector m_history; size_t m_history_position; std::string m_cmdline; bool m_caretVisible; Timer m_blinkTimer; Timer m_suppressBlinkTimer; }; } #endif fifengine-0.4.2/engine/core/gui/fifechan/console/console.cpp000066400000000000000000000201741341615052600240120ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes #include // 3rd party library includes #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "video/renderbackend.h" #include "util/time/timemanager.h" #include "util/log/logger.h" #include "util/base/exception.h" #include "gui/fifechan/fifechanmanager.h" #include "gui/fifechan/base/gui_font.h" #include "commandline.h" #include "console.h" namespace FIFE { const unsigned Console::m_maxOutputRows = 50; static Logger _log(LM_CONSOLE); Console::Console() : fcn::Container(), m_consoleexec(0), m_input(new CommandLine()), m_output(new fcn::TextBox()), m_outputscrollarea(new fcn::ScrollArea(m_output)), m_status(new fcn::Label()), m_toolsbutton(new fcn::Button("Tools")) { reLayout(); add(m_outputscrollarea); add(m_input); add(m_status); add(m_toolsbutton); setOpaque(true); m_input->setCallback(std::bind1st( std::mem_fun(&Console::execute), this) ); m_prompt = "-- "; m_isAttached = false; m_fpsTimer.setInterval(500); m_fpsTimer.setCallback(std::bind(&Console::updateCaption, this) ); m_hiding = true; m_animationTimer.setInterval(20); m_animationTimer.setCallback(std::bind(&Console::updateAnimation, this) ); m_toolsbutton->addActionListener(this); m_toolsbutton->setFocusable(false); m_input->addFocusListener(this); GuiFont* font = FifechanManager::instance()->createFont(); font->setColor(255,255,255); setIOFont(font); } void Console::reLayout() { int32_t w, h, b, input_h, bbar_h, button_w; w = RenderBackend::instance()->getScreenWidth() * 4/5; h = RenderBackend::instance()->getScreenHeight() * 4/5; b = 0; input_h = getFont()->getHeight(); bbar_h = input_h; button_w = 80; fcn::Color black(0x00,0,0,0xff); fcn::Color white(0xff,0xff,0xff,0xff); fcn::Color dark(50,60,50,0xff); setSize(w, h); setPosition((RenderBackend::instance()->getScreenWidth() - w) / 2,-h); setBorderSize(0); setForegroundColor(white); setBackgroundColor(black); setBaseColor(dark); setSize(w, h); m_outputscrollarea->setSize(w - 2*b, h - input_h - 3*b - bbar_h); m_outputscrollarea->setPosition(b,0); m_input->setPosition(b, h - input_h - b - bbar_h); m_input->setSize(w - 2*b, input_h); m_status->setPosition(b, h - b - bbar_h); m_status->setSize(w - 2*b, bbar_h); m_toolsbutton->setPosition(w - button_w, h - b - bbar_h); m_toolsbutton->setSize(button_w, bbar_h); m_output->setBackgroundColor(black); m_output->setFocusable(false); m_outputscrollarea->setBackgroundColor(black); m_outputscrollarea->setBaseColor(dark); m_input->setForegroundColor(white); m_input->setBackgroundColor(black); m_status->setForegroundColor(white); m_status->setBackgroundColor(black); m_toolsbutton->setForegroundColor(white); m_toolsbutton->setBackgroundColor(black); m_toolsbutton->setBaseColor(dark); m_hiddenPos = -h; m_animationDelta = h/6; } Console::~Console() { doHide(); remove(m_input); remove(m_outputscrollarea); remove(m_status); delete m_output; delete m_input; delete m_outputscrollarea; delete m_status; delete m_toolsbutton; } void Console::updateCaption() { std::string caption = "FIFE Console - FPS: "; double fps = 1e3/TimeManager::instance()->getAverageFrameTime(); caption += std::to_string(fps); m_status->setCaption( caption ); } void Console::updateAnimation() { if (m_hiding){ setPosition(getX(), getY() - m_animationDelta); if (getY() <= m_hiddenPos){ doHide(); m_animationTimer.stop(); } }else{ setPosition(getX(), getY() + m_animationDelta); if (getY() >= 0){ setPosition(getX(), 0); m_animationTimer.stop(); } } } void Console::clear() { m_output->setText(""); } void Console::doShow() { if (m_isAttached) return; m_isAttached = true; FifechanManager::instance()->add(this); FifechanManager::instance()->getTopContainer()->moveToTop(this); // Assure the input field is focused when shown. m_input->requestFocus(); m_fpsTimer.start(); } void Console::doHide() { if (!m_isAttached) return; m_isAttached = false; FifechanManager::instance()->remove(this); m_fpsTimer.stop(); } void Console::show() { if(m_hiding) { m_hiding = false; doShow(); m_animationTimer.start(); } } void Console::hide() { if(!m_hiding) { m_hiding = true; m_animationTimer.start(); } } void Console::toggleShowHide() { m_hiding = !m_hiding; if(!m_hiding) doShow(); m_animationTimer.start(); } void Console::execute(std::string cmd) { FL_DBG(_log, LMsg("in execute with command ") << cmd); if (cmd.empty()) return; // copy input to output println(m_prompt + cmd); // run the command try { if (m_consoleexec) { std::string resp = m_consoleexec->onConsoleCommand(cmd); println(resp); } else { FL_WARN(_log, LMsg("ConsoleExecuter not bind, but command received: ") << cmd.c_str()); } } catch (const FIFE::Exception & e) { FL_WARN(_log, LMsg("Console caught exception: ") << e.what()); println(e.what()); } } void Console::println(const std::string & s) { assert(m_output); // Add the text in rows boost::char_separator separator("\n"); typedef boost::tokenizer > tokenizer; tokenizer tokens(s,separator); for(tokenizer::iterator i = tokens.begin(); i != tokens.end(); ++i) { m_output->addRow(*i); } // Assure the maximum number of rows if( m_output->getNumberOfRows() > m_maxOutputRows ) { unsigned rows = m_output->getNumberOfRows(); int32_t delta_rows = rows - m_maxOutputRows; std::vector rows_text; for(size_t i=delta_rows; i != rows; ++i) { rows_text.push_back(m_output->getTextRow(i)); } m_output->setText(""); for(size_t i=0; i != rows_text.size(); ++i) { m_output->addRow(rows_text[i]); } } // Assure the new text is visible fcn::Rectangle rect(0,m_output->getHeight(),0,0); m_outputscrollarea->showWidgetPart(m_output,rect); } void Console::action(const fcn::ActionEvent & event) { if (m_consoleexec) { m_consoleexec->onToolsClick(); } else { FL_WARN(_log, "ConsoleExecuter not bind, but tools button clicked"); } } void Console::setConsoleExecuter(ConsoleExecuter* const consoleexec) { m_consoleexec = consoleexec; } void Console::removeConsoleExecuter() { m_consoleexec = NULL; } void Console::setIOFont(GuiFont* font) { m_input->setFont(font); m_output->setFont(font); } void Console::focusLost(const fcn::Event& ) { hide(); } } fifengine-0.4.2/engine/core/gui/fifechan/console/console.h000066400000000000000000000114411341615052600234540ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_FIFECHAN_ADDON_CONSOLE_H #define FIFE_FIFECHAN_ADDON_CONSOLE_H // Standard C++ library includes #include // 3rd party library includes #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/time/timer.h" namespace FIFE { class CommandLine; class GuiFont; /** * Console executer is listener interface for console activity */ class ConsoleExecuter { public: /** Destructor */ virtual ~ConsoleExecuter() {} /** Called when console tools button is clicked */ virtual void onToolsClick() = 0; /** Called when user has typed command to console and pressed enter * @return response from executer */ virtual std::string onConsoleCommand(const std::string& command) = 0; }; /** Ingame Console */ class Console : public fcn::Container, public fcn::ActionListener, public fcn::FocusListener { public: /** Constructor */ Console(); /** Destructor */ virtual ~Console(); /** Print one or more lines to the console output */ void println(const std::string & s); /** Show the console * Adds the Console to the fifechan toplevel container * and pushes an input Context so that keys are not send to the * rest of the game. */ void show(); /** Hide the console * Removes itself from the toplevel container * and pops it's input context */ void hide(); /** Clear the console output */ void clear(); /** Toggle the console * Toggles whether the Console is shown or not. * Calls show() or hide() respectively. */ void toggleShowHide(); /** Execute a command * Normally just sends the command to runString() * Checks whether the cmd is just one token * and print it's value rather than throw an * useless error. * * @todo generalize the generated command and the regexp used. */ void execute(std::string cmd); /** Update the FPS caption * @note Is a timer callback. */ void updateCaption(); /** Update the scroll in/out animation. * @note Is a timer callback. */ void updateAnimation(); /** Callback from fifechan to respond to button press */ void action(const fcn::ActionEvent & event); /** Sets executer for the console */ void setConsoleExecuter(ConsoleExecuter* const consoleexec); /** Removes executer for the console */ void removeConsoleExecuter(); /** Layouts the console to match e.g. font changes */ void reLayout(); /** Sets the font used for the input and output areas */ void setIOFont(GuiFont* font); /** Hide if we loose focus */ void focusLost(const fcn::Event& event); private: bool m_isAttached; ConsoleExecuter* m_consoleexec; CommandLine* m_input; fcn::TextBox* m_output; fcn::ScrollArea* m_outputscrollarea; fcn::Label* m_status; fcn::Button* m_toolsbutton; static const unsigned m_maxOutputRows; std::string m_prompt; int32_t m_hiddenPos; int32_t m_animationDelta; bool m_hiding; Timer m_fpsTimer; Timer m_animationTimer; void doShow(); void doHide(); }; } #endif fifengine-0.4.2/engine/core/gui/fifechan/console/console.i000066400000000000000000000040351341615052600234560ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fife %{ #include "gui/fifechan/console/console.h" %} namespace FIFE { %feature("director") ConsoleExecuter; class ConsoleExecuter { public: virtual ~ConsoleExecuter() {} virtual void onToolsClick() = 0; virtual std::string onConsoleCommand(const std::string& command) = 0; }; class Console { public: void show(); void hide(); void clear(); void toggleShowHide(); void println( const std::string & s ); void setConsoleExecuter(ConsoleExecuter* const consoleexec); void removeConsoleExecuter(); }; } fifengine-0.4.2/engine/core/gui/fifechan/fifechanmanager.cpp000066400000000000000000000346441341615052600240130ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // 3rd party library includes #include #include #include #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #ifdef HAVE_OPENGL #include "gui/fifechan/base/opengl/opengl_gui_graphics.h" #endif #include "gui/fifechan/base/sdl/sdl_gui_graphics.h" #include "util/base/exception.h" #include "util/log/logger.h" #include "video/renderbackend.h" #include "gui/fifechan/base/gui_imageloader.h" #include "gui/fifechan/base/gui_font.h" #include "gui/fifechan/console/console.h" #include "video/fonts/fontbase.h" #include "video/fonts/truetypefont.h" #include "video/fonts/subimagefont.h" #include "eventchannel/key/key.h" #include "eventchannel/key/keyevent.h" #include "eventchannel/mouse/mouseevent.h" #include "vfs/fife_boost_filesystem.h" #include "fifechanmanager.h" namespace FIFE { static Logger _log(LM_GUI); FifechanManager::FifechanManager() : m_fcn_gui(new fcn::Gui()), m_focushandler(0), m_fcn_topcontainer(new fcn::Container()), m_imgloader(new GuiImageLoader()) , m_input(new fcn::SDLInput()), m_console(0), m_cursor(0), m_defaultfont(0), m_fonts(), m_logic_executed(false), m_enabled_console(true), m_backend("") { m_fcn_gui->setInput(m_input); fcn::Image::setImageLoader(m_imgloader); m_fcn_gui->setTop(m_fcn_topcontainer); m_focushandler = m_fcn_topcontainer->_getFocusHandler(); m_fcn_topcontainer->setOpaque(false); m_fcn_topcontainer->setFocusable(false); m_had_mouse = false; m_had_widget = false; m_lastMotionX = 0; m_lastMotionY = 0; } FifechanManager::~FifechanManager() { delete m_console; delete m_fcn_topcontainer; delete m_imgloader; delete m_input; delete m_fcn_gui; delete m_gui_graphics; std::vector::iterator i = m_fonts.begin(); while (i != m_fonts.end()) { delete *i; ++i; } } bool FifechanManager::onSdlEvent(SDL_Event& evt) { if (!m_input) { FL_WARN(_log, "FifechanManager, FifechanGUI->getInput == 0 ... discarding events!"); return false; } bool overWidget = m_fcn_topcontainer->getWidgetAt(m_lastMotionX, m_lastMotionY) != 0; switch(evt.type) { case SDL_MOUSEWHEEL: case SDL_MOUSEBUTTONDOWN: m_had_widget = overWidget; case SDL_MOUSEBUTTONUP: // Always send the button up/down events to fifechan m_input->pushInput(evt); // Button was pressed over a widget and still is over a widget // so we mark the event as processed. if( m_had_widget && overWidget ) { return true; } // Button wasn't pressed over a widget so we want to release focus // no matter what. if (!m_had_widget) { m_focushandler->focusNone(); } // Button up was processed by fifechan but there was no widget under // the mouse at the time. Don't mark it as processed here so the // other listeners have a chance to process the event. return false; case SDL_MOUSEMOTION: m_lastMotionX = evt.motion.x; m_lastMotionY = evt.motion.y; if (m_fcn_topcontainer->getWidgetAt(evt.motion.x,evt.motion.y)) { m_had_mouse = true; m_input->pushInput(evt); return true; } if( m_had_mouse ) { // We only keep the mouse if a widget/window has requested // dragging. m_had_mouse = m_focushandler->getDraggedWidget() != 0; m_input->pushInput(evt); return true; } return false; case SDL_KEYDOWN: case SDL_KEYUP: if(m_focushandler->getFocused()) { m_input->pushInput(evt); return true; } return false; case SDL_TEXTINPUT: // don't consume TEXTINPUT m_input->pushInput(evt); return false; case SDL_WINDOWEVENT: // don't consume WINDOWEVENTS m_input->pushInput(evt); return false; default: return false; } } void FifechanManager::resizeTopContainer(uint32_t x, uint32_t y, uint32_t width, uint32_t height) { if (m_backend == "SDL") { static_cast(m_gui_graphics)->updateTarget(); } else { static_cast(m_gui_graphics)->updateTarget(); } m_fcn_topcontainer->setDimension(fcn::Rectangle(x, y, width, height)); invalidateFonts(); if (m_console) { m_console->reLayout(); } } fcn::Gui* FifechanManager::getFifechanGUI() const { return m_fcn_gui; } void FifechanManager::add(fcn::Widget* widget) { if( !m_widgets.count(widget) ) { m_fcn_topcontainer->add(widget); m_widgets.insert(widget); } } void FifechanManager::remove(fcn::Widget* widget) { if( m_widgets.count(widget) ) { m_widgets.erase(widget); m_fcn_topcontainer->remove(widget); } } void FifechanManager::setConsoleEnabled(bool console) { m_enabled_console = console; } bool FifechanManager::isConsoleEnabled() const { return m_enabled_console; } void FifechanManager::init(const std::string& backend, int32_t screenWidth, int32_t screenHeight) { if( backend == "SDL" ) { m_gui_graphics = new SdlGuiGraphics(); } #ifdef HAVE_OPENGL else if (backend == "OpenGL") { m_gui_graphics = new OpenGLGuiGraphics(); } #endif else { //should never get here assert(0); } m_backend = backend; m_fcn_gui->setGraphics(m_gui_graphics); if (m_enabled_console) { m_console = new Console(); } resizeTopContainer(0, 0, screenWidth, screenHeight); } GuiFont* FifechanManager::createFont(const std::string& path, uint32_t size, const std::string& glyphs) { std::string fontpath = path; std::string fontglyphs = glyphs; int32_t fontsize = size; // Set default settings if necessary if(fontpath == "") { fontpath = m_fontpath; } if(fontsize == 0) { fontsize = m_fontsize; } if(fontglyphs == "") { fontglyphs = m_fontglyphs; } IFont* font = NULL; GuiFont* guifont = NULL; if( bfs::extension(fontpath) == ".ttf" || bfs::extension(fontpath) == ".ttc" ) { font = new TrueTypeFont(fontpath, fontsize); } else { font = new SubImageFont(fontpath, fontglyphs); } guifont = new GuiFont(font); m_fonts.push_back(guifont); return guifont; } void FifechanManager::releaseFont(GuiFont* font) { std::vector::iterator i = m_fonts.begin(); while (i != m_fonts.end()) { if ((*i) == font) { m_fonts.erase(i); delete font; return; } ++i; } } void FifechanManager::invalidateFonts() { std::vector::iterator it = m_fonts.begin(); while (it != m_fonts.end()) { (*it)->invalidate(); ++it; } } GuiFont* FifechanManager::setDefaultFont(const std::string& path, uint32_t size, const std::string& glyphs) { m_fontpath = path; m_fontsize = size; m_fontglyphs = glyphs; m_defaultfont = createFont(); fcn::Widget::setGlobalFont(m_defaultfont); if (m_console) { m_console->reLayout(); } return m_defaultfont; } void FifechanManager::turn() { if (!m_logic_executed) m_fcn_gui->logic(); m_logic_executed = false; m_fcn_gui->draw(); } KeyEvent FifechanManager::translateKeyEvent(const fcn::KeyEvent& fcnevt) { KeyEvent keyevt; if(fcnevt.getType() == fcn::KeyEvent::Pressed) keyevt.setType(KeyEvent::PRESSED); else if(fcnevt.getType() == fcn::KeyEvent::Released) keyevt.setType(KeyEvent::RELEASED); else { FL_WARN(_log, LMsg("FifechanManager::translateKeyEvent() - ") << "Unknown event type: " << fcnevt.getType()); keyevt.setType(KeyEvent::UNKNOWN); } keyevt.setShiftPressed(fcnevt.isShiftPressed()); keyevt.setControlPressed(fcnevt.isControlPressed()); keyevt.setAltPressed(fcnevt.isAltPressed()); keyevt.setMetaPressed(fcnevt.isMetaPressed()); keyevt.setNumericPad(fcnevt.isNumericPad()); // Convert from fifechan keyval to FIFE keyval int32_t keyval = fcnevt.getKey().getValue(); keyval = convertFifechanKeyToFifeKey(keyval); keyevt.setKey(Key(static_cast(keyval))); return keyevt; } MouseEvent FifechanManager::translateMouseEvent(const fcn::MouseEvent& fcnevt) { MouseEvent mouseevt; mouseevt.setShiftPressed(fcnevt.isShiftPressed()); mouseevt.setControlPressed(fcnevt.isControlPressed()); mouseevt.setAltPressed(fcnevt.isAltPressed()); mouseevt.setMetaPressed(fcnevt.isMetaPressed()); mouseevt.setX(fcnevt.getX()); mouseevt.setY(fcnevt.getY()); switch(fcnevt.getType()) { case fcn::MouseEvent::Pressed: mouseevt.setType(MouseEvent::PRESSED); break; case fcn::MouseEvent::Released: mouseevt.setType(MouseEvent::RELEASED); break; case fcn::MouseEvent::Moved: mouseevt.setType(MouseEvent::MOVED); break; case fcn::MouseEvent::Clicked: mouseevt.setType(MouseEvent::CLICKED); break; case fcn::MouseEvent::Entered: mouseevt.setType(MouseEvent::ENTERED); break; case fcn::MouseEvent::Exited: mouseevt.setType(MouseEvent::EXITED); break; case fcn::MouseEvent::Dragged: mouseevt.setType(MouseEvent::DRAGGED); break; case fcn::MouseEvent::WheelMovedDown: mouseevt.setType(MouseEvent::WHEEL_MOVED_DOWN); break; case fcn::MouseEvent::WheelMovedUp: mouseevt.setType(MouseEvent::WHEEL_MOVED_UP); break; default: mouseevt.setType(MouseEvent::UNKNOWN_EVENT); } switch(fcnevt.getButton()) { case fcn::MouseInput::Left: mouseevt.setButton(MouseEvent::LEFT); break; case fcn::MouseInput::Right: mouseevt.setButton(MouseEvent::RIGHT); break; case fcn::MouseInput::Middle: mouseevt.setButton(MouseEvent::MIDDLE); break; case fcn::MouseInput::X1: mouseevt.setButton(MouseEvent::X1); break; case fcn::MouseInput::X2: mouseevt.setButton(MouseEvent::X2); break; default: mouseevt.setButton(MouseEvent::UNKNOWN_BUTTON); break; } return mouseevt; } void FifechanManager::setTabbingEnabled(bool tabbing) { m_fcn_gui->setTabbingEnabled(tabbing); } bool FifechanManager::isTabbingEnabled() const { return m_fcn_gui->isTabbingEnabled(); } int32_t FifechanManager::convertFifechanKeyToFifeKey(int32_t value) { switch (value) { case fcn::Key::Tab: value = Key::TAB; break; case fcn::Key::LeftAlt: value = Key::LEFT_ALT; break; case fcn::Key::RightAlt: value = Key::RIGHT_ALT; break; case fcn::Key::LeftShift: value = Key::LEFT_SHIFT; break; case fcn::Key::RightShift: value = Key::RIGHT_SHIFT; break; case fcn::Key::LeftControl: value = Key::LEFT_CONTROL; break; case fcn::Key::RightControl: value = Key::RIGHT_CONTROL; break; case fcn::Key::Backspace: value = Key::BACKSPACE; break; case fcn::Key::Pause: value = Key::PAUSE; break; case fcn::Key::Space: value = Key::SPACE; break; case fcn::Key::Escape: value = Key::ESCAPE; break; case fcn::Key::Delete: value = Key::DELETE; break; case fcn::Key::Insert: value = Key::INSERT; break; case fcn::Key::Home: value = Key::HOME; break; case fcn::Key::End: value = Key::END; break; case fcn::Key::PageUp: value = Key::PAGE_UP; break; case fcn::Key::PrintScreen: value = Key::PRINT_SCREEN; break; case fcn::Key::PageDown: value = Key::PAGE_DOWN; break; case fcn::Key::F1: value = Key::F1; break; case fcn::Key::F2: value = Key::F2; break; case fcn::Key::F3: value = Key::F3; break; case fcn::Key::F4: value = Key::F4; break; case fcn::Key::F5: value = Key::F5; break; case fcn::Key::F6: value = Key::F6; break; case fcn::Key::F7: value = Key::F7; break; case fcn::Key::F8: value = Key::F8; break; case fcn::Key::F9: value = Key::F9; break; case fcn::Key::F10: value = Key::F10; break; case fcn::Key::F11: value = Key::F11; break; case fcn::Key::F12: value = Key::F12; break; case fcn::Key::F13: value = Key::F13; break; case fcn::Key::F14: value = Key::F14; break; case fcn::Key::F15: value = Key::F15; break; case fcn::Key::NumLock: value = Key::NUM_LOCK; break; case fcn::Key::CapsLock: value = Key::CAPS_LOCK; break; case fcn::Key::ScrollLock: value = Key::SCROLL_LOCK; break; case fcn::Key::LeftSuper: value = Key::LEFT_SUPER; break; case fcn::Key::RightSuper: value = Key::RIGHT_SUPER; break; case fcn::Key::AltGr: value = Key::ALT_GR; break; case fcn::Key::Up: value = Key::UP; break; case fcn::Key::Down: value = Key::DOWN; break; case fcn::Key::Left: value = Key::LEFT; break; case fcn::Key::Right: value = Key::RIGHT; break; case fcn::Key::Enter: value = Key::ENTER; break; default: // Convert from unicode to lowercase letters if (value >= 1 && value <= 26) { // Control characters value = value - 1 + 'a'; } else if (value >= 'A' && value <= 'Z') { value = value - 'A' + 'a'; } // FIXME: Accented characters (á) will not get converted properly. break; } return value; } } fifengine-0.4.2/engine/core/gui/fifechan/fifechanmanager.h000066400000000000000000000157151341615052600234560ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_GUI_FIFECHANMANAGER_H #define FIFE_GUI_FIFECHANMANAGER_H // Standard C++ library includes #include // 3rd party library includes #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/fife_stdint.h" #include "util/base/singleton.h" #include "eventchannel/sdl/isdleventlistener.h" #include "gui/guimanager.h" namespace fcn { class Gui; class Container; class Widget; class SDLInput; class FocusHandler; } namespace FIFE { class GuiImageLoader; class Console; class Cursor; class KeyEvent; class MouseEvent; class IFont; class GuiFont; /* GUI Fifechan Manager. * * This class controls the Fifechan GUI system in FIFE. */ class FifechanManager : public IGUIManager, public DynamicSingleton { public: /** Constructor. */ FifechanManager(); /** Destructor. */ virtual ~FifechanManager(); /** Gets the member pointer to the Fifechan GUI. * * @return The member pointer to the Fifechan GUI. */ fcn::Gui* getFifechanGUI() const; /** Performs the GUI logic and draws the GUI accordingly. * * This will be called each frame. */ virtual void turn(); /** Inits the Fifechan GUI Manager. * @param backend The GUI backend object to use * @param screenWidth width for the gui top container * @param screenHeight height for the gui top container */ void init(const std::string& backend, int32_t screenWidth, int32_t screenHeight); /** Resizes the top container. * * @param x The new starting X coordinate. * @param y The new starting Y coordinate. * @param width The new width. * @param height The new height. */ void resizeTopContainer(uint32_t x, uint32_t y, uint32_t width, uint32_t height); /** Adds a new widget. * * @param widget A pointer to the widget to add. */ void add(fcn::Widget* widget); /** Removes a widget. * * @param widget A pointer to the widget to remove. */ void remove(fcn::Widget* widget); /** Gets the top container. * * @return The top container. */ fcn::Container* getTopContainer() const { return m_fcn_topcontainer; } /** Gets the console. * * @return The console. */ Console* getConsole() const { return m_console; }; /** Enables the console, or not. * * @param console True if the console should be enabled, false otherwise. * @see isConsoleEnabled, getConsole */ void setConsoleEnabled(bool console); /** Checks if the console is enabled, or not. * * @return True if the console is enabled, false otherwise. * @see setConsoleEnabled, getConsole */ bool isConsoleEnabled() const; /** Sets the cursor. * * @param cursor The pointer to the cursor class. */ void setCursor(Cursor* cursor) { m_cursor = cursor; } /** Gets the cursor. * * @return The pointer to the cursor class. */ Cursor* getCursor() const { return m_cursor; } /** Set the global font properties. */ GuiFont* setDefaultFont(const std::string& path, uint32_t size, const std::string& glyphs); /** Gets the default font */ GuiFont* getDefaultFont() { return m_defaultfont; }; /** Gets font with given properties. Note that font will be owned by Fifechan GUI Manager */ GuiFont* createFont(const std::string& path = "", uint32_t size = 0, const std::string& glyphs = ""); /** Releases given font. */ void releaseFont(GuiFont* font); void invalidateFonts(); virtual bool onSdlEvent(SDL_Event& evt); KeyEvent translateKeyEvent(const fcn::KeyEvent& evt); MouseEvent translateMouseEvent(const fcn::MouseEvent& evt); /** * Sets tabbing enabled, or not. Tabbing is the usage of * changing focus by utilising the tab key. * * @param tabbing True if tabbing should be enabled, false otherwise. * @see isTabbingEnabled */ void setTabbingEnabled(bool tabbing); /** * Checks if tabbing is enabled. * * @return True if tabbing is enabled, false otherwise. * @see setTabbingEnabled */ bool isTabbingEnabled() const; protected: static int32_t convertFifechanKeyToFifeKey(int32_t value); private: // The Fifechan GUI. fcn::Gui* m_fcn_gui; // Fifechan Graphics fcn::Graphics* m_gui_graphics; // Focus handler for input management fcn::FocusHandler* m_focushandler; // The top container of the GUI. fcn::Container* m_fcn_topcontainer; // The imageloader. GuiImageLoader* m_imgloader; // The input controller. fcn::SDLInput *m_input; // The console. Console* m_console; // Acess to the Cursor class. Cursor* m_cursor; //The default font GuiFont* m_defaultfont; // The fonts used std::vector m_fonts; // Added widgets std::set m_widgets; // Used to accept mouse motion events that leave widget space bool m_had_mouse; bool m_had_widget; // Track last motion event position int32_t m_lastMotionX; int32_t m_lastMotionY; // default font settings std::string m_fontpath; std::string m_fontglyphs; int32_t m_fontsize; // true, if fifechan logic has already been executed for this round bool m_logic_executed; // True if the console should be created bool m_enabled_console; std::string m_backend; }; } #endif fifengine-0.4.2/engine/core/gui/fifechan/fifechanmanager.i000066400000000000000000000054061341615052600234530ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fife %{ #include #include "gui/fifechan/fifechanmanager.h" #include "gui/guimanager.h" %} %include "gui/guimanager.i" namespace fcn { class Widget; } namespace FIFE { class Console; class Cursor; class FifechanManager : public IGUIManager { public: FifechanManager(); virtual ~FifechanManager(); void init(const std::string& backend, int32_t screenWidth, int32_t screenHeight); Console* getConsole() const; void setConsoleEnabled(bool console); bool isConsoleEnabled() const; void setCursor(Cursor* cursor); Cursor* getCursor() const; void add(fcn::Widget* widget); void remove(fcn::Widget* widget); GuiFont* createFont(const std::string& path, uint32_t size, const std::string& glyphs); void releaseFont(GuiFont* font); GuiFont* setDefaultFont(const std::string& path, uint32_t size, const std::string& glyphs); GuiFont* getDefaultFont(); KeyEvent translateKeyEvent(const fcn::KeyEvent& evt); MouseEvent translateMouseEvent(const fcn::MouseEvent& evt); void setTabbingEnabled(bool tabbing); bool isTabbingEnabled() const; private: virtual void turn(); virtual void resizeTopContainer(uint32_t x, uint32_t y, uint32_t width, uint32_t height); virtual bool onSdlEvent(SDL_Event& evt); }; } fifengine-0.4.2/engine/core/gui/fifechan/lib/000077500000000000000000000000001341615052600207445ustar00rootroot00000000000000fifengine-0.4.2/engine/core/gui/fifechan/lib/fifechanlistener.i000066400000000000000000000065671341615052600244450ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fifechan %{ #include #include #include #include %} namespace fcn { %feature("director") MouseListener; class MouseListener { public: virtual ~MouseListener(); virtual void mouseEntered(fcn::MouseEvent& mouseEvent); virtual void mouseExited(fcn::MouseEvent& mouseEvent); virtual void mousePressed(fcn::MouseEvent& mouseEvent); virtual void mouseReleased(fcn::MouseEvent& mouseEvent); virtual void mouseClicked(fcn::MouseEvent& mouseEvent); virtual void mouseWheelMovedUp(fcn::MouseEvent& mouseEvent); virtual void mouseWheelMovedDown(fcn::MouseEvent& mouseEvent); virtual void mouseWheelMovedRight(fcn::MouseEvent& mouseEvent); virtual void mouseWheelMovedLeft(fcn::MouseEvent& mouseEvent); virtual void mouseMoved(fcn::MouseEvent& mouseEvent); virtual void mouseDragged(fcn::MouseEvent& mouseEvent); protected: MouseListener() { } }; %feature("director") KeyListener; class KeyListener { public: virtual ~KeyListener(); virtual void keyPressed(fcn::KeyEvent& keyEvent); virtual void keyReleased(fcn::KeyEvent& keyEvent); protected: KeyListener() { } }; %feature("director") ActionListener; class ActionListener { public: virtual ~ActionListener() { } virtual void action(const fcn::ActionEvent& actionEvent) = 0; }; %feature("director") WidgetListener; class WidgetListener { public: virtual ~WidgetListener() { } virtual void widgetResized(const fcn::Event& event); virtual void widgetMoved(const fcn::Event& event); virtual void widgetHidden(const fcn::Event& event); virtual void widgetShown(const fcn::Event& event); virtual void ancestorMoved(const fcn::Event& event); virtual void ancestorHidden(const fcn::Event& event); virtual void ancestorShown(const fcn::Event& event); protected: WidgetListener() { } }; } fifengine-0.4.2/engine/core/gui/fifechan/lib/widgets.i000066400000000000000000000600051341615052600225650ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fifechan %{ #include %} namespace fcn { class Font; class Image; class ActionListener; class MouseListener; class KeyListener; inline const char* getVersion(); inline int getMajor(); inline int getMinor(); inline int getPatch(); inline const char* getHash(); %nodefaultctor; class Graphics { public: enum Alignment { Left = 0, Center, Right }; }; %clearnodefaultctor; class Color { public: Color(); Color(int32_t color); Color(int32_t r, int32_t g, int32_t b, int32_t a = 255); Color operator+(const Color& color) const; Color operator-(const Color& color) const; Color operator*(float value) const; bool operator==(const Color& color) const; bool operator!=(const Color& color) const; int32_t r; int32_t g; int32_t b; int32_t a; }; class Size { public: Size(int32_t width = 0, int32_t height = 0); ~Size(); int32_t getWidth() const; int32_t getHeight() const; void setWidth(int32_t width); void setHeight(int32_t height); }; class Point { public: int32_t x; int32_t y; explicit Point(int32_t _x = 0, int32_t _y = 0); Point(const Point& rhs); Point operator+(const Point& p) const; Point operator-(const Point& p) const; Point& operator+=(const Point& p); Point& operator-=(const Point& p); Point operator*(const int32_t& i) const; Point operator/(const int32_t& i) const; bool operator==(const Point& p) const; bool operator!=(const Point& p) const; int32_t length() const; void normalize(); void rotate(int32_t angle); void rotate(const Point& origin, int32_t angle); void set(int32_t _x, int32_t _y); }; typedef std::vector PointVector; class Widget { public: enum SelectionMode { Selection_None = 0, Selection_Border = 1, Selection_Background = 2 }; /* Widget(); */ /* virtual ~Widget(); */ virtual Widget* getParent() const; virtual void setWidth(int32_t width); virtual int32_t getWidth() const; virtual void setHeight(int32_t height); virtual int32_t getHeight() const; virtual void setSize(int32_t width, int32_t height); virtual void setX(int32_t x); virtual int32_t getX() const; virtual void setY(int32_t y); virtual int32_t getY() const; virtual void setPosition(int32_t x, int32_t y); void setOutlineSize(uint32_t size); uint32_t getOutlineSize() const; void setBorderSize(uint32_t size); uint32_t getBorderSize() const; void setMargin(int32_t margin); void setMarginTop(int32_t margin); int32_t getMarginTop() const; void setMarginRight(int32_t margin); int32_t getMarginRight() const; void setMarginBottom(int32_t margin); int32_t getMarginBottom() const; void setMarginLeft(int32_t margin); int32_t getMarginLeft() const; void setPadding(uint32_t padding); void setPaddingTop(uint32_t padding); uint32_t getPaddingTop() const; void setPaddingRight(uint32_t padding); uint32_t getPaddingRight() const; void setPaddingBottom(uint32_t padding); uint32_t getPaddingBottom() const; void setPaddingLeft(uint32_t padding); uint32_t getPaddingLeft() const; virtual void setFocusable(bool focusable); virtual bool isFocusable() const; virtual bool isFocused() const; virtual void setEnabled(bool enabled); virtual bool isEnabled() const; virtual void setVisible(bool visible); virtual bool isVisible() const; virtual bool isSetVisible() const; virtual void setBaseColor(const Color& color); virtual const Color& getBaseColor() const; virtual void setForegroundColor(const Color& color); virtual const Color& getForegroundColor() const; virtual void setBackgroundColor(const Color& color); virtual const Color& getBackgroundColor() const; virtual void setSelectionColor(const Color& color); virtual const Color& getSelectionColor() const; virtual void setOutlineColor(const Color& color); virtual const Color& getOutlineColor() const; virtual void setBorderColor(const Color& color); virtual const Color& getBorderColor() const; void setSelectionMode(SelectionMode mode); SelectionMode getSelectionMode() const; void setMinSize(const Size& size); const Size& getMinSize() const; void setMaxSize(const Size& size); const Size& getMaxSize() const; void setFixedSize(const Size& size); const Size& getFixedSize() const; bool isFixedSize() const; void setVerticalExpand(bool expand); bool isVerticalExpand() const; void setHorizontalExpand(bool expand); bool isHorizontalExpand() const; virtual bool isLayouted(); virtual void adaptLayout(bool top=true); virtual void resizeToContent(bool recursiv=true); virtual void adjustSize(); virtual void expandContent(bool recursiv=true); virtual void requestFocus(); virtual void requestMoveToTop(); virtual void requestMoveToBottom(); virtual void setActionEventId(const std::string& actionEventId); virtual const std::string& getActionEventId() const; virtual void getAbsolutePosition(int32_t& OUTPUT, int32_t& OUTPUT) const; Font *getFont() const; static void setGlobalFont(Font* font); virtual void setFont(Font* font); virtual bool isTabInEnabled() const; virtual void setTabInEnabled(bool enabled); virtual bool isTabOutEnabled() const; virtual void setTabOutEnabled(bool enabled); virtual bool isModalFocusable() const; virtual bool isModalMouseInputFocusable() const; virtual void requestModalFocus(); virtual void requestModalMouseInputFocus(); virtual void releaseModalFocus(); virtual void releaseModalMouseInputFocus(); virtual bool isModalFocused() const; virtual bool isModalMouseInputFocused() const; virtual Widget *getWidgetAt(int32_t x, int32_t y); virtual void moveToTop(Widget* widget) { }; virtual void moveToBottom(Widget* widget) { }; virtual void focusNext() { }; virtual void focusPrevious() { }; virtual void addActionListener(ActionListener* actionListener); virtual void removeActionListener(ActionListener* actionListener); virtual void addMouseListener(MouseListener* actionListener); virtual void removeMouseListener(MouseListener* actionListener); virtual void addKeyListener(KeyListener* actionListener); virtual void removeKeyListener(KeyListener* actionListener); virtual void addWidgetListener(WidgetListener* widgetListener); virtual void removeWidgetListener(WidgetListener* widgetListener); /* protected: */ virtual void draw(Graphics* graphics) = 0; }; %feature("notabstract") Spacer; class Spacer: public Widget { public: Spacer(); virtual ~Spacer(); virtual void resizeToContent(bool recursiv=true); }; %feature("notabstract") Container; class Container: public Widget { public: Container(); virtual ~Container(); virtual void setOpaque(bool opaque); virtual bool isOpaque() const; virtual void add(Widget* widget); virtual void add(Widget* widget, int32_t x, int32_t y); virtual void remove(Widget* widget); virtual void clear(); enum LayoutPolicy { Absolute, AutoSize, Vertical, Horizontal, Circular }; void setLayout(LayoutPolicy policy); LayoutPolicy getLayout() const; virtual void setUniformSize(bool uniform); virtual bool isUniformSize() const; virtual void setVerticalSpacing(uint32_t spacing); virtual uint32_t getVerticalSpacing() const; virtual void setHorizontalSpacing(uint32_t spacing); virtual uint32_t getHorizontalSpacing() const; void setBackgroundWidget(Widget* widget); Widget* getBackgroundWidget(); }; %feature("notabstract") Button; class Button: public Widget { public: Button(); Button(const std::string& caption); virtual void setCaption(const std::string& caption); virtual const std::string& getCaption() const; void setActive(bool state); bool isActive() const; virtual void setAlignment(Graphics::Alignment alignment); virtual Graphics::Alignment getAlignment() const; void setDownXOffset(int32_t offset); int32_t getDownXOffset() const; void setDownYOffset(int32_t offset); int32_t getDownYOffset() const; void setDownOffset(int32_t x, int32_t y); virtual void adjustSize(); /*virtual bool isPressed() const;*/ }; %feature("notabstract") ImageButton; class ImageButton: public Button { public: ImageButton(); ImageButton(const Image* image); virtual ~ImageButton(); void setUpImage(const Image* image); const Image* getUpImage() const; void setDownImage(const Image* image); const Image* getDownImage() const; void setHoverImage(const Image* image); const Image* getHoverImage() const; void setInactiveUpImage(const Image* image); const Image* getInactiveUpImage() const; void setInactiveDownImage(const Image* image); const Image* getInactiveDownImage() const; void setInactiveHoverImage(const Image* image); const Image* getInactiveHoverImage() const; virtual void resizeToContent(bool recursiv=true); virtual void adjustSize(); }; %feature("notabstract") ToggleButton; class ToggleButton: public ImageButton { public: ToggleButton(); ToggleButton(const std::string &caption, const std::string &group, bool selected = false); ~ToggleButton(); virtual bool isSelected() const; virtual void setSelected(bool selected); virtual void toggleSelected(); void setGroup(const std::string& group); const std::string &getGroup() const; }; %feature("notabstract") CheckBox; class CheckBox: public ImageButton { public: enum MarkerStyle { Marker_Checkmark = 0, Marker_Cross, Marker_Dot, Marker_Rhombus, Marker_Image }; CheckBox(); virtual ~CheckBox(); virtual bool isSelected() const; virtual void setSelected(bool marked); virtual void toggleSelected(); void setBackgroundImage(const std::string& filename); void setBackgroundImage(const Image* image); const Image* getBackgroundImage() const; MarkerStyle getMarkerStyle() const; void setMarkerStyle(MarkerStyle mode); virtual void adjustSize(); }; %feature("notabstract") Icon; class Icon: public Widget { public: Icon(Image* image); virtual ~Icon(); void setImage(Image* image); const Image* getImage() const; bool isScaling() const; void setScaling(bool scale); bool isTiling() const; void setTiling(bool tile); void setOpaque(bool opaque); bool isOpaque() const; virtual void adjustSize(); }; %feature("notabstract") ScrollArea; class ScrollArea: public Widget { public: ScrollArea(); ScrollArea(Widget *content); ScrollArea(Widget *content,ScrollArea::ScrollPolicy hPolicy,ScrollArea::ScrollPolicy vPolicy); virtual ~ScrollArea(); virtual void setContent(Widget* widget); virtual Widget* getContent(); virtual void setHorizontalScrollPolicy(ScrollArea::ScrollPolicy hPolicy); virtual ScrollArea::ScrollPolicy getHorizontalScrollPolicy(); virtual void setVerticalScrollPolicy(ScrollArea::ScrollPolicy vPolicy); virtual ScrollArea::ScrollPolicy getVerticalScrollPolicy(); virtual void setScrollPolicy(ScrollArea::ScrollPolicy hPolicy, ScrollArea::ScrollPolicy vPolicy); virtual void setVerticalScrollAmount(int32_t vScroll); virtual int32_t getVerticalScrollAmount(); virtual void setHorizontalScrollAmount(int32_t hScroll); virtual int32_t getHorizontalScrollAmount(); virtual void setScrollAmount(int32_t hScroll, int32_t vScroll); virtual int32_t getHorizontalMaxScroll(); virtual int32_t getVerticalMaxScroll(); virtual void setScrollbarWidth(int32_t width); virtual int32_t getScrollbarWidth(); virtual void setLeftButtonScrollAmount(int32_t amount); virtual void setRightButtonScrollAmount(int32_t amount); virtual void setUpButtonScrollAmount(int32_t amount); virtual void setDownButtonScrollAmount(int32_t amount); virtual int32_t getLeftButtonScrollAmount(); virtual int32_t getRightButtonScrollAmount(); virtual int32_t getUpButtonScrollAmount(); virtual int32_t getDownButtonScrollAmount(); enum ScrollPolicy { ShowAlways, ShowNever, ShowAuto }; }; %feature("director") ListModel; class ListModel { public: virtual ~ListModel() { } virtual int32_t getNumberOfElements() = 0; virtual std::string getElementAt(int32_t i) = 0; }; %feature("notabstract") ListBox; class ListBox: public Widget { public: ListBox(); ListBox(ListModel *listModel); virtual ~ListBox() { } virtual int32_t getSelected(); virtual void setSelected(int32_t selected); virtual void setListModel(ListModel *listModel); virtual ListModel *getListModel(); virtual void adjustSize(); virtual bool isWrappingEnabled(); virtual void setWrappingEnabled(bool wrapping); }; %feature("notabstract") DropDown; class DropDown: public Widget { public: DropDown(ListModel *listModel = NULL, ScrollArea *scrollArea = NULL, ListBox *listBox = NULL); virtual ~DropDown(); virtual int32_t getSelected(); virtual void setSelected(int32_t selected); virtual void setListModel(ListModel *listModel); virtual ListModel *getListModel(); virtual void adjustHeight(); virtual void setBaseColor(const Color& color); virtual const Color& getBaseColor() const; virtual void setForegroundColor(const Color& color); virtual const Color& getForegroundColor() const; virtual void setBackgroundColor(const Color& color); virtual const Color& getBackgroundColor() const; virtual void setSelectionColor(const Color& color); virtual const Color& getSelectionColor() const; }; %feature("notabstract") RadioButton; class RadioButton: public Widget { public: RadioButton(); RadioButton(const std::string &caption, const std::string &group, bool marked=false); virtual ~RadioButton(); virtual bool isSelected() const; virtual void setSelected(bool marked); virtual const std::string &getCaption() const; virtual void setCaption(const std::string caption); virtual void setGroup(const std::string &group); virtual const std::string &getGroup() const; virtual void adjustSize(); }; %feature("notabstract") Slider; class Slider: public Widget { public: Slider(double scaleEnd = 1.0); Slider(double scaleStart, double scaleEnd); virtual ~Slider() { } virtual void setScale(double scaleStart, double scaleEnd); virtual double getScaleStart() const; virtual void setScaleStart(double scaleStart); virtual double getScaleEnd() const; virtual void setScaleEnd(double scaleEnd); virtual double getValue() const; virtual void setValue(double value); virtual void setMarkerLength(int32_t length); virtual int32_t getMarkerLength() const; virtual void setOrientation(Slider::Orientation orientation); virtual Slider::Orientation getOrientation() const; virtual void setStepLength(double length); virtual double getStepLength() const; enum Orientation { Horizontal = 0, Vertical }; }; %feature("notabstract") Window; class Window: public Container { public: Window(); Window(const std::string& caption); virtual ~Window(); virtual void setCaption(const std::string& caption); virtual const std::string& getCaption() const; virtual void setAlignment(Graphics::Alignment alignment); virtual Graphics::Alignment getAlignment() const; virtual void setTitleBarHeight(uint32_t height); virtual uint32_t getTitleBarHeight(); virtual void setMovable(bool movable); virtual bool isMovable() const; virtual void setOpaque(bool opaque); virtual bool isOpaque(); virtual void resizeToContent(); }; %feature("notabstract") AdjustingContainer; class AdjustingContainer: public Container { public: AdjustingContainer(); virtual ~AdjustingContainer(); virtual void setNumberOfColumns(uint32_t numberOfColumns); virtual uint32_t getNumberOfColumns() const; virtual void setColumnAlignment(uint32_t column, uint32_t alignment); virtual uint32_t getColumnAlignment(uint32_t column) const; virtual void adjustContent(); enum { LEFT = 0, CENTER, RIGHT }; }; %feature("notabstract") FlowContainer; class FlowContainer: public Container { public: FlowContainer(); virtual ~FlowContainer(); void setAlignment(FlowContainer::Alignment alignment); FlowContainer::Alignment getAlignment() const; void adjustContent(); enum Alignment { Left = 0, Right, Top, Bottom, Center }; }; %feature("notabstract") TextBox; class TextBox: public Widget { public: TextBox(); TextBox(const std::string& text); virtual void setText(const std::string& text); virtual std::string getText() const; virtual std::string getTextRow(int32_t row) const; virtual void setTextRow(int32_t row, const std::string& text); virtual int32_t getNumberOfRows() const; virtual int32_t getCaretPosition() const; virtual void setCaretPosition(int32_t position); virtual int32_t getCaretRow() const; virtual void setCaretRow(int32_t row); virtual int32_t getCaretColumn() const; virtual void setCaretColumn(int32_t column); virtual void setCaretRowColumn(int32_t row, int32_t column); virtual void scrollToCaret(); virtual bool isEditable() const; virtual void setEditable(bool editable); virtual void addRow(const std::string row); virtual bool isOpaque(); virtual void setOpaque(bool opaque); }; %feature("notabstract") TextField; class TextField: public Widget { public: TextField(); TextField(const std::string& text); virtual ~TextField(); virtual void setText(const std::string& text); virtual std::string getText() const; virtual void adjustSize(); virtual void adjustHeight(); virtual void setCaretPosition(uint32_t position); virtual uint32_t getCaretPosition() const; }; %feature("notabstract") PasswordField; class PasswordField : public TextField { public: PasswordField(const std::string& text = ""); virtual ~PasswordField(); }; %feature("notabstract") IconProgressBar; class IconProgressBar : public Widget { public: IconProgressBar(); IconProgressBar(Image *image, int32_t maxIcons); virtual ~IconProgressBar(); void setImage(Image* image); const Image* getImage() const; void setMaxIcons(int32_t maxIcons); int32_t getMaxIcons() const; void setOrientation(IconProgressBar::Orientation orientation); IconProgressBar::Orientation getOrientation() const; void advance(); void reset(); void setIconCount(int icons); int getIconCount() const; void setOpaque(bool opaque); bool isOpaque() const; enum Orientation { HORIZONTAL = 0, VERTICAL }; }; %feature("notabstract") ImageProgressBar; class ImageProgressBar : public Widget { public: ImageProgressBar(); ImageProgressBar(Image *image, int32_t maxValue); virtual ~ImageProgressBar(); void setBarImage(Image* image); const Image* getBarImage() const; void setForegroundImage(Image* image); const Image* getForegroundImage() const; void setMaxValue(int32_t maxValue); int32_t getMaxValue() const; void setValue(int32_t value); int32_t getValue() const; void setOrientation(ImageProgressBar::Orientation orientation); ImageProgressBar::Orientation getOrientation() const; void setOpaque(bool opaque); bool isOpaque() const; enum Orientation { HORIZONTAL = 0, VERTICAL }; }; %feature("notabstract") Tab; class Tab: public Container { public: Tab(); virtual ~Tab(); void setTabbedArea(fcn::TabbedArea* tabbedArea); fcn::TabbedArea* getTabbedArea(); }; %feature("notabstract") TabbedArea; class TabbedArea: public Widget { public: TabbedArea(); virtual ~TabbedArea(); void setOpaque(bool opaque); bool isOpaque() const; virtual void addTab(fcn::Tab* tab, Widget* widget); virtual void removeTabWithIndex(uint32_t index); virtual void removeTab(fcn::Tab* tab); uint32_t getNumberOfTabs() const; virtual bool isTabSelected(uint32_t index) const; virtual bool isTabSelected(fcn::Tab* tab) const; virtual void setSelectedTab(uint32_t index); virtual void setSelectedTab(fcn::Tab* tab); virtual uint32_t getSelectedTabIndex() const; fcn::Tab* getSelectedTab() const; void setBaseColor(const Color& color); void setBackgroundWidget(Widget* widget); Widget* getBackgroundWidget(); void setLayout(Container::LayoutPolicy policy); Container::LayoutPolicy getLayout() const; virtual void setUniformSize(bool uniform); virtual bool isUniformSize() const; virtual void setVerticalSpacing(uint32_t spacing); virtual uint32_t getVerticalSpacing() const; virtual void setHorizontalSpacing(uint32_t spacing); virtual uint32_t getHorizontalSpacing() const; }; %feature("notabstract") BarGraph; class BarGraph: public Widget { public: BarGraph(); BarGraph(int32_t x, int32_t y, int32_t w, int32_t h); virtual ~BarGraph(); void setBarX(int32_t x); int32_t getBarX() const; void setBarY(int32_t y); int32_t getBarY() const; void setBarPosition(int32_t x, int32_t y); void setBarPosition(const Point& pos); void setBarWidth(int32_t w); int32_t getBarWidth() const; void setBarHeight(int32_t h); int32_t getBarHeight() const; void setBarSize(int32_t w, int32_t h); void setOpaque(bool opaque); bool isOpaque() const; }; %feature("notabstract") CurveGraph; class CurveGraph: public Widget { public: CurveGraph(); CurveGraph(const PointVector& data); virtual ~CurveGraph(); void setPointVector(const PointVector& data); const PointVector& getPointVector() const; void resetPointVector(); void setThickness(uint32_t thickness); uint32_t getThickness() const; void setAutomaticControllPoints(bool acp); bool isAutomaticControllPoints() const; void setOpaque(bool opaque); bool isOpaque() const; }; %feature("notabstract") LineGraph; class LineGraph: public Widget { public: LineGraph(); LineGraph(const PointVector& data); virtual ~LineGraph(); void setPointVector(const PointVector& data); const PointVector& getPointVector() const; void resetPointVector(); void setThickness(uint32_t thickness); uint32_t getThickness() const; void setOpaque(bool opaque); bool isOpaque() const; }; %feature("notabstract") PieGraph; class PieGraph: public Widget { public: PieGraph(); PieGraph(const Point& center); virtual ~PieGraph(); void setCenterX(int32_t x); void setCenterY(int32_t y); void setCenter(int32_t x, int32_t y); int32_t getCenterX() const; int32_t getCenterY() const; void setCenter(const Point& center); const Point& getCenter() const; void setRadius(int32_t radius); int32_t getRadius() const; void addSegment(int32_t startAngle, int32_t stopAngle, const Color& color); void clearSegments(); void setOpaque(bool opaque); bool isOpaque() const; }; %feature("notabstract") PointGraph; class PointGraph: public Widget { public: PointGraph(); PointGraph(const PointVector& data); virtual ~PointGraph(); void setPointVector(const PointVector& data); const PointVector& getPointVector() const; void resetPointVector(); void setThickness(uint32_t thickness); uint32_t getThickness() const; void setOpaque(bool opaque); bool isOpaque() const; }; } namespace std { %template(FcnPointVector) vector; } fifengine-0.4.2/engine/core/gui/fifechan/util/000077500000000000000000000000001341615052600211535ustar00rootroot00000000000000fifengine-0.4.2/engine/core/gui/fifechan/util/utf8/000077500000000000000000000000001341615052600220415ustar00rootroot00000000000000fifengine-0.4.2/engine/core/gui/fifechan/util/utf8/utf8stringeditor.cpp000066400000000000000000000074071341615052600261010ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2009 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/utf8/utf8.h" #include "utf8stringeditor.h" namespace fcn { int UTF8StringEditor::nextChar(const std::string & text, int byteOffset) { std::string::const_iterator c, e; c = text.begin() + byteOffset; e = text.end(); utf8::next(c, e); return std::string(text.begin(), c).size(); } int UTF8StringEditor::prevChar(const std::string & text, int byteOffset) { std::string::const_iterator c, b; c = text.begin() + byteOffset; b = text.begin(); utf8::prior(c, b); return std::string(b, c).size(); } int UTF8StringEditor::eraseChar(std::string & text, int byteOffset) { std::string::iterator begin, cur; begin = text.begin() + byteOffset; cur = begin; utf8::next(cur, text.end()); text = std::string(text.begin(), begin) + std::string(cur, text.end()); return byteOffset; // this shouldn't change! } int UTF8StringEditor::insertChar(std::string & text, int byteOffset, int ch) { std::string newText; std::string::iterator cut; int newOffset; // make a temp string from left part of the caret (+6 extra chars) newText = text.substr(0, byteOffset) + " "; // append character utf8::append(ch, newText.begin() + byteOffset); // calculate newText real length cut = newText.begin() + byteOffset; utf8::next(cut, newText.end()); // cut the string to real length newText = std::string(newText.begin(), cut); newOffset = newText.size(); // make new text text = newText + text.substr(byteOffset); return newOffset; } int UTF8StringEditor::countChars(const std::string & text, int byteOffset) { return utf8::distance(text.begin(), text.begin() + byteOffset); } int UTF8StringEditor::getOffset(const std::string & text, int charIndex) { std::string::const_iterator cur, end; int bytes = 0, i; if (charIndex < 0) return 0; cur = text.begin(); end = text.end(); for(i = 0; i < charIndex && cur != end; i++) { utf8::next(cur, end); } return std::string(text.begin(), cur).size(); } }; fifengine-0.4.2/engine/core/gui/fifechan/util/utf8/utf8stringeditor.h000066400000000000000000000075671341615052600255550ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2009 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FCN_UTF8STRINGEDITOR_HPP #define FCN_UTF8STRINGEDITOR_HPP // Standard C++ library includes // 3rd party library includes #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder namespace fcn { /** * UTF-8 string editor. * * This is a helper class which allows to use UTF-8 strings in * your application. * * @author Przemyslaw Grzywacz */ class UTF8StringEditor { public: /** * Returns byte offset of the next character. * * @param text UTF-8 text to navigate. * @param byteOffset Byte offset of current character. * @return Byte offset of the next character. */ static int nextChar(const std::string& text, int byteOffset); /** * Returns byte offset of the previous character. * * @param text UTF-8 text to navigate. * @param byteOffset Byte offset of current character. * @return Byte offset of the previous character. */ static int prevChar(const std::string& text, int byteOffset); /** * Erase character at specified byte offset. * * @param text UTF-8 text to modify. * @param byteOffset Byte offset of the character to erase. * @return New byte offset (is equal to byteOffset). */ static int eraseChar(std::string& text, int byteOffset); /** * Insert a character at specified byte offset. * * @param text UTF-8 text to modify. * @param byteOffset Byte offset where character will be inserted. * @param ch Unicode character to insert. * @return New byte offset (after the new character). */ static int insertChar(std::string& text, int byteOffset, int ch); /** * Counts characters up to byteOffset. * * @param text UTF-8 text to navigate. * @param byteOffset Byte offset inside the text. * @return Number of characters. */ static int countChars(const std::string& text, int byteOffset); /** * Gets byte offset for character index. * * This method automaticly clips charIndex to be inside * the string + EOF * * @param text UTF-8 text to navigate. * @param charIndex Character index to move to. * @return Byte offset of character at charIndex. */ static int getOffset(const std::string& text, int charIndex); }; }; #endif // !FCN_UTF8STRINGEDITOR_HPP fifengine-0.4.2/engine/core/gui/fifechan/widgets/000077500000000000000000000000001341615052600216445ustar00rootroot00000000000000fifengine-0.4.2/engine/core/gui/fifechan/widgets/animationicon.cpp000066400000000000000000000107671341615052600252130ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2013 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE:: * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "gui/fifechan/base/gui_image.h" #include "util/base/exception.h" #include "util/time/timemanager.h" #include "animationicon.h" namespace fcn { AnimationIcon::AnimationIcon() : mTimemanager(FIFE::TimeManager::instance()), mAnimation(FIFE::AnimationPtr()), mCurrentImage(NULL), mAnimtime(0), mFrameIndex(-1), mRepeat(true), mPlay(true) { setScaling(false); setTiling(false); setOpaque(true); adjustSize(); } AnimationIcon::AnimationIcon(FIFE::AnimationPtr animation) : mTimemanager(FIFE::TimeManager::instance()), mAnimation(animation), mCurrentImage(NULL), mAnimtime(0), mFrameIndex(-1), mRepeat(true), mPlay(true) { // set first frame as new image if (mAnimation->getFrameCount() > 0) { mFrameIndex = 0; mCurrentImage = new FIFE::GuiImage(mAnimation->getFrame(mFrameIndex)); setImage(mCurrentImage); } setScaling(false); setTiling(false); setOpaque(true); adjustSize(); } AnimationIcon::~AnimationIcon() { delete mCurrentImage; } void AnimationIcon::setAnimation(FIFE::AnimationPtr animation) { mAnimation = animation; if (mPlay) { mAnimtime = mTimemanager->getTime(); } else { mAnimtime = 0; } // set first frame as new image if (mAnimation->getFrameCount() > 0) { mFrameIndex = 0; if (mCurrentImage) { delete mCurrentImage; mCurrentImage = 0; } mCurrentImage = new FIFE::GuiImage(mAnimation->getFrame(mFrameIndex)); setImage(mCurrentImage); } adjustSize(); } FIFE::AnimationPtr AnimationIcon::getAnimation() const { return mAnimation; } void AnimationIcon::setRepeating(bool repeat) { mRepeat = repeat; } bool AnimationIcon::isRepeating() const { return mRepeat; } void AnimationIcon::play() { mPlay = true; mAnimtime = mTimemanager->getTime(); } bool AnimationIcon::isPlaying() const { return mPlay; } void AnimationIcon::pause() { mPlay = false; } void AnimationIcon::stop() { mPlay = false; // set first frame as new image if (mAnimation->getFrameCount() > 0) { mFrameIndex = 0; mCurrentImage = new FIFE::GuiImage(mAnimation->getFrame(mFrameIndex)); setImage(mCurrentImage); } } void AnimationIcon::logic() { if (isPlaying()) { int32_t index = mFrameIndex; if (isRepeating()) { index = mAnimation->getFrameIndex((mTimemanager->getTime() - mAnimtime) % mAnimation->getDuration()); } else { index = mAnimation->getFrameIndex(mTimemanager->getTime() - mAnimtime); } if (index != mFrameIndex) { mFrameIndex = index; if (mCurrentImage) { delete mCurrentImage; mCurrentImage = 0; } if (mFrameIndex >= 0) { mCurrentImage = new FIFE::GuiImage(mAnimation->getFrame(mFrameIndex)); } setImage(mCurrentImage); } } } } fifengine-0.4.2/engine/core/gui/fifechan/widgets/animationicon.h000066400000000000000000000101611341615052600246440ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2013 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_GUI_WIDGETS_ANIMATIONICON_H #define FIFE_GUI_WIDGETS_ANIMATIONICON_H // Standard C++ library includes // 3rd party library includes #include #include #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/fife_stdint.h" #include "video/animation.h" namespace FIFE { class TimeManager; } namespace fcn { /** * Implements an icon capable of displaying an animation. */ class AnimationIcon : public Icon { public: /** * Default constructor. */ AnimationIcon(); /** * Constructor. * * @param animation The animation to display. */ AnimationIcon(FIFE::AnimationPtr animation); /** * Destructor. */ virtual ~AnimationIcon(); /** * Sets the animation to display. * * @param animation The animation to display. */ void setAnimation(FIFE::AnimationPtr animation); /** * Gets the current animation. * * @return The current animation. */ FIFE::AnimationPtr getAnimation() const; /** * Sets repeating of the animation. * * @param repeat True if the animation repeating is enabled, otherwise false. */ void setRepeating(bool repeat); /** * Gets repeating of the animation. * * @return True if the animation repeating is enabled, otherwise false. */ bool isRepeating() const; /** * Starts the animation from beginning. */ void play(); /** * Gets if the animation is playing. * * @return True if the animation is playing, otherwise false. */ bool isPlaying() const; /** * Stops the animation at the current frame. */ void pause(); /** * Stops the animation and sets the current frame to the first frame. */ void stop(); // Inherited from Widget virtual void logic(); protected: /** * Holds pointer to Fifes TimeManager. */ FIFE::TimeManager* mTimemanager; /** * The animation to display. */ FIFE::AnimationPtr mAnimation; /** * Currently used image. It's the current frame from the animation * encapsulated in a GuiImage. */ const Image* mCurrentImage; /** * The time as the animation was started. */ uint32_t mAnimtime; /** * The last used frame index from the animation. */ int32_t mFrameIndex; /** * True if the animation should be repeating, otherwise false. */ bool mRepeat; /** * True if the animation was started, otherwise false. */ bool mPlay; }; } #endif fifengine-0.4.2/engine/core/gui/fifechan/widgets/clicklabel.cpp000066400000000000000000000203501341615052600244350ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "gui/fifechan/base/gui_font.h" #include "util/base/exception.h" #include "video/image.h" #include "clicklabel.h" namespace fcn { ClickLabel::ClickLabel() { mGuiFont = static_cast(getFont()); setAlignment(Graphics::Left); setOpaque(true); mTextWrapping = false; setBorderSize(0); mHasMouse = false, mKeyPressed = false, mMousePressed = false; addMouseListener(this); addKeyListener(this); addFocusListener(this); addWidgetListener(this); } ClickLabel::ClickLabel(const std::string& caption) { mGuiFont = static_cast(getFont()); setCaption(caption); setAlignment(Graphics::Left); setOpaque(true); mTextWrapping = false; setBorderSize(0); mHasMouse = false, mKeyPressed = false, mMousePressed = false; adjustSize(); addMouseListener(this); addKeyListener(this); addFocusListener(this); addWidgetListener(this); } ClickLabel::~ClickLabel() { } void ClickLabel::setCaption(const std::string& caption) { mCaption = caption; mGuiFont = static_cast(getFont()); wrapText(); } const std::string& ClickLabel::getCaption() const { return mCaption; } void ClickLabel::setAlignment(Graphics::Alignment alignment) { mAlignment = alignment; } Graphics::Alignment ClickLabel::getAlignment() const { return mAlignment; } void ClickLabel::setOpaque(bool opaque) { mOpaque = opaque; } bool ClickLabel::isOpaque() const { return mOpaque; } void ClickLabel::setTextWrapping(bool textWrapping) { bool wrappingEnabled = !mTextWrapping && textWrapping; mTextWrapping = textWrapping; if (wrappingEnabled) { wrapText(); } } bool ClickLabel::isTextWrapping() const { return mTextWrapping; } void ClickLabel::wrapText() { if (isTextWrapping() && mGuiFont) { int32_t w = getWidth() - 2 * getBorderSize() - getPaddingLeft() - getPaddingRight(); mWrappedText = mGuiFont->splitTextToWidth(mCaption, w); } } void ClickLabel::setDimension(const Rectangle& dimension) { int32_t w = getWidth(); Widget::setDimension(dimension); if (getWidth() != w && isTextWrapping()) { wrapText(); } } void ClickLabel::resizeToContent(bool recursiv) { adjustSize(); } void ClickLabel::adjustSize() { if (mGuiFont) { int32_t w = getWidth(); int32_t h = 0; if (isTextWrapping()) { if (getParent()) { w = getParent()->getChildrenArea().width; } int32_t textW = w - 2 * getBorderSize() - getPaddingLeft() - getPaddingRight(); int32_t maxW = isFixedSize() ? getFixedSize().getWidth() : getMaxSize().getWidth(); if (textW < 1) { w = maxW; textW = w - 2 * getBorderSize() - getPaddingLeft() - getPaddingRight(); } else if (w > maxW) { w = std::min(w, maxW); textW = w - 2 * getBorderSize() - getPaddingLeft() - getPaddingRight(); } mWrappedText = mGuiFont->splitTextToWidth(mCaption, textW); } else { FIFE::Image* image = mGuiFont->getAsImageMultiline(mCaption); w = image->getWidth() + 2 * getBorderSize() + getPaddingLeft() + getPaddingRight(); } const std::string& text = isTextWrapping() ? mWrappedText : mCaption; FIFE::Image* image = mGuiFont->getAsImageMultiline(text); h = 2 * getBorderSize() + getPaddingTop() + getPaddingBottom() + image->getHeight(); setSize(w, h); } } void ClickLabel::draw(Graphics* graphics) { bool active = isFocused(); Rectangle offsetRec(getBorderSize(), getBorderSize(), 2 * getBorderSize(), 2 * getBorderSize()); if (isOpaque()) { Color faceColor = getBackgroundColor(); if (active && ((getSelectionMode() & Widget::Selection_Background) == Widget::Selection_Background)) { faceColor = getSelectionColor(); } graphics->setColor(faceColor); graphics->fillRectangle(offsetRec.x, offsetRec.y, getWidth() - offsetRec.width, getHeight() - offsetRec.height); } if (getBorderSize() > 0) { if (active && (getSelectionMode() & Widget::Selection_Border) == Widget::Selection_Border) { drawSelectionFrame(graphics); } else { drawBorder(graphics); } } if (mGuiFont) { graphics->setColor(getForegroundColor()); const std::string& text = isTextWrapping() ? mWrappedText : mCaption; FIFE::Image* image = mGuiFont->getAsImageMultiline(text); int32_t textX = 0; int32_t textY = offsetRec.y + getPaddingTop() + (getHeight() - offsetRec.height - getPaddingTop() - getPaddingBottom() - image->getHeight()) / 2; switch (getAlignment()) { case Graphics::Left: textX = offsetRec.x + getPaddingLeft(); break; case Graphics::Center: textX = offsetRec.x + getPaddingLeft() + (getWidth() - offsetRec.width - getPaddingLeft() - getPaddingRight() - image->getWidth()) / 2; break; case Graphics::Right: textX = getWidth() - offsetRec.x - getPaddingRight() - image->getWidth(); break; default: throw FCN_EXCEPTION("Unknown alignment."); } mGuiFont->drawMultiLineString(graphics, text, textX, textY); } } void ClickLabel::fontChanged() { mGuiFont = static_cast(getFont()); wrapText(); adjustSize(); } void ClickLabel::mousePressed(MouseEvent& mouseEvent) { if (mouseEvent.getButton() == MouseEvent::Left) { mMousePressed = true; mouseEvent.consume(); } } void ClickLabel::mouseExited(MouseEvent& mouseEvent) { mHasMouse = false; } void ClickLabel::mouseEntered(MouseEvent& mouseEvent) { mHasMouse = true; } void ClickLabel::mouseReleased(MouseEvent& mouseEvent) { if (mouseEvent.getButton() == MouseEvent::Left && mMousePressed && mHasMouse) { mMousePressed = false; distributeActionEvent(); mouseEvent.consume(); } else if (mouseEvent.getButton() == MouseEvent::Left) { mMousePressed = false; mouseEvent.consume(); } } void ClickLabel::mouseDragged(MouseEvent& mouseEvent) { mouseEvent.consume(); } void ClickLabel::keyPressed(KeyEvent& keyEvent) { Key key = keyEvent.getKey(); if (key.getValue() == Key::Enter || key.getValue() == Key::Space) { mKeyPressed = true; keyEvent.consume(); } } void ClickLabel::keyReleased(KeyEvent& keyEvent) { Key key = keyEvent.getKey(); if ((key.getValue() == Key::Enter || key.getValue() == Key::Space) && mKeyPressed) { mKeyPressed = false; distributeActionEvent(); keyEvent.consume(); } } void ClickLabel::focusLost(const Event& event) { mMousePressed = false; mKeyPressed = false; mHasMouse = false; } void ClickLabel::ancestorHidden(const Event& event) { mMousePressed = false; mKeyPressed = false; mHasMouse = false; } } fifengine-0.4.2/engine/core/gui/fifechan/widgets/clicklabel.h000066400000000000000000000135631341615052600241120ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_GUI_WIDGETS_CLICKLABEL_H #define FIFE_GUI_WIDGETS_CLICKLABEL_H // Standard C++ library includes #include // 3rd party library includes #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder namespace FIFE { class GuiFont; } namespace fcn { /** * Implementation of a label capable of displaying a single or multiline caption. * * In case text wrapping is enabled, the labels width will be the same as the width from the parent. * Or as fallback the maximal size parameter is used. * If a label is clicked an action event will be sent to all action listener's of the label. */ class ClickLabel : public Widget, public MouseListener, public KeyListener, public FocusListener, public WidgetListener { public: /** * Constructor. */ ClickLabel(); /** * Constructor. The label will be automatically resized * to fit the caption. * * @param caption The caption of the label. */ ClickLabel(const std::string& caption); virtual ~ClickLabel(); /** * Gets the caption of the label. * * @return The caption of the label. * @see setCaption */ virtual const std::string& getCaption() const; /** * Sets the caption of the label. * * @param caption The caption of the label. * @see getCaption, adjustSize */ virtual void setCaption(const std::string& caption); /** * Sets the alignment of the caption. The alignment is relative * to the center of the label. * * @param alignemnt The alignment of the caption of the label. * @see getAlignment, Graphics */ virtual void setAlignment(Graphics::Alignment alignment); /** * Gets the alignment of the caption. The alignment is relative to * the center of the label. * * @return The alignment of caption of the label. * @see setAlignmentm Graphics */ virtual Graphics::Alignment getAlignment() const; /** * Sets the opacity of the background. * * @param opaque True if opaque, false otherwise. */ virtual void setOpaque(bool opaque); /** * @return Whether this background is opaque or not. */ virtual bool isOpaque() const; /** * Sets the text wrapping of the caption. The text will be splitted * to the width of the label if enabled. * * @param textWrapping True if text wrapping is enabled, false otherwise. */ virtual void setTextWrapping(bool textWrapping); /** * Gets the text wrapping of the caption. The text will be splitted * to the width of the label if it returns true. * * @return True if text wrapping is enabled, false otherwise. */ virtual bool isTextWrapping() const; // Inherited from Widget virtual void setDimension(const Rectangle& dimension); virtual void resizeToContent(bool recursiv=true); virtual void adjustSize(); virtual void draw(Graphics* graphics); virtual void fontChanged(); // Inherited from FocusListener virtual void focusLost(const Event& event); // Inherited from MouseListener virtual void mousePressed(MouseEvent& mouseEvent); virtual void mouseReleased(MouseEvent& mouseEvent); virtual void mouseEntered(MouseEvent& mouseEvent); virtual void mouseExited(MouseEvent& mouseEvent); virtual void mouseDragged(MouseEvent& mouseEvent); // Inherited from KeyListener virtual void keyPressed(KeyEvent& keyEvent); virtual void keyReleased(KeyEvent& keyEvent); // Inherited from WidgetListener virtual void ancestorHidden(const Event& event); protected: virtual void wrapText(); /** * Holds the gui font. */ FIFE::GuiFont* mGuiFont; /** * Holds the caption of the label. */ std::string mCaption; /** * Holds the wrapped text of the label. */ std::string mWrappedText; /** * Holds the alignment of the caption. */ Graphics::Alignment mAlignment; /** * True if opaque, otherwise false. */ bool mOpaque; /** * True if text wrapping is enabled, otherwise false. */ bool mTextWrapping; /** * True if the mouse is ontop of the button, false otherwise. */ bool mHasMouse; /** * True if a key has been pressed, false otherwise. */ bool mKeyPressed; /** * True if a mouse has been pressed, false otherwise. */ bool mMousePressed; }; } #endif fifengine-0.4.2/engine/core/gui/fifechan/widgets/dockarea.cpp000066400000000000000000000273441341615052600241330ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2013 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE:: * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes #include #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "gui/fifechan/base/gui_font.h" #include "util/base/exception.h" #include "dockarea.h" namespace fcn { DockArea::DockArea(): m_activeDockArea(true), m_topSide(false), m_rightSide(false), m_bottomSide(false), m_leftSide(false), m_highlighted(false), m_highlightColor(0xc80000) { setMovable(false); setMargin(0); setPadding(0); setTopResizable(false); setRightResizable(false); setBottomResizable(false); setLeftResizable(false); } DockArea::DockArea(bool active): m_activeDockArea(active), m_topSide(false), m_rightSide(false), m_bottomSide(false), m_leftSide(false), m_highlighted(false), m_highlightColor(0xc80000) { setMovable(false); setMargin(0); setPadding(0); setTopResizable(false); setRightResizable(false); setBottomResizable(false); setLeftResizable(false); } DockArea::~DockArea() { } void DockArea::setActiveDockArea(bool active) { m_activeDockArea = active; } bool DockArea::isActiveDockArea() const { return m_activeDockArea; } void DockArea::setTopSide(bool side) { m_topSide = side; setBottomResizable(m_topSide); if (side) { setLayout(Container::Horizontal); } } bool DockArea::isTopSide() const { return m_topSide; } void DockArea::setRightSide(bool side) { m_rightSide = side; setLeftResizable(m_rightSide); if (side) { setLayout(Container::Vertical); } } bool DockArea::isRightSide() const { return m_rightSide; } void DockArea::setBottomSide(bool side) { m_bottomSide = side; setTopResizable(m_bottomSide); if (side) { setLayout(Container::Horizontal); } } bool DockArea::isBottomSide() const { return m_bottomSide; } void DockArea::setLeftSide(bool side) { m_leftSide = side; setRightResizable(m_leftSide); if (side) { setLayout(Container::Vertical); } } bool DockArea::isLeftSide() const { return m_leftSide; } void DockArea::dockWidget(Widget* widget) { add(widget); } void DockArea::undockWidget(Widget* widget) { remove(widget); } void DockArea::setHighlighted(bool highlighted) { if (highlighted != m_highlighted) { if (highlighted) { m_savedColor = getBaseColor(); setBaseColor(m_highlightColor); } else { setBaseColor(m_savedColor); } m_highlighted = highlighted; } } bool DockArea::isHighlighted() const { return m_highlighted; } void DockArea::setHighlightColor(const Color& color) { m_highlightColor = color; } const Color& DockArea::getHighlightColor() const { return m_highlightColor; } void DockArea::repositionWidget(Widget* widget) { Widget* placeBefore = NULL; Widget* placeAfter = NULL; Rectangle dim = widget->getDimension(); widget->getAbsolutePosition(dim.x, dim.y); std::list::const_iterator currChild(mChildren.begin()); std::list::const_iterator endChildren(mChildren.end()); for(; currChild != endChildren; ++currChild) { if (!(*currChild)->isVisible() || (*currChild) == widget) { continue; } Rectangle childDim = (*currChild)->getDimension(); (*currChild)->getAbsolutePosition(childDim.x, childDim.y); if (childDim.isIntersecting(dim)) { if (getLayout() == Container::Horizontal) { if (dim.x < childDim.x) { if (dim.x + dim.width <= childDim.x + childDim.width / 2) { placeBefore = *currChild; } else { placeAfter = *currChild; } } else if (dim.x >= childDim.x) { if (dim.x <= childDim.x + childDim.width / 2) { placeBefore = *currChild; } else { placeAfter = *currChild; } } } if (getLayout() == Container::Vertical) { if (dim.y < childDim.y) { if (dim.y + dim.height <= childDim.y + childDim.height / 2) { placeBefore = *currChild; } else { placeAfter = *currChild; } } else if (dim.y >= childDim.y) { if (dim.y <= childDim.y + childDim.height / 2) { placeBefore = *currChild; } else { placeAfter = *currChild; } } } } } if (placeBefore || placeAfter) { mChildren.remove(widget); if (placeBefore) { std::list::iterator it = std::find(mChildren.begin(), mChildren.end(), placeBefore); mChildren.insert(it, widget); } else { std::list::iterator it = std::find(mChildren.begin(), mChildren.end(), placeAfter); ++it; mChildren.insert(it, widget); } adaptLayout(false); } } void DockArea::repositionDockAreas() { Widget* parent = getParent(); if (parent) { DockArea* top = NULL; DockArea* right = NULL; DockArea* bottom = NULL; DockArea* left = NULL; std::list widgets = parent->getWidgetsIn(parent->getChildrenArea()); std::list::iterator it = widgets.begin(); for (; it != widgets.end(); ++it) { DockArea* tmp = dynamic_cast(*it); if (!tmp) { continue; } tmp->keepInBounds(); if (tmp->isTopSide()) { top = tmp; } else if (tmp->isRightSide()) { right = tmp; } else if (tmp->isBottomSide()) { bottom = tmp; } else if (tmp->isLeftSide()) { left = tmp; } } if (top) { if (right) { if (top->getY() + top->getHeight() >= right->getY() || top->getY() + top->getHeight() + 1 < right->getY()) { int32_t newY = top->getY() + top->getHeight() + 1; int32_t diff = newY - right->getY(); right->setY(newY); right->setHeight(right->getHeight() + diff); } } if (left) { if (top->getY() + top->getHeight() >= left->getY() || top->getY() + top->getHeight() + 1 < left->getY()) { int32_t newY = top->getY() + top->getHeight() + 1; int32_t diff = newY - left->getY(); left->setY(newY); left->setHeight(left->getHeight() + diff); } } if (bottom) { if (top->getY() + top->getHeight() >= bottom->getY()) { int32_t newY = top->getY() + top->getHeight() + 1; int32_t diff = newY - bottom->getY(); bottom->setY(newY); bottom->setHeight(bottom->getHeight() + diff); } } } if (bottom) { if (right) { if (right->getY() + right->getHeight() >= bottom->getY() || right->getY() + right->getHeight() + 1 < bottom->getY()) { Size min = right->getMinSize(); Size tmp; right->setMinSize(tmp); int32_t diff = bottom->getY() - (right->getY() + right->getHeight() + 1); right->setHeight(right->getHeight() + diff); right->setMinSize(min); } } if (left) { if (left->getY() + left->getHeight() >= bottom->getY() || left->getY() + left->getHeight() + 1 < bottom->getY()) { Size min = left->getMinSize(); Size tmp; left->setMinSize(tmp); int32_t diff = bottom->getY() - (left->getY() + left->getHeight() + 1); left->setHeight(left->getHeight() + diff); left->setMinSize(min); } } } } } void DockArea::keepInBounds() { Widget* parent = getParent(); if (!parent) { return; } Rectangle childArea = parent->getChildrenArea(); Rectangle childDim = getDimension(); if (childDim.x < childArea.x) { setX(childArea.x); } if (childDim.y < childArea.y) { setY(childArea.y); } if (m_topSide) { if ((childDim.y + childDim.height) > childArea.height) { setHeight(childArea.height - childDim.y); } } else if (m_rightSide) { if ((childDim.x + childDim.width) > childArea.width) { if (childDim.width > childArea.width) { setX(childArea.x); setWidth(childArea.width); } else { setX(childArea.width - childDim.width); } } } else if (m_bottomSide) { if ((childDim.y + childDim.height) > childArea.height) { if (childDim.height > childArea.height) { setY(childArea.y); setHeight(childArea.height); } else { setY(childArea.height - childDim.height); } } } else if (m_leftSide) { if ((childDim.x + childDim.width) > childArea.width) { setWidth(childArea.width - childDim.x); } } } void DockArea::add(Widget* widget) { ResizableWindow::add(widget); int32_t x = widget->getX(); int32_t y = widget->getY(); adaptLayout(true); widget->setPosition(x, y); repositionWidget(widget); requestMoveToTop(); } void DockArea::remove(Widget* widget) { ResizableWindow::remove(widget); adaptLayout(false); } void DockArea::resizeToContent(bool recursiv) { Rectangle oldDimension = getDimension(); if (m_resizing) { ResizableWindow::resizeToContent(recursiv); } else { Window::resizeToContent(recursiv); } if (isRightSide()) { int32_t wDiff = oldDimension.width - getWidth(); setX(oldDimension.x + wDiff); } else if (isBottomSide()) { int32_t hDiff = oldDimension.height - getHeight(); setY(oldDimension.y + hDiff); } repositionDockAreas(); } void DockArea::expandContent(bool recursiv) { Rectangle oldDimension = getDimension(); if (m_resizing) { ResizableWindow::expandContent(recursiv); } else { Window::expandContent(recursiv); } if (isRightSide()) { int32_t wDiff = oldDimension.width - getWidth(); setX(oldDimension.x + wDiff); } else if (isBottomSide()) { int32_t hDiff = oldDimension.height - getHeight(); setY(oldDimension.y + hDiff); } repositionDockAreas(); } void DockArea::mouseEntered(MouseEvent& mouseEvent) { if (!m_highlighted) { ResizableWindow::mouseEntered(mouseEvent); } } void DockArea::mouseExited(MouseEvent& mouseEvent) { if (!m_highlighted) { ResizableWindow::mouseExited(mouseEvent); } } void DockArea::mousePressed(MouseEvent& mouseEvent) { if (!m_highlighted) { ResizableWindow::mousePressed(mouseEvent); } } void DockArea::mouseReleased(MouseEvent& mouseEvent) { if (!m_highlighted) { ResizableWindow::mouseReleased(mouseEvent); if (m_resizing) { repositionDockAreas(); } } } void DockArea::mouseMoved(MouseEvent& mouseEvent) { if (!m_highlighted) { ResizableWindow::mouseMoved(mouseEvent); } } void DockArea::mouseDragged(MouseEvent& mouseEvent) { if (!m_highlighted) { ResizableWindow::mouseDragged(mouseEvent); if (m_resizing) { repositionDockAreas(); } } } } fifengine-0.4.2/engine/core/gui/fifechan/widgets/dockarea.h000066400000000000000000000073701341615052600235750ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2013 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_GUI_WIDGETS_DOCKAREA_H #define FIFE_GUI_WIDGETS_DOCKAREA_H // Standard C++ library includes // 3rd party library includes #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "resizablewindow.h" namespace fcn { class DockArea : public ResizableWindow { public: DockArea(); DockArea(bool active); virtual ~DockArea(); void setActiveDockArea(bool active); bool isActiveDockArea() const; void setTopSide(bool side); bool isTopSide() const; void setRightSide(bool side); bool isRightSide() const; void setBottomSide(bool side); bool isBottomSide() const; void setLeftSide(bool side); bool isLeftSide() const; void dockWidget(Widget* widget); void undockWidget(Widget* widget); void setHighlighted(bool highlighted); bool isHighlighted() const; /** * Sets the highlight color of the widget. * * @param color The highlight color. * @see getHighlightColor */ void setHighlightColor(const Color& color); /** * Gets the highlight color. * * @return The highlight color. * @see setHighlightColor */ const Color& getHighlightColor() const; void repositionWidget(Widget* widget); // Inherited from ResizableWindow virtual void add(Widget* widget); virtual void remove(Widget* widget); virtual void resizeToContent(bool recursiv=true); virtual void expandContent(bool recursiv=true); // Inherited from ResizableWindow / MouseListener virtual void mouseEntered(MouseEvent& mouseEvent); virtual void mouseExited(MouseEvent& mouseEvent); virtual void mousePressed(MouseEvent& mouseEvent); virtual void mouseReleased(MouseEvent& mouseEvent); virtual void mouseMoved(MouseEvent& mouseEvent); virtual void mouseDragged(MouseEvent& mouseEvent); protected: void repositionDockAreas(); void keepInBounds(); bool m_activeDockArea; bool m_topSide; bool m_rightSide; bool m_bottomSide; bool m_leftSide; bool m_highlighted; Color m_highlightColor; Color m_savedColor; }; } #endif fifengine-0.4.2/engine/core/gui/fifechan/widgets/panel.cpp000066400000000000000000000155431341615052600234570ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2013 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE:: * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "gui/fifechan/base/gui_font.h" #include "gui/fifechan/fifechanmanager.h" #include "util/base/exception.h" #include "dockarea.h" #include "panel.h" namespace fcn { Panel::Panel(): m_dockable(true), m_docked(false) { } Panel::Panel(bool dockable): m_dockable(dockable), m_docked(false) { } Panel::~Panel() { } void Panel::setDockable(bool dockable) { m_dockable = dockable; } bool Panel::isDockable() const { return m_dockable; } void Panel::setDocked(bool docked) { if (isDockable()) { if (docked && !isDocked()) { // save settings m_state.dimension = getDimension(); //m_state.innerBorder = getInnerBorderSize(); m_state.resizable = isResizable(); m_state.movable = isMovable(); setResizable(false); m_docked = true; getDockedArea()->adaptLayout(false); //resizeToContent(true); //expandContent(true); } else if (!docked && isDocked()) { m_docked = false; // restore settings //setDimension(m_state.dimension); setSize(m_state.dimension.width, m_state.dimension.height); //setInnerBorderSize(m_state.innerBorder); // center it Rectangle childrenRec = getParent()->getChildrenArea(); int32_t x = childrenRec.x + childrenRec.width / 2 - getWidth() / 2; int32_t y = childrenRec.y + childrenRec.height / 2 - getHeight() / 2; setPosition(x, y); setResizable(m_state.resizable); setMovable(m_state.movable); } } } bool Panel::isDocked() const { return m_docked; } DockArea* Panel::getDockedArea() { DockArea* dockedArea = NULL; if (isDocked()) { dockedArea = dynamic_cast(getParent()); } return dockedArea; } DockArea* Panel::findDockArea() { DockArea* dockArea = NULL; if (!isDocked()) { if (getParent()) { DockArea* newDockArea = NULL; std::list widgets = getParent()->getWidgetsIn(getDimension(), this); if (widgets.size() > 0) { std::list::iterator it = widgets.begin(); for (; it != widgets.end(); ++it) { // check if the Widget is a DockArea DockArea* tmp = dynamic_cast(*it); if (!tmp) { // check if the Widget contains a DockArea std::list deepWidgets = (*it)->getWidgetsIn((*it)->getChildrenArea()); if (deepWidgets.size() > 0) { Rectangle dim = getDimension(); getAbsolutePosition(dim.x, dim.y); std::list::iterator dit = deepWidgets.begin(); for (; dit != deepWidgets.end(); ++dit) { tmp = dynamic_cast(*dit); if (tmp) { Rectangle tdim = (*dit)->getDimension(); (*dit)->getAbsolutePosition(tdim.x, tdim.y); if (dim.isIntersecting(tdim)) { break; } tmp = NULL; } } } if (!tmp) { continue; } } newDockArea = tmp; break; } } dockArea = newDockArea; } } return dockArea; } void Panel::resizeToContent(bool recursiv) { if (!m_docked) { ResizableWindow::resizeToContent(recursiv); } else { Window::resizeToContent(recursiv); } } void Panel::expandContent(bool recursiv) { ResizableWindow::resizeToContent(recursiv); } void Panel::mouseEntered(MouseEvent& mouseEvent) { ResizableWindow::mouseEntered(mouseEvent); } void Panel::mouseExited(MouseEvent& mouseEvent) { ResizableWindow::mouseExited(mouseEvent); } void Panel::mousePressed(MouseEvent& mouseEvent) { if (!m_docked) { ResizableWindow::mousePressed(mouseEvent); } else { int32_t height = getBorderSize() + getPaddingTop() + getTitleBarHeight(); mDragOffsetX = mouseEvent.getX(); mDragOffsetY = mouseEvent.getY(); mMoved = mouseEvent.getY() <= height; } } void Panel::mouseReleased(MouseEvent& mouseEvent) { if (mouseEvent.getButton() == MouseEvent::Left) { // move it inside the dock area if (m_docked && isMovable() && mMoved) { getDockedArea()->repositionWidget(this); getDockedArea()->adaptLayout(false); } } else if (mouseEvent.getButton() == MouseEvent::Right) { if (getDockedArea()) { restoreCursor(); } } ResizableWindow::mouseReleased(mouseEvent); } void Panel::mouseMoved(MouseEvent& mouseEvent) { ResizableWindow::mouseMoved(mouseEvent); } void Panel::mouseDragged(MouseEvent& mouseEvent) { if (m_docked) { if (isMovable() && mMoved) { Rectangle rec = getDockedArea()->getChildrenArea(); int32_t x = mouseEvent.getX() - mDragOffsetX + getX(); int32_t y = mouseEvent.getY() - mDragOffsetY + getY(); if (x < 0) { x = 0; } else if (x + getWidth() > rec.width) { x = rec.width - getWidth(); } if (y < 0) { y = 0; } else if (y + getHeight() > rec.height) { y = rec.height - getHeight(); } setPosition(x, y); getDockedArea()->repositionWidget(this); // move to top on dragged instead of pressed getDockedArea()->moveToTop(this); // restore "old" position, layouting can change it setPosition(x, y); } mouseEvent.consume(); } else { ResizableWindow::mouseDragged(mouseEvent); } } } fifengine-0.4.2/engine/core/gui/fifechan/widgets/panel.h000066400000000000000000000066071341615052600231250ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_GUI_WIDGETS_PANEL_H #define FIFE_GUI_WIDGETS_PANEL_H // Standard C++ library includes // 3rd party library includes #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "resizablewindow.h" namespace fcn { class DockArea; class Panel : public ResizableWindow { public: Panel(); Panel(bool dockable); virtual ~Panel(); /** Sets if the widget is dockable. * @param dockable True if the widget should be dockable, otherwise false. */ void setDockable(bool dockable); /** Gets if the widget is dockable. * @return True if the widget should be dockable, otherwise false. */ bool isDockable() const; /** Sets if the widget is docked. * @param docked True if the widget is docked, otherwise false. */ void setDocked(bool docked); /** Gets if the widget is docked. * @return True if the widget is docked, otherwise false. */ bool isDocked() const; virtual DockArea* findDockArea(); // Inherited from ResizableWindow virtual void resizeToContent(bool recursiv=true); virtual void expandContent(bool recursiv=true); // Inherited from ResizableWindow / MouseListener virtual void mouseEntered(MouseEvent& mouseEvent); virtual void mouseExited(MouseEvent& mouseEvent); virtual void mousePressed(MouseEvent& mouseEvent); virtual void mouseReleased(MouseEvent& mouseEvent); virtual void mouseMoved(MouseEvent& mouseEvent); virtual void mouseDragged(MouseEvent& mouseEvent); protected: DockArea* getDockedArea(); // is dockable bool m_dockable; // is docked bool m_docked; struct SavedState { Rectangle dimension; uint32_t innerBorder; bool resizable; bool movable; }; SavedState m_state; }; } #endif fifengine-0.4.2/engine/core/gui/fifechan/widgets/percentagebar.cpp000066400000000000000000000064261341615052600251620ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ /* * For comments regarding functions please see the header file. */ // Standard C++ library includes // 3rd party library includes #include #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "percentagebar.h" namespace fcn { PercentageBar::PercentageBar() { mImage = 0; setOrientation(HORIZONTAL); setValue(0); } void PercentageBar::draw(Graphics* graphics) { graphics->setColor(getForegroundColor()); if (getOrientation() == HORIZONTAL) { graphics->fillRectangle(fcn::Rectangle(0,0,getWidth() * mValue/100,getHeight())); } else { graphics->fillRectangle(fcn::Rectangle(0,getHeight()-getHeight() * mValue/100,getWidth(),getHeight() * mValue/100)); } if ( mImage ) graphics->drawImage(mImage, 0, 0); } void PercentageBar::setForegroundImage(Image* image) { mImage = image; if( mImage ) { setHeight(image->getHeight()); setWidth(image->getWidth()); } } void PercentageBar::setValue(int32_t value) { if (value > 100) { mValue = 100; return; } if (value < 0) { mValue = 0; return; } mValue = value; } int32_t PercentageBar::getValue() const { return mValue; } void PercentageBar::setOrientation(PercentageBar::Orientation orientation) { mOrientation = orientation; } PercentageBar::Orientation PercentageBar::getOrientation() const { return mOrientation; } } fifengine-0.4.2/engine/core/gui/fifechan/widgets/percentagebar.h000066400000000000000000000072121341615052600246210ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FCN_PERCENTAGE_BAR_HPP #define FCN_PERCENTAGE_BAR_HPP // Standard C++ library includes // 3rd party library includes #include #include #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/fife_stdint.h" namespace fcn { /** * A simple percentage bar. * * */ class PercentageBar : public Widget { public: enum Orientation { HORIZONTAL = 0, VERTICAL }; /** * Constructor. * */ PercentageBar(); virtual ~PercentageBar() {} // Inherited from Widget virtual void draw(Graphics* graphics); /* * Sets the image that will be displayed above the widget * * @param image Image to be displayed */ void setForegroundImage(Image* image); /** * Sets the orientation of the percentage bar. * * @param orientation The orientation of the percentage bar. * @see getOrientation */ void setOrientation(Orientation orientation); /** * Gets the orientation of the percentage bar. * * @return The orientation of the percentage bar. * @see setOrientation */ Orientation getOrientation() const; /** * Gets the value of the percentage bar * * @return The value of the percentage bar. */ int32_t getValue() const; /** * Sets the value of the percentage bar * * @param value In the range of 0-100. */ void setValue(int32_t value); // changed from private to allow derived instance access protected: Image* mImage; /** * Holds the current value of the percentage bar. */ double mValue; /** * Holds the orientation of the percentage bar. A percentage bar can be drawn * vertically or horizontally. */ Orientation mOrientation; }; } #endif // end FCN_PERCENTAGE_BAR_HPP fifengine-0.4.2/engine/core/gui/fifechan/widgets/resizablewindow.cpp000066400000000000000000000274501341615052600255700ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2013 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE:: * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "gui/fifechan/base/gui_font.h" #include "gui/fifechan/fifechanmanager.h" #include "util/base/exception.h" #include "resizablewindow.h" namespace fcn { ResizableWindow::ResizableWindow(): Window(), m_cursor(FIFE::FifechanManager::instance()->getCursor()), m_borderDistance(5), m_resizable(true), m_resizableTop(true), m_resizableRight(true), m_resizableBottom(true), m_resizableLeft(true), m_resizing(false), m_resizeTop(false), m_resizeRight(false), m_resizeBottom(false), m_resizeLeft(false), m_shove(false) { addKeyListener(this); addFocusListener(this); initCursors(); } ResizableWindow::ResizableWindow(bool resizable): Window(), m_cursor(FIFE::FifechanManager::instance()->getCursor()), m_borderDistance(5), m_resizable(resizable), m_resizableTop(true), m_resizableRight(true), m_resizableBottom(true), m_resizableLeft(true), m_resizing(false), m_resizeTop(false), m_resizeRight(false), m_resizeBottom(false), m_resizeLeft(false), m_shove(false) { addKeyListener(this); addFocusListener(this); initCursors(); } ResizableWindow::ResizableWindow(const std::string& caption, bool resizable): Window(), m_cursor(FIFE::FifechanManager::instance()->getCursor()), m_borderDistance(5), m_resizable(resizable), m_resizableTop(true), m_resizableRight(true), m_resizableBottom(true), m_resizableLeft(true), m_resizing(false), m_resizeTop(false), m_resizeRight(false), m_resizeBottom(false), m_resizeLeft(false), m_shove(false) { setCaption(caption); addKeyListener(this); addFocusListener(this); initCursors(); } ResizableWindow::~ResizableWindow() { } void ResizableWindow::initCursors() { // defines default cursors // don't change the sequence! CursorState state; state.cursorId = FIFE::NC_ARROW; state.cursorType = FIFE::CURSOR_NONE; m_saved = state; state.cursorType = FIFE::CURSOR_NATIVE; // left state.cursorId = FIFE::NC_RESIZEWE; m_cursors.push_back(state); // right state.cursorId = FIFE::NC_RESIZEWE; m_cursors.push_back(state); // top state.cursorId = FIFE::NC_RESIZENS; m_cursors.push_back(state); // left and top state.cursorId = FIFE::NC_RESIZENWSE; m_cursors.push_back(state); // right and top state.cursorId = FIFE::NC_RESIZENESW; m_cursors.push_back(state); // bottom state.cursorId = FIFE::NC_RESIZENS; m_cursors.push_back(state); // left and bottom state.cursorId = FIFE::NC_RESIZENESW; m_cursors.push_back(state); // right and bottom state.cursorId = FIFE::NC_RESIZENWSE; m_cursors.push_back(state); } void ResizableWindow::restoreCursor() { FIFE::MouseCursorType type = m_saved.cursorType; switch (type) { case FIFE::CURSOR_NATIVE: m_cursor->set(m_saved.cursorId); break; case FIFE::CURSOR_IMAGE: m_cursor->set(m_saved.cursorImage); break; case FIFE::CURSOR_ANIMATION: m_cursor->set(m_saved.cursorAnimation); break; default: return; } } void ResizableWindow::saveCursor() { FIFE::MouseCursorType type = m_cursor->getType(); switch (type) { case FIFE::CURSOR_NATIVE: m_saved.cursorType = type; m_saved.cursorId = m_cursor->getId(); m_saved.cursorImage.reset(); m_saved.cursorAnimation.reset(); break; case FIFE::CURSOR_IMAGE: m_saved.cursorType = type; m_saved.cursorId = FIFE::NC_ARROW;; m_saved.cursorImage = m_cursor->getImage(); m_saved.cursorAnimation.reset(); break; case FIFE::CURSOR_ANIMATION: m_saved.cursorType = type; m_saved.cursorId = FIFE::NC_ARROW;; m_saved.cursorImage.reset(); m_saved.cursorAnimation = m_cursor->getAnimation(); break; default: m_saved.cursorType = FIFE::CURSOR_NONE; } } void ResizableWindow::setResizableBorderDistance(int32_t border) { m_borderDistance = border; } int32_t ResizableWindow::getResizableBorderDistance() const { return m_borderDistance; } void ResizableWindow::setResizable(bool resizable) { m_resizable = resizable; } bool ResizableWindow::isResizable() const { return m_resizable; } void ResizableWindow::setTopResizable(bool resizable) { m_resizableTop = resizable; } bool ResizableWindow::isTopResizable() const { return m_resizableTop; } void ResizableWindow::setRightResizable(bool resizable) { m_resizableRight = resizable; } bool ResizableWindow::isRightResizable() const { return m_resizableRight; } void ResizableWindow::setBottomResizable(bool resizable) { m_resizableBottom = resizable; } bool ResizableWindow::isBottomResizable() const { return m_resizableBottom; } void ResizableWindow::setLeftResizable(bool resizable) { m_resizableLeft = resizable; } bool ResizableWindow::isLeftResizable() const { return m_resizableLeft; } void ResizableWindow::setShove(bool shove) { m_shove = shove; } bool ResizableWindow::getShove() const { return m_shove; } void ResizableWindow::set(CursorDirections direction, uint32_t cursor_id) { CursorState& state = m_cursors[direction]; state.cursorType = FIFE::CURSOR_NATIVE; state.cursorId = cursor_id; state.cursorImage.reset(); state.cursorAnimation.reset(); } void ResizableWindow::set(CursorDirections direction, FIFE::ImagePtr image) { CursorState& state = m_cursors[direction]; state.cursorType = FIFE::CURSOR_IMAGE; state.cursorId = FIFE::NC_ARROW; state.cursorImage = image; state.cursorAnimation.reset(); } void ResizableWindow::set(CursorDirections direction, FIFE::AnimationPtr anim) { CursorState& state = m_cursors[direction]; state.cursorType = FIFE::CURSOR_ANIMATION; state.cursorId = FIFE::NC_ARROW; state.cursorImage.reset(); state.cursorAnimation = anim; } FIFE::MouseCursorType ResizableWindow::getType(CursorDirections direction) const { return m_cursors[direction].cursorType; } uint32_t ResizableWindow::getId(CursorDirections direction) const { return m_cursors[direction].cursorId; } FIFE::ImagePtr ResizableWindow::getImage(CursorDirections direction) { return m_cursors[direction].cursorImage; } FIFE::AnimationPtr ResizableWindow::getAnimation(CursorDirections direction) { return m_cursors[direction].cursorAnimation; } void ResizableWindow::resizeToContent(bool recursiv) { // we keep the size in case we want it resizable if (m_resizable) { int w = getWidth(); int h = getHeight(); Window::resizeToContent(recursiv); setSize(w, h); } else { Window::resizeToContent(recursiv); } } void ResizableWindow::mouseEntered(MouseEvent& mouseEvent) { if (m_resizable && !m_resizing) { saveCursor(); } Window::mouseEntered(mouseEvent); } void ResizableWindow::mouseExited(MouseEvent& mouseEvent) { if (m_resizable && !m_resizing && m_saved.cursorType != FIFE::CURSOR_NONE) { restoreCursor(); } else if (m_resizable && m_resizing) { mouseEvent.consume(); } Window::mouseExited(mouseEvent); } void ResizableWindow::mousePressed(MouseEvent& mouseEvent) { if (m_resizable && mouseEvent.getButton() == MouseEvent::Left) { m_resizeLeft = m_resizableLeft && mouseEvent.getX() < m_borderDistance; m_resizeRight = m_resizableRight && mouseEvent.getX() > getWidth() - m_borderDistance; m_resizeTop = m_resizableTop && mouseEvent.getY() < m_borderDistance; m_resizeBottom = m_resizableBottom && mouseEvent.getY() > getHeight() - m_borderDistance; if (m_resizeTop || m_resizeBottom || m_resizeLeft || m_resizeRight) { m_resizing = true; mouseEvent.consume(); } } Window::mousePressed(mouseEvent); } void ResizableWindow::mouseReleased(MouseEvent& mouseEvent) { if (m_resizing) { adaptLayout(); m_resizing = false; if (mouseEvent.getX() <= 0 || mouseEvent.getX() >= getWidth() || mouseEvent.getY() <= 0 || mouseEvent.getY() >= getHeight()) { mouseExited(mouseEvent); } mouseEvent.consume(); } else { Window::mouseReleased(mouseEvent); } } void ResizableWindow::mouseMoved(MouseEvent& mouseEvent) { if (m_resizable && !m_resizing && m_saved.cursorType != FIFE::CURSOR_NONE) { // use the CursorDirections directly uint32_t index = 0; index += (m_resizableLeft && mouseEvent.getX() < m_borderDistance) ? 1 : 0; index += (m_resizableRight && mouseEvent.getX() > getWidth() - m_borderDistance) ? 2 : 0; index += (m_resizableTop && mouseEvent.getY() < m_borderDistance) ? 3 : 0; index += (m_resizableBottom && mouseEvent.getY() > getHeight() - m_borderDistance) ? 6 : 0; if (index > 0) { // to get the real index value index -= 1; CursorState state = m_cursors[index]; FIFE::MouseCursorType type = state.cursorType; switch (type) { case FIFE::CURSOR_NATIVE: m_cursor->set(state.cursorId); break; case FIFE::CURSOR_IMAGE: m_cursor->set(state.cursorImage); break; case FIFE::CURSOR_ANIMATION: m_cursor->set(state.cursorAnimation); break; default: break; } mouseEvent.consume(); } else { restoreCursor(); } } Window::mouseMoved(mouseEvent); } void ResizableWindow::mouseDragged(MouseEvent& mouseEvent) { if (m_resizable && m_resizing) { int x = mouseEvent.getX(); int y = mouseEvent.getY(); if (m_resizeLeft) { int oldW = getWidth(); int newW = oldW - x; if (newW < 0) { newW = 0; } setWidth(newW); if (m_shove) { setX(getX() + x); } else { newW = getWidth(); int newX = oldW - newW; setX(getX() + newX); } } else if (m_resizeRight) { setWidth(x); if (x != getWidth() && m_shove) { setX(getX() + (x-getWidth())); } } if (m_resizeTop) { int oldH = getHeight(); int newH = oldH - y; if (newH < 0) { newH = 0; } setHeight(newH); if (m_shove) { setY(getY() + y); } else { newH = getHeight(); int newY = oldH - newH; setY(getY() + newY); } } else if (m_resizeBottom) { setHeight(y); if (y != getHeight() && m_shove) { setY(getY() + (y-getHeight())); } } mouseEvent.consume(); } else { Window::mouseDragged(mouseEvent); } } void ResizableWindow::focusLost(const Event& event) { m_resizing = false; restoreCursor(); } } fifengine-0.4.2/engine/core/gui/fifechan/widgets/resizablewindow.h000066400000000000000000000173311341615052600252320ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2013 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_GUI_WIDGETS_RESIZABLEWINDOW_H #define FIFE_GUI_WIDGETS_RESIZABLEWINDOW_H // Standard C++ library includes // 3rd party library includes #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "video/cursor.h" namespace fcn { class ResizableWindow : public Window, public KeyListener, public FocusListener { public: enum CursorDirections { // left CURSOR_DIRECTION_L = 0, // right CURSOR_DIRECTION_R = 1, // top CURSOR_DIRECTION_T = 2, // bottom CURSOR_DIRECTION_B = 5, // left and top CURSOR_DIRECTION_LT = 3, // right and top CURSOR_DIRECTION_RT = 4, // left and bottom CURSOR_DIRECTION_LB = 6, // right and bottom CURSOR_DIRECTION_RB = 7 }; ResizableWindow(); ResizableWindow(bool resizable); ResizableWindow(const std::string& caption, bool resizable=true); virtual ~ResizableWindow(); /** Sets the size of the area that is active for resize events. * @param border The distance from the edge that is active for resize events. */ void setResizableBorderDistance(int32_t border); /** Gets the size of the area that is active for resize events. * @return The distance from the edge that is active for resize events. */ int32_t getResizableBorderDistance() const; /** Sets if the widget is resizable. * @param resizable True if the widget should be resizeable, otherwise false. */ void setResizable(bool resizable); /** Gets if the widget is resizable. * @return True if the widget should be resizeable, otherwise false. */ bool isResizable() const; /** Sets if the widget is resizable at top. * @param resizable True if the widget should be resizeable at top, otherwise false. */ void setTopResizable(bool resizable); /** Gets if the widget is resizable at top. * @return True if the widget should be resizeable at top, otherwise false. */ bool isTopResizable() const; /** Sets if the widget is resizable at right. * @param resizable True if the widget should be resizeable at right, otherwise false. */ void setRightResizable(bool resizable); /** Gets if the widget is resizable at right. * @return True if the widget should be resizeable at right, otherwise false. */ bool isRightResizable() const; /** Sets if the widget is resizable at bottom. * @param resizable True if the widget should be resizeable at bottom, otherwise false. */ void setBottomResizable(bool resizable); /** Gets if the widget is resizable at bottom. * @return True if the widget should be resizeable at bottom, otherwise false. */ bool isBottomResizable() const; /** Sets if the widget is resizable at left. * @param resizable True if the widget should be resizeable at left, otherwise false. */ void setLeftResizable(bool resizable); /** Gets if the widget is resizable at left. * @return True if the widget should be resizeable at left, otherwise false. */ bool isLeftResizable() const; /** Sets if the widget should be pushed if the size reaches the minimum. * @param shove True if the widget should be pushed, otherwise false. */ void setShove(bool shove); /** Gets if the widget should be pushed if the size reaches the minimum. * @return True if the widget should be pushed, otherwise false. */ bool getShove() const; /** Sets the mouse cursor for the specified direction. * @param cursor_id For native cursors, this is the resource id to native cursor, or one of the values in NativeCursor */ void set(CursorDirections direction, uint32_t cursor_id=0); /** Sets the mouse cursor type to image for the specified direction. * @param image ImagePtr to a image used for the cursor */ void set(CursorDirections direction, FIFE::ImagePtr image); /** Sets the mouse cursor type to animation for the specified direction. * @param anim AnimationPtr to a loaded animation used for the cursor */ void set(CursorDirections direction, FIFE::AnimationPtr anim); /** Gets the mouse cursor type for the specified direction. */ FIFE::MouseCursorType getType(CursorDirections direction) const; /** Gets the mouse cursor handle for the specified direction. */ uint32_t getId(CursorDirections direction) const; /** Gets the mouse image for the specified direction. */ FIFE::ImagePtr getImage(CursorDirections direction); /** Gets the mouse animation for the specified direction. */ FIFE::AnimationPtr getAnimation(CursorDirections direction); // Inherited from Window virtual void resizeToContent(bool recursiv=true); // Inherited from FocusListener virtual void focusLost(const Event& event); // Inherited from Window / MouseListener virtual void mouseEntered(MouseEvent& mouseEvent); virtual void mouseExited(MouseEvent& mouseEvent); virtual void mousePressed(MouseEvent& mouseEvent); virtual void mouseReleased(MouseEvent& mouseEvent); virtual void mouseMoved(MouseEvent& mouseEvent); virtual void mouseDragged(MouseEvent& mouseEvent); protected: // initialized the 8 cursors, see CursorDirections void initCursors(); // restore cursor void restoreCursor(); // save cursor so we can restore it later void saveCursor(); // access to fifes cursor class FIFE::Cursor* m_cursor; // distance from the widgets edge that is active for resizing events int32_t m_borderDistance; // is resizable bool m_resizable; // allow resize on top bool m_resizableTop; // allow resize on right bool m_resizableRight; // allow resize on bottom bool m_resizableBottom; // allow resize on left bool m_resizableLeft; // is currently resizing bool m_resizing; // indicate the changed size per direction bool m_resizeTop; bool m_resizeRight; bool m_resizeBottom; bool m_resizeLeft; // is shove allowed bool m_shove; struct CursorState { FIFE::MouseCursorType cursorType; uint32_t cursorId; FIFE::ImagePtr cursorImage; FIFE::AnimationPtr cursorAnimation; }; // old saved cursor CursorState m_saved; // contains the 8 CursorStates, one per direction std::vector m_cursors; }; } #endif fifengine-0.4.2/engine/core/gui/fifechan/widgets/widgets.i000066400000000000000000000133121341615052600234640ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fife %{ #include #include "gui/fifechan/widgets/animationicon.h" #include "gui/fifechan/widgets/clicklabel.h" #include "gui/fifechan/widgets/percentagebar.h" #include "gui/fifechan/widgets/resizablewindow.h" #include "gui/fifechan/widgets/dockarea.h" #include "gui/fifechan/widgets/panel.h" %} namespace fcn { class ActionListener; class Color; class Font; class Image; class KeyListener; class MouseListener; class WidgetListener; class Widget; %feature("notabstract") AnimationIcon; class AnimationIcon: public Icon { public: AnimationIcon(); AnimationIcon(FIFE::AnimationPtr animation); virtual ~AnimationIcon(); void setAnimation(FIFE::AnimationPtr animation); FIFE::AnimationPtr getAnimation() const; void setRepeating(bool repeat); bool isRepeating() const; void play(); bool isPlaying() const; void pause(); void stop(); }; %feature("notabstract") ClickLabel; %rename(Label) ClickLabel; class ClickLabel: public Widget { public: ClickLabel(); ClickLabel(const std::string& caption); virtual ~ClickLabel(); virtual void setCaption(const std::string& caption); virtual const std::string& getCaption() const; void setAlignment(Graphics::Alignment alignment); Graphics::Alignment getAlignment() const; void setOpaque(bool opaque); bool isOpaque() const; bool isTextWrapping() const; void setTextWrapping(bool); virtual void adjustSize(); }; %feature("notabstract") PercentageBar; class PercentageBar: public Widget { public: PercentageBar(); virtual ~PercentageBar(); virtual void setForegroundImage(Image* image); virtual void setOrientation(PercentageBar::Orientation orientation); virtual PercentageBar::Orientation getOrientation() const; virtual int32_t getValue() const; virtual void setValue(int32_t value); enum Orientation { HORIZONTAL = 0, VERTICAL }; }; %feature("notabstract") ResizableWindow; class ResizableWindow : public Window { public: enum CursorDirections { CURSOR_DIRECTION_L = 0, CURSOR_DIRECTION_R = 1, CURSOR_DIRECTION_T = 2, CURSOR_DIRECTION_B = 5, CURSOR_DIRECTION_LT = 3, CURSOR_DIRECTION_RT = 4, CURSOR_DIRECTION_LB = 6, CURSOR_DIRECTION_RB = 7 }; ResizableWindow(); ResizableWindow(bool resizable); ResizableWindow(const std::string& caption, bool resizable=true); virtual ~ResizableWindow(); void setResizableBorderDistance(int32_t border); int32_t getResizableBorderDistance() const; void setResizable(bool resizable); bool isResizable() const; void setTopResizable(bool resizable); bool isTopResizable() const; void setRightResizable(bool resizable); bool isRightResizable() const; void setBottomResizable(bool resizable); bool isBottomResizable() const; void setLeftResizable(bool resizable); bool isLeftResizable() const; void setShove(bool shove); bool getShove() const; void set(CursorDirections direction, uint32_t cursor_id=0); void set(CursorDirections direction, FIFE::ImagePtr image); void set(CursorDirections direction, FIFE::AnimationPtr anim); FIFE::MouseCursorType getType(CursorDirections direction) const; uint32_t getId(CursorDirections direction) const; FIFE::ImagePtr getImage(CursorDirections direction); FIFE::AnimationPtr getAnimation(CursorDirections direction); }; %feature("notabstract") DockArea; class DockArea : public ResizableWindow { public: DockArea(); DockArea(bool active); virtual ~DockArea(); void setActiveDockArea(bool active); bool isActiveDockArea() const; void setTopSide(bool side); bool isTopSide() const; void setRightSide(bool side); bool isRightSide() const; void setBottomSide(bool side); bool isBottomSide() const; void setLeftSide(bool side); bool isLeftSide() const; void dockWidget(Widget* widget); void undockWidget(Widget* widget); void setHighlighted(bool highlighted); bool isHighlighted() const; void setHighlightColor(const Color& color); const Color& getHighlightColor() const; }; %feature("notabstract") Panel; class Panel : public ResizableWindow { public: Panel(); Panel(bool dockable); virtual ~Panel(); void setDockable(bool dockable); bool isDockable() const; void setDocked(bool docked); bool isDocked() const; }; } fifengine-0.4.2/engine/core/gui/guimanager.h000066400000000000000000000050671341615052600207330ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_VIDEO_GUI_GUIMANAGER_H #define FIFE_VIDEO_GUI_GUIMANAGER_H // Standard C++ library includes #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/fife_stdint.h" #include "util/base/singleton.h" #include "eventchannel/sdl/isdleventlistener.h" namespace FIFE { class IGUIManager : public ISdlEventListener { public: /** Destructor. */ virtual ~IGUIManager() {}; /** Performs the GUI logic and draws the GUI accordingly. * * This will be called each frame. */ virtual void turn() = 0; /** Resizes the top container. * * @param x The new starting X coordinate. * @param y The new starting Y coordinate. * @param width The new width. * @param height The new height. */ virtual void resizeTopContainer(uint32_t x, uint32_t y, uint32_t width, uint32_t height) = 0; }; } #endif fifengine-0.4.2/engine/core/gui/guimanager.i000066400000000000000000000035131341615052600207260ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fife %{ #include "gui/guimanager.h" #include "eventchannel/sdl/isdleventlistener.h" %} namespace FIFE { class IGUIManager : public ISdlEventListener { public: virtual ~IGUIManager(); virtual void turn() = 0; virtual void resizeTopContainer(uint32_t x, uint32_t y, uint32_t width, uint32_t height) = 0; }; } fifengine-0.4.2/engine/core/gui/hybrid/000077500000000000000000000000001341615052600177145ustar00rootroot00000000000000fifengine-0.4.2/engine/core/gui/hybrid/hybridguimanager.cpp000066400000000000000000000076361341615052600237550ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/log/logger.h" #include "hybridguimanager.h" namespace FIFE { static Logger _log(LM_GUI); HybridGuiManager::HybridGuiManager() { } HybridGuiManager::~HybridGuiManager() { std::vector::iterator currManager(m_guiManagers.begin()); std::vector::iterator endManager(m_guiManagers.end()); for(; currManager != endManager; ++currManager) { delete (*currManager); } m_guiManagers.clear(); } void HybridGuiManager::addGuiManager(IGUIManager* guiManager) { m_guiManagers.push_back(guiManager); } void HybridGuiManager::removeGuiManager(IGUIManager* guiManager) { std::vector::iterator currManager(m_guiManagers.begin()); std::vector::iterator endManager(m_guiManagers.end()); for(; currManager != endManager;) { if((*currManager) == guiManager) { m_guiManagers.erase(currManager); return; } ++currManager; } FL_WARN(_log, LMsg() << "Tyring to remove a non-existing gui manager from a hybrid gui manager."); } void HybridGuiManager::turn() { //call turn in reverse order because we want prior gui managers to draw on top //of latter ones. std::vector::reverse_iterator currManager(m_guiManagers.rbegin()); std::vector::reverse_iterator endManager(m_guiManagers.rend()); for(; currManager != endManager; ++currManager) { (*currManager)->turn(); } } bool HybridGuiManager::onSdlEvent(SDL_Event& event) { bool consumed = false; std::vector::iterator currManager(m_guiManagers.begin()); std::vector::iterator endManager(m_guiManagers.end()); for(; currManager != endManager; ++currManager) { consumed = (*currManager)->onSdlEvent(event); if (consumed) { return true; } } return false; } void HybridGuiManager::resizeTopContainer(uint32_t x, uint32_t y, uint32_t width, uint32_t height) { std::vector::iterator currManager(m_guiManagers.begin()); std::vector::iterator endManager(m_guiManagers.end()); for(; currManager != endManager; ++currManager) { (*currManager)->resizeTopContainer(x, y, width, height); } } } fifengine-0.4.2/engine/core/gui/hybrid/hybridguimanager.h000066400000000000000000000063771341615052600234230ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_GUI_HYBRIDGUIMANAGER_H #define FIFE_GUI_HYBRIDGUIMANAGER_H // Standard C++ library includes #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/singleton.h" #include "gui/guimanager.h" namespace FIFE { class HybridGuiManager : public IGUIManager, public DynamicSingleton { public: /** Constructor. */ HybridGuiManager(); /** Destructor. */ ~HybridGuiManager(); /** Adds a gui manager to this hybrid manager. * * WARNING This object gains ownership of the added gui manager. */ void addGuiManager(IGUIManager* guiManager); /** Removes a gui manager from this hybrid manager. * * WARNING This object loses owenership of the removed gui manager. */ void removeGuiManager(IGUIManager* guiManager); /** Calls turn for each gui manager in the hybrid manager's queue. */ virtual void turn(); /** Calls onSdlEvent for each gui manager in the hybrid manager's queue. * * @param event: The event to be processed by each gui manager. * @return A boolean value indicating if the event was consumed by one of the * gui managers in the queue. */ virtual bool onSdlEvent(SDL_Event& event); /** Calls resize top container for each of the gui managers in the queue. */ virtual void resizeTopContainer(uint32_t x, uint32_t y, uint32_t width, uint32_t height); private: /** All gui managers composing this hybrid gui manager. */ std::vector m_guiManagers; }; } #endif // FIFE_GUI_HYBRIDGUIMANAGER_Hfifengine-0.4.2/engine/core/gui/hybrid/hybridguimanager.i000066400000000000000000000006141341615052600234100ustar00rootroot00000000000000%module fife %{ #include "gui/hybrid/hybridguimanager.h" #include "gui/guimanager.h" %} %include "gui/guimanager.i" namespace FIFE { %feature("notabstract") HybridGuiManager; class HybridGuiManager : public IGUIManager { public: HybridGuiManager(); virtual ~HybridGuiManager(); void addGuiManager(IGUIManager* guiManager); void removeGuiManager(IGUIManager* guiManager); }; }fifengine-0.4.2/engine/core/gui/librocket/000077500000000000000000000000001341615052600204115ustar00rootroot00000000000000fifengine-0.4.2/engine/core/gui/librocket/base/000077500000000000000000000000001341615052600213235ustar00rootroot00000000000000fifengine-0.4.2/engine/core/gui/librocket/base/librocketinputprocessor.cpp000066400000000000000000000275251341615052600270400ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes #include // 3rd party library includes #include #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "librocketinputprocessor.h" namespace FIFE { LibRocketInputProcessor::LibRocketInputProcessor(Rocket::Core::Context* context) : m_context(context), m_keyModState(0), m_wheelCounter(0) { populateKeyMap(); } LibRocketInputProcessor::~LibRocketInputProcessor() { } void LibRocketInputProcessor::updateKeyModState() { SDLMod modState = SDL_GetModState(); m_keyModState = 0; if((modState & KMOD_NONE) != KMOD_NONE) { if((modState & KMOD_SHIFT) == KMOD_SHIFT) { m_keyModState |= Rocket::Core::Input::KM_SHIFT; } if((modState & KMOD_CTRL) == KMOD_CTRL) { m_keyModState |= Rocket::Core::Input::KM_CTRL; } if((modState & KMOD_ALT) == KMOD_ALT) { m_keyModState |= Rocket::Core::Input::KM_ALT; } // KMOD_META is gone so we change it to KMOD_GUI if((modState & KMOD_GUI) == KMOD_GUI) { m_keyModState |= Rocket::Core::Input::KM_META; } if((modState & KMOD_NUM) == KMOD_NUM) { m_keyModState |= Rocket::Core::Input::KM_NUMLOCK; } if((modState & KMOD_CAPS) == KMOD_CAPS) { m_keyModState |= Rocket::Core::Input::KM_CAPSLOCK; } } } bool LibRocketInputProcessor::onSdlEvent(SDL_Event& event) { bool consumed = false; updateKeyModState(); switch(event.type) { case SDL_KEYUP: case SDL_KEYDOWN: consumed = processKeyInput(event); break; case SDL_TEXTINPUT: consumed = processTextInput(event); break; case SDL_MOUSEWHEEL: case SDL_MOUSEBUTTONUP: case SDL_MOUSEBUTTONDOWN: consumed = processMouseInput(event); break; case SDL_MOUSEMOTION: consumed = processMouseMotion(event); break; default: break; } return consumed; } void LibRocketInputProcessor::turn() { if(m_wheelCounter != 0) { m_context->ProcessMouseWheel(m_wheelCounter, m_keyModState); m_wheelCounter = 0; } } bool LibRocketInputProcessor::processMouseMotion(SDL_Event& event) { int x = static_cast(event.motion.x); int y = static_cast(event.motion.y); m_context->ProcessMouseMove(x, y, m_keyModState); return false; } bool LibRocketInputProcessor::processMouseInput(SDL_Event& event) { int index = (event.button.button == SDL_BUTTON_LEFT) ? 0 : (event.button.button == SDL_BUTTON_RIGHT) ? 1 : (event.button.button == SDL_BUTTON_MIDDLE) ? 2 : 3; if(event.type == SDL_MOUSEBUTTONDOWN) { m_context->ProcessMouseButtonDown(index, m_keyModState); } else if (event.type == SDL_MOUSEBUTTONUP) { m_context->ProcessMouseButtonUp(index, m_keyModState); } else if (event.type == SDL_MOUSEWHEEL) { processMouseWheelMotion(event); } return false; } bool LibRocketInputProcessor::processMouseWheelMotion(SDL_Event& event) { // mousewheel up #if SDL_VERSION_ATLEAST(2,0,4) if (event.wheel.y > 0 || (event.wheel.direction == SDL_MOUSEWHEEL_FLIPPED && event.wheel.y < 0)) { #else if (event.wheel.y > 0) { #endif if(m_wheelCounter <= 0) { m_wheelCounter--; } else { //the wheel had been moving downwards so sent those movements before reseting the counter m_context->ProcessMouseWheel(m_wheelCounter, m_keyModState); m_wheelCounter = -1; } } // mousewheel down #if SDL_VERSION_ATLEAST(2,0,4) else if (event.wheel.y < 0 || (event.wheel.direction == SDL_MOUSEWHEEL_FLIPPED && event.wheel.y > 0)) { #else else if (event.wheel.y < 0) { #endif if(m_wheelCounter >= 0) { m_wheelCounter++; } else { //the wheel had been moving upwards so sent those movements before reseting the counter m_context->ProcessMouseWheel(m_wheelCounter, m_keyModState); m_wheelCounter = 1; } } return false; } bool LibRocketInputProcessor::processKeyInput(SDL_Event& event) { Rocket::Core::Input::KeyIdentifier key = m_keyMap[event.key.keysym.sym]; if(event.type == SDL_KEYDOWN) { m_context->ProcessKeyDown(key, m_keyModState); if(key == Rocket::Core::Input::KI_RETURN) { m_context->ProcessTextInput((Rocket::Core::word) '\n'); } } else { m_context->ProcessKeyUp(m_keyMap[event.key.keysym.sym], m_keyModState); } return false; } bool LibRocketInputProcessor::processTextInput(SDL_Event& event) { Rocket::Core::String text(event.text.text); m_context->ProcessTextInput(text); return false; } void LibRocketInputProcessor::populateKeyMap() { m_keyMap[SDLK_UNKNOWN] = Rocket::Core::Input::KI_UNKNOWN; m_keyMap[SDLK_SPACE] = Rocket::Core::Input::KI_SPACE; m_keyMap[SDLK_0] = Rocket::Core::Input::KI_0; m_keyMap[SDLK_1] = Rocket::Core::Input::KI_1; m_keyMap[SDLK_2] = Rocket::Core::Input::KI_2; m_keyMap[SDLK_3] = Rocket::Core::Input::KI_3; m_keyMap[SDLK_4] = Rocket::Core::Input::KI_4; m_keyMap[SDLK_5] = Rocket::Core::Input::KI_5; m_keyMap[SDLK_6] = Rocket::Core::Input::KI_6; m_keyMap[SDLK_7] = Rocket::Core::Input::KI_7; m_keyMap[SDLK_8] = Rocket::Core::Input::KI_8; m_keyMap[SDLK_9] = Rocket::Core::Input::KI_9; m_keyMap[SDLK_a] = Rocket::Core::Input::KI_A; m_keyMap[SDLK_b] = Rocket::Core::Input::KI_B; m_keyMap[SDLK_c] = Rocket::Core::Input::KI_C; m_keyMap[SDLK_d] = Rocket::Core::Input::KI_D; m_keyMap[SDLK_e] = Rocket::Core::Input::KI_E; m_keyMap[SDLK_f] = Rocket::Core::Input::KI_F; m_keyMap[SDLK_g] = Rocket::Core::Input::KI_G; m_keyMap[SDLK_h] = Rocket::Core::Input::KI_H; m_keyMap[SDLK_i] = Rocket::Core::Input::KI_I; m_keyMap[SDLK_j] = Rocket::Core::Input::KI_J; m_keyMap[SDLK_k] = Rocket::Core::Input::KI_K; m_keyMap[SDLK_l] = Rocket::Core::Input::KI_L; m_keyMap[SDLK_m] = Rocket::Core::Input::KI_M; m_keyMap[SDLK_n] = Rocket::Core::Input::KI_N; m_keyMap[SDLK_o] = Rocket::Core::Input::KI_O; m_keyMap[SDLK_p] = Rocket::Core::Input::KI_P; m_keyMap[SDLK_q] = Rocket::Core::Input::KI_Q; m_keyMap[SDLK_r] = Rocket::Core::Input::KI_R; m_keyMap[SDLK_s] = Rocket::Core::Input::KI_S; m_keyMap[SDLK_t] = Rocket::Core::Input::KI_T; m_keyMap[SDLK_u] = Rocket::Core::Input::KI_U; m_keyMap[SDLK_v] = Rocket::Core::Input::KI_V; m_keyMap[SDLK_w] = Rocket::Core::Input::KI_W; m_keyMap[SDLK_x] = Rocket::Core::Input::KI_X; m_keyMap[SDLK_y] = Rocket::Core::Input::KI_Y; m_keyMap[SDLK_z] = Rocket::Core::Input::KI_Z; m_keyMap[SDLK_SEMICOLON] = Rocket::Core::Input::KI_OEM_1; m_keyMap[SDLK_PLUS] = Rocket::Core::Input::KI_OEM_PLUS; m_keyMap[SDLK_COMMA] = Rocket::Core::Input::KI_OEM_COMMA; m_keyMap[SDLK_MINUS] = Rocket::Core::Input::KI_OEM_MINUS; m_keyMap[SDLK_PERIOD] = Rocket::Core::Input::KI_OEM_PERIOD; m_keyMap[SDLK_SLASH] = Rocket::Core::Input::KI_OEM_2; m_keyMap[SDLK_BACKQUOTE] = Rocket::Core::Input::KI_OEM_3; m_keyMap[SDLK_LEFTBRACKET] = Rocket::Core::Input::KI_OEM_4; m_keyMap[SDLK_BACKSLASH] = Rocket::Core::Input::KI_OEM_5; m_keyMap[SDLK_RIGHTBRACKET] = Rocket::Core::Input::KI_OEM_6; m_keyMap[SDLK_QUOTEDBL] = Rocket::Core::Input::KI_OEM_7; m_keyMap[SDLK_KP_0] = Rocket::Core::Input::KI_NUMPAD0; m_keyMap[SDLK_KP_1] = Rocket::Core::Input::KI_NUMPAD1; m_keyMap[SDLK_KP_2] = Rocket::Core::Input::KI_NUMPAD2; m_keyMap[SDLK_KP_3] = Rocket::Core::Input::KI_NUMPAD3; m_keyMap[SDLK_KP_4] = Rocket::Core::Input::KI_NUMPAD4; m_keyMap[SDLK_KP_5] = Rocket::Core::Input::KI_NUMPAD5; m_keyMap[SDLK_KP_6] = Rocket::Core::Input::KI_NUMPAD6; m_keyMap[SDLK_KP_7] = Rocket::Core::Input::KI_NUMPAD7; m_keyMap[SDLK_KP_8] = Rocket::Core::Input::KI_NUMPAD8; m_keyMap[SDLK_KP_9] = Rocket::Core::Input::KI_NUMPAD9; m_keyMap[SDLK_KP_ENTER] = Rocket::Core::Input::KI_NUMPADENTER; m_keyMap[SDLK_KP_MULTIPLY] = Rocket::Core::Input::KI_MULTIPLY; m_keyMap[SDLK_KP_PLUS] = Rocket::Core::Input::KI_ADD; m_keyMap[SDLK_KP_MINUS] = Rocket::Core::Input::KI_SUBTRACT; m_keyMap[SDLK_KP_PERIOD] = Rocket::Core::Input::KI_DECIMAL; m_keyMap[SDLK_KP_DIVIDE] = Rocket::Core::Input::KI_DIVIDE; m_keyMap[SDLK_KP_EQUALS] = Rocket::Core::Input::KI_OEM_NEC_EQUAL; m_keyMap[SDLK_BACKSPACE] = Rocket::Core::Input::KI_BACK; m_keyMap[SDLK_TAB] = Rocket::Core::Input::KI_TAB; m_keyMap[SDLK_CLEAR] = Rocket::Core::Input::KI_CLEAR; m_keyMap[SDLK_RETURN] = Rocket::Core::Input::KI_RETURN; m_keyMap[SDLK_PAUSE] = Rocket::Core::Input::KI_PAUSE; m_keyMap[SDLK_CAPSLOCK] = Rocket::Core::Input::KI_CAPITAL; m_keyMap[SDLK_PAGEUP] = Rocket::Core::Input::KI_PRIOR; m_keyMap[SDLK_PAGEDOWN] = Rocket::Core::Input::KI_NEXT; m_keyMap[SDLK_END] = Rocket::Core::Input::KI_END; m_keyMap[SDLK_HOME] = Rocket::Core::Input::KI_HOME; m_keyMap[SDLK_LEFT] = Rocket::Core::Input::KI_LEFT; m_keyMap[SDLK_UP] = Rocket::Core::Input::KI_UP; m_keyMap[SDLK_RIGHT] = Rocket::Core::Input::KI_RIGHT; m_keyMap[SDLK_DOWN] = Rocket::Core::Input::KI_DOWN; m_keyMap[SDLK_INSERT] = Rocket::Core::Input::KI_INSERT; m_keyMap[SDLK_DELETE] = Rocket::Core::Input::KI_DELETE; m_keyMap[SDLK_HELP] = Rocket::Core::Input::KI_HELP; m_keyMap[SDLK_LGUI] = Rocket::Core::Input::KI_LWIN; m_keyMap[SDLK_RGUI] = Rocket::Core::Input::KI_RWIN; m_keyMap[SDLK_F1] = Rocket::Core::Input::KI_F1; m_keyMap[SDLK_F2] = Rocket::Core::Input::KI_F2; m_keyMap[SDLK_F3] = Rocket::Core::Input::KI_F3; m_keyMap[SDLK_F4] = Rocket::Core::Input::KI_F4; m_keyMap[SDLK_F5] = Rocket::Core::Input::KI_F5; m_keyMap[SDLK_F6] = Rocket::Core::Input::KI_F6; m_keyMap[SDLK_F7] = Rocket::Core::Input::KI_F7; m_keyMap[SDLK_F8] = Rocket::Core::Input::KI_F8; m_keyMap[SDLK_F9] = Rocket::Core::Input::KI_F9; m_keyMap[SDLK_F10] = Rocket::Core::Input::KI_F10; m_keyMap[SDLK_F11] = Rocket::Core::Input::KI_F11; m_keyMap[SDLK_F12] = Rocket::Core::Input::KI_F12; m_keyMap[SDLK_F13] = Rocket::Core::Input::KI_F13; m_keyMap[SDLK_F14] = Rocket::Core::Input::KI_F14; m_keyMap[SDLK_F15] = Rocket::Core::Input::KI_F15; m_keyMap[SDLK_NUMLOCKCLEAR] = Rocket::Core::Input::KI_NUMLOCK; m_keyMap[SDLK_SCROLLLOCK] = Rocket::Core::Input::KI_SCROLL; m_keyMap[SDLK_LSHIFT] = Rocket::Core::Input::KI_LSHIFT; m_keyMap[SDLK_RSHIFT] = Rocket::Core::Input::KI_RSHIFT; m_keyMap[SDLK_LCTRL] = Rocket::Core::Input::KI_LCONTROL; m_keyMap[SDLK_RCTRL] = Rocket::Core::Input::KI_RCONTROL; m_keyMap[SDLK_LALT] = Rocket::Core::Input::KI_LMENU; m_keyMap[SDLK_RALT] = Rocket::Core::Input::KI_RMENU; } }; fifengine-0.4.2/engine/core/gui/librocket/base/librocketinputprocessor.h000066400000000000000000000076771341615052600265130ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_GUI_LIBROCKETINPUTPROCESSOR_H #define FIFE_GUI_LIBROCKETINPUTPROCESSOR_H // Standard C++ library includes #include // 3rd party library includes #include #include #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/fife_stdint.h" namespace Rocket { namespace Core { class Context; } } namespace FIFE { class LibRocketInputProcessor { public: /** Constructor */ LibRocketInputProcessor(Rocket::Core::Context* context); /** Destructor */ ~LibRocketInputProcessor(); /** Processes SDL input and converts it to librocket input, then forwards it to * the librocket context. * * NOTE There is no way to get, if an event is consumed by Rocket currently. * This is for in case it gets implemented in the future. * * @param evt The SDL input. * @return A boolean value indicating if the event was consumed by librocket or not. */ bool onSdlEvent(SDL_Event &evt); /** * Called each frame to perform update operations. */ void turn(); private: /** Updates the key mod state bitmask. */ void updateKeyModState(); /** Process a mouse motion event. */ bool processMouseMotion(SDL_Event& event); /** Process a mouse input event. */ bool processMouseInput(SDL_Event& event); /** Process a mouse wheel motion event. */ bool processMouseWheelMotion(SDL_Event& event); /** Process a key input event. */ bool processKeyInput(SDL_Event& event); /** Process a text input event. */ bool processTextInput(SDL_Event& event); /** Creates the key map. */ void populateKeyMap(); /** Reference to librocket's context. */ Rocket::Core::Context* m_context; /** Bitmask that stores key modifiers. */ uint32_t m_keyModState; /** Counts how many times the wheel has been moved. Negative * value means that the wheel has been moved abs(m_wheelCounter) upwards, * positive value means that the wheel has been moved m_wheelCounter times downwards. */ int32_t m_wheelCounter; /** Keymap to convert SDL key to Librocket key. */ std::map m_keyMap; }; }; #endif //FIFE_GUI_LIBROCKETINPUTPROCESSOR_Hfifengine-0.4.2/engine/core/gui/librocket/base/librocketrenderinterface.cpp000066400000000000000000000163571341615052600271020ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "video/imagemanager.h" #include "video/opengl/glimage.h" #include "librocketrenderinterface.h" namespace FIFE { LibRocketRenderInterface::LibRocketRenderInterface() : m_renderBackend(RenderBackend::instance()), m_imageManager(ImageManager::instance()) { } LibRocketRenderInterface::~LibRocketRenderInterface() { freeTextures(); } void LibRocketRenderInterface::RenderGeometry(Rocket::Core::Vertex* vertices, int num_vertices, int* indices, int num_indices, Rocket::Core::TextureHandle texture, const Rocket::Core::Vector2f& translation) { GeometryCallData geometryCallData; geometryCallData.vertices.reserve(num_vertices); for(int i = 0; i < num_vertices; i++) { GuiVertex vertex; vertex.position.set(vertices[i].position.x, vertices[i].position.y); vertex.color.set(vertices[i].colour.red, vertices[i].colour.green, vertices[i].colour.blue, vertices[i].colour.alpha); vertex.texCoords.set(vertices[i].tex_coord.x, vertices[i].tex_coord.y); geometryCallData.vertices.push_back(vertex); } geometryCallData.indices.reserve(num_indices); for(int i = 0; i < num_indices; i++) { geometryCallData.indices.push_back(indices[i]); } geometryCallData.textureHandle = texture; geometryCallData.translation.set(translation.x, translation.y); if(m_geometryCalls.empty()) { GeometryCall geometryCall; geometryCall.callChain.push(geometryCallData); m_geometryCalls.push(geometryCall); } else { GeometryCall& geometryCall = m_geometryCalls.back(); geometryCall.callChain.push(geometryCallData); } } Rocket::Core::CompiledGeometryHandle LibRocketRenderInterface::CompileGeometry(Rocket::Core::Vertex* vertices, int num_vertices, int* indices, int num_indices, Rocket::Core::TextureHandle texture) { return (Rocket::Core::CompiledGeometryHandle) NULL; } void LibRocketRenderInterface::RenderCompiledGeometry(Rocket::Core::CompiledGeometryHandle geometry, const Rocket::Core::Vector2f& translation) { } void LibRocketRenderInterface::ReleaseCompiledGeometry(Rocket::Core::CompiledGeometryHandle ROCKET_UNUSED(geometry)) { } void LibRocketRenderInterface::EnableScissorRegion(bool enable) { GeometryCall gc; gc.enableScissorTest = enable; //check if there is a previous call and has a clip area enabled if(!m_geometryCalls.empty()) { GeometryCall& prevgc = m_geometryCalls.back(); if(prevgc.hasScissorArea) { gc.hasScissorArea = true; gc.scissorArea = prevgc.scissorArea; } } m_geometryCalls.push(gc); } void LibRocketRenderInterface::SetScissorRegion(int x, int y, int width, int height) { GeometryCall gc; gc.hasScissorArea = true; gc.scissorArea = Rect(x, y, width, height); //check if there is a previous call and has scissors enabled if(!m_geometryCalls.empty()) { GeometryCall& prevgc = m_geometryCalls.back(); gc.enableScissorTest = prevgc.enableScissorTest; } m_geometryCalls.push(gc); } bool LibRocketRenderInterface::LoadTexture(Rocket::Core::TextureHandle& texture_handle, Rocket::Core::Vector2i& texture_dimensions, const Rocket::Core::String& source) { std::string filename(source.CString()); ImagePtr loadedTexture = m_imageManager->exists(filename) ? m_imageManager->get(filename) : m_imageManager->load(filename); texture_handle = static_cast(loadedTexture->getHandle()); texture_dimensions.x = loadedTexture->getWidth(); texture_dimensions.y = loadedTexture->getHeight(); return true; } bool LibRocketRenderInterface::GenerateTexture(Rocket::Core::TextureHandle& texture_handle, const Rocket::Core::byte* source, const Rocket::Core::Vector2i& source_dimensions) { Image* generatedTexture = m_renderBackend->createImage(source, source_dimensions.x, source_dimensions.y); generatedTexture->setState(IResource::RES_LOADED); m_imageManager->add(generatedTexture); texture_handle = static_cast(generatedTexture->getHandle()); return true; } void LibRocketRenderInterface::ReleaseTexture(Rocket::Core::TextureHandle texture_handle) { ResourceHandle rh = static_cast(texture_handle); m_freedTextures.push_back(rh); } void LibRocketRenderInterface::render() { while(!m_geometryCalls.empty()) { GeometryCall& geometryCall = m_geometryCalls.front(); if(geometryCall.hasScissorArea) { m_renderBackend->pushClipArea(geometryCall.scissorArea, false); } if(geometryCall.enableScissorTest) { m_renderBackend->enableScissorTest(); } else { m_renderBackend->disableScissorTest(); } while(!geometryCall.callChain.empty()) { GeometryCallData& geometryCallData = geometryCall.callChain.front(); ImagePtr img = m_imageManager->get(geometryCallData.textureHandle); m_renderBackend->renderGuiGeometry(geometryCallData.vertices, geometryCallData.indices, geometryCallData.translation, img); geometryCall.callChain.pop(); } if(geometryCall.hasScissorArea) { m_renderBackend->popClipArea(); } m_geometryCalls.pop(); } } void LibRocketRenderInterface::freeTextures() { std::list::iterator it(m_freedTextures.begin()); std::list::iterator end(m_freedTextures.end()); for(; it != end; ++it) { ResourceHandle rh = (*it); ImagePtr texture = m_imageManager->get(rh); texture->free(); } std::list temp; m_freedTextures.swap(temp); } };fifengine-0.4.2/engine/core/gui/librocket/base/librocketrenderinterface.h000066400000000000000000000122271341615052600265370ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_GUI_LIBROCKETRENDERINTERFACE_H #define FIFE_GUI_LIBROCKETRENDERINTERFACE_H // Standard C++ library includes #include #include #include // 3rd party library includes #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/singleton.h" #include "util/resource/resource.h" #include "util/structures/rect.h" #include "util/structures/point.h" #include "video/color.h" #include "video/renderbackend.h" namespace FIFE { class ImageManager; class RenderBackend; class LibRocketRenderInterface : public Rocket::Core::RenderInterface { public: /** Constructor. */ LibRocketRenderInterface(); /** Destructor. */ virtual ~LibRocketRenderInterface(); /** Called by Rocket when it wants to render geometry that it does not wish to optimise. */ virtual void RenderGeometry(Rocket::Core::Vertex* vertices, int num_vertices, int* indices, int num_indices, Rocket::Core::TextureHandle texture, const Rocket::Core::Vector2f& translation); /** Called by Rocket when it wants to compile geometry it believes will be static for the forseeable future. */ virtual Rocket::Core::CompiledGeometryHandle CompileGeometry(Rocket::Core::Vertex* vertices, int num_vertices, int* indices, int num_indices, Rocket::Core::TextureHandle texture); /** Called by Rocket when it wants to render application-compiled geometry. */ virtual void RenderCompiledGeometry(Rocket::Core::CompiledGeometryHandle geometry, const Rocket::Core::Vector2f& translation); /** Called by Rocket when it wants to release application-compiled geometry. */ virtual void ReleaseCompiledGeometry(Rocket::Core::CompiledGeometryHandle geometry); /** Called by Rocket when it wants to enable or disable scissoring to clip content. */ virtual void EnableScissorRegion(bool enable); /** Called by Rocket when it wants to change the scissor region. */ virtual void SetScissorRegion(int x, int y, int width, int height); /** Called by Rocket when a texture is required by the library. */ virtual bool LoadTexture(Rocket::Core::TextureHandle& texture_handle, Rocket::Core::Vector2i& texture_dimensions, const Rocket::Core::String& source); /** Called by Rocket when a texture is required to be built from an internally-generated sequence of pixels. */ virtual bool GenerateTexture(Rocket::Core::TextureHandle& texture_handle, const Rocket::Core::byte* source, const Rocket::Core::Vector2i& source_dimensions); /** Called by Rocket when a loaded texture is no longer required. */ virtual void ReleaseTexture(Rocket::Core::TextureHandle texture_handle); /** * Renders librocket gui. */ void render(); /** * Frees all textures that are no longer needed by librocket. */ void freeTextures(); private: RenderBackend* m_renderBackend; ImageManager* m_imageManager; class GeometryCallData { public: std::vector vertices; std::vector indices; ResourceHandle textureHandle; DoublePoint translation; }; typedef std::queue GeometryCallDataChain; class GeometryCall { public: GeometryCall() : enableScissorTest(false), hasScissorArea(false) { } GeometryCallDataChain callChain; Rect scissorArea; bool enableScissorTest; bool hasScissorArea; }; std::queue m_geometryCalls; std::list m_freedTextures; }; }; #endif // FIFE_GUI_LIBROCKETRENDERINTERFACE_Hfifengine-0.4.2/engine/core/gui/librocket/librocketmanager.cpp000066400000000000000000000142051341615052600244300ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // 3rd party library includes #include #include #ifdef _DEBUG #include #endif // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/exception.h" #include "util/time/timemanager.h" #include "librocketmanager.h" #include "base/librocketinputprocessor.h" #include "base/librocketrenderinterface.h" namespace FIFE { LibRocketManager::LibRocketManager() : m_renderInterface(new LibRocketRenderInterface), m_inputProcessor(NULL) { Rocket::Core::SetSystemInterface(this); Rocket::Core::SetRenderInterface(m_renderInterface); Rocket::Core::Initialise(); Rocket::Controls::Initialise(); } LibRocketManager::~LibRocketManager() { unloadDocuments(); m_context->RemoveReference(); Rocket::Core::Shutdown(); delete m_renderInterface; delete m_inputProcessor; } void LibRocketManager::init(const std::string& backend, int32_t screenWidth, int32_t screenHeight) { m_context = Rocket::Core::CreateContext("default", Rocket::Core::Vector2i(screenWidth, screenHeight)); #ifdef _DEBUG Rocket::Debugger::Initialise(m_context); #endif m_inputProcessor = new LibRocketInputProcessor(m_context); } float LibRocketManager::GetElapsedTime() { static TimeManager *timeManager = TimeManager::instance(); return timeManager->getTime() / 1000.0f; } void LibRocketManager::turn() { m_inputProcessor->turn(); m_context->Update(); m_context->Render(); m_renderInterface->render(); m_renderInterface->freeTextures(); //m_renderInterface->reset(); } void LibRocketManager::resizeTopContainer(uint32_t x, uint32_t y, uint32_t width, uint32_t height) { m_context->SetDimensions(Rocket::Core::Vector2i(width, height)); } Rocket::Core::ElementDocument* LibRocketManager::loadDocument(const std::string& id, const std::string& documentPath) { if(m_openDocuments.find(id) != m_openDocuments.end()) { throw GuiException("Id: " + id + " already used!"); } Rocket::Core::String rocketDocumentPath(documentPath.c_str()); Rocket::Core::ElementDocument* document = m_context->LoadDocument(rocketDocumentPath); if(document != NULL) { m_openDocuments[id] = document; } else { throw GuiException("Could not load document " + documentPath + "!"); } return document; } Rocket::Core::ElementDocument* LibRocketManager::getDocument(const std::string& id) { std::map::iterator doc(m_openDocuments.find(id)); if(doc == m_openDocuments.end()) { throw GuiException("Rocket document with id " + id + " doesn't exist!"); } return doc->second; } void LibRocketManager::unloadDocument(Rocket::Core::ElementDocument* document) { std::map::iterator currDoc(m_openDocuments.begin()); std::map::iterator endDocs(m_openDocuments.end()); for(; currDoc != endDocs;) { if(currDoc->second == document) { m_context->UnloadDocument(currDoc->second); m_openDocuments.erase(currDoc); break; } ++currDoc; } } void LibRocketManager::unloadDocument(const std::string& id) { std::map::iterator doc(m_openDocuments.find(id)); if(doc != m_openDocuments.end()) { m_context->UnloadDocument(doc->second); m_openDocuments.erase(doc); } } void LibRocketManager::loadFont(const std::string& filepath) { Rocket::Core::String rocketFontPath(filepath.c_str()); bool succeeded = Rocket::Core::FontDatabase::LoadFontFace(rocketFontPath); if(!succeeded) { throw GuiException("Librocket cannot open font: " + filepath); } } bool LibRocketManager::onSdlEvent(SDL_Event& evt) { return (m_inputProcessor != NULL) ? m_inputProcessor->onSdlEvent(evt) : false; } void LibRocketManager::showDebugger() const { #ifdef _DEBUG if(!Rocket::Debugger::IsVisible()) { Rocket::Debugger::SetVisible(true); } #endif } void LibRocketManager::hideDebugger() const { #ifdef _DEBUG if(Rocket::Debugger::IsVisible()) { Rocket::Debugger::SetVisible(false); } #endif } void LibRocketManager::unloadDocuments() { std::map::iterator currDoc(m_openDocuments.begin()); std::map::iterator endDocs(m_openDocuments.end()); for(; currDoc != endDocs; ++currDoc) { m_context->UnloadDocument(currDoc->second); } m_openDocuments.clear(); } }; fifengine-0.4.2/engine/core/gui/librocket/librocketmanager.h000066400000000000000000000115251341615052600240770ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_GUI_LIBROCKETMANAGER_H #define FIFE_GUI_LIBROCKETMANAGER_H // Standard C++ library includes #include #include // 3rd party library includes #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/singleton.h" #include "gui/guimanager.h" namespace Rocket { namespace Core { class Context; class ElementDocument; } }; namespace FIFE { class LibRocketInputProcessor; class LibRocketRenderInterface; class LibRocketManager : public Rocket::Core::SystemInterface, public IGUIManager, public DynamicSingleton { public: /** Constructor. */ LibRocketManager(); /** * Destructor. */ virtual ~LibRocketManager(); /** * Initializes the librocket manager. */ void init(const std::string& backend, int32_t screenWidth, int32_t screenHeight); /** * NOTE * There is an inconsistency in the naming of this method. * It's in upper camelcase and should have been in lower camelcase, * but it overrides Rocket::Core::SystemInterface::GetElapsedTime. * * @return The number of seconds elapsed since the start of the application. */ virtual float GetElapsedTime(); /** Updates and renders the gui. */ virtual void turn(); /** Resizes the top container. * * @param x The new starting X coordinate. * @param y The new starting Y coordinate. * @param width The new width. * @param height The new height. */ virtual void resizeTopContainer(uint32_t x, uint32_t y, uint32_t width, uint32_t height); /** Loads a rocket .rml file and shows it. * * @param id Id of the document chosen by the user. * @param documentPath Path to the file. * @return A document if the .rml file exists, NULL otherwise. */ virtual Rocket::Core::ElementDocument* loadDocument(const std::string& id, const std::string& documentPath); /** @return Document with id. */ virtual Rocket::Core::ElementDocument* getDocument(const std::string& id); /** Unloads a rocket document. */ virtual void unloadDocument(Rocket::Core::ElementDocument* document); /** Unloads a rocket document with given id. */ virtual void unloadDocument(const std::string& id); /** * Loads a font to be used by librocket. * * @param filepath Path of the font. */ virtual void loadFont(const std::string& filepath); /** Receives input and converts it to librocket format, then it forwards it * to librocket. */ virtual bool onSdlEvent(SDL_Event& evt); /** Shows the librocket debugger. */ void showDebugger() const; /** * Hides the librocket debugger. */ void hideDebugger() const; private: /** * Unloads documents opened by librocket. */ void unloadDocuments(); /** Librocket's context. */ Rocket::Core::Context* m_context; /** Render Interface for librocket. */ LibRocketRenderInterface* m_renderInterface; /** Input processor for librocket. */ LibRocketInputProcessor* m_inputProcessor; /** A set of all open documents. */ std::map m_openDocuments; }; }; #endif //FIFE_GUI_LIBROCKETMANAGER_Hfifengine-0.4.2/engine/core/gui/librocket/librocketmanager.i000066400000000000000000000007551341615052600241030ustar00rootroot00000000000000%module fife %{ #include "gui/librocket/librocketmanager.h" #include "gui/guimanager.h" %} %include "gui/guimanager.i" namespace FIFE { %feature("notabstract") LibRocketManager; class LibRocketManager : public IGUIManager { public: LibRocketManager(); virtual ~LibRocketManager(); void init(const std::string& backend, int32_t screenWidth, int32_t screenHeight); void loadFont(const std::string& filepath); void showDebugger() const; void hideDebugger() const; }; }fifengine-0.4.2/engine/core/loaders/000077500000000000000000000000001341615052600173005ustar00rootroot00000000000000fifengine-0.4.2/engine/core/loaders/native/000077500000000000000000000000001341615052600205665ustar00rootroot00000000000000fifengine-0.4.2/engine/core/loaders/native/audio/000077500000000000000000000000001341615052600216675ustar00rootroot00000000000000fifengine-0.4.2/engine/core/loaders/native/audio/ogg_loader.cpp000066400000000000000000000044011341615052600244740ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // Platform specific includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "audio/soundclip.h" #include "vfs/vfs.h" #include "util/log/logger.h" #include "util/base/exception.h" #include "ogg_loader.h" #include "sounddecoder_ogg.h" namespace FIFE { static Logger _log(LM_NATIVE_LOADERS); void OggLoader::load(IResource* res) { VFS* vfs = VFS::instance(); std::string filename = res->getName(); RawData* rdptr = vfs->open(filename); dynamic_cast(res)->adobtDecoder(new SoundDecoderOgg(rdptr)); } } fifengine-0.4.2/engine/core/loaders/native/audio/ogg_loader.h000066400000000000000000000040331341615052600241420ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_OGGLOADER_H_ #define FIFE_OGGLOADER_H_ // Standard C++ library includes // Platform specific includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/resource/resource.h" namespace FIFE { class OggLoader : public IResourceLoader { public: OggLoader() { } virtual void load(IResource* res); }; } #endif fifengine-0.4.2/engine/core/loaders/native/audio/sounddecoder_ogg.cpp000066400000000000000000000111311341615052600257020ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // Platform specific includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/log/logger.h" #include "util/base/exception.h" #include "sounddecoder_ogg.h" namespace FIFE { /** Logger to use for this source file. * @relates Logger */ static Logger _log(LM_AUDIO); /* OggVorbis Callback functions */ namespace OGG_cb { static size_t read(void *ptr, size_t size, size_t nmemb, void *datasource) { RawData* rdp = reinterpret_cast(datasource); size_t restlen = rdp->getDataLength()-rdp->getCurrentIndex(); size_t len = (restlen<=size*nmemb)?restlen:size*nmemb; if (len) { rdp->readInto(reinterpret_cast(ptr), len); } return len; } static int32_t seek(void *datasource, ogg_int64_t offset, int32_t whence) { RawData* rdp = reinterpret_cast(datasource); switch (whence) { case SEEK_SET: (*rdp).setIndex(static_cast(offset)); return 0; case SEEK_CUR: (*rdp).moveIndex(static_cast(offset)); return 0; case SEEK_END: (*rdp).setIndex( (*rdp).getDataLength() -1 + static_cast(offset)); return 0; } return -1; } static int32_t close(void *datasource) { return 0; } static long tell(void *datasource) { RawData* rdp = reinterpret_cast(datasource); return (*rdp).getCurrentIndex(); } } SoundDecoderOgg::SoundDecoderOgg(RawData* rdp) : m_file(rdp) { ov_callbacks ocb = { OGG_cb::read, OGG_cb::seek, OGG_cb::close, OGG_cb::tell }; if (0 > ov_open_callbacks(m_file.get(), &m_ovf, 0, 0, ocb)) { throw InvalidFormat("Error opening OggVorbis file"); } vorbis_info* vi = ov_info(&m_ovf, -1); if (!vi) { throw InvalidFormat("Error fetching OggVorbis info"); } if (!ov_seekable(&m_ovf)) { throw InvalidFormat("OggVorbis file has to be seekable"); } m_isstereo = vi->channels == 2; m_samplerate = vi->rate; m_is8bit = false; m_declength = (m_isstereo ? 2 : 1) * 2 * ov_pcm_total(&m_ovf, -1); m_datasize = 0; m_data = NULL; } SoundDecoderOgg::~SoundDecoderOgg() { releaseBuffer(); ov_clear(&m_ovf); } bool SoundDecoderOgg::decode(uint64_t length) { int32_t stream = 0; int32_t ret = 0; // release buffer and allocate new memory releaseBuffer(); m_data = new char[length]; // decode the stream m_datasize = 0; while (length-m_datasize > 0) { ret = ov_read(&m_ovf, m_data + m_datasize, length-m_datasize, 0, 2, 1, &stream); if (ret > 0) { m_datasize += ret; } else if (ret == OV_HOLE) { continue; } else if (ret == 0 || ret <= OV_EREAD) { break; } } return m_datasize == 0; } bool SoundDecoderOgg::setCursor(uint64_t pos) { if (ov_pcm_seek(&m_ovf, pos / ((m_isstereo ? 2 : 1) * 2)) == 0) { return true; } return false; } void SoundDecoderOgg::releaseBuffer() { if (m_data != NULL) { delete[] m_data; m_data = NULL; } } } fifengine-0.4.2/engine/core/loaders/native/audio/sounddecoder_ogg.h000066400000000000000000000061171341615052600253570ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_SOUNDDECODER_OGG_H #define FIFE_SOUNDDECODER_OGG_H // Standard C++ library includes #include // Platform specific includes // 3rd party library includes #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "vfs/raw/rawdata.h" #include "audio/sounddecoder.h" namespace FIFE { class SoundDecoderOgg : public SoundDecoder { public: SoundDecoderOgg(RawData* ptr); ~SoundDecoderOgg(); /** Returns the decoded length of the file in bytes */ uint64_t getDecodedLength() const{ return m_declength; } /** Sets the current position in the file (in bytes) * * @return True, if the positioning was successful */ bool setCursor(uint64_t pos); /** Request the decoding of the next part of the stream. * * @param length The length of the decoded part * @return 0 (False), if decoding was successful */ bool decode(uint64_t length); /** Returns the next decoded buffer. * * The length of the buffer is returned by getBufferSize(). */ void* getBuffer() const{ return m_data; } /** Returns the byte-size of the buffer returned by getBuffer(). */ uint64_t getBufferSize() { return m_datasize; } /** Releases the buffer returned by getBuffer() */ void releaseBuffer(); private: std::unique_ptr m_file; uint64_t m_declength; uint64_t m_datasize; char* m_data; OggVorbis_File m_ovf; }; } #endif fifengine-0.4.2/engine/core/loaders/native/input/000077500000000000000000000000001341615052600217255ustar00rootroot00000000000000fifengine-0.4.2/engine/core/loaders/native/input/controllermappingloader.cpp000066400000000000000000000050041341615052600273560ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes #include // 3rd party library includes #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/exception.h" #include "vfs/raw/rawdata.h" #include "vfs/vfs.h" #include "controllermappingloader.h" namespace FIFE { void ControllerMappingLoader::load(const std::string& filename) { VFS* vfs = VFS::instance(); std::unique_ptr data(vfs->open(filename)); size_t datalen = data->getDataLength(); std::unique_ptr darray(new uint8_t[datalen]); data->readInto(darray.get(), datalen); SDL_RWops* rwops = SDL_RWFromConstMem(darray.get(), static_cast(datalen)); if (SDL_GameControllerAddMappingsFromRW(rwops, 0) == -1) { throw SDLException(std::string("Error when loading gamecontroller mappings: ") + SDL_GetError()); } SDL_FreeRW(rwops); } } //FIFE fifengine-0.4.2/engine/core/loaders/native/input/controllermappingloader.h000066400000000000000000000041221341615052600270230ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_INPUT_LOADERS_CONTROLLER_MAPPING_H #define FIFE_INPUT_LOADERS_CONTROLLER_MAPPING_H // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder namespace FIFE { /** Gamepad mapping loader. */ class ControllerMappingLoader { public: ControllerMappingLoader() {}; /** Loads mapping from file. */ void load(const std::string& filename); }; } #endif fifengine-0.4.2/engine/core/loaders/native/map/000077500000000000000000000000001341615052600213435ustar00rootroot00000000000000fifengine-0.4.2/engine/core/loaders/native/map/animationloader.cpp000066400000000000000000000214561341615052600252250ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // 3rd party library includes #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "vfs/fife_boost_filesystem.h" #include "vfs/vfs.h" #include "vfs/raw/rawdata.h" #include "video/imagemanager.h" #include "video/animationmanager.h" #include "video/image.h" #include "video/animation.h" #include "util/base/exception.h" #include "util/log/logger.h" #include "util/resource/resource.h" #include "util/resource/resourcemanager.h" #include "animationloader.h" namespace FIFE { /** Logger to use for this source file. * @relates Logger */ static Logger _log(LM_NATIVE_LOADERS); AnimationLoader::AnimationLoader(VFS* vfs, ImageManager* imageManager, AnimationManager* animationManager) : m_vfs(vfs), m_imageManager(imageManager), m_animationManager(animationManager) { } bool AnimationLoader::isLoadable(const std::string& filename) { bfs::path animPath(filename); std::string animationFilename = animPath.string(); TiXmlDocument animFile; try { RawData* data = m_vfs->open(animationFilename); if (data) { if (data->getDataLength() != 0) { // TODO - this could be expanded to do more checks animFile.Parse(data->readString(data->getDataLength()).c_str()); if (animFile.Error()) { return false; } } // done with data delete resource delete data; data = 0; } } catch (NotFound&) { return false; } // if we get here then loading the file went well TiXmlElement* root = animFile.RootElement(); if (root && root->ValueStr() == "assets") { if (root->FirstChildElement("animation")) { return true; } } return false; } AnimationPtr AnimationLoader::load(const std::string& filename) { bfs::path animPath(filename); std::string animationFilename = animPath.string(); TiXmlDocument doc; AnimationPtr animation; try { RawData* data = m_vfs->open(animationFilename); if (data) { if (data->getDataLength() != 0) { doc.Parse(data->readString(data->getDataLength()).c_str()); if (doc.Error()) { return animation; } // done with data delete resource delete data; data = 0; } } } catch (NotFound& e) { FL_ERR(_log, e.what()); // TODO - should we abort here // or rethrow the exception // or just keep going return animation; } // if we get here then everything loaded properly // so we can just parse out the contents TiXmlElement* root = doc.RootElement(); if (root && root->ValueStr() == "assets") { animation = loadAnimation(filename, root->FirstChildElement("animation")); } return animation; } std::vector AnimationLoader::loadMultiple(const std::string& filename) { bfs::path animPath(filename); std::string animationFilename = animPath.string(); TiXmlDocument doc; std::vector animationVector; try { RawData* data = m_vfs->open(animationFilename); if (data) { if (data->getDataLength() != 0) { doc.Parse(data->readString(data->getDataLength()).c_str()); if (doc.Error()) { return animationVector; } // done with data delete resource delete data; data = 0; } } } catch (NotFound& e) { FL_ERR(_log, e.what()); // TODO - should we abort here // or rethrow the exception // or just keep going return animationVector; } // if we get here then everything loaded properly // so we can just parse out the contents TiXmlElement* root = doc.RootElement(); if (root && root->ValueStr() == "assets") { for (TiXmlElement* animationElem = root->FirstChildElement("animation"); animationElem; animationElem = animationElem->NextSiblingElement("animation")) { AnimationPtr animation = loadAnimation(filename, animationElem); if (animation) { animationVector.push_back(animation); } } } return animationVector; } AnimationPtr AnimationLoader::loadAnimation(const std::string& filename, TiXmlElement* animationElem) { AnimationPtr animation; if (!animationElem) { return animation; } bfs::path animPath(filename); std::string animationFilename = animPath.string(); bool alreadyLoaded = false; // first try to use the id, if no id exists it use the filename as fallback const std::string* animationId = animationElem->Attribute(std::string("id")); if (animationId) { if (!m_animationManager->exists(*animationId)) { animation = m_animationManager->create(*animationId); } else { animation = m_animationManager->getPtr(*animationId); alreadyLoaded = animation->getFrameCount() != 0; } } else { if (HasParentPath(animPath)) { animPath= GetParentPath(animPath) / animationFilename; } else { animPath = bfs::path(animationFilename); } if (!m_animationManager->exists(animPath.string())) { animation = m_animationManager->create(animPath.string()); } else { animation = m_animationManager->getPtr(animPath.string()); alreadyLoaded = animation->getFrameCount() != 0; } } if (alreadyLoaded) { return animation; } int direction = 0; int actionFrame = -1; int animDelay = 0; int animXoffset = 0; int animYoffset = 0; int success = animationElem->QueryValueAttribute("direction", &direction); if (success == TIXML_SUCCESS) { animation->setDirection(direction); } success = animationElem->QueryValueAttribute("action_frame", &actionFrame); if (success == TIXML_SUCCESS) { animation->setActionFrame(actionFrame); } animationElem->QueryValueAttribute("delay", &animDelay); animationElem->QueryValueAttribute("x_offset", &animXoffset); animationElem->QueryValueAttribute("y_offset", &animYoffset); for (TiXmlElement* frameElement = animationElem->FirstChildElement("frame"); frameElement; frameElement = frameElement->NextSiblingElement("frame")) { const std::string* sourceId = frameElement->Attribute(std::string("source")); if (sourceId) { bfs::path framePath(filename); if (HasParentPath(framePath)) { framePath = GetParentPath(framePath) / *sourceId; if (!bfs::exists(framePath)) { framePath = bfs::path(*sourceId); } } else { framePath = bfs::path(*sourceId); } ImagePtr imagePtr; if (!m_imageManager->exists(framePath.string())) { imagePtr = m_imageManager->create(framePath.string()); } else { imagePtr = m_imageManager->getPtr(framePath.string()); } if (imagePtr) { int frameXoffset = 0; success = frameElement->QueryValueAttribute("x_offset", &frameXoffset); if (success == TIXML_SUCCESS) { imagePtr->setXShift(frameXoffset); } else { imagePtr->setXShift(animXoffset); } int frameYoffset = 0; success = frameElement->QueryValueAttribute("y_offset", &frameYoffset); if (success == TIXML_SUCCESS) { imagePtr->setYShift(frameYoffset); } else { imagePtr->setYShift(animYoffset); } int frameDelay = 0; success = frameElement->QueryValueAttribute("delay", &frameDelay); if (success == TIXML_SUCCESS) { animation->addFrame(imagePtr, frameDelay); } else { animation->addFrame(imagePtr, animDelay); } } } } return animation; } } fifengine-0.4.2/engine/core/loaders/native/map/animationloader.h000066400000000000000000000053001341615052600246600ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_ANIMATION_LOADER_H #define FIFE_ANIMATION_LOADER_H // Standard C++ library includes #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "video/animation.h" #include "ianimationloader.h" class TiXmlElement; namespace FIFE { class VFS; class ImageManager; class AnimationManager; class AnimationLoader : public IAnimationLoader { public: AnimationLoader(VFS* vfs, ImageManager* imageManager, AnimationManager* animationManager); /** * @see IAnimationLoader::isLoadable */ virtual bool isLoadable(const std::string& filename); /** * @see IAnimationLoader::load */ virtual AnimationPtr load(const std::string& filename); /** * @see IAnimationLoader::loadMultiple */ virtual std::vector loadMultiple(const std::string& filename); private: AnimationPtr loadAnimation(const std::string& filename, TiXmlElement* animationElem); VFS* m_vfs; ImageManager* m_imageManager; AnimationManager* m_animationManager; }; } #endif fifengine-0.4.2/engine/core/loaders/native/map/atlasloader.cpp000066400000000000000000000254421341615052600243510ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // 3rd party library includes #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "model/model.h" #include "model/structures/layer.h" #include "vfs/fife_boost_filesystem.h" #include "vfs/vfs.h" #include "vfs/raw/rawdata.h" #include "util/base/exception.h" #include "util/log/logger.h" #include "util/resource/resource.h" #include "util/resource/resourcemanager.h" #include "video/animationmanager.h" #include "view/visual.h" #include "atlasloader.h" namespace FIFE { /** Logger to use for this source file. * @relates Logger */ static Logger _log(LM_NATIVE_LOADERS); size_t Atlas::getImageCount() const { return m_subimages.size(); } ImagePtr& Atlas::getPackedImage() { return m_image; } ImagePtr Atlas::getImage(const std::string& id) { SubimageMap::iterator iter = m_subimages.find(id); if(iter == m_subimages.end()) return ImagePtr(); return iter->second.image; } ImagePtr Atlas::getImage(uint32_t index) { if(index > getImageCount()) return ImagePtr(); SubimageMap::iterator iter = m_subimages.begin(); for(uint32_t i = 0; i < index; ++i, ++iter); return iter->second.image; } bool Atlas::addImage(const std::string& imagename, const AtlasData& data) { return m_subimages.insert(std::pair(imagename, data)).second; } void Atlas::setPackedImage(const ImagePtr& image) { m_image = image; } const std::string& Atlas::getName() const { return m_name; } AtlasLoader::AtlasLoader(Model* model, VFS* vfs, ImageManager* imageManager, AnimationManager* animationManager) : m_model(model), m_vfs(vfs), m_imageManager(imageManager), m_animationManager(animationManager) { } AtlasLoader::~AtlasLoader() { } bool AtlasLoader::isLoadable(const std::string& filename) { bfs::path atlasPath(filename); std::string atlasFilename = atlasPath.string(); TiXmlDocument atlasFile; try { RawData* data = m_vfs->open(atlasFilename); if (data) { if (data->getDataLength() != 0) { atlasFile.Parse(data->readString(data->getDataLength()).c_str()); if (atlasFile.Error()) { return false; } } else { return false; } // done with data delete resource delete data; data = 0; } } catch (NotFound&) { return false; } // if we get here then loading the file went well TiXmlElement* root = atlasFile.RootElement(); if (root && root->ValueStr() == "assets") { if (root->FirstChildElement("atlas")) { return true; } } return false; } AtlasPtr AtlasLoader::load(const std::string& filename) { bfs::path atlasPath(filename); bfs::path atlasPathDirectory; std::string atlasFilename = atlasPath.string(); if (HasParentPath(atlasPath)) { // save the directory where the atlas file is located atlasPathDirectory = GetParentPath(atlasPath); } TiXmlDocument doc; AtlasPtr atlas; try { RawData* data = m_vfs->open(atlasFilename); if (data) { if (data->getDataLength() != 0) { doc.Parse(data->readString(data->getDataLength()).c_str()); if (doc.Error()) { return atlas; } // done with data delete resource delete data; data = 0; } } } catch (NotFound& e) { FL_ERR(_log, e.what()); // TODO - should we abort here // or rethrow the exception // or just keep going return atlas; } // if we get here then everything loaded properly // so we can just parse out the contents TiXmlElement* root = doc.RootElement(); if (root && root->ValueStr() == "assets") { atlas = loadAtlas(filename, root->FirstChildElement("atlas")); } return atlas; } std::vector AtlasLoader::loadMultiple(const std::string& filename) { bfs::path atlasPath(filename); bfs::path atlasPathDirectory; std::string atlasFilename = atlasPath.string(); if (HasParentPath(atlasPath)) { // save the directory where the atlas file is located atlasPathDirectory = GetParentPath(atlasPath); } TiXmlDocument doc; std::vector atlasVector; try { RawData* data = m_vfs->open(atlasFilename); if (data) { if (data->getDataLength() != 0) { doc.Parse(data->readString(data->getDataLength()).c_str()); if (doc.Error()) { return atlasVector; } // done with data delete resource delete data; data = 0; } } } catch (NotFound& e) { FL_ERR(_log, e.what()); // TODO - should we abort here // or rethrow the exception // or just keep going return atlasVector; } // if we get here then everything loaded properly // so we can just parse out the contents TiXmlElement* root = doc.RootElement(); if (root && root->ValueStr() == "assets") { for (TiXmlElement* atlasElem = root->FirstChildElement("atlas"); atlasElem; atlasElem = atlasElem->NextSiblingElement("atlas")) { AtlasPtr atlas = loadAtlas(filename, atlasElem); if (atlas) { atlasVector.push_back(atlas); } } } return atlasVector; } AtlasPtr AtlasLoader::loadAtlas(const std::string& filename, TiXmlElement* atlasElem) { AtlasPtr atlas; if (!atlasElem) { return atlas; } const std::string* atlasSource = atlasElem->Attribute(std::string("source")); if (atlasSource) { const std::string* atlasId = atlasElem->Attribute(std::string("id")); bfs::path atlasPath(filename); bfs::path atlasPathDirectory; if (HasParentPath(atlasPath)) { // save the directory where the atlas file is located atlasPathDirectory = GetParentPath(atlasPath); } // Atlas itself doesn't have appended id bfs::path atlasImagePath = atlasPathDirectory / *atlasSource; atlas.reset(new Atlas(atlasImagePath.string())); // End-user could create the same atlas for the second time. // Since we don't hold any data for Atlases like ImageManager we need to recreate // atlas parameters (to return proper AtlasPtr) but don't reload pixel data (they are held by ImageManager). if (!m_imageManager->exists(atlas->getName())) { atlas->setPackedImage(m_imageManager->create(atlas->getName())); } else { atlas->setPackedImage(m_imageManager->getPtr(atlas->getName())); } // Create subimages with given id and individual position and size if (atlasElem->FirstChildElement("subimage")) { for (TiXmlElement* imageElem = atlasElem->FirstChildElement("subimage"); imageElem != 0; imageElem = imageElem->NextSiblingElement("subimage")) { const std::string* subimageId = imageElem->Attribute(std::string("id")); if (subimageId) { Rect region; imageElem->QueryValueAttribute("xpos", ®ion.x); imageElem->QueryValueAttribute("ypos", ®ion.y); imageElem->QueryValueAttribute("width", ®ion.w); imageElem->QueryValueAttribute("height", ®ion.h); std::string finalname; // atlas id is optional here if (atlasId) { finalname = *atlasId + ":" + *subimageId; } else { finalname = *subimageId; } ImagePtr subImage; if (!m_imageManager->exists(finalname)) { subImage = m_imageManager->create(finalname); } else { subImage = m_imageManager->getPtr(finalname); } subImage->useSharedImage(atlas->getPackedImage(), region); AtlasData atlasData = {region, subImage}; atlas->addImage(finalname, atlasData); } } } else { // Create subimages with automatic id and same size int frame = 0; int atlasWidth = 0; int atlasHeight = 0; int subimageWidth = 0; int subimageHeight = 0; atlasElem->QueryValueAttribute("atlas_width", &atlasWidth); atlasElem->QueryValueAttribute("atlas_height", &atlasHeight); atlasElem->QueryValueAttribute("subimage_width", &subimageWidth); atlasElem->QueryValueAttribute("subimage_height", &subimageHeight); // file extension of the atlas is also used as subimage extension std::string extension = bfs::extension(*atlasSource); // we need an atlas id if (!atlasId) { atlasId = atlasSource; } if (atlasWidth != 0 && atlasHeight != 0 && subimageWidth != 0 && subimageHeight != 0) { int x_rows = atlasWidth / subimageWidth; int y_rows = atlasHeight / subimageHeight; Rect region(0, 0, subimageWidth, subimageHeight); for (int y = 0; y < y_rows; ++y) { region.y = y * subimageHeight; for (int x = 0; x < x_rows; ++x) { region.x = x * subimageWidth; static char tmp[64]; snprintf(tmp, 64, "%04d", frame); std::ostringstream finalname; finalname << *atlasId << ":" << std::string(tmp) << extension; ImagePtr subImage; if (!m_imageManager->exists(finalname.str())) { subImage = m_imageManager->create(finalname.str()); } else { subImage = m_imageManager->getPtr(finalname.str()); } subImage->useSharedImage(atlas->getPackedImage(), region); AtlasData atlasData = {region, subImage}; atlas->addImage(finalname.str(), atlasData); ++frame; } } } } } return atlas; } AtlasLoader* createDefaultAtlasLoader(Model* model, VFS* vfs, ImageManager* imageManager, AnimationManager* animationManager) { return new AtlasLoader(model, vfs, imageManager, animationManager); } } fifengine-0.4.2/engine/core/loaders/native/map/atlasloader.h000066400000000000000000000102551341615052600240120ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_ATLAS_LOADER_H #define FIFE_ATLAS_LOADER_H // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/structures/rect.h" #include "video/image.h" #include "video/imagemanager.h" #include "iatlasloader.h" class TiXmlElement; namespace FIFE { class VFS; class ImageManager; class AnimationManager; struct AtlasData { Rect rect; ImagePtr image; }; class Atlas { public: Atlas(const std::string& name) : m_name(name) {;} ~Atlas() {;} /** Returns the number of subimages that belongs to this atlas. */ size_t getImageCount() const; /** Returns an (packed) Image for this atlas. */ ImagePtr& getPackedImage(); /** Return an Image of given id. */ ImagePtr getImage(const std::string& id); /** Return an Image of given (serial) index in atlas */ ImagePtr getImage(uint32_t index); /** Adds new information about subimage that belongs to this atlas. * @remarks This is essential function in parsing atlas files. * @returns True, when image of given name hasn't been added before. */ bool addImage(const std::string& imagename, const AtlasData& data); /** Sets the image for atlas to use it for rendering. * @remarks Should only be used during loading stage */ void setPackedImage(const ImagePtr& image); const std::string& getName() const; protected: typedef std::map SubimageMap; SubimageMap m_subimages; ImagePtr m_image; // Unique atlas name std::string m_name; }; class AtlasLoader : public IAtlasLoader { public: AtlasLoader(Model* model, VFS* vfs, ImageManager* imageManager, AnimationManager* animationManager); virtual ~AtlasLoader(); /** * @see IAtlasLoader::isLoadable */ virtual bool isLoadable(const std::string& filename); /** * @see IAtlasLoader::load */ virtual AtlasPtr load(const std::string& filename); /** * @see IAtlasLoader::loadMultiple */ virtual std::vector loadMultiple(const std::string& filename); private: AtlasPtr loadAtlas(const std::string& filename, TiXmlElement* atlasElem); Model* m_model; VFS* m_vfs; ImageManager* m_imageManager; AnimationManager* m_animationManager; }; /** convenience function for creating the default fife atlas loader * deleting the object returned from this function is the * responsibility of the caller */ AtlasLoader* createDefaultAtlasLoader(Model* model, VFS* vfs, ImageManager* imageManager, AnimationManager* animationManager); } #endif fifengine-0.4.2/engine/core/loaders/native/map/ianimationloader.h000066400000000000000000000051501341615052600250340ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_IANIMATION_LOADER_H #define FIFE_IANIMATION_LOADER_H // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "video/animation.h" namespace FIFE { class IAnimationLoader { public: virtual ~IAnimationLoader() { }; /** determines whether the resource is in * the correct format for this loader */ virtual bool isLoadable(const std::string& filename) = 0; /** responsible for loading the animation * returns a shared pointer to an animation resource */ virtual AnimationPtr load(const std::string& filename) = 0; /** responsible for loading all animations * returns a vector of shared pointer to an animation resource */ virtual std::vector loadMultiple(const std::string& filename) = 0; }; typedef SharedPtr AnimationLoaderPtr; } #endif fifengine-0.4.2/engine/core/loaders/native/map/ianimationloader.i000066400000000000000000000034361341615052600250420ustar00rootroot00000000000000/************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fife %{ #include "loaders/native/map/ianimationloader.h" #include "loaders/native/map/animationloader.h" %} %include "video/video.i" namespace FIFE { %feature("director") IAnimationLoader; } %include "loaders/native/map/ianimationloader.h" %include "loaders/native/map/animationloader.h" fifengine-0.4.2/engine/core/loaders/native/map/iatlasloader.h000066400000000000000000000050751341615052600241670ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_IATLAS_LOADER_H #define FIFE_IATLAS_LOADER_H // Standard C++ library includes #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "video/imagemanager.h" namespace FIFE { class Atlas; typedef SharedPtr AtlasPtr; class IAtlasLoader { public: virtual ~IAtlasLoader() { }; /** determines whether the resource is in * the correct format for this loader */ virtual bool isLoadable(const std::string& filename) = 0; /** responsible for loading the atlas * returns a shared pointer to an image resource */ virtual AtlasPtr load(const std::string& filename) = 0; /** responsible for loading the all atlases * returns a vector of shared pointer to an image resource */ virtual std::vector loadMultiple(const std::string& filename) = 0; }; typedef SharedPtr AtlasLoaderPtr; } #endif fifengine-0.4.2/engine/core/loaders/native/map/iatlasloader.i000066400000000000000000000033601341615052600241630ustar00rootroot00000000000000/************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fife %{ #include "loaders/native/map/iatlasloader.h" #include "loaders/native/map/atlasloader.h" %} namespace FIFE { %feature("director") IAtlasLoader; } %include "loaders/native/map/iatlasloader.h" %include "loaders/native/map/atlasloader.h" fifengine-0.4.2/engine/core/loaders/native/map/imaploader.h000066400000000000000000000057301341615052600236360ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_IMAPLOADER_H_ #define FIFE_IMAPLOADER_H_ // Standard C++ library includes #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "iatlasloader.h" #include "iobjectloader.h" #include "ianimationloader.h" namespace FIFE { class Map; /** Interface class that all map loaders should derive from */ class IMapLoader { public: virtual ~IMapLoader() { }; /** allows setting which object loader will be * used to load object files */ virtual void setObjectLoader(const FIFE::ObjectLoaderPtr& objectLoader) = 0; /** allows setting which animation loader will be * used to load animation files */ virtual void setAnimationLoader(const FIFE::AnimationLoaderPtr& animationLoader) = 0; /** allows setting which atlas loader will be * used to load atlas files */ virtual void setAtlasLoader(const FIFE::AtlasLoaderPtr& atlasLoader) = 0; /** determines whether the resource is in * the correct format for this loader */ virtual bool isLoadable(const std::string& filename) const = 0; /** responsible for loading the map resource * and populating the engine */ virtual Map* load(const std::string& filename) = 0; }; } #endif fifengine-0.4.2/engine/core/loaders/native/map/imaploader.i000066400000000000000000000032221341615052600236310ustar00rootroot00000000000000/************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fife %{ #include "loaders/native/map/imaploader.h" %} namespace FIFE { %feature("director") IMapLoader; } %include "loaders/native/map/imaploader.h" fifengine-0.4.2/engine/core/loaders/native/map/iobjectloader.h000066400000000000000000000055361341615052600243330ustar00rootroot00000000000000/************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_IOBJECTLOADER_H_ #define FIFE_IOBJECTLOADER_H_ // Standard C++ library includes #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/sharedptr.h" #include "ianimationloader.h" #include "iatlasloader.h" namespace FIFE { /** Interface class that all object loaders should derive from */ class IObjectLoader { public: virtual ~IObjectLoader() { }; /** allows setting which animation loader will be * used to load animation files */ virtual void setAnimationLoader(const AnimationLoaderPtr& animationLoader) = 0; virtual AnimationLoaderPtr getAnimationLoader() = 0; /** allows setting which atlas loader will be * used to load atlas files */ virtual void setAtlasLoader(const AtlasLoaderPtr& atlasLoader) = 0; virtual AtlasLoaderPtr getAtlasLoader() = 0; /** determines whether the resource is in * the correct format for this loader */ virtual bool isLoadable(const std::string& filename) const = 0; /** responsible for loading the object resource * and populating the engine */ virtual void load(const std::string& filename) = 0; }; typedef SharedPtr ObjectLoaderPtr; } #endiffifengine-0.4.2/engine/core/loaders/native/map/iobjectloader.i000066400000000000000000000034451341615052600243310ustar00rootroot00000000000000/************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fife %{ #include "loaders/native/map/iobjectloader.h" #include "loaders/native/map/ianimationloader.h" #include "loaders/native/map/objectloader.h" %} namespace FIFE { %feature("director") IObjectLoader; } %include "loaders/native/map/iobjectloader.h" %include "loaders/native/map/objectloader.h" fifengine-0.4.2/engine/core/loaders/native/map/maploader.cpp000066400000000000000000000744461341615052600240320ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes #include #include // 3rd party includes #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "model/model.h" #include "model/structures/layer.h" #include "model/structures/instance.h" #include "model/structures/cell.h" #include "model/structures/cellcache.h" #include "model/structures/trigger.h" #include "model/structures/triggercontroller.h" #include "model/metamodel/grids/cellgrid.h" #include "model/metamodel/modelcoords.h" #include "model/metamodel/action.h" #include "vfs/fife_boost_filesystem.h" #include "vfs/vfs.h" #include "vfs/vfsdirectory.h" #include "vfs/raw/rawdata.h" #include "util/base/exception.h" #include "util/log/logger.h" #include "util/resource/resource.h" #include "util/structures/rect.h" #include "video/imagemanager.h" #include "video/animationmanager.h" #include "video/image.h" #include "video/renderbackend.h" #include "view/visual.h" #include "view/camera.h" #include "view/renderers/instancerenderer.h" #include "util/base/stringutils.h" #include "atlasloader.h" #include "maploader.h" #include "animationloader.h" #include "objectloader.h" namespace FIFE { /** Logger to use for this source file. * @relates Logger */ static Logger _log(LM_NATIVE_LOADERS); MapLoader::MapLoader(Model* model, VFS* vfs, ImageManager* imageManager, RenderBackend* renderBackend) : m_model(model), m_vfs(vfs), m_imageManager(imageManager), m_animationManager(AnimationManager::instance()), m_renderBackend(renderBackend), m_loaderName("fife"), m_mapDirectory("") { AnimationLoaderPtr animationLoader(new AnimationLoader(m_vfs, m_imageManager, m_animationManager)); AtlasLoaderPtr atlasLoader(new AtlasLoader(m_model, m_vfs, m_imageManager, m_animationManager)); m_objectLoader.reset(new ObjectLoader(m_model, m_vfs, m_imageManager, m_animationManager, animationLoader, atlasLoader)); } MapLoader::~MapLoader() { } Map* MapLoader::load(const std::string& filename) { Map* map = NULL; // reset percent done listener just in case // it has residual data from last load m_percentDoneListener.reset(); bfs::path mapPath(filename); if (HasParentPath(mapPath)) { if (GetParentPath(mapPath).string() != m_mapDirectory) { // save the directory where the map file is located m_mapDirectory = GetParentPath(mapPath).string(); } } TiXmlDocument mapFile; std::string mapFilename = mapPath.string(); try { RawData* data = m_vfs->open(mapFilename); if (data) { if (data->getDataLength() != 0) { mapFile.Parse(data->readString(data->getDataLength()).c_str()); if (mapFile.Error()) { std::ostringstream oss; oss << " Failed to load" << mapFilename << " : " << __FILE__ << " [" << __LINE__ << "]" << std::endl; FL_ERR(_log, oss.str()); return map; } } // done with data delete resource delete data; data = 0; } } catch (NotFound& e) { FL_ERR(_log, e.what()); // TODO - should we abort here // or rethrow the exception // or just keep going return map; } // if we get here then everything loaded properly // so we can just parse out the contents const TiXmlElement* root = mapFile.RootElement(); if (root) { const std::string* loaderName = root->Attribute(std::string("loaderName")); if (loaderName) { m_loaderName = *loaderName; } int numElements = 0; root->QueryValueAttribute("elements", &numElements); m_percentDoneListener.setTotalNumberOfElements(numElements); const std::string* mapName = root->Attribute(std::string("id")); if (mapName) { try { map = m_model->createMap(*mapName); } catch (NameClash& e) { FL_ERR(_log, e.what()); // just rethrow to client throw; } if (map) { map->setFilename(mapFilename); std::string ns = ""; for (const TiXmlElement *importElement = root->FirstChildElement("import"); importElement; importElement = importElement->NextSiblingElement("import")) { const std::string* importDir = importElement->Attribute(std::string("dir")); const std::string* importFile = importElement->Attribute(std::string("file")); std::string directory = ""; if (importDir) { directory = *importDir; } std::string file = ""; if (importFile) { file = *importFile; } if (importDir && !importFile) { bfs::path fullPath(m_mapDirectory); fullPath /= directory; loadImportDirectory(fullPath.string()); } else if (importFile) { bfs::path fullFilePath(file); bfs::path fullDirPath(directory); if (importDir) { fullDirPath = bfs::path(m_mapDirectory); fullDirPath /= directory; } else { fullFilePath = bfs::path(m_mapDirectory); fullFilePath /= file; } loadImportFile(fullFilePath.string(), fullDirPath.string()); } } // converts multiobject part id to object pointer std::list namespaces = m_model->getNamespaces(); std::list::iterator name_it = namespaces.begin(); for (; name_it != namespaces.end(); ++name_it) { std::list objects = m_model->getObjects(*name_it); std::list::iterator object_it = objects.begin(); for (; object_it != objects.end(); ++object_it) { if ((*object_it)->isMultiObject()) { const std::list& multiParts = (*object_it)->getMultiPartIds(); std::list::const_iterator multi_it = multiParts.begin(); for (; multi_it != multiParts.end(); ++multi_it) { Object* partObj = m_model->getObject(*multi_it, *name_it); if (partObj) { partObj->setMultiPart(true); (*object_it)->addMultiPart(partObj); } } } } } // iterate over elements looking for layers for (const TiXmlElement* layerElement = root->FirstChildElement("layer"); layerElement; layerElement = layerElement->NextSiblingElement("layer")) { // defaults double xOffset = 0.0; double yOffset = 0.0; double zOffset = 0.0; double xScale = 1.0; double yScale = 1.0; double zScale = 1.0; double rotation = 0.0; int xOffsetRetVal = layerElement->QueryValueAttribute("x_offset", &xOffset); int yOffsetRetVal = layerElement->QueryValueAttribute("y_offset", &yOffset); layerElement->QueryValueAttribute("z_offset", &zOffset); int xScaleRetVal = layerElement->QueryValueAttribute("x_scale", &xScale); int yScaleRetVal = layerElement->QueryValueAttribute("y_scale", &yScale); layerElement->QueryValueAttribute("z_scale", &zScale); int rotationRetVal = layerElement->QueryValueAttribute("rotation", &rotation); const std::string* layerName = layerElement->Attribute(std::string("id")); const std::string* pathing = layerElement->Attribute(std::string("pathing")); const std::string* sorting = layerElement->Attribute(std::string("sorting")); const std::string* gridType = layerElement->Attribute(std::string("grid_type")); const std::string* layerType = layerElement->Attribute(std::string("layer_type")); const std::string* layerTypeName = layerElement->Attribute(std::string("layer_type_id")); if (xOffsetRetVal == TIXML_SUCCESS && yOffsetRetVal == TIXML_SUCCESS && xScaleRetVal == TIXML_SUCCESS && yScaleRetVal == TIXML_SUCCESS && rotationRetVal == TIXML_SUCCESS && layerName && pathing && gridType) { PathingStrategy pathStrategy = CELL_EDGES_ONLY; if ("cell_edges_and_diagonals" == *pathing) { pathStrategy = CELL_EDGES_AND_DIAGONALS; } SortingStrategy sortStrategy = SORTING_CAMERA; if (sorting) { if (*sorting == "location") { sortStrategy = SORTING_LOCATION; } else if (*sorting == "camera_and_location") { sortStrategy = SORTING_CAMERA_AND_LOCATION; } } CellGrid* grid = NULL; if (gridType) { grid = m_model->getCellGrid(*gridType); } else { grid = m_model->getCellGrid("square"); } if (grid) { grid->setXShift(xOffset); grid->setXScale(xScale); grid->setYShift(yOffset); grid->setYScale(yScale); grid->setZShift(zOffset); grid->setZScale(zScale); grid->setRotation(rotation); Layer *layer = NULL; try { layer = map->createLayer(*layerName, grid); } catch (NameClash&) { // TODO - handle exception assert(false); } if (layer) { layer->setPathingStrategy(pathStrategy); layer->setSortingStrategy(sortStrategy); if (layerType) { if (*layerType == "walkable") { layer->setWalkable(true); } else if (*layerType == "interact") { layer->setInteract(true, *layerTypeName); } } double curr_x = 0; double curr_y = 0; for (const TiXmlElement* instances = layerElement->FirstChildElement("instances"); instances; instances = instances->NextSiblingElement("instances")) { for (const TiXmlElement* instance = instances->FirstChildElement("i"); instance; instance = instance->NextSiblingElement("i")) { double x = 0; double y = 0; double z = 0; int r = 0; int stackpos = 0; int cellStack = 0; const std::string* instanceId = instance->Attribute(std::string("id")); const std::string* objectId = instance->Attribute(std::string("o")); const std::string* costId = instance->Attribute(std::string("cost_id")); if (!objectId) { objectId = instance->Attribute(std::string("object")); } if (!objectId) { objectId = instance->Attribute(std::string("obj")); } const std::string* namespaceId = instance->Attribute(std::string("ns")); if (!namespaceId) { namespaceId = instance->Attribute(std::string("namespace")); } int xRetVal = instance->QueryValueAttribute("x", &x); int yRetVal = instance->QueryValueAttribute("y", &y); instance->QueryValueAttribute("z", &z); int rRetVal = instance->QueryValueAttribute("r", &r); if (xRetVal == TIXML_SUCCESS) { curr_x = x; } else { x = ++curr_x; } if (yRetVal == TIXML_SUCCESS) { curr_y = y; } else { y = curr_y; } if (rRetVal != TIXML_SUCCESS) { rRetVal = instance->QueryValueAttribute("rotation", &r); } int stackRetVal = instance->QueryValueAttribute("stackpos", &stackpos); int cellStackRetVal = instance->QueryValueAttribute("cellstack", &cellStack); if (objectId) { if (namespaceId) { ns = *namespaceId; } Object* object = m_model->getObject(*objectId, ns); if (object) { Instance* inst = NULL; if (instanceId) { inst = layer->createInstance(object, ExactModelCoordinate(x,y,z), *instanceId); } else { inst = layer->createInstance(object, ExactModelCoordinate(x,y,z)); } if (inst) { if (rRetVal != TIXML_SUCCESS) { ObjectVisual* objVisual = object->getVisual(); std::vector angles; objVisual->getStaticImageAngles(angles); if (!angles.empty()) { r = angles[0]; } } inst->setRotation(r); InstanceVisual* instVisual = InstanceVisual::create(inst); if (instVisual && (stackRetVal == TIXML_SUCCESS)) { instVisual->setStackPosition(stackpos); } if (cellStackRetVal == TIXML_SUCCESS) { inst->setCellStackPosition(cellStack); } if (costId) { double cost = 0; int costRetVal = instance->QueryValueAttribute("cost", &cost); if (costRetVal == TIXML_SUCCESS) { inst->setCost(*costId, cost); } } if (object->getAction("default")) { Location target(layer); inst->actRepeat("default", target); } } else { std::ostringstream oss; oss << " Failed to create instance of object " << *objectId << " : " << __FILE__ << " [" << __LINE__ << "]" << std::endl; FL_ERR(_log, oss.str()); } } } // increment % done counter m_percentDoneListener.incrementCount(); } } } } } // increment % done counter m_percentDoneListener.incrementCount(); } // init CellCaches map->initializeCellCaches(); // add Cells from xml File for (const TiXmlElement* cacheElements = root->FirstChildElement("cellcaches"); cacheElements; cacheElements = cacheElements->NextSiblingElement("cellcaches")) { for (const TiXmlElement* cacheElement = cacheElements->FirstChildElement("cellcache"); cacheElement; cacheElement = cacheElement->NextSiblingElement("cellcache")) { double cacheCost = 1.0; double cacheSpeed = 1.0; const std::string* layerId = cacheElement->Attribute(std::string("id")); if (layerId) { cacheElement->QueryDoubleAttribute("default_cost", &cacheCost); cacheElement->QueryDoubleAttribute("default_speed", &cacheSpeed); Layer* layer = map->getLayer(*layerId); if (layer) { CellCache* cache = layer->getCellCache(); if (cache) { int searchNarrow = 0; cacheElement->QueryIntAttribute("search_narrow", &searchNarrow); cache->setSearchNarrowCells(searchNarrow != 0); cache->setDefaultCostMultiplier(cacheCost); cache->setDefaultSpeedMultiplier(cacheSpeed); for (const TiXmlElement* cellElement = cacheElement->FirstChildElement("cell"); cellElement; cellElement = cellElement->NextSiblingElement("cell")) { int cellX = 0; int cellY = 0; int success = cellElement->QueryIntAttribute("x", &cellX); success &= cellElement->QueryIntAttribute("y", &cellY); if (success == TIXML_SUCCESS) { ModelCoordinate mc(cellX, cellY); Cell* cell = cache->createCell(mc); const std::string* cellBlocker = cellElement->Attribute(std::string("blocker_type")); if (cellBlocker) { if (*cellBlocker == "no_blocker") { CellTypeInfo cti = CTYPE_CELL_NO_BLOCKER; cell->setCellType(cti); } else if (*cellBlocker == "blocker") { CellTypeInfo cti = CTYPE_CELL_BLOCKER; cell->setCellType(cti); } } double cellCost = 1.0; double cellSpeed = 1.0; success = cellElement->QueryDoubleAttribute("default_cost", &cellCost); if (success == TIXML_SUCCESS) { cell->setCostMultiplier(cellCost); } success = cellElement->QueryDoubleAttribute("default_speed", &cellSpeed); if (success == TIXML_SUCCESS) { cell->setSpeedMultiplier(cellSpeed); } int isNarrow = 0; cellElement->QueryIntAttribute("narrow", &isNarrow); if (isNarrow != 0) { cache->addNarrowCell(cell); } // add cost with given id to cell for (const TiXmlElement* costElement = cellElement->FirstChildElement("cost"); costElement; costElement = costElement->NextSiblingElement("cost")) { const std::string* costId = costElement->Attribute(std::string("id")); double cost = 1.0; success = costElement->QueryDoubleAttribute("value", &cost); if (costId && success == TIXML_SUCCESS) { cache->registerCost(*costId, cost); cache->addCellToCost(*costId, cell); } } // add area to cell for (const TiXmlElement* areaElement = cellElement->FirstChildElement("area"); areaElement; areaElement = areaElement->NextSiblingElement("area")) { const std::string* areaId = areaElement->Attribute(std::string("id")); if (areaId) { cache->addCellToArea(*areaId, cell); } } } } } } } } } // finalize CellCaches map->finalizeCellCaches(); // add Transistions for (const TiXmlElement* cacheElements = root->FirstChildElement("cellcaches"); cacheElements; cacheElements = cacheElements->NextSiblingElement("cellcaches")) { for (const TiXmlElement* cacheElement = cacheElements->FirstChildElement("cellcache"); cacheElement; cacheElement = cacheElement->NextSiblingElement("cellcache")) { const std::string* layerId = cacheElement->Attribute(std::string("id")); if (layerId) { Layer* layer = map->getLayer(*layerId); if (layer) { CellCache* cache = layer->getCellCache(); if (cache) { for (const TiXmlElement* cellElement = cacheElement->FirstChildElement("cell"); cellElement; cellElement = cellElement->NextSiblingElement("cell")) { int cellX = 0; int cellY = 0; int success = cellElement->QueryIntAttribute("x", &cellX); success &= cellElement->QueryIntAttribute("y", &cellY); if (success == TIXML_SUCCESS) { ModelCoordinate mc(cellX, cellY); Cell* cell = cache->getCell(mc); if (!cell) { continue; } for (const TiXmlElement* transitionElement = cellElement->FirstChildElement("transition"); transitionElement; transitionElement = transitionElement->NextSiblingElement("transition")) { int targetX = 0; int targetY = 0; int targetZ = 0; success = transitionElement->QueryIntAttribute("x", &targetX); success &= transitionElement->QueryIntAttribute("y", &targetY); transitionElement->QueryIntAttribute("z", &targetZ); if (success == TIXML_SUCCESS) { ModelCoordinate mc(targetX, targetY, targetZ); Layer* targetLayer = NULL; const std::string* targetLayerId = transitionElement->Attribute(std::string("id")); if (targetLayerId) { targetLayer = map->getLayer(*targetLayerId); } if (!targetLayer) { targetLayer = layer; } int immediate = 0; transitionElement->QueryIntAttribute("immediate", &immediate); cell->createTransition(targetLayer, mc, immediate != 0); } } } } } } } } } for (const TiXmlElement* triggerElements = root->FirstChildElement("triggers"); triggerElements; triggerElements = triggerElements->NextSiblingElement("triggers")) { TriggerController* triggerController = map->getTriggerController(); for (const TiXmlElement* triggerElement = triggerElements->FirstChildElement("trigger"); triggerElement; triggerElement = triggerElement->NextSiblingElement("trigger")) { const std::string* triggerName = triggerElement->Attribute(std::string("name")); int triggered = 0; int allInstances = 0; triggerElement->QueryIntAttribute("triggered", &triggered); triggerElement->QueryIntAttribute("all_instances", &allInstances); Trigger* trigger = triggerController->createTrigger(*triggerName); if (triggered > 0) { trigger->setTriggered(); } if (allInstances > 0) { trigger->enableForAllInstances(); } const std::string* instanceId = triggerElement->Attribute(std::string("attached_instance")); const std::string* layerId = triggerElement->Attribute(std::string("attached_layer")); if (instanceId && layerId) { Layer* layer = map->getLayer(*layerId); if (layer) { Instance* instance = layer->getInstance(*instanceId); if (instance) { trigger->attach(instance); } } } for (const TiXmlElement* assignElement = triggerElement->FirstChildElement("assign"); assignElement; assignElement = assignElement->NextSiblingElement("assign")) { layerId = assignElement->Attribute(std::string("layer_id")); if (!layerId) { continue; } int x = 0; int y = 0; assignElement->QueryIntAttribute("x", &x); assignElement->QueryIntAttribute("y", &y); Layer* layer = map->getLayer(*layerId); if (layer) { trigger->assign(layer, ModelCoordinate(x, y)); } } for (const TiXmlElement* enabledElement = triggerElement->FirstChildElement("enabled"); enabledElement; enabledElement = enabledElement->NextSiblingElement("enabled")) { layerId = enabledElement->Attribute(std::string("layer_id")); instanceId = enabledElement->Attribute(std::string("instance_id")); if (!instanceId || !layerId) { continue; } Layer* layer = map->getLayer(*layerId); if (layer) { Instance* instance = layer->getInstance(*instanceId); if (instance) { trigger->enableForInstance(instance); } } } for (const TiXmlElement* conditionElement = triggerElement->FirstChildElement("condition"); conditionElement; conditionElement = conditionElement->NextSiblingElement("condition")) { int conditionId = -1; conditionElement->QueryIntAttribute("id", &conditionId); if (conditionId != -1) { trigger->addTriggerCondition(static_cast(conditionId)); } } } } for (const TiXmlElement* cameraElement = root->FirstChildElement("camera"); cameraElement; cameraElement = cameraElement->NextSiblingElement("camera")) { const std::string* cameraId = cameraElement->Attribute(std::string("id")); int refCellWidth = 0; int refCellHeight = 0; int success = cameraElement->QueryIntAttribute("ref_cell_width", &refCellWidth); success &= cameraElement->QueryIntAttribute("ref_cell_height", &refCellHeight); if (cameraId && success == TIXML_SUCCESS) { double tilt = 0.0; double zoom = 1.0; double rotation = 0.0; double zToY = 0.0; cameraElement->QueryDoubleAttribute("tilt", &tilt); cameraElement->QueryDoubleAttribute("zoom", &zoom); cameraElement->QueryDoubleAttribute("rotation", &rotation); success = cameraElement->QueryDoubleAttribute("ztoy", &zToY); const std::string* viewport = cameraElement->Attribute(std::string("viewport")); Camera* cam = NULL; if (viewport) { // parse out the viewport parameters IntVector viewportParameters = tokenize(*viewport, ','); // make sure the right number of viewport parameters were parsed if (viewportParameters.size() == 4) { Rect rect(viewportParameters[0], viewportParameters[1], viewportParameters[2], viewportParameters[3]); try { cam = map->addCamera(*cameraId, rect); } catch (NameClash&) { // TODO - handle exception assert(false); } } } else { Rect rect(0, 0, m_renderBackend->getScreenWidth(), m_renderBackend->getScreenHeight()); try { cam = map->addCamera(*cameraId, rect); } catch (NameClash&) { // TODO - handle exception assert(false); } } if (cam) { cam->setCellImageDimensions(refCellWidth, refCellHeight); cam->setRotation(rotation); cam->setTilt(tilt); cam->setZoom(zoom); if (success == TIXML_SUCCESS) { cam->setZToY(zToY); } // active instance renderer for camera InstanceRenderer* instanceRenderer = InstanceRenderer::getInstance(cam); if (instanceRenderer) { instanceRenderer->activateAllLayers(map); } } } // increment % done counter m_percentDoneListener.incrementCount(); } } } } return map; } void MapLoader::setObjectLoader(const FIFE::ObjectLoaderPtr& objectLoader) { assert(objectLoader); m_objectLoader = objectLoader; } FIFE::ObjectLoaderPtr MapLoader::getObjectLoader() { return m_objectLoader; } void MapLoader::setAnimationLoader(const FIFE::AnimationLoaderPtr& animationLoader) { assert(animationLoader); m_objectLoader->setAnimationLoader(animationLoader); } FIFE::AnimationLoaderPtr MapLoader::getAnimationLoader() { if (m_objectLoader) { return m_objectLoader->getAnimationLoader(); } return FIFE::AnimationLoaderPtr(); } void MapLoader::setAtlasLoader(const FIFE::AtlasLoaderPtr& atlasLoader) { assert(atlasLoader); m_objectLoader->setAtlasLoader(atlasLoader); } FIFE::AtlasLoaderPtr MapLoader::getAtlasLoader() { if (m_objectLoader) { return m_objectLoader->getAtlasLoader(); } return FIFE::AtlasLoaderPtr(); } bool MapLoader::isLoadable(const std::string& filename) const { bfs::path mapPath(filename); TiXmlDocument mapFile; std::string mapFilename = mapPath.string(); try { RawData* data = m_vfs->open(mapFilename); if (data) { if (data->getDataLength() != 0) { mapFile.Parse(data->readString(data->getDataLength()).c_str()); if (mapFile.Error()) { return false; } const TiXmlElement* root = mapFile.RootElement(); if (root) { const std::string* loaderName = root->Attribute(std::string("loader")); // if the file does not specify a loader but was opened and parsed // correctly then we know we have a compatible extension so we will // attempt to load it, if it does specify a loader then the loader // name will be checked if (!loaderName || (loaderName && *loaderName == getLoaderName())) { return true; } } } // done with file delete the resource delete data; data = 0; } } catch (NotFound& e) { FL_ERR(_log, e.what()); return false; } return false; } void MapLoader::loadImportFile(const std::string& file, const std::string& directory) { if (!file.empty()) { bfs::path importFilePath(directory); importFilePath /= file; std::string importFileString = importFilePath.string(); if (m_objectLoader && m_objectLoader->getAtlasLoader() && m_objectLoader->getAtlasLoader()->isLoadable(importFileString)) { m_objectLoader->getAtlasLoader()->loadMultiple(importFileString); } if (m_objectLoader && m_objectLoader->getAnimationLoader() && m_objectLoader->getAnimationLoader()->isLoadable(importFileString)) { m_objectLoader->getAnimationLoader()->loadMultiple(importFileString); } if (m_objectLoader && m_objectLoader->isLoadable(importFileString)) { m_objectLoader->load(importFileString); } } } void MapLoader::loadImportDirectory(const std::string& directory) { if (!directory.empty()) { bfs::path importDirectory(directory); std::string importDirectoryString = importDirectory.string(); std::set files = m_vfs->listFiles(importDirectoryString); // load all xml files in the directory std::set::iterator iter; for (iter = files.begin(); iter != files.end(); ++iter) { // TODO - vtchill - may need a way to allow clients to load things other // than .xml and .zip files std::string ext = bfs::extension(*iter); if (ext == ".xml" || ext == ".zip") { loadImportFile(*iter, importDirectoryString); } } std::set nestedDirectories = m_vfs->listDirectories(importDirectoryString); for (iter = nestedDirectories.begin(); iter != nestedDirectories.end(); ++iter) { // do not attempt to load anything from a .svn directory if ((*iter).find(".svn") == std::string::npos) { loadImportDirectory(importDirectoryString + "/" + *iter); } } } } void MapLoader::addPercentDoneListener(PercentDoneListener* listener) { m_percentDoneListener.addListener(listener); } const std::string& MapLoader::getLoaderName() const { return m_loaderName; } MapLoader* createDefaultMapLoader(Model* model, VFS* vfs, ImageManager* imageManager, RenderBackend* renderBackend) { return (new MapLoader(model, vfs, imageManager, renderBackend)); } } fifengine-0.4.2/engine/core/loaders/native/map/maploader.h000066400000000000000000000110171341615052600234600ustar00rootroot00000000000000/************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_MAPLOADER_H_ #define FIFE_MAPLOADER_H_ // Standard C++ library includes #include #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "imaploader.h" #include "ianimationloader.h" #include "percentdonelistener.h" namespace FIFE { class Model; class Map; class VFS; class Layer; class ImageManager; class AnimationManager; class RenderBackend; class PercentDoneListener; class MapLoader : public IMapLoader { public: MapLoader(Model* model, VFS* vfs, ImageManager* imageManager, RenderBackend* renderBackend); ~MapLoader(); /** * @see IMapLoader::setObjectLoader */ void setObjectLoader(const FIFE::ObjectLoaderPtr& objectLoader); /** * @see IMapLoader::getObjectLoader */ FIFE::ObjectLoaderPtr getObjectLoader(); /** * @see IMapLoader::setAnimationLoader */ void setAnimationLoader(const FIFE::AnimationLoaderPtr& animationLoader); /** * @see IMapLoader::getAnimationLoader */ FIFE::AnimationLoaderPtr getAnimationLoader(); /** * @see IMapLoader::setAtlasLoader */ void setAtlasLoader(const FIFE::AtlasLoaderPtr& atlasLoader); /** * @see IMapLoader::getAtlasLoader */ FIFE::AtlasLoaderPtr getAtlasLoader(); /** * @see IMapLoader::isLoadable */ bool isLoadable(const std::string& filename) const; /** * @see IMapLoader::load */ Map* load(const std::string& filename); /** used to load an object file * if directory is provided then file is assumed relative to directory * if relativeToMap is true then the file/directory is assumed to be relative to * location of map file */ void loadImportFile(const std::string& file, const std::string& directory=""); /** used to load a directory of object files recursively * if relativeToMap is true then the directory is assumed to be relative to * location of map file */ void loadImportDirectory(const std::string& directory); /** * allows adding a listener to the map loader * for percent completed events */ void addPercentDoneListener(PercentDoneListener* listener); /** returns the loader name associated with this * map file loader, this will only be populated * after the load function is called */ const std::string& getLoaderName() const; private: Model* m_model; VFS* m_vfs; ImageManager* m_imageManager; AnimationManager* m_animationManager; ObjectLoaderPtr m_objectLoader; RenderBackend* m_renderBackend; PercentDoneCallback m_percentDoneListener; std::string m_loaderName; std::string m_mapDirectory; std::vector m_importDirectories; }; /** convenience function for creating the default fife map loader * deleting the object returned from this function is the * responsibility of the caller */ MapLoader* createDefaultMapLoader(Model* model, VFS* vfs, ImageManager* imageManager, RenderBackend* renderBackend); } #endif fifengine-0.4.2/engine/core/loaders/native/map/maploader.i000066400000000000000000000031311341615052600234570ustar00rootroot00000000000000/************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fife %{ #include "loaders/native/map/maploader.h" %} %include "loaders/native/map/maploader.h" fifengine-0.4.2/engine/core/loaders/native/map/objectloader.cpp000066400000000000000000000577511341615052600245230ustar00rootroot00000000000000/************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // 3rd party library includes #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "audio/actionaudio.h" #include "util/log/logger.h" #include "model/model.h" #include "model/metamodel/object.h" #include "model/metamodel/action.h" #include "vfs/fife_boost_filesystem.h" #include "vfs/vfs.h" #include "vfs/raw/rawdata.h" #include "view/visual.h" #include "video/imagemanager.h" #include "video/animationmanager.h" #include "atlasloader.h" #include "objectloader.h" #include "animationloader.h" namespace FIFE { /** Logger to use for this source file. * @relates Logger */ static Logger _log(LM_NATIVE_LOADERS); ObjectLoader::ObjectLoader(Model* model, VFS* vfs, ImageManager* imageManager, AnimationManager* animationManager, const AnimationLoaderPtr& animationLoader, const AtlasLoaderPtr& atlasLoader) : m_model(model), m_vfs(vfs), m_imageManager(imageManager), m_animationManager(animationManager) { assert(m_model && m_vfs && m_imageManager && m_animationManager); if (animationLoader) { m_animationLoader = animationLoader; } else { m_animationLoader.reset(new AnimationLoader(m_vfs, m_imageManager, m_animationManager)); } if (atlasLoader) { m_atlasLoader = atlasLoader; } else { m_atlasLoader.reset(new AtlasLoader(m_model, m_vfs, m_imageManager, m_animationManager)); } } ObjectLoader::~ObjectLoader() { } void ObjectLoader::setAnimationLoader(const AnimationLoaderPtr& animationLoader) { assert(animationLoader); m_animationLoader = animationLoader; } AnimationLoaderPtr ObjectLoader::getAnimationLoader() { return m_animationLoader; } void ObjectLoader::setAtlasLoader(const AtlasLoaderPtr& atlasLoader) { assert(atlasLoader); m_atlasLoader = atlasLoader; } AtlasLoaderPtr ObjectLoader::getAtlasLoader() { return m_atlasLoader; } bool ObjectLoader::isLoadable(const std::string& filename) const { bfs::path objectPath(filename); TiXmlDocument objectFile; try { RawData* data = m_vfs->open(objectPath.string()); if (data) { if (data->getDataLength() != 0) { objectFile.Parse(data->readString(data->getDataLength()).c_str()); if (objectFile.Error()) { std::ostringstream oss; oss << " Failed to load" << objectPath.string() << " : " << __FILE__ << " [" << __LINE__ << "]" << std::endl; FL_ERR(_log, oss.str()); return false; } } else { std::ostringstream oss; oss << " Failed to load" << objectPath.string() << " : " << __FILE__ << " [" << __LINE__ << "]" << std::endl; FL_ERR(_log, oss.str()); return false; } // done with data delete resource delete data; data = 0; } else { std::ostringstream oss; oss << " Failed to load" << objectPath.string() << " : " << __FILE__ << " [" << __LINE__ << "]" << std::endl; FL_ERR(_log, oss.str()); return false; } } catch (NotFound&) { std::ostringstream oss; oss << " Failed to load" << objectPath.string() << " : " << __FILE__ << " [" << __LINE__ << "]" << std::endl; FL_ERR(_log, oss.str()); // TODO - should we abort here // or rethrow the exception // or just keep going return false; } // if we get here then loading the file went well TiXmlElement* root = objectFile.RootElement(); if (root && root->ValueStr() == "assets") { if (root->FirstChildElement("object")) { return true; } } return false; } void ObjectLoader::load(const std::string& filename) { bfs::path objectPath(filename); TiXmlDocument objectFile; try { RawData* data = m_vfs->open(objectPath.string()); if (data) { if (data->getDataLength() != 0) { objectFile.Parse(data->readString(data->getDataLength()).c_str()); if (objectFile.Error()) { return; } } // done with data delete resource delete data; data = 0; } } catch (NotFound&) { std::ostringstream oss; oss << " Failed to load" << objectPath.string() << " : " << __FILE__ << " [" << __LINE__ << "]" << std::endl; FL_ERR(_log, oss.str()); // TODO - should we abort here // or rethrow the exception // or just keep going return; } std::string objectDirectory = ""; if (HasParentPath(objectPath)) { objectDirectory = GetParentPath(objectPath).string(); } // if we get here then loading the file went well TiXmlElement* root = objectFile.RootElement(); if (root) { for (const TiXmlElement *importElement = root->FirstChildElement("import"); importElement; importElement = importElement->NextSiblingElement("import")) { const std::string* importDir = importElement->Attribute(std::string("dir")); const std::string* importFile = importElement->Attribute(std::string("file")); std::string directory = ""; if (importDir) { directory = *importDir; } std::string file = ""; if (importFile) { file = *importFile; } if (importDir && !importFile) { bfs::path fullPath(objectDirectory); fullPath /= directory; loadImportDirectory(fullPath.string()); } else if (importFile) { bfs::path fullFilePath(file); bfs::path fullDirPath(directory); if (importDir) { fullDirPath = bfs::path(objectDirectory); fullDirPath /= directory; } else { fullFilePath = bfs::path(objectDirectory); fullFilePath /= file; } loadImportFile(fullFilePath.string(), fullDirPath.string()); } } } if (root && root->ValueStr() == "assets") { for (TiXmlElement* objectElem = root->FirstChildElement("object"); objectElem; objectElem = objectElem->NextSiblingElement("object")) { const std::string* objectId = objectElem->Attribute(std::string("id")); const std::string* namespaceId = objectElem->Attribute(std::string("namespace")); Object* obj = NULL; if (objectId && namespaceId) { const std::string* parentId = objectElem->Attribute(std::string("parent")); if (parentId) { Object* parent = m_model->getObject(*parentId, *namespaceId); if (parent) { try { obj = m_model->createObject(*objectId, *namespaceId, parent); } catch (NameClash&) { // TODO - handle exception assert(false); } } } else { // this will make sure the object has not already been loaded if (m_model->getObject(*objectId, *namespaceId) == NULL) { try { obj = m_model->createObject(*objectId, *namespaceId); } catch (NameClash &e) { FL_ERR(_log, e.what()); // TODO - handle exception assert(false); } } } } if (obj) { obj->setFilename(objectPath.string()); ObjectVisual::create(obj); int isBlocking = 0; objectElem->QueryIntAttribute("blocking", &isBlocking); obj->setBlocking(isBlocking!=0); int isStatic = 0; objectElem->QueryIntAttribute("static", &isStatic); obj->setStatic(isStatic!=0); const std::string* pather = objectElem->Attribute(std::string("pather")); if (pather) { obj->setPather(m_model->getPather(*pather)); } else { obj->setPather(m_model->getPather("RoutePather")); } const std::string* costId = objectElem->Attribute(std::string("cost_id")); if (costId) { obj->setCostId(*costId); double cost = 1.0; int success = objectElem->QueryDoubleAttribute("cost", &cost); if (success == TIXML_SUCCESS) { obj->setCost(cost); } } const std::string* areaId = objectElem->Attribute(std::string("area_id")); if (areaId) { obj->setArea(*areaId); } double speed = 1.0; int success = root->QueryDoubleAttribute("speed", &speed); if (success == TIXML_SUCCESS) { obj->setSpeed(speed); } // loop over all walkable areas for (TiXmlElement* walkableElement = objectElem->FirstChildElement("walkable_area"); walkableElement; walkableElement = walkableElement->NextSiblingElement("walkable_area")) { const std::string* walkableId = walkableElement->Attribute(std::string("id")); if (walkableId) { obj->addWalkableArea(*walkableId); } } int cellStack = 0; objectElem->QueryIntAttribute("cellstack", &cellStack); obj->setCellStackPosition(cellStack); double ax = 0; double ay = 0; double az = 0; int xRetVal = objectElem->QueryValueAttribute("anchor_x", &ax); int yRetVal = objectElem->QueryValueAttribute("anchor_y", &ay); if (xRetVal == TIXML_SUCCESS && yRetVal == TIXML_SUCCESS) { obj->setRotationAnchor(ExactModelCoordinate(ax, ay, az)); } int isRestrictedRotation = 0; objectElem->QueryIntAttribute("restricted_rotation", &isRestrictedRotation); obj->setRestrictedRotation(isRestrictedRotation!=0); int zStep = 0; int zRetVal = objectElem->QueryIntAttribute("z_step_limit", &zStep); if (zRetVal == TIXML_SUCCESS) { obj->setZStepRange(zStep); } // loop over all multi parts for (TiXmlElement* multiElement = objectElem->FirstChildElement("multipart"); multiElement; multiElement = multiElement->NextSiblingElement("multipart")) { const std::string* partId = multiElement->Attribute(std::string("id")); if (partId) { obj->addMultiPartId(*partId); } for (TiXmlElement* multiRotation = multiElement->FirstChildElement("rotation"); multiRotation; multiRotation = multiRotation->NextSiblingElement("rotation")) { int rotation = 0; multiRotation->QueryIntAttribute("rot", &rotation); // relative coordinates which are used to position the object for (TiXmlElement* multiCoordinate = multiRotation->FirstChildElement("occupied_coord"); multiCoordinate; multiCoordinate = multiCoordinate->NextSiblingElement("occupied_coord")) { int x = 0; int y = 0; xRetVal = multiCoordinate->QueryValueAttribute("x", &x); yRetVal = multiCoordinate->QueryValueAttribute("y", &y); if (xRetVal == TIXML_SUCCESS && yRetVal == TIXML_SUCCESS) { int z = 0; multiCoordinate->QueryIntAttribute("z", &z); obj->addMultiPartCoordinate(rotation, ModelCoordinate(x, y, z)); } } } } // loop over all image tags for (TiXmlElement* imageElement = objectElem->FirstChildElement("image"); imageElement; imageElement = imageElement->NextSiblingElement("image")) { const std::string* sourceId = imageElement->Attribute(std::string("source")); if (sourceId) { bfs::path imagePath(filename); if (HasParentPath(imagePath)) { imagePath = GetParentPath(imagePath) / *sourceId; } else { imagePath = bfs::path(*sourceId); } if (!bfs::exists(imagePath)) { imagePath= bfs::path(*sourceId); } ImagePtr imagePtr; if(!m_imageManager->exists(imagePath.string())) { imagePtr = m_imageManager->create(imagePath.string()); } else { imagePtr = m_imageManager->getPtr(imagePath.string()); } if (imagePtr) { int xOffset = 0; int success = imageElement->QueryIntAttribute("x_offset", &xOffset); if (success == TIXML_SUCCESS) { imagePtr->setXShift(xOffset); } int yOffset = 0; success = imageElement->QueryIntAttribute("y_offset", &yOffset); if (success == TIXML_SUCCESS) { imagePtr->setYShift(yOffset); } int direction = 0; success = imageElement->QueryIntAttribute("direction", &direction); if (success == TIXML_SUCCESS) { ObjectVisual* objVisual = obj->getVisual(); if (objVisual) { objVisual->addStaticImage(direction, static_cast(imagePtr->getHandle())); } } } } } for (TiXmlElement* actionElement = objectElem->FirstChildElement("action"); actionElement; actionElement = actionElement->NextSiblingElement("action")) { const std::string* actionId = actionElement->Attribute(std::string("id")); if (actionId) { int isDefault = 0; actionElement->QueryIntAttribute("default", &isDefault); Action* action = obj->createAction(*actionId, (isDefault != 0)); // Fetch ActionAudio data TiXmlElement* soundElement = actionElement->FirstChildElement("sound"); if (soundElement) { const std::string* clip = soundElement->Attribute(std::string("source")); if (clip) { ActionAudio* audio = new ActionAudio(); action->adoptAudio(audio); audio->setSoundFileName(*clip); const std::string* group = soundElement->Attribute(std::string("group")); if (group) { audio->setGroupName(*group); } float value = 0; int success = soundElement->QueryValueAttribute("volume", &value); if (success == TIXML_SUCCESS) audio->setGain(value); success = soundElement->QueryValueAttribute("max_volume", &value); if (success == TIXML_SUCCESS) audio->setMaxGain(value); success = soundElement->QueryValueAttribute("min_volume", &value); if (success == TIXML_SUCCESS) audio->setMinGain(value); success = soundElement->QueryValueAttribute("ref_distance", &value); if (success == TIXML_SUCCESS) audio->setReferenceDistance(value); success = soundElement->QueryValueAttribute("max_distance", &value); if (success == TIXML_SUCCESS) audio->setMaxDistance(value); success = soundElement->QueryValueAttribute("rolloff", &value); if (success == TIXML_SUCCESS) audio->setRolloff(value); success = soundElement->QueryValueAttribute("pitch", &value); if (success == TIXML_SUCCESS) audio->setPitch(value); success = soundElement->QueryValueAttribute("cone_inner_angle", &value); if (success == TIXML_SUCCESS) audio->setConeInnerAngle(value); success = soundElement->QueryValueAttribute("cone_outer_angle", &value); if (success == TIXML_SUCCESS) audio->setConeOuterAngle(value); success = soundElement->QueryValueAttribute("cone_outer_gain", &value); if (success == TIXML_SUCCESS) audio->setConeOuterGain(value); int boolValue = 0; success = soundElement->QueryIntAttribute("looping", &boolValue); if (success == TIXML_SUCCESS) audio->setLooping(boolValue != 0); success = soundElement->QueryIntAttribute("relative_position", &boolValue); if (success == TIXML_SUCCESS) audio->setRelativePositioning(boolValue != 0); success = soundElement->QueryIntAttribute("direction", &boolValue); if (success == TIXML_SUCCESS) audio->setDirection(boolValue != 0); double vx = 0; double vy = 0; double vz = 0; if (soundElement->QueryValueAttribute("x_velocity", &vx) == TIXML_SUCCESS && soundElement->QueryValueAttribute("y_velocity", &vy) == TIXML_SUCCESS) { soundElement->QueryValueAttribute("z_velocity", &vz); audio->setVelocity(AudioSpaceCoordinate(vx, vy, vz)); } } } // Create and fetch ActionVisual ActionVisual::create(action); for (TiXmlElement* animElement = actionElement->FirstChildElement("animation"); animElement; animElement = animElement->NextSiblingElement("animation")) { // Fetch already created animation const std::string* animationId = animElement->Attribute(std::string("animation_id")); if (animationId) { AnimationPtr animation = m_animationManager->getPtr(*animationId); if (animation) { ActionVisual* actionVisual = action->getVisual(); if (actionVisual) { actionVisual->addAnimation(animation->getDirection(), animation); action->setDuration(animation->getDuration()); continue; } } } // Create animated spritesheet const std::string* sourceId = animElement->Attribute(std::string("atlas")); if (sourceId) { bfs::path atlasPath(filename); if (HasParentPath(atlasPath)) { atlasPath = GetParentPath(atlasPath) / *sourceId; } else { atlasPath = bfs::path(*sourceId); } ImagePtr atlasImgPtr; // we need to load this since its shared image if (!m_imageManager->exists(atlasPath.string())) { atlasImgPtr = m_imageManager->create(atlasPath.string()); } else { atlasImgPtr = m_imageManager->getPtr(atlasPath.string()); } int animFrames = 0; int animDelay = 0; int animXoffset = 0; int animYoffset = 0; int frameWidth = 0; int frameHeight = 0; animElement->QueryValueAttribute("width", &frameWidth); animElement->QueryValueAttribute("height", &frameHeight); animElement->QueryValueAttribute("frames", &animFrames); animElement->QueryValueAttribute("delay", &animDelay); animElement->QueryValueAttribute("x_offset", &animXoffset); animElement->QueryValueAttribute("y_offset", &animYoffset); int nDir = 0; for (TiXmlElement* dirElement = animElement->FirstChildElement("direction"); dirElement; dirElement = dirElement->NextSiblingElement("direction")) { int dir; dirElement->QueryIntAttribute("dir", &dir); static char tmp[64]; snprintf(tmp, 64, "%03d", dir); std::string aniId = *objectId + ":" + *actionId + ":" + std::string(tmp); AnimationPtr animation = m_animationManager->create(aniId); int frames; int success = dirElement->QueryValueAttribute("frames", &frames); if(success != TIXML_SUCCESS) { frames = animFrames; } int delay; success = dirElement->QueryValueAttribute("delay", &delay); if(success != TIXML_SUCCESS) { delay = animDelay; } int xoffset; success = dirElement->QueryValueAttribute("x_offset", &xoffset); if(success != TIXML_SUCCESS) { xoffset = animXoffset; } int yoffset; success = dirElement->QueryValueAttribute("y_offset", &yoffset); if(success != TIXML_SUCCESS) { yoffset = animYoffset; } int action_frame; success = dirElement->QueryValueAttribute("action_frame", &action_frame); if(success == TIXML_SUCCESS) { animation->setActionFrame(action_frame); } for (int iframe = 0; iframe < frames; ++iframe) { static char tmpBuf[64]; snprintf(tmpBuf, 64, "%03d:%04d", dir, iframe); std::string frameId = *objectId + ":" + *actionId + ":" + std::string(tmpBuf); Rect region(frameWidth * iframe, frameHeight * nDir, frameWidth, frameHeight); ImagePtr framePtr; if (!m_imageManager->exists(frameId)) { framePtr = m_imageManager->create(frameId); framePtr->useSharedImage(atlasImgPtr, region); framePtr->setXShift(xoffset); framePtr->setYShift(yoffset); } else { framePtr = m_imageManager->getPtr(frameId); } animation->addFrame(framePtr, delay); } ActionVisual* actionVisual = action->getVisual(); if(actionVisual) { actionVisual->addAnimation(dir, animation); action->setDuration(animation->getDuration()); } ++nDir; } continue; } // Load animation.xml with frames sourceId = animElement->Attribute(std::string("source")); if (sourceId) { int direction = 0; int success = animElement->QueryValueAttribute("direction", &direction); bfs::path animPath(filename); if (HasParentPath(animPath)) { animPath = GetParentPath(animPath) / *sourceId; } else { animPath = bfs::path(*sourceId); } AnimationPtr animation; if (m_animationLoader && m_animationLoader->isLoadable(animPath.string())) { animation = m_animationLoader->load(animPath.string()); } if (action && animation) { if (success != TIXML_SUCCESS) { direction = animation->getDirection(); } ActionVisual* actionVisual = action->getVisual(); if (actionVisual) { actionVisual->addAnimation(direction, animation); action->setDuration(animation->getDuration()); } } } } } } } } } } void ObjectLoader::loadImportFile(const std::string& file, const std::string& directory) { if (!file.empty()) { bfs::path importFilePath(directory); importFilePath /= file; std::string importFileString = importFilePath.string(); if (m_atlasLoader && m_atlasLoader->isLoadable(importFileString)) { m_atlasLoader->loadMultiple(importFileString); } if (m_animationLoader && m_animationLoader->isLoadable(importFileString)) { m_animationLoader->loadMultiple(importFileString); } if (isLoadable(importFileString)) { load(importFileString); } } } void ObjectLoader::loadImportDirectory(const std::string& directory) { if (!directory.empty()) { bfs::path importDirectory(directory); std::string importDirectoryString = importDirectory.string(); std::set files = m_vfs->listFiles(importDirectoryString); // load all xml files in the directory std::set::iterator iter; for (iter = files.begin(); iter != files.end(); ++iter) { // TODO - vtchill - may need a way to allow clients to load things other // than .xml and .zip files std::string ext = bfs::extension(*iter); if (ext == ".xml" || ext == ".zip") { loadImportFile(*iter, importDirectoryString); } } std::set nestedDirectories = m_vfs->listDirectories(importDirectoryString); for (iter = nestedDirectories.begin(); iter != nestedDirectories.end(); ++iter) { // do not attempt to load anything from a .svn directory if ((*iter).find(".svn") == std::string::npos) { loadImportDirectory(importDirectoryString + "/" + *iter); } } } } } fifengine-0.4.2/engine/core/loaders/native/map/objectloader.h000066400000000000000000000070051341615052600241530ustar00rootroot00000000000000/************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_OBJECT_LOADER_H_ #define FIFE_OBJECT_LOADER_H_ // Standard C++ library includes #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/sharedptr.h" #include "iobjectloader.h" #include "ianimationloader.h" #include "iatlasloader.h" namespace FIFE { class Model; class VFS; class ImageManager; class AnimationManager; class ObjectLoader : public IObjectLoader { public: ObjectLoader(Model* model, VFS* vfs, ImageManager* imageManager, AnimationManager* animationManager, const AnimationLoaderPtr& animationLoader=AnimationLoaderPtr(), const AtlasLoaderPtr& atlasLoader=AtlasLoaderPtr()); ~ObjectLoader(); /** * @see IObjectLoader::setAnimationLoader */ virtual void setAnimationLoader(const AnimationLoaderPtr& animationLoader); /** * @see IObjectLoader::getAnimationLoader */ virtual AnimationLoaderPtr getAnimationLoader(); /** * @see IObjectLoader::setAtlasLoader */ virtual void setAtlasLoader(const AtlasLoaderPtr& atlasLoader); /** * @see IObjectLoader::getAtlasLoader */ virtual AtlasLoaderPtr getAtlasLoader(); /** * @see IObjectLoader::isLoadable */ virtual bool isLoadable(const std::string& filename) const; /** * @see IObjectLoader::load */ virtual void load(const std::string& filename); /** used to load an object, atlas or animation file * if directory is provided then file is assumed relative to directory */ void loadImportFile(const std::string& file, const std::string& directory=""); /** used to load a directory of object, atlas or animation files recursively */ void loadImportDirectory(const std::string& directory); private: Model* m_model; VFS* m_vfs; ImageManager* m_imageManager; AnimationManager* m_animationManager; AnimationLoaderPtr m_animationLoader; AtlasLoaderPtr m_atlasLoader; }; } #endiffifengine-0.4.2/engine/core/loaders/native/map/percentdonelistener.cpp000066400000000000000000000077421341615052600261350ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "percentdonelistener.h" namespace FIFE { const uint32_t minPercent = 0; const uint32_t maxPercent = 100; PercentDoneListener::~PercentDoneListener() { } PercentDoneCallback::PercentDoneCallback() : m_totalElements(0), m_percent(1), m_numberOfEvents(0), m_count(0) { } PercentDoneCallback::~PercentDoneCallback() { } void PercentDoneCallback::setTotalNumberOfElements(unsigned int totalElements) { m_totalElements = totalElements; } void PercentDoneCallback::setPercentDoneInterval(unsigned int percent) { m_percent = percent; } void PercentDoneCallback::incrementCount() { if (m_count == minPercent) { // go ahead and fire event just to tell clients we are starting fireEvent(minPercent); } // increment count ++m_count; // only go through the effort of figuring out percent done if we have listeners // and we have a total number of elements greater than 0 if (!m_listeners.empty() && m_totalElements > 0) { if (m_count >= m_totalElements) { fireEvent(maxPercent); } else { // calculate percent done uint32_t percentDone = static_cast((static_cast(m_count)/m_totalElements) * maxPercent); if ((percentDone % m_percent) == 0 && (percentDone != m_percent * m_numberOfEvents)) { // keep track of how many times event has occurred ++m_numberOfEvents; // alert listeners of event fireEvent(m_percent * m_numberOfEvents); } } } } void PercentDoneCallback::reset() { m_totalElements = 0; m_count = 0; m_numberOfEvents = 0; // send event to alert of the reset fireEvent(minPercent); } void PercentDoneCallback::addListener(PercentDoneListener* listener) { if (listener) { m_listeners.push_back(listener); } } void PercentDoneCallback::removeListener(PercentDoneListener* listener) { ListenerContainer::iterator iter = m_listeners.begin(); for ( ; iter != m_listeners.end(); ++iter) { if (*iter == listener) { m_listeners.erase(iter); break; } } } void PercentDoneCallback::fireEvent(uint32_t percent) { ListenerContainer::iterator iter = m_listeners.begin(); for ( ; iter != m_listeners.end(); ++iter) { (*iter)->OnEvent(percent); } } } fifengine-0.4.2/engine/core/loaders/native/map/percentdonelistener.h000066400000000000000000000052341341615052600255740ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_PERCENT_DONE_LISTENER_H #define FIFE_PERCENT_DONE_LISTENER_H // Standard C++ library includes #include // 3rd party library includes #include "util/base/fife_stdint.h" // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder namespace FIFE { class PercentDoneListener { public: virtual ~PercentDoneListener(); virtual void OnEvent(unsigned int percentDone) = 0; }; class PercentDoneCallback { public: PercentDoneCallback(); virtual ~PercentDoneCallback(); void setTotalNumberOfElements(unsigned int totalElements); void setPercentDoneInterval(unsigned int percent); void incrementCount(); void reset(); void addListener(PercentDoneListener* listener); void removeListener(PercentDoneListener* listener); private: void fireEvent(uint32_t percent); private: uint32_t m_totalElements; uint32_t m_percent; uint32_t m_numberOfEvents; uint32_t m_count; typedef std::vector ListenerContainer; ListenerContainer m_listeners; }; } #endif fifengine-0.4.2/engine/core/loaders/native/map/percentdonelistener.i000066400000000000000000000033701341615052600255740ustar00rootroot00000000000000/************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fife %{ #include "loaders/native/map/percentdonelistener.h" %} namespace FIFE { %feature("director") PercentDoneListener; class PercentDoneListener { public: virtual ~PercentDoneListener(); virtual void OnEvent(unsigned int percentDone) = 0; }; }fifengine-0.4.2/engine/core/loaders/native/video/000077500000000000000000000000001341615052600216745ustar00rootroot00000000000000fifengine-0.4.2/engine/core/loaders/native/video/imageloader.cpp000066400000000000000000000100271341615052600246510ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes #include // 3rd party library includes #include #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "controller/engine.h" #include "util/base/exception.h" #include "util/resource/resource.h" #include "vfs/raw/rawdata.h" #include "vfs/vfs.h" #include "video/renderbackend.h" #include "video/image.h" #include "imageloader.h" namespace FIFE { void ImageLoader::load(IResource* res) { VFS* vfs = VFS::instance(); Image* img = dynamic_cast(res); //Have to save the images x and y shift or it gets lost when it's //loaded again. int32_t xShiftSave = img->getXShift(); int32_t yShiftSave = img->getYShift(); if(!img->isSharedImage()) { const std::string& filename = img->getName(); std::unique_ptr data(vfs->open(filename)); size_t datalen = data->getDataLength(); std::unique_ptr darray(new uint8_t[datalen]); data->readInto(darray.get(), datalen); SDL_RWops* rwops = SDL_RWFromConstMem(darray.get(), static_cast(datalen)); SDL_Surface* surface = IMG_Load_RW(rwops, false); if (!surface) { throw SDLException(std::string("Fatal Error when loading image into a SDL_Surface: ") + SDL_GetError()); } RenderBackend* rb = RenderBackend::instance(); // in case of SDL we don't need to convert the surface if (rb->getName() == "SDL") { img->setSurface(surface); // in case of OpenGL we need a 32bit surface } else { SDL_PixelFormat dst_format = rb->getPixelFormat(); SDL_PixelFormat src_format = *surface->format; uint8_t dstbits = dst_format.BitsPerPixel; uint8_t srcbits = src_format.BitsPerPixel; if (srcbits != 32 || dst_format.Rmask != src_format.Rmask || dst_format.Gmask != src_format.Gmask || dst_format.Bmask != src_format.Bmask || dst_format.Amask != src_format.Amask) { dst_format.BitsPerPixel = 32; SDL_Surface* conv = SDL_ConvertSurface(surface, &dst_format, 0); dst_format.BitsPerPixel = dstbits; if (!conv) { throw SDLException(std::string("Fatal Error when converting surface to the screen format: ") + SDL_GetError()); } img->setSurface(conv); SDL_FreeSurface(surface); } else { img->setSurface(surface); } } SDL_FreeRW(rwops); } //restore saved x and y shifts img->setXShift(xShiftSave); img->setYShift(yShiftSave); } } //FIFE fifengine-0.4.2/engine/core/loaders/native/video/imageloader.h000066400000000000000000000041421341615052600243170ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_VIDEO_LOADERS_IMAGE_PROVIDER_H #define FIFE_VIDEO_LOADERS_IMAGE_PROVIDER_H // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/resource/resource.h" namespace FIFE { /** ImageLoader for some basic formats like jpeg, png etc. */ class ImageLoader : public IResourceLoader { public: ImageLoader() {} virtual void load(IResource* res); }; } #endif fifengine-0.4.2/engine/core/loaders/native/video/resourceanimationloader.cpp000066400000000000000000000043701341615052600273220ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2013 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/exception.h" #include "video/animation.h" #include "resourceanimationloader.h" namespace FIFE { void ResourceAnimationLoader::load(IResource* res) { Animation* anim = dynamic_cast(res); if (anim) { std::vector frames = anim->getFrames(); for (std::vector::iterator it = frames.begin(); it != frames.end(); ++it) { if ((*it)->getState() != IResource::RES_LOADED) { (*it)->load(); } } } } } //FIFE fifengine-0.4.2/engine/core/loaders/native/video/resourceanimationloader.h000066400000000000000000000041441341615052600267660ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2013 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_VIDEO_LOADERS_ANIMATION_PROVIDER_H #define FIFE_VIDEO_LOADERS_ANIMATION_PROVIDER_H // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/resource/resource.h" namespace FIFE { /** ResourceAnimationLoader. */ class ResourceAnimationLoader : public IResourceLoader { public: ResourceAnimationLoader() {} virtual void load(IResource* res); }; } #endif fifengine-0.4.2/engine/core/model/000077500000000000000000000000001341615052600167475ustar00rootroot00000000000000fifengine-0.4.2/engine/core/model/metamodel/000077500000000000000000000000001341615052600207165ustar00rootroot00000000000000fifengine-0.4.2/engine/core/model/metamodel/action.cpp000066400000000000000000000041161341615052600227010ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "audio/actionaudio.h" #include "util/base/exception.h" #include "action.h" namespace FIFE { Action::Action(const std::string& identifier) : m_id(identifier), m_duration(0), m_visual(NULL), m_audio(NULL) { } Action::~Action() { delete m_visual; delete m_audio; } } fifengine-0.4.2/engine/core/model/metamodel/action.h000066400000000000000000000063371341615052600223550ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_MODEL_METAMODEL_ACTION_H #define FIFE_MODEL_METAMODEL_ACTION_H // Standard C++ library includes #include #include #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/math/angles.h" #include "util/base/fifeclass.h" #include "ivisual.h" namespace FIFE { class ActionAudio; class Action : public FifeClass { public: /** Constructor * Actions are created by calling addAction from object, thus * this method should really be called only by object or test code */ Action(const std::string& identifier); /** Destructor */ virtual ~Action(); /** Get the identifier for this action. */ const std::string& getId() { return m_id; } /** Sets the duration for this action */ void setDuration(uint32_t duration) { m_duration = duration; } /** Gets the duration of this action */ uint32_t getDuration() { return m_duration; } /** Sets visualization to be used. Transfers ownership. */ void adoptVisual(IVisual* visual) { m_visual = visual; } /** Gets used visualization */ template T* getVisual() const { return reinterpret_cast(m_visual); } /** Sets audio to be used. Transfers ownership. */ void adoptAudio(ActionAudio* audio) { m_audio = audio; } /** Gets used audio */ ActionAudio* getAudio() const { return m_audio; } private: std::string m_id; // duration of the action uint32_t m_duration; // visualization for action IVisual* m_visual; // audio for action ActionAudio* m_audio; }; } #endif fifengine-0.4.2/engine/core/model/metamodel/action.i000066400000000000000000000036671341615052600223610ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fife %{ #include "model/metamodel/action.h" %} %include "util/base/utilbase.i" %include "model/metamodel/ivisual.i" namespace FIFE { class Action : public FifeClass { public: Action(const std::string& identifier); virtual ~Action(); const std::string& getId(); void adoptVisual(IVisual* visual); template T* getVisual() const; void setDuration(uint32_t duration); uint32_t getDuration(); }; } fifengine-0.4.2/engine/core/model/metamodel/grids/000077500000000000000000000000001341615052600220265ustar00rootroot00000000000000fifengine-0.4.2/engine/core/model/metamodel/grids/cellgrid.cpp000066400000000000000000000072341341615052600243250ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/log/logger.h" #include "cellgrid.h" namespace FIFE { static Logger _log(LM_CELLGRID); CellGrid::CellGrid(): FifeClass(), m_matrix(), m_inverse_matrix(), m_xshift(0), m_yshift(0), m_zshift(0), m_xscale(1), m_yscale(1), m_zscale(1), m_rotation(0), m_allow_diagonals(false) { updateMatrices(); } CellGrid::~CellGrid() { } void CellGrid::getAccessibleCoordinates(const ModelCoordinate& curpos, std::vector& coordinates) { coordinates.clear(); for (int32_t x = curpos.x - 1; x <= curpos.x + 1; x++) { for (int32_t y = curpos.y - 1; y <= curpos.y + 1; y++) { ModelCoordinate pt(x, y); if (isAccessible(curpos, pt)) { coordinates.push_back(pt); } } } } void CellGrid::updateMatrices() { m_matrix.loadRotate(m_rotation, 0.0, 0.0, 1.0); m_matrix.applyScale(m_xscale, m_yscale, m_zscale); m_matrix.applyTranslate(m_xshift, m_yshift, m_zshift); m_inverse_matrix = m_matrix.inverse(); } ExactModelCoordinate CellGrid::toMapCoordinates(const ModelCoordinate& layer_coords) { return toMapCoordinates(intPt2doublePt(layer_coords)); } int32_t CellGrid::orientation(const ExactModelCoordinate& pt, const ExactModelCoordinate& pt1, const ExactModelCoordinate& pt2) { double o = (pt2.x - pt1.x) * (pt.y - pt1.y) - (pt.x - pt1.x) * (pt2.y - pt1.y); if (o > 0.0) { return 1; } else if (o < 0.0) { return -1; } return 0; } bool CellGrid::ptInTriangle(const ExactModelCoordinate& pt, const ExactModelCoordinate& pt1, const ExactModelCoordinate& pt2, const ExactModelCoordinate& pt3) { double o1 = orientation(pt1, pt2, pt); double o2 = orientation(pt2, pt3, pt); double o3 = orientation(pt3, pt1, pt); bool result = (o1 == o2) && (o2 == o3); FL_DBG(_log, LMsg("ptInTriangle, pt=") << pt << " pt1=" << pt1 << " pt2=" << pt2 << " pt3=" << pt3 << " in=" << result); return result; } } fifengine-0.4.2/engine/core/model/metamodel/grids/cellgrid.h000066400000000000000000000221271341615052600237700ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_MODEL_GRIDS_CELLGRID_H #define FIFE_MODEL_GRIDS_CELLGRID_H // Standard C++ library includes #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "model/metamodel/modelcoords.h" #include "util/math/matrix.h" #include "util/base/fifeclass.h" #include "util/base/fife_stdint.h" namespace FIFE { class CellGrid: public FifeClass { public: /** Constructor */ CellGrid(); /** Destructor */ virtual ~CellGrid(); /** Gets the coordinates that are accesible from given point * only cells adjacent to given cell are considered in the evaluation * @param curpos position (coordinates) to evaluate * @param coordinates accessible coordinates */ void getAccessibleCoordinates(const ModelCoordinate& curpos, std::vector& coordinates); /** Type of cellgrid */ virtual const std::string& getType() const = 0; /** Name of the cellgrid (DEPRECATED? -jwt) */ virtual const std::string& getName() const = 0; /** Tells if given target point is accessible from curpos * only cells adjacent to curpos are considered in the evaluation * @param curpos position (coordinates) to evaluate * @param target target coordinate to check * @return true, if target is accessible from curpos, false otherwise */ virtual bool isAccessible(const ModelCoordinate& curpos, const ModelCoordinate& target) = 0; /** Returns *distance* const from curpos to target point * only cells adjacent to curpos are considered in the evaluation * @param curpos position (coordinates) to evaluate * @param target target coordinate to check * @return distance cost from curpos to target */ virtual double getAdjacentCost(const ModelCoordinate& curpos, const ModelCoordinate& target) = 0; /** Returns *distance* const from curpos to target point * @param curpos position (coordinates) to evaluate * @param target target coordinate to check * @return distance cost from curpos to target */ virtual double getHeuristicCost(const ModelCoordinate& curpos, const ModelCoordinate& target) = 0; /** Gets the count of sides for a single cell * @return count of sides for a single cell */ virtual uint32_t getCellSideCount() const = 0; /** Transforms given point from layer coordinates to map coordinates * @return point in map coordinates */ ExactModelCoordinate toMapCoordinates(const ModelCoordinate& layer_coords); /** Transforms given point from layer coordinates to map coordinates * @return point in map coordinates */ virtual ExactModelCoordinate toMapCoordinates(const ExactModelCoordinate& layer_coords) = 0; /** Transforms given point from map coordinates to layer coordinates * @return point in layer coordinates */ virtual ModelCoordinate toLayerCoordinates(const ExactModelCoordinate& map_coord) = 0; /** Transforms given point from map coordinates to layer coordinates * @return point in layer coordinates */ virtual ExactModelCoordinate toExactLayerCoordinates(const ExactModelCoordinate& map_coord) = 0; /** Transforms given point from exact layer coordinates to cell precision layer coordinates * @return point in layer coordinates */ virtual ModelCoordinate toLayerCoordinatesFromExactLayerCoordinates(const ExactModelCoordinate& exact_layer_coords) = 0; /** Fills given point vector with vertices from selected cell * @param vtx vertices for given cell * @param cell cell to get vertices from */ virtual void getVertices(std::vector& vtx, const ModelCoordinate& cell) = 0; /** Returns point vector with coordinates for a multi object * @param position The center position * @param orig The vector with the original coordinates from object * @param reverse If true the orig coordinates are subtracted otherwise they are added */ virtual std::vector toMultiCoordinates(const ModelCoordinate& position, const std::vector& orig, bool reverse = false) = 0; /** Returns point vector with coordinates for a line from start to end. * @param start The start position * @param end The end position * @return vector with points */ virtual std::vector getCoordinatesInLine(const ModelCoordinate& start, const ModelCoordinate& end) = 0; /** Set the cellgrid x shift * @param xshift The shift in map coords */ void setXShift(const double& xshift) { m_xshift = xshift; updateMatrices(); } /** Get the cellgrid x shift * @return The x shift */ const double getXShift() const { return m_xshift; } /** Set the cellgrid y shift * @param yshift The shift in map coords */ void setYShift(const double yshift) { m_yshift = yshift; updateMatrices(); } /** Get the cellgrid y shift * @return The y shift in map coords */ const double getYShift() const { return m_yshift; } /** Set the cellgrid z shift * @param zshift The shift in map coords */ void setZShift(const double zshift) { m_zshift = zshift; updateMatrices(); } /** Get the cellgrid z shift * @return The z shift in map coords */ const double getZShift() const { return m_zshift; } /** Set the cellgrid x-scaling * @param scale The x-scale of cellgrid */ void setXScale(const double scale) { m_xscale = scale; updateMatrices(); } /** Set the cellgrid y-scaling * @param scale The y-scale of cellgrid */ void setYScale(const double scale) { m_yscale = scale; updateMatrices(); } /** Set the cellgrid z-scaling * @param scale The z-scale of cellgrid */ void setZScale(const double scale) { m_zscale = scale; updateMatrices(); } /** Get the cellgrid x-scaling * @return The x-scale of cellgrid */ const double getXScale() const { return m_xscale; } /** Get the cellgrid y-scaling * @return The y-scale of cellgrid */ const double getYScale() const { return m_yscale; } /** Get the cellgrid z-scaling * @return The z-scale of cellgrid */ const double getZScale() const { return m_zscale; } /** Set the cellgrid rotation * @param rotation The rotation of the cellgrid */ void setRotation(const double rotation) { m_rotation = rotation; updateMatrices(); } /** Get the cellgrid rotation * @return rotation The rotation of the cellgrid */ const double getRotation() const { return m_rotation; } /** Set whether diagonal cell access is allowed * @param allow_diagonals True if diagonal access allowed, false if only cell edges allowed */ void setAllowDiagonals(const bool allow_diagonals) { m_allow_diagonals = allow_diagonals; } /** Get whether diagonal cell access is allowed * @return True if diagonal access allowed, false if only cell edges allowed */ const bool getAllowDiagonals() const { return m_allow_diagonals; } /** Returns clone of this cellgrid */ virtual CellGrid* clone() = 0; protected: void updateMatrices(); bool ptInTriangle(const ExactModelCoordinate& pt, const ExactModelCoordinate& pt1, const ExactModelCoordinate& pt2, const ExactModelCoordinate& pt3); DoubleMatrix m_matrix; DoubleMatrix m_inverse_matrix; double m_xshift; double m_yshift; double m_zshift; double m_xscale; double m_yscale; double m_zscale; double m_rotation; bool m_allow_diagonals; private: int32_t orientation(const ExactModelCoordinate& pt, const ExactModelCoordinate& pt1, const ExactModelCoordinate& pt2); }; } #endif fifengine-0.4.2/engine/core/model/metamodel/grids/cellgrids.i000066400000000000000000000133341341615052600241540ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fife %{ #include "model/metamodel/grids/cellgrid.h" #include "model/metamodel/grids/hexgrid.h" #include "model/metamodel/grids/squaregrid.h" %} %include "model/metamodel/modelcoords.i" namespace std { %template(ModelCoordinateVector) vector; %template(ExactModelCoordinateVector) vector; } namespace FIFE { %apply std::vector &OUTPUT { std::vector& vtx }; class CellGrid { public: CellGrid(); virtual ~CellGrid(); void getAccessibleCoordinates(const ModelCoordinate& curpos, std::vector& coordinates); virtual const std::string& getType() const = 0; virtual const std::string& getName() const = 0; virtual bool isAccessible(const ModelCoordinate& curpos, const ModelCoordinate& target) = 0; virtual double getAdjacentCost(const ModelCoordinate& curpos, const ModelCoordinate& target) = 0; virtual double getHeuristicCost(const ModelCoordinate& curpos, const ModelCoordinate& target) = 0; virtual uint32_t getCellSideCount() const = 0; ExactModelCoordinate toMapCoordinates(const ModelCoordinate& layer_coords); virtual ExactModelCoordinate toMapCoordinates(const ExactModelCoordinate& layer_coords) = 0; virtual ModelCoordinate toLayerCoordinates(const ExactModelCoordinate& map_coord) = 0; virtual ExactModelCoordinate toExactLayerCoordinates(const ExactModelCoordinate& map_coord) = 0; virtual ModelCoordinate toLayerCoordinatesFromExactLayerCoordinates(const ExactModelCoordinate& exact_layer_coords) = 0; virtual void getVertices(std::vector& vtx, const ModelCoordinate& cell) = 0; virtual std::vector getCoordinatesInLine(const ModelCoordinate& start, const ModelCoordinate& end) = 0; void setXShift(const double& xshift); const double getXShift() const; void setYShift(const double yshift); const double getYShift() const; void setZShift(const double zshift); const double getZShift() const; void setXScale(const double scale); void setYScale(const double scale); void setZScale(const double scale); const double getXScale() const; const double getYScale() const; const double getZScale() const; void setRotation(const double rotation); const double getRotation() const; void setAllowDiagonals(const bool allow_diagonals); const bool getAllowDiagonals() const; }; class HexGrid: public CellGrid { public: HexGrid(bool axial = false); virtual ~HexGrid(); bool isAccessible(const ModelCoordinate& curpos, const ModelCoordinate& target); const std::string& getType() const; const std::string& getName() const; double getAdjacentCost(const ModelCoordinate& curpos, const ModelCoordinate& target); uint32_t getCellSideCount() const { return 6; } ExactModelCoordinate toMapCoordinates(const ExactModelCoordinate& layer_coords); ModelCoordinate toLayerCoordinates(const ExactModelCoordinate& map_coord); ExactModelCoordinate toExactLayerCoordinates(const ExactModelCoordinate& map_coord); ModelCoordinate toLayerCoordinatesFromExactLayerCoordinates(const ExactModelCoordinate& exact_layer_coords); void getVertices(std::vector& vtx, const ModelCoordinate& cell); std::vector getCoordinatesInLine(const ModelCoordinate& start, const ModelCoordinate& end); }; class SquareGrid: public CellGrid { public: SquareGrid(); virtual ~SquareGrid(); const std::string& getType() const; const std::string& getName() const; bool isAccessible(const ModelCoordinate& curpos, const ModelCoordinate& target); double getAdjacentCost(const ModelCoordinate& curpos, const ModelCoordinate& target); uint32_t getCellSideCount() const { return 4; } ExactModelCoordinate toMapCoordinates(const ExactModelCoordinate& layer_coords); ModelCoordinate toLayerCoordinates(const ExactModelCoordinate& map_coord); ExactModelCoordinate toExactLayerCoordinates(const ExactModelCoordinate& map_coord); ModelCoordinate toLayerCoordinatesFromExactLayerCoordinates(const ExactModelCoordinate& exact_layer_coords); void getVertices(std::vector& vtx, const ModelCoordinate& cell); std::vector getCoordinatesInLine(const ModelCoordinate& start, const ModelCoordinate& end); }; } fifengine-0.4.2/engine/core/model/metamodel/grids/hexgrid.cpp000066400000000000000000000314761341615052600241770ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/math/fife_math.h" #include "util/log/logger.h" #include "hexgrid.h" namespace FIFE { static Logger _log(LM_HEXGRID); static const double HEX_WIDTH = 1; static const double HEX_TO_EDGE = HEX_WIDTH / 2; static const double HEX_TO_CORNER = 0.5 / Mathd::Cos(Mathd::pi() / 6); static const double HEX_EDGE_HALF = HEX_TO_CORNER * Mathd::Sin(Mathd::pi() / 6); static const double VERTICAL_MULTIP = Mathd::Sqrt(HEX_WIDTH*HEX_WIDTH - HEX_TO_EDGE*HEX_TO_EDGE); static const double VERTICAL_MULTIP_INV = 1 / VERTICAL_MULTIP; static const double HEX_EDGE_GRADIENT = 1 / Mathd::Sqrt(3); HexGrid::HexGrid(bool axial): CellGrid(), m_axial(axial) { FL_DBG(_log, "Constructing new HexGrid"); FL_DBG(_log, LMsg("HEX_WIDTH ") << HEX_WIDTH); FL_DBG(_log, LMsg("HEX_TO_EDGE ") << HEX_TO_EDGE); FL_DBG(_log, LMsg("HEX_TO_CORNER ") << HEX_TO_CORNER); FL_DBG(_log, LMsg("HEX_EDGE_HALF ") << HEX_EDGE_HALF); FL_DBG(_log, LMsg("VERTICAL_MULTIP ") << VERTICAL_MULTIP); } CellGrid* HexGrid::clone() { HexGrid* nGrid = new HexGrid(m_axial); nGrid->setRotation(m_rotation); nGrid->setXScale(m_xscale); nGrid->setYScale(m_yscale); nGrid->setXShift(m_xshift); nGrid->setYShift(m_yshift); nGrid->setZShift(m_zshift); nGrid->setAllowDiagonals(m_allow_diagonals); return nGrid; } HexGrid::~HexGrid() { } bool HexGrid::isAccessible(const ModelCoordinate& curpos, const ModelCoordinate& target) { int32_t x = target.x-curpos.x; int32_t y = target.y-curpos.y; if (ABS(x) <= 1 && ABS(y) <= 1) { if (m_axial) { if (y == 0 || x == 0 || x == -y) return true; } else { if (y == 0) { return true; } else if (curpos.y & 1) { if (x >= 0) return true; } else if (x <= 0) return true; } } return false; } double HexGrid::getAdjacentCost(const ModelCoordinate& curpos, const ModelCoordinate& target) { if (curpos == target) { return 0.0; } return 1.0; } double HexGrid::getHeuristicCost(const ModelCoordinate& curpos, const ModelCoordinate& target) { return static_cast(ABS(target.x - curpos.x) + ABS(target.y - curpos.y)); } const std::string& HexGrid::getType() const { if (m_axial) { static std::string type("hexagonal_axial"); return type; } else { static std::string type("hexagonal"); return type; } } const std::string& HexGrid::getName() const { if (m_axial) { static std::string hexGrid("Hex Grid (Axial)"); return hexGrid; } else { static std::string hexGrid("Hex Grid"); return hexGrid; } } double HexGrid::getXZigzagOffset(double y) { if (m_axial) { return HEX_TO_EDGE * y; } else { // each uneven row has shifted coordinate of 0.5 horizontally // shift has to be gradual on vertical axis double ay = ABS(y); int32_t i_layer_y = static_cast(ay); double offset = ay - static_cast(i_layer_y); if ((i_layer_y % 2) == 1) { offset = 1 - offset; } return HEX_TO_EDGE * offset; } } ExactModelCoordinate HexGrid::toMapCoordinates(const ExactModelCoordinate& layer_coords) { ExactModelCoordinate tranformed_coords(layer_coords); tranformed_coords.x += getXZigzagOffset(layer_coords.y); tranformed_coords.y *= VERTICAL_MULTIP; ExactModelCoordinate result = m_matrix * tranformed_coords; FL_DBG(_log, LMsg("layercoords ") << layer_coords << " converted to map: " << result); return result; } ExactModelCoordinate HexGrid::toExactLayerCoordinates(const ExactModelCoordinate& map_coord) { ExactModelCoordinate layer_coords = m_inverse_matrix * map_coord; layer_coords.y /= VERTICAL_MULTIP; layer_coords.x -= getXZigzagOffset(layer_coords.y); FL_DBG(_log, LMsg("mapcoords ") << map_coord << " converted to layer: " << layer_coords); return layer_coords; } ModelCoordinate HexGrid::toLayerCoordinates(const ExactModelCoordinate& map_coord) { FL_DBG(_log, LMsg("==============\nConverting map coords ") << map_coord << " to int32_t layer coords..."); ExactModelCoordinate elc = m_inverse_matrix * map_coord; elc.y *= VERTICAL_MULTIP_INV; return toLayerCoordinatesHelper(elc); } ModelCoordinate HexGrid::toLayerCoordinatesFromExactLayerCoordinates(const ExactModelCoordinate& exact_layer_coords) { ExactModelCoordinate elc = exact_layer_coords; elc.x += getXZigzagOffset(elc.y); return toLayerCoordinatesHelper(elc); } ModelCoordinate HexGrid::toLayerCoordinatesHelper(const ExactModelCoordinate& coords) { // this helper method takes exact layer coordinates with zigzag removed // and converts them to layer coordinates ExactModelCoordinate elc = coords; // approximate conversion using squares instead of hexes if( static_cast(round(elc.y)) & 1 ) elc.x -= 0.5; ExactModelCoordinate lc = ExactModelCoordinate(round(elc.x), round(elc.y), round(elc.z)); int32_t x = static_cast(lc.x); int32_t y = static_cast(lc.y); int32_t z = static_cast(lc.z); // distance of given point from our approximation // If y uneven dx=-dx and dy=-dy double dx,dy; if (y & 1) { dx = elc.x - lc.x; dy = elc.y - lc.y; } else { dx = lc.x - elc.x; dy = lc.y - elc.y; } // adjustment for cases where our approximation lies beyond the hex edge if (ABS(dy) > ((HEX_TO_CORNER - HEX_EDGE_GRADIENT * ABS(dx)) * VERTICAL_MULTIP_INV)) { int8_t ddx, ddy; if (dx>0) ddx = -1; else ddx = 0; if (dy>0) ddy = -1; else ddy = 1; if (y & 1) { ddx = -ddx; ddy = -ddy; } x += ddx; y += ddy; } if (m_axial) { if (y >= 0) x -= y / 2; else x -= (y - 1) / 2; } return ModelCoordinate(x,y,z); } void HexGrid::getVertices(std::vector& vtx, const ModelCoordinate& cell) { FL_DBG(_log, LMsg("===============\ngetting vertices for ") << cell); vtx.clear(); double x = static_cast(cell.x); double y = static_cast(cell.y); double horiz_shift; if (m_axial) { horiz_shift = HEX_TO_EDGE * cell.y; } else { horiz_shift = 0; if (cell.y % 2 != 0) { horiz_shift = HEX_TO_EDGE; FL_DBG(_log, "on uneven row"); } } double tx, ty; #define ADD_PT(_x, _y) vtx.push_back(ExactModelCoordinate(_x, _y)); // FL_DBG(_log, LMsg("Added point ") << _x << ", " << _y) ty = y - VERTICAL_MULTIP_INV * HEX_EDGE_HALF; tx = x - HEX_TO_EDGE - getXZigzagOffset(ty) + horiz_shift; ADD_PT(tx, ty); ty = y - VERTICAL_MULTIP_INV * HEX_TO_CORNER; tx = x - getXZigzagOffset(ty) + horiz_shift; ADD_PT(tx, ty); ty = y - VERTICAL_MULTIP_INV * HEX_EDGE_HALF; tx = x + HEX_TO_EDGE - getXZigzagOffset(ty) + horiz_shift; ADD_PT(tx, ty); ty = y + VERTICAL_MULTIP_INV * HEX_EDGE_HALF; tx = x + HEX_TO_EDGE - getXZigzagOffset(ty) + horiz_shift; ADD_PT(tx, ty); ty = y + VERTICAL_MULTIP_INV * HEX_TO_CORNER; tx = x - getXZigzagOffset(ty) + horiz_shift; ADD_PT(tx, ty); ty = y + VERTICAL_MULTIP_INV * HEX_EDGE_HALF; tx = x - HEX_TO_EDGE - getXZigzagOffset(ty) + horiz_shift; ADD_PT(tx, ty); } std::vector HexGrid::toMultiCoordinates(const ModelCoordinate& position, const std::vector& orig, bool reverse) { std::vector coords; std::vector::const_iterator it = orig.begin(); if (reverse) { for (; it != orig.end(); ++it) { ModelCoordinate mc = position; if (mc.y % 2 != 0) { mc.x -= (*it).x; mc.y -= (*it).y; if (mc.y % 2 == 0) { mc.x -= 1; } } else { mc.x -= (*it).x; mc.y -= (*it).y; } coords.push_back(mc); } } else { for (; it != orig.end(); ++it) { ModelCoordinate mc = position; if (mc.y % 2 != 0) { mc.x += (*it).x; mc.y += (*it).y; if (mc.y % 2 == 0) { mc.x += 1; } } else { mc.x += (*it).x; mc.y += (*it).y; } coords.push_back(mc); } } return coords; } std::vector HexGrid::getCoordinatesInLine(const ModelCoordinate& start, const ModelCoordinate& end) { std::vector coords; int32_t doubleDeltaX = 2*(end.x - start.x) + ABS(end.y % 2) - ABS(start.y % 2); int32_t deltaX = (end.x - start.x) + ABS(end.y % 2) - ABS(start.y % 2); int32_t deltaY = end.y - start.y; //int8_t signX = (deltaX >= 0) ? 1 : -1; //int8_t signY = (deltaY >= 0) ? 1 : -1; int8_t signX = (start.x < end.x) ? 1 : -1; int8_t signY = (start.y < end.y) ? 1 : -1; ModelCoordinate current(start); coords.push_back(current); int32_t err = 0; if (ABS(deltaY) < ABS(doubleDeltaX)) { int32_t errX = 3 * ABS(doubleDeltaX); int32_t errY = 3 * ABS(deltaY); while (current.x != end.x || current.y != end.y) { err += errY; if (err > ABS(doubleDeltaX)) { if (signX == -1) { if (signY == -1) { // down left if (current.y % 2 == 0 && current.x != end.x) { current.x -= 1; } current.y -= 1; } else { // up left if (current.y % 2 == 0 && current.x != end.x) { current.x -= 1; } current.y += 1; } } else { if (signY == -1) { // down right if (current.y % 2 != 0 && current.x != end.x) { current.x += 1; } current.y -= 1; } else { // up right if (current.y % 2 != 0 && current.x != end.x) { current.x += 1; } current.y += 1; } } err -= errX; } else { if (signX == -1) { // left current.x -= 1; } else { // right current.x += 1; } err += errY; } coords.push_back(current); } } else { int32_t errX = ABS(doubleDeltaX); int32_t errY = ABS(deltaY); while (current.x != end.x || current.y != end.y) { err += errX; if (err > 0) { if (signX == -1) { if (signY == -1) { // down left if (current.y % 2 == 0 && current.x != end.x) { current.x -= 1; } current.y -= 1; } else { // up left if (current.y % 2 == 0 && current.x != end.x) { current.x -= 1; } current.y += 1; } } else if (signX == 1) { if (signY == -1) { // down right if (current.y % 2 != 0 && current.x != end.x) { current.x += 1; } current.y -= 1; } else { // up right if (current.y % 2 != 0 && current.x != end.x) { current.x += 1; } current.y += 1; } } err -= errY; } else { signX = -signX; if (signX == -1) { if (signY == -1) { // down left if (current.y % 2 == 0 && current.x != end.x) { current.x -= 1; } current.y -= 1; } else { // up left if (current.y % 2 == 0 && current.x != end.x) { current.x -= 1; } current.y += 1; } } else if (signX == 1) { if (signY == -1) { // down right if (current.y % 2 != 0 && current.x != end.x) { current.x += 1; } current.y -= 1; } else { // up right if (current.y % 2 != 0 && current.x != end.x) { current.x += 1; } current.y += 1; } } signX = -signX; err += errY; } coords.push_back(current); } } return coords; } } fifengine-0.4.2/engine/core/model/metamodel/grids/hexgrid.h000066400000000000000000000063721341615052600236410ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_MODEL_GRIDS_HEXGRID_H #define FIFE_MODEL_GRIDS_HEXGRID_H // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/fife_stdint.h" #include "cellgrid.h" namespace FIFE { class HexGrid: public CellGrid { public: HexGrid(bool axial = false); virtual ~HexGrid(); bool isAccessible(const ModelCoordinate& curpos, const ModelCoordinate& target); const std::string& getType() const; const std::string& getName() const; double getAdjacentCost(const ModelCoordinate& curpos, const ModelCoordinate& target); double getHeuristicCost(const ModelCoordinate& curpos, const ModelCoordinate& target); uint32_t getCellSideCount() const { return 6; } ExactModelCoordinate toMapCoordinates(const ExactModelCoordinate& layer_coords); ModelCoordinate toLayerCoordinates(const ExactModelCoordinate& map_coord); ExactModelCoordinate toExactLayerCoordinates(const ExactModelCoordinate& map_coord); ModelCoordinate toLayerCoordinatesFromExactLayerCoordinates(const ExactModelCoordinate& exact_layer_coords); void getVertices(std::vector& vtx, const ModelCoordinate& cell); std::vector toMultiCoordinates(const ModelCoordinate& position, const std::vector& orig, bool reverse); std::vector getCoordinatesInLine(const ModelCoordinate& start, const ModelCoordinate& end); CellGrid* clone(); private: double getXZigzagOffset(double y); ModelCoordinate toLayerCoordinatesHelper(const ExactModelCoordinate& coords); bool m_axial; }; } #endif fifengine-0.4.2/engine/core/model/metamodel/grids/squaregrid.cpp000066400000000000000000000135031341615052600247020ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes #include #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/math/fife_math.h" #include "util/log/logger.h" #include "squaregrid.h" namespace FIFE { static Logger _log(LM_SQUAREGRID); SquareGrid::SquareGrid(): CellGrid() { } CellGrid* SquareGrid::clone() { SquareGrid* nGrid = new SquareGrid(); nGrid->setRotation(m_rotation); nGrid->setXScale(m_xscale); nGrid->setYScale(m_yscale); nGrid->setXShift(m_xshift); nGrid->setYShift(m_yshift); nGrid->setZShift(m_zshift); nGrid->setAllowDiagonals(m_allow_diagonals); return nGrid; } SquareGrid::~SquareGrid() { } bool SquareGrid::isAccessible(const ModelCoordinate& curpos, const ModelCoordinate& target) { if (curpos == target) { return true; } uint8_t x = ABS(target.x-curpos.x); uint8_t y = ABS(target.y-curpos.y); if ((x<=1) && (y<=1)) { if (m_allow_diagonals) { return true; } else if (x^y) { return true; } } return false; } double SquareGrid::getAdjacentCost(const ModelCoordinate& curpos, const ModelCoordinate& target) { if (curpos == target) { return 0.0; } else if (ABS(target.x-curpos.x)^ABS(target.y-curpos.y)) { return 1.0; } return 1.4; } double SquareGrid::getHeuristicCost(const ModelCoordinate& curpos, const ModelCoordinate& target) { return static_cast(ABS(target.x - curpos.x) + ABS(target.y - curpos.y)); } const std::string& SquareGrid::getType() const { static std::string type("square"); return type; } const std::string& SquareGrid::getName() const { static std::string squareGrid("Square Grid"); return squareGrid; } ExactModelCoordinate SquareGrid::toMapCoordinates(const ExactModelCoordinate& layer_coords) { return m_matrix * layer_coords; } ExactModelCoordinate SquareGrid::toExactLayerCoordinates(const ExactModelCoordinate& map_coord) { return m_inverse_matrix * map_coord; } ModelCoordinate SquareGrid::toLayerCoordinates(const ExactModelCoordinate& map_coord) { ExactModelCoordinate dblpt = toExactLayerCoordinates(map_coord); return toLayerCoordinatesFromExactLayerCoordinates(dblpt); } ModelCoordinate SquareGrid::toLayerCoordinatesFromExactLayerCoordinates(const ExactModelCoordinate& exact_layer_coords) { ModelCoordinate result(round(exact_layer_coords.x), round(exact_layer_coords.y), round(exact_layer_coords.z)); return result; } void SquareGrid::getVertices(std::vector& vtx, const ModelCoordinate& cell) { vtx.clear(); double x = static_cast(cell.x); double y = static_cast(cell.y); vtx.push_back(ExactModelCoordinate(x-0.5, y-0.5)); vtx.push_back(ExactModelCoordinate(x+0.5, y-0.5)); vtx.push_back(ExactModelCoordinate(x+0.5, y+0.5)); vtx.push_back(ExactModelCoordinate(x-0.5, y+0.5)); } std::vector SquareGrid::toMultiCoordinates(const ModelCoordinate& position, const std::vector& orig, bool reverse) { std::vector coords; std::vector::const_iterator it = orig.begin(); if (reverse) { for (; it != orig.end(); ++it) { ModelCoordinate mc = position; mc.x -= (*it).x; mc.y -= (*it).y; coords.push_back(mc); } } else { for (; it != orig.end(); ++it) { ModelCoordinate mc = position; mc.x += (*it).x; mc.y += (*it).y; coords.push_back(mc); } } return coords; } std::vector SquareGrid::getCoordinatesInLine(const ModelCoordinate& start, const ModelCoordinate& end) { std::vector coords; int32_t dx = ABS(end.x - start.x); int32_t dy = ABS(end.y - start.y); int8_t sx = -1; int8_t sy = -1; if (start.x < end.x) { sx = 1; } if (start.y < end.y) { sy = 1; } int32_t err = dx - dy; int32_t err2 = err*2; ModelCoordinate current(start); bool finished = false; while (!finished) { coords.push_back(current); if (current.x == end.x && current.y == end.y) { finished = true; break; } if (err2 > -dy) { err -= dy; current.x += sx; } else if (err2 < dx) { err += dx; current.y += sy; } err2 = err*2; } return coords; } } fifengine-0.4.2/engine/core/model/metamodel/grids/squaregrid.h000066400000000000000000000061471341615052600243550ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_MODEL_GRIDS_SQUAREGRID_H #define FIFE_MODEL_GRIDS_SQUAREGRID_H // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/fife_stdint.h" #include "cellgrid.h" namespace FIFE { class SquareGrid: public CellGrid { public: SquareGrid(); virtual ~SquareGrid(); const std::string& getType() const; const std::string& getName() const; bool isAccessible(const ModelCoordinate& curpos, const ModelCoordinate& target); double getAdjacentCost(const ModelCoordinate& curpos, const ModelCoordinate& target); double getHeuristicCost(const ModelCoordinate& curpos, const ModelCoordinate& target); uint32_t getCellSideCount() const { return 4; } ExactModelCoordinate toMapCoordinates(const ExactModelCoordinate& layer_coords); ModelCoordinate toLayerCoordinates(const ExactModelCoordinate& map_coord); ExactModelCoordinate toExactLayerCoordinates(const ExactModelCoordinate& map_coord); ModelCoordinate toLayerCoordinatesFromExactLayerCoordinates(const ExactModelCoordinate& exact_layer_coords); void getVertices(std::vector& vtx, const ModelCoordinate& cell); std::vector toMultiCoordinates(const ModelCoordinate& position, const std::vector& orig, bool reverse); std::vector getCoordinatesInLine(const ModelCoordinate& start, const ModelCoordinate& end); CellGrid* clone(); }; } #endif fifengine-0.4.2/engine/core/model/metamodel/ipather.h000066400000000000000000000122551341615052600225300ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2006-2011 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_MODEL_IPATHER_H #define FIFE_MODEL_IPATHER_H // Standard C++ library includes #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder namespace FIFE { class Location; class Instance; class Route; //! A path is a list with locations. Each location holds the coordinate for one cell. typedef std::list Path; enum PriorityType { HIGH_PRIORITY, MEDIUM_PRIORITY, LOW_PRIORITY }; class IPather { public: virtual ~IPather() {}; /** Creates a route between the start and end location that needs be solved. * * @param start A const reference to the start location. * @param end A const reference to the target location. * @param immediate A optional boolean, if true the route bypass the max. ticks limit and solves the path immediately, otherwise false. * @param cost_id A const reference to the string that holds the cost identifier. You can use it optional then this cost id is used instead of the default cost. */ virtual Route* createRoute(const Location& start, const Location& end, bool immediate = false, const std::string& cost_id = "") = 0; /** Solves the route to create a path. * * @param route A pointer to the route which should be solved. * @param priority The priority to assign to search (high are pushed to the front of the queue). @see PriorityType * @param immediate A optional boolean, if true the route bypass the max. ticks limit and solves the path immediately, otherwise false. * @return A boolean, if true the route could be solved, otherwise false. */ virtual bool solveRoute(Route* route, int32_t priority = MEDIUM_PRIORITY, bool immediate = false) = 0; /** Follows the path of the route. * * @param current A const reference to the current location. * @param route A pointer to the route which should be followed. * @param speed A double which holds the speed. * @param nextLocation A reference to the next location returned by the pather. * @return A boolean, if true the route could be followed, otherwise false. */ virtual bool followRoute(const Location& current, Route* route, double speed, Location& nextLocation) = 0; /** Updates the pather (should it need updating). * * The update method is called by the model. Pathfinders which require per loop updating * (in the case of pathfinders which implement A* for instance) should use this method * as an oppurtunity to update the search. Generally the method should be constrained to * a maximum amount of search updating to prevent this method from stalling the application. */ virtual void update() = 0; /** Cancels a given session. * * This function is called when (for instance) the user changes their mind about * a destination while the agent is already moving, the old session needs to be * cancelled and a new one created. * * @param sessionId The id of the session to cancel. * @return A boolean to signify whether the session was successfully found and cancelled. */ virtual bool cancelSession(const int32_t sessionId) = 0; /** Sets maximal ticks (update steps) to solve routes. @see update() * @param ticks A integer which holds the steps. default is 1000 */ virtual void setMaxTicks(int32_t ticks) = 0; /** Returns maximal ticks (update steps) to solve routes. @see update() * @return A integer which holds the steps. default is 1000 */ virtual int32_t getMaxTicks() = 0; /** Gets the name of this pather */ virtual std::string getName() const = 0; }; } #endif fifengine-0.4.2/engine/core/model/metamodel/ipather.i000066400000000000000000000045551341615052600225350ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fife %{ #include "model/metamodel/ipather.h" %} %include "model/structures/instance.i" %include "pathfinder/route.h" namespace FIFE { enum PriorityType { HIGH_PRIORITY, MEDIUM_PRIORITY, LOW_PRIORITY }; %feature("director") IPather; class IPather { public: virtual ~IPather(); virtual Route* createRoute(const Location& start, const Location& end, bool immediate = false, const std::string& cost_id = "") = 0; virtual bool solveRoute(Route* route, int32_t priority = MEDIUM_PRIORITY, bool immediate = false) = 0; virtual bool followRoute(const Location& current, Route* route, double speed, Location& nextLocation) = 0; virtual void update() = 0; virtual bool cancelSession(const int32_t sessionId) = 0; virtual void setMaxTicks(int32_t ticks) = 0; virtual int32_t getMaxTicks() = 0; virtual std::string getName() const = 0; }; } fifengine-0.4.2/engine/core/model/metamodel/ivisual.h000066400000000000000000000036441341615052600225520ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_MODEL_IVISUAL_H #define FIFE_MODEL_IVISUAL_H // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder namespace FIFE { class IVisual { public: virtual ~IVisual() {}; }; } #endif fifengine-0.4.2/engine/core/model/metamodel/ivisual.i000066400000000000000000000032351341615052600225470ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fife %{ #include "model/metamodel/ivisual.h" %} namespace FIFE { class IVisual { public: virtual ~IVisual(); private: IVisual(); }; } fifengine-0.4.2/engine/core/model/metamodel/modelcoords.h000066400000000000000000000040101341615052600233740ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_MODELCOORDS_H #define FIFE_MODELCOORDS_H // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/structures/point.h" namespace FIFE { typedef DoublePoint3D AudioSpaceCoordinate; typedef DoublePoint3D ExactModelCoordinate; typedef Point3D ModelCoordinate; } #endif fifengine-0.4.2/engine/core/model/metamodel/modelcoords.i000066400000000000000000000035121341615052600234030ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fife %{ #include "model/metamodel/modelcoords.h" %} %include "model/metamodel/modelcoords.h" %include "util/structures/utilstructures.i" namespace FIFE { %template(AudioSpaceCoordinate) PointType3D; %template(ModelCoordinate) PointType3D; %template(ExactModelCoordinate) PointType3D; } fifengine-0.4.2/engine/core/model/metamodel/object.cpp000066400000000000000000000403461341615052600226770ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2006-2012 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/exception.h" #include "object.h" #include "action.h" #include "ipather.h" namespace FIFE { Object::BasicObjectProperty::BasicObjectProperty(): m_area(""), m_actions(NULL), m_defaultAction(NULL), m_blocking(false), m_static(false), m_cellStack(0) { } Object::BasicObjectProperty::~BasicObjectProperty() { if (m_actions) { std::map::const_iterator i(m_actions->begin()); while (i != m_actions->end()) { delete i->second; ++i; } delete m_actions; } } Object::MovableObjectProperty::MovableObjectProperty(): m_pather(NULL), m_costId(""), m_cost(1.0), m_speed(1.0), m_zRange(0) { } Object::MovableObjectProperty::~MovableObjectProperty() { } Object::MultiObjectProperty::MultiObjectProperty(): m_multiPart(false), m_restrictedRotation(false) { } Object::MultiObjectProperty::~MultiObjectProperty() { } Object::Object(const std::string& identifier, const std::string& name_space, Object* inherited): m_id(identifier), m_namespace(name_space), m_filename(""), m_inherited(inherited), m_visual(NULL), m_basicProperty(NULL), m_moveProperty(NULL), m_multiProperty(NULL) { } Object::~Object() { delete m_visual; delete m_basicProperty; delete m_moveProperty; delete m_multiProperty; } Action* Object::createAction(const std::string& identifier, bool is_default) { std::map* actions; if (!m_basicProperty) { m_basicProperty = new BasicObjectProperty(); } if (!m_basicProperty->m_actions) { m_basicProperty->m_actions = new std::map; } actions = m_basicProperty->m_actions; std::map::const_iterator it = actions->begin(); for(; it != actions->end(); ++it) { if(identifier == it->second->getId()) { throw NameClash(identifier); } } Action* a = getAction(identifier, false); if (!a) { a = new Action(identifier); (*actions)[identifier] = a; if (is_default || (!m_basicProperty->m_defaultAction)) { m_basicProperty->m_defaultAction = a; } } return a; } Action* Object::getAction(const std::string& identifier, bool deepsearch) const { std::map* actions = NULL; if (m_basicProperty) { actions = m_basicProperty->m_actions; } std::map::const_iterator i; if (actions) { i = actions->find(identifier); } if ((!actions) || (i == actions->end())) { if (m_inherited && deepsearch) { return m_inherited->getAction(identifier); } return NULL; } return i->second; } std::list Object::getActionIds() const { std::map* actions = NULL; if (m_basicProperty) { actions = m_basicProperty->m_actions; } std::list action_ids; if (actions) { std::map::const_iterator actions_it = actions->begin(); for(; actions_it != actions->end(); ++actions_it) { action_ids.push_back(actions_it->first); } } return action_ids; } void Object::setDefaultAction(const std::string& identifier) { std::map::const_iterator i; Action* action = NULL; std::map* actions = NULL; if (m_basicProperty) { actions = m_basicProperty->m_actions; } if (actions) { i = actions->find(identifier); } if ((!actions) || (i == actions->end())) { if (m_inherited) { action = m_inherited->getAction(identifier); } } else { action = i->second; } if (action && m_basicProperty) { m_basicProperty->m_defaultAction = action; } } Action* Object::getDefaultAction() const { if (m_basicProperty) { return m_basicProperty->m_defaultAction; } if (m_inherited) { return m_inherited->getDefaultAction(); } return NULL; } void Object::setPather(IPather* pather) { if (!m_moveProperty) { m_moveProperty = new MovableObjectProperty(); } m_moveProperty->m_pather = pather; } IPather* Object::getPather() const { if (m_moveProperty) { return m_moveProperty->m_pather; } if (m_inherited) { return m_inherited->getPather(); } return NULL; } Object* Object::getInherited() const { return m_inherited; } void Object::adoptVisual(IVisual* visual) { if (m_visual && m_visual != visual) { delete m_visual; } m_visual = visual; } void Object::setBlocking(bool blocking) { if (!m_basicProperty) { m_basicProperty = new BasicObjectProperty(); } m_basicProperty->m_blocking = blocking; } bool Object::isBlocking() const { if (m_basicProperty) { return m_basicProperty->m_blocking; } if (m_inherited) { return m_inherited->isBlocking(); } return false; } void Object::setStatic(bool stat) { if (!m_basicProperty) { m_basicProperty = new BasicObjectProperty(); } m_basicProperty->m_static = stat; } bool Object::isStatic() const { if (!m_basicProperty) { if (m_inherited) { return m_inherited->isStatic(); } return false; } return m_basicProperty->m_static; } void Object::setFilename(const std::string& file) { m_filename = file; } const std::string& Object::getFilename() const { return m_filename; } void Object::setCellStackPosition(uint8_t position) { if (!m_basicProperty) { m_basicProperty = new BasicObjectProperty(); } m_basicProperty->m_cellStack = position; } uint8_t Object::getCellStackPosition() const { if (m_basicProperty) { return m_basicProperty->m_cellStack; } if (m_inherited) { return m_inherited->getCellStackPosition(); } return 0; } bool Object::isSpecialCost() const { if (m_moveProperty) { return m_moveProperty->m_costId != ""; } if (m_inherited) { return m_inherited->isSpecialCost(); } return false; } void Object::setCostId(const std::string& cost) { if (!m_moveProperty) { m_moveProperty = new MovableObjectProperty(); } m_moveProperty->m_costId = cost; } std::string Object::getCostId() const { if (m_moveProperty) { return m_moveProperty->m_costId; } if (m_inherited) { return m_inherited->getCostId(); } return ""; } void Object::setCost(double cost) { if (!m_moveProperty) { m_moveProperty = new MovableObjectProperty(); } m_moveProperty->m_cost = cost; } double Object::getCost() const { if (m_moveProperty) { return m_moveProperty->m_cost; } if (m_inherited) { return m_inherited->getCost(); } return 1.0; } bool Object::isSpecialSpeed() const { if (m_moveProperty) { return !Mathd::Equal(m_moveProperty->m_speed, 1.0); } if (m_inherited) { return m_inherited->isSpecialSpeed(); } return false; } void Object::setSpeed(double speed) { if (!m_moveProperty) { m_moveProperty = new MovableObjectProperty(); } m_moveProperty->m_speed = speed; } double Object::getSpeed() const { if (m_moveProperty) { return m_moveProperty->m_speed; } if (m_inherited) { return m_inherited->getSpeed(); } return 1.0; } bool Object::isMultiObject() const { if (m_multiProperty) { return !m_multiProperty->m_multiPartIds.empty(); } if (m_inherited) { return m_inherited->isMultiObject(); } return false; } void Object::addMultiPartId(const std::string& partId) { if (!m_multiProperty) { m_multiProperty = new MultiObjectProperty(); } m_multiProperty->m_multiPartIds.push_back(partId); } std::list Object::getMultiPartIds() const { if (m_multiProperty) { return m_multiProperty->m_multiPartIds; } if (m_inherited) { return m_inherited->getMultiPartIds(); } return std::list(); } void Object::removeMultiPartId(const std::string& partId) { if (!m_multiProperty) { return; } std::list::iterator it = m_multiProperty->m_multiPartIds.begin(); for (; it != m_multiProperty->m_multiPartIds.end(); ++it) { if (*it == partId) { m_multiProperty->m_multiPartIds.erase(it); break; } } } void Object::removeAllMultiPartIds() { if (!m_multiProperty) { return; } m_multiProperty->m_multiPartIds.clear(); } bool Object::isMultiPart() const { if (m_multiProperty) { return m_multiProperty->m_multiPart; } if (m_inherited) { return m_inherited->isMultiPart(); } return false; } void Object::setMultiPart(bool part) { if (!m_multiProperty) { m_multiProperty = new MultiObjectProperty(); } m_multiProperty->m_multiPart = part; } void Object::addMultiPart(Object* obj) { if (!m_multiProperty) { m_multiProperty = new MultiObjectProperty(); } m_multiProperty->m_multiParts.insert(obj); } std::set Object::getMultiParts() const { if (m_multiProperty) { return m_multiProperty->m_multiParts; } if (m_inherited) { return m_inherited->getMultiParts(); } return std::set(); } void Object::removeMultiPart(Object* obj) { if (!m_multiProperty) { return; } m_multiProperty->m_multiParts.erase(obj); } void Object::removeMultiParts() { if (!m_multiProperty) { return; } m_multiProperty->m_multiParts.clear(); } void Object::addMultiPartCoordinate(int32_t rotation, ModelCoordinate coord) { if (!m_multiProperty) { m_multiProperty = new MultiObjectProperty(); } m_multiProperty->m_multiPartCoordinates.insert(std::pair(rotation, coord)); m_multiProperty->m_partAngleMap[rotation] = rotation; } std::multimap Object::getMultiPartCoordinates() const { if (m_multiProperty) { return m_multiProperty->m_multiPartCoordinates; } if (m_inherited) { return m_inherited->getMultiPartCoordinates(); } return std::multimap(); } std::vector Object::getMultiPartCoordinates(int32_t rotation) const { std::vector coordinates; if (m_multiProperty) { int32_t closest = 0; getIndexByAngle(rotation, m_multiProperty->m_partAngleMap, closest); std::pair::iterator, std::multimap::iterator> result = m_multiProperty->m_multiPartCoordinates.equal_range(closest); std::multimap::iterator it = result.first; for (; it != result.second; ++it) { coordinates.push_back((*it).second); } } else if (m_inherited) { return m_inherited->getMultiPartCoordinates(rotation); } return coordinates; } std::vector Object::getMultiObjectCoordinates(int32_t rotation) const { std::vector coordinates; if (m_multiProperty) { if (m_multiProperty->m_multiObjectCoordinates.empty()) { std::set::iterator subit = m_multiProperty->m_multiParts.begin(); for (; subit != m_multiProperty->m_multiParts.end(); ++subit) { const std::multimap& subcoords = (*subit)->getMultiPartCoordinates(); m_multiProperty->m_multiObjectCoordinates.insert(subcoords.begin(), subcoords.end()); } std::multimap::iterator it = m_multiProperty->m_multiObjectCoordinates.begin(); for (; it != m_multiProperty->m_multiObjectCoordinates.end(); ++it) { m_multiProperty->m_multiAngleMap[(*it).first] = (*it).first; } } int32_t closest = 0; getIndexByAngle(rotation, m_multiProperty->m_multiAngleMap, closest); std::pair::iterator, std::multimap::iterator> result = m_multiProperty->m_multiObjectCoordinates.equal_range(closest); std::multimap::iterator it = result.first; ModelCoordinate parent(0,0); coordinates.push_back(parent); for (; it != result.second; ++it) { coordinates.push_back((*it).second); } } else if (m_inherited) { return m_inherited->getMultiObjectCoordinates(rotation); } return coordinates; } void Object::setRotationAnchor(const ExactModelCoordinate& anchor) { if (!m_multiProperty) { m_multiProperty = new MultiObjectProperty(); } m_multiProperty->m_rotationAnchor = anchor; } ExactModelCoordinate Object::getRotationAnchor() const { if (m_multiProperty) { return m_multiProperty->m_rotationAnchor; } if (m_inherited) { return m_inherited->getRotationAnchor(); } return ExactModelCoordinate(); } void Object::setRestrictedRotation(bool restrict) { if (!m_multiProperty) { m_multiProperty = new MultiObjectProperty(); } m_multiProperty->m_restrictedRotation = restrict; } bool Object::isRestrictedRotation() const { if (m_multiProperty) { return m_multiProperty->m_restrictedRotation; } if (m_inherited) { return m_inherited->isRestrictedRotation(); } return false; } int32_t Object::getRestrictedRotation(int32_t rotation) { int32_t closest = rotation; if (m_multiProperty) { if (!m_multiProperty->m_multiAngleMap.empty()) { getIndexByAngle(rotation, m_multiProperty->m_multiAngleMap, closest); } else if (!m_multiProperty->m_partAngleMap.empty()) { getIndexByAngle(rotation, m_multiProperty->m_partAngleMap, closest); } } else if (m_inherited) { return m_inherited->getRestrictedRotation(rotation); } return closest; } void Object::setZStepRange(int32_t zRange) { if (!m_moveProperty) { m_moveProperty = new MovableObjectProperty(); } m_moveProperty->m_zRange = zRange; } int32_t Object::getZStepRange() const { if (m_moveProperty) { return m_moveProperty->m_zRange; } if (m_inherited) { return m_inherited->getZStepRange(); } return 0; } void Object::setArea(const std::string& id) { if (!m_basicProperty) { m_basicProperty = new BasicObjectProperty(); } m_basicProperty->m_area = id; } std::string Object::getArea() const { if (m_basicProperty) { return m_basicProperty->m_area; } if (m_inherited) { return m_inherited->getArea(); } return ""; } void Object::addWalkableArea(const std::string& id) { if (!m_moveProperty) { m_moveProperty = new MovableObjectProperty(); } m_moveProperty->m_walkableAreas.push_back(id); m_moveProperty->m_walkableAreas.sort(); m_moveProperty->m_walkableAreas.unique(); } void Object::removeWalkableArea(const std::string& id) { if (!m_moveProperty) { return; } m_moveProperty-> m_walkableAreas.remove(id); } std::list Object::getWalkableAreas() const { if (m_moveProperty) { return m_moveProperty->m_walkableAreas; } if (m_inherited) { return m_inherited->getWalkableAreas(); } return std::list(); } bool Object::operator==(const Object& obj) const { return m_id == obj.getId() && m_namespace == obj.getNamespace(); } bool Object::operator!=(const Object& obj) const { return m_id != obj.getId() || m_namespace != obj.getNamespace(); } } fifengine-0.4.2/engine/core/model/metamodel/object.h000066400000000000000000000335001341615052600223360ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2006-2012 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_PROTOTYPE_H #define FIFE_PROTOTYPE_H // Standard C++ library includes #include #include #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/resource/resource.h" #include "util/math/angles.h" namespace FIFE { class Action; class IPather; class IVisual; /** Object class * * Objects describe the properties of objects. * Objects may inherit default values from another object. * */ class Object { public: /** Constructor * An object may optionally inherit default attributes * from another object. This object may override these * defaults, but it may not CHANGE the inherited values. * * Objects are created by calling Model::createObject, thus * this method should really be called only by Model or test code * @see Model in model/model.h for creation of objects. */ Object(const std::string& identifier, const std::string& name_space, Object* inherited=NULL); /** Destructor */ ~Object(); const std::string& getId() const { return m_id; } const std::string& getNamespace() const { return m_namespace; } /** Sets the identifier for this object. */ void setId(const std::string& id) { m_id = id; } /** Adds new action with given id. In case there is action already * with given id, returns it instead of new object * Action instances are managed by object * @param identifier An identifier or name to give the action. * @param is_default if true, becomes default action for this object * default objects are used e.g. when showing them on editor. * if multiple default actions are created, last one remains. * In case there's no explicit default action created, first * action created becomes the default */ Action* createAction(const std::string& identifier, bool is_default=false); /** Gets action with given id. If not found, returns NULL */ Action* getAction(const std::string& identifier, bool deepsearch = true) const; /** Gets all available action ids of the object and packs them into a list */ std::list getActionIds() const; /** Sets default action assigned to this object. If not available, then default action is not changed. */ void setDefaultAction(const std::string& identifier); /** Gets default action assigned to this object. If none available, returns NULL */ Action* getDefaultAction() const; /** Sets pather used by instances created out of this object */ void setPather(IPather* pather); /** Gets associated pather */ IPather* getPather() const; /** Gets an object where this object was inherited from * @see inherited object */ Object* getInherited() const; /** Sets visualization to be used. Transfers ownership. */ void adoptVisual(IVisual* visual); /** Gets used visualization */ template T* getVisual() const { return reinterpret_cast(m_visual); } /** Sets if object blocks movement */ void setBlocking(bool blocking); /** Gets if object blocks movement */ bool isBlocking() const; /** Set to true, if object is such that it doesn't move */ void setStatic(bool stat); /** Gets if object moves */ bool isStatic() const; void setFilename(const std::string& file); const std::string& getFilename() const; /** Sets the cell stack position. * Is used to determine which Instance is on top of a cell. * @param position The stack position on a cell, range 0-255. */ void setCellStackPosition(uint8_t position); /** Returns cell stack position. * @return The stack position on a cell, range 0-255. */ uint8_t getCellStackPosition() const; /** Gets if object uses special cost. * @return A boolean, true if the object uses special cost, otherwise false. */ bool isSpecialCost() const; /** Sets the cost id. * @param cost A const reference to a string which contains the identifier. */ void setCostId(const std::string& cost); /** Returns the cost id. * @return A const reference to a string which contains the identifier. */ std::string getCostId() const; /** Sets the cost. * @param cost A double which value is used as cost. */ void setCost(double cost); /** Returns the cost. * @return A double which value is used as cost. */ double getCost() const; /** Gets if object uses special speed modifier. * @return A boolean, true if the object uses special speed, otherwise false. */ bool isSpecialSpeed() const; /** Sets the speed modifier. * @param cost A double which value is used as speed multiplier. */ void setSpeed(double cost); /** Returns the speed modifier. * @return A double which value is used as speed multiplier. */ double getSpeed() const; /** Gets if object uses special cost. * @return A boolean, true if the object uses special cost, otherwise false. */ bool isMultiObject() const; /** Adds a multi part identifier. * @param partId A const reference to a string that holds the identifier. */ void addMultiPartId(const std::string& partId); /** Returns all multi part identifiers. * @return A const reference to a list that holds the identifiers. */ std::list getMultiPartIds() const; /** Removes a multi part identifier. * @param partId A const reference to a string that holds the identifier. */ void removeMultiPartId(const std::string& partId); /** Removes all multi part identifiers. */ void removeAllMultiPartIds(); /** Gets if object is a part of a multi object. * @return A boolean, true if the object is a part of a multi object, otherwise false. */ bool isMultiPart() const; /** Sets the object as a part of a multi object. * @param part A boolean, true if the object is a part of a multi object, otherwise false. */ void setMultiPart(bool part); /** Adds a object as a part of a multi object. * @param obj A pointer to the multi part object. */ void addMultiPart(Object* obj); /** Returns all multi part objects. * @return A const reference to a set that holds the objects. */ std::set getMultiParts() const; /** Removes a multi part object. * @param obj A pointer to the part object. */ void removeMultiPart(Object* obj); /** Removes all multi part objects. */ void removeMultiParts(); /** Adds rotationally dependent coordinates for this object part. * @param rotation A integer value for the angle. * @param coord A ModelCoordinate as relative coordinate, 0,0 is always the multi object center. */ void addMultiPartCoordinate(int32_t rotation, ModelCoordinate coord); /** Returns all rotationally dependent coordinates from this object part. * @return A const reference to a multimap which contains the coordinates per rotation. */ std::multimap getMultiPartCoordinates() const; /** Returns all object part coordinates for the given rotation. * @param rotation A integer value for the angle. * @return A vector which contains the coordinates. */ std::vector getMultiPartCoordinates(int32_t rotation) const; /** Returns all multi object coordinates for the given rotation. * @param rotation A integer value for the angle. * @return A vector which contains the coordinates. */ std::vector getMultiObjectCoordinates(int32_t rotation) const; /** Sets the rotation anchor for this multi object. * Is used to rotate the images from multi part objects around this relative point, * default is 0.0, 0.0 the center of the multi object. * @param anchor A const reference to a ExactModelCoordinate that holds the anchor coordinate. */ void setRotationAnchor(const ExactModelCoordinate& anchor); /** Returns the rotation anchor for this multi object. * @return A const reference to a ExactModelCoordinate that holds the anchor coordinate. */ ExactModelCoordinate getRotationAnchor() const; /** Sets the rotation to restricted. * If this is enabled the multi object uses only rotation values are which based on multi coordinates. * @param restrict A boolean, if true the rotation will be restricted, false for free rotation. */ void setRestrictedRotation(bool restrict); /** Gets if object uses restricted rotations. * @return A boolean, true if the object uses restricted rotations, otherwise false. */ bool isRestrictedRotation() const; /** Returns the most obvious rotation, based on multi coordinates. * @param rotation A integer value for the original angle. * @return A integer value for the obvious rotation. */ int32_t getRestrictedRotation(int32_t rotation); /** Sets z-step range for object. * 0 means it can not climb, with a value of 1 it can climb a z-height of 1 and so on. * @param zRange The z-step range as int. */ void setZStepRange(int32_t zRange); /** Returns z-step range from object. In case it is not limited -1 is returned. * @return The z-step range as int. */ int32_t getZStepRange() const; /** Sets the area id that the instances of this object adds to their cells. * @param id The area id, default is "". */ void setArea(const std::string& id); /** Gets the area id that the instances of this object adds to their cells. * @return The area id, default is "". */ std::string getArea() const; /** Adds an area id to walkable area. The instances of this object * can only walk on cells that part of the given areas. * @param id The area id. */ void addWalkableArea(const std::string& id); /** Removes an area id from walkable areas. * @param id The area id. */ void removeWalkableArea(const std::string& id); /** Returns a list that contains all walkable area ids. * @return A list that contains all walkable area ids as strings. */ std::list getWalkableAreas() const; /** Compares equality of two objects */ bool operator==(const Object& obj) const; /** Compares unequality of two objects */ bool operator!=(const Object& obj) const; private: //! identifier std::string m_id; //! namespace std::string m_namespace; //! filename std::string m_filename; //! pointer to inherited object Object* m_inherited; //! pointer to object visual IVisual* m_visual; class BasicObjectProperty { public: //! Constructor BasicObjectProperty(); //! Destructor ~BasicObjectProperty(); //! area id std::string m_area; //! holds action ids and assigned actions std::map* m_actions; //! pointer to default action Action* m_defaultAction; //! indicates if object blocks bool m_blocking; //remove this with a if (MovableObjectProperty) //! indicates if object is static bool m_static; //! position on cellstack uint8_t m_cellStack; }; class MovableObjectProperty { public: //! Constructor MovableObjectProperty(); //! Destructor ~MovableObjectProperty(); //! pointer to pathfinder IPather* m_pather; //! cost identifier std::string m_costId; //! cost value, default 1.0 double m_cost; //! speed modifier, default 1.0 double m_speed; //! z range value int32_t m_zRange; //! list contains walkable area ids std::list m_walkableAreas; }; class MultiObjectProperty { public: //! Constructor MultiObjectProperty(); //! Destructor ~MultiObjectProperty(); //! indicates if object is part of multi object bool m_multiPart; //! indicates if object uses only restricted rotations bool m_restrictedRotation; //! list with part identifiers std::list m_multiPartIds; //! rotation anchor ExactModelCoordinate m_rotationAnchor; //! set contains part objects std::set m_multiParts; //! part object angles type_angle2id m_partAngleMap; //! multi object angles type_angle2id m_multiAngleMap; //! part object coordinates std::multimap m_multiPartCoordinates; //! multi object coordinates std::multimap m_multiObjectCoordinates; }; BasicObjectProperty* m_basicProperty; MovableObjectProperty* m_moveProperty; MultiObjectProperty* m_multiProperty; }; } //FIFE #endif fifengine-0.4.2/engine/core/model/metamodel/object.i000066400000000000000000000032471341615052600223440ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fife %{ #include "model/metamodel/object.h" %} %include "util/base/utilbase.i" %include "model/metamodel/ivisual.i" %include "model/metamodel/object.h" fifengine-0.4.2/engine/core/model/metamodel/timeprovider.cpp000066400000000000000000000062111341615052600241330ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/exception.h" #include "util/time/timemanager.h" #include "timeprovider.h" namespace FIFE { TimeProvider::TimeProvider(TimeProvider* master): m_master(master), m_multiplier(1.0) { m_time_static = m_time_scaled = master ? master->getGameTime() : TimeManager::instance()->getTime(); } TimeProvider::~TimeProvider() {} void TimeProvider::setMultiplier(float multiplier) { if (multiplier < 0.0) { throw NotSupported("Negative time multiplier are not supported"); } m_time_static = getPreciseGameTime(); m_time_scaled = m_master ? m_master->getPreciseGameTime() : static_cast(TimeManager::instance()->getTime()); m_multiplier = multiplier; } float TimeProvider::getMultiplier() const { return m_multiplier; } float TimeProvider::getTotalMultiplier() const { if (m_master) { return m_master->getTotalMultiplier() * m_multiplier; } else { return m_multiplier; } } uint32_t TimeProvider::getGameTime() const { return static_cast(getPreciseGameTime()); } double TimeProvider::getPreciseGameTime() const { return m_time_static + m_multiplier * ((m_master ? m_master->getPreciseGameTime() : static_cast(TimeManager::instance()->getTime())) - m_time_scaled); } uint32_t scaleTime(float multiplier, uint32_t ticks) { return static_cast(static_cast(ticks) * multiplier); } } fifengine-0.4.2/engine/core/model/metamodel/timeprovider.h000066400000000000000000000065511341615052600236070ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_TIME_PROVIDER_H #define FIFE_TIME_PROVIDER_H // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/fife_stdint.h" #include "util/base/exception.h" namespace FIFE { /** Timeprovider is an utility providing time management functionality * You can have hierarchy of time providers, whose multiplier can be changed independently. * Changing providers upper in the hierarchy, changes also all subproviders with the same ratio */ class TimeProvider { public: /** Constructor * In case there there is no provider master, you can use NULL */ explicit TimeProvider(TimeProvider* master); ~TimeProvider(); /** With multiplier, you can adjust the time speed. 0.5 means time runs half as slow, * while 2.0 means it runs twice as fast */ void setMultiplier(float multiplier); /** @see setMultiplier. Returns mutliplier for this single provider */ float getMultiplier() const; /** @see setMultiplier. Returns mutliplier for whole chain of timeproviders * E.g. if master has multiplier 2.0 and this has 0.5, end result = 1.0 */ float getTotalMultiplier() const; /** Returns current game ticks, already scaled. */ uint32_t getGameTime() const; private: TimeProvider* m_master; float m_multiplier; double m_time_static, m_time_scaled; /** Returns current game ticks, already scaled, more precise. */ double getPreciseGameTime() const; }; /** Utility function to calculate time scaling. Mostly done to avoid littering other code * with related casting * @return multiplier * ticks */ uint32_t scaleTime(float multiplier, uint32_t ticks); } //FIFE #endif fifengine-0.4.2/engine/core/model/metamodel/timeprovider.i000066400000000000000000000035011341615052600236000ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fife %{ #include "model/metamodel/timeprovider.h" %} namespace FIFE { class TimeProvider { public: TimeProvider(TimeProvider* master); ~TimeProvider(); void setMultiplier(float multiplier); float getMultiplier() const; float getTotalMultiplier() const; uint32_t getGameTime() const; }; } fifengine-0.4.2/engine/core/model/model.cpp000066400000000000000000000241351341615052600205600ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/structures/purge.h" #include "util/log/logger.h" #include "model/metamodel/ipather.h" #include "model/metamodel/object.h" #include "model/metamodel/grids/cellgrid.h" #include "structures/map.h" #include "structures/layer.h" #include "structures/instance.h" #include "util/base/exception.h" #include "view/rendererbase.h" #include "video/renderbackend.h" #include "model.h" namespace FIFE { static Logger _log(LM_MODEL); class ModelMapObserver : public MapChangeListener { Model* m_model; public: ModelMapObserver(Model* model) { m_model = model; } virtual ~ModelMapObserver() {} virtual void onMapChanged(Map* map, std::vector& changedLayers) { } virtual void onLayerCreate(Map* map, Layer* layer) { } virtual void onLayerDelete(Map* map, Layer* layer) { m_model->removeCellGrid(layer->getCellGrid()); } }; Model::Model(RenderBackend* renderbackend, const std::vector& renderers) : FifeClass(), m_lastNamespace(NULL), m_timeprovider(NULL), m_renderbackend(renderbackend), m_renderers(renderers){ m_mapObserver = new ModelMapObserver(this); } Model::~Model() { // first remove the map observer, we delete all grids anyway for (std::list::iterator it = m_maps.begin(); it != m_maps.end(); ++it) { (*it)->removeChangeListener(m_mapObserver); delete *it; } delete m_mapObserver; for(std::list::iterator nspace = m_namespaces.begin(); nspace != m_namespaces.end(); ++nspace) purge_map(nspace->second); purge(m_pathers); purge(m_createdGrids); purge(m_adoptedGrids); } Map* Model::createMap(const std::string& identifier) { std::list::const_iterator it = m_maps.begin(); for(; it != m_maps.end(); ++it) { if(identifier == (*it)->getId()) { throw NameClash(identifier); } } Map* map = new Map(identifier, m_renderbackend, m_renderers, &m_timeprovider); map->addChangeListener(m_mapObserver); m_maps.push_back(map); return map; } void Model::adoptPather(IPather* pather) { m_pathers.push_back(pather); } IPather* Model::getPather(const std::string& pathername) { std::vector::const_iterator it = m_pathers.begin(); for(; it != m_pathers.end(); ++it) { if ((*it)->getName() == pathername) { return *it; } } FL_WARN(_log, "No pather of requested type \"" + pathername + "\" found."); return NULL; } void Model::adoptCellGrid(CellGrid* grid) { m_adoptedGrids.push_back(grid); } CellGrid* Model::getCellGrid(const std::string& gridtype) { std::vector::const_iterator it = m_adoptedGrids.begin(); for(; it != m_adoptedGrids.end(); ++it) { if ((*it)->getType() == gridtype) { CellGrid* newcg = (*it)->clone(); m_createdGrids.push_back(newcg); return newcg; } } FL_WARN(_log, "No cellgrid of requested type \"" + gridtype + "\" found."); return NULL; } void Model::removeCellGrid(CellGrid* grid) { if (!grid) return; for (std::vector::iterator it = m_createdGrids.begin(); it != m_createdGrids.end(); ++it) { if (*it == grid) { delete *it; m_createdGrids.erase(it); return; } } } Map* Model::getMap(const std::string& identifier) const { std::list::const_iterator it = m_maps.begin(); for(; it != m_maps.end(); ++it) { if((*it)->getId() == identifier) return *it; } throw NotFound(std::string("Tried to get non-existent map: ") + identifier + "."); } void Model::deleteMap(Map* map) { std::list::iterator it = m_maps.begin(); for(; it != m_maps.end(); ++it) { if(*it == map) { delete *it; m_maps.erase(it); return; } } } uint32_t Model::getMapCount() const { return m_maps.size(); } void Model::deleteMaps() { // first remove the map observer, we delete all grids anyway for (std::list::iterator it = m_maps.begin(); it != m_maps.end(); ++it) { (*it)->removeChangeListener(m_mapObserver); delete *it; } m_maps.clear(); purge(m_createdGrids); m_createdGrids.clear(); } uint32_t Model::getActiveCameraCount() const { uint32_t count = 0; std::list::const_iterator it = m_maps.begin(); for(; it != m_maps.end(); ++it) { count += (*it)->getActiveCameraCount(); } return count; } std::list Model::getNamespaces() const { std::list namespace_list; std::list::const_iterator nspace = m_namespaces.begin(); for(; nspace != m_namespaces.end(); ++nspace) { namespace_list.push_back(nspace->first); } return namespace_list; } Object* Model::createObject(const std::string& identifier, const std::string& name_space, Object* parent) { // Find or create namespace namespace_t* nspace = selectNamespace(name_space); if(!nspace) { m_namespaces.push_back(namespace_t(name_space,objectmap_t())); nspace = selectNamespace(name_space); } // Check for nameclashes objectmap_t::const_iterator it = nspace->second.find(identifier); if( it != nspace->second.end() ) { throw NameClash(identifier); } // Finally insert & create Object* object = new Object(identifier, name_space, parent); nspace->second[identifier] = object; return object; } bool Model::deleteObject(Object* object) { // WARNING: This code has obviously not been tested (thoroughly). // Check if any instances exist. If yes - bail out. std::list::const_iterator jt; std::vector::const_iterator kt; for(std::list::iterator it = m_maps.begin(); it != m_maps.end(); ++it) { for(jt = (*it)->getLayers().begin(); jt != (*it)->getLayers().end(); ++jt) { for(kt = (*jt)->getInstances().begin(); kt != (*jt)->getInstances().end(); ++kt) { Object* o = (*kt)->getObject(); if(o == object) { return false; } } } } // Check if the namespace exists namespace_t* nspace = selectNamespace(object->getNamespace()); if(!nspace) return true; // If yes - delete+erase object. objectmap_t::iterator it = nspace->second.find(object->getId()); if( it != nspace->second.end()) { delete it->second; nspace->second.erase(it); } return true; } bool Model::deleteObjects() { // If we have layers with instances - bail out. std::list::const_iterator jt; for(std::list::iterator it = m_maps.begin(); it != m_maps.end(); ++it) { for(jt = (*it)->getLayers().begin(); jt != (*it)->getLayers().end(); ++jt) { if((*jt)->hasInstances()) return false; } } // Otherwise delete every object in every namespace std::list::iterator nspace = m_namespaces.begin(); while(nspace != m_namespaces.end()) { objectmap_t::iterator it = nspace->second.begin(); for(; it != nspace->second.end(); ++it) { delete it->second; } nspace = m_namespaces.erase(nspace); } m_lastNamespace = 0; return true; } Object* Model::getObject(const std::string& id, const std::string& name_space) { namespace_t* nspace = selectNamespace(name_space); if(nspace) { objectmap_t::iterator it = nspace->second.find(id); if( it != nspace->second.end() ) return it->second; } return NULL; } std::list Model::getObjects(const std::string& name_space) const { std::list object_list; const namespace_t* nspace = selectNamespace(name_space); if(nspace) { objectmap_t::const_iterator it = nspace->second.begin(); for(; it != nspace->second.end(); ++it ) object_list.push_back(it->second); } return object_list; } const Model::namespace_t* Model::selectNamespace(const std::string& name_space) const { std::list::const_iterator nspace = m_namespaces.begin(); for(; nspace != m_namespaces.end(); ++nspace) { if( nspace->first == name_space ) { return &(*nspace); } } return NULL; } Model::namespace_t* Model::selectNamespace(const std::string& name_space) { if( m_lastNamespace && m_lastNamespace->first == name_space ) return m_lastNamespace; std::list::iterator nspace = m_namespaces.begin(); for(; nspace != m_namespaces.end(); ++nspace) { if( nspace->first == name_space ) { m_lastNamespace = &(*nspace); return m_lastNamespace; } } m_lastNamespace = 0; return NULL; } void Model::update() { std::list::iterator it = m_maps.begin(); for(; it != m_maps.end(); ++it) { (*it)->update(); } std::vector::iterator jt = m_pathers.begin(); for(; jt != m_pathers.end(); ++jt) { (*jt)->update(); } } } //FIFE fifengine-0.4.2/engine/core/model/model.h000066400000000000000000000144601341615052600202250ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2006-2011 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_MODEL_H #define FIFE_MODEL_H // Standard C++ library includes #include #include #include #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/fifeclass.h" #include "model/structures/map.h" #include "model/metamodel/timeprovider.h" namespace FIFE { class RenderBackend; class RendererBase; class MetaModel; class ModelMapObserver; class IPather; class Object; /** * A model is a facade for everything in the model. */ class Model: public FifeClass { public: /** Constructor * */ Model(RenderBackend* renderbackend, const std::vector& renderers); /** Destructor * */ ~Model(); /** Add a map this model, and get a pointer to it. * The returned pointer is owned by the Model, so don't delete it! */ Map* createMap(const std::string& identifier); /** Remove a map from this model */ void deleteMap(Map*); /** Get all the maps in the model. */ const std::list& getMaps() const { return m_maps; } /** Get a map. * * @param identifier the id of the map to be found. */ Map* getMap(const std::string& identifier) const; /** Return the number of maps in this model */ uint32_t getMapCount() const; /** Removes all maps from this model */ void deleteMaps(); /** Return the number of enabled cameras in this model. */ uint32_t getActiveCameraCount() const; /** Get a list of namespaces currently referenced by objects in the metamodel. */ std::list getNamespaces() const; /** Add an object to the metamodel. * * @param identifier A string for identifying this object; must be unique for its namespace. * @param name_space A string identifying the namespace this object resides in. * @param parent Objects may optionally inherit values from a parent object. * @note This object belongs to the model, so don't delete the returned pointer */ Object* createObject(const std::string& identifier, const std::string& name_space, Object* parent=0); /** Attempt to remove an object from the model * Fails and returns false if the object is referenced by an instance. */ bool deleteObject(Object*); /** Attempt to remove all objects from the model * Fails and returns false if any maps with instances are present. */ bool deleteObjects(); /** Get an object by its id. Returns 0 if object is not found. */ Object* getObject(const std::string& id, const std::string& name_space); /** Get all the objects in the given namespace. */ std::list getObjects(const std::string& name_space) const; /** Adds pather to model. Moves ownership to model */ void adoptPather(IPather* pather); /** Returns pather corresponding given name. If none found, returns NULL */ IPather* getPather(const std::string& pathername); /** Adds cellgrid to model. Moves ownership to model */ void adoptCellGrid(CellGrid* grid); /** Returns new copy of cellgrid corresponding given name. If none found, returns NULL */ CellGrid* getCellGrid(const std::string& gridtype); /** Removes cellgrid from model. */ void removeCellGrid(CellGrid* grid); /** Called periodically to update events on model */ void update(); /** Sets speed for the model. With speed 1.0, everything runs with normal speed. * With speed 2.0, clock is ticking twice as fast. With 0, everything gets paused. * Negavtive values are not supported (throws NotSupported exception). */ void setTimeMultiplier(float multip) { m_timeprovider.setMultiplier(multip); } /** Gets model speed. @see setTimeMultiplier. */ double getTimeMultiplier() const { return m_timeprovider.getMultiplier(); } private: // Map observer, currently only used to delete CellGrids from deleted layers ModelMapObserver* m_mapObserver; std::list m_maps; typedef std::map objectmap_t; typedef std::pair namespace_t; std::list m_namespaces; /// Used to remember last 'selected' namespace. namespace_t* m_lastNamespace; /// Convenience function to retrieve a pointer to a namespace or NULL if it doesn't exist namespace_t* selectNamespace(const std::string& name_space); /// Convenience function to retrieve a pointer to a namespace or NULL if it doesn't exist const namespace_t* selectNamespace(const std::string& name_space) const; std::vector m_pathers; std::vector m_createdGrids; std::vector m_adoptedGrids; TimeProvider m_timeprovider; RenderBackend* m_renderbackend; std::vector m_renderers; }; }; //FIFE #endif fifengine-0.4.2/engine/core/model/model.i000066400000000000000000000053031341615052600202220ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2006-2011 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fife %{ #include "model/model.h" %} namespace FIFE { class Map; class Object; } namespace std { %template(StringList) list; %template(ObjectList) list; %template(MapList) list; } namespace FIFE { class IPather; class Model: public FifeClass { public: Model(RenderBackend* renderbackend, const std::vector& renderers); ~Model(); Map* createMap(const std::string& identifier); void deleteMap(Map*); const std::list& getMaps() const; Map* getMap(const std::string& id) const; std::list getNamespaces() const; Object* createObject(const std::string& identifier, const std::string& name_space, Object* parent=0); bool deleteObject(Object*); bool deleteObjects(); Object* getObject(const std::string& id, const std::string& name_space); std::list getObjects(const std::string& name_space) const; uint32_t getMapCount() const; void deleteMaps(); void adoptPather(IPather* pather); IPather* getPather(const std::string& pathername); CellGrid* getCellGrid(const std::string& gridtype); void setTimeMultiplier(float multip); double getTimeMultiplier() const; }; } fifengine-0.4.2/engine/core/model/structures/000077500000000000000000000000001341615052600211725ustar00rootroot00000000000000fifengine-0.4.2/engine/core/model/structures/cell.cpp000066400000000000000000000305461341615052600226250ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/log/logger.h" #include "view/visual.h" #include "cell.h" #include "cellcache.h" #include "instance.h" #include "layer.h" namespace FIFE { static Logger _log(LM_STRUCTURES); Cell::Cell(int32_t coordint, ModelCoordinate coordinate, Layer* layer): m_coordId(coordint), m_coordinate(coordinate), m_layer(layer), m_zone(NULL), m_transition(NULL), m_inserted(false), m_protect(false) { } Cell::~Cell() { // calls CellDeleteListener, e.g. for transition if (!m_deleteListeners.empty()) { std::vector::iterator it = m_deleteListeners.begin(); for (; it != m_deleteListeners.end(); ++it) { if (*it) { (*it)->onCellDeleted(this); } } } // remove cell from zone if (m_zone) { m_zone->removeCell(this); } // delete m_transition; if (m_transition) { deleteTransition(); } // remove cell from cache (costs, narrow, area) m_layer->getCellCache()->removeCell(this); } void Cell::addInstances(const std::list& instances) { CellCache* cache = m_layer->getCellCache(); for (std::list::const_iterator it = instances.begin(); it != instances.end(); ++it) { std::pair::iterator, bool> ret = m_instances.insert(*it); if (ret.second) { if ((*it)->isSpecialCost()) { cache->registerCost((*it)->getCostId(), (*it)->getCost()); cache->addCellToCost((*it)->getCostId(), this); } if ((*it)->isSpecialSpeed()) { cache->setSpeedMultiplier(this, (*it)->getSpeed()); } if ((*it)->getObject()->getArea() != "") { cache->addCellToArea((*it)->getObject()->getArea(), this); } callOnInstanceEntered(*it); } } updateCellBlockingInfo(); } void Cell::addInstance(Instance* instance) { std::pair::iterator, bool> ret = m_instances.insert(instance); if (ret.second) { CellCache* cache = m_layer->getCellCache(); if (instance->isSpecialCost()) { cache->registerCost(instance->getCostId(), instance->getCost()); cache->addCellToCost(instance->getCostId(), this); } if (instance->isSpecialSpeed()) { cache->setSpeedMultiplier(this, instance->getSpeed()); } if (instance->getObject()->getArea() != "") { cache->addCellToArea(instance->getObject()->getArea(), this); } callOnInstanceEntered(instance); updateCellBlockingInfo(); } } void Cell::changeInstance(Instance* instance) { updateCellBlockingInfo(); } void Cell::removeInstance(Instance* instance) { if (m_instances.erase(instance) == 0) { FL_ERR(_log, "Tried to remove an instance from cell, but given instance could not be found."); return; } CellCache* cache = m_layer->getCellCache(); if (instance->isSpecialCost()) { cache->removeCellFromCost(instance->getCostId(), this); } if (instance->isSpecialSpeed()) { cache->resetSpeedMultiplier(this); // try to find other speed value if (!m_instances.empty()) { std::set::iterator it = m_instances.begin(); for (; it != m_instances.end(); ++it) { if ((*it)->isSpecialSpeed()) { cache->setSpeedMultiplier(this, (*it)->getSpeed()); break; } } } } if (instance->getObject()->getArea() != "") { cache->removeCellFromArea(instance->getObject()->getArea(), this); } callOnInstanceExited(instance); updateCellBlockingInfo(); } bool Cell::isNeighbor(Cell* cell) { std::vector::iterator it = m_neighbors.begin(); for (; it != m_neighbors.end(); ++it) { if (*it == cell) { return true; } } return false; } void Cell::updateCellBlockingInfo() { CellTypeInfo old_type = m_type; m_coordinate.z = MIN_CELL_Z; if (!m_instances.empty()) { int32_t pos = -1; bool cellblock = (m_type == CTYPE_CELL_NO_BLOCKER || m_type == CTYPE_CELL_BLOCKER); for (std::set::iterator it = m_instances.begin(); it != m_instances.end(); ++it) { if (cellblock) { continue; } uint8_t stackpos = (*it)->getCellStackPosition(); if (stackpos < pos) { continue; } // update cell z if (m_coordinate.z < (*it)->getLocationRef().getLayerCoordinates().z && (*it)->getObject()->isStatic()) { m_coordinate.z = (*it)->getLocationRef().getLayerCoordinates().z; } if ((*it)->getCellStackPosition() > pos) { pos = (*it)->getCellStackPosition(); if ((*it)->isBlocking()) { if (!(*it)->getObject()->isStatic()) { m_type = CTYPE_DYNAMIC_BLOCKER; } else { m_type = CTYPE_STATIC_BLOCKER; } } else { m_type = CTYPE_NO_BLOCKER; } } else { // if positions are equal then static_blockers win if ((*it)->isBlocking() && m_type != CTYPE_STATIC_BLOCKER) { if (!(*it)->getObject()->isStatic()) { m_type = CTYPE_DYNAMIC_BLOCKER; } else { m_type = CTYPE_STATIC_BLOCKER; } } } } } else { if (m_type == CTYPE_STATIC_BLOCKER || m_type == CTYPE_DYNAMIC_BLOCKER) { m_type = CTYPE_NO_BLOCKER; } } if (Mathd::Equal(m_coordinate.z, MIN_CELL_Z)) { m_coordinate.z = 0; } if (old_type != m_type) { bool block = (m_type == CTYPE_STATIC_BLOCKER || m_type == CTYPE_DYNAMIC_BLOCKER || m_type == CTYPE_CELL_BLOCKER); m_layer->getCellCache()->setBlockingUpdate(true); callOnBlockingChanged(block); } } void Cell::updateCellInfo() { updateCellBlockingInfo(); if (!m_deleteListeners.empty()) { m_deleteListeners.erase( std::remove(m_deleteListeners.begin(), m_deleteListeners.end(), (CellDeleteListener*)NULL), m_deleteListeners.end()); } if (!m_changeListeners.empty()) { m_changeListeners.erase( std::remove(m_changeListeners.begin(), m_changeListeners.end(), (CellChangeListener*)NULL), m_changeListeners.end()); } } bool Cell::defaultCost() { return m_layer->getCellCache()->isDefaultCost(this); } void Cell::setCostMultiplier(double multi) { m_layer->getCellCache()->setCostMultiplier(this, multi); } double Cell::getCostMultiplier() { return m_layer->getCellCache()->getCostMultiplier(this); } void Cell::resetCostMultiplier() { m_layer->getCellCache()->resetCostMultiplier(this); } bool Cell::defaultSpeed() { return m_layer->getCellCache()->isDefaultSpeed(this); } void Cell::setSpeedMultiplier(double multi) { m_layer->getCellCache()->setSpeedMultiplier(this, multi); } double Cell::getSpeedMultiplier() { return m_layer->getCellCache()->getSpeedMultiplier(this); } void Cell::resetSpeedMultiplier() { m_layer->getCellCache()->resetSpeedMultiplier(this); } Zone* Cell::getZone() { return m_zone; } void Cell::setZone(Zone* zone) { m_zone = zone; } void Cell::resetZone() { m_inserted = false; m_zone = NULL; } bool Cell::isInserted() { return m_inserted; } void Cell::setInserted(bool inserted) { m_inserted = inserted; } bool Cell::isZoneProtected() { return m_protect; } void Cell::setZoneProtected(bool protect) { m_protect = protect; } CellTypeInfo Cell::getCellType() { return m_type; } void Cell::setCellType(CellTypeInfo type) { m_type = type; } const std::set& Cell::getInstances() { return m_instances; } void Cell::setCellId(int32_t id) { m_coordId = id; } int32_t Cell::getCellId() { return m_coordId; } const ModelCoordinate Cell::getLayerCoordinates() const { return m_coordinate; } void Cell::addNeighbor(Cell* cell) { m_neighbors.push_back(cell); } const std::vector& Cell::getNeighbors() { return m_neighbors; } void Cell::resetNeighbors() { m_neighbors.clear(); if (m_transition) { CellCache* cache = m_transition->m_layer->getCellCache(); if (cache) { Cell* cell = cache->getCell(m_transition->m_mc); if (cell) { m_neighbors.push_back(cell); } } } } Layer* Cell::getLayer() { return m_layer; } void Cell::createTransition(Layer* layer, const ModelCoordinate& mc, bool immediate) { TransitionInfo* trans = new TransitionInfo(layer); // if layers are the same then it's a portal if (layer != m_layer) { trans->m_difflayer = true; } trans->m_immediate = immediate; trans->m_mc = mc; deleteTransition(); m_transition = trans; Cell* c = layer->getCellCache()->getCell(mc); if (c) { m_neighbors.push_back(c); c->addDeleteListener(this); m_layer->getCellCache()->addTransition(this); } else { delete m_transition; m_transition = NULL; } } void Cell::deleteTransition() { if (m_transition) { Cell* oldc = m_transition->m_layer->getCellCache()->getCell(m_transition->m_mc); std::vector::iterator it = m_neighbors.begin(); for (; it != m_neighbors.end(); ++it) { if (*it == oldc) { m_neighbors.erase(it); break; } } oldc->removeDeleteListener(this); m_layer->getCellCache()->removeTransition(this); delete m_transition; m_transition = NULL; } } TransitionInfo* Cell::getTransition() { return m_transition; } void Cell::addDeleteListener(CellDeleteListener* listener) { m_deleteListeners.push_back(listener); } void Cell::removeDeleteListener(CellDeleteListener* listener) { std::vector::iterator it = m_deleteListeners.begin(); for (; it != m_deleteListeners.end(); ++it) { if (*it == listener) { *it = NULL; break; } } } void Cell::onCellDeleted(Cell* cell) { std::vector::iterator it = m_neighbors.begin(); for (; it != m_neighbors.end(); ++it) { if (*it == cell) { deleteTransition(); break; } } } void Cell::addChangeListener(CellChangeListener* listener) { m_changeListeners.push_back(listener); } void Cell::removeChangeListener(CellChangeListener* listener) { std::vector::iterator it = m_changeListeners.begin(); for (; it != m_changeListeners.end(); ++it) { if (*it == listener) { *it = NULL; break; } } } void Cell::callOnInstanceEntered(Instance* instance) { if (m_changeListeners.empty()) { return; } std::vector::iterator i = m_changeListeners.begin(); while (i != m_changeListeners.end()) { if (*i) { (*i)->onInstanceEnteredCell(this, instance); } ++i; } } void Cell::callOnInstanceExited(Instance* instance) { if (m_changeListeners.empty()) { return; } std::vector::iterator i = m_changeListeners.begin(); while (i != m_changeListeners.end()) { if (*i) { (*i)->onInstanceExitedCell(this, instance); } ++i; } } void Cell::callOnBlockingChanged(bool blocks) { if (m_changeListeners.empty()) { return; } std::vector::iterator i = m_changeListeners.begin(); while (i != m_changeListeners.end()) { if (*i) { (*i)->onBlockingChangedCell(this, m_type, blocks); } ++i; } } } // FIFE fifengine-0.4.2/engine/core/model/structures/cell.h000066400000000000000000000275331341615052600222740ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_CELL_H #define FIFE_CELL_H // Standard C++ library includes #include #include #include #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/fifeclass.h" #include "model/metamodel/modelcoords.h" namespace FIFE { class Instance; class Layer; class Cell; class Zone; static const double MIN_CELL_Z = -9999999; /** Defines different blocker types. * * CTYPE_NO_BLOCKER means there is no blocker. * CTYPE_STATIC_BLOCKER means there is at least one blocking instance which is static. * CTYPE_DYNAMIC_BLOCKER means there is at least one blocking instance which is not static. * CTYPE_CELL_NO_BLOCKER means there will never be a blocker. Regardless of the instances on this cell. * CTYPE_CELL_BLOCKER means there will always be a blocker. Regardless of the instances on this cell. */ enum CellType { CTYPE_NO_BLOCKER = 0, CTYPE_CELL_NO_BLOCKER = 1, CTYPE_DYNAMIC_BLOCKER = 2, CTYPE_STATIC_BLOCKER = 3, CTYPE_CELL_BLOCKER = 4 }; typedef uint8_t CellTypeInfo; /** Simple class to hold the data for transistions. */ class TransitionInfo { public: TransitionInfo(Layer* layer) { m_layer = layer; m_difflayer = false; m_immediate = true;} ~TransitionInfo() {}; //! target layer Layer* m_layer; //! target coordinates ModelCoordinate m_mc; //! is target on another layer bool m_difflayer; //! use immediate bool m_immediate; }; /** Listener interface for deletions happening on a cell, used for transistions. */ class CellDeleteListener { public: virtual ~CellDeleteListener() {}; /** Called when a cell gets deleted. * @param cell which will be deleted. */ virtual void onCellDeleted(Cell* cell) = 0; }; /** Listener interface for changes happening on a cell. */ class CellChangeListener { public: virtual ~CellChangeListener() {}; /** Called when some instance entered the cell. * @param cell where enter occurred. * @param instance which enter the cell. */ virtual void onInstanceEnteredCell(Cell* cell, Instance* instance) = 0; /** Called when some instance exited the cell. * @param cell where exit occurred. * @param instance which exit the cell. */ virtual void onInstanceExitedCell(Cell* cell, Instance* instance) = 0; /** Called when some instance changed its blocking property. * @param cell where exit occurred. * @param type blocking type @see CellType. * @param blocks true if the CellType indicates the cell as a blocker, otherwise false. */ virtual void onBlockingChangedCell(Cell* cell, CellTypeInfo type, bool blocks) = 0; }; /** A basic cell on a CellCache. */ class Cell: public FifeClass, public CellDeleteListener { public: /** Constructor * @param coordint A integer value that represents the cell identifier. Based on coordinates. * @param coordinate A ModelCoordinate that specifies the coordinates of the cell. * @param layer A pointer to the layer which is associated with the cell. */ Cell(int32_t coordint, ModelCoordinate coordinate, Layer* layer); /** Destructor */ ~Cell(); /** Adds instances to this cell. * @param instances A const reference to list that contains instances. */ void addInstances(const std::list& instances); /** Adds a instance to this cell. * @param instance A pointer to the instance. */ void addInstance(Instance* instance); /** Changes a instance on this cell. * @param instance A pointer to the instance. */ void changeInstance(Instance* instance); /** Removes a instance from this cell. * @param instance A pointer to the instance. */ void removeInstance(Instance* instance); /** Called to check if given cell is a neighbor. * @param cell A pointer to cell. * @return True if cell is a neighbor, otherwise false. */ bool isNeighbor(Cell* cell); /** Called to update cell data. * @return True if cell was changed since the last update, false otherwise. */ void updateCellInfo(); /** Returns if cell use default cost. * @return True if the cell use the default cost, otherwise false. */ bool defaultCost(); /** Changes the cell cost. * @param multi A double its value is used instead of the default cost. */ void setCostMultiplier(double multi); /** Returns the current cell cost. * @return The currently used cost value as a double. */ double getCostMultiplier(); /** Resets the cell cost to default, 1.0. */ void resetCostMultiplier(); /** Returns if cell use default speed. * @return True if the cell use the default speed, otherwise false. */ bool defaultSpeed(); /** Changes the cell speed. * @param multi A double its value is used instead of the default speed. */ void setSpeedMultiplier(double multi); /** Returns the current cell speed. * @return The currently used speed value as a double. */ double getSpeedMultiplier(); /** Resets the cell speed to default, 1.0. */ void resetSpeedMultiplier(); /** Returns zone. * @return A pointer to the zone. */ Zone* getZone(); /** Sets zone. * @param zone A pointer to the zone. */ void setZone(Zone* zone); /** Resets zone. * Zone pointer is NULL and isInserted() returns false. */ void resetZone(); /** Returns whether the cell is part of a zone. * @return True if the cell is inserted into a zone, otherwise false. */ bool isInserted(); /** Mark cell as inserted. * @param inserted A boolean, true marks the cell as inserted, false as not inserted. */ void setInserted(bool inserted); /** Returns whether the zone on this cell is protected. * @return True if the zone is protected, otherwise false. */ bool isZoneProtected(); /** Mark zone on this cell as protected. * @param protect A boolean, true marks the cell as inserted. */ void setZoneProtected(bool protect); /** Returns blocker type. * @see CellType */ CellTypeInfo getCellType(); /** Sets blocker type. * @see CellType */ void setCellType(CellTypeInfo type); /** Returns all instances on this cell. * @return A const reference to a set that refer to the instances on this cell. */ const std::set& getInstances(); /** Sets the cell identifier. * @param id A unique int value that is used as identifier. Based on the cell position. */ void setCellId(int32_t id); /** Returns the cell identifier. * @return A unique int value that is used as identifier. Based on the cell position. */ int32_t getCellId(); /** Returns the layer coordinates of this cell. * @return A const reference to a ModelCoordinate. */ const ModelCoordinate getLayerCoordinates() const; /** Adds a neighbor cell to this cell. * @param cell A pointer to the cell that should added as neighbor. */ void addNeighbor(Cell* cell); /** Returns the layer coordinates of this cell. * @return A const reference to a set of all neighbor cells. */ const std::vector& getNeighbors(); /** Removes all neighbors from cell. */ void resetNeighbors(); /** Returns the current layer. * @return A pointer to the currently used layer. */ Layer* getLayer(); /** Creates a transistion from this cell to the given layer and coordinates. * @param layer A pointer to the layer whereto the transition takes. * @param mc A const reference to a ModelCoordinate whereto the transition takes. * @param immediate A boolean, true means the transition is always used, if false the transistion is only used if it is a part of the path e.g. as an abbreviation. */ void createTransition(Layer* layer, const ModelCoordinate& mc, bool immediate = false); /** Removes the transistion from Cell and CellCache. */ void deleteTransition(); /** Returns the transition. * @return A pointer to the transition. */ TransitionInfo* getTransition(); /** Adds new cell delete listener. * @param listener A pointer to the listener. */ void addDeleteListener(CellDeleteListener* listener); /** Removes cell delete listener. * @param listener A pointer to the listener. */ void removeDeleteListener(CellDeleteListener* listener); /** Called when a cell gets deleted on this cell. If a delete listener was added. * @param cell A pointer to the cell which will be deleted. * @see CellDeleteListener */ void onCellDeleted(Cell* cell); /** Adds new cell change listener. * @param listener A pointer to the listener. * @see CellChangeListener */ void addChangeListener(CellChangeListener* listener); /** Removes cell change listener. * @param listener A pointer to the listener. * @see CellChangeListener */ void removeChangeListener(CellChangeListener* listener); /** Called when a instance entered this cell. * @param instance A pointer to the instance which will be entered. * @see CellChangeListener */ void callOnInstanceEntered(Instance* instance); /** Called when a instance exited this cell. * @param instance A pointer to the instance which will be exited. * @see CellChangeListener */ void callOnInstanceExited(Instance* instance); /** Called when the blocking property of this cell changed. * @param blocks A boolean, true mark the cell as blocker. * @see CellChangeListener */ void callOnBlockingChanged(bool blocks); private: void updateCellBlockingInfo(); //! holds coordinate as a unique integer id int32_t m_coordId; //! holds coordinate ModelCoordinate m_coordinate; //! parent layer Layer* m_layer; //! parent Zone Zone* m_zone; //! Pointer to Transistion TransitionInfo* m_transition; //! already inserted bool m_inserted; //! protected bool m_protect; //! CellType CellTypeInfo m_type; // contained Instances std::set m_instances; //! neighbor cells std::vector m_neighbors; //! delete listener std::vector m_deleteListeners; //! change listener std::vector m_changeListeners; }; } // FIFE #endif fifengine-0.4.2/engine/core/model/structures/cell.i000066400000000000000000000072341341615052600222710ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fife %{ #include "model/structures/cell.h" %} namespace FIFE { class Instance; class Layer; class Cell; enum CellType { CTYPE_NO_BLOCKER = 0, CTYPE_STATIC_BLOCKER = 1, CTYPE_DYNAMIC_BLOCKER = 2, CTYPE_CELL_NO_BLOCKER = 3, CTYPE_CELL_BLOCKER = 4 }; typedef uint8_t CellTypeInfo; %feature("director") CellChangeListener; class CellChangeListener { public: virtual ~CellChangeListener() {}; virtual void onInstanceEnteredCell(Cell* cell, Instance* instance) = 0; virtual void onInstanceExitedCell(Cell* cell, Instance* instance) = 0; virtual void onBlockingChangedCell(Cell* cell, CellTypeInfo type, bool blocks) = 0; }; %feature("director") CellDeleteListener; class CellDeleteListener { public: virtual ~CellDeleteListener() {}; virtual void onCellDeleted(Cell* cell) = 0; }; class Cell : public FifeClass { public: Cell(int32_t coordint, ModelCoordinate coordinate, Layer* layer); ~Cell(); void addInstances(const std::list& instances); void addInstance(Instance* instance); void changeInstance(Instance* instance); void removeInstance(Instance* instance); bool isNeighbor(Cell* cell); std::vector getNeighbors(); void updateCellInfo(); int32_t getCellId(); const ModelCoordinate getLayerCoordinates() const; bool defaultCost(); void setCostMultiplier(double multi); double getCostMultiplier(); void resetCostMultiplier(); bool defaultSpeed(); void setSpeedMultiplier(double multi); double getSpeedMultiplier(); void resetSpeedMultiplier(); const std::set& getInstances(); void setCellType(CellTypeInfo type); CellTypeInfo getCellType(); Layer* getLayer(); void createTransition(Layer* layer, const ModelCoordinate& mc); void deleteTransition(); void addChangeListener(CellChangeListener* listener); void removeChangeListener(CellChangeListener* listener); void addDeleteListener(CellDeleteListener* listener); void removeDeleteListener(CellDeleteListener* listener); }; } namespace std { %template(InstanceSet) set; %template(CellSet) set; %template(CellVector) vector; } fifengine-0.4.2/engine/core/model/structures/cellcache.cpp000066400000000000000000001302501341615052600236020ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "model/metamodel/grids/cellgrid.h" #include "util/log/logger.h" #include "util/structures/purge.h" #include "cellcache.h" #include "cell.h" #include "layer.h" #include "instance.h" #include "map.h" #include "instancetree.h" namespace FIFE { static Logger _log(LM_STRUCTURES); class CellCacheChangeListener : public LayerChangeListener { public: CellCacheChangeListener(Layer* layer) { m_layer = layer; } virtual ~CellCacheChangeListener() { } virtual void onLayerChanged(Layer* layer, std::vector& instances) { for(std::vector::iterator i = instances.begin(); i != instances.end(); ++i) { if ((*i)->isMultiCell()) { bool rotchange = ((*i)->getChangeInfo() & ICHANGE_ROTATION) == ICHANGE_ROTATION; bool locchange = ((*i)->getChangeInfo() & ICHANGE_LOC) == ICHANGE_LOC; bool celchange = ((*i)->getChangeInfo() & ICHANGE_CELL) == ICHANGE_CELL; bool blochange = ((*i)->getChangeInfo() & ICHANGE_BLOCK) == ICHANGE_BLOCK; if (!rotchange && !locchange && !celchange && !blochange) { continue; } int32_t oldrotation = (*i)->getOldRotation(); int32_t newrotation = (*i)->getRotation(); if (!rotchange) { oldrotation = newrotation; } if (rotchange || locchange || celchange) { // update visual positions (*i)->updateMultiInstances(); } if (rotchange || celchange) { // update cache positions ModelCoordinate oldmc; ModelCoordinate newmc; if (m_layer == layer) { oldmc = (*i)->getOldLocationRef().getLayerCoordinates(); newmc = (*i)->getLocationRef().getLayerCoordinates(); } else { oldmc = m_layer->getCellGrid()->toLayerCoordinates( layer->getCellGrid()->toMapCoordinates((*i)->getOldLocationRef().getExactLayerCoordinatesRef())); newmc = m_layer->getCellGrid()->toLayerCoordinates( layer->getCellGrid()->toMapCoordinates((*i)->getLocationRef().getExactLayerCoordinatesRef())); } if (!celchange) { oldmc = newmc; } CellGrid* cg = m_layer->getCellGrid(); const std::vector& multiinstances = (*i)->getMultiInstances(); std::vector::const_iterator it = multiinstances.begin(); for (; it != multiinstances.end(); ++it) { // remove std::vector coordinates = cg->toMultiCoordinates(oldmc, (*it)->getObject()->getMultiPartCoordinates(oldrotation)); std::vector::iterator mcit = coordinates.begin(); for (; mcit != coordinates.end(); ++mcit) { Cell* cell = m_layer->getCellCache()->getCell(*mcit); if (cell) { cell->removeInstance(*it); } } // add coordinates = cg->toMultiCoordinates(newmc, (*it)->getObject()->getMultiPartCoordinates(newrotation)); mcit = coordinates.begin(); for (; mcit != coordinates.end(); ++mcit) { Cell* cell = m_layer->getCellCache()->getCell(*mcit); if (cell) { cell->addInstance(*it); } } } if (celchange) { // leader instance Cell* oldcell = m_layer->getCellCache()->getCell(oldmc); Cell* newcell = m_layer->getCellCache()->getCell(newmc); if (oldcell == newcell) { continue; } if (oldcell) { oldcell->removeInstance(*i); } if (newcell) { newcell->addInstance(*i); } } } continue; } if ((*i)->getObject()->isMultiPart()) { continue; } if (((*i)->getChangeInfo() & ICHANGE_BLOCK) == ICHANGE_BLOCK) { ModelCoordinate mc; if (m_layer == layer) { mc = (*i)->getLocationRef().getLayerCoordinates(); } else { mc = m_layer->getCellGrid()->toLayerCoordinates( layer->getCellGrid()->toMapCoordinates((*i)->getLocationRef().getExactLayerCoordinatesRef())); } Cell* cell = m_layer->getCellCache()->getCell(mc); if (cell) { cell->changeInstance(*i); } } if (((*i)->getChangeInfo() & ICHANGE_CELL) == ICHANGE_CELL) { ModelCoordinate oldmc; ModelCoordinate newmc; if (m_layer == layer) { oldmc = (*i)->getOldLocationRef().getLayerCoordinates(); newmc = (*i)->getLocationRef().getLayerCoordinates(); } else { oldmc = m_layer->getCellGrid()->toLayerCoordinates( layer->getCellGrid()->toMapCoordinates((*i)->getOldLocationRef().getExactLayerCoordinatesRef())); newmc = m_layer->getCellGrid()->toLayerCoordinates( layer->getCellGrid()->toMapCoordinates((*i)->getLocationRef().getExactLayerCoordinatesRef())); } Cell* oldcell = m_layer->getCellCache()->getCell(oldmc); Cell* newcell = m_layer->getCellCache()->getCell(newmc); if (oldcell == newcell) { continue; } if (oldcell) { oldcell->removeInstance(*i); } if (newcell) { newcell->addInstance(*i); } } } } virtual void onInstanceCreate(Layer* layer, Instance* instance) { ModelCoordinate mc; if (m_layer == layer) { mc = instance->getLocationRef().getLayerCoordinates(); } else { mc = m_layer->getCellGrid()->toLayerCoordinates( layer->getCellGrid()->toMapCoordinates(instance->getLocationRef().getExactLayerCoordinatesRef())); } CellCache* cache = m_layer->getCellCache(); Location loc(m_layer); loc.setLayerCoordinates(mc); if (!cache->isInCellCache(loc)) { cache->resize(); } if (instance->isMultiCell()) { instance->updateMultiInstances(); CellGrid* cg = m_layer->getCellGrid(); const std::vector& multiinstances = instance->getMultiInstances(); std::vector::const_iterator it = multiinstances.begin(); for (; it != multiinstances.end(); ++it) { std::vector coordinates = cg->toMultiCoordinates(mc, (*it)->getObject()->getMultiPartCoordinates(instance->getRotation())); std::vector::iterator mcit = coordinates.begin(); for (; mcit != coordinates.end(); ++mcit) { loc.setLayerCoordinates(*mcit); if (!cache->isInCellCache(loc)) { cache->resize(); } Cell* cell = cache->getCell(*mcit); if (cell) { cell->addInstance(*it); } } } } Cell* cell = cache->getCell(mc); if (cell) { cell->addInstance(instance); } } virtual void onInstanceDelete(Layer* layer, Instance* instance) { ModelCoordinate mc; if (m_layer == layer) { mc = instance->getLocationRef().getLayerCoordinates(); } else { mc = m_layer->getCellGrid()->toLayerCoordinates( layer->getCellGrid()->toMapCoordinates(instance->getLocationRef().getExactLayerCoordinatesRef())); } CellCache* cache = m_layer->getCellCache(); if (instance->isMultiCell()) { instance->updateMultiInstances(); CellGrid* cg = m_layer->getCellGrid(); const std::vector& multiinstances = instance->getMultiInstances(); std::vector::const_iterator it = multiinstances.begin(); for (; it != multiinstances.end(); ++it) { std::vector coordinates = cg->toMultiCoordinates(mc, (*it)->getObject()->getMultiPartCoordinates(instance->getRotation())); std::vector::iterator mcit = coordinates.begin(); for (; mcit != coordinates.end(); ++mcit) { Cell* cell = cache->getCell(*mcit); if (cell) { cell->removeInstance(*it); } } } } Cell* cell = cache->getCell(mc); if (cell) { cell->removeInstance(instance); } // updates size on the next cache update (happens on same pump) cache->setSizeUpdate(true); } private: Layer* m_layer; }; Zone::Zone(uint32_t id): m_id(id) { } Zone::~Zone() { for (std::set::iterator i = m_cells.begin(); i != m_cells.end(); ++i) { (*i)->resetZone(); } } void Zone::addCell(Cell* cell) { if (!cell->getZone()) { cell->setZone(this); m_cells.insert(cell); } } void Zone::removeCell(Cell* cell) { std::set::iterator i = m_cells.find(cell); if (i != m_cells.end()) { (*i)->resetZone(); m_cells.erase(i); } } void Zone::mergeZone(Zone* zone) { const std::set& cells = zone->getCells(); m_cells.insert(cells.begin(), cells.end()); for (std::set::const_iterator it = cells.begin(); it != cells.end(); ++it) { (*it)->setZone(this); } zone->resetCells(); } const std::set& Zone::getCells() const { return m_cells; } void Zone::resetCells() { m_cells.clear(); } uint32_t Zone::getId() const { return m_id; } uint32_t Zone::getCellCount() const { return static_cast(m_cells.size()); } std::vector Zone::getTransitionCells(Layer* layer) { std::vector transitions; std::set::iterator it = m_cells.begin(); for (; it != m_cells.end(); ++it) { TransitionInfo* trans = (*it)->getTransition(); if (!trans) { continue; } if (layer) { if (layer == (*it)->getLayer()) { transitions.push_back(*it); } } else { transitions.push_back(*it); } } return transitions; } class ZoneCellChangeListener : public CellChangeListener { public: ZoneCellChangeListener(CellCache* cache) { m_cache = cache; } virtual ~ZoneCellChangeListener() { } virtual void onInstanceEnteredCell(Cell* cell, Instance* instance) { } virtual void onInstanceExitedCell(Cell* cell, Instance* instance) { } virtual void onBlockingChangedCell(Cell* cell, CellTypeInfo type, bool blocks) { if (blocks) { cell->setZoneProtected(true); m_cache->splitZone(cell); } else { Zone* z1 = cell->getZone(); Zone* z2 = NULL; const std::vector& neighbors = cell->getNeighbors(); std::vector::const_iterator it = neighbors.begin(); for (; it != neighbors.end(); ++it) { Zone* z = (*it)->getZone(); if (z && z != z1) { z2 = z; } } if (z1 && z2) { cell->setZoneProtected(false); m_cache->mergeZones(z1, z2); } } } private: CellCache* m_cache; }; CellCache::CellCache(Layer* layer): m_layer(layer), m_defaultCostMulti(1.0), m_defaultSpeedMulti(1.0), m_neighborZ(-1), m_blockingUpdate(false), m_sizeUpdate(false), m_searchNarrow(true), m_staticSize(false) { // create cell change listener m_cellZoneListener = new ZoneCellChangeListener(this); // set base size ModelCoordinate min, max; m_layer->getMinMaxCoordinates(min, max); m_size.w = max.x; m_size.h = max.y; m_size.x = min.x; m_size.y = min.y; // create and add layer listener m_cellListener = new CellCacheChangeListener(m_layer); m_layer->addChangeListener(m_cellListener); const std::vector& interacts = m_layer->getInteractLayers(); if (!interacts.empty()) { std::vector::const_iterator layit = interacts.begin(); for(; layit != interacts.end(); ++layit) { // set size (*layit)->getMinMaxCoordinates(min, max, m_layer); m_size.w = std::max(max.x, m_size.w); m_size.h = std::max(max.y, m_size.h); m_size.x = std::min(min.x, m_size.x); m_size.y = std::min(min.y, m_size.y); // add listener (*layit)->addChangeListener(m_cellListener); } } m_width = ABS(m_size.w - m_size.x) + 1; m_height = ABS(m_size.h - m_size.y) + 1; m_cells.resize(m_width); for (uint32_t i = 0; i < m_width; ++i) { m_cells[i].resize(m_height, NULL); } } CellCache::~CellCache() { // reset cache reset(); // remove listener from layers m_layer->removeChangeListener(m_cellListener); const std::vector& interacts = m_layer->getInteractLayers(); if (!interacts.empty()) { std::vector::const_iterator layit = interacts.begin(); for(; layit != interacts.end(); ++layit) { (*layit)->removeChangeListener(m_cellListener); } } // delete listener delete m_cellListener; delete m_cellZoneListener; } void CellCache::reset() { // delete zones if (!m_zones.empty()) { std::vector::iterator it = m_zones.begin(); for (; it != m_zones.end(); ++it) { delete *it; } m_zones.clear(); } // clear all containers m_costsToCells.clear(); m_costsTable.clear(); m_costMultipliers.clear(); m_speedMultipliers.clear(); m_narrowCells.clear(); m_cellAreas.clear(); // delete cells if (!m_cells.empty()) { std::vector >::iterator it = m_cells.begin(); for (; it != m_cells.end(); ++it) { std::vector::iterator cit = (*it).begin(); for (; cit != (*it).end(); ++cit) { delete *cit; } } m_cells.clear(); } // reset default cost and speed m_defaultCostMulti = 1.0; m_defaultSpeedMulti = 1.0; // reset size m_size.x = 0; m_size.y = 0; m_size.w = 0; m_size.h = 0; m_width = 0; m_height = 0; } void CellCache::resize() { if (m_staticSize) { return; } // get new size and check if it has changed Rect newsize = calculateCurrentSize(); resize(newsize); } void CellCache::resize(const Rect& rec) { // check if size has changed Rect newsize = rec; if (newsize.x != m_size.x || newsize.y != m_size.y || newsize.w != m_size.w || newsize.h != m_size.h) { uint32_t w = ABS(newsize.w - newsize.x) + 1; uint32_t h = ABS(newsize.h - newsize.y) + 1; std::vector > cells; cells.resize(w); for (uint32_t i = 0; i < w; ++i) { cells[i].resize(h, NULL); } const std::vector& interacts = m_layer->getInteractLayers(); for(uint32_t y = 0; y < h; ++y) { for(uint32_t x = 0; x < w; ++x) { // transfer cells ModelCoordinate mc(newsize.x+x, newsize.y+y); Cell* cell = NULL; int32_t old_x = mc.x - m_size.x; int32_t old_y = mc.y - m_size.y; // out of range in the old size, so we create a new cell if (old_x < 0 || old_x >= static_cast(m_width) || old_y < 0 || old_y >= static_cast(m_height)) { int32_t coordId = x + y * w; cell = new Cell(coordId, mc, m_layer); cells[x][y] = cell; std::list cell_instances; m_layer->getInstanceTree()->findInstances(mc, 0, 0, cell_instances); if (!interacts.empty()) { // fill interact Instances into Cell std::vector::const_iterator it = interacts.begin(); std::list interact_instances; for(; it != interacts.end(); ++it) { // convert coordinates ExactModelCoordinate emc(FIFE::intPt2doublePt(mc)); ModelCoordinate inter_mc = (*it)->getCellGrid()->toLayerCoordinates(m_layer->getCellGrid()->toMapCoordinates(emc)); // check interact layer for instances (*it)->getInstanceTree()->findInstances(inter_mc, 0, 0, interact_instances); if (!interact_instances.empty()) { cell_instances.insert(cell_instances.end(), interact_instances.begin(), interact_instances.end()); interact_instances.clear(); } } } if (!cell_instances.empty()) { // add instances to cell cell->addInstances(cell_instances); } // transfer ownership } else { cell = m_cells[static_cast(old_x)][static_cast(old_y)]; m_cells[static_cast(old_x)][static_cast(old_y)] = NULL; cells[x][y] = cell; int32_t coordId = x + y * w; cell->setCellId(coordId); cell->resetNeighbors(); } } } // delete old unused cells std::vector >::iterator it = m_cells.begin(); for (; it != m_cells.end(); ++it) { std::vector::iterator cit = (*it).begin(); for (; cit != (*it).end(); ++cit) { if (*cit) { delete *cit; *cit = NULL; } } } // use new values m_cells = cells; m_size = newsize; m_width = w; m_height = h; bool zCheck = m_neighborZ != -1; // fill neighbors into cells it = m_cells.begin(); for (; it != m_cells.end(); ++it) { std::vector::iterator cit = (*it).begin(); for (; cit != (*it).end(); ++cit) { int32_t cellZ = (*cit)->getLayerCoordinates().z; std::vector coordinates; m_layer->getCellGrid()->getAccessibleCoordinates((*cit)->getLayerCoordinates(), coordinates); for (std::vector::iterator mi = coordinates.begin(); mi != coordinates.end(); ++mi) { Cell* c = getCell(*mi); if (*cit == c || !c) { continue; } if (zCheck) { if (ABS(c->getLayerCoordinates().z - cellZ) > m_neighborZ) { continue; } } (*cit)->addNeighbor(c); } } } } } void CellCache::createCells() { const std::vector& interacts = m_layer->getInteractLayers(); for(uint32_t y = 0; y < m_height; ++y) { for(uint32_t x = 0; x < m_width; ++x) { ModelCoordinate mc(m_size.x+x, m_size.y+y); Cell* cell = getCell(mc); if (!cell) { cell = new Cell(convertCoordToInt(mc), mc, m_layer); m_cells[x][y] = cell; } // fill Instances into Cell std::list cell_instances; m_layer->getInstanceTree()->findInstances(mc, 0, 0, cell_instances); if (!interacts.empty()) { // fill interact Instances into Cell std::vector::const_iterator it = interacts.begin(); std::list interact_instances; for(; it != interacts.end(); ++it) { // convert coordinates ExactModelCoordinate emc(FIFE::intPt2doublePt(mc)); ModelCoordinate inter_mc = (*it)->getCellGrid()->toLayerCoordinates(m_layer->getCellGrid()->toMapCoordinates(emc)); // check interact layer for instances (*it)->getInstanceTree()->findInstances(inter_mc, 0, 0, interact_instances); if (!interact_instances.empty()) { cell_instances.insert(cell_instances.end(), interact_instances.begin(), interact_instances.end()); interact_instances.clear(); } } } if (!cell_instances.empty()) { // add instances to cell cell->addInstances(cell_instances); } } } // fill neighbors into cells std::vector >::iterator it = m_cells.begin(); for (; it != m_cells.end(); ++it) { std::vector::iterator cit = (*it).begin(); for (; cit != (*it).end(); ++cit) { uint8_t accessible = 0; bool selfblocker = (*cit)->getCellType() == CTYPE_STATIC_BLOCKER || (*cit)->getCellType() == CTYPE_CELL_BLOCKER; std::vector coordinates; m_layer->getCellGrid()->getAccessibleCoordinates((*cit)->getLayerCoordinates(), coordinates); for (std::vector::iterator mi = coordinates.begin(); mi != coordinates.end(); ++mi) { Cell* c = getCell(*mi); if (*cit == c || !c) { continue; } if (!selfblocker && c->getCellType() != CTYPE_STATIC_BLOCKER && c->getCellType() != CTYPE_CELL_BLOCKER) { ++accessible; } (*cit)->addNeighbor(c); } // add cell to narrow cells and add listener for zone change if (m_searchNarrow && !selfblocker && accessible < 3) { addNarrowCell(*cit); } } } // create Zones it = m_cells.begin(); for (; it != m_cells.end(); ++it) { std::vector::iterator cit = (*it).begin(); for (; cit != (*it).end(); ++cit) { Cell* cell = *cit; if (cell->getZone() || cell->isInserted()) { continue; } if (cell->getCellType() == CTYPE_STATIC_BLOCKER || cell->getCellType() == CTYPE_CELL_BLOCKER) { continue; } Zone* zone = createZone(); cell->setInserted(true); std::stack cellstack; cellstack.push(cell); while(!cellstack.empty()) { Cell* c = cellstack.top(); cellstack.pop(); zone->addCell(c); const std::vector& neighbors = c->getNeighbors(); for (std::vector::const_iterator nit = neighbors.begin(); nit != neighbors.end(); ++nit) { Cell* nc = *nit; if (!nc->isInserted() && nc->getCellType() != CTYPE_STATIC_BLOCKER && nc->getCellType() != CTYPE_CELL_BLOCKER) { nc->setInserted(true); cellstack.push(nc); } } } } } } void CellCache::forceUpdate() { std::vector >::iterator it = m_cells.begin(); for (; it != m_cells.end(); ++it) { std::vector::iterator cit = (*it).begin(); for (; cit != (*it).end(); ++cit) { (*cit)->updateCellInfo(); } } } void CellCache::addCell(Cell* cell) { ModelCoordinate mc = cell->getLayerCoordinates(); m_cells[(mc.x-m_size.x)][(mc.y-m_size.y)] = cell; } Cell* CellCache::createCell(const ModelCoordinate& mc) { Cell* cell = getCell(mc); if (!cell) { cell = new Cell(convertCoordToInt(mc), mc, m_layer); m_cells[(mc.x-m_size.x)][(mc.y-m_size.y)] = cell; } return cell; } Cell* CellCache::getCell(const ModelCoordinate& mc) { int32_t x = mc.x - m_size.x; int32_t y = mc.y - m_size.y; if (x < 0 || x >= static_cast(m_width) || y < 0 || y >= static_cast(m_height)) { return NULL; } return m_cells[static_cast(x)][static_cast(y)]; } const std::vector >& CellCache::getCells() { return m_cells; } void CellCache::removeCell(Cell* cell) { if (!m_costsToCells.empty()) { removeCellFromCost(cell); } if (!m_costMultipliers.empty()) { resetCostMultiplier(cell); } if (!m_speedMultipliers.empty()) { resetSpeedMultiplier(cell); } if (!m_narrowCells.empty()) { removeNarrowCell(cell); } if (!m_cellAreas.empty()) { removeCellFromArea(cell); } } void CellCache::addInteractOnRuntime(Layer* interact) { interact->setInteract(true, m_layer->getId()); m_layer->addInteractLayer(interact); interact->addChangeListener(m_cellListener); Rect newsize = calculateCurrentSize(); if (newsize.x != m_size.x || newsize.y != m_size.y || newsize.w != m_size.w || newsize.h != m_size.h) { resize(); } // not optimal but needed if the grids have different geometry for(uint32_t y = 0; y < m_height; ++y) { for(uint32_t x = 0; x < m_width; ++x) { ModelCoordinate mc(m_size.x+x, m_size.y+y); Cell* cell = getCell(mc); if (cell) { // convert coordinates ExactModelCoordinate emc(FIFE::intPt2doublePt(mc)); ModelCoordinate inter_mc = interact->getCellGrid()->toLayerCoordinates(m_layer->getCellGrid()->toMapCoordinates(emc)); // check interact layer for instances std::list interact_instances; interact->getInstanceTree()->findInstances(inter_mc, 0, 0, interact_instances); if (!interact_instances.empty()) { // fill interact Instances into Cell cell->addInstances(interact_instances); } } } } } void CellCache::removeInteractOnRuntime(Layer* interact) { interact->setInteract(false, ""); m_layer->removeInteractLayer(interact); Rect newsize = calculateCurrentSize(); if (newsize.x != m_size.x || newsize.y != m_size.y || newsize.w != m_size.w || newsize.h != m_size.h) { resize(); } // not optimal but needed if the grids have different geometry for(uint32_t y = 0; y < m_height; ++y) { for(uint32_t x = 0; x < m_width; ++x) { ModelCoordinate mc(m_size.x+x, m_size.y+y); Cell* cell = getCell(mc); if (cell) { // convert coordinates ExactModelCoordinate emc(FIFE::intPt2doublePt(mc)); ModelCoordinate inter_mc = interact->getCellGrid()->toLayerCoordinates(m_layer->getCellGrid()->toMapCoordinates(emc)); // check interact layer for instances std::list interact_instances; interact->getInstanceTree()->findInstances(inter_mc, 0, 0, interact_instances); if (!interact_instances.empty()) { // remove interact Instances from Cell for (std::list::iterator it = interact_instances.begin(); it != interact_instances.end(); ++it) { cell->removeInstance(*it); } } } } } } LayerChangeListener* CellCache::getCellCacheChangeListener() { return m_cellListener; } Layer* CellCache::getLayer() { return m_layer; } const Rect& CellCache::getSize() { return m_size; } void CellCache::setSize(const Rect& rec) { resize(rec); } uint32_t CellCache::getWidth() { return m_width; } uint32_t CellCache::getHeight() { return m_height; } bool CellCache::isInCellCache(const Location& location) const { if (m_layer != location.getLayer()) { return false; } int32_t x = location.getLayerCoordinates().x - m_size.x; int32_t y = location.getLayerCoordinates().y - m_size.y; if (x < 0 || x >= static_cast(m_width) || y < 0 || y >= static_cast(m_height)) { return false; } return true; } int32_t CellCache::convertCoordToInt(const ModelCoordinate& coord) const { ModelCoordinate newcoords(coord.x - m_size.x, coord.y - m_size.y); return newcoords.x + newcoords.y*m_width; } ModelCoordinate CellCache::convertIntToCoord(const int32_t cell) const { ModelCoordinate coord((cell % m_width) + m_size.x, (cell / m_width) + m_size.y); return coord; } int32_t CellCache::getMaxIndex() const { int32_t max_index = m_width*m_height; return max_index; } void CellCache::setMaxNeighborZ(int32_t z) { m_neighborZ = z; } int32_t CellCache::getMaxNeighborZ() { return m_neighborZ; } std::vector CellCache::getCellsInLine(const ModelCoordinate& pt1, const ModelCoordinate& pt2, bool blocker) { std::vector cells; std::vector coords = m_layer->getCellGrid()->getCoordinatesInLine(pt1, pt2); for (std::vector::iterator it = coords.begin(); it != coords.end(); ++it) { Cell* c = getCell(*it); if (c) { if (blocker && c->getCellType() != CTYPE_NO_BLOCKER) { return cells; } cells.push_back(c); } else { return cells; } } return cells; } std::vector CellCache::getCellsInRect(const Rect& rec) { std::vector cells; cells.reserve(rec.w * rec.h); ModelCoordinate current(rec.x, rec.y); ModelCoordinate target(rec.x+rec.w, rec.y+rec.h); for (; current.y < target.y; ++current.y) { current.x = rec.x; for (; current.x < target.x; ++current.x) { Cell* c = getCell(current); if (c) { cells.push_back(c); } } } return cells; } std::vector CellCache::getBlockingCellsInRect(const Rect& rec) { std::vector cells; cells.reserve(rec.w * rec.h); ModelCoordinate current(rec.x, rec.y); ModelCoordinate target(rec.x + rec.w, rec.y + rec.h); for (; current.y < target.y; ++current.y) { current.x = rec.x; for (; current.x < target.x; ++current.x) { Cell* c = getCell(current); if (c && c->getCellType() != CTYPE_NO_BLOCKER) { cells.push_back(c); } } } return cells; } std::vector CellCache::getCellsInCircle(const ModelCoordinate& center, uint16_t radius) { std::vector cells; //radius power 2 uint16_t radiusp2 = (radius+1) * radius; ModelCoordinate current(center.x-radius, center.y-radius); ModelCoordinate target(center.x+radius, center.y+radius); for (; current.y < center.y; current.y++) { current.x = center.x-radius; for (; current.x < center.x; current.x++) { Cell* c = getCell(current); if (c) { uint16_t dx = center.x - current.x; uint16_t dy = center.y - current.y; uint16_t distance = dx*dx + dy*dy; if (distance <= radiusp2) { cells.push_back(c); current.x = center.x + dx; c = getCell(current); if (c) cells.push_back(c); current.y = center.y + dy; c = getCell(current); if (c) cells.push_back(c); current.x = center.x-dx; c = getCell(current); if (c) cells.push_back(c); current.y = center.y-dy; } } } } current.x = center.x; current.y = center.y-radius; for (; current.y <= target.y; current.y++) { Cell* c = getCell(current); if (c) cells.push_back(c); } current.y = center.y; current.x = center.x-radius; for (; current.x <= target.x; current.x++) { Cell* c = getCell(current); if (c) cells.push_back(c); } return cells; } std::vector CellCache::getCellsInCircleSegment(const ModelCoordinate& center, uint16_t radius, int32_t sangle, int32_t eangle) { std::vector cells; ExactModelCoordinate exactCenter(center.x, center.y); std::vector tmpCells = getCellsInCircle(center, radius); int32_t s = (sangle + 360) % 360; int32_t e = (eangle + 360) % 360; bool greater = (s > e) ? true : false; for (std::vector::iterator it = tmpCells.begin(); it != tmpCells.end(); ++it) { int32_t angle = getAngleBetween(exactCenter, intPt2doublePt((*it)->getLayerCoordinates())); if (greater) { if (angle >= s || angle <= e) { cells.push_back(*it); } } else { if (angle >= s && angle <= e) { cells.push_back(*it); } } } return cells; } void CellCache::registerCost(const std::string& costId, double cost) { std::pair::iterator, bool> insertiter; insertiter = m_costsTable.insert(std::pair(costId, cost)); if (insertiter.second == false) { double& old_cost = insertiter.first->second; old_cost = cost; } } void CellCache::unregisterCost(const std::string& costId) { std::map::iterator it = m_costsTable.find(costId); if (it != m_costsTable.end()) { m_costsTable.erase(it); m_costsToCells.erase(costId); } } double CellCache::getCost(const std::string& costId) { std::map::iterator it = m_costsTable.find(costId); if (it != m_costsTable.end()) { return it->second; } return 0.0; } bool CellCache::existsCost(const std::string& costId) { std::map::iterator it = m_costsTable.find(costId); if (it != m_costsTable.end()) { return true; } return false; } std::list CellCache::getCosts() { std::list costs; std::map::iterator it = m_costsTable.begin(); for (; it != m_costsTable.end(); ++it) { costs.push_back((*it).first); } return costs; } void CellCache::unregisterAllCosts() { m_costsTable.clear(); m_costsToCells.clear(); } void CellCache::addCellToCost(const std::string& costId, Cell* cell) { if (existsCost(costId)) { StringCellPair result = m_costsToCells.equal_range(costId); StringCellIterator it = result.first; for (; it != result.second; ++it) { if ((*it).second == cell) { return; } } m_costsToCells.insert(std::pair(costId, cell)); } } void CellCache::addCellsToCost(const std::string& costId, const std::vector& cells) { std::vector::const_iterator it = cells.begin(); for (; it != cells.end(); ++it) { addCellToCost(costId, *it); } } void CellCache::removeCellFromCost(Cell* cell) { StringCellIterator it = m_costsToCells.begin(); for (; it != m_costsToCells.end();) { if ((*it).second == cell) { m_costsToCells.erase(it++); } else { ++it; } } } void CellCache::removeCellFromCost(const std::string& costId, Cell* cell) { StringCellPair result = m_costsToCells.equal_range(costId); StringCellIterator it = result.first; for (; it != result.second; ++it) { if ((*it).second == cell) { m_costsToCells.erase(it); break; } } } void CellCache::removeCellsFromCost(const std::string& costId, const std::vector& cells) { std::vector::const_iterator it = cells.begin(); for (; it != cells.end(); ++it) { removeCellFromCost(costId, *it); } } std::vector CellCache::getCostCells(const std::string& costId) { std::vector cells; StringCellPair result = m_costsToCells.equal_range(costId); StringCellIterator it = result.first; for (; it != result.second; ++it) { cells.push_back((*it).second); } return cells; } std::vector CellCache::getCellCosts(Cell* cell) { std::vector costs; StringCellIterator it = m_costsToCells.begin(); for (; it != m_costsToCells.end(); ++it) { if ((*it).second == cell) { costs.push_back((*it).first); } } return costs; } bool CellCache::existsCostForCell(const std::string& costId, Cell* cell) { StringCellPair result = m_costsToCells.equal_range(costId); StringCellIterator it = result.first; for (; it != result.second; ++it) { if ((*it).second == cell) { return true; } } return false; } double CellCache::getAdjacentCost(const ModelCoordinate& adjacent, const ModelCoordinate& next) { double cost = m_layer->getCellGrid()->getAdjacentCost(adjacent, next); Cell* nextcell = getCell(next); if (nextcell) { if (!nextcell->defaultCost()) { cost *= nextcell->getCostMultiplier(); } else { cost *= m_defaultCostMulti; } } return cost; } double CellCache::getAdjacentCost(const ModelCoordinate& adjacent, const ModelCoordinate& next, const std::string& costId) { double cost = m_layer->getCellGrid()->getAdjacentCost(adjacent, next); Cell* nextcell = getCell(next); if (nextcell) { if (existsCostForCell(costId, nextcell)) { cost *= getCost(costId); } else { if (!nextcell->defaultCost()) { cost *= nextcell->getCostMultiplier(); } else { cost *= m_defaultCostMulti; } } } return cost; } bool CellCache::getCellSpeedMultiplier(const ModelCoordinate& cell, double& multiplier) { Cell* nextcell = getCell(cell); if (nextcell) { if (!nextcell->defaultSpeed()) { multiplier = nextcell->getSpeedMultiplier(); return true; } } multiplier = m_defaultSpeedMulti; return false; } void CellCache::setDefaultCostMultiplier(double multi) { m_defaultCostMulti = multi; } double CellCache::getDefaultCostMultiplier() { return m_defaultCostMulti; } void CellCache::setDefaultSpeedMultiplier(double multi) { m_defaultSpeedMulti = multi; } double CellCache::getDefaultSpeedMultiplier() { return m_defaultSpeedMulti; } bool CellCache::isDefaultCost(Cell* cell) { std::map::iterator it = m_costMultipliers.find(cell); if (it != m_costMultipliers.end()) { return false; } return true; } void CellCache::setCostMultiplier(Cell* cell, double multi) { std::pair::iterator, bool> insertiter = m_costMultipliers.insert(std::pair(cell, multi)); if (insertiter.second == false) { double& old = insertiter.first->second; old = multi; } } double CellCache::getCostMultiplier(Cell* cell) { double cost = 1.0; std::map::iterator it = m_costMultipliers.find(cell); if (it != m_costMultipliers.end()) { cost = it->second; } return cost; } void CellCache::resetCostMultiplier(Cell* cell) { m_costMultipliers.erase(cell); } bool CellCache::isDefaultSpeed(Cell* cell) { std::map::iterator it = m_speedMultipliers.find(cell); if (it != m_speedMultipliers.end()) { return false; } return true; } void CellCache::setSpeedMultiplier(Cell* cell, double multi) { std::pair::iterator, bool> insertiter = m_speedMultipliers.insert(std::pair(cell, multi)); if (insertiter.second == false) { double& old = insertiter.first->second; old = multi; } } double CellCache::getSpeedMultiplier(Cell* cell) { double speed = 1.0; std::map::iterator it = m_speedMultipliers.find(cell); if (it != m_speedMultipliers.end()) { speed = it->second; } return speed; } void CellCache::resetSpeedMultiplier(Cell* cell) { m_speedMultipliers.erase(cell); } void CellCache::addTransition(Cell* cell) { m_transitions.push_back(cell); } void CellCache::removeTransition(Cell* cell) { std::vector::iterator it = m_transitions.begin(); for (; it != m_transitions.end(); ++it) { if (cell == *it) { m_transitions.erase(it); break; } } } std::vector CellCache::getTransitionCells(Layer* layer) { if (!layer) { return m_transitions; } std::vector cells; std::vector::iterator it = m_transitions.begin(); for (; it != m_transitions.end(); ++it) { TransitionInfo* trans = (*it)->getTransition(); if (trans) { if (trans->m_layer == layer) { cells.push_back(*it); } } } return cells; } Zone* CellCache::createZone() { uint32_t id = 0; bool search = true; while (search) { bool found = false; if (!m_zones.empty()) { for (std::vector::iterator i = m_zones.begin(); i != m_zones.end(); ++i) { if ((*i)->getId() == id) { found = true; ++id; break; } } } search = found; } Zone* zi = new Zone(id); m_zones.push_back(zi); return zi; } const std::vector& CellCache::getZones() { return m_zones; } Zone* CellCache::getZone(uint32_t id) { Zone* zi = 0; for (std::vector::iterator i = m_zones.begin(); i != m_zones.end(); ++i) { if ((*i)->getId() == id) { zi = (*i); break; } } if (!zi) { zi = new Zone(id); m_zones.push_back(zi); } return zi; } void CellCache::removeZone(Zone* zone) { for (std::vector::iterator i = m_zones.begin(); i != m_zones.end(); ++i) { if (*i == zone) { delete *i; m_zones.erase(i); break; } } } void CellCache::splitZone(Cell* cell) { Zone* currentZone = cell->getZone(); if (!currentZone) { return; } Zone* newZone = createZone(); std::stack cellstack; const std::vector& neighbors = cell->getNeighbors(); for (std::vector::const_iterator nit = neighbors.begin(); nit != neighbors.end(); ++nit) { Cell* nc = *nit; if (nc->isInserted() && !nc->isZoneProtected() && nc->getCellType() != CTYPE_STATIC_BLOCKER && nc->getCellType() != CTYPE_CELL_BLOCKER) { cellstack.push(nc); break; } } while(!cellstack.empty()) { Cell* c = cellstack.top(); cellstack.pop(); currentZone->removeCell(c); newZone->addCell(c); c->setInserted(true); if (c->isZoneProtected()) { continue; } const std::vector& neigh = c->getNeighbors(); for (std::vector::const_iterator nit = neigh.begin(); nit != neigh.end(); ++nit) { Cell* nc = *nit; if (nc->getZone() == currentZone && nc->isInserted() && nc->getCellType() != CTYPE_STATIC_BLOCKER && nc->getCellType() != CTYPE_CELL_BLOCKER) { cellstack.push(nc); nc->setInserted(false); } } } if (currentZone->getCellCount() == 0) { removeZone(currentZone); } } void CellCache::mergeZones(Zone* zone1, Zone* zone2) { if (!zone1 || !zone2) { return; } Zone* addZone = zone2; Zone* oldZone = zone1; if (zone1->getCellCount() > zone2->getCellCount()) { addZone = zone1; oldZone = zone2; } addZone->mergeZone(oldZone); removeZone(oldZone); } void CellCache::addNarrowCell(Cell* cell) { std::pair::iterator, bool> insertiter = m_narrowCells.insert(cell); if (insertiter.second) { cell->addChangeListener(m_cellZoneListener); } } const std::set& CellCache::getNarrowCells() { return m_narrowCells; } void CellCache::removeNarrowCell(Cell* cell) { std::set::iterator it = m_narrowCells.find(cell); if (it != m_narrowCells.end()) { (*it)->removeChangeListener(m_cellZoneListener); m_narrowCells.erase(it); } } void CellCache::resetNarrowCells() { std::set::const_iterator it = m_narrowCells.begin(); for (; it != m_narrowCells.end(); ++it) { (*it)->removeChangeListener(m_cellZoneListener); } m_narrowCells.clear(); } bool CellCache::isSearchNarrowCells() { return m_searchNarrow; } void CellCache::setSearchNarrowCells(bool search) { m_searchNarrow = search; } void CellCache::addCellToArea(const std::string& id, Cell* cell) { m_cellAreas.insert(std::pair(id, cell)); } void CellCache::addCellsToArea(const std::string& id, const std::vector& cells) { std::vector::const_iterator it = cells.begin(); for (; it != cells.end(); ++it) { addCellToArea(id, *it); } } void CellCache::removeCellFromArea(Cell* cell) { StringCellIterator it = m_cellAreas.begin(); while (it != m_cellAreas.end()) { if ((*it).second == cell) { m_cellAreas.erase(it++); } else { ++it; } } } void CellCache::removeCellFromArea(const std::string& id, Cell* cell) { StringCellPair result = m_cellAreas.equal_range(id); StringCellIterator it = result.first; for (; it != result.second; ++it) { if ((*it).second == cell) { m_cellAreas.erase(it); break; } } } void CellCache::removeCellsFromArea(const std::string& id, const std::vector& cells) { std::vector::const_iterator it = cells.begin(); for (; it != cells.end(); ++it) { removeCellFromArea(id, *it); } } void CellCache::removeArea(const std::string& id) { m_cellAreas.erase(id); } bool CellCache::existsArea(const std::string& id) { StringCellIterator it = m_cellAreas.find(id); if (it == m_cellAreas.end()) { return false; } return true; } std::vector CellCache::getAreas() { std::vector areas; std::string last(""); StringCellIterator it = m_cellAreas.begin(); for (; it != m_cellAreas.end(); ++it) { if (last != (*it).first) { last = (*it).first; areas.push_back(last); } } return areas; } std::vector CellCache::getCellAreas(Cell* cell) { std::vector areas; StringCellIterator it = m_cellAreas.begin(); for (; it != m_cellAreas.end(); ++it) { if ((*it).second == cell) { areas.push_back((*it).first); } } return areas; } std::vector CellCache::getAreaCells(const std::string& id) { std::vector cells; StringCellPair result = m_cellAreas.equal_range(id); StringCellIterator it = result.first; for (; it != result.second; ++it) { cells.push_back((*it).second); } return cells; } bool CellCache::isCellInArea(const std::string& id, Cell* cell) { StringCellPair result = m_cellAreas.equal_range(id); StringCellIterator it = result.first; for (; it != result.second; ++it) { if ((*it).second == cell) { return true; } } return false; } Rect CellCache::calculateCurrentSize() { // set base size ModelCoordinate min, max; m_layer->getMinMaxCoordinates(min, max); Rect newsize(min.x, min.y, max.x, max.y); const std::vector& interacts = m_layer->getInteractLayers(); if (!interacts.empty()) { std::vector::const_iterator layit = interacts.begin(); for(; layit != interacts.end(); ++layit) { // set size (*layit)->getMinMaxCoordinates(min, max, m_layer); newsize.w = std::max(max.x, newsize.w); newsize.h = std::max(max.y, newsize.h); newsize.x = std::min(min.x, newsize.x); newsize.y = std::min(min.y, newsize.y); } } return newsize; } void CellCache::setStaticSize(bool staticSize) { m_staticSize = staticSize; } bool CellCache::isStaticSize() { return m_staticSize; } void CellCache::setBlockingUpdate(bool update) { m_blockingUpdate = update; } void CellCache::setSizeUpdate(bool update) { m_sizeUpdate = update; } void CellCache::update() { if (m_sizeUpdate) { resize(); m_sizeUpdate = false; } m_blockingUpdate = false; } } // FIFE fifengine-0.4.2/engine/core/model/structures/cellcache.h000066400000000000000000000557671341615052600232720ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_CELLCACHE_H #define FIFE_CELLCACHE_H // Standard C++ library includes #include #include #include #include #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/fifeclass.h" #include "util/structures/rect.h" #include "model/metamodel/modelcoords.h" #include "model/metamodel/object.h" #include "layer.h" #include "cell.h" namespace FIFE { /** A Zone is an abstract depiction of a CellCache or of a part of it. */ class Zone { public: /** Constructor * @param id A integer value used as identifier. Simple counter values are used. */ Zone(uint32_t id); /** Destructor */ ~Zone(); /** Adds a cell to this zone. * @param cell A pointer to cell which should be added. */ void addCell(Cell* cell); /** Removes a cell from this zone. * @param cell A pointer to cell which should be removed. */ void removeCell(Cell* cell); /** Merge two zones to one. * @param zone A pointer to the old zone. */ void mergeZone(Zone* zone); /** Returns all cells of this zone. * @return A const reference to a set that contains all cells of this zone. */ const std::set& getCells() const; /** Remove all cells from zone but does not alter the cells. */ void resetCells(); /** Returns the zone identifier. * @return A unsigned integer with the identifier. */ uint32_t getId() const; /** Returns the number of cells. * @return A unsigned integer with the number of cells. */ uint32_t getCellCount() const; /** Returns transistion cells of this zone. * @param layer A pointer to the layer which should be the target of the transition. If NULL all transistions be returned. * @return A vector which contains the transition cells. */ std::vector getTransitionCells(Layer* layer = NULL); private: //! identifier uint32_t m_id; //! cells in the zone std::set m_cells; }; /** A CellCache is an abstract depiction of one or a few layers * and contains additional information, such as different cost and speed and so on. */ class CellCache : public FifeClass { public: /** Constructor * @param layer A pointer to the associated layer. */ CellCache(Layer* layer); /** Destructor */ ~CellCache(); /** Resets the CellCache */ void reset(); /** Checks the layer size and if the size is different with current size then the cache size is adjusted. */ void resize(); /** Checks the given size and if the size is different with current size then the cache is adjusted. * @param rec A rect that contains the new size in layer coordinates. */ void resize(const Rect& rec); /** Creates cells for this CellCache based on the size of the assigned layer. */ void createCells(); /** Updates all cells. */ void forceUpdate(); /** Adds cell to this CellCache. * @param cell A pointer to cell which should be added. */ void addCell(Cell* cell); /** Creates cell on this CellCache. * @param mc A const reference to ModelCoordinate where the cell should be created. * @return A pointer to the new cell. */ Cell* createCell(const ModelCoordinate& mc); /** Returns cell on this coordinate. * @param mc A const reference to ModelCoordinate where the cell should be. * @return A pointer to the cell or NULL if there is no. */ Cell* getCell(const ModelCoordinate& mc); /** Returns all cells of this CellCache. * @return A const reference to a two dimensional vector which contain all cells. */ const std::vector >& getCells(); /** Removes cell from CellCache. * Removes cell from cost table, special cost and speed, * futhermore from areas and narrows. * @param cell A pointer to the cell. */ void removeCell(Cell* cell); /** Adds a interact layer to the CellCache on runtime and sets all needed layer properties. * @param interact A pointer to the interact layer. */ void addInteractOnRuntime(Layer* interact); /** Removes a interact layer from the CellCache on runtime and sets all needed layer properties. * @param interact A pointer to the interact layer. */ void removeInteractOnRuntime(Layer* interact); /** Returns change listener. * @return A pointer to the change listener. */ LayerChangeListener* getCellCacheChangeListener(); /** Returns layer. * @return A pointer to the layer this CellCache is based on. */ Layer* getLayer(); /** Returns CellCache size. * @return A const reference to rect that contain the min and max coordinates. */ const Rect& getSize(); /** Sets CellCache size. * @param rec A const reference to a rect that contain new min, max coordinates. rec.x = min.x, rec.w = max.x, rec.y = min.y, rec.h = max.y */ void setSize(const Rect& rec); /** Returns width of the CellCache. * @return A unsigned integer that is the width. */ uint32_t getWidth(); /** Returns height of the CellCache. * @return A unsigned integer that is the height. */ uint32_t getHeight(); /** Checks whether the location is in CellCache range. * @param location A const reference to location which should be checked. * @return A boolean, true if the location is in range, otherwise false. */ bool isInCellCache(const Location& location) const; /** Convertes coordinate to unique identifier. * @param coord A const reference to ModelCoordinate which should be converted. * @return A integer, the cell identifier. */ int32_t convertCoordToInt(const ModelCoordinate& coord) const; /** Convertes unique identifier to coordinate. * @param cell A const reference to the integer id which should be converted. * @return A ModelCoordinate, contain the cell coordinate. */ ModelCoordinate convertIntToCoord(const int32_t cell) const; /** Returns the number of cells on this CellCache. * @return A integer value, the number of cells. */ int32_t getMaxIndex() const; /** Sets maximal z range for neighbors. * @param z The maximal z range as int. */ void setMaxNeighborZ(int32_t z); /** Gets maximal z range for neighbors. By default disabled with the value -1. * @return The maximal z range as int. */ int32_t getMaxNeighborZ(); /** Returns all cells in the line. * @param pt1 A const reference to the ModelCoordinate where the line begin. * @param pt2 A const reference to the ModelCoordinate where the line end. * @param blocker A boolean, true stops when a blocker is found, false ignored blocker. * @return A vector that contain the cells. */ std::vector getCellsInLine(const ModelCoordinate& pt1, const ModelCoordinate& pt2, bool blocker = false); /** Returns all cells in the rect. * @param rec A const reference to the Rect which specifies the size. * @return A vector that contain the cells. */ std::vector getCellsInRect(const Rect& rec); /** Returns all blocking cells in the rect. * @param rec A const reference to the Rect which specifies the size. * @return A vector that contain the cells. */ std::vector getBlockingCellsInRect(const Rect& rec); /** Returns all cells in the circle. * @param center A const reference to the ModelCoordinate where the center of the circle is. * @param radius A unsigned integer, radius of the circle. * @return A vector that contain the cells. */ std::vector getCellsInCircle(const ModelCoordinate& center, uint16_t radius); /** Returns all cells in the circle segment. * @param center A const reference to the ModelCoordinate where the center of the circle is. * @param radius A unsigned integer, radius of the circle. * @param sangle A interger, start angle of the segment. * @param eangle A interger, end angle of the segment. * @return A vector that contain the cells. */ std::vector getCellsInCircleSegment(const ModelCoordinate& center, uint16_t radius, int32_t sangle, int32_t eangle); /** Adds a cost with the given id and value. * @param costId A const reference to a string that refs to the cost id. * @param cost A double that contains the cost value. Used as multiplier for default cost. */ void registerCost(const std::string& costId, double cost); /** Removes a cost with the given id. * @param costId A const reference to a string that refs to the cost id. */ void unregisterCost(const std::string& costId); /** Returns the cost value for the given id. * @param costId A const reference to a string that refs to the cost id. * @return cost value as a double, if cost id can not be found 1.0 is returned. */ double getCost(const std::string& costId); /** Returns if the cost for the given id exists. * @return True if cost id could be found otherwise false. */ bool existsCost(const std::string& costId); /** Returns all registered cost ids. * @return A list that contains the cost ids. */ std::list getCosts(); /** Removes all costs. */ void unregisterAllCosts(); /** Assigns a cell to a cost identifier. * @param costId A const reference to the cost identifier. * @param cell A pointer to the cell. */ void addCellToCost(const std::string& costId, Cell* cell); /** Assigns cells to a cost identifier. * @param costId A const reference to the cost identifier. * @param cells A const reference to a vector which contains the cells. */ void addCellsToCost(const std::string& costId, const std::vector& cells); /** Removes a cell from costs. * @param cell A pointer to the cell. */ void removeCellFromCost(Cell* cell); /** Removes a cell from a cost identifier. * @param costId A const reference to the cost identifier. * @param cell A pointer to the cell. */ void removeCellFromCost(const std::string& costId, Cell* cell); /** Removes cells from a cost identifier. * @param costId A const reference to the cost identifier. * @param cells A const reference to a vector which contains the cells. */ void removeCellsFromCost(const std::string& costId, const std::vector& cells); /** Returns cells for a cost identifier. * @param costId A const reference to the cost identifier. * @return A vector which contains the cells. */ std::vector getCostCells(const std::string& costId); /** Returns cost identifiers for cell. * @param cell A pointer to the cell. * @return A vector which contains the cost ids. */ std::vector getCellCosts(Cell* cell); /** Gets if cell is assigned to cost identifier. * @param costId A const reference to the cost identifier. * @param cell A pointer to the cell. * @return A boolean, true if the cell is assigned to the cost identifier, otherwise false. */ bool existsCostForCell(const std::string& costId, Cell* cell); /** Returns cost for movement between these two adjacent coordinates. * @param adjacent A const reference to the start ModelCoordinate. * @param next A const reference to the end ModelCoordinate. * @return A double which represents the cost. */ double getAdjacentCost(const ModelCoordinate& adjacent, const ModelCoordinate& next); /** Returns cost for movement between these two adjacent coordinates. * @param adjacent A const reference to the start ModelCoordinate. * @param next A const reference to the end ModelCoordinate. * @param costId A const reference to the string that contain a cost identifier. * @return A double which represents the cost. */ double getAdjacentCost(const ModelCoordinate& adjacent, const ModelCoordinate& next, const std::string& costId); /** Returns speed value from cell. * @param cell A const reference to the cell ModelCoordinate. * @param multiplier A reference to a double which receives the speed value. * @return A boolean, true if on next cell use special speed, otherwise false. */ bool getCellSpeedMultiplier(const ModelCoordinate& cell, double& multiplier); /** Sets default cost for this CellCache. * @param multi A double, the cost. */ void setDefaultCostMultiplier(double multi); /** Gets default cost for this CellCache. * @return A double, the cost. */ double getDefaultCostMultiplier(); /** Sets default speed for this CellCache. * @param multi A double, the speed. */ void setDefaultSpeedMultiplier(double multi); /** Gets default speed for this CellCache. * @return A double, the speed. */ double getDefaultSpeedMultiplier(); /** Gets if cell uses default cost multiplier. * @param cell A pointer to the cell. * @return A boolean, true if the cell uses default cost multiplier, otherwise false. */ bool isDefaultCost(Cell* cell); /** Sets cost multiplier for the cell. * @param cell A pointer to the cell. * @param multi A double, the cost multiplier. */ void setCostMultiplier(Cell* cell, double multi); /** Returns cost multiplier for the cell. * @param cell A pointer to the cell. * @return A double, the cost multiplier. 1.0 is default. */ double getCostMultiplier(Cell* cell); /** Resets the cost multiplier for the cell. * @param cell A pointer to the cell. */ void resetCostMultiplier(Cell* cell); /** Gets if cell uses default speed multiplier. * @param cell A pointer to the cell. * @return A boolean, true if the cell uses default speed multiplier, otherwise false. */ bool isDefaultSpeed(Cell* cell); /** Sets speed multiplier for the cell. * @param cell A pointer to the cell. * @param multi A double, the speed multiplier. */ void setSpeedMultiplier(Cell* cell, double multi); /** Returns speed multiplier for the cell. * @param cell A pointer to the cell. * @return A double, the speed multiplier. 1.0 is default. */ double getSpeedMultiplier(Cell* cell); /** Resets the speed multiplier for the cell. * @param cell A pointer to the cell. */ void resetSpeedMultiplier(Cell* cell); /** Adds a cell as transition. * @param cell A pointer to transition cell. */ void addTransition(Cell* cell); /** Removes a cell as transition. * @param cell A pointer to transition cell. */ void removeTransition(Cell* cell); /** Returns transistion cells of this CellCache. * @param layer A pointer to the layer which should be the target of the transition. If NULL all transistions be returned. * @return A vector which contains the transition cells. */ std::vector getTransitionCells(Layer* layer = NULL); /** Returns zones of this CellCache. * @return A vector which contains the zones. */ const std::vector& getZones(); /** Gets zone by identifier. * @param id A unsigned integer which is used as zone identifier, * @return A pointer to the zone. */ Zone* getZone(uint32_t id); /** Creates zone. * @return A pointer to the new zone. */ Zone* createZone(); /** Removes zone. * @param zone A pointer to the zone which should be removed. */ void removeZone(Zone* zone); /** Splits zone on the cell. * @param cell A pointer to the cell where the zone should be splited. */ void splitZone(Cell* cell); /** Merges two zones to one. * @param zone1 A pointer to the first zone. * @param zone2 A pointer to the second zone. */ void mergeZones(Zone* zone1, Zone* zone2); /** Adds cell to narrow cells. * Narrow cells are observed. On blocking change, the underlying zones are merged or splitted. * @param cell A pointer to the cell. */ void addNarrowCell(Cell* cell); /** Returns narrow cells. * @return A const reference to a set which contains the cells. */ const std::set& getNarrowCells(); /** Removes cell from narrow cells. * @param cell A pointer to the cell. */ void removeNarrowCell(Cell* cell); /** Resets narrow cells. */ void resetNarrowCells(); /** Gets if narrow cells should be searched automatic. * Note that narrow cells will only saved if this is disabled. * @return A boolean, if true the automatic search is enabled, otherwise false. */ bool isSearchNarrowCells(); /** Sets if narrow cells should be searched automatic. * @param search A boolean, if true the automatic search is enabled, otherwise false. */ void setSearchNarrowCells(bool search); /** Adds a cell to a specific area group. With an area you can group cells without the need * of checking the underlying instances or similar. * @param id A const reference to string that contains the area id. * @param cell A pointer to the cell which should be added. */ void addCellToArea(const std::string& id, Cell* cell); /** Adds few cell to a specific area group. With an area you can group cells without the need * of checking the underlying instances or similar. * @param id A const reference to string that contains the area id. * @param cells A const reference to vector which contains the cells. */ void addCellsToArea(const std::string& id, const std::vector& cells); /** Removes the cell from all areas. * @param cell A pointer to the cell which should be removed. */ void removeCellFromArea(Cell* cell); /** Removes the cell from a area. * @param id A const reference to string that contains the area id. * @param cell A pointer to the cell which should be removed. */ void removeCellFromArea(const std::string& id, Cell* cell); /** Removes few cells from a area. * @param id A const reference to string that contains the area id. * @param cells A const reference to vector which contains the cells. */ void removeCellsFromArea(const std::string& id, const std::vector& cells); /** Removes a area. * @param id A const reference to string that contains the area id. */ void removeArea(const std::string& id); /** Checks whether the area exists. * @param id A const reference to string that contains the area id. * @return A boolean, true if the area id exists, otherwise false. */ bool existsArea(const std::string& id); /** Returns all area ids. * @return A vector that contains the area ids. */ std::vector getAreas(); /** Returns all areas of a cell. * @param cell A pointer to the cell. * @return A vector that contains the area ids. */ std::vector getCellAreas(Cell* cell); /** Returns all cells of an area. * @param id A const reference to string that contains the area id. * @return A vector that contains the cells from the area. */ std::vector getAreaCells(const std::string& id); /** Returns true if cell is part of the area, otherwise false. * @param id A const reference to string that contains the area id. * @param cell A pointer to the cell which is used for the check. * @return A boolean, true if the cell is part of the area, otherwise false. */ bool isCellInArea(const std::string& id, Cell* cell); /** Sets the cache size to static so that automatic resize is disabled. * @param staticSize A boolean, true if the cache size is static, otherwise false. */ void setStaticSize(bool staticSize); /** Returns if the cache size is static. * @return A boolean, true if the cache size is static, otherwise false. */ bool isStaticSize(); void setBlockingUpdate(bool update); void setSizeUpdate(bool update); void update(); private: typedef std::multimap StringCellMultimap; typedef StringCellMultimap::iterator StringCellIterator; typedef std::pair StringCellPair; /** Returns the current size. * @return A rect that contains the min, max coordinates. */ Rect calculateCurrentSize(); //! walkable layer Layer* m_layer; //! default cost double m_defaultCostMulti; //! default speed double m_defaultSpeedMulti; //! change listener LayerChangeListener* m_cellListener; // cells on this cache std::vector > m_cells; //! Rect holds the min and max size //! x = min.x, w = max.x, y = min.y, h = max.y Rect m_size; //! cache width uint32_t m_width; //! cache height uint32_t m_height; //! max z value for neighbors int32_t m_neighborZ; //! indicates blocking update bool m_blockingUpdate; //! indicates size update bool m_sizeUpdate; //! is automatic seach enabled bool m_searchNarrow; //! is automatic size update enabled/disabled bool m_staticSize; //! cells with transitions std::vector m_transitions; //! zones std::vector m_zones; //! special cells which are monitored (zone split and merge) std::set m_narrowCells; //! areas with assigned cells StringCellMultimap m_cellAreas; //! listener for zones CellChangeListener* m_cellZoneListener; //! holds cost table std::map m_costsTable; //! holds cells for each cost StringCellMultimap m_costsToCells; //! holds default cost multiplier, only if it is not default(1.0) std::map m_costMultipliers; //! holds default speed multiplier, only if it is not default(1.0) std::map m_speedMultipliers; }; } // FIFE #endif fifengine-0.4.2/engine/core/model/structures/cellcache.i000066400000000000000000000103001341615052600232410ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fife %{ #include "model/structures/cellcache.h" %} namespace FIFE { class Cell; class Layer; class CellCache : public FifeClass { public: CellCache(Layer* layer); ~CellCache(); void createCells(); void forceUpdate(); void addCell(Cell* cell); Cell* createCell(const ModelCoordinate& mc); Cell* getCell(const ModelCoordinate& mc); void addInteractOnRuntime(Layer* interact); void removeInteractOnRuntime(Layer* interact); const Rect& getSize(); void setSize(const Rect& rec); uint32_t getWidth(); uint32_t getHeight(); int32_t getMaxIndex() const; void setMaxNeighborZ(int32_t z); int32_t getMaxNeighborZ(); bool isInCellCache(const Location& location) const; std::vector getCellsInLine(const ModelCoordinate& pt1, const ModelCoordinate& pt2, bool blocker = false); std::vector getCellsInRect(const Rect& rec); std::vector getCellsInCircle(const ModelCoordinate& center, uint16_t radius); std::vector getCellsInCircleSegment(const ModelCoordinate& center, uint16_t radius, int32_t sangle, int32_t eangle); void registerCost(const std::string& costId, double cost); void unregisterCost(const std::string& costId); double getCost(const std::string& costId); bool existsCost(const std::string& costId); std::list getCosts(); void unregisterAllCosts(); void addCellToCost(const std::string& costId, Cell* cell); void addCellsToCost(const std::string& costId, const std::vector& cells); void removeCellFromCost(Cell* cell); void removeCellFromCost(const std::string& costId, Cell* cell); void removeCellsFromCost(const std::string& costId, const std::vector& cells); std::vector getCostCells(const std::string& costId); std::vector getCellCosts(Cell* cell); bool existsCostForCell(const std::string& costId, Cell* cell); void setDefaultCostMultiplier(double multi); double getDefaultCostMultiplier(); void setDefaultSpeedMultiplier(double multi); double getDefaultSpeedMultiplier(); void addCellToArea(const std::string& id, Cell* cell); void addCellsToArea(const std::string& id, const std::vector& cells); void removeCellFromArea(const std::string& id, Cell* cell); void removeCellsFromArea(const std::string& id, const std::vector& cells); void removeArea(const std::string& id); bool existsArea(const std::string& id); std::vector getAreas(); std::vector getCellAreas(Cell* cell); std::vector getAreaCells(const std::string& id); bool isCellInArea(const std::string& id, Cell* cell); void setStaticSize(bool staticSize); bool isStaticSize(); }; } fifengine-0.4.2/engine/core/model/structures/instance.cpp000066400000000000000000001161671341615052600235160ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes #include // 3rd party library includes //#include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "audio/soundsource.h" #include "util/log/logger.h" #include "util/base/exception.h" #include "util/math/fife_math.h" #include "util/time/timemanager.h" #include "model/metamodel/grids/cellgrid.h" #include "model/metamodel/ipather.h" #include "model/metamodel/action.h" #include "model/metamodel/timeprovider.h" #include "model/structures/layer.h" #include "model/structures/map.h" #include "model/structures/instancetree.h" #include "view/visual.h" #include "pathfinder/route.h" #include "instance.h" namespace FIFE { static Logger _log(LM_INSTANCE); class ActionInfo { public: ActionInfo(IPather* pather, const Location& curloc): m_action(NULL), m_target(NULL), m_speed(0), m_repeating(false), m_action_start_time(0), m_action_offset_time(0), m_prev_call_time(0), m_pather(pather), m_leader(NULL), m_route(NULL), m_delete_route(true) {} ~ActionInfo() { if (m_route && m_delete_route) { int32_t sessionId = m_route->getSessionId(); if (sessionId != -1) { m_pather->cancelSession(sessionId); } delete m_route; } delete m_target; } // Current action, owned by object Action* m_action; // target location for ongoing movement Location* m_target; // current movement speed double m_speed; // should action be repeated? used only for non-moving actions, moving ones repeat until movement is finished bool m_repeating; // action start time (ticks) uint32_t m_action_start_time; // action offset time (ticks) for resuming an action uint32_t m_action_offset_time; // ticks since last call uint32_t m_prev_call_time; // pather IPather* m_pather; // leader for follow activity Instance* m_leader; // pointer to route that contain path and additional information Route* m_route; bool m_delete_route; }; class SayInfo { public: SayInfo(const std::string& txt, uint32_t duration): m_txt(txt), m_duration(duration), m_start_time(0) {} std::string m_txt; uint32_t m_duration; uint32_t m_start_time; }; Instance::InstanceActivity::InstanceActivity(Instance& source): m_location(source.m_location), m_oldLocation(source.m_location), m_rotation(source.m_rotation), m_oldRotation(source.m_rotation), m_action(NULL), m_soundSource(NULL), m_speed(0), m_timeMultiplier(1.0), m_sayText(""), m_changeListeners(), m_actionListeners(), m_actionInfo(NULL), m_sayInfo(NULL), m_timeProvider(NULL), m_blocking(source.m_blocking), m_additional(ICHANGE_NO_CHANGES) { } Instance::InstanceActivity::~InstanceActivity() { delete m_actionInfo; delete m_sayInfo; delete m_timeProvider; delete m_soundSource; } void Instance::InstanceActivity::update(Instance& source) { source.m_changeInfo = ICHANGE_NO_CHANGES; if (m_additional != ICHANGE_NO_CHANGES) { source.m_changeInfo = m_additional; m_additional = ICHANGE_NO_CHANGES; } if (m_location != source.m_location) { source.m_changeInfo |= ICHANGE_LOC; if (m_location.getLayerCoordinates() != source.m_location.getLayerCoordinates()) { m_oldLocation.setLayer(m_location.getLayer()); m_oldLocation.setLayerCoordinates(m_location.getLayerCoordinates()); source.m_changeInfo |= ICHANGE_CELL; } m_location = source.m_location; } if (m_rotation != source.m_rotation) { m_oldRotation = m_rotation; source.m_changeInfo |= ICHANGE_ROTATION; m_rotation = source.m_rotation; } if (m_actionInfo && (m_speed != m_actionInfo->m_speed)) { source.m_changeInfo |= ICHANGE_SPEED; m_speed = m_actionInfo->m_speed; } if (m_actionInfo && (m_action != m_actionInfo->m_action)) { source.m_changeInfo |= ICHANGE_ACTION; m_action = m_actionInfo->m_action; } if (m_timeProvider && (m_timeMultiplier != m_timeProvider->getMultiplier())) { source.m_changeInfo |= ICHANGE_TIME_MULTIPLIER; m_timeMultiplier = m_timeProvider->getMultiplier(); } if (m_sayInfo && (m_sayText != m_sayInfo->m_txt)) { source.m_changeInfo |= ICHANGE_SAYTEXT; m_sayText = m_sayInfo->m_txt; } if (m_blocking != source.m_blocking) { source.m_changeInfo |= ICHANGE_BLOCK; m_blocking = source.m_blocking; } if (source.m_changeInfo != ICHANGE_NO_CHANGES) { std::vector::iterator i = m_changeListeners.begin(); while (i != m_changeListeners.end()) { if (NULL != *i) { (*i)->onInstanceChanged(&source, source.m_changeInfo); } ++i; } // Really remove "removed" listeners. m_changeListeners.erase( std::remove(m_changeListeners.begin(),m_changeListeners.end(), (InstanceChangeListener*)NULL), m_changeListeners.end()); } } Instance::Instance(Object* object, const Location& location, const std::string& identifier): m_id(identifier), m_rotation(0), m_activity(NULL), m_changeInfo(ICHANGE_NO_CHANGES), m_object(object), m_ownObject(false), m_location(location), m_visual(NULL), m_blocking(object->isBlocking()), m_overrideBlocking(false), m_cellStackPos(object->getCellStackPosition()), m_specialCost(object->isSpecialCost()), m_cost(object->getCost()), m_costId(object->getCostId()), m_mainMultiInstance(NULL) { // create multi object instances if (object->isMultiObject()) { m_mainMultiInstance = this; uint32_t count = 0; Layer* layer = m_location.getLayer(); const ExactModelCoordinate& emc = m_location.getExactLayerCoordinatesRef(); const std::set& multis = object->getMultiParts(); std::set::const_iterator it = multis.begin(); for (; it != multis.end(); ++it, ++count) { if (*it == m_object) { continue; } std::vector partcoords = (*it)->getMultiPartCoordinates(m_rotation); std::vector::iterator coordit = partcoords.begin(); for (; coordit != partcoords.end(); ++coordit) { ExactModelCoordinate tmp_emc(emc.x+(*coordit).x, emc.y+(*coordit).y, emc.z+(*coordit).z); std::ostringstream counter; counter << count; Instance* instance = layer->createInstance(*it, tmp_emc, identifier+counter.str()); InstanceVisual::create(instance); m_multiInstances.push_back(instance); instance->addDeleteListener(this); instance->setMainMultiInstance(this); } } } } Instance::~Instance() { std::vector::iterator itor; for(itor = m_deleteListeners.begin(); itor != m_deleteListeners.end(); ++itor) { if (*itor != NULL) { (*itor)->onInstanceDeleted(this); } } if(m_activity && m_activity->m_actionInfo) { // Don't ditribute onActionFinished in case we're already // deleting. m_activity->m_actionListeners.clear(); finalizeAction(); } if (!m_multiInstances.empty()) { std::vector::iterator it = m_multiInstances.begin(); for (; it != m_multiInstances.end(); ++it) { (*it)->removeDeleteListener(this); (*it)->setMainMultiInstance(NULL); } } delete m_activity; delete m_visual; if (m_ownObject) { delete m_object; } } void Instance::initializeChanges() { if (!m_activity) { m_activity = new InstanceActivity(*this); } if (m_location.getLayer()) { m_location.getLayer()->setInstanceActivityStatus(this, true); } } void Instance::prepareForUpdate() { if (isActive()) { refresh(); } else { initializeChanges(); } } bool Instance::isActive() const { return (m_activity != 0); } Object* Instance::getObject() { return m_object; } void Instance::setLocation(const Location& loc) { // ToDo: Handle the case when the layers are different if(m_location != loc) { prepareForUpdate(); if (m_location.getLayerCoordinates() != loc.getLayerCoordinates()) { m_location.getLayer()->getInstanceTree()->removeInstance(this); m_location = loc; m_location.getLayer()->getInstanceTree()->addInstance(this); } else { m_location = loc; } } } Location Instance::getLocation() const { return m_location; } Location& Instance::getLocationRef() { return m_location; } void Instance::setRotation(int32_t rotation) { while (rotation < 0) { rotation += 360; } rotation %= 360; if(m_rotation != rotation) { prepareForUpdate(); m_rotation = rotation; } } int32_t Instance::getRotation() const { return m_rotation; } void Instance::setId(const std::string& identifier) { m_id = identifier; } const std::string& Instance::getId() { return m_id; } void Instance::setBlocking(bool blocking) { if (m_overrideBlocking) { prepareForUpdate(); m_blocking = blocking; } } bool Instance::isBlocking() const { return m_blocking; } void Instance::setOverrideBlocking(bool overblock) { m_overrideBlocking = overblock; } bool Instance::isOverrideBlocking() const { return m_overrideBlocking; } void Instance::addActionListener(InstanceActionListener* listener) { initializeChanges(); m_activity->m_actionListeners.push_back(listener); } void Instance::removeActionListener(InstanceActionListener* listener) { if (!m_activity) { return; } std::vector::iterator i = m_activity->m_actionListeners.begin(); while (i != m_activity->m_actionListeners.end()) { if ((*i) == listener) { *i = NULL; return; } ++i; } FL_WARN(_log, "Cannot remove unknown listener"); } void Instance::addChangeListener(InstanceChangeListener* listener) { initializeChanges(); m_activity->m_changeListeners.push_back(listener); } void Instance::callOnActionFrame(Action* action, int32_t frame) { if (!m_activity) { return; } std::vector::iterator i = m_activity->m_actionListeners.begin(); while (i != m_activity->m_actionListeners.end()) { if(*i) { (*i)->onInstanceActionFrame(this, action, frame); } ++i; } } void Instance::removeChangeListener(InstanceChangeListener* listener) { if (!m_activity) { return; } std::vector::iterator i = m_activity->m_changeListeners.begin(); while (i != m_activity->m_changeListeners.end()) { if ((*i) == listener) { *i = NULL; return; } ++i; } FL_WARN(_log, "Cannot remove unknown listener"); } void Instance::initializeAction(const std::string& actionName) { assert(m_object); initializeChanges(); const Action *old_action = m_activity->m_actionInfo ? m_activity->m_actionInfo->m_action : NULL; if (m_activity->m_actionInfo) { cancelAction(); } m_activity->m_actionInfo = new ActionInfo(m_object->getPather(), m_location); m_activity->m_actionInfo->m_action = m_object->getAction(actionName); if (!m_activity->m_actionInfo->m_action) { delete m_activity->m_actionInfo; m_activity->m_actionInfo = NULL; throw NotFound(std::string("action ") + actionName + " not found"); } m_activity->m_actionInfo->m_prev_call_time = getRuntime(); if (m_activity->m_actionInfo->m_action != old_action) { m_activity->m_actionInfo->m_action_start_time = m_activity->m_actionInfo->m_prev_call_time; } // start sound if (m_activity->m_actionInfo->m_action->getAudio()) { if (!m_activity->m_soundSource) { m_activity->m_soundSource = new SoundSource(this); } m_activity->m_soundSource->setActionAudio(m_activity->m_actionInfo->m_action->getAudio()); } else if (old_action && old_action->getAudio()) { m_activity->m_soundSource->setActionAudio(NULL); } if (isMultiObject()) { std::vector::iterator multi_it = m_multiInstances.begin(); for (; multi_it != m_multiInstances.end(); ++multi_it) { (*multi_it)->initializeAction(actionName); } } } void Instance::move(const std::string& actionName, const Location& target, const double speed, const std::string& costId) { // if new move is identical with the old then return if (m_activity) { if (m_activity->m_actionInfo) { if (m_activity->m_actionInfo->m_target) { if (m_activity->m_actionInfo->m_target->getLayerCoordinates() == target.getLayerCoordinates() && Mathd::Equal(speed, m_activity->m_actionInfo->m_speed) && m_activity->m_actionInfo->m_action == m_object->getAction(actionName) && costId == m_activity->m_actionInfo->m_route->getCostId()) { return; } } } } initializeAction(actionName); m_activity->m_actionInfo->m_target = new Location(target); m_activity->m_actionInfo->m_speed = speed; FL_DBG(_log, LMsg("starting action ") << actionName << " from" << m_location << " to " << target << " with speed " << speed); Route* route = m_activity->m_actionInfo->m_route; if (!route) { route = new Route(m_location, *m_activity->m_actionInfo->m_target); route->setRotation(getRotation()); if (costId != "") { route->setCostId(costId); } if (isMultiCell()) { route->setObject(m_object); route->setOccupiedArea(m_location.getLayer()->getCellGrid()-> toMultiCoordinates(m_location.getLayerCoordinates(), m_object->getMultiObjectCoordinates(m_rotation))); } else if (m_object->getZStepRange() != -1 || !m_object->getWalkableAreas().empty()) { route->setObject(m_object); } m_activity->m_actionInfo->m_route = route; if (!m_activity->m_actionInfo->m_pather->solveRoute(route)) { setFacingLocation(target); finalizeAction(); } } } void Instance::follow(const std::string& actionName, Instance* leader, const double speed) { initializeAction(actionName); m_activity->m_actionInfo->m_target = new Location(leader->getLocationRef()); m_activity->m_actionInfo->m_speed = speed; m_activity->m_actionInfo->m_leader = leader; leader->addDeleteListener(this); FL_DBG(_log, LMsg("starting action ") << actionName << " from" << m_location << " to " << *m_activity->m_actionInfo->m_target << " with speed " << speed); } void Instance::follow(const std::string& actionName, Route* route, const double speed) { initializeAction(actionName); m_activity->m_actionInfo->m_target = new Location(route->getEndNode()); m_activity->m_actionInfo->m_speed = speed; m_activity->m_actionInfo->m_route = route; m_activity->m_actionInfo->m_delete_route = false; if (isMultiCell()) { route->setObject(m_object); route->setOccupiedArea(m_location.getLayer()->getCellGrid()-> toMultiCoordinates(m_location.getLayerCoordinates(), m_object->getMultiObjectCoordinates(m_rotation))); } else if (m_object->getZStepRange() != -1 || !m_object->getWalkableAreas().empty()) { route->setObject(m_object); } FL_DBG(_log, LMsg("starting action ") << actionName << " from" << m_location << " to " << *m_activity->m_actionInfo->m_target << " with speed " << speed); } void Instance::cancelMovement(uint32_t length) { if (m_activity) { ActionInfo* info = m_activity->m_actionInfo; if (info) { Route* route = info->m_route; if (route) { route->cutPath(length); } } } } Route* Instance::getRoute() { if (m_activity) { ActionInfo* info = m_activity->m_actionInfo; if (info) { return info->m_route; } } return NULL; } void Instance::setCellStackPosition(uint8_t stack) { m_cellStackPos = stack; } uint8_t Instance::getCellStackPosition() { return m_cellStackPos; } bool Instance::isSpecialCost() { return m_specialCost; } const std::vector& Instance::getMultiInstances() { return m_multiInstances; } void Instance::setMainMultiInstance(Instance* main) { m_mainMultiInstance = main; } Instance* Instance::getMainMultiInstance() { return m_mainMultiInstance; } void Instance::actOnce(const std::string& actionName, const Location& direction) { initializeAction(actionName); m_activity->m_actionInfo->m_repeating = false; setFacingLocation(direction); } void Instance::actOnce(const std::string& actionName, int32_t rotation) { initializeAction(actionName); m_activity->m_actionInfo->m_repeating = false; setRotation(rotation); } void Instance::actOnce(const std::string& actionName) { initializeAction(actionName); m_activity->m_actionInfo->m_repeating = false; } void Instance::actRepeat(const std::string& actionName, const Location& direction) { initializeAction(actionName); m_activity->m_actionInfo->m_repeating = true; setFacingLocation(direction); } void Instance::actRepeat(const std::string& actionName, int32_t rotation) { initializeAction(actionName); m_activity->m_actionInfo->m_repeating = true; setRotation(rotation); } void Instance::actRepeat(const std::string& actionName) { initializeAction(actionName); m_activity->m_actionInfo->m_repeating = true; } void Instance::say(const std::string& text, uint32_t duration) { initializeChanges(); delete m_activity->m_sayInfo; m_activity->m_sayInfo = NULL; if (text != "") { m_activity->m_sayInfo = new SayInfo(text, duration); m_activity->m_sayInfo->m_start_time = getRuntime(); } } const std::string* Instance::getSayText() const { if (m_activity && m_activity->m_sayInfo) { return &m_activity->m_sayInfo->m_txt; } return NULL; } bool Instance::processMovement() { ActionInfo* info = m_activity->m_actionInfo; Route* route = info->m_route; Location target; if (info->m_leader) { target = info->m_leader->getLocationRef(); } else { target = *info->m_target; } if (!route) { route = new Route(m_location, *info->m_target); route->setRotation(getRotation()); info->m_route = route; if (isMultiCell()) { route->setObject(m_object); route->setOccupiedArea(m_location.getLayer()->getCellGrid()-> toMultiCoordinates(m_location.getLayerCoordinates(), m_object->getMultiObjectCoordinates(m_rotation))); } else if (m_object->getZStepRange() != -1 || !m_object->getWalkableAreas().empty()) { route->setObject(m_object); } if (!info->m_pather->solveRoute(route)) { setFacingLocation(target); return true; } // update target if needed } else if (route->getEndNode().getLayerCoordinates() != target.getLayerCoordinates()) { if (route->isReplanned() || isMultiCell()) { *info->m_target = route->getEndNode(); route->setReplanned(false); if (isMultiCell()) { route->setOccupiedArea(m_location.getLayer()->getCellGrid()-> toMultiCoordinates(m_location.getLayerCoordinates(), m_object->getMultiObjectCoordinates(m_rotation))); } } else { if (route->getPathLength() == 0) { route->setStartNode(m_location); } else { route->setStartNode(route->getCurrentNode()); } route->setEndNode(target); if (!info->m_pather->solveRoute(route)) { setFacingLocation(target); return true; } } } if (route->getRouteStatus() == ROUTE_SOLVED) { // timeslice for this movement uint32_t timedelta = m_activity->m_timeProvider->getGameTime() - info->m_prev_call_time; // how far we can travel double distance_to_travel = (static_cast(timedelta) / 1000.0) * info->m_speed; // location for this movement Location nextLocation = m_location; bool can_follow = info->m_pather->followRoute(m_location, route, distance_to_travel, nextLocation); if (can_follow) { setRotation(route->getRotation()); // move to another layer if (m_location.getLayer() != nextLocation.getLayer()) { m_location.getLayer()->getMap()->addInstanceForTransfer(this, nextLocation); if (!m_multiInstances.empty()) { std::vector::iterator it = m_multiInstances.begin(); for (; it != m_multiInstances.end(); ++it) { Location newloc = nextLocation; std::vector tmpcoords = m_location.getLayer()->getCellGrid()-> toMultiCoordinates(nextLocation.getLayerCoordinates(), (*it)->getObject()->getMultiPartCoordinates(m_rotation)); newloc.setLayerCoordinates(tmpcoords.front()); m_location.getLayer()->getMap()->addInstanceForTransfer(*it, newloc); } } return false; } setLocation(nextLocation); return false; } // move to another layer if (m_location.getLayer() != nextLocation.getLayer()) { m_location.getLayer()->getMap()->addInstanceForTransfer(this, nextLocation); if (!m_multiInstances.empty()) { std::vector::iterator it = m_multiInstances.begin(); for (; it != m_multiInstances.end(); ++it) { Location newloc = nextLocation; std::vector tmpcoords = m_location.getLayer()->getCellGrid()-> toMultiCoordinates(nextLocation.getLayerCoordinates(), (*it)->getObject()->getMultiPartCoordinates(m_rotation)); newloc.setLayerCoordinates(tmpcoords.front()); m_location.getLayer()->getMap()->addInstanceForTransfer(*it, newloc); } } return true; } setLocation(nextLocation); // need new route? if (route->getEndNode().getLayerCoordinates() != m_location.getLayerCoordinates()) { if (m_location.getLayerDistanceTo(target) > 1.5) { if (route->getPathLength() == 0) { route->setStartNode(m_location); } else { route->setStartNode(route->getPreviousNode()); } route->setEndNode(target); route->setOccupiedArea(m_location.getLayer()->getCellGrid()-> toMultiCoordinates(m_location.getLayerCoordinates(), m_object->getMultiObjectCoordinates(m_rotation))); return !info->m_pather->solveRoute(route); } setFacingLocation(target); } return true; } else if (route->getRouteStatus() == ROUTE_FAILED) { return true; } return false; } InstanceChangeInfo Instance::update() { if (!m_activity) { return ICHANGE_NO_CHANGES; } // remove DeleteListeners m_deleteListeners.erase(std::remove(m_deleteListeners.begin(),m_deleteListeners.end(), (InstanceDeleteListener*)NULL), m_deleteListeners.end()); if (!m_activity->m_timeProvider) { bindTimeProvider(); } ActionInfo* info = m_activity->m_actionInfo; if (info) { // FL_DBG(_log, "updating instance"); if (info->m_target) { // FL_DBG(_log, "action contains target for movement"); bool movement_finished = processMovement(); if (movement_finished) { // FL_DBG(_log, "movement finished"); finalizeAction(); } } else { // FL_DBG(_log, "action does not contain target for movement"); if (m_activity->m_timeProvider->getGameTime() - info->m_action_start_time + info->m_action_offset_time >= info->m_action->getDuration()) { if (info->m_repeating) { info->m_action_start_time = m_activity->m_timeProvider->getGameTime(); // prock: offset no longer needed info->m_action_offset_time = 0; } else if (!m_object->isMultiPart()) { finalizeAction(); } } } // previous code may invalidate actioninfo. if( m_activity->m_actionInfo ) { m_activity->m_actionInfo->m_prev_call_time = m_activity->m_timeProvider->getGameTime(); } } m_activity->update(*this); if (m_activity->m_sayInfo) { if (m_activity->m_sayInfo->m_duration > 0) { if (m_activity->m_timeProvider->getGameTime() >= m_activity->m_sayInfo->m_start_time + m_activity->m_sayInfo->m_duration) { say(""); } } } else if (!m_activity->m_actionInfo && m_changeInfo == ICHANGE_NO_CHANGES && m_activity->m_actionListeners.empty() && m_activity->m_changeListeners.empty()) { // delete superfluous activity delete m_activity; m_activity = 0; return ICHANGE_NO_CHANGES; } return m_changeInfo; } void Instance::finalizeAction() { FL_DBG(_log, "finalizing action"); assert(m_activity); assert(m_activity->m_actionInfo); if( m_activity->m_actionInfo->m_leader ) { m_activity->m_actionInfo->m_leader->removeDeleteListener(this); } Action* action = m_activity->m_actionInfo->m_action; delete m_activity->m_actionInfo; m_activity->m_actionInfo = NULL; // this is needed in case the new action is set on the same pump and // it is the same action as the finalized action m_activity->m_action = NULL; // stop audio if (action->getAudio() && m_activity->m_soundSource) { m_activity->m_soundSource->setActionAudio(NULL); } if (isMultiObject()) { std::vector::iterator multi_it = m_multiInstances.begin(); for (; multi_it != m_multiInstances.end(); ++multi_it) { (*multi_it)->finalizeAction(); } } std::vector::iterator i = m_activity->m_actionListeners.begin(); while (i != m_activity->m_actionListeners.end()) { if(*i) (*i)->onInstanceActionFinished(this, action); ++i; } m_activity->m_actionListeners.erase( std::remove(m_activity->m_actionListeners.begin(), m_activity->m_actionListeners.end(), (InstanceActionListener*)NULL), m_activity->m_actionListeners.end()); } void Instance::cancelAction() { FL_DBG(_log, "cancel action"); assert(m_activity); assert(m_activity->m_actionInfo); if( m_activity->m_actionInfo->m_leader ) { m_activity->m_actionInfo->m_leader->removeDeleteListener(this); } Action* action = m_activity->m_actionInfo->m_action; delete m_activity->m_actionInfo; m_activity->m_actionInfo = NULL; // this is needed in case the new action is set on the same pump and // it is the same action as the canceled action m_activity->m_action = NULL; if (isMultiObject()) { std::vector::iterator multi_it = m_multiInstances.begin(); for (; multi_it != m_multiInstances.end(); ++multi_it) { (*multi_it)->cancelAction(); } } std::vector::iterator i = m_activity->m_actionListeners.begin(); while (i != m_activity->m_actionListeners.end()) { if(*i) (*i)->onInstanceActionCancelled(this, action); ++i; } m_activity->m_actionListeners.erase( std::remove(m_activity->m_actionListeners.begin(), m_activity->m_actionListeners.end(), (InstanceActionListener*)NULL), m_activity->m_actionListeners.end()); } Action* Instance::getCurrentAction() const { if (m_activity && m_activity->m_actionInfo) { return m_activity->m_actionInfo->m_action; } return NULL; } Location Instance::getTargetLocation() const { if (m_activity && m_activity->m_actionInfo && m_activity->m_actionInfo->m_target) { return *m_activity->m_actionInfo->m_target; } return m_location; } double Instance::getMovementSpeed() const { if (m_activity && m_activity->m_actionInfo) { return m_activity->m_actionInfo->m_speed; } return 0; } void Instance::setFacingLocation(const Location& loc) { setRotation(getAngleBetween(m_location, loc)); } Location Instance::getFacingLocation() { return getFacing(m_location, m_rotation); } Location& Instance::getOldLocationRef() { if (m_activity) { return m_activity->m_oldLocation; } return m_location; } int32_t Instance::getOldRotation() const { if (m_activity) { return m_activity->m_oldRotation; } return m_rotation; } uint32_t Instance::getActionRuntime() { if (m_activity && m_activity->m_actionInfo) { if(!m_activity->m_timeProvider) bindTimeProvider(); return m_activity->m_timeProvider->getGameTime() - m_activity->m_actionInfo->m_action_start_time + m_activity->m_actionInfo->m_action_offset_time; } return getRuntime(); } void Instance::setActionRuntime(uint32_t time_offset) { m_activity->m_actionInfo->m_action_offset_time = time_offset; } void Instance::bindTimeProvider() { float multiplier = 1.0; if (m_activity->m_timeProvider) { multiplier = m_activity->m_timeProvider->getMultiplier(); } delete m_activity->m_timeProvider; m_activity->m_timeProvider = NULL; if (m_location.getLayer()) { Map* map = m_location.getLayer()->getMap(); if (map) { m_activity->m_timeProvider = new TimeProvider(map->getTimeProvider()); } } if (!m_activity->m_timeProvider) { m_activity->m_timeProvider = new TimeProvider(NULL); } m_activity->m_timeProvider->setMultiplier(multiplier); } void Instance::refresh() { initializeChanges(); bindTimeProvider(); } InstanceChangeInfo Instance::getChangeInfo() { if (m_activity) { return m_changeInfo; } return ICHANGE_NO_CHANGES; } void Instance::callOnTransparencyChange() { prepareForUpdate(); m_activity->m_additional |= ICHANGE_TRANSPARENCY; } void Instance::callOnVisibleChange() { prepareForUpdate(); m_activity->m_additional |= ICHANGE_VISIBLE; } void Instance::callOnStackPositionChange() { prepareForUpdate(); m_activity->m_additional |= ICHANGE_STACKPOS; } void Instance::setTimeMultiplier(float multip) { initializeChanges(); if (!m_activity->m_timeProvider) { bindTimeProvider(); } m_activity->m_timeProvider->setMultiplier(multip); } float Instance::getTimeMultiplier() { if (m_activity && m_activity->m_timeProvider) { return m_activity->m_timeProvider->getMultiplier(); } return 1.0; } float Instance::getTotalTimeMultiplier() { if (m_activity && m_activity->m_timeProvider) { return m_activity->m_timeProvider->getTotalMultiplier(); } if (m_location.getLayer()) { Map* map = m_location.getLayer()->getMap(); if (map && map->getTimeProvider()) { return map->getTimeProvider()->getTotalMultiplier(); } } return 1.0; } uint32_t Instance::getRuntime() { if (m_activity) { if(!m_activity->m_timeProvider) bindTimeProvider(); return m_activity->m_timeProvider->getGameTime(); } if (m_location.getLayer()) { Map* map = m_location.getLayer()->getMap(); if (map && map->getTimeProvider()) { return map->getTimeProvider()->getGameTime(); } } return TimeManager::instance()->getTime(); } void Instance::setCost(const std::string& id, double cost) { m_specialCost = true; m_costId = id; m_cost = cost; } void Instance::resetCost() { m_specialCost = false; } double Instance::getCost() { if (m_specialCost) { return m_cost; } return m_object->getCost(); } std::string Instance::getCostId() { if (m_specialCost) { return m_costId; } return m_object->getCostId(); } double Instance::getSpeed() { return m_object->getSpeed(); } bool Instance::isSpecialSpeed() { return m_object->isSpecialSpeed(); } bool Instance::isMultiCell() { return m_object->isMultiObject(); } bool Instance::isMultiObject() { return !m_multiInstances.empty(); } void Instance::updateMultiInstances() { if (!m_multiInstances.empty()) { // use map coords for rotation and movement // instances are changed on InstanceTree but not on CellCache Location loc = m_location; const ExactModelCoordinate anchor = m_location.getMapCoordinates(); const ExactModelCoordinate& offset = m_object->getRotationAnchor(); loc.setExactLayerCoordinates(offset); const ExactModelCoordinate anchor_offset = loc.getMapCoordinates(); int32_t rot = m_rotation; if (m_object->isRestrictedRotation()) { rot = m_object->getRestrictedRotation(m_rotation); } double mcos = Mathd::Cos(double(rot) * (Mathd::pi()/180.0)); double msin = Mathd::Sin(double(rot) * (Mathd::pi()/180.0)); std::vector::iterator it = m_multiInstances.begin(); for (; it != m_multiInstances.end(); ++it) { // use rotation 0 to get the "default" coordinate std::vector mcv = (*it)->getObject()->getMultiPartCoordinates(0); loc.setLayerCoordinates(mcv.front()); ExactModelCoordinate emc = loc.getMapCoordinates(); ExactModelCoordinate nemc(emc.x-anchor_offset.x, emc.y-anchor_offset.y); emc.x = ((nemc.x * mcos + nemc.y * msin) + anchor_offset.x) + anchor.x; emc.y = ((-nemc.x * msin + nemc.y * mcos) + anchor_offset.y) + anchor.y; loc.setMapCoordinates(emc); (*it)->setLocation(loc); (*it)->setRotation(rot); } } } void Instance::addStaticColorOverlay(uint32_t angle, const OverlayColors& colors) { if (!m_ownObject) { createOwnObject(); } ObjectVisual* objVis = m_object->getVisual(); objVis->addStaticColorOverlay(angle, colors); prepareForUpdate(); m_activity->m_additional |= ICHANGE_VISUAL; } OverlayColors* Instance::getStaticColorOverlay(int32_t angle) { if (!m_ownObject) { return 0; } ObjectVisual* objVis = m_object->getVisual(); return objVis->getStaticColorOverlay(angle); } void Instance::removeStaticColorOverlay(int32_t angle) { if (m_ownObject) { ObjectVisual* objVis = m_object->getVisual(); objVis->removeStaticColorOverlay(angle); prepareForUpdate(); m_activity->m_additional |= ICHANGE_VISUAL; } } bool Instance::isStaticColorOverlay() { if (!m_ownObject) { return false; } ObjectVisual* objVis = m_object->getVisual(); return objVis->isColorOverlay(); } void Instance::addColorOverlay(const std::string& actionName, uint32_t angle, const OverlayColors& colors) { ActionVisual* visual = getActionVisual(actionName, true); if (visual) { visual->addColorOverlay(angle, colors); prepareForUpdate(); m_activity->m_additional |= ICHANGE_VISUAL; } } OverlayColors* Instance::getColorOverlay(const std::string& actionName, uint32_t angle) { ActionVisual* visual = getActionVisual(actionName, false); if (visual) { return visual->getColorOverlay(angle); } return NULL; } void Instance::removeColorOverlay(const std::string& actionName, int32_t angle) { ActionVisual* visual = getActionVisual(actionName, false); if (visual) { visual->removeColorOverlay(angle); prepareForUpdate(); m_activity->m_additional |= ICHANGE_VISUAL; } } void Instance::addAnimationOverlay(const std::string& actionName, uint32_t angle, int32_t order, const AnimationPtr& animationptr) { ActionVisual* visual = getActionVisual(actionName, true); if (visual) { visual->addAnimationOverlay(angle, order, animationptr); prepareForUpdate(); m_activity->m_additional |= ICHANGE_VISUAL; } } std::map Instance::getAnimationOverlay(const std::string& actionName, int32_t angle) { ActionVisual* visual = getActionVisual(actionName, false); if (visual) { return visual->getAnimationOverlay(angle); } return std::map(); } void Instance::removeAnimationOverlay(const std::string& actionName, uint32_t angle, int32_t order) { ActionVisual* visual = getActionVisual(actionName, false); if (visual) { visual->removeAnimationOverlay(angle, order); prepareForUpdate(); m_activity->m_additional |= ICHANGE_VISUAL; } } void Instance::addColorOverlay(const std::string& actionName, uint32_t angle, int32_t order, const OverlayColors& colors) { ActionVisual* visual = getActionVisual(actionName, true); if (visual) { visual->addColorOverlay(angle, order, colors); prepareForUpdate(); m_activity->m_additional |= ICHANGE_VISUAL; } } OverlayColors* Instance::getColorOverlay(const std::string& actionName, uint32_t angle, int32_t order) { ActionVisual* visual = getActionVisual(actionName, false); if (visual) { return visual->getColorOverlay(angle, order); } return NULL; } void Instance::removeColorOverlay(const std::string& actionName, int32_t angle, int32_t order) { ActionVisual* visual = getActionVisual(actionName, false); if (visual) { visual->removeColorOverlay(angle, order); prepareForUpdate(); m_activity->m_additional |= ICHANGE_VISUAL; } } bool Instance::isAnimationOverlay(const std::string& actionName) { ActionVisual* visual = getActionVisual(actionName, false); if (visual) { return visual->isAnimationOverlay(); } return false; } bool Instance::isColorOverlay(const std::string& actionName) { ActionVisual* visual = getActionVisual(actionName, false); if (visual) { return visual->isColorOverlay(); } return false; } void Instance::convertToOverlays(const std::string& actionName, bool color) { ActionVisual* visual = getActionVisual(actionName, true); visual->convertToOverlays(color); } void Instance::createOwnObject() { if (!m_ownObject) { m_ownObject = true; ObjectVisual* ov = m_object->getVisual(); ObjectVisual* nov = 0; m_object = new Object(m_object->getId(), m_object->getNamespace(), m_object); if (!ov) { ObjectVisual::create(m_object); } else { nov = new ObjectVisual(*ov); m_object->adoptVisual(nov); } } } ActionVisual* Instance::getActionVisual(const std::string& actionName, bool create) { ActionVisual* nav = NULL; if (!m_ownObject) { createOwnObject(); } Action* action = m_object->getAction(actionName, false); if (!action) { action = m_object->getAction(actionName); if (!action) { throw NotFound(std::string("action ") + actionName + " not found"); } else if (create) { // if we change the current action then we have to replace the pointer bool replace = getCurrentAction() == action; // check if its the default action bool defaultAction = m_object->getDefaultAction() == action; ActionVisual* av = action->getVisual(); action = m_object->createAction(actionName, defaultAction); nav = new ActionVisual(*av); action->adoptVisual(nav); if (replace) { m_activity->m_actionInfo->m_action = action; } } } else { nav = action->getVisual(); } return nav; } void Instance::addDeleteListener(InstanceDeleteListener *listener) { m_deleteListeners.push_back(listener); } void Instance::removeDeleteListener(InstanceDeleteListener *listener) { if (!m_deleteListeners.empty()) { std::vector::iterator itor; itor = std::find(m_deleteListeners.begin(), m_deleteListeners.end(), listener); if(itor != m_deleteListeners.end()) { if ((*itor) == listener) { *itor = NULL; return; } } else { FL_WARN(_log, "Cannot remove unknown listener"); } } } void Instance::onInstanceDeleted(Instance* instance) { if(m_activity && m_activity->m_actionInfo && m_activity->m_actionInfo->m_leader == instance) { m_activity->m_actionInfo->m_leader = NULL; } if (isMultiObject()) { std::vector::iterator multi_it = m_multiInstances.begin(); for (; multi_it != m_multiInstances.end(); ++multi_it) { if (*multi_it == instance) { m_multiInstances.erase(multi_it); break; } } } } } fifengine-0.4.2/engine/core/model/structures/instance.h000066400000000000000000000522671341615052600231630ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_INSTANCE_H #define FIFE_INSTANCE_H // Standard C++ library includes #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/fifeclass.h" #include "model/metamodel/object.h" #include "model/metamodel/ivisual.h" #include "view/visual.h" #include "location.h" namespace FIFE { class Layer; class Action; class Instance; class ActionInfo; class SayInfo; class SoundSource; class TimeProvider; class Route; class InstanceActionListener { public: virtual ~InstanceActionListener() {}; virtual void onInstanceActionFinished(Instance* instance, Action* action) = 0; virtual void onInstanceActionCancelled(Instance* instance, Action* action) = 0; virtual void onInstanceActionFrame(Instance* instance, Action* action, int32_t frame) = 0; }; enum InstanceChangeType { ICHANGE_NO_CHANGES = 0x0000, ICHANGE_LOC = 0x0001, ICHANGE_ROTATION = 0x0002, ICHANGE_SPEED = 0x0004, ICHANGE_ACTION = 0x0008, ICHANGE_TIME_MULTIPLIER = 0x0010, ICHANGE_SAYTEXT = 0x0020, ICHANGE_BLOCK = 0x0040, ICHANGE_CELL = 0x0080, ICHANGE_TRANSPARENCY = 0x0100, ICHANGE_VISIBLE = 0x0200, ICHANGE_STACKPOS = 0x0400, ICHANGE_VISUAL = 0x0800 }; typedef uint32_t InstanceChangeInfo; class InstanceChangeListener { public: virtual ~InstanceChangeListener() {}; virtual void onInstanceChanged(Instance* instance, InstanceChangeInfo info) = 0; }; class InstanceDeleteListener { public: virtual ~InstanceDeleteListener() {}; virtual void onInstanceDeleted(Instance* instance) =0; }; /** An Instance is an "instantiation" of an Object at a Location. * */ class Instance : public FifeClass, public InstanceDeleteListener { public: /** Constructor * Instances are created by calling addInstance from layer, thus * this method should really be called only by layer or test code */ Instance(Object* object, const Location& location, const std::string& identifier=""); /** Destructor */ virtual ~Instance(); /** Get the identifier for this instance; possibly null. */ const std::string& getId(); /** Set the identifier for this instance. */ void setId(const std::string& identifier=""); /** Gets object where this instance is instantiated from */ Object* getObject(); /** Sets location of the instance * @param loc new location */ void setLocation(const Location& loc); /** Gets current location of instance * @note does not return const Location&, since swig wont be const correct * @return current location */ Location getLocation() const; /** Gets reference of current location of instance * @return reference to current location */ Location& getLocationRef(); /** Gets movement target in case instance is moving. In case not, returns current location * To move target location, call move-method * @see move * @note does not return const Location&, since swig wont be const correct * @return Movement target location */ Location getTargetLocation() const; /** Sets the direction where instance is heading. Useful e.g. with static * instances which don't "move" or "act" */ void setFacingLocation(const Location& loc); /** Returns the direction where instance is heading * @note does not return const Location&, since swig wont be const correct * @return the direction of instance. */ Location getFacingLocation(); /** Gets reference of old location of instance * @return reference to old location */ Location& getOldLocationRef(); /** Set the rotation offset of this instance */ void setRotation(int32_t rotation); /** Get the rotation offset of this instance * Returns direction where instance is heading */ int32_t getRotation() const; /** Get the old rotation offset of this instance * Returns direction where instance was heading */ int32_t getOldRotation() const; /** Sets if instance blocks movement */ void setBlocking(bool blocking); /** Gets if instance blocks movement */ bool isBlocking() const; /** Sets if instance blocking can overriden */ void setOverrideBlocking(bool overblock); /** Gets if instance blocking can overriden */ bool isOverrideBlocking() const; /** Auxiliary function to inform ActionListeners about the active ActionFrame. * @param action pointer to the action * @param frame frame index number of the animation */ void callOnActionFrame(Action* action, int32_t frame); /** Adds new instance action listener * @param listener to add */ void addActionListener(InstanceActionListener* listener); /** Removes associated instance action listener * @param listener to remove */ void removeActionListener(InstanceActionListener* listener); /** Adds new instance change listener * @param listener to add */ void addChangeListener(InstanceChangeListener* listener); /** Removes associated instance change listener * @param listener to remove */ void removeChangeListener(InstanceChangeListener* listener); /** Adds new instance delete listener * @param listener to add */ void addDeleteListener(InstanceDeleteListener* listener); /** Removes associated instance delete listener * @param listener to remove */ void removeDeleteListener(InstanceDeleteListener* listener); /** Gets the currently active action. This is owned by * the instance's object, so don't delete it! * @return current action, NULL in case there is none */ Action* getCurrentAction() const; /** Gets the speed in case instance is moving * otherwise returns 0 * @return instance speed. Value 1 means distance 1 in layer coordinates / second */ double getMovementSpeed() const; /** Gets the time in milliseconds how long action has been active * In case there is no current action, returns -1 * @return action runtime */ uint32_t getActionRuntime(); /** Sets the time in milliseconds how long an action has been active * This was requested in Ticket #373. This way the state * of the action can be saved and restored at a later time * @param time_offset The action time offset that should be applied */ void setActionRuntime(uint32_t time_offset); /** Performs given named action to the instance. While performing the action * moves instance to given target with given speed * @param actionName name of the action * @param target place where to move this instance * @param speed speed used for movement. Units = distance 1 in layer coordinates per second * @param costId id for special costs which is be used as extra multiplier. */ void move(const std::string& actionName, const Location& target, const double speed, const std::string& costId = ""); /** Performs given named action to the instance, once only. Performs no movement * @param actionName name of the action * @param direction coordinates for cell towards instance is heading to when performing the action */ void actOnce(const std::string& actionName, const Location& direction); /** Performs given named action to the instance, once only. Performs no movement * @param actionName name of the action * @param rotation rotation which the instance use when performing the action */ void actOnce(const std::string& actionName, int32_t rotation); /** Performs given named action to the instance, once only. Performs no movement and use current rotation * @param actionName name of the action */ void actOnce(const std::string& actionName); /** Performs given named action to the instance, repeated. Performs no movement * @param actionName name of the action * @param direction coordinates for cell towards instance is heading to when performing the action */ void actRepeat(const std::string& actionName, const Location& direction); /** Performs given named action to the instance, repeated Performs no movement * @param actionName name of the action * @param rotation rotation which the instance use when performing the action */ void actRepeat(const std::string& actionName, int32_t rotation); /** Performs given named action to the instance, repeated. Performs no movement and use current rotation * @param actionName name of the action */ void actRepeat(const std::string& actionName); /** Causes instance to "say" given text (shown on screen next to the instance) * @param text text to say. If "" given, clear the text * @param duration duration to show the text (in ms). If 0, shows forever */ void say(const std::string& text, uint32_t duration=0); /** Performs given named action to the instance. While performing the action * follows given instance with given speed * @param actionName name of the action * @param leader followed instance * @param speed speed used for movement. Units = distance 1 in layer coordinates per second */ void follow(const std::string& actionName, Instance* leader, const double speed); /** Performs given named action to the instance. While performing the action * follows given route with given speed. Note: In this case route isn't deleted or resetted at the end. * @param actionName name of the action * @param route followed route * @param speed speed used for movement. Units = distance 1 in layer coordinates per second */ void follow(const std::string& actionName, Route* route, const double speed); /** Cancel movement after a given length. * If no length is set then 1 is used. This means that the instance * stops at the center of the next cell (can be the same as the current). */ void cancelMovement(uint32_t length = 1); /** Returns pointer to currently set saytext. In case no text is set, returns NULL */ const std::string* getSayText() const; /** Updates the instance related to the current action * @note call this only once in engine update cycle, so that tracking between * current position and previous position keeps in sync. * @returns marked changes */ InstanceChangeInfo update(); /** If this returns true, the instance needs to be updated */ bool isActive() const; /** Sets visualization to be used. Transfers ownership. */ void setVisual(IVisual* visual) { m_visual = visual; } /** Gets used visualization */ template T* getVisual() const { return reinterpret_cast(m_visual); } void callOnTransparencyChange(); void callOnVisibleChange(); void callOnStackPositionChange(); /** Sets speed for the map. See Model::setTimeMultiplier. */ void setTimeMultiplier(float multip); /** Gets instance speed. @see setTimeMultiplier. */ float getTimeMultiplier(); /** Gets instance speed, considering also model and map speeds. @see setTimeMultiplier. */ float getTotalTimeMultiplier(); /** Gets the scaled runtime in milliseconds * @return runtime */ uint32_t getRuntime(); /** Refreshes instance e.g. in case location is updated directly (not via setLocation) * In this case e.g. instance's master time provider is changed, so it needs to be updated */ void refresh(); /** Returns a bitmask of changes of the last update. */ InstanceChangeInfo getChangeInfo(); /** callback so other instances we depend on can notify us if they go away */ void onInstanceDeleted(Instance* instance); /** Returns a pointer to the route, in case there is no, it returns NULL. */ Route* getRoute(); /** Sets the cell stack position. */ void setCellStackPosition(uint8_t stack); /** Gets the cell stack position. */ uint8_t getCellStackPosition(); /** Returns true if instance or object have special cost otherwise false. */ bool isSpecialCost(); /** Sets for the given cost id a cost. * @param id name of the cost id * @param cost value for the cost */ void setCost(const std::string& id, double cost); /** Resets cost. */ void resetCost(); /** Returns cost value. In case there is no it returns the object cost. */ double getCost(); /** Returns cost id. In case there is no it returns the object cost id. */ std::string getCostId(); /** Returns speed modifier. */ double getSpeed(); /** Returns true if instance or object have special speed modifier otherwise false. */ bool isSpecialSpeed(); /** Returns true if it is multi cell otherwise false */ bool isMultiCell(); /** Returns true if it is multi object otherwise false */ bool isMultiObject(); /** Updates the visual positions of all instances in case this is a multi object */ void updateMultiInstances(); /** Returns a vector that contains all instances of a multi object */ const std::vector& getMultiInstances(); /** Sets a instance to the main multi instance of this instance. */ void setMainMultiInstance(Instance* main); /** Returns a pointer to the main mulit instance or Null if the instance is not part of a multi instance object. */ Instance* getMainMultiInstance(); /** Adds new static color overlay with given angle (degrees). */ void addStaticColorOverlay(uint32_t angle, const OverlayColors& colors); /** Returns closest matching static color overlay for given angle * @return pointer to OverlayColor class */ OverlayColors* getStaticColorOverlay(int32_t angle); /** Removes a static color overlay with given angle (degrees). */ void removeStaticColorOverlay(int32_t angle); /** Indicates if there exists a static color overlay. */ bool isStaticColorOverlay(); /** Adds new color overlay with given angle (degrees) to given action. */ void addColorOverlay(const std::string& actionName, uint32_t angle, const OverlayColors& colors); /** Returns closest matching color overlay for given angle and action. * @return pointer to OverlayColor class */ OverlayColors* getColorOverlay(const std::string& actionName, uint32_t angle); /** Removes a color overlay with given angle (degrees) from given action. */ void removeColorOverlay(const std::string& actionName, int32_t angle); /** Adds new animation overlay with given angle (degrees) and order to given action. */ void addAnimationOverlay(const std::string& actionName, uint32_t angle, int32_t order, const AnimationPtr& animationptr); /** Gets map with animations closest to given angle. * @return ordered animation map */ std::map getAnimationOverlay(const std::string& actionName, int32_t angle); /** Removes animation overlay with given angle (degrees) and order from action. */ void removeAnimationOverlay(const std::string& actionName, uint32_t angle, int32_t order); /** Adds new color overlay with given angle (degrees) and order to given action animation overlay. */ void addColorOverlay(const std::string& actionName, uint32_t angle, int32_t order, const OverlayColors& colors); /** Returns closest matching color overlay for given angle, order and action animation overlay. * @return pointer to OverlayColor class */ OverlayColors* getColorOverlay(const std::string& actionName, uint32_t angle, int32_t order); /** Removes a color overlay with given angle (degrees), order from given action animation overlay. */ void removeColorOverlay(const std::string& actionName, int32_t angle, int32_t order); /** If the action have base animation and optional color overlay it gets converted to animation overlay. */ void convertToOverlays(const std::string& actionName, bool color); /** Indicates if there exists a animation overlay for given action. */ bool isAnimationOverlay(const std::string& actionName); /** Indicates if there exists a color overlay for given action or animation overlay. */ bool isColorOverlay(const std::string& actionName); private: std::string m_id; //! The rotation offset of this instance. This is in addition to possible camera rotation and //! intended for setting, for example, a rotation of a tile. int32_t m_rotation; /** InstanceActivity gets allocated in case there is some runtime * activity related to the instance. Keeping activity related variables * in separate class keeps memory consumption lower e.g. for large tile * areas. * Class also keeps track of changes since the previous update call. * With this bookkeeping, it is possible to optimize several spots in * the engine, basically only reacting to changes instead of polling. */ class InstanceActivity { public: InstanceActivity(Instance& source); ~InstanceActivity(); // ----- Fields related to change tracking ----- //! updates cached variables, marks changes void update(Instance& source); //! location on previous round Location m_location; //! location on previous cell Location m_oldLocation; //! rotation on previous round int32_t m_rotation; //! rotation on previous round int32_t m_oldRotation; //! action on previous round. NOTE: might become invalid, only used for address comparison Action* m_action; //! sound source of action audio on previous round SoundSource* m_soundSource; //! speed on previous round double m_speed; //! time multiplier on previous round float m_timeMultiplier; //! say text on previous round std::string m_sayText; //! listeners for changes std::vector m_changeListeners; // ----- Fields related to generic activity ----- //! listeners for action related events std::vector m_actionListeners; //! action information, allocated when actions are bind ActionInfo* m_actionInfo; //! text to say + duration, allocated when something is said SayInfo* m_sayInfo; //! time scaler for this instance TimeProvider* m_timeProvider; //! blocking status on previous round bool m_blocking; //! additional change info, used for visual class (transparency, visible, stackpos) InstanceChangeInfo m_additional; }; InstanceActivity* m_activity; //! bitmask stating current changes InstanceChangeInfo m_changeInfo; //! listeners for deletion of the instance std::vector m_deleteListeners; //! object where instantiated from Object* m_object; //! indicates if m_object is customized bool m_ownObject; //! current location Location m_location; //! instance visualization IVisual* m_visual; //! instance blocking info bool m_blocking; //! allow to override the blocking property bool m_overrideBlocking; //! position on cell stack uint8_t m_cellStackPos; //! indicates special cost bool m_specialCost; //! holds cost value double m_cost; //! holds cost id std::string m_costId; //! vector that holds all multi instances std::vector m_multiInstances; //! pointer to the main multi instance Instance* m_mainMultiInstance; Instance(const Instance&); Instance& operator=(const Instance&); //! Finalize current action void finalizeAction(); //! Cancel current action void cancelAction(); //! Initialize action for use void initializeAction(const std::string& actionName); //! Moves instance. Returns true if finished bool processMovement(); //! Calculates movement based current location and speed void calcMovement(); //! rebinds time provider based on new location void bindTimeProvider(); //! called when instance has been changed. Causes instance to create InstanceActivity void initializeChanges(); //! called to prepare the instance for an update void prepareForUpdate(); //! Creates an own object for the instance to allow visual customization. void createOwnObject(); //! Returns pointer to action visual, can also create it. ActionVisual* getActionVisual(const std::string& actionName, bool create); }; } // FIFE #endif fifengine-0.4.2/engine/core/model/structures/instance.i000066400000000000000000000161011341615052600231470ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fife %{ #include "model/structures/instance.h" %} %include "model/metamodel/modelcoords.i" %include "model/metamodel/ivisual.i" %include "util/structures/utilstructures.i" %include "util/base/utilbase.i" %include "location.i" namespace FIFE { class Layer; class Action; class Object; class Instance; class Route; class OverlayColors; class AnimationPtr; %feature("director") InstanceActionListener; class InstanceActionListener { public: virtual ~InstanceActionListener() {}; virtual void onInstanceActionFinished(Instance* instance, Action* action) = 0; virtual void onInstanceActionCancelled(Instance* instance, Action* action) = 0; virtual void onInstanceActionFrame(Instance* instance, Action* action, int32_t frame) = 0; }; enum InstanceChangeType { ICHANGE_NO_CHANGES = 0x0000, ICHANGE_LOC = 0x0001, ICHANGE_ROTATION = 0x0002, ICHANGE_SPEED = 0x0004, ICHANGE_ACTION = 0x0008, ICHANGE_TIME_MULTIPLIER = 0x0010, ICHANGE_SAYTEXT = 0x0020, ICHANGE_BLOCK = 0x0040, ICHANGE_CELL = 0x0080, ICHANGE_TRANSPARENCY = 0x0100, ICHANGE_VISIBLE = 0x0200, ICHANGE_STACKPOS = 0x0400 }; typedef uint32_t InstanceChangeInfo; %feature("director") InstanceChangeListener; class InstanceChangeListener { public: virtual ~InstanceChangeListener() {}; virtual void onInstanceChanged(Instance* instance, InstanceChangeInfo info) = 0; }; %feature("director") InstanceDeleteListener; class InstanceDeleteListener { public: virtual ~InstanceDeleteListener() {}; virtual void onInstanceDeleted(Instance* instance) = 0; }; class Instance : public FifeClass { public: Instance(Object* object, const Location& location, const std::string& identifier=""); virtual ~Instance(); const std::string& getId(); void setId(const std::string& identifier=""); Object* getObject(); void setLocation(const Location& loc); Location getLocation() const; Location& getLocationRef(); Location getTargetLocation() const; void setRotation(int32_t); int32_t getRotation() const; int32_t getOldRotation() const; void setBlocking(bool blocking); bool isBlocking() const; void setOverrideBlocking(bool overblock); bool isOverrideBlocking() const; void addActionListener(InstanceActionListener* listener); void removeActionListener(InstanceActionListener* listener); void addChangeListener(InstanceChangeListener* listener); void removeChangeListener(InstanceChangeListener* listener); void addDeleteListener(InstanceDeleteListener* listener); void removeDeleteListener(InstanceDeleteListener* listener); Action* getCurrentAction() const; double getMovementSpeed() const; void setFacingLocation(const Location& loc); Location getFacingLocation(); uint32_t getActionRuntime(); void setActionRuntime(uint32_t time_offset); void move(const std::string& actionName, const Location& target, const double speed, const std::string& costId = ""); void actOnce(const std::string& actionName, const Location& direction); void actOnce(const std::string& actionName, int32_t rotation); void actOnce(const std::string& actionName); void actRepeat(const std::string& actionName, const Location& direction); void actRepeat(const std::string& actionName, int32_t rotation); void actRepeat(const std::string& actionName); void follow(const std::string& actionName, Instance* leader, const double speed); void follow(const std::string& actionName, Route* route, const double speed); void cancelMovement(uint32_t length = 1); void say(const std::string& text, uint32_t duration=0); void setTimeMultiplier(float multip); float getTimeMultiplier(); uint32_t getRuntime(); void refresh(); InstanceChangeInfo getChangeInfo(); void setVisual(IVisual* visual); template T* getVisual() const; Route* getRoute(); void setCellStackPosition(uint8_t stack); uint8_t getCellStackPosition(); bool isSpecialCost(); void setCost(const std::string& id, double cost); void resetCost(); double getCost(); std::string getCostId(); double getSpeed(); bool isSpecialSpeed(); bool isMultiCell(); bool isMultiObject(); const std::vector& getMultiInstances(); Instance* getMainMultiInstance(); void addStaticColorOverlay(uint32_t angle, const OverlayColors& colors); OverlayColors* getStaticColorOverlay(int32_t angle); void removeStaticColorOverlay(int32_t angle); bool isStaticColorOverlay(); void addColorOverlay(const std::string& actionName, uint32_t angle, const OverlayColors& colors); OverlayColors* getColorOverlay(const std::string& actionName, uint32_t angle); void removeColorOverlay(const std::string& actionName, int32_t angle); void addAnimationOverlay(const std::string& actionName, uint32_t angle, int32_t order, const AnimationPtr& animationptr); std::map getAnimationOverlay(const std::string& actionName, int32_t angle); void removeAnimationOverlay(const std::string& actionName, uint32_t angle, int32_t order); void addColorOverlay(const std::string& actionName, uint32_t angle, int32_t order, const OverlayColors& colors); OverlayColors* getColorOverlay(const std::string& actionName, uint32_t angle, int32_t order); void removeColorOverlay(const std::string& actionName, int32_t angle, int32_t order); void convertToOverlays(const std::string& actionName, bool color); bool isAnimationOverlay(const std::string& actionName); bool isColorOverlay(const std::string& actionName); }; } namespace std { %template(InstanceVector) vector; %template(InstanceList) list; %template(AnimationOverlayMap) map; } fifengine-0.4.2/engine/core/model/structures/instancetree.cpp000066400000000000000000000106631341615052600243700ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/exception.h" #include "util/log/logger.h" #include "model/structures/instance.h" #include "util/structures/rect.h" #include "instancetree.h" namespace FIFE { static Logger _log(LM_STRUCTURES); InstanceTree::InstanceTree(): FifeClass() { } InstanceTree::~InstanceTree() { } void InstanceTree::addInstance(Instance* instance) { ModelCoordinate coords = instance->getLocationRef().getLayerCoordinates(); InstanceTreeNode * node = m_tree.find_container(coords.x,coords.y,0,0); InstanceList& list = node->data(); list.push_back(instance); if( m_reverse.find(instance) != m_reverse.end() ) { FL_WARN(_log, "InstanceTree::addInstance() - Duplicate Instance. Ignoring."); return; } m_reverse[instance] = node; } void InstanceTree::removeInstance(Instance* instance) { InstanceTreeNode * node = m_reverse[instance]; if( !node ) { FL_WARN(_log, "InstanceTree::removeInstance() - Instance not part of tree."); return; } m_reverse.erase(instance); InstanceList& list = node->data(); for(InstanceList::iterator i = list.begin(); i != list.end(); ++i) { if((*i) == instance) { list.erase(i); return; } } FL_WARN(_log, "InstanceTree::removeInstance() - Instance part of tree but not found in the expected tree node."); } class InstanceListCollector { public: InstanceTree::InstanceList& instanceList; Rect searchRect; InstanceListCollector(InstanceTree::InstanceList& a_instanceList, const Rect& rect) : instanceList(a_instanceList), searchRect(rect) { } bool visit(InstanceTree::InstanceTreeNode* node, int32_t d); }; bool InstanceListCollector::visit(InstanceTree::InstanceTreeNode* node, int32_t d) { InstanceTree::InstanceList& list = node->data(); for(InstanceTree::InstanceList::const_iterator it(list.begin()); it != list.end(); ++it) { ModelCoordinate coords = (*it)->getLocationRef().getLayerCoordinates(); if( searchRect.contains(Point(coords.x,coords.y)) ) { instanceList.push_back(*it); } } return true; } void InstanceTree::findInstances(const ModelCoordinate& point, int32_t w, int32_t h, InstanceTree::InstanceList& list) { list.clear(); InstanceTreeNode * node = m_tree.find_container(point.x, point.y, w, h); Rect rect(point.x, point.y, w, h); InstanceListCollector collector(list,rect); node->apply_visitor(collector); node = node->parent(); while( node ) { for(InstanceList::const_iterator it(node->data().begin()); it != node->data().end(); ++it) { ModelCoordinate coords = (*it)->getLocationRef().getLayerCoordinates(); if( rect.contains(Point(coords.x,coords.y)) ) { list.push_back(*it); } } node = node->parent(); } } } fifengine-0.4.2/engine/core/model/structures/instancetree.h000066400000000000000000000072741341615052600240410ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_INSTANCETREE_H #define FIFE_INSTANCETREE_H // Standard C++ library includes #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src #include "util/base/fifeclass.h" #include "util/structures/quadtree.h" #include "model/metamodel/modelcoords.h" namespace FIFE { class Instance; class InstanceTree: public FifeClass { public: static const int32_t MIN_TREE_SIZE = 2; typedef std::list InstanceList; typedef QuadTree< InstanceList, MIN_TREE_SIZE > InstanceQuadTree; typedef InstanceQuadTree::Node InstanceTreeNode; /** Constructor * */ InstanceTree(); /** Destructor * */ virtual ~InstanceTree(); /** Adds an instance to the quad tree. * * Adds an instance to the quad tree based upon it's location on the layer and it's * area. * * @param instance A pointer to the instance to add. * @note In case you added the instance before this will throw. */ void addInstance(Instance* instance); /** Removes an instance from the quad tree. * * Locates an instance in the quad tree then removes it. * * @param instance A pointer to the instance to find and remove. * @note In case you did @b not add the instance before this will throw. */ void removeInstance(Instance* instance); /** Find all instances in a given area. * * Takes a box as an area then returns a vector filled with all instances that intersect * with that box. * * @param point A ModelCoordinate representing the upper left part of the search area. * @param w The width of the search area in Model Units. * @param h The height of the search area in Model Units. * @param list vector reference that will be filled with all instances within that space. */ void findInstances(const ModelCoordinate& point, int32_t w, int32_t h, InstanceList& list); /** See QuadNode::apply_visitor */ template void applyVisitor(Visitor& visitor) { m_tree.apply_visitor(visitor); } private: InstanceQuadTree m_tree; std::map m_reverse; }; } #endif fifengine-0.4.2/engine/core/model/structures/layer.cpp000066400000000000000000000467361341615052600230320ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/log/logger.h" #include "util/structures/purge.h" #include "model/metamodel/grids/cellgrid.h" #include "layer.h" #include "instance.h" #include "map.h" #include "instancetree.h" #include "cell.h" #include "cellcache.h" #include "trigger.h" namespace FIFE { /** Logger to use for this source file. * @relates Logger */ static Logger _log(LM_STRUCTURES); Layer::Layer(const std::string& identifier, Map* map, CellGrid* grid) : m_id(identifier), m_map(map), m_instancesVisibility(true), m_transparency(0), m_instanceTree(new InstanceTree()), m_grid(grid), m_pathingStrategy(CELL_EDGES_ONLY), m_sortingStrategy(SORTING_CAMERA), m_walkable(false), m_interact(false), m_walkableId(""), m_cellCache(NULL), m_changeListeners(), m_changedInstances(), m_changed(false), m_static(false) { } Layer::~Layer() { // if this is a walkable layer destroyCellCache(); // if this is a interact layer if (m_interact) { Layer* temp = m_map->getLayer(m_walkableId); if (temp) { temp->removeInteractLayer(this); } } purge(m_instances); delete m_instanceTree; } const std::string& Layer::getId() const { return m_id; } void Layer::setId(const std::string& id) { m_id = id; } Map* Layer::getMap() const { return m_map; } CellGrid* Layer::getCellGrid() const { return m_grid; } void Layer::setCellGrid(CellGrid* grid) { m_grid = grid; } InstanceTree* Layer::getInstanceTree(void) const { return m_instanceTree; } bool Layer::hasInstances() const { return !m_instances.empty(); } Instance* Layer::createInstance(Object* object, const ModelCoordinate& p, const std::string& id) { ExactModelCoordinate emc(static_cast(p.x), static_cast(p.y), static_cast(p.z)); return createInstance(object, emc, id); } Instance* Layer::createInstance(Object* object, const ExactModelCoordinate& p, const std::string& id) { Location location(this); location.setExactLayerCoordinates(p); Instance* instance = new Instance(object, location, id); if(instance->isActive()) { setInstanceActivityStatus(instance, instance->isActive()); } m_instances.push_back(instance); m_instanceTree->addInstance(instance); std::vector::iterator i = m_changeListeners.begin(); while (i != m_changeListeners.end()) { (*i)->onInstanceCreate(this, instance); ++i; } m_changed = true; return instance; } bool Layer::addInstance(Instance* instance, const ExactModelCoordinate& p){ if( !instance ){ FL_ERR(_log, "Tried to add an instance to layer, but given instance is invalid"); return false; } Location& location = instance->getLocationRef(); location.setLayer(this); location.setExactLayerCoordinates(p); m_instances.push_back(instance); m_instanceTree->addInstance(instance); if(instance->isActive()) { setInstanceActivityStatus(instance, instance->isActive()); } std::vector::iterator i = m_changeListeners.begin(); while (i != m_changeListeners.end()) { (*i)->onInstanceCreate(this, instance); ++i; } m_changed = true; return true; } void Layer::removeInstance(Instance* instance) { // If the instance is changed and removed on the same pump, // it can happen that the instance can not cleanly be removed, // to avoid this we have to update the instance first and send // the result to the LayerChangeListeners. if (instance->isActive()) { if (instance->update() != ICHANGE_NO_CHANGES) { std::vector updateInstances; updateInstances.push_back(instance); std::vector::iterator i = m_changeListeners.begin(); while (i != m_changeListeners.end()) { (*i)->onLayerChanged(this, updateInstances); ++i; } } } std::vector::iterator i = m_changeListeners.begin(); while (i != m_changeListeners.end()) { (*i)->onInstanceDelete(this, instance); ++i; } setInstanceActivityStatus(instance, false); std::vector::iterator it = m_instances.begin(); for(; it != m_instances.end(); ++it) { if(*it == instance) { m_instanceTree->removeInstance(*it); m_instances.erase(it); break; } } m_changed = true; } void Layer::deleteInstance(Instance* instance) { // If the instance is changed and deleted on the same pump, // it can happen that the instance can not cleanly be removed, // to avoid this we have to update the instance first and send // the result to the LayerChangeListeners. if (instance->isActive()) { if (instance->update() != ICHANGE_NO_CHANGES) { std::vector updateInstances; updateInstances.push_back(instance); std::vector::iterator i = m_changeListeners.begin(); while (i != m_changeListeners.end()) { (*i)->onLayerChanged(this, updateInstances); ++i; } } } std::vector::iterator i = m_changeListeners.begin(); while (i != m_changeListeners.end()) { (*i)->onInstanceDelete(this, instance); ++i; } setInstanceActivityStatus(instance, false); std::vector::iterator it = m_instances.begin(); for(; it != m_instances.end(); ++it) { if(*it == instance) { m_instanceTree->removeInstance(*it); delete *it; m_instances.erase(it); break; } } m_changed = true; } const std::vector& Layer::getInstances() const { return m_instances; } void Layer::setInstanceActivityStatus(Instance* instance, bool active) { if(active) { m_activeInstances.insert(instance); } else { m_activeInstances.erase(instance); } } Instance* Layer::getInstance(const std::string& id) { std::vector::iterator it = m_instances.begin(); for(; it != m_instances.end(); ++it) { if((*it)->getId() == id) return *it; } return 0; } std::vector Layer::getInstances(const std::string& id) { std::vector matching_instances; std::vector::iterator it = m_instances.begin(); for(; it != m_instances.end(); ++it) { if((*it)->getId() == id) matching_instances.push_back(*it); } return matching_instances; } std::vector Layer::getInstancesAt(Location& loc, bool use_exactcoordinates) { std::vector matching_instances; std::vector::iterator it = m_instances.begin(); for(; it != m_instances.end(); ++it) { if (use_exactcoordinates) { if ((*it)->getLocationRef().getExactLayerCoordinatesRef() == loc.getExactLayerCoordinatesRef()) { matching_instances.push_back(*it); } } else { if ((*it)->getLocationRef().getLayerCoordinates() == loc.getLayerCoordinates()) { matching_instances.push_back(*it); } } } return matching_instances; } std::list Layer::getInstancesIn(Rect& rec) { std::list matching_instances; ModelCoordinate mc(rec.x, rec.y); m_instanceTree->findInstances(mc, rec.w, rec.h, matching_instances); return matching_instances; } std::vector Layer::getInstancesInLine(const ModelCoordinate& pt1, const ModelCoordinate& pt2) { std::vector instances; std::list matchingInstances; std::vector coords = m_grid->getCoordinatesInLine(pt1, pt2); for (std::vector::iterator it = coords.begin(); it != coords.end(); ++it) { m_instanceTree->findInstances(*it, 0, 0, matchingInstances); if (!matchingInstances.empty()) { instances.insert(instances.end(), matchingInstances.begin(), matchingInstances.end()); } } return instances; } std::vector Layer::getInstancesInCircle(const ModelCoordinate& center, uint16_t radius) { std::vector instances; std::list matchingInstances; //radius power 2 uint16_t radiusp2 = (radius+1) * radius; ModelCoordinate current(center.x-radius, center.y-radius); ModelCoordinate target(center.x+radius, center.y+radius); for (; current.y < center.y; current.y++) { current.x = center.x-radius; for (; current.x < center.x; current.x++) { uint16_t dx = center.x - current.x; uint16_t dy = center.y - current.y; uint16_t distance = dx*dx + dy*dy; if (distance <= radiusp2) { m_instanceTree->findInstances(current, 0, 0, matchingInstances); if (!matchingInstances.empty()) { instances.insert(instances.end(), matchingInstances.begin(), matchingInstances.end()); } current.x = center.x + dx; m_instanceTree->findInstances(current, 0, 0, matchingInstances); if (!matchingInstances.empty()) { instances.insert(instances.end(), matchingInstances.begin(), matchingInstances.end()); } current.y = center.y + dy; m_instanceTree->findInstances(current, 0, 0, matchingInstances); if (!matchingInstances.empty()) { instances.insert(instances.end(), matchingInstances.begin(), matchingInstances.end()); } current.x = center.x-dx; m_instanceTree->findInstances(current, 0, 0, matchingInstances); if (!matchingInstances.empty()) { instances.insert(instances.end(), matchingInstances.begin(), matchingInstances.end()); } current.y = center.y-dy; } } } current.x = center.x; current.y = center.y-radius; for (; current.y <= target.y; current.y++) { m_instanceTree->findInstances(current, 0, 0, matchingInstances); if (!matchingInstances.empty()) { instances.insert(instances.end(), matchingInstances.begin(), matchingInstances.end()); } } current.y = center.y; current.x = center.x-radius; for (; current.x <= target.x; current.x++) { m_instanceTree->findInstances(current, 0, 0, matchingInstances); if (!matchingInstances.empty()) { instances.insert(instances.end(), matchingInstances.begin(), matchingInstances.end()); } } return instances; } std::vector Layer::getInstancesInCircleSegment(const ModelCoordinate& center, uint16_t radius, int32_t sangle, int32_t eangle) { std::vector instances; ExactModelCoordinate exactCenter(center.x, center.y); std::vector tmpInstances = getInstancesInCircle(center, radius); int32_t s = (sangle + 360) % 360; int32_t e = (eangle + 360) % 360; bool greater = (s > e) ? true : false; for (std::vector::iterator it = tmpInstances.begin(); it != tmpInstances.end(); ++it) { int32_t angle = getAngleBetween(exactCenter, intPt2doublePt((*it)->getLocationRef().getLayerCoordinates())); if (greater) { if (angle >= s || angle <= e) { instances.push_back(*it); } } else { if (angle >= s && angle <= e) { instances.push_back(*it); } } } return instances; } void Layer::getMinMaxCoordinates(ModelCoordinate& min, ModelCoordinate& max, const Layer* layer) const { if (!layer) { layer = this; } if (m_instances.empty()) { min = ModelCoordinate(); max = min; } else { min = m_instances.front()->getLocationRef().getLayerCoordinates(layer); max = min; for (std::vector::const_iterator i = m_instances.begin(); i != m_instances.end(); ++i) { ModelCoordinate coord = (*i)->getLocationRef().getLayerCoordinates(layer); min.x = std::min(min.x, coord.x); max.x = std::max(max.x, coord.x); min.y = std::min(min.y, coord.y); max.y = std::max(max.y, coord.y); } } } float Layer::getZOffset() const { static const float globalmax = 100.0; static const float globalrange = 200.0; int32_t numlayers = m_map->getLayerCount(); int32_t thislayer = 1; // we don't need 0 indexed const std::list& layers = m_map->getLayers(); std::list::const_iterator iter = layers.begin(); for (; iter != layers.end(); ++iter, ++thislayer) { if (*iter == this) { break; } } float offset = globalmax - (numlayers - (thislayer - 1)) * (globalrange/numlayers); return offset; } uint32_t Layer::getLayerCount() const { return m_map->getLayerCount(); } void Layer::setInstancesVisible(bool vis) { if (m_instancesVisibility != vis) { m_instancesVisibility = vis; std::vector::iterator it = m_instances.begin(); for (; it != m_instances.end(); ++it) { (*it)->callOnVisibleChange(); } } } void Layer::setLayerTransparency(uint8_t transparency) { if (m_transparency != transparency) { m_transparency = transparency; std::vector::iterator it = m_instances.begin(); for (; it != m_instances.end(); ++it) { (*it)->callOnTransparencyChange(); } } } uint8_t Layer::getLayerTransparency() { return m_transparency; } void Layer::toggleInstancesVisible() { setInstancesVisible(!m_instancesVisibility); } bool Layer::areInstancesVisible() const { return m_instancesVisibility; } bool Layer::cellContainsBlockingInstance(const ModelCoordinate& cellCoordinate) { bool blockingInstance = false; if (m_cellCache) { Cell* cell = m_cellCache->getCell(cellCoordinate); if (cell) { return cell->getCellType() != CTYPE_NO_BLOCKER; } } else { std::list adjacentInstances; m_instanceTree->findInstances(cellCoordinate, 0, 0, adjacentInstances); for(std::list::const_iterator j = adjacentInstances.begin(); j != adjacentInstances.end(); ++j) { if((*j)->isBlocking() && (*j)->getLocationRef().getLayerCoordinates() == cellCoordinate) { blockingInstance = true; break; } } } return blockingInstance; } std::vector Layer::getBlockingInstances(const ModelCoordinate& cellCoordinate) { std::vector blockingInstances; if (m_cellCache) { Cell* cell = m_cellCache->getCell(cellCoordinate); if (cell) { const std::set& blocker = cell->getInstances(); for (std::set::const_iterator it = blocker.begin(); it != blocker.end(); ++it) { if ((*it)->isBlocking()) { blockingInstances.push_back(*it); } } } } else { std::list adjacentInstances; m_instanceTree->findInstances(cellCoordinate, 0, 0, adjacentInstances); for(std::list::const_iterator j = adjacentInstances.begin(); j != adjacentInstances.end(); ++j) { if((*j)->isBlocking() && (*j)->getLocationRef().getLayerCoordinates() == cellCoordinate) { blockingInstances.push_back(*j); } } } return blockingInstances; } void Layer::setPathingStrategy(PathingStrategy strategy) { m_pathingStrategy = strategy; m_grid->setAllowDiagonals(m_pathingStrategy != CELL_EDGES_ONLY); } PathingStrategy Layer::getPathingStrategy() const { return m_pathingStrategy; } void Layer::setSortingStrategy(SortingStrategy strategy) { m_sortingStrategy = strategy; } SortingStrategy Layer::getSortingStrategy() const { return m_sortingStrategy; } void Layer::setWalkable(bool walkable) { m_walkable = walkable; } bool Layer::isWalkable() { return m_walkable; } void Layer::setInteract(bool interact, const std::string& id) { m_interact = interact; m_walkableId = id; } bool Layer::isInteract() { return m_interact; } const std::string& Layer::getWalkableId() { return m_walkableId; } void Layer::addInteractLayer(Layer* layer) { if (m_walkable) { m_interacts.push_back(layer); } } const std::vector& Layer::getInteractLayers() { return m_interacts; } void Layer::removeInteractLayer(Layer* layer) { if (m_walkable) { std::vector::iterator it = m_interacts.begin(); for (; it != m_interacts.end(); ++it) { if (*it == layer) { (*it)->removeChangeListener(m_cellCache->getCellCacheChangeListener()); m_interacts.erase(it); break; } } } } void Layer::createCellCache() { if (!m_cellCache && m_walkable) { m_cellCache = new CellCache(this); } } CellCache* Layer::getCellCache() { return m_cellCache; } void Layer::destroyCellCache() { if (m_walkable) { removeChangeListener(m_cellCache->getCellCacheChangeListener()); if (!m_interacts.empty()) { std::vector::iterator it = m_interacts.begin(); for (; it != m_interacts.end(); ++it) { (*it)->removeChangeListener(m_cellCache->getCellCacheChangeListener()); (*it)->setInteract(false, ""); } m_interacts.clear(); } delete m_cellCache; m_cellCache = NULL; m_walkable = false; } } bool Layer::update() { m_changedInstances.clear(); std::vector inactiveInstances; std::set::iterator it = m_activeInstances.begin(); for(; it != m_activeInstances.end(); ++it) { if ((*it)->update() != ICHANGE_NO_CHANGES) { m_changedInstances.push_back(*it); m_changed = true; } else if (!(*it)->isActive()) { inactiveInstances.push_back(*it); } } if (!m_changedInstances.empty()) { std::vector::iterator i = m_changeListeners.begin(); while (i != m_changeListeners.end()) { (*i)->onLayerChanged(this, m_changedInstances); ++i; } //std::cout << "Layer named " << Id() << " changed = 1\n"; } // remove inactive instances from m_activeInstances if (!inactiveInstances.empty()) { std::vector::iterator i = inactiveInstances.begin(); while (i != inactiveInstances.end()) { m_activeInstances.erase(*i); ++i; } } //std::cout << "Layer named " << Id() << " changed = 0\n"; bool retval = m_changed; m_changed = false; return retval; } void Layer::addChangeListener(LayerChangeListener* listener) { m_changeListeners.push_back(listener); } void Layer::removeChangeListener(LayerChangeListener* listener) { std::vector::iterator i = m_changeListeners.begin(); while (i != m_changeListeners.end()) { if ((*i) == listener) { m_changeListeners.erase(i); return; } ++i; } } bool Layer::isChanged() { return m_changed; } std::vector& Layer::getChangedInstances() { return m_changedInstances; } void Layer::setStatic(bool stati) { m_static = stati; } bool Layer::isStatic() { return m_static; } } // FIFE fifengine-0.4.2/engine/core/model/structures/layer.h000066400000000000000000000354651341615052600224740ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_LAYER_H #define FIFE_LAYER_H // Standard C++ library includes #include #include #include #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/fifeclass.h" #include "util/structures/rect.h" #include "model/metamodel/modelcoords.h" #include "model/metamodel/object.h" #include "instance.h" namespace FIFE { class Map; class CellGrid; class Object; class InstanceTree; class CellCache; class Trigger; /** Defines how pathing can be performed on this layer * * CELL_EDGES_ONLY allows pather to use only cell edges when moving instances from cell to cell on map * CELL_EDGES_AND_DIAGONALS allows pather to use both cell edges and diagonals when moving instances from cell to cell on map */ enum PathingStrategy { CELL_EDGES_ONLY, CELL_EDGES_AND_DIAGONALS }; enum SortingStrategy { SORTING_CAMERA, SORTING_LOCATION, SORTING_CAMERA_AND_LOCATION }; /** Listener interface for changes happening on a layer */ class LayerChangeListener { public: virtual ~LayerChangeListener() {}; /** Called when some instance is changed on layer. @see InstanceChangeType * @param layer where change occurred * @param changedInstances list of instances containing some changes * @note Does not report creations and deletions */ virtual void onLayerChanged(Layer* layer, std::vector& changedInstances) = 0; /** Called when some instance gets created on layer * @param layer where change occurred * @param instance which got created */ virtual void onInstanceCreate(Layer* layer, Instance* instance) = 0; /** Called when some instance gets deleted on layer * @param layer where change occurred * @param instance which will be deleted * @note right after this call, instance actually gets deleted! */ virtual void onInstanceDelete(Layer* layer, Instance* instance) = 0; }; /** A basic layer on a map */ class Layer : public FifeClass { public: /** Constructor * Layers are created by calling addLayer from map, thus * this method should really be called only by map or test code. */ Layer(const std::string& identifier, Map* map, CellGrid* grid); /** Destructs a Layer instance */ ~Layer(); /** Get the id of this layer. */ const std::string& getId() const; /** Sets the identifier for this layer. */ void setId(const std::string& id); /** Get the map this layer is contained in */ Map* getMap() const; /** Get the Cellgrid * @return pointer to a valid cellgrid */ CellGrid* getCellGrid() const; /** Set the Cellgrid */ void setCellGrid(CellGrid* grid); /** Get the instance tree. * @return this layers instance tree. */ InstanceTree* getInstanceTree(void) const; /** Check existance of objects on this layer * @return True, if objects exist. */ bool hasInstances() const; /** Add an instance of an object at a specific position */ Instance* createInstance(Object* object, const ModelCoordinate& p, const std::string& id=""); /** Add an instance of an object at a specific position */ Instance* createInstance(Object* object, const ExactModelCoordinate& p, const std::string& id=""); /** Add a valid instance at a specific position. This is temporary. It will be moved to a higher level later so that we can ensure that each Instance only lives in one layer. */ bool addInstance(Instance* instance, const ExactModelCoordinate& p); /** Remove an instance from the layer */ void removeInstance(Instance* instance); /** Remove an instance from the layer and delete it */ void deleteInstance(Instance* instance); /** Get the list of instances on this layer */ const std::vector& getInstances() const; /** Get the list of instances on this layer with the given identifier. */ std::vector getInstances(const std::string& id); /** Returns instances that match given location. * @param loc location where to fetch instances from * @param use_exactcoordinates if true, comparison is done using exact coordinates. if not, cell coordinates are used */ std::vector getInstancesAt(Location& loc, bool use_exactcoordinates=false); /** Returns instances that match given rect. * @param rec rect where to fetch instances from */ std::list getInstancesIn(Rect& rec); /** Returns instances that match given line between pt1 and pt2. * @param pt1 A const reference to the ModelCoordinate where to start from. * @param pt2 A const reference to the ModelCoordinate where the end is. * @return A vector that contain the instances. */ std::vector getInstancesInLine(const ModelCoordinate& pt1, const ModelCoordinate& pt2); /** Returns instances that match given center and radius of the circle. * @param center A const reference to the ModelCoordinate where the center of the circle is. * @param radius A unsigned integer, radius of the circle. * @return A vector that contain the instances. */ std::vector getInstancesInCircle(const ModelCoordinate& center, uint16_t radius); /** Returns all instances in the circle segment. * @param center A const reference to the ModelCoordinate where the center of the circle is. * @param radius A unsigned integer, radius of the circle. * @param sangle A interger, start angle of the segment. * @param eangle A interger, end angle of the segment. * @return A vector that contain the instances. */ std::vector getInstancesInCircleSegment(const ModelCoordinate& center, uint16_t radius, int32_t sangle, int32_t eangle); /** Get the first instance on this layer with the given identifier. */ Instance* getInstance(const std::string& identifier); /** Set object visibility */ void setInstancesVisible(bool vis); /** Sets the transparency of all instances on the layer. 0=opaque, 255=transparent * @param transparency Transparency value from 0-255. */ void setLayerTransparency(uint8_t transparency); /** Returns the layer's transparency value */ uint8_t getLayerTransparency(); /** Retrieves the minimum/maximum coordinates of instances on the layer. * @param min A reference to a ModelCoordinate that will hold the minimum coordinate. * @param max A reference to a ModelCoordinate that will hold the maximum coordinate. * @param layer A pointer to another layer that can be used to cast coordinates bettween layers. */ void getMinMaxCoordinates(ModelCoordinate& min, ModelCoordinate& max, const Layer* layer = 0) const; /** Calculates z offset for the layer. * Is in range [-100,100], see glOrtho settings. Used by LayerCache to calculate z values. */ float getZOffset() const; /** Get the overall number of layers. */ uint32_t getLayerCount() const; /** Determines if a given cell on the layer contains a blocking instance * * @param cellCoordinate A const reference to a model coordinate of the cell in question. * @return A boolean, true if it is blocked false otherwise. */ bool cellContainsBlockingInstance(const ModelCoordinate& cellCoordinate); /** Returns instances that blocks on given cell * * @param cellCoordinate A const reference to a model coordinate of the cell in question. * @return A vector that contains instances. */ std::vector getBlockingInstances(const ModelCoordinate& cellCoordinate); /** Toggle object visibility * @see setObjectsVisible */ void toggleInstancesVisible(); /** Check object visibility * @see setObjectsVisible */ bool areInstancesVisible() const; /** Called periodically to update events on layer * @returns true if layer was changed since the last update, false otherwise */ bool update(); /** Sets pathing strategy for the layer * @see PathingStrategy */ void setPathingStrategy(PathingStrategy strategy); /** Gets pathing strategy for the layer * @see PathingStrategy */ PathingStrategy getPathingStrategy() const; /** Sets sorting strategy for the layer * @see SortingStrategy */ void setSortingStrategy(SortingStrategy strategy); /** Gets sorting strategy for the layer * @see SortingStrategy */ SortingStrategy getSortingStrategy() const; /** Sets walkable for the layer. Only a walkable layer, can create a CellCache and * only on a walkable, instances can move. Also interact layer can only be added to walkables. * @param walkable A boolean that mark a layer as walkable. */ void setWalkable(bool walkable); /** Returns if a layer is walkable. * @return A boolean, true if the layer is walkable otherwise false. */ bool isWalkable(); /** Sets interact for the layer. The data(size, instances) from all interact layers * and the walkable layer will merged into one CellCache. * @param interact A boolean that mark a layer as interact. * @param id A const reference to a string that should refer to the id of the walkable layer. */ void setInteract(bool interact, const std::string& id); /** Returns if a layer is interact. * @return A boolean, true if the layer is interact otherwise false. */ bool isInteract(); /** Returns the id of the walkable layer if this is a interact layer otherwise the string is empty. * @return A const reference to a string that refer to the id of the walkable layer. */ const std::string& getWalkableId(); /** Adds a interact layer to the walkable layer. * @param layer A pointer to the interact layer that should be added. */ void addInteractLayer(Layer* layer); /** Returns all assigned interact layer. * @return A const reference to a vector with pointers to interact layers. */ const std::vector& getInteractLayers(); /** Removes a interact layer from the walkable layer. * @param layer A pointer to the interact layer that should be removed. */ void removeInteractLayer(Layer* layer); /** Called from Map to create a CellCache. Only walkable layers can create one CellCache. */ void createCellCache(); /** Returns the CellCache of this layer. In case there is no it returns NULL. * @return A pointer to the CellCache. */ CellCache* getCellCache(); /** Destroys the CellCache of this layer. */ void destroyCellCache(); /** Adds new change listener * @param listener to add */ void addChangeListener(LayerChangeListener* listener); /** Removes associated change listener * @param listener to remove */ void removeChangeListener(LayerChangeListener* listener); /** Returns true, if layer information was changed during previous update round */ bool isChanged(); /** Returns instances that were changed during previous update round. * @note does not contain created or deleted instances */ std::vector& getChangedInstances(); /** Sets the activity status for given instance on this layer. * @param instance A pointer to the Instance whose activity is to be changed. * @param active A boolean, true if the instance should be set active otherwise false. */ void setInstanceActivityStatus(Instance* instance, bool active); /** Marks this layer as visual static. The result is that everything is rendered as one texture. * If you have instances with actions/animations on this layer then they are not displayed correctly. * Note: Works currently only for OpenGL backend. SDL backend is restricted to the lowest layer. * @param stati A boolean, true if the layer should be static. */ void setStatic(bool stati); /** Returns true, if layer is static. * @return A boolean, true if the layer is static, otherwise false. */ bool isStatic(); protected: //! string identifier std::string m_id; //! pointer to map Map* m_map; //! if true the instances are visibility otherwise they are skipped during rendering bool m_instancesVisibility; //! transparency, value 0 means total visible, 128 semi-transparent and 255 invisibility uint8_t m_transparency; //! all the instances on this layer std::vector m_instances; //! all the active instances on this layer std::set m_activeInstances; //! The instance tree InstanceTree* m_instanceTree; //! layer's cellgrid CellGrid* m_grid; //! pathing strategy for the layer PathingStrategy m_pathingStrategy; //! sorting strategy for rendering SortingStrategy m_sortingStrategy; //! is walkable true/false bool m_walkable; //! is interact true/false bool m_interact; //! walkable id std::string m_walkableId; //! all assigned interact layers std::vector m_interacts; //! pointer to cellcache CellCache* m_cellCache; //! listeners for layer changes std::vector m_changeListeners; //! holds changed instances after each update std::vector m_changedInstances; //! true if layer (or it's instance) information was changed during previous update round bool m_changed; //! true if layer is static bool m_static; }; } // FIFE #endif fifengine-0.4.2/engine/core/model/structures/layer.i000066400000000000000000000116671341615052600224730ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fife %{ #include "model/structures/layer.h" %} %include "model/metamodel/modelcoords.i" %include "model/metamodel/grids/cellgrids.i" %include "util/structures/utilstructures.i" %include "util/base/utilbase.i" namespace FIFE { class Map; class Instance; class Object; class CellGrid; class CellCache; enum PathingStrategy { CELL_EDGES_ONLY, CELL_EDGES_AND_DIAGONALS }; enum SortingStrategy { SORTING_CAMERA, SORTING_LOCATION, SORTING_CAMERA_AND_LOCATION }; %feature("director") LayerChangeListener; class LayerChangeListener { public: virtual ~LayerChangeListener() {}; virtual void onLayerChanged(Layer* layer, std::vector& changedInstances) = 0; virtual void onInstanceCreate(Layer* layer, Instance* instance) = 0; virtual void onInstanceDelete(Layer* layer, Instance* instance) = 0; }; class Layer : public FifeClass { public: Layer(const std::string& identifier, Map* map, CellGrid* geometry); ~Layer(); const std::string& getId() const; void setId(const std::string& id); CellGrid* getCellGrid() const; void setCellGrid(CellGrid* grid); Map* getMap(); bool hasInstances() const; Instance* createInstance(Object* object, const ModelCoordinate& p, const std::string& id=""); Instance* createInstance(Object* object, const ExactModelCoordinate& p, const std::string& id=""); bool addInstance(Instance* instance, const ExactModelCoordinate& p); void deleteInstance(Instance* object); void removeInstance(Instance* object); const std::vector& getInstances() const; std::vector getInstances(const std::string& identifier); std::vector getInstancesAt(Location& loc, bool use_exactcoordinates=false); std::list getInstancesIn(Rect& rec); std::vector getInstancesInLine(const ModelCoordinate& pt1, const ModelCoordinate& pt2); std::vector getInstancesInCircle(const ModelCoordinate& center, uint16_t radius); std::vector getInstancesInCircleSegment(const ModelCoordinate& center, uint16_t radius, int32_t sangle, int32_t eangle); Instance* getInstance(const std::string& id); void setInstancesVisible(bool vis); void setLayerTransparency(uint8_t transparency); uint8_t getLayerTransparency(); void getMinMaxCoordinates(ModelCoordinate& min, ModelCoordinate& max, const Layer* layer = 0) const; bool cellContainsBlockingInstance(const ModelCoordinate& cellCoordinate); std::vector getBlockingInstances(const ModelCoordinate& cellCoordinate); void toggleInstancesVisible(); bool areInstancesVisible() const; void setPathingStrategy(PathingStrategy strategy); PathingStrategy getPathingStrategy(); void setSortingStrategy(SortingStrategy strategy); SortingStrategy getSortingStrategy() const; void setWalkable(bool walkable); bool isWalkable(); void setInteract(bool interact, const std::string& id); bool isInteract(); const std::string& getWalkableId(); void addInteractLayer(Layer* layer); const std::vector& getInteractLayers(); void removeInteractLayer(Layer* layer); void createCellCache(); CellCache* getCellCache(); void destroyCellCache(); void addChangeListener(LayerChangeListener* listener); void removeChangeListener(LayerChangeListener* listener); bool isChanged(); std::vector& getChangedInstances(); void setStatic(bool stati); bool isStatic(); }; } fifengine-0.4.2/engine/core/model/structures/location.cpp000066400000000000000000000140661341615052600235150ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/exception.h" #include "model/metamodel/grids/cellgrid.h" #include "layer.h" namespace FIFE { static std::string INVALID_LAYER_SET = "Cannot set layer coordinates, given layer is not initialized properly"; static std::string INVALID_LAYER_GET = "Cannot get layer coordinates, layer is not initialized properly"; Location::Location() { reset(); } Location::Location(const Location& loc) { reset(); m_layer = loc.m_layer; m_exact_layer_coords = loc.m_exact_layer_coords; } Location::Location(Layer* layer) { reset(); m_layer = layer; } Location::~Location() { } void Location::reset() { m_exact_layer_coords.x = 0; m_exact_layer_coords.y = 0; m_exact_layer_coords.z = 0; m_layer = NULL; } Location& Location::operator=(const Location& rhs) { m_layer = rhs.m_layer; m_exact_layer_coords.x = rhs.m_exact_layer_coords.x; m_exact_layer_coords.y = rhs.m_exact_layer_coords.y; m_exact_layer_coords.z = rhs.m_exact_layer_coords.z; return *this; } Map* Location::getMap() const { if (!m_layer) { return NULL; } return m_layer->getMap(); } void Location::setLayer(Layer* layer) { m_layer = layer; } Layer* Location::getLayer() const { return m_layer; } void Location::setExactLayerCoordinates(const ExactModelCoordinate& coordinates) { if (!isValid()) { throw NotSet(INVALID_LAYER_SET); } m_exact_layer_coords = coordinates; } void Location::setLayerCoordinates(const ModelCoordinate& coordinates) { setExactLayerCoordinates(intPt2doublePt(coordinates)); } void Location::setMapCoordinates(const ExactModelCoordinate& coordinates) { if (!isValid()) { throw NotSet(INVALID_LAYER_SET); } m_exact_layer_coords = m_layer->getCellGrid()->toExactLayerCoordinates(coordinates); } ExactModelCoordinate& Location::getExactLayerCoordinatesRef() { return m_exact_layer_coords; } ExactModelCoordinate Location::getExactLayerCoordinates() const { return m_exact_layer_coords; } ModelCoordinate Location::getLayerCoordinates() const { return m_layer->getCellGrid()->toLayerCoordinatesFromExactLayerCoordinates(m_exact_layer_coords); } ExactModelCoordinate Location::getMapCoordinates() const { return m_layer->getCellGrid()->toMapCoordinates(m_exact_layer_coords); } bool Location::isValid() const { return isValid(m_layer); } bool Location::isValid(const Layer* layer) const { return (layer && layer->getCellGrid()); } ExactModelCoordinate Location::getExactLayerCoordinates(const Layer* layer) const { if (!isValid(layer)) { throw NotSet(INVALID_LAYER_GET); } if (layer == m_layer) { return m_exact_layer_coords; } CellGrid* cg1 = m_layer->getCellGrid(); CellGrid* cg2 = layer->getCellGrid(); return cg2->toExactLayerCoordinates(cg1->toMapCoordinates(m_exact_layer_coords)); } ModelCoordinate Location::getLayerCoordinates(const Layer* layer) const { if (!isValid(layer)) { throw NotSet(INVALID_LAYER_GET); } if (layer == m_layer) { return getLayerCoordinates(); } CellGrid* cg1 = m_layer->getCellGrid(); CellGrid* cg2 = layer->getCellGrid(); return cg2->toLayerCoordinates(cg1->toMapCoordinates(m_exact_layer_coords)); } double Location::getCellOffsetDistance() const { const ExactModelCoordinate& pt = m_exact_layer_coords; double dx = pt.x - static_cast(static_cast(pt.x)); double dy = pt.y - static_cast(static_cast(pt.y)); return Mathd::Sqrt(dx*dx + dy*dy); } std::ostream& operator<<(std::ostream& os, const Location& l) { ExactModelCoordinate p = l.getExactLayerCoordinates(); return os << "x=" << p.x << ", y=" << p.y; } double Location::getMapDistanceTo(const Location& location) const{ ExactModelCoordinate current = getMapCoordinates(); ExactModelCoordinate target = location.getMapCoordinates(); double rx = current.x - target.x; double ry = current.y - target.y; double rz = current.z - target.z; return Mathd::Sqrt(rx*rx + ry*ry + rz*rz); } double Location::getLayerDistanceTo(const Location& location) const{ ModelCoordinate current = getLayerCoordinates(); ModelCoordinate target = location.getLayerCoordinates(m_layer); double rx = current.x - target.x; double ry = current.y - target.y; double rz = current.z - target.z; return Mathd::Sqrt(rx*rx + ry*ry + rz*rz); } } fifengine-0.4.2/engine/core/model/structures/location.h000066400000000000000000000143151341615052600231570ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_LOCATION_H #define FIFE_LOCATION_H // Standard C++ library includes #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "model/metamodel/modelcoords.h" #include "util/base/exception.h" namespace FIFE { class Map; class Layer; class Location { public: /** Default constructor */ Location(); /** Copy constructor */ Location(const Location& loc); /** Utility constructor */ Location(Layer* layer); /** Destructor */ ~Location(); /** Resets location (so that layer and coordinate information becomes invalid) */ void reset(); /** Assignment operator */ Location& operator=(const Location& rhs); /** Compares equality of two locations */ inline bool operator==(const Location& loc) const { return ((m_layer == loc.m_layer) && (m_exact_layer_coords == loc.m_exact_layer_coords)); } /** Compares unequality of two locations */ inline bool operator!=(const Location& loc) const { return !(*this == loc); } /** Gets the map where this location is pointing to * @note this information is fetched from the set layer * @return map where this location is pointing to, NULL in case its invalid */ Map* getMap() const; /** Sets layer where this location is pointing to * @param layer layer to set */ void setLayer(Layer* layer); /** Gets the layer where this location is pointing to * @return layer where this location is pointing to, NULL in case its invalid */ Layer* getLayer() const; /** Sets precise layer coordinates to this location * @throws NotSet in the following cases: * - layer is not set (NULL) * - layer does not have cellgrid assigned * @param coordinates coordinates to set */ void setExactLayerCoordinates(const ExactModelCoordinate& coordinates); /** Sets "cell precise" layer coordinates to this location * @throws NotSet in the following cases: * - layer is not set (NULL) * - layer does not have cellgrid assigned * @see setLayerCoordinates(const ExactModelCoordinate& coordinates) */ void setLayerCoordinates(const ModelCoordinate& coordinates); /** Sets map coordinates to this location * @param coordinates coordinates to set */ void setMapCoordinates(const ExactModelCoordinate& coordinates); /** Gets reference to exact layer coordinates. This means that if you * modify the coordinates, location gets modified directly * @return reference to exact layer coordinates */ ExactModelCoordinate& getExactLayerCoordinatesRef(); /** Gets exact layer coordinates set to this location * @return exact layer coordinates */ ExactModelCoordinate getExactLayerCoordinates() const; /** Gets exact layer coordinates of this location mapped on given layer * @throws NotSet in the following cases: * - given layer is not set (NULL) * - given layer does not have cellgrid assigned * @return exact layer coordinates */ ExactModelCoordinate getExactLayerCoordinates(const Layer* layer) const; /** Gets cell precision layer coordinates set to this location * @see getExactLayerCoordinates() */ ModelCoordinate getLayerCoordinates() const; /** Gets cell precision layer coordinates of this location mapped on given layer * @see getExactLayerCoordinates(const Layer* layer) */ ModelCoordinate getLayerCoordinates(const Layer* layer) const; /** Gets map coordinates set to this location * @return map coordinates */ ExactModelCoordinate getMapCoordinates() const; /** Gets offset distance from cell center * @return offset distance */ double getCellOffsetDistance() const; /** Tells if location is valid * Location is valid if: * - layer is set * - layer has cellgrid */ bool isValid() const; /** Gets distance in map coordinates to another location on the Map * @param location is the location you want to get the distance to */ double getMapDistanceTo(const Location& location) const; /** Gets layer distance to another location * @param location is the location you want to get the distance to * In case location resides on different layer, it is mapped to this layer */ double getLayerDistanceTo(const Location& location) const; private: bool isValid(const Layer* layer) const; Layer* m_layer; ExactModelCoordinate m_exact_layer_coords; }; /** Stream output operator. * * Useful for debugging purposes */ std::ostream& operator<<(std::ostream&, const Location&); } #endif //FIFE_LOCATION_H fifengine-0.4.2/engine/core/model/structures/location.i000066400000000000000000000057411341615052600231630ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fife %{ #include "model/structures/location.h" %} namespace FIFE { class Map; class Layer; class NotSet; class ModelCoordinate; class ExactModelCoordinate; // for some reason swig ignores operator= and gives warning. Ignore this for now %ignore Location::operator=; class Location { public: Location(); Location(const Location& loc); Location(Layer* layer); ~Location(); void reset(); Location& operator=(const Location& rhs) const; inline bool operator==(const Location& loc) const; Map* getMap() const; void setLayer(Layer* layer); Layer* getLayer() const; void setExactLayerCoordinates(const ExactModelCoordinate& coordinates); void setLayerCoordinates(const ModelCoordinate& coordinates); void setMapCoordinates(const ExactModelCoordinate& coordinates); ExactModelCoordinate& getExactLayerCoordinatesRef(); ExactModelCoordinate getExactLayerCoordinates() const; ExactModelCoordinate getExactLayerCoordinates(const Layer* layer) const; ModelCoordinate getLayerCoordinates() const; ModelCoordinate getLayerCoordinates(const Layer* layer) const; ExactModelCoordinate getMapCoordinates() const; bool isValid() const; double getCellOffsetDistance() const; double getMapDistanceTo(const Location& location) const; double getLayerDistanceTo(const Location& location) const; }; std::ostream& operator<<(std::ostream& os, const Location& l); } namespace std { %template(LocationVector) vector; } fifengine-0.4.2/engine/core/model/structures/map.cpp000066400000000000000000000242751341615052600224650ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes #include // 3rd party library includes #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/exception.h" #include "util/structures/purge.h" #include "util/structures/rect.h" #include "view/camera.h" #include "view/rendererbase.h" #include "video/renderbackend.h" #include "map.h" #include "layer.h" #include "cellcache.h" #include "instance.h" #include "triggercontroller.h" namespace FIFE { Map::Map(const std::string& identifier, RenderBackend* renderBackend, const std::vector& renderers, TimeProvider* tp_master): m_id(identifier), m_filename(""), m_timeProvider(tp_master), m_changeListeners(), m_changedLayers(), m_renderBackend(renderBackend), m_renderers(renderers), m_changed(false) { m_triggerController = new TriggerController(this); } Map::~Map() { delete m_triggerController; // remove all cameras std::vector::iterator iter = m_cameras.begin(); for ( ; iter != m_cameras.end(); ++iter) { delete *iter; } m_cameras.clear(); deleteLayers(); } Layer* Map::getLayer(const std::string& id) { std::list::const_iterator it = m_layers.begin(); for(; it != m_layers.end(); ++it) { if((*it)->getId() == id) return *it; } return NULL; } uint32_t Map::getLayerCount() const { return m_layers.size(); } Layer* Map::createLayer(const std::string& identifier, CellGrid* grid) { std::list::const_iterator it = m_layers.begin(); for(; it != m_layers.end(); ++it) { if(identifier == (*it)->getId()) throw NameClash(identifier); } Layer* layer = new Layer(identifier, this, grid); m_layers.push_back(layer); m_changed = true; std::vector::iterator i = m_changeListeners.begin(); while (i != m_changeListeners.end()) { (*i)->onLayerCreate(this, layer); ++i; } return layer; } void Map::deleteLayer(Layer* layer) { std::list::iterator it = m_layers.begin(); for(; it != m_layers.end(); ++it) { if((*it) == layer) { std::vector::iterator i = m_changeListeners.begin(); while (i != m_changeListeners.end()) { (*i)->onLayerDelete(this, layer); ++i; } delete layer; m_layers.erase(it); return ; } } m_changed = true; } void Map::deleteLayers() { std::list temp_layers = m_layers; std::list::iterator temp_it = temp_layers.begin(); for(; temp_it != temp_layers.end(); ++temp_it) { std::vector::iterator i = m_changeListeners.begin(); while (i != m_changeListeners.end()) { (*i)->onLayerDelete(this, *temp_it); ++i; } std::list::iterator it = m_layers.begin(); for(; it != m_layers.end(); ++it) { if(*it == *temp_it) { delete *it; m_layers.erase(it); break; } } } } void Map::getMinMaxCoordinates(ExactModelCoordinate& min, ExactModelCoordinate& max) { if (m_layers.empty()) { return; } std::list::iterator it = m_layers.begin(); Layer* layer = *it; for (; it != m_layers.end(); ++it) { ModelCoordinate newMin, newMax; (*it)->getMinMaxCoordinates(newMin, newMax, layer); if (newMin.x < min.x) { min.x = newMin.x; } if (newMax.x > max.x) { max.x = newMax.x; } if (newMin.y < min.y) { min.y = newMin.y; } if (newMax.y > max.y) { max.y = newMax.y; } } Location lmin(layer); Location lmax(layer); lmin.setExactLayerCoordinates(min); lmax.setExactLayerCoordinates(max); min = lmin.getMapCoordinates(); max = lmax.getMapCoordinates(); } bool Map::update() { m_changedLayers.clear(); // transfer instances from one layer to another if (!m_transferInstances.empty()) { std::map::iterator it = m_transferInstances.begin(); for (; it != m_transferInstances.end(); ++it) { Instance* inst = (*it).first; Location target_loc = (*it).second; Layer* source = inst->getOldLocationRef().getLayer(); Layer* target = target_loc.getLayer(); if (source != target) { source->removeInstance(inst); target->addInstance(inst, target_loc.getExactLayerCoordinates()); } } m_transferInstances.clear(); } std::vector cellCaches; std::list::iterator it = m_layers.begin(); // update Layers for(; it != m_layers.end(); ++it) { if ((*it)->update()) { m_changedLayers.push_back(*it); } CellCache* cache = (*it)->getCellCache(); if (cache) { cellCaches.push_back(cache); } } // loop over Caches and update for (std::vector::iterator cacheIt = cellCaches.begin(); cacheIt != cellCaches.end(); ++cacheIt) { (*cacheIt)->update(); } if (!m_changedLayers.empty()) { std::vector::iterator i = m_changeListeners.begin(); while (i != m_changeListeners.end()) { (*i)->onMapChanged(this, m_changedLayers); ++i; } } // loop over cameras and update if enabled std::vector::iterator camIter = m_cameras.begin(); for ( ; camIter != m_cameras.end(); ++camIter) { if ((*camIter)->isEnabled()) { (*camIter)->update(); (*camIter)->render(); } } bool retval = m_changed; m_changed = false; return retval; } void Map::addChangeListener(MapChangeListener* listener) { m_changeListeners.push_back(listener); } void Map::removeChangeListener(MapChangeListener* listener) { std::vector::iterator i = m_changeListeners.begin(); while (i != m_changeListeners.end()) { if ((*i) == listener) { m_changeListeners.erase(i); return; } ++i; } } Camera* Map::addCamera(const std::string &id, const Rect& viewport) { if (getCamera(id)) { std::string errorStr = "Camera: " + id + " already exists"; throw NameClash(errorStr); } // create new camera and add to list of cameras Camera* camera = new Camera(id, this, viewport, m_renderBackend); m_cameras.push_back(camera); std::vector::iterator iter = m_renderers.begin(); for ( ; iter != m_renderers.end(); ++iter) { camera->addRenderer((*iter)->clone()); } return camera; } void Map::removeCamera(const std::string &id) { std::vector::iterator iter = m_cameras.begin(); for ( ; iter != m_cameras.end(); ++iter) { if ((*iter)->getId() == id) { // camera has been found delete it delete *iter; // now remove it from the vector // note this invalidates iterators, but we do not need // to worry about it in this case since we are done m_cameras.erase(iter); break; } } } Camera* Map::getCamera(const std::string &id) { std::vector::iterator iter = m_cameras.begin(); for ( ; iter != m_cameras.end(); ++iter) { if ((*iter)->getId() == id) { return *iter; } } return NULL; } const std::vector& Map::getCameras() const { return m_cameras; } uint32_t Map::getActiveCameraCount() const { uint32_t count = 0; std::vector::const_iterator it = m_cameras.begin(); for ( ; it != m_cameras.end(); ++it) { if ((*it)->isEnabled()) { count += 1; } } return count; } void Map::addInstanceForTransfer(Instance* instance, const Location& target) { std::pair::iterator, bool> insertiter = m_transferInstances.insert(std::make_pair(instance, target)); if (insertiter.second == false) { Location& loc = insertiter.first->second; loc.setLayer(target.getLayer()); loc.setExactLayerCoordinates(target.getExactLayerCoordinates()); } } void Map::removeInstanceForTransfer(Instance* instance) { std::map::iterator it = m_transferInstances.find(instance); if (it != m_transferInstances.end()) { m_transferInstances.erase(it); } } void Map::initializeCellCaches() { if (m_layers.empty()) { return; } std::list::iterator layit = m_layers.begin(); // first add interacts to walkables for (; layit != m_layers.end(); ++layit) { if ((*layit)->isInteract()) { Layer* temp = getLayer((*layit)->getWalkableId()); if (temp) { temp->addInteractLayer(*layit); } } } // then create CellCaches for walkables layit = m_layers.begin(); for (; layit != m_layers.end(); ++layit) { if ((*layit)->isWalkable()) { (*layit)->createCellCache(); } } } void Map::finalizeCellCaches() { // create Cells and generate neighbours std::list::iterator layit = m_layers.begin(); for (; layit != m_layers.end(); ++layit) { CellCache* cache = (*layit)->getCellCache(); if (cache) { cache->createCells(); cache->forceUpdate(); } } } } //FIFE fifengine-0.4.2/engine/core/model/structures/map.h000066400000000000000000000203001341615052600221130ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_MAP_MAP_H #define FIFE_MAP_MAP_H // Standard C++ library includes #include #include #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/fifeclass.h" #include "util/resource/resource.h" #include "model/metamodel/timeprovider.h" #include "util/structures/rect.h" #include "location.h" namespace FIFE { class RendererBase; class RenderBackend; class Layer; class CellGrid; class Map; class Camera; class Instance; class TriggerController; /** Listener interface for changes happening on map */ class MapChangeListener { public: virtual ~MapChangeListener() {}; /** Called when some layer is changed on map. @see LayerChangeListener * Layer is effectively changed, in case some of its instances * is created, deleted or changed during latest update cycle * @param map where change occurred * @param changedLayers list of layers containing some changes * @note Does not report layer creations and deletions */ virtual void onMapChanged(Map* map, std::vector& changedLayers) = 0; /** Called when some layer gets created on the map * @param map where change occurred * @param layer which got created */ virtual void onLayerCreate(Map* map, Layer* layer) = 0; /** Called when some layer gets deleted on map * @param map where change occurred * @param layer which will be deleted * @note right after this call, layer actually gets deleted! */ virtual void onLayerDelete(Map* map, Layer* layer) = 0; }; /** A container of \c Layer(s). * * The actual data is contained in \c Layer objects * @see Layer */ class Map : public FifeClass { public: /** Construct a map * To add map to model, one should call Model::addMap (otherwise * map is not registered with the engine properly) */ Map(const std::string& identifier, RenderBackend* renderbackend, const std::vector& renderers, TimeProvider* tp_master=NULL); /** Destructor */ ~Map(); /** Get the identifier for this map. */ const std::string& getId() const { return m_id; } /** Sets the identifier for this map. */ void setId(const std::string& id) { m_id = id; } /** Add a Layer to this Map. Map owns the returned pointer to the new Layer, so don't delete it! */ Layer* createLayer(const std::string& identifier, CellGrid* grid); /** Delete a layer from the map */ void deleteLayer(Layer*); /** Get the layers on this map. */ const std::list& getLayers() const { return m_layers; } /** Get the layer with the given id. */ Layer* getLayer(const std::string& identifier); /** Get the overall number of layers */ uint32_t getLayerCount() const; /** Delete all layers from the map */ void deleteLayers(); /** Retrieves the minimum/maximum coordinates of instances on the map. * @param min A reference to a ExactModelCoordinate that will hold the minimum coordinate. * @param max A reference to a ExactModelCoordinate that will hold the maximum coordinate. */ void getMinMaxCoordinates(ExactModelCoordinate& min, ExactModelCoordinate& max); /** Called periodically to update events on map * @returns true, if map was changed */ bool update(); /** Sets speed for the map. See Model::setTimeMultiplier. */ void setTimeMultiplier(float multip) { m_timeProvider.setMultiplier(multip); } /** Gets model speed. @see setTimeMultiplier. */ float getTimeMultiplier() const { return m_timeProvider.getMultiplier(); } /** Gets timeprovider used in the map */ TimeProvider* getTimeProvider() { return &m_timeProvider; } /** Adds new change listener * @param listener to add */ void addChangeListener(MapChangeListener* listener); /** Removes associated change listener * @param listener to remove */ void removeChangeListener(MapChangeListener* listener); /** Returns true, if map information was changed during previous update round */ bool isChanged() { return !m_changedLayers.empty(); } /** Returns layers that were changed during previous update round */ std::vector& getChangedLayers() { return m_changedLayers; } /** Adds camera to the map. The Map takes ownership of the camera so don't delete it. */ Camera* addCamera(const std::string& id, const Rect& viewport); /** Removes a camera from the map */ void removeCamera(const std::string& id); /** Get a camera by its identifier. */ Camera* getCamera(const std::string& id); /** Get a list containing all cameras. */ const std::vector& getCameras() const; /** Return the number of enabled cameras in this map. */ uint32_t getActiveCameraCount() const; void setFilename(const std::string& file) { m_filename = file; } const std::string& getFilename() const { return m_filename; } /** Adds instance that is to be transferred to another layer. * @param instance A pointer to the instance that is to be transferred. * @param target A const reference to the target location. */ void addInstanceForTransfer(Instance* instance, const Location& target); /** Removes instance that should be transferred to another layer. * @param instance A pointer to the instance that should be transferred. */ void removeInstanceForTransfer(Instance* instance); /** Creates cellcaches for this map. Called from maploader. */ void initializeCellCaches(); /** Creates cellcaches for this map. Called from maploader. */ void finalizeCellCaches(); /** */ TriggerController* getTriggerController() const { return m_triggerController; }; private: std::string m_id; std::string m_filename; std::list m_layers; TimeProvider m_timeProvider; Map(const Map& map); Map& operator=(const Map& map); //! listeners for map changes std::vector m_changeListeners; //! holds changed layers after each update std::vector m_changedLayers; //! holds the cameras attached to this map std::vector m_cameras; //! pointer to renderbackend RenderBackend* m_renderBackend; //! holds handles to all created renderers std::vector m_renderers; //! true, if something was changed on map during previous update (layer change, creation, deletion) bool m_changed; //! holds instances which should be transferred on the next update std::map m_transferInstances; TriggerController* m_triggerController; }; } #endif fifengine-0.4.2/engine/core/model/structures/map.i000066400000000000000000000066571341615052600221370ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fife %{ #include "model/structures/map.h" %} %include "util/base/utilbase.i" namespace FIFE { class Layer; class Camera; } namespace std { %template(LayerList) list; %template(LayerVector) vector; %template(CameraVector) vector; } namespace FIFE { class Map; class Rect; class TriggerController; %feature("director") MapChangeListener; class MapChangeListener { public: virtual ~MapChangeListener() {}; virtual void onMapChanged(Map* map, std::vector& changedLayers) = 0; virtual void onLayerCreate(Map* map, Layer* layer) = 0; virtual void onLayerDelete(Map* map, Layer* layer) = 0; }; class Map : public FifeClass { public: Map(const std::string& identifier, RenderBackend* renderbackend, const std::vector& renderers, TimeProvider* tp_master=NULL); ~Map(); const std::string& getId() const; void setId(const std::string& id); Layer* createLayer(const std::string& identifier, CellGrid* grid); void deleteLayer(Layer* index); std::list getLayers() const; Layer* getLayer(const std::string& id); uint32_t getLayerCount() const; void deleteLayers(); void getMinMaxCoordinates(ExactModelCoordinate& min, ExactModelCoordinate& max); void setTimeMultiplier(float multip); double getTimeMultiplier() const; void addChangeListener(MapChangeListener* listener); void removeChangeListener(MapChangeListener* listener); bool isChanged(); std::vector& getChangedLayers(); Camera* addCamera(const std::string& id, const Rect& viewport); void removeCamera(const std::string& id); Camera* getCamera(const std::string& id); std::vector& getCameras(); void setFilename(const std::string& file); const std::string& getFilename() const; void initializeCellCaches(); void finalizeCellCaches(); TriggerController* getTriggerController() const; }; } fifengine-0.4.2/engine/core/model/structures/renderernode.cpp000066400000000000000000000241751341615052600243630ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "video/renderbackend.h" #include "util/math/fife_math.h" #include "util/log/logger.h" #include "model/structures/instance.h" #include "model/structures/layer.h" #include "model/structures/location.h" #include "view/camera.h" #include "renderernode.h" namespace FIFE { static Logger _log(LM_VIEWVIEW); class NodeInstanceDeleteListener : public InstanceDeleteListener { public: NodeInstanceDeleteListener(RendererNode* node) { m_node = node; } virtual ~NodeInstanceDeleteListener() {} virtual void onInstanceDeleted(Instance* instance) { m_node->removeInstance(instance, false); } private: RendererNode* m_node; }; RendererNode::RendererNode(Instance* attached_instance, const Location &relative_location, Layer* relative_layer, const Point &relative_point): m_instance(NULL), m_location(relative_location), m_layer(relative_layer), m_point(relative_point), m_listener(NULL) { addInstance(attached_instance); } RendererNode::RendererNode(Instance* attached_instance, const Location &relative_location, const Point &relative_point): m_instance(NULL), m_location(relative_location), m_layer(NULL), m_point(relative_point), m_listener(NULL) { addInstance(attached_instance); } RendererNode::RendererNode(Instance* attached_instance, Layer* relative_layer, const Point &relative_point): m_instance(NULL), m_location(NULL), m_layer(relative_layer), m_point(relative_point), m_listener(NULL) { addInstance(attached_instance); } RendererNode::RendererNode(Instance* attached_instance, const Point &relative_point): m_instance(NULL), m_location(NULL), m_layer(NULL), m_point(relative_point), m_listener(NULL) { addInstance(attached_instance); } RendererNode::RendererNode(const Location &attached_location, Layer* relative_layer, const Point &relative_point): m_instance(NULL), m_location(attached_location), m_layer(relative_layer), m_point(relative_point), m_listener(NULL) { } RendererNode::RendererNode(const Location &attached_location, const Point &relative_point): m_instance(NULL), m_location(attached_location), m_layer(NULL), m_point(relative_point), m_listener(NULL) { } RendererNode::RendererNode(Layer* attached_layer, const Point &relative_point): m_instance(NULL), m_location(NULL), m_layer(attached_layer), m_point(relative_point), m_listener(NULL) { } RendererNode::RendererNode(const Point &attached_point): m_instance(NULL), m_location(NULL), m_layer(NULL), m_point(attached_point), m_listener(NULL) { } RendererNode::RendererNode(const RendererNode& old): m_instance(NULL), m_location(old.m_location), m_layer(old.m_layer), m_point(old.m_point), m_listener(NULL) { addInstance(old.m_instance); } RendererNode& RendererNode::operator=(const RendererNode &source) { if (this != &source) { changeInstance(source.m_instance); m_location = source.m_location; m_layer = source.m_layer; m_point = source.m_point; } return *this; } RendererNode::~RendererNode() { removeInstance(m_instance); delete m_listener; } void RendererNode::setAttached(Instance* attached_instance, const Location &relative_location, const Point &relative_point) { changeInstance(attached_instance); m_location = relative_location; m_point = relative_point; } void RendererNode::setAttached(Instance* attached_instance, const Location &relative_location) { changeInstance(attached_instance); m_location = relative_location; } void RendererNode::setAttached(Instance* attached_instance, const Point &relative_point) { changeInstance(attached_instance); m_point = relative_point; } void RendererNode::setAttached(Instance* attached_instance) { changeInstance(attached_instance); } void RendererNode::setAttached(const Location &attached_location, const Point &relative_point) { changeInstance(NULL); m_location = attached_location; m_point = relative_point; } void RendererNode::setAttached(const Location &attached_location) { changeInstance(NULL); m_location = attached_location; } void RendererNode::setAttached(Layer* attached_layer) { m_layer = attached_layer; } void RendererNode::setAttached(const Point &attached_point) { changeInstance(NULL); m_location = NULL; m_point = attached_point; } void RendererNode::setRelative(const Location &relative_location) { if(m_instance == NULL) { FL_WARN(_log, LMsg("RendererNode::setRelative(Location) - ") << "No instance attached."); } m_location = relative_location; } void RendererNode::setRelative(const Location &relative_location, Point relative_point) { if(m_instance == NULL) { FL_WARN(_log, LMsg("RendererNode::setRelative(Location, Point) - ") << "No instance attached."); } m_location = relative_location; m_point = relative_point; } void RendererNode::setRelative(const Point &relative_point) { if(m_instance == NULL || m_location == NULL) { FL_WARN(_log, LMsg("RendererNode::setRelative(Point) - ") << "No instance or location attached."); } m_point = relative_point; } Instance* RendererNode::getAttachedInstance() { if(m_instance == NULL) { FL_WARN(_log, LMsg("RendererNode::getAttachedInstance() - ") << "No instance attached."); } return m_instance; } Location RendererNode::getAttachedLocation() { if(m_instance != NULL || m_location == NULL) { FL_WARN(_log, LMsg("RendererNode::getAttachedLocation() - ") << "No location attached."); } return m_location; } Layer* RendererNode::getAttachedLayer() { if(m_layer == NULL) { FL_WARN(_log, LMsg("RendererNode::getAttachedLayer() - ") << "No layer attached."); } return m_layer; } Point RendererNode::getAttachedPoint() { if(m_instance != NULL || m_location != NULL) { FL_WARN(_log, LMsg("RendererNode::getAttachedPoint() - ") << "No point attached."); } return m_point; } Location RendererNode::getOffsetLocation() { if(m_instance == NULL || m_location == NULL) { FL_WARN(_log, LMsg("RendererNode::getOffsetLocation() - ") << "No location as offset used."); } return m_location; } Point RendererNode::getOffsetPoint() { if(m_instance == NULL && m_location == NULL) { FL_WARN(_log, LMsg("RendererNode::getOffsetPoint() - ") << "No point as offset used."); } return m_point; } Instance* RendererNode::getInstance() { return m_instance; } Location RendererNode::getLocation() { return m_location; } const Location& RendererNode::getLocationRef() { return m_location; } Layer* RendererNode::getLayer() { return m_layer; } Point RendererNode::getPoint() { return m_point; } const Point& RendererNode::getPointRef() { return m_point; } void RendererNode::addInstance(Instance* instance) { checkDeleteListener(); m_instance = instance; if (m_instance) { m_instance->addDeleteListener(m_listener); } } void RendererNode::changeInstance(Instance* instance) { if (m_instance == instance) { return; } checkDeleteListener(); if (m_instance) { m_instance->removeDeleteListener(m_listener); } m_instance = instance; if (m_instance) { m_instance->addDeleteListener(m_listener); } } void RendererNode::removeInstance(Instance* instance, bool listener) { if (m_instance == instance && instance) { if (listener) { m_instance->removeDeleteListener(m_listener); } m_instance = NULL; } } void RendererNode::checkDeleteListener() { if (m_listener) { return; } m_listener = new NodeInstanceDeleteListener(this); } Point RendererNode::getCalculatedPoint(Camera* cam, Layer* layer, const bool zoomed) { ScreenPoint p; if(m_instance != NULL) { if(m_layer == NULL) { m_layer = m_instance->getLocationRef().getLayer(); } if(m_location != NULL) { p = cam->toScreenCoordinates(m_instance->getLocationRef().getMapCoordinates() + m_location.getMapCoordinates()); } else { p = cam->toScreenCoordinates(m_instance->getLocationRef().getMapCoordinates()); } } else if(m_location != NULL) { if(m_layer == NULL) { m_layer = m_location.getLayer(); } p = cam->toScreenCoordinates(m_location.getMapCoordinates()); } else if(m_layer == NULL) { // FIXME FL_WARN(_log, LMsg("RendererNode::getCalculatedPoint(Camera, Layer) - ") << "No layer attached. So we use the first active layer of the renderer."); setAttached(layer); } if(zoomed) { return Point(round(m_point.x * cam->getZoom()) + p.x, round(m_point.y * cam->getZoom()) + p.y); } else { return Point(m_point.x + p.x, m_point.y + p.y); } } } fifengine-0.4.2/engine/core/model/structures/renderernode.h000066400000000000000000000104331341615052600240200ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_RENDERERNODE_H #define FIFE_RENDERERNODE_H // Standard C++ library includes //#include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder namespace FIFE { class InstanceDeleteListener; class RendererNode { public: RendererNode(Instance* attached_instance, const Location &relative_location, Layer* relative_layer, const Point &relative_point = Point(0,0)); RendererNode(Instance* attached_instance, const Location &relative_location, const Point &relative_point = Point(0,0)); RendererNode(Instance* attached_instance, Layer* relative_layer, const Point &relative_point = Point(0,0)); RendererNode(Instance* attached_instance, const Point &relative_point = Point(0,0)); RendererNode(const Location &attached_location, Layer* relative_layer, const Point &relative_point = Point(0,0)); RendererNode(const Location &attached_location, const Point &relative_point = Point(0,0)); RendererNode(Layer* attached_layer, const Point &relative_point = Point(0,0)); RendererNode(const Point &attached_point); RendererNode(const RendererNode &old); RendererNode& operator=(const RendererNode &source); ~RendererNode(); void setAttached(Instance* attached_instance, const Location &relative_location, const Point &relative_point); void setAttached(Instance* attached_instance, const Location &relative_location); void setAttached(Instance* attached_instance, const Point &relative_point); void setAttached(Instance* attached_instance); void setAttached(const Location &attached_location, const Point &relative_point); void setAttached(const Location &attached_location); void setAttached(Layer* attached_layer); void setAttached(const Point &attached_point); void setRelative(const Location &relative_location); void setRelative(const Location &relative_location, Point relative_point); void setRelative(const Point &relative_point); Instance* getAttachedInstance(); Location getAttachedLocation(); Layer* getAttachedLayer(); Point getAttachedPoint(); Location getOffsetLocation(); Point getOffsetPoint(); Instance* getInstance(); Location getLocation(); const Location& getLocationRef(); Layer* getLayer(); Point getPoint(); const Point& getPointRef(); void addInstance(Instance* instance); void changeInstance(Instance* instance); void removeInstance(Instance* instance, bool listener = true); Point getCalculatedPoint(Camera* cam, Layer* layer, const bool zoomed = false); private: void checkDeleteListener(); Instance* m_instance; Location m_location; Layer* m_layer; Point m_point; InstanceDeleteListener* m_listener; }; } #endif fifengine-0.4.2/engine/core/model/structures/renderernode.i000066400000000000000000000073031341615052600240230ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fife %{ #include "model/structures/renderernode.h" %} namespace FIFE { %ignore RendererNode::operator=; class RendererNode { public: RendererNode(Instance* attached_instance, const Location &relative_location, Layer* relative_layer, const Point &relative_point = Point(0,0)); RendererNode(Instance* attached_instance, const Location &relative_location, const Point &relative_point = Point(0,0)); RendererNode(Instance* attached_instance, Layer* relative_layer, const Point &relative_point = Point(0,0)); RendererNode(Instance* attached_instance, const Point &relative_point = Point(0,0)); RendererNode(const Location &attached_location, Layer* relative_layer, const Point &relative_point = Point(0,0)); RendererNode(const Location &attached_location, const Point &relative_point = Point(0,0)); RendererNode(Layer* attached_layer, const Point &relative_point = Point(0,0)); RendererNode(const Point &attached_point); RendererNode(const RendererNode &old); RendererNode& operator=(const RendererNode &source); ~RendererNode(); void setAttached(Instance* attached_instance, const Location &relative_location, const Point &relative_point); void setAttached(Instance* attached_instance, const Location &relative_location); void setAttached(Instance* attached_instance, const Point &relative_point); void setAttached(Instance* attached_instance); void setAttached(const Location &attached_location, const Point &relative_point); void setAttached(const Location &attached_location); void setAttached(Layer* attached_layer); void setAttached(const Point &attached_point); void setRelative(const Location &relative_location); void setRelative(const Location &relative_location, Point relative_point); void setRelative(const Point &relative_point); Instance* getAttachedInstance(); Location getAttachedLocation(); Layer* getAttachedLayer(); Point getAttachedPoint(); Location getOffsetLocation(); Point getOffsetPoint(); Instance* getInstance(); Location getLocation(); const Location& getLocationRef(); Layer* getLayer(); Point getPoint(); const Point& getPointRef(); Point getCalculatedPoint(Camera* cam, Layer* layer, const bool zoomed); }; } fifengine-0.4.2/engine/core/model/structures/trigger.cpp000066400000000000000000000303321341615052600233420ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "cell.h" #include "cellcache.h" #include "instance.h" #include "layer.h" #include "location.h" #include "trigger.h" namespace FIFE { class TriggerChangeListener : public CellChangeListener, public InstanceChangeListener, public InstanceDeleteListener { public: TriggerChangeListener(Trigger* trigger) { m_trigger = trigger; } virtual ~TriggerChangeListener() {} // InstanceDeleteListener callback virtual void onInstanceDeleted(Instance* instance) { const std::vector& types = m_trigger->getTriggerConditions(); if (std::find(types.begin(), types.end(), INSTANCE_TRIGGER_DELETE) != types.end()) { m_trigger->setTriggered(); } m_trigger->detach(); } // CellChangeListener callback virtual void onInstanceEnteredCell(Cell* cell, Instance* instance) { const std::vector& types = m_trigger->getTriggerConditions(); if (std::find(types.begin(), types.end(), CELL_TRIGGER_ENTER) != types.end()) { const std::vector& restrict = m_trigger->getEnabledInstances(); if (m_trigger->isEnabledForAllInstances() || std::find(restrict.begin(), restrict.end(), instance) != restrict.end()) { m_trigger->setTriggered(); } } } // CellChangeListener callback virtual void onInstanceExitedCell(Cell* cell, Instance* instance) { const std::vector& types = m_trigger->getTriggerConditions(); if (std::find(types.begin(), types.end(), CELL_TRIGGER_EXIT) != types.end()) { const std::vector& restrict = m_trigger->getEnabledInstances(); if (m_trigger->isEnabledForAllInstances() || std::find(restrict.begin(), restrict.end(), instance) != restrict.end()) { m_trigger->setTriggered(); } } } // CellChangeListener callback virtual void onBlockingChangedCell(Cell* cell, CellTypeInfo type, bool blocks) { const std::vector& types = m_trigger->getTriggerConditions(); if (std::find(types.begin(), types.end(), CELL_TRIGGER_BLOCKING_CHANGE) != types.end()) { m_trigger->setTriggered(); } } // InstanceChangeListener callback virtual void onInstanceChanged(Instance* instance, InstanceChangeInfo info) { const std::vector& types = m_trigger->getTriggerConditions(); if (m_trigger->getAttached() == instance && (info & ICHANGE_CELL) == ICHANGE_CELL) { m_trigger->move(); } if (types.empty()) { return; } if ((info & ICHANGE_LOC) == ICHANGE_LOC && std::find(types.begin(), types.end(), INSTANCE_TRIGGER_LOCATION) != types.end()) { m_trigger->setTriggered(); } else if ((info & ICHANGE_ROTATION) == ICHANGE_ROTATION && std::find(types.begin(), types.end(), INSTANCE_TRIGGER_ROTATION) != types.end()) { m_trigger->setTriggered(); } else if ((info & ICHANGE_SPEED) == ICHANGE_SPEED && std::find(types.begin(), types.end(), INSTANCE_TRIGGER_SPEED) != types.end()) { m_trigger->setTriggered(); } else if ((info & ICHANGE_ACTION) == ICHANGE_ACTION && std::find(types.begin(), types.end(), INSTANCE_TRIGGER_ACTION) != types.end()) { m_trigger->setTriggered(); } else if ((info & ICHANGE_TIME_MULTIPLIER) == ICHANGE_TIME_MULTIPLIER && std::find(types.begin(), types.end(), INSTANCE_TRIGGER_TIME_MULTIPLIER) != types.end()) { m_trigger->setTriggered(); } else if ((info & ICHANGE_SAYTEXT) == ICHANGE_SAYTEXT && std::find(types.begin(), types.end(), INSTANCE_TRIGGER_SAYTEXT) != types.end()) { m_trigger->setTriggered(); } else if ((info & ICHANGE_BLOCK) == ICHANGE_BLOCK && std::find(types.begin(), types.end(), INSTANCE_TRIGGER_BLOCK) != types.end()) { m_trigger->setTriggered(); } else if ((info & ICHANGE_CELL) == ICHANGE_CELL && std::find(types.begin(), types.end(), INSTANCE_TRIGGER_CELL) != types.end()) { m_trigger->setTriggered(); } else if ((info & ICHANGE_TRANSPARENCY) == ICHANGE_TRANSPARENCY && std::find(types.begin(), types.end(), INSTANCE_TRIGGER_TRANSPARENCY) != types.end()) { m_trigger->setTriggered(); } else if ((info & ICHANGE_VISIBLE) == ICHANGE_VISIBLE && std::find(types.begin(), types.end(), INSTANCE_TRIGGER_VISIBLE) != types.end()) { m_trigger->setTriggered(); } else if ((info & ICHANGE_STACKPOS) == ICHANGE_STACKPOS && std::find(types.begin(), types.end(), INSTANCE_TRIGGER_STACKPOS) != types.end()) { m_trigger->setTriggered(); } else if ((info & ICHANGE_VISUAL) == ICHANGE_VISUAL && std::find(types.begin(), types.end(), INSTANCE_TRIGGER_VISUAL) != types.end()) { m_trigger->setTriggered(); } } private: Trigger* m_trigger; }; Trigger::Trigger(): m_name(""), m_triggered(false), m_enabledAll(false), m_attached(NULL) { m_changeListener = new TriggerChangeListener(this); } Trigger::Trigger(const std::string& name): m_name(name), m_triggered(false), m_enabledAll(false), m_attached(NULL) { m_changeListener = new TriggerChangeListener(this); } Trigger::~Trigger() { detach(); std::vector::iterator it = m_assigned.begin(); for (; it != m_assigned.end(); ++it) { (*it)->removeChangeListener(m_changeListener); } delete m_changeListener; } void Trigger::addTriggerListener(ITriggerListener* listener) { std::vector::iterator it = std::find(m_triggerListeners.begin(), m_triggerListeners.end(), listener); if (it == m_triggerListeners.end()) { m_triggerListeners.push_back(listener); } } void Trigger::removeTriggerListener(ITriggerListener* listener) { std::vector::iterator i = m_triggerListeners.begin(); while (i != m_triggerListeners.end()) { if ((*i) == listener) { // set the pointer to null, so it can be removed later *i = NULL; return; } ++i; } } void Trigger::reset() { m_triggered = false; } void Trigger::setTriggered() { if (!m_triggered) { m_triggered = true; std::vector::iterator i = m_triggerListeners.begin(); while (i != m_triggerListeners.end()) { if (*i) { (*i)->onTriggered(); } ++i; } } // remove null pointer m_triggerListeners.erase(std::remove(m_triggerListeners.begin(), m_triggerListeners.end(), (ITriggerListener*)NULL), m_triggerListeners.end()); } void Trigger::addTriggerCondition(TriggerCondition type) { std::vector::iterator it = std::find(m_triggerConditions.begin(), m_triggerConditions.end(), type); if (it == m_triggerConditions.end()) { m_triggerConditions.push_back(type); } } const std::vector& Trigger::getTriggerConditions() { return m_triggerConditions; } void Trigger::removeTriggerCondition(TriggerCondition type) { std::vector::iterator it = std::find(m_triggerConditions.begin(), m_triggerConditions.end(), type); if (it != m_triggerConditions.end()) { m_triggerConditions.erase(it); } } void Trigger::enableForInstance(Instance* instance) { std::vector::iterator it = std::find(m_enabledInstances.begin(), m_enabledInstances.end(), instance); if (it == m_enabledInstances.end()) { m_enabledInstances.push_back(instance); } } const std::vector& Trigger::getEnabledInstances() { return m_enabledInstances; } void Trigger::disableForInstance(Instance* instance) { std::vector::iterator it = std::find(m_enabledInstances.begin(), m_enabledInstances.end(), instance); if (it != m_enabledInstances.end()) { m_enabledInstances.erase(it); } } void Trigger::enableForAllInstances() { m_enabledAll = true; } bool Trigger::isEnabledForAllInstances() { return m_enabledAll; } void Trigger::disableForAllInstances() { m_enabledAll = false; } void Trigger::assign(Layer* layer, const ModelCoordinate& pt) { Cell* cell = layer->getCellCache()->getCell(pt); if (!cell) { return; } std::vector::iterator it = std::find(m_assigned.begin(), m_assigned.end(), cell); if (it == m_assigned.end()) { m_assigned.push_back(cell); cell->addChangeListener(m_changeListener); } } void Trigger::remove(Layer* layer, const ModelCoordinate& pt) { Cell* cell = layer->getCellCache()->getCell(pt); if (!cell) { return; } std::vector::iterator it = std::find(m_assigned.begin(), m_assigned.end(), cell); if (it != m_assigned.end()) { m_assigned.erase(it); cell->removeChangeListener(m_changeListener); } } void Trigger::assign(Cell* cell) { std::vector::iterator it = std::find(m_assigned.begin(), m_assigned.end(), cell); if (it == m_assigned.end()) { m_assigned.push_back(cell); cell->addChangeListener(m_changeListener); } } void Trigger::remove(Cell* cell) { std::vector::iterator it = std::find(m_assigned.begin(), m_assigned.end(), cell); if (it != m_assigned.end()) { m_assigned.erase(it); cell->removeChangeListener(m_changeListener); } } const std::vector& Trigger::getAssignedCells() { return m_assigned; } void Trigger::attach(Instance* instance) { if (instance == m_attached) { return; } if (m_attached) { detach(); } m_attached = instance; m_attached->addDeleteListener(m_changeListener); m_attached->addChangeListener(m_changeListener); } void Trigger::detach() { if (m_attached) { m_attached->removeDeleteListener(m_changeListener); m_attached->removeChangeListener(m_changeListener); m_attached = 0; } } void Trigger::move() { if (m_assigned.empty()) { return; } ModelCoordinate newPos = m_attached->getLocationRef().getLayerCoordinates(); ModelCoordinate oldPos = m_attached->getOldLocationRef().getLayerCoordinates(); moveTo(newPos, oldPos); } void Trigger::moveTo(const ModelCoordinate& newPos, const ModelCoordinate& oldPos) { ModelCoordinate mc(newPos.x-oldPos.x, newPos.y-oldPos.y); CellCache* cache = m_attached->getLocationRef().getLayer()->getCellCache(); std::vector newCells; std::vector::iterator it = m_assigned.begin(); for (; it != m_assigned.end(); ++it) { ModelCoordinate coord = (*it)->getLayerCoordinates(); coord.x += mc.x; coord.y += mc.y; Cell* c = cache->getCell(coord); if (c) { newCells.push_back(c); } } for (it = newCells.begin(); it != newCells.end(); ++it) { std::vector::iterator found = std::find(m_assigned.begin(), m_assigned.end(), *it); if (found != m_assigned.end()) { m_assigned.erase(found); } else { // add new (*it)->addChangeListener(m_changeListener); } } // remove old for (it = m_assigned.begin(); it != m_assigned.end(); ++it) { (*it)->removeChangeListener(m_changeListener); } m_assigned = newCells; } } fifengine-0.4.2/engine/core/model/structures/trigger.h000066400000000000000000000205171341615052600230130ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_TRIGGER_H #define FIFE_TRIGGER_H // Standard C++ library includes #include #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/fifeclass.h" namespace FIFE { class Cell; class Layer; class Instance; class TriggerChangeListener; class ITriggerListener { public: virtual ~ITriggerListener() {}; virtual void onTriggered() = 0; }; enum TriggerCondition { // cell conditions CELL_TRIGGER_ENTER = 0, CELL_TRIGGER_EXIT, CELL_TRIGGER_BLOCKING_CHANGE, // instance conditions INSTANCE_TRIGGER_LOCATION, INSTANCE_TRIGGER_ROTATION, INSTANCE_TRIGGER_SPEED, INSTANCE_TRIGGER_ACTION, INSTANCE_TRIGGER_TIME_MULTIPLIER, INSTANCE_TRIGGER_SAYTEXT, INSTANCE_TRIGGER_BLOCK, INSTANCE_TRIGGER_CELL, INSTANCE_TRIGGER_TRANSPARENCY, INSTANCE_TRIGGER_VISIBLE, INSTANCE_TRIGGER_STACKPOS, INSTANCE_TRIGGER_VISUAL, INSTANCE_TRIGGER_DELETE }; // FORWARD REFERENCES /** Trigger get triggered when a specific set of criteria are met. * * Currently these can be added directly to Layers. In order to extend * their use we might consider abstracting them from the Layer and adding * a trigger manager of some sort which will then add the appropriate * listeners to the layer and any other object that might need to * trip a trigger. * * @see Layer */ class Trigger : public FifeClass { public: // LIFECYCLE /** Default constructor. * * TODO (fixme) * I'm not sure if I actually want to be able to call the default constructor. * Triggers should always be given a name. * The maps trigger controller should guarantee the uniqueness of the name. */ Trigger(); /** Constructor with name * * Triggers should be created with a name as that is how they will * be referred to in the map file. * */ Trigger(const std::string& name); /** Destructor. */ virtual ~Trigger(); /** Add a listener to the trigger. * * When a trigger gets triggered it will call the onTriggered() * function of the listener. * * The Trigger does NOT take ownership of the listener so clients * must be sure to free their memory after the trigger has been * deleted. * * @see ITriggerListener */ void addTriggerListener(ITriggerListener* listener); /** Removes a listener from the trigger. * * This listener will no longer get called. The Trigger does * NOT free the listener so you must be sure to do this. */ void removeTriggerListener(ITriggerListener* listener); /** Reset trigger * * Resets the status of the trigger so it can be triggered again. * */ void reset(); /** Gets the name of the trigger. * * @return name of the trigger. */ const std::string& getName() const { return m_name; }; /** Returns if the trigger has been triggered * * Triggers will only trigger once unless they are reset. * @return bool true if the trigger has been triggered, false * otherwise. */ bool isTriggered() { return m_triggered; }; /** Sets the trigger to triggered and calls ITriggerListener->onTriggered() */ void setTriggered(); /** Adds trigger condition. * * @param type The trigger condition. */ void addTriggerCondition(TriggerCondition type); /** Returns trigger conditions in an vector. */ const std::vector& getTriggerConditions(); /** Removes trigger condition. * * @param type The trigger condition. */ void removeTriggerCondition(TriggerCondition type); /** Enables trigger for given instance. * * @param instance The instance which is enabled for the trigger. */ void enableForInstance(Instance* instance); /** Returns instance which the trigger is enabled for. */ const std::vector& getEnabledInstances(); /** Disables trigger for given instance. * * @param instance The instance which is disabled for the trigger. */ void disableForInstance(Instance* instance); /** Enables trigger for all instances. */ void enableForAllInstances(); /** Returns if trigger is enabled for all instances. */ bool isEnabledForAllInstances(); /** Disables trigger for all instances. */ void disableForAllInstances(); /** Assigns trigger on given layer and position. * * @param layer A pointer to the layer in which to add the Trigger to. * @param pt The ModelCoordinate where the Trigger should be added. */ void assign(Layer* layer, const ModelCoordinate& pt); /** Removes trigger from given layer and position. * * @param layer A pointer to the layer in which to remove the Trigger from. * @param pt The ModelCoordinate where the Trigger should be removed. */ void remove(Layer* layer, const ModelCoordinate& pt); /** Assigns trigger on given cell. * * @param cell A pointer to the cell in which to add the Trigger to. */ void assign(Cell* cell); /** Removes trigger from given cell. * * @param cell A pointer to the cell in which to remove the Trigger from. */ void remove(Cell* cell); /** Returns vector with the cells where the trigger is assigned to. */ const std::vector& getAssignedCells(); /** Attaches the trigger to the given instance. So the trigger moves with the instance. * * @param instance A pointer to the instance which the Trigger is attached to. */ void attach(Instance* instance); /** Detaches trigger from instance. */ void detach(); /** Returns pointer to instance where the trigger is attached to. * Note: Returns Null if no instance is attached. */ Instance* getAttached() { return m_attached; } /** Callback for TriggerChangeListener. */ void move(); /** Moves the trigger from the old position to the new position. * * @param newPos The old position as ModelCoordinate. * @param oldPos The old position as ModelCoordinate. */ void moveTo(const ModelCoordinate& newPos, const ModelCoordinate& oldPos); private: //! name of the trigger. This should be unique per Map. std::string m_name; //! true if this trigger has been triggered bool m_triggered; //! true if the trigger is enabled for all instances bool m_enabledAll; //! Vector of the listeners that get called std::vector m_triggerListeners; //! main change listener (cell and instance listener) TriggerChangeListener* m_changeListener; //! cells in which the trigger is assigned std::vector m_assigned; //! all trigger conditions std::vector m_triggerConditions; //! all enabled instances std::vector m_enabledInstances; //! instance where the trigger is attached to Instance* m_attached; }; } //FIFE #endif fifengine-0.4.2/engine/core/model/structures/trigger.i000066400000000000000000000126751341615052600230220ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fife %{ #include "model/structures/trigger.h" #include "model/structures/triggercontroller.h" %} namespace FIFE { class Map; class Layer; class Instance; enum TriggerCondition { CELL_TRIGGER_ENTER = 0, CELL_TRIGGER_EXIT, CELL_TRIGGER_BLOCKING_CHANGE, INSTANCE_TRIGGER_LOCATION, INSTANCE_TRIGGER_ROTATION, INSTANCE_TRIGGER_SPEED, INSTANCE_TRIGGER_ACTION, INSTANCE_TRIGGER_TIME_MULTIPLIER, INSTANCE_TRIGGER_SAYTEXT, INSTANCE_TRIGGER_BLOCK, INSTANCE_TRIGGER_CELL, INSTANCE_TRIGGER_TRANSPARENCY, INSTANCE_TRIGGER_VISIBLE, INSTANCE_TRIGGER_STACKPOS, INSTANCE_TRIGGER_VISUAL, INSTANCE_TRIGGER_DELETE }; %feature("director") ITriggerListener; class ITriggerListener { public: virtual ~ITriggerListener() {}; virtual void onTriggered() = 0; }; class Trigger : public FifeClass { public: virtual ~Trigger(); void addTriggerListener(ITriggerListener* listener); void removeTriggerListener(ITriggerListener* listener); void reset(); const std::string& getName() const; bool isTriggered(); void setTriggered(); void addTriggerCondition(TriggerCondition type); const std::vector& getTriggerConditions(); void removeTriggerCondition(TriggerCondition type); void enableForInstance(Instance* instance); const std::vector& getEnabledInstances(); void disableForInstance(Instance* instance); void enableForAllInstances(); bool isEnabledForAllInstances(); void disableForAllInstances(); void assign(Layer* layer, const ModelCoordinate& pt); void remove(Layer* layer, const ModelCoordinate& pt); void assign(Cell* cell); void remove(Cell* cell); void attach(Instance* instance); void detach(); Instance* getAttached(); void moveTo(const ModelCoordinate& newPos, const ModelCoordinate& oldPos); const std::vector& getAssignedCells(); private: Trigger(); Trigger(const std::string& name); }; class TriggerController : public FifeClass { public: virtual ~TriggerController(); Trigger* createTrigger(const std::string& triggerName); Trigger* createTriggerOnCoordinate(const std::string& triggerName, Layer* layer, const ModelCoordinate& pt); Trigger* createTriggerOnCoordinates(const std::string& triggerName, Layer* layer, const std::vector& coords); Trigger* createTriggerOnRect(const std::string& triggerName, Layer* layer, const Rect& rec); Trigger* createTriggerOnLocation(const std::string& triggerName, const Location& loc); Trigger* createTriggerOnLocations(const std::string& triggerName, const std::vector& locs); Trigger* createTriggerOnCell(const std::string& triggerName, Cell* cell); Trigger* createTriggerOnCells(const std::string& triggerName, const std::vector& cells); Trigger* createTriggerOnInstance(const std::string& triggerName, Instance* instance); Trigger* getTrigger(const std::string& triggerName); void deleteTrigger(const std::string& triggerName); void removeTriggerFromCoordinate(const std::string& triggerName, Layer* layer, const ModelCoordinate& pt); void removeTriggerFromCoordinates(const std::string& triggerName, Layer* layer, const std::vector& coords); void removeTriggerFromRect(const std::string& triggerName, Layer* layer, const Rect& rec); void removeTriggerFromLocation(const std::string& triggerName, const Location& loc); void removeTriggerFromLocations(const std::string& triggerName, const std::vector& locs); void removeTriggerFromCell(const std::string& triggerName, Cell* cell); void removeTriggerFromCells(const std::string& triggerName, const std::vector& cells); void removeTriggerFromInstance(const std::string& triggerName, Instance* instance); std::vector getAllTriggers(); std::vector getAllTriggerNames(); private: TriggerController(Map* map); }; } //FIFE namespace std { %template(TriggerConditionVector) vector; %template(TriggerVector) vector; }fifengine-0.4.2/engine/core/model/structures/triggercontroller.cpp000066400000000000000000000216521341615052600254530ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "model/metamodel/modelcoords.h" #include "util/log/logger.h" #include "cell.h" #include "cellcache.h" #include "map.h" #include "trigger.h" #include "triggercontroller.h" namespace FIFE { static Logger _log(LM_STRUCTURES); TriggerController::TriggerController(Map* map) : m_map(map) { } TriggerController::~TriggerController() { TriggerNameMapIterator it = m_triggerNameMap.begin(); for (; it != m_triggerNameMap.end(); ++it) { delete it->second; } } Trigger* TriggerController::createTrigger(const std::string& triggerName) { //assert(!exists(triggerName)); Trigger* trigger = new Trigger(triggerName); std::pair returnValue; returnValue = m_triggerNameMap.insert ( TriggerNameMapPair(triggerName, trigger)); if (!returnValue.second) { delete trigger; FL_WARN(_log, LMsg("TriggerController::createTrigger() - ") << "Trigger " << triggerName << " already exists.... ignoring."); } return returnValue.first->second; } Trigger* TriggerController::createTriggerOnCoordinate(const std::string& triggerName, Layer* layer, const ModelCoordinate& pt) { assert(layer); Trigger* trigger = createTrigger(triggerName); trigger->assign(layer, pt); return trigger; } Trigger* TriggerController::createTriggerOnCoordinates(const std::string& triggerName, Layer* layer, const std::vector& coords) { assert(layer); Trigger* trigger = createTrigger(triggerName); for (std::vector::const_iterator it = coords.begin(); it != coords.end(); ++it) { trigger->assign(layer, *it); } return trigger; } Trigger* TriggerController::createTriggerOnRect(const std::string& triggerName, Layer* layer, const Rect& rec) { assert(layer); assert(layer->getCellCache()); Trigger* trigger = createTrigger(triggerName); std::vector cells = layer->getCellCache()->getCellsInRect(rec); for (std::vector::iterator it = cells.begin(); it != cells.end(); ++it) { trigger->assign(*it); } return trigger; } Trigger* TriggerController::createTriggerOnLocation(const std::string& triggerName, const Location& loc) { assert(loc.getLayer()); assert(loc.getLayer()->getCellCache()); Trigger* trigger = createTrigger(triggerName); trigger->assign(loc.getLayer(), loc.getLayerCoordinates()); return trigger; } Trigger* TriggerController::createTriggerOnLocations(const std::string& triggerName, const std::vector& locs) { Trigger* trigger = createTrigger(triggerName); for (std::vector::const_iterator it = locs.begin(); it != locs.end(); ++it) { trigger->assign((*it).getLayer(), (*it).getLayerCoordinates()); } return trigger; } Trigger* TriggerController::createTriggerOnCell(const std::string& triggerName, Cell* cell) { assert(cell); Trigger* trigger = createTrigger(triggerName); trigger->assign(cell); return trigger; } Trigger* TriggerController::createTriggerOnCells(const std::string& triggerName, const std::vector& cells) { Trigger* trigger = createTrigger(triggerName); for (std::vector::const_iterator it = cells.begin(); it != cells.end(); ++it) { trigger->assign(*it); } return trigger; } Trigger* TriggerController::createTriggerOnInstance(const std::string& triggerName, Instance* instance) { assert(instance); Trigger* trigger = createTrigger(triggerName); trigger->attach(instance); return trigger; } Trigger* TriggerController::getTrigger(const std::string& triggerName) { TriggerNameMapIterator it = m_triggerNameMap.find(triggerName); if (it != m_triggerNameMap.end()) { return it->second; } return NULL; } void TriggerController::deleteTrigger(const std::string& triggerName) { TriggerNameMapIterator it = m_triggerNameMap.find(triggerName); if (it != m_triggerNameMap.end()) { delete it->second; m_triggerNameMap.erase(it); } } void TriggerController::removeTriggerFromCoordinate(const std::string& triggerName, Layer* layer, const ModelCoordinate& pt) { TriggerNameMapIterator it = m_triggerNameMap.find(triggerName); if (it != m_triggerNameMap.end()) { it->second->remove(layer, pt); } } void TriggerController::removeTriggerFromCoordinates(const std::string& triggerName, Layer* layer, const std::vector& coords) { TriggerNameMapIterator it = m_triggerNameMap.find(triggerName); if (it != m_triggerNameMap.end()) { for (std::vector::const_iterator cit = coords.begin(); cit != coords.end(); ++cit) { it->second->remove(layer, *cit); } } } void TriggerController::removeTriggerFromRect(const std::string& triggerName, Layer* layer, const Rect& rec) { TriggerNameMapIterator it = m_triggerNameMap.find(triggerName); if (it != m_triggerNameMap.end()) { std::vector cells = layer->getCellCache()->getCellsInRect(rec); for (std::vector::iterator cit = cells.begin(); cit != cells.end(); ++cit) { it->second->remove(*cit); } } } void TriggerController::removeTriggerFromLocation(const std::string& triggerName, const Location& loc) { TriggerNameMapIterator it = m_triggerNameMap.find(triggerName); if (it != m_triggerNameMap.end()) { it->second->remove(loc.getLayer(), loc.getLayerCoordinates()); } } void TriggerController::removeTriggerFromLocations(const std::string& triggerName, const std::vector& locs) { TriggerNameMapIterator it = m_triggerNameMap.find(triggerName); if (it != m_triggerNameMap.end()) { for (std::vector::const_iterator cit = locs.begin(); cit != locs.end(); ++cit) { it->second->remove((*cit).getLayer(), (*cit).getLayerCoordinates()); } } } void TriggerController::removeTriggerFromCell(const std::string& triggerName, Cell* cell) { TriggerNameMapIterator it = m_triggerNameMap.find(triggerName); if (it != m_triggerNameMap.end()) { it->second->remove(cell); } } void TriggerController::removeTriggerFromCells(const std::string& triggerName, const std::vector& cells) { TriggerNameMapIterator it = m_triggerNameMap.find(triggerName); if (it != m_triggerNameMap.end()) { for (std::vector::const_iterator cit = cells.begin(); cit != cells.end(); ++cit) { it->second->remove(*cit); } } } void TriggerController::removeTriggerFromInstance(const std::string& triggerName, Instance* instance) { TriggerNameMapIterator it = m_triggerNameMap.find(triggerName); if (it != m_triggerNameMap.end()) { if (it->second->getAttached() == instance) { it->second->detach(); } } } std::vector TriggerController::getAllTriggers() { std::vector triggers; TriggerNameMapIterator it = m_triggerNameMap.begin(); for (; it != m_triggerNameMap.end(); ++it) { triggers.push_back(it->second); } return triggers; } std::vector TriggerController::getAllTriggerNames() { std::vector names; TriggerNameMapIterator it = m_triggerNameMap.begin(); for (; it != m_triggerNameMap.end(); ++it) { names.push_back(it->first); } return names; } bool TriggerController::exists(const std::string& name) { TriggerNameMapIterator it = m_triggerNameMap.find(name); if (it != m_triggerNameMap.end()) { return true; } return false; } } //FIFE fifengine-0.4.2/engine/core/model/structures/triggercontroller.h000066400000000000000000000232201341615052600251110ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_TRIGGER_CONTROLLER_H #define FIFE_TRIGGER_CONTROLLER_H // Standard C++ library includes #include #include #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/fifeclass.h" #include "util/structures/rect.h" #include "model/metamodel/modelcoords.h" namespace FIFE { class Trigger; class Map; class Layer; class Location; class Instance; class Cell; /** This class serves as a central place to manage triggers for a Map. * * You should never instantiate this class directly as Map does it * when you create a new map. */ class TriggerController : public FifeClass { public: /** Constructor. * * @param map A pointer to the map that the controller will interact with. */ TriggerController(Map* map); /** Destructor. */ virtual ~TriggerController(); /** Creates a trigger. * * @param triggerName The name of the trigger. This must be unique per map. */ Trigger* createTrigger(const std::string& triggerName); /** Creates and adds a trigger to the cell on the specified layer and coordinate. * * @param triggerName The name of the trigger. This must be unique per map. * @param layer A pointer to the layer in which to add the Trigger to * @param pt The ModelCoordinate where the Trigger should be added. */ Trigger* createTriggerOnCoordinate(const std::string& triggerName, Layer* layer, const ModelCoordinate& pt); /** Creates and adds a trigger to the cells on the specified layer and coordinates. * * @param triggerName The name of the trigger. This must be unique per map. * @param layer A pointer to the layer in which to add the Trigger to * @param coords Vector with ModelCoordinates where the Trigger should be added. */ Trigger* createTriggerOnCoordinates(const std::string& triggerName, Layer* layer, const std::vector& coords); /** Creates and adds a trigger to the cells on the specified layer and rect. * * @param triggerName The name of the trigger. This must be unique per map. * @param layer A pointer to the layer in which to add the Trigger to * @param rec a Rect with ModelCoordinates where the Trigger should be added. */ Trigger* createTriggerOnRect(const std::string& triggerName, Layer* layer, const Rect& rec); /** Creates and adds a trigger to the cell on the specified location. * * @param triggerName The name of the trigger. This must be unique per map. * @param loc The Location where the Trigger should be added. */ Trigger* createTriggerOnLocation(const std::string& triggerName, const Location& loc); /** Creates and adds a trigger to the cell on the specified locations. * * @param triggerName The name of the trigger. This must be unique per map. * @param locs Vector with Locations where the Trigger should be added. */ Trigger* createTriggerOnLocations(const std::string& triggerName, const std::vector& locs); /** Creates and adds a trigger to the specified cell. * * @param triggerName The name of the trigger. This must be unique per map. * @param cell The Cell where the Trigger should be added. */ Trigger* createTriggerOnCell(const std::string& triggerName, Cell* cell); /** Creates and adds a trigger to the specified cells. * * @param triggerName The name of the trigger. This must be unique per map. * @param cells Vector with Cell pointers where the Trigger should be added. */ Trigger* createTriggerOnCells(const std::string& triggerName, const std::vector& cells); /** Creates and attach a trigger to the specified instance. But not to the underlaying cell. * * @param triggerName The name of the trigger. This must be unique per map. * @param instance The Instance where the Trigger is attached to. */ Trigger* createTriggerOnInstance(const std::string& triggerName, Instance* instance); /** Returns a pointer to the trigger with the given name. * Note: Returns Null if the trigger does not exists. * * @param triggerName The name of the trigger. This must be unique per map. */ Trigger* getTrigger(const std::string& triggerName); /** Deletes a trigger with the given name. * * @param triggerName The name of the trigger. This must be unique per map. */ void deleteTrigger(const std::string& triggerName); /** Removes a trigger from the cell on the specified layer and coordinate. * * @param triggerName The name of the trigger. This must be unique per map. * @param layer A pointer to the layer in which to remove the Trigger from. * @param pt The ModelCoordinate where the Trigger should be removed. */ void removeTriggerFromCoordinate(const std::string& triggerName, Layer* layer, const ModelCoordinate& pt); /** Removes a trigger from the cell on the specified layer and coordinates. * * @param triggerName The name of the trigger. This must be unique per map. * @param layer A pointer to the layer in which to remove the Trigger from. * @param coords Vector with ModelCoordinates where the Trigger should be removed. */ void removeTriggerFromCoordinates(const std::string& triggerName, Layer* layer, const std::vector& coords); /** Removes a trigger from the cell on the specified layer and coordinates. * * @param triggerName The name of the trigger. This must be unique per map. * @param layer A pointer to the layer in which to remove the Trigger from. * @param rec Rect with ModelCoordinates where the Trigger should be removed. */ void removeTriggerFromRect(const std::string& triggerName, Layer* layer, const Rect& rec); /** Removes a trigger from the cell on the specified location. * * @param triggerName The name of the trigger. This must be unique per map. * @param loc Location where the Trigger should be removed. */ void removeTriggerFromLocation(const std::string& triggerName, const Location& loc); /** Removes a trigger from the cell on the specified locations. * * @param triggerName The name of the trigger. This must be unique per map. * @param locs Vector with Locations where the Trigger should be removed. */ void removeTriggerFromLocations(const std::string& triggerName, const std::vector& locs); /** Removes a trigger from the specified cell. * * @param triggerName The name of the trigger. This must be unique per map. * @param cell The Cell pointer where the Trigger should be removed. */ void removeTriggerFromCell(const std::string& triggerName, Cell* cell); /** Removes a trigger from the specified cells. * * @param triggerName The name of the trigger. This must be unique per map. * @param cells Vector with Cell pointers where the Trigger should be removed. */ void removeTriggerFromCells(const std::string& triggerName, const std::vector& cells); /** Detach a trigger from the specified instance. * * @param triggerName The name of the trigger. This must be unique per map. * @param instance The instance pointer where the Trigger is detached from. */ void removeTriggerFromInstance(const std::string& triggerName, Instance* instance); /** Returns a vector with all trigger pointers. */ std::vector getAllTriggers(); /** Returns a vector with all trigger names. */ std::vector getAllTriggerNames(); private: /** Checks to see if the trigger name already exists. * * @param name The name of the trigger to check * * @return true if the name already exists, false otherwise. */ bool exists(const std::string& name); //! Pointer to the map this controller is associated with. Map* m_map; typedef std::map< std::string, Trigger* > TriggerNameMap; typedef std::map< std::string, Trigger* >::iterator TriggerNameMapIterator; typedef std::map< std::string, Trigger* >::const_iterator TriggerNameMapConstIterator; typedef std::pair< std::string, Trigger* > TriggerNameMapPair; //! Trigger name map TriggerNameMap m_triggerNameMap; }; } //FIFE #endif fifengine-0.4.2/engine/core/modules.h000066400000000000000000000073521341615052600174770ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_MODULES_H #define FIFE_MODULES_H // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder /** Modules available for logging */ enum logmodule_t { LM_CORE = -1, LM_AUDIO, LM_CONTROLLER, LM_EVTCHANNEL, LM_GUI, LM_CONSOLE, LM_LOADERS, LM_NATIVE_LOADERS, LM_FO_LOADERS, LM_SAVERS, LM_NATIVE_SAVERS, LM_MODEL, LM_STRUCTURES, LM_INSTANCE, LM_LOCATION, LM_METAMODEL, LM_CELLGRID, LM_SQUAREGRID, LM_HEXGRID, LM_PATHFINDER, LM_UTIL, LM_RESMGR, LM_VFS, LM_VIDEO, LM_VIEW, LM_CAMERA, LM_VIEWVIEW, LM_XML, LM_EXCEPTION, LM_SCRIPT, LM_CURSOR, LM_MODULE_MAX // sentinel }; /** Module hierarchy definition + display strings * format = module, module parent, module display name */ #define MODULE_INFO_RELATIONSHIPS \ ModuleInfo moduleInfos[] = { \ {LM_AUDIO, LM_CORE, "Audio"}, \ {LM_CONTROLLER, LM_CORE, "Controller"}, \ {LM_EVTCHANNEL, LM_CORE, "Event Channel"}, \ {LM_GUI, LM_CORE, "GUI"}, \ {LM_CONSOLE, LM_GUI, "Console"}, \ {LM_LOADERS, LM_CORE, "Loaders"}, \ {LM_NATIVE_LOADERS, LM_LOADERS, "Native loaders"}, \ {LM_FO_LOADERS, LM_LOADERS, "Fallout loaders"}, \ {LM_SAVERS, LM_CORE, "Savers"}, \ {LM_NATIVE_SAVERS, LM_CORE, "Native savers"}, \ {LM_MODEL, LM_CORE, "Model"}, \ {LM_STRUCTURES, LM_MODEL, "Structures"}, \ {LM_INSTANCE, LM_STRUCTURES, "Instance"}, \ {LM_LOCATION, LM_STRUCTURES, "Location"}, \ {LM_METAMODEL, LM_MODEL, "Metamodel"}, \ {LM_CELLGRID, LM_METAMODEL, "Cellgrid"}, \ {LM_SQUAREGRID, LM_METAMODEL, "Squaregrid"}, \ {LM_HEXGRID, LM_METAMODEL, "Hexgrid"}, \ {LM_PATHFINDER, LM_CORE, "Pathfinder"}, \ {LM_UTIL, LM_CORE, "Util"}, \ {LM_RESMGR, LM_UTIL, "Resource Manager"}, \ {LM_VFS, LM_CORE, "VFS"}, \ {LM_VIDEO, LM_CORE, "Video" }, \ {LM_VIEW, LM_CORE, "View"}, \ {LM_CAMERA, LM_VIEW, "Camera"}, \ {LM_VIEWVIEW, LM_VIEW, "View::View"}, \ {LM_XML, LM_CORE, "XML"}, \ {LM_EXCEPTION, LM_CORE, "Exception"}, \ {LM_SCRIPT, LM_CORE, "Script"}, \ {LM_CURSOR, LM_CORE, "Cursor"} \ }; #endif fifengine-0.4.2/engine/core/pathfinder/000077500000000000000000000000001341615052600177735ustar00rootroot00000000000000fifengine-0.4.2/engine/core/pathfinder/route.cpp000066400000000000000000000162431341615052600216430ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/log/logger.h" #include "model/metamodel/object.h" #include "model/structures/layer.h" #include "model/structures/location.h" #include "route.h" namespace FIFE { static Logger _log(LM_STRUCTURES); Route::Route(const Location& start, const Location& end): m_status(ROUTE_CREATED), m_startNode(start), m_endNode(end), m_walked(0), m_sessionId(-1), m_rotation(0), m_replanned(false), m_ignoresBlocker(false), m_costId(""), m_object(NULL) { } Route::~Route() { } void Route::setRouteStatus(RouteStatusInfo status) { if (m_status != status) { m_status = status; } } RouteStatusInfo Route::getRouteStatus() { return m_status; } void Route::setStartNode(const Location& node) { m_startNode = node; if (m_status != ROUTE_CREATED) { m_status = ROUTE_CREATED; if (!m_path.empty()) { m_path.clear(); } m_walked = 1; } } const Location& Route::getStartNode() { return m_startNode; } void Route::setEndNode(const Location& node) { if (m_status != ROUTE_CREATED) { m_status = ROUTE_CREATED; if (!m_path.empty()) { m_startNode = *m_current; m_path.clear(); } m_walked = 1; } m_endNode = node; } const Location& Route::getEndNode() { return m_endNode; } const Location& Route::getCurrentNode() { if (m_path.empty()) { return m_startNode; } if (m_current == m_path.end()) { return m_path.back(); } return *m_current; } const Location& Route::getPreviousNode() { if (m_path.empty()) { return m_startNode; } if (m_current != m_path.begin()) { --m_current; const Location& loc = *m_current; ++m_current; return loc; } return *m_current; } const Location& Route::getNextNode() { if (m_path.empty()) { return m_startNode; } if (m_current != m_path.end()) { ++m_current; if (m_current != m_path.end()) { const Location& loc = *m_current; --m_current; return loc; } --m_current; } return *m_current; } bool Route::walkToNextNode(int32_t step) { if (m_path.empty() || step == 0) { return false; } int32_t pos = static_cast(m_walked) + step; if (pos > static_cast(m_path.size()) || pos < 0) { return false; } if (step > 0) { for (int32_t i = 0; i < step; ++i, ++m_current); } else { for (int32_t i = 0; i > step; --i, --m_current); } m_walked += step; return true; } bool Route::reachedEnd() { if (m_path.empty()) { return true; } return m_current == m_path.end(); } void Route::setPath(const Path& path) { m_path = path; if (!m_path.empty()) { m_status = ROUTE_SOLVED; m_current = m_path.begin(); m_startNode = m_path.front(); m_endNode = m_path.back(); } if (!isMultiCell()) { m_replanned = false; } m_walked = 1; } Path Route::getPath() { return m_path; } void Route::cutPath(uint32_t length) { if (length == 0) { if (!m_path.empty()) { m_startNode = *m_current; m_endNode = *m_current; m_path.clear(); m_current = m_path.end(); } m_status = ROUTE_CREATED; m_walked = 1; m_replanned = true; return; } else if (length >= m_path.size()) { return; } uint32_t newend = m_walked + length - 1; if (newend > m_path.size()) { return; } m_path.resize(newend); m_endNode = m_path.back(); m_replanned = true; } void Route::setReplanned(bool replanned) { m_replanned = replanned; } bool Route::isReplanned() { return m_replanned; } uint32_t Route::getPathLength() { return m_path.size(); } uint32_t Route::getWalkedLength() { return m_walked; } void Route::setSessionId(int32_t id) { m_sessionId = id; } int32_t Route::getSessionId() { return m_sessionId; } void Route::setRotation(int32_t rotation) { m_rotation = rotation; } int32_t Route::getRotation() { return m_rotation; } void Route::setCostId(const std::string& cost) { m_costId = cost; } const std::string& Route::getCostId() { return m_costId; } bool Route::isMultiCell() { if (m_object) { return m_object->isMultiObject(); } return false; } void Route::setOccupiedArea(const std::vector& area) { m_area = area; } const std::vector& Route::getOccupiedArea() { return m_area; } std::vector Route::getOccupiedCells(int32_t rotation) { if (m_object) { return m_object->getMultiObjectCoordinates(rotation); } std::vector coords; return coords; } int32_t Route::getZStepRange() { if (!m_object) { return -1; } return m_object->getZStepRange(); } bool Route::isAreaLimited() { if (m_object) { if (!m_object->getWalkableAreas().empty()) { return true; } } return false; } const std::list Route::getLimitedAreas() { std::list areas; if (m_object) { areas = m_object->getWalkableAreas(); } return areas; } void Route::setDynamicBlockerIgnored(bool ignore) { m_ignoresBlocker = ignore; } bool Route::isDynamicBlockerIgnored() { return m_ignoresBlocker; } Path Route::getBlockingPathLocations() { Path p; if (!m_path.empty()) { for (PathIterator it = m_path.begin(); it != m_path.end(); ++it) { Layer* layer = (*it).getLayer(); if (layer->cellContainsBlockingInstance((*it).getLayerCoordinates())) { p.push_back(*it); } } } return p; } void Route::setObject(Object* obj) { m_object = obj; } Object* Route::getObject() { return m_object; } } // FIFE fifengine-0.4.2/engine/core/pathfinder/route.h000066400000000000000000000217471341615052600213150ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_ROUTE_H #define FIFE_ROUTE_H // Standard C++ library includes #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/fifeclass.h" namespace FIFE { class Location; class Object; /** Defines different route status types for the search. * * ROUTE_CREATED means, route is created but has no path and no search. * ROUTE_SEARCHING means, route is created but has no path and it is still being sought. * ROUTE_SEARCHED means, route is created and the search completed, on the next step the route is solved. * ROUTE_SOLVED means that a path could be found. * ROUTE_FAILED means the search failed. No path could be found. */ enum RouteStatus { ROUTE_CREATED = 0, ROUTE_SEARCHING, ROUTE_SEARCHED, ROUTE_SOLVED, ROUTE_FAILED }; typedef uint8_t RouteStatusInfo; //! A path is a list with locations. Each location holds the coordinate for one cell. typedef std::list Path; /** A basic route. * Holds the path and all related infos. */ class Route : public FifeClass { public: /** Constructor * @param start A const reference to the start location. * @param end A const reference to the end/target location. */ Route(const Location& start, const Location& end); /** Destructor */ ~Route(); /** Sets route status. * @param status The seach status that should be set. */ void setRouteStatus(RouteStatusInfo status); /** Returns route status. * @return The seach status that is set. */ RouteStatusInfo getRouteStatus(); /** Sets the start location. * @param node A const reference to the start location. */ void setStartNode(const Location& node); /** Returns the start location. * @return A const reference to the start location. */ const Location& getStartNode(); /** Sets the target location. * @param node A const reference to the end location. */ void setEndNode(const Location& node); /** Returns the target location. * @return A const reference to the end location. */ const Location& getEndNode(); /** Returns current location. * @return A const reference to the currently used location. */ const Location& getCurrentNode(); /** Returns previous location. * @return A const reference to the previous location. */ const Location& getPreviousNode(); /** Returns next location. * @return A const reference to the next location. */ const Location& getNextNode(); /** Changes the position on the path. * Changes the results of getCurrentNode(), getPreviousNode() and getPreviousNode(). * @param step A integer that indicates how much steps should be walked along the path, default is one. * @return A boolean, true if the position could be changed, false otherwise e.g. at path end. */ bool walkToNextNode(int32_t step = 1); /** Gets if the end of the path was achieved. * @return A boolean, if true the end is achieved, false otherwise. */ bool reachedEnd(); /** Sets the path for the route. * @param path A const reference to the path. */ void setPath(const Path& path); /** Returns the path. * @return The path which contains all steps. */ Path getPath(); /** Cuts path after the given length. * @param length The new length of the path. */ void cutPath(uint32_t length = 1); /** Sets the route to replanned. * @param replanned A boolean that indicates if true the route is replanned, otherwise false. */ void setReplanned(bool replanned); /** Gets if the route is replanned. * @return A boolean, if true the route is replanned, otherwise false. */ bool isReplanned(); /** Returns the length of the path. * @return The path length. */ uint32_t getPathLength(); /** Returns the walked steps. * @return The number of walked steps. */ uint32_t getWalkedLength(); /** Sets the session identifier. * @param id A integer as identifier for the search session. */ void setSessionId(int32_t id); /** Returns the session identifier. * @return A integer as identifier for the search session. */ int32_t getSessionId(); /** Sets the current rotation. * @param rotation The rotation as integer. */ void setRotation(int32_t rotation); /** Returns the current rotation. * @return The rotation as integer. */ int32_t getRotation(); /** Sets cost identifier which should be used for pathfinding. * @param cost A const reference to the string that contains the identifier. */ void setCostId(const std::string& cost); /** Returns cost identifier which is used for pathfinding. * @return A const reference to the string that contains the identifier. */ const std::string& getCostId(); /** Gets if path is for a multi cell object. * @return A boolean, true if path is for multi cell, otherwise false. */ bool isMultiCell(); /** Sets occupied coordinates for multi cell object. * @param area A const reference to a vector that contains the coordinates. */ void setOccupiedArea(const std::vector& area); /** Returns occupied coordinates for multi cell object. * @return A const reference to a vector that contains the coordinates. */ const std::vector& getOccupiedArea(); /** Returns relative coordinates for multi cell object based on rotation. * @param rotation The angle which is used to determine the occupied coordinates. * @return A const reference to a vector that contains the coordinates. */ std::vector getOccupiedCells(int32_t rotation); /** Returns z-step range from object. In case it is not limited -1 is returned. * @return The z-step range as int. */ int32_t getZStepRange(); bool isAreaLimited(); const std::list getLimitedAreas(); /** Sets the route to ignore dynamic blocker. * @param ignore A boolean that indicates if true the route ignores blocker, otherwise false. */ void setDynamicBlockerIgnored(bool ignore); /** Gets if the route ignores dynamic blocker. * @return A boolean, if true the route ignores blocker, otherwise false. */ bool isDynamicBlockerIgnored(); /** Returns the blocking locations of the path. * Only useful in case the blocking ignore flag is set. * @return A location list that contains all blocking locations of the path. */ Path getBlockingPathLocations(); /** Sets the object, needed for multi cell and z-step range. * @param obj A pointer to the object. */ void setObject(Object* obj); /** Returns the object, needed for multi cell and z-step range. * @return A pointer to the object. */ Object* getObject(); private: //! path iterator typedef Path::iterator PathIterator; //! search status RouteStatusInfo m_status; //! start location Location m_startNode; //! end location Location m_endNode; //! path Path m_path; //! current position on the path PathIterator m_current; //! walked steps on the path uint32_t m_walked; //! session id of the search int32_t m_sessionId; //! current rotation int32_t m_rotation; //! is path replanned bool m_replanned; //! ignores dynamic blocker bool m_ignoresBlocker; //! used cost identifier std::string m_costId; //! occupied cells by multicell object std::vector m_area; //! pointer to multi object Object* m_object; }; } // FIFE #endif fifengine-0.4.2/engine/core/pathfinder/route.i000066400000000000000000000031541341615052600213060ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fife %{ #include "pathfinder/route.h" %} %template(LocationList) std::list; fifengine-0.4.2/engine/core/pathfinder/routepather/000077500000000000000000000000001341615052600223355ustar00rootroot00000000000000fifengine-0.4.2/engine/core/pathfinder/routepather/multilayersearch.cpp000066400000000000000000000473041341615052600264260ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "model/metamodel/grids/cellgrid.h" #include "model/structures/layer.h" #include "model/structures/cellcache.h" #include "model/structures/cell.h" #include "model/structures/map.h" #include "pathfinder/route.h" #include "util/math/fife_math.h" #include "multilayersearch.h" namespace FIFE { MultiLayerSearch::MultiLayerSearch(Route* route, const int32_t sessionId): RoutePatherSearch(route, sessionId), m_to(route->getEndNode()), m_from(route->getStartNode()), m_startCache(m_from.getLayer()->getCellCache()), m_endCache(m_to.getLayer()->getCellCache()), m_currentCache(NULL), m_startZone(m_startCache->getCell(m_from.getLayerCoordinates())->getZone()), m_endZone(m_endCache->getCell(m_to.getLayerCoordinates())->getZone()), m_startCoordInt(m_startCache->convertCoordToInt(m_from.getLayerCoordinates())), m_lastStartCoordInt(m_startCoordInt), m_destCoordInt(m_endCache->convertCoordToInt(m_to.getLayerCoordinates())), m_lastDestCoordInt(-1), m_next(0), m_foundLast(true) { // if end zone is invalid (static blocker) then change it if (!m_endZone) { Cell* endcell = m_endCache->getCell(m_to.getLayerCoordinates()); const std::vector& neighbors = endcell->getNeighbors(); for (std::vector::const_iterator it = neighbors.begin(); it != neighbors.end(); ++it) { Zone* tmpzone = (*it)->getZone(); if (tmpzone) { m_endZone = tmpzone; if (tmpzone == m_startZone) { break; } } } } Cell* startCell = m_startCache->getCell(m_from.getLayerCoordinates()); // here we hope to find between targets // first test if target can be reached easy searchBetweenTargetsNeighbor(); // if no betweenTargets could be found we check as second the whole map if (m_betweenTargets.empty()) { searchBetweenTargetsMap(); } // if it is a protected cell it can have a second startzone if (m_betweenTargets.empty() && startCell->isZoneProtected()) { const std::vector& neighbors = startCell->getNeighbors(); for (std::vector::const_iterator it = neighbors.begin(); it != neighbors.end(); ++it) { Zone* tmpzone = (*it)->getZone(); if (tmpzone) { if (tmpzone != m_startZone) { m_startZone = tmpzone; break; } } } searchBetweenTargetsNeighbor(); if (m_betweenTargets.empty()) { searchBetweenTargetsMap(); } } // failed to find between targets, no Path can be created if (m_betweenTargets.empty()) { setSearchStatus(search_status_failed); m_route->setRouteStatus(ROUTE_FAILED); } } MultiLayerSearch::~MultiLayerSearch() { } void MultiLayerSearch::createSearchFrontier(int32_t startInt, CellCache* cache) { // reset all m_sortedFrontier.clear(); m_spt.clear(); m_sf.clear(); m_gCosts.clear(); // fill with defaults m_sortedFrontier.pushElement(PriorityQueue::value_type(startInt, 0.0)); int32_t max_index = cache->getMaxIndex(); m_spt.resize(max_index, -1); m_sf.resize(max_index, -1); m_gCosts.resize(max_index, 0.0); m_next = 0; } void MultiLayerSearch::updateSearch() { if (m_sortedFrontier.empty()) { if (!m_foundLast || m_lastDestCoordInt == m_destCoordInt || getSearchStatus() == search_status_failed) { setSearchStatus(search_status_failed); m_route->setRouteStatus(ROUTE_FAILED); return; } if (m_betweenTargets.empty()) { TransitionInfo* trans = m_currentCache->getCell(m_currentCache->convertIntToCoord(m_lastDestCoordInt))->getTransition(); if (trans) { m_lastStartCoordInt = m_endCache->convertCoordToInt(trans->m_mc); } m_currentCache = m_endCache; m_lastDestCoordInt = m_currentCache->getCell(m_to.getLayerCoordinates())->getCellId(); } else { if (m_lastDestCoordInt != -1) { TransitionInfo* trans = m_currentCache->getCell(m_currentCache->convertIntToCoord(m_lastDestCoordInt))->getTransition(); if (trans) { m_lastStartCoordInt = trans->m_layer->getCellCache()->convertCoordToInt(trans->m_mc); } } m_currentCache = m_betweenTargets.front()->getLayer()->getCellCache(); m_lastDestCoordInt = m_betweenTargets.front()->getCellId(); m_betweenTargets.pop_front(); m_foundLast = false; } createSearchFrontier(m_lastStartCoordInt, m_currentCache); } PriorityQueue::value_type topvalue = m_sortedFrontier.getPriorityElement(); m_sortedFrontier.popElement(); m_next = topvalue.first; m_spt[m_next] = m_sf[m_next]; // found destination if (m_destCoordInt == m_next && m_betweenTargets.empty()) { if (m_endCache == m_currentCache) { setSearchStatus(search_status_complete); m_route->setRouteStatus(ROUTE_SEARCHED); return; } } // found between target if (m_lastDestCoordInt == m_next) { calcPathStep(); m_sortedFrontier.clear(); m_foundLast = true; return; } ModelCoordinate destCoord = m_currentCache->convertIntToCoord(m_lastDestCoordInt); ModelCoordinate nextCoord = m_currentCache->convertIntToCoord(m_next); CellGrid* grid = m_currentCache->getLayer()->getCellGrid(); Cell* nextCell = m_currentCache->getCell(nextCoord); if (!nextCell) { return; } int32_t cellZ = nextCell->getLayerCoordinates().z; int32_t maxZ = m_route->getZStepRange(); bool zLimited = maxZ != -1; uint8_t blockerThreshold = m_ignoreDynamicBlockers ? 2 : 1; bool limitedArea = m_route->isAreaLimited(); const std::vector& adjacents = nextCell->getNeighbors(); if (adjacents.empty()) { return; } for (std::vector::const_iterator i = adjacents.begin(); i != adjacents.end(); ++i) { if (*i == NULL) { continue; } if ((*i)->getLayer()->getCellCache() != m_currentCache) { continue; } int32_t adjacentInt = (*i)->getCellId(); if (m_sf[adjacentInt] != -1 && m_spt[adjacentInt] != -1) { continue; } if (zLimited && ABS(cellZ-(*i)->getLayerCoordinates().z) > maxZ) { continue; } bool blocker = (*i)->getCellType() > blockerThreshold; ModelCoordinate adjacentCoord = (*i)->getLayerCoordinates(); if ((adjacentInt == m_next || blocker) && adjacentInt != m_destCoordInt) { if (blocker && m_multicell) { std::vector::iterator bc_it = std::find(m_ignoredBlockers.begin(), m_ignoredBlockers.end(), *i); if (bc_it == m_ignoredBlockers.end()) { continue; } } else { continue; } } // search if there are blockers which could block multicell object if (m_multicell) { blocker = false; Location currentLoc(nextCell->getLayer()); currentLoc.setLayerCoordinates(nextCell->getLayerCoordinates()); Location adjacentLoc((*i)->getLayer()); adjacentLoc.setLayerCoordinates((*i)->getLayerCoordinates()); int32_t rotation = getAngleBetween(currentLoc, adjacentLoc); std::vector coords = grid->toMultiCoordinates(adjacentLoc.getLayerCoordinates(), m_route->getOccupiedCells(rotation)); std::vector::iterator coord_it = coords.begin(); for (; coord_it != coords.end(); ++coord_it) { Cell* cell = m_currentCache->getCell(*coord_it); if (cell) { if (cell->getCellType() > blockerThreshold) { std::vector::iterator bc_it = std::find(m_ignoredBlockers.begin(), m_ignoredBlockers.end(), cell); if (bc_it == m_ignoredBlockers.end()) { blocker = true; break; } } if (limitedArea) { // check if cell is on one of the areas bool sameAreas = false; const std::list areas = m_route->getLimitedAreas(); std::list::const_iterator area_it = areas.begin(); for (; area_it != areas.end(); ++area_it) { if (m_currentCache->isCellInArea(*area_it, cell)) { sameAreas = true; break; } } if (!sameAreas) { blocker = true; break; } } } else { blocker = true; break; } } if (blocker) { continue; } } else if (limitedArea) { // check if cell is on one of the areas bool sameAreas = false; const std::list areas = m_route->getLimitedAreas(); std::list::const_iterator area_it = areas.begin(); for (; area_it != areas.end(); ++area_it) { if (m_currentCache->isCellInArea(*area_it, *i)) { sameAreas = true; break; } } if (!sameAreas) { continue; } } double gCost = m_gCosts[m_next]; if (m_specialCost) { gCost += m_currentCache->getAdjacentCost(adjacentCoord ,nextCoord, m_route->getCostId()); } else { gCost += m_currentCache->getAdjacentCost(adjacentCoord ,nextCoord); } double hCost = grid->getHeuristicCost(adjacentCoord, destCoord); if (m_sf[adjacentInt] == -1) { m_sortedFrontier.pushElement(PriorityQueue::value_type(adjacentInt, gCost + hCost)); m_gCosts[adjacentInt] = gCost; m_sf[adjacentInt] = m_next; } else if (gCost < m_gCosts[adjacentInt] && m_spt[adjacentInt] == -1) { m_sortedFrontier.changeElementPriority(adjacentInt, gCost + hCost); m_gCosts[adjacentInt] = gCost; m_sf[adjacentInt] = m_next; } } } void MultiLayerSearch::calcPathStep() { int32_t current = m_lastDestCoordInt; int32_t end = m_lastStartCoordInt; Location newnode(m_currentCache->getLayer()); Path path; // This assures that the agent always steps into the center of the target cell. newnode.setLayerCoordinates(m_currentCache->convertIntToCoord(current)); path.push_back(newnode); while(current != end) { if (m_spt[current] < 0 ) { // This is when the size of m_spt can not handle the distance of the location setSearchStatus(search_status_failed); m_route->setRouteStatus(ROUTE_FAILED); break; } current = m_spt[current]; newnode.setLayerCoordinates(m_currentCache->convertIntToCoord(current)); path.push_front(newnode); } // set exact start coordinates if (m_path.empty()) { path.front().setExactLayerCoordinates(m_from.getExactLayerCoordinatesRef()); } m_path.insert(m_path.end(), path.begin(), path.end()); } void MultiLayerSearch::calcPath() { int32_t current = m_lastDestCoordInt; int32_t end = m_lastStartCoordInt; Location newnode(m_currentCache->getLayer()); Path path; // This assures that the agent always steps into the center of the target cell. newnode.setLayerCoordinates( m_currentCache->getCell(m_currentCache->convertIntToCoord(current))->getLayerCoordinates()); path.push_back(newnode); while(current != end) { if (m_spt[current] < 0 ) { // This is when the size of m_spt can not handle the distance of the location setSearchStatus(search_status_failed); m_route->setRouteStatus(ROUTE_FAILED); break; } current = m_spt[current]; newnode.setLayerCoordinates(m_currentCache->convertIntToCoord(current)); path.push_front(newnode); } m_path.insert(m_path.end(), path.begin(), path.end()); m_route->setPath(m_path); } void MultiLayerSearch::searchBetweenTargetsNeighbor() { std::vector cells = m_startCache->getTransitionCells(m_endCache->getLayer()); if (!cells.empty()) { Location loc; Cell* cell = NULL; // find nearest portal (air-line distance) for (std::vector::iterator it = cells.begin(); it != cells.end(); ++it) { if ((*it)->getZone() != m_startZone) { continue; } TransitionInfo* trans = (*it)->getTransition(); Cell* transTarget = trans->m_layer->getCellCache()->getCell(trans->m_mc); if (transTarget->getZone() != m_endZone) { continue; } if (!cell) { loc.setLayer((*it)->getLayer()); loc.setLayerCoordinates((*it)->getLayerCoordinates()); cell = *it; continue; } Location temp((*it)->getLayer()); temp.setLayerCoordinates((*it)->getLayerCoordinates()); Location loc1(cell->getTransition()->m_layer); loc1.setLayerCoordinates(cell->getTransition()->m_mc); Location loc2((*it)->getTransition()->m_layer); loc2.setLayerCoordinates((*it)->getTransition()->m_mc); double temp_distance = temp.getLayerDistanceTo(m_from) + loc2.getLayerDistanceTo(m_to); double current_distance = loc.getLayerDistanceTo(m_from) + loc1.getLayerDistanceTo(m_to); if (current_distance > temp_distance) { loc = temp; cell = *it; } } if (cell) { m_betweenTargets.push_back(cell); } } } void MultiLayerSearch::searchBetweenTargetsMap() { // in case no transition is there then return std::vector endTransCells; std::vector tmpTransCells = m_endCache->getTransitionCells(); std::vector::iterator tcell_it = tmpTransCells.begin(); for (; tcell_it != tmpTransCells.end(); ++tcell_it) { Zone* zone = (*tcell_it)->getZone(); if (zone == m_endZone) { endTransCells.push_back(*tcell_it); } } if (endTransCells.empty()) { return; } // in case no transition is there then return std::vector startTransCells; tmpTransCells = m_startCache->getTransitionCells(); tcell_it = tmpTransCells.begin(); for (; tcell_it != tmpTransCells.end(); ++tcell_it) { Zone* zone = (*tcell_it)->getZone(); if (zone == m_startZone) { startTransCells.push_back(*tcell_it); } } if (startTransCells.empty()) { return; } // fetch zones std::vector zones; const std::list& allLayers = m_from.getLayer()->getMap()->getLayers(); std::list::const_iterator lay_it = allLayers.begin(); for (; lay_it != allLayers.end(); ++lay_it) { CellCache* cache = (*lay_it)->getCellCache(); if (cache) { const std::vector& tmp_zones = cache->getZones(); zones.insert(zones.end(), tmp_zones.begin(), tmp_zones.end()); } } // sort zones by iterator distance std::map zoneDistanceMap; std::map distanceZoneMap; for (std::vector::iterator zit = zones.begin(); zit != zones.end(); ++zit) { // pseudo distance int32_t distance = std::distance(zones.begin(), zit); zoneDistanceMap.insert(std::pair(*zit, distance)); distanceZoneMap.insert(std::pair(distance, *zit)); } // start zone int32_t startZone = zoneDistanceMap.find(m_startZone)->second; // target zone int32_t targetZone = zoneDistanceMap.find(m_endZone)->second; // Priority queue to sort zones PriorityQueue sortedfrontier; // add start zone sortedfrontier.pushElement(PriorityQueue::value_type(startZone, 0.0)); // max size zones int32_t max_index = zones.size(); // shortest tree std::vector spt(max_index, -1); // search frontier std::vector sf(max_index, -1); // costs std::vector costs(max_index, 0.0); bool found = false; while (!found) { if (sortedfrontier.empty()) { break; } PriorityQueue::value_type topvalue = sortedfrontier.getPriorityElement(); sortedfrontier.popElement(); int32_t next = topvalue.first; spt[next] = sf[next]; // found destination zone if (targetZone == next) { found = true; break; } Zone* nextZone = distanceZoneMap.find(next)->second; // look in zone for tranistions std::vector transCells = nextZone->getTransitionCells(); if (transCells.empty()) { continue; } std::vector::iterator cell_it = transCells.begin(); for (; cell_it != transCells.end(); ++cell_it) { // transition info TransitionInfo* trans = (*cell_it)->getTransition(); // target transition cache CellCache* transCache = trans->m_layer->getCellCache(); // target transition cell Cell* transCelle = transCache->getCell(trans->m_mc); // next zone as int int32_t nextInt = zoneDistanceMap.find(transCelle->getZone())->second; if (nextInt == next && nextInt != targetZone) { continue; } // iterator distance as cost double cost = costs[next] + static_cast(ABS(nextInt-startZone)); if (sf[nextInt] == -1) { sortedfrontier.pushElement(PriorityQueue::value_type(nextInt, cost)); costs[nextInt] = cost; sf[nextInt] = next; } else if (cost < costs[nextInt] && spt[nextInt] == -1) { sortedfrontier.changeElementPriority(nextInt, cost); costs[nextInt] = cost; sf[nextInt] = next; } } } // startZone to endZone could be solved if (found) { // fetch sorted zones int32_t current = targetZone; int32_t end = startZone; std::list betweenZones; Zone* tempZone = distanceZoneMap.find(current)->second; betweenZones.push_back(tempZone); while(current != end) { if (spt[current] < 0 ) { return; } current = spt[current]; tempZone = distanceZoneMap.find(current)->second; betweenZones.push_front(tempZone); } // so here we fetch the transistions Location lastLoc = m_from; for (std::list::iterator lit = betweenZones.begin(); lit != betweenZones.end(); ++lit) { ++lit; if (lit == betweenZones.end()) { break; } Zone* nextZone = *lit; --lit; Zone* currentZone = *lit; std::vector tempCells = currentZone->getTransitionCells(); if (tempCells.empty()) { continue; } Cell* transCell = NULL; double nextCost = 0.0; Location newLoc = lastLoc; for (std::vector::iterator cit = tempCells.begin(); cit != tempCells.end(); ++cit) { Cell* nextCell = *cit; TransitionInfo* nextTrans = nextCell->getTransition(); Cell* transTargetCell = nextTrans->m_layer->getCellCache()->getCell(nextTrans->m_mc); // skip wrong transitions if (nextZone != transTargetCell->getZone()) { continue; } // nearest transistion (air-line distance) Location tmpLoc((*cit)->getLayer()); tmpLoc.setLayerCoordinates((*cit)->getLayerCoordinates()); double locCost = lastLoc.getLayerDistanceTo(tmpLoc); if (!transCell || locCost < nextCost) { nextCost = locCost; transCell = *cit; newLoc.setLayer(transTargetCell->getLayer()); newLoc.setLayerCoordinates(transTargetCell->getLayerCoordinates()); } } // found valid transition cell if (transCell) { m_betweenTargets.push_back(transCell); lastLoc = newLoc; } } } } } fifengine-0.4.2/engine/core/pathfinder/routepather/multilayersearch.h000066400000000000000000000107611341615052600260700ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_PATHFINDER_MULTILAYERSEARCH #define FIFE_PATHFINDER_MULTILAYERSEARCH // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/structures/priorityqueue.h" #include "routepathersearch.h" namespace FIFE { class CellCache; class Route; class Zone; /** MultiLayerSearch using A* */ class MultiLayerSearch: public RoutePatherSearch { public: /** Constructor * * @param route A pointer to the route for which a path should be searched. * @param sessionId A integer containing the session id for this search. */ MultiLayerSearch(Route* route, const int32_t sessionId); /** Destructor */ ~MultiLayerSearch(); /** Updates the search. * * Each update checks all neighbors of the last checked coordinate and selects the most favorable. */ void updateSearch(); /** Calculates final path. * * If the search is successful then a path is created. */ void calcPath(); private: /** Creates or resets the SearchFrontier. * * @param startInt The start coordinate as integer identifier. * @param cache A pointer to the start CellCache. */ void createSearchFrontier(int32_t startInt, CellCache* cache); /** Calculates path parts per layer. * */ void calcPathStep(); /** Fetch targets from neighbor layers. * */ void searchBetweenTargetsNeighbor(); /** Fetch targets from map. * */ void searchBetweenTargetsMap(); //! A location object representing where the search started. Location m_to; //! A location object representing where the search ended. Location m_from; //! A pointer to the start CellCache. CellCache* m_startCache; //! A pointer to the end CellCache. CellCache* m_endCache; //! A pointer to the currently used CellCache. CellCache* m_currentCache; // A pointer to the start Zone. Zone* m_startZone; // A pointer to the end Zone. Zone* m_endZone; //! The start coordinate as an int32_t. int32_t m_startCoordInt; //! The last used start coordinate as an int32_t. int32_t m_lastStartCoordInt; //! The destination coordinate as an int32_t. int32_t m_destCoordInt; //! The last used destination coordinate as an int32_t. int32_t m_lastDestCoordInt; //! The next coordinate to check out. int32_t m_next; //! The shortest path tree. std::vector m_spt; //! The search frontier. std::vector m_sf; //! A table to hold the costs. std::vector m_gCosts; //! Priority queue to hold nodes on the sf in order. PriorityQueue m_sortedFrontier; //! List of targets that need to be solved to reach the real target. std::list m_betweenTargets; //! Indicates if last between target could be achieved bool m_foundLast; //! Path to which all steps are added. Path m_path; }; } #endif fifengine-0.4.2/engine/core/pathfinder/routepather/routepather.cpp000066400000000000000000000345641341615052600254170ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "model/metamodel/grids/cellgrid.h" #include "model/structures/instance.h" #include "model/structures/layer.h" #include "model/structures/cellcache.h" #include "util/math/angles.h" #include "pathfinder/route.h" #include "routepather.h" #include "routepathersearch.h" #include "singlelayersearch.h" #include "multilayersearch.h" namespace FIFE { int32_t RoutePather::makeSessionId() { return m_nextFreeSessionId++; } bool RoutePather::locationsEqual(const Location& a, const Location& b) { bool sameLayer = a.getLayer() == b.getLayer(); const ModelCoordinate a_coord = a.getLayerCoordinates(); const ModelCoordinate b_coord = b.getLayerCoordinates(); return (a_coord.x == b_coord.x) && (a_coord.y == b_coord.y) && sameLayer; } void RoutePather::update() { int32_t ticksleft = m_maxTicks; while (ticksleft > 0) { if(m_sessions.empty()) { break; } RoutePatherSearch* prioritySession = m_sessions.getPriorityElement().first; if(!sessionIdValid(prioritySession->getSessionId())) { delete prioritySession; m_sessions.popElement(); continue; } prioritySession->updateSearch(); if (prioritySession->getSearchStatus() == RoutePatherSearch::search_status_complete) { const int32_t sessionId = prioritySession->getSessionId(); prioritySession->calcPath(); Route* route = prioritySession->getRoute(); if (route->getRouteStatus() == ROUTE_SOLVED) { invalidateSessionId(sessionId); delete prioritySession; m_sessions.popElement(); } } else if (prioritySession->getSearchStatus() == RoutePatherSearch::search_status_failed) { const int32_t sessionId = prioritySession->getSessionId(); invalidateSessionId(sessionId); delete prioritySession; m_sessions.popElement(); } --ticksleft; } } bool RoutePather::cancelSession(const int32_t sessionId) { if (sessionId >= 0) { return invalidateSessionId(sessionId); } return false; } void RoutePather::addSessionId(const int32_t sessionId) { m_registeredSessionIds.push_back(sessionId); } bool RoutePather::sessionIdValid(const int32_t sessionId) { for(SessionList::const_iterator i = m_registeredSessionIds.begin(); i != m_registeredSessionIds.end(); ++i) { if((*i) == sessionId) { return true; } } return false; } bool RoutePather::invalidateSessionId(const int32_t sessionId) { for(SessionList::iterator i = m_registeredSessionIds.begin(); i != m_registeredSessionIds.end(); ++i) { if((*i) == sessionId) { m_registeredSessionIds.erase(i); return true; } } return false; } Route* RoutePather::createRoute(const Location& start, const Location& end, bool immediate, const std::string& costId) { Route* route = new Route(start, end); if (costId != "") { route->setCostId(costId); } if (immediate) { if (!solveRoute(route, MEDIUM_PRIORITY, true)) { route->setRouteStatus(ROUTE_FAILED); } return route; } return route; } bool RoutePather::solveRoute(Route* route, int32_t priority, bool immediate) { if (sessionIdValid(route->getSessionId())) { return false; } const Location& start = route->getStartNode(); const Location& end = route->getEndNode(); if (locationsEqual(start, end)) { return false; } CellCache* startCache = start.getLayer()->getCellCache(); CellCache* endCache = end.getLayer()->getCellCache(); if (!startCache || !endCache) { return false; } if (!startCache->isInCellCache(start) || !endCache->isInCellCache(end)) { return false; } Cell* startCell = startCache->getCell(start.getLayerCoordinates()); Cell* endCell = endCache->getCell(end.getLayerCoordinates()); bool multilayer = startCache != endCache; if (!multilayer) { Zone* startZone = startCell->getZone(); Zone* endZone = endCell->getZone(); if (startZone != endZone) { // look for special cases (start is zone border or end is static blocker) if (!endZone || startCell->isZoneProtected()) { bool found = false; const std::vector& neighbors = endCell->getNeighbors(); for (std::vector::const_iterator it = neighbors.begin(); it != neighbors.end(); ++it) { Zone* tmpZone = (*it)->getZone(); if (tmpZone) { endZone = tmpZone; if (tmpZone == startZone) { found = true; break; } } } if (!found && startCell->isZoneProtected()) { const std::vector& neighbors = startCell->getNeighbors(); for (std::vector::const_iterator it = neighbors.begin(); it != neighbors.end(); ++it) { Zone* tmpZone = (*it)->getZone(); if (tmpZone) { if (tmpZone == startZone) { endZone = tmpZone; break; } } } } } // target and all neighbors are static blockers if (!endZone) { return false; } // same CellCache but different zones if (startZone != endZone) { multilayer = true; } } } if (route->isAreaLimited()) { // check if target or neighbors are on one of the areas bool sameAreas = false; const std::list areas = route->getLimitedAreas(); std::list::const_iterator area_it = areas.begin(); for (; area_it != areas.end(); ++area_it) { if (endCache->isCellInArea(*area_it, endCell)) { sameAreas = true; break; } } if (!sameAreas) { const std::vector& neighbors = endCell->getNeighbors(); if (neighbors.empty()) { return false; } area_it = areas.begin(); for (; area_it != areas.end(); ++area_it) { std::vector::const_iterator neigh_it = neighbors.begin(); for (; neigh_it != neighbors.end(); ++neigh_it) { if (endCache->isCellInArea(*area_it, *neigh_it)) { sameAreas = true; break; } } } } if (!sameAreas) { return false; } } int32_t sessionId = route->getSessionId(); if (sessionId == -1) { sessionId = makeSessionId(); route->setSessionId(sessionId); } RoutePatherSearch* newSearch; if (multilayer) { newSearch = new MultiLayerSearch(route, sessionId); } else { newSearch = new SingleLayerSearch(route, sessionId); } if (immediate) { while (newSearch->getSearchStatus() != RoutePatherSearch::search_status_complete) { newSearch->updateSearch(); if (newSearch->getSearchStatus() == RoutePatherSearch::search_status_failed) { route->setRouteStatus(ROUTE_FAILED); break; } } if (newSearch->getSearchStatus() == RoutePatherSearch::search_status_complete) { newSearch->calcPath(); route->setRouteStatus(ROUTE_SOLVED); } delete newSearch; return true; } m_sessions.pushElement(SessionQueue::value_type(newSearch, priority)); addSessionId(sessionId); return true; } bool RoutePather::followRoute(const Location& current, Route* route, double speed, Location& nextLocation) { Path path = route->getPath(); if (path.empty()) { return false; } if (Mathd::Equal(speed, 0.0)) { return true; } bool nextBlocker = false; Location currentNode = route->getCurrentNode(); bool multiCell = route->isMultiCell(); if (!locationsEqual(current, currentNode)) { // special blocker check for multicell if (multiCell) { int32_t oldRotation = route->getRotation(); // old coordinates std::vector oldCoords = current.getLayer()->getCellGrid()-> toMultiCoordinates(current.getLayerCoordinates(), route->getOccupiedCells(route->getRotation())); oldCoords.push_back(current.getLayerCoordinates()); route->setRotation(getAngleBetween(current, currentNode)); // new coordinates std::vector newCoords = currentNode.getLayer()->getCellGrid()-> toMultiCoordinates(currentNode.getLayerCoordinates(), route->getOccupiedCells(route->getRotation())); newCoords.push_back(currentNode.getLayerCoordinates()); std::vector::const_iterator nco_it = newCoords.begin(); for (; nco_it != newCoords.end(); ++nco_it) { if (currentNode.getLayer()->cellContainsBlockingInstance(*nco_it)) { bool found = false; std::vector::const_iterator oco_it = oldCoords.begin(); for (; oco_it != oldCoords.end(); ++oco_it) { if (*oco_it == *nco_it) { found = true; break; } } // if we have a blocker that is not part of the object if (!found) { nextBlocker = true; } } if (nextBlocker) { route->setRotation(oldRotation); break; } } } else { route->setRotation(getAngleBetween(current, currentNode)); if (currentNode.getLayer()->cellContainsBlockingInstance(currentNode.getLayerCoordinates())) { nextBlocker = true; } } } // set facinglocation ExactModelCoordinate instancePos = current.getMapCoordinates(); // if next node is blocker if (nextBlocker) { nextLocation.setLayerCoordinates(FIFE::doublePt2intPt(current.getExactLayerCoordinates())); return false; } // calculate distance CellCache* nodeCache = currentNode.getLayer()->getCellCache(); CellGrid* nodeGrid = currentNode.getLayer()->getCellGrid(); ExactModelCoordinate targetPos = currentNode.getMapCoordinates(); Cell* tmpCell = nodeCache->getCell(currentNode.getLayerCoordinates()); if (tmpCell) { targetPos.z = tmpCell->getLayerCoordinates().z + nodeGrid->getZShift(); } double dx = (targetPos.x - instancePos.x) * nodeGrid->getXScale(); double dy = (targetPos.y - instancePos.y) * nodeGrid->getYScale(); double distance = Mathd::Sqrt(dx * dx + dy * dy); // cell speed multi double multi; if (nodeCache->getCellSpeedMultiplier(current.getLayerCoordinates(), multi)) { speed *= multi; } else { speed *= nodeCache->getDefaultSpeedMultiplier(); } bool pop = false; if (speed > distance) { speed = distance; pop = true; } if (!Mathd::Equal(distance, 0.0) && !pop) { Location prevNode = route->getPreviousNode(); CellCache* prevCache = prevNode.getLayer()->getCellCache(); CellGrid* prevGrid = prevNode.getLayer()->getCellGrid(); ExactModelCoordinate prevPos = route->getPreviousNode().getMapCoordinates(); tmpCell = prevCache->getCell(prevNode.getLayerCoordinates()); if (tmpCell) { prevPos.z = tmpCell->getLayerCoordinates().z + prevGrid->getZShift(); } double cell_dz = (targetPos.z - prevPos.z); if (!Mathd::Equal(cell_dz, 0.0)) { double cell_dx = (targetPos.x - prevPos.x); double cell_dy = (targetPos.y - prevPos.y); double cell_distance = Mathd::Sqrt(cell_dx * cell_dx + cell_dy * cell_dy); if (cell_dz > 0) { if (locationsEqual(current, currentNode)) { instancePos.z = targetPos.z; } else { instancePos.z = prevPos.z + cell_dz - 4*(0.5-distance/cell_distance)*(0.5-distance/cell_distance) * cell_dz; } } else if (cell_dz < 0) { if (locationsEqual(current, currentNode)) { instancePos.z = prevPos.z + 4*(0.5-distance/cell_distance)*(0.5-distance/cell_distance) * cell_dz; } } } instancePos.x += (dx / distance) * speed; instancePos.y += (dy / distance) * speed; } else { pop = true; } // pop to next node if (pop) { nextLocation.setMapCoordinates(targetPos); // if cw is false we have reached the end bool cw = route->walkToNextNode(); // check transistion CellCache* cache = nextLocation.getLayer()->getCellCache(); if (cache) { Cell* cell = cache->getCell(nextLocation.getLayerCoordinates()); if (cell) { TransitionInfo* ti = cell->getTransition(); if (ti) { // "beam" if it is a part of path if (cw && !cell->getLayer()->getCellGrid()->isAccessible(nextLocation.getLayerCoordinates(), route->getCurrentNode().getLayerCoordinates())) { if (ti->m_difflayer) { nextLocation.setLayer(ti->m_layer); } nextLocation.setLayerCoordinates(ti->m_mc); return cw; // immediate "beam" } else if (ti->m_immediate) { if (ti->m_difflayer) { nextLocation.setLayer(ti->m_layer); } nextLocation.setLayerCoordinates(ti->m_mc); route->setEndNode(nextLocation); return false; } } } } if (cw && !multiCell && currentNode.getLayer()->cellContainsBlockingInstance(route->getCurrentNode().getLayerCoordinates())) { //set facing to end blocker Location facing = route->getCurrentNode(); route->setRotation(getAngleBetween(current, facing)); return false; } return cw; } nextLocation.setMapCoordinates(instancePos); return true; } void RoutePather::setMaxTicks(int32_t ticks) { m_maxTicks = ticks; } int32_t RoutePather::getMaxTicks() { return m_maxTicks; } std::string RoutePather::getName() const { return "RoutePather"; } } fifengine-0.4.2/engine/core/pathfinder/routepather/routepather.h000066400000000000000000000153571341615052600250630ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_PATHFINDER_ROUTEPATHER #define FIFE_PATHFINDER_ROUTEPATHER // Standard C++ library includes #include #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "model/metamodel/ipather.h" #include "model/structures/location.h" #include "util/structures/priorityqueue.h" namespace FIFE { class CellCache; class RoutePatherSearch; class Route; class RoutePather : public IPather { public: /** Constructor. * */ RoutePather() : m_nextFreeSessionId(0), m_maxTicks(1000) { } /** Creates a route between the start and end location that needs be solved. * * @param start A const reference to the start location. * @param end A const reference to the target location. * @param immediate A optional boolean, if true the route bypass the max. ticks limit and solves the path immediately, otherwise false. * @param costId A const reference to the string that holds the cost identifier. You can use it optional then this cost id is used instead of the default cost. */ Route* createRoute(const Location& start, const Location& end, bool immediate = false, const std::string& costId = ""); /** Solves the route to create a path. * * @param route A pointer to the route which should be solved. * @param priority The priority to assign to search (high are pushed to the front of the queue). @see PriorityType * @param immediate A optional boolean, if true the route bypass the max. ticks limit and solves the path immediately, otherwise false. * @return A boolean, if true the route could be solved, otherwise false. */ bool solveRoute(Route* route, int32_t priority = MEDIUM_PRIORITY, bool immediate = false); /** Follows the path of the route. * * @param current A const reference to the current location. * @param route A pointer to the route which should be followed. * @param speed A double which holds the speed. * @param nextLocation A reference to the next location returned by the pather. * @return A boolean, if true the route could be followed, otherwise false. */ bool followRoute(const Location& current, Route* route, double speed, Location& nextLocation); /** Updates the route pather. * * Advances the active search by so many time steps. If the search * completes then this function pops it from the active session list and * continues updating the next session until it runs out of time. * @see setMaxTicks() */ void update(); /** Cancels a session. * * Cancels a route pather session. Determines if it is an active session * or not and acts accordingly. * * @param sessionId The id of the session to cancel. * @return True if the session could be canceled false otherwise. */ bool cancelSession(const int32_t sessionId); /** Sets maximal ticks (update steps) to solve routes. @see update() * @param ticks A integer which holds the steps. default is 1000 */ void setMaxTicks(int32_t ticks); /** Returns maximal ticks (update steps) to solve routes. @see update() * @return A integer which holds the steps. default is 1000 */ int32_t getMaxTicks(); /** Returns name of the pathfinder. * @return A string that contains the name of the pathfinder. */ std::string getName() const; private: //! A path is a list with locations. Each location holds the coordinate for one cell. typedef std::list Path; //! Holds the searches and their priority. typedef PriorityQueue SessionQueue; //! Holds the sessions. typedef std::list SessionList; /** Adds a session id to the session map. * * Stores the given session id in the session map. * * @param sessionId The session id to store. */ void addSessionId(const int32_t sessionId); /** Makes a new session id. * * @return The new session id. */ int32_t makeSessionId(); /** Are two locations equivalent from the perspective of pathing (same layer coordinates and layer). * * @param a A const reference to the first location to check. * @param b A const reference to the second location to check. * @return A boolean, true if the locations are equal, false otherwise. */ bool locationsEqual(const Location& a, const Location& b); /** Determines if the given session Id is valid. * * Searches the session list to determine if a search with the given session id * has been registered. * @param sessionId The session id to check. * @return true if one has, false otherwise. */ bool sessionIdValid(const int32_t sessionId); /** Removes a session id from the session map. * * @param sessionId The session id to remove. * @return True if the sessionId could be removed, false otherwise. */ bool invalidateSessionId(const int32_t sessionId); //! A map of currently running sessions (searches). SessionQueue m_sessions; //! A list of session ids that have been registered. SessionList m_registeredSessionIds; //! The next free session id. int32_t m_nextFreeSessionId; //! The maximum number of ticks allowed. int32_t m_maxTicks; }; } #endif fifengine-0.4.2/engine/core/pathfinder/routepather/routepather.i000066400000000000000000000034461341615052600250600ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fife %{ #include "pathfinder/routepather/routepather.h" %} %include "model/metamodel/ipather.i" namespace FIFE { %feature("notabstract") RoutePather; class RoutePather : public IPather { public: RoutePather(); virtual ~RoutePather(); std::string getName() const; }; } fifengine-0.4.2/engine/core/pathfinder/routepather/routepathersearch.cpp000066400000000000000000000061751341615052600266020ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "model/metamodel/grids/cellgrid.h" #include "model/structures/layer.h" #include "model/structures/cellcache.h" #include "model/structures/cell.h" #include "pathfinder/route.h" #include "util/math/fife_math.h" #include "routepathersearch.h" namespace FIFE { RoutePatherSearch::RoutePatherSearch(Route* route, const int32_t sessionId): m_route(route), m_multicell(route->isMultiCell()), m_sessionId(sessionId), m_status(search_status_incomplete) { m_route->setRouteStatus(ROUTE_SEARCHING); m_specialCost = route->getCostId() != ""; m_ignoreDynamicBlockers = route->isDynamicBlockerIgnored(); if (m_multicell) { Location loc = route->getStartNode(); std::vector coords = route->getOccupiedArea(); std::vector::const_iterator co_it = coords.begin(); for (; co_it != coords.end(); ++co_it) { Cell* cell = loc.getLayer()->getCellCache()->getCell(*co_it); if (cell) { m_ignoredBlockers.push_back(cell); } } } } RoutePatherSearch::~RoutePatherSearch() { } int32_t RoutePatherSearch::getSessionId() const { return m_sessionId; } int32_t RoutePatherSearch::getSearchStatus() const { return m_status; } Route* RoutePatherSearch::getRoute() { return m_route; } void RoutePatherSearch::setSearchStatus(const SearchStatus status) { m_status = status; } } fifengine-0.4.2/engine/core/pathfinder/routepather/routepathersearch.h000066400000000000000000000077251341615052600262510ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_PATHFINDER_ROUTEPATHERSEARCH #define FIFE_PATHFINDER_ROUTEPATHERSEARCH // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/structures/priorityqueue.h" namespace FIFE { class CellCache; class Route; /** RoutePatherSearch using A* * */ class RoutePatherSearch { public: /** Constructor * * @param route A pointer to the route for which a path should be searched. * @param sessionId A integer containing the session id for this search. */ RoutePatherSearch(Route* route, const int32_t sessionId); virtual ~RoutePatherSearch(); /** An enumeration of the different status the search can be in. * */ enum SearchStatus { search_status_failed, search_status_complete, search_status_incomplete }; /** Updates the search. * * Each update checks all neighbors of the last checked coordinate and selects the most favorable. */ virtual void updateSearch() = 0; /** Calculates final path. * * If the search is successful then a path is created. */ virtual void calcPath() = 0; /** Retrieves the session id. * * @return The searches session id in the pather. */ int32_t getSessionId() const; /** A small function which returns the current status of the search. * * @return An integer value representing the status, which is enumerated by this class. */ int32_t getSearchStatus() const; /** Returns the associated route for this search. * * @return A pointer to the route. */ Route* getRoute(); protected: /** Sets the current status of the search. * * @param status The status to set. * @see SearchStatus */ void setSearchStatus(const SearchStatus status); //! Pointer to route Route* m_route; //! Indicates if the search should use special costs. bool m_specialCost; //! Indicates if the route is for a multi cell object. bool m_multicell; //! Indicates if dynamic blockers should be ignored. bool m_ignoreDynamicBlockers; //! Blockers from a multi cell object which should be ignored. std::vector m_ignoredBlockers; private: //! An integer containing the session id for this search. int32_t m_sessionId; //! An enumeration of the searches current status. SearchStatus m_status; }; } #endif fifengine-0.4.2/engine/core/pathfinder/routepather/singlelayersearch.cpp000066400000000000000000000201441341615052600265460ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "model/metamodel/grids/cellgrid.h" #include "model/structures/layer.h" #include "model/structures/cellcache.h" #include "model/structures/cell.h" #include "pathfinder/route.h" #include "util/math/fife_math.h" #include "singlelayersearch.h" namespace FIFE { SingleLayerSearch::SingleLayerSearch(Route* route, const int32_t sessionId): RoutePatherSearch(route, sessionId), m_to(route->getEndNode()), m_from(route->getStartNode()), m_cellCache(m_from.getLayer()->getCellCache()), m_startCoordInt(m_cellCache->convertCoordToInt(m_from.getLayerCoordinates())), m_destCoordInt(m_cellCache->convertCoordToInt(m_to.getLayerCoordinates())), m_next(0) { m_sortedfrontier.pushElement(PriorityQueue::value_type(m_startCoordInt, 0.0)); int32_t max_index = m_cellCache->getMaxIndex(); m_spt.resize(max_index, -1); m_sf.resize(max_index, -1); m_gCosts.resize(max_index, 0.0); } SingleLayerSearch::~SingleLayerSearch() { } void SingleLayerSearch::updateSearch() { if(m_sortedfrontier.empty()) { setSearchStatus(search_status_failed); m_route->setRouteStatus(ROUTE_FAILED); return; } PriorityQueue::value_type topvalue = m_sortedfrontier.getPriorityElement(); m_sortedfrontier.popElement(); m_next = topvalue.first; m_spt[m_next] = m_sf[m_next]; // found destination if (m_destCoordInt == m_next) { setSearchStatus(search_status_complete); m_route->setRouteStatus(ROUTE_SEARCHED); return; } ModelCoordinate destCoord = m_to.getLayerCoordinates(); ModelCoordinate nextCoord = m_cellCache->convertIntToCoord(m_next); CellGrid* grid = m_cellCache->getLayer()->getCellGrid(); Cell* nextCell = m_cellCache->getCell(nextCoord); if (!nextCell) { return; } int32_t cellZ = nextCell->getLayerCoordinates().z; int32_t maxZ = m_route->getZStepRange(); bool zLimited = maxZ != -1; uint8_t blockerThreshold = m_ignoreDynamicBlockers ? 2 : 1; bool limitedArea = m_route->isAreaLimited(); const std::vector& adjacents = nextCell->getNeighbors(); for (std::vector::const_iterator i = adjacents.begin(); i != adjacents.end(); ++i) { if (*i == NULL) { continue; } if ((*i)->getLayer()->getCellCache() != m_cellCache) { continue; } int32_t adjacentInt = (*i)->getCellId(); if (m_sf[adjacentInt] != -1 && m_spt[adjacentInt] != -1) { continue; } if (zLimited && ABS(cellZ-(*i)->getLayerCoordinates().z) > maxZ) { continue; } bool blocker = (*i)->getCellType() > blockerThreshold; ModelCoordinate adjacentCoord = (*i)->getLayerCoordinates(); if ((adjacentInt == m_next || blocker) && adjacentInt != m_destCoordInt) { if (!blocker && m_multicell) { continue; } else if (!m_multicell){ continue; } } // search if there are blockers which could block multicell object if (m_multicell) { blocker = false; Location currentLoc(nextCell->getLayer()); currentLoc.setLayerCoordinates(nextCell->getLayerCoordinates()); Location adjacentLoc((*i)->getLayer()); adjacentLoc.setLayerCoordinates((*i)->getLayerCoordinates()); int32_t rotation = getAngleBetween(currentLoc, adjacentLoc); std::vector coords = grid->toMultiCoordinates(adjacentLoc.getLayerCoordinates(), m_route->getOccupiedCells(rotation)); std::vector::iterator coord_it = coords.begin(); for (; coord_it != coords.end(); ++coord_it) { Cell* cell = m_cellCache->getCell(*coord_it); if (cell) { if (cell->getCellType() > blockerThreshold) { std::vector::iterator bc_it = std::find(m_ignoredBlockers.begin(), m_ignoredBlockers.end(), cell); if (bc_it == m_ignoredBlockers.end()) { blocker = true; break; } } if (limitedArea) { // check if cell is on one of the areas bool sameAreas = false; const std::list areas = m_route->getLimitedAreas(); std::list::const_iterator area_it = areas.begin(); for (; area_it != areas.end(); ++area_it) { if (m_cellCache->isCellInArea(*area_it, cell)) { sameAreas = true; break; } } if (!sameAreas) { blocker = true; break; } } } else { blocker = true; break; } } if (blocker) { continue; } } else if (limitedArea) { // check if cell is on one of the areas bool sameAreas = false; const std::list areas = m_route->getLimitedAreas(); std::list::const_iterator area_it = areas.begin(); for (; area_it != areas.end(); ++area_it) { if (m_cellCache->isCellInArea(*area_it, *i)) { sameAreas = true; break; } } if (!sameAreas) { continue; } } double gCost = m_gCosts[m_next]; if (m_specialCost) { gCost += m_cellCache->getAdjacentCost(adjacentCoord ,nextCoord, m_route->getCostId()); } else { gCost += m_cellCache->getAdjacentCost(adjacentCoord ,nextCoord); } double hCost = grid->getHeuristicCost(adjacentCoord, destCoord); if (m_sf[adjacentInt] == -1) { m_sortedfrontier.pushElement(PriorityQueue::value_type(adjacentInt, gCost + hCost)); m_gCosts[adjacentInt] = gCost; m_sf[adjacentInt] = m_next; } else if (gCost < m_gCosts[adjacentInt] && m_spt[adjacentInt] == -1) { m_sortedfrontier.changeElementPriority(adjacentInt, gCost + hCost); m_gCosts[adjacentInt] = gCost; m_sf[adjacentInt] = m_next; } } } void SingleLayerSearch::calcPath() { int32_t current = m_destCoordInt; int32_t end = m_startCoordInt; Path path; Location newnode(m_cellCache->getLayer()); // This assures that the agent always steps into the center of the cell. newnode.setExactLayerCoordinates(FIFE::intPt2doublePt(m_to.getLayerCoordinates())); path.push_back(newnode); while(current != end) { if (m_spt[current] < 0 ) { // This is when the size of m_spt can not handle the distance of the location setSearchStatus(search_status_failed); m_route->setRouteStatus(ROUTE_FAILED); break; } current = m_spt[current]; ModelCoordinate currentCoord = m_cellCache->convertIntToCoord(current); newnode.setLayerCoordinates(currentCoord); path.push_front(newnode); } path.front().setExactLayerCoordinates(m_from.getExactLayerCoordinatesRef()); m_route->setPath(path); } } fifengine-0.4.2/engine/core/pathfinder/routepather/singlelayersearch.h000066400000000000000000000065531341615052600262230ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_PATHFINDER_SINGLELAYERSEARCH #define FIFE_PATHFINDER_SINGLELAYERSEARCH // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/structures/priorityqueue.h" #include "routepathersearch.h" namespace FIFE { class CellCache; class Route; /** SingleLayerSearch using A* */ class SingleLayerSearch: public RoutePatherSearch { public: /** Constructor * * @param route A pointer to the route for which a path should be searched. * @param sessionId A integer containing the session id for this search. */ SingleLayerSearch(Route* route, const int32_t sessionId); /** Destructor */ ~SingleLayerSearch(); /** Updates the search. * * Each update checks all neighbors of the last checked coordinate and selects the most favorable. */ void updateSearch(); /** Calculates final path. * * If the search is successful then a path is created. */ void calcPath(); private: //! A location object representing where the search started. Location m_to; //! A location object representing where the search ended. Location m_from; //! A pointer to the CellCache. CellCache* m_cellCache; //! The start coordinate as an int32_t. int32_t m_startCoordInt; //! The destination coordinate as an int32_t. int32_t m_destCoordInt; //! The next coordinate to check out. int32_t m_next; //! The shortest path tree. std::vector m_spt; //! The search frontier. std::vector m_sf; //! A table to hold the costs. std::vector m_gCosts; //! Priority queue to hold nodes on the sf in order. PriorityQueue m_sortedfrontier; }; } #endif fifengine-0.4.2/engine/core/savers/000077500000000000000000000000001341615052600171525ustar00rootroot00000000000000fifengine-0.4.2/engine/core/savers/native/000077500000000000000000000000001341615052600204405ustar00rootroot00000000000000fifengine-0.4.2/engine/core/savers/native/input/000077500000000000000000000000001341615052600215775ustar00rootroot00000000000000fifengine-0.4.2/engine/core/savers/native/input/controllermappingsaver.cpp000066400000000000000000000042401341615052600271030ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/exception.h" #include "controllermappingsaver.h" namespace FIFE { void ControllerMappingSaver::save(const std::string data, const std::string& filename) { FILE* fp = 0; #if defined(_MSC_VER) && (_MSC_VER >= 1400 ) fp = _fsopen(filename.c_str(), "w", _SH_DENYNO); #else fp = fopen(filename.c_str(), "w"); #endif fputs(data.c_str(), fp); fclose(fp); } } //FIFE fifengine-0.4.2/engine/core/savers/native/input/controllermappingsaver.h000066400000000000000000000041451341615052600265540ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_INPUT_SAVERS_CONTROLLER_MAPPING_H #define FIFE_INPUT_SAVERS_CONTROLLER_MAPPING_H // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder namespace FIFE { /** Gamepad mapping saver. */ class ControllerMappingSaver { public: ControllerMappingSaver() {}; /** Saves mapping to file. */ void save(const std::string data, const std::string& filename); }; } #endif fifengine-0.4.2/engine/core/savers/native/map/000077500000000000000000000000001341615052600212155ustar00rootroot00000000000000fifengine-0.4.2/engine/core/savers/native/map/ianimationsaver.h000066400000000000000000000042401341615052600245570ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_IANIMATION_SAVER_H #define FIFE_IANIMATION_SAVER_H // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/sharedptr.h" namespace FIFE { class IAnimationSaver { public: virtual ~IAnimationSaver() { }; /** responsible for saving the animation */ virtual void save(const std::string& filename) = 0; }; typedef SharedPtr AnimationSaverPtr; } #endif fifengine-0.4.2/engine/core/savers/native/map/ianimationsaver.i000066400000000000000000000032371341615052600245650ustar00rootroot00000000000000/************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fife %{ #include "savers/native/map/ianimationsaver.h" %} namespace FIFE { %feature("director") IAnimationSaver; } %include "savers/native/map/ianimationsaver.h" fifengine-0.4.2/engine/core/savers/native/map/iatlassaver.h000066400000000000000000000041451341615052600237100ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_IATLAS_SAVER_H #define FIFE_IATLAS_SAVER_H // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/sharedptr.h" namespace FIFE { class IAtlasSaver { public: virtual ~IAtlasSaver() { }; /** responsible for saving the atlas */ virtual void save(const std::string& filename) = 0; }; typedef SharedPtr AtlasSaverPtr; } #endif fifengine-0.4.2/engine/core/savers/native/map/iatlassaver.i000066400000000000000000000032231341615052600237050ustar00rootroot00000000000000/************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fife %{ #include "savers/native/map/iatlassaver.h" %} namespace FIFE { %feature("director") IAtlasSaver; } %include "savers/native/map/iatlassaver.h" fifengine-0.4.2/engine/core/savers/native/map/imapsaver.h000066400000000000000000000055121341615052600233600ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_IMAPSAVER_H_ #define FIFE_IMAPSAVER_H_ // Standard C++ library includes #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "iatlassaver.h" #include "iobjectsaver.h" #include "ianimationsaver.h" namespace FIFE { class Map; /** Interface class that all map savers should derive from */ class IMapSaver { public: virtual ~IMapSaver() { }; /** allows setting which object saver will be * used to save object files */ virtual void setObjectSaver(const FIFE::ObjectSaverPtr& objectSaver) = 0; /** allows setting which animation saver will be * used to save animation files */ virtual void setAnimationSaver(const FIFE::AnimationSaverPtr& animationSaver) = 0; /** allows setting which atlas saver will be * used to save atlas files */ virtual void setAtlasSaver(const FIFE::AtlasSaverPtr& atlasSaver) = 0; /** responsible for saving the map resource * used to save map files */ virtual void save(const Map& map, const std::string& filename, const std::vector& importFiles) = 0; }; } #endif fifengine-0.4.2/engine/core/savers/native/map/imapsaver.i000066400000000000000000000032161341615052600233600ustar00rootroot00000000000000/************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fife %{ #include "savers/native/map/imapsaver.h" %} namespace FIFE { %feature("director") IMapSaver; } %include "savers/native/map/imapsaver.h" fifengine-0.4.2/engine/core/savers/native/map/iobjectsaver.h000066400000000000000000000047011341615052600240500ustar00rootroot00000000000000/************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_IOBJECTSAVER_H_ #define FIFE_IOBJECTSAVER_H_ // Standard C++ library includes #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/sharedptr.h" #include "ianimationsaver.h" namespace FIFE { /** Interface class that all object savers should derive from */ class IObjectSaver { public: virtual ~IObjectSaver() { }; /** allows setting which animation saver will be * used to save animation files */ virtual void setAnimationSaver(const AnimationSaverPtr& animationSaver) = 0; /** responsible for saving the object resource */ virtual void save(const std::string& filename) = 0; }; typedef SharedPtr ObjectSaverPtr; } #endif fifengine-0.4.2/engine/core/savers/native/map/iobjectsaver.i000066400000000000000000000033051341615052600240500ustar00rootroot00000000000000/************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fife %{ #include "savers/native/map/iobjectsaver.h" #include "savers/native/map/ianimationsaver.h" %} namespace FIFE { %feature("director") IObjectSaver; } %include "savers/native/map/iobjectsaver.h" fifengine-0.4.2/engine/core/savers/native/map/mapsaver.cpp000066400000000000000000000463741341615052600235550ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // 3rd party library includes #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "model/structures/map.h" #include "model/structures/layer.h" #include "model/structures/instance.h" #include "model/structures/cell.h" #include "model/structures/cellcache.h" #include "model/structures/trigger.h" #include "model/structures/triggercontroller.h" #include "model/metamodel/object.h" #include "model/metamodel/grids/cellgrid.h" #include "util/structures/point.h" #include "util/structures/rect.h" #include "view/visual.h" #include "view/camera.h" #include "mapsaver.h" namespace FIFE { static Logger _log(LM_NATIVE_SAVERS); MapSaver::MapSaver() { //m_objectSaver = new ObjectSaver(); //m_animationSaver = new AnimationSaver(); //m_atlasSaver = new AtlasSaver(); } MapSaver::~MapSaver() { } void MapSaver::setObjectSaver(const FIFE::ObjectSaverPtr& objectSaver) { m_objectSaver = objectSaver; } void MapSaver::setAnimationSaver(const FIFE::AnimationSaverPtr& animationSaver) { m_animationSaver = animationSaver; } void MapSaver::setAtlasSaver(const FIFE::AtlasSaverPtr& atlasSaver) { m_atlasSaver = atlasSaver; } void MapSaver::save(const Map& map, const std::string& filename, const std::vector& importFiles) { TiXmlDocument doc; // add xml declaration TiXmlDeclaration* decl = new TiXmlDeclaration("1.0", "ascii", ""); doc.LinkEndChild(decl); // add map element TiXmlElement* mapElement = new TiXmlElement("map"); mapElement->SetAttribute("id", map.getId()); mapElement->SetAttribute("format", "1.0"); doc.LinkEndChild(mapElement); for (std::vector::const_iterator iter = importFiles.begin(); iter != importFiles.end(); ++iter) { TiXmlElement* importElement = new TiXmlElement("import"); importElement->SetAttribute("file", *iter); // link to map element mapElement->LinkEndChild(importElement); } typedef std::list LayerList; LayerList layers = map.getLayers(); for (LayerList::iterator iter = layers.begin(); iter != layers.end(); ++iter) { TiXmlElement* layerElement = new TiXmlElement("layer"); CellGrid* grid = (*iter)->getCellGrid(); layerElement->SetAttribute("id", (*iter)->getId()); layerElement->SetDoubleAttribute("x_offset", grid->getXShift()); layerElement->SetDoubleAttribute("y_offset", grid->getYShift()); layerElement->SetDoubleAttribute("z_offset", grid->getZShift()); layerElement->SetDoubleAttribute("x_scale", grid->getXScale()); layerElement->SetDoubleAttribute("y_scale", grid->getYScale()); layerElement->SetDoubleAttribute("rotation", grid->getRotation()); layerElement->SetAttribute("grid_type", grid->getType()); layerElement->SetAttribute("transparency", (*iter)->getLayerTransparency()); std::string pathingStrategy; switch ((*iter)->getPathingStrategy()) { case CELL_EDGES_ONLY: { pathingStrategy = "cell_edges_only"; } break; case CELL_EDGES_AND_DIAGONALS: { pathingStrategy = "cell_edges_and_diagonals"; } break; default: { pathingStrategy = "cell_edges_only"; } break; } layerElement->SetAttribute("pathing", pathingStrategy); std::string sortingStrategy; switch ((*iter)->getSortingStrategy()) { case SORTING_CAMERA: { sortingStrategy = "camera"; } break; case SORTING_LOCATION: { sortingStrategy = "location"; } break; case SORTING_CAMERA_AND_LOCATION: { sortingStrategy = "camera_and_location"; } break; default: { sortingStrategy = "camera"; } break; } layerElement->SetAttribute("sorting", sortingStrategy); if ((*iter)->isWalkable()) { layerElement->SetAttribute("layer_type", "walkable"); } else if ((*iter)->isInteract()) { layerElement->SetAttribute("layer_type", "interact"); layerElement->SetAttribute("layer_type_id", (*iter)->getWalkableId()); } // add layer to document mapElement->LinkEndChild(layerElement); // add instances tag to document TiXmlElement* instancesElement = new TiXmlElement("instances"); layerElement->LinkEndChild(instancesElement); std::string currentNamespace = ""; typedef std::vector InstancesContainer; InstancesContainer instances = (*iter)->getInstances(); for (InstancesContainer::iterator iter = instances.begin(); iter != instances.end(); ++iter) { Object* obj = (*iter)->getObject(); // don't save part instances if (obj->isMultiPart()) { continue; } // create instance element TiXmlElement* instanceElement = new TiXmlElement("i"); if (!obj->getNamespace().empty() && currentNamespace != obj->getNamespace()) { instanceElement->SetAttribute("ns", obj->getNamespace()); // update current namespace currentNamespace = obj->getNamespace(); } if (!(*iter)->getId().empty()) { instanceElement->SetAttribute("id", (*iter)->getId()); } instanceElement->SetAttribute("o", obj->getId()); ExactModelCoordinate position = (*iter)->getLocationRef().getExactLayerCoordinates(); instanceElement->SetDoubleAttribute("x", position.x); instanceElement->SetDoubleAttribute("y", position.y); instanceElement->SetDoubleAttribute("z", position.z); instanceElement->SetAttribute("r", (*iter)->getRotation()); if ((*iter)->isBlocking()) { instanceElement->SetAttribute("blocking", (*iter)->isBlocking()); } if ((*iter)->getCellStackPosition() != obj->getCellStackPosition()) { instanceElement->SetAttribute("cellstack", (*iter)->getCellStackPosition()); } if ((*iter)->isSpecialCost()) { if (!obj->isSpecialCost()) { instanceElement->SetAttribute("cost_id", (*iter)->getCostId()); instanceElement->SetDoubleAttribute("cost", (*iter)->getCost()); } else if ((*iter)->getCostId() != obj->getCostId() || !Mathd::Equal((*iter)->getCost(), obj->getCost())) { instanceElement->SetAttribute("cost_id", (*iter)->getCostId()); instanceElement->SetDoubleAttribute("cost", (*iter)->getCost()); } } InstanceVisual* instanceVisual = (*iter)->getVisual(); instanceElement->SetAttribute("stackpos", instanceVisual->getStackPosition()); instancesElement->LinkEndChild(instanceElement); } } // add cellcaches tag to document TiXmlElement* cellcachesElement = new TiXmlElement("cellcaches"); mapElement->LinkEndChild(cellcachesElement); for (LayerList::iterator iter = layers.begin(); iter != layers.end(); ++iter) { CellCache* cache = (*iter)->getCellCache(); if (!cache) { continue; } // add cellcache tag to document TiXmlElement* cellcacheElement = new TiXmlElement("cellcache"); cellcacheElement->SetAttribute("id", (*iter)->getId()); cellcacheElement->SetDoubleAttribute("default_cost", cache->getDefaultCostMultiplier()); cellcacheElement->SetDoubleAttribute("default_speed", cache->getDefaultSpeedMultiplier()); cellcacheElement->SetAttribute("search_narrow", cache->isSearchNarrowCells()); const std::set& narrowCells = cache->getNarrowCells(); bool saveNarrows = !cache->isSearchNarrowCells() && !narrowCells.empty(); const std::vector >& cells = cache->getCells(); std::vector >::const_iterator it = cells.begin(); for (; it != cells.end(); ++it) { std::vector::const_iterator cit = (*it).begin(); for (; cit != (*it).end(); ++cit) { Cell* cell = *cit; std::list costIds = cache->getCosts(); bool costsEmpty = costIds.empty(); bool defaultCost = cell->defaultCost(); bool defaultSpeed = cell->defaultSpeed(); // check if area is part of the cell or object std::vector areaIds = cache->getCellAreas(cell); std::vector cellAreaIds; bool areasEmpty = areaIds.empty(); if (!areasEmpty) { const std::set& cellInstances = cell->getInstances(); if (!cellInstances.empty()) { std::vector::iterator area_it = areaIds.begin(); for (; area_it != areaIds.end(); ++area_it) { bool objectArea = false; std::set::const_iterator instance_it = cellInstances.begin(); for (; instance_it != cellInstances.end(); ++instance_it) { if ((*instance_it)->getObject()->getArea() == *area_it) { objectArea = true; break; } } if (!objectArea) { cellAreaIds.push_back(*area_it); } } } else { cellAreaIds = areaIds; } areasEmpty = cellAreaIds.empty(); } CellTypeInfo cti = cell->getCellType(); bool cellBlocker = (cti != CTYPE_CELL_NO_BLOCKER && cti != CTYPE_CELL_BLOCKER); TransitionInfo* transition = cell->getTransition(); bool isNarrow = false; if (saveNarrows) { std::set::const_iterator narrow_it = narrowCells.find(cell); if (narrow_it != narrowCells.end()) { isNarrow = true; } } if (costsEmpty && defaultCost && defaultSpeed && areasEmpty && cellBlocker && !transition && !isNarrow) { continue; } // add cell tag to document ModelCoordinate cellCoord = cell->getLayerCoordinates(); TiXmlElement* cellElement = new TiXmlElement("cell"); cellElement->SetAttribute("x", cellCoord.x); cellElement->SetAttribute("y", cellCoord.y); if (!defaultCost) { cellElement->SetDoubleAttribute("default_cost", cell->getCostMultiplier()); } if (!defaultSpeed) { cellElement->SetDoubleAttribute("default_speed", cell->getSpeedMultiplier()); } if (!cellBlocker) { if (cti == CTYPE_CELL_NO_BLOCKER) { cellElement->SetAttribute("blocker_type", "no_blocker"); } else { cellElement->SetAttribute("blocker_type", "blocker"); } } if (isNarrow) { cellElement->SetAttribute("narrow", true); } // add cost tag if (!costsEmpty) { std::list::iterator cost_it = costIds.begin(); for (; cost_it != costIds.end(); ++cost_it) { if (cache->existsCostForCell(*cost_it, cell)) { TiXmlElement* costElement = new TiXmlElement("cost"); costElement->SetAttribute("id", *cost_it); costElement->SetDoubleAttribute("value", cache->getCost(*cost_it)); cellElement->LinkEndChild(costElement); } } } // add area tag if (!areasEmpty) { std::vector::iterator area_it = cellAreaIds.begin(); for (; area_it != cellAreaIds.end(); ++area_it) { TiXmlElement* areaElement = new TiXmlElement("area"); areaElement->SetAttribute("id", *area_it); areaElement->LinkEndChild(areaElement); } } // add transition tag if (transition) { TiXmlElement* transitionElement = new TiXmlElement("transition"); transitionElement->SetAttribute("id", transition->m_layer->getId()); transitionElement->SetAttribute("x", transition->m_mc.x); transitionElement->SetAttribute("y", transition->m_mc.y); if (transition->m_mc.z != 0) { transitionElement->SetAttribute("z", transition->m_mc.z); } if (transition->m_immediate) { transitionElement->SetAttribute("immediate", true); } else { transitionElement->SetAttribute("immediate", false); } cellElement->LinkEndChild(transitionElement); } cellcacheElement->LinkEndChild(cellElement); } } cellcachesElement->LinkEndChild(cellcacheElement); } TriggerController* triggerController = map.getTriggerController(); std::vector triggers = triggerController->getAllTriggers(); if (!triggers.empty()) { // add triggers tag to document TiXmlElement* triggersElement = new TiXmlElement("triggers"); mapElement->LinkEndChild(triggersElement); for (std::vector::iterator iter = triggers.begin(); iter != triggers.end(); ++iter) { // add trigger tag to document TiXmlElement* triggerElement = new TiXmlElement("trigger"); triggerElement->SetAttribute("name", (*iter)->getName()); triggerElement->SetAttribute("triggered", (*iter)->isTriggered()); triggerElement->SetAttribute("all_instances", (*iter)->isEnabledForAllInstances()); if ((*iter)->getAttached()) { triggerElement->SetAttribute("attached_instance", (*iter)->getAttached()->getId()); triggerElement->SetAttribute("attached_layer", (*iter)->getAttached()->getLocationRef().getLayer()->getId()); } const std::vector& cells = (*iter)->getAssignedCells(); if (!cells.empty()) { for (std::vector::const_iterator citer = cells.begin(); citer != cells.end(); ++citer) { TiXmlElement* cellElement = new TiXmlElement("assign"); cellElement->SetAttribute("layer_id", (*citer)->getLayer()->getId()); cellElement->SetAttribute("x", (*citer)->getLayerCoordinates().x); cellElement->SetAttribute("y", (*citer)->getLayerCoordinates().y); triggerElement->LinkEndChild(cellElement); } } const std::vector& instances = (*iter)->getEnabledInstances(); if (!instances.empty()) { for (std::vector::const_iterator citer = instances.begin(); citer != instances.end(); ++citer) { TiXmlElement* instanceElement = new TiXmlElement("enabled"); instanceElement->SetAttribute("layer_id", (*citer)->getLocationRef().getLayer()->getId()); instanceElement->SetAttribute("instance_id", (*citer)->getId()); triggerElement->LinkEndChild(instanceElement); } } const std::vector& conditions = (*iter)->getTriggerConditions(); if (!conditions.empty()) { for (std::vector::const_iterator citer = conditions.begin(); citer != conditions.end(); ++citer) { TiXmlElement* conditionElement = new TiXmlElement("condition"); conditionElement->SetAttribute("id", (*citer)); triggerElement->LinkEndChild(conditionElement); } } triggersElement->LinkEndChild(triggerElement); } } typedef std::vector CameraContainer; CameraContainer cameras = map.getCameras(); for (CameraContainer::iterator iter = cameras.begin(); iter != cameras.end(); ++iter) { if ((*iter)->getMap()->getId() == map.getId()) { TiXmlElement* cameraElement = new TiXmlElement("camera"); cameraElement->SetAttribute("id", (*iter)->getId()); cameraElement->SetDoubleAttribute("zoom", (*iter)->getZoom()); cameraElement->SetDoubleAttribute("tilt", (*iter)->getTilt()); cameraElement->SetDoubleAttribute("rotation", (*iter)->getRotation()); if ((*iter)->isZToYEnabled()) { cameraElement->SetDoubleAttribute("ztoy", (*iter)->getZToY()); } Rect viewport = (*iter)->getViewPort(); std::ostringstream viewportString; viewportString << viewport.x << "," << viewport.y << "," << viewport.w << "," << viewport.h; cameraElement->SetAttribute("viewport", viewportString.str()); Point p = (*iter)->getCellImageDimensions(); cameraElement->SetAttribute("ref_cell_width", p.x); cameraElement->SetAttribute("ref_cell_height", p.y); std::vector lightingColor = (*iter)->getLightingColor(); bool writeLightingColor = false; for (uint32_t i=0; i < lightingColor.size(); ++i) { if (lightingColor[i] < 1.0) { writeLightingColor = true; break; } } if (writeLightingColor) { std::ostringstream lightingColorString; for (uint32_t i=0; i < lightingColor.size(); ++i) { if (i > 0) { lightingColorString << ","; } lightingColorString << lightingColor[i]; cameraElement->SetAttribute("light_color", lightingColorString.str()); } } mapElement->LinkEndChild(cameraElement); } } FILE* fp = 0; #if defined(_MSC_VER) && (_MSC_VER >= 1400 ) fp = _fsopen( filename.c_str(), "w", _SH_DENYNO ); #else fp = fopen( filename.c_str(), "w" ); #endif // save the map xml file doc.SaveFile(fp); fclose(fp); } } fifengine-0.4.2/engine/core/savers/native/map/mapsaver.h000066400000000000000000000057771341615052600232240ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_MAPSAVER_H_ #define FIFE_MAPSAVER_H_ // Standard C++ library includes #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "imapsaver.h" namespace FIFE { class Map; /** default map saver class implementing the IMapSaver interface */ class MapSaver : public IMapSaver { public: /** constructor */ MapSaver(); /** destructor */ ~MapSaver(); /** allows setting which object saver will be * used to save object files */ virtual void setObjectSaver(const FIFE::ObjectSaverPtr& objectSaver); /** allows setting which animation saver will be * used to save animation files */ virtual void setAnimationSaver(const FIFE::AnimationSaverPtr& animationSaver); /** allows setting which atlas saver will be * used to save atlas files */ virtual void setAtlasSaver(const FIFE::AtlasSaverPtr& atlasSaver); /** responsible for saving the map resource * used to save map files */ virtual void save(const Map& map, const std::string& filename, const std::vector& importFiles); private: ObjectSaverPtr m_objectSaver; AnimationSaverPtr m_animationSaver; AtlasSaverPtr m_atlasSaver; }; } #endiffifengine-0.4.2/engine/core/savers/native/map/mapsaver.i000066400000000000000000000031261341615052600232070ustar00rootroot00000000000000/************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fife %{ #include "savers/native/map/mapsaver.h" %} %include "savers/native/map/mapsaver.h" fifengine-0.4.2/engine/core/util/000077500000000000000000000000001341615052600166245ustar00rootroot00000000000000fifengine-0.4.2/engine/core/util/base/000077500000000000000000000000001341615052600175365ustar00rootroot00000000000000fifengine-0.4.2/engine/core/util/base/exception.cpp000066400000000000000000000042441341615052600222440ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "exception.h" namespace FIFE { static Logger _log(LM_EXCEPTION); Exception::Exception(const std::string& msg): std::runtime_error(msg), m_what(msg) { } Exception::~Exception() throw() {} const char* Exception::what() const throw() { return m_what.c_str(); } void Exception::update() { m_what = "_[" + getTypeStr() + "]_ , " + getDescription() + " :: " + m_what; } }//FIFE fifengine-0.4.2/engine/core/util/base/exception.h000066400000000000000000000104711341615052600217100ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_EXCEPTION_H #define FIFE_EXCEPTION_H // Standard C++ library includes #include #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/log/logger.h" namespace FIFE { /** Exception base class. * All other exceptions derived from this merely adjust the error string * to be slightly more specific. */ class Exception : public std::runtime_error { public: /** Constructor. * @param msg The error mesage to be stored. */ Exception(const std::string& msg); /** Destructor. */ virtual ~Exception() throw(); /** Returns the error message. * @return The error message. */ virtual const char* what() const throw(); virtual const std::string& getTypeStr() const { static const std::string s = "Exception"; return s; } virtual const std::string& getDescription() const { static const std::string s = "Generic FIFE exception"; return s; } // little helper to change m_what void update(); private: std::string m_what; }; #define FIFE_EXCEPTION_DECL(_name, _description) \ class _name : public Exception { \ public: \ _name(const std::string& msg) : Exception(msg) { Logger _log(LM_EXCEPTION); update(); FL_ERR(_log, what()); } \ const std::string& getTypeStr() const { static const std::string s = #_name; return s; } \ const std::string& getDescription() const { static const std::string s = _description; return s; } \ } FIFE_EXCEPTION_DECL(SDLException, "SDL reported something bad"); FIFE_EXCEPTION_DECL(NotFound, "Something was searched, but not found"); FIFE_EXCEPTION_DECL(NotSet, "Something was not set correctly"); FIFE_EXCEPTION_DECL(IndexOverflow, "Someone tried to access a non-existing element"); FIFE_EXCEPTION_DECL(InvalidFormat, "Found invalid data"); FIFE_EXCEPTION_DECL(CannotOpenFile, "File couldn't be opened"); FIFE_EXCEPTION_DECL(InvalidConversion, "Tried an invalid conversion"); FIFE_EXCEPTION_DECL(NotSupported, "This action was not supported"); FIFE_EXCEPTION_DECL(NameClash, "A name or identifier is already in use"); FIFE_EXCEPTION_DECL(Duplicate, "A duplicate item was added, where this is not allowed"); FIFE_EXCEPTION_DECL(ScriptException, "Error related to scripting functionality"); FIFE_EXCEPTION_DECL(EventException, "Error related to event functionality"); FIFE_EXCEPTION_DECL(GuiException, "Error related to gui functionality"); FIFE_EXCEPTION_DECL(InconsistencyDetected, "An inconsistency in FIFE internals was detected. Please report this is a FIFE Bug."); /** @bug The memory allocation in @c std::string might fail, resulting in terminate. */ FIFE_EXCEPTION_DECL(OutOfMemory, "Buy more ram ;)"); }//FIFE #endif fifengine-0.4.2/engine/core/util/base/fife_stdint.h000066400000000000000000000053141341615052600222100ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_UTIL_FIFE_STDINT_H #define FIFE_UTIL_FIFE_STDINT_H // Standard C++ library includes // Platform specific includes #if defined( WIN32 ) && defined( _MSC_VER ) #ifndef _SDL_H typedef signed __int8 int8_t; typedef unsigned __int8 uint8_t; typedef signed __int16 int16_t; typedef unsigned __int16 uint16_t; typedef signed __int32 int32_t; typedef unsigned __int32 uint32_t; typedef signed __int64 int64_t; typedef unsigned __int64 uint64_t; #endif #else #include #endif // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder // SDL masks for SDL_CreateRGBSurface namespace FIFE { #if SDL_BYTEORDER == SDL_BIG_ENDIAN const uint32_t RMASK = 0xff000000; const uint32_t GMASK = 0x00ff0000; const uint32_t BMASK = 0x0000ff00; const uint32_t AMASK = 0x000000ff; #else const uint32_t RMASK = 0x000000ff; const uint32_t GMASK = 0x0000ff00; const uint32_t BMASK = 0x00ff0000; const uint32_t AMASK = 0xff000000; #endif const uint32_t NULLMASK = 0x00000000; } //FIFE #endif // FIFEINT_H fifengine-0.4.2/engine/core/util/base/fifeclass.cpp000066400000000000000000000035511341615052600222050ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "fifeclass.h" namespace FIFE { fifeid_t FifeClass::m_curid = 0; }//FIFE fifengine-0.4.2/engine/core/util/base/fifeclass.h000066400000000000000000000044141341615052600216510ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_CLASS_H #define FIFE_CLASS_H // Standard C++ library includes #include #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder namespace FIFE { typedef std::size_t fifeid_t; /** Base class for all fife classes * Used e.g. to track instances over swig conversion */ class FifeClass { public: FifeClass(): m_fifeid(m_curid++) { } virtual ~FifeClass() { } /** Gets unique id of this instance inside the engine */ fifeid_t getFifeId() { return m_fifeid; } private: fifeid_t m_fifeid; static fifeid_t m_curid; }; } #endif fifengine-0.4.2/engine/core/util/base/sharedptr.h000066400000000000000000000212521341615052600217050ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_SHARED_PTR_H_ #define FIFE_SHARED_PTR_H_ // Standard C++ library includes #include #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "fife_stdint.h" namespace FIFE { /** shared pointer implementation to provide automatic * reference counting and deletion when last reference * falls out of scope. */ template class SharedPtr { public: /** Constructor * default constructor * creates a null shared pointer */ SharedPtr() : m_ptr(0), m_refCount(0) { } /** Constructor * takes over ownership of the provided pointer * and will delete it automatically when last * reference falls out of scope. */ template explicit SharedPtr(U *ptr) : m_ptr(ptr), m_refCount(ptr ? new uint32_t(1) : 0) { } /** Copy Constructor * provides ability to properly copy a shared resource */ SharedPtr(const SharedPtr& rhs) : m_ptr(rhs.m_ptr), m_refCount(rhs.m_refCount) { // increase reference count incRefCount(); } /** Constructor * shares ownership with the value passed into rhs * the pointer type passed in must be convertible * to this shared pointer type */ template SharedPtr(const SharedPtr& rhs) { m_ptr = rhs.get(); m_refCount = rhs.useCountPtr(); incRefCount(); } /** Destructor * handles deletion of underlying pointer * if the reference count reaches 0 */ ~SharedPtr() { // decrement reference count decRefCount(); // check to see if we need to delete if (m_refCount && *m_refCount == 0) { // delete and set pointers to null delete m_ptr; delete m_refCount; m_ptr = 0; m_refCount = 0; } } /** provides functionality for the equality operator */ SharedPtr& operator=(const SharedPtr& rhs) { // handle self assignment if (rhs.get() == m_ptr) { return *this; } // store in temporary (which causes a ref count increase) // and swap with this object SharedPtr temp(rhs); swap(temp); return *this; } /** provides functionality for the equality operator * the passed in pointer type must be convertible to * this pointer type */ template SharedPtr& operator=(const SharedPtr& rhs) { // handle self assignment if (rhs.get() == m_ptr) { return *this; } // store in temporary (which causes a ref count increase) // and swap with this object SharedPtr temp(rhs); swap(temp); return *this; } /** allows dereferencing of shared pointer to act * identical to dereferencing the underlying pointer */ inline T& operator*() const { assert(m_ptr); return *m_ptr; } /** allows dereferencing of shared pointer to act * identical to dereferencing the underlying pointer */ inline T* operator->() const { assert(m_ptr); return m_ptr; } /** allows direct access to underlying pointer */ inline T* get() const { return m_ptr; } /** reset this pointer to a null shared pointer * this can be used to lower the reference count * of the shared resource or set the underlying pointer * to different pointer. */ inline void reset(T* ptr = 0) { assert(ptr == 0 || ptr != m_ptr); SharedPtr(ptr).swap(*this); } /** returns the current reference count * this should only be called on a non-null * shared pointer */ inline uint32_t useCount() const { assert(m_refCount); if (!m_refCount) { return 0; } return *m_refCount; } /** returns the current reference count * provides direct access to the user count pointer * this should really only be used internally */ inline uint32_t* useCountPtr() const { return m_refCount; } /** provides the ability to see if * a shared resource is currently only * held by a single shared pointer * this should only be called on a non-null * shared pointer */ inline bool unique() const { assert(m_refCount); return (*m_refCount == 1); } /** provides the ability to convert a * shared pointer to a bool, this is * a convenience for checking validity * of a shared pointer in a conditional */ operator bool() const { return (m_ptr != 0); } /** negation operator overload */ bool operator!() const { return (m_ptr == 0); } private: /** provides swapping function between * two shared pointers, used internally */ inline void swap(SharedPtr& rhs) { std::swap(m_ptr, rhs.m_ptr); std::swap(m_refCount, rhs.m_refCount); } /** increases the reference count for * this shared resource, used internally */ inline void incRefCount() { if (m_refCount) { ++(*m_refCount); } } /** decreases the reference count for * this shared resource, used internally */ inline void decRefCount() { if (m_refCount) { --(*m_refCount); } } private: T* m_ptr; uint32_t* m_refCount; }; /** provides equality operator for shared pointers */ template inline bool operator==(const SharedPtr& lhs, const SharedPtr& rhs) { return (lhs.get() == rhs.get()); } /** provides inequality operator for shared pointers */ template inline bool operator!=(const SharedPtr& lhs, const SharedPtr& rhs) { return (lhs.get() != rhs.get()); } /** provides less than operator for shared pointers */ template inline bool operator<(SharedPtr const& lhs, SharedPtr const& rhs) { return std::less()(lhs.get(), rhs.get()); } /** convenience function for making a shared pointer * can be used anytime a shared pointer should be created */ template SharedPtr make_shared(T* ptr) { return SharedPtr(ptr); } } //FIFE #endif //FIFE_SHARED_PTR_H_ fifengine-0.4.2/engine/core/util/base/singleton.h000066400000000000000000000067051341615052600217210ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_SINGLETON_H #define FIFE_SINGLETON_H #define SINGLEFRIEND(classname) friend class FIFE::StaticSingleton; classname(); virtual ~classname(); // Standard C++ library includes #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "fifeclass.h" namespace FIFE { /** The "classic" Singleton. * * @see DynamicSingleton */ template class StaticSingleton { public: static T* instance() { static T inst; return &inst; } protected: StaticSingleton() { } virtual ~StaticSingleton() { } private: StaticSingleton(const StaticSingleton&) {} StaticSingleton& operator=(const StaticSingleton&) { return this; } }; /** Another Singleton. * * This implementations needs to be created and destroyed explicitly. * That way the order of construction and destruction is well defined, so we don't * get those nasty static initialization/destruction order problems. * * Engine will create all standard FIFE Singletons when created (just call Engine::instance()) * and destroy them on exit. * * Maybe we'll change this one day to use one of those funny NiftyCounter implementations. * * @see StaticSingleton * @see Engine */ template class DynamicSingleton { public: static T* instance() { assert(m_instance); return m_instance; } DynamicSingleton() { assert(!m_instance); m_instance = static_cast(this); } virtual ~DynamicSingleton() { m_instance = 0; } private: static T* m_instance; DynamicSingleton(const DynamicSingleton&) {}; DynamicSingleton operator=(const DynamicSingleton&) {}; }; template T* DynamicSingleton::m_instance = 0; }//FIFE #endif fifengine-0.4.2/engine/core/util/base/stringutils.cpp000066400000000000000000000056361341615052600226430ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "stringutils.h" namespace FIFE { int32_t makeInt32(const std::string& str) { int32_t ret; sscanf(str.c_str(), "%d", &ret); return ret; } IntVector tokenize(const std::string& str, char delim, char group) { IntVector tokens; if(str.empty()) { return tokens; } int curr = 0; int start = 0; start = curr = static_cast(str.find_first_not_of(delim)); while(str[curr]) { if(str[curr] == group) { curr = static_cast(str.find_first_of(group, curr+1)); if((size_t)curr == std::string::npos) { return IntVector(); } std::string token = str.substr(start+1, curr-start-1); tokens.push_back(makeInt32(token)); start = curr + 1; } else if(str[curr] == delim) { if(str[curr-1] != delim && str[curr-1] != group) { std::string token = str.substr(start, curr-start); tokens.push_back(makeInt32(token)); } start = curr + 1; } ++curr; } if(tokens.size() == 0) { tokens.push_back(makeInt32(str)); return tokens; } if(str[curr-1] != delim && str[curr-1] != group) { std::string token = str.substr(start, curr - 1); tokens.push_back(makeInt32(token)); } return tokens; } } fifengine-0.4.2/engine/core/util/base/stringutils.h000066400000000000000000000035131341615052600223000ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_STRINGUTILS_H_ #define FIFE_STRINGUTILS_H_ // Standard C++ library includes #include #include #include "util/base/fife_stdint.h" namespace FIFE { typedef std::vector IntVector; int makeInt32(const std::string& str); IntVector tokenize(const std::string& str, char delim, char group = 0); } #endif fifengine-0.4.2/engine/core/util/base/utilbase.i000066400000000000000000000042611341615052600215230ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fife %{ #include "util/base/fifeclass.h" %} %include "util/base/exception.h" %include "util/resource/resource.i" namespace FIFE { typedef std::size_t fifeid_t; class FifeClass{ public: virtual ~FifeClass(); fifeid_t getFifeId(); }; %extend FifeClass { bool __eq__(const PyObject *other) { return false; } bool __ne__(const PyObject *other) { return true; } bool __eq__(FifeClass *other) { if (!other) return false; return $self->getFifeId() == other->getFifeId(); } bool __ne__(FifeClass *other) { if (!other) return true; return $self->getFifeId() != other->getFifeId(); } fifeid_t __hash__() { return $self->getFifeId(); } } } fifengine-0.4.2/engine/core/util/log/000077500000000000000000000000001341615052600174055ustar00rootroot00000000000000fifengine-0.4.2/engine/core/util/log/logger.cpp000066400000000000000000000137211341615052600213740ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes #include #include #include // 3rd party library includes #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "modules.h" #include "logger.h" #include "util/base/exception.h" // define the module info relationships structure here, begin struct ModuleInfo { logmodule_t module; logmodule_t parent; std::string name; }; MODULE_INFO_RELATIONSHIPS // end namespace FIFE { LogManager* LogManager::m_instance = NULL; Logger::Logger(logmodule_t module): m_module(module) { } Logger::~Logger() { } void Logger::log(LogManager::LogLevel level, const std::string& msg) { LogManager::instance()->log(level, m_module, msg); } void Logger::log(LogManager::LogLevel level, const LMsg& msg) { LogManager::instance()->log(level, m_module, msg.str); } LogManager* LogManager::instance() { if (!m_instance) { m_instance = new LogManager(); } return m_instance; } LogManager::~LogManager() { delete m_instance; } void LogManager::log(LogLevel level, logmodule_t module, const std::string& msg) { if (level < m_level) { return; } if (!isVisible(module)) { return; } std::string lvlstr = ""; switch (level) { case LEVEL_DEBUG: lvlstr = "DEBUG"; break; case LEVEL_LOG: lvlstr = "LOG"; break; case LEVEL_WARN: lvlstr = "WARN"; break; case LEVEL_ERROR: lvlstr = "ERROR"; break; case LEVEL_PANIC: lvlstr = "PANIC"; break; default: lvlstr = "ERROR"; break; } if (m_logtoprompt) { std::cout << moduleInfos[module].name << ":" << lvlstr << ":" << msg << std::endl; } if (m_logtofile) { *m_logfile << moduleInfos[module].name << ":" << lvlstr << ":" << msg << std::endl; } if (level == LEVEL_PANIC) { abort(); } } void LogManager::setLevelFilter(LogLevel level) { m_level = level; } LogManager::LogLevel LogManager::getLevelFilter() { return m_level; } void LogManager::addVisibleModule(logmodule_t module) { validateModule(module); int32_t ind = static_cast(module); m_modules[ind] = true; if (moduleInfos[ind].parent != LM_CORE) { addVisibleModule(moduleInfos[ind].parent); } } void LogManager::removeVisibleModule(logmodule_t module) { validateModule(module); m_modules[module] = false; } void LogManager::clearVisibleModules() { for (int32_t i = 0; i < LM_MODULE_MAX; i++) { m_modules[i] = false; } } void LogManager::setLogToPrompt(bool logtoprompt) { m_logtoprompt = logtoprompt; } bool LogManager::isLogToPrompt() { return m_logtoprompt; } void LogManager::setLogToFile(bool logtofile) { if(logtofile){ m_logfile = new std::ofstream("fife.log"); } else { if (m_logfile){ delete m_logfile; } } m_logtofile = logtofile; } bool LogManager::isLogToFile() { return m_logtofile; } bool LogManager::isVisible(logmodule_t module) { if (!m_modules[module]) { return false; } if (moduleInfos[module].parent != LM_CORE) { return isVisible(moduleInfos[module].parent); } return true; } LogManager::LogManager(): m_level(LEVEL_DEBUG), module_check_stack(), m_logtofile(false), m_logtoprompt(false) { validateModuleDescription(LM_CORE); m_logfile = 0; clearVisibleModules(); } void LogManager::validateModule(logmodule_t m) { if ((m <= LM_CORE) || (m >= LM_MODULE_MAX)) { std::cout << "Invalid module received in LogManager: " << m << ", aborting\n"; abort(); } } void LogManager::validateModuleDescription(logmodule_t module) { if (module == LM_CORE) { for (int32_t m = static_cast(LM_CORE)+1; m < static_cast(LM_MODULE_MAX); m++) { if (moduleInfos[m].module != static_cast(m)) { std::ostringstream stream; stream << m; std::string msg = "Log module definition ids do not match in index "; msg += stream.str(); std::cout << msg << std::endl; throw InvalidFormat(msg); } module_check_stack.clear(); validateModuleDescription(static_cast(m)); } } else { module_check_stack.push_back(module); if (count(module_check_stack.begin(), module_check_stack.end(), module) > 1) { throw InvalidFormat("Log module definition hierarchy contains cycles"); } } } std::string LogManager::getModuleName(logmodule_t module) { return moduleInfos[module].name; } } fifengine-0.4.2/engine/core/util/log/logger.h000066400000000000000000000210761341615052600210430ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_LOGGER_H #define FIFE_LOGGER_H // Standard C++ library includes #include #include #include #include #include #include #include #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/fife_stdint.h" #include "modules.h" #ifdef LOG_ENABLED /** Logs given message with log level "debug" using given logger instance */ #define FL_DBG(logger, msg) do { if (FIFE::LogManager::instance()->isVisible(logger.getModule())) logger.log(FIFE::LogManager::LEVEL_DEBUG, msg); } while(0) /** Logs given message with log level "log" using given logger instance */ #define FL_LOG(logger, msg) do { if (FIFE::LogManager::instance()->isVisible(logger.getModule())) logger.log(FIFE::LogManager::LEVEL_LOG, msg); } while(0) /** Logs given message with log level "warning" using given logger instance */ #define FL_WARN(logger, msg) do { if (FIFE::LogManager::instance()->isVisible(logger.getModule())) logger.log(FIFE::LogManager::LEVEL_WARN, msg); } while(0) /** Logs given message with log level "error" using given logger instance */ #define FL_ERR(logger, msg) do { if (FIFE::LogManager::instance()->isVisible(logger.getModule())) logger.log(FIFE::LogManager::LEVEL_ERROR, msg); } while(0) /** Logs given message with log level "pacic" using given logger instance. * Causes also program to abort */ #define FL_PANIC(logger, msg) do { if (FIFE::LogManager::instance()->isVisible(logger.getModule())) logger.log(FIFE::LogManager::LEVEL_PANIC, msg); } while(0) #else // empty definitions in case logs are turned off for speed #define FL_DBG(logger, msg) #define FL_LOG(logger, msg) #define FL_WARN(logger, msg) #define FL_ERR(logger, msg) #define FL_PANIC(logger, msg) #endif namespace FIFE { /** Helper class to create log strings out from separate parts * Usage: LMsg("some text") << variable << ", " << other variable */ class LMsg { public: LMsg(const std::string& msg=""): str(msg) {} ~LMsg() {} template LMsg& operator<<(const T& t) { std::ostringstream stream; stream << t; str += stream.str(); return *this; } std::string str; }; /** Logmanager takes care of log filtering and output direction */ class LogManager { public: /** Loglevel is used to set a treshold for output messages + related filter * E.g. in case log message has LEVEL_WARN, but the filter treshold is LEVEL_ERROR, * log message is not outputted */ enum LogLevel { LEVEL_DEBUG = 0, LEVEL_LOG = 1, LEVEL_WARN = 2, LEVEL_ERROR = 3, LEVEL_PANIC = 4 }; /** Returns instance to log manager. Log manager is a singleton class */ static LogManager* instance(); /** Destructor */ ~LogManager(); /** Logs given message * @param level level of this log (e.g. warning) * @param module module where this log message is coming from. Modules are defined in modules.h-file * @param msg message to log * @note do not use this method directly, instead use FL_WARN (or any other FL_XXX) macro */ void log(LogLevel level, logmodule_t module, const std::string& msg); /** Sets currently used level filter. * For usage, @see LogManager::LogLevel */ void setLevelFilter(LogLevel level); /** Gets currently used level filter. * @see LogManager::LogLevel */ LogLevel getLevelFilter(); /** Adds visible module into logmanager * Module corresponds some module in the engine. Modules may contain other modules. * Modules and their structure is defined in file modules.h. * In case module is not visible, LogManager filters corresponding log messages * from output. In case some lower-level module is set visible, it also sets * all upper level modules visible * @param module module to set visible */ void addVisibleModule(logmodule_t module); /** Removes visible module, @see addVisibleModule */ void removeVisibleModule(logmodule_t module); /** Removes all visible modules, @see addVisibleModule */ void clearVisibleModules(); /** Tells if given module is visible */ bool isVisible(logmodule_t module); /** Sets LogManager to log to prompt */ void setLogToPrompt(bool logtoprompt); /** Returns if LogManager is set to log to prompt */ bool isLogToPrompt(); /** Sets LogManager to log to a file */ void setLogToFile(bool logtofile); /** Returns if LogManager is set to log to a file */ bool isLogToFile(); /** Gets display name for given module id * E.g. LM_AUDIO -> "Audio" */ std::string getModuleName(logmodule_t module); private: void validateModule(logmodule_t m); // hidden constructor for singleton LogManager(); // validates if definitions in module.h are valid void validateModuleDescription(logmodule_t module); // singleton instance static LogManager* m_instance; // current filter level LogLevel m_level; // visibility array for modules bool m_modules[LM_MODULE_MAX]; // used during module description validation to check cycles in hierarchy std::vector module_check_stack; bool m_logtofile; bool m_logtoprompt; std::ofstream* m_logfile; }; /** Create a Logger instance to communicate with LogManager * Logger stores information about the current module thus reducing * the typing needed for individual traces * Common way of doing things is to instantiate a static Logger on * top of .cpp file and then use that in .cpp-file's methods */ class Logger { public: /** Creates new logger and associates it with given module */ Logger(logmodule_t module); /** Destructor */ ~Logger(); /** logs given message with given log level */ void log(LogManager::LogLevel level, const std::string& msg); /** logs given message with given log level. * Message is wrapped into LMsg instance for easy formatting */ void log(LogManager::LogLevel level, const LMsg& msg); /** gets module where this logger is associated to */ inline logmodule_t getModule() const { return m_module; } private: logmodule_t m_module; }; /** Helper for printing a pointer * * This is a helper structure that allows printing any kind of pointer * on (hopefully) any platform in hex, kind of like the %p format * string of printf. * * The mechanism is used by calling something like: * somestream << pprint(ptr); **/ struct pprint { void* p; pprint( void* _p ) : p(_p) {} }; } namespace std { /** Print a pprint object to an ostream. * * This is pure Stroustrup, overloading the ostream operator<< to print * a formatted pointer from a pprint object to an ostream. * * \param s output stream * \param p pointer to print * \return reference to the modified stream * */ template basic_ostream& operator<<( basic_ostream& s, const FIFE::pprint& p ) { s << "0x" << hex << setw( 2*sizeof(void*) ) << setfill('0') << reinterpret_cast( p.p ); return s; } } #endif fifengine-0.4.2/engine/core/util/log/logger.i000066400000000000000000000047231341615052600210440ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fife %{ #include "util/log/logger.h" %} %include "modules.h" namespace std { %template(moduleVector) std::vector; }; namespace FIFE { class LogManager { public: enum LogLevel { LEVEL_DEBUG = 0, LEVEL_LOG = 1, LEVEL_WARN = 2, LEVEL_ERROR = 3 }; ~LogManager(); void log(LogLevel level, logmodule_t module, const std::string& msg); void setLevelFilter(LogLevel level); LogLevel getLevelFilter(); void addVisibleModule(logmodule_t module); void removeVisibleModule(logmodule_t module); void clearVisibleModules(); bool isVisible(logmodule_t module); void setLogToPrompt(bool logtoprompt); bool isLogToPrompt(); void setLogToFile(bool logtofile); bool isLogToFile(); std::string getModuleName(logmodule_t module); private: LogManager(); }; class Logger { public: Logger(logmodule_t module); ~Logger(); void log(LogManager::LogLevel level, const std::string& msg); }; } fifengine-0.4.2/engine/core/util/math/000077500000000000000000000000001341615052600175555ustar00rootroot00000000000000fifengine-0.4.2/engine/core/util/math/angles.cpp000066400000000000000000000120631341615052600215340ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "model/metamodel/grids/cellgrid.h" #include "model/structures/layer.h" #include "angles.h" namespace FIFE { int32_t getIndexByAngle(int32_t angle, const type_angle2id& angle2id, int32_t& closestMatchingAngle) { if (angle2id.empty()) { return -1; } if (angle2id.size() == 1) { closestMatchingAngle = angle2id.begin()->first; return angle2id.begin()->second; } int32_t wangle = (360 + angle) % 360; type_angle2id::const_iterator u(angle2id.upper_bound(wangle)); type_angle2id::const_iterator tmp; // take care of the forward wrapping case if (u == angle2id.end()) { int32_t ud = wangle - (--u)->first; int32_t ld = 360 - wangle + angle2id.begin()->first; if (ud > ld) { // wrapped value (first) closestMatchingAngle = angle2id.begin()->first; return angle2id.begin()->second; } // non-wrapped value closestMatchingAngle = u->first; return u->second; } // take care of the backward wrapping case if (u == angle2id.begin()) { tmp = angle2id.end(); tmp--; int32_t ld = u->first - wangle; int32_t ud = 360 - tmp->first + wangle; if (ud > ld) { // non-wrapped value (first) closestMatchingAngle = angle2id.begin()->first; return angle2id.begin()->second; } // wrapped value (last) closestMatchingAngle = tmp->first; return tmp->second; } // value in the middle... int32_t ud = u->first - wangle; int32_t ucm = u->first; int32_t ui = u->second; u--; int32_t ld = wangle - u->first; int32_t lcm = u->first; int32_t li = u->second; // if ud and ls is equal then lcm is prefered (next angle) if (ud < ld) { closestMatchingAngle = ucm; return ui; } closestMatchingAngle = lcm; return li; } int32_t getAngleBetween(const Location& loc1, const Location& loc2) { ExactModelCoordinate c1 = loc1.getMapCoordinates(); ExactModelCoordinate c2 = loc2.getMapCoordinates(); double dy = (c2.y - c1.y); double dx = (c2.x - c1.x); // add grid rotation to angle, to guarantee uniform angles (not grid based) int32_t angle = round(Mathd::ATan2(-dy,dx)*(180.0/Mathd::pi()) + loc1.getLayer()->getCellGrid()->getRotation()); if (angle < 0) { angle += 360; } angle %= 360; return angle; } Location getFacing(const Location& loc, const int32_t angle) { Location facing(loc); ExactModelCoordinate emc = facing.getMapCoordinates(); // remove grid rotation from angle, to guarantee uniform angles (not grid based) double tmpAngle = static_cast(angle) - loc.getLayer()->getCellGrid()->getRotation(); emc.x += Mathd::Cos(tmpAngle * (Mathd::pi()/180.0)); emc.y -= Mathd::Sin(tmpAngle * (Mathd::pi()/180.0)); facing.setMapCoordinates(emc); return facing; } int32_t getAngleBetween(const ExactModelCoordinate& emc1, const ExactModelCoordinate& emc2) { double dy = (emc2.y - emc1.y); double dx = (emc2.x - emc1.x); int32_t angle = round(Mathd::ATan2(-dy,dx)*(180.0/Mathd::pi())); if (angle < 0) { angle += 360; } angle %= 360; return angle; } ExactModelCoordinate getFacing(const ExactModelCoordinate& emc, const int32_t angle) { ExactModelCoordinate result = emc; result.x += Mathd::Cos(static_cast(angle) * (Mathd::pi()/180.0)); result.y -= Mathd::Sin(static_cast(angle) * (Mathd::pi()/180.0)); return result; } } fifengine-0.4.2/engine/core/util/math/angles.h000066400000000000000000000061111341615052600211760ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_ANGLES_H #define FIFE_ANGLES_H // Standard C++ library includes #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "model/structures/location.h" namespace FIFE { typedef std::map type_angle2id; /** Returns id for given angle from angle2id map * in case there are no elements in the map, negative value is returned */ int32_t getIndexByAngle(int32_t angle, const type_angle2id& angle2id, int32_t& closestMatchingAngle); /** Gets angle of vector defined by given locations * @return angle in polar coordinates between the line * defined by the two locations and the horizontal axis (East <-> West) */ int32_t getAngleBetween(const Location& loc1, const Location& loc2); /** Gets facing location defined by given angle and location * @return facing location */ Location getFacing(const Location& loc, const int32_t angle); /** Gets angle of vector defined by given map coordinates * @return angle in polar coordinates between the line * defined by the two map coordinates and the horizontal axis (East <-> West) */ int32_t getAngleBetween(const ExactModelCoordinate& emc1, const ExactModelCoordinate& emc2); /** Gets facing map coordinate defined by given angle and map coordinate * @return facing map coordinate */ ExactModelCoordinate getFacing(const ExactModelCoordinate& emc, const int32_t angle); } #endif fifengine-0.4.2/engine/core/util/math/fife_math.h000066400000000000000000000235011341615052600216510ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_UTIL_FIFE_MATH_H #define FIFE_UTIL_FIFE_MATH_H // Standard C++ library includes #include #include #include #include // Platform specific includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #ifndef ABS #define ABS(x) ((x)<0?-(x):(x)) #endif // Sort out the missing round function in MSVC: #if defined( WIN32 ) && defined( _MSC_VER ) inline double round(const double x) { return x < 0.0 ? ceil(x - 0.5) : floor(x + 0.5); } #endif namespace FIFE { static const float FLT_STD_EPSILON = std::numeric_limits::epsilon(); static const float FLT_STD_MAX = (std::numeric_limits::max)(); static const float FLT_ZERO_TOLERANCE = 1e-06f; static const float FLT_PI = 4.0f*std::atan(1.0f); static const float FLT_TWO_PI = 2.0f*FLT_PI; static const float FLT_HALF_PI = 0.5f*FLT_PI; static const float FLT_INVERSE_PI = 1.0f/FLT_PI; static const float FLT_INVERSE_TWO_PI = 1.0f/FLT_TWO_PI; static const float FLT_DEG_TO_RAD = FLT_PI/180.0f; static const float FLT_RAD_TO_DEG = 180.0f/FLT_PI; static const float FLT_LOG_2 = std::log(2.0f); static const float FLT_LOG_10 = std::log(10.0f); static const float FLT_INV_LOG_2 = 1.0f/std::log(2.0f); static const float FLT_INV_LOG_10 = 1.0f/std::log(10.0f); static const double DBL_STD_EPSILON = std::numeric_limits::epsilon(); static const double DBL_STD_MAX = (std::numeric_limits::max)(); static const double DBL_ZERO_TOLERANCE = 1e-08; static const double DBL_PI = 4.0*std::atan(1.0); static const double DBL_TWO_PI = 2.0*DBL_PI; static const double DBL_HALF_PI = 0.5*DBL_PI; static const double DBL_INVERSE_PI = 1.0/DBL_PI; static const double DBL_INVERSE_TWO_PI = 1.0/DBL_TWO_PI; static const double DBL_DEG_TO_RAD = DBL_PI/180.0; static const double DBL_RAD_TO_DEG = 180.0f/DBL_PI; static const double DBL_LOG_2 = std::log(2.0); static const double DBL_LOG_10 = std::log(10.0); static const double DBL_INV_LOG_2 = 1.0/std::log(2.0); static const double DBL_INV_LOG_10 = 1.0/std::log(10.0); template struct float_traits { }; template <> struct float_traits { typedef float float_type; static inline float_type epsilon() { return FLT_STD_EPSILON; } static inline float_type zeroTolerance() { return FLT_ZERO_TOLERANCE; } static inline float_type max() { return FLT_STD_MAX; } static inline float_type pi() { return FLT_PI; } static inline float_type twoPi() { return FLT_TWO_PI; } static inline float_type halfPi() { return FLT_HALF_PI; } static inline float_type inversePi() { return FLT_INVERSE_PI; } static inline float_type inverseTwoPi() { return FLT_INVERSE_TWO_PI; } static inline float_type degToRad() { return FLT_DEG_TO_RAD; } static inline float_type radToDeg() { return FLT_RAD_TO_DEG; } static inline float_type log2() { return FLT_LOG_2; } static inline float_type log10() { return FLT_LOG_10; } static inline float_type invLog2() { return FLT_INV_LOG_2; } static inline float_type invLog10() { return FLT_INV_LOG_10; } }; template <> struct float_traits { typedef double float_type; static inline float_type epsilon() { return DBL_STD_EPSILON; } static inline float_type zeroTolerance() { return DBL_ZERO_TOLERANCE; } static inline float_type max() { return DBL_STD_MAX; } static inline float_type pi() { return DBL_PI; } static inline float_type twoPi() { return DBL_TWO_PI; } static inline float_type halfPi() { return DBL_HALF_PI; } static inline float_type inversePi() { return DBL_INVERSE_PI; } static inline float_type inverseTwoPi() { return DBL_INVERSE_TWO_PI; } static inline float_type degToRad() { return DBL_DEG_TO_RAD; } static inline float_type radToDeg() { return DBL_RAD_TO_DEG; } static inline float_type log2() { return DBL_LOG_2; } static inline float_type log10() { return DBL_LOG_10; } static inline float_type invLog2() { return DBL_INV_LOG_2; } static inline float_type invLog10() { return DBL_INV_LOG_10; } }; template class Math { public: typedef T num_type; typedef float_traits traits_type; static inline num_type epsilon() { return traits_type::epsilon(); } static inline num_type zeroTolerance() { return traits_type::zeroTolerance(); } static inline num_type max() { return traits_type::max(); } static inline num_type pi() { return traits_type::pi(); } static inline num_type twoPi() { return traits_type::twoPi(); } static inline num_type halfPi() { return traits_type::halfPi(); } static inline num_type inversePi() { return traits_type::inversePi(); } static inline num_type inverseTwoPi() { return traits_type::inverseTwoPi(); } static inline num_type degToRad() { return traits_type::degToRad(); } static inline num_type radToDeg() { return traits_type::radToDeg(); } static inline num_type log2() { return traits_type::log2(); } static inline num_type log10() { return traits_type::log10(); } static inline num_type invLog2() { return traits_type::invLog2(); } static inline num_type invLog10() { return traits_type::invLog10(); } static T ACos(T _val); static T ASin(T _val); static T ATan(T _val); static T ATan2(T _x, T _y); static T Ceil(T _val); static T Cos(T _val); static T Exp(T _val); static T FAbs(T _val); static T Floor(T _val); static T FMod (T _x, T _y); static T InvSqrt(T _val); static T Log(T _val); static T Log2(T _val); static T Log10(T _val); static T Pow(T _base, T _exponent); static T Sin(T _val); static T Sqr(T _val); static T Sqrt(T _val); static T Tan(T _val); static bool Equal(T _val1, T _val2); }; typedef Math Mathf; typedef Math Mathd; template inline T Math::ACos(T _val) { if (-static_cast(1) < _val) { if (_val < static_cast(1)) { return static_cast(std::acos(_val)); } else { return static_cast(0); } } else { return pi(); } } template inline T Math::ASin(T _val) { if (-static_cast(1) < _val) { if (_val < static_cast(1)) { return static_cast(std::asin(_val)); } else { return halfPi(); } } else { return -halfPi(); } } template inline T Math::ATan(T _val) { return static_cast(std::atan(_val)); } template inline T Math::ATan2(T _x, T _y) { return static_cast(std::atan2(_x, _y)); } template inline T Math::Ceil(T _val) { return static_cast(std::ceil(_val)); } template inline T Math::Cos(T _val) { return static_cast(std::cos(_val)); } template inline T Math::Exp(T _val){ return static_cast(std::exp(_val)); } template inline T Math::FAbs(T _val) { return static_cast(std::fabs(_val)); } template inline T Math::Floor(T _val) { return static_cast(std::floor(_val)); } template inline T Math::FMod(T _x, T _y) { return static_cast(std::fmod(_x, _y)); } template inline T Math::InvSqrt(T _val) { return static_cast(1/std::sqrt(_val)); } template inline T Math::Log(T _val) { return static_cast(std::log(_val)); } template inline T Math::Log2(T _val) { return invLog2() * static_cast(std::log(_val)); } template inline T Math::Log10(T _val) { return invLog10() * static_cast(std::log(_val)); } template inline T Math::Pow(T _base, T _exponent) { return static_cast(std::pow(_base, _exponent)); } template inline T Math::Sin(T _val) { return static_cast(std::sin(_val)); } template inline T Math::Sqr(T _val) { return _val*_val; } template inline T Math::Sqrt(T _val) { return static_cast(std::sqrt(_val)); } template inline T Math::Tan(T _val) { return static_cast(std::tan(_val)); } template inline bool Math::Equal(T _val1, T _val2) { return std::fabs(_val1 - _val2) < epsilon(); } /** Returns the next higher power of 2 based on the passed argument */ inline unsigned nextPow2(unsigned x) { --x; x |= x >> 1; x |= x >> 2; x |= x >> 4; x |= x >> 8; x |= x >> 16; return ++x; } } //FIFE #endif // FIFE_UTIL_FIFE_MATH_H fifengine-0.4.2/engine/core/util/math/math.i000066400000000000000000000062661341615052600206720ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fife %{ #include "util/math/angles.h" #include "util/math/fife_math.h" %} namespace FIFE { template struct float_traits { }; template class Math { public: typedef T num_type; typedef float_traits traits_type; static inline num_type epsilon(); static inline num_type zeroTolerance(); static inline num_type max(); static inline num_type pi(); static inline num_type twoPi(); static inline num_type halfPi(); static inline num_type inversePi(); static inline num_type inverseTwoPi(); static inline num_type degToRad(); static inline num_type radToDeg(); static inline num_type log2(); static inline num_type log10(); static inline num_type invLog2(); static inline num_type invLog10(); static T ACos(T _val); static T ASin(T _val); static T ATan(T _val); static T ATan2(T _x, T _y); static T Ceil(T _val); static T Cos(T _val); static T Exp(T _val); static T FAbs(T _val); static T Floor(T _val); static T FMod (T _x, T _y); static T InvSqrt(T _val); static T Log(T _val); static T Log2(T _val); static T Log10(T _val); static T Pow(T _base, T _exponent); static T Sin(T _val); static T Sqr(T _val); static T Sqrt(T _val); static T Tan(T _val); }; int32_t getAngleBetween(const Location& loc1, const Location& loc2); Location getFacing(const Location& loc, const int32_t angle); int32_t getAngleBetween(const ExactModelCoordinate& emc1, const ExactModelCoordinate& emc2); ExactModelCoordinate getFacing(const ExactModelCoordinate& emc, const int32_t angle); typedef Math Mathf; typedef Math Mathd; %template(Mathf) Math; %template(Mathd) Math; } fifengine-0.4.2/engine/core/util/math/matrix.h000066400000000000000000000276231341615052600212440ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ /*************************************************************************** * Includes some heavy copying from mathgl-pp project * * (http://sourceforge.net/projects/mathgl-pp/) * ***************************************************************************/ #ifndef FIFE_UTIL_MATRIX_H #define FIFE_UTIL_MATRIX_H // Standard C++ library includes #include #include // Platform specific includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/fife_stdint.h" #include "util/structures/point.h" #include "fife_math.h" namespace FIFE { /** Minimal matrix class to assist in view 3d calculations */ template class Matrix { public: Matrix() {} template friend class Matrix; template Matrix(const Matrix& mat) { memmove(m, mat.m, 16*sizeof(T)); } ~Matrix() {} /** Adjoint method inverse, constant time inversion implementation */ Matrix inverse() const { Matrix ret(adjoint()); T determinant = m0*ret[0] + m1*ret[4] + m2*ret[8] + m3*ret[12]; assert(determinant!=0 && "Singular matrix has no inverse"); ret/=determinant; return ret; } /** Divide this matrix by a scalar */ inline Matrix& operator/= (T val) { for (unsigned i = 0; i < 16; ++i) m[i] /= val; return *this; } /** Get the adjoint matrix */ Matrix adjoint() const { Matrix ret; ret[0] = cofactorm0(); ret[1] = -cofactorm4(); ret[2] = cofactorm8(); ret[3] = -cofactorm12(); ret[4] = -cofactorm1(); ret[5] = cofactorm5(); ret[6] = -cofactorm9(); ret[7] = cofactorm13(); ret[8] = cofactorm2(); ret[9] = -cofactorm6(); ret[10] = cofactorm10(); ret[11] = -cofactorm14(); ret[12] = -cofactorm3(); ret[13] = cofactorm7(); ret[14] = -cofactorm11(); ret[15] = cofactorm15(); return ret; } /** Make this a rotation matrix */ inline Matrix& loadRotate(T angle, T x, T y, T z) { T magSqr = x*x + y*y + z*z; if (magSqr != 1.0) { T mag = Math::Sqrt(magSqr); x/=mag; y/=mag; z/=mag; } T c = Math::Cos(angle*Math::pi()/180); T s = Math::Sin(angle*Math::pi()/180); m0 = x*x*(1-c)+c; m1 = y*x*(1-c)+z*s; m2 = z*x*(1-c)-y*s; m3 = 0; m4 = x*y*(1-c)-z*s; m5 = y*y*(1-c)+c; m6 = z*y*(1-c)+x*s; m7 = 0; m8 = x*z*(1-c)+y*s; m9 = y*z*(1-c)-x*s; m10 = z*z*(1-c)+c; m11 = 0; m12 = 0; m13 = 0; m14 = 0; m15 = 1; return *this; } /** Apply scale into this matrix */ inline Matrix& applyScale(T x, T y, T z) { static Matrix temp; temp.loadScale(x,y,z); *this = temp.mult4by4(*this); return *this; } /** Make this a scale matrix */ inline Matrix& loadScale(T x, T y, T z = 1) { m0 = x; m4 = 0; m8 = 0; m12 = 0; m1 = 0; m5 = y; m9 = 0; m13 = 0; m2 = 0; m6 = 0; m10 = z; m14 = 0; m3 = 0; m7 = 0; m11 = 0; m15 = 1; return *this; } /** Apply translation into this matrix */ inline Matrix& applyTranslate(T x, T y, T z) { static Matrix temp; temp.loadTranslate(x,y,z); *this = temp.mult4by4(*this); return *this; } /** Make this a translation matrix */ inline Matrix& loadTranslate( const T x, const T y, const T z) { m0 = 1; m4 = 0; m8 = 0; m12 = x; m1 = 0; m5 = 1; m9 = 0; m13 = y; m2 = 0; m6 = 0; m10 = 1; m14 = z; m3 = 0; m7 = 0; m11 = 0; m15 = 1; return *this; } /** Transform given point using this matrix */ inline PointType3D operator* (const PointType3D& vec) { return PointType3D ( vec.x * m0 + vec.y * m4 + vec.z * m8 + m12, vec.x * m1 + vec.y * m5 + vec.z * m9 + m13, vec.x * m2 + vec.y * m6 + vec.z * m10 + m14 ); } /** Direct access to the matrix elements, just remember they are in column major format!! */ inline T& operator[] (int32_t ind) { assert(ind > -1 && ind < 16); return m[ind]; } inline const T& operator[] (int32_t ind) const { assert(ind > -1 && ind < 16); return m[ind]; } /** Apply the matrix dot product to this matrix */ inline Matrix& mult3by3(const Matrix& mat) { Matrix temp(*this); m0 = temp.m0*mat.m0+temp.m4*mat.m1+temp.m8*mat.m2; m4 = temp.m0*mat.m4+temp.m4*mat.m5+temp.m8*mat.m6; m8 = temp.m0*mat.m8+temp.m4*mat.m9+temp.m8*mat.m10; m1 = temp.m1*mat.m0+temp.m5*mat.m1+temp.m9*mat.m2; m5 = temp.m1*mat.m4+temp.m5*mat.m5+temp.m9*mat.m6; m9 = temp.m1*mat.m8+temp.m5*mat.m9+temp.m9*mat.m10; m2 = temp.m2*mat.m0+temp.m6*mat.m1+temp.m10*mat.m2; m6 = temp.m2*mat.m4+temp.m6*mat.m5+temp.m10*mat.m6; m10 = temp.m2*mat.m8+temp.m6*mat.m9+temp.m10*mat.m10; m3 = temp.m3*mat.m0+temp.m7*mat.m1+temp.m11*mat.m2; m7 = temp.m3*mat.m4+temp.m7*mat.m5+temp.m11*mat.m6; m11 = temp.m3*mat.m8+temp.m7*mat.m9+temp.m11*mat.m10; return *this; } /** this->Rmult4by4(temp) == [temp] X [*this] **/ /** also equal to temp->mult4by4(*this) **/ inline Matrix& Rmult4by4(const Matrix& mat) { Matrix temp(*this); m0 = mat.m0*temp.m0+mat.m4*temp.m1+mat.m8*temp.m2+mat.m12*temp.m3; m4 = mat.m0*temp.m4+mat.m4*temp.m5+mat.m8*temp.m6+mat.m12*temp.m7; m8 = mat.m0*temp.m8+mat.m4*temp.m9+mat.m8*temp.m10+mat.m12*temp.m11; m12 = mat.m0*temp.m12+mat.m4*temp.m13+mat.m8*temp.m14+mat.m12*temp.m15; m1 = mat.m1*temp.m0 + mat.m5*temp.m1 + mat.m9*temp.m2+mat.m13*temp.m3; m5 = mat.m1*temp.m4 + mat.m5*temp.m5 + mat.m9*temp.m6+mat.m13*temp.m7; m9 = mat.m1*temp.m8 + mat.m5*temp.m9 + mat.m9*temp.m10+mat.m13*temp.m11; m13 = mat.m1*temp.m12+ mat.m5*temp.m13 + mat.m9*temp.m14+mat.m13*temp.m15; m2 = mat.m2*temp.m0+mat.m6*temp.m1+mat.m10*temp.m2+mat.m14*temp.m3; m6 = mat.m2*temp.m4+mat.m6*temp.m5+mat.m10*temp.m6+mat.m14*temp.m7; m10 = mat.m2*temp.m8+mat.m6*temp.m9+mat.m10*temp.m10+mat.m14*temp.m11; m14 = mat.m2*temp.m12+mat.m6*temp.m13+mat.m10*temp.m14+mat.m14*temp.m15; m3 = mat.m3*temp.m0+mat.m7*temp.m1+mat.m11*temp.m2+mat.m15*temp.m3; m7 = mat.m3*temp.m4+mat.m7*temp.m5+mat.m11*temp.m6+mat.m15*temp.m7; m11 = mat.m3*temp.m8+mat.m7*temp.m9+mat.m11*temp.m10+mat.m15*temp.m11; m15 = mat.m3*temp.m12+mat.m7*temp.m13+mat.m11*temp.m14+mat.m15*temp.m15; return *this; } inline Matrix& mult4by4(const Matrix& mat) { Matrix temp(*this); m0 = temp.m0*mat.m0+temp.m4*mat.m1+temp.m8*mat.m2+temp.m12*mat.m3; m4 = temp.m0*mat.m4+temp.m4*mat.m5+temp.m8*mat.m6+temp.m12*mat.m7; m8 = temp.m0*mat.m8+temp.m4*mat.m9+temp.m8*mat.m10+temp.m12*mat.m11; m12 = temp.m0*mat.m12+temp.m4*mat.m13+temp.m8*mat.m14+temp.m12*mat.m15; m1 = temp.m1*mat.m0 + temp.m5*mat.m1 + temp.m9*mat.m2+temp.m13*mat.m3; m5 = temp.m1*mat.m4 + temp.m5*mat.m5 + temp.m9*mat.m6+temp.m13*mat.m7; m9 = temp.m1*mat.m8 + temp.m5*mat.m9 + temp.m9*mat.m10+temp.m13*mat.m11; m13 = temp.m1*mat.m12+ temp.m5*mat.m13 + temp.m9*mat.m14+temp.m13*mat.m15; m2 = temp.m2*mat.m0+temp.m6*mat.m1+temp.m10*mat.m2+temp.m14*mat.m3; m6 = temp.m2*mat.m4+temp.m6*mat.m5+temp.m10*mat.m6+temp.m14*mat.m7; m10 = temp.m2*mat.m8+temp.m6*mat.m9+temp.m10*mat.m10+temp.m14*mat.m11; m14 = temp.m2*mat.m12+temp.m6*mat.m13+temp.m10*mat.m14+temp.m14*mat.m15; m3 = temp.m3*mat.m0+temp.m7*mat.m1+temp.m11*mat.m2+temp.m15*mat.m3; m7 = temp.m3*mat.m4+temp.m7*mat.m5+temp.m11*mat.m6+temp.m15*mat.m7; m11 = temp.m3*mat.m8+temp.m7*mat.m9+temp.m11*mat.m10+temp.m15*mat.m11; m15 = temp.m3*mat.m12+temp.m7*mat.m13+temp.m11*mat.m14+temp.m15*mat.m15; return *this; } Matrix& applyRotate(T angle, T x, T y, T z) { static Matrix temp; temp.loadRotate(angle,x,y,z); *this = temp.mult4by4(*this); return *this; } private: #define cofactor_maker(f1,mj1,mi1, f2,mj2,mi2, f3,mj3,mi3) \ f1*(mj1*mi1-mj2*mi3) + f2*(mj2*mi2-mj3*mi1) + f3*(mj3*mi3-mj1*mi2) inline T cofactorm0() const { return cofactor_maker(m5,m10,m15, m6,m11,m13, m7,m9,m14); } inline T cofactorm1() const { return cofactor_maker(m6,m11,m12, m7,m8,m14, m4,m10,m15); } inline T cofactorm2() const { return cofactor_maker(m7,m8,m13, m4,m9,m15, m5,m11,m12); } inline T cofactorm3() const { return cofactor_maker(m4,m9,m14, m5,m10,m12, m6,m8,m13); } inline T cofactorm4() const { return cofactor_maker(m9,m14,m3, m10,m15,m1, m11,m13,m2); } inline T cofactorm5() const { return cofactor_maker(m10,m15,m0, m11,m12,m2, m8,m14,m3); } inline T cofactorm6() const { return cofactor_maker(m11,m12,m1, m8,m13,m3, m9,m15,m0); } inline T cofactorm7() const { return cofactor_maker(m8,m13,m2, m9,m14,m0, m10,m12,m1); } inline T cofactorm8() const { return cofactor_maker(m13,m2,m7, m14,m3,m5, m15,m1,m6); } inline T cofactorm9() const { return cofactor_maker(m14,m13,m4, m15,m0,m6, m12,m2,m7); } inline T cofactorm10() const { return cofactor_maker(m15,m0,m5, m12,m1,m7, m13,m3,m4); } inline T cofactorm11() const { return cofactor_maker(m12,m1,m6, m13,m2,m4, m14,m0,m5); } inline T cofactorm12() const { return cofactor_maker(m1,m6,m11, m2,m7,m9, m3,m5,m10); } inline T cofactorm13() const { return cofactor_maker(m2,m7,m8, m3,m4,m10, m10,m6,m11); } inline T cofactorm14() const { return cofactor_maker(m3,m4,m9, m0,m5,m11, m1,m7,m8); } inline T cofactorm15() const { return cofactor_maker(m0,m5,m10, m1,m6,m8, m2,m4,m9); } public: union { T m[16]; struct { T m0,m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12,m13,m14,m15; }; }; }; typedef Matrix DoubleMatrix; typedef Matrix IntMatrix; /** Print coords of the Matrix to a stream */ template std::ostream& operator<<(std::ostream& os, const Matrix& m) { return os << "\n|" << m[0] << "," << m[4] << "," << m[8] << "," << m[12] << "|\n" << \ "|" << m[1] << "," << m[5] << "," << m[9] << "," << m[13] << "|\n" << \ "|" << m[2] << "," << m[6] << "," << m[10] << "," << m[14] << "|\n" << \ "|" << m[3] << "," << m[7] << "," << m[11] << "," << m[15] << "|\n"; } } #endif fifengine-0.4.2/engine/core/util/resource/000077500000000000000000000000001341615052600204535ustar00rootroot00000000000000fifengine-0.4.2/engine/core/util/resource/resource.cpp000066400000000000000000000035621341615052600230140ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "resource.h" namespace FIFE { ResourceHandle IResource::m_curhandle = 1; }//FIFE fifengine-0.4.2/engine/core/util/resource/resource.h000066400000000000000000000056611341615052600224630ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_RESOURE_H #define FIFE_RESOURE_H // Standard C++ library includes #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/sharedptr.h" namespace FIFE { typedef std::size_t ResourceHandle; class IResource; class IResourceLoader { public: IResourceLoader() { } virtual ~IResourceLoader() { } virtual void load(IResource* resource) = 0; }; class IResource { public: enum ResourceState { RES_INVALID = 0, RES_NOT_LOADED, RES_LOADED }; IResource(const std::string& name, IResourceLoader* loader = 0) : m_name(name), m_loader(loader), m_state(RES_NOT_LOADED), m_handle(m_curhandle++) { } virtual ~IResource() { } virtual const std::string& getName() { return m_name; } ResourceHandle getHandle() { return m_handle; } virtual ResourceState getState() { return m_state; } virtual void setState(const ResourceState& state) { m_state = state; } virtual size_t getSize() = 0; virtual void load() = 0; virtual void free() = 0; protected: std::string m_name; IResourceLoader* m_loader; ResourceState m_state; private: ResourceHandle m_handle; static ResourceHandle m_curhandle; }; typedef SharedPtr ResourcePtr; } //FIFE #endif fifengine-0.4.2/engine/core/util/resource/resource.i000066400000000000000000000067071341615052600224660ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fife %{ #include "util/base/sharedptr.h" #include "util/resource/resource.h" #include "util/resource/resourcemanager.h" %} namespace FIFE { // %warnfilter(473) ResourceLoader; // filter out "returning a pointer or reference in a director method is not recommended" // %feature("director") ResourceLoader; // class ResourceLoader { // public: // virtual ~ResourceLoader() { }; // virtual IResource* loadResource(const ResourceLocation& location) = 0; // }; typedef std::size_t ResourceHandle; class IResource; class IResourceLoader { public: virtual ~IResourceLoader() { } virtual void load(IResource* resource) = 0; }; class IResource { public: enum ResourceState { RES_NOT_LOADED, RES_LOADED }; virtual ~IResource(); virtual const std::string& getName(); ResourceHandle getHandle(); virtual ResourceState getState(); virtual void setState(const ResourceState& state); virtual size_t getSize() = 0; virtual void load() = 0; virtual void free() = 0; }; template class SharedPtr { public: SharedPtr(); template explicit SharedPtr(U *ptr); SharedPtr(const SharedPtr& rhs); template SharedPtr(const SharedPtr& rhs); ~SharedPtr(); inline T& operator*() const; inline T* operator->() const; inline T* get() const; inline void reset(T* ptr = 0); inline uint32_t useCount() const; inline uint32_t* useCountPtr() const; inline bool unique() const; operator bool(); }; typedef SharedPtr ResourcePtr; %template(SharedResourcePointer) SharedPtr; class IResourceManager { public: virtual size_t getMemoryUsed() const = 0; virtual size_t getTotalResourcesCreated() const = 0; virtual size_t getTotalResourcesLoaded() const = 0; virtual size_t getTotalResources() const = 0; }; } fifengine-0.4.2/engine/core/util/resource/resourcemanager.h000066400000000000000000000067741341615052600240240ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_RESOURE_MANAGER_H #define FIFE_RESOURE_MANAGER_H // Standard C++ library includes #include #include #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "resource.h" namespace FIFE { /** IResourceManager * * An interface for managing resources. * * @see IResource * @see IResourceLoader * */ class IResourceManager { public: /** Default constructor. */ IResourceManager() { } /** destructor */ virtual ~IResourceManager() { } /** Gets the total amount of memory used by resources * * This function uses the IResource's getSize() function * to calculate the total memory used. It does not include * memory used by the internal resource manager book keeping * structures. This value is only accurate if the resources * getSize() function returns an accurate result. * * @return Total memory used * */ virtual size_t getMemoryUsed() const = 0; /** Returns the number of unloaded resources * * Gets the total number of resources created but not loaded. * These resources have been defined in the resource manager * but have yet to be loaded from disk. * * @return Total resources created * */ virtual size_t getTotalResourcesCreated() const = 0; /** Returns the number of loaded resources * * Gets the total number of resources created and loaded. * These resources have been defined in the resource manager * have been loaded from disk. * * @return Total resources loaded * */ virtual size_t getTotalResourcesLoaded() const = 0; /** Returns the number of defined resources * * Gets the total number of resources managed by the manager. * * @return Total resources managed * */ virtual size_t getTotalResources() const = 0; }; } //FIFE #endif fifengine-0.4.2/engine/core/util/structures/000077500000000000000000000000001341615052600210475ustar00rootroot00000000000000fifengine-0.4.2/engine/core/util/structures/point.h000066400000000000000000000216671341615052600223650ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_VIDEO_POINT_H #define FIFE_VIDEO_POINT_H // Standard C++ library includes #include #include #include // Platform specific includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/fife_stdint.h" #include "util/math/fife_math.h" namespace FIFE { /** A 2D Point * * This is a small helper class to aid in 2d vector arithmetics. * @see Rect */ template class PointType2D { public: union { T val[2]; struct { T x,y; }; }; /** Constructor * * Creates a with 0 as default values. */ explicit PointType2D(T _x = 0, T _y = 0): x(_x), y(_y) { } /** Copy Constructor */ PointType2D(const PointType2D& rhs): x(rhs.x), y(rhs.y) { } /** Vector addition */ PointType2D operator+(const PointType2D& p) const { return PointType2D(x + p.x, y + p.y); } /** Vector substraction */ PointType2D operator-(const PointType2D& p) const { return PointType2D(x - p.x, y - p.y); } /** Vector inplace addition */ PointType2D& operator+=(const PointType2D& p) { x += p.x; y += p.y; return *this; } /** Vector inplace substraction */ PointType2D& operator-=(const PointType2D& p) { x -= p.x; y -= p.y; return *this; } /** Scalar multiplication with an integer value */ PointType2D operator*(const T& i) const { return PointType2D(x * i, y * i); } /** Scalar division with an integer value */ PointType2D operator/(const T& i) const { return PointType2D(x / i, y / i); } /** Equality comparision */ bool operator==(const PointType2D& p) const { return x == p.x && y == p.y; } /** Equality comparision */ bool operator!=(const PointType2D& p) const { return !(x == p.x && y == p.y); } /** Return length */ T length() const { double sq; sq = x*x + y*y; return static_cast(Mathd::Sqrt(sq)); } /** Normalizes the point */ void normalize() { T invLength = static_cast(1.0/length()); //TODO: get rid of this static cast if (invLength > static_cast(Mathd::zeroTolerance())) { x = x * invLength; y = y * invLength; } else { x = 0; y = 0; } } /** Rotates the point around the origin */ void rotate(T angle){ //TODO: get rid of this static cast T theta = (angle * static_cast(Mathd::pi()))/180; T costheta = static_cast(Mathd::Cos(theta)); T sintheta = static_cast(Mathd::Sin(theta)); T nx = x; T ny = y; x = costheta * nx - sintheta * ny; y = sintheta * nx + costheta * ny; } /** Rotates the point around an origin */ void rotate(const PointType2D& origin, T angle){ //TODO: get rid of this static cast T theta = (angle * static_cast(Mathd::pi()))/180; T costheta = static_cast(Mathd::Cos(theta)); T sintheta = static_cast(Mathd::Sin(theta)); T nx = x - origin.x; T ny = y - origin.y; x = costheta * nx - sintheta * ny; y = sintheta * nx + costheta * ny; } /** Sets the x and y coordinate of the 2D point */ void set(T _x, T _y) { x = _x; y = _y; } inline T& operator[] (int32_t ind) { assert(ind > -1 && ind < 2); return val[ind]; } }; /** Print coords of the Point to a stream */ template std::ostream& operator<<(std::ostream& os, const PointType2D& p) { return os << "(" << p.x << ":" << p.y << ")"; } typedef PointType2D Point; typedef PointType2D DoublePoint; typedef std::vector PointVector; typedef std::vector DoublePointVector; /** A 3D Point * * This is a small helper class to aid in 3d vector arithmetics. * @see Rect */ template class PointType3D { public: union { T val[3]; struct { T x,y,z; }; }; /** Constructor * * Creates a with 0 as default values. */ explicit PointType3D(T _x = 0, T _y = 0, T _z = 0): x(_x), y(_y), z(_z) { } /** Copy Constructor */ PointType3D(const PointType3D& rhs): x(rhs.x), y(rhs.y), z(rhs.z) { } /** Vector addition */ PointType3D operator+(const PointType3D& p) const { return PointType3D(x + p.x, y + p.y, z + p.z); } /** Vector substraction */ PointType3D operator-(const PointType3D& p) const { return PointType3D(x - p.x, y - p.y, z - p.z); } /** Vector inplace addition */ PointType3D& operator+=(const PointType3D& p) { x += p.x; y += p.y; z += p.z; return *this; } /** Vector inplace substraction */ PointType3D& operator-=(const PointType3D& p) { x -= p.x; y -= p.y; z -= p.z; return *this; } /** Scalar multiplication with an integer value */ PointType3D operator*(const T& i) const { return PointType3D(x * i, y * i, z * i); } /** Scalar division with an integer value */ PointType3D operator/(const T& i) const { return PointType3D(x / i, y / i, z / i); } /** Equality comparision */ bool operator==(const PointType3D& p) const { /*return x == p.x && y == p.y && z == p.z;*/ return Mathd::Equal(x, p.x) && Mathd::Equal(y, p.y) && Mathd::Equal(z, p.z); } /** Equality comparision */ bool operator!=(const PointType3D& p) const { return !(Mathd::Equal(x, p.x) && Mathd::Equal(y, p.y) && Mathd::Equal(z, p.z)); } /** Return length */ T length() const { double sq; sq = x*x + y*y + z*z; return static_cast(Mathd::Sqrt(sq)); } /** Normalizes the point */ void normalize() { T invLength = static_cast(1.0/length()); //TODO: get rid of this static cast if (invLength > static_cast(Mathd::zeroTolerance())) { x = x * invLength; y = y * invLength; z = z * invLength; } else { x = 0; y = 0; z = 0; } } /** Sets the x, y and z coordinates of the 3D point */ void set(T _x, T _y, T _z) { x = _x; y = _y; z = _z; } inline T& operator[] (int32_t ind) { assert(ind > -1 && ind < 3); return val[ind]; } }; /** Print coords of the Point to a stream */ template std::ostream& operator<<(std::ostream& os, const PointType3D& p) { return os << "(" << p.x << ":" << p.y << ":" << p.z << ")"; } typedef PointType3D Point3D; typedef PointType3D DoublePoint3D; typedef std::vector Point3DVector; typedef std::vector DoublePoint3DVector; /** Convert from 2D double point to 2D int32_t point */ inline Point doublePt2intPt(DoublePoint pt) { Point tmp(static_cast(round(pt.x)), static_cast(round(pt.y))); return tmp; } /** Convert from 3D double point to 3D int32_t point */ inline Point3D doublePt2intPt(DoublePoint3D pt) { Point3D tmp(static_cast(round(pt.x)), static_cast(round(pt.y)), static_cast(round(pt.z))); return tmp; } /** Convert from 2D int32_t point to 2D double point */ inline DoublePoint intPt2doublePt(Point pt) { DoublePoint tmp(static_cast(pt.x), static_cast(pt.y)); return tmp; } /** Convert from 3D int32_t point to 3D double point */ inline DoublePoint3D intPt2doublePt(Point3D pt) { DoublePoint3D tmp(static_cast(pt.x), static_cast(pt.y), static_cast(pt.z)); return tmp; } } #endif fifengine-0.4.2/engine/core/util/structures/priorityqueue.h000066400000000000000000000205071341615052600241520ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_SOLVER_INDEXEDPQ_H #define FIFE_SOLVER_INDEXEDPQ_H #include #include namespace FIFE { /** A pq which stores index-value pairs for elements. * * This acts as a normal PQ but stores some extra information about the * elements that it's storing, namely a special unique index. */ template class PriorityQueue { public: /** Used for element ordering. * */ enum Ordering { Ascending, //!< lowest priority first. Descending //!< highest priority first. }; typedef std::pair value_type; /** Constructor * */ PriorityQueue(void) : m_ordering(Ascending) { } /** Constructor * * @param ordering The ordering the priority queue should use. */ PriorityQueue(const Ordering ordering) : m_ordering(ordering) { } /** Pushes a new element onto the queue. * * The element is pushed onto the queue and then moved up the queue until it's * in the correct position by priority. * * @param element Of type value_type which contains both the index and the priority of the element. */ void pushElement(const value_type& element); /** Pops the element with the highest priority from the queue. * * Removes and deletes the highest priority element. */ void popElement(void); /** Changes the priority of an element. * * Locates the element with the given index and changes it's priority to the given * priority, it then re-orders the priority queue to take account of this new information. * * @param index The index of the element to change the priority of. * @param newPriority The new priority of the element. * @return True if the element could be found, false otherwise. */ bool changeElementPriority(const index_type& index, const priority_type& newPriority); /** Removes all elements from the priority queue. * */ void clear(void); /** Retrieves the element with the highest priority. * * This function will generate an assertion error if the pq is * empty. * * @return A const reference to the highest priority element. */ const value_type getPriorityElement(void) const { assert(!empty()); return m_elements.front(); } /** Determines whether the queue is currently empty. * * @return true if it is empty, false otherwise. */ bool empty(void) const { return m_elements.empty(); } /** Returns the current size of the queue. * */ size_t size(void) const { return m_elements.size(); } private: typedef std::list ElementList; typedef typename ElementList::iterator ElementListIt; typedef typename ElementList::const_iterator ElementListConstIt; //A list of valuetype pairs that represents the pq. ElementList m_elements; //The order to use when sorting the pq. Ordering m_ordering; /** Orders a PQ element up the list. * * @param i An iterator representing the element in the list to be sorted up. */ void orderUp(ElementListIt i); /** Orders a PQ element up the list. * * @param entry A const reference to a value_type which represents the element to be added to the * pq. */ void orderUp(const value_type& entry); /** Orders a PQ element down the list. * * @param i An iterator representing the element in the PQ to order down. */ void orderDown(ElementListIt i); /** Retrieves the iterator to the element with the given index. * * @param index A const reference to the index to find. */ ElementListIt getElementIterator(const index_type& index) { for(ElementListIt i = m_elements.begin(); i != m_elements.end(); ++i) { if(i->first == index) { return i; } } return m_elements.end(); } /** The comparison function, used to compare two elements. * * @param a The l-operand of the comparison operation. * @param b The r-operand of the comparison operation. * @return An integer representing the result of the comparison operation. 1 being a is greather than b, * -1 being a is less than b and 0 meaning that they're equal. */ int32_t compare(const value_type& a, const value_type& b); }; } template void FIFE::PriorityQueue::pushElement(const value_type& element) { if(empty()) { m_elements.push_front(element); } else { orderUp(element); } } template void FIFE::PriorityQueue::popElement(void) { if(!empty()) { m_elements.pop_front(); } } template bool FIFE::PriorityQueue::changeElementPriority(const index_type& index, const priority_type& newPriority) { ElementListIt i = getElementIterator(index); if(i == m_elements.end()) { return false; } int32_t compare_res = compare(value_type(index, newPriority), (*i)); i->second = newPriority; if(compare_res > 0 && i != m_elements.begin()) { orderDown(i); } else if(compare_res < 0) { orderUp(i); } return true; } template void FIFE::PriorityQueue::clear(void) { m_elements.clear(); } template void FIFE::PriorityQueue::orderUp(ElementListIt i) { assert(i != m_elements.end() && L"Invalid iterator passed to function"); value_type vt = (*i); i = m_elements.erase(i); while(i != m_elements.end()) { if(compare(vt, (*i)) > 0) { m_elements.insert(i, vt); return; } ++i; } m_elements.push_back(vt); } template void FIFE::PriorityQueue::orderUp(const value_type& val) { for(ElementListIt i = m_elements.begin(); i != m_elements.end(); ++i) { assert(val.first != i->first); if(compare(val, (*i)) > 0) { assert(val.first != i->first); m_elements.insert(i, val); return; } } m_elements.push_back(val); } template void FIFE::PriorityQueue::orderDown(ElementListIt i) { assert(i != m_elements.end()); value_type vt = (*i); i = m_elements.erase(i); if(i == m_elements.end()) { --i; } ElementListIt j = i; ++j; while(i != m_elements.begin()) { if(compare(vt, (*i)) < 0) { m_elements.insert(j, vt); return; } --i; --j; } m_elements.push_front(vt); } template int32_t FIFE::PriorityQueue::compare(const value_type& a, const value_type& b) { if(m_ordering == Descending) { if(a.second > b.second) { return 1; } else if(b.second > a.second) { return -1; } } else { if(a.second < b.second) { return 1; } else if(b.second < a.second) { return -1; } } return 0; } #endif fifengine-0.4.2/engine/core/util/structures/purge.h000066400000000000000000000043441341615052600223470ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Delete pointers in an STL sequence container #ifndef PURGE_H #define PURGE_H #include template void purge(Seq& c) { typename Seq::iterator i; for(i = c.begin(); i != c.end(); i++) { delete *i; *i = 0; } } // Iterator version: template void purge(InpIt begin, InpIt end) { while(begin != end) { delete *begin; *begin = 0; begin++; } } template void purge_map(Seq& c) { typename Seq::iterator i; for(i = c.begin(); i != c.end(); i++) { delete i->second; i->second = 0; } } // Iterator version: template void purge_map(InpIt begin, InpIt end) { while(begin != end) { delete begin->second; begin->second = 0; begin++; } } #endif // PURGE_H fifengine-0.4.2/engine/core/util/structures/quadtree.h000066400000000000000000000267731341615052600230510ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_UTIL_QUADTREE_H #define FIFE_UTIL_QUADTREE_H // Standard C++ library includes #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "rect.h" namespace FIFE { /** QuadTree Node */ template class QuadNode { protected: QuadNode *m_parent; QuadNode *m_nodes[4]; int32_t m_x,m_y,m_size; DataType m_data; public: /** Create a new QuadNode * @param parent The parent QuadNode this node is contained in or null. * @param x The X position of this QuadNode. * @param y The Y position of this QuadNode. * @param size The width and height of this QuadNode. */ QuadNode(QuadNode* parent, int32_t x, int32_t y, int32_t size) : m_parent(parent),m_x(x),m_y(y),m_size(size),m_data() { m_nodes[0] = m_nodes[1] = m_nodes[2] = m_nodes[3] = 0L; } ~QuadNode() { delete m_nodes[0]; delete m_nodes[1]; delete m_nodes[2]; delete m_nodes[3]; } /** Find a container node for a given rectangle. * This guarantees to return a Node with the following * properties: * 1.) The node contains the rectangle (as defined by the contains * function). 2.) All subnodes can not contain the rectangle or it has the MinimumSize. * 3.) In case these properties can only be fulfilled by extending the tree upwards, * that is by creating a new root node - this function will return null. * * This function will extend the tree automatically so that this guarantee * can be fulfilled. */ QuadNode* find_container(int32_t x, int32_t y, int32_t w, int32_t h); QuadNode* find_container(const Rect& rect) { return find_container(rect.x,rect.y,rect.w,rect.h); } /** Apply a visitor recursively to the QuadTree * A visitor is an object which has a @c visit method which * takes as parameters a pointer to a @c QuadNode and an integer. * The integer is the depth of the given node. * If the method returns @c true it is applied recursivly to all * existing subnodes with a depth increased by one. * The application happens in Z order (top left, top right, bottom * left and finally bottom right). */ template void apply_visitor(Visitor& visitor, int32_t d = 0) { if( !visitor.visit(this, d) ) return; if( m_nodes[0] ) m_nodes[0]->apply_visitor(visitor, d + 1); if( m_nodes[1] ) m_nodes[1]->apply_visitor(visitor, d + 1); if( m_nodes[2] ) m_nodes[2]->apply_visitor(visitor, d + 1); if( m_nodes[3] ) m_nodes[3]->apply_visitor(visitor, d + 1); } /** Return the X position of the node. */ int32_t x() const { return m_x; }; /** Return the Y position of the node. */ int32_t y() const { return m_y; }; /** Return the size (width and height) of the node. */ int32_t size() const { return m_size; }; /** Return a reference to the data of the node. */ DataType& data() { return m_data; }; /** Check whether a rectangle is contained in the node. * A rectangle is contained in a node, iff: * @code * x >= x() and x + w < x() + size() and y >= y() and y + h < y() + size() * @endcode * That is the top and left borders are inclusive, but the right and bottom * borders are exclusive. */ bool contains(int32_t x, int32_t y, int32_t w, int32_t h) const; /// Expand the subnodes - only needed for debugging/profiling worst cases. void splice(); /** Return the parent node */ QuadNode* parent() { return m_parent; }; /** Create a new parent node for a rectangle * This will create a new parent node end expand the tree so that * the given rectangle will eventually be contained after enough calls * of this function. */ QuadNode* create_parent(int32_t x, int32_t y, int32_t w, int32_t h); protected: int32_t subnode(int32_t x, int32_t y, int32_t w, int32_t h) const; }; /** Dynamic QuadTree * A space partitioning tree automatically expanding to adjust * to any object size put into the data structure. */ template class QuadTree { public: typedef QuadNode Node; /** Create a new QuadTree * @param x The X position of the starting node. * @param y The Y position of the starting node. * @param starting_size The width and height of the starting node. */ QuadTree(int32_t x = 0, int32_t y = 0, int32_t starting_size = MinimumSize) { assert(starting_size>1); m_cursor = m_root = new Node(0L,x,y,starting_size); } ~QuadTree() { assert( m_root->parent() == 0 ); delete m_root; } /** Find a container node for a given rectangle. * This guarantees to return a Node with the following * properties: * 1.) The node contains the rectangle (as defined by the contains * function). 2.) All subnodes can not contain the rectangle or it has the MinimumSize. * This function will extend the tree automatically so that this guarantee * can be fulfilled. * This function is optimized for sequential access. This means accessing different rectangles * that are 'near' to each other will be fast. * @warning If you put different sized objects in (for example) lists in the quadnode, * the returned node will @b not contain all objects which might intersect with the given * rectangle. */ Node* find_container(int32_t x, int32_t y, int32_t w, int32_t h); Node* find_container(const Rect& rect) { return find_container(rect.x,rect.y,rect.w,rect.h); } /** Apply a visitor recursively to the QuadTree */ template Visitor& apply_visitor(Visitor& visitor) { m_root->apply_visitor(visitor,0); return visitor; } void clear() { int32_t x = m_root->x(); int32_t y = m_root->y(); int32_t s = m_root->size(); delete m_root; m_cursor = m_root = new Node(0L,x,y,s); } protected: Node *m_root; Node *m_cursor; }; template inline bool QuadNode::contains(int32_t x, int32_t y, int32_t w, int32_t h) const { if (x < m_x) return false; if (y < m_y) return false; if (x + w >= m_x + m_size) return false; if (y + h >= m_y + m_size) return false; return true; } template inline int32_t QuadNode::subnode(int32_t x, int32_t y, int32_t w, int32_t h) const { /* Very small performance impact - roughly 5% for the already very fast find_container function. */ //assert(contains(x,y,w,h)); if (x >= m_x + m_size/2) { if (y >= m_y + m_size/2) { return 3; } if (y + h < m_y + m_size/2) { return 1; } return -1; } if (x + w < m_x + m_size/2) { if (y >= m_y + m_size/2) { return 2; } if (y + h < m_y + m_size/2) { return 0; } } return -1; } template QuadNode* QuadNode::find_container(int32_t x, int32_t y, int32_t w, int32_t h) { if( !contains(x,y,w,h) ) { if (m_parent) { return m_parent->find_container(x,y,w,h); } return 0L; } if (m_size <= MinimumSize) { return this; } int32_t r = subnode(x,y,w,h); switch(r) { case -1: return this; case 0: if( m_nodes[0] == 0) { m_nodes[0] = new QuadNode(this,m_x,m_y,m_size/2); } return m_nodes[0]->find_container(x,y,w,h); case 1: if( m_nodes[1] == 0) { m_nodes[1] = new QuadNode(this,m_x + m_size/2,m_y,m_size/2); } return m_nodes[1]->find_container(x,y,w,h); case 2: if( m_nodes[2] == 0) { m_nodes[2] = new QuadNode(this,m_x,m_y + m_size/2,m_size/2); } return m_nodes[2]->find_container(x,y,w,h); case 3: if( m_nodes[3] == 0) { m_nodes[3] = new QuadNode(this,m_x + m_size/2,m_y + m_size/2,m_size/2); } return m_nodes[3]->find_container(x,y,w,h); default: assert("BUG in QuadTree !" == 0); return 0L; } } template QuadNode* QuadNode::create_parent(int32_t x, int32_t y, int32_t w, int32_t h) { /* If used only by the tree, these two are superfluous. */ if( contains(x,y,w,h) ) return this; if( m_parent ) return m_parent; if (x >= m_x) { if (y >= m_y) { // we are node 0 m_parent = new QuadNode(0L,m_x,m_y,m_size*2); m_parent->m_nodes[0] = this; return m_parent; } if (y + w < m_y + m_size) { // we are node 2 m_parent = new QuadNode(0L,m_x,m_y - m_size,m_size*2); m_parent->m_nodes[2] = this; return m_parent; } } if (x + h < m_x + m_size) { if (y >= m_y) { // we are node 1 m_parent = new QuadNode(0L,m_x-m_size,m_y,m_size*2); m_parent->m_nodes[1] = this; return m_parent; } if (y + w < m_y + m_size) { // we are node 3 m_parent = new QuadNode(0L,m_x-m_size,m_y - m_size,m_size*2); m_parent->m_nodes[3] = this; return m_parent; } } // It does not matter.... m_parent = new QuadNode(0L,m_x,m_y,m_size*2); m_parent->m_nodes[0] = this; return m_parent; } template void QuadNode::splice() { if (m_size <= MinimumSize) return; if( m_nodes[0] == 0) { m_nodes[0] = new QuadNode(this,m_x,m_y,m_size/2); } if( m_nodes[1] == 0) { m_nodes[1] = new QuadNode(this,m_x + m_size/2,m_y,m_size/2); } if( m_nodes[2] == 0) { m_nodes[2] = new QuadNode(this,m_x,m_y + m_size/2,m_size/2); } if( m_nodes[3] == 0) { m_nodes[3] = new QuadNode(this,m_x + m_size/2,m_y + m_size/2,m_size/2); } } template QuadNode* QuadTree::find_container(int32_t x, int32_t y, int32_t w, int32_t h) { m_cursor = m_cursor->find_container(x,y,w,h); while( m_cursor == 0L ) { m_root = m_root->create_parent(x,y,w,h); m_cursor = m_root->find_container(x,y,w,h); } return m_cursor; } } #endif // QUADTREE_H fifengine-0.4.2/engine/core/util/structures/rect.h000066400000000000000000000174411341615052600221640ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ /*************************************************************************** Rectangle intersection code copied and modified from the guichan 0.4 source, which is released under the BSD license. Copyright (c) 2004, 2005, 2006 Olof Naessén and Per Larsson All rights reserved. * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the Guichan nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. For more Information about guichan see: http://guichan.sourceforge.net ****************************************************************************/ #ifndef FIFE_VIDEO_RECT_H #define FIFE_VIDEO_RECT_H // Standard C++ library includes #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "point.h" namespace FIFE { /** A Rectangle on screen. * * This is a small helper class used for screen coordinate arithmetics. * The same thoughts reasong using @b int32_t as value type as in Point apply. * * @see Point */ template class RectType { public: /** The X Coordinate. */ T x; /** The Y Coordinate. */ T y; /** Width of the rectangle. */ T w; /** Height of the rectangle. */ T h; /** Constructor. * * Creates a new Rect with the values defaulting to 0. */ explicit RectType(T x = 0, T y = 0, T w = 0, T h = 0) : x(x), y(y), w(w), h(h) { } /** Constructor. * * Creates a new Rect of type T from the given Rect of type U */ template explicit RectType(const RectType& r) : x(static_cast(r.x)), y(static_cast(r.y)), w(static_cast(r.w)), h(static_cast(r.h)) { } /** The X coordinate of the right edge. */ T right() const; /** The Y coordinate of the bottom edge. */ T bottom() const; /** Equivalence operator. * * @param rect The rectangle to which this is compared. * @return True only if both rectangle values are all equal. */ bool operator==(const RectType& rect ) const; /** Checks whether a rectangle contains a Point. * * @param point The point that is checked. * @return True if the point lies inside the rectangle or on one of its borders. */ bool contains( const PointType2D& point ) const; /** Check whether two rectangles share some area. * * @param rect The other rectangle that is checked. * @return True, if and only if both rectangles have some covered area in common. * This includes edges that cover each other. * @note This operation is commutative. */ bool intersects( const RectType& rect ) const; /** Calculate rectangle intersection in place * * @param rect The other rectangle that is checked. * @return True, if and only if both rectangles have some covered area in common. * This includes edges that cover each other. */ bool intersectInplace( const RectType& rect ); }; /** Stream output operator. * * Useful for debugging purposes, this will output the coordinates * of the rectangle to the stream. */ template std::ostream& operator<<(std::ostream& os, const RectType& r) { return os << "("< inline T RectType::right() const { return x + w; } template inline T RectType::bottom() const { return y + h; } template inline bool RectType::operator==(const RectType& rect ) const { return x == rect.x && y == rect.y && w == rect.w && h == rect.h; } template inline bool RectType::contains( const PointType2D& point ) const { return (((point.x >= x) && (point.x <= x + w)) && ((point.y >= y) && (point.y <= y + h))); } template inline bool RectType::intersectInplace( const RectType& rectangle ) { x = x - rectangle.x; y = y - rectangle.y; if (x < 0) { w += x; x = 0; } if (y < 0) { h += y; y = 0; } if (x + w > rectangle.w) { w = rectangle.w - x; } if (y + h > rectangle.h) { h = rectangle.h - y; } x += rectangle.x; y += rectangle.y; if (w <= 0 || h <= 0) { h = 0; w = 0; return false; } return true; } template inline bool RectType::intersects( const RectType& rectangle ) const { T _x = x - rectangle.x; T _y = y - rectangle.y; T _w = w; T _h = h; if (_x < 0) { _w += _x; _x = 0; } if (_y < 0) { _h += _y; _y = 0; } if (_x + _w > rectangle.w) { _w = rectangle.w - _x; } if (_y + _h > rectangle.h) { _h = rectangle.h - _y; } if (_w <= 0 || _h <= 0) { return false; } return true; } typedef RectType Rect; typedef RectType FloatRect; typedef RectType DoubleRect; } #endif fifengine-0.4.2/engine/core/util/structures/utilstructures.i000066400000000000000000000106131341615052600243430ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %{ #include "util/structures/point.h" #include "util/structures/rect.h" %} namespace FIFE { template class PointType2D { public: T x; T y; explicit PointType2D(T _x = 0, T _y = 0); PointType2D(const PointType2D& rhs); PointType2D operator+(const PointType2D& p) const; PointType2D operator-(const PointType2D& p) const; PointType2D& operator+=(const PointType2D& p); PointType2D& operator-=(const PointType2D& p); PointType2D operator*(const T& i) const; PointType2D operator/(const T& i) const; bool operator==(const PointType2D& p) const; bool operator!=(const PointType2D& p) const; T length() const; void normalize(); void rotate(T angle); void rotate(const PointType2D& origin, T angle); void set(T _x, T _y); }; template std::ostream& operator<<(std::ostream& os, const PointType2D& p); typedef PointType2D Point; typedef PointType2D IntPoint; typedef PointType2D DoublePoint; typedef PointType2D IntPoint2D; typedef PointType2D DoublePoint2D; %template(Point) PointType2D; %template(DoublePoint) PointType2D; template class PointType3D { public: T x; T y; T z; explicit PointType3D(T _x = 0, T _y = 0, T _z = 0); PointType3D(const PointType3D& rhs); PointType3D operator+(const PointType3D& p) const; PointType3D operator-(const PointType3D& p) const; PointType3D& operator+=(const PointType3D& p); PointType3D& operator-=(const PointType3D& p); PointType3D operator*(const T& i) const; PointType3D operator/(const T& i) const; bool operator==(const PointType3D& p) const; bool operator!=(const PointType3D& p) const; T length() const; void normalize(); void set(T _x, T _y, T _z); }; template std::ostream& operator<<(std::ostream& os, const PointType3D& p); typedef PointType3D Point3D; typedef PointType3D IntPoint3D; typedef PointType3D DoublePoint3D; %template(Point3D) PointType3D; %template(DoublePoint3D) PointType3D; template class RectType { public: T x; T y; T w; T h; explicit RectType(T x = 0, T y = 0, T width = 0, T height = 0); T right() const; T bottom() const; bool operator==(const RectType& rect ) const; bool contains( const PointType2D& point ) const; bool intersects( const RectType& rect ) const; bool intersectInplace( const RectType& rect ); }; template std::ostream& operator<<(std::ostream&, const RectType&); typedef RectType Rect; typedef RectType FloatRect; typedef RectType DoubleRect; %template(Rect) RectType; %template(FloatRect) RectType; %template(DoubleRect) RectType; } namespace std { %template(FifePointVector) vector; } fifengine-0.4.2/engine/core/util/time/000077500000000000000000000000001341615052600175625ustar00rootroot00000000000000fifengine-0.4.2/engine/core/util/time/timeevent.cpp000066400000000000000000000051131341615052600222660ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes #include // 3rd party library includes #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "timemanager.h" #include "timeevent.h" namespace FIFE { TimeEvent::TimeEvent(int32_t period): m_period(period), m_last_updated(TimeManager::instance()->getTime()) { } TimeEvent::~TimeEvent() { return; } void TimeEvent::managerUpdateEvent(uint32_t time) { int32_t time_delta = static_cast(time - m_last_updated); if (m_period < 0) { return; } else if (m_period == 0 || time_delta >= m_period) { updateEvent(time_delta); m_last_updated = time; } } void TimeEvent::setPeriod(int32_t period) { m_period = period; } int32_t TimeEvent::getPeriod() { return m_period; } uint32_t TimeEvent::getLastUpdateTime() { return m_last_updated; } void TimeEvent::setLastUpdateTime(uint32_t ms) { m_last_updated = ms; } } //FIFE fifengine-0.4.2/engine/core/util/time/timeevent.h000066400000000000000000000071141341615052600217360ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_TIMEVENT_H #define FIFE_TIMEVENT_H // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/fife_stdint.h" namespace FIFE { /** Interface for events to be registered with TimeManager. * * To register a class with TimeManager firstly derive a class * from this and override the updateEvent() function. updateEvent() * will be called periodically depending on the value of getPeriod() * which can be set using the constructor or setPeriod(). A value * of -1 will never be updated, 0 will updated every frame and a value * over 0 defines the number of milliseconds between updates. * * @see TimeManager */ class TimeEvent { public: /** Default constructor. * * @param period The period of the event. See class description. */ TimeEvent(int32_t period = -1); /** Destructor. * */ virtual ~TimeEvent(); /** Update function to be overridden by client. * * @param time Time delta. */ virtual void updateEvent(uint32_t time) = 0; /** Called by TimeManager to update the event. * * @param time Current time. Used To check if its time to update. */ void managerUpdateEvent(uint32_t time); /** Set the period of the event. * * @param period The period of the event. See class description. */ void setPeriod(int32_t period); /** Get the period of the event. * * @return The period of the event. See class description. */ int32_t getPeriod(); /** Get the last time the event was updated. * * @return Time of last update. */ uint32_t getLastUpdateTime(); /** Set the last time the event was updated. * * @param ms Time of last update. */ void setLastUpdateTime(uint32_t ms); private: // The period of the event. See the class description. int32_t m_period; // The last time the class was updated. uint32_t m_last_updated; }; }//FIFE #endif fifengine-0.4.2/engine/core/util/time/timeevent.i000066400000000000000000000035671341615052600217470ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fife %{ #include "util/time/timeevent.h" %} namespace FIFE { %feature("director") TimeEvent; class TimeEvent { public: TimeEvent(int32_t period = -1); virtual ~TimeEvent(); virtual void updateEvent(uint32_t time) = 0; void setPeriod(int32_t period); int32_t getPeriod(); uint32_t getLastUpdateTime(); void setLastUpdateTime(uint32_t); }; } fifengine-0.4.2/engine/core/util/time/timemanager.cpp000066400000000000000000000075071341615052600225700ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes #include #include // 3rd party library includes #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/log/logger.h" #include "timeevent.h" #include "timemanager.h" namespace FIFE { static const uint32_t UNDEFINED_TIME_DELTA = 999999; static Logger _log(LM_UTIL); TimeManager::TimeManager(): m_current_time (0), m_time_delta(UNDEFINED_TIME_DELTA), m_average_frame_time(0) { } TimeManager::~TimeManager() { } void TimeManager::update() { // if first update... double avg_multiplier = 0.985; if (m_current_time == 0) { m_current_time = SDL_GetTicks(); avg_multiplier = 0; m_time_delta = 0; } else { m_time_delta = m_current_time; m_current_time = SDL_GetTicks(); m_time_delta = m_current_time - m_time_delta; } m_average_frame_time = m_average_frame_time * avg_multiplier + double(m_time_delta) * (1.0 - avg_multiplier); // Update live events. // // It is very important to NOT use iterators (over a vector) // here, as an event might add enough events to resize the vector. // -> Ugly segfault for (size_t i = 0; i < m_events_list.size(); ++i) { TimeEvent* event = m_events_list[ i ]; if( event ) { event->managerUpdateEvent(m_current_time); } } // Remove dead events std::vector::iterator it; it = std::remove( m_events_list.begin(), m_events_list.end(), static_cast(0)); m_events_list.erase( it, m_events_list.end()); } void TimeManager::registerEvent(TimeEvent* event) { // Register. m_events_list.push_back(event); } void TimeManager::unregisterEvent(TimeEvent* event) { // Unregister. for (size_t i = 0; i < m_events_list.size(); ++i) { TimeEvent*& event_i = m_events_list[ i ]; if( event_i == event) { event_i = 0; return; } } } uint32_t TimeManager::getTime() const { return m_current_time; } uint32_t TimeManager::getTimeDelta() const { return m_time_delta; } double TimeManager::getAverageFrameTime() const { return m_average_frame_time; } void TimeManager::printStatistics() const { FL_LOG(_log, LMsg("Timers: ") << m_events_list.size()); } } //FIFE fifengine-0.4.2/engine/core/util/time/timemanager.h000066400000000000000000000071011341615052600222230ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_TIMEMANAGER_H #define FIFE_TIMEMANAGER_H // Standard C++ library includes #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/singleton.h" #include "util/base/fife_stdint.h" namespace FIFE { class TimeEvent; /** Time Manager * * This class is in charge of storing the current time, * average frame time, as well as controlling periodic events. * Users of this class will have to manually register and * unregister events. * * @see TimeEvent */ class TimeManager : public DynamicSingleton { public: /** Default constructor. */ TimeManager(); /** Destructor. */ virtual ~TimeManager(); /** Called once a frame and updates the timer objects and events. */ void update(); /** Adds a TimeEvent. * * The event will be updated regularly, depending on its settings. * @param event The TimeEvent object to be added. */ void registerEvent(TimeEvent* event); /** Removes a TimeEvent. * * Removes an event from the list. It will not be deleted. * @param event The TimeEvent object to be removed. */ void unregisterEvent(TimeEvent* event); /** Get the time. * * @return The time in milliseconds. */ uint32_t getTime() const; /** Get the time since the last frame. * * @return Time since last frame in milliseconds. */ uint32_t getTimeDelta() const; /** Gets average frame time * * @return Average frame time in milliseconds. */ double getAverageFrameTime() const; /** Prints Timer statistics */ void printStatistics() const; private: /// Current time in milliseconds. uint32_t m_current_time; /// Time since last frame in milliseconds. uint32_t m_time_delta; /// Average frame time in milliseconds. double m_average_frame_time; /// List of active TimeEvents. std::vector m_events_list; }; }//FIFE #endif fifengine-0.4.2/engine/core/util/time/timemanager.i000066400000000000000000000036341341615052600222330ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fife %{ #include "util/time/timemanager.h" %} namespace FIFE { class TimeEvent; class TimeManager { public: TimeManager(); virtual ~TimeManager(); void update(); uint32_t getTime() const; uint32_t getTimeDelta() const; double getAverageFrameTime() const; void printStatistics() const; void registerEvent(TimeEvent* event); void unregisterEvent(TimeEvent* event); }; } fifengine-0.4.2/engine/core/util/time/timer.cpp000066400000000000000000000050611341615052600214100ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "timemanager.h" #include "timer.h" namespace FIFE { // Remember TimeEvent(-1) means that even a registered event won't be called Timer::Timer() : TimeEvent(-1), m_active(false) { } Timer::~Timer() { stop(); } void Timer::start() { if(m_active) return; setLastUpdateTime( TimeManager::instance()->getTime() ); TimeManager::instance()->registerEvent(this); m_active = true; } void Timer::stop() { if(!m_active) return; TimeManager::instance()->unregisterEvent(this); m_active = false; } void Timer::setInterval(int32_t msec) { setPeriod(msec); stop(); } void Timer::setCallback(const type_callback& cb) { m_callback = cb; } void Timer::updateEvent(uint32_t) { if(!m_active) return; if( m_callback ) { m_callback(); } } } fifengine-0.4.2/engine/core/util/time/timer.h000066400000000000000000000071641341615052600210630ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_TIMER_H #define FIFE_TIMER_H // Standard C++ library includes #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "timeevent.h" namespace FIFE { /** Simple Timer class * * This is a simple wrapper around the TimeEvent, * which makes the later usable without having to * subclass it every time. * * @code * m_timer.setInterval(1000); * m_timer.setCallback(std::bind(&Class::update, this) ); * m_timer.start(); * @endcode * * @warning Note that the callback must be available * when it is triggered. If your called function is a * bound member function and it goes out of scope, * when the callback is called you'll most likely * have a segfault. So this is best used as a member * calling an update function. * * @note You don't have to call TimeManager::registerEvent @b ever * * @see Console */ class Timer : protected TimeEvent { public: typedef std::function type_callback; /** Default constructor. * * Constructs an idle timer, use @see setInterval and @see setCallback * to set it up for use. */ Timer(); /** Destructor. * * Stops and destroys the timer. */ virtual ~Timer(); /** Set the interval in milliseconds * * @param msec The interval * If you use an intervall 0 the timer will fire every frame. */ void setInterval(int32_t msec); /** Start the timer * * Without calling this function, nothing will happen. * It is save to call this more than once. */ void start(); /** Stop the timer * * Stops execution of the callback * It is save to call this more than once. */ void stop(); /** Set the callback that will be called * * @param callback A @c std::function returning void */ void setCallback(const type_callback& callback); protected: bool m_active; type_callback m_callback; void updateEvent(uint32_t); }; }//FIFE #endif fifengine-0.4.2/engine/core/util/utf8/000077500000000000000000000000001341615052600175125ustar00rootroot00000000000000fifengine-0.4.2/engine/core/util/utf8/utf8.h000066400000000000000000000027611341615052600205570ustar00rootroot00000000000000// Copyright 2006 Nemanja Trifunovic /* Permission is hereby granted, free of charge, to any person or organization obtaining a copy of the software and accompanying documentation covered by this license (the "Software") to use, reproduce, display, distribute, execute, and transmit the Software, and to prepare derivative works of the Software, and to permit third-parties to whom the Software is furnished to do so, all subject to the following: The copyright notices in the Software and this entire statement, including the above license grant, this restriction and the following disclaimer, must be included in all copies of the Software, in whole or in part, and all derivative works of the Software, unless such copies or derivative works are solely in the form of machine-executable object code generated by a source language processor. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef UTF8_FOR_CPP_2675DCD0_9480_4c0c_B92A_CC14C027B731 #define UTF8_FOR_CPP_2675DCD0_9480_4c0c_B92A_CC14C027B731 #include "utf8/checked.h" #include "utf8/unchecked.h" #endif // header guard fifengine-0.4.2/engine/core/util/utf8/utf8/000077500000000000000000000000001341615052600204005ustar00rootroot00000000000000fifengine-0.4.2/engine/core/util/utf8/utf8/checked.h000066400000000000000000000276141341615052600221510ustar00rootroot00000000000000// Copyright 2006 Nemanja Trifunovic /* Permission is hereby granted, free of charge, to any person or organization obtaining a copy of the software and accompanying documentation covered by this license (the "Software") to use, reproduce, display, distribute, execute, and transmit the Software, and to prepare derivative works of the Software, and to permit third-parties to whom the Software is furnished to do so, all subject to the following: The copyright notices in the Software and this entire statement, including the above license grant, this restriction and the following disclaimer, must be included in all copies of the Software, in whole or in part, and all derivative works of the Software, unless such copies or derivative works are solely in the form of machine-executable object code generated by a source language processor. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef UTF8_FOR_CPP_CHECKED_H_2675DCD0_9480_4c0c_B92A_CC14C027B731 #define UTF8_FOR_CPP_CHECKED_H_2675DCD0_9480_4c0c_B92A_CC14C027B731 #include "core.h" #include namespace utf8 { // Base for the exceptions that may be thrown from the library class exception : public ::std::exception { }; // Exceptions that may be thrown from the library functions. class invalid_code_point : public exception { uint32_t cp; public: invalid_code_point(uint32_t cp) : cp(cp) {} virtual const char* what() const throw() { return "Invalid code point"; } uint32_t code_point() const {return cp;} }; class invalid_utf8 : public exception { uint8_t u8; public: invalid_utf8 (uint8_t u) : u8(u) {} virtual const char* what() const throw() { return "Invalid UTF-8"; } uint8_t utf8_octet() const {return u8;} }; class invalid_utf16 : public exception { uint16_t u16; public: invalid_utf16 (uint16_t u) : u16(u) {} virtual const char* what() const throw() { return "Invalid UTF-16"; } uint16_t utf16_word() const {return u16;} }; class not_enough_room : public exception { public: virtual const char* what() const throw() { return "Not enough space"; } }; /// The library API - functions intended to be called by the users template octet_iterator append(uint32_t cp, octet_iterator result) { if (!utf8::internal::is_code_point_valid(cp)) throw invalid_code_point(cp); if (cp < 0x80) // one octet *(result++) = static_cast(cp); else if (cp < 0x800) { // two octets *(result++) = static_cast((cp >> 6) | 0xc0); *(result++) = static_cast((cp & 0x3f) | 0x80); } else if (cp < 0x10000) { // three octets *(result++) = static_cast((cp >> 12) | 0xe0); *(result++) = static_cast(((cp >> 6) & 0x3f) | 0x80); *(result++) = static_cast((cp & 0x3f) | 0x80); } else { // four octets *(result++) = static_cast((cp >> 18) | 0xf0); *(result++) = static_cast(((cp >> 12) & 0x3f) | 0x80); *(result++) = static_cast(((cp >> 6) & 0x3f) | 0x80); *(result++) = static_cast((cp & 0x3f) | 0x80); } return result; } template output_iterator replace_invalid(octet_iterator start, octet_iterator end, output_iterator out, uint32_t replacement) { while (start != end) { octet_iterator sequence_start = start; internal::utf_error err_code = utf8::internal::validate_next(start, end); switch (err_code) { case internal::UTF8_OK : for (octet_iterator it = sequence_start; it != start; ++it) *out++ = *it; break; case internal::NOT_ENOUGH_ROOM: throw not_enough_room(); case internal::INVALID_LEAD: out = utf8::append (replacement, out); ++start; break; case internal::INCOMPLETE_SEQUENCE: case internal::OVERLONG_SEQUENCE: case internal::INVALID_CODE_POINT: out = utf8::append (replacement, out); ++start; // just one replacement mark for the sequence while (start != end && utf8::internal::is_trail(*start)) ++start; break; } } return out; } template inline output_iterator replace_invalid(octet_iterator start, octet_iterator end, output_iterator out) { static const uint32_t replacement_marker = utf8::internal::mask16(0xfffd); return utf8::replace_invalid(start, end, out, replacement_marker); } template uint32_t next(octet_iterator& it, octet_iterator end) { uint32_t cp = 0; internal::utf_error err_code = utf8::internal::validate_next(it, end, cp); switch (err_code) { case internal::UTF8_OK : break; case internal::NOT_ENOUGH_ROOM : throw not_enough_room(); case internal::INVALID_LEAD : case internal::INCOMPLETE_SEQUENCE : case internal::OVERLONG_SEQUENCE : throw invalid_utf8(*it); case internal::INVALID_CODE_POINT : throw invalid_code_point(cp); } return cp; } template uint32_t peek_next(octet_iterator it, octet_iterator end) { return utf8::next(it, end); } template uint32_t prior(octet_iterator& it, octet_iterator start) { // can't do much if it == start if (it == start) throw not_enough_room(); octet_iterator end = it; // Go back until we hit either a lead octet or start while (utf8::internal::is_trail(*(--it))) if (it == start) throw invalid_utf8(*it); // error - no lead byte in the sequence return utf8::peek_next(it, end); } /// Deprecated in versions that include "prior" template uint32_t previous(octet_iterator& it, octet_iterator pass_start) { octet_iterator end = it; while (utf8::internal::is_trail(*(--it))) if (it == pass_start) throw invalid_utf8(*it); // error - no lead byte in the sequence octet_iterator temp = it; return utf8::next(temp, end); } template void advance (octet_iterator& it, distance_type n, octet_iterator end) { for (distance_type i = 0; i < n; ++i) utf8::next(it, end); } template typename std::iterator_traits::difference_type distance (octet_iterator first, octet_iterator last) { typename std::iterator_traits::difference_type dist; for (dist = 0; first < last; ++dist) utf8::next(first, last); return dist; } template octet_iterator utf16to8 (u16bit_iterator start, u16bit_iterator end, octet_iterator result) { while (start != end) { uint32_t cp = utf8::internal::mask16(*start++); // Take care of surrogate pairs first if (utf8::internal::is_lead_surrogate(cp)) { if (start != end) { uint32_t trail_surrogate = utf8::internal::mask16(*start++); if (utf8::internal::is_trail_surrogate(trail_surrogate)) cp = (cp << 10) + trail_surrogate + internal::SURROGATE_OFFSET; else throw invalid_utf16(static_cast(trail_surrogate)); } else throw invalid_utf16(static_cast(cp)); } // Lone trail surrogate else if (utf8::internal::is_trail_surrogate(cp)) throw invalid_utf16(static_cast(cp)); result = utf8::append(cp, result); } return result; } template u16bit_iterator utf8to16 (octet_iterator start, octet_iterator end, u16bit_iterator result) { while (start != end) { uint32_t cp = utf8::next(start, end); if (cp > 0xffff) { //make a surrogate pair *result++ = static_cast((cp >> 10) + internal::LEAD_OFFSET); *result++ = static_cast((cp & 0x3ff) + internal::TRAIL_SURROGATE_MIN); } else *result++ = static_cast(cp); } return result; } template octet_iterator utf32to8 (u32bit_iterator start, u32bit_iterator end, octet_iterator result) { while (start != end) result = utf8::append(*(start++), result); return result; } template u32bit_iterator utf8to32 (octet_iterator start, octet_iterator end, u32bit_iterator result) { while (start != end) (*result++) = utf8::next(start, end); return result; } // The iterator class template class iterator : public std::iterator { octet_iterator it; octet_iterator range_start; octet_iterator range_end; public: iterator () {} explicit iterator (const octet_iterator& octet_it, const octet_iterator& range_start, const octet_iterator& range_end) : it(octet_it), range_start(range_start), range_end(range_end) { if (it < range_start || it > range_end) throw std::out_of_range("Invalid utf-8 iterator position"); } // the default "big three" are OK octet_iterator base () const { return it; } uint32_t operator * () const { octet_iterator temp = it; return utf8::next(temp, range_end); } bool operator == (const iterator& rhs) const { if (range_start != rhs.range_start || range_end != rhs.range_end) throw std::logic_error("Comparing utf-8 iterators defined with different ranges"); return (it == rhs.it); } bool operator != (const iterator& rhs) const { return !(operator == (rhs)); } iterator& operator ++ () { utf8::next(it, range_end); return *this; } iterator operator ++ (int) { iterator temp = *this; utf8::next(it, range_end); return temp; } iterator& operator -- () { utf8::prior(it, range_start); return *this; } iterator operator -- (int) { iterator temp = *this; utf8::prior(it, range_start); return temp; } }; // class iterator } // namespace utf8 #endif //header guard fifengine-0.4.2/engine/core/util/utf8/utf8/core.h000066400000000000000000000247111341615052600215060ustar00rootroot00000000000000// Copyright 2006 Nemanja Trifunovic /* Permission is hereby granted, free of charge, to any person or organization obtaining a copy of the software and accompanying documentation covered by this license (the "Software") to use, reproduce, display, distribute, execute, and transmit the Software, and to prepare derivative works of the Software, and to permit third-parties to whom the Software is furnished to do so, all subject to the following: The copyright notices in the Software and this entire statement, including the above license grant, this restriction and the following disclaimer, must be included in all copies of the Software, in whole or in part, and all derivative works of the Software, unless such copies or derivative works are solely in the form of machine-executable object code generated by a source language processor. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef UTF8_FOR_CPP_CORE_H_2675DCD0_9480_4c0c_B92A_CC14C027B731 #define UTF8_FOR_CPP_CORE_H_2675DCD0_9480_4c0c_B92A_CC14C027B731 #include namespace utf8 { // The typedefs for 8-bit, 16-bit and 32-bit unsigned integers // You may need to change them to match your system. // These typedefs have the same names as ones from cstdint, or boost/cstdint typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned int uint32_t; // Helper code - not intended to be directly called by the library users. May be changed at any time namespace internal { // Unicode constants // Leading (high) surrogates: 0xd800 - 0xdbff // Trailing (low) surrogates: 0xdc00 - 0xdfff const uint16_t LEAD_SURROGATE_MIN = 0xd800u; const uint16_t LEAD_SURROGATE_MAX = 0xdbffu; const uint16_t TRAIL_SURROGATE_MIN = 0xdc00u; const uint16_t TRAIL_SURROGATE_MAX = 0xdfffu; const uint16_t LEAD_OFFSET = LEAD_SURROGATE_MIN - (0x10000 >> 10); const uint32_t SURROGATE_OFFSET = 0x10000u - (LEAD_SURROGATE_MIN << 10) - TRAIL_SURROGATE_MIN; // Maximum valid value for a Unicode code point const uint32_t CODE_POINT_MAX = 0x0010ffffu; template inline uint8_t mask8(octet_type oc) { return static_cast(0xff & oc); } template inline uint16_t mask16(u16_type oc) { return static_cast(0xffff & oc); } template inline bool is_trail(octet_type oc) { return ((utf8::internal::mask8(oc) >> 6) == 0x2); } template inline bool is_lead_surrogate(u16 cp) { return (cp >= LEAD_SURROGATE_MIN && cp <= LEAD_SURROGATE_MAX); } template inline bool is_trail_surrogate(u16 cp) { return (cp >= TRAIL_SURROGATE_MIN && cp <= TRAIL_SURROGATE_MAX); } template inline bool is_surrogate(u16 cp) { return (cp >= LEAD_SURROGATE_MIN && cp <= TRAIL_SURROGATE_MAX); } template inline bool is_code_point_valid(u32 cp) { return (cp <= CODE_POINT_MAX && !utf8::internal::is_surrogate(cp)); } template inline typename std::iterator_traits::difference_type sequence_length(octet_iterator lead_it) { uint8_t lead = utf8::internal::mask8(*lead_it); if (lead < 0x80) return 1; else if ((lead >> 5) == 0x6) return 2; else if ((lead >> 4) == 0xe) return 3; else if ((lead >> 3) == 0x1e) return 4; else return 0; } template inline bool is_overlong_sequence(uint32_t cp, octet_difference_type length) { if (cp < 0x80) { if (length != 1) return true; } else if (cp < 0x800) { if (length != 2) return true; } else if (cp < 0x10000) { if (length != 3) return true; } return false; } enum utf_error {UTF8_OK, NOT_ENOUGH_ROOM, INVALID_LEAD, INCOMPLETE_SEQUENCE, OVERLONG_SEQUENCE, INVALID_CODE_POINT}; /// Helper for get_sequence_x template utf_error increase_safely(octet_iterator& it, octet_iterator end) { if (++it == end) return NOT_ENOUGH_ROOM; if (!utf8::internal::is_trail(*it)) return INCOMPLETE_SEQUENCE; return UTF8_OK; } #define UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(IT, END) {utf_error ret = increase_safely(IT, END); if (ret != UTF8_OK) return ret;} /// get_sequence_x functions decode utf-8 sequences of the length x template utf_error get_sequence_1(octet_iterator& it, octet_iterator end, uint32_t& code_point) { if (it == end) return NOT_ENOUGH_ROOM; code_point = utf8::internal::mask8(*it); return UTF8_OK; } template utf_error get_sequence_2(octet_iterator& it, octet_iterator end, uint32_t& code_point) { if (it == end) return NOT_ENOUGH_ROOM; code_point = utf8::internal::mask8(*it); UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end) code_point = ((code_point << 6) & 0x7ff) + ((*it) & 0x3f); return UTF8_OK; } template utf_error get_sequence_3(octet_iterator& it, octet_iterator end, uint32_t& code_point) { if (it == end) return NOT_ENOUGH_ROOM; code_point = utf8::internal::mask8(*it); UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end) code_point = ((code_point << 12) & 0xffff) + ((utf8::internal::mask8(*it) << 6) & 0xfff); UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end) code_point += (*it) & 0x3f; return UTF8_OK; } template utf_error get_sequence_4(octet_iterator& it, octet_iterator end, uint32_t& code_point) { if (it == end) return NOT_ENOUGH_ROOM; code_point = utf8::internal::mask8(*it); UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end) code_point = ((code_point << 18) & 0x1fffff) + ((utf8::internal::mask8(*it) << 12) & 0x3ffff); UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end) code_point += (utf8::internal::mask8(*it) << 6) & 0xfff; UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end) code_point += (*it) & 0x3f; return UTF8_OK; } #undef UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR template utf_error validate_next(octet_iterator& it, octet_iterator end, uint32_t& code_point) { // Save the original value of it so we can go back in case of failure // Of course, it does not make much sense with i.e. stream iterators octet_iterator original_it = it; uint32_t cp = 0; // Determine the sequence length based on the lead octet typedef typename std::iterator_traits::difference_type octet_difference_type; const octet_difference_type length = utf8::internal::sequence_length(it); // Get trail octets and calculate the code point utf_error err = UTF8_OK; switch (length) { case 0: return INVALID_LEAD; case 1: err = utf8::internal::get_sequence_1(it, end, cp); break; case 2: err = utf8::internal::get_sequence_2(it, end, cp); break; case 3: err = utf8::internal::get_sequence_3(it, end, cp); break; case 4: err = utf8::internal::get_sequence_4(it, end, cp); break; } if (err == UTF8_OK) { // Decoding succeeded. Now, security checks... if (utf8::internal::is_code_point_valid(cp)) { if (!utf8::internal::is_overlong_sequence(cp, length)){ // Passed! Return here. code_point = cp; ++it; return UTF8_OK; } else err = OVERLONG_SEQUENCE; } else err = INVALID_CODE_POINT; } // Failure branch - restore the original value of the iterator it = original_it; return err; } template inline utf_error validate_next(octet_iterator& it, octet_iterator end) { uint32_t ignored; return utf8::internal::validate_next(it, end, ignored); } } // namespace internal /// The library API - functions intended to be called by the users // Byte order mark const uint8_t bom[] = {0xef, 0xbb, 0xbf}; template octet_iterator find_invalid(octet_iterator start, octet_iterator end) { octet_iterator result = start; while (result != end) { utf8::internal::utf_error err_code = utf8::internal::validate_next(result, end); if (err_code != internal::UTF8_OK) return result; } return result; } template inline bool is_valid(octet_iterator start, octet_iterator end) { return (utf8::find_invalid(start, end) == end); } template inline bool starts_with_bom (octet_iterator it, octet_iterator end) { return ( ((it != end) && (utf8::internal::mask8(*it++)) == bom[0]) && ((it != end) && (utf8::internal::mask8(*it++)) == bom[1]) && ((it != end) && (utf8::internal::mask8(*it)) == bom[2]) ); } //Deprecated in release 2.3 template inline bool is_bom (octet_iterator it) { return ( (utf8::internal::mask8(*it++)) == bom[0] && (utf8::internal::mask8(*it++)) == bom[1] && (utf8::internal::mask8(*it)) == bom[2] ); } } // namespace utf8 #endif // header guard fifengine-0.4.2/engine/core/util/utf8/utf8/unchecked.h000066400000000000000000000213131341615052600225020ustar00rootroot00000000000000// Copyright 2006 Nemanja Trifunovic /* Permission is hereby granted, free of charge, to any person or organization obtaining a copy of the software and accompanying documentation covered by this license (the "Software") to use, reproduce, display, distribute, execute, and transmit the Software, and to prepare derivative works of the Software, and to permit third-parties to whom the Software is furnished to do so, all subject to the following: The copyright notices in the Software and this entire statement, including the above license grant, this restriction and the following disclaimer, must be included in all copies of the Software, in whole or in part, and all derivative works of the Software, unless such copies or derivative works are solely in the form of machine-executable object code generated by a source language processor. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef UTF8_FOR_CPP_UNCHECKED_H_2675DCD0_9480_4c0c_B92A_CC14C027B731 #define UTF8_FOR_CPP_UNCHECKED_H_2675DCD0_9480_4c0c_B92A_CC14C027B731 #include "core.h" namespace utf8 { namespace unchecked { template octet_iterator append(uint32_t cp, octet_iterator result) { if (cp < 0x80) // one octet *(result++) = static_cast(cp); else if (cp < 0x800) { // two octets *(result++) = static_cast((cp >> 6) | 0xc0); *(result++) = static_cast((cp & 0x3f) | 0x80); } else if (cp < 0x10000) { // three octets *(result++) = static_cast((cp >> 12) | 0xe0); *(result++) = static_cast(((cp >> 6) & 0x3f) | 0x80); *(result++) = static_cast((cp & 0x3f) | 0x80); } else { // four octets *(result++) = static_cast((cp >> 18) | 0xf0); *(result++) = static_cast(((cp >> 12) & 0x3f)| 0x80); *(result++) = static_cast(((cp >> 6) & 0x3f) | 0x80); *(result++) = static_cast((cp & 0x3f) | 0x80); } return result; } template uint32_t next(octet_iterator& it) { uint32_t cp = utf8::internal::mask8(*it); typename std::iterator_traits::difference_type length = utf8::internal::sequence_length(it); switch (length) { case 1: break; case 2: it++; cp = ((cp << 6) & 0x7ff) + ((*it) & 0x3f); break; case 3: ++it; cp = ((cp << 12) & 0xffff) + ((utf8::internal::mask8(*it) << 6) & 0xfff); ++it; cp += (*it) & 0x3f; break; case 4: ++it; cp = ((cp << 18) & 0x1fffff) + ((utf8::internal::mask8(*it) << 12) & 0x3ffff); ++it; cp += (utf8::internal::mask8(*it) << 6) & 0xfff; ++it; cp += (*it) & 0x3f; break; } ++it; return cp; } template uint32_t peek_next(octet_iterator it) { return utf8::unchecked::next(it); } template uint32_t prior(octet_iterator& it) { while (utf8::internal::is_trail(*(--it))) ; octet_iterator temp = it; return utf8::unchecked::next(temp); } // Deprecated in versions that include prior, but only for the sake of consistency (see utf8::previous) template inline uint32_t previous(octet_iterator& it) { return utf8::unchecked::prior(it); } template void advance (octet_iterator& it, distance_type n) { for (distance_type i = 0; i < n; ++i) utf8::unchecked::next(it); } template typename std::iterator_traits::difference_type distance (octet_iterator first, octet_iterator last) { typename std::iterator_traits::difference_type dist; for (dist = 0; first < last; ++dist) utf8::unchecked::next(first); return dist; } template octet_iterator utf16to8 (u16bit_iterator start, u16bit_iterator end, octet_iterator result) { while (start != end) { uint32_t cp = utf8::internal::mask16(*start++); // Take care of surrogate pairs first if (utf8::internal::is_lead_surrogate(cp)) { uint32_t trail_surrogate = utf8::internal::mask16(*start++); cp = (cp << 10) + trail_surrogate + internal::SURROGATE_OFFSET; } result = utf8::unchecked::append(cp, result); } return result; } template u16bit_iterator utf8to16 (octet_iterator start, octet_iterator end, u16bit_iterator result) { while (start < end) { uint32_t cp = utf8::unchecked::next(start); if (cp > 0xffff) { //make a surrogate pair *result++ = static_cast((cp >> 10) + internal::LEAD_OFFSET); *result++ = static_cast((cp & 0x3ff) + internal::TRAIL_SURROGATE_MIN); } else *result++ = static_cast(cp); } return result; } template octet_iterator utf32to8 (u32bit_iterator start, u32bit_iterator end, octet_iterator result) { while (start != end) result = utf8::unchecked::append(*(start++), result); return result; } template u32bit_iterator utf8to32 (octet_iterator start, octet_iterator end, u32bit_iterator result) { while (start < end) (*result++) = utf8::unchecked::next(start); return result; } // The iterator class template class iterator : public std::iterator { octet_iterator it; public: iterator () {} explicit iterator (const octet_iterator& octet_it): it(octet_it) {} // the default "big three" are OK octet_iterator base () const { return it; } uint32_t operator * () const { octet_iterator temp = it; return utf8::unchecked::next(temp); } bool operator == (const iterator& rhs) const { return (it == rhs.it); } bool operator != (const iterator& rhs) const { return !(operator == (rhs)); } iterator& operator ++ () { ::std::advance(it, utf8::internal::sequence_length(it)); return *this; } iterator operator ++ (int) { iterator temp = *this; ::std::advance(it, utf8::internal::sequence_length(it)); return temp; } iterator& operator -- () { utf8::unchecked::prior(it); return *this; } iterator operator -- (int) { iterator temp = *this; utf8::unchecked::prior(it); return temp; } }; // class iterator } // namespace utf8::unchecked } // namespace utf8 #endif // header guard fifengine-0.4.2/engine/core/version.h.in000066400000000000000000000055641341615052600201240ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_VERSION_H #define FIFE_VERSION_H /** * These version numbers are updated as part of the release process. * * The file "version.h.in" is a template file with placeholder tokens. * CMake replaces these tokens during the project configuration phase * and creates the file "version.h", see CMakeLists.txt. */ #define FIFE_VERSION "@FIFE_VERSION@" #define FIFE_VERSION_SHORT "@FIFE_VERSION_SHORT@" #define FIFE_MAJOR_VERSION @FIFE_MAJOR_VERSION@ #define FIFE_MINOR_VERSION @FIFE_MINOR_VERSION@ #define FIFE_PATCH_VERSION @FIFE_PATCH_VERSION@ #define FIFE_GIT_HASH "@FIFE_GIT_HASH@" /** * All FIFE related code is in the "FIFE" namespace. * The namespace "fcn" (fifechan) is used for our custom widgets. */ namespace FIFE { inline const char* getVersion() { return FIFE_VERSION; } inline const char* getVersionShort() { return FIFE_VERSION_SHORT; } inline int getMajor() { return FIFE_MAJOR_VERSION; } inline int getMinor() { return FIFE_MINOR_VERSION; } inline int getPatch() { return FIFE_PATCH_VERSION; } inline const char* getHash() { return FIFE_GIT_HASH; } inline const int getVersionId() { return FIFE_MAJOR_VERSION * 10000 + FIFE_MINOR_VERSION * 100 + FIFE_PATCH_VERSION; // 3.2.1 = 30201 } } //FIFE #endif //FIFE_VERSION_H fifengine-0.4.2/engine/core/version.i000066400000000000000000000034571341615052600175170ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fife %{ #include "version.h" %} namespace FIFE { inline const char* getVersion(); inline const char* getVersionShort(); inline int getMajor(); inline int getMinor(); inline int getPatch(); inline const char* getHash(); inline const int getVersionId(); } //FIFE fifengine-0.4.2/engine/core/vfs/000077500000000000000000000000001341615052600164455ustar00rootroot00000000000000fifengine-0.4.2/engine/core/vfs/dat/000077500000000000000000000000001341615052600172155ustar00rootroot00000000000000fifengine-0.4.2/engine/core/vfs/dat/dat1.cpp000066400000000000000000000121531341615052600205540ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "vfs/raw/rawdata.h" #include "util/base/exception.h" #include "util/log/logger.h" #include "dat1.h" namespace FIFE { static Logger _log(LM_FO_LOADERS); DAT1::DAT1(VFS* vfs, const std::string& file) : VFSSource(vfs), m_datpath(file), m_data(vfs->open(file)) { FL_LOG(_log, LMsg("MFFalloutDAT1") << "loading: " << file << " filesize: " << m_data->getDataLength()); m_data->setIndex(0); const uint32_t dircount = m_data->read32Big(); m_data->moveIndex(4*3); FL_LOG(_log, LMsg("MFFalloutDAT1") << "number of directories " << dircount); // Sanity check. Each dir entry needs min. 16 bytes. if( dircount*16 > m_data->getDataLength() ) { throw InvalidFormat("directory count larger than filesize."); } std::list dir_names; for (uint32_t i = 0; i < dircount; ++i) { std::string name = readString(); if (name == ".") { name = ""; } dir_names.push_back(name); } for(std::list::iterator i= dir_names.begin(); i!= dir_names.end(); ++i) loadFileList(*i); } void DAT1::loadFileList(const std::string& dirname) { const uint32_t filecount = m_data->read32Big(); m_data->moveIndex(4*3); for (uint32_t i = 0; i < filecount; ++i) { RawDataDAT1::s_info info; info.name = fixPath(dirname + "/" + readString()); info.type = m_data->read32Big(); info.offset = m_data->read32Big(); info.unpackedLength = m_data->read32Big(); info.packedLength = m_data->read32Big(); m_filelist.insert(std::make_pair(info.name, info)); } } std::string DAT1::readString() { uint8_t length = m_data->read8(); return m_data->readString(length); } RawData* DAT1::open(const std::string& file) const { const RawDataDAT1::s_info& info = getInfo(file); return new RawData(new RawDataDAT1(getVFS(), m_datpath, info)); } bool DAT1::fileExists(const std::string& name) const { return m_filelist.find(name) != m_filelist.end(); } const RawDataDAT1::s_info& DAT1::getInfo(const std::string& name) const { type_filelist::const_iterator i = m_filelist.find(name); if (i == m_filelist.end()) throw NotFound(name); return i->second; } std::set DAT1::listFiles(const std::string& pathstr) const { return list(pathstr, false); } std::set DAT1::listDirectories(const std::string& pathstr) const { return list(pathstr, true); } std::set DAT1::list(const std::string& pathstr, bool dirs) const { std::set list; std::string path = pathstr; // Normalize the path if (path.find("./") == 0) { path.erase(0, 2); } size_t lastIndex = path.size(); if (lastIndex != 0 && path[lastIndex-1] != '/') { path += '/'; } type_filelist::const_iterator end = m_filelist.end(); for (type_filelist::const_iterator i = m_filelist.begin(); i != end; ++i) { const std::string& file = i->first; if (file.find(path) == 0) { std::string cleanedfile = file.substr(path.size(), file.size()); // strip the pathstr bool isdir = cleanedfile.find('/') != std::string::npos; // if we still have a / it's a subdir if (isdir) { cleanedfile = cleanedfile.substr(0, cleanedfile.find('/')); if (cleanedfile.find('/') != cleanedfile.rfind('/')) { // check if this is a direct subdir continue; } } if (isdir == dirs) { list.insert(cleanedfile); } } } return list; } } // FIFE fifengine-0.4.2/engine/core/vfs/dat/dat1.h000066400000000000000000000066011341615052600202220ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_MAP_LOADERS_FALLOUT_DAT1_H #define FIFE_MAP_LOADERS_FALLOUT_DAT1_H // Standard C++ library includes #include #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "vfs/vfs.h" #include "vfs/vfssource.h" #include "rawdatadat1.h" namespace FIFE { /** VFSource for the Fallout1 DAT file format. */ class DAT1 : public VFSSource { public: /** Constructor * Create a VFSSource for a Fallout1 DAT file. * @param vfs A pointer to the VFS. * @param file A Fallout1 DAT file - e.g. master.DAT */ DAT1(VFS* vfs, const std::string& file); bool fileExists(const std::string& name) const; RawData* open(const std::string& file) const; /** Get the needed information to unpack and extract a file from the * DAT file. * Retrieves the Information needed to extract a specific file, this * is passed as argument to a mffalloutrawdatadat1 RawMemSource, * which itself fills its memory content with the unpacked file. * * @throw NotFound * @see MFFalloutRawDataDAT1, RawMemSource */ const RawDataDAT1::s_info& getInfo(const std::string& name) const; std::set listFiles(const std::string& pathstr) const; std::set listDirectories(const std::string& pathstr) const; private: std::string m_datpath; std::unique_ptr m_data; typedef std::map type_filelist; type_filelist m_filelist; std::set list(const std::string& pathstr, bool dirs) const; std::string readString(); void loadFileList(const std::string& dirname); // Not copyable DAT1(const DAT1&); DAT1& operator=(const DAT1&); }; } // FIFE #endif fifengine-0.4.2/engine/core/vfs/dat/dat2.cpp000066400000000000000000000153621341615052600205620ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "vfs/raw/rawdata.h" #include "util/base/exception.h" #include "util/log/logger.h" #include "dat2.h" namespace FIFE { /** Logger to use for this source file. * @relates Logger */ static Logger _log(LM_FO_LOADERS); DAT2::DAT2(VFS* vfs, const std::string& file) : VFSSource(vfs), m_datpath(file), m_data(vfs->open(file)), m_filelist() { FL_LOG(_log, LMsg("MFFalloutDAT2") << "loading: " << file << " filesize: " << m_data->getDataLength()); m_data->setIndex(m_data->getDataLength() - 8); uint32_t fileListLength = m_data->read32Little(); uint32_t archiveSize = m_data->read32Little(); FL_LOG(_log, LMsg("MFFalloutDAT2") << "FileListLength: " << fileListLength << " ArchiveSize: " << archiveSize); if (archiveSize != m_data->getDataLength()) throw InvalidFormat("size mismatch"); m_data->setIndex( archiveSize - fileListLength - 8); m_filecount = m_data->read32Little(); m_currentIndex = m_data->getCurrentIndex(); FL_LOG(_log, LMsg("MFFalloutDAT2 FileCount: ") << m_filecount); // Do not read the complete file list at startup. // Instead read a chunk each frame. m_timer.setInterval(0); m_timer.setCallback(std::bind( &DAT2::readFileEntry, this) ); m_timer.start(); } void DAT2::readFileEntry() const { assert( m_filecount != 0); // Load more items per call, // otherwise it takes _ages_ until everything is in. uint32_t load_per_cycle = 50; if( load_per_cycle > m_filecount ) load_per_cycle = m_filecount; m_filecount -= load_per_cycle; // Save the old index in an exception save way. IndexSaver isaver(m_data.get()); // Move index to file list and read the entries. m_data->setIndex(m_currentIndex); RawDataDAT2::s_info info; while( load_per_cycle-- ) { uint32_t namelen = m_data->read32Little(); info.name = fixPath(m_data->readString(namelen)); info.type = m_data->read8(); info.unpackedLength = m_data->read32Little(); info.packedLength = m_data->read32Little(); info.offset = m_data->read32Little(); m_filelist.insert(std::make_pair(info.name, info)); } m_currentIndex = m_data->getCurrentIndex(); // Finally log on completion and stop the timer. if( m_filecount == 0 ) { FL_LOG(_log, LMsg("MFFalloutDAT2, All file entries in '") << m_datpath << "' loaded."); m_timer.stop(); } } RawData* DAT2::open(const std::string& file) const { const RawDataDAT2::s_info& info = getInfo(file); return new RawData(new RawDataDAT2(getVFS(), m_datpath, info)); } bool DAT2::fileExists(const std::string& name) const { return findFileEntry(name) != m_filelist.end(); } const RawDataDAT2::s_info& DAT2::getInfo(const std::string& name) const { type_filelist::const_iterator i = findFileEntry(name); if (i == m_filelist.end()) { throw NotFound(name); } return i->second; } DAT2::type_filelist::const_iterator DAT2::findFileEntry(const std::string& path) const { // Either the normalization is bogus, or we have to do // it here, too. Otherwise we can't load the files returned // by listFiles. std::string name = path; // Normalize the path if (name.find("./") == 0) { name.erase(0, 2); } type_filelist::const_iterator i = m_filelist.find(name); // We might have another chance to find the file // if the number of file entries not zero. if ( m_filecount && i == m_filelist.end()) { FL_LOG(_log, LMsg("MFFalloutDAT2") << "Missing '" << name << "' in partially(" << m_filecount <<") loaded "<< m_datpath); while( m_filecount && i == m_filelist.end()) { readFileEntry(); i = m_filelist.find(name); } } return i; } std::set DAT2::listFiles(const std::string& pathstr) const { return list(pathstr, false); } std::set DAT2::listDirectories(const std::string& pathstr) const { return list(pathstr, true); } std::set DAT2::list(const std::string& pathstr, bool dirs) const { std::set list; std::string path = pathstr; // Force loading the complete file entries // This is a costly operation... right after startup. // Later this should do nothing. while( m_filecount ) { readFileEntry(); } // Normalize the path if (path.find("./") == 0) { path.erase(0, 2); } size_t lastIndex = path.size(); if (lastIndex != 0 && path[lastIndex-1] != '/') { path += '/'; } type_filelist::const_iterator end = m_filelist.end(); for (type_filelist::const_iterator i = m_filelist.begin(); i != end; ++i) { const std::string& file = i->first; if (file.find(path) == 0) { std::string cleanedfile = file.substr(path.size(), file.size()); // strip the pathstr bool isdir = cleanedfile.find('/') != std::string::npos; // if we still have a / it's a subdir if (isdir) { cleanedfile = cleanedfile.substr(0, cleanedfile.find('/')); if (cleanedfile.find('/') != cleanedfile.rfind('/')) { // check if this is a direct subdir continue; } } if (isdir == dirs) { list.insert(cleanedfile); } } } return list; } } // FIFE fifengine-0.4.2/engine/core/vfs/dat/dat2.h000066400000000000000000000076371341615052600202350ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_MAP_LOADERS_FALLOUT_DAT2_H #define FIFE_MAP_LOADERS_FALLOUT_DAT2_H // Standard C++ library includes #include #include #include // Platform specific includes #include "util/base/fife_stdint.h" // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/time/timer.h" #include "vfs/vfs.h" #include "vfs/vfssource.h" #include "rawdatadat2.h" namespace FIFE { class RawData; /** VFSource for the Fallout2 DAT file format * * Implements a kind of lazy initializing, by reading the file list * in chunks. Behaviour is the same as if it wouldn't do this, * but startup is very fast. But a open/fileExists call with a * filename that doesn't exist, does trigger completely loading * the file entries. * * @see MFFalloutDAT1 * @todo @b maybe merge common DAT1/DAT2 code in a common base class */ class DAT2 : public VFSSource { public: /** Constructor * Create a VFSSource for a Fallout2 DAT file. * @param vfs A pointer to the VFS. * @param path A Fallout2 DAT file - e.g. master.DAT */ DAT2(VFS* vfs, const std::string& path); bool fileExists(const std::string& name) const; RawData* open(const std::string& file) const; /** Get Information needed to unpack and extract data * * @see MFFalloutDAT1::getInfo */ const RawDataDAT2::s_info& getInfo(const std::string& name) const; std::set listFiles(const std::string& pathstr) const; std::set listDirectories(const std::string& pathstr) const; private: std::string m_datpath; mutable std::unique_ptr m_data; typedef std::map type_filelist; mutable type_filelist m_filelist; /// number of file entries to read mutable uint32_t m_filecount; /// current index in file mutable uint32_t m_currentIndex; /// lazy loading timer mutable Timer m_timer; /// read a bunch of file entries void readFileEntry() const; /// find a file entry type_filelist::const_iterator findFileEntry(const std::string& name) const; std::set list(const std::string& pathstr, bool dirs) const; // Not copyable DAT2(const DAT2&); DAT2& operator=(const DAT2&); }; } // FIFE #endif fifengine-0.4.2/engine/core/vfs/dat/lzssdecoder.cpp000066400000000000000000000073241341615052600222500ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes #include // 3rd party library includes // FIFE includes #include "vfs/raw/rawdata.h" #include "util/base/exception.h" #include "lzssdecoder.h" // just a quick&dirty wrapper around anchorites implementation - needs to be replaced with our own LZSS implementation namespace FIFE { LZSSDecoder::LZSSDecoder() {} LZSSDecoder::~LZSSDecoder() {} void LZSSDecoder::decode(RawData* input, uint8_t* output, const uint32_t outputsize) { m_outindex = 0; m_outlen = outputsize; while (m_outindex < outputsize) { uint16_t blockdesc = input->read16Big(); uint16_t bytesToRead = blockdesc & 0x7fff; if (blockdesc & 0x8000) { // uncompressed input->readInto(output + m_outindex, bytesToRead); m_outindex += bytesToRead; } else { // Allocate +2 bytes so that on corrupt data the LZSS // decoder won't crash the input buffer. std::vector indata(bytesToRead + 2); input->readInto(&indata[0], bytesToRead); LZSSDecode(&indata[0], bytesToRead, output); // Note outindex is advanced inside LZSSDecode. } } } void LZSSDecoder::LZSSDecode(uint8_t* in , int64_t len, uint8_t* out) { const int64_t c_nRingBufferSize = 4096; const int64_t c_nMatchLengthUpperLimit = 18; const int64_t c_nThreshold = 2; char buffer[c_nRingBufferSize + c_nMatchLengthUpperLimit - 1]; int32_t ibuf = 0; int32_t c; int32_t i; int32_t j; int32_t k; int32_t r; uint32_t flags; for (i = 0; i < c_nRingBufferSize - c_nMatchLengthUpperLimit; i++) { buffer[i] = ' '; } r = c_nRingBufferSize - c_nMatchLengthUpperLimit; flags = 0; while ( ibuf < len ) { if (((flags >>= 1) & 256) == 0) { c = in[ibuf++]; flags = c | 0xff00;/* uses higher byte cleverly to count eight */ } if (flags & 1) { c = in[ibuf++]; out[m_outindex++] = c; buffer[r++] = c; r &= (c_nRingBufferSize - 1); } else { i = in[ibuf++]; j = in[ibuf++]; i |= ((j & 0xf0) << 4); j = (j & 0x0f) + c_nThreshold; for (k = 0; k <= j; k++) { c = buffer[(i + k) & (c_nRingBufferSize - 1)]; out[m_outindex++] = c; buffer[r++] = c; r &= (c_nRingBufferSize - 1); } } } } } fifengine-0.4.2/engine/core/vfs/dat/lzssdecoder.h000066400000000000000000000050061341615052600217100ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_LZSSDECODER_H #define FIFE_LZSSDECODER_H // Standard C++ library includes // 3rd party library includes // FIFE includes #include "util/base/fife_stdint.h" #include "vfs/vfs.h" namespace FIFE { /** A helper class for unpacking LZSS encoded data * @bug just a quick&dirty LZSS implementation, optimized a bit * see revision 719 for the original one and 795 for the broken optimized one * @bug the lzss decoder might very well crash on corrupt data. */ class LZSSDecoder { public: /** Constructor */ LZSSDecoder(); /** Destructor */ ~LZSSDecoder(); /** Decodes from a file into a pointer. * @param input The VFS file to read from * @param output The memory location to write to * @param outputsize The size of the memory location in byte */ void decode(RawData* input, uint8_t* output, const uint32_t outputsize); private: uint32_t m_outlen; uint32_t m_outindex; void LZSSDecode(uint8_t* in, int64_t len, uint8_t* out); }; } #endif fifengine-0.4.2/engine/core/vfs/dat/rawdatadat1.cpp000066400000000000000000000045031341615052600221200ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "vfs/raw/rawdata.h" #include "util/base/exception.h" #include "lzssdecoder.h" #include "rawdatadat1.h" namespace FIFE { RawDataDAT1::RawDataDAT1(VFS* vfs, const std::string& datfile, const s_info& info) : RawDataMemSource(info.unpackedLength) { std::unique_ptr input (vfs->open(datfile)); input->setIndex(info.offset); if (info.type == 0x40) { // compressed LZSSDecoder decoder; decoder.decode(input.get(), getRawData(), getSize()); } else input->readInto(getRawData(), getSize()); } } // FIFE fifengine-0.4.2/engine/core/vfs/dat/rawdatadat1.h000066400000000000000000000051401341615052600215630ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_MAP_LOADERS_FALLOUT_RAWDATADAT1_H #define FIFE_MAP_LOADERS_FALLOUT_RAWDATADAT1_H // Standard C++ library includes #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "vfs/raw/rawdatamemsource.h" #include "vfs/vfs.h" namespace FIFE { /** A subclass of RawDataMemSource, that fills itself with a FALLOUT1 .DAT file entry * @see MFFalloutDAT1 */ class RawDataDAT1 : public RawDataMemSource { public: /** The needed information for the extraction. */ struct s_info { std::string name; uint32_t packedLength; uint32_t unpackedLength; uint32_t offset; uint32_t type; }; /** Constructor * @param vfs The vfs to open with. * @param datfile The .DAT archive - e.g. master.DAT * @param info The .DAT file entry, as retrieved by MFFalloutDAT1 */ RawDataDAT1(VFS* vfs, const std::string& datfile, const s_info& info); }; } #endif fifengine-0.4.2/engine/core/vfs/dat/rawdatadat2.cpp000066400000000000000000000052421341615052600221220ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes #include #include // 3rd party library includes #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "vfs/raw/rawdata.h" #include "vfs/vfs.h" #include "util/base/exception.h" #include "rawdatadat2.h" namespace FIFE { RawDataDAT2::RawDataDAT2(VFS* vfs, const std::string& datfile, const s_info& info) : RawDataMemSource(info.unpackedLength) { std::unique_ptr input (vfs->open(datfile)); input->setIndex(info.offset); if (info.type == 1) { // compressed std::unique_ptr compressed(new uint8_t[info.packedLength]); input->readInto(compressed.get(), info.packedLength); uLongf dstlen = info.unpackedLength; if (uncompress(getRawData(), &dstlen, compressed.get(), info.packedLength) != Z_OK || dstlen != info.unpackedLength) { throw InvalidFormat("failed to decompress " + info.name + " (inside: " + datfile + ")"); } } else { input->readInto(getRawData(), info.unpackedLength); } } } fifengine-0.4.2/engine/core/vfs/dat/rawdatadat2.h000066400000000000000000000052471341615052600215740ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_MAP_LOADERS_FALLOUT_RAWDATADAT2_H #define FIFE_MAP_LOADERS_FALLOUT_RAWDATADAT2_H // Standard C++ library includes #include // Platform specific includes #include "util/base/fife_stdint.h" // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "vfs/raw/rawdatamemsource.h" #include "rawdatadat2.h" namespace FIFE { /** A subclass of RawDataMemSource, that fills itself with a FALLOUT1 .DAT file entry * @see MFFalloutDAT2 */ class RawDataDAT2 : public RawDataMemSource { public: /** The needed information for the extraction. */ struct s_info { std::string name; uint32_t packedLength; uint32_t unpackedLength; uint32_t offset; uint32_t type; }; /** Constructor * @param vfs The vfs to open with. * @param datfile The .DAT archive - e.g. master.DAT * @param info The .DAT file entry, as retrieved by MFFalloutDAT2 */ RawDataDAT2(VFS* vfs, const std::string& datfile, const s_info& info); }; } #endif fifengine-0.4.2/engine/core/vfs/directoryprovider.cpp000066400000000000000000000053311341615052600227320ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/exception.h" #include "fife_boost_filesystem.h" #include "vfs.h" #include "directoryprovider.h" #include "vfsdirectory.h" namespace FIFE { bool DirectoryProvider::isReadable(const std::string& path) const { return bfs::is_directory(bfs::path(path)); } FIFE::VFSSource* DirectoryProvider::createSource(const std::string& path) { if (isReadable(path)) { VFSSource* source = NULL; if ( hasSource(path)) { source = m_sources[path]; } else { source = new VFSDirectory(getVFS(), path); m_sources[path] = source; } return source; } else throw Exception("Path " + path + " is not readable."); } VFSSource* DirectoryProvider::getSource(const std::string& path) const { VFSSource* source = NULL; if (hasSource(path)) { source = m_sources.find(path)->second; } return source; } bool DirectoryProvider::hasSource(const std::string & path) const { return m_sources.count(path) > 0; } } fifengine-0.4.2/engine/core/vfs/directoryprovider.h000066400000000000000000000066551341615052600224110ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_VFS_DIRECTORYPROVIDER_H #define FIFE_VFS_DIRECTORYPROVIDER_H // Standard C++ library includes #include #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "vfssourceprovider.h" namespace FIFE { class VFSSource; /** Provider for OS directories. */ class DirectoryProvider : public VFSSourceProvider { public: DirectoryProvider() : VFSSourceProvider("OS Directory") { } /** Check if a given directory is readable. * The path must either be an absolute path or relative * to the current working directory where the client was launched * * @param path the filename to check * @return true if readable, false otherwise */ virtual bool isReadable(const std::string& path) const; /** Create a new instance of a VFSSource initialized with the given directory * This will only pass if the path is readable and recognized * as a directory as per the description of isReadable * * @param path the directory to open * @return the new VFSSource */ virtual VFSSource* createSource(const std::string& path); /** Get the source instance of the path * * @param path The source path * @return A VFSSource or NULL of none is present */ virtual VFSSource* getSource(const std::string& path) const; /** Check whether the provider already has created a source with that path * * @param path The path to the source * @return true if the provider has already created a source with that path, false if not */ virtual bool hasSource(const std::string & path) const; private: std::string m_name; std::map m_sources; }; } #endif fifengine-0.4.2/engine/core/vfs/fife_boost_filesystem.cpp000066400000000000000000000205411341615052600235360ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes #include // 3rd party library includes #include #include #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "fife_boost_filesystem.h" namespace { // grab the major and minor version of boost, // calculations taken from boost/version.hpp #define BOOST_MAJOR_VERSION BOOST_VERSION / 100000 #define BOOST_MINOR_VERSION BOOST_VERSION / 100 % 1000 #if (BOOST_MAJOR_VERSION >= 1 && BOOST_MINOR_VERSION >= 44 && defined(BOOST_FILESYSTEM_VERSION)) #if (BOOST_FILESYSTEM_VERSION == 2) // if this macro is defined to 2 the the user wants to // force the use of boost filesystem version 2 so we // will set our internal macros correctly to do that #define USE_NON_DEPRECATED_BOOST_FILESYSTEM_V2 #elif (BOOST_FILESYSTEM_VERSION == 3) // if this macro is set to 3 then the user wants to force // the use of boost filesystem version 3 so we will set // our internal macros correctly to do that #define USE_BOOST_FILESYSTEM_V3 #endif #elif (BOOST_MAJOR_VERSION >= 1 && BOOST_MINOR_VERSION >= 46) // this define will tell us to use boost filesystem // version 3 since this is the default version of the library // starting in boost version 1.46 and above #define USE_BOOST_FILESYSTEM_V3 #elif (BOOST_MAJOR_VERSION >= 1 && BOOST_MINOR_VERSION >= 36) // this define will tell us not to use the deprecated functions // in boost filesystem version 2 library which were introduced // in boost version 1.36 and above #define USE_NON_DEPRECATED_BOOST_FILESYSTEM_V2 #endif } namespace FIFE { bool HasParentPath(const bfs::path& path) { #if defined(USE_BOOST_FILESYSTEM_V3) || defined(USE_NON_DEPRECATED_BOOST_FILESYSTEM_V2) return path.has_parent_path(); #else return path.has_branch_path(); #endif } bfs::path GetParentPath(const bfs::path& path) { #if defined(USE_BOOST_FILESYSTEM_V3) || defined(USE_NON_DEPRECATED_BOOST_FILESYSTEM_V2) return path.parent_path(); #else return path.branch_path(); #endif } std::string GetFilenameFromPath(const bfs::path& path) { #if defined(USE_BOOST_FILESYSTEM_V3) // boost version 1.46 and above uses // boost filesystem version 3 as the default // which has yet a different way of getting // a filename string return path.filename().string(); #elif defined(USE_NON_DEPRECATED_BOOST_FILESYSTEM_V2) // the new way in boost filesystem version 2 // to get a filename string //(this is for boost version 1.36 and above) return path.filename(); #else // the old way in boost filesystem version 2 // to get a filename string //(this is for boost version 1.35 and below) return path.leaf(); #endif } std::string GetFilenameFromDirectoryIterator(const bfs::directory_iterator& iter) { bfs::directory_iterator badIter; // early exit for bad directory_iterator parameter if (iter == badIter) { return ""; } #if defined(USE_BOOST_FILESYSTEM_V3) // boost version 1.46 and above uses // boost filesystem version 3 as the default // which has yet a different way of getting // a filename string return iter->path().filename().string(); #elif defined(USE_NON_DEPRECATED_BOOST_FILESYSTEM_V2) // the new way in boost filesystem version 2 // to get a filename string //(this is for boost version 1.36 and above) return iter->path().filename(); #else // the old way in boost filesystem version 2 // to get a filename string //(this is for boost version 1.35 and below) return iter->leaf(); #endif } std::string GetPathIteratorAsString(const bfs::path::iterator& pathIter) { #if defined(USE_BOOST_FILESYSTEM_V3) // in boost::filesystem v3 the path iterator is now // represented by a path object internally so we // must now additionally call the .string() method // to get an std::string representation return (*pathIter).string(); #else // in boost::filesystem v2 the path iterator // holds the string representation so we can // use it directly return (*pathIter); #endif } bfs::path GetAbsolutePath(const std::string& path) { return GetAbsolutePath(bfs::path(path)); } bfs::path GetAbsolutePath(const bfs::path& path) { #if defined(USE_BOOST_FILESYSTEM_V3) return bfs::absolute(path); #else return bfs::complete(path); #endif } bool HasExtension(const std::string& path) { return HasExtension(bfs::path(path)); } bool HasExtension(const bfs::path& path) { // not sure this gives the same results as below // because the "." will be included in the extension // meaning that this may return true for a path that // is simply has an empty extension // see link for more information: // http://www.boost.org/doc/libs/1_49_0/libs/filesystem/v3/doc/reference.html#path-extension //return path.has_extension(); std::string extension = GetExtension(path); if (extension.empty() || extension == ".") { return false; } else { return true; } } std::string GetExtension(const std::string& path) { return GetExtension(bfs::path(path)); } std::string GetExtension(const bfs::path& path) { #if defined(USE_BOOST_FILESYSTEM_V3) return path.extension().string(); #else return bfs::extension(path); #endif } std::string GetStem(const std::string& path){ return GetStem(bfs::path(path)); } std::string GetStem(const bfs::path& path) { #if defined(USE_BOOST_FILESYSTEM_V3) if (!HasExtension(path)) { // if no extension return empty string return ""; } else { return path.stem().string(); } #else if (!HasExtension(path)) { // if no extension, return empty string return ""; } else { return path.stem(); } #endif } }fifengine-0.4.2/engine/core/vfs/fife_boost_filesystem.h000066400000000000000000000122741341615052600232070ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_VFS_H_ #define FIFE_VFS_H_ // Standard C++ library includes // 3rd party library includes #include // #include // #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder namespace bfs = boost::filesystem; namespace FIFE { /** Helper function to determine if a path object has a parent path * @param path boost filesystem path object * @return true - does have parent path * false - does not have parent path */ bool HasParentPath(const bfs::path& path); /** Helper function to retrieve a parent path object from a path object * @param path boost filesystem path object * @return a path object with parent of passed in parameter */ bfs::path GetParentPath(const bfs::path& path); /** Helper function to retrieve the filename from a boost filesystem path * filename is just the name of the file and any extension without a path * @param path boost filesystem path object * @return filename string */ std::string GetFilenameFromPath(const bfs::path& path); /** Helper function to retrieve a filename string from a directory iterator * @param iter boost filesystem directory_iterator object * @return a filename string */ std::string GetFilenameFromDirectoryIterator(const bfs::directory_iterator& iter); /** Helper function to retrieve the path iterator in a string representation * @param pathIter the iterator to get the string from * @return a string representing the value in the path iterator */ std::string GetPathIteratorAsString(const bfs::path::iterator& pathIter); /** Helper function to retrieve an absolute path from a given relative path * @param path std::string object * @return a boost filesystem path object */ bfs::path GetAbsolutePath(const std::string& path); /** Helper function to retrieve an absolute path from a given relative path * @param path boost filesystem path object * @return a boost filesystem path object */ bfs::path GetAbsolutePath(const bfs::path& path); /** Helper function to check if a filename has an extension * @param path boost filesystem path object * @return true if filename has extension, false if not */ bool HasExtension(const std::string& path); /** Helper function to check if a filename has an extension * @param path boost filesystem path object * @return true if filename has extension, false if not */ bool HasExtension(const bfs::path& path); /** Helper function to retrieve the extension * @note the extension includes the "." * @param path the input path string * @return the extension on the input path */ std::string GetExtension(const std::string& path); /** Helper function to retrieve the extension * @note the extension includes the "." * @param path the input path object * @return the extension on the input path */ std::string GetExtension(const bfs::path& path); /** Helper function to retrieve the filename minus any extension * @note the "." is NOT included * @param path the input path string * @return the filename minus any extension */ std::string GetStem(const std::string& path); /** Helper function to retrieve the filename minus any extension * @note the "." is NOT included * @param path the input path object * @return the filename minus any extension */ std::string GetStem(const bfs::path& path); } #endif fifengine-0.4.2/engine/core/vfs/raw/000077500000000000000000000000001341615052600172365ustar00rootroot00000000000000fifengine-0.4.2/engine/core/vfs/raw/rawdata.cpp000066400000000000000000000117371341615052600213760ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes #include #include #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/exception.h" #include "util/log/logger.h" #include "rawdata.h" namespace FIFE { static Logger _log(LM_VFS); RawData::RawData(RawDataSource* datasource) : m_datasource(datasource), m_index_current(0) { } RawData::~RawData() { delete m_datasource; } std::vector RawData::getDataInBytes() { // get the total file size uint32_t size = getDataLength(); // create output vector std::vector target; // resize vector to file size target.resize(size); // read bytes directly into vector readInto(&target[0], target.size()); return target; } std::vector RawData::getDataInLines() { std::vector target; std::string line; while (getLine(line)) { target.push_back(line); } return target; } uint32_t RawData::getDataLength() const { return m_datasource->getSize(); } uint32_t RawData::getCurrentIndex() const { return m_index_current; } void RawData::setIndex(uint32_t index) { if (index > getDataLength()) throw IndexOverflow(__FUNCTION__); m_index_current = index; } void RawData::moveIndex(int32_t offset) { setIndex(getCurrentIndex() + offset); } void RawData::readInto(uint8_t* buffer, size_t len) { if (m_index_current + len > getDataLength()) { FL_LOG(_log, LMsg("RawData") << m_index_current << " : " << len << " : " << getDataLength()); throw IndexOverflow(__FUNCTION__); } m_datasource->readInto(buffer, m_index_current, len); m_index_current += len; } uint8_t RawData::read8() { return readSingle(); } uint16_t RawData::read16Little() { uint16_t val = readSingle(); return littleToHost(val); } uint32_t RawData::read32Little() { uint32_t val = readSingle(); return littleToHost(val); } uint16_t RawData::read16Big() { uint16_t val = readSingle(); return bigToHost(val); } uint32_t RawData::read32Big() { uint32_t val = readSingle(); return bigToHost(val); } std::string RawData::readString(size_t len) { std::vector strVector; strVector.resize(len); readInto(&strVector[0], len); std::string ret(strVector.begin(), strVector.end()); return ret; } void RawData::read(std::string& outbuffer, int32_t size) { if ((size < 0) || ((size + m_index_current) > getDataLength())) { size = getDataLength() - m_index_current; } if (size == 0) { outbuffer = ""; return; } outbuffer.resize(size); // read directly into string readInto(reinterpret_cast(&outbuffer[0]), size); } bool RawData::getLine(std::string& buffer) { if (getCurrentIndex() >= getDataLength()) return false; buffer = ""; char c; while (getCurrentIndex() < getDataLength() && (c = read8()) != '\n') buffer += c; return true; } bool RawData::littleEndian() { static int32_t endian = 2; if (endian == 2) { uint32_t value = 0x01; endian = reinterpret_cast(&value)[0]; FL_LOG(_log, LMsg("RawData") << "we are on a " << (endian == 1 ? "little endian" : "big endian") << " machine"); } return endian == 1; } }//FIFE fifengine-0.4.2/engine/core/vfs/raw/rawdata.h000066400000000000000000000141111341615052600210300ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_VFS_RAW_RAWDATA_H #define FIFE_VFS_RAW_RAWDATA_H // Standard C++ library includes #include #include // Platform specific includes #include "util/base/fife_stdint.h" // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "rawdatasource.h" namespace FIFE { /** Used to access diffrent kinds of data. * * RawData uses RawDataSource to get the real data - that way the user doesn't have to know where the data comes * from (real files, files inside archives etc.) */ class RawData { public: RawData(RawDataSource* datasource); virtual ~RawData(); /** get the data as a vector of bytes * This does not append a null terminator to the end */ std::vector getDataInBytes(); /** get the data in distinct lines */ std::vector getDataInLines(); /** get the complete datalength * * @return the complete datalength */ uint32_t getDataLength() const; /** get the current index * * @return the current index */ uint32_t getCurrentIndex() const; /** set the current index * * @param index the new index * @throws IndexOverflow if index is >= getDataLength() */ void setIndex(uint32_t index); /** move the current index * * @param offset the offset * @throws IndexOverflow if we move outside the datalength */ void moveIndex(int32_t offset); /** helper-function * * reads sizeof(T) bytes - should be used with fixed-size datatypes like uint32_t, uint16_t, uint8_t etc. * @return the data */ template T readSingle() { T val; readInto(reinterpret_cast(&val), sizeof(T)); return val; } /** read len bytes into buffer * * @param buffer the data will be written into it * @param len len bytes will be written * @throws IndexOverflow if currentindex + len > getCurrentIndex() */ void readInto(uint8_t* buffer, size_t len); /** reads 1 byte */ uint8_t read8(); /** reads a uint16_t littleEndian and converts them to the host-byteorder * @throws IndexOverflow */ uint16_t read16Little(); /** reads a uint16_t littleEndian and converts them to the host-byteorder * * @throws IndexOverflow */ uint32_t read32Little(); /** reads a uint16_t bigEndian and converts them to the host-byteorder * * @throws IndexOverflow */ uint16_t read16Big(); /** reads a uint16_t bigEndian and converts them to the host-byteorder * * @throws IndexOverflow */ uint32_t read32Big(); /** read a string with len bytes, not assuming a terminating 0 * Appends a null terminator character to the end * * @param len the stringlen * @return the string * @throws IndexOverflow */ std::string readString(size_t len); /** Reads all data into the buffer * This does not append a null terminator to the end * Created to especially fulfill python file interface requirements */ void read(std::string& outbuffer, int32_t size=-1); /** reads until a \\n is encountered or no more data is available * * @param buffer if successfull the new string will be assigned to buffer * @return true if data was available, false otherwise (in that case buffer won't be touched) */ bool getLine(std::string& buffer); private: RawDataSource* m_datasource; size_t m_index_current; template T littleToHost(T value) const { if (littleEndian()) return value; else return revert(value); } template T bigToHost(T value) const { if (!littleEndian()) return value; else return revert(value); } template T revert(T value) const { T retval; for (uint32_t i = 0; i < sizeof(T); ++i) reinterpret_cast(&retval)[i] = reinterpret_cast(&value)[sizeof(T)-1-i]; return retval; } RawData(const RawData&); RawData& operator=(const RawData&) { return *this; }; static bool littleEndian(); }; typedef std::shared_ptr RawDataPtr; class IndexSaver { public: IndexSaver(RawData* d) : m_rd(d), m_index(m_rd->getCurrentIndex()) {} ~IndexSaver() { m_rd->setIndex(m_index); } private: RawData* m_rd; uint32_t m_index; IndexSaver(const IndexSaver&); IndexSaver& operator=(const IndexSaver&) { return *this; } }; }//FIFE #endif fifengine-0.4.2/engine/core/vfs/raw/rawdata.i000066400000000000000000000045541341615052600210430ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fife %{ #include "vfs/raw/rawdata.h" %} %include "vfs/raw/rawdatasource.h" namespace FIFE { %apply std::string &OUTPUT { std::string& outbuffer }; %apply uint8_t *OUTPUT { uint8_t* buffer }; class RawData { public: RawData(RawDataSource* datasource); virtual ~RawData(); std::vector getDataInBytes(); std::vector getDataInLines(); uint32_t getDataLength() const; uint32_t getCurrentIndex() const; void setIndex(uint32_t index); void moveIndex(int32_t offset); void readInto(uint8_t* buffer, size_t len); uint8_t read8(); uint16_t read16Little(); uint32_t read32Little(); uint16_t read16Big(); uint32_t read32Big(); void read(std::string& outbuffer, int32_t size=-1); std::string readString(size_t len); bool getLine(std::string& buffer); }; %clear std::string& outbuffer; } fifengine-0.4.2/engine/core/vfs/raw/rawdatafile.cpp000066400000000000000000000046251341615052600222340ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/exception.h" #include "rawdatafile.h" namespace FIFE { RawDataFile::RawDataFile(const std::string& file) : m_file(file), m_stream(m_file.c_str(), std::ios::binary), m_filesize(0) { if (!m_stream) throw CannotOpenFile(m_file); m_stream.seekg(0, std::ios::end); m_filesize = m_stream.tellg(); m_stream.seekg(0, std::ios::beg); } RawDataFile::~RawDataFile() { } uint32_t RawDataFile::getSize( ) const { return m_filesize; } void RawDataFile::readInto(uint8_t* buffer, uint32_t start, uint32_t length) { m_stream.seekg(start); m_stream.read(reinterpret_cast(buffer), length); } } fifengine-0.4.2/engine/core/vfs/raw/rawdatafile.h000066400000000000000000000047731341615052600217050ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_VFS_RAW_RAWDATAFILE_H #define FIFE_VFS_RAW_RAWDATAFILE_H // Standard C++ library includes #include #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "rawdatasource.h" namespace FIFE { /** A RawDataSource for a file on the host system * @see VFSHostSystem * @see RawDataSource */ class RawDataFile : public RawDataSource { public: /** Constructor * Constructs a RawDataSource for file. * @param file The path to the file to load. * @throw CannotOpenFile */ RawDataFile(const std::string& file); virtual ~RawDataFile(); virtual uint32_t getSize() const; virtual void readInto(uint8_t* buffer, uint32_t start, uint32_t length); private: std::string m_file; std::ifstream m_stream; uint32_t m_filesize; }; } #endif fifengine-0.4.2/engine/core/vfs/raw/rawdatamemsource.cpp000066400000000000000000000044441341615052600233130ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "rawdatamemsource.h" namespace FIFE { RawDataMemSource::RawDataMemSource(uint32_t len) : m_data(new uint8_t[len]), m_datalen(len) { } RawDataMemSource::~RawDataMemSource() { delete[] m_data; } uint32_t RawDataMemSource::getSize() const { return m_datalen; } void RawDataMemSource::readInto(uint8_t* buffer, uint32_t start, uint32_t length) { std::copy(m_data + start, m_data + start + length, buffer); } uint8_t* RawDataMemSource::getRawData() const { return m_data; } } fifengine-0.4.2/engine/core/vfs/raw/rawdatamemsource.h000066400000000000000000000055321341615052600227570ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_VFS_RAW_RAWDATAMEMSOURE_H #define FIFE_VFS_RAW_RAWDATAMEMSOURE_H // Standard C++ library includes // Platform specific includes #include "util/base/fife_stdint.h" // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "rawdatasource.h" namespace FIFE { /** * Simpe RawDataSource that reads data from raw memory * * @note This Class is @b not incomplete. Use @c getRawData to * write into the Buffer. * * @see RawDataSource */ class RawDataMemSource : public RawDataSource { public: /** * Create a new RawDataMemSource that allocates datalen bytes. * @param datalen the datalen to allocate */ RawDataMemSource(uint32_t datalen); virtual ~RawDataMemSource(); /** Get a Pointer to the data * You need to use this function to fill the class with meaningfull data. */ uint8_t* getRawData() const; virtual uint32_t getSize() const; virtual void readInto(uint8_t* buffer, uint32_t start, uint32_t length); private: uint8_t* m_data; uint32_t m_datalen; RawDataMemSource(const RawDataMemSource&) {}; RawDataMemSource& operator=(const RawDataMemSource) { return *this; } }; } #endif fifengine-0.4.2/engine/core/vfs/raw/rawdatasource.cpp000066400000000000000000000036161341615052600226140ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "rawdatasource.h" namespace FIFE { RawDataSource::RawDataSource() {} RawDataSource::~RawDataSource() {} } fifengine-0.4.2/engine/core/vfs/raw/rawdatasource.h000066400000000000000000000051341341615052600222560ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_VFS_RAW_RAWDATASOURCE_H #define FIFE_VFS_RAW_RAWDATASOURCE_H // Standard C++ library includes // Platform specific includes #include "util/base/fife_stdint.h" // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder namespace FIFE { /** Abstract baseclass - provides data for RawData * * RawData uses RawDataSources to access the data - if you want to add support for a new archivetype this is one of * the classes you need. */ class RawDataSource { public: RawDataSource(); virtual ~RawDataSource(); /** get the complete datasize */ virtual uint32_t getSize() const = 0; /** read data from the source * * @param buffer the data will be written into buffer * @param start the startindex inside the source * @param length length bytes will be written into buffer */ virtual void readInto(uint8_t* buffer, uint32_t start, uint32_t length) = 0; }; } #endif fifengine-0.4.2/engine/core/vfs/vfs.cpp000066400000000000000000000175601341615052600177600ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes #include #include // 3rd party library includes #include #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/exception.h" #include "util/log/logger.h" #include "vfs.h" #include "vfssource.h" #include "vfssourceprovider.h" namespace FIFE { /** Logger to use for this source file. * @relates Logger */ static Logger _log(LM_VFS); VFS::VFS() : m_sources() {} VFS::~VFS() { cleanup(); } void VFS::cleanup() { type_sources sources = m_sources; type_sources::const_iterator end = sources.end(); for (type_sources::iterator i = sources.begin(); i != end; ++i) delete *i; type_providers::const_iterator end2 = m_providers.end(); for (type_providers::iterator j = m_providers.begin(); j != end2; ++j) delete *j; m_providers.clear(); } void VFS::addProvider(VFSSourceProvider* provider) { provider->setVFS(this); m_providers.push_back(provider); FL_LOG(_log, LMsg("new provider: ") << provider->getName()); } VFSSource* VFS::createSource(const std::string& path) { if (hasSource(path)) { FL_WARN(_log, LMsg(path) << " is already used as VFS source"); return 0; } type_providers::const_iterator end = m_providers.end(); for (type_providers::const_iterator i = m_providers.begin(); i != end; ++i) { VFSSourceProvider* provider = *i; if (!provider->isReadable(path)) continue; try { VFSSource* source = provider->createSource(path); return source; } catch (const Exception& ex) { FL_WARN(_log, LMsg(provider->getName()) << " thought it could load " << path << " but didn't succeed (" << ex.what() << ")"); continue; } catch (...) { FL_WARN(_log, LMsg(provider->getName()) << " thought it could load " << path << " but didn't succeed (unknown exception)"); continue; } } FL_WARN(_log, LMsg("no provider for ") << path << " found"); return 0; } void VFS::addNewSource(const std::string& path) { VFSSource* source = createSource(path); if (source) { addSource(source); } else { FL_WARN(_log, LMsg("Failed to add new VFS source: ") << path); } } void VFS::addSource(VFSSource* source) { m_sources.push_back(source); } void VFS::removeSource(VFSSource* source) { type_sources::iterator i = std::find(m_sources.begin(), m_sources.end(), source); if (i != m_sources.end()) m_sources.erase(i); } void VFS::removeSource(const std::string& path) { type_providers::iterator end = m_providers.end(); for (type_providers::iterator i = m_providers.begin(); i != end; ++i) { VFSSourceProvider* provider = *i; if (provider->hasSource(path)) { VFSSource* source = provider->getSource(path); type_sources::iterator i = std::find(m_sources.begin(), m_sources.end(), source); if (i == m_sources.end()) { removeSource(*i); return; } } } } VFSSource* VFS::getSourceForFile(const std::string& file) const { type_sources::const_iterator i = std::find_if(m_sources.begin(), m_sources.end(), boost::bind2nd(boost::mem_fun(&VFSSource::fileExists), file)); if (i == m_sources.end()) { FL_WARN(_log, LMsg("no source for ") << file << " found"); return 0; } return *i; } bool VFS::exists(const std::string& file) const { return getSourceForFile(file) != 0; } bool VFS::isDirectory(const std::string& path) const { std::vector tokens; // Add a slash in case there isn't one in the string const std::string newpath = path + "/"; boost::algorithm::split(tokens, newpath, boost::algorithm::is_any_of("/")); std::string currentpath = "/"; std::vector::const_iterator token=tokens.begin(); while (token != tokens.end()) { if (*token != "") { if (*token != "." && *token != ".." && listDirectories(currentpath, *token).size() == 0) { return false; } else { currentpath += *token + "/"; } } ++token; } return true; } RawData* VFS::open(const std::string& path) { FL_DBG(_log, LMsg("Opening: ") << path); VFSSource* source = getSourceForFile(path); if (!source) throw NotFound(path); return source->open(path); } std::set VFS::listFiles(const std::string& pathstr) const { std::set list; type_sources::const_iterator end = m_sources.end(); for (type_sources::const_iterator i = m_sources.begin(); i != end; ++i) { std::set sourcelist = (*i)->listFiles(pathstr); list.insert(sourcelist.begin(), sourcelist.end()); } return list; } std::set VFS::listFiles(const std::string& path, const std::string& filterregex) const { std::set list = listFiles(path); return filterList(list, filterregex); } std::set VFS::listDirectories(const std::string& pathstr) const { std::set list; type_sources::const_iterator end = m_sources.end(); for (type_sources::const_iterator i = m_sources.begin(); i != end; ++i) { std::set sourcelist = (*i)->listDirectories(pathstr); list.insert(sourcelist.begin(), sourcelist.end()); } return list; } std::set VFS::listDirectories(const std::string& path, const std::string& filterregex) const { std::set list = listDirectories(path); return filterList(list, filterregex); } std::set VFS::filterList(const std::set& list, const std::string& fregex) const { std::set results; std::regex regex(fregex); std::set::const_iterator end = list.end(); for (std::set::const_iterator i = list.begin(); i != end;) { std::cmatch match; if (std::regex_match((*i).c_str(), match, regex)) { results.insert(*i); } ++i; } return results; } bool VFS::hasSource(const std::string& path) const { type_providers::const_iterator end = m_providers.end(); for (type_providers::const_iterator i = m_providers.begin(); i != end; ++i) { const VFSSourceProvider* provider = *i; if (provider->hasSource(path)) { const VFSSource* source = provider->getSource(path); type_sources::const_iterator i = std::find(m_sources.begin(), m_sources.end(), source); if (i == m_sources.end()) return false; return true; } } return false; } } fifengine-0.4.2/engine/core/vfs/vfs.h000066400000000000000000000140461341615052600174210ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_VFS_VFS_H #define FIFE_VFS_VFS_H // Standard C++ library includes #include #include #include // 3rd party library includes #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/singleton.h" namespace FIFE { class RawData; class VFSSourceProvider; class VFSSource; /** the main VFS (virtual file system) class * * The VFS is intended to provide transparent and portable access to files. * @note The VFS searches for a provider in the order they are added to the * VFS. Since the VFSHostSystem is added first, this implies, that host filesystem * files will override whatever might be in other VFS Sources (e.g. the DAT files) * * @note All filenames have to be @b lowercase. The VFS will convert them to lowercase * and emit a warning. This is done to avoid problems with filesystems which are not * case sensitive. */ class VFS : public DynamicSingleton{ public: /** Constructor * Called by the Engine on startup. Never create one yourself. */ VFS(); /** Destructor */ virtual ~VFS(); void cleanup(); /** add new VFSSourceProvider * * @note VFS assumes ownership over the given provider - so don't do anything with it * after you call this function, especialy don't delete it! * @param provider the new provider */ void addProvider(VFSSourceProvider* provider); /** tries to create a new VFSSource for the given file * * all currently known VFSSourceProviders are tried until one succeeds - if no provider succeeds 0 is returned * @param path the archive-file * @return the new VFSSource or 0 if no provider was succesfull or the file was already used as source */ VFSSource* createSource(const std::string& path); /** create a new Source and add it to VFS * @see VFSSource* createSource(const std::string& file) */ void addNewSource(const std::string& path); /** Add a new VFSSource */ void addSource(VFSSource* source); /** remove a VFSSource */ void removeSource(VFSSource* source); void removeSource(const std::string& path); /** Check if the given file exists * * @param file the filename * @return true if it exists, false if not */ bool exists(const std::string& file) const; /** Check if the given path is a directory * * @param path to check * @return true if it is a directory, false if not */ bool isDirectory(const std::string& path) const; /** Open a file * * @param path the file to open * @return the opened file; delete this when done. * @throws NotFound if the file cannot be found */ RawData* open(const std::string& path); /** Get a filelist of the given directory * * @param path the directory * @return the filelist */ std::set listFiles(const std::string& path) const; /** List the files of a given directory matching a regex * * The whole string has to match the regex, this means if you want all files that end with .map don't search for * "\.map" but ".*\.map" (and escape the \) * * @param path the directory * @param filterregex the regex the files have to match * @return the filelist */ std::set listFiles(const std::string& path, const std::string& filterregex) const; /** Get a directorylist of the given directory * * @param path the directory * @return the directorylist */ std::set listDirectories(const std::string& path) const; /** List the subdirectorys of a given directory matching a regex * * @param path the directory * @param filterregex the regex the files have to match * @return the filelist */ std::set listDirectories(const std::string& path, const std::string& filterregex) const; /** Checks if a source is already present in a provider * * @param path the directory * @return true if the source is present, false if not */ bool hasSource(const std::string& path) const; private: typedef std::vector type_providers; type_providers m_providers; typedef std::vector type_sources; type_sources m_sources; std::set filterList(const std::set& list, const std::string& fregex) const; VFSSource* getSourceForFile(const std::string& file) const; }; } #endif fifengine-0.4.2/engine/core/vfs/vfs.i000066400000000000000000000042001341615052600174110ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fife %{ #include "util/base/exception.h" #include "vfs/vfs.h" %} %include "vfs/raw/rawdata.i" namespace std{ %template(StringSet) set; } namespace std { %template(vectoru) vector; }; namespace FIFE { class VFS { public: VFS(); virtual ~VFS(); void cleanup(); void addNewSource(const std::string& path); void removeSource(const std::string& path); bool exists(const std::string& file) const; RawData* open(const std::string& path); std::set listFiles(const std::string& path) const; std::set listDirectories(const std::string& path) const; }; } fifengine-0.4.2/engine/core/vfs/vfsdirectory.cpp000066400000000000000000000074611341615052600217040ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "vfs/raw/rawdata.h" #include "vfs/raw/rawdatafile.h" #include "util/log/logger.h" #include "util/base/exception.h" #include "fife_boost_filesystem.h" #include "vfsdirectory.h" namespace FIFE { /** Logger to use for this source file. * @relates Logger */ static Logger _log(LM_VFS); VFSDirectory::VFSDirectory(VFS* vfs, const std::string& root) : VFSSource(vfs), m_root(root) { FL_DBG(_log, LMsg("VFSDirectory created with root path ") << m_root); if(!m_root.empty() && *(m_root.end() - 1) != '/') m_root.append(1,'/'); } VFSDirectory::~VFSDirectory() { } bool VFSDirectory::fileExists(const std::string& name) const { std::string fullFilename = m_root + name; bfs::path fullPath(fullFilename); std::ifstream file(fullPath.string().c_str()); if (file) return true; return false; } RawData* VFSDirectory::open(const std::string& file) const { return new RawData(new RawDataFile(m_root + file)); } std::set VFSDirectory::listFiles(const std::string& path) const { return list(path, false); } std::set VFSDirectory::listDirectories(const std::string& path) const { return list(path, true); } std::set VFSDirectory::list(const std::string& path, bool directorys) const { std::set list; std::string dir = m_root; // Avoid double slashes if(path[0] == '/' && m_root[m_root.size()-1] == '/') { dir.append(path.substr(1)); } else { dir.append(path); } try { bfs::path boost_path(dir); if (!bfs::exists(boost_path) || !bfs::is_directory(boost_path)) return list; bfs::directory_iterator end; for (bfs::directory_iterator i(boost_path); i != end; ++i) { if (bfs::is_directory(*i) != directorys) continue; std::string filename = GetFilenameFromDirectoryIterator(i); if (!filename.empty()) { list.insert(filename); } } } catch (const bfs::filesystem_error& ex) { throw Exception(ex.what()); } return list; } } fifengine-0.4.2/engine/core/vfs/vfsdirectory.h000066400000000000000000000065761341615052600213570ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_VFS_VFSHOSTSYSTEM_H #define FIFE_VFS_VFSHOSTSYSTEM_H // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "vfssource.h" namespace FIFE { /** The most basic VFSSource for "normal" filesystems. * For example, '/' or './tests/data'. * * Uses boost_filesystem to achieve Plattform independancy. * This also means you have to use slashes as directory * separators. */ class VFSDirectory : public VFSSource { public: /** Constructor * Creates the given file system's VFS Source, Uses boost_filesystem to * achieve Plattform independancy. */ VFSDirectory(VFS* vfs, const std::string& root = "./"); /** Destructor */ virtual ~VFSDirectory(); /** Tests whether a file can be opened. * @param filename The file to test. * @return True, if the file filename can be opened. */ virtual bool fileExists(const std::string& filename) const; /** Opens a file. * @param filename The file to open. */ virtual RawData* open(const std::string& filename) const; /** List files in a directory * @param path The directory to list the files in * @return A string list of filenames * Will return an empty list on \b any error */ std::set listFiles(const std::string& path) const; /** List directories in a directory * @param path The directory to list the directories in * @return A string list of directories * Will return an empty list on \b any error */ std::set listDirectories(const std::string& path) const; private: std::string m_root; std::set list(const std::string& path, bool directorys) const; }; } #endif fifengine-0.4.2/engine/core/vfs/vfssource.cpp000066400000000000000000000043361341615052600211760ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "vfs.h" #include "vfssource.h" namespace FIFE { VFSSource::VFSSource(VFS* vfs) : m_vfs(vfs) {} VFSSource::~VFSSource() { m_vfs->removeSource(this); } } std::string FIFE::VFSSource::fixPath(std::string path) const { if (!path.size()) return path; size_t pos; while ((pos = path.find('\\')) != std::string::npos) path[pos] = '/'; if (path[0] == '/') path = path.substr(1, path.length()); return path; } fifengine-0.4.2/engine/core/vfs/vfssource.h000066400000000000000000000064261341615052600206450ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_VFS_VFSSOURCE_H #define FIFE_VFS_VFSSOURCE_H // Standard C++ library includes #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "vfs.h" namespace FIFE { class RawData; /** VFSSource abstract baseclass * * VFSSources are used to provide transparent access to diffrent archives/filesystems etc. * Examples are VFSHostSystem * @see VFS * @see VFSSourceProvider */ class VFSSource { public: VFSSource(VFS* vfs); virtual ~VFSSource(); /** check if the given file exists * * @param file filename to check * @return true if it exists, false otherwise */ virtual bool fileExists(const std::string& file) const = 0; /** get the VFS this source is associated with. */ VFS* getVFS() const { return m_vfs; } /** open a file inside this source * * @param file the file to open * @return a new RawData* * @throws CannotOpenFile if the file can't be found */ virtual RawData* open(const std::string& file) const = 0; /** list all files in a directory of this source * * @param path path to list files in * Will return an empty list on \b any error */ virtual std::set listFiles(const std::string& path) const = 0; /** list all directories in a directory of this source * * @param path path to list directories in * Will return an empty list on \b any error */ virtual std::set listDirectories(const std::string& path) const = 0; protected: std::string fixPath(std::string path) const; private: VFS* m_vfs; }; } #endif fifengine-0.4.2/engine/core/vfs/vfssourceprovider.cpp000066400000000000000000000045661341615052600227560ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/log/logger.h" #include "vfssource.h" #include "vfssourceprovider.h" namespace FIFE { /** Logger to use for this source file. * @relates Logger */ static Logger _log(LM_VFS); VFSSourceProvider::VFSSourceProvider(const std::string& name) : m_vfs(0), m_name(name) { } VFSSourceProvider::~VFSSourceProvider() { } void VFSSourceProvider::setVFS(VFS* vfs) { if (m_vfs) { FL_WARN(_log, "Attempt to set a VFSSourceProvider that is already associated with a VFS."); return ; } m_vfs = vfs; } const std::string& VFSSourceProvider::getName() const { return m_name; } } fifengine-0.4.2/engine/core/vfs/vfssourceprovider.h000066400000000000000000000076161341615052600224220ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_VFS_VFSSOURCEPROVIDER_H #define FIFE_VFS_VFSSOURCEPROVIDER_H // Standard C++ library includes #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/exception.h" namespace FIFE { class VFSSource; /** VFSSourceProvider abstract baseclass * * If you add support for a new archive-type (like the fallout1&dat files) you should * also create a new VFSSourceProvider for your VFSSource - once this is done * its very easy to load new archives even without knowing their real type. * @see VFS * @see VFSSource * @see VFSSourceFactory */ class VFSSourceProvider{ public: VFSSourceProvider(const std::string& name); virtual ~VFSSourceProvider(); /** Returns the name of this VFSSourceProvider * * @return name */ const std::string& getName() const; /** Get the VFS this provider is using. Providers will not be able to locate * sources before a VFS is set. VFS::addProvider sets this automatically. */ void setVFS(VFS* vfs); VFS* getVFS() const { if(!m_vfs) throw NotSet("Attempt to load from VFSSourceProvider without setting a VFS!"); return m_vfs; } /** Check if a given file is readable for this VFSSource * * * @param file the filename to check * @return true if readable, false otherwise */ virtual bool isReadable(const std::string& file) const = 0; /** Create a new instance of a VFSSource initialized with the given file * * @param file the filename to open (the archive-file) * @return the new VFSSource */ virtual VFSSource* createSource(const std::string& file) = 0; /** Get the source instance of the path * * @param path The source path * @return A VFSSource or NULL of none is present */ virtual VFSSource* getSource(const std::string& path) const = 0; /** Check whether the provider already has created a source with that path * * @param path The path to the source * @return true if the provider has already created a source with that path, false if not */ virtual bool hasSource(const std::string & path) const = 0; private: VFS* m_vfs; std::string m_name; }; } #endif fifengine-0.4.2/engine/core/vfs/zip/000077500000000000000000000000001341615052600172475ustar00rootroot00000000000000fifengine-0.4.2/engine/core/vfs/zip/zipfilesource.cpp000066400000000000000000000043571341615052600226470ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes #include #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "zipfilesource.h" namespace FIFE { ZipFileSource::ZipFileSource(uint8_t* data, uint32_t datalen) : m_data(data), m_datalen(datalen) { } ZipFileSource::~ZipFileSource() { delete[] m_data; } uint32_t ZipFileSource::getSize() const { return m_datalen; } void ZipFileSource::readInto(uint8_t* target, uint32_t start, uint32_t len) { assert(start + len <= m_datalen); memcpy(target, m_data + start, len); } } fifengine-0.4.2/engine/core/vfs/zip/zipfilesource.h000066400000000000000000000037201341615052600223050ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_VFS_ZIP_ZIPFILESOURCE_H #define FIFE_VFS_ZIP_ZIPFILESOURCE_H #include "vfs/raw/rawdatasource.h" namespace FIFE { class VFS; class ZipFileSource : public RawDataSource { public: ZipFileSource(uint8_t* data, uint32_t datalen); virtual ~ZipFileSource(); virtual uint32_t getSize() const; virtual void readInto(uint8_t* target, uint32_t start, uint32_t len); private: uint8_t* m_data; uint32_t m_datalen; }; } #endif fifengine-0.4.2/engine/core/vfs/zip/zipnode.cpp000066400000000000000000000221431341615052600214250ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "vfs/fife_boost_filesystem.h" #include "zipnode.h" namespace { /** helper function to find a value in a ZipNodeContainer * @param container the ZipNodeContainer to search through @param the name to search for @return the ZipNode pointer, or NULL if not found */ FIFE::ZipNode* FindNameInContainer(const FIFE::ZipNodeContainer& container, const std::string& name) { for (FIFE::ZipNodeContainer::const_iterator iter = container.begin(); iter != container.end(); ++iter) { if ((*iter)->getName() == name) { return *iter; } } return 0; } FIFE::ZipNodeContainer::iterator FindNameInContainer(FIFE::ZipNodeContainer& container, const std::string& name) { for (FIFE::ZipNodeContainer::iterator iter = container.begin(); iter != container.end(); ++iter) { if ((*iter)->getName() == name) { return iter; } } return container.end(); } } namespace FIFE { ZipEntryData::ZipEntryData() : comp(0), crc32(0), size_comp(0), size_real(0), offset(0) { } ZipNode::ZipNode(const std::string& name, ZipNode* parent/*=0*/) : m_name(name), m_parent(parent) { // set the content type based on whether // the name has an extension if (HasExtension(m_name)) { m_contentType = ZipContentType::File; } else { m_contentType = ZipContentType::Directory; } } ZipNode::~ZipNode() { ZipNodeContainer::iterator iter; for (iter = m_fileChildren.begin(); iter != m_fileChildren.end(); ++iter) { delete *iter; } m_fileChildren.clear(); for (iter = m_directoryChildren.begin(); iter != m_directoryChildren.end(); ++iter) { delete *iter; } m_directoryChildren.clear(); } std::string ZipNode::getName() const { return m_name; } std::string ZipNode::getFullName() const { // traverse up the hierarchy of parents // to build the full path if (m_parent) { bfs::path path(m_parent->getFullName()); path /= m_name; return (path.string()); } else { return m_name; } } ZipContentType::Enum ZipNode::getContentType() const { return m_contentType; } ZipNode* ZipNode::getParent() const { return m_parent; } std::vector ZipNode::getChildren(ZipContentType::Enum contentType/*=ZipContentType::All*/) const { switch (contentType) { default: // fall through on purpose case ZipContentType::All: { // concatenate directory and file children // putting all directories before files // reserve space in destination vector to avoid // tons of vector resizing overhead ZipNodeContainer allNodes; allNodes.reserve(m_directoryChildren.size() + m_fileChildren.size()); allNodes.insert(allNodes.end(), m_directoryChildren.begin(), m_directoryChildren.end()); allNodes.insert(allNodes.end(), m_fileChildren.begin(), m_fileChildren.end()); return allNodes; } case ZipContentType::File: { return m_fileChildren; } case ZipContentType::Directory: { return m_directoryChildren; } } } ZipNode* ZipNode::getChild(const std::string& name, ZipContentType::Enum contentType/*=ZipContentType::All*/) const { bool hasExtension = HasExtension(name); switch (contentType) { default: // fall through on purpose case ZipContentType::All: { ZipNode* node = 0; if (hasExtension) { node = FindNameInContainer(m_fileChildren, name); } else { node = FindNameInContainer(m_directoryChildren, name); } return node; } case ZipContentType::File: { if (!hasExtension) { return 0; } return FindNameInContainer(m_fileChildren, name); } case ZipContentType::Directory: { if (hasExtension) { return 0; } return FindNameInContainer(m_directoryChildren, name); } } } ZipNode* ZipNode::addChild(const std::string& name) { ZipNode* child = new ZipNode(name, this); if (child) { if (child->getContentType() == ZipContentType::File) { m_fileChildren.push_back(child); } else if (child->getContentType() == ZipContentType::Directory) { m_directoryChildren.push_back(child); } else { // TODO - vtchill - error case here, maybe exception } } return child; } void ZipNode::removeChild(ZipNode* child) { if (child) { if (child->getContentType() == ZipContentType::File) { ZipNodeContainer::iterator iter; iter = std::find(m_fileChildren.begin(), m_fileChildren.end(), child); if (iter != m_fileChildren.end()) { delete *iter; m_fileChildren.erase(iter); } } } } void ZipNode::removeChild(const std::string& name) { if (HasExtension(name)) { ZipNodeContainer::iterator iter = FindNameInContainer(m_fileChildren, name); if (iter != m_fileChildren.end()) { delete *iter; m_fileChildren.erase(iter); } } else { ZipNodeContainer::iterator iter = FindNameInContainer(m_directoryChildren, name); if (iter != m_directoryChildren.end()) { delete *iter; m_directoryChildren.erase(iter); } } } bool ZipNode::isLeaf() const { return (m_fileChildren.empty() && m_directoryChildren.empty()); } bool ZipNode::isBranch() const { return (!isLeaf()); } void ZipNode::setZipEntryData(const ZipEntryData& entryData) { m_entryData = entryData; } const ZipEntryData& ZipNode::getZipEntryData() const { return m_entryData; } } std::ostream& operator<<(std::ostream& os, const FIFE::ZipNode& node) { // print node name first os << node.getName() << std::endl; // print all file children FIFE::ZipNodeContainer fileChildren = node.getChildren(FIFE::ZipContentType::File); FIFE::ZipNodeContainer::iterator iter; for (iter = fileChildren.begin(); iter != fileChildren.end(); ++iter) { os << *(*iter) << std::endl; } // print all directory children (recursively) FIFE::ZipNodeContainer directoryChildren = node.getChildren(FIFE::ZipContentType::Directory); for (iter = directoryChildren.begin(); iter != directoryChildren.end(); ++iter) { os << *(*iter) << std::endl; } return os; }fifengine-0.4.2/engine/core/vfs/zip/zipnode.h000066400000000000000000000141541341615052600210750ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_VFS_ZIP_ZIPNODE_H #define FIFE_VFS_ZIP_ZIPNODE_H // Standard C++ library includes #include #include #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/fife_stdint.h" namespace FIFE { struct ZipContentType { enum Enum { File = 0, // specifies files as content type Directory, // specifies directories as content type All // specifies everything as content type (no filter) }; }; struct ZipEntryData { /** constructor */ ZipEntryData(); uint16_t comp; uint32_t crc32; uint32_t size_comp; uint32_t size_real; uint32_t offset; }; // convenience typedef class ZipNode; typedef std::vector ZipNodeContainer; class ZipNode { public: /** constructor for creating a node * @param name the name of the node * @param parent the parent of this node, defaults to NULL */ ZipNode(const std::string& name, ZipNode* parent=0); /** destructor */ ~ZipNode(); /** accessor for the name of this node * */ std::string getName() const; /** accessor for the absolute path name of this node */ std::string getFullName() const; /** accessor for the content type of this node * @return ZipContentType enumeration */ ZipContentType::Enum getContentType() const; /** accessor for the parent node of this node * will be NULL if this node has no parent */ ZipNode* getParent() const; /** gives access to retrieve the children of this node * @param contentType allows filtering on the type of nodes * returned, @see ZipContentType for description * @return vector of ZipNode pointers matching the request */ std::vector getChildren(ZipContentType::Enum contentType=ZipContentType::All) const; /** gives access to retrieving a specific child node by name * @param name the name of the child node to search for * @param contentType optional for filtering on the type of node to return * @return the ZipNode pointer matching the child (NULL if not found) */ ZipNode* getChild(const std::string& name, ZipContentType::Enum contentType=ZipContentType::All) const; /** allows adding a child node to this node * @note this should only be used internally by the FIFE zip classes * @param child the name to add as a child node * @return the newly created child ZipNode */ ZipNode* addChild(const std::string& child); /** allows removing a child from this node * @param child the child node to remove */ void removeChild(ZipNode* child); /** allows removing a child node by name * @param name the name of the child to remove */ void removeChild(const std::string& name); /** accessor for checking if this node has any children * @return true if node has no children * false if node has children */ bool isLeaf() const; /** accessor for checking if this node has children * @return true if node has children * false if node does not have children */ bool isBranch() const; /** sets the zip file entry information for this * node in the zip archive * @param entryData the entry data that goes with this node */ void setZipEntryData(const ZipEntryData& entryData); /** accessor for the entry data associated with this node * in the zip archive * @return ZipEntryData for this node */ const ZipEntryData& getZipEntryData() const; private: std::string m_name; ZipContentType::Enum m_contentType; ZipEntryData m_entryData; ZipNode* m_parent; ZipNodeContainer m_fileChildren; ZipNodeContainer m_directoryChildren; }; } /** debug stream for a zip node * useful for debugging * @param os output stream * @param node the ZipNode to output * @return os output stream to allow for chaining */ std::ostream& operator<<(std::ostream& os, const FIFE::ZipNode& node); #endif fifengine-0.4.2/engine/core/vfs/zip/zipprovider.cpp000066400000000000000000000056211341615052600223340ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/exception.h" #include "vfs/vfs.h" #include "zipprovider.h" #include "zipsource.h" namespace FIFE { bool ZipProvider::isReadable(const std::string& file) const { // File name must have a .zip extension: // TODO: Case sensitive? if (file.find(".zip") == std::string::npos) return false; // File should exist: if (!getVFS()->exists(file)) return false; // File should start with the bytes "PK": // TODO: ... return true; } FIFE::VFSSource* ZipProvider::createSource(const std::string& file) { if (isReadable(file)) { VFSSource* source = NULL; if ( hasSource(file)) { source = m_sources[file]; } else { source = new ZipSource(getVFS(), file); m_sources[file] = source; } return source; } else throw Exception("File " + file + " is not readable."); } VFSSource* ZipProvider::getSource(const std::string& path) const { VFSSource* source = NULL; if (hasSource(path)) { source = m_sources.find(path)->second; } return source; } bool ZipProvider::hasSource(const std::string & path) const { return m_sources.count(path) > 0; } } fifengine-0.4.2/engine/core/vfs/zip/zipprovider.h000066400000000000000000000045711341615052600220040ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_ZIP_PROVIDER_H #define FIFE_ZIP_PROVIDER_H // Standard C++ library includes // #include // 3rd party library includes // // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "vfs/vfssourceprovider.h" namespace FIFE { /** A VFS provider for Zip archives. * * @see FIFE::VFSSourceProvider */ class ZipProvider : public VFSSourceProvider { public: ZipProvider() : VFSSourceProvider("ZIP") { } bool isReadable(const std::string& file) const; VFSSource* createSource(const std::string& file); VFSSource* getSource(const std::string& path) const; virtual bool hasSource(const std::string & path) const; private: std::map m_sources; }; } //FIFE #endif fifengine-0.4.2/engine/core/vfs/zip/zipsource.cpp000066400000000000000000000161431341615052600220030ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes #include #include #include // 3rd party library includes #include "zlib.h" // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "vfs/raw/rawdata.h" #include "vfs/fife_boost_filesystem.h" #include "util/base/exception.h" #include "util/log/logger.h" #include "zipsource.h" #include "zipfilesource.h" #include "zipnode.h" namespace FIFE { static const uint32_t LF_HEADER = 0x04034b50; static const uint32_t DE_HEADER = 0x08064b50; static const uint32_t CF_HEADER = 0x02014b50; static Logger _log(LM_LOADERS); ZipSource::ZipSource(VFS* vfs, const std::string& zip_file) : VFSSource(vfs), m_zipfile(vfs->open(zip_file)) { readIndex(); } ZipSource::~ZipSource() { delete m_zipfile; } bool ZipSource::fileExists(const std::string& file) const { bfs::path path(file); return (m_zipTree.getNode(path.string()) != 0); } RawData* ZipSource::open(const std::string& path) const { bfs::path filePath(path); ZipNode* node = m_zipTree.getNode(filePath.string()); assert(node != 0); if (node) { const ZipEntryData& entryData = node->getZipEntryData(); m_zipfile->setIndex(entryData.offset); uint8_t* data = new uint8_t[entryData.size_real]; // beware of me - one day i WILL cause memory leaks if (entryData.comp == 8) { // compressed using deflate FL_DBG(_log, LMsg("trying to uncompress file ") << path << " (compressed with method " << entryData.comp << ")"); std::unique_ptr compdata(new uint8_t[entryData.size_comp]); m_zipfile->readInto(compdata.get(), entryData.size_comp); z_stream zstream; zstream.next_in = compdata.get(); zstream.avail_in = entryData.size_comp; zstream.zalloc = Z_NULL; zstream.zfree = Z_NULL; zstream.opaque = Z_NULL; zstream.next_out = data; zstream.avail_out = entryData.size_real; if (inflateInit2(&zstream, -15) != Z_OK) { FL_ERR(_log, LMsg("inflateInit2 failed")); delete[] data; return 0; } int32_t err = inflate(&zstream, Z_FINISH); if (err != Z_STREAM_END) { if (zstream.msg) { FL_ERR(_log, LMsg("inflate failed: ") << zstream.msg); } else { FL_ERR(_log, LMsg("inflate failed without msg, err: ") << err); } inflateEnd(&zstream); delete[] data; return 0; } inflateEnd(&zstream); } else if (entryData.comp == 0) { // uncompressed m_zipfile->readInto(data, entryData.size_real); } else { FL_ERR(_log, LMsg("unsupported compression")); delete[] data; return 0; } return new RawData(new ZipFileSource(data, entryData.size_real)); } return 0; } void ZipSource::readIndex() { m_zipfile->setIndex(0); while (!readFileToIndex()) {} } bool ZipSource::readFileToIndex() { uint32_t header = m_zipfile->read32Little(); if (header == DE_HEADER || header == CF_HEADER) { // decryption header or central directory header - we are finished return true; } uint16_t vneeded = m_zipfile->read16Little(); uint16_t gflags = m_zipfile->read16Little(); uint16_t comp = m_zipfile->read16Little(); uint16_t lmodtime = m_zipfile->read16Little(); uint16_t lmoddate = m_zipfile->read16Little(); uint32_t crc = m_zipfile->read32Little(); uint32_t compsize = m_zipfile->read32Little(); uint32_t realsize = m_zipfile->read32Little(); uint16_t fnamelen = m_zipfile->read16Little(); uint16_t extralen = m_zipfile->read16Little(); if (header != LF_HEADER) { FL_ERR(_log, LMsg("invalid local file header: ") << header); return true; } if (vneeded > 20) { FL_ERR(_log, LMsg("only zip version 2 is supported, required: ") << vneeded); return true; } bfs::path filePath = bfs::path(m_zipfile->readString(fnamelen)); m_zipfile->moveIndex(extralen); uint32_t offset = m_zipfile->getCurrentIndex(); FL_DBG(_log, LMsg("found file: ") << filePath.string() << " (" << compsize << "/" << realsize << ") on offset " << offset); m_zipfile->moveIndex(compsize); if (gflags & (0x01 << 3)) { crc = m_zipfile->read32Little(); compsize = m_zipfile->read32Little(); realsize = m_zipfile->read32Little(); } if (lmodtime || lmoddate) {} // shut up the compiler (warnings of unused variables) ZipEntryData data; data.comp = comp; data.size_real = realsize; data.size_comp = compsize; data.offset = offset; data.crc32 = crc; std::string filename = filePath.string(); ZipNode* node = m_zipTree.addNode(filename); if (node) { // store the zip entry information in the node node->setZipEntryData(data); } return false; } std::set ZipSource::listFiles(const std::string& path) const { std::set result; bfs::path fixedPath(path); ZipNode* node = m_zipTree.getNode(fixedPath.string()); if (node) { ZipNodeContainer files = node->getChildren(ZipContentType::File); ZipNodeContainer::iterator iter; for (iter = files.begin(); iter != files.end(); ++iter) { result.insert((*iter)->getFullName()); } } return result; } // FIXME: quick&very dirty.. std::set ZipSource::listDirectories(const std::string& path) const { std::set result; bfs::path fixedPath(path); ZipNode* node = m_zipTree.getNode(fixedPath.string()); if (node) { ZipNodeContainer files = node->getChildren(ZipContentType::Directory); ZipNodeContainer::iterator iter; for (iter = files.begin(); iter != files.end(); ++iter) { result.insert((*iter)->getFullName()); } } return result; } } fifengine-0.4.2/engine/core/vfs/zip/zipsource.h000066400000000000000000000053661341615052600214550ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_ZIP_SOURCE_H #define FIFE_ZIP_SOURCE_H // Standard C++ library includes // #include // 3rd party library includes // // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/fife_stdint.h" #include "vfs/vfssource.h" #include "ziptree.h" namespace FIFE { /** Implements a Zip archive file source. * * @see FIFE::VFSSource */ class ZipSource : public VFSSource { public: ZipSource(VFS* vfs, const std::string& zip_file); ~ZipSource(); /// WARNING: fileExists, listFiles and listDirectories are not // thread-safe, and will probably break if called from multiple // threads at the same time. bool fileExists(const std::string& file) const; std::set listFiles(const std::string& path) const; std::set listDirectories(const std::string& path) const; virtual RawData* open(const std::string& path) const; private: void readIndex(); bool readFileToIndex(); private: ZipTree m_zipTree; RawData* m_zipfile; }; } //FIFE #endif fifengine-0.4.2/engine/core/vfs/zip/ziptree.cpp000066400000000000000000000111711341615052600214360ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes #include #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "vfs/fife_boost_filesystem.h" #include "ziptree.h" #include "zipnode.h" namespace FIFE { ZipTree::ZipTree() : m_rootNode(new ZipNode("/")) { } ZipTree::~ZipTree() { delete m_rootNode; } ZipNode* ZipTree::addNode(const std::string& nodePath) { bfs::path filePath(nodePath); std::string filename = filePath.string(); // remove the trailing '/' if it exists because the // boost::filesystem::path objects will report extra // path parts otherwise if (filename[filename.length()-1] == '/') { filename = filename.erase(filename.length()-1); } filePath = bfs::path(filename); ZipNode* node = m_rootNode; ZipNode* tempNode = 0; ZipNode* returnNode = 0; for (bfs::path::iterator iter = filePath.begin(); iter != filePath.end(); ++iter) { std::string pathString = GetPathIteratorAsString(iter); tempNode = node->getChild(pathString); if (!tempNode) { // attempt to add the child since it was not found // and reset the node to the new child node node = node->addChild(pathString); } else { // node found so reset node node = tempNode; } if (node) { // node was found or added, set the return node properly returnNode = node; } else { // node was not found and could not be added return 0; } } return returnNode; } ZipNode* ZipTree::getNode(const std::string& name) const { bfs::path filePath(name); ZipNode* returnNode = 0; ZipNode* tempNode = 0; ZipNode* node = getRootNode(); for (bfs::path::iterator iter = filePath.begin(); iter != filePath.end(); ++iter) { std::string pathString = GetPathIteratorAsString(iter); if (pathString == ".." && (node != getRootNode())) { // handle ".." path case by setting the node back to the parent node = node->getParent(); } else { // look for the path name in the child nodes tempNode = node->getChild(pathString); if (tempNode) { node = tempNode; // node was found so we reset the return node // to the newly found node returnNode = node; } } } return returnNode; } ZipNode* ZipTree::getRootNode() const { return m_rootNode; } } std::ostream& operator<<(std::ostream& os, const FIFE::ZipTree& zipTree) { assert(zipTree.getRootNode() != 0); os << *(zipTree.getRootNode()); return os; }fifengine-0.4.2/engine/core/vfs/zip/ziptree.h000066400000000000000000000062321341615052600211050ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_VFS_ZIP_ZIPTREE_H #define FIFE_VFS_ZIP_ZIPTREE_H // Standard C++ library includes #include #include #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder namespace FIFE { class ZipNode; class ZipTree { public: /** constructor */ ZipTree(); /** destructor */ ~ZipTree(); /** adds a node to the proper place in the tree * based on the node path name * @param nodePath the node description * @return ZipNode of the most derived path added (value after the last path separator) or NULL if the path could not be added */ ZipNode* addNode(const std::string& nodePath); /** accessor for getting a node by name * @param name the name to search for * @ param ZipNode pointer, or NULL if not found */ ZipNode* getNode(const std::string& name) const; /** accessor for the root node of the tree * mostly used for debugging purposes * @return ZipNode pointer to the root node */ ZipNode* getRootNode() const; private: ZipNode* m_rootNode; }; } /** debug stream for a zip tree * useful for debugging * @param os output stream * @param zipTree the ZipTree to output * @return os output stream to allow for chaining */ std::ostream& operator<<(std::ostream& os, const FIFE::ZipTree& zipTree); #endif fifengine-0.4.2/engine/core/video/000077500000000000000000000000001341615052600167555ustar00rootroot00000000000000fifengine-0.4.2/engine/core/video/animation.cpp000066400000000000000000000127041341615052600214440ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/exception.h" #include "util/time/timemanager.h" #include "loaders/native/video/resourceanimationloader.h" #include "animation.h" #include "image.h" namespace FIFE { Animation::Animation(IResourceLoader* loader): IResource(createUniqueAnimationName(), loader), m_action_frame(-1), m_animation_endtime(-1), m_direction(0) { } Animation::Animation(const std::string& name, IResourceLoader* loader): IResource(name, loader), m_action_frame(-1), m_animation_endtime(-1), m_direction(0) { } Animation::~Animation() { // note: we don't need to free the images, as they are handled via // smart references. } size_t Animation::getSize() { return 0; } void Animation::load() { if (m_loader){ m_loader->load(this); } else { ResourceAnimationLoader loader; loader.load(this); } m_state = IResource::RES_LOADED; } void Animation::free() { std::vector::iterator it = m_frames.begin(); for (; it != m_frames.end(); ++it) { (*it).image->free(); } m_state = IResource::RES_NOT_LOADED; } void Animation::invalidate() { free(); m_framemap.clear(); m_frames.clear(); m_action_frame = -1; m_animation_endtime = -1; m_direction = 0; } std::string Animation::createUniqueAnimationName() { // automated counting for name generation, in case the user doesn't provide a name static uint32_t uniqueNumber = 0; static std::string baseName = "animation"; std::ostringstream oss; oss << uniqueNumber << "_" << baseName; const std::string name = oss.str(); ++uniqueNumber; return name; } void Animation::addFrame(ImagePtr image, uint32_t duration) { FrameInfo info; info.index = m_frames.size(); info.duration = duration; info.image = image; m_frames.push_back(info); std::map::const_iterator i(m_framemap.end()); if (i == m_framemap.begin()) { m_framemap[0] = info; m_animation_endtime = duration; } else { --i; uint32_t frametime = i->first + i->second.duration; m_framemap[frametime] = info; m_animation_endtime = frametime + duration; } } int32_t Animation::getFrameIndex(uint32_t timestamp) { int32_t val = -1; if ((static_cast(timestamp) <= m_animation_endtime) && (m_animation_endtime > 0)) { std::map::const_iterator i(m_framemap.upper_bound(timestamp)); --i; val = i->second.index; } return val; } bool Animation::isValidIndex(int32_t index) const{ int32_t size = m_frames.size(); return size > 0 && index >= 0 && index < size; } ImagePtr Animation::getFrame(int32_t index) { ImagePtr image; if (isValidIndex(index)) { image = m_frames[index].image; if (image->getState() == IResource::RES_NOT_LOADED) { image->load(); } } return image; } ImagePtr Animation::getFrameByTimestamp(uint32_t timestamp) { ImagePtr val; if ((static_cast(timestamp) <= m_animation_endtime) && (m_animation_endtime > 0)) { std::map::const_iterator i(m_framemap.upper_bound(timestamp)); --i; val = i->second.image; } if(val && val->getState() == IResource::RES_NOT_LOADED) { val->load(); } return val; } std::vector Animation::getFrames() { std::vector frames; for (std::vector::iterator it = m_frames.begin(); it != m_frames.end(); ++it) { frames.push_back((*it).image); } return frames; } int32_t Animation::getFrameDuration(int32_t index) const{ if (isValidIndex(index)) { return m_frames[index].duration; } return -1; } uint32_t Animation::getFrameCount() const { return m_frames.size(); } void Animation::setDirection(uint32_t direction) { m_direction = direction % 360; } } fifengine-0.4.2/engine/core/video/animation.h000066400000000000000000000135751341615052600211200ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_VIDEO_ANIMATION_H #define FIFE_VIDEO_ANIMATION_H // Standard C++ library includes #include #include #include // Platform specific includes #include "util/base/fife_stdint.h" #include "util/resource/resource.h" #include "image.h" // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder namespace FIFE { /** Animation. * * A container of Images describing an animation. Animation itself does * not take care of animating the images. Instead it contains images * having associated timestamps. It is the responsibility of the * animation user to query frames based on current timestamp and show * returned images on screen. */ class Animation : public IResource { public: /** Constructor. */ Animation(IResourceLoader* loader = 0); Animation(const std::string& name, IResourceLoader* loader = 0); /** Destructor. Decreases the reference count of all referred images. */ ~Animation(); virtual size_t getSize(); virtual void load(); virtual void free(); void invalidate(); /** Adds new frame into animation * Frames must be added starting from first frame. Increases the reference * count of the given image. * @param image Pointer to Image. Does not transfer the ownership * @param duration Duration for given frame in the animation */ void addFrame(ImagePtr image, uint32_t duration); /** Get the frame index that matches given timestamp. In case there is no exact match, * correct frame is calculated. E.g. if there are frames for timestamps 50 and 100 * and frame for 75 is asked, frame associated with value 50 is given back. * In case the timestamp is past the sequence, negative value is returned * @see addFrame */ int32_t getFrameIndex(uint32_t timestamp); /** Gets the frame iamge that matches the given index. If no matches found, returns an invalid ImagePtr */ ImagePtr getFrame(int32_t index); /** Gets the frame image that matches the given timestamp. */ ImagePtr getFrameByTimestamp(uint32_t timestamp); /** Gets all frame images. */ std::vector getFrames(); /** Gets the frame duration for given (indexed) frame. Returns negative value in case * of incorrect index */ int32_t getFrameDuration(int32_t index) const; /** Get the number of frames */ uint32_t getFrameCount() const; /** Sets the action frame. Action frame is the frame when the related * action actually happens. E.g. in case of punch animation, action frame is * the frame when punch hits the target. In case there is no associated * action frame, value is negative * @param num index of the action frame. */ void setActionFrame(int32_t num) { m_action_frame = num; } /** Gets the action frame. * @see setActionFrame */ int32_t getActionFrame() const { return m_action_frame; } /** Animation direction tells how this animation is associated * with movement when played starting from frame 0 * E.g. in walking animation there should be direction assigned so * that engine can choose the correct animation when characters are * moved around the map area * @param direction direction to set */ void setDirection(uint32_t direction); /** Gets the animation direction * @see setDirection * @return direction for this animation */ uint32_t getDirection() const { return m_direction; } /** Gets the total duration for the whole animation */ uint32_t getDuration() const { return m_animation_endtime; } private: /** Contains information about one animation frame (duration + frame index + frame pointer) */ struct FrameInfo { uint32_t index; uint32_t duration; ImagePtr image; }; std::string createUniqueAnimationName(); /** Checks for animation frame index overflows */ bool isValidIndex(int32_t index) const; // Map of timestamp + associated frame std::map m_framemap; // vector of frames for fast indexed access std::vector m_frames; // Action frame of the Animation. int32_t m_action_frame; // time when animation ends (zero based) int32_t m_animation_endtime; // Direction for this animation uint32_t m_direction; }; typedef SharedPtr AnimationPtr; } #endif fifengine-0.4.2/engine/core/video/animationmanager.cpp000066400000000000000000000330521341615052600227760ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2013 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes #include // 3rd party library includes #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/log/logger.h" #include "util/resource/resourcemanager.h" #include "util/resource/resource.h" #include "video/renderbackend.h" #include "animationmanager.h" namespace FIFE { /** Logger to use for this source file. * @relates Logger */ static Logger _log(LM_RESMGR); AnimationManager::~AnimationManager() { } size_t AnimationManager::getMemoryUsed() const { size_t totalSize = 0; AnimationHandleMapConstIterator it = m_animHandleMap.begin(), itend = m_animHandleMap.end(); for ( ; it != itend; ++it) { totalSize += it->second->getSize(); } return totalSize; } size_t AnimationManager::getTotalResourcesCreated() const { AnimationHandleMapConstIterator it = m_animHandleMap.begin(), itend = m_animHandleMap.end(); size_t count = 0; for ( ; it != itend; ++it) { if ( it->second->getState() == IResource::RES_NOT_LOADED ) { count++; } } return count; } size_t AnimationManager::getTotalResourcesLoaded() const { AnimationHandleMapConstIterator it = m_animHandleMap.begin(), itend = m_animHandleMap.end(); size_t count = 0; for ( ; it != itend; ++it) { if ( it->second->getState() == IResource::RES_LOADED ) { count++; } } return count; } size_t AnimationManager::getTotalResources() const { return m_animHandleMap.size(); } AnimationPtr AnimationManager::create(IResourceLoader* loader){ Animation* ptr = new Animation(loader); return add(ptr); } AnimationPtr AnimationManager::create(const std::string& name, IResourceLoader* loader){ if (exists(name)) { FL_WARN(_log, LMsg("AnimationManager::create(std::string, IResourceLoader* loader) - ") << "Resource name " << name << " was previously created. Returning original Animation..."); return getPtr(name); } Animation* ptr = new Animation(name, loader); return add(ptr); } AnimationPtr AnimationManager::load(const std::string& name, IResourceLoader* loader) { AnimationNameMapIterator nit = m_animNameMap.find(name); if (nit != m_animNameMap.end()) { if ( nit->second->getState() == IResource::RES_NOT_LOADED ) { nit->second->load(); } return nit->second; } //was not found so create and load resource AnimationPtr ptr = create(name, loader); ptr->load(); if (ptr->getState() == IResource::RES_NOT_LOADED){ FL_WARN(_log, LMsg("AnimationManager::load(std::string) - ") << "Resource name " << name << " was not found and could not be loaded."); remove(name); } return ptr; } AnimationPtr AnimationManager::add(Animation* res) { assert(res); assert(!(exists(res->getHandle()) || exists(res->getName()))); AnimationPtr resptr(res); std::pair returnValue; returnValue = m_animHandleMap.insert ( AnimationHandleMapPair(res->getHandle(), resptr)); if (returnValue.second) { m_animNameMap.insert ( AnimationNameMapPair(returnValue.first->second->getName(), returnValue.first->second) ); } else { FL_WARN(_log, LMsg("AnimationManager::add(IResource*) - ") << "Resource " << res->getName() << " already exists.... ignoring."); } return returnValue.first->second; } bool AnimationManager::exists(const std::string& name) { AnimationNameMapIterator it = m_animNameMap.find(name); if (it != m_animNameMap.end()) { return true; } return false; } bool AnimationManager::exists(ResourceHandle handle) { AnimationHandleMapConstIterator it = m_animHandleMap.find(handle); if (it != m_animHandleMap.end()) { return true; } return false; } void AnimationManager::reload(const std::string& name) { AnimationNameMapIterator nit = m_animNameMap.find(name); if (nit != m_animNameMap.end()) { if ( nit->second->getState() == IResource::RES_LOADED) { nit->second->free(); } nit->second->load(); return; } FL_WARN(_log, LMsg("AnimationManager::reload(std::string) - ") << "Resource name " << name << " not found."); } void AnimationManager::reload(ResourceHandle handle) { AnimationHandleMapIterator it = m_animHandleMap.find(handle); if ( it != m_animHandleMap.end()) { if ( it->second->getState() == IResource::RES_LOADED) { it->second->free(); } it->second->load(); return; } FL_WARN(_log, LMsg("AnimationManager::reload(ResourceHandle) - ") << "Resource handle " << handle << " not found."); } void AnimationManager::reloadAll() { AnimationHandleMapIterator it = m_animHandleMap.begin(), itend = m_animHandleMap.end(); for ( ; it != itend; ++it) { if ( it->second->getState() == IResource::RES_LOADED) { it->second->free(); } it->second->load(); } } void AnimationManager::loadUnreferenced() { AnimationHandleMapIterator it = m_animHandleMap.begin(), itend = m_animHandleMap.end(); int32_t count = 0; for ( ; it != itend; ++it) { if (it->second.useCount() == 2 && it->second->getState() != IResource::RES_LOADED){ it->second->load(); count++; } } FL_DBG(_log, LMsg("AnimationManager::loadUnreferenced() - ") << "Loaded " << count << " unreferenced resources."); } void AnimationManager::free(const std::string& name) { AnimationNameMapIterator nit = m_animNameMap.find(name); if (nit != m_animNameMap.end()) { if ( nit->second->getState() == IResource::RES_LOADED) { nit->second->free(); } return; } FL_WARN(_log, LMsg("AnimationManager::free(std::string) - ") << "Resource name " << name << " not found."); } void AnimationManager::free(ResourceHandle handle) { AnimationHandleMapConstIterator it = m_animHandleMap.find(handle); if (it != m_animHandleMap.end()) { if ( it->second->getState() == IResource::RES_LOADED) { it->second->free(); } return; } FL_WARN(_log, LMsg("AnimationManager::free(ResourceHandle) - ") << "Resource handle " << handle << " not found."); } void AnimationManager::freeAll() { AnimationHandleMapIterator it = m_animHandleMap.begin(), itend = m_animHandleMap.end(); int32_t count = 0; for ( ; it != itend; ++it) { if ( it->second->getState() == IResource::RES_LOADED) { it->second->free(); count++; } } FL_DBG(_log, LMsg("AnimationManager::freeAll() - ") << "Freed all " << count << " resources."); } void AnimationManager::freeUnreferenced() { AnimationHandleMapIterator it = m_animHandleMap.begin(), itend = m_animHandleMap.end(); int32_t count = 0; for ( ; it != itend; ++it) { if (it->second.useCount() == 2 && it->second->getState() == IResource::RES_LOADED ){ it->second->free(); count++; } } FL_DBG(_log, LMsg("AnimationManager::freeUnreferenced() - ") << "Freed " << count << " unreferenced resources."); } void AnimationManager::remove(AnimationPtr& resource) { AnimationHandleMapIterator it = m_animHandleMap.find(resource->getHandle()); AnimationNameMapIterator nit = m_animNameMap.find(resource->getName()); if (it != m_animHandleMap.end()) { m_animHandleMap.erase(it); if (nit != m_animNameMap.end()) { m_animNameMap.erase(nit); return; } assert(false); //should never get here } FL_WARN(_log, LMsg("AnimationManager::remove(ResourcePtr&) - ") << "Resource " << resource->getName() << " was not found."); } void AnimationManager::remove(const std::string& name) { std::size_t handle; AnimationNameMapIterator nit = m_animNameMap.find(name); if (nit != m_animNameMap.end()) { handle = nit->second->getHandle(); m_animNameMap.erase(nit); } else { FL_WARN(_log, LMsg("AnimationManager::remove(std::string) - ") << "Resource " << name << " was not found."); return; } AnimationHandleMapIterator it = m_animHandleMap.find(handle); if ( it != m_animHandleMap.end()) { m_animHandleMap.erase(it); return; } assert(false); //should never get here } void AnimationManager::remove(ResourceHandle handle) { std::string name; AnimationHandleMapIterator it = m_animHandleMap.find(handle); if (it != m_animHandleMap.end()) { name = it->second->getName(); m_animHandleMap.erase(it); } else { FL_WARN(_log, LMsg("AnimationManager::remove(ResourceHandle) - ") << "Resource handle " << handle << " was not found."); return; } AnimationNameMapIterator nit = m_animNameMap.find(name); if ( nit != m_animNameMap.end() ) { m_animNameMap.erase(nit); return; } assert(false); //should never get here } void AnimationManager::removeAll() { //should always be equal assert (m_animHandleMap.size() == m_animNameMap.size()); size_t count = m_animHandleMap.size(); m_animHandleMap.clear(); m_animNameMap.clear(); FL_DBG(_log, LMsg("AnimationManager::removeAll() - ") << "Removed all " << count << " resources."); } void AnimationManager::removeUnreferenced() { AnimationHandleMapIterator it = m_animHandleMap.begin(), itend = m_animHandleMap.end(); std::vector imgHandles; int32_t count = 0; for ( ; it != itend; ++it) { if ( it->second.useCount() == 2) { imgHandles.push_back(it->second->getHandle()); count++; } } for (std::vector::iterator it = imgHandles.begin(); it != imgHandles.end(); ++it) { remove(*it); } FL_DBG(_log, LMsg("AnimationManager::removeUnreferenced() - ") << "Removed " << count << " unreferenced resources."); } AnimationPtr AnimationManager::get(const std::string& name) { AnimationNameMapIterator nit = m_animNameMap.find(name); if (nit != m_animNameMap.end()) { if (nit->second->getState() != IResource::RES_LOADED){ //resource is not loaded so load it nit->second->load(); } return nit->second; } //not found so attempt to create and load the resource AnimationPtr ptr = load(name); return ptr; } AnimationPtr AnimationManager::get(ResourceHandle handle) { AnimationHandleMapConstIterator it = m_animHandleMap.find(handle); if (it != m_animHandleMap.end()) { if (it->second->getState() != IResource::RES_LOADED){ //resource is not loaded so load it it->second->load(); } return it->second; } FL_WARN(_log, LMsg("AnimationManager::get(ResourceHandle) - ") << "Resource handle " << handle << " is undefined."); return AnimationPtr(); } AnimationPtr AnimationManager::getPtr(const std::string& name) { AnimationNameMapIterator nit = m_animNameMap.find(name); if (nit != m_animNameMap.end()) { return nit->second; } FL_WARN(_log, LMsg("AnimationManager::getPtr(std::string) - ") << "Resource " << name << " is undefined."); return AnimationPtr(); } AnimationPtr AnimationManager::getPtr(ResourceHandle handle) { AnimationHandleMapConstIterator it = m_animHandleMap.find(handle); if (it != m_animHandleMap.end()) { return it->second; } FL_WARN(_log, LMsg("AnimationManager::getPtr(ResourceHandle) - ") << "Resource handle " << handle << " is undefined."); return AnimationPtr(); } ResourceHandle AnimationManager::getResourceHandle(const std::string& name) { AnimationNameMapIterator nit = m_animNameMap.find(name); if (nit != m_animNameMap.end()) { return nit->second->getHandle(); } FL_WARN(_log, LMsg("AnimationManager::getResourceHandle(std::string) - ") << "Resource " << name << " is undefined."); return 0; } void AnimationManager::invalidate(const std::string& name) { AnimationNameMapIterator it = m_animNameMap.find(name); if (it != m_animNameMap.end()) { if (it->second->getState() == IResource::RES_LOADED){ it->second.get()->invalidate(); } } } void AnimationManager::invalidate(ResourceHandle handle) { AnimationHandleMapIterator it = m_animHandleMap.find(handle); if (it != m_animHandleMap.end()) { if (it->second->getState() == IResource::RES_LOADED) { it->second.get()->invalidate(); } } } void AnimationManager::invalidateAll() { AnimationHandleMapIterator it = m_animHandleMap.begin(), itend = m_animHandleMap.end(); for ( ; it != itend; ++it) { if (it->second->getState() == IResource::RES_LOADED) { it->second.get()->invalidate(); } } } } //FIFE fifengine-0.4.2/engine/core/video/animationmanager.h000066400000000000000000000275351341615052600224540ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2013 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_ANIMATION_MANAGER_H #define FIFE_ANIMATION_MANAGER_H // Standard C++ library includes #include #include #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/singleton.h" #include "util/resource/resource.h" #include "util/resource/resourcemanager.h" #include "animation.h" namespace FIFE { /** AnimationManager * * An interface for managing animations. * * @see IResource * @see IResourceLoader * @see IResourceManager * */ class AnimationManager : public IResourceManager, public DynamicSingleton { public: /** Default constructor. */ AnimationManager() : IResourceManager() { } /** Destructor. */ virtual ~AnimationManager(); virtual size_t getMemoryUsed() const; virtual size_t getTotalResourcesCreated() const; virtual size_t getTotalResourcesLoaded() const; virtual size_t getTotalResources() const; /** Creates a blank Animation but does not load it immediately * * @param loader A pointer to the custom resource loader. The * default is NULL. If this parameter is present the resource * will use the loader to load instead of the default built in * functions. * @return An AnimationPtr to the newly created Animation * * @see Animation * @see AnimationLoader * @see IResourceLoader * */ virtual AnimationPtr create(IResourceLoader* loader = 0); /** Creates a blank Animation but does not load it immediately * * @param name The resource name. Typically a filename. * @param loader A pointer to the custom resource loader. The * default is NULL. If this parameter is present the resource * will use the loader to load instead of the default built in * functions. * @return An AnimationPtr to the newly created Animation * * @see Animation * @see AnimationLoader * @see IResourceLoader * */ virtual AnimationPtr create(const std::string& name, IResourceLoader* loader = 0); /** Creates a blank resource and loads it from disk * * This function will create the Animation if necessary and load * the Animation from disk. If the Animation is not defined it * will call AnimationManager::create() before loading. * * @param name The resource name. Typically a filename. * @param loader A pointer to the custom resource loader. The * default is NULL. If this parameter is present the resource * will use the loader to load instead of the default built in * functions. * @return A AnimationPtr to the loaded Animation * * @see Animation * @see AnimationLoader * @see IResourceLoader * */ virtual AnimationPtr load(const std::string& name, IResourceLoader* loader = 0); /** Add an Animation to the manager * * This function will create a AnimationPtr and add the Animation * to the manager. The manager assumes ownership of the Animation * so DO NOT delete it. * * @param res A pointer to the Animation * @return A AnimationPtr to the added resource * * @see Animation * */ virtual AnimationPtr add(Animation* res); /** Checks to see if an Animation exists * * This function will search the manager for Animations * that match the parameter * * @param name The name of the Animation * @return True if the Animation exists. False otherwise. * */ virtual bool exists(const std::string& name); /** Checks to see if an Animation exists * * This function will search the manager for Animations * that match the parameter * * @param handle The handle of the Animation * @return True if the Animation exists. False otherwise. * */ virtual bool exists(ResourceHandle handle); /** Reloads an Animation * * This function will reload an Animation if it is managed * by the manager. If not it creates an entry in the log * specifying that the Animation could not be found. It will * load the Animation if it is not already loaded. * * @param name The name of the resource * */ virtual void reload(const std::string& name); /** Reloads a resource * * This function will reload an Animation if it is managed * by the manager. If not it creates an entry in the log * specifying that the Animation could not be found. It will * load the Animation if it is not already loaded. * * @param handle The handle of the resource * */ virtual void reload(ResourceHandle handle); /** Reloads all Animations * * This function will reload all Animations managed by the * manager. It will load an Animation if it is not already loaded. * * @todo It might be beneficial to supply a parameter to * only reload resources that are already loaded * */ virtual void reloadAll(); /** Loads all unreferenced Animations * * All Animations that have no external references will be * loaded into memory. * */ virtual void loadUnreferenced(); /** Frees an Animation from memory * * The Animation is not deleted but it's data is freed. * This calls the Animation::free() function and it is * up to the resource to properly free it's memory. The * manager keeps a reference to the Animation in case * its required in the future. * * @param name The name of the Animation * * @see Animation * */ virtual void free(const std::string& name); /** Frees an Animation from memory * * The Animation is not deleted but it's data is freed. * This calls the Animation::free() function and it is * up to the resource to properly free it's memory. The * manager keeps a reference to the Animation in case * its required in the future. * * @param handle The handle of the Animation * * @see Animation * */ virtual void free(ResourceHandle handle); /** Frees all Animations * * This calls the Animation::free() function for every * Animation the manager is managing. It does not remove * them from the manager. * * @see Animation * */ virtual void freeAll(); /** Frees all unreferenced Animation * * This calls the IResource::free() function for Animations * that have no external references to them. It does not * remove them from the manager. * * @see IResource * */ virtual void freeUnreferenced(); /** Removes an Animation from the manager * * This removes all references to the Animation from the * manager. It does not however guarantee that the resources * destructor is called. If the client has any left over * references to the resource it will not be freed. * * @param resource A AnimationPtr to the Animation to be removed * from the manager * * @note This is useful if you want to remove ownership of a resource * from the manager * * @see Animation * */ virtual void remove(AnimationPtr& resource); /** Removes an Animation from the manager * * This removes all references to the Animation from the * manager. It does not however guarantee that the resources * destructor is called. If the client has any left over * references to the resource it will not be freed. * * @param name The name of the Animation * * @see Animation * */ virtual void remove(const std::string& name); /** Removes an Animation from the manager * * This removes all references to the Animation from the * manager. It does not however guarantee that the resources * destructor is called. If the client has any left over * references to the resource it will not be freed. * * @param handle The handle of the Animation * * @see Animation * */ virtual void remove(ResourceHandle handle); /** Removes all Animations from the manager * * This effectively removes all references to all Animations from * the manager. If there are left over shared pointers to * any resources they will not be deleted. * * @see Animation * */ virtual void removeAll(); /** Removes all unreferenced Animations * * This effectively removes all Animations that dont have an * external reference. The resources will be deleted. * * @see Animation * */ virtual void removeUnreferenced(); /** Gets a shared pointer to the Animation * * If the Animation is not defined it will attempt to create * and load the Animation based on the name (it assumes the name * is a filename) * * @param name The name of the Animation * @return An AnimationPtr to the Animation * */ virtual AnimationPtr get(const std::string& name); /** Gets a shared pointer to the Animation * * If the resource is not defined it returns an empty * (or invalid) AnimationPtr and makes an entry in the log. * * @param handle The handle of the resource * @return A AnimationPtr to the resource * * @todo This should throw an exception instead of an * empty AnimationPtr * */ virtual AnimationPtr get(ResourceHandle handle); virtual AnimationPtr getPtr(const std::string& name); virtual AnimationPtr getPtr(ResourceHandle handle); /** Gets an Animation handle by name * * Returns the Animation handle associated with the name * * @param name The name of the Animation * @return 0 if the resource name is invalid * */ virtual ResourceHandle getResourceHandle(const std::string& name); virtual void invalidate(const std::string& name); virtual void invalidate(ResourceHandle handle); virtual void invalidateAll(); private: typedef std::map< ResourceHandle, AnimationPtr > AnimationHandleMap; typedef std::map< ResourceHandle, AnimationPtr >::iterator AnimationHandleMapIterator; typedef std::map< ResourceHandle, AnimationPtr >::const_iterator AnimationHandleMapConstIterator; typedef std::pair< ResourceHandle, AnimationPtr > AnimationHandleMapPair; typedef std::map< std::string, AnimationPtr > AnimationNameMap; typedef std::map< std::string, AnimationPtr >::iterator AnimationNameMapIterator; typedef std::map< std::string, AnimationPtr >::const_iterator AnimationNameMapConstIterator; typedef std::pair< std::string, AnimationPtr > AnimationNameMapPair; AnimationHandleMap m_animHandleMap; AnimationNameMap m_animNameMap; }; } //FIFE #endif //FIFE_ANIMATION_MANAGER_H fifengine-0.4.2/engine/core/video/atlasbook.cpp000066400000000000000000000154301341615052600214430ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/exception.h" #include "atlasbook.h" namespace FIFE { AtlasBlock AtlasBlock::intersects(AtlasBlock const& rect) const { AtlasBlock ret; ret.left = std::max(rect.left, left); ret.right = std::min(rect.right, right); ret.top = std::max(rect.top, top); ret.bottom = std::min(rect.bottom, bottom); if(ret.left > ret.right || ret.top > ret.bottom) { ret.setTrivial(); } return ret; } void AtlasBlock::merge(AtlasBlock const& rect) { left = std::min(rect.left, left); right = std::max(rect.right, right); top = std::min(rect.top, top); bottom = std::max(rect.bottom, bottom); } AtlasBlock* AtlasPage::getBlock(uint32_t width, uint32_t height) { if(static_cast(width*height*pixelSize) > freePixels) { return 0; } blocks.push_back(AtlasBlock(Rect(), 0)); AtlasBlock* newBlock = &blocks[blocks.size() - 1]; for(uint32_t v = 0; (v+1)*height <= this->height; ++v) { newBlock->top = v * height; newBlock->bottom = (v+1) * height; for(uint32_t u = 0; (u+1)*width <= this->width; ++u) { newBlock->left = u * width; newBlock->right = (u+1) * width; AtlasBlock const* intersection = intersects(newBlock); if(!intersection) { freePixels -= width*height*pixelSize; assert(freePixels >= 0); // try to squeeze a little bit (horizontal) if(newBlock->left > 0) { AtlasBlock squeezed(*newBlock); --squeezed.left; --squeezed.right; if(!(intersection = intersects(&squeezed))) { ++squeezed.left; ++squeezed.right; int blockWidth = newBlock->getWidth(); // binary search for(int i = 0, div = 2; i < 4; ++i) { squeezed.left -= blockWidth / div; squeezed.right -= blockWidth / div; if((intersection = intersects(&squeezed))) { squeezed.left += blockWidth / div; squeezed.right += blockWidth / div; } div <<= 1; } // linear search while(!(intersection = intersects(&squeezed)) && squeezed.left > 0) { --squeezed.left; --squeezed.right; } newBlock->left = squeezed.left + 1; newBlock->right = squeezed.right + 1; } } // try to squeeze a little bit (vertical) if(newBlock->top > 0) { AtlasBlock squeezed(*newBlock); --squeezed.top; --squeezed.bottom; if(!(intersection = intersects(&squeezed))) { ++squeezed.top; ++squeezed.bottom; int blockHeight = newBlock->getHeight(); // binary search for(int i = 0, div = 2; i < 4; ++i) { squeezed.top -= blockHeight / div; squeezed.bottom -= blockHeight / div; if((intersection = intersects(&squeezed))) { squeezed.top += blockHeight / div; squeezed.bottom += blockHeight / div; } div <<= 1; } // linear search while(!(intersection = intersects(&squeezed)) && squeezed.top > 0) { --squeezed.top; --squeezed.bottom; } newBlock->top = squeezed.top + 1; newBlock->bottom = squeezed.bottom + 1; } } newBlock->page = this->page; return newBlock; } } } // couldn't find suitable place for a new block blocks.pop_back(); return 0; } void AtlasPage::shrink(bool pot) { AtlasBlock boundaryBox(Rect(), 0); for(Blocks::iterator block = blocks.begin(); block != blocks.end(); ++block) { boundaryBox.merge(*block); } assert(boundaryBox.left == 0); assert(boundaryBox.top == 0); if(pot) { uint32_t bwidth = boundaryBox.getWidth(); uint32_t bheight = boundaryBox.getHeight(); if(bwidth < width) { // look for next power of 2 for width uint32_t powof2 = 1; while(powof2 < bwidth) powof2 <<= 1; width = std::min(powof2, width); } if(bheight < height) { // look for next power of 2 for width uint32_t powof2 = 1; while(powof2 < bheight) powof2 <<= 1; height = std::min(powof2, height); } } else { width = boundaryBox.getWidth(); height = boundaryBox.getHeight(); } } AtlasBlock const* AtlasPage::intersects(AtlasBlock const* block) const { for(size_t b = 0; b < blocks.size() - 1; ++b) { if(!blocks[b].intersects(*block).isTrivial()) return block; } // no intersection return 0; } AtlasBlock* AtlasBook::getBlock(uint32_t width, uint32_t height) { for(Pages::iterator page = pages.begin(); page != pages.end(); ++page) { AtlasBlock* block = page->getBlock(width, height); if(block) { return block; } } return extendCache(width, height)->getBlock(width, height); } AtlasPage* AtlasBook::extendCache(uint32_t minPageWidth, uint32_t minPageHeight) { if(minPageWidth > pageWidth || minPageHeight > pageHeight) { throw Exception("Texture is too big for this atlas."); } assert(minPageWidth <= pageWidth); assert(minPageHeight <= pageHeight); pages.push_back(AtlasPage(pageWidth, pageHeight, pixelSize, pages.size())); return &pages[pages.size()-1]; } void AtlasBook::shrink(bool pot) { for(Pages::iterator page = pages.begin(); page != pages.end(); ++page) { page->shrink(pot); } } }fifengine-0.4.2/engine/core/video/atlasbook.h000066400000000000000000000102121341615052600211010ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_VIDEO_ATLASBOOK_H #define FIFE_VIDEO_ATLASBOOK_H // Standard C++ library includes #include #include #include #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/structures/rect.h" namespace FIFE { class AtlasBlock { public: uint32_t page; uint32_t left, right, top, bottom; AtlasBlock(const Rect& rect, uint32_t page) : page(page), left(rect.x), right(rect.right()), top(rect.y), bottom(rect.bottom()){ } AtlasBlock() { } // (0,0) [left] [right] // +-------------------- // | // [top] | +---------+ // | | | // | | | // | | | // | | | // [bottom] | +---------+ // | // bottom > top // right > left void setTrivial() { left = right = top = bottom = 0; } bool isTrivial() const { return getWidth() == 0 || getHeight() == 0; } uint32_t getWidth() const { return right - left; } uint32_t getHeight() const { return bottom - top; } AtlasBlock intersects(AtlasBlock const& rect) const; void merge(AtlasBlock const& rect); }; class AtlasPage { public: AtlasPage(uint32_t width, uint32_t height, uint32_t pixelSize, uint32_t page) : width(width), height(height), pixelSize(pixelSize), page(page), freePixels(width*height*pixelSize){ } AtlasBlock* getBlock(uint32_t width, uint32_t height); void shrink(bool pot); uint32_t getWidth() const { return width; } uint32_t getHeight() const { return height; } private: AtlasBlock const* intersects(AtlasBlock const* block) const; uint32_t width, height; uint32_t pixelSize; uint32_t page; int32_t freePixels; typedef std::vector Blocks; Blocks blocks; }; class AtlasBook { public: AtlasBook(uint32_t pageWidth, uint32_t pageHeight, uint32_t pixelSize = 4) : pageWidth(pageWidth), pageHeight(pageHeight), pixelSize(pixelSize) { } AtlasBlock* getBlock(uint32_t width, uint32_t height); // try to shrink every atlas page void shrink(bool pot); AtlasPage& getPage(size_t index) { return pages[index]; } private: // add new atlas to atlas container AtlasPage* extendCache(uint32_t minPageWidth, uint32_t minPageHeight); // How big the new atlases should be uint32_t pageWidth, pageHeight; uint32_t pixelSize; typedef std::vector Pages; Pages pages; }; } #endif fifengine-0.4.2/engine/core/video/color.cpp000066400000000000000000000050221341615052600205760ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // Platform specific includes #include "util/base/fife_stdint.h" // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "color.h" namespace FIFE { Color::Color(uint8_t r, uint8_t g, uint8_t b, uint8_t alpha) : m_r(r), m_g(g), m_b(b), m_a(alpha) { } Color::~Color() { } void Color::set(uint8_t r, uint8_t g, uint8_t b, uint8_t alpha) { m_r = r; m_g = g; m_b = b; m_a = alpha; } void Color::setR(uint8_t r) { m_r = r; } void Color::setG(uint8_t g) { m_g = g; } void Color::setB(uint8_t b) { m_b = b; } void Color::setAlpha(uint8_t alpha) { m_a = alpha; } uint8_t Color::getR() const { return m_r; } uint8_t Color::getG() const { return m_g; } uint8_t Color::getB() const { return m_b; } uint8_t Color::getAlpha() const { return m_a; } }fifengine-0.4.2/engine/core/video/color.h000066400000000000000000000075431341615052600202550ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_VIDEO_COLOR_H #define FIFE_VIDEO_COLOR_H // Standard C++ library includes #include #include // Platform specific includes #include "util/base/fife_stdint.h" // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder namespace FIFE { class Color { public: /** Constructor. * * @param r Red channel value. * @param g Green channel value. * @param b Blue channel value. * @param alpha Alpha channel value. */ Color(uint8_t r = 0, uint8_t g = 0, uint8_t b = 0, uint8_t alpha = 255); /** Destructor */ ~Color(); /** Compares equality of two colors */ inline bool operator==(const Color& color) const { return (m_r == color.m_r && m_g == color.m_g && m_b == color.m_b && m_a == color.m_a); } /** Compares unequality of two colors */ inline bool operator!=(const Color& color) const { return !(*this == color); } /** Overload less operator */ inline bool operator<(const Color& rhs) const { if (m_r != rhs.m_r) { return m_r < rhs.m_r; } else if (m_g != rhs.m_g) { return m_g < rhs.m_g; } else if (m_b != rhs.m_b) { return m_b < rhs.m_b; } return m_a < rhs.m_a; } /** Set all color channel values. * * @param r Red channel value. * @param g Green channel value. * @param b Blue channel value. * @param alpha Alpha channel value. */ void set(uint8_t r, uint8_t g, uint8_t b, uint8_t alpha); /** Set red channel value. * * @param r New value. */ void setR(uint8_t r); /** Set green channel value. * * @param g New value. */ void setG(uint8_t g); /** Set blue channel value. * * @param b New value. */ void setB(uint8_t b); /** Set alpha channel value. * * @param alpha New value. */ void setAlpha(uint8_t alpha); /** @return Red channel value. */ uint8_t getR() const; /** @return Green channel value. */ uint8_t getG() const; /** @return Blue channel value. */ uint8_t getB() const; /** @return Alpha channel value. */ uint8_t getAlpha() const; private: uint8_t m_r; uint8_t m_g; uint8_t m_b; uint8_t m_a; }; } #endif //FIFE_VIDEO_COLOR_Hfifengine-0.4.2/engine/core/video/cursor.cpp000066400000000000000000000227011341615052600210000ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // 3rd party library includes #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/structures/rect.h" #include "util/time/timemanager.h" #include "util/log/logger.h" #include "video/imagemanager.h" #include "animation.h" #include "image.h" #include "renderbackend.h" #include "cursor.h" namespace FIFE { /** Logger to use for this source file. * @relates Logger */ static Logger _log(LM_CURSOR); Cursor::Cursor(RenderBackend* renderbackend): m_cursor_id(NC_ARROW), m_cursor_type(CURSOR_NATIVE), m_drag_type(CURSOR_NONE), m_native_cursor(NULL), m_renderbackend(renderbackend), m_animtime(0), m_drag_animtime(0), m_drag_offset_x(0), m_drag_offset_y(0), m_mx(0), m_my(0), m_timemanager(TimeManager::instance()), m_invalidated(false), m_native_image_cursor_enabled(false) { assert(m_timemanager); set(m_cursor_id); } void Cursor::set(uint32_t cursor_id) { m_cursor_type = CURSOR_NATIVE; if (!SDL_ShowCursor(1)) { SDL_PumpEvents(); } setNativeCursor(cursor_id); m_cursor_image.reset(); m_cursor_animation.reset(); } void Cursor::set(ImagePtr image) { assert(image != 0); m_cursor_image = image; m_cursor_type = CURSOR_IMAGE; if (m_native_image_cursor_enabled) { if (!setNativeImageCursor(image)) { return; } if (!SDL_ShowCursor(1)) { SDL_PumpEvents(); } } else if (SDL_ShowCursor(0)) { SDL_PumpEvents(); } m_cursor_id = NC_ARROW; m_cursor_animation.reset(); } void Cursor::set(AnimationPtr anim) { assert(anim != 0); m_cursor_animation = anim; m_cursor_type = CURSOR_ANIMATION; if (m_native_image_cursor_enabled) { if (!setNativeImageCursor(anim->getFrameByTimestamp(0))) { return; } if (!SDL_ShowCursor(1)) { SDL_PumpEvents(); } } else if (SDL_ShowCursor(0)) { SDL_PumpEvents(); } m_animtime = m_timemanager->getTime(); m_cursor_id = NC_ARROW; m_cursor_image.reset(); } void Cursor::setDrag(ImagePtr image, int32_t drag_offset_x, int32_t drag_offset_y) { assert(image != 0); m_cursor_drag_image = image; m_drag_type = CURSOR_IMAGE; m_drag_offset_x = drag_offset_x; m_drag_offset_y = drag_offset_y; m_cursor_drag_animation.reset(); } void Cursor::setDrag(AnimationPtr anim, int32_t drag_offset_x, int32_t drag_offset_y) { assert(anim != 0); m_cursor_drag_animation = anim; m_drag_type = CURSOR_ANIMATION; m_drag_offset_x = drag_offset_x; m_drag_offset_y = drag_offset_y; m_drag_animtime = m_timemanager->getTime(); m_cursor_drag_image.reset(); } void Cursor::resetDrag() { m_drag_type = CURSOR_NONE; m_drag_animtime = 0; m_drag_offset_x = 0; m_drag_offset_y = 0; m_cursor_drag_animation.reset(); m_cursor_drag_image.reset(); } void Cursor::setPosition(uint32_t x, uint32_t y) { m_mx = x; m_my = y; SDL_WarpMouseInWindow(RenderBackend::instance()->getWindow(), m_mx, m_my); } void Cursor::getPosition(int32_t* x, int32_t* y) { *x = m_mx; *y = m_my; } void Cursor::invalidate() { if (m_native_cursor != NULL) { SDL_FreeCursor(m_native_cursor); m_native_cursor = NULL; m_native_cursor_image.reset(); m_invalidated = true; } } void Cursor::draw() { if (m_invalidated) { if (m_cursor_type == CURSOR_NATIVE ) { set(m_cursor_id); } else if (m_native_image_cursor_enabled) { if (m_cursor_type == CURSOR_IMAGE ) { set(m_cursor_image); } else if (m_cursor_type == CURSOR_ANIMATION ) { set(m_cursor_animation); } } m_invalidated = false; } SDL_GetMouseState(&m_mx, &m_my); if ((m_cursor_type == CURSOR_NATIVE) && (m_drag_type == CURSOR_NONE)) { return; } // render possible drag image ImagePtr img; if (m_drag_type == CURSOR_IMAGE) { img = m_cursor_drag_image; } else if (m_drag_type == CURSOR_ANIMATION) { int32_t animtime = (m_timemanager->getTime() - m_drag_animtime) % m_cursor_drag_animation->getDuration(); img = m_cursor_drag_animation->getFrameByTimestamp(animtime); } if (img != 0) { Rect area(m_mx + m_drag_offset_x + img->getXShift(), m_my + m_drag_offset_y + img->getYShift(), img->getWidth(), img->getHeight()); m_renderbackend->pushClipArea(area, false); img->render(area); m_renderbackend->renderVertexArrays(); m_renderbackend->popClipArea(); } ImagePtr img2; // render possible cursor image if (m_cursor_type == CURSOR_IMAGE) { img2 = m_cursor_image; } else if (m_cursor_type == CURSOR_ANIMATION) { int32_t animtime = (m_timemanager->getTime() - m_animtime) % m_cursor_animation->getDuration(); img2 = m_cursor_animation->getFrameByTimestamp(animtime); } if (img2 != 0) { if (m_native_image_cursor_enabled) { setNativeImageCursor(img2); } else { Rect area(m_mx + img2->getXShift(), m_my + img2->getYShift(), img2->getWidth(), img2->getHeight()); m_renderbackend->pushClipArea(area, false); img2->render(area); m_renderbackend->renderVertexArrays(); m_renderbackend->popClipArea(); } } } uint32_t Cursor::getNativeId(uint32_t cursor_id) { switch (cursor_id) { case NC_ARROW: return SDL_SYSTEM_CURSOR_ARROW; case NC_IBEAM: return SDL_SYSTEM_CURSOR_IBEAM; case NC_WAIT: return SDL_SYSTEM_CURSOR_WAIT; case NC_CROSS: return SDL_SYSTEM_CURSOR_CROSSHAIR; case NC_WAITARROW: return SDL_SYSTEM_CURSOR_WAITARROW; case NC_RESIZENWSE: return SDL_SYSTEM_CURSOR_SIZENWSE; case NC_RESIZENESW: return SDL_SYSTEM_CURSOR_SIZENESW; case NC_RESIZEWE: return SDL_SYSTEM_CURSOR_SIZEWE; case NC_RESIZENS: return SDL_SYSTEM_CURSOR_SIZENS; case NC_RESIZEALL: return SDL_SYSTEM_CURSOR_SIZEALL; case NC_NO: return SDL_SYSTEM_CURSOR_NO; case NC_HAND: return SDL_SYSTEM_CURSOR_HAND; } return cursor_id; } void Cursor::setNativeCursor(uint32_t cursor_id) { cursor_id = getNativeId(cursor_id); SDL_Cursor* cursor = SDL_CreateSystemCursor(static_cast(cursor_id)); if (!cursor) { FL_WARN(_log, "No cursor matching cursor_id was found."); return; } SDL_SetCursor(cursor); if (m_native_cursor != NULL) { SDL_FreeCursor(m_native_cursor); } m_native_cursor = cursor; } bool Cursor::setNativeImageCursor(ImagePtr image) { if (image == m_native_cursor_image) { // we're already using this image return true; } if (image->getState() == IResource::RES_NOT_LOADED) { image->load(); } // SDL only accepts whole surfaces here so if this image uses a shared surface // we need to prepare a temporary surface with just the relevant part ImagePtr temp_image = image; if (image->isSharedImage()) { temp_image = ImageManager::instance()->create(); temp_image->copySubimage(0, 0, image); } SDL_Cursor* cursor = SDL_CreateColorCursor( temp_image->getSurface(), -image->getXShift(), -image->getYShift()); if (cursor == NULL) { FL_WARN(_log, LMsg("SDL_CreateColorCursor: \"") << SDL_GetError() << "\". Falling back to software cursor."); if (image->isSharedImage()) { ImageManager::instance()->remove(temp_image); } setNativeImageCursorEnabled(false); return false; } SDL_SetCursor(cursor); m_native_cursor_image = image; if (image->isSharedImage()) { ImageManager::instance()->remove(temp_image); } if (m_native_cursor != NULL) { SDL_FreeCursor(m_native_cursor); } m_native_cursor = cursor; return true; } void Cursor::setNativeImageCursorEnabled(bool native_image_cursor_enabled) { if (m_native_image_cursor_enabled != native_image_cursor_enabled) { m_native_image_cursor_enabled = native_image_cursor_enabled; if (m_cursor_type == CURSOR_IMAGE ) { set(m_cursor_image); } else if (m_cursor_type == CURSOR_ANIMATION ) { set(m_cursor_animation); } } } bool Cursor::isNativeImageCursorEnabled() const { return m_native_image_cursor_enabled; } } fifengine-0.4.2/engine/core/video/cursor.h000066400000000000000000000166771341615052600204640ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_CURSOR_H #define FIFE_CURSOR_H // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "animation.h" struct SDL_Cursor; namespace FIFE { class RenderBackend; class TimeManager; /** Defines the type of shown cursor * native -> default cursor * image -> cursor from image pool * animation -> cursor from animation pool */ enum MouseCursorType { CURSOR_NONE, CURSOR_NATIVE, CURSOR_IMAGE, CURSOR_ANIMATION }; enum NativeCursor { // Start on 1000000 to avoid id-clashes with SDL NC_ARROW = 1000000, // Standard arrow NC_IBEAM, // I-beam for text selection NC_WAIT, // Hourglass NC_CROSS, // Crosshair NC_WAITARROW, // Small wait cursor (or Wait if not available) NC_RESIZENWSE, // Double arrow pointing northwest and southeast NC_RESIZENESW, // Double arrow pointing northeast and southwest NC_RESIZEWE, // Double arrow pointing west and east NC_RESIZENS, // Double arrow pointing north and south NC_RESIZEALL, // Four-pointed arrow pointing north, south, east, and west NC_NO, // Slashed circle NC_HAND // Hand. Common for links, etc. }; /** Cursor class manages mouse cursor handling */ class Cursor { public: /** Constructor. */ Cursor(RenderBackend* renderbackend); /** Destructor. */ virtual ~Cursor() { invalidate(); } void invalidate(); /** draws cursor on screen */ virtual void draw(); /** Sets the current mouse cursor * @param cursor_id For native cursors, this is the resource id to native cursor, or one of the values in NativeCursor */ void set(uint32_t cursor_id=0); /** Sets the current mouse cursor type to image * @param image ImagePtr to a image used for the cursor */ void set(ImagePtr image); /** Sets the current mouse cursor type to animation * @param anim AnimationPtr to a loaded animation used for the cursor */ void set(AnimationPtr anim); /** Sets the current drag image cursor * @param image ImagePtr to a image used for the drag * @param drag_offset_x X Offset to display image when dragging. * @param drag_offset_y Y Offset to display image when dragging. * @note to reset the cursors drag call cursor.setDrag(Cursor::CURSOR_NONE, 0, 0) */ void setDrag(ImagePtr image, int32_t drag_offset_x=0, int32_t drag_offset_y=0); /** Sets the current drag animated cursor * @param anim AnimationPtr to a loaded animation used for the drag * @param drag_offset_x X Offset to display animation when dragging. * @param drag_offset_y Y Offset to display animation when dragging. * @note to reset the cursors drag call cursor.setDrag(Cursor::CURSOR_NONE, 0, 0) */ void setDrag(AnimationPtr anim, int32_t drag_offset_x=0, int32_t drag_offset_y=0); /** Resets the cursor drag type to CURSOR_NONE */ void resetDrag(); /** Gets the current mouse cursor type */ MouseCursorType getType() const { return m_cursor_type; } /** Gets the current mouse cursor handle */ uint32_t getId() const { return m_cursor_id; } /** Gets the current mouse image */ ImagePtr getImage() { return m_cursor_image; } /** Gets the current mouse animation */ AnimationPtr getAnimation() { return m_cursor_animation; } /** Gets the current mouse cursor type */ MouseCursorType getDragType() const { return m_drag_type; } /** Gets the current mouse drag image */ ImagePtr getDragImage() { return m_cursor_drag_image; } /** Gets the current mouse drag animation */ AnimationPtr getDragAnimation() { return m_cursor_drag_animation; } /** Gets the current mouse x position */ uint32_t getX() const { return m_mx; } /** Gets the current mouse y position */ uint32_t getY() const { return m_my; } /** Set the mouse position * @param x,y: The new position in screen coordinates */ void setPosition(uint32_t x, uint32_t y); /** Get the current mouse position */ void getPosition(int32_t* x, int32_t* y); /** Enables or disables the native image cursor feature. * If enabled, cursors set to an image or an animation will be set using SDL * and drawn by the native platform; otherwise they will be drawn by FIFE. * This setting has no effect on NativeCursor types which are always native * and on the drag cursor which is always drawn by FIFE. */ void setNativeImageCursorEnabled(bool native_image_cursor_enabled); /** Returns whether cursors set to an image or an animation are drawn natively. * @see setNativeImageCursorEnabled() */ bool isNativeImageCursorEnabled() const; protected: /** Sets the cursor to a native type. * @param cursor_id One of the values in NativeCursor */ void setNativeCursor(uint32_t cursor_id); /** Sets the SDL cursor to the specified image. * Falls back to software cursor on failure. * @return false on error, true otherwise */ bool setNativeImageCursor(ImagePtr image); /** To get some consistancy between platforms, this function checks * if cursor_id matches any of the values in NativeCursor, and * returns the SDL_SystemCursor. * If no match is found, cursor_id is returned. * * @param cursor_id One of the values in NativeCursor */ uint32_t getNativeId(uint32_t cursor_id); private: uint32_t m_cursor_id; MouseCursorType m_cursor_type; MouseCursorType m_drag_type; SDL_Cursor* m_native_cursor; ImagePtr m_cursor_image; ImagePtr m_cursor_drag_image; AnimationPtr m_cursor_animation; AnimationPtr m_cursor_drag_animation; RenderBackend* m_renderbackend; uint32_t m_animtime; uint32_t m_drag_animtime; int32_t m_drag_offset_x; int32_t m_drag_offset_y; int32_t m_mx; int32_t m_my; TimeManager* m_timemanager; bool m_invalidated; bool m_native_image_cursor_enabled; ImagePtr m_native_cursor_image; }; } //FIFE #endif fifengine-0.4.2/engine/core/video/devicecaps.cpp000066400000000000000000000245551341615052600216020ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes #include #include // 3rd party library includes #include #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/exception.h" #include "devicecaps.h" namespace FIFE { ScreenMode::ScreenMode() : m_width(0), m_height(0), m_bpp(0), m_refreshRate(0), m_SDLFlags(0), m_format(0), m_display(0), m_renderDriver(""), m_renderDriverIndex(-1) { } ScreenMode::ScreenMode(uint16_t width, uint16_t height, uint16_t bpp, uint32_t SDLFlags) : m_width(width), m_height(height), m_bpp(bpp), m_refreshRate(0), m_SDLFlags(SDLFlags), m_format(0), m_display(0), m_renderDriver(""), m_renderDriverIndex(-1){ } ScreenMode::ScreenMode(uint16_t width, uint16_t height, uint16_t bpp, uint16_t rate, uint32_t SDLFlags) : m_width(width), m_height(height), m_bpp(bpp), m_refreshRate(rate), m_SDLFlags(SDLFlags), m_format(0), m_display(0), m_renderDriver(""), m_renderDriverIndex(-1){ } ScreenMode::ScreenMode(const ScreenMode& rhs){ m_width = rhs.getWidth(); m_height = rhs.getHeight(); m_bpp = rhs.getBPP(); m_SDLFlags = rhs.getSDLFlags(); m_refreshRate = rhs.getRefreshRate(); m_format = rhs.getFormat(); m_display = rhs.getDisplay(); m_renderDriver = rhs.getRenderDriverName(); m_renderDriverIndex = rhs.getRenderDriverIndex(); } bool ScreenMode::operator <(const ScreenMode& rhs) const { // first by display, from lower to higher if (m_display > rhs.getDisplay()){ return true; } else if (m_display < rhs.getDisplay()){ return false; } //sort by fullscreen first if (!isFullScreen() && rhs.isFullScreen()){ return true; } else if (isFullScreen() && !rhs.isFullScreen()){ return false; } //next by bpp if (m_bpp < rhs.getBPP()){ return true; } else if (m_bpp > rhs.getBPP()){ return false; } //then by screen dimensions if (m_width < rhs.getWidth() || m_height < rhs.getHeight()) { return true; } else if (m_width > rhs.getWidth() || m_height > rhs.getHeight()) { return false; } //last by refresh rate if (m_refreshRate < rhs.getRefreshRate()) { return true; } return false; } DeviceCaps::DeviceCaps() : m_videoDriverName("dummy"), m_renderDriverName(""), m_renderDriverIndex(-1) { } DeviceCaps::~DeviceCaps() { } void DeviceCaps::reset() { m_screenModes.clear(); m_renderDriverName = ""; m_renderDriverIndex = -1; fillAvailableDrivers(); } void DeviceCaps::fillAvailableDrivers() { // video driver section (x11, windows, dummy, ...) m_availableVideoDrivers.clear(); uint8_t driverCount = SDL_GetNumVideoDrivers(); for (uint8_t i = 0; i != driverCount; i++) { std::string driver(SDL_GetVideoDriver(i)); m_availableVideoDrivers.push_back(driver); } m_videoDriverName = std::string(SDL_GetCurrentVideoDriver()); // render driver section (opengl, direct3d, software, ...) m_availableRenderDrivers.clear(); SDL_RendererInfo info; driverCount = SDL_GetNumRenderDrivers(); for (uint8_t i = 0; i != driverCount; i++) { SDL_GetRenderDriverInfo(i, &info); std::string name(info.name); m_availableRenderDrivers.push_back(name); } } void DeviceCaps::fillDeviceCaps() { //clear in case this is called twice m_screenModes.clear(); fillAvailableDrivers(); //FLAGS #ifdef HAVE_OPENGL const uint32_t numFlags = 4; uint32_t flags[numFlags]; //OpenGL, windowed flags[0] = ScreenMode::WINDOWED_OPENGL; //OpenGL, fullscreen flags[1] = ScreenMode::FULLSCREEN_OPENGL; //SDL, windowed flags[2] = ScreenMode::WINDOWED_SDL; //SDL, fullscreen flags[3] = ScreenMode::FULLSCREEN_SDL; #else const uint32_t numFlags = 2; uint32_t flags[numFlags]; //SDL, windowed flags[0] = ScreenMode::WINDOWED_SDL; //SDL, fullscreen flags[1] = ScreenMode::FULLSCREEN_SDL; #endif //BITS PER PIXEL const uint32_t numBPP = 3; uint16_t bpps[numBPP]; bpps[0] = 16; bpps[1] = 24; bpps[2] = 32; bool renderDriver = m_renderDriverIndex != -1; uint8_t displayCount = SDL_GetNumVideoDisplays(); for (uint8_t i = 0; i != displayCount; i++) { SDL_DisplayMode mode; uint8_t displayModes = SDL_GetNumDisplayModes(i); for (uint8_t m = 0; m != displayModes; m++) { if (SDL_GetDisplayMode(i, m, &mode) == 0) { for (uint32_t ii = 0; ii < numBPP; ++ii){ for (uint32_t j = 0; j < numFlags; ++j) { //m_screenModes.push_back(ScreenMode(mode.w, mode.h, SDL_BITSPERPIXEL(mode.format), mode.refresh_rate, flags[j])); ScreenMode m(mode.w, mode.h, bpps[ii], mode.refresh_rate, flags[j]); m.setFormat(mode.format); m.setDisplay(i); if (renderDriver) { m.setRenderDriverName(m_renderDriverName); m.setRenderDriverIndex(m_renderDriverIndex); } m_screenModes.push_back(m); } } } else { throw SDLException(SDL_GetError()); } } } //sort the list to keep the most preferred modes at the top of the selection process std::sort(m_screenModes.begin(), m_screenModes.end()); std::reverse(m_screenModes.begin(), m_screenModes.end()); } ScreenMode DeviceCaps::getNearestScreenMode(uint16_t width, uint16_t height, uint16_t bpp, const std::string& renderer, bool fs) const { // refresh rate is set to 0 so that desktop setting is used and the first display is used return getNearestScreenMode(width, height, bpp, renderer, fs, 0, 0); } ScreenMode DeviceCaps::getNearestScreenMode(uint16_t width, uint16_t height, uint16_t bpp, const std::string& renderer, bool fs, uint16_t refresh, uint8_t display) const { ScreenMode mode; SDL_DisplayMode target, closest; bool foundMode = false; // Set the desired resolution, etc. target.w = width; target.h = height; if (bpp == 0) { target.format = 0; // don't care, should be desktop bpp } else if (bpp == 16) { target.format = SDL_PIXELFORMAT_RGB565; } else { target.format = SDL_PIXELFORMAT_RGB888; } target.refresh_rate = refresh; target.driverdata = 0; // initialize to 0 // only first display if (SDL_GetClosestDisplayMode(display, &target, &closest)) { uint32_t flags = 0; if (renderer == "OpenGL") { if (fs) { flags = SDL_WINDOW_OPENGL | SDL_WINDOW_FULLSCREEN; } else { flags = SDL_WINDOW_OPENGL; } } else { if (fs) { flags = SDL_WINDOW_FULLSCREEN; } } mode = ScreenMode(closest.w, closest.h, bpp, closest.refresh_rate, flags); mode.setFormat(closest.format); mode.setDisplay(display); if (m_renderDriverIndex != -1) { mode.setRenderDriverName(m_renderDriverName); mode.setRenderDriverIndex(m_renderDriverIndex); } foundMode = true; } if (!foundMode) { throw NotSupported("Could not find a matching screen mode for the values given!"); } return mode; } void DeviceCaps::setRenderDriverName(const std::string& driver) { bool found = false; uint8_t driverCount = m_availableRenderDrivers.size(); for (uint8_t i = 0; i != driverCount; i++) { if (driver == m_availableRenderDrivers[i]) { m_renderDriverName = driver; m_renderDriverIndex = i; found = true; break; } } if (!found) { if (driver != "") { throw NotSupported("Could not find a matching render driver!"); } m_renderDriverName = ""; m_renderDriverIndex = -1; } // refill fillDeviceCaps(); } uint8_t DeviceCaps::getDisplayCount() const { uint8_t displayCount = SDL_GetNumVideoDisplays(); return displayCount; } std::string DeviceCaps::getDisplayName(uint8_t display) const { if (display >= getDisplayCount()) { throw NotSupported("Could not find a matching display!"); return std::string("Invalid"); } std::string displayName(SDL_GetDisplayName(display)); return displayName; } uint32_t DeviceCaps::getDesktopFormat(uint8_t display) const { SDL_DisplayMode mode; if (SDL_GetDesktopDisplayMode(display, &mode) != 0) { throw SDLException(SDL_GetError()); } return mode.format; } int32_t DeviceCaps::getDesktopRefreshRate(uint8_t display) const { SDL_DisplayMode mode; if (SDL_GetDesktopDisplayMode(display, &mode) != 0) { throw SDLException(SDL_GetError()); } return mode.refresh_rate; } int32_t DeviceCaps::getDesktopWidth(uint8_t display) const { SDL_DisplayMode mode; if (SDL_GetDesktopDisplayMode(display, &mode) != 0) { throw SDLException(SDL_GetError()); } return mode.w; } int32_t DeviceCaps::getDesktopHeight(uint8_t display) const { SDL_DisplayMode mode; if (SDL_GetDesktopDisplayMode(display, &mode) != 0) { throw SDLException(SDL_GetError()); } return mode.h; } Rect DeviceCaps::getDisplayBounds(uint8_t display) const { SDL_Rect srec; if (SDL_GetDisplayBounds(display, &srec) != 0) { throw SDLException(SDL_GetError()); } Rect rec(srec.x, srec.y, srec.w, srec.h); return rec; } } //FIFE fifengine-0.4.2/engine/core/video/devicecaps.h000066400000000000000000000204031341615052600212330ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_DEVICECAPS_H #define FIFE_DEVICECAPS_H // Standard C++ library includes #include #include // Platform specific includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/structures/rect.h" namespace FIFE { class ScreenMode { public: /** Default Constructor * @note You shouldn't construct these objects yourself. This default * constructor was provided because swig complained that was none. */ ScreenMode(); ScreenMode(uint16_t width, uint16_t height, uint16_t bpp, uint32_t SDLFlags); ScreenMode(uint16_t width, uint16_t height, uint16_t bpp, uint16_t rate, uint32_t SDLFlags); ScreenMode(const ScreenMode& rhs); /** Destructor. */ ~ScreenMode() {}; bool operator <(const ScreenMode& rhs) const; /** Returns the width of the screen mode. * @note If both width and height are 0 it means that ALL modes are available * for use with the specified flags. Most likely this is a windowed mode. */ uint16_t getWidth() const { return m_width; }; /** Returns the height of the screen mode. * @note If both width and height are 0 it means that ALL modes are available * for use with the specified flags. Most likely this is a windowed mode. */ uint16_t getHeight() const { return m_height; }; /** Returns the number of bits per pixel this mode uses. */ uint16_t getBPP() const { return m_bpp; }; /** Returns the refresh rate in Hz of this mode. */ uint16_t getRefreshRate() const { return m_refreshRate; } /** Returns the SDL flags used when testing this mode. */ uint32_t getSDLFlags() const { return m_SDLFlags; }; /** True if this is a fullscreen mode. False if it is a windowed mode. */ bool isFullScreen() const { return (m_SDLFlags & SDL_WINDOW_FULLSCREEN) ? true : false;}; /** True if this mode uses the OpenGL renderer. False otherwise. */ bool isOpenGL() const { return (m_SDLFlags & SDL_WINDOW_OPENGL) ? true : false; }; /** Is this screen mode an SDL only screen mode */ bool isSDL() const { return (!(m_SDLFlags & SDL_WINDOW_OPENGL)) ? true : false; }; /** Sets the pixel format enum. */ void setFormat(uint32_t format) { m_format = format;} /** Returns the pixel format enum. */ uint32_t getFormat() const { return m_format; } /** Sets the display index. */ void setDisplay(uint8_t display) { m_display = display; } /** Returns the display index. */ uint8_t getDisplay() const { return m_display; } /** Sets the render driver name. */ void setRenderDriverName(const std::string driver) { m_renderDriver = driver; } /** Returns the render driver name. Default is "". */ const std::string& getRenderDriverName() const { return m_renderDriver; } /** Sets the index of the render driver used by SDL. */ void setRenderDriverIndex(int8_t index) { m_renderDriverIndex = index; } /** Returns the index of the render driver. Default is -1. */ int8_t getRenderDriverIndex() const { return m_renderDriverIndex; } //OpenGL, windowed static const uint32_t WINDOWED_OPENGL = SDL_WINDOW_OPENGL; //OpenGL, fullscreen static const uint32_t FULLSCREEN_OPENGL = SDL_WINDOW_OPENGL | SDL_WINDOW_FULLSCREEN; //SDL, windowed static const uint32_t WINDOWED_SDL = 0; //SDL, fullscreen static const uint32_t FULLSCREEN_SDL = SDL_WINDOW_FULLSCREEN; private: uint16_t m_width; uint16_t m_height; uint16_t m_bpp; uint16_t m_refreshRate; uint32_t m_SDLFlags; uint32_t m_format; uint8_t m_display; std::string m_renderDriver; int8_t m_renderDriverIndex; }; //ScreenMode class DeviceCaps { public: /** Constructor. */ DeviceCaps(); /** Destructor. */ ~DeviceCaps(); /** Should be called AFTER SDL_Init() has been called */ void fillDeviceCaps(); /** Clears all information gathered for the device */ void reset(); /** Gets the available video drivers for your operating system */ std::vector getAvailableVideoDrivers() const { return m_availableVideoDrivers; }; /** Gets the available render drivers for your operating system */ std::vector getAvailableRenderDrivers() const { return m_availableRenderDrivers; }; /** Returns a vector containing screen modes. */ std::vector getSupportedScreenModes() const { return m_screenModes; }; /** Gets the nearest valid screen mode based on the arguments passed */ ScreenMode getNearestScreenMode(uint16_t width, uint16_t height, uint16_t bpp, const std::string& renderer, bool fs) const; /** Gets the nearest valid screen mode based on the arguments passed */ ScreenMode getNearestScreenMode(uint16_t width, uint16_t height, uint16_t bpp, const std::string& renderer, bool fs, uint16_t refresh, uint8_t display = 0) const; /** Returns the name of the current video driver. */ std::string getVideoDriverName() const { return m_videoDriverName; } /** Sets the name of the video driver. */ void setVideoDriverName(const std::string& driver) { m_videoDriverName = driver; } /** Returns the name of the current render driver or * an empty string to initialize the first one supporting the requested flags. */ std::string getRenderDriverName() const { return m_renderDriverName; } /** Sets the name of the render driver. */ void setRenderDriverName(const std::string& driver); /** Returns the number of displays. */ uint8_t getDisplayCount() const; /** Returns the display name for the given display index. */ std::string getDisplayName(uint8_t display = 0) const; /** Returns the SDL_PixelFormatEnum of the desktop for the given display index. */ uint32_t getDesktopFormat(uint8_t display = 0) const; /** Returns the refresh rate in Hz of the desktop for the given display index. */ int32_t getDesktopRefreshRate(uint8_t display = 0) const; /** Returns the width of the desktop resolution for the given display index. */ int32_t getDesktopWidth(uint8_t display = 0) const; /** Returns the height of the desktop resolution for the given display index. */ int32_t getDesktopHeight(uint8_t display = 0) const; /** Returns the bounding points for the given display index. */ Rect getDisplayBounds(uint8_t display = 0) const; private: std::vector m_screenModes; std::string m_videoDriverName; std::vector m_availableVideoDrivers; std::string m_renderDriverName; int8_t m_renderDriverIndex; std::vector m_availableRenderDrivers; /** Called in the constructor. No need for anyone to call this */ void fillAvailableDrivers(); }; //DeviceCaps } //FIFE #endif //FIFE_DEVICECAPS_H fifengine-0.4.2/engine/core/video/fonts/000077500000000000000000000000001341615052600201065ustar00rootroot00000000000000fifengine-0.4.2/engine/core/video/fonts/fontbase.cpp000066400000000000000000000202001341615052600224050ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes #include // Platform specific includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/structures/rect.h" #include "util/base/exception.h" #include "util/utf8/utf8.h" #include "video/image.h" #include "video/renderbackend.h" #include "fontbase.h" namespace FIFE { FontBase::FontBase(): m_pool(), mColor(), mGlyphSpacing(0), mRowSpacing(0), mFilename(""), m_antiAlias(true), m_boldStyle(false), m_italicStyle(false), m_underlineStyle(false), m_strikeStyle(false), m_coloring(false) { } void FontBase::invalidate() { m_pool.invalidateCachedText(); } void FontBase::setRowSpacing(int32_t spacing) { mRowSpacing = spacing; } int32_t FontBase::getRowSpacing() const { return mRowSpacing; } void FontBase::setGlyphSpacing(int32_t spacing) { mGlyphSpacing = spacing; } int32_t FontBase::getGlyphSpacing() const { return mGlyphSpacing; } void FontBase::setAntiAlias(bool antiAlias) { m_antiAlias = antiAlias; } bool FontBase::isAntiAlias() const { return m_antiAlias; } void FontBase::setBoldStyle(bool style) { m_boldStyle = style; } bool FontBase::isBoldStyle() const { return m_boldStyle; } void FontBase::setItalicStyle(bool style) { m_italicStyle = style; } bool FontBase::isItalicStyle() const { return m_italicStyle; } void FontBase::setUnderlineStyle(bool style) { m_underlineStyle = style; } bool FontBase::isUnderlineStyle() const { return m_underlineStyle; } void FontBase::setStrikethroughStyle(bool style) { m_strikeStyle = style; } bool FontBase::isStrikethroughStyle() const { return m_strikeStyle; } void FontBase::setDynamicColoring(bool coloring) { m_coloring = coloring; } bool FontBase::isDynamicColoring() const { return m_coloring; } SDL_Color FontBase::getColor() const { return mColor; } int32_t FontBase::getStringIndexAt(const std::string &text, int32_t x) const { assert( utf8::is_valid(text.begin(), text.end()) ); std::string::const_iterator cur; if (text.size() == 0) return 0; if (x <= 0) return 0; cur = text.begin(); utf8::next(cur, text.end()); std::string buff; while(cur != text.end()) { buff = std::string(text.begin(), cur); if (getWidth(buff) > x) { return buff.size(); } else { utf8::next(cur, text.end()); } } if (x > getWidth(text)) { return text.size(); } else { return buff.size(); } } Image* FontBase::getAsImage(const std::string& text) { Image* image = m_pool.getRenderedText(this, text); if (!image) { SDL_Surface* textSurface = renderString(text); image = RenderBackend::instance()->createImage(textSurface); m_pool.addRenderedText( this, text, image ); } return image; } Image* FontBase::getAsImageMultiline(const std::string& text) { const uint8_t newline_utf8 = '\n'; uint32_t newline; utf8::utf8to32(&newline_utf8,&newline_utf8 + 1,&newline); //std::cout << "Text:" << text << std::endl; Image* image = m_pool.getRenderedText(this, text); if (!image) { std::vector lines; std::string::const_iterator it = text.begin(); // split text as needed int32_t render_width = 0, render_height = 0; do { uint32_t codepoint = 0; std::string line; while( codepoint != newline && it != text.end() ) { codepoint = utf8::next(it,text.end()); if( codepoint != newline ) utf8::append(codepoint, back_inserter(line)); } //std::cout << "Line:" << line << std::endl; SDL_Surface* text_surface = renderString(line); if (text_surface->w > render_width) { render_width = text_surface->w; } lines.push_back(text_surface); } while (it != text.end()); render_height = (getRowSpacing() + getHeight()) * lines.size(); SDL_Surface* final_surface = SDL_CreateRGBSurface(0, render_width,render_height,32, RMASK, GMASK, BMASK ,AMASK); if (!final_surface) { throw SDLException(std::string("CreateRGBSurface failed: ") + SDL_GetError()); } SDL_FillRect(final_surface, 0, 0x00000000); int32_t ypos = 0; for (std::vector::iterator i = lines.begin(); i != lines.end(); ++i) { SDL_Rect dst_rect = { 0, 0, 0, 0 }; dst_rect.y = ypos; // Disable alpha blending //SDL_SetAlpha(*i,0,SDL_ALPHA_OPAQUE); SDL_SetSurfaceBlendMode(*i, SDL_BLENDMODE_NONE); SDL_BlitSurface(*i, 0, final_surface, &dst_rect); ypos += getRowSpacing() + getHeight(); SDL_FreeSurface(*i); } image = RenderBackend::instance()->createImage(final_surface); m_pool.addRenderedText(this, text, image); } return image; } std::string FontBase::splitTextToWidth (const std::string& text, int32_t render_width) { const uint32_t whitespace = ' '; const uint8_t newline_utf8 = '\n'; uint32_t newline; utf8::utf8to32(&newline_utf8,&newline_utf8 + 1,&newline); if (render_width <= 0 || text.empty()) { return text; } std::string output; std::string line; std::string::const_iterator pos = text.begin(); std::list > break_pos; bool firstLine = true; while( pos != text.end()) { break_pos.clear(); if( !firstLine ) { line = "\n"; } else { firstLine = false; } bool haveNewLine = false; while( getWidth(line) < render_width && pos != text.end() ) { uint32_t codepoint = utf8::next(pos, text.end()); if (codepoint == whitespace && !line.empty()) break_pos.push_back( std::make_pair(line.length(),pos) ); if( codepoint != newline ) utf8::append(codepoint, back_inserter(line) ); // Special case: Already newlines in string: if( codepoint == newline ) { output.append(line); line = ""; haveNewLine = true; break; } } if( haveNewLine ) continue; if( pos == text.end() ) break; if( break_pos.empty() ) { // No break position and line length smaller than 2 // means the renderwidth is really screwed. Just continue // appending single character lines. if( utf8::distance(line.begin(),line.end()) <= 1 && line != "\n") { output.append(line); continue; } if (line == "\n") { ++pos; } // We can't do hyphenation here, // so we just retreat one character :-( // FIXME //line = line.erase(line.length() - 1); //--pos; } else { line = line.substr(0,break_pos.back().first); pos = break_pos.back().second; } output.append(line); } if( !line.empty() ) { output.append(line); } return output; } } fifengine-0.4.2/engine/core/video/fonts/fontbase.h000066400000000000000000000067531341615052600220730ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_FONTS_FONTBASE_H #define FIFE_FONTS_FONTBASE_H // Standard C++ library includes #include // Platform specific includes #include "util/base/fife_stdint.h" // 3rd party library includes #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "textrenderpool.h" #include "ifont.h" struct SDL_Surface; namespace FIFE { /** Abstract Font Base Class * Uses a pool for rendered strings. * @see TextRenderPool */ class FontBase: public IFont { public: FontBase(); virtual ~FontBase() {}; void invalidate(); void setRowSpacing (int32_t spacing); int32_t getRowSpacing() const; void setGlyphSpacing(int32_t spacing); int32_t getGlyphSpacing() const; virtual void setAntiAlias(bool antiAlias); virtual bool isAntiAlias() const; virtual void setBoldStyle(bool style); virtual bool isBoldStyle() const; virtual void setItalicStyle(bool style); virtual bool isItalicStyle() const; virtual void setUnderlineStyle(bool style); virtual bool isUnderlineStyle() const; virtual void setStrikethroughStyle(bool style); virtual bool isStrikethroughStyle() const; virtual void setDynamicColoring(bool coloring); virtual bool isDynamicColoring() const; virtual int32_t getStringIndexAt(const std::string &text, int32_t x) const; Image* getAsImage(const std::string& text); Image* getAsImageMultiline(const std::string& text); std::string splitTextToWidth (const std::string& text, int32_t render_width); SDL_Color getColor() const; virtual SDL_Surface* renderString(const std::string& text) = 0; protected: TextRenderPool m_pool; SDL_Color mColor; int32_t mGlyphSpacing; int32_t mRowSpacing; std::string mFilename; bool m_antiAlias; bool m_boldStyle; bool m_italicStyle; bool m_underlineStyle; bool m_strikeStyle; bool m_coloring; }; } #endif fifengine-0.4.2/engine/core/video/fonts/fonts.i000066400000000000000000000060261341615052600214150ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fife %{ #include "video/fonts/ifont.h" #include "video/fonts/fontbase.h" #include "video/fonts/truetypefont.h" #include "video/fonts/subimagefont.h" %} typedef uint8_t Uint8; namespace FIFE { class IFont { public: virtual ~IFont(); virtual void setRowSpacing (int32_t spacing) = 0; virtual int32_t getRowSpacing() const = 0; virtual void setGlyphSpacing(int32_t spacing) = 0; virtual int32_t getGlyphSpacing() const = 0; virtual void setAntiAlias(bool antiAlias) = 0; virtual bool isAntiAlias() = 0; virtual void setColor(uint8_t r,uint8_t g,uint8_t b, uint8_t a = 255) = 0; virtual SDL_Color getColor() const = 0; virtual int32_t getWidth(const std::string& text) const = 0; virtual int32_t getHeight() const = 0; }; class FontBase: public IFont { public: virtual ~FontBase(){ } }; %feature("notabstract") TrueTypeFont; %rename(TTFont) TrueTypeFont; class TrueTypeFont: public FontBase { public: TrueTypeFont(const std::string& filename, int32_t size); virtual ~TrueTypeFont(); virtual void setColor(Uint8 r, Uint8 g, Uint8 b, Uint8 a = 255); virtual int32_t getWidth(const std::string& text) const; virtual int32_t getHeight() const; }; %feature("notabstract") SubImageFont; class SubImageFont: public FontBase { public: SubImageFont(const std::string& filename, const std::string& glyphs); virtual ~SubImageFont(); virtual void setColor(Uint8 r, Uint8 g, Uint8 b, Uint8 a = 255); virtual int32_t getWidth(const std::string& text) const; virtual int32_t getHeight() const; }; } fifengine-0.4.2/engine/core/video/fonts/ifont.h000066400000000000000000000123671341615052600214070ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_IFONT_H #define FIFE_IFONT_H // Standard C++ library includes #include // Platform specific includes // 3rd party library includes #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder namespace FIFE { class Image; /** Pure abstract Font interface */ class IFont { public: virtual ~IFont() {} /** * Sets the spacing between rows in pixels. Default is 0 pixels. * The spacing can be negative. * * @param spacing the spacing in pixels. */ virtual void setRowSpacing (int32_t spacing) = 0; /** * Gets the spacing between rows in pixels. * * @return the spacing. */ virtual int32_t getRowSpacing() const = 0; /** * Sets the spacing between letters in pixels. Default is 0 pixels. * The spacing can be negative. * * @param spacing the spacing in pixels. */ virtual void setGlyphSpacing(int32_t spacing) = 0; /** * Gets the spacing between letters in pixels. * * @return the spacing. */ virtual int32_t getGlyphSpacing() const = 0; /** * Sets the use of anti aliasing. * * @param antiAlias true for use of anti aliasing. */ virtual void setAntiAlias(bool antiAlias) = 0; /** * Checks if anti aliasing is used. * * @return true if anti aliasing is used. */ virtual bool isAntiAlias() const = 0; /** * Sets the use of bold style. * * @param stlye True for use of bold style. */ virtual void setBoldStyle(bool style) = 0; /** * Checks if bold style is used. * * @return true if bold style is used. */ virtual bool isBoldStyle() const = 0; /** * Sets the use of italic style. * * @param stlye True for use of italic style. */ virtual void setItalicStyle(bool style) = 0; /** * Checks if italic style is used. * * @return true if italic style is used. */ virtual bool isItalicStyle() const = 0; /** * Sets the use of underline style. * * @param stlye True for use of underline style. */ virtual void setUnderlineStyle(bool style) = 0; /** * Checks if underline style is used. * * @return true if underline style is used. */ virtual bool isUnderlineStyle() const = 0; /** * Sets the use of strikethrough style. * * @param stlye True for use of strikethrough style. */ virtual void setStrikethroughStyle(bool style) = 0; /** * Checks if strikethrough style is used. * * @return true if strikethrough style is used. */ virtual bool isStrikethroughStyle() const = 0; virtual void setDynamicColoring(bool coloring) = 0; virtual bool isDynamicColoring() const = 0; virtual int32_t getStringIndexAt(const std::string &text, int32_t x) const = 0; /** Gets given text as Image * The rsulting image is pooled, so it's not that time critical */ virtual Image* getAsImage(const std::string& text) = 0; /** Gets given text as Image. Text is splitted on multiple lines based "\n" marks * The rsulting image is pooled, so it's not that time critical */ virtual Image* getAsImageMultiline(const std::string& text) = 0; virtual std::string splitTextToWidth (const std::string& text, int32_t render_width) = 0; /** Set the color the text should be rendered in */ virtual void setColor(uint8_t r,uint8_t g,uint8_t b, uint8_t a = 255) = 0; /** Get the color the text was rendered in */ virtual SDL_Color getColor() const = 0; /** gets width of given text */ virtual int32_t getWidth(const std::string& text) const = 0; /** gets height of this font */ virtual int32_t getHeight() const = 0; virtual void invalidate() = 0; }; } #endif fifengine-0.4.2/engine/core/video/fonts/imagefontbase.cpp000066400000000000000000000073221341615052600234220ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes #include // 3rd party library includes #include #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/exception.h" #include "util/structures/rect.h" #include "util/utf8/utf8.h" #include "video/image.h" #include "video/renderbackend.h" #include "imagefontbase.h" namespace FIFE { ImageFontBase::ImageFontBase() : FontBase(), m_height(0) { } ImageFontBase::~ImageFontBase() { type_glyphs::iterator i = m_glyphs.begin(); for(; i != m_glyphs.end(); ++i) { SDL_FreeSurface(i->second.surface); } } int32_t ImageFontBase::getWidth(const std::string& text) const { int32_t w = 0; std::string::const_iterator text_it = text.begin(); while(text_it != text.end()) { uint32_t codepoint = utf8::next(text_it,text.end()); type_glyphs::const_iterator it = m_glyphs.find( codepoint ); if( it != m_glyphs.end() ) { w += it->second.surface->w + getGlyphSpacing(); continue; } if( m_placeholder.surface ) { w += m_placeholder.surface->w + getGlyphSpacing(); } } return w; } int32_t ImageFontBase::getHeight() const { return m_height; } SDL_Surface *ImageFontBase::renderString(const std::string& text) { SDL_Surface *surface = SDL_CreateRGBSurface(0, getWidth(text),getHeight(),32, RMASK, GMASK, BMASK ,AMASK); SDL_FillRect(surface,0,0x00000000); SDL_Rect dst; dst.x = dst.y = 0; s_glyph *glyph = 0; std::string::const_iterator text_it = text.begin(); while(text_it != text.end()) { uint32_t codepoint = utf8::next(text_it,text.end()); type_glyphs::iterator it = m_glyphs.find( codepoint ); if( it == m_glyphs.end() ) { if( !m_placeholder.surface ) { continue; } glyph = &m_placeholder; } else { glyph = &(it->second); } dst.y = glyph->offset.y; dst.x += glyph->offset.x; SDL_BlitSurface(glyph->surface,0,surface,&dst); dst.x += glyph->surface->w + getGlyphSpacing(); } return surface; } void ImageFontBase::setColor(uint8_t r,uint8_t g,uint8_t b, uint8_t a) { } } fifengine-0.4.2/engine/core/video/fonts/imagefontbase.h000066400000000000000000000063541341615052600230730ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_FONTS_IMAGEFONTBASE_H #define FIFE_FONTS_IMAGEFONTBASE_H // Standard C++ library includes #include #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/structures/point.h" #include "fontbase.h" namespace FIFE { /** ImageFont base class * * Just set the glyphs/placeholder in any derived class and the rendering * is handled by this class. Also frees all glyph surfaces on destruction. */ class ImageFontBase: public FontBase { public: /** * Constructor. */ ImageFontBase(); /** * Destructor. */ virtual ~ImageFontBase(); /** Get the width in pixels a given text would occupy * @param text The text that should be measured. */ virtual int32_t getWidth(const std::string& text) const; /** Get the height in pixels a text line would occupy */ virtual int32_t getHeight() const; virtual SDL_Surface *renderString(const std::string& text); virtual void setColor(uint8_t r,uint8_t g,uint8_t b, uint8_t a = 255); protected: // A glyph (visible character) typedef struct { // The offset of the glyph relative to the top-left corner. Point offset; // The glyphs image // should be with SDL_SRCALPHA off, so that it's just copied over. SDL_Surface* surface; } s_glyph; typedef std::map type_glyphs; type_glyphs m_glyphs; // The glyph used, when the real glyph is not found // Should default to '?' s_glyph m_placeholder; int32_t m_height; }; } #endif // end GCN_SDLTRUETYPEFONT_HPP fifengine-0.4.2/engine/core/video/fonts/subimagefont.cpp000066400000000000000000000115071341615052600233010ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes #include // Platform specific includes #include "util/base/fife_stdint.h" // 3rd party library includes #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/exception.h" #include "util/log/logger.h" #include "util/structures/rect.h" #include "util/utf8/utf8.h" #include "video/image.h" #include "video/imagemanager.h" #include "video/renderbackend.h" #include "subimagefont.h" namespace FIFE { /** Logger to use for this source file. * @relates Logger */ static Logger _log(LM_GUI); SubImageFont::SubImageFont(const std::string& filename, const std::string& glyphs) : ImageFontBase() { FL_LOG(_log, LMsg("fifechan_image_font, loading ") << filename << " glyphs " << glyphs); ImagePtr img = ImageManager::instance()->load(filename); SDL_Surface* surface = img->getSurface(); m_colorkey = RenderBackend::instance()->getColorKey(); if( !surface ) { throw CannotOpenFile(filename); } // Make sure we get 32bit RGB // and copy the Pixelbuffers surface SDL_Surface *tmp = SDL_CreateRGBSurface(0, surface->w,surface->h,32, RMASK, GMASK, BMASK ,NULLMASK); SDL_BlitSurface(surface,0,tmp,0); surface = tmp; // Prepare the data for extracting the glyphs. uint32_t *pixels = reinterpret_cast(surface->pixels); int32_t x = 0; SDL_Rect src; src.h = surface->h; src.y = 0; uint32_t separator = pixels[0]; uint32_t colorkey = SDL_MapRGB(surface->format, m_colorkey.r, m_colorkey.g, m_colorkey.b); // if colorkey feature is not enabled then manually find the color key in the font if (!RenderBackend::instance()->isColorKeyEnabled()) { while(x < surface->w && pixels[x] == separator) { ++x; } colorkey = pixels[x]; } // Disable alpha blending, so that we use color keying //SDL_SetAlpha(surface,0,255); //SDL_SetColorKey(surface,SDL_SRCCOLORKEY,colorkey); FL_DBG(_log, LMsg("image_font") << " glyph separator is " << pprint(reinterpret_cast(separator)) << " transparent color is " << pprint(reinterpret_cast(colorkey))); // Finally extract all glyphs std::string::const_iterator text_it = glyphs.begin(); while(text_it != glyphs.end()) { int32_t w = 0; while(x < surface->w && pixels[x] == separator) ++x; if( x == surface->w ) break; while(x + w < surface->w && pixels[x + w] != separator) ++w; src.x = x; src.w = w; tmp = SDL_CreateRGBSurface(0, w,surface->h,32, RMASK, GMASK, BMASK ,NULLMASK); SDL_FillRect(tmp,0,colorkey); SDL_BlitSurface(surface,&src,tmp,0); // Disable alpha blending, so that we use colorkeying //SDL_SetAlpha(tmp,0,255); //SDL_SetColorKey(tmp,SDL_SRCCOLORKEY,colorkey); SDL_SetSurfaceBlendMode(tmp, SDL_BLENDMODE_NONE); SDL_SetColorKey(tmp, SDL_TRUE, colorkey); uint32_t codepoint = utf8::next(text_it, glyphs.end()); m_glyphs[ codepoint ].surface = tmp; x += w; } // Set placeholder glyph // This should actually work with utf8. if( m_glyphs.find('?') != m_glyphs.end() ) { m_placeholder = m_glyphs['?']; } else { m_placeholder.surface = 0; } m_height = surface->h; SDL_FreeSurface(surface); } } fifengine-0.4.2/engine/core/video/fonts/subimagefont.h000066400000000000000000000046721341615052600227530ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_FONTS_SUBIMAGEFONT_H #define FIFE_FONTS_SUBIMAGEFONT_H // Standard C++ library includes #include // Platform specific includes #include "util/base/fife_stdint.h" // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "imagefontbase.h" namespace FIFE { /** Imagefont that is able to read glyphs from single image sheet, see e.g. * Fifechan imagefontcollection (google for it) */ class SubImageFont: public ImageFontBase { public: /** * Constructor. * * @param filename the filename of the Image Font. * @param glyphs the glyphs for Fifechan format. */ SubImageFont(const std::string& filename, const std::string& glyphs); ~SubImageFont() {} private: SDL_Color m_colorkey; }; } #endif fifengine-0.4.2/engine/core/video/fonts/textrenderpool.cpp000066400000000000000000000106431341615052600236740ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes #include // Platform specific includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "video/image.h" #include "util/time/timemanager.h" #include "fontbase.h" #include "textrenderpool.h" namespace FIFE { TextRenderPool::TextRenderPool(size_t poolSize) { m_poolMaxSize = poolSize; m_poolSize = 0; m_collectTimer.setInterval( 1000 * 60 ); m_collectTimer.setCallback(std::bind( &TextRenderPool::removeOldEntries, this) ); } TextRenderPool::~TextRenderPool() { type_pool::iterator it= m_pool.begin(); for(;it != m_pool.end(); ++it) { delete it->image; } } Image* TextRenderPool::getRenderedText( FontBase* fontbase, const std::string& text) { SDL_Color c = fontbase->getColor(); type_pool::iterator it= m_pool.begin(); for(;it != m_pool.end(); ++it) { if( it->antialias != fontbase->isAntiAlias() ) continue; if( it->glyph_spacing != fontbase->getGlyphSpacing() ) continue; if( it->row_spacing != fontbase->getRowSpacing() ) continue; if( it->color.r != c.r || it->color.g != c.g || it->color.b != c.b ) continue; if( it->text != text ) continue; // Stay sorted after access time it->timestamp = TimeManager::instance()->getTime(); m_pool.push_front( *it ); m_pool.erase( it ); return m_pool.front().image; } return 0; } void TextRenderPool::addRenderedText( FontBase* fontbase,const std::string& text, Image* image) { // Construct a entry and add it. s_pool_entry centry; centry.antialias = fontbase->isAntiAlias(); centry.glyph_spacing = fontbase->getGlyphSpacing(); centry.row_spacing = fontbase->getRowSpacing(); centry.text = text; centry.color = fontbase->getColor(); centry.image = image; centry.timestamp = TimeManager::instance()->getTime(); m_pool.push_front( centry ); // Some minimal amount of entries -> start collection timer // Don't have a timer active if only _some_ text is pooled. if( m_poolSize >= m_poolMaxSize/10 ) m_collectTimer.start(); // Maintain max pool size if( m_poolSize < m_poolMaxSize ) { m_poolSize++; return; } else { delete m_pool.back().image; m_pool.pop_back(); } } void TextRenderPool::removeOldEntries() { type_pool::iterator it = m_pool.begin(); uint32_t now = TimeManager::instance()->getTime(); while (it != m_pool.end()) { if( (now - it->timestamp) > 1000*60 ) { delete it->image; it = m_pool.erase(it); --m_poolSize; } else { ++it; } } // Stop if nothing can grow old =) if( m_poolSize == 0 ) m_collectTimer.stop(); } void TextRenderPool::invalidateCachedText() { type_pool::iterator it = m_pool.begin(); while (it != m_pool.end()) { it->image->invalidate(); ++it; } } } fifengine-0.4.2/engine/core/video/fonts/textrenderpool.h000066400000000000000000000065761341615052600233530ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_FONTS_TEXTRENDERPOOL_H #define FIFE_FONTS_TEXTRENDERPOOL_H // Standard C++ library includes #include #include // Platform specific includes // 3rd party library includes #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/time/timer.h" struct SDL_Surface; namespace FIFE { class FontBase; class Image; /** Generic pool for rendered text * Caches a number of Images with text, as rendered by a Font. * Makes sure no more than a maximum number of strings is pooled at a time. * Automatically removes pooled strings not used for a minute. * Doesn't use resources (apart from a minimum) if not used after a while. * * @todo Should probably use a @c std::map instead of a @c std::list */ class TextRenderPool { public: /** Constructor * Constructs a pool with a maximum of poolSize entries */ TextRenderPool(size_t poolSize = 200); /** Destructor */ ~TextRenderPool(); /** Invalidates all cached text images */ void invalidateCachedText(); /** Get a string image */ Image* getRenderedText( FontBase* fontbase, const std::string& text); /** Add a string image */ void addRenderedText( FontBase* fontbase, const std::string& text, Image* image); /** Remove entries not used since a minute * Is a timer callback. */ void removeOldEntries(); protected: typedef struct { std::string text; SDL_Color color; bool antialias; int glyph_spacing; int row_spacing; uint32_t timestamp; Image* image; } s_pool_entry; typedef std::list type_pool; type_pool m_pool; size_t m_poolSize; size_t m_poolMaxSize; Timer m_collectTimer; }; } #endif fifengine-0.4.2/engine/core/video/fonts/truetypefont.cpp000066400000000000000000000116471341615052600233730ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes #include // 3rd party library includes #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/exception.h" #include "util/structures/rect.h" #include "util/utf8/utf8.h" #include "video/image.h" #include "video/renderbackend.h" #include "truetypefont.h" namespace FIFE { TrueTypeFont::TrueTypeFont(const std::string& filename, int32_t size) : FIFE::FontBase() { mFilename = filename; mFont = NULL; mFontStyle = TTF_STYLE_NORMAL; mFont = TTF_OpenFont(filename.c_str(), size); if (mFont == NULL) { throw FIFE::CannotOpenFile(filename + " (" + TTF_GetError() + ")"); } mColor.r = mColor.g = mColor.b = mColor.a = 255; // Maybe we should add an setting for that // TTF_HINTING_NORMAL // default // TTF_HINTING_LIGHT // TTF_HINTING_MONO // TTF_HINTING_NONE //TTF_SetFontHinting(mFont, TTF_HINTING_LIGHT); } TrueTypeFont::~TrueTypeFont() { TTF_CloseFont(mFont); } int32_t TrueTypeFont::getWidth(const std::string& text) const { int32_t w, h; assert( utf8::is_valid(text.begin(), text.end()) ); TTF_SizeUTF8(mFont, text.c_str(), &w, &h); return w; } int32_t TrueTypeFont::getHeight() const { return TTF_FontHeight(mFont) + getRowSpacing(); } void TrueTypeFont::setBoldStyle(bool style) { if (style != m_boldStyle) { if (style) { mFontStyle |= TTF_STYLE_BOLD; } else { mFontStyle &= ~TTF_STYLE_BOLD; } m_boldStyle = style; TTF_SetFontStyle(mFont, mFontStyle); } } void TrueTypeFont::setItalicStyle(bool style) { if (style != m_italicStyle) { if (style) { mFontStyle |= TTF_STYLE_ITALIC; } else { mFontStyle &= ~TTF_STYLE_ITALIC; } m_italicStyle = style; TTF_SetFontStyle(mFont, mFontStyle); } } void TrueTypeFont::setUnderlineStyle(bool style) { if (style != m_underlineStyle) { if (style) { mFontStyle |= TTF_STYLE_UNDERLINE; } else { mFontStyle &= ~TTF_STYLE_UNDERLINE; } m_underlineStyle = style; TTF_SetFontStyle(mFont, mFontStyle); } } void TrueTypeFont::setStrikethroughStyle(bool style) { // ToDo: It's currently not available. if (style != m_strikeStyle) { m_strikeStyle = style; } } int32_t TrueTypeFont::getFontStyleMask() const { return mFontStyle; } SDL_Surface* TrueTypeFont::renderString(const std::string& text) { if( text.empty() ) { SDL_Surface *surface = SDL_CreateRGBSurface(0, 1,getHeight(),32, RMASK, GMASK, BMASK ,AMASK); SDL_FillRect(surface,0,0x00000000); return surface; } SDL_Surface* renderedText = 0; if (m_antiAlias) { renderedText = TTF_RenderUTF8_Blended(mFont, text.c_str(), mColor); } else { renderedText = TTF_RenderUTF8_Solid(mFont, text.c_str(), mColor); } // Workaround for a freetype bug, see here: // http://www.nabble.com/SDL_ttf-and-DPMSDisable-bug-is-back-or-still-there-to9578884.html if (renderedText == 0 && !m_antiAlias) { renderedText = TTF_RenderUTF8_Blended(mFont, text.c_str(), mColor); } // Still could not render? Something went horribly wrong! if (renderedText == 0) { throw FIFE::SDLException(TTF_GetError()); } return renderedText; } void TrueTypeFont::setColor(uint8_t r,uint8_t g,uint8_t b, uint8_t a) { mColor.r = r; mColor.g = g; mColor.b = b; mColor.a = a; } } fifengine-0.4.2/engine/core/video/fonts/truetypefont.h000066400000000000000000000063521341615052600230350ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_FONTS_TRUETYPEFONT_H #define FIFE_FONTS_TRUETYPEFONT_H // Standard C++ library includes #include #include // 3rd party library includes #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "fontbase.h" namespace FIFE { /** * SDL True Type Font implementation of Font. It uses the SDL_ttf library * to display True Type Fonts with SDL. * * NOTE: You must initialize the SDL_ttf library before using this * class. Also, remember to call the SDL_ttf libraries quit * function. * * Original author of this class is Walluce Pinkham. Some modifications * made by the Guichan team, and additonal modifications by the FIFE team. */ class TrueTypeFont: public FontBase { public: /** * Constructor. * * @param filename the filename of the True Type Font. * @param size the size the font should be in. */ TrueTypeFont(const std::string& filename, int32_t size); /** * Destructor. */ virtual ~TrueTypeFont(); // Inherited from Font virtual int32_t getWidth(const std::string& text) const; virtual int32_t getHeight() const; virtual void setBoldStyle(bool style); virtual void setItalicStyle(bool style); virtual void setUnderlineStyle(bool style); virtual void setStrikethroughStyle(bool style); virtual int32_t getFontStyleMask() const; virtual SDL_Surface *renderString(const std::string& text); virtual void setColor(uint8_t r,uint8_t g,uint8_t b, uint8_t a = 255); protected: TTF_Font* mFont; int32_t mFontStyle; }; } #endif // fifengine-0.4.2/engine/core/video/image.cpp000066400000000000000000000251771341615052600205570ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes #include #include #include // 3rd party library includes #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/resource/resource.h" #include "loaders/native/video/imageloader.h" #include "image.h" namespace FIFE { Image::Image(IResourceLoader* loader): IResource(createUniqueImageName(), loader), m_surface(NULL), m_xshift(0), m_yshift(0), m_shared(false){ } Image::Image(const std::string& name, IResourceLoader* loader): IResource(name, loader), m_surface(NULL), m_xshift(0), m_yshift(0), m_shared(false){ } Image::Image(SDL_Surface* surface): IResource(createUniqueImageName()), m_surface(NULL), m_xshift(0), m_yshift(0), m_shared(false){ reset(surface); } Image::Image(const std::string& name, SDL_Surface* surface): IResource(name), m_surface(NULL), m_xshift(0), m_yshift(0), m_shared(false){ reset(surface); } //@todo make a private function to handle this Image::Image(const uint8_t* data, uint32_t width, uint32_t height): IResource(createUniqueImageName()), m_surface(NULL), m_xshift(0), m_yshift(0), m_shared(false){ SDL_Surface* surface = SDL_CreateRGBSurface(0, width,height, 32, RMASK, GMASK, BMASK ,AMASK); SDL_LockSurface(surface); uint32_t size = width * height * 4; uint8_t* pixeldata = static_cast(surface->pixels); std::copy(data, data + size, pixeldata); SDL_UnlockSurface(surface); reset(surface); } Image::Image(const std::string& name, const uint8_t* data, uint32_t width, uint32_t height): IResource(name), m_surface(NULL), m_xshift(0), m_yshift(0), m_shared(false) { SDL_Surface* surface = SDL_CreateRGBSurface(0, width,height, 32, RMASK, GMASK, BMASK ,AMASK); SDL_LockSurface(surface); uint32_t size = width * height * 4; uint8_t* pixeldata = static_cast(surface->pixels); std::copy(data, data + size, pixeldata); SDL_UnlockSurface(surface); reset(surface); } void Image::reset(SDL_Surface* surface) { if( m_surface && !m_shared) { SDL_FreeSurface(m_surface); } m_xshift = 0; m_yshift = 0; m_surface = surface; } Image::~Image() { reset(NULL); } void Image::load() { if (m_loader){ m_loader->load(this); } else { ImageLoader loader; loader.load(this); } m_state = IResource::RES_LOADED; } void Image::free() { // save the image offsets int32_t xshift = m_xshift; int32_t yshift = m_yshift; reset(NULL); m_xshift = xshift; m_yshift = yshift; m_state = IResource::RES_NOT_LOADED; } SDL_Surface* Image::detachSurface() { SDL_Surface* srf = m_surface; m_surface = NULL; return srf; } uint32_t Image::getWidth() const { if (m_shared) { return m_subimagerect.w; } else if (!m_surface) { return 0; } return m_surface->w; } uint32_t Image::getHeight() const { if (m_shared) { return m_subimagerect.h; } else if (!m_surface) { return 0; } return m_surface->h; } size_t Image::getSize() { if (!m_surface || m_shared) { return 0; } return m_surface->h * m_surface->pitch; } Rect Image::getArea() const { Rect r(0, 0, getWidth(), getHeight()); return r; } void Image::getPixelRGBA(int32_t x, int32_t y, uint8_t* r, uint8_t* g, uint8_t* b, uint8_t* a) { Uint8 *p; assert(m_surface); int32_t bpp = m_surface->format->BytesPerPixel; if(!isSharedImage()) { if ((x < 0) || (x >= m_surface->w) || (y < 0) || (y >= m_surface->h)) { r = g = b = a = 0; return; } p = (Uint8*)m_surface->pixels + y * m_surface->pitch + x * bpp; } else { if ((x < 0) || ((x + m_subimagerect.x) >= m_surface->w) || (y < 0) || ((y + m_subimagerect.y) >= m_surface->h)) { r = g = b = a = 0; return; } p = (Uint8*)m_surface->pixels + (y + m_subimagerect.y) * m_surface->pitch + (x + m_subimagerect.x) * bpp; } uint32_t pixel = 0; switch(bpp) { case 1: pixel = *p; break; case 2: pixel = *(Uint16 *)p; break; case 3: if (SDL_BYTEORDER == SDL_BIG_ENDIAN) { pixel = p[0] << 16 | p[1] << 8 | p[2]; } else { pixel = p[0] | p[1] << 8 | p[2] << 16; } break; case 4: pixel = *(Uint32 *)p; break; } SDL_GetRGBA(pixel, m_surface->format, r, g, b, a); } void Image::saveImage(const std::string& filename) { saveAsPng(filename, *m_surface); } void Image::saveAsPng(const std::string& filename, const SDL_Surface& surface) { FILE *fp; png_structp pngptr; png_infop infoptr; int32_t colortype; png_bytep *rowpointers = NULL; fp = fopen(filename.c_str(), "wb"); if (fp == NULL) { return; } //create the png file pngptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if (pngptr == NULL) { fclose(fp); return; } //create information struct infoptr = png_create_info_struct(pngptr); if (infoptr == NULL) { fclose(fp); png_destroy_write_struct(&pngptr, (png_infopp)NULL); return; } if (setjmp(png_jmpbuf(pngptr))) { png_destroy_write_struct(&pngptr, &infoptr); fclose(fp); return; } //initialize io png_init_io(pngptr, fp); // lock the surface for access (we strip it off of const but we promise not to modify it, just read) SDL_LockSurface(const_cast(&surface)); colortype = PNG_COLOR_TYPE_RGB; if(surface.format->palette){ colortype |= PNG_COLOR_TYPE_PALETTE; } else if (surface.format->Amask){ colortype |= PNG_COLOR_TYPE_RGB_ALPHA; } else{} png_set_IHDR(pngptr, infoptr, surface.w, surface.h, 8, colortype, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); png_write_info(pngptr, infoptr); png_set_packing(pngptr); rowpointers = new png_bytep[surface.h]; for (int32_t i = 0; i < surface.h; i++) { rowpointers[i] = (png_bytep)(Uint8 *)surface.pixels + i*surface.pitch; } //write the image png_write_image(pngptr, rowpointers); png_write_end(pngptr, infoptr); SDL_UnlockSurface(const_cast(&surface)); delete [] rowpointers; png_destroy_write_struct(&pngptr, &infoptr); fclose(fp); } std::string Image::createUniqueImageName() { // automated counting for name generation, in case the user doesn't provide a name static uint32_t uniqueNumber = 0; static std::string baseName = "image"; std::ostringstream oss; oss << uniqueNumber << "_" << baseName; const std::string name = oss.str(); ++uniqueNumber; return name; } void Image::copySubimage(uint32_t xoffset, uint32_t yoffset, const ImagePtr& srcimg){ if (!srcimg->m_surface) { return; } else if (!m_surface) { m_surface = SDL_CreateRGBSurface(0, srcimg->getWidth(), srcimg->getHeight(), 32, RMASK, GMASK, BMASK ,AMASK); } // disable blending SDL_SetSurfaceBlendMode(srcimg->m_surface, SDL_BLENDMODE_NONE); if(this->isSharedImage()) { Rect const& rect = this->getSubImageRect(); SDL_Rect dstrect = { static_cast(rect.x + xoffset), static_cast(rect.y + yoffset), static_cast(srcimg->getWidth()), static_cast(srcimg->getHeight()) }; if(srcimg->isSharedImage()) { Rect const& rect = srcimg->getSubImageRect(); SDL_Rect srcrect = { static_cast(rect.x), static_cast(rect.y), static_cast(rect.w), static_cast(rect.h) }; SDL_BlitSurface(srcimg->m_surface, &srcrect, m_surface, &dstrect); } else { SDL_BlitSurface(srcimg->m_surface, NULL, m_surface, &dstrect); } } else { SDL_Rect dstrect = { static_cast(xoffset), static_cast(yoffset), static_cast(srcimg->getWidth()), static_cast(srcimg->getHeight()) }; if(srcimg->isSharedImage()) { Rect const& rect = srcimg->getSubImageRect(); SDL_Rect srcrect = { static_cast(rect.x), static_cast(rect.y), static_cast(rect.w), static_cast(rect.h) }; SDL_BlitSurface(srcimg->m_surface, &srcrect, m_surface, &dstrect); } else { SDL_BlitSurface(srcimg->m_surface, NULL, m_surface, &dstrect); } } // enable blending SDL_SetSurfaceBlendMode(srcimg->m_surface, SDL_BLENDMODE_BLEND); } bool Image::putPixel(SDL_Surface* surface, int32_t x, int32_t y, uint8_t r, uint8_t g, uint8_t b, uint8_t a) { if ((x < 0) || (x >= surface->w) || (y < 0) || (y >= surface->h)) { return false; } int32_t bpp = surface->format->BytesPerPixel; SDL_LockSurface(surface); Uint8* p = (Uint8*)surface->pixels + y * surface->pitch + x * bpp; Uint32 pixel = SDL_MapRGBA(surface->format, r, g, b, a); switch(bpp) { case 1: *p = pixel; break; case 2: *(Uint16 *)p = pixel; break; case 3: if(SDL_BYTEORDER == SDL_BIG_ENDIAN) { p[0] = (pixel >> 16) & 0xff; p[1] = (pixel >> 8) & 0xff; p[2] = pixel & 0xff; } else { p[0] = pixel & 0xff; p[1] = (pixel >> 8) & 0xff; p[2] = (pixel >> 16) & 0xff; } break; case 4: *(Uint32 *)p = pixel; break; } SDL_UnlockSurface(surface); return true; } } fifengine-0.4.2/engine/core/video/image.h000066400000000000000000000152331341615052600202140ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_VIDEO_IMAGE_H #define FIFE_VIDEO_IMAGE_H // Standard C++ library includes #include // 3rd party library includes #include #define PNG_SKIP_SETJMP_CHECK #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/fife_stdint.h" #include "util/resource/resource.h" #include "util/structures/point.h" #include "util/structures/rect.h" namespace FIFE { class Image; typedef SharedPtr ImagePtr; /** Base Class for Images. */ class Image : public IResource { public: /** Constructor. */ Image(IResourceLoader* loader = 0); Image(const std::string& name, IResourceLoader* loader = 0); /** Constructor. * @note Takes ownership of the SDL Surface * @param surface SDL Surface in RGBA format */ Image(SDL_Surface* surface); Image(const std::string& name, SDL_Surface* surface); /** Constructor * @param data Pointer to the imagedata (needs to be in RGBA, 8 bits per channel). * @param width Width of the image. * @param height Height of the image. */ Image(const uint8_t* data, uint32_t width, uint32_t height); Image(const std::string& name, const uint8_t* data, uint32_t width, uint32_t height); /** Destructor. */ virtual ~Image(); /** Invalidates the Image causing it to be reset or re-loaded */ virtual void invalidate() = 0; /** Renders itself to the current render target (main screen or attached destination image) at the rectangle rect. * Convenience function * @param rect The position and clipping where to draw this image to. * @param alpha The alpha value, with which to draw self. * @param rgb The color value of overlay if any. */ virtual void render(const Rect& rect, uint8_t alpha = 255, uint8_t const* rgb = 0) = 0; virtual void render(const Rect& rect, const ImagePtr& overlay, uint8_t alpha = 255, uint8_t const* rgb = 0) {} virtual void renderZ(const Rect& rect, float vertexZ, uint8_t alpha = 255, uint8_t const* rgb = 0) {} virtual void renderZ(const Rect& rect, float vertexZ, const ImagePtr& overlay, uint8_t alpha = 255, uint8_t const* rgb = 0) {} virtual void renderZ(const Rect& rect, float vertexZ, uint8_t alpha = 255, bool forceNewBatch = false, uint8_t const* rgb = 0) {} /** Removes underlying SDL_Surface from the image (if exists) and returns this * @note this effectively causes SDL_Surface not to be freed on destruction */ SDL_Surface* detachSurface(); SDL_Surface* getSurface() { assert(m_surface); return m_surface; } const SDL_Surface* getSurface() const { assert(m_surface); return m_surface; } /** This frees the current suface and replaces it with the * surface passed in the parameter (which can be NULL). * @see Image::reset(SDL_Surface* surface) * @param surface the SDL_Surface to use for this image */ virtual void setSurface(SDL_Surface* surface) = 0; /** Saves the image using given filename. */ void saveImage(const std::string& filename); /** Saves the SDL_Surface to png format */ static void saveAsPng(const std::string& filename, const SDL_Surface& surface); static bool putPixel(SDL_Surface* surface, int32_t x, int32_t y, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255); uint32_t getWidth() const; uint32_t getHeight() const; Rect getArea() const; void setXShift(int32_t xshift) { m_xshift = xshift; } int32_t getXShift() const { return m_xshift; } void setYShift(int32_t yshift) { m_yshift = yshift; } int32_t getYShift() const { return m_yshift; } void getPixelRGBA(int32_t x, int32_t y, uint8_t* r, uint8_t* g, uint8_t* b, uint8_t* a); virtual size_t getSize(); virtual void load(); virtual void free(); /** After this call all image data will be taken from the given image and its subregion */ virtual void useSharedImage(const ImagePtr& shared, const Rect& region) = 0; /** Forces to load the image into internal memory of GPU */ virtual void forceLoadInternal() = 0; /** Returns true if this image shares data with another one */ bool isSharedImage() const { return m_shared; } /** Returns area of the image it occupies in the shared image */ const Rect& getSubImageRect() const { return m_subimagerect; } /** Copies given image into this one with respect to given offsets */ virtual void copySubimage(uint32_t xoffset, uint32_t yoffset, const ImagePtr& img); protected: // The SDL Surface used. SDL_Surface* m_surface; // The X shift of the Image int32_t m_xshift; // The Y shift of the Image int32_t m_yshift; /** Resets the image to default values (including the x and y shift * values), frees the current surface and sets the surface to the * passed SDL_Surface (which can be NULL). * @see IImage::setSurface(SDL_Surface* surface) * @param surface the SDL_Surface to use for this image */ void reset(SDL_Surface* surface); // Does this image share data with another bool m_shared; // Area which this image occupy in shared image Rect m_subimagerect; private: std::string createUniqueImageName(); }; } #endif fifengine-0.4.2/engine/core/video/imagemanager.cpp000066400000000000000000000336611341615052600221070ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes #include // 3rd party library includes #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/log/logger.h" #include "util/resource/resourcemanager.h" #include "util/resource/resource.h" #include "video/image.h" #include "video/renderbackend.h" #include "imagemanager.h" namespace FIFE { /** Logger to use for this source file. * @relates Logger */ static Logger _log(LM_RESMGR); ImageManager::~ImageManager() { } size_t ImageManager::getMemoryUsed() const { size_t totalSize = 0; ImageHandleMapConstIterator it = m_imgHandleMap.begin(), itend = m_imgHandleMap.end(); for ( ; it != itend; ++it) { totalSize += it->second->getSize(); } return totalSize; } size_t ImageManager::getTotalResourcesCreated() const { ImageHandleMapConstIterator it = m_imgHandleMap.begin(), itend = m_imgHandleMap.end(); size_t count = 0; for ( ; it != itend; ++it) { if ( it->second->getState() == IResource::RES_NOT_LOADED ) { count++; } } return count; } size_t ImageManager::getTotalResourcesLoaded() const { ImageHandleMapConstIterator it = m_imgHandleMap.begin(), itend = m_imgHandleMap.end(); size_t count = 0; for ( ; it != itend; ++it) { if ( it->second->getState() == IResource::RES_LOADED ) { count++; } } return count; } size_t ImageManager::getTotalResources() const { return m_imgHandleMap.size(); } ImagePtr ImageManager::create(IResourceLoader* loader){ Image* ptr = RenderBackend::instance()->createImage(loader); return add(ptr); } ImagePtr ImageManager::create(const std::string& name, IResourceLoader* loader){ if (exists(name)) { FL_WARN(_log, LMsg("ImageManager::create(std::string, IResourceLoader* loader) - ") << "Resource name " << name << " was previously created. Returning original Image..."); return getPtr(name); } Image* ptr = RenderBackend::instance()->createImage(name, loader); return add(ptr); } ImagePtr ImageManager::load(const std::string& name, IResourceLoader* loader) { ImageNameMapIterator nit = m_imgNameMap.find(name); if (nit != m_imgNameMap.end()) { if ( nit->second->getState() == IResource::RES_NOT_LOADED ) { nit->second->load(); } return nit->second; } //was not found so create and load resource ImagePtr ptr = create(name, loader); ptr->load(); if (ptr->getState() == IResource::RES_NOT_LOADED){ FL_WARN(_log, LMsg("ImageManager::load(std::string) - ") << "Resource name " << name << " was not found and could not be loaded."); remove(name); } return ptr; } ImagePtr ImageManager::loadBlank(uint32_t width, uint32_t height) { uint8_t* pixdata = new uint8_t[width * height * 4]; memset(pixdata, 0, width * height * 4); Image* ptr = RenderBackend::instance()->createImage(pixdata, width, height); delete [] pixdata; ptr->setState(IResource::RES_LOADED); return add(ptr); } ImagePtr ImageManager::loadBlank(const std::string& name, uint32_t width, uint32_t height) { ImageNameMapIterator nit = m_imgNameMap.find(name); if (nit != m_imgNameMap.end()) { remove(nit->second); } uint8_t* pixdata = new uint8_t[width * height * 4]; memset(pixdata, 0, width * height * 4); Image* ptr = RenderBackend::instance()->createImage(name, pixdata, width, height); delete [] pixdata; ptr->setState(IResource::RES_LOADED); return add(ptr); } ImagePtr ImageManager::add(Image* res) { assert(res); assert(!(exists(res->getHandle()) || exists(res->getName()))); ImagePtr resptr(res); std::pair returnValue; returnValue = m_imgHandleMap.insert ( ImageHandleMapPair(res->getHandle(), resptr)); if (returnValue.second) { m_imgNameMap.insert ( ImageNameMapPair(returnValue.first->second->getName(), returnValue.first->second) ); } else { FL_WARN(_log, LMsg("ImageManager::add(IResource*) - ") << "Resource " << res->getName() << " already exists.... ignoring."); } return returnValue.first->second; } bool ImageManager::exists(const std::string& name) { ImageNameMapIterator it = m_imgNameMap.find(name); if (it != m_imgNameMap.end()) { return true; } return false; } bool ImageManager::exists(ResourceHandle handle) { ImageHandleMapConstIterator it = m_imgHandleMap.find(handle); if (it != m_imgHandleMap.end()) { return true; } return false; } void ImageManager::reload(const std::string& name) { ImageNameMapIterator nit = m_imgNameMap.find(name); if (nit != m_imgNameMap.end()) { if ( nit->second->getState() == IResource::RES_LOADED) { nit->second->free(); } nit->second->load(); return; } FL_WARN(_log, LMsg("ImageManager::reload(std::string) - ") << "Resource name " << name << " not found."); } void ImageManager::reload(ResourceHandle handle) { ImageHandleMapIterator it = m_imgHandleMap.find(handle); if ( it != m_imgHandleMap.end()) { if ( it->second->getState() == IResource::RES_LOADED) { it->second->free(); } it->second->load(); return; } FL_WARN(_log, LMsg("ImageManager::reload(ResourceHandle) - ") << "Resource handle " << handle << " not found."); } void ImageManager::reloadAll() { ImageHandleMapIterator it = m_imgHandleMap.begin(), itend = m_imgHandleMap.end(); for ( ; it != itend; ++it) { if ( it->second->getState() == IResource::RES_LOADED) { it->second->free(); } it->second->load(); } } void ImageManager::loadUnreferenced() { ImageHandleMapIterator it = m_imgHandleMap.begin(), itend = m_imgHandleMap.end(); int32_t count = 0; for ( ; it != itend; ++it) { if (it->second.useCount() == 2 && it->second->getState() != IResource::RES_LOADED){ it->second->load(); count++; } } FL_DBG(_log, LMsg("ImageManager::loadUnreferenced() - ") << "Loaded " << count << " unreferenced resources."); } void ImageManager::free(const std::string& name) { ImageNameMapIterator nit = m_imgNameMap.find(name); if (nit != m_imgNameMap.end()) { if ( nit->second->getState() == IResource::RES_LOADED) { nit->second->free(); } return; } FL_WARN(_log, LMsg("ImageManager::free(std::string) - ") << "Resource name " << name << " not found."); } void ImageManager::free(ResourceHandle handle) { ImageHandleMapConstIterator it = m_imgHandleMap.find(handle); if (it != m_imgHandleMap.end()) { if ( it->second->getState() == IResource::RES_LOADED) { it->second->free(); } return; } FL_WARN(_log, LMsg("ImageManager::free(ResourceHandle) - ") << "Resource handle " << handle << " not found."); } void ImageManager::freeAll() { ImageHandleMapIterator it = m_imgHandleMap.begin(), itend = m_imgHandleMap.end(); int32_t count = 0; for ( ; it != itend; ++it) { if ( it->second->getState() == IResource::RES_LOADED) { it->second->free(); count++; } } FL_DBG(_log, LMsg("ImageManager::freeAll() - ") << "Freed all " << count << " resources."); } void ImageManager::freeUnreferenced() { ImageHandleMapIterator it = m_imgHandleMap.begin(), itend = m_imgHandleMap.end(); int32_t count = 0; for ( ; it != itend; ++it) { if (it->second.useCount() == 2 && it->second->getState() == IResource::RES_LOADED ){ it->second->free(); count++; } } FL_DBG(_log, LMsg("ImageManager::freeUnreferenced() - ") << "Freed " << count << " unreferenced resources."); } void ImageManager::remove(ImagePtr& resource) { ImageHandleMapIterator it = m_imgHandleMap.find(resource->getHandle()); ImageNameMapIterator nit = m_imgNameMap.find(resource->getName()); if (it != m_imgHandleMap.end()) { m_imgHandleMap.erase(it); if (nit != m_imgNameMap.end()) { m_imgNameMap.erase(nit); return; } assert(false); //should never get here } FL_WARN(_log, LMsg("ImageManager::remove(ResourcePtr&) - ") << "Resource " << resource->getName() << " was not found."); } void ImageManager::remove(const std::string& name) { std::size_t handle; ImageNameMapIterator nit = m_imgNameMap.find(name); if (nit != m_imgNameMap.end()) { handle = nit->second->getHandle(); m_imgNameMap.erase(nit); } else { FL_WARN(_log, LMsg("ImageManager::remove(std::string) - ") << "Resource " << name << " was not found."); return; } ImageHandleMapIterator it = m_imgHandleMap.find(handle); if ( it != m_imgHandleMap.end()) { m_imgHandleMap.erase(it); return; } assert(false); //should never get here } void ImageManager::remove(ResourceHandle handle) { std::string name; ImageHandleMapIterator it = m_imgHandleMap.find(handle); if (it != m_imgHandleMap.end()) { name = it->second->getName(); m_imgHandleMap.erase(it); } else { FL_WARN(_log, LMsg("ImageManager::remove(ResourceHandle) - ") << "Resource handle " << handle << " was not found."); return; } ImageNameMapIterator nit = m_imgNameMap.find(name); if ( nit != m_imgNameMap.end() ) { m_imgNameMap.erase(nit); return; } assert(false); //should never get here } void ImageManager::removeAll() { //should always be equal assert (m_imgHandleMap.size() == m_imgNameMap.size()); size_t count = m_imgHandleMap.size(); m_imgHandleMap.clear(); m_imgNameMap.clear(); FL_DBG(_log, LMsg("ImageManager::removeAll() - ") << "Removed all " << count << " resources."); } void ImageManager::removeUnreferenced() { ImageHandleMapIterator it = m_imgHandleMap.begin(), itend = m_imgHandleMap.end(); std::vector imgHandles; int32_t count = 0; for ( ; it != itend; ++it) { if ( it->second.useCount() == 2) { imgHandles.push_back(it->second->getHandle()); count++; } } for (std::vector::iterator it = imgHandles.begin(); it != imgHandles.end(); ++it) { remove(*it); } FL_DBG(_log, LMsg("ImageManager::removeUnreferenced() - ") << "Removed " << count << " unreferenced resources."); } ImagePtr ImageManager::get(const std::string& name) { ImageNameMapIterator nit = m_imgNameMap.find(name); if (nit != m_imgNameMap.end()) { if (nit->second->getState() != IResource::RES_LOADED){ //resource is not loaded so load it nit->second->load(); } return nit->second; } //not found so attempt to create and load the resource ImagePtr ptr = load(name); return ptr; } ImagePtr ImageManager::get(ResourceHandle handle) { ImageHandleMapConstIterator it = m_imgHandleMap.find(handle); if (it != m_imgHandleMap.end()) { if (it->second->getState() != IResource::RES_LOADED){ //resource is not loaded so load it it->second->load(); } return it->second; } FL_WARN(_log, LMsg("ImageManager::get(ResourceHandle) - ") << "Resource handle " << handle << " is undefined."); return ImagePtr(); } ImagePtr ImageManager::getPtr(const std::string& name) { ImageNameMapIterator nit = m_imgNameMap.find(name); if (nit != m_imgNameMap.end()) { return nit->second; } FL_WARN(_log, LMsg("ImageManager::getPtr(std::string) - ") << "Resource " << name << " is undefined."); return ImagePtr(); } ImagePtr ImageManager::getPtr(ResourceHandle handle) { ImageHandleMapConstIterator it = m_imgHandleMap.find(handle); if (it != m_imgHandleMap.end()) { return it->second; } FL_WARN(_log, LMsg("ImageManager::getPtr(ResourceHandle) - ") << "Resource handle " << handle << " is undefined."); return ImagePtr(); } ResourceHandle ImageManager::getResourceHandle(const std::string& name) { ImageNameMapIterator nit = m_imgNameMap.find(name); if (nit != m_imgNameMap.end()) { return nit->second->getHandle(); } FL_WARN(_log, LMsg("ImageManager::getResourceHandle(std::string) - ") << "Resource " << name << " is undefined."); return 0; } void ImageManager::invalidate(const std::string& name) { ImageNameMapIterator it = m_imgNameMap.find(name); if (it != m_imgNameMap.end()) { if (it->second->getState() == IResource::RES_LOADED){ it->second.get()->invalidate(); } } } void ImageManager::invalidate(ResourceHandle handle) { ImageHandleMapIterator it = m_imgHandleMap.find(handle); if (it != m_imgHandleMap.end()) { if (it->second->getState() == IResource::RES_LOADED) { it->second.get()->invalidate(); } } } void ImageManager::invalidateAll() { ImageHandleMapIterator it = m_imgHandleMap.begin(), itend = m_imgHandleMap.end(); for ( ; it != itend; ++it) { if (it->second->getState() == IResource::RES_LOADED) { it->second.get()->invalidate(); } } } } //FIFE fifengine-0.4.2/engine/core/video/imagemanager.h000066400000000000000000000274211341615052600215510ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_IMAGE_MANAGER_H #define FIFE_IMAGE_MANAGER_H // Standard C++ library includes #include #include #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/singleton.h" #include "util/resource/resource.h" #include "util/resource/resourcemanager.h" #include "image.h" namespace FIFE { /** ImageManager * * An interface for managing images. * * @see IResource * @see IResourceLoader * @see IResourceManager * */ class ImageManager : public IResourceManager, public DynamicSingleton { public: /** Default constructor. */ ImageManager() : IResourceManager() { } /** Destructor. */ virtual ~ImageManager(); virtual size_t getMemoryUsed() const; virtual size_t getTotalResourcesCreated() const; virtual size_t getTotalResourcesLoaded() const; virtual size_t getTotalResources() const; /** Creates a blank Image but does not load it immediately * * @param loader A pointer to the custom resource loader. The * default is NULL. If this parameter is present the resource * will use the loader to load instead of the default built in * functions. * @return An ImagePtr to the newly created Image * * @see Image * @see ImageLoader * @see IResourceLoader * */ virtual ImagePtr create(IResourceLoader* loader = 0); /** Creates a blank Image but does not load it immediately * * @param name The resource name. Typically a filename. * @param loader A pointer to the custom resource loader. The * default is NULL. If this parameter is present the resource * will use the loader to load instead of the default built in * functions. * @return An ImagePtr to the newly created Image * * @see Image * @see ImageLoader * @see IResourceLoader * */ virtual ImagePtr create(const std::string& name, IResourceLoader* loader = 0); /** Creates a blank resource and loads it from disk * * This function will create the Image if necessary and load * the Image from disk. If the Image is not defined it * will call ImageManager::create() before loading. * * @param name The resource name. Typically a filename. * @param loader A pointer to the custom resource loader. The * default is NULL. If this parameter is present the resource * will use the loader to load instead of the default built in * functions. * @return A ImagePtr to the loaded Image * * @see Image * @see ImageLoader * @see IResourceLoader * */ virtual ImagePtr load(const std::string& name, IResourceLoader* loader = 0); /** Loads a blank resource * * @param width * @param height * @return An ImagePtr to the blank image (ready to be modified) */ virtual ImagePtr loadBlank(uint32_t width, uint32_t height); /** Loads a blank resource * * @param name * @param width * @param height * @return An ImagePtr to the blank image (ready to be modified) */ virtual ImagePtr loadBlank(const std::string& name, uint32_t width, uint32_t height); /** Add an Image to the manager * * This function will create a ImagePtr and add the Image * to the manager. The manager assumes ownership of the Image * so DO NOT delete it. * * @param res A pointer to the Image * @return A ImagePtr to the added resource * * @see Image * */ virtual ImagePtr add(Image* res); /** Checks to see if an Image exists * * This function will search the manager for Images * that match the parameter * * @param name The name of the Image * @return True if the Image exists. False otherwise. * */ virtual bool exists(const std::string& name); /** Checks to see if an Image exists * * This function will search the manager for Images * that match the parameter * * @param handle The handle of the Image * @return True if the Image exists. False otherwise. * */ virtual bool exists(ResourceHandle handle); /** Reloads an Image * * This function will reload an Image if it is managed * by the manager. If not it creates an entry in the log * specifying that the Image could not be found. It will * load the Image if it is not already loaded. * * @param name The name of the resource * */ virtual void reload(const std::string& name); /** Reloads a resource * * This function will reload an Image if it is managed * by the manager. If not it creates an entry in the log * specifying that the Image could not be found. It will * load the Image if it is not already loaded. * * @param handle The handle of the resource * */ virtual void reload(ResourceHandle handle); /** Reloads all Images * * This function will reload all Images managed by the * manager. It will load an Image if it is not already loaded. * * @todo It might be beneficial to supply a parameter to * only reload resources that are already loaded * */ virtual void reloadAll(); /** Loads all unreferenced Images * * All Images that have no external references will be * loaded into memory. * */ virtual void loadUnreferenced(); /** Frees an Image from memory * * The Image is not deleted but it's data is freed. * This calls the Image::free() function and it is * up to the resource to properly free it's memory. The * manager keeps a reference to the Image in case * its required in the future. * * @param name The name of the Image * * @see Image * */ virtual void free(const std::string& name); /** Frees an Image from memory * * The Image is not deleted but it's data is freed. * This calls the Image::free() function and it is * up to the resource to properly free it's memory. The * manager keeps a reference to the Image in case * its required in the future. * * @param handle The handle of the Image * * @see Image * */ virtual void free(ResourceHandle handle); /** Frees all Images * * This calls the Image::free() function for every * Image the manager is managing. It does not remove * them from the manager. * * @see Image * */ virtual void freeAll(); /** Frees all unreferenced Image * * This calls the IResource::free() function for Images * that have no external references to them. It does not * remove them from the manager. * * @see IResource * */ virtual void freeUnreferenced(); /** Removes an Image from the manager * * This removes all references to the Image from the * manager. It does not however guarantee that the resources * destructor is called. If the client has any left over * references to the resource it will not be freed. * * @param resource A ImagePtr to the image to be removed * from the manager * * @note This is useful if you want to remove ownership of a resource * from the manager * * @see Image * */ virtual void remove(ImagePtr& resource); /** Removes an Image from the manager * * This removes all references to the Image from the * manager. It does not however guarantee that the resources * destructor is called. If the client has any left over * references to the resource it will not be freed. * * @param name The name of the Image * * @see Image * */ virtual void remove(const std::string& name); /** Removes an Image from the manager * * This removes all references to the Image from the * manager. It does not however guarantee that the resources * destructor is called. If the client has any left over * references to the resource it will not be freed. * * @param handle The handle of the Image * * @see Image * */ virtual void remove(ResourceHandle handle); /** Removes all Images from the manager * * This effectively removes all references to all Images from * the manager. If there are left over shared pointers to * any resources they will not be deleted. * * @see Image * */ virtual void removeAll(); /** Removes all unreferenced Images * * This effectively removes all Images that dont have an * external reference. The resources will be deleted. * * @see Image * */ virtual void removeUnreferenced(); /** Gets a shared pointer to the Image * * If the Image is not defined it will attempt to create * and load the Image based on the name (it assumes the name * is a filename) * * @param name The name of the Image * @return An ImagePtr to the Image * */ virtual ImagePtr get(const std::string& name); /** Gets a shared pointer to the Image * * If the resource is not defined it returns an empty * (or invalid) ImagePtr and makes an entry in the log. * * @param handle The handle of the resource * @return A ImagePtr to the resource * * @todo This should throw an exception instead of an * empty ImagePtr * */ virtual ImagePtr get(ResourceHandle handle); virtual ImagePtr getPtr(const std::string& name); virtual ImagePtr getPtr(ResourceHandle handle); /** Gets an Image handle by name * * Returns the Image handle associated with the name * * @param name The name of the Image * @return 0 if the resource name is invalid * */ virtual ResourceHandle getResourceHandle(const std::string& name); virtual void invalidate(const std::string& name); virtual void invalidate(ResourceHandle handle); virtual void invalidateAll(); private: typedef std::map< ResourceHandle, ImagePtr > ImageHandleMap; typedef std::map< ResourceHandle, ImagePtr >::iterator ImageHandleMapIterator; typedef std::map< ResourceHandle, ImagePtr >::const_iterator ImageHandleMapConstIterator; typedef std::pair< ResourceHandle, ImagePtr > ImageHandleMapPair; typedef std::map< std::string, ImagePtr > ImageNameMap; typedef std::map< std::string, ImagePtr >::iterator ImageNameMapIterator; typedef std::map< std::string, ImagePtr >::const_iterator ImageNameMapConstIterator; typedef std::pair< std::string, ImagePtr > ImageNameMapPair; ImageHandleMap m_imgHandleMap; ImageNameMap m_imgNameMap; }; } //FIFE #endif //FIFE_IMAGE_MANAGER_H fifengine-0.4.2/engine/core/video/opengl/000077500000000000000000000000001341615052600202415ustar00rootroot00000000000000fifengine-0.4.2/engine/core/video/opengl/fife_opengl.h000066400000000000000000000041271341615052600226730ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_UTIL_FIFEGL_H #define FIFE_UTIL_FIFEGL_H // Standard C++ library includes // 3rd party library includes // GLEW // On Windows: // when building a static library or executable: GLEW_STATIC // when building a dll: GLEW_BUILD #ifdef BUILD_SHARED_LIBS #define GLEW_BUILD else #define GLEW_STATIC #endif #include "GL/glew.h" // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder namespace FIFE { } //FIFE #endif fifengine-0.4.2/engine/core/video/opengl/glimage.cpp000066400000000000000000000464041341615052600223620ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes #include #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/structures/rect.h" #include "video/imagemanager.h" #include "video/sdl/sdlimage.h" #include "video/renderbackend.h" #include "video/opengl/renderbackendopengl.h" #include "glimage.h" namespace FIFE { GLImage::GLImage(IResourceLoader* loader): Image(loader), m_compressed(false), m_texId(0) { resetGlimage(); } GLImage::GLImage(const std::string& name, IResourceLoader* loader): Image(name, loader), m_compressed(false), m_texId(0) { resetGlimage(); } GLImage::GLImage(SDL_Surface* surface): Image(surface), m_compressed(false), m_texId(0) { resetGlimage(); } GLImage::GLImage(const std::string& name, SDL_Surface* surface): Image(name, surface), m_compressed(false), m_texId(0) { resetGlimage(); } GLImage::GLImage(const uint8_t* data, uint32_t width, uint32_t height): Image(data, width, height), m_compressed(false), m_texId(0) { assert(m_surface); resetGlimage(); } GLImage::GLImage(const std::string& name, const uint8_t* data, uint32_t width, uint32_t height): Image(name, data, width, height), m_compressed(false), m_texId(0) { assert(m_surface); resetGlimage(); } GLImage::~GLImage() { cleanup(); } void GLImage::invalidate() { resetGlimage(); } void GLImage::setSurface(SDL_Surface* surface) { reset(surface); resetGlimage(); } void GLImage::resetGlimage() { cleanup(); m_chunk_size_w = 0; m_chunk_size_h = 0; m_colorkey = RenderBackend::instance()->getColorKey(); } void GLImage::cleanup() { if (m_texId) { if(!m_shared) { glDeleteTextures(1, &m_texId); } m_texId = 0; m_compressed = false; } m_tex_coords[0] = m_tex_coords[1] = m_tex_coords[2] = m_tex_coords[3] = 0.0f; } void GLImage::render(const Rect& rect, uint8_t alpha, uint8_t const* rgb) { // completely transparent so dont bother rendering if (0 == alpha) { return; } RenderBackend* rb = RenderBackend::instance(); SDL_Surface* target = rb->getRenderTargetSurface(); assert(target != m_surface); // can't draw on the source surface // not on the screen. dont render if (rect.right() < 0 || rect.x > static_cast(target->w) || rect.bottom() < 0 || rect.y > static_cast(target->h)) { return; } if (!m_texId) { generateGLTexture(); } else if (m_shared) { validateShared(); } rb->addImageToArray(m_texId, rect, m_tex_coords, alpha, rgb); } void GLImage::render(const Rect& rect, const ImagePtr& overlay, uint8_t alpha, uint8_t const* rgb) { // completely transparent so dont bother rendering if (0 == alpha) { return; } RenderBackend* rb = RenderBackend::instance(); SDL_Surface* target = rb->getRenderTargetSurface(); assert(target != m_surface); // can't draw on the source surface // not on the screen. dont render if (rect.right() < 0 || rect.x > static_cast(target->w) || rect.bottom() < 0 || rect.y > static_cast(target->h)) { return; } if (!m_texId) { generateGLTexture(); } else if (m_shared) { validateShared(); } GLImage* img = static_cast(overlay.get()); img->forceLoadInternal(); static_cast(rb)->addImageToArray(rect, m_texId, m_tex_coords, img->getTexId(), img->getTexCoords(), alpha, rgb); //rb->addImageToArray(rect, m_texId, m_tex_coords, img->getTexId(), img->getTexCoords(), alpha, rgb); } void GLImage::renderZ(const Rect& rect, float vertexZ, uint8_t alpha, uint8_t const* rgb) { // completely transparent so dont bother rendering if (0 == alpha) { return; } RenderBackend* rb = RenderBackend::instance(); SDL_Surface* target = rb->getRenderTargetSurface(); assert(target != m_surface); // can't draw on the source surface // not on the screen. dont render if (rect.right() < 0 || rect.x > static_cast(target->w) || rect.bottom() < 0 || rect.y > static_cast(target->h)) { return; } if (!m_texId) { generateGLTexture(); } else if (m_shared) { validateShared(); } static_cast(rb)->addImageToArrayZ(m_texId, rect, vertexZ, m_tex_coords, alpha, rgb); //rb->addImageToArray(m_texId, rect, m_tex_coords, alpha, rgb); } void GLImage::renderZ(const Rect& rect, float vertexZ, const ImagePtr& overlay, uint8_t alpha, uint8_t const* rgb) { // completely transparent so dont bother rendering if (0 == alpha) { return; } RenderBackend* rb = RenderBackend::instance(); SDL_Surface* target = rb->getRenderTargetSurface(); assert(target != m_surface); // can't draw on the source surface // not on the screen. dont render if (rect.right() < 0 || rect.x > static_cast(target->w) || rect.bottom() < 0 || rect.y > static_cast(target->h)) { return; } if (!m_texId) { generateGLTexture(); } else if (m_shared) { validateShared(); } GLImage* img = static_cast(overlay.get()); img->forceLoadInternal(); static_cast(rb)->addImageToArrayZ(rect, vertexZ, m_texId, m_tex_coords, img->getTexId(), img->getTexCoords(), alpha, rgb); //rb->addImageToArray(rect, m_texId, m_tex_coords, img->getTexId(), img->getTexCoords(), alpha, rgb); } void GLImage::generateGLTexture() { if (m_shared) { // First make sure we loaded big image to opengl validateShared(); return; } // ultimate possibility to load the image // is used e.g. in case a cursor or gui image is freed even if there is a reference if (!m_surface) { if (m_state == IResource::RES_NOT_LOADED) { load(); } } const uint32_t width = m_surface->w; const uint32_t height = m_surface->h; // With OpenGL 2.0 or GL_ARB_texture_non_power_of_two we don't really need to care // about non power of 2 textures if(GLEW_ARB_texture_non_power_of_two && RenderBackend::instance()->isNPOTEnabled()) { m_chunk_size_w = width; m_chunk_size_h = height; } else { //calculate the nearest larger power of 2 m_chunk_size_w = nextPow2(width); m_chunk_size_h = nextPow2(height); } // used to calculate the fill ratio for given chunk m_tex_coords[0] = m_tex_coords[1] = 0.0f; m_tex_coords[2] = static_cast(m_surface->w%m_chunk_size_w) / static_cast(m_chunk_size_w); m_tex_coords[3] = static_cast(m_surface->h%m_chunk_size_h) / static_cast(m_chunk_size_h); if (m_tex_coords[2] == 0.0f){ m_tex_coords[2] = 1.0f; } if (m_tex_coords[3] == 0.0f){ m_tex_coords[3] = 1.0f; } uint8_t* data = static_cast(m_surface->pixels); int32_t pitch = m_surface->pitch; assert(!m_texId); // get texture id from opengl glGenTextures(1, &m_texId); // set focus on that texture static_cast(RenderBackend::instance())->bindTexture(m_texId); // set filters for texture glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); bool mipmapping = RenderBackend::instance()->isMipmappingEnabled(); if (mipmapping) { glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE); } // without mipmapping, trilinear and bilinear filters are the same switch (RenderBackend::instance()->getTextureFiltering()) { case TEXTURE_FILTER_NONE: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, mipmapping ? GL_NEAREST_MIPMAP_NEAREST : GL_NEAREST); break; case TEXTURE_FILTER_BILINEAR: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, mipmapping ? GL_LINEAR_MIPMAP_NEAREST : GL_LINEAR); break; case TEXTURE_FILTER_TRILINEAR: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, mipmapping ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR); break; case TEXTURE_FILTER_ANISOTROPIC: // currently trilinear anisotropic glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, static_cast(RenderBackend::instance()->getMaxAnisotropy())); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, mipmapping ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR); break; default: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, mipmapping ? GL_NEAREST_MIPMAP_NEAREST : GL_NEAREST); break; } GLint internalFormat = GL_RGBA8; if(GLEW_ARB_texture_compression && RenderBackend::instance()->isImageCompressingEnabled()) { internalFormat = GL_COMPRESSED_RGBA; m_compressed = true; } else { m_compressed = false; } bool monochrome = RenderBackend::instance()->isMonochromeEnabled(); SDL_Surface* target = RenderBackend::instance()->getRenderTargetSurface(); int32_t bpp_target = RenderBackend::instance()->getPixelFormat().BitsPerPixel; int32_t bpp_source = m_surface->format->BitsPerPixel; // create 16 bit texture, RGBA_4444 if (bpp_target == 16 && bpp_source == 32) { uint16_t* oglbuffer = new uint16_t[m_chunk_size_w * m_chunk_size_h]; memset(oglbuffer, 0x00, m_chunk_size_w*m_chunk_size_h*sizeof(uint16_t)); for (uint32_t y = 0; y < height; ++y) { for (uint32_t x = 0; x < width; ++x) { uint32_t pos = (y * pitch) + (x * 4); uint8_t r = data[pos + 0]; uint8_t g = data[pos + 1]; uint8_t b = data[pos + 2]; uint8_t a = data[pos + 3]; if (RenderBackend::instance()->isColorKeyEnabled()) { // only set alpha to zero if colorkey feature is enabled if (r == m_colorkey.r && g == m_colorkey.g && b == m_colorkey.b) { a = 0; } } // if monochrome rendering is enabled, then the colors are converted to grayscale if (monochrome) { uint8_t lum = static_cast(r*0.3 + g*0.59 + b*0.11); r = lum; g = lum; b = lum; } oglbuffer[(y*m_chunk_size_w) + x] = ((r >> 4) << 12) | ((g >> 4) << 8) | ((b >> 4) << 4) | ((a >> 4) << 0); } } // in case of compression we let OpenGL handle it if (!m_compressed) { internalFormat = GL_RGBA4; } // transfer data from sdl buffer glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, m_chunk_size_w, m_chunk_size_h, 0, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, oglbuffer); delete[] oglbuffer; return; } if(GLEW_ARB_texture_non_power_of_two && RenderBackend::instance()->isNPOTEnabled()) { if(RenderBackend::instance()->isColorKeyEnabled()) { uint8_t* oglbuffer = new uint8_t[width * height * 4]; memcpy(oglbuffer, data, width * height * 4 * sizeof(uint8_t)); for (uint32_t y = 0; y < height; ++y) { for (uint32_t x = 0; x < width * 4; x += 4) { uint32_t gid = x + y * pitch; uint8_t r = oglbuffer[gid + 0]; uint8_t g = oglbuffer[gid + 1]; uint8_t b = oglbuffer[gid + 2]; // set alpha to zero if (r == m_colorkey.r && g == m_colorkey.g && b == m_colorkey.b) { oglbuffer[gid + 3] = 0; } // if monochrome rendering is enabled, then the colors are converted to grayscale if (monochrome) { uint8_t lum = static_cast(r*0.3 + g*0.59 + b*0.11); oglbuffer[gid + 0] = lum; oglbuffer[gid + 1] = lum; oglbuffer[gid + 2] = lum; } } } // transfer data from sdl buffer glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, m_chunk_size_w, m_chunk_size_h, 0, GL_RGBA, GL_UNSIGNED_BYTE, oglbuffer); delete [] oglbuffer; } else if (monochrome) { uint8_t* oglbuffer = new uint8_t[width * height * 4]; memcpy(oglbuffer, data, width * height * 4 * sizeof(uint8_t)); for (uint32_t y = 0; y < height; ++y) { for (uint32_t x = 0; x < width * 4; x += 4) { uint32_t gid = x + y * pitch; // if monochrome rendering is enabled, then the colors are converted to grayscale uint8_t lum = static_cast(oglbuffer[gid + 0]*0.3 + oglbuffer[gid + 1]*0.59 + oglbuffer[gid + 2]*0.11); oglbuffer[gid + 0] = lum; oglbuffer[gid + 1] = lum; oglbuffer[gid + 2] = lum; } } // transfer data from sdl buffer glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, m_chunk_size_w, m_chunk_size_h, 0, GL_RGBA, GL_UNSIGNED_BYTE, oglbuffer); delete [] oglbuffer; } else { // transfer data directly from sdl buffer glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, m_chunk_size_w, m_chunk_size_h, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); } // Non power of 2 textures are not supported, we need to pad the size of texture to nearest power of 2 } else { uint32_t* oglbuffer = new uint32_t[m_chunk_size_w * m_chunk_size_h]; memset(oglbuffer, 0x00, m_chunk_size_w*m_chunk_size_h*sizeof(uint32_t)); for (uint32_t y = 0; y < height; ++y) { for (uint32_t x = 0; x < width; ++x) { uint32_t pos = (y * pitch) + (x * 4); uint8_t a = data[pos + 3]; uint8_t b = data[pos + 2]; uint8_t g = data[pos + 1]; uint8_t r = data[pos + 0]; if (RenderBackend::instance()->isColorKeyEnabled()) { // only set alpha to zero if colorkey feature is enabled if (r == m_colorkey.r && g == m_colorkey.g && b == m_colorkey.b) { a = 0; } } // if monochrome rendering is enabled, then the colors are converted to grayscale if (monochrome) { uint8_t lum = static_cast(r*0.3 + g*0.59 + b*0.11); r = lum; g = lum; b = lum; } oglbuffer[(y*m_chunk_size_w) + x] = r | (g << 8) | (b << 16) | (a<<24); } } // transfer data from sdl buffer glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, m_chunk_size_w, m_chunk_size_h, 0, GL_RGBA, GL_UNSIGNED_BYTE, static_cast(oglbuffer)); delete[] oglbuffer; } } void GLImage::generateGLSharedTexture(const GLImage* shared, const Rect& region) { uint32_t width = shared->getWidth(); uint32_t height = shared->getHeight(); if(!GLEW_ARB_texture_non_power_of_two || !RenderBackend::instance()->isNPOTEnabled()) { width = nextPow2(width); height = nextPow2(height); } if (RenderBackend::instance()->getTextureFiltering() != TEXTURE_FILTER_NONE || RenderBackend::instance()->isMipmappingEnabled()) { // half pixel correction m_tex_coords[0] = (static_cast(region.x)+0.5) / static_cast(width); m_tex_coords[1] = (static_cast(region.y)+0.5) / static_cast(height); m_tex_coords[2] = (static_cast(region.x + region.w)-0.5) / static_cast(width); m_tex_coords[3] = (static_cast(region.y + region.h)-0.5) / static_cast(height); } else { m_tex_coords[0] = static_cast(region.x) / static_cast(width); m_tex_coords[1] = static_cast(region.y) / static_cast(height); m_tex_coords[2] = static_cast(region.x + region.w) / static_cast(width); m_tex_coords[3] = static_cast(region.y + region.h) / static_cast(height); } } void GLImage::useSharedImage(const ImagePtr& shared, const Rect& region){ GLImage* img = static_cast(shared.get()); m_shared_img = img; m_texId = img->m_texId; m_shared = true; m_subimagerect = region; m_atlas_img = shared; m_surface = m_shared_img->m_surface; m_compressed = m_shared_img->m_compressed; m_atlas_name = m_shared_img->getName(); if(m_texId) { generateGLSharedTexture(img, region); } setState(m_shared_img->getState()); } void GLImage::forceLoadInternal() { if (m_texId == 0) { generateGLTexture(); } else if (m_shared) { validateShared(); } } void GLImage::validateShared() { // if image is valid we can return if (m_shared_img->m_texId && m_shared_img->m_texId == m_texId) { return; } if (m_shared_img->getState() == IResource::RES_NOT_LOADED) { m_shared_img->load(); m_shared_img->generateGLTexture(); } else if (!m_shared_img->m_texId) { m_shared_img->generateGLTexture(); } m_texId = m_shared_img->m_texId; m_surface = m_shared_img->m_surface; m_compressed = m_shared_img->m_compressed; generateGLSharedTexture(m_shared_img, m_subimagerect); } void GLImage::copySubimage(uint32_t xoffset, uint32_t yoffset, const ImagePtr& img) { Image::copySubimage(xoffset, yoffset, img); if(m_texId) { static_cast(RenderBackend::instance())->bindTexture(m_texId); glTexSubImage2D(GL_TEXTURE_2D, 0, xoffset, yoffset, img->getWidth(), img->getHeight(), GL_RGBA, GL_UNSIGNED_BYTE, img->getSurface()->pixels); } } void GLImage::load() { if (m_shared) { // check atlas image // if it does not exist, it is generated. if (!ImageManager::instance()->exists(m_atlas_name)) { ImagePtr newAtlas = ImageManager::instance()->create(m_atlas_name); GLImage* img = static_cast(newAtlas.get()); m_atlas_img = newAtlas; m_shared_img = img; } validateShared(); // check if texture ids and surfaces are identical if (m_shared_img->m_surface != m_surface || m_texId != m_shared_img->m_texId) { m_texId = m_shared_img->m_texId; m_surface = m_shared_img->m_surface; m_compressed = m_shared_img->m_compressed; if (m_texId) { generateGLSharedTexture(m_shared_img, m_subimagerect); } } m_state = IResource::RES_LOADED; } else { Image::load(); } } void GLImage::free() { // save the image offsets int32_t xshift = m_xshift; int32_t yshift = m_yshift; setSurface(NULL); m_xshift = xshift; m_yshift = yshift; m_state = IResource::RES_NOT_LOADED; } GLuint GLImage::getTexId() const { return m_texId; } const GLfloat* GLImage::getTexCoords() const { return m_tex_coords; } } fifengine-0.4.2/engine/core/video/opengl/glimage.h000066400000000000000000000117111341615052600220200ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_VIDEO_RENDERBACKENDS_OPENGL_GLIMAGE_H #define FIFE_VIDEO_RENDERBACKENDS_OPENGL_GLIMAGE_H // Standard C++ library includes #include // Platform specific includes #include "util/base/fife_stdint.h" // 3rd party library includes #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "video/image.h" #include "fife_opengl.h" namespace FIFE { /** Implements an Image using OpenGL. * * This class contains a texture handle bound to the data given to the constructor; * it draws a textured Quad to the screen. * * @see Image * @note Width and height are not limited to powers of two; * non-power of two images will be converted internally, * if they are not supported by the hardware (ARB_texture_non_power_of_two). * @todo Check the correctness of the generateTexture function on big endian systems (ppc) */ class GLImage : public Image { public: GLImage(IResourceLoader* loader = 0); GLImage(const std::string& name, IResourceLoader* loader = 0); GLImage(SDL_Surface* surface); GLImage(const std::string& name, SDL_Surface* surface); GLImage(const uint8_t* data, uint32_t width, uint32_t height); GLImage(const std::string& name, const uint8_t* data, uint32_t width, uint32_t height); virtual ~GLImage(); virtual void invalidate(); virtual void setSurface(SDL_Surface* surface); virtual void render(const Rect& rect, uint8_t alpha = 255, uint8_t const* rgb = 0); virtual void render(const Rect& rect, const ImagePtr& overlay, uint8_t alpha = 255, uint8_t const* rgb = 0); virtual void renderZ(const Rect& rect, float vertexZ, uint8_t alpha = 255, uint8_t const* rgb = 0); virtual void renderZ(const Rect& rect, float vertexZ, const ImagePtr& overlay, uint8_t alpha = 255, uint8_t const* rgb = 0); virtual void useSharedImage(const ImagePtr& shared, const Rect& region); virtual void forceLoadInternal(); virtual void copySubimage(uint32_t xoffset, uint32_t yoffset, const ImagePtr& img); virtual void load(); virtual void free(); GLuint getTexId() const; const GLfloat* getTexCoords() const; bool isCompressed() const { return m_compressed; } void setCompressed(bool compressed) { m_compressed = compressed; } private: // texture coords to use GLfloat m_tex_coords[4]; // Was this image compressed by OpenGL driver during loading ? bool m_compressed; // [0] [2] ->(x) // [1] +------+ // | | // | | // [3] +------+ // // | // v // (y) // To map these indices with previous one: // [0]:=[1]:=0.0f, [2]:=m_col_tex_coords, [3]:=m_row_tex_coords /** Holds texture ids that are used to access textures in GL rendering context */ GLuint m_texId; /** Frees allocated memory and calls resetGlImage */ void cleanup(); /** Resets GLImage variables */ void resetGlimage(); /** Generates the GL Texture for use when rendering. */ void generateGLTexture(); void generateGLSharedTexture(const GLImage* shared, const Rect& region); void validateShared(); uint32_t m_chunk_size_w; uint32_t m_chunk_size_h; SDL_Color m_colorkey; GLImage* m_shared_img; // Holds Atlas ImagePtr if this is a shared image ImagePtr m_atlas_img; // Holds Atlas Name if this is a shared image std::string m_atlas_name; }; } #endif fifengine-0.4.2/engine/core/video/opengl/renderbackendopengl.cpp000066400000000000000000002425271341615052600247550ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // Platform specific includes // 3rd party library includes #include // FIFE includes #include "util/base/exception.h" #include "util/log/logger.h" #include "video/devicecaps.h" #include "glimage.h" #include "renderbackendopengl.h" #include "SDL_image.h" namespace FIFE { /** Logger to use for this source file. * @relates Logger */ static Logger _log(LM_VIDEO); class RenderBackendOpenGL::RenderObject { public: RenderObject(GLenum m, uint16_t s, uint32_t t1=0, uint32_t t2=0): mode(m), size(s), texture_id(t1), overlay_id(t2), src(4), dst(5), light(true), stencil_test(false), color(true), overlay_type(OVERLAY_TYPE_NONE), stencil_ref(0), stencil_op(0), stencil_func(0) {} GLenum mode; uint16_t size; uint32_t texture_id; uint32_t overlay_id; int32_t src; int32_t dst; bool light; bool stencil_test; bool color; OverlayType overlay_type; uint8_t stencil_ref; GLenum stencil_op; GLenum stencil_func; uint8_t rgba[4]; }; RenderBackendOpenGL::RenderBackendOpenGL(const SDL_Color& colorkey) : RenderBackend(colorkey), m_maskOverlay(0){ m_state.tex_enabled[0] = false; m_state.tex_enabled[1] = false; m_state.tex_enabled[2] = false; m_state.tex_enabled[3] = false; m_state.texture[0] = 0; m_state.texture[1] = 0; m_state.texture[2] = 0; m_state.texture[3] = 0; m_state.active_tex = 0; m_state.alpha_test = 0.0; m_state.vertex_pointer_size = 2; m_state.color_pointer = 0; m_state.tex_pointer[0] = 0; m_state.tex_pointer[1] = 0; m_state.tex_pointer[2] = 0; m_state.tex_pointer[3] = 0; m_state.vertex_pointer = 0; m_state.sten_enabled = false; m_state.sten_ref = 0; m_state.sten_buf = 0; m_state.sten_op = 0; m_state.sten_func = 0; m_state.lightmodel = 0; m_state.light_enabled = false; m_state.env_color[0] = 0; m_state.env_color[1] = 0; m_state.env_color[2] = 0; m_state.env_color[3] = 0; m_state.blend_src = GL_SRC_ALPHA; m_state.blend_dst = GL_ONE_MINUS_SRC_ALPHA; m_state.alpha_enabled = true; m_state.scissor_test = true; m_state.depth_enabled = true; m_state.color_enabled = true; } RenderBackendOpenGL::~RenderBackendOpenGL() { glDeleteTextures(1, &m_maskOverlay); if(GLEW_EXT_framebuffer_object && m_useframebuffer) { glDeleteFramebuffers(1, &m_fbo_id); } SDL_GL_DeleteContext(m_context); SDL_DestroyWindow(m_window); deinit(); } const std::string& RenderBackendOpenGL::getName() const { static std::string backend_name = "OpenGL"; return backend_name; } void RenderBackendOpenGL::init(const std::string& driver) { Uint32 flags = SDL_INIT_VIDEO; if (SDL_InitSubSystem(flags) < 0) { throw SDLException(SDL_GetError()); } if (driver != "") { if (SDL_VideoInit(driver.c_str()) < 0) { throw SDLException(SDL_GetError()); } } // setup OpenGL SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0); // defines buffer sizes SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE, 32); //SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 32); } void RenderBackendOpenGL::clearBackBuffer() { disableScissorTest(); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); enableScissorTest(); } void RenderBackendOpenGL::createMainScreen(const ScreenMode& mode, const std::string& title, const std::string& icon){ setScreenMode(mode); if (m_window) { if (icon != "") { SDL_Surface *img = IMG_Load(icon.c_str()); if (img != NULL) { SDL_SetWindowIcon(m_window, img); SDL_FreeSurface(img); } } SDL_SetWindowTitle(m_window, title.c_str()); } } void RenderBackendOpenGL::setScreenMode(const ScreenMode& mode) { bool recreate = m_window != NULL; uint16_t width = mode.getWidth(); uint16_t height = mode.getHeight(); uint16_t bitsPerPixel = mode.getBPP(); uint32_t flags = mode.getSDLFlags(); // in case of recreating if (recreate) { SDL_DestroyWindow(m_window); m_window = NULL; m_screen = NULL; if (GLEW_EXT_framebuffer_object && m_useframebuffer) { glDeleteFramebuffers(1, &m_fbo_id); } } // create window uint8_t displayIndex = mode.getDisplay(); if (mode.isFullScreen()) { m_window = SDL_CreateWindow("", SDL_WINDOWPOS_UNDEFINED_DISPLAY(displayIndex), SDL_WINDOWPOS_UNDEFINED_DISPLAY(displayIndex), width, height, flags | SDL_WINDOW_SHOWN); } else { m_window = SDL_CreateWindow("", SDL_WINDOWPOS_CENTERED_DISPLAY(displayIndex), SDL_WINDOWPOS_CENTERED_DISPLAY(displayIndex), width, height, flags | SDL_WINDOW_SHOWN); } if (!m_window) { throw SDLException(SDL_GetError()); } // make sure the window have the right settings SDL_DisplayMode displayMode; displayMode.format = mode.getFormat(); displayMode.w = width; displayMode.h = height; displayMode.refresh_rate = mode.getRefreshRate(); if (SDL_SetWindowDisplayMode(m_window, &displayMode) != 0) { throw SDLException(SDL_GetError()); } // create render context or use the old with new window if (recreate) { if (SDL_GL_MakeCurrent(m_window, m_context) < 0) { throw SDLException(SDL_GetError()); } } else { m_context = SDL_GL_CreateContext(m_window); } // set the window surface as main surface, not really needed anymore m_screen = SDL_GetWindowSurface(m_window); m_target = m_screen; if (!m_screen) { throw SDLException(SDL_GetError()); } // initialize GLEW glewExperimental = GL_TRUE; GLenum glewError = glewInit(); if (glewError != GLEW_OK) { FL_LOG(_log, LMsg("RenderBackendOpenGL") << "Error initializing GLEW!" << glewGetErrorString(glewError)); } FL_LOG(_log, LMsg("RenderBackendOpenGL") << "Videomode " << width << "x" << height << " at " << int32_t(bitsPerPixel) << " bpp with " << displayMode.refresh_rate << " Hz"); // this is needed, otherwise we would have screen pixel formats which will not work with // our texture generation. 32 bit surfaces to BitsPerPixel texturen. m_rgba_format = *(m_screen->format); if (bitsPerPixel != 16) { m_rgba_format.format = SDL_PIXELFORMAT_RGBA8888; m_rgba_format.BitsPerPixel = 32; } else { m_rgba_format.format = SDL_PIXELFORMAT_RGBA4444; m_rgba_format.BitsPerPixel = 16; } m_rgba_format.Rmask = RMASK; m_rgba_format.Gmask = GMASK; m_rgba_format.Bmask = BMASK; m_rgba_format.Amask = AMASK; //update the screen mode with the actual flags used m_screenMode = mode; glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0, width, height, 0, -100, 100); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glEnable(GL_CULL_FACE); glFrontFace(GL_CCW); glCullFace(GL_BACK); glPixelStorei(GL_PACK_ALIGNMENT, 1); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); // dont reset if (!recreate) { glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClearDepth(1.0f); glClearStencil(0); } glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); setAlphaTest(m_alphaValue); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); glEnable(GL_SCISSOR_TEST); glEnableClientState(GL_COLOR_ARRAY); glEnableClientState(GL_VERTEX_ARRAY); prepareForOverlays(); glPointSize(1.0); glLineWidth(1.0); if(GLEW_EXT_framebuffer_object && m_useframebuffer) { glGenFramebuffers(1, &m_fbo_id); } if (m_textureFilter == TEXTURE_FILTER_ANISOTROPIC) { if (GLEW_EXT_texture_filter_anisotropic) { GLint largest = 0; glGetIntegerv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &largest); m_maxAnisotropy = static_cast(largest); } else { // if not available use trilinear filter m_maxAnisotropy = 0; m_textureFilter = TEXTURE_FILTER_TRILINEAR; } } // sync swaping with refresh rate if VSync is enabled SDL_GL_SetSwapInterval(static_cast(m_vSync)); // currently unused, 1000 objects x 400 textures x 4 renderDataZ //m_renderZ_datas.resize(1600000); // 6 indices x 100000 objects m_indices.resize(600000); // a rough way to fill the index buffer, result is: 0, 1, 2, 0, 2, 3 | 4, 5, 6, 4, 6, 7 uint32_t index = 0; for(std::vector::size_type i = 0; i != m_indices.size(); i+=6) { m_indices[i] = index; m_indices[i+1] = index+1; m_indices[i+2] = index+2; m_indices[i+3] = index; m_indices[i+4] = index+2; m_indices[i+5] = index+3; index += 4; } // currently unused, create buffer and send data //glGenBuffers(1, &m_indicebufferId); //glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_indicebufferId); //glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size() * sizeof(uint32_t), &indices[0], GL_STATIC_DRAW); //glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); } void RenderBackendOpenGL::startFrame() { RenderBackend::startFrame(); } void RenderBackendOpenGL::endFrame() { if (m_window) { SDL_GL_SwapWindow(m_window); } RenderBackend::endFrame(); } Image* RenderBackendOpenGL::createImage(IResourceLoader* loader) { return new GLImage(loader); } Image* RenderBackendOpenGL::createImage(const std::string& name, IResourceLoader* loader) { return new GLImage(name, loader); } Image* RenderBackendOpenGL::createImage(SDL_Surface* surface) { // Given an abritary surface, we must convert it to the format GLImage will understand. // It's easiest to let SDL do this for us. // Uh. Gotta love this :-) // Check for colorkey too? // Leave out the loss/shift checks? if (32 == surface->format->BitsPerPixel && m_rgba_format.Rmask == surface->format->Rmask && m_rgba_format.Gmask == surface->format->Gmask && m_rgba_format.Bmask == surface->format->Bmask && m_rgba_format.Amask == surface->format->Amask && m_rgba_format.Rshift == surface->format->Rshift && m_rgba_format.Gshift == surface->format->Gshift && m_rgba_format.Bshift == surface->format->Bshift && m_rgba_format.Ashift == surface->format->Ashift && m_rgba_format.Rloss == surface->format->Rloss && m_rgba_format.Gloss == surface->format->Gloss && m_rgba_format.Bloss == surface->format->Bloss && m_rgba_format.Aloss == surface->format->Aloss) { return new GLImage(surface); } uint8_t bpp = m_rgba_format.BitsPerPixel; m_rgba_format.BitsPerPixel = 32; SDL_Surface* conv = SDL_ConvertSurface(surface, &m_rgba_format, 0); m_rgba_format.BitsPerPixel = bpp; GLImage* image = new GLImage(conv); SDL_FreeSurface(surface); return image; } Image* RenderBackendOpenGL::createImage(const std::string& name, SDL_Surface* surface) { // Given an abritary surface, we must convert it to the format GLImage will understand. // It's easiest to let SDL do this for us. // Uh. Gotta love this :-) // Check for colorkey too? // Leave out the loss/shift checks? if (32 == surface->format->BitsPerPixel && m_rgba_format.Rmask == surface->format->Rmask && m_rgba_format.Gmask == surface->format->Gmask && m_rgba_format.Bmask == surface->format->Bmask && m_rgba_format.Amask == surface->format->Amask && m_rgba_format.Rshift == surface->format->Rshift && m_rgba_format.Gshift == surface->format->Gshift && m_rgba_format.Bshift == surface->format->Bshift && m_rgba_format.Ashift == surface->format->Ashift && m_rgba_format.Rloss == surface->format->Rloss && m_rgba_format.Gloss == surface->format->Gloss && m_rgba_format.Bloss == surface->format->Bloss && m_rgba_format.Aloss == surface->format->Aloss) { return new GLImage(name, surface); } uint8_t bpp = m_rgba_format.BitsPerPixel; m_rgba_format.BitsPerPixel = 32; SDL_Surface* conv = SDL_ConvertSurface(surface, &m_rgba_format, 0); m_rgba_format.BitsPerPixel = bpp; GLImage* image = new GLImage(name, conv); SDL_FreeSurface(surface); return image; } Image* RenderBackendOpenGL::createImage(const uint8_t* data, uint32_t width, uint32_t height) { return new GLImage(data, width, height); } Image* RenderBackendOpenGL::createImage(const std::string& name, const uint8_t* data, uint32_t width, uint32_t height) { return new GLImage(name, data, width, height); } void RenderBackendOpenGL::setLightingModel(uint32_t lighting) { if (m_state.lightmodel != lighting) { if (m_state.lightmodel != 0) { disableLighting(); glDisable(GL_COLOR_MATERIAL); } else if (lighting != 0) { enableLighting(); glEnable(GL_LIGHT0); glColorMaterial(GL_FRONT, GL_DIFFUSE); glEnable(GL_COLOR_MATERIAL); } m_state.lightmodel = lighting; } } uint32_t RenderBackendOpenGL::getLightingModel() const { return m_state.lightmodel; } void RenderBackendOpenGL::enableTextures(uint32_t texUnit) { if(m_state.tex_enabled[texUnit] == false) { if(m_state.active_tex != texUnit) { m_state.active_tex = texUnit; glActiveTexture(GL_TEXTURE0 + texUnit); } if (m_state.active_client_tex != texUnit) { m_state.active_client_tex = texUnit; glClientActiveTexture(GL_TEXTURE0 + texUnit); } m_state.tex_enabled[texUnit] = true; glEnable(GL_TEXTURE_2D); glEnableClientState(GL_TEXTURE_COORD_ARRAY); } } void RenderBackendOpenGL::disableTextures(uint32_t texUnit) { if(m_state.tex_enabled[texUnit] == true) { if(m_state.active_tex != texUnit) { m_state.active_tex = texUnit; glActiveTexture(GL_TEXTURE0 + texUnit); } if (m_state.active_client_tex != texUnit) { m_state.active_client_tex = texUnit; glClientActiveTexture(GL_TEXTURE0 + texUnit); } m_state.tex_enabled[texUnit] = false; glDisable(GL_TEXTURE_2D); glDisableClientState(GL_TEXTURE_COORD_ARRAY); } } void RenderBackendOpenGL::bindTexture(uint32_t texUnit, GLuint texId) { enableTextures(texUnit); if(m_state.texture[texUnit] != texId) { if(m_state.active_tex != texUnit) { m_state.active_tex = texUnit; glActiveTexture(GL_TEXTURE0 + texUnit); } if (m_state.active_client_tex != texUnit) { m_state.active_client_tex = texUnit; glClientActiveTexture(GL_TEXTURE0 + texUnit); } m_state.texture[texUnit] = texId; glBindTexture(GL_TEXTURE_2D, texId); } } void RenderBackendOpenGL::bindTexture(GLuint texId) { if(m_state.texture[m_state.active_tex] != texId) { m_state.texture[m_state.active_tex] = texId; glBindTexture(GL_TEXTURE_2D, texId); } } void RenderBackendOpenGL::enableLighting() { if (m_state.lightmodel != 0 && !m_state.light_enabled) { glEnable(GL_LIGHTING); m_state.light_enabled = true; } } void RenderBackendOpenGL::disableLighting() { if (m_state.lightmodel != 0 && m_state.light_enabled) { glDisable(GL_LIGHTING); m_state.light_enabled = false; } } void RenderBackendOpenGL::setLighting(float red, float green, float blue) { if (m_state.lightmodel != 0) { GLfloat lightDiffuse[] = {red, green, blue, 1.0f}; glLightfv(GL_LIGHT0, GL_DIFFUSE, lightDiffuse); } } void RenderBackendOpenGL::resetLighting() { if (m_state.lightmodel != 0) { setLighting(1.0, 1.0, 1.0); } } void RenderBackendOpenGL::enableStencilTest() { if (!m_state.sten_enabled) { glEnable(GL_STENCIL_TEST); m_state.sten_enabled = true; } } void RenderBackendOpenGL::disableStencilTest() { if (m_state.sten_enabled) { glDisable(GL_STENCIL_TEST); m_state.sten_enabled = false; } } void RenderBackendOpenGL::setStencilTest(uint8_t stencil_ref, GLenum stencil_op, GLenum stencil_func) { enableStencilTest(); if(m_state.sten_op != stencil_op) { m_state.sten_op = stencil_op; glStencilOp(GL_KEEP, GL_KEEP, m_state.sten_op); } if(m_state.sten_ref != stencil_ref || m_state.sten_func != stencil_func) { m_state.sten_ref = stencil_ref; m_state.sten_func = stencil_func; glStencilFunc(m_state.sten_func, stencil_ref, 0xff); } } void RenderBackendOpenGL::resetStencilBuffer(uint8_t buffer) { if (buffer != m_state.sten_buf) { m_state.sten_buf = buffer; glClearStencil(buffer); } disableScissorTest(); glClear(GL_STENCIL_BUFFER_BIT); enableScissorTest(); } uint8_t RenderBackendOpenGL::getStencilRef() const { return m_state.sten_ref; } void RenderBackendOpenGL::enableAlphaTest() { if (!m_state.alpha_enabled) { glEnable(GL_ALPHA_TEST); m_state.alpha_enabled = true; } } void RenderBackendOpenGL::disableAlphaTest() { if (m_state.alpha_enabled) { glDisable(GL_ALPHA_TEST); m_state.alpha_enabled = false; } } void RenderBackendOpenGL::setAlphaTest(float ref_alpha) { enableAlphaTest(); if (!Mathf::Equal(m_state.alpha_test, ref_alpha)) { m_state.alpha_test = ref_alpha; glAlphaFunc(GL_GREATER, ref_alpha); } } void RenderBackendOpenGL::enableDepthTest() { if (!m_state.depth_enabled) { glEnable(GL_DEPTH_TEST); m_state.depth_enabled = true; } } void RenderBackendOpenGL::disableDepthTest() { if (m_state.depth_enabled) { glDisable(GL_DEPTH_TEST); m_state.depth_enabled = false; } } void RenderBackendOpenGL::enableColorArray() { if (!m_state.color_enabled) { glEnableClientState(GL_COLOR_ARRAY); m_state.color_enabled = true; } } void RenderBackendOpenGL::disableColorArray() { if (m_state.color_enabled) { glDisableClientState(GL_COLOR_ARRAY); glColor4ub(255,255,255,255); m_state.color_enabled = false; } } void RenderBackendOpenGL::setEnvironmentalColor(uint32_t texUnit, const uint8_t* rgba) { if (memcmp(m_state.env_color, rgba, sizeof(uint8_t) * 4) || m_state.active_tex != texUnit) { memcpy(m_state.env_color, rgba, sizeof(uint8_t) * 4); GLfloat rgbaf[4] = { static_cast(m_state.env_color[0]) / 255.0f, static_cast(m_state.env_color[1]) / 255.0f, static_cast(m_state.env_color[2]) / 255.0f, static_cast(m_state.env_color[3]) / 255.0f}; if(m_state.active_tex != texUnit) { m_state.active_tex = texUnit; glActiveTexture(GL_TEXTURE0 + texUnit); m_state.active_client_tex = texUnit; glClientActiveTexture(GL_TEXTURE0 + texUnit); } glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, rgbaf); } } void RenderBackendOpenGL::setVertexPointer(GLint size, GLsizei stride, const GLvoid* ptr) { if(m_state.vertex_pointer != ptr || m_state.vertex_pointer_size != size) { m_state.vertex_pointer = ptr; m_state.vertex_pointer_size = size; glVertexPointer(size, GL_FLOAT, stride, ptr); } } void RenderBackendOpenGL::setColorPointer(GLsizei stride, const GLvoid* ptr) { if(m_state.color_pointer != ptr) { m_state.color_pointer = ptr; glColorPointer(4, GL_UNSIGNED_BYTE, stride, ptr); } } void RenderBackendOpenGL::setTexCoordPointer(uint32_t texUnit, GLsizei stride, const GLvoid* ptr) { if(m_state.tex_pointer[texUnit] != ptr) { if(m_state.active_tex != texUnit) { m_state.active_tex = texUnit; glActiveTexture(GL_TEXTURE0 + texUnit); } if (m_state.active_client_tex != texUnit) { m_state.active_client_tex = texUnit; glClientActiveTexture(GL_TEXTURE0 + texUnit); } m_state.tex_pointer[texUnit] = ptr; glTexCoordPointer(2, GL_FLOAT, stride, ptr); } } void RenderBackendOpenGL::enableScissorTest() { if(m_state.scissor_test == false) { m_state.scissor_test = true; glEnable(GL_SCISSOR_TEST); } } void RenderBackendOpenGL::disableScissorTest() { if(m_state.scissor_test == true) { m_state.scissor_test = false; glDisable(GL_SCISSOR_TEST); } } void RenderBackendOpenGL::changeBlending(int32_t src, int32_t dst) { GLenum src_fact; GLenum dst_fact; switch(src) { case 0 : src_fact = GL_ZERO; break; case 1 : src_fact = GL_ONE; break; case 2 : src_fact = GL_DST_COLOR; break; case 3 : src_fact = GL_ONE_MINUS_DST_COLOR; break; case 4 : src_fact = GL_SRC_ALPHA; break; case 5 : src_fact = GL_ONE_MINUS_SRC_ALPHA; break; case 6 : src_fact = GL_DST_ALPHA; break; case 7 : src_fact = GL_ONE_MINUS_DST_ALPHA; break; default : src_fact = GL_DST_COLOR; break; } switch(dst) { case 0 : dst_fact = GL_ZERO; break; case 1 : dst_fact = GL_ONE; break; case 2 : dst_fact = GL_SRC_COLOR; break; case 3 : dst_fact = GL_ONE_MINUS_SRC_COLOR; break; case 4 : dst_fact = GL_SRC_ALPHA; break; case 5 : dst_fact = GL_ONE_MINUS_SRC_ALPHA; break; case 6 : dst_fact = GL_DST_ALPHA; break; case 7 : dst_fact = GL_ONE_MINUS_DST_ALPHA; break; default : dst_fact = GL_SRC_ALPHA; break; } if (m_state.blend_src != src_fact || m_state.blend_dst != dst_fact) { m_state.blend_src = src_fact; m_state.blend_dst = dst_fact; glBlendFunc(src_fact, dst_fact); } } void RenderBackendOpenGL::changeRenderInfos(RenderDataType type, uint16_t elements, int32_t src, int32_t dst, bool light, bool stentest, uint8_t stenref, GLConstants stenop, GLConstants stenfunc, OverlayType otype) { uint16_t count = 0; switch (type) { case RENDER_DATA_WITHOUT_Z: { uint32_t size = m_renderObjects.size(); while (count != elements) { ++count; RenderObject& r = m_renderObjects.at(size-count); r.src = src; r.dst = dst; r.light = light; r.overlay_type = otype; if (stentest) { r.stencil_test = stentest; r.stencil_ref = stenref; r.stencil_op = stenop; r.stencil_func = stenfunc; } } } break; case RENDER_DATA_TEXTURE_Z: { // not needed currently } break; case RENDER_DATA_TEXCOLOR_Z : { // not needed currently } break; case RENDER_DATA_MULTITEXTURE_Z: { uint32_t size = m_renderMultitextureObjectsZ.size(); while (count != elements) { ++count; RenderObject& r = m_renderMultitextureObjectsZ.at(size-count); // only overlay_type is important r.src = src; r.dst = dst; r.light = light; r.overlay_type = otype; if (stentest) { r.stencil_test = stentest; r.stencil_ref = stenref; r.stencil_op = stenop; r.stencil_func = stenfunc; } } } break; default: { // nothing } break; } } void RenderBackendOpenGL::renderWithoutZ() { // bools to indicate changes bool type = false; bool texture = false; bool blending = false; bool light = false; bool stencil = false; bool color = false; bool mt = false; bool render = false; // render mode GLenum mode = GL_TRIANGLES; // texture id uint32_t texture_id = 0; uint32_t texture_id2 = 0; // src blending mode int32_t src = 4; // dst blending mode int32_t dst = 5; // overlay type OverlayType overlay_type = OVERLAY_TYPE_NONE; // overlay color uint8_t rgba[4] = {0}; // array indices int32_t indexP = 0; int32_t indexT = 0; int32_t indexTC = 0; int32_t index2TC = 0; // elements to render uint32_t elementsP = 0; uint32_t elementsT = 0; uint32_t elementsTC = 0; uint32_t elements2TC = 0; int32_t* currentIndex = 0; uint32_t* currentElements = 0; // index buffer pointer uint32_t* indexBuffer = 0; //stride const uint32_t strideP = sizeof(renderDataP); const uint32_t strideT = sizeof(renderDataT); const uint32_t strideTC = sizeof(renderDataTC); const uint32_t stride2TC = sizeof(renderData2TC); // disable alpha and depth tests disableAlphaTest(); disableDepthTest(); if (m_renderObjects[0].overlay_type == OVERLAY_TYPE_NONE) { // texture without color/alpha if (!m_renderObjects[0].color) { // set pointer disableColorArray(); setVertexPointer(2, strideT, &m_renderTextureDatas[0].vertex); setTexCoordPointer(0, strideT, &m_renderTextureDatas[0].texel); indexBuffer = &m_tIndices[0]; currentIndex = &indexT; currentElements = &elementsT; // texture with color/alpha } else if (m_renderObjects[0].texture_id != 0){ // set pointer enableColorArray(); setVertexPointer(2, strideTC, &m_renderTextureColorDatas[0].vertex); setTexCoordPointer(0, strideTC, &m_renderTextureColorDatas[0].texel); setColorPointer(strideTC, &m_renderTextureColorDatas[0].color); indexBuffer = &m_tcIndices[0]; currentIndex = &indexTC; currentElements = &elementsTC; // primitive } else { // set pointer enableColorArray(); setVertexPointer(2, strideP, &m_renderPrimitiveDatas[0].vertex); setColorPointer(strideP, &m_renderPrimitiveDatas[0].color); indexBuffer = &m_pIndices[0]; currentIndex = &indexP; currentElements = &elementsP; } // multitexture overlay } else { // set pointer setVertexPointer(2, stride2TC, &m_renderMultitextureDatas[0].vertex); setColorPointer(stride2TC, &m_renderMultitextureDatas[0].color); setTexCoordPointer(0, stride2TC, &m_renderMultitextureDatas[0].texel); indexBuffer = &m_tc2Indices[0]; currentIndex = &index2TC; currentElements = &elements2TC; } for(std::vector::iterator ir = m_renderObjects.begin(); ir != m_renderObjects.end(); ++ir) { RenderObject& ro = (*ir); // first we look for changes if (ro.mode != mode) { type = true; render = true; } else if (ro.mode == GL_LINE_STRIP || ro.mode == GL_LINE_LOOP) { // do not batch line strips, loops or triangle fans to avoid side effects render = true; } if (ro.texture_id != texture_id) { texture = true; render = true; } if (ro.color != m_state.color_enabled) { color = true; render = true; } if (ro.overlay_type != overlay_type || (ro.overlay_type != OVERLAY_TYPE_NONE && (memcmp(rgba, ro.rgba, sizeof(uint8_t) * 4) || ro.overlay_id != texture_id2))) { mt = true; render = true; } if (m_state.lightmodel) { if (ro.src != src || ro.dst != dst) { blending = true; render = true; } if (ro.light != m_state.light_enabled) { light = true; render = true; } if (ro.stencil_test != m_state.sten_enabled) { stencil = true; render = true; } else if (ro.stencil_test) { if (ro.stencil_ref != m_state.sten_ref || ro.stencil_op != m_state.sten_op || ro.stencil_func != m_state.sten_func) { stencil = true; render = true; } } } // if changes then we render all previously elements if (render) { if (*currentElements > 0) { //render glDrawElements(mode, *currentElements, GL_UNSIGNED_INT, indexBuffer + *currentIndex); *currentIndex += *currentElements; } // switch mode if (type) { mode = ro.mode; type = false; } // switch coloring if (color) { if (ro.color && !m_state.color_enabled) { enableColorArray(); if (ro.overlay_type == OVERLAY_TYPE_NONE) { if (ro.texture_id != 0) { setVertexPointer(2, strideTC, &m_renderTextureColorDatas[0].vertex); setTexCoordPointer(0, strideTC, &m_renderTextureColorDatas[0].texel); setColorPointer(strideTC, &m_renderTextureColorDatas[0].color); indexBuffer = &m_tcIndices[0]; currentElements = &elementsTC; currentIndex = &indexTC; } else { setVertexPointer(2, strideP, &m_renderPrimitiveDatas[0].vertex); setColorPointer(strideP, &m_renderPrimitiveDatas[0].color); indexBuffer = &m_pIndices[0]; currentElements = &elementsP; currentIndex = &indexP; } } } else if (!ro.color && m_state.color_enabled) { disableColorArray(); if (ro.overlay_type == OVERLAY_TYPE_NONE) { setVertexPointer(2, strideT, &m_renderTextureDatas[0].vertex); setTexCoordPointer(0, strideT, &m_renderTextureDatas[0].texel); indexBuffer = &m_tIndices[0]; currentElements = &elementsT; currentIndex = &indexT; } } color = false; } // multitexturing if (mt) { switch (ro.overlay_type) { case OVERLAY_TYPE_NONE: disableTextures(3); disableTextures(2); disableTextures(1); if (ro.texture_id != 0) { enableTextures(0); if (m_state.color_enabled) { setVertexPointer(2, strideTC, &m_renderTextureColorDatas[0].vertex); setTexCoordPointer(0, strideTC, &m_renderTextureColorDatas[0].texel); setColorPointer(strideTC, &m_renderTextureColorDatas[0].color); indexBuffer = &m_tcIndices[0]; currentElements = &elementsTC; currentIndex = &indexTC; } else { setVertexPointer(2, strideT, &m_renderTextureDatas[0].vertex); setTexCoordPointer(0, strideT, &m_renderTextureDatas[0].texel); indexBuffer = &m_tIndices[0]; currentIndex = &indexT; currentElements = &elementsT; } } else { setVertexPointer(2, strideP, &m_renderPrimitiveDatas[0].vertex); setColorPointer(strideP, &m_renderPrimitiveDatas[0].color); indexBuffer = &m_pIndices[0]; currentElements = &elementsP; currentIndex = &indexP; } texture_id2 = 0; break; case OVERLAY_TYPE_COLOR: disableTextures(3); disableTextures(2); bindTexture(1, m_maskOverlay); setEnvironmentalColor(1, ro.rgba); enableTextures(0); // set pointer setVertexPointer(2, stride2TC, &m_renderMultitextureDatas[0].vertex); setColorPointer(stride2TC, &m_renderMultitextureDatas[0].color); setTexCoordPointer(1, stride2TC, &m_renderMultitextureDatas[0].texel2); setTexCoordPointer(0, stride2TC, &m_renderMultitextureDatas[0].texel); indexBuffer = &m_tc2Indices[0]; texture_id2 = m_maskOverlay; currentElements = &elements2TC; currentIndex = &index2TC; break; case OVERLAY_TYPE_COLOR_AND_TEXTURE: disableTextures(3); disableTextures(1); bindTexture(2, ro.overlay_id); setEnvironmentalColor(2, ro.rgba); enableTextures(0); // set pointer setVertexPointer(2, stride2TC, &m_renderMultitextureDatas[0].vertex); setColorPointer(stride2TC, &m_renderMultitextureDatas[0].color); setTexCoordPointer(2, stride2TC, &m_renderMultitextureDatas[0].texel2); setTexCoordPointer(0, stride2TC, &m_renderMultitextureDatas[0].texel); indexBuffer = &m_tc2Indices[0]; texture_id2 = ro.overlay_id; currentElements = &elements2TC; currentIndex = &index2TC; break; case OVERLAY_TYPE_TEXTURES_AND_FACTOR: disableTextures(2); disableTextures(1); bindTexture(3, ro.overlay_id); setEnvironmentalColor(3, ro.rgba); enableTextures(0); // set pointer setVertexPointer(2, stride2TC, &m_renderMultitextureDatas[0].vertex); setColorPointer(stride2TC, &m_renderMultitextureDatas[0].color); setTexCoordPointer(3, stride2TC, &m_renderMultitextureDatas[0].texel2); setTexCoordPointer(0, stride2TC, &m_renderMultitextureDatas[0].texel); indexBuffer = &m_tc2Indices[0]; texture_id2 = ro.overlay_id; currentElements = &elements2TC; currentIndex = &index2TC; break; } memcpy(rgba, ro.rgba, sizeof(uint8_t) * 4); overlay_type = ro.overlay_type; mt = false; } // switch texturing if (texture) { if (ro.texture_id != 0) { bindTexture(0, ro.texture_id); texture_id = ro.texture_id; if (ro.overlay_type == OVERLAY_TYPE_NONE) { if (m_state.color_enabled) { setVertexPointer(2, strideTC, &m_renderTextureColorDatas[0].vertex); setTexCoordPointer(0, strideTC, &m_renderTextureColorDatas[0].texel); setColorPointer(strideTC, &m_renderTextureColorDatas[0].color); indexBuffer = &m_tcIndices[0]; currentElements = &elementsTC; currentIndex = &indexTC; } else { setVertexPointer(2, strideT, &m_renderTextureDatas[0].vertex); setTexCoordPointer(0, strideT, &m_renderTextureDatas[0].texel); indexBuffer = &m_tIndices[0]; currentElements = &elementsT; currentIndex = &indexT; } } } else { disableTextures(0); texture_id = 0; if (ro.overlay_type == OVERLAY_TYPE_NONE) { setVertexPointer(2, strideP, &m_renderPrimitiveDatas[0].vertex); setColorPointer(strideP, &m_renderPrimitiveDatas[0].color); indexBuffer = &m_pIndices[0]; currentElements = &elementsP; currentIndex = &indexP; } } texture = false; } // set element to current size *currentElements = ro.size; // if lighting is enabled we have to consider a few more values if (m_state.lightmodel) { // change blending if (blending) { src = ro.src; dst = ro.dst; changeBlending(ro.src, ro.dst); blending = false; } // change light if (light) { if (ro.light && !m_state.light_enabled) { enableLighting(); } else if (!ro.light && m_state.light_enabled) { disableLighting(); } light = false; } // change stencil if (stencil) { if (ro.stencil_test) { setStencilTest(ro.stencil_ref, ro.stencil_op, ro.stencil_func); setAlphaTest(0.0); } else { disableAlphaTest(); disableStencilTest(); } stencil = false; } } render = false; } else { // else add the element *currentElements += ro.size; } } // render glDrawElements(mode, *currentElements, GL_UNSIGNED_INT, indexBuffer + *currentIndex); // reset all states if (overlay_type != OVERLAY_TYPE_NONE) { disableTextures(3); disableTextures(2); disableTextures(1); } disableTextures(0); enableColorArray(); if (m_state.lightmodel != 0) { changeBlending(4, 5); disableLighting(); disableStencilTest(); disableAlphaTest(); } m_renderPrimitiveDatas.clear(); m_renderTextureDatas.clear(); m_renderTextureColorDatas.clear(); m_renderMultitextureDatas.clear(); m_renderObjects.clear(); m_pIndices.clear(); m_tIndices.clear(); m_tcIndices.clear(); m_tc2Indices.clear(); } void RenderBackendOpenGL::renderWithZ() { // stride const uint32_t stride = sizeof(renderDataZ); // set pointer setVertexPointer(3, stride, &m_renderTextureDatasZ[0].vertex); setTexCoordPointer(0, stride, &m_renderTextureDatasZ[0].texel); // array index int32_t index = 0; // elements to render uint32_t elements = 0; // texture id uint32_t texture_id = 0; int32_t* currentIndex = &index; uint32_t* currentElements = &elements; enableAlphaTest(); enableDepthTest(); enableTextures(0); enableLighting(); disableColorArray(); for(std::vector::iterator ir = m_renderTextureObjectsZ.begin(); ir != m_renderTextureObjectsZ.end(); ++ir) { RenderZObject& ro = (*ir); // if changes then we render all previously elements if (ro.texture_id != texture_id) { if (*currentElements > 0) { //render glDrawElements(GL_TRIANGLES, *currentElements, GL_UNSIGNED_INT, &m_indices[*currentIndex]); *currentIndex += *currentElements; } if (ro.texture_id != 0) { bindTexture(0, ro.texture_id); texture_id = ro.texture_id; } else { disableTextures(0); texture_id = 0; } // set element to current size *currentElements = 6; } else { // else add the element *currentElements += 6; } } // render glDrawElements(GL_TRIANGLES, *currentElements, GL_UNSIGNED_INT, &m_indices[*currentIndex]); //reset all states disableLighting(); disableTextures(0); disableAlphaTest(); disableDepthTest(); enableColorArray(); m_renderTextureDatasZ.clear(); m_renderTextureObjectsZ.clear(); } void RenderBackendOpenGL::renderWithZTest() { // stride const uint32_t stride = sizeof(renderDataZ); // set pointer setVertexPointer(3, stride, &m_renderZ_datas[0].vertex); setTexCoordPointer(0, stride, &m_renderZ_datas[0].texel); enableAlphaTest(); enableDepthTest(); enableTextures(0); enableLighting(); disableColorArray(); std::vector::iterator iter = m_renderZ_objects.begin(); for ( ; iter != m_renderZ_objects.end(); ++iter) { bindTexture(iter->texture_id); glDrawArrays(GL_QUADS, iter->index, iter->elements); } m_renderZ_objects.clear(); //reset all states disableLighting(); disableTextures(0); disableAlphaTest(); disableDepthTest(); enableColorArray(); } void RenderBackendOpenGL::renderWithColorAndZ() { // stride const uint32_t stride = sizeof(renderDataColorZ); // set pointer setVertexPointer(3, stride, &m_renderTextureColorDatasZ[0].vertex); setTexCoordPointer(0, stride, &m_renderTextureColorDatasZ[0].texel); setColorPointer(stride, &m_renderTextureColorDatasZ[0].color); // array index int32_t index = 0; // elements to render uint32_t elements = 0; // texture id uint32_t texture_id = 0; int32_t* currentIndex = &index; uint32_t* currentElements = &elements; enableDepthTest(); // use own value, other option would be to disable it setAlphaTest(0.008); enableTextures(0); enableLighting(); for(std::vector::iterator ir = m_renderTextureColorObjectsZ.begin(); ir != m_renderTextureColorObjectsZ.end(); ++ir) { RenderZObject& ro = (*ir); // if changes then we render all previously elements if (ro.texture_id != texture_id) { if (*currentElements > 0) { //render glDrawElements(GL_TRIANGLES, *currentElements, GL_UNSIGNED_INT, &m_indices[*currentIndex]); *currentIndex += *currentElements; } if (ro.texture_id != 0) { bindTexture(0, ro.texture_id); texture_id = ro.texture_id; } else { disableTextures(0); texture_id = 0; } // set element to current size *currentElements = 6; } else { // else add the element *currentElements += 6; } } // render glDrawElements(GL_TRIANGLES, *currentElements, GL_UNSIGNED_INT, &m_indices[*currentIndex]); //reset all states disableLighting(); disableTextures(0); setAlphaTest(m_alphaValue); disableAlphaTest(); disableDepthTest(); m_renderTextureColorDatasZ.clear(); m_renderTextureColorObjectsZ.clear(); } void RenderBackendOpenGL::renderWithMultitextureAndZ() { //bools to indicate changes bool texture = false; bool render = false; bool mt = false; // stride const uint32_t stride = sizeof(renderData2TCZ); // set pointer setVertexPointer(3, stride, &m_renderMultitextureDatasZ[0].vertex); setTexCoordPointer(0, stride, &m_renderMultitextureDatasZ[0].texel); setTexCoordPointer(1, stride, &m_renderMultitextureDatasZ[0].texel2); setTexCoordPointer(2, stride, &m_renderMultitextureDatasZ[0].texel2); setTexCoordPointer(3, stride, &m_renderMultitextureDatasZ[0].texel2); setColorPointer(stride, &m_renderMultitextureDatasZ[0].color); // array index int32_t index = 0; // elements to render uint32_t elements = 0; // texture id uint32_t texture_id = 0; uint32_t texture_id2 = 0; // overlay type OverlayType overlay_type = OVERLAY_TYPE_NONE; // overlay color uint8_t color[4] = {0}; int32_t* currentIndex = &index; uint32_t* currentElements = &elements; enableDepthTest(); enableAlphaTest(); enableTextures(0); enableLighting(); for(std::vector::iterator ir = m_renderMultitextureObjectsZ.begin(); ir != m_renderMultitextureObjectsZ.end(); ++ir) { RenderObject& ro = (*ir); // first we look for changes if (ro.texture_id != texture_id) { texture = true; render = true; } if (ro.overlay_type != overlay_type || (ro.overlay_type != OVERLAY_TYPE_NONE && (memcmp(color, ro.rgba, sizeof(uint8_t) * 4) || ro.overlay_id != texture_id2))) { mt = true; render = true; } // if changes then we render all previously elements if (render) { if (*currentElements > 0) { //render glDrawElements(GL_TRIANGLES, *currentElements, GL_UNSIGNED_INT, &m_indices[*currentIndex]); *currentIndex += *currentElements; } // multitexturing if(mt) { switch (ro.overlay_type) { case OVERLAY_TYPE_NONE: disableTextures(3); disableTextures(2); disableTextures(1); enableTextures(0); texture_id2 = 0; break; case OVERLAY_TYPE_COLOR: disableTextures(3); disableTextures(2); bindTexture(1, m_maskOverlay); setEnvironmentalColor(1, ro.rgba); enableTextures(0); texture_id2 = m_maskOverlay; break; case OVERLAY_TYPE_COLOR_AND_TEXTURE: disableTextures(3); disableTextures(1); bindTexture(2, ro.overlay_id); setEnvironmentalColor(2, ro.rgba); enableTextures(0); texture_id2 = ro.overlay_id; break; case OVERLAY_TYPE_TEXTURES_AND_FACTOR: disableTextures(2); disableTextures(1); bindTexture(3, ro.overlay_id); setEnvironmentalColor(3, ro.rgba); enableTextures(0); texture_id2 = ro.overlay_id; break; } memcpy(color, ro.rgba, sizeof(uint8_t) * 4); overlay_type = ro.overlay_type; mt = false; } // switch texturing if (texture) { if (ro.texture_id != 0) { bindTexture(0, ro.texture_id); texture_id = ro.texture_id; } else { disableTextures(0); texture_id = 0; } texture = false; } // set element to current size *currentElements = ro.size; render = false; } else { // else add the element *currentElements += ro.size; } } // render glDrawElements(GL_TRIANGLES, *currentElements, GL_UNSIGNED_INT, &m_indices[*currentIndex]); //reset all states if (overlay_type != OVERLAY_TYPE_NONE) { disableTextures(3); disableTextures(2); disableTextures(1); } disableTextures(0); disableLighting(); disableAlphaTest(); disableDepthTest(); m_renderMultitextureDatasZ.clear(); m_renderMultitextureObjectsZ.clear(); } void RenderBackendOpenGL::renderVertexArrays() { // z stuff if (!m_renderZ_objects.empty()) { renderWithZTest(); } if (!m_renderTextureObjectsZ.empty()) { renderWithZ(); } if (!m_renderMultitextureObjectsZ.empty()) { renderWithMultitextureAndZ(); } if (!m_renderTextureColorObjectsZ.empty()) { renderWithColorAndZ(); } // objects without z if (!m_renderObjects.empty()) { renderWithoutZ(); } } bool RenderBackendOpenGL::putPixel(int32_t x, int32_t y, uint8_t r, uint8_t g, uint8_t b, uint8_t a) { if ((x < 0) || (x >= (int32_t)m_target->w) || (y < 0) || (y >= (int32_t)m_target->h)) { return false; } renderDataP rd; rd.vertex[0] = static_cast(x)+0.375; rd.vertex[1] = static_cast(y)+0.375; rd.color[0] = r; rd.color[1] = g; rd.color[2] = b; rd.color[3] = a; m_renderPrimitiveDatas.push_back(rd); m_pIndices.push_back(m_pIndices.empty() ? 0 : m_pIndices.back() + 1); RenderObject ro(GL_POINTS, 1); m_renderObjects.push_back(ro); return true; } void RenderBackendOpenGL::drawLine(const Point& p1, const Point& p2, uint8_t r, uint8_t g, uint8_t b, uint8_t a) { renderDataP rd; rd.vertex[0] = static_cast(p1.x)+0.375; rd.vertex[1] = static_cast(p1.y)+0.375; rd.color[0] = r; rd.color[1] = g; rd.color[2] = b; rd.color[3] = a; m_renderPrimitiveDatas.push_back(rd); rd.vertex[0] = static_cast(p2.x)+0.375; rd.vertex[1] = static_cast(p2.y)+0.375; m_renderPrimitiveDatas.push_back(rd); m_pIndices.push_back(m_pIndices.empty() ? 0 : m_pIndices.back() + 1); m_pIndices.push_back(m_pIndices.back() + 1); RenderObject ro(GL_LINES, 2); m_renderObjects.push_back(ro); } void RenderBackendOpenGL::drawThickLine(const Point& p1, const Point& p2, uint8_t width, uint8_t r, uint8_t g, uint8_t b, uint8_t a) { float xDiff = p2.x - p1.x; float yDiff = p2.y - p1.y; float halfW = static_cast(width) / 2.0; float angle = Mathf::ATan2(yDiff, xDiff) * (180.0 / Mathf::pi()) + 90.0; if (angle < 0.0) { angle += 360.0; } else if (angle > 360.0) { angle -= 360.0; } angle *= Mathf::pi() / 180.0; float cornerX = halfW * Mathf::Cos(angle); float cornerY = halfW * Mathf::Sin(angle); renderDataP rd; rd.vertex[0] = static_cast(p1.x) + cornerX; rd.vertex[1] = static_cast(p1.y) + cornerY; rd.color[0] = r; rd.color[1] = g; rd.color[2] = b; rd.color[3] = a; m_renderPrimitiveDatas.push_back(rd); rd.vertex[0] = static_cast(p2.x) + cornerX; rd.vertex[1] = static_cast(p2.y) + cornerY; m_renderPrimitiveDatas.push_back(rd); rd.vertex[0] = static_cast(p2.x) - cornerX; rd.vertex[1] = static_cast(p2.y) - cornerY; m_renderPrimitiveDatas.push_back(rd); rd.vertex[0] = static_cast(p1.x) - cornerX; rd.vertex[1] = static_cast(p1.y) - cornerY; m_renderPrimitiveDatas.push_back(rd); uint32_t index = m_pIndices.empty() ? 0 : m_pIndices.back() + 1; uint32_t indices[] = { index, index + 1, index + 2, index, index + 2, index + 3 }; m_pIndices.insert(m_pIndices.end(), indices, indices + 6); RenderObject ro(GL_TRIANGLES, 6); m_renderObjects.push_back(ro); } void RenderBackendOpenGL::drawPolyLine(const std::vector& points, uint8_t width, uint8_t r, uint8_t g, uint8_t b, uint8_t a) { if (points.size() < 2) { return; } std::vector::const_iterator it = points.begin(); if (width > 1) { Point old = *it; ++it; for (; it != points.end(); ++it) { drawThickLine(old, *it, width, r, g, b, a); drawFillCircle(old, width / 2, r, g, b, a); old = *it; } drawFillCircle(old, width / 2, r, g, b, a); } else { renderDataP rd; rd.color[0] = r; rd.color[1] = g; rd.color[2] = b; rd.color[3] = a; for (; it != points.end(); ++it) { rd.vertex[0] = static_cast((*it).x); rd.vertex[1] = static_cast((*it).y); m_renderPrimitiveDatas.push_back(rd); m_pIndices.push_back(m_pIndices.empty() ? 0 : m_pIndices.back() + 1); } RenderObject ro(GL_LINE_STRIP, points.size()); m_renderObjects.push_back(ro); } } void RenderBackendOpenGL::drawBezier(const std::vector& points, int32_t steps, uint8_t width, uint8_t r, uint8_t g, uint8_t b, uint8_t a) { if (points.size() < 2) { return; } int32_t elements = points.size(); if (elements < 3 || steps < 2) { return; } bool thick = width > 1; float step = 1.0 / static_cast(steps-1); float t = 0.0; Point old = getBezierPoint(points, elements+1, t); if (thick) { for (int32_t i = 0; i <= (elements*steps); ++i) { t += step; Point next = getBezierPoint(points, elements, t); drawThickLine(old, next, width, r, g, b, a); drawFillCircle(old, width / 2, r, g, b, a); old = next; } drawFillCircle(old, width / 2, r, g, b, a); } else { renderDataP rd; rd.color[0] = r; rd.color[1] = g; rd.color[2] = b; rd.color[3] = a; for (int32_t i = 0; i <= (elements*steps); ++i) { t += step; Point next = getBezierPoint(points, elements, t); rd.vertex[0] = static_cast(old.x); rd.vertex[1] = static_cast(old.y); m_renderPrimitiveDatas.push_back(rd); old = next; m_pIndices.push_back(m_pIndices.empty() ? 0 : m_pIndices.back() + 1); } RenderObject ro(GL_LINE_STRIP, (elements*steps)+1); m_renderObjects.push_back(ro); } } void RenderBackendOpenGL::drawTriangle(const Point& p1, const Point& p2, const Point& p3, uint8_t r, uint8_t g, uint8_t b, uint8_t a) { renderDataP rd; rd.vertex[0] = static_cast(p1.x); rd.vertex[1] = static_cast(p1.y); rd.color[0] = r; rd.color[1] = g; rd.color[2] = b; rd.color[3] = a; m_renderPrimitiveDatas.push_back(rd); rd.vertex[0] = static_cast(p2.x); rd.vertex[1] = static_cast(p2.y); m_renderPrimitiveDatas.push_back(rd); rd.vertex[0] = static_cast(p3.x); rd.vertex[1] = static_cast(p3.y); m_renderPrimitiveDatas.push_back(rd); uint32_t index = m_pIndices.empty() ? 0 : m_pIndices.back() + 1; uint32_t indices[] = { index, index + 1, index + 2 }; m_pIndices.insert(m_pIndices.end(), indices, indices + 3); RenderObject ro(GL_TRIANGLES, 3); m_renderObjects.push_back(ro); } void RenderBackendOpenGL::drawRectangle(const Point& p, uint16_t w, uint16_t h, uint8_t r, uint8_t g, uint8_t b, uint8_t a) { renderDataP rd; rd.vertex[0] = static_cast(p.x); rd.vertex[1] = static_cast(p.y); rd.color[0] = r; rd.color[1] = g; rd.color[2] = b; rd.color[3] = a; m_renderPrimitiveDatas.push_back(rd); rd.vertex[0] = static_cast(p.x+w); m_renderPrimitiveDatas.push_back(rd); rd.vertex[1] = static_cast(p.y+h); m_renderPrimitiveDatas.push_back(rd); rd.vertex[0] = static_cast(p.x); m_renderPrimitiveDatas.push_back(rd); uint32_t index = m_pIndices.empty() ? 0 : m_pIndices.back() + 1; uint32_t indices[] = { index, index + 1, index + 2, index + 3 }; m_pIndices.insert(m_pIndices.end(), indices, indices + 4); RenderObject ro(GL_LINE_LOOP, 4); m_renderObjects.push_back(ro); } void RenderBackendOpenGL::fillRectangle(const Point& p, uint16_t w, uint16_t h, uint8_t r, uint8_t g, uint8_t b, uint8_t a) { renderDataP rd; rd.vertex[0] = static_cast(p.x); rd.vertex[1] = static_cast(p.y); rd.color[0] = r; rd.color[1] = g; rd.color[2] = b; rd.color[3] = a; m_renderPrimitiveDatas.push_back(rd); rd.vertex[1] = static_cast(p.y+h); m_renderPrimitiveDatas.push_back(rd); rd.vertex[0] = static_cast(p.x+w); m_renderPrimitiveDatas.push_back(rd); rd.vertex[1] = static_cast(p.y); m_renderPrimitiveDatas.push_back(rd); uint32_t index = m_pIndices.empty() ? 0 : m_pIndices.back() + 1; uint32_t indices[] = { index, index + 1, index + 2, index, index + 2, index + 3 }; m_pIndices.insert(m_pIndices.end(), indices, indices + 6); RenderObject ro(GL_TRIANGLES, 6); m_renderObjects.push_back(ro); } void RenderBackendOpenGL::drawQuad(const Point& p1, const Point& p2, const Point& p3, const Point& p4, uint8_t r, uint8_t g, uint8_t b, uint8_t a) { renderDataP rd; rd.vertex[0] = static_cast(p1.x); rd.vertex[1] = static_cast(p1.y); rd.color[0] = r; rd.color[1] = g; rd.color[2] = b; rd.color[3] = a; m_renderPrimitiveDatas.push_back(rd); rd.vertex[0] = static_cast(p2.x); rd.vertex[1] = static_cast(p2.y); m_renderPrimitiveDatas.push_back(rd); rd.vertex[0] = static_cast(p3.x); rd.vertex[1] = static_cast(p3.y); m_renderPrimitiveDatas.push_back(rd); rd.vertex[0] = static_cast(p4.x); rd.vertex[1] = static_cast(p4.y); m_renderPrimitiveDatas.push_back(rd); uint32_t index = m_pIndices.empty() ? 0 : m_pIndices.back() + 1; uint32_t indices[] = { index, index + 1, index + 2, index, index + 2, index + 3 }; m_pIndices.insert(m_pIndices.end(), indices, indices + 6); RenderObject ro(GL_TRIANGLES, 6); m_renderObjects.push_back(ro); } void RenderBackendOpenGL::drawVertex(const Point& p, const uint8_t size, uint8_t r, uint8_t g, uint8_t b, uint8_t a) { renderDataP rd; rd.vertex[0] = static_cast(p.x-size); rd.vertex[1] = static_cast(p.y+size); rd.color[0] = r; rd.color[1] = g; rd.color[2] = b; rd.color[3] = a; m_renderPrimitiveDatas.push_back(rd); rd.vertex[0] = static_cast(p.x+size); m_renderPrimitiveDatas.push_back(rd); rd.vertex[1] = static_cast(p.y-size); m_renderPrimitiveDatas.push_back(rd); rd.vertex[0] = static_cast(p.x-size); m_renderPrimitiveDatas.push_back(rd); uint32_t index = m_pIndices.empty() ? 0 : m_pIndices.back() + 1; uint32_t indices[] = { index, index + 1, index + 2, index + 3 }; m_pIndices.insert(m_pIndices.end(), indices, indices + 4); RenderObject ro(GL_LINE_LOOP, 4); m_renderObjects.push_back(ro); } void RenderBackendOpenGL::drawCircle(const Point& p, uint32_t radius, uint8_t r, uint8_t g, uint8_t b, uint8_t a) { // set side length to 5 and calculate needed divisions int32_t subdivisions = round(Mathf::pi() / ( 5.0 / (2.0 * radius))); if (subdivisions < 12) { subdivisions = 12; } const float step = Mathf::twoPi()/subdivisions; float angle = 0; renderDataP rd; rd.color[0] = r; rd.color[1] = g; rd.color[2] = b; rd.color[3] = a; for (uint16_t i = 0; i < subdivisions-1; ++i) { rd.vertex[0] = radius * Mathf::Cos(angle) + p.x; rd.vertex[1] = radius * Mathf::Sin(angle) + p.y; m_renderPrimitiveDatas.push_back(rd); angle += step; m_pIndices.push_back(m_pIndices.empty() ? 0 : m_pIndices.back() + 1); } RenderObject ro(GL_LINE_LOOP, subdivisions-1); m_renderObjects.push_back(ro); } void RenderBackendOpenGL::drawFillCircle(const Point& p, uint32_t radius, uint8_t r, uint8_t g, uint8_t b, uint8_t a) { // set side length to 5 and calculate needed divisions int32_t subdivisions = round(Mathf::pi() / ( 5.0 / (2.0 * radius))); if (subdivisions < 12) { subdivisions = 12; } const float step = Mathf::twoPi()/subdivisions; float angle = Mathf::twoPi(); uint32_t index = m_pIndices.empty() ? 0 : m_pIndices.back() + 1; uint32_t lastIndex = index; // center vertex renderDataP rd; rd.vertex[0] = static_cast(p.x); rd.vertex[1] = static_cast(p.y); rd.color[0] = r; rd.color[1] = g; rd.color[2] = b; rd.color[3] = a; m_renderPrimitiveDatas.push_back(rd); // reversed because of culling faces for (uint16_t i = 0; i <= subdivisions; ++i) { rd.vertex[0] = radius * Mathf::Cos(angle) + p.x; rd.vertex[1] = radius * Mathf::Sin(angle) + p.y; m_renderPrimitiveDatas.push_back(rd); angle -= step; // forms triangle with start index, the last and a new one uint32_t indices[] = { index, lastIndex, ++lastIndex }; m_pIndices.insert(m_pIndices.end(), indices, indices + 3); } RenderObject ro(GL_TRIANGLES, (subdivisions+1) * 3); m_renderObjects.push_back(ro); } void RenderBackendOpenGL::drawCircleSegment(const Point& p, uint32_t radius, int32_t sangle, int32_t eangle, uint8_t r, uint8_t g, uint8_t b, uint8_t a) { const float step = Mathf::twoPi()/360; int32_t elements = 0; int32_t s = (sangle + 360) % 360; int32_t e = (eangle + 360) % 360; if (e == 0) { e = 360; } if (s == e) { return; } renderDataP rd; rd.color[0] = r; rd.color[1] = g; rd.color[2] = b; rd.color[3] = a; float angle = static_cast(s) * step; for (;s <= e; ++s, angle += step, ++elements) { rd.vertex[0] = radius * Mathf::Cos(angle) + p.x; rd.vertex[1] = radius * Mathf::Sin(angle) + p.y; m_renderPrimitiveDatas.push_back(rd); m_pIndices.push_back(m_pIndices.empty() ? 0 : m_pIndices.back() + 1); } RenderObject ro(GL_LINE_STRIP, elements); m_renderObjects.push_back(ro); } void RenderBackendOpenGL::drawFillCircleSegment(const Point& p, uint32_t radius, int32_t sangle, int32_t eangle, uint8_t r, uint8_t g, uint8_t b, uint8_t a) { const float step = Mathf::twoPi() / 360; int32_t s = (sangle + 360) % 360; int32_t e = (eangle + 360) % 360; if (e == 0) { e = 360; } if (s == e) { return; } uint32_t index = m_pIndices.empty() ? 0 : m_pIndices.back() + 1; uint32_t lastIndex = index; // center vertex renderDataP rd; rd.vertex[0] = static_cast(p.x); rd.vertex[1] = static_cast(p.y); rd.color[0] = r; rd.color[1] = g; rd.color[2] = b; rd.color[3] = a; m_renderPrimitiveDatas.push_back(rd); int32_t elements = 0; // reversed because of culling faces float angle = static_cast(e) * step; for (;s <= e; ++s, angle -= step, ++elements) { rd.vertex[0] = radius * Mathf::Cos(angle) + p.x; rd.vertex[1] = radius * Mathf::Sin(angle) + p.y; m_renderPrimitiveDatas.push_back(rd); // forms triangle with start index, the last and a new one uint32_t indices[] = { index, lastIndex, ++lastIndex }; m_pIndices.insert(m_pIndices.end(), indices, indices + 3); } RenderObject ro(GL_TRIANGLES, elements * 3); m_renderObjects.push_back(ro); } void RenderBackendOpenGL::drawLightPrimitive(const Point& p, uint8_t intensity, float radius, int32_t subdivisions, float xstretch, float ystretch, uint8_t red, uint8_t green, uint8_t blue) { const float step = Mathf::twoPi()/subdivisions; uint32_t elements = 0; uint32_t index = m_pIndices.empty() ? 0 : m_pIndices.back() + 1; uint32_t lastIndex = index; // center vertex renderDataP rd; rd.vertex[0] = static_cast(p.x); rd.vertex[1] = static_cast(p.y); rd.color[0] = red; rd.color[1] = green; rd.color[2] = blue; rd.color[3] = intensity; m_renderPrimitiveDatas.push_back(rd); for (float angle = 0; angle <= Mathf::twoPi(); angle += step, elements += 3) { rd.vertex[0] = radius*Mathf::Cos(angle+step)*xstretch + p.x; rd.vertex[1] = radius*Mathf::Sin(angle+step)*ystretch + p.y; rd.color[0] = 0; rd.color[1] = 0; rd.color[2] = 0; rd.color[3] = 255; m_renderPrimitiveDatas.push_back(rd); rd.vertex[0] = radius*Mathf::Cos(angle)*xstretch + p.x; rd.vertex[1] = radius*Mathf::Sin(angle)*ystretch + p.y; m_renderPrimitiveDatas.push_back(rd); // forms triangle with start index and two new ones uint32_t indices[] = { index, ++lastIndex, ++lastIndex }; m_pIndices.insert(m_pIndices.end(), indices, indices + 3); } RenderObject ro(GL_TRIANGLES, elements); m_renderObjects.push_back(ro); } void RenderBackendOpenGL::addImageToArray(uint32_t id, const Rect& rect, float const* st, uint8_t alpha, uint8_t const* rgba) { RenderObject ro(GL_TRIANGLES, 6, id); // texture quad without alpha if (alpha == 255 && !rgba) { renderDataT rd; rd.vertex[0] = static_cast(rect.x); rd.vertex[1] = static_cast(rect.y); rd.texel[0] = st[0]; rd.texel[1] = st[1]; m_renderTextureDatas.push_back(rd); rd.vertex[0] = static_cast(rect.x); rd.vertex[1] = static_cast(rect.y+rect.h); rd.texel[1] = st[3]; m_renderTextureDatas.push_back(rd); rd.vertex[0] = static_cast(rect.x+rect.w); rd.vertex[1] = static_cast(rect.y+rect.h); rd.texel[0] = st[2]; m_renderTextureDatas.push_back(rd); rd.vertex[0] = static_cast(rect.x+rect.w); rd.vertex[1] = static_cast(rect.y); rd.texel[1] = st[1]; m_renderTextureDatas.push_back(rd); ro.color = false; uint32_t index = m_tIndices.empty() ? 0 : m_tIndices.back() + 1; uint32_t indices[] = { index, index + 1, index + 2, index, index + 2, index + 3 }; m_tIndices.insert(m_tIndices.end(), indices, indices + 6); } else { if (rgba) { renderData2TC rd; rd.vertex[0] = static_cast(rect.x); rd.vertex[1] = static_cast(rect.y); rd.texel[0] = st[0]; rd.texel[1] = st[1]; rd.texel2[0] = 0.0; rd.texel2[1] = 0.0; rd.color[0] = 255; rd.color[1] = 255; rd.color[2] = 255; rd.color[3] = alpha; m_renderMultitextureDatas.push_back(rd); rd.vertex[0] = static_cast(rect.x); rd.vertex[1] = static_cast(rect.y+rect.h); rd.texel[1] = st[3]; rd.texel2[1] = 1.0; m_renderMultitextureDatas.push_back(rd); rd.vertex[0] = static_cast(rect.x+rect.w); rd.vertex[1] = static_cast(rect.y+rect.h); rd.texel[0] = st[2]; rd.texel2[0] = 1.0; m_renderMultitextureDatas.push_back(rd); rd.vertex[0] = static_cast(rect.x+rect.w); rd.vertex[1] = static_cast(rect.y); rd.texel[1] = st[1]; rd.texel2[1] = 0.0; m_renderMultitextureDatas.push_back(rd); ro.color = true; ro.overlay_type = OVERLAY_TYPE_COLOR; ro.rgba[0] = rgba[0]; ro.rgba[1] = rgba[1]; ro.rgba[2] = rgba[2]; ro.rgba[3] = rgba[3]; uint32_t index = m_tc2Indices.empty() ? 0 : m_tc2Indices.back() + 1; uint32_t indices[] = { index, index + 1, index + 2, index, index + 2, index + 3 }; m_tc2Indices.insert(m_tc2Indices.end(), indices, indices + 6); // texture quad with alpha } else { renderDataTC rd; rd.vertex[0] = static_cast(rect.x); rd.vertex[1] = static_cast(rect.y); rd.texel[0] = st[0]; rd.texel[1] = st[1]; rd.color[0] = 255; rd.color[1] = 255; rd.color[2] = 255; rd.color[3] = alpha; m_renderTextureColorDatas.push_back(rd); rd.vertex[0] = static_cast(rect.x); rd.vertex[1] = static_cast(rect.y+rect.h); rd.texel[1] = st[3]; m_renderTextureColorDatas.push_back(rd); rd.vertex[0] = static_cast(rect.x+rect.w); rd.vertex[1] = static_cast(rect.y+rect.h); rd.texel[0] = st[2]; m_renderTextureColorDatas.push_back(rd); rd.vertex[0] = static_cast(rect.x+rect.w); rd.vertex[1] = static_cast(rect.y); rd.texel[1] = st[1]; m_renderTextureColorDatas.push_back(rd); ro.color = true; uint32_t index = m_tcIndices.empty() ? 0 : m_tcIndices.back() + 1; uint32_t indices[] = { index, index + 1, index + 2, index, index + 2, index + 3 }; m_tcIndices.insert(m_tcIndices.end(), indices, indices + 6); } } m_renderObjects.push_back(ro); } void RenderBackendOpenGL::addImageToArray(const Rect& rect, uint32_t id1, float const* st1, uint32_t id2, float const* st2, uint8_t alpha, uint8_t const* rgba) { if (rgba) { renderData2TC rd; rd.vertex[0] = static_cast(rect.x); rd.vertex[1] = static_cast(rect.y); rd.texel[0] = st1[0]; rd.texel[1] = st1[1]; rd.texel2[0] = st2[0]; rd.texel2[1] = st2[1]; rd.color[0] = 255; rd.color[1] = 255; rd.color[2] = 255; rd.color[3] = alpha; m_renderMultitextureDatas.push_back(rd); rd.vertex[0] = static_cast(rect.x); rd.vertex[1] = static_cast(rect.y+rect.h); rd.texel[1] = st1[3]; rd.texel2[1] = st2[3]; m_renderMultitextureDatas.push_back(rd); rd.vertex[0] = static_cast(rect.x+rect.w); rd.vertex[1] = static_cast(rect.y+rect.h); rd.texel[0] = st1[2]; rd.texel2[0] = st2[2]; m_renderMultitextureDatas.push_back(rd); rd.vertex[0] = static_cast(rect.x+rect.w); rd.vertex[1] = static_cast(rect.y); rd.texel[1] = st1[1]; rd.texel2[1] = st2[1]; m_renderMultitextureDatas.push_back(rd); uint32_t index = m_tc2Indices.empty() ? 0 : m_tc2Indices.back() + 1; uint32_t indices[] = { index, index + 1, index + 2, index, index + 2, index + 3 }; m_tc2Indices.insert(m_tc2Indices.end(), indices, indices + 6); RenderObject ro(GL_TRIANGLES, 6, id1, id2); ro.overlay_type = OVERLAY_TYPE_TEXTURES_AND_FACTOR; ro.rgba[0] = rgba[0]; ro.rgba[1] = rgba[1]; ro.rgba[2] = rgba[2]; ro.rgba[3] = rgba[3]; m_renderObjects.push_back(ro); } } RenderBackendOpenGL::RenderZObjectTest* RenderBackendOpenGL::getRenderBufferObject(GLuint texture_id) { for (std::vector::iterator it = m_renderZ_objects.begin(); it != m_renderZ_objects.end(); ++it) { if (it->texture_id == texture_id) { if (it->elements < it->max_size - 4) { return &(*it); } } } int32_t max_quads_per_texbatch = 1000; // nothing was found (or we were forced to make new batch), we need to create new one RenderZObjectTest obj; if (!m_renderZ_objects.empty()) { obj.index = m_renderZ_objects.back().index + m_renderZ_objects.back().max_size; } else { obj.index = 0; } obj.texture_id = texture_id; obj.elements = 0; obj.max_size = max_quads_per_texbatch * 4; m_renderZ_objects.push_back(obj); return &m_renderZ_objects.back(); } void RenderBackendOpenGL::addImageToArrayZ(uint32_t id, const Rect& rect, float vertexZ, float const* st, uint8_t alpha, uint8_t const* rgba) { // texture quad without alpha and coloring if (alpha == 255 && !rgba) { // ToDo: Consider if this is better. /*RenderZObjectTest* renderObj = getRenderBufferObject(id); uint32_t offset = renderObj->index + renderObj->elements; renderObj->elements += 4; renderDataZ* rd = &m_renderZ_datas[offset]; rd->vertex[0] = static_cast(rect.x); rd->vertex[1] = static_cast(rect.y); rd->vertex[2] = vertexZ; rd->texel[0] = st[0]; rd->texel[1] = st[1]; ++rd; rd->vertex[0] = static_cast(rect.x); rd->vertex[1] = static_cast(rect.y+rect.h); rd->vertex[2] = vertexZ; rd->texel[0] = st[0]; rd->texel[1] = st[3]; ++rd; rd->vertex[0] = static_cast(rect.x+rect.w); rd->vertex[1] = static_cast(rect.y+rect.h); rd->vertex[2] = vertexZ; rd->texel[0] = st[2]; rd->texel[1] = st[3]; ++rd; rd->vertex[0] = static_cast(rect.x+rect.w); rd->vertex[1] = static_cast(rect.y); rd->vertex[2] = vertexZ; rd->texel[0] = st[2]; rd->texel[1] = st[1];*/ renderDataZ rd; rd.vertex[0] = static_cast(rect.x); rd.vertex[1] = static_cast(rect.y); rd.vertex[2] = vertexZ; rd.texel[0] = st[0]; rd.texel[1] = st[1]; m_renderTextureDatasZ.push_back(rd); rd.vertex[0] = static_cast(rect.x); rd.vertex[1] = static_cast(rect.y+rect.h); rd.texel[1] = st[3]; m_renderTextureDatasZ.push_back(rd); rd.vertex[0] = static_cast(rect.x+rect.w); rd.vertex[1] = static_cast(rect.y+rect.h); rd.texel[0] = st[2]; m_renderTextureDatasZ.push_back(rd); rd.vertex[0] = static_cast(rect.x+rect.w); rd.vertex[1] = static_cast(rect.y); rd.texel[1] = st[1]; m_renderTextureDatasZ.push_back(rd); RenderZObject ro; ro.texture_id = id; m_renderTextureObjectsZ.push_back(ro); } else { // multitexture with color, second texel is used for m_maskOverlay if (rgba) { renderData2TCZ rd; rd.vertex[0] = static_cast(rect.x); rd.vertex[1] = static_cast(rect.y); rd.vertex[2] = vertexZ; rd.texel[0] = st[0]; rd.texel[1] = st[1]; rd.texel2[0] = 0.0; rd.texel2[1] = 0.0; rd.color[0] = 255; rd.color[1] = 255; rd.color[2] = 255; rd.color[3] = alpha; m_renderMultitextureDatasZ.push_back(rd); rd.vertex[0] = static_cast(rect.x); rd.vertex[1] = static_cast(rect.y+rect.h); rd.texel[1] = st[3]; rd.texel2[1] = 1.0; m_renderMultitextureDatasZ.push_back(rd); rd.vertex[0] = static_cast(rect.x+rect.w); rd.vertex[1] = static_cast(rect.y+rect.h); rd.texel[0] = st[2]; rd.texel2[0] = 1.0; m_renderMultitextureDatasZ.push_back(rd); rd.vertex[0] = static_cast(rect.x+rect.w); rd.vertex[1] = static_cast(rect.y); rd.texel[1] = st[1]; rd.texel2[1] = 0.0; m_renderMultitextureDatasZ.push_back(rd); RenderObject ro(GL_TRIANGLES, 6, id); ro.color = true; ro.overlay_type = OVERLAY_TYPE_COLOR; ro.rgba[0] = rgba[0]; ro.rgba[1] = rgba[1]; ro.rgba[2] = rgba[2]; ro.rgba[3] = rgba[3]; m_renderMultitextureObjectsZ.push_back(ro); // texture with alpha } else { renderDataColorZ rd; rd.vertex[0] = static_cast(rect.x); rd.vertex[1] = static_cast(rect.y); rd.vertex[2] = vertexZ; rd.texel[0] = st[0]; rd.texel[1] = st[1]; rd.color[0] = 255; rd.color[1] = 255; rd.color[2] = 255; rd.color[3] = alpha; m_renderTextureColorDatasZ.push_back(rd); rd.vertex[0] = static_cast(rect.x); rd.vertex[1] = static_cast(rect.y+rect.h); rd.texel[1] = st[3]; m_renderTextureColorDatasZ.push_back(rd); rd.vertex[0] = static_cast(rect.x+rect.w); rd.vertex[1] = static_cast(rect.y+rect.h); rd.texel[0] = st[2]; m_renderTextureColorDatasZ.push_back(rd); rd.vertex[0] = static_cast(rect.x+rect.w); rd.vertex[1] = static_cast(rect.y); rd.texel[1] = st[1]; m_renderTextureColorDatasZ.push_back(rd); RenderZObject ro; ro.texture_id = id; m_renderTextureColorObjectsZ.push_back(ro); } } } void RenderBackendOpenGL::addImageToArrayZ(const Rect& rect, float vertexZ, uint32_t id1, float const* st1, uint32_t id2, float const* st2, uint8_t alpha, uint8_t const* rgba) { if (rgba) { renderData2TCZ rd; rd.vertex[0] = static_cast(rect.x); rd.vertex[1] = static_cast(rect.y); rd.vertex[2] = vertexZ; rd.texel[0] = st1[0]; rd.texel[1] = st1[1]; rd.texel2[0] = st2[0]; rd.texel2[1] = st2[1]; rd.color[0] = 255; rd.color[1] = 255; rd.color[2] = 255; rd.color[3] = alpha; m_renderMultitextureDatasZ.push_back(rd); rd.vertex[0] = static_cast(rect.x); rd.vertex[1] = static_cast(rect.y+rect.h); rd.texel[1] = st1[3]; rd.texel2[1] = st2[3]; m_renderMultitextureDatasZ.push_back(rd); rd.vertex[0] = static_cast(rect.x+rect.w); rd.vertex[1] = static_cast(rect.y+rect.h); rd.texel[0] = st1[2]; rd.texel2[0] = st2[2]; m_renderMultitextureDatasZ.push_back(rd); rd.vertex[0] = static_cast(rect.x+rect.w); rd.vertex[1] = static_cast(rect.y); rd.texel[1] = st1[1]; rd.texel2[1] = st2[1]; m_renderMultitextureDatasZ.push_back(rd); RenderObject ro(GL_TRIANGLES, 6, id1, id2); ro.overlay_type = OVERLAY_TYPE_TEXTURES_AND_FACTOR; ro.rgba[0] = rgba[0]; ro.rgba[1] = rgba[1]; ro.rgba[2] = rgba[2]; ro.rgba[3] = rgba[3]; m_renderMultitextureObjectsZ.push_back(ro); } } void RenderBackendOpenGL::prepareForOverlays() { glActiveTexture(GL_TEXTURE1); glEnable(GL_TEXTURE_2D); if(m_maskOverlay == 0) { // Constant texture - can be constant across every tilesets glGenTextures(1, &m_maskOverlay); uint8_t dummydata[3] = {127, 127, 127}; glBindTexture(GL_TEXTURE_2D, m_maskOverlay); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, dummydata); } else { glBindTexture(GL_TEXTURE_2D, m_maskOverlay); } m_state.texture[1] = m_maskOverlay; // Texture Unit 1 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE); glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE); // Arg0 glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_TEXTURE0); glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_TEXTURE0); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); // The alpha component is taken only from 0th tex unit which is // Arg0 in our case, therefore we doesn't need to set operands // and sources for the rest of arguments // Arg1 glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_CONSTANT); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR); // Arg2 // uses alpha part of environmental color as interpolation factor glTexEnvi(GL_TEXTURE_ENV, GL_SRC2_RGB, GL_CONSTANT); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB, GL_SRC_ALPHA); glDisable(GL_TEXTURE_2D); // Texture Unit 2 glClientActiveTexture(GL_TEXTURE2); glActiveTexture(GL_TEXTURE2); glEnable(GL_TEXTURE_2D); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE); glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE); // Arg0 glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_TEXTURE0); glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_TEXTURE2); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); // The alpha component is taken only from 0th tex unit which is // Arg0 in our case, therefore we doesn't need to set operands // and sources for the rest of arguments // Arg1 glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_CONSTANT); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR); // Arg2 // uses alpha part of environmental color as interpolation factor glTexEnvi(GL_TEXTURE_ENV, GL_SRC2_RGB, GL_CONSTANT); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB, GL_SRC_ALPHA); glDisable(GL_TEXTURE_2D); // Texture Unit 3 glClientActiveTexture(GL_TEXTURE3); glActiveTexture(GL_TEXTURE3); glEnable(GL_TEXTURE_2D); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE); glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE); // Arg0 glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_TEXTURE0); glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_TEXTURE3); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); // The alpha component is taken only from 3th tex unit which is // Arg0 in our case, therefore we doesn't need to set operands // and sources for the rest of arguments // Arg1 glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_TEXTURE3); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR); // Arg2 // uses alpha part of environmental color as interpolation factor glTexEnvi(GL_TEXTURE_ENV, GL_SRC2_RGB, GL_CONSTANT); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB, GL_SRC_ALPHA); // Return to normal sampling mode glDisable(GL_TEXTURE_2D); glActiveTexture(GL_TEXTURE0); m_state.active_tex = 0; glClientActiveTexture(GL_TEXTURE0); m_state.active_client_tex = 0; // For now it's unneecessary - Only needed if we intend to use the next texture unit in different case //glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); } void RenderBackendOpenGL::captureScreen(const std::string& filename) { const uint32_t swidth = getWidth(); const uint32_t sheight = getHeight(); uint8_t *pixels; SDL_Surface *surface = SDL_CreateRGBSurface(0, swidth, sheight, 24, RMASK, GMASK, BMASK, NULLMASK); if (!surface) { return; } SDL_LockSurface(surface); pixels = new uint8_t[swidth * sheight * 3]; glReadPixels(0, 0, swidth, sheight, GL_RGB, GL_UNSIGNED_BYTE, reinterpret_cast(pixels)); uint8_t *imagepixels = reinterpret_cast(surface->pixels); // Copy the "reversed_image" memory to the "image" memory for (int32_t y = (sheight - 1); y >= 0; --y) { uint8_t *rowbegin = pixels + y * swidth * 3; uint8_t *rowend = rowbegin + swidth * 3; std::copy(rowbegin, rowend, imagepixels); // Advance a row in the output surface. imagepixels += surface->pitch; } SDL_UnlockSurface(surface); Image::saveAsPng(filename, *surface); SDL_FreeSurface(surface); delete[] pixels; } void RenderBackendOpenGL::captureScreen(const std::string& filename, uint32_t width, uint32_t height) { const uint32_t swidth = getWidth(); const uint32_t sheight = getHeight(); const bool same_size = (width == swidth && height == sheight); if (width < 1 || height < 1) { return; } if (same_size) { captureScreen(filename); return; } uint8_t *pixels; // create source surface SDL_Surface* src = SDL_CreateRGBSurface(0, swidth, sheight, 32, RMASK, GMASK, BMASK, AMASK); if (!src) { return; } if (SDL_MUSTLOCK(src)) { SDL_LockSurface(src); } pixels = new uint8_t[swidth * sheight * 4]; glReadPixels(0, 0, swidth, sheight, GL_RGBA, GL_UNSIGNED_BYTE, reinterpret_cast(pixels)); uint8_t* imagepixels = reinterpret_cast(src->pixels); // Copy the "reversed_image" memory to the "image" memory for (int32_t y = (sheight - 1); y >= 0; --y) { uint8_t *rowbegin = pixels + y * swidth * 4; uint8_t *rowend = rowbegin + swidth * 4; std::copy(rowbegin, rowend, imagepixels); // Advance a row in the output surface. imagepixels += src->pitch; } // create destination surface SDL_Surface* dst = SDL_CreateRGBSurface(0, width, height, 32, RMASK, GMASK, BMASK, AMASK); uint32_t* src_pointer = static_cast(src->pixels); uint32_t* src_help_pointer = src_pointer; uint32_t* dst_pointer = static_cast(dst->pixels); int32_t x, y, *sx_ca, *sy_ca; int32_t sx = static_cast(0xffff * src->w / dst->w); int32_t sy = static_cast(0xffff * src->h / dst->h); int32_t sx_c = 0; int32_t sy_c = 0; // Allocates memory and calculates row wide&height int32_t* sx_a = new int32_t[dst->w + 1]; sx_ca = sx_a; for (x = 0; x <= dst->w; x++) { *sx_ca = sx_c; sx_ca++; sx_c &= 0xffff; sx_c += sx; } int32_t* sy_a = new int32_t[dst->h + 1]; sy_ca = sy_a; for (y = 0; y <= dst->h; y++) { *sy_ca = sy_c; sy_ca++; sy_c &= 0xffff; sy_c += sy; } sy_ca = sy_a; // Transfers the image data if (SDL_MUSTLOCK(dst)) { SDL_LockSurface(dst); } for (y = 0; y < dst->h; y++) { src_pointer = src_help_pointer; sx_ca = sx_a; for (x = 0; x < dst->w; x++) { *dst_pointer = *src_pointer; sx_ca++; src_pointer += (*sx_ca >> 16); dst_pointer++; } sy_ca++; src_help_pointer = (uint32_t*)((uint8_t*)src_help_pointer + (*sy_ca >> 16) * src->pitch); } if (SDL_MUSTLOCK(dst)) { SDL_UnlockSurface(dst); } if (SDL_MUSTLOCK(src)) { SDL_UnlockSurface(src); } Image::saveAsPng(filename, *dst); // Free memory SDL_FreeSurface(src); SDL_FreeSurface(dst); delete[] sx_a; delete[] sy_a; delete[] pixels; } void RenderBackendOpenGL::setClipArea(const Rect& cliparea, bool clear) { glScissor(cliparea.x, getHeight() - cliparea.y - cliparea.h, cliparea.w, cliparea.h); if (clear) { if (m_isbackgroundcolor) { float red = float(m_backgroundcolor.r/255.0); float green = float(m_backgroundcolor.g/255.0); float blue = float(m_backgroundcolor.b/255.0); glClearColor(red, green, blue, 0.0); m_isbackgroundcolor = false; } glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); } } void RenderBackendOpenGL::attachRenderTarget(ImagePtr& img, bool discard) { // flush down what we batched for the old target renderVertexArrays(); m_img_target = img; m_target_discard = discard; // to render on something, we need to make sure its loaded already in gpu memory m_img_target->forceLoadInternal(); m_target = m_img_target->getSurface(); GLImage* glimage = static_cast(m_img_target.get()); GLuint targetid = glimage->getTexId(); uint32_t w = m_img_target->getWidth(); uint32_t h = m_img_target->getHeight(); // quick & dirty hack for attaching compressed texture if(glimage->isCompressed()) { bindTexture(targetid); GLubyte* pixels = new GLubyte[w*h*4]; // here we get decompressed pixels glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels); delete [] pixels; glimage->setCompressed(false); } // can we use fbo? if (GLEW_EXT_framebuffer_object && m_useframebuffer) { glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo_id); glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, targetid, 0); // currenty unused, is needed in case the static layers should be rendered with depth buffer (instead of sorting) // see LayerCache //glBindRenderbuffer(GL_RENDERBUFFER, m_depthbuffer_id); //glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, w, h); //glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_depthbuffer_id); } glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); // invert top with bottom glOrtho(0, w, 0, h, -100, 100); glMatrixMode(GL_MODELVIEW); // because of inversion 2 lines above we need to also invert culling faces glCullFace(GL_FRONT); if (m_target_discard) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); } else if (!m_target_discard && (!GLEW_EXT_framebuffer_object || !m_useframebuffer)) { // if we wanna just add something to render target, we need to first render previous contents addImageToArray(targetid, m_img_target->getArea(), static_cast(m_img_target.get())->getTexCoords(), 255, 0); } } void RenderBackendOpenGL::detachRenderTarget() { assert(m_target != m_screen); // flush down what we batched renderVertexArrays(); if (GLEW_EXT_framebuffer_object && m_useframebuffer) { glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); } else { bindTexture(0, static_cast(m_img_target.get())->getTexId()); glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 0, 0, m_img_target->getWidth(), m_img_target->getHeight(), 0); } m_target = m_screen; glViewport(0, 0, m_screen->w, m_screen->h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0, m_screen->w, m_screen->h, 0, -100, 100); glMatrixMode(GL_MODELVIEW); glCullFace(GL_BACK); } void RenderBackendOpenGL::renderGuiGeometry(const std::vector& vertices, const std::vector& indices, const DoublePoint& translation, ImagePtr texture) { glPushMatrix(); glTranslatef(translation.x, translation.y, 0); glVertexPointer(2, GL_DOUBLE, sizeof(GuiVertex), &vertices[0].position); glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(GuiVertex), &vertices[0].color); GLuint texId = 0; GLImage* glImage = dynamic_cast(texture.get()); if(glImage) { glImage->forceLoadInternal(); texId = glImage->getTexId(); } if(texId == 0) { glDisable(GL_TEXTURE_2D); glDisableClientState(GL_TEXTURE_COORD_ARRAY); } else { glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, texId); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glTexCoordPointer(2, GL_DOUBLE, sizeof(GuiVertex), &vertices[0].texCoords); } glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_INT, &indices[0]); glPopMatrix(); } } fifengine-0.4.2/engine/core/video/opengl/renderbackendopengl.h000066400000000000000000000271671341615052600244230ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_VIDEO_RENDERBACKENSD_OPENGL_RENDERBACKENDOPENGL_H #define FIFE_VIDEO_RENDERBACKENSD_OPENGL_RENDERBACKENDOPENGL_H // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "video/renderbackend.h" #include "fife_opengl.h" namespace FIFE { class ScreenMode; /** The main class of the OpenGL-based renderer. * @see RenderBackend */ class RenderBackendOpenGL : public RenderBackend { public: RenderBackendOpenGL(const SDL_Color& colorkey); virtual ~RenderBackendOpenGL(); virtual const std::string& getName() const; virtual void startFrame(); virtual void endFrame(); virtual void init(const std::string& driver); virtual void clearBackBuffer(); virtual void setLightingModel(uint32_t lighting); virtual uint32_t getLightingModel() const; virtual void setLighting(float red, float green, float blue); virtual void resetLighting(); virtual void resetStencilBuffer(uint8_t buffer); virtual void changeBlending(int32_t scr, int32_t dst); virtual void createMainScreen(const ScreenMode& mode, const std::string& title, const std::string& icon); virtual void setScreenMode(const ScreenMode& mode); virtual Image* createImage(IResourceLoader* loader = 0); virtual Image* createImage(const std::string& name, IResourceLoader* loader = 0); virtual Image* createImage(const uint8_t* data, uint32_t width, uint32_t height); virtual Image* createImage(const std::string& name, const uint8_t* data, uint32_t width, uint32_t height); virtual Image* createImage(SDL_Surface* surface); virtual Image* createImage(const std::string& name, SDL_Surface* surface); virtual void renderVertexArrays(); virtual void addImageToArray(uint32_t id, const Rect& rec, float const* st, uint8_t alpha, uint8_t const* rgba); virtual void addImageToArray(const Rect& rect, uint32_t id1, float const* st1, uint32_t id2, float const* st2, uint8_t alpha, uint8_t const* rgba); virtual void addImageToArrayZ(uint32_t id, const Rect& rect, float vertexZ, float const* st, uint8_t alpha, uint8_t const* rgba); virtual void addImageToArrayZ(const Rect& rect, float vertexZ, uint32_t id1, float const* st1, uint32_t id2, float const* st2, uint8_t alpha, uint8_t const* rgba); virtual void changeRenderInfos(RenderDataType type, uint16_t elements, int32_t src, int32_t dst, bool light, bool stentest, uint8_t stenref, GLConstants stenop, GLConstants stenfunc, OverlayType otype = OVERLAY_TYPE_NONE); virtual void captureScreen(const std::string& filename); virtual void captureScreen(const std::string& filename, uint32_t width, uint32_t height); virtual bool putPixel(int32_t x, int32_t y, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255); virtual void drawLine(const Point& p1, const Point& p2, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255); virtual void drawThickLine(const Point& p1, const Point& p2, uint8_t width, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255); virtual void drawPolyLine(const std::vector& points, uint8_t width, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255); virtual void drawBezier(const std::vector& points, int32_t steps, uint8_t width, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255); virtual void drawTriangle(const Point& p1, const Point& p2, const Point& p3, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255); virtual void drawRectangle(const Point& p, uint16_t w, uint16_t h, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255); virtual void fillRectangle(const Point& p, uint16_t w, uint16_t h, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255); virtual void drawQuad(const Point& p1, const Point& p2, const Point& p3, const Point& p4, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255); virtual void drawVertex(const Point& p, const uint8_t size, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255); virtual void drawCircle(const Point& p, uint32_t radius, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255); virtual void drawFillCircle(const Point& p, uint32_t radius, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255); virtual void drawCircleSegment(const Point& p, uint32_t radius, int32_t sangle, int32_t eangle, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255); virtual void drawFillCircleSegment(const Point& p, uint32_t radius, int32_t sangle, int32_t eangle, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255); virtual void drawLightPrimitive(const Point& p, uint8_t intensity, float radius, int32_t subdivisions, float xstretch, float ystretch, uint8_t red, uint8_t green, uint8_t blue); virtual void enableScissorTest(); virtual void disableScissorTest(); virtual void attachRenderTarget(ImagePtr& img, bool discard); virtual void detachRenderTarget(); virtual void renderGuiGeometry(const std::vector& vertices, const std::vector& indices, const DoublePoint& translation, ImagePtr texture); void enableTextures(uint32_t texUnit); void disableTextures(uint32_t texUnit); void bindTexture(uint32_t texUnit, GLuint texId); void bindTexture(GLuint textId); protected: virtual void setClipArea(const Rect& cliparea, bool clear); void enableLighting(); void disableLighting(); void enableStencilTest(); void disableStencilTest(); void setStencilTest(uint8_t stencil_ref, GLenum stencil_op, GLenum stencil_func); uint8_t getStencilRef() const; void enableAlphaTest(); void disableAlphaTest(); void setAlphaTest(float ref_alpha); void enableDepthTest(); void disableDepthTest(); void enableColorArray(); void disableColorArray(); void setEnvironmentalColor(uint32_t texUnit, const uint8_t* rgba); void setVertexPointer(GLint size, GLsizei stride, const GLvoid* ptr); void setColorPointer(GLsizei stride, const GLvoid* ptr); void setTexCoordPointer(uint32_t texUnit, GLsizei stride, const GLvoid* ptr); GLuint m_maskOverlay; void prepareForOverlays(); void renderWithoutZ(); void renderWithZ(); void renderWithZTest(); void renderWithColorAndZ(); void renderWithMultitextureAndZ(); class RenderObject; struct RenderZObject { GLuint texture_id; //uint32_t elements; }; // for regular primitives with color and alpha struct renderDataP { GLfloat vertex[2]; GLubyte color[4]; }; // for regular textured quads struct renderDataT { GLfloat vertex[2]; GLfloat texel[2]; }; // for textured quads with alpha struct renderDataTC { GLfloat vertex[2]; GLfloat texel[2]; GLubyte color[4]; }; // for multitextured quads struct renderData2TC { GLfloat vertex[2]; GLfloat texel[2]; GLfloat texel2[2]; GLubyte color[4]; }; // for regular textured quads with z struct renderDataZ { GLfloat vertex[3]; GLfloat texel[2]; }; // for textured quads with alpha and z struct renderDataColorZ { GLfloat vertex[3]; GLfloat texel[2]; GLubyte color[4]; }; // for multitextured quads with z struct renderData2TCZ { GLfloat vertex[3]; GLfloat texel[2]; GLfloat texel2[2]; GLubyte color[4]; }; struct RenderZObjectTest { GLuint texture_id; uint32_t elements; uint32_t index; uint32_t max_size; }; RenderZObjectTest* getRenderBufferObject(GLuint texture_id); std::vector m_renderZ_datas; std::vector m_renderZ_objects; // Vertex data structs that dont use the depth buffer / z // vertex data source for primitives that dont use depth buffer and texture - described by m_renderObjects std::vector m_renderPrimitiveDatas; // vertex data source for textured quads that dont use depth buffer and color/alpha - described by m_renderObjects std::vector m_renderTextureDatas; // vertex data source for textured quads with color/alpha that dont use depth buffer - described by m_renderObjects std::vector m_renderTextureColorDatas; // // vertex data source for multitexture quads that dont use depth buffer - described by m_renderObjects std::vector m_renderMultitextureDatas; std::vector m_renderObjects; // Dynamic index buffers std::vector m_pIndices; std::vector m_tIndices; std::vector m_tcIndices; std::vector m_tc2Indices; // Now the vertex data that do use the depth buffer / z // vertex data source for textured quads that do use depth buffer but no color/alpha - described by m_renderTextureObjectsZ std::vector m_renderTextureDatasZ; std::vector m_renderTextureObjectsZ; // vertex data source for textured quads that do use depth buffer and color/alpha - described by m_renderTextureColorObjectsZ std::vector m_renderTextureColorDatasZ; std::vector m_renderTextureColorObjectsZ; // vertex data source for multitexture quads that do use depth buffer - described by m_renderMultitextureObjectsZ std::vector m_renderMultitextureDatasZ; std::vector m_renderMultitextureObjectsZ; // vertex data source for other stuff, unlit quads like outlines and unlit demanded instances - described by m_renderForcedObjectsZ std::vector m_renderForcedDatasZ; std::vector m_renderForcedObjectsZ; struct currentState { // Textures bool tex_enabled[4]; GLuint texture[4]; uint32_t active_tex; uint32_t active_client_tex; float alpha_test; GLint vertex_pointer_size; // Pointers const void* vertex_pointer; const void* tex_pointer[4]; const void* color_pointer; // Stencil bool sten_enabled; uint8_t sten_ref; GLint sten_buf; GLenum sten_op; GLenum sten_func; // Light uint32_t lightmodel; bool light_enabled; // The rest uint8_t env_color[4]; GLenum blend_src; GLenum blend_dst; bool alpha_enabled; bool scissor_test; bool depth_enabled; bool color_enabled; } m_state; GLuint m_fbo_id; GLuint m_indicebufferId; //! static indices for vertex data with z std::vector m_indices; ImagePtr m_img_target; bool m_target_discard; SDL_GLContext m_context; }; } #endif fifengine-0.4.2/engine/core/video/renderbackend.cpp000066400000000000000000000231511341615052600222520ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "renderbackend.h" #include "video/devicecaps.h" namespace FIFE { RenderBackend::RenderBackend(const SDL_Color& colorkey): m_window(NULL), m_screen(NULL), m_target(NULL), m_compressimages(false), m_useframebuffer(false), m_usenpot(false), m_isalphaoptimized(false), m_iscolorkeyenabled(false), m_colorkey(colorkey), m_isMipmapping(false), m_textureFilter(TEXTURE_FILTER_NONE), m_maxAnisotropy(0), m_monochrome(false), m_isDepthBuffer(false), m_alphaValue(0.3), m_vSync(false), m_isframelimit(false), m_frame_start(0), m_framelimit(60) { m_isbackgroundcolor = false; m_backgroundcolor.r = 0; m_backgroundcolor.g = 0; m_backgroundcolor.b = 0; } RenderBackend::~RenderBackend() { } void RenderBackend::deinit() { SDL_QuitSubSystem(SDL_INIT_VIDEO); SDL_Quit(); } void RenderBackend::startFrame() { if (m_isframelimit) { m_frame_start = SDL_GetTicks(); } } void RenderBackend::endFrame () { if (m_isframelimit) { uint16_t frame_time = SDL_GetTicks() - m_frame_start; const float frame_limit = 1000.0f/m_framelimit; if (frame_time < frame_limit) { SDL_Delay(static_cast(frame_limit) - frame_time); } } } const ScreenMode& RenderBackend::getCurrentScreenMode() const{ return m_screenMode; } uint32_t RenderBackend::getWidth() const { return m_screen->w; } uint32_t RenderBackend::getHeight() const { return m_screen->h; } const Rect& RenderBackend::getArea() const { static Rect r(0, 0, m_screen->w, m_screen->h); return r; } void RenderBackend::pushClipArea(const Rect& cliparea, bool clear) { ClipInfo ci; ci.r = cliparea; ci.clearing = clear; m_clipstack.push(ci); setClipArea(cliparea, clear); } void RenderBackend::popClipArea() { assert(!m_clipstack.empty()); m_clipstack.pop(); if (m_clipstack.empty()) { setClipArea(getArea(), false); } else { ClipInfo ci = m_clipstack.top(); // instead of using ci.clearing, we set it to false // to avoid double clearing setClipArea(ci.r, false); } } const Rect& RenderBackend::getClipArea() const { if (!m_clipstack.empty()) { return m_clipstack.top().r; } else { return getArea(); } } void RenderBackend::clearClipArea() { setClipArea(getArea(), true); } void RenderBackend::setTextureFiltering(TextureFiltering filter) { m_textureFilter = filter; } TextureFiltering RenderBackend::getTextureFiltering() const { return m_textureFilter; } void RenderBackend::setMipmappingEnabled(bool enabled) { m_isMipmapping = enabled; } bool RenderBackend::isMipmappingEnabled() const { return m_isMipmapping; } int32_t RenderBackend::getMaxAnisotropy() const { return m_maxAnisotropy; } void RenderBackend::setMonochromeEnabled(bool enabled) { m_monochrome = enabled; } bool RenderBackend::isMonochromeEnabled() const { return m_monochrome; } void RenderBackend::setDepthBufferEnabled(bool enabled) { m_isDepthBuffer = enabled; } bool RenderBackend::isDepthBufferEnabled() const { return m_isDepthBuffer; } void RenderBackend::setAlphaTestValue(float alpha) { m_alphaValue = alpha; } float RenderBackend::getAlphaTestValue() const { return m_alphaValue; } void RenderBackend::setColorKeyEnabled(bool colorkeyenable) { m_iscolorkeyenabled = colorkeyenable; } bool RenderBackend::isColorKeyEnabled() const { return m_iscolorkeyenabled; } void RenderBackend::setColorKey(const SDL_Color& colorkey) { m_colorkey = colorkey; } const SDL_Color& RenderBackend::getColorKey() const { return m_colorkey; } void RenderBackend::setBackgroundColor(uint8_t r, uint8_t g, uint8_t b) { if (r != m_backgroundcolor.r || g != m_backgroundcolor.g || b != m_backgroundcolor.b) { m_isbackgroundcolor = true; m_backgroundcolor.r = r; m_backgroundcolor.g = g; m_backgroundcolor.b = b; } } void RenderBackend::resetBackgroundColor() { setBackgroundColor(0,0,0); } const SDL_PixelFormat& RenderBackend::getPixelFormat() const { return m_rgba_format; } void RenderBackend::setVSyncEnabled(bool vsync) { m_vSync = vsync; } bool RenderBackend::isVSyncEnabled() const { return m_vSync; } void RenderBackend::setFrameLimitEnabled(bool limited) { m_isframelimit = limited; } bool RenderBackend::isFrameLimitEnabled() const { return m_isframelimit; } void RenderBackend::setFrameLimit(uint16_t framelimit) { m_framelimit = framelimit; } uint16_t RenderBackend::getFrameLimit() const { return m_framelimit; } SDL_Surface* RenderBackend::getScreenSurface() { return m_screen; } SDL_Surface* RenderBackend::getRenderTargetSurface() { return m_target; } Point RenderBackend::getBezierPoint(const std::vector& points, int32_t elements, float t) { if (t < 0.0) { return points[0]; } else if (t >= static_cast(elements)) { return points.back(); } // Interpolate double px = 0.0; double py = 0.0; int32_t n = elements - 1; double muk = 1.0; double mu = static_cast(t) / static_cast(elements); double munk = Mathd::Pow(1.0 - mu, static_cast(n)); for (int32_t i = 0; i <= n; ++i) { int32_t tmpn = n; int32_t tmpi = i; int32_t diffn = n - i; double blend = muk * munk; muk *= mu; munk /= 1.0 - mu; while (tmpn) { blend *= static_cast(tmpn); tmpn--; if (tmpi > 1) { blend /= static_cast(tmpi); tmpi--; } if (diffn > 1) { blend /= static_cast(diffn); diffn--; } } px += static_cast(points[i].x) * blend; py += static_cast(points[i].y) * blend; } return Point(static_cast(px), static_cast(py)); } void RenderBackend::addControlPoints(const std::vector& points, std::vector& newPoints) { if (points.empty()) { return; } int32_t n = points.size() - 1; // min 2 points if (n < 1) { return; } Point p; // straight line if (n == 1) { newPoints.push_back(points[0]); p.x = (2 * points[0].x + points[1].x) / 3; p.y = (2 * points[0].y + points[1].y) / 3; newPoints.push_back(p); p.x = 2 * p.x - points[0].x; p.y = 2 * p.y - points[0].y; newPoints.push_back(p); newPoints.push_back(points[1]); return; } // calculate x and y values float* xrhs = new float[n]; float* yrhs = new float[n]; // first xrhs[0] = points[0].x + 2 * points[1].x; yrhs[0] = points[0].y + 2 * points[1].y; // last xrhs[n - 1] = (8 * points[n - 1].x + points[n].x) / 2.0; yrhs[n - 1] = (8 * points[n - 1].y + points[n].y) / 2.0; // rest for (int32_t i = 1; i < n - 1; ++i) { xrhs[i] = 4 * points[i].x + 2 * points[i + 1].x; yrhs[i] = 4 * points[i].y + 2 * points[i + 1].y; } float* x = new float[n]; float* y = new float[n]; float* xtmp = new float[n]; float* ytmp = new float[n]; float xb = 2.0; float yb = 2.0; x[0] = xrhs[0] / xb; y[0] = yrhs[0] / yb; // Decomposition and forward substitution. for (int32_t i = 1; i < n; i++) { xtmp[i] = 1 / xb; ytmp[i] = 1 / yb; xb = (i < n - 1 ? 4.0 : 3.5) - xtmp[i]; yb = (i < n - 1 ? 4.0 : 3.5) - ytmp[i]; x[i] = (xrhs[i] - x[i - 1]) / xb; y[i] = (yrhs[i] - y[i - 1]) / yb; } // Backward substitution for (int32_t i = 1; i < n; i++) { x[n - i - 1] -= xtmp[n - i] * x[n - i]; y[n - i - 1] -= ytmp[n - i] * y[n - i]; } // start point newPoints.push_back(points[0]); for (int32_t i = 0; i < n - 1; ++i) { p.x = x[i]; p.y = y[i]; newPoints.push_back(p); p.x = 2 * points[i + 1].x - x[i + 1]; p.y = 2 * points[i + 1].y - y[i + 1]; newPoints.push_back(p); newPoints.push_back(points[i+1]); } p.x = x[n - 1]; p.y = y[n - 1]; newPoints.push_back(p); p.x = (points[n].x + x[n - 1]) / 2; p.y = (points[n].y + y[n - 1]) / 2; newPoints.push_back(p); // end point newPoints.push_back(points[n]); delete[] xrhs; delete[] yrhs; delete[] x; delete[] y; delete[] xtmp; delete[] ytmp; } } fifengine-0.4.2/engine/core/video/renderbackend.h000066400000000000000000000407551341615052600217300ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_VIDEO_RENDERBACKEND_H #define FIFE_VIDEO_RENDERBACKEND_H // Standard C++ library includes #include #include // Platform specific includes #include "util/base/fife_stdint.h" // 3rd party library includes #include #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/singleton.h" #include "util/structures/point.h" #include "util/structures/rect.h" #include "video/devicecaps.h" #include "image.h" #include "color.h" #ifdef HAVE_OPENGL #include "video/opengl/fife_opengl.h" #endif namespace FIFE { class Image; #ifdef HAVE_OPENGL enum GLConstants { KEEP = GL_KEEP, ZERO = GL_ZERO, REPLACE = GL_REPLACE, INCR = GL_INCR, DECR = GL_DECR, INVERT = GL_INVERT, NEVER = GL_NEVER, LESS = GL_LESS, LEQUAL = GL_LEQUAL, GREATER = GL_GREATER, GEQUAL = GL_GEQUAL, EQUAL = GL_EQUAL, NOTEQUAL = GL_NOTEQUAL, ALWAYS = GL_ALWAYS }; #else enum GLConstants { KEEP = 0, ZERO, REPLACE, INCR, DECR, INVERT, NEVER, LESS, LEQUAL, GREATER, GEQUAL, EQUAL, NOTEQUAL, ALWAYS }; #endif enum OverlayType { OVERLAY_TYPE_NONE = 0, OVERLAY_TYPE_COLOR = 1, OVERLAY_TYPE_COLOR_AND_TEXTURE = 2, OVERLAY_TYPE_TEXTURES_AND_FACTOR = 3 }; enum TextureFiltering { TEXTURE_FILTER_NONE = 0, TEXTURE_FILTER_BILINEAR = 1, TEXTURE_FILTER_TRILINEAR = 2, TEXTURE_FILTER_ANISOTROPIC = 3 }; enum RenderDataType { RENDER_DATA_WITHOUT_Z = 0, RENDER_DATA_TEXTURE_Z = 1, RENDER_DATA_TEXCOLOR_Z = 2, RENDER_DATA_MULTITEXTURE_Z = 3 }; class GuiVertex { public: DoublePoint position; Color color; DoublePoint texCoords; }; /** Abstract interface for all the renderbackends. */ class RenderBackend: public DynamicSingleton { public: /** Constructor. * @param colorkey The colorkey to use. */ RenderBackend(const SDL_Color& colorkey); /** Destructor. */ virtual ~RenderBackend(); /** The name of the renderbackend. * @return The name of this renderbackend. */ virtual const std::string& getName() const = 0; /** Called when a new frame starts. */ virtual void startFrame(); /** Called when a frame is finished and ready to be displayed. */ virtual void endFrame(); /** Initializes the backend. */ virtual void init(const std::string& driver) = 0; /** Forces a clear of the backbuffer */ virtual void clearBackBuffer() = 0; /** Initializes the light. */ virtual void setLightingModel(uint32_t lighting) = 0; /** Gets the current light model. */ virtual uint32_t getLightingModel() const = 0; /** Set colors for lighting */ virtual void setLighting(float red, float green, float blue) = 0; /** Reset lighting with default values. */ virtual void resetLighting() = 0; /** Reset stencil buffer with given value. */ virtual void resetStencilBuffer(uint8_t buffer) = 0; /** Change the Blendingmodel. */ virtual void changeBlending(int32_t scr, int32_t dst) = 0; /** Performs cleanup actions. */ void deinit(); /** Creates the mainscreen (the display window). * @param mode The ScreenMode to use. @see FIFE::ScreenMode. * @param title The window title to use. * @param icon The window icon to use. */ virtual void createMainScreen(const ScreenMode& mode, const std::string& title, const std::string& icon) = 0; /** Sets the mainscreen display mode. * @param mode The ScreenMode to change the display to. @see FIFE::ScreenMode. */ virtual void setScreenMode(const ScreenMode& mode) = 0; virtual Image* createImage(IResourceLoader* loader = 0) = 0; virtual Image* createImage(const std::string& name, IResourceLoader* loader = 0) = 0; /** Creates an Image suitable for this renderbackend. * @param data Pointer to the imagedata (needs to be in RGBA, 8 bits per channel). * @param width Width of the image. * @param height Height of the image. * @return The new Image. */ virtual Image* createImage(const uint8_t* data, uint32_t width, uint32_t height) = 0; virtual Image* createImage(const std::string& name, const uint8_t* data, uint32_t width, uint32_t height) = 0; /** Helper function to create images from SDL_Surfaces. * Takes ownership over the surface. * @param surface The surface to convert. * @return The new Image. */ virtual Image* createImage(SDL_Surface* surface) = 0; virtual Image* createImage(const std::string& name, SDL_Surface* surface) = 0; /** Render the Vertex Arrays, only for primitives (points, lines,...) */ virtual void renderVertexArrays() = 0; /** Add the Image data to the array */ virtual void addImageToArray(uint32_t id, const Rect& rec, float const* st, uint8_t alpha, uint8_t const* rgba) = 0; /** Dirty helper function to change the render infos */ virtual void changeRenderInfos(RenderDataType type, uint16_t elements, int32_t src, int32_t dst, bool light, bool stentest, uint8_t stenref, GLConstants stenop, GLConstants stenfunc, OverlayType otype = OVERLAY_TYPE_NONE) = 0; /** Creates a Screenshot and saves it to a file. */ virtual void captureScreen(const std::string& filename) = 0; /** Creates a Screenshot with the given size(w,h) and saves it to a file. */ virtual void captureScreen(const std::string& filename, uint32_t width, uint32_t height) = 0; SDL_Window* getWindow() {return m_window; } /** Get current screen mode * @return The current screen mode */ const ScreenMode& getCurrentScreenMode() const; uint32_t getWidth() const; uint32_t getHeight() const; uint32_t getScreenWidth() const { return getWidth(); } uint32_t getScreenHeight() const { return getHeight(); } const Rect& getArea() const; /** Pushes clip area to clip stack * Clip areas define which area is drawn on screen. Usable e.g. with viewports * note that previous items in stack do not affect the latest area pushed */ void pushClipArea(const Rect& cliparea, bool clear=true); /** Pops clip area from clip stack * @see pushClipArea */ void popClipArea(); /** Gets the current clip area * @see pushClipArea */ const Rect& getClipArea() const; /** Writes pixel to given position. Returns true, if pixel was written (not out of bounds) */ virtual bool putPixel(int32_t x, int32_t y, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255) = 0; /** Draws line between given points with given RGBA */ virtual void drawLine(const Point& p1, const Point& p2, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255) = 0; /** Draws line between given points with given RGBA and width. */ virtual void drawThickLine(const Point& p1, const Point& p2, uint8_t width, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255) = 0; /** Draws lines between given points with given RGBA and width. */ virtual void drawPolyLine(const std::vector& points, uint8_t width, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255) = 0; /** Draws bezier curve between given points with given RGBA and width. */ virtual void drawBezier(const std::vector& points, int32_t steps, uint8_t width, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255) = 0; /** Draws triangle between given points with given RGBA */ virtual void drawTriangle(const Point& p1, const Point& p2, const Point& p3, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255) = 0; /** Draws an axis parallel rectangle. */ virtual void drawRectangle(const Point& p, uint16_t w, uint16_t h, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255) = 0; /** Draws a filled axis parallel rectangle. */ virtual void fillRectangle(const Point& p, uint16_t w, uint16_t h, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255) = 0; /** Draws quad between given points with given RGBA */ virtual void drawQuad(const Point& p1, const Point& p2, const Point& p3, const Point& p4, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255) = 0; /** Draws a quad that represents a vertex with given RGBA */ virtual void drawVertex(const Point& p, const uint8_t size, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255) = 0; /** Draws a circle. */ virtual void drawCircle(const Point& p, uint32_t radius, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255) = 0; /** Draws a filled circle. */ virtual void drawFillCircle(const Point& p, uint32_t radius, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255) = 0; /** Draws a circle segment. * Note: The start angle must be less than the end angle. 0 angle is right side. */ virtual void drawCircleSegment(const Point& p, uint32_t radius, int32_t sangle, int32_t eangle, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255) = 0; /** Draws a filled circle segment. 0 angle is right side. * Note: The start angle must be less than the end angle. */ virtual void drawFillCircleSegment(const Point& p, uint32_t radius, int32_t sangle, int32_t eangle, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255) = 0; /** Draws a light primitive that based on a triangle fan */ virtual void drawLightPrimitive(const Point& p, uint8_t intensity, float radius, int32_t subdivisions, float xstretch, float ystretch, uint8_t red, uint8_t green, uint8_t blue) = 0; /** Enables scissor test on the render backend. */ virtual void enableScissorTest() = 0; /** Disables scissor test on the render backend. */ virtual void disableScissorTest() = 0; /** Enable or disable the alpha 'optimizing' code * * @param enabled Optimize whether the image shall be analysed for 'fake' alpha images. * Only implemented by and useful for the SDL backend at the moment. */ void setAlphaOptimizerEnabled(bool enabled){ m_isalphaoptimized = enabled; } /** @see setAlphaOptimizerEnabled */ bool isAlphaOptimizerEnabled() const { return m_isalphaoptimized; } /** Enables or disable compressing images by video driver. * @remarks This is relevant for in OpenGL renderbackend */ void setImageCompressingEnabled(bool enabled) { m_compressimages = enabled; } /** @see setImageCompressingEnabled */ bool isImageCompressingEnabled() const { return m_compressimages; } /** Enables or disable the usage of the framebuffer, if available */ void setFramebufferEnabled(bool enabled) { m_useframebuffer = enabled; } /** @see setFramebufferEnabled */ bool isFramebufferEnabled() const { return m_useframebuffer; } /** Enables or disable the usage of npot, if available */ void setNPOTEnabled(bool enabled) { m_usenpot = enabled; } /** @see setNPOTEnabled */ bool isNPOTEnabled() const { return m_usenpot; } /** Sets the texture filtering method. * Supports none, bilinear, trilinear and anisotropic filtering. * Note! Works only for OpenGL backends. * @see TextureFiltering */ void setTextureFiltering(TextureFiltering filter); /** @see setTextureFiltering */ TextureFiltering getTextureFiltering() const; /** Enables or disables the usage of mipmapping. * Note! Works only for OpenGL backends. */ void setMipmappingEnabled(bool enabled); /** @see setMipmappingEnabled */ bool isMipmappingEnabled() const; /** Gets max antisotropy for antisotropic filtering. */ int32_t getMaxAnisotropy() const; /** Enables or disables monochrome rendering. * Note! Works only for OpenGL backends. */ void setMonochromeEnabled(bool enabled); /** @see setMonochromeEnabled */ bool isMonochromeEnabled() const; /** Enables or disables depth buffer rendering. * Note! Works only for OpenGL backend. */ void setDepthBufferEnabled(bool enabled); /** @see setMonochromeEnabled */ bool isDepthBufferEnabled() const; /** Sets the value for alpha test. * Discards a fragment if its value is not greater. Only used if depth buffer is enabled. * Note! Works only for OpenGL backend. */ void setAlphaTestValue(float alpha); /** @see setAlphaValue */ float getAlphaTestValue() const; /** Sets whether to use the colorkey feature */ void setColorKeyEnabled(bool colorkeyenable); /** Gets whether the colorkey feature is in use */ bool isColorKeyEnabled() const; /** Sets the global colorkey to use for images */ void setColorKey(const SDL_Color& colorkey); /** Gets the global colorkey setting */ const SDL_Color& getColorKey() const; /** Set the background color */ void setBackgroundColor(uint8_t r, uint8_t g, uint8_t b); /** Reset the background color to black */ void resetBackgroundColor(); /** Gets the current screen rgba format */ const SDL_PixelFormat& getPixelFormat() const; /** Sets whether to use VSync */ void setVSyncEnabled(bool vsync); /** Gets whether VSync is in use */ bool isVSyncEnabled() const; /** Sets whether to use the frame limiter */ void setFrameLimitEnabled(bool limited); /** Gets whether the frame limiter is in use */ bool isFrameLimitEnabled() const; /** Sets the frame limit */ void setFrameLimit(uint16_t framelimit); /** Gets the frame limit */ uint16_t getFrameLimit() const; /** Returns screen render surface */ SDL_Surface* getScreenSurface(); /** Returns currently attached render surface */ SDL_Surface* getRenderTargetSurface(); /** Attaches given image as a new render surface */ virtual void attachRenderTarget(ImagePtr& img, bool discard) = 0; /** Detaches current render surface */ virtual void detachRenderTarget() = 0; /** Renders geometry required by gui. */ virtual void renderGuiGeometry(const std::vector& vertices, const std::vector& indices, const DoublePoint& translation, ImagePtr texture) = 0; /** Helper that returns an interpolated Point */ Point getBezierPoint(const std::vector& points, int32_t elements, float t); /** Helper that adds the control points for bezier curves. */ void addControlPoints(const std::vector& points, std::vector& newPoints); protected: /** Sets given clip area into image * @see pushClipArea */ virtual void setClipArea(const Rect& cliparea, bool clear) = 0; SDL_Window* m_window; SDL_Surface* m_screen; SDL_Surface* m_target; bool m_compressimages; bool m_useframebuffer; bool m_usenpot; bool m_isalphaoptimized; bool m_iscolorkeyenabled; SDL_Color m_colorkey; ScreenMode m_screenMode; SDL_PixelFormat m_rgba_format; bool m_isbackgroundcolor; SDL_Color m_backgroundcolor; // mipmapping bool m_isMipmapping; // texture filter TextureFiltering m_textureFilter; // max anisotropy int32_t m_maxAnisotropy; // monochrome rendering bool m_monochrome; // depth buffer rendering bool m_isDepthBuffer; // alpha test value float m_alphaValue; // vsync value bool m_vSync; /** Clears any possible clip areas * @see pushClipArea */ void clearClipArea(); class ClipInfo { public: Rect r; bool clearing; }; std::stack m_clipstack; ClipInfo m_guiClip; private: bool m_isframelimit; uint32_t m_frame_start; uint16_t m_framelimit; }; } #endif fifengine-0.4.2/engine/core/video/sdl/000077500000000000000000000000001341615052600175375ustar00rootroot00000000000000fifengine-0.4.2/engine/core/video/sdl/renderbackendsdl.cpp000066400000000000000000000522541341615052600235450ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // 3rd party library includes #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/exception.h" #include "util/math/fife_math.h" #include "util/log/logger.h" #include "video/devicecaps.h" #include "renderbackendsdl.h" #include "sdlimage.h" #include "SDL_image.h" namespace FIFE { /** Logger to use for this source file. * @relates Logger */ static Logger _log(LM_VIDEO); RenderBackendSDL::RenderBackendSDL(const SDL_Color& colorkey) : RenderBackend(colorkey), m_renderer(NULL) { } RenderBackendSDL::~RenderBackendSDL() { SDL_DestroyRenderer(m_renderer); SDL_DestroyWindow(m_window); deinit(); } const std::string& RenderBackendSDL::getName() const { static std::string backend_name = "SDL"; return backend_name; } void RenderBackendSDL::init(const std::string& driver) { if (SDL_InitSubSystem(SDL_INIT_VIDEO) < 0) { throw SDLException(SDL_GetError()); } if (driver != "") { if (SDL_VideoInit(driver.c_str()) < 0) { throw SDLException(SDL_GetError()); } } } void RenderBackendSDL::clearBackBuffer() { SDL_SetRenderDrawColor(m_renderer, 0, 0, 0, 255); SDL_RenderClear(m_renderer); } void RenderBackendSDL::createMainScreen(const ScreenMode& mode, const std::string& title, const std::string& icon){ setScreenMode(mode); if (m_window) { if (icon != "") { SDL_Surface *img = IMG_Load(icon.c_str()); if (img != NULL) { SDL_SetWindowIcon(m_window, img); SDL_FreeSurface(img); } } SDL_SetWindowTitle(m_window, title.c_str()); } } void RenderBackendSDL::setScreenMode(const ScreenMode& mode) { uint16_t width = mode.getWidth(); uint16_t height = mode.getHeight(); uint16_t bitsPerPixel = mode.getBPP(); uint32_t flags = mode.getSDLFlags(); // in case of recreating if (m_window) { SDL_DestroyRenderer(m_renderer); SDL_DestroyWindow(m_window); m_screen = NULL; } // create window uint8_t displayIndex = mode.getDisplay(); if (mode.isFullScreen()) { m_window = SDL_CreateWindow("", SDL_WINDOWPOS_UNDEFINED_DISPLAY(displayIndex), SDL_WINDOWPOS_UNDEFINED_DISPLAY(displayIndex), width, height, flags | SDL_WINDOW_SHOWN); } else { m_window = SDL_CreateWindow("", SDL_WINDOWPOS_CENTERED_DISPLAY(displayIndex), SDL_WINDOWPOS_CENTERED_DISPLAY(displayIndex), width, height, flags | SDL_WINDOW_SHOWN); } if (!m_window) { throw SDLException(SDL_GetError()); } // make sure the window have the right settings SDL_DisplayMode displayMode; displayMode.format = mode.getFormat(); displayMode.w = width; displayMode.h = height; displayMode.refresh_rate = mode.getRefreshRate(); if (SDL_SetWindowDisplayMode(m_window, &displayMode) != 0) { throw SDLException(SDL_GetError()); } // create renderer with given flags flags = SDL_RENDERER_ACCELERATED | SDL_RENDERER_TARGETTEXTURE; if (m_vSync) { flags |= SDL_RENDERER_PRESENTVSYNC; } m_renderer = SDL_CreateRenderer(m_window, mode.getRenderDriverIndex(), flags); if (!m_renderer) { throw SDLException(SDL_GetError()); } // set texture filtering if (m_textureFilter == TEXTURE_FILTER_ANISOTROPIC) { SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "best"); } else if (m_textureFilter != TEXTURE_FILTER_NONE) { SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "linear"); } else { SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "nearest"); } // enable alpha blending SDL_SetRenderDrawBlendMode(m_renderer, SDL_BLENDMODE_BLEND); // set the window surface as main surface, not really needed anymore m_screen = SDL_GetWindowSurface(m_window); m_target = m_screen; if (!m_screen) { throw SDLException(SDL_GetError()); } FL_LOG(_log, LMsg("RenderBackendSDL") << "Videomode " << width << "x" << height << " at " << int32_t(bitsPerPixel) << " bpp with " << displayMode.refresh_rate << " Hz"); // this is needed, otherwise we would have screen pixel formats which will not work with // our texture generation. 32 bit surfaces to BitsPerPixel texturen. m_rgba_format = *(m_screen->format); if (bitsPerPixel != 16) { m_rgba_format.format = SDL_PIXELFORMAT_RGBA8888; m_rgba_format.BitsPerPixel = 32; } else { m_rgba_format.format = SDL_PIXELFORMAT_RGBA4444; m_rgba_format.BitsPerPixel = 16; } m_rgba_format.Rmask = RMASK; m_rgba_format.Gmask = GMASK; m_rgba_format.Bmask = BMASK; m_rgba_format.Amask = AMASK; //update the screen mode with the actual flags used m_screenMode = mode; } void RenderBackendSDL::startFrame() { RenderBackend::startFrame(); } void RenderBackendSDL::endFrame() { SDL_RenderPresent(m_renderer); RenderBackend::endFrame(); } Image* RenderBackendSDL::createImage(IResourceLoader* loader) { return new SDLImage(loader); } Image* RenderBackendSDL::createImage(const std::string& name, IResourceLoader* loader) { return new SDLImage(name, loader); } Image* RenderBackendSDL::createImage(SDL_Surface* surface) { return new SDLImage(surface); } Image* RenderBackendSDL::createImage(const std::string& name, SDL_Surface* surface) { return new SDLImage(name, surface); } Image* RenderBackendSDL::createImage(const uint8_t* data, uint32_t width, uint32_t height) { return new SDLImage(data, width, height); } Image* RenderBackendSDL::createImage(const std::string& name, const uint8_t* data, uint32_t width, uint32_t height) { return new SDLImage(name, data, width, height); } void RenderBackendSDL::setLightingModel(uint32_t lighting) { SDLException("Lighting not available under SDL"); } uint32_t RenderBackendSDL::getLightingModel() const { return 0; } void RenderBackendSDL::setLighting(float red, float green, float blue) { } void RenderBackendSDL::resetLighting() { } void RenderBackendSDL::resetStencilBuffer(uint8_t buffer) { } void RenderBackendSDL::changeBlending(int32_t scr, int32_t dst){ } void RenderBackendSDL::renderVertexArrays() { } void RenderBackendSDL::addImageToArray(uint32_t id, const Rect& rec, float const* st, uint8_t alpha, uint8_t const* rgba) { } void RenderBackendSDL::changeRenderInfos(RenderDataType type, uint16_t elements, int32_t src, int32_t dst, bool light, bool stentest, uint8_t stenref, GLConstants stenop, GLConstants stenfunc, OverlayType otype) { } bool RenderBackendSDL::putPixel(int32_t x, int32_t y, uint8_t r, uint8_t g, uint8_t b, uint8_t a) { SDL_SetRenderDrawColor(m_renderer, r, g, b, a); if (SDL_RenderDrawPoint(m_renderer, x, y) == 0) { return true; } return false; } void RenderBackendSDL::drawLine(const Point& p1, const Point& p2, uint8_t r, uint8_t g, uint8_t b, uint8_t a) { SDL_SetRenderDrawColor(m_renderer, r, g, b, a); SDL_RenderDrawLine(m_renderer, p1.x, p1.y, p2.x, p2.y); } void RenderBackendSDL::drawThickLine(const Point& p1, const Point& p2, uint8_t width, uint8_t r, uint8_t g, uint8_t b, uint8_t a) { float xDiff = p2.x - p1.x; float yDiff = p2.y - p1.y; float halfW = static_cast(width) / 2.0; float angle = Mathf::ATan2(yDiff, xDiff) * (180.0 / Mathf::pi()) + 90.0; if (angle < 0.0) { angle += 360.0; } else if (angle > 360.0) { angle -= 360.0; } angle *= Mathf::pi() / 180.0; float cornerX = halfW * Mathf::Cos(angle); float cornerY = halfW * Mathf::Sin(angle); int32_t yMax = p1.y; int32_t yMin = p1.y; std::vector points; Point p(p1.x + cornerX, p1.y + cornerY); yMax = std::max(yMax, p.y); yMin = std::min(yMin, p.y); points.push_back(p); p.x = p2.x + cornerX; p.y = p2.y + cornerY; yMax = std::max(yMax, p.y); yMin = std::min(yMin, p.y); points.push_back(p); p.x = p2.x - cornerX; p.y = p2.y - cornerY; yMax = std::max(yMax, p.y); yMin = std::min(yMin, p.y); points.push_back(p); p.x = p1.x - cornerX; p.y = p1.y - cornerY; yMax = std::max(yMax, p.y); yMin = std::min(yMin, p.y); points.push_back(p); // scan-line fill algorithm int32_t y = yMin; int32_t n = points.size(); for (; y <= yMax; ++y) { std::vector xs; int32_t j = n - 1; for (int32_t i = 0; i < n; j = i++) { if ((points[i].y < y && y <= points[j].y) || (points[j].y < y && y <= points[i].y)) { int32_t x = static_cast(points[i].x + static_cast(y - points[i].y) / static_cast(points[j].y - points[i].y) * static_cast(points[j].x - points[i].x)); xs.push_back(x); for (int32_t k = xs.size() - 1; k && xs[k-1] > xs[k]; --k) { std::swap(xs[k-1], xs[k]); } } } for (int32_t i = 0; i < xs.size(); i += 2) { int32_t x1 = xs[i]; int32_t x2 = xs[i+1]; // vertical line while (x1 <= x2) { putPixel(x1, y, r, g, b, a); ++x1; } } } } void RenderBackendSDL::drawPolyLine(const std::vector& points, uint8_t width, uint8_t r, uint8_t g, uint8_t b, uint8_t a) { if (points.size() < 2) { return; } std::vector::const_iterator it = points.begin(); Point old = *it; ++it; if (width > 1) { for (; it != points.end(); ++it) { drawThickLine(old, *it, width, r, g, b, a); drawFillCircle(old, width / 2, r, g, b, a); old = *it; } drawFillCircle(old, width / 2, r, g, b, a); } else { for (; it != points.end(); ++it) { drawLine(old, *it, r, g, b, a); old = *it; } } } void RenderBackendSDL::drawBezier(const std::vector& points, int32_t steps, uint8_t width, uint8_t r, uint8_t g, uint8_t b, uint8_t a) { if (points.size() < 2) { return; } int32_t elements = points.size(); if (elements < 3 || steps < 2) { return; } bool thick = width > 1; float step = 1.0 / static_cast(steps-1); float t = 0.0; Point old = getBezierPoint(points, elements+1, t); if (thick) { for (int32_t i = 0; i <= (elements*steps); ++i) { t += step; Point next = getBezierPoint(points, elements, t); drawThickLine(old, next, width, r, g, b, a); drawFillCircle(old, width / 2, r, g, b, a); old = next; } drawFillCircle(old, width / 2, r, g, b, a); } else { for (int32_t i = 0; i <= (elements*steps); ++i) { t += step; Point next = getBezierPoint(points, elements, t); drawLine(old, next, r, g, b, a); old = next; } } } void RenderBackendSDL::drawTriangle(const Point& p1, const Point& p2, const Point& p3, uint8_t r, uint8_t g, uint8_t b, uint8_t a) { SDL_SetRenderDrawColor(m_renderer, r, g, b, a); SDL_RenderDrawLine(m_renderer, p1.x, p1.y, p2.x, p2.y); SDL_RenderDrawLine(m_renderer, p2.x, p2.y, p3.x, p3.y); SDL_RenderDrawLine(m_renderer, p3.x, p1.y, p1.x, p1.y); } void RenderBackendSDL::drawRectangle(const Point& p, uint16_t w, uint16_t h, uint8_t r, uint8_t g, uint8_t b, uint8_t a) { SDL_Rect rect; rect.x = p.x; rect.y = p.y; rect.w = w; rect.h = h; SDL_SetRenderDrawColor(m_renderer, r, g, b, a); SDL_RenderDrawRect(m_renderer, &rect); } void RenderBackendSDL::fillRectangle(const Point& p, uint16_t w, uint16_t h, uint8_t r, uint8_t g, uint8_t b, uint8_t a) { SDL_Rect rect; rect.x = p.x; rect.y = p.y; rect.w = w; rect.h = h; SDL_SetRenderDrawColor(m_renderer, r, g, b, a); SDL_RenderFillRect(m_renderer, &rect); } void RenderBackendSDL::drawQuad(const Point& p1, const Point& p2, const Point& p3, const Point& p4, uint8_t r, uint8_t g, uint8_t b, uint8_t a) { fillRectangle(p1, static_cast(p3.x-p1.x), static_cast(p3.y-p1.y), r, g, b, a); } void RenderBackendSDL::drawVertex(const Point& p, const uint8_t size, uint8_t r, uint8_t g, uint8_t b, uint8_t a){ Point p1 = Point(p.x-size, p.y+size); Point p2 = Point(p.x+size, p.y+size); Point p3 = Point(p.x+size, p.y-size); Point p4 = Point(p.x-size, p.y-size); SDL_SetRenderDrawColor(m_renderer, r, g, b, a); SDL_RenderDrawLine(m_renderer, p1.x, p1.y, p2.x, p2.y); SDL_RenderDrawLine(m_renderer, p2.x, p2.y, p3.x, p3.y); SDL_RenderDrawLine(m_renderer, p3.x, p3.y, p4.x, p4.y); SDL_RenderDrawLine(m_renderer, p4.x, p4.y, p1.x, p1.y); } void RenderBackendSDL::drawCircle(const Point& p, uint32_t radius, uint8_t r, uint8_t g, uint8_t b, uint8_t a) { // Midpoint Circle Algorithm int32_t x = radius; int32_t y = 0; int32_t radiusError = 1-x; while(x >= y) { putPixel(x + p.x, y + p.y, r, g, b, a); putPixel(y + p.x, x + p.y, r, g, b, a); putPixel(-x + p.x, y + p.y, r, g, b, a); putPixel(-y + p.x, x + p.y, r, g, b, a); putPixel(-x + p.x, -y + p.y, r, g, b, a); putPixel(-y + p.x, -x + p.y, r, g, b, a); putPixel(x + p.x, -y + p.y, r, g, b, a); putPixel(y + p.x, -x + p.y, r, g, b, a); y++; if (radiusError < 0) { radiusError += 2 * y + 1; } else { x--; radiusError += 2 * (y - x + 1); } } } void RenderBackendSDL::drawFillCircle(const Point& p, uint32_t radius, uint8_t r, uint8_t g, uint8_t b, uint8_t a) { float rad = static_cast(radius); for (float dy = 1; dy <= r; dy += 1.0) { float dx = Mathf::Floor(Mathf::Sqrt((2.0 * rad * dy) - (dy * dy))); int32_t x = p.x - dx; for (; x <= p.x + dx; x++) { putPixel(x, p.y + rad - dy, r, g, b, a); putPixel(x, p.y - rad + dy, r, g, b, a); } } } void RenderBackendSDL::drawCircleSegment(const Point& p, uint32_t radius, int32_t sangle, int32_t eangle, uint8_t r, uint8_t g, uint8_t b, uint8_t a) { const float step = Mathf::twoPi() / 360; int32_t s = (sangle + 360) % 360; int32_t e = (eangle + 360) % 360; if (e == 0) { e = 360; } if (s == e) { return; } float angle = static_cast(s) * step; Point oldPoint(radius * Mathf::Cos(angle) + p.x, radius * Mathf::Sin(angle) + p.y); for (;s <= e; ++s, angle += step) { Point newPoint(radius * Mathf::Cos(angle) + p.x, radius * Mathf::Sin(angle) + p.y); drawLine(oldPoint, newPoint, r, g, b, a); oldPoint = newPoint; } } void RenderBackendSDL::drawFillCircleSegment(const Point& p, uint32_t radius, int32_t sangle, int32_t eangle, uint8_t r, uint8_t g, uint8_t b, uint8_t a) { const float step = Mathf::twoPi() / 360; int32_t s = (sangle + 360) % 360; int32_t e = (eangle + 360) % 360; if (e == 0) { e = 360; } if (s == e) { return; } std::vector points; points.push_back(p); int32_t yMax = p.y; int32_t yMin = p.y; float angle = static_cast(s) * step; for (;s <= e; ++s, angle += step) { Point newPoint(radius * Mathf::Cos(angle) + p.x, radius * Mathf::Sin(angle) + p.y); yMax = std::max(yMax, newPoint.y); yMin = std::min(yMin, newPoint.y); points.push_back(newPoint); } // add end point (again) angle = static_cast(e) * step; Point newPoint(radius * Mathf::Cos(angle) + p.x, radius * Mathf::Sin(angle) + p.y); points.push_back(newPoint); yMax = std::max(yMax, newPoint.y); yMin = std::min(yMin, newPoint.y); // scan-line fill algorithm int32_t y = yMin; int32_t n = points.size(); for (; y <= yMax; ++y) { std::vector xs; int32_t j = n - 1; for (int32_t i = 0; i < n; j = i++) { if ((points[i].y < y && y <= points[j].y) || (points[j].y < y && y <= points[i].y)) { int32_t x = static_cast(points[i].x + static_cast(y - points[i].y) / static_cast(points[j].y - points[i].y) * static_cast(points[j].x - points[i].x)); xs.push_back(x); for (int32_t k = xs.size() - 1; k && xs[k-1] > xs[k]; --k) { std::swap(xs[k-1], xs[k]); } } } for (int32_t i = 0; i < xs.size(); i += 2) { int32_t x1 = xs[i]; int32_t x2 = xs[i+1]; // vertical line while (x1 <= x2) { putPixel(x1, y, r, g, b, a); ++x1; } } } } void RenderBackendSDL::drawLightPrimitive(const Point& p, uint8_t intensity, float radius, int32_t subdivisions, float xstretch, float ystretch, uint8_t red, uint8_t green, uint8_t blue) { } void RenderBackendSDL::enableScissorTest() { } void RenderBackendSDL::disableScissorTest() { } void RenderBackendSDL::captureScreen(const std::string& filename) { if(m_screen) { const uint32_t swidth = getWidth(); const uint32_t sheight = getHeight(); SDL_Surface* surface = SDL_CreateRGBSurface(0, swidth, sheight, 24, RMASK, GMASK, BMASK, NULLMASK); if(!surface) { return; } SDL_BlitSurface(m_screen, NULL, surface, NULL); Image::saveAsPng(filename, *surface); SDL_FreeSurface(surface); } } void RenderBackendSDL::captureScreen(const std::string& filename, uint32_t width, uint32_t height) { if(m_screen) { const uint32_t swidth = getWidth(); const uint32_t sheight = getHeight(); const bool same_size = (width == swidth && height == sheight); if (width < 1 || height < 1) { return; } if (same_size) { captureScreen(filename); return; } // create source surface SDL_Surface* src = SDL_CreateRGBSurface(0, swidth, sheight, 32, RMASK, GMASK, BMASK, AMASK); if(!src) { return; } // copy screen suface to source surface SDL_BlitSurface(m_screen, NULL, src, NULL); // create destination surface SDL_Surface* dst = SDL_CreateRGBSurface(0, width, height, 32, RMASK, GMASK, BMASK, AMASK); uint32_t* src_pointer = static_cast(src->pixels); uint32_t* src_help_pointer = src_pointer; uint32_t* dst_pointer = static_cast(dst->pixels); int32_t x, y, *sx_ca, *sy_ca; int32_t sx = static_cast(0xffff * src->w / dst->w); int32_t sy = static_cast(0xffff * src->h / dst->h); int32_t sx_c = 0; int32_t sy_c = 0; // Allocates memory and calculates row wide&height int32_t* sx_a = new int32_t[dst->w + 1]; sx_ca = sx_a; for (x = 0; x <= dst->w; x++) { *sx_ca = sx_c; sx_ca++; sx_c &= 0xffff; sx_c += sx; } int32_t* sy_a = new int32_t[dst->h + 1]; sy_ca = sy_a; for (y = 0; y <= dst->h; y++) { *sy_ca = sy_c; sy_ca++; sy_c &= 0xffff; sy_c += sy; } sy_ca = sy_a; // Transfers the image data if (SDL_MUSTLOCK(src)) { SDL_LockSurface(src); } if (SDL_MUSTLOCK(dst)) { SDL_LockSurface(dst); } for (y = 0; y < dst->h; y++) { src_pointer = src_help_pointer; sx_ca = sx_a; for (x = 0; x < dst->w; x++) { *dst_pointer = *src_pointer; sx_ca++; src_pointer += (*sx_ca >> 16); dst_pointer++; } sy_ca++; src_help_pointer = (uint32_t*)((uint8_t*)src_help_pointer + (*sy_ca >> 16) * src->pitch); } if (SDL_MUSTLOCK(dst)) { SDL_UnlockSurface(dst); } if (SDL_MUSTLOCK(src)) { SDL_UnlockSurface(src); } Image::saveAsPng(filename, *dst); // Free memory SDL_FreeSurface(src); SDL_FreeSurface(dst); delete[] sx_a; delete[] sy_a; } } void RenderBackendSDL::setClipArea(const Rect& cliparea, bool clear) { SDL_Rect rect; rect.x = cliparea.x; rect.y = cliparea.y; rect.w = cliparea.w; rect.h = cliparea.h; SDL_RenderSetClipRect(m_renderer, &rect); if (clear) { if (m_isbackgroundcolor) { SDL_SetRenderDrawColor(m_renderer, m_backgroundcolor.r, m_backgroundcolor.g, m_backgroundcolor.b, 255); } else { SDL_SetRenderDrawColor(m_renderer, 0, 0, 0, 255); } SDL_RenderFillRect(m_renderer, &rect); } } void RenderBackendSDL::attachRenderTarget(ImagePtr& img, bool discard) { SDLImage* image = static_cast(img.get()); m_target = img->getSurface(); SDL_Texture* texture = image->getTexture(); if (!texture) { texture = SDL_CreateTexture(m_renderer, m_rgba_format.format, SDL_TEXTUREACCESS_TARGET, m_target->w, m_target->h); image->setTexture(texture); } SDL_SetRenderTarget(m_renderer, texture); setClipArea(img->getArea(), discard); } void RenderBackendSDL::detachRenderTarget(){ SDL_RenderPresent(m_renderer); m_target = m_screen; SDL_SetRenderTarget(m_renderer, NULL); } void RenderBackendSDL::renderGuiGeometry(const std::vector& vertices, const std::vector& indices, const DoublePoint& translation, ImagePtr texture) { } } fifengine-0.4.2/engine/core/video/sdl/renderbackendsdl.h000066400000000000000000000142441341615052600232070ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_VIDEO_RENDERBACKENDS_SDL_RENDERBACKENDSDL_H #define FIFE_VIDEO_RENDERBACKENDS_SDL_RENDERBACKENDSDL_H // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "video/renderbackend.h" namespace FIFE { class ScreenMode; /** The main class of the SDL-based renderer. * * @see RenderBackend */ class RenderBackendSDL : public RenderBackend { public: RenderBackendSDL(const SDL_Color& colorkey); virtual ~RenderBackendSDL(); virtual const std::string& getName() const; virtual void startFrame(); virtual void endFrame(); virtual void init(const std::string& driver); virtual void clearBackBuffer(); virtual void setLightingModel(uint32_t lighting); virtual uint32_t getLightingModel() const; virtual void setLighting(float red, float green, float blue); virtual void resetLighting(); virtual void resetStencilBuffer(uint8_t buffer); virtual void changeBlending(int32_t scr, int32_t dst); virtual void createMainScreen(const ScreenMode& mode, const std::string& title, const std::string& icon); virtual void setScreenMode(const ScreenMode& mode); virtual Image* createImage(IResourceLoader* loader = 0); virtual Image* createImage(const std::string& name, IResourceLoader* loader = 0); virtual Image* createImage(const uint8_t* data, uint32_t width, uint32_t height); virtual Image* createImage(const std::string& name, const uint8_t* data, uint32_t width, uint32_t height); virtual Image* createImage(SDL_Surface* surface); virtual Image* createImage(const std::string& name, SDL_Surface* surface); virtual void renderVertexArrays(); virtual void addImageToArray(uint32_t id, const Rect& rec, float const* st, uint8_t alpha, uint8_t const* rgba); virtual void changeRenderInfos(RenderDataType type, uint16_t elements, int32_t src, int32_t dst, bool light, bool stentest, uint8_t stenref, GLConstants stenop, GLConstants stenfunc, OverlayType otype = OVERLAY_TYPE_NONE); virtual void captureScreen(const std::string& filename); virtual void captureScreen(const std::string& filename, uint32_t width, uint32_t height); virtual bool putPixel(int32_t x, int32_t y, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255); virtual void drawLine(const Point& p1, const Point& p2, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255); virtual void drawThickLine(const Point& p1, const Point& p2, uint8_t width, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255); virtual void drawPolyLine(const std::vector& points, uint8_t width, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255); virtual void drawBezier(const std::vector& points, int32_t steps, uint8_t width, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255); virtual void drawTriangle(const Point& p1, const Point& p2, const Point& p3, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255); virtual void drawRectangle(const Point& p, uint16_t w, uint16_t h, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255); virtual void fillRectangle(const Point& p, uint16_t w, uint16_t h, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255); virtual void drawQuad(const Point& p1, const Point& p2, const Point& p3, const Point& p4, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255); virtual void drawVertex(const Point& p, const uint8_t size, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255); virtual void drawCircle(const Point& p, uint32_t radius, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255); virtual void drawFillCircle(const Point& p, uint32_t radius, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255); virtual void drawCircleSegment(const Point& p, uint32_t radius, int32_t sangle, int32_t eangle, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255); virtual void drawFillCircleSegment(const Point& p, uint32_t radius, int32_t sangle, int32_t eangle, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255); virtual void drawLightPrimitive(const Point& p, uint8_t intensity, float radius, int32_t subdivisions, float xstretch, float ystretch, uint8_t red, uint8_t green, uint8_t blue); virtual void enableScissorTest(); virtual void disableScissorTest(); virtual void attachRenderTarget(ImagePtr& img, bool discard); virtual void detachRenderTarget(); virtual void renderGuiGeometry(const std::vector& vertices, const std::vector& indices, const DoublePoint& translation, ImagePtr texture); SDL_Renderer* getRenderer() { return m_renderer; } protected: virtual void setClipArea(const Rect& cliparea, bool clear); SDL_Renderer* m_renderer; }; } #endif fifengine-0.4.2/engine/core/video/sdl/sdlblendingfunctions.cpp000066400000000000000000000117131341615052600244640ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "sdlblendingfunctions.h" namespace FIFE { struct ColorRGB8 { uint8_t r, g, b; }; struct ColorRGBA8 { uint8_t r, g, b, a; }; void SDL_BlendRow_RGBA8_to_RGBA8( const uint8_t* src, uint8_t* dst, uint32_t alpha, int32_t n ) { const ColorRGBA8* srcColor = reinterpret_cast< const ColorRGBA8* >( src ); ColorRGBA8* dstColor = reinterpret_cast< ColorRGBA8* >( dst ); for( int32_t i = n; 0 < i; --i ) { uint32_t aMulA = alpha * srcColor->a; if( aMulA ) { uint32_t OneMin_aMulA = 65535 - aMulA; dstColor->r = ( aMulA * srcColor->r + OneMin_aMulA * dstColor->r ) >> 16; dstColor->g = ( aMulA * srcColor->g + OneMin_aMulA * dstColor->g ) >> 16; dstColor->b = ( aMulA * srcColor->b + OneMin_aMulA * dstColor->b ) >> 16; dstColor->a = 255; } ++dstColor; ++srcColor; } } void SDL_BlendRow_RGBA8_to_RGB8( const uint8_t* src, uint8_t* dst, uint32_t alpha, int32_t n ) { const ColorRGBA8* srcColor = reinterpret_cast< const ColorRGBA8* >( src ); ColorRGB8* dstColor = reinterpret_cast< ColorRGB8* >( dst ); for( int32_t i = n; 0 < i; --i ) { uint32_t aMulA = alpha * srcColor->a; if( aMulA ) { uint32_t OneMin_aMulA = 65535 - aMulA; dstColor->r = ( aMulA * srcColor->r + OneMin_aMulA * dstColor->r ) >> 16; dstColor->g = ( aMulA * srcColor->g + OneMin_aMulA * dstColor->g ) >> 16; dstColor->b = ( aMulA * srcColor->b + OneMin_aMulA * dstColor->b ) >> 16; } ++dstColor; ++srcColor; } } void SDL_BlendRow_RGBA8_to_RGB565( const uint8_t* src, uint8_t* dst, uint32_t alpha, int32_t n ) { const ColorRGBA8* srcColor = reinterpret_cast< const ColorRGBA8* >( src ); uint16_t* dstColor = reinterpret_cast< uint16_t* >( dst ); for( int32_t i = n; 0 < i; --i ) { uint32_t aMulA = ( alpha * srcColor->a ) >> 8; if( aMulA ) { uint32_t OneMin_aMulA = 255 - aMulA; uint32_t c = *dstColor; *dstColor = ( ( ( srcColor->b * aMulA ) + ( ( ( c & 0xF800 ) >> 8 ) * OneMin_aMulA ) ) & 0xF800 ) | ( ( ( ( srcColor->g * aMulA ) + ( ( ( c & 0x07E0 ) >> 3 ) * OneMin_aMulA ) ) >> 5 ) & 0x07E0 ) | ( ( ( ( srcColor->r * aMulA ) + ( ( ( c & 0x001F ) << 3 ) * OneMin_aMulA ) ) >> 11 ) & 0x001F ); } ++dstColor; ++srcColor; } } void SDL_BlendRow_RGBA4_to_RGB565( const uint8_t* src, uint8_t* dst, uint32_t alpha, int32_t n ) { const uint16_t* srcColor = reinterpret_cast< const uint16_t* >( src ); uint16_t* dstColor = reinterpret_cast< uint16_t* >( dst ); for( int32_t i = n; 0 < i; --i ) { uint32_t c1 = *dstColor; uint32_t c2 = *srcColor; uint32_t aMulA = c2 & 0xF; aMulA = ( alpha * aMulA ) / 15; ///< upgrade to range 0-255 if( aMulA ) { uint32_t OneMin_aMulA = 255 - aMulA; uint32_t result; result = ( ( ( ( c2 & 0xF000 ) | 0x0800 ) * aMulA ) + ( ( c1 & 0xF800 ) * OneMin_aMulA ) ) & 0xF80000; result |= ( ( ( ( ( c2 & 0x0F00 ) >> 1 ) | 0x0040 ) * aMulA ) + ( ( c1 & 0x07E0 ) * OneMin_aMulA ) ) & 0x07E000; result |= ( ( ( ( ( c2 & 0x00F0 ) >> 3 ) | 0x0001 ) * aMulA ) + ( ( c1 & 0x001F ) * OneMin_aMulA ) ) & 0x001F00; /// multiplying by alpha resulted in shift. *dstColor = static_cast< uint16_t >( result >> 8 ); } ++dstColor; ++srcColor; } } } fifengine-0.4.2/engine/core/video/sdl/sdlblendingfunctions.h000066400000000000000000000061611341615052600241320ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_VIDEO_RENDERBACKENDS_SDL_SDLBLENDINGFUNCTIONS_H #define FIFE_VIDEO_RENDERBACKENDS_SDL_SDLBLENDINGFUNCTIONS_H // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/fife_stdint.h" namespace FIFE { /** Blends one row of n pixels from src with n pixels of dst. * * @param src Source. * @param dst Destiny. * @param alpha Level of alphablending. * @param n Number of pixels. */ void SDL_BlendRow_RGBA8_to_RGBA8( const uint8_t* src, uint8_t* dst, uint32_t alpha, int32_t n ); /** Blends one row of n pixels from src with n pixels of dst. * * @param src Source. * @param dst Destiny. * @param alpha Level of alphablending. * @param n Number of pixels. */ void SDL_BlendRow_RGBA8_to_RGB8( const uint8_t* src, uint8_t* dst, uint32_t alpha, int32_t n ); /** Blends one row of n pixels from src with n pixels of dst. * * @param src Source. * @param dst Destiny. * @param alpha Level of alphablending. * @param n Number of pixels. */ void SDL_BlendRow_RGBA8_to_RGB565( const uint8_t* src, uint8_t* dst, uint32_t alpha, int32_t n ); /** Blends one row of n pixels from src with n pixels of dst. * * @param src Source. * @param dst Destiny. * @param alpha Level of alphablending. * @param n Number of pixels. */ void SDL_BlendRow_RGBA4_to_RGB565( const uint8_t* src, uint8_t* dst, uint32_t alpha, int32_t n ); } #endif fifengine-0.4.2/engine/core/video/sdl/sdlimage.cpp000066400000000000000000000151361341615052600220360ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes #include #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/base/exception.h" #include "util/log/logger.h" #include "util/structures/rect.h" #include "video/imagemanager.h" #include "video/renderbackend.h" #include "renderbackendsdl.h" #include "sdlimage.h" namespace FIFE { /** Logger to use for this source file. * @relates Logger */ static Logger _log(LM_VIDEO); SDLImage::SDLImage(IResourceLoader* loader): Image(loader) { resetSdlimage(); } SDLImage::SDLImage(const std::string& name, IResourceLoader* loader): Image(name, loader) { resetSdlimage(); } SDLImage::SDLImage(SDL_Surface* surface): Image(surface) { resetSdlimage(); } SDLImage::SDLImage(const std::string& name, SDL_Surface* surface): Image(name, surface) { resetSdlimage(); } SDLImage::SDLImage(const uint8_t* data, uint32_t width, uint32_t height): Image(data, width, height) { resetSdlimage(); } SDLImage::SDLImage(const std::string& name, const uint8_t* data, uint32_t width, uint32_t height): Image(name, data, width, height) { resetSdlimage(); } void SDLImage::resetSdlimage() { m_colorkey = RenderBackend::instance()->getColorKey(); m_texture = NULL; } SDLImage::~SDLImage() { invalidate(); } void SDLImage::invalidate() { if (m_texture && !m_shared) { SDL_DestroyTexture(m_texture); } m_texture = NULL; } void SDLImage::setSurface(SDL_Surface* surface) { invalidate(); reset(surface); resetSdlimage(); } void SDLImage::render(const Rect& rect, uint8_t alpha, uint8_t const* rgb) { if (alpha == 0) { return; } SDL_Surface* target = RenderBackend::instance()->getRenderTargetSurface(); assert(target != m_surface); // can't draw on the source surface if (rect.right() < 0 || rect.x > static_cast(target->w) || rect.bottom() < 0 || rect.y > static_cast(target->h)) { return; } SDL_Rect tarRect; tarRect.x = rect.x; tarRect.y = rect.y; tarRect.w = rect.w; tarRect.h = rect.h; Rect tmpRect = m_shared ? getSubImageRect() : getArea(); SDL_Rect srcRect; srcRect.x = tmpRect.x; srcRect.y = tmpRect.y; srcRect.w = tmpRect.w; srcRect.h = tmpRect.h; SDL_Renderer* renderer = static_cast(RenderBackend::instance())->getRenderer(); // create texture if (!m_texture) { if (!m_surface) { load(); } m_texture = SDL_CreateTextureFromSurface(renderer, m_surface); } // set additonal color and alpha mods if (rgb) { SDL_SetTextureColorMod(m_texture, rgb[0], rgb[1], rgb[2]); SDL_SetTextureAlphaMod(m_texture, rgb[3]); } else { SDL_SetTextureColorMod(m_texture, 255, 255, 255); SDL_SetTextureAlphaMod(m_texture, 255); } // set render color SDL_SetRenderDrawColor(renderer, 255, 255, 255, alpha); if (SDL_RenderCopy(renderer, m_texture, &srcRect, &tarRect) != 0) { throw SDLException(SDL_GetError()); } } size_t SDLImage::getSize() { size_t size = 0; if (m_surface && !m_shared) { size += m_surface->h * m_surface->pitch; } return size; } void SDLImage::useSharedImage(const ImagePtr& shared, const Rect& region) { if(shared->getState() != IResource::RES_LOADED) { shared->load(); } SDL_Surface* surface = shared->getSurface(); if (!surface) { shared->load(); surface = shared->getSurface(); } SDLImage* image = static_cast(shared.get()); m_texture = image->getTexture(); if (!m_texture) { // create atlas texture SDL_Renderer* renderer = static_cast(RenderBackend::instance())->getRenderer(); m_texture = SDL_CreateTextureFromSurface(renderer, surface); image->setTexture(m_texture); } setSurface(surface); m_shared = true; m_subimagerect = region; m_atlas_img = shared; m_atlas_name = shared->getName(); setState(IResource::RES_LOADED); } void SDLImage::forceLoadInternal() { validateShared(); } void SDLImage::validateShared() { if (m_atlas_name.empty()) { return; } if (m_atlas_img->getState() == IResource::RES_NOT_LOADED || getState() == IResource::RES_NOT_LOADED) { load(); } } void SDLImage::load() { if (!m_atlas_name.empty()) { // check atlas image // if it does not exist, it is created. if (!ImageManager::instance()->exists(m_atlas_name)) { ImagePtr newAtlas = ImageManager::instance()->create(m_atlas_name); m_atlas_img = newAtlas; } useSharedImage(m_atlas_img , m_subimagerect); } else { Image::load(); } } void SDLImage::free() { // save the image offsets int32_t xshift = m_xshift; int32_t yshift = m_yshift; setSurface(NULL); m_xshift = xshift; m_yshift = yshift; m_state = IResource::RES_NOT_LOADED; } SDL_Texture* SDLImage::getTexture() { return m_texture; } void SDLImage::setTexture(SDL_Texture* texture) { if (m_texture == texture) { return; } if (m_texture && !m_shared) { SDL_DestroyTexture(m_texture); } m_texture = texture; } } fifengine-0.4.2/engine/core/video/sdl/sdlimage.h000066400000000000000000000062151341615052600215010ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_VIDEO_RENDERBACKENDS_SDL_SDLIMAGE_H #define FIFE_VIDEO_RENDERBACKENDS_SDL_SDLIMAGE_H // Standard C++ library includes // 3rd party library includes #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "video/image.h" namespace FIFE { /** The SDL implementation of the @c Image base class. */ class SDLImage : public Image { public: SDLImage(IResourceLoader* loader = 0); SDLImage(const std::string& name, IResourceLoader* loader = 0); SDLImage(SDL_Surface* surface); SDLImage(const std::string& name, SDL_Surface* surface); SDLImage(const uint8_t* data, uint32_t width, uint32_t height); SDLImage(const std::string& name, const uint8_t* data, uint32_t width, uint32_t height); virtual ~SDLImage(); virtual void invalidate(); virtual void setSurface(SDL_Surface* surface); virtual void render(const Rect& rect, uint8_t alpha = 255, uint8_t const* rgb = 0); virtual size_t getSize(); virtual void useSharedImage(const ImagePtr& shared, const Rect& region); virtual void forceLoadInternal(); virtual void load(); virtual void free(); SDL_Texture* getTexture(); void setTexture(SDL_Texture* texture); private: void resetSdlimage(); void validateShared(); // colorkey for the image SDL_Color m_colorkey; // texture of image SDL_Texture* m_texture; // Holds Atlas ImagePtr if this is a shared image ImagePtr m_atlas_img; // Holds Atlas Name if this is a shared image std::string m_atlas_name; }; } #endif fifengine-0.4.2/engine/core/video/video.i000066400000000000000000000306011341615052600202350ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fife %{ #include "video/image.h" #include "video/cursor.h" #include "video/animation.h" #include "video/imagemanager.h" #include "video/animationmanager.h" #include "video/renderbackend.h" #include "video/devicecaps.h" #include "video/atlasbook.h" #include "video/color.h" #include "util/base/sharedptr.h" #include "util/base/exception.h" %} %include %include "util/base/utilbase.i" %include "util/structures/utilstructures.i" %include "util/resource/resource.i" namespace FIFE { class ScreenMode; } namespace std { %template(ScreenModeVector) std::vector; } %attribute(FIFE::Color, uint8_t, r, getR, setR); %attribute(FIFE::Color, uint8_t, g, getG, setG); %attribute(FIFE::Color, uint8_t, b, getB, setB); %attribute(FIFE::Color, uint8_t, a, getAlpha, setAlpha); namespace FIFE { class Point; class ResourceLocation; %apply uint8_t *OUTPUT { uint8_t* r, uint8_t* g, uint8_t* b, uint8_t* a }; class Image : public IResource { public: //void render(const Rect& rect, uint8_t alpha = 255, uint8_t const* rgb = 0); virtual ~Image(); SDL_Surface* getSurface(); uint32_t getWidth() const; uint32_t getHeight() const; Rect getArea() const; void setXShift(int32_t xshift); inline int32_t getXShift() const; void setYShift(int32_t yshift); inline int32_t getYShift() const; void getPixelRGBA(int32_t x, int32_t y, uint8_t* r, uint8_t* g, uint8_t* b, uint8_t* a); void saveImage(const std::string& filename); virtual void useSharedImage(const FIFE::ImagePtr& shared, const Rect& region) = 0; virtual void forceLoadInternal() = 0; bool isSharedImage() const; const Rect& getSubImageRect() const; void copySubimage(uint32_t xoffset, uint32_t yoffset, const FIFE::ImagePtr& img); private: Image(SDL_Surface* surface); Image(const uint8_t* data, uint32_t width, uint32_t height); }; typedef SharedPtr ImagePtr; %template(SharedImagePointer) SharedPtr; class ImageManager : public IResourceManager { public: virtual ~ImageManager(); virtual size_t getMemoryUsed() const; virtual size_t getTotalResourcesCreated() const; virtual size_t getTotalResourcesLoaded() const; virtual size_t getTotalResources() const; virtual ImagePtr create(const std::string& name, IResourceLoader* loader = 0); virtual ImagePtr load(const std::string& name, IResourceLoader* loader = 0); virtual ImagePtr loadBlank(uint32_t width, uint32_t height); virtual ImagePtr add(Image* res); virtual bool exists(const std::string& name); virtual bool exists(ResourceHandle handle); virtual void reload(const std::string& name); virtual void reload(ResourceHandle handle); virtual void reloadAll(); virtual void loadUnreferenced(); virtual void free(const std::string& name); virtual void free(ResourceHandle handle); virtual void freeAll(); virtual void freeUnreferenced(); virtual void remove(ImagePtr& resource); virtual void remove(const std::string& name); virtual void remove(ResourceHandle handle); virtual void removeAll(); virtual void removeUnreferenced(); virtual ImagePtr get(const std::string& name); virtual ImagePtr get(ResourceHandle handle); virtual ResourceHandle getResourceHandle(const std::string& name); virtual void invalidate(const std::string& name); virtual void invalidate(ResourceHandle handle); virtual void invalidateAll(); }; class Animation: public IResource { public: ~Animation(); void addFrame(ImagePtr image, uint32_t duration); int32_t getFrameIndex(uint32_t timestamp); ImagePtr getFrame(int32_t index); ImagePtr getFrameByTimestamp(uint32_t timestamp); int32_t getFrameDuration(int32_t index); uint32_t getFrameCount() const; void setActionFrame(int32_t num); int32_t getActionFrame(); void setDirection(uint32_t direction); uint32_t getDirection(); int32_t getDuration(); }; typedef SharedPtr AnimationPtr; %template(SharedAnimationPointer) SharedPtr; class AnimationManager : public IResourceManager { public: virtual ~AnimationManager(); virtual size_t getMemoryUsed() const; virtual size_t getTotalResourcesCreated() const; virtual size_t getTotalResourcesLoaded() const; virtual size_t getTotalResources() const; virtual AnimationPtr create(const std::string& name, IResourceLoader* loader = 0); virtual AnimationPtr add(Animation* res); virtual bool exists(const std::string& name); virtual bool exists(ResourceHandle handle); virtual void reload(const std::string& name); virtual void reload(ResourceHandle handle); virtual void reloadAll(); virtual void loadUnreferenced(); virtual void free(const std::string& name); virtual void free(ResourceHandle handle); virtual void freeAll(); virtual void freeUnreferenced(); virtual void remove(ImagePtr& resource); virtual void remove(const std::string& name); virtual void remove(ResourceHandle handle); virtual void removeAll(); virtual void removeUnreferenced(); virtual AnimationPtr get(const std::string& name); virtual AnimationPtr get(ResourceHandle handle); virtual AnimationPtr getPtr(const std::string& name); virtual AnimationPtr getPtr(ResourceHandle handle); virtual ResourceHandle getResourceHandle(const std::string& name); virtual void invalidate(const std::string& name); virtual void invalidate(ResourceHandle handle); virtual void invalidateAll(); }; enum TextureFiltering { TEXTURE_FILTER_NONE = 0, TEXTURE_FILTER_BILINEAR = 1, TEXTURE_FILTER_TRILINEAR = 2, TEXTURE_FILTER_ANISOTROPIC = 3 }; class RenderBackend { public: virtual ~RenderBackend(); virtual const std::string& getName() const = 0; void captureScreen(const std::string& filename); void captureScreen(const std::string& filename, uint32_t width, uint32_t height); const ScreenMode& getCurrentScreenMode() const; uint32_t getWidth() const; uint32_t getHeight() const; uint32_t getScreenWidth() const; uint32_t getScreenHeight() const; const Rect& getArea(); const Rect& getClipArea() const; void setAlphaOptimizerEnabled(bool enabled); bool isAlphaOptimizerEnabled(); void setImageCompressingEnabled(bool enabled); bool isImageCompressingEnabled() const; void setFramebufferEnabled(bool enabled); bool isFramebufferEnabled() const; void setNPOTEnabled(bool enabled); bool isNPOTEnabled() const; void setTextureFiltering(TextureFiltering filter); TextureFiltering getTextureFiltering() const; void setMipmappingEnabled(bool enabled); bool isMipmappingEnabled() const; void setMonochromeEnabled(bool enabled); bool isMonochromeEnabled() const; void setColorKeyEnabled(bool colorkeyenable); bool isColorKeyEnabled() const; void setColorKey(const SDL_Color& colorkey); const SDL_Color& getColorKey() const; const SDL_PixelFormat& getPixelFormat() const; void setBackgroundColor(uint8_t r, uint8_t g, uint8_t b); void resetBackgroundColor(); void setVSyncEnabled(bool vsync); bool isVSyncEnabled() const; void setFrameLimitEnabled(bool limited); bool isFrameLimitEnabled() const; void setFrameLimit(uint16_t framelimit); uint16_t getFrameLimit() const; }; enum MouseCursorType { CURSOR_NONE, CURSOR_NATIVE, CURSOR_IMAGE, CURSOR_ANIMATION }; enum NativeCursor { NC_ARROW = 1000000, NC_IBEAM, NC_WAIT, NC_CROSS, NC_WAITARROW, NC_RESIZENWSE, NC_RESIZENESW, NC_RESIZEWE, NC_RESIZENS, NC_RESIZEALL, NC_NO, NC_HAND }; %apply int32_t *OUTPUT { int32_t* x, int32_t* y }; class Cursor { public: virtual ~Cursor() {} virtual void draw(); void set(uint32_t cursor_id=0); void set(AnimationPtr anim); void set(ImagePtr image); void setDrag(AnimationPtr anim, int32_t drag_offset_x=0, int32_t drag_offset_y=0); void setDrag(ImagePtr image, int32_t drag_offset_x=0, int32_t drag_offset_y=0); void resetDrag(); MouseCursorType getType() const; uint32_t getId() const; ImagePtr getImage(); AnimationPtr getAnimation(); MouseCursorType getDragType() const; ImagePtr getDragImage(); AnimationPtr getDragAnimation(); uint32_t getX() const; uint32_t getY() const; void setPosition(uint32_t x, uint32_t y); void getPosition(int32_t* x, int32_t* y); void setNativeImageCursorEnabled(bool native_image_cursor_enabled); bool isNativeImageCursorEnabled() const; private: Cursor(); }; class ScreenMode { public: ~ScreenMode(); uint16_t getWidth() const; uint16_t getHeight() const; uint16_t getBPP() const; uint16_t getRefreshRate() const; uint32_t getSDLFlags() const; bool isFullScreen(); bool isOpenGL(); bool isSDL() const; uint8_t getDisplay() const; const std::string& getRenderDriverName() const; static const uint32_t WINDOWED_OPENGL; static const uint32_t FULLSCREEN_OPENGL; static const uint32_t WINDOWED_SDL; static const uint32_t FULLSCREEN_SDL; }; class DeviceCaps { public: DeviceCaps(); ~DeviceCaps(); void fillDeviceCaps(); std::vector getSupportedScreenModes() const; ScreenMode getNearestScreenMode(uint16_t width, uint16_t height, uint16_t bpp, const std::string& renderer, bool fs) const; ScreenMode getNearestScreenMode(uint16_t width, uint16_t height, uint16_t bpp, const std::string& renderer, bool fs, uint16_t refresh, uint8_t display = 0) const; std::string getVideoDriverName() const; std::vector getAvailableVideoDrivers() const; std::string getRenderDriverName() const; void setRenderDriverName(const std::string& driver); std::vector getAvailableRenderDrivers() const; uint8_t getDisplayCount() const; std::string getDisplayName(uint8_t display = 0) const; uint32_t getDesktopFormat(uint8_t display = 0) const; int32_t getDesktopRefreshRate(uint8_t display = 0) const; int32_t getDesktopWidth(uint8_t display = 0) const; int32_t getDesktopHeight(uint8_t display = 0) const; Rect getDisplayBounds(uint8_t display = 0) const; }; class AtlasBlock { public: uint32_t page; uint32_t left, right, top, bottom; AtlasBlock(const Rect& rect, uint32_t page); AtlasBlock(); void setTrivial(); bool isTrivial() const; uint32_t getWidth() const; uint32_t getHeight() const; AtlasBlock intersects(AtlasBlock const& rect) const; void merge(AtlasBlock const& rect); }; class AtlasBook { public: AtlasBook(uint32_t pageWidth, uint32_t pageHeight, uint32_t pixelSize = 4); AtlasBlock* getBlock(uint32_t width, uint32_t height); void shrink(bool pot); }; %extend AtlasBook { uint32_t getPageWidth(uint32_t index) { return $self->getPage(index).getWidth(); } uint32_t getPageHeight(uint32_t index) { return $self->getPage(index).getHeight(); } } class Color { public: Color(uint8_t r = 0, uint8_t g = 0, uint8_t b = 0, uint8_t alpha = 255); ~Color(); void set(uint8_t r, uint8_t g, uint8_t b, uint8_t alpha); void setR(uint8_t r); void setG(uint8_t g); void setB(uint8_t b); void setAlpha(uint8_t alpha); uint8_t getR() const; uint8_t getG() const; uint8_t getB() const; uint8_t getAlpha() const; }; } fifengine-0.4.2/engine/core/view/000077500000000000000000000000001341615052600166215ustar00rootroot00000000000000fifengine-0.4.2/engine/core/view/camera.cpp000066400000000000000000000770061341615052600205670ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "model/metamodel/grids/cellgrid.h" #include "model/metamodel/action.h" #include "model/metamodel/timeprovider.h" #include "model/structures/map.h" #include "model/structures/layer.h" #include "model/structures/instancetree.h" #include "model/structures/instance.h" #include "model/structures/location.h" #include "util/log/logger.h" #include "util/math/fife_math.h" #include "util/math/angles.h" #include "util/time/timemanager.h" #include "video/renderbackend.h" #include "video/image.h" #include "video/animation.h" #include "video/imagemanager.h" #include "camera.h" #include "layercache.h" #include "visual.h" namespace FIFE { static Logger _log(LM_CAMERA); // to avoid std::bad_alloc errors, we determine the maximum size of batches const uint32_t MAX_BATCH_SIZE = 100000; class MapObserver : public MapChangeListener { Camera* m_camera; public: MapObserver(Camera* camera) { m_camera = camera; } virtual ~MapObserver() {} virtual void onMapChanged(Map* map, std::vector& changedLayers) { } virtual void onLayerCreate(Map* map, Layer* layer) { m_camera->addLayer(layer); } virtual void onLayerDelete(Map* map, Layer* layer) { m_camera->removeLayer(layer); } }; Camera::Camera(const std::string& id, Map* map, const Rect& viewport, RenderBackend* renderbackend) : m_id(id), m_map(map), m_viewport(viewport), m_renderbackend(renderbackend), m_position(ExactModelCoordinate(0, 0, 0)), m_matrix(), m_inverse_matrix(), m_tilt(0), m_rotation(0), m_zoom(1), m_zToY(0), m_enabledZToY(false), m_location(), m_curOrigin(ScreenPoint(0, 0, 0)), m_mapViewPort(), m_mapViewPortUpdated(false), m_screenCellWidth(1), m_screenCellHeight(1), m_referenceScaleX(1), m_referenceScaleY(1), m_enabled(true), m_attachedTo(NULL), m_transform(NoneTransform), m_renderers(), m_pipeline(), m_updated(false), m_layerToInstances(), m_lighting(false), m_light_colors(), m_col_overlay(false), m_img_overlay(false), m_ani_overlay(false) { m_map_observer = new MapObserver(this); init(); } Camera::~Camera() { // Trigger removal of LayerCaches and MapObserver if (m_map) { m_map->removeChangeListener(m_map_observer); const std::list& layers = m_map->getLayers(); for (std::list::const_iterator i = layers.begin(); i != layers.end(); ++i) { removeLayer(*i); } } std::map::iterator r_it = m_renderers.begin(); for(; r_it != m_renderers.end(); ++r_it) { r_it->second->reset(); delete r_it->second; } m_renderers.clear(); delete m_map_observer; } void Camera::init() { m_transform |= PositionTransform; updateMatrices(); m_curOrigin = toScreenCoordinates(m_position); // Trigger addition of LayerCaches and MapObserver m_map->addChangeListener(m_map_observer); const std::list& layers = m_map->getLayers(); for (std::list::const_iterator i = layers.begin(); i != layers.end(); ++i) { addLayer(*i); } } void Camera::setTilt(double tilt) { if (!Mathd::Equal(m_tilt, tilt)) { m_transform |= TiltTransform; m_tilt = tilt; updateReferenceScale(); updateMatrices(); } } double Camera::getTilt() const { return m_tilt; } void Camera::setRotation(double rotation) { if (!Mathd::Equal(m_rotation, rotation)) { m_transform |= RotationTransform; m_rotation = rotation; updateReferenceScale(); updateMatrices(); } } double Camera::getRotation() const { return m_rotation; } void Camera::setZoom(double zoom) { if (!Mathd::Equal(m_zoom, zoom)) { m_transform |= ZoomTransform; m_zoom = zoom; if (m_zoom < 0.001) { m_zoom = 0.001; } updateMatrices(); } } double Camera::getZoom() const { return m_zoom; } double Camera::getOriginalZToY() const { DoubleMatrix matrix; matrix.loadScale(m_referenceScaleX, m_referenceScaleY, m_referenceScaleX); if (m_location.getLayer()) { CellGrid* cg = m_location.getLayer()->getCellGrid(); if (cg) { ExactModelCoordinate pt = m_location.getMapCoordinates(); matrix.applyTranslate(-pt.x*m_referenceScaleX, -pt.y*m_referenceScaleY, -pt.z*m_referenceScaleX); } } matrix.applyRotate(-m_rotation, 0.0, 0.0, 1.0); matrix.applyRotate(-m_tilt, 1.0, 0.0, 0.0); return matrix.m9 * -1.0; } void Camera::setZToY(double zToY) { m_enabledZToY = true; if (!Mathd::Equal(m_zToY, zToY)) { m_transform |= ZTransform; m_zToY = zToY; updateMatrices(); } } double Camera::getZToY() const { return m_zToY; } void Camera::setZToYEnabled(bool enabled) { m_enabledZToY = enabled; } bool Camera::isZToYEnabled() const { return m_enabledZToY; } void Camera::setCellImageDimensions(uint32_t width, uint32_t height) { m_screenCellWidth = width; m_screenCellHeight = height; updateReferenceScale(); updateMatrices(); m_transform |= PositionTransform; } void Camera::setLocation(const Location& location) { if (m_location == location) { return; } CellGrid* cell_grid = NULL; if (location.getLayer()) { cell_grid = location.getLayer()->getCellGrid(); if (!cell_grid) { throw Exception("Location layer without cellgrid given to Camera::setLocation"); } } else { throw Exception("Location without layer given to Camera::setLocation"); } m_transform |= PositionTransform; m_location = location; m_position = m_location.getMapCoordinates(); updateMatrices(); m_curOrigin = toScreenCoordinates(m_position); } Point Camera::getCellImageDimensions() { return Point(m_screenCellWidth, m_screenCellHeight); } Point Camera::getCellImageDimensions(Layer* layer) { Point p; DoublePoint dimensions = getLogicalCellDimensions(layer); p.x = static_cast(round(m_referenceScaleX * dimensions.x)); p.y = static_cast(round(m_referenceScaleY * dimensions.y)); return p; } Location Camera::getLocation() { if (m_location.getLayer()) { m_location.setMapCoordinates(m_position); return m_location; } Location loc = Location(); if (m_map && m_map->getLayerCount() > 0) { loc.setLayer(m_map->getLayers().back()); loc.setMapCoordinates(m_position); } return loc; } void Camera::setViewPort(const Rect& viewport) { m_viewport = viewport; refresh(); } const Rect& Camera::getViewPort() const { return m_viewport; } const Rect& Camera::getMapViewPort() { if (!m_mapViewPortUpdated) { ScreenPoint sp1(m_viewport.x, m_viewport.y); ScreenPoint sp2(m_viewport.x, m_viewport.y + m_viewport.h); ScreenPoint sp3(m_viewport.x + m_viewport.w, m_viewport.y); ScreenPoint sp4(m_viewport.x + m_viewport.w, m_viewport.y + m_viewport.h); std::vector coords; coords.push_back(toMapCoordinates(sp2, false)); coords.push_back(toMapCoordinates(sp3, false)); coords.push_back(toMapCoordinates(sp4, false)); ExactModelCoordinate emc = toMapCoordinates(sp1, false); ModelCoordinate min(static_cast(emc.x), static_cast(emc.y)); ModelCoordinate max(static_cast(emc.x+0.5), static_cast(emc.y+0.5)); std::vector::iterator it = coords.begin(); for (; it != coords.end(); ++it) { min.x = std::min(min.x, static_cast((*it).x)); min.y = std::min(min.y, static_cast((*it).y)); max.x = std::max(max.x, static_cast((*it).x+0.5)); max.y = std::max(max.y, static_cast((*it).y+0.5)); } // makes the viewport a bit larger m_mapViewPort.x = min.x - 1; m_mapViewPort.y = min.y - 1; m_mapViewPort.w = ABS(max.x - min.x) + 2; m_mapViewPort.h = ABS(max.y - min.y) + 2; m_mapViewPortUpdated = true; } return m_mapViewPort; } Rect Camera::getLayerViewPort(Layer* layer) { Rect mapView = getMapViewPort(); Location loc(layer); ExactModelCoordinate emc(mapView.x, mapView.y); loc.setMapCoordinates(emc); emc.x = mapView.x+mapView.w; emc.y = mapView.y+mapView.h; mapView.x = loc.getLayerCoordinates().x; mapView.y = loc.getLayerCoordinates().y; loc.setMapCoordinates(emc); mapView.w = ABS(loc.getLayerCoordinates().x - mapView.x); mapView.h = ABS(loc.getLayerCoordinates().y - mapView.y); return mapView; } void Camera::setEnabled(bool enabled) { m_enabled = enabled; } bool Camera::isEnabled() { return m_enabled; } void Camera::setPosition(const ExactModelCoordinate& position) { if (Mathd::Equal(m_position.x, position.x) && Mathd::Equal(m_position.y, position.y)) { return; } m_transform |= PositionTransform; m_position = position; updateMatrices(); m_curOrigin = toScreenCoordinates(m_position); } ExactModelCoordinate Camera::getPosition() const { return m_position; } Point3D Camera::getOrigin() const { return m_curOrigin; } void Camera::updateMatrices() { m_matrix.loadScale(m_referenceScaleX, m_referenceScaleY, m_referenceScaleX); m_vs_matrix.loadScale(m_referenceScaleX, m_referenceScaleY, m_referenceScaleX); m_matrix.applyTranslate(-m_position.x*m_referenceScaleX, -m_position.y*m_referenceScaleY, -m_position.z*m_referenceScaleX); m_matrix.applyRotate(-m_rotation, 0.0, 0.0, 1.0); m_matrix.applyRotate(-m_tilt, 1.0, 0.0, 0.0); if (m_enabledZToY) { m_matrix.m9 = -m_zToY; // z -> y height in pixels } double scale = m_zoom; m_matrix.applyScale(scale, scale, scale); m_matrix.applyTranslate(+m_viewport.x+m_viewport.w/2, +m_viewport.y+m_viewport.h/2, 0); m_inverse_matrix = m_matrix.inverse(); m_vs_matrix.applyRotate(-m_rotation, 0.0, 0.0, 1.0); m_vs_matrix.applyRotate(-m_tilt, 1.0, 0.0, 0.0); if (m_enabledZToY) { m_vs_matrix.m9 = -m_zToY; // z -> y height in pixels } m_vs_inverse_matrix = m_vs_matrix.inverse(); // calculate the screen<->virtual screen transformation // this explicitly ignores the z-value. m_vscreen_2_screen = m_matrix; // NOTE: mult4by4 is an in-place modification. m_vscreen_2_screen.mult4by4(m_vs_inverse_matrix); // set the z transformation to unity const int32_t N=4; for(int32_t i=0; i!=N; ++i) { m_vscreen_2_screen[2*N + i] = 0; m_vscreen_2_screen[i*N + 2] = 0; } m_vscreen_2_screen[2*N + 2] = 1; m_screen_2_vscreen = m_vscreen_2_screen.inverse(); m_mapViewPortUpdated = false; // FL_WARN(_log, LMsg("matrix: ") << m_matrix << " 1: " << m_matrix.inverse().mult4by4(m_matrix)); // FL_WARN(_log, LMsg("vs2s matrix: ") << m_vscreen_2_screen << " s2vs matrix: " << m_screen_2_vscreen); } void Camera::calculateZValue(DoublePoint3D& screen_coords) { int32_t dy = -(screen_coords.y - toScreenCoordinates(m_position).y); screen_coords.z = Mathd::Tan(m_tilt * (Mathd::pi() / 180.0)) * static_cast(dy); } ExactModelCoordinate Camera::toMapCoordinates(ScreenPoint screen_coords, bool z_calculated) { DoublePoint3D double_screen_coords = intPt2doublePt(screen_coords); if (!z_calculated) { calculateZValue(double_screen_coords); } return m_inverse_matrix * double_screen_coords; } ScreenPoint Camera::toScreenCoordinates(const ExactModelCoordinate& elevation_coords) { ScreenPoint pt = doublePt2intPt(m_matrix * elevation_coords); return pt; } DoublePoint3D Camera::toVirtualScreenCoordinates(const ExactModelCoordinate& elevation_coords) { DoublePoint3D pt = (m_vs_matrix * elevation_coords); return pt; } ScreenPoint Camera::virtualScreenToScreen(const DoublePoint3D& p) { return doublePt2intPt(m_vscreen_2_screen * p); } DoublePoint3D Camera::screenToVirtualScreen(const ScreenPoint& p) { return m_screen_2_vscreen * intPt2doublePt(p); } DoublePoint Camera::getLogicalCellDimensions(Layer* layer) { assert(layer); CellGrid* cg = layer->getCellGrid(); assert(cg); ModelCoordinate cell(0,0); std::vector vertices; cg->getVertices(vertices, cell); DoubleMatrix mtx; mtx.loadRotate(m_rotation, 0.0, 0.0, 1.0); mtx.applyRotate(m_tilt, 1.0, 0.0, 0.0); double x1 = 0; double x2 = 0; double y1 = 0; double y2 = 0; for (uint32_t i = 0; i < vertices.size(); i++) { vertices[i] = cg->toMapCoordinates(vertices[i]); vertices[i] = mtx * vertices[i]; if (i == 0) { x1 = x2 = vertices[0].x; y1 = y2 = vertices[0].y; } else { x1 = std::min(vertices[i].x, x1); x2 = std::max(vertices[i].x, x2); y1 = std::min(vertices[i].y, y1); y2 = std::max(vertices[i].y, y2); } } return DoublePoint( x2 - x1, y2 - y1 ); } DoublePoint Camera::getLogicalCellDimensions() { std::vector vertices; vertices.push_back(ExactModelCoordinate(-0.5, -0.5)); vertices.push_back(ExactModelCoordinate(0.5, -0.5)); vertices.push_back(ExactModelCoordinate(0.5, 0.5)); vertices.push_back(ExactModelCoordinate(-0.5, 0.5)); DoubleMatrix mtx; mtx.loadRotate(m_rotation, 0.0, 0.0, 1.0); mtx.applyRotate(m_tilt, 1.0, 0.0, 0.0); double x1 = 0; double x2 = 0; double y1 = 0; double y2 = 0; for (uint32_t i = 0; i < vertices.size(); i++) { vertices[i] = mtx * vertices[i]; if (i == 0) { x1 = x2 = vertices[0].x; y1 = y2 = vertices[0].y; } else { x1 = std::min(vertices[i].x, x1); x2 = std::max(vertices[i].x, x2); y1 = std::min(vertices[i].y, y1); y2 = std::max(vertices[i].y, y2); } } return DoublePoint(x2 - x1, y2 - y1); } void Camera::updateReferenceScale() { DoublePoint dim = getLogicalCellDimensions(); m_referenceScaleX = static_cast(m_screenCellWidth) / dim.x; m_referenceScaleY = static_cast(m_screenCellHeight) / dim.y; FL_DBG(_log, "Updating reference scale"); FL_DBG(_log, LMsg(" tilt=") << m_tilt << " rot=" << m_rotation); FL_DBG(_log, LMsg(" m_screenCellWidth=") << m_screenCellWidth); FL_DBG(_log, LMsg(" m_screenCellHeight=") << m_screenCellHeight); FL_DBG(_log, LMsg(" m_referenceScaleX=") << m_referenceScaleX); FL_DBG(_log, LMsg(" m_referenceScaleY=") << m_referenceScaleY); } RenderList& Camera::getRenderListRef(Layer* layer) { return m_layerToInstances[layer]; } void Camera::getMatchingInstances(ScreenPoint screen_coords, Layer& layer, std::list& instances, uint8_t alpha) { instances.clear(); bool zoomed = !Mathd::Equal(m_zoom, 1.0); bool special_alpha = alpha != 0; const RenderList& layer_instances = m_layerToInstances[&layer]; RenderList::const_iterator instance_it = layer_instances.end(); while (instance_it != layer_instances.begin()) { --instance_it; Instance* i = (*instance_it)->instance; const RenderItem& vc = **instance_it; if ((vc.dimensions.contains(Point(screen_coords.x, screen_coords.y)))) { if(vc.image->isSharedImage()) { vc.image->forceLoadInternal(); } uint8_t r, g, b, a = 0; int32_t x = screen_coords.x - vc.dimensions.x; int32_t y = screen_coords.y - vc.dimensions.y; if (zoomed) { double fx = static_cast(x); double fy = static_cast(y); double fow = static_cast(vc.image->getWidth()); double foh = static_cast(vc.image->getHeight()); double fsw = static_cast(vc.dimensions.w); double fsh = static_cast(vc.dimensions.h); x = static_cast(round(fx / fsw * fow)); y = static_cast(round(fy / fsh * foh)); } if (vc.getAnimationOverlay()) { std::vector* ao = vc.getAnimationOverlay(); std::vector::iterator it = ao->begin(); for (; it != ao->end(); ++it) { if ((*it)->isSharedImage()) { (*it)->forceLoadInternal(); } (*it)->getPixelRGBA(x, y, &r, &g, &b, &a); // instance is hit with mouse if not totally transparent if (a == 0 || (special_alpha && a < alpha)) { continue; } instances.push_back(i); break; } } else { vc.image->getPixelRGBA(x, y, &r, &g, &b, &a); // instance is hit with mouse if not totally transparent if (a == 0 || (special_alpha && a < alpha)) { continue; } instances.push_back(i); } } } } void Camera::getMatchingInstances(Rect screen_rect, Layer& layer, std::list& instances, uint8_t alpha) { instances.clear(); bool zoomed = !Mathd::Equal(m_zoom, 1.0); bool special_alpha = alpha != 0; const RenderList& layer_instances = m_layerToInstances[&layer]; RenderList::const_iterator instance_it = layer_instances.end(); while (instance_it != layer_instances.begin()) { --instance_it; Instance* i = (*instance_it)->instance;; const RenderItem& vc = **instance_it; if ((vc.dimensions.intersects(screen_rect))) { if(vc.image->isSharedImage()) { vc.image->forceLoadInternal(); } uint8_t r, g, b, a = 0; int32_t intersection_left = std::max(screen_rect.x, vc.dimensions.x); int32_t intersection_right = std::min(screen_rect.right(), vc.dimensions.right()); int32_t intersection_top = std::max(screen_rect.y, vc.dimensions.y); int32_t intersection_bottom = std::min(screen_rect.bottom(), vc.dimensions.bottom()); for(int32_t xx = intersection_left; xx < intersection_right; xx++) { for(int32_t yy = intersection_top; yy < intersection_bottom; yy++) { int32_t x = xx - vc.dimensions.x; int32_t y = yy - vc.dimensions.y; if (zoomed) { double fx = static_cast(x); double fy = static_cast(y); double fow = static_cast(vc.image->getWidth()); double foh = static_cast(vc.image->getHeight()); double fsw = static_cast(vc.dimensions.w); double fsh = static_cast(vc.dimensions.h); x = static_cast(round(fx / fsw * fow)); y = static_cast(round(fy / fsh * foh)); } if (vc.getAnimationOverlay()) { std::vector* ao = vc.getAnimationOverlay(); std::vector::iterator it = ao->begin(); for (; it != ao->end(); ++it) { if ((*it)->isSharedImage()) { (*it)->forceLoadInternal(); } (*it)->getPixelRGBA(x, y, &r, &g, &b, &a); // instance is hit with mouse if not totally transparent if (a == 0 || (special_alpha && a < alpha)) { continue; } instances.push_back(i); goto found_non_transparent_pixel; } } else { vc.image->getPixelRGBA(x, y, &r, &g, &b, &a); // instance is hit with mouse if not totally transparent if (a == 0 || (special_alpha && a < alpha)) { continue; } instances.push_back(i); goto found_non_transparent_pixel; } } } found_non_transparent_pixel:; } } } void Camera::getMatchingInstances(Location& loc, std::list& instances, bool use_exactcoordinates) { instances.clear(); Layer* layer = loc.getLayer(); if(!layer) { return; } const RenderList& layer_instances = m_layerToInstances[layer]; RenderList::const_iterator instance_it = layer_instances.end(); while (instance_it != layer_instances.begin()) { --instance_it; Instance* i = (*instance_it)->instance; if (use_exactcoordinates) { if (i->getLocationRef().getExactLayerCoordinatesRef() == loc.getExactLayerCoordinatesRef()) { instances.push_back(i); } } else { if (i->getLocationRef().getLayerCoordinates() == loc.getLayerCoordinates()) { instances.push_back(i); } } } } void Camera::attach(Instance *instance) { if (instance && instance != m_attachedTo) { m_attachedTo = instance; } } void Camera::detach() { m_attachedTo = NULL; } void Camera::update() { if (!m_attachedTo) { return; } ExactModelCoordinate pos = m_attachedTo->getLocationRef().getMapCoordinates(); if (Mathd::Equal(m_position.x, pos.x) && Mathd::Equal(m_position.y, pos.y)) { return; } m_transform |= PositionTransform; m_position = pos; updateMatrices(); m_curOrigin = toScreenCoordinates(m_position); } void Camera::refresh() { updateMatrices(); m_transform |= RotationTransform; m_curOrigin = toScreenCoordinates(m_position); } void Camera::resetUpdates() { if (m_transform == NoneTransform) { m_updated = false; } else { m_updated = true; } m_transform = NoneTransform; } bool pipelineSort(const RendererBase* lhs, const RendererBase* rhs) { return (lhs->getPipelinePosition() < rhs->getPipelinePosition()); } void Camera::addRenderer(RendererBase* renderer) { renderer->setRendererListener(this); m_renderers[renderer->getName()] = renderer; if (renderer->isEnabled()) { m_pipeline.push_back(renderer); } m_pipeline.sort(pipelineSort); } void Camera::onRendererPipelinePositionChanged(RendererBase* renderer) { m_pipeline.sort(pipelineSort); } void Camera::onRendererEnabledChanged(RendererBase* renderer) { assert(m_renderers[renderer->getName()]); if (renderer->isEnabled()) { FL_LOG(_log, LMsg("Enabling renderer ") << renderer->getName()); m_pipeline.push_back(renderer); m_pipeline.sort(pipelineSort); } else { m_pipeline.remove(renderer); } } RendererBase* Camera::getRenderer(const std::string& name) { return m_renderers[name]; } void Camera::resetRenderers() { std::map::iterator r_it = m_renderers.begin(); for (; r_it != m_renderers.end(); ++r_it) { r_it->second->reset(); } } void Camera::addLayer(Layer* layer) { m_cache[layer] = new LayerCache(this); m_cache[layer]->setLayer(layer); m_layerToInstances[layer] = RenderList(); refresh(); } void Camera::removeLayer(Layer* layer) { delete m_cache[layer]; m_cache.erase(layer); m_layerToInstances.erase(layer); if (m_location.getLayer() == layer) { m_location.reset(); } refresh(); } void Camera::setLightingColor(float red, float green, float blue) { m_lighting = true; m_light_colors.clear(); m_light_colors.push_back(red); m_light_colors.push_back(green); m_light_colors.push_back(blue); } std::vector Camera::getLightingColor() { if(m_light_colors.empty()) { for(int32_t colors = 0; colors != 3; ++colors) { m_light_colors.push_back(1.0f); } } return m_light_colors; } void Camera::resetLightingColor() { m_lighting = false; m_renderbackend->resetLighting(); } void Camera::setOverlayColor(uint8_t red, uint8_t green, uint8_t blue, uint8_t alpha) { m_col_overlay = true; m_overlay_color.r = red; m_overlay_color.g = green; m_overlay_color.b = blue; m_overlay_color.a = alpha; } std::vector Camera::getOverlayColor() { std::vector colors; if (m_col_overlay) { colors.push_back(m_overlay_color.r); colors.push_back(m_overlay_color.g); colors.push_back(m_overlay_color.b); colors.push_back(m_overlay_color.a); } else { for(uint8_t cc = 0; cc != 4; ++cc) { colors.push_back(255); } } return colors; } void Camera::resetOverlayColor() { m_col_overlay = false; } void Camera::setOverlayImage(int32_t id, bool fill) { m_img_overlay = true; m_img_id = id; m_img_fill = fill; } int32_t Camera::getOverlayImage() { int32_t id = -1; if (m_img_overlay) { id = m_img_id; } return id; } void Camera::resetOverlayImage() { m_img_overlay = false; m_img_id = -1; } void Camera::setOverlayAnimation(AnimationPtr anim, bool fill) { m_ani_overlay = true; m_ani_ptr = anim; m_ani_fill = fill; m_start_time = 0; } AnimationPtr Camera::getOverlayAnimation() { return m_ani_ptr; } void Camera::resetOverlayAnimation() { m_ani_overlay = false; m_ani_ptr.reset(); } void Camera::renderOverlay() { if (!m_col_overlay && !m_img_overlay && !m_ani_overlay) { return; } uint16_t width = m_viewport.w; uint16_t height = m_viewport.h; Point pm = Point(m_viewport.x + width/2, m_viewport.y + height/2); Rect r; // color overlay if (m_col_overlay) { Point p = Point(m_viewport.x, m_viewport.y); m_renderbackend->fillRectangle(p, width, height, m_overlay_color.r, m_overlay_color.g, m_overlay_color.b, m_overlay_color.a); } // image overlay if (m_img_overlay) { ImagePtr resptr = ImageManager::instance()->get(m_img_id); Image* img = resptr.get(); if (img) { if (m_img_fill) { r.w = width; r.h = height; } else { r.w = img->getWidth(); r.h = img->getHeight(); } r.x = pm.x-r.w/2; r.y = pm.y-r.h/2; img->render(r); } } // animation overlay if (m_ani_overlay) { assert(m_ani_ptr != 0); if (m_start_time == 0) { m_start_time = TimeManager::instance()->getTime(); } uint32_t animtime = scaleTime(1.0, TimeManager::instance()->getTime() - m_start_time) % m_ani_ptr->getDuration(); ImagePtr img = m_ani_ptr->getFrameByTimestamp(animtime); if (img) { if (m_ani_fill) { r.w = width; r.h = height; } else { r.w = img->getWidth(); r.h = img->getHeight(); } r.x = pm.x-r.w/2; r.y = pm.y-r.h/2; img->render(r); } } } void Camera::renderStaticLayer(Layer* layer, bool update) { // ToDo: Remove this function from the camera class to something like engine pre-render. // ToDo: Check if partial rendering of only updated RenderItems to existing FBO is possible/faster in our case. // ToDo: Add and fix support for SDL backend, for SDL it works only on the lowest layer(alpha/transparent bug). LayerCache* cache = m_cache[layer]; ImagePtr cacheImage = cache->getCacheImage(); if (!cacheImage.get()) { // the cacheImage name will be, camera id + _virtual_layer_image_ + layer id cacheImage = ImageManager::instance()->loadBlank(m_id+"_virtual_layer_image_"+layer->getId(), m_viewport.w, m_viewport.h); cache->setCacheImage(cacheImage); update = true; } if (update) { // for the case that the viewport size is not the same as the screen size, // we have to change the values for OpenGL backend Rect rec(0, m_renderbackend->getHeight()-m_viewport.h, m_viewport.w, m_viewport.h); if (m_renderbackend->getName() == "SDL") { rec = m_viewport; } m_renderbackend->attachRenderTarget(cacheImage, true); // here we use the new viewport size m_renderbackend->pushClipArea(rec, false); // render stuff to texture RenderList& instancesToRender = m_layerToInstances[layer]; // split the RenderList into smaller parts if (instancesToRender.size() > MAX_BATCH_SIZE) { uint8_t batches = ceil(instancesToRender.size() / static_cast(MAX_BATCH_SIZE)); uint32_t residual = instancesToRender.size() % MAX_BATCH_SIZE; for (uint8_t i = 0; i < batches; ++i) { uint32_t start = i*MAX_BATCH_SIZE; uint32_t end = start + ((i+1 == batches) ? residual : MAX_BATCH_SIZE); RenderList tempList(instancesToRender.begin() + start, instancesToRender.begin() + end); std::list::iterator r_it = m_pipeline.begin(); for (; r_it != m_pipeline.end(); ++r_it) { if ((*r_it)->isActivedLayer(layer)) { (*r_it)->render(this, layer, tempList); m_renderbackend->renderVertexArrays(); } } } } else { std::list::iterator r_it = m_pipeline.begin(); for (; r_it != m_pipeline.end(); ++r_it) { if ((*r_it)->isActivedLayer(layer)) { (*r_it)->render(this, layer, instancesToRender); m_renderbackend->renderVertexArrays(); } } } m_renderbackend->detachRenderTarget(); m_renderbackend->popClipArea(); } } void Camera::updateRenderLists() { if (!m_map) { FL_ERR(_log, "No map for camera found"); return; } const std::list& layers = m_map->getLayers(); std::list::const_iterator layer_it = layers.begin(); for (;layer_it != layers.end(); ++layer_it) { LayerCache* cache = m_cache[*layer_it]; if(!cache) { addLayer(*layer_it); cache = m_cache[*layer_it]; FL_ERR(_log, LMsg("Layer Cache miss! (This shouldn't happen!)") << (*layer_it)->getId()); } RenderList& instancesToRender = m_layerToInstances[*layer_it]; if ((*layer_it)->isStatic() && m_transform == NoneTransform) { continue; } cache->update(m_transform, instancesToRender); } resetUpdates(); } void Camera::render() { updateRenderLists(); if (!m_map) { return; } uint32_t lm = m_renderbackend->getLightingModel(); if (lm != 0) { m_renderbackend->resetStencilBuffer(0); if (m_lighting) { m_renderbackend->setLighting(m_light_colors[0], m_light_colors[1], m_light_colors[2]); } } const std::list& layers = m_map->getLayers(); std::list::const_iterator layer_it = layers.begin(); for ( ; layer_it != layers.end(); ++layer_it) { // layer with static flag will rendered as one texture if ((*layer_it)->isStatic()) { renderStaticLayer(*layer_it, m_updated); continue; } } m_renderbackend->pushClipArea(getViewPort()); layer_it = layers.begin(); for ( ; layer_it != layers.end(); ++layer_it) { // layer with static flag will rendered as one texture if ((*layer_it)->isStatic()) { m_cache[*layer_it]->getCacheImage()->render(m_viewport); m_renderbackend->renderVertexArrays(); continue; } RenderList& instancesToRender = m_layerToInstances[*layer_it]; // split the RenderList into smaller parts if (instancesToRender.size() > MAX_BATCH_SIZE) { uint8_t batches = ceil(instancesToRender.size() / static_cast(MAX_BATCH_SIZE)); uint32_t residual = instancesToRender.size() % MAX_BATCH_SIZE; for (uint8_t i = 0; i < batches; ++i) { uint32_t start = i*MAX_BATCH_SIZE; uint32_t end = start + ((i+1 == batches) ? residual : MAX_BATCH_SIZE); RenderList tempList(instancesToRender.begin() + start, instancesToRender.begin() + end); std::list::iterator r_it = m_pipeline.begin(); for (; r_it != m_pipeline.end(); ++r_it) { if ((*r_it)->isActivedLayer(*layer_it)) { (*r_it)->render(this, *layer_it, tempList); m_renderbackend->renderVertexArrays(); } } } } else { std::list::iterator r_it = m_pipeline.begin(); for (; r_it != m_pipeline.end(); ++r_it) { if ((*r_it)->isActivedLayer(*layer_it)) { (*r_it)->render(this, *layer_it, instancesToRender); m_renderbackend->renderVertexArrays(); } } } } renderOverlay(); m_renderbackend->renderVertexArrays(); if (m_lighting && lm != 0) { m_renderbackend->resetLighting(); } m_renderbackend->popClipArea(); } } fifengine-0.4.2/engine/core/view/camera.h000066400000000000000000000402241341615052600202240ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_VIEW_CAMERA_H #define FIFE_VIEW_CAMERA_H // Standard C++ library includes #include #include #include // 3rd party library includes #include // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "model/structures/location.h" #include "util/structures/rect.h" #include "util/math/matrix.h" #include "video/animation.h" #include "rendererbase.h" namespace FIFE { typedef Point3D ScreenPoint; class Layer; class Instance; class RenderBackend; class LayerCache; class MapObserver; typedef std::map t_layer_to_instances; /** Camera describes properties of a view port shown in the main screen * Main screen can have multiple cameras active simultanously * Different cameras can have different properties, like location * to shoot, zoom or tilt */ class Camera: public IRendererListener, public IRendererContainer { public: enum TransformType { NoneTransform = 0x00, TiltTransform = 0x01, RotationTransform = 0x02, ZoomTransform = 0x04, PositionTransform = 0x08, ZTransform = 0x10 }; typedef uint32_t Transform; /** Constructor * Camera needs to be added to the view. If not done so, it is not rendered. * @param id identifier for the camera * @param map map where camera is bound * @param viewport used viewport for the camera. Viewport is measured in pixels in relation to game main screen * @param renderbackend to use with rendering */ Camera(const std::string& id, Map* map, const Rect& viewport, RenderBackend* renderbackend); /** Destructor */ virtual ~Camera(); /** Gets the identifier for this camera. */ const std::string& getId() const { return m_id; } /** Sets the identifier for this camera. */ void setId(const std::string& id) { m_id = id; } /** Gets the map where camera is bound. * @return The associated map for this camera. */ Map* getMap() { return m_map; } /** Sets tilt for the camera. * e.g. overhead camera has tilt 0, while traditional isometric camera has tilt 45 * @param tilt tilt for the camera */ void setTilt(double tilt); /** Gets camera tilt * @return tilt of camera */ double getTilt() const; /** Sets rotation for the camera. * Rotation can be visualized by thinking camera that rotates around an object * that it is rendering * @param rotation rotation for the camera */ void setRotation(double rotation); /** Gets camera rotation * @return rotation of the camera */ double getRotation() const; /** Sets zoom for the camera. * @param zoom zoom for the camera */ void setZoom(double zoom); /** Gets camera zoom * @return zoom of the camera */ double getZoom() const; /** Gets original zToY transformation value. * @return zToY value of the camera. */ double getOriginalZToY() const; /** Sets zToY value for the camera and enables their use. * This means the factor which influenced the z to y transformation, * so if you set zToY=32 then 1z corresponds to 32 pixels in y direction. * @param zToY influenced the z to y transformation of the camera. */ void setZToY(double zToY); /** Gets zToY value. * @return zToY value of the camera. */ double getZToY() const; /** Sets z to y manipulation enabled / disabled. * @param enabled If true then the zToY value is used instead of the original matrix value. */ void setZToYEnabled(bool enabled); /** Gets if z to y manipulation is enabled / disabled. * @return true if z to y manipulation is enabled, otherwise false. */ bool isZToYEnabled() const; /** Sets screen cell image dimensions. * Cell image dimension is basically width and height of a bitmap, that covers * one cell in the layer where camera is bind * @return Point Point containing x=width and y=height */ void setCellImageDimensions(uint32_t width, uint32_t height); /** Gets screen cell image dimensions. * @see setCellImageDimensions * @return Point containing x=width and y=height */ Point getCellImageDimensions(); /** Gets screen cell image dimensions for given layer. * @return Point containing x=width and y=height */ Point getCellImageDimensions(Layer* layer); /** Gets x reference scale for cell image dimensions */ double getReferenceScaleX() const { return m_referenceScaleX; } /** Gets y reference scale for cell image dimensions */ double getReferenceScaleY() const { return m_referenceScaleY; } /** Sets the location for camera * @param location location (center point) to render */ void setLocation(const Location& location); /** Gets the location camera is rendering. If no location was set, the camera creates a location. * The top layer of the map together with current camera position are used for that. * @return camera location */ Location getLocation(); /** Sets map point for the camera * @param position The camera position on the map */ void setPosition(const ExactModelCoordinate& position); /** Gets map point of the camera * @return The camera position on the map */ ExactModelCoordinate getPosition() const; /** Gets screen point of the camera * @return camera screen point */ Point3D getOrigin() const; /** Attaches the camera to an instance. * @param instance Instance to which the camera shall be attached * @note The camera can only be attached to an instance at the same layer! */ void attach(Instance *instance); /** Detaches the camera from an instance. */ void detach(); /** Returns instance where camera is attached. NULL if not attached */ Instance* getAttached() const { return m_attachedTo; } /** Sets the viewport for camera * viewport is rectangle inside the view where camera renders * @param viewport area for camera render */ void setViewPort(const Rect& viewport); /** Gets the viewport for camera in pixel coordinates * @return camera viewport */ const Rect& getViewPort() const; /** Gets the viewport for camera in map coordinates * @return camera viewport */ const Rect& getMapViewPort(); /** Gets the viewport for camera in layer coordinates * @param layer A pointer to the layer whose geometry is used for the conversion * @return camera viewport */ Rect getLayerViewPort(Layer* layer); /** Transforms given point from screen coordinates to map coordinates * @param screen_coords screen coordinates to transform * @param z_calculated if true, z-value (depth cut point) is pre-calculated. If false, camera calculates it * @return point in map coordinates */ ExactModelCoordinate toMapCoordinates(ScreenPoint screen_coords, bool z_calculated=true); /** Transforms given point from map coordinates to screen coordinates * @return point in screen coordinates */ ScreenPoint toScreenCoordinates(const ExactModelCoordinate& map_coords); /** Transforms given point from map coordinates to virtual screen coordinates * @return point in virtual screen coordinates */ DoublePoint3D toVirtualScreenCoordinates(const ExactModelCoordinate& map_coords); /** Transforms given point from virtual screen coordinates to screen coordinates * @return point in screen coordinates */ ScreenPoint virtualScreenToScreen(const DoublePoint3D& p); /** Transforms given point from screen coordinates to virtual screen coordinates * @return point in virtual screen coordinates */ DoublePoint3D screenToVirtualScreen(const ScreenPoint& p); /** Sets camera enabled / disabled */ void setEnabled(bool enabled); /** Gets if camera is enabled / disabled */ bool isEnabled(); /** Returns reference to RenderList. */ RenderList& getRenderListRef(Layer* layer); /** Returns instances that match given screen coordinate * @param screen_coords screen coordinates to be used for hit search * @param layer layer to use for search * @param instances list of instances that is filled based on hit test results * @param alpha the alpha to use to filter the matching instances. Pixels * that have an alpha value higher than what is specified here are * considered a hit. */ void getMatchingInstances(ScreenPoint screen_coords, Layer& layer, std::list& instances, uint8_t alpha = 0); /** Returns instances that match given screen coordinate * @param screen_rect rect that contains screen coordinates to be used for search * @param layer layer to use for search * @param instances list of instances that is filled based on hit test results * @param alpha the alpha to use to filter the matching instances. Pixels * that have an alpha value higher than what is specified here are * considered a hit. */ void getMatchingInstances(Rect screen_rect, Layer& layer, std::list& instances, uint8_t alpha = 0); /** Returns instances that match given location. Instances are sorted based on camera view, so that "topmost" * instance is first in returned list * @param loc location where to fetch instances from * @param instances list of instances that is filled based on hit test results * @param use_exactcoordinates if true, comparison is done using exact coordinates. if not, cell coordinates are used */ void getMatchingInstances(Location& loc, std::list& instances, bool use_exactcoordinates=false); /** General update routine. * In this function, the camera's position gets updated when its attached * to another instance. * @note call this only once in engine update cycle, so that tracking between * current position and previous position keeps in sync. This information * is used e.g. by view to fix the pixel wobbling problem */ void update(); /** Refreshes camera view in case e.g. location is updated directly (not via setLocation) * @note calling this function marks camera as "warped", therefore it causes all instance * positions to be recalculated. If you constantly call this, you end up with pixel wobbling * effect when camera is moved. */ void refresh(); /** Resets temporary values from last update round, like warped flag */ void resetUpdates(); /** Returns true if camera view has been updated, otherwise false */ bool isUpdated() { return m_updated; } /** Adds new renderer on the view. Ownership is transferred to the camera. */ void addRenderer(RendererBase* renderer); /** Gets renderer with given name */ RendererBase* getRenderer(const std::string& name); /** resets active layer information on all renderers. */ void resetRenderers(); /** calculates z-value for given screenpoint */ void calculateZValue(DoublePoint3D& screen_coords); void onRendererPipelinePositionChanged(RendererBase* renderer); void onRendererEnabledChanged(RendererBase* renderer); /** Sets lighting color */ void setLightingColor(float red, float green, float blue); /** Resets lighting color */ void resetLightingColor(); /** Returns a vector that contain the light color */ std::vector getLightingColor(); /** Sets a color as overlay */ void setOverlayColor(uint8_t red, uint8_t green, uint8_t blue, uint8_t alpha); /** Returns a vector that contain the overlay color */ std::vector getOverlayColor(); /** Resets the color overlay */ void resetOverlayColor(); /** Sets a image as overlay, * if fill is true the image gets the viewport size. */ void setOverlayImage(int32_t id, bool fill = false); /** Returns the pool id of the overlay image */ int32_t getOverlayImage(); /** Resets the image overlay */ void resetOverlayImage(); /** Sets a animation as overlay, * if fill is true the animation gets the viewport size. */ void setOverlayAnimation(AnimationPtr anim, bool fill = false); /** Returns an AnimationPtr to the overlay animation */ AnimationPtr getOverlayAnimation(); /** Resets the animation overlay */ void resetOverlayAnimation(); /** Renders camera */ void render(); private: friend class MapObserver; void addLayer(Layer* layer); void removeLayer(Layer* layer); void init(); std::string m_id; Map* m_map; Rect m_viewport; RenderBackend* m_renderbackend; ExactModelCoordinate m_position; /** Updates the camera transformation matrix T with requested values. * The requests are done using these functions : * - setLocation * - setRotation * - setTilt */ void updateMatrices(); /** Updates camera reference scale * Reference scale is in a sense an internal zooming factor, * which adjusts cell dimensions in logical space to ones shown on * screen. Calculation is based on current camera properties (e.g. rotation) */ void updateReferenceScale(); /** Updates camera RenderLists */ void updateRenderLists(); /** Gets logical cell image dimensions for given layer */ DoublePoint getLogicalCellDimensions(Layer* layer); /** Gets logical cell image dimensions and ignores the layer and cellgrid */ DoublePoint getLogicalCellDimensions(); /** Renders the overlay(color, image, animation) for the camera. */ void renderOverlay(); /** Renders the layer part that is on screen as one image. */ void renderStaticLayer(Layer* layer, bool update); DoubleMatrix m_matrix; DoubleMatrix m_inverse_matrix; DoubleMatrix m_vs_matrix; DoubleMatrix m_vs_inverse_matrix; DoubleMatrix m_vscreen_2_screen; DoubleMatrix m_screen_2_vscreen; double m_tilt; double m_rotation; double m_zoom; double m_zToY; bool m_enabledZToY; Location m_location; ScreenPoint m_curOrigin; Rect m_mapViewPort; bool m_mapViewPortUpdated; uint32_t m_screenCellWidth; uint32_t m_screenCellHeight; double m_referenceScaleX; double m_referenceScaleY; bool m_enabled; Instance* m_attachedTo; // contains the geometry changes Transform m_transform; // list of renderers managed by the view std::map m_renderers; std::list m_pipeline; // false, if view has not been updated bool m_updated; // caches layer -> instances structure between renders e.g. to fast query of mouse picking order t_layer_to_instances m_layerToInstances; std::map m_cache; MapObserver* m_map_observer; // is lighting enable bool m_lighting; // caches the light color for the camera std::vector m_light_colors; // overlay stuff bool m_col_overlay; bool m_img_overlay; bool m_ani_overlay; SDL_Color m_overlay_color; int32_t m_img_id; AnimationPtr m_ani_ptr; bool m_img_fill; bool m_ani_fill; uint32_t m_start_time; }; } #endif fifengine-0.4.2/engine/core/view/camera.i000066400000000000000000000101051341615052600202200ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fife %{ #include "view/camera.h" #include "view/rendererbase.h" %} %include "view/rendererbase.i" namespace FIFE { typedef Point3D ScreenPoint; %template(ScreenPoint) PointType3D; %apply std::list &OUTPUT { std::list& instances }; class Camera: public IRendererContainer { public: ~Camera(); const std::string& getId() const; void setId(const std::string& id); void setTilt(double tilt); double getTilt() const; void setRotation(double rotation); double getRotation() const; void setZoom(double zoom); double getZoom() const; double getOriginalZToY() const; void setZToY(double zToY); double getZToY() const; void setZToYEnabled(bool enabled); bool isZToYEnabled() const; void setLocation(Location location); Location getLocation(); void setPosition(const ExactModelCoordinate& position); ExactModelCoordinate getPosition() const; Point3D getOrigin() const; void attach(Instance *instance); void detach(); Instance* getAttached() const; void setViewPort(const Rect& viewport); const Rect& getViewPort() const; const Rect& getMapViewPort(); Rect getLayerViewPort(Layer* layer); void setCellImageDimensions(uint32_t width, uint32_t height); Point getCellImageDimensions(); Point getCellImageDimensions(Layer* layer); ScreenPoint toScreenCoordinates(const ExactModelCoordinate& map_coords); ExactModelCoordinate toMapCoordinates(ScreenPoint screen_coords, bool z_calculated=true); void setEnabled(bool enabled); bool isEnabled(); void getMatchingInstances(ScreenPoint screen_coords, Layer& layer, std::list& instances, uint8_t alpha = 0); void getMatchingInstances(Rect screen_rect, Layer& layer, std::list& instances, uint8_t alpha = 0); void getMatchingInstances(Location& loc, std::list& instances, bool use_exactcoordinates=false); RendererBase* getRenderer(const std::string& name); void resetRenderers(); void setLightingColor(float red, float green, float blue); void resetLightingColor(); std::vector getLightingColor(); void setOverlayColor(uint8_t red, uint8_t green, uint8_t blue, uint8_t alpha); std::vector getOverlayColor(); void resetOverlayColor(); void setOverlayImage(int32_t id, bool fill = false); int32_t getOverlayImage(); void resetOverlayImage(); void setOverlayAnimation(AnimationPtr anim, bool fill = false); AnimationPtr getOverlayAnimation(); void resetOverlayAnimation(); void refresh(); private: Camera(); }; %clear std::list& instances; } %clear InstanceLst& instances; fifengine-0.4.2/engine/core/view/layercache.cpp000066400000000000000000000664441341615052600214430ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "model/metamodel/grids/cellgrid.h" #include "model/metamodel/action.h" #include "model/structures/layer.h" #include "model/structures/instance.h" #include "model/structures/location.h" #include "util/base/exception.h" #include "util/log/logger.h" #include "util/math/fife_math.h" #include "util/math/angles.h" #include "video/renderbackend.h" #include "video/image.h" #include "video/animation.h" #include "video/imagemanager.h" #include "camera.h" #include "layercache.h" #include "visual.h" namespace FIFE { /** Logger to use for this source file. * @relates Logger */ static Logger _log(LM_CAMERA); class CacheLayerChangeListener : public LayerChangeListener { public: CacheLayerChangeListener(LayerCache* cache) { m_cache = cache; } virtual ~CacheLayerChangeListener() {}; virtual void onLayerChanged(Layer* layer, std::vector& instances) { for(std::vector::iterator i = instances.begin(); i != instances.end(); ++i) { m_cache->updateInstance(*i); } } virtual void onInstanceCreate(Layer* layer, Instance* instance) { m_cache->addInstance(instance); } virtual void onInstanceDelete(Layer* layer, Instance* instance) { m_cache->removeInstance(instance); } private: LayerCache* m_cache; }; /** Comparison functions for sorting */ // used screenpoint z for sorting, calculated from camera class InstanceDistanceSortCamera { public: inline bool operator()(RenderItem* const & lhs, RenderItem* const & rhs) { if (Mathd::Equal(lhs->screenpoint.z, rhs->screenpoint.z)) { InstanceVisual* liv = lhs->instance->getVisual(); InstanceVisual* riv = rhs->instance->getVisual(); return liv->getStackPosition() < riv->getStackPosition(); } return lhs->screenpoint.z < rhs->screenpoint.z; } }; // used instance location and camera rotation for sorting class InstanceDistanceSortLocation { public: InstanceDistanceSortLocation(double rotation) { if ((rotation >= 0) && (rotation <= 60)) { // 30 deg xtox = 0; xtoy = -1; ytox = 1; ytoy = 0.5; } else if ((rotation >= 60) && (rotation <= 120)) { // 90 deg xtox = -1; xtoy = -1; ytox = 0.5; ytoy = -0.5; } else if ((rotation >= 120) && (rotation <= 180)) { // 150 deg xtox = 0; xtoy = -1; ytox = -1; ytoy = -0.5; } else if ((rotation >= 180) && (rotation <= 240)) { // 210 deg xtox = 0; xtoy = 1; ytox = -1; ytoy = -0.5; } else if ((rotation >= 240) && (rotation <= 300)) { // 270 deg xtox = 1; xtoy = 1; ytox = -0.5; ytoy = 0.5; } else if ((rotation >= 300) && (rotation <= 360)) { // 330 deg xtox = 0; xtoy = 1; ytox = 1; ytoy = 0.5; } } inline bool operator()(RenderItem* const & lhs, RenderItem* const & rhs) { ExactModelCoordinate lpos = lhs->instance->getLocationRef().getExactLayerCoordinates(); ExactModelCoordinate rpos = rhs->instance->getLocationRef().getExactLayerCoordinates(); lpos.x += lpos.y / 2; rpos.x += rpos.y / 2; InstanceVisual* liv = lhs->instance->getVisual(); InstanceVisual* riv = rhs->instance->getVisual(); int32_t lvc = ceil(xtox*lpos.x + ytox*lpos.y) + ceil(xtoy*lpos.x + ytoy*lpos.y) + liv->getStackPosition(); int32_t rvc = ceil(xtox*rpos.x + ytox*rpos.y) + ceil(xtoy*rpos.x + ytoy*rpos.y) + riv->getStackPosition(); if (lvc == rvc) { if (Mathd::Equal(lpos.z, rpos.z)) { return liv->getStackPosition() < riv->getStackPosition(); } return lpos.z < rpos.z; } return lvc < rvc; } private: double xtox; double xtoy; double ytox; double ytoy; }; // used screenpoint z for sorting and as fallback first the instance location z and then the stack position class InstanceDistanceSortCameraAndLocation { public: inline bool operator()(RenderItem* const & lhs, RenderItem* const & rhs) { if (Mathd::Equal(lhs->screenpoint.z, rhs->screenpoint.z)) { const ExactModelCoordinate& lpos = lhs->instance->getLocationRef().getExactLayerCoordinatesRef(); const ExactModelCoordinate& rpos = rhs->instance->getLocationRef().getExactLayerCoordinatesRef(); if (Mathd::Equal(lpos.z, rpos.z)) { InstanceVisual* liv = lhs->instance->getVisual(); InstanceVisual* riv = rhs->instance->getVisual(); return liv->getStackPosition() < riv->getStackPosition(); } return lpos.z < rpos.z; } return lhs->screenpoint.z < rhs->screenpoint.z; } }; LayerCache::LayerCache(Camera* camera) { m_camera = camera; m_layer = 0; m_layerObserver = 0; m_tree = 0; m_zMin = 0.0; m_zMax = 0.0; m_zoom = camera->getZoom(); m_zoomed = !Mathd::Equal(m_zoom, 1.0); m_straightZoom = Mathd::Equal(fmod(m_zoom, 1.0), 0.0); if(RenderBackend::instance()->getName() == "OpenGL" && RenderBackend::instance()->isDepthBufferEnabled()) { m_needSorting = false; } else { m_needSorting = true; } } LayerCache::~LayerCache() { // removes all Entries for (std::vector::iterator it = m_entries.begin(); it != m_entries.end(); ++it) { delete *it; } // removes all RenderItems for (std::vector::iterator it = m_renderItems.begin(); it != m_renderItems.end(); ++it) { delete *it; } m_layer->removeChangeListener(m_layerObserver); delete m_layerObserver; delete m_tree; } void LayerCache::setLayer(Layer* layer) { if (m_layer != layer) { if (m_layer) { m_layer->removeChangeListener(m_layerObserver); delete m_layerObserver; } m_layer = layer; m_layerObserver = new CacheLayerChangeListener(this); layer->addChangeListener(m_layerObserver); reset(); } } void LayerCache::reset() { // removes all Entries for (std::vector::iterator it = m_entries.begin(); it != m_entries.end(); ++it) { delete *it; } m_entries.clear(); // removes all RenderItems for (std::vector::iterator it = m_renderItems.begin(); it != m_renderItems.end(); ++it) { delete *it; } m_renderItems.clear(); m_instance_map.clear(); m_entriesToUpdate.clear(); m_freeEntries.clear(); m_cacheImage.reset(); delete m_tree; m_tree = new CacheTree; const std::vector& instances = m_layer->getInstances(); for(std::vector::const_iterator i = instances.begin(); i != instances.end(); ++i) { addInstance(*i); } } void LayerCache::addInstance(Instance* instance) { assert(m_instance_map.find(instance) == m_instance_map.end()); RenderItem* item; Entry* entry; if (m_freeEntries.empty()) { // creates new RenderItem item = new RenderItem(instance); m_renderItems.push_back(item); m_instance_map[instance] = m_renderItems.size() - 1; // creates new Entry entry = new Entry(); m_entries.push_back(entry); entry->instanceIndex = m_renderItems.size() - 1; entry->entryIndex = m_entries.size() - 1; } else { // uses free/unused RenderItem int32_t index = m_freeEntries.front(); m_freeEntries.pop_front(); item = m_renderItems[index]; item->instance = instance; m_instance_map[instance] = index; // uses free/unused Entry entry = m_entries[index]; entry->instanceIndex = index; entry->entryIndex = index; } entry->node = 0; entry->forceUpdate = true; entry->visible = true; entry->updateInfo = EntryFullUpdate; m_entriesToUpdate.insert(entry->entryIndex); } void LayerCache::removeInstance(Instance* instance) { assert(m_instance_map.find(instance) != m_instance_map.end()); Entry* entry = m_entries[m_instance_map[instance]]; assert(entry->instanceIndex == m_instance_map[instance]); RenderItem* item = m_renderItems[entry->instanceIndex]; // removes entry from updates std::set::iterator it = m_entriesToUpdate.find(entry->entryIndex); if (it != m_entriesToUpdate.end()) { m_entriesToUpdate.erase(it); } // removes entry from CacheTree if (entry->node) { entry->node->data().erase(entry->entryIndex); entry->node = 0; } entry->instanceIndex = -1; entry->forceUpdate = false; m_instance_map.erase(instance); // removes instance from RenderList RenderList& renderList = m_camera->getRenderListRef(m_layer); for (RenderList::iterator it = renderList.begin(); it != renderList.end(); ++it) { if ((*it)->instance == instance) { renderList.erase(it); break; } } // resets RenderItem item->reset(); // adds free entry m_freeEntries.push_back(entry->entryIndex); } void LayerCache::updateInstance(Instance* instance) { Entry* entry = m_entries[m_instance_map[instance]]; if (entry->instanceIndex == -1) { return; } // convert necessary instance update flags to entry update flags const InstanceChangeInfo ici = instance->getChangeInfo(); if ((ici & ICHANGE_LOC) == ICHANGE_LOC) { entry->updateInfo |= EntryPositionUpdate; } if ((ici & ICHANGE_ROTATION) == ICHANGE_ROTATION || (ici & ICHANGE_ACTION) == ICHANGE_ACTION || (ici & ICHANGE_TRANSPARENCY) == ICHANGE_TRANSPARENCY || (ici & ICHANGE_VISIBLE) == ICHANGE_VISIBLE || (ici & ICHANGE_VISUAL) == ICHANGE_VISUAL) { entry->updateInfo |= EntryVisualUpdate; } // if entry is not already inserted if (!entry->forceUpdate && entry->updateInfo != EntryNoneUpdate) { entry->forceUpdate = true; m_entriesToUpdate.insert(entry->entryIndex); } } class CacheTreeCollector { std::vector& m_indices; Rect m_viewport; public: CacheTreeCollector(std::vector& indices, const Rect& viewport) : m_indices(indices), m_viewport(viewport) { } bool visit(LayerCache::CacheTree::Node* node, int32_t d = -1); }; bool CacheTreeCollector::visit(LayerCache::CacheTree::Node* node, int32_t d) { if(!m_viewport.intersects(Rect(node->x(), node->y(),node->size(),node->size()))) { return false; } m_indices.insert(m_indices.end(), node->data().begin(), node->data().end()); return true; } void LayerCache::collect(const Rect& viewport, std::vector& index_list) { CacheTree::Node * node = m_tree->find_container(viewport); CacheTreeCollector collector(index_list, viewport); node->apply_visitor(collector); node = node->parent(); while(node) { collector.visit(node); node = node->parent(); } } void LayerCache::update(Camera::Transform transform, RenderList& renderlist) { // this is only a bit faster, but works without this block too. if(!m_layer->areInstancesVisible()) { FL_DBG(_log, "Layer instances hidden"); std::set::const_iterator entry_it = m_entriesToUpdate.begin(); for (; entry_it != m_entriesToUpdate.end(); ++entry_it) { Entry* entry = m_entries[*entry_it]; entry->forceUpdate = false; entry->visible = false; } m_entriesToUpdate.clear(); renderlist.clear(); return; } // if transform is none then we have only to update the instances with an update info. if (transform == Camera::NoneTransform) { if (!m_entriesToUpdate.empty()) { std::set entryToRemove; updateEntries(entryToRemove, renderlist); //std::cout << "update entries: " << int32_t(m_entriesToUpdate.size()) << " remove entries: " << int32_t(entryToRemove.size()) <<"\n"; if (!entryToRemove.empty()) { std::set::iterator entry_it = entryToRemove.begin(); for (; entry_it != entryToRemove.end(); ++entry_it) { m_entriesToUpdate.erase(*entry_it); } } } } else { m_zoom = m_camera->getZoom(); m_zoomed = !Mathd::Equal(m_zoom, 1.0); m_straightZoom = Mathd::Equal(fmod(m_zoom, 1.0), 0.0); // clear old renderlist renderlist.clear(); // update all entries if ((transform & Camera::RotationTransform) == Camera::RotationTransform || (transform & Camera::TiltTransform) == Camera::TiltTransform || (transform & Camera::ZTransform) == Camera::ZTransform) { fullUpdate(transform); } else { fullCoordinateUpdate(transform); } // create viewport coordinates to collect entries Rect viewport = m_camera->getViewPort(); Rect screenViewport = viewport; DoublePoint3D viewport_a = m_camera->screenToVirtualScreen(Point3D(viewport.x, viewport.y)); DoublePoint3D viewport_b = m_camera->screenToVirtualScreen(Point3D(viewport.right(), viewport.bottom())); viewport.x = static_cast(std::min(viewport_a.x, viewport_b.x)); viewport.y = static_cast(std::min(viewport_a.y, viewport_b.y)); viewport.w = static_cast(std::max(viewport_a.x, viewport_b.x) - viewport.x); viewport.h = static_cast(std::max(viewport_a.y, viewport_b.y) - viewport.y); m_zMin = 0.0; m_zMax = 0.0; // FL_LOG(_log, LMsg("camera-update viewport") << viewport); std::vector index_list; collect(viewport, index_list); // fill renderlist for (uint32_t i = 0; i != index_list.size(); ++i) { Entry* entry = m_entries[index_list[i]]; RenderItem* item = m_renderItems[entry->instanceIndex]; if (!item->image || !entry->visible) { continue; } if (item->dimensions.intersects(screenViewport)) { renderlist.push_back(item); } } if (m_needSorting) { sortRenderList(renderlist); } else { // calculates zmin and zmax of the current viewport Rect r = m_camera->getMapViewPort(); std::vector coords; coords.push_back(ExactModelCoordinate(r.x, r.y)); coords.push_back(ExactModelCoordinate(r.x, r.y+r.h)); coords.push_back(ExactModelCoordinate(r.x+r.w, r.y)); coords.push_back(ExactModelCoordinate(r.x+r.w, r.y+r.h)); for (uint8_t i = 0; i < 4; ++i) { double z = m_camera->toVirtualScreenCoordinates(coords[i]).z; m_zMin = std::min(z, m_zMin); m_zMax = std::max(z, m_zMax); } sortRenderList(renderlist); } } } void LayerCache::fullUpdate(Camera::Transform transform) { bool rotationChange = (transform & Camera::RotationTransform) == Camera::RotationTransform; for (uint32_t i = 0; i != m_entries.size(); ++i) { Entry* entry = m_entries[i]; if (entry->instanceIndex != -1) { if (rotationChange || entry->forceUpdate) { bool force = entry->forceUpdate; updateVisual(entry); if (force && !entry->forceUpdate) { // no action entry->updateInfo = EntryNoneUpdate; m_entriesToUpdate.erase(entry->entryIndex); } else if (!force && entry->forceUpdate) { // new action entry->updateInfo |= EntryVisualUpdate; m_entriesToUpdate.insert(entry->entryIndex); } } updatePosition(entry); } } } void LayerCache::fullCoordinateUpdate(Camera::Transform transform) { bool zoomChange = (transform & Camera::ZoomTransform) == Camera::ZoomTransform; for (uint32_t i = 0; i != m_entries.size(); ++i) { Entry* entry = m_entries[i]; if (entry->instanceIndex != -1) { if (entry->forceUpdate) { updateVisual(entry); updatePosition(entry); if (!entry->forceUpdate) { // no action entry->updateInfo = EntryNoneUpdate; m_entriesToUpdate.erase(entry->entryIndex); } continue; } updateScreenCoordinate(m_renderItems[entry->instanceIndex], zoomChange); } } } void LayerCache::updateEntries(std::set& removes, RenderList& renderlist) { RenderList needSorting; Rect viewport = m_camera->getViewPort(); std::set::const_iterator entry_it = m_entriesToUpdate.begin(); for (; entry_it != m_entriesToUpdate.end(); ++entry_it) { Entry* entry = m_entries[*entry_it]; entry->forceUpdate = false; if (entry->instanceIndex == -1) { entry->updateInfo = EntryNoneUpdate; removes.insert(*entry_it); continue; } RenderItem* item = m_renderItems[entry->instanceIndex]; bool onScreenA = entry->visible && item->image && item->dimensions.intersects(viewport); bool positionUpdate = (entry->updateInfo & EntryPositionUpdate) == EntryPositionUpdate; if ((entry->updateInfo & EntryVisualUpdate) == EntryVisualUpdate) { positionUpdate |= updateVisual(entry); } if (positionUpdate) { updatePosition(entry); } bool onScreenB = entry->visible && item->image && item->dimensions.intersects(viewport); if (onScreenA != onScreenB) { if (!onScreenA) { // add to renderlist and sort renderlist.push_back(item); needSorting.push_back(item); } else { // remove from renderlist for (RenderList::iterator it = renderlist.begin(); it != renderlist.end(); ++it) { if ((*it)->instance == item->instance) { renderlist.erase(it); break; } } } } else if (onScreenA && onScreenB && positionUpdate) { // sort needSorting.push_back(item); } if (!entry->forceUpdate) { entry->forceUpdate = false; entry->updateInfo = EntryNoneUpdate; removes.insert(*entry_it); } else { entry->updateInfo = EntryVisualUpdate; } } if (!needSorting.empty()) { if (m_needSorting) { sortRenderList(renderlist); } else { sortRenderList(needSorting); } } } bool LayerCache::updateVisual(Entry* entry) { RenderItem* item = m_renderItems[entry->instanceIndex]; Instance* instance = item->instance; InstanceVisual* visual = instance->getVisual(); item->facingAngle = instance->getRotation(); int32_t angle = static_cast(m_camera->getRotation()) + item->facingAngle; Action* action = instance->getCurrentAction(); ImagePtr image; if (visual) { uint8_t layerTrans = m_layer->getLayerTransparency(); uint8_t instanceTrans = visual->getTransparency(); if (layerTrans != 0) { if (instanceTrans != 0) { uint8_t calcTrans = layerTrans - instanceTrans; if (calcTrans >= 0) { instanceTrans = calcTrans; } else { instanceTrans = 0; } } else { instanceTrans = layerTrans; } } item->transparency = 255 - instanceTrans; // only visible if visual and layer are visible and item is not totally transparent entry->visible = (visual->isVisible() && item->transparency != 0) && m_layer->areInstancesVisible(); } // delete old overlay item->deleteOverlayData(); if (!action) { // Try static images then default action. int32_t image_id = item->getStaticImageIndexByAngle(angle, instance); if (image_id == -1) { if (!instance->getObject()->isStatic()) { action = instance->getObject()->getDefaultAction(); } } else { image = ImageManager::instance()->get(image_id); } } entry->forceUpdate = (action != 0); if (action) { ActionVisual* actionVisual = action->getVisual(); bool colorOverlay = actionVisual->isColorOverlay(); // assumed all have the same size if (actionVisual->isAnimationOverlay()) { std::map animations = actionVisual->getAnimationOverlay(angle); std::map::iterator it = animations.begin(); std::vector* animOverlays = new std::vector(); std::vector* animationColorOverlays = colorOverlay ? new std::vector() : 0; for (; it != animations.end(); ++it) { uint32_t animationTime = instance->getActionRuntime() % it->second->getDuration(); image = it->second->getFrameByTimestamp(animationTime); animOverlays->push_back(image); if (colorOverlay) { OverlayColors* co = actionVisual->getColorOverlay(angle, it->first); if (co) { AnimationPtr ovAnim = co->getColorOverlayAnimation(); animationTime = instance->getActionRuntime() % ovAnim->getDuration(); co->setColorOverlayImage(ovAnim->getFrameByTimestamp(animationTime)); } animationColorOverlays->push_back(co); } // works only for one animation int32_t actionFrame = it->second->getActionFrame(); if (actionFrame != -1) { int32_t newFrame = it->second->getFrameIndex(animationTime); if (item->currentFrame != newFrame) { if (actionFrame == newFrame) { instance->callOnActionFrame(action, actionFrame); // if action frame was skipped } else if (newFrame > actionFrame && item->currentFrame < actionFrame) { instance->callOnActionFrame(action, actionFrame); } item->currentFrame = newFrame; } } } // transfer ownership of the vectors to RenderItem item->setAnimationOverlay(animOverlays, animationColorOverlays); } else { AnimationPtr animation = action->getVisual()->getAnimationByAngle(angle); uint32_t animationTime = instance->getActionRuntime() % animation->getDuration(); image = animation->getFrameByTimestamp(animationTime); // if the action have an animation with only one frame (idle animation) then // a forced update is not necessary. if (animation->getFrameCount() <= 1) { entry->forceUpdate = false; } if (colorOverlay) { OverlayColors* co = actionVisual->getColorOverlay(angle); if (co) { AnimationPtr ovAnim = co->getColorOverlayAnimation(); animationTime = instance->getActionRuntime() % ovAnim->getDuration(); co->setColorOverlayImage(ovAnim->getFrameByTimestamp(animationTime)); item->setColorOverlay(co); } } int32_t actionFrame = animation->getActionFrame(); if (actionFrame != -1) { if (item->image != image) { int32_t newFrame = animation->getFrameIndex(animationTime); if (actionFrame == newFrame) { instance->callOnActionFrame(action, actionFrame); // if action frame was skipped } else if (newFrame > actionFrame && item->currentFrame < actionFrame) { instance->callOnActionFrame(action, actionFrame); } item->currentFrame = newFrame; } } } } bool newPosition = false; if (image != item->image) { if (!item->image || !image) { newPosition = true; } else if (image->getWidth() != item->image->getWidth() || image->getHeight() != item->image->getHeight() || image->getXShift() != item->image->getXShift() || image->getYShift() != item->image->getYShift()) { newPosition = true; } item->image = image; } return newPosition; } void LayerCache::updatePosition(Entry* entry) { RenderItem* item = m_renderItems[entry->instanceIndex]; Instance* instance = item->instance; ExactModelCoordinate mapCoords = instance->getLocationRef().getMapCoordinates(); DoublePoint3D screenPosition = m_camera->toVirtualScreenCoordinates(mapCoords); ImagePtr image = item->image; if (image) { int32_t w = image->getWidth(); int32_t h = image->getHeight(); screenPosition.x = (screenPosition.x - w / 2) + image->getXShift(); screenPosition.y = (screenPosition.y - h / 2) + image->getYShift(); item->bbox.w = w; item->bbox.h = h; } else { item->bbox.w = 0; item->bbox.h = 0; } item->screenpoint = screenPosition; item->bbox.x = static_cast(screenPosition.x); item->bbox.y = static_cast(screenPosition.y); updateScreenCoordinate(item); CacheTree::Node* node = m_tree->find_container(item->bbox); if (node) { if (node != entry->node) { if (entry->node) { entry->node->data().erase(entry->entryIndex); } entry->node = node; node->data().insert(entry->entryIndex); } } } inline void LayerCache::updateScreenCoordinate(RenderItem* item, bool changedZoom) { Point3D screenPoint = m_camera->virtualScreenToScreen(item->screenpoint); // NOTE: // One would expect this to be necessary here, // however it works the same without, sofar // m_camera->calculateZValue(screenPoint); // item->screenpoint.z = -screenPoint.z; item->dimensions.x = screenPoint.x; item->dimensions.y = screenPoint.y; if (changedZoom) { if (m_zoomed) { item->dimensions.w = round(static_cast(item->bbox.w) * m_zoom); item->dimensions.h = round(static_cast(item->bbox.h) * m_zoom); } else { item->dimensions.w = item->bbox.w; item->dimensions.h = item->bbox.h; } } } void LayerCache::sortRenderList(RenderList& renderlist) { if (renderlist.empty()) { return; } // We want to put every z value in layer z range. // To do it, we simply solve // { y1 = a*x1 + b // { y2 = a*x2 + b // where [y1,y2]' = layer z offset min/max is required z range, // and [x1,x2]' is expected min,max z coords. // more an workaround, because z values are wrong in case of inverted top with bottom if (!m_needSorting && !m_layer->isStatic()) { //if (!m_needSorting) { float det = m_zMin - m_zMax; if (fabs(det) > FLT_EPSILON) { static const float globalrange = 200.0; static const float stackdelta = (FLT_EPSILON * 100.0); int32_t numlayers = m_layer->getLayerCount(); float lmin = m_layer->getZOffset(); float lmax = lmin + globalrange/numlayers; float a = (lmin - lmax) / det; float b = (lmax * m_zMin - lmin * m_zMax) / det; RenderList::iterator it = renderlist.begin(); for ( ; it != renderlist.end(); ++it) { InstanceVisual* vis = (*it)->instance->getVisual(); float& z = (*it)->vertexZ; z = (a * (*it)->screenpoint.z + b) + vis->getStackPosition() * stackdelta; } } } else { SortingStrategy strat = m_layer->getSortingStrategy(); switch (strat) { case SORTING_CAMERA: { InstanceDistanceSortCamera ids; std::stable_sort(renderlist.begin(), renderlist.end(), ids); } break; case SORTING_LOCATION: { InstanceDistanceSortLocation ids(m_camera->getRotation()); std::stable_sort(renderlist.begin(), renderlist.end(), ids); } break; case SORTING_CAMERA_AND_LOCATION: { InstanceDistanceSortCameraAndLocation ids; std::stable_sort(renderlist.begin(), renderlist.end(), ids); } break; default: { InstanceDistanceSortCamera ids; std::stable_sort(renderlist.begin(), renderlist.end(), ids); } break; } } } ImagePtr LayerCache::getCacheImage() { return m_cacheImage; } void LayerCache::setCacheImage(ImagePtr image) { m_cacheImage = image; } } fifengine-0.4.2/engine/core/view/layercache.h000066400000000000000000000077461341615052600211100ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_VIEW_LAYERCACHE_H #define FIFE_VIEW_LAYERCACHE_H // Standard C++ library includes #include #include #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "model/structures/location.h" #include "util/math/matrix.h" #include "util/structures/rect.h" #include "util/structures/quadtree.h" #include "model/metamodel/grids/cellgrid.h" #include "rendererbase.h" namespace FIFE { class Camera; class CacheLayerChangeListener; class LayerCache { public: typedef QuadTree > CacheTree; LayerCache(Camera* camera); ~LayerCache(); void setLayer(Layer* layer); void update(Camera::Transform transform, RenderList& renderlist); void addInstance(Instance* instance); void removeInstance(Instance* instance); void updateInstance(Instance* instance); ImagePtr getCacheImage(); void setCacheImage(ImagePtr image); private: enum RenderEntryUpdateType { EntryNoneUpdate = 0x00, EntryVisualUpdate = 0x01, EntryPositionUpdate = 0x02, EntryFullUpdate = 0x03 }; typedef uint8_t RenderEntryUpdate; struct Entry { // Node in m_tree; CacheTree::Node* node; // Index in m_renderItems; int32_t instanceIndex; // Index in m_entries; int32_t entryIndex; // Force update for entries with animation bool forceUpdate; // Is visible bool visible; // Update info RenderEntryUpdate updateInfo; }; void collect(const Rect& viewport, std::vector& indices); void reset(); void fullUpdate(Camera::Transform transform); void fullCoordinateUpdate(Camera::Transform transform); void updateEntries(std::set& removes, RenderList& renderlist); bool updateVisual(Entry* entry); void updatePosition(Entry* entry); void updateScreenCoordinate(RenderItem* item, bool changedZoom = true); void sortRenderList(RenderList& renderlist); Camera* m_camera; Layer* m_layer; CacheLayerChangeListener* m_layerObserver; CacheTree* m_tree; ImagePtr m_cacheImage; std::map m_instance_map; std::vector m_entries; std::vector m_renderItems; std::set m_entriesToUpdate; std::deque m_freeEntries; bool m_needSorting; double m_zMin; double m_zMax; double m_zoom; bool m_zoomed; bool m_straightZoom; }; } #endif fifengine-0.4.2/engine/core/view/rendererbase.cpp000066400000000000000000000075321341615052600217750ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "model/structures/layer.h" #include "model/structures/map.h" #include "util/log/logger.h" #include "rendererbase.h" namespace FIFE { static Logger _log(LM_VIEW); // use some big value, so that non-positioned renderers show on top const int32_t DEFAULT_RENDERER_POSITION = 1000; RendererBase::RendererBase(RenderBackend* renderbackend, int32_t position): m_renderbackend(renderbackend), m_enabled(false), m_pipeline_position(DEFAULT_RENDERER_POSITION), m_listener(NULL) { setPipelinePosition(position); } RendererBase::RendererBase(const RendererBase& old): m_renderbackend(old.m_renderbackend), m_enabled(old.m_enabled), m_pipeline_position(old.m_pipeline_position), m_listener(NULL) { setPipelinePosition(old.m_pipeline_position); } RendererBase::RendererBase(): m_renderbackend(NULL), m_enabled(false), m_pipeline_position(DEFAULT_RENDERER_POSITION), m_listener(NULL) { } void RendererBase::setPipelinePosition(int32_t position) { if (position !=m_pipeline_position) { m_pipeline_position = position; if (m_listener) { m_listener->onRendererPipelinePositionChanged(this); } } } void RendererBase::setEnabled(bool enabled) { if (m_enabled != enabled) { m_enabled = enabled; if (m_listener) { m_listener->onRendererEnabledChanged(this); } } } void RendererBase::addActiveLayer(Layer* layer) { if (std::find(m_active_layers.begin(), m_active_layers.end(), layer) == m_active_layers.end()) { m_active_layers.push_back(layer); } } void RendererBase::removeActiveLayer(Layer* layer) { m_active_layers.remove(layer); } void RendererBase::clearActiveLayers() { m_active_layers.clear(); } bool RendererBase::isActivedLayer(Layer* layer) { return std::find(m_active_layers.begin(), m_active_layers.end(), layer) != m_active_layers.end(); } void RendererBase::activateAllLayers(Map* map) { clearActiveLayers(); const std::list& tmp = map->getLayers(); std::list::const_iterator it = tmp.begin(); for (; it != tmp.end(); ++it) { addActiveLayer(*it); } } } fifengine-0.4.2/engine/core/view/rendererbase.h000066400000000000000000000133451341615052600214410ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_RENDERERBASE_H #define FIFE_RENDERERBASE_H // Standard C++ library includes #include #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "renderitem.h" namespace FIFE { class Camera; class Layer; class Map; class Instance; class RenderBackend; class RendererBase; /** RendererListener allows reaction to changes in renderer * Having this implemented via callback mechanism should speed up the rendering a bit * (e.g. no need to sort pipeline order per each frame) */ class IRendererListener { public: virtual ~IRendererListener() {} /** Renderer's pipeline position has been changed */ virtual void onRendererPipelinePositionChanged(RendererBase* renderer) = 0; /** Renderer is enabled / disabled */ virtual void onRendererEnabledChanged(RendererBase* renderer) = 0; }; /** Interface to class owning the renderers * Used to get correct subclass of renderer in scripting side (via renderer's static method) */ class IRendererContainer { public: virtual ~IRendererContainer() {} /** Returns renderer with given name */ virtual RendererBase* getRenderer(const std::string& renderername) = 0; }; /** Base class for all view renderers * View renderer renders one aspect of the view shown on screen */ class RendererBase { public: /** Constructor * @param renderbackend to use * @param position position for this renderer in rendering pipeline */ RendererBase(RenderBackend* renderbackend, int32_t position); /** Copy Constructor */ RendererBase(const RendererBase& old); /** Makes copy of this renderer */ virtual RendererBase* clone() = 0; /** Destructor */ virtual ~RendererBase() {}; /** This method is called by the view to ask renderer to draw its rendering aspect based on * given parameters. Renderers receive non-clipped instance stack since there is no * way to know which information is relevant for the renderer. E.g. effect renderer * might need to know offscreen instance locations to be able to draw radiation coming from * some instance not visible on the screen. * * @param cam camera view to draw * @param layer current layer to be rendered * @param instances instances on the current layer * @ see setPipelinePosition */ virtual void render(Camera* cam, Layer* layer, RenderList& instances) = 0; /** Name of the renderer */ virtual std::string getName() = 0; /** Gets renderer position in the rendering pipeline */ int32_t getPipelinePosition() const { return m_pipeline_position; } /** Sets renderer position in the rendering pipeline * Pipeline position defines in which order view calls the renderers when update occurs * Note that renderers are called once per rendered layer, thus to update the * whole screen, renderer might receive multiple calls */ void setPipelinePosition(int32_t position); /** Enables renderer */ virtual void setEnabled(bool enabled); /** Resets information in the renderer */ virtual void reset() {} /** Is renderer enabled */ bool isEnabled() const { return m_enabled; } /** Sets listener for renderer */ void setRendererListener(IRendererListener* listener) { m_listener = listener; } /** Adds active layer to renderer. Only active layers are rendered */ void addActiveLayer(Layer* layer); /** Removes active layer from renderer. */ void removeActiveLayer(Layer* layer); /** Clears all active layers from renderer */ void clearActiveLayers(); /** Activates all layers from given elevation */ void activateAllLayers(Map* elevation); /** Returns if given layer is currently activated */ bool isActivedLayer(Layer* layer); /** Returns list of activated layer */ std::list getActiveLayers() const {return m_active_layers;} protected: RendererBase(); std::list m_active_layers; RenderBackend* m_renderbackend; private: bool m_enabled; int32_t m_pipeline_position; IRendererListener* m_listener; }; } #endif fifengine-0.4.2/engine/core/view/rendererbase.i000066400000000000000000000044041341615052600214360ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fife %{ #include "view/rendererbase.h" %} namespace FIFE { class Camera; class Layer; class Instance; class Map; class RendererBase { public: RendererBase(); virtual ~RendererBase(); virtual std::string getName() = 0; int32_t getPipelinePosition() { return m_position; } void setPipelinePosition(int32_t position); void setEnabled(bool enabled); bool isEnabled(); void addActiveLayer(Layer* layer); void removeActiveLayer(Layer* layer); void clearActiveLayers(); void activateAllLayers(Map* map); std::list getActiveLayers() const {return m_active_layers;} }; class IRendererContainer { public: virtual ~IRendererContainer() {} virtual RendererBase* getRenderer(const std::string& renderername) = 0; }; } fifengine-0.4.2/engine/core/view/renderers/000077500000000000000000000000001341615052600206125ustar00rootroot00000000000000fifengine-0.4.2/engine/core/view/renderers/blockinginforenderer.cpp000066400000000000000000000146121341615052600255150ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "video/renderbackend.h" #include "util/math/fife_math.h" #include "util/log/logger.h" #include "model/metamodel/grids/cellgrid.h" #include "model/structures/instance.h" #include "model/structures/layer.h" #include "model/structures/location.h" #include "model/structures/cell.h" #include "model/structures/cellcache.h" #include "view/camera.h" #include "blockinginforenderer.h" namespace FIFE { /** Logger to use for this source file. * @relates Logger */ static Logger _log(LM_VIEWVIEW); BlockingInfoRenderer::BlockingInfoRenderer(RenderBackend* renderbackend, int32_t position): RendererBase(renderbackend, position) { setEnabled(false); m_color.r = 0; m_color.g = 255; m_color.b = 0; } BlockingInfoRenderer::BlockingInfoRenderer(const BlockingInfoRenderer& old): RendererBase(old), m_color(old.m_color) { setEnabled(false); } RendererBase* BlockingInfoRenderer::clone() { return new BlockingInfoRenderer(*this); } BlockingInfoRenderer::~BlockingInfoRenderer() { } BlockingInfoRenderer* BlockingInfoRenderer::getInstance(IRendererContainer* cnt) { return dynamic_cast(cnt->getRenderer("BlockingInfoRenderer")); } void BlockingInfoRenderer::render(Camera* cam, Layer* layer, RenderList& instances) { CellGrid* cg = layer->getCellGrid(); if (!cg) { FL_WARN(_log, "No cellgrid assigned to layer, cannot draw grid"); return; } Rect cv = cam->getViewPort(); CellCache* cache = layer->getCellCache(); if (cache) { const std::vector >& cells = cache->getCells(); std::vector >::const_iterator it = cells.begin(); for (; it != cells.end(); ++it) { std::vector::const_iterator cit = (*it).begin(); for (; cit != (*it).end(); ++cit) { ExactModelCoordinate emc = FIFE::intPt2doublePt((*cit)->getLayerCoordinates()); ScreenPoint sp = cam->toScreenCoordinates(cg->toMapCoordinates(emc)); // if it is not in cameras view continue if (sp.x < cv.x || sp.x > cv.x + cv.w || sp.y < cv.y || sp.y > cv.y + cv.h) { continue; } if ((*cit)->getCellType() != CTYPE_NO_BLOCKER) { std::vector vertices; cg->getVertices(vertices, (*cit)->getLayerCoordinates()); std::vector::const_iterator it = vertices.begin(); int32_t halfind = vertices.size() / 2; ScreenPoint firstpt = cam->toScreenCoordinates(cg->toMapCoordinates(*it)); Point pt1(firstpt.x, firstpt.y); Point pt2; ++it; for (; it != vertices.end(); it++) { ScreenPoint pts = cam->toScreenCoordinates(cg->toMapCoordinates(*it)); pt2.x = pts.x; pt2.y = pts.y; m_renderbackend->drawLine(pt1, pt2, m_color.r, m_color.g, m_color.b); pt1 = pt2; } m_renderbackend->drawLine(pt2, Point(firstpt.x, firstpt.y), m_color.r, m_color.g, m_color.b); ScreenPoint spt1 = cam->toScreenCoordinates(cg->toMapCoordinates(vertices[0])); Point pt3(spt1.x, spt1.y); ScreenPoint spt2 = cam->toScreenCoordinates(cg->toMapCoordinates(vertices[halfind])); Point pt4(spt2.x, spt2.y); m_renderbackend->drawLine(pt3, pt4, m_color.r, m_color.g, m_color.b); } } } } else { RenderList::const_iterator instance_it = instances.begin(); for (;instance_it != instances.end(); ++instance_it) { Instance* instance = (*instance_it)->instance; if (!instance->getObject()->isBlocking() || !instance->isBlocking()) { continue; } std::vector vertices; cg->getVertices(vertices, instance->getLocationRef().getLayerCoordinates()); std::vector::const_iterator it = vertices.begin(); int32_t halfind = vertices.size() / 2; ScreenPoint firstpt = cam->toScreenCoordinates(cg->toMapCoordinates(*it)); Point pt1(firstpt.x, firstpt.y); Point pt2; ++it; for (; it != vertices.end(); it++) { ScreenPoint pts = cam->toScreenCoordinates(cg->toMapCoordinates(*it)); pt2.x = pts.x; pt2.y = pts.y; m_renderbackend->drawLine(pt1, pt2, m_color.r, m_color.g, m_color.b); pt1 = pt2; } m_renderbackend->drawLine(pt2, Point(firstpt.x, firstpt.y), m_color.r, m_color.g, m_color.b); ScreenPoint spt1 = cam->toScreenCoordinates(cg->toMapCoordinates(vertices[0])); Point pt3(spt1.x, spt1.y); ScreenPoint spt2 = cam->toScreenCoordinates(cg->toMapCoordinates(vertices[halfind])); Point pt4(spt2.x, spt2.y); m_renderbackend->drawLine(pt3, pt4, m_color.r, m_color.g, m_color.b); } } } void BlockingInfoRenderer::setColor(uint8_t r, uint8_t g, uint8_t b) { m_color.r = r; m_color.g = g; m_color.b = b; } } fifengine-0.4.2/engine/core/view/renderers/blockinginforenderer.h000066400000000000000000000064711341615052600251660ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_BLOCKINGINFORENDERER_H #define FIFE_BLOCKINGINFORENDERER_H // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "view/rendererbase.h" namespace FIFE { class RenderBackend; class BlockingInfoRenderer: public RendererBase { public: /** Constructor. * * @param renderbackend The renderbackend to use. * @param position The position for this renderer in rendering pipeline. * @ see setPipelinePosition */ BlockingInfoRenderer(RenderBackend* renderbackend, int32_t position); /** Copy Constructor. */ BlockingInfoRenderer(const BlockingInfoRenderer& old); /** Makes copy of this renderer. */ RendererBase* clone(); /** Destructor. */ virtual ~BlockingInfoRenderer(); /** Returns the renderer name. * * @return The name as string. */ std::string getName() { return "BlockingInfoRenderer"; } /** This method is called by the view to ask renderer to draw its rendering aspect based on * given parameters. * * @param cam Camera view to draw * @param layer Current layer to be rendered * @param instances Instances on the current layer */ void render(Camera* cam, Layer* layer, RenderList& instances); /** Changes the used color. * * @param r The value for red, range 0-255. * @param g The value for green, range 0-255. * @param b The value for blue, range 0-255. */ void setColor(uint8_t r, uint8_t g, uint8_t b); /** Gets instance for interface access. */ static BlockingInfoRenderer* getInstance(IRendererContainer* cnt); private: //! currently used color SDL_Color m_color; }; } #endif fifengine-0.4.2/engine/core/view/renderers/blockinginforenderer.i000066400000000000000000000037011341615052600251600ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fife %{ #include "view/renderers/blockinginforenderer.h" %} namespace FIFE { class RenderBackend; class BlockingInfoRenderer: public RendererBase { public: virtual ~BlockingInfoRenderer(); std::string getName(); void setColor(uint8_t r, uint8_t g, uint8_t b); static BlockingInfoRenderer* getInstance(IRendererContainer* cnt); private: BlockingInfoRenderer(RenderBackend* renderbackend, int32_t position); }; } fifengine-0.4.2/engine/core/view/renderers/cellrenderer.cpp000066400000000000000000000220151341615052600237640ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "video/renderbackend.h" #include "video/image.h" #include "video/imagemanager.h" #include "video/fonts/ifont.h" #include "util/math/fife_math.h" #include "util/log/logger.h" #include "model/metamodel/grids/cellgrid.h" #include "model/structures/instance.h" #include "model/structures/layer.h" #include "model/structures/location.h" #include "model/structures/cell.h" #include "model/structures/cellcache.h" #include "pathfinder/route.h" #include "view/camera.h" #include "cellrenderer.h" namespace FIFE { static Logger _log(LM_VIEWVIEW); CellRenderer::CellRenderer(RenderBackend* renderbackend, int32_t position): RendererBase(renderbackend, position) { setEnabled(false); m_blockerColor.r = 255; m_blockerColor.g = 0; m_blockerColor.b = 0; m_pathColor.r = 0; m_pathColor.g = 0; m_pathColor.b = 255; m_blockingEnabled = false; m_pathVisualEnabled = false; m_font = NULL; } CellRenderer::CellRenderer(const CellRenderer& old): RendererBase(old), m_blockerColor(old.m_blockerColor), m_pathColor(old.m_pathColor){ setEnabled(false); m_blockingEnabled = false; m_pathVisualEnabled = false; m_font = NULL; } RendererBase* CellRenderer::clone() { return new CellRenderer(*this); } CellRenderer::~CellRenderer() { } CellRenderer* CellRenderer::getInstance(IRendererContainer* cnt) { return dynamic_cast(cnt->getRenderer("CellRenderer")); } std::string CellRenderer::getName() { return "CellRenderer"; } void CellRenderer::render(Camera* cam, Layer* layer, RenderList& instances) { CellGrid* cg = layer->getCellGrid(); if (!cg) { FL_WARN(_log, "No cellgrid assigned to layer, cannot draw grid"); return; } CellCache* cache = layer->getCellCache(); if (!cache) { FL_WARN(_log, "No cellcache on layer created, cannot draw cells"); return; } const bool render_costs = (!m_visualCosts.empty() && m_font); const bool zoomed = !Mathd::Equal(1.0, cam->getZoom()); Rect layerView = cam->getLayerViewPort(layer); std::vector cells = cache->getCellsInRect(layerView); std::vector::iterator cit = cells.begin(); for (; cit != cells.end(); ++cit) { if (m_blockingEnabled) { if ((*cit)->getCellType() != CTYPE_NO_BLOCKER) { std::vector vertices; cg->getVertices(vertices, (*cit)->getLayerCoordinates()); std::vector::const_iterator it = vertices.begin(); int32_t halfind = vertices.size() / 2; ScreenPoint firstpt = cam->toScreenCoordinates(cg->toMapCoordinates(*it)); Point pt1(firstpt.x, firstpt.y); Point pt2; ++it; for (; it != vertices.end(); it++) { ScreenPoint pts = cam->toScreenCoordinates(cg->toMapCoordinates(*it)); pt2.x = pts.x; pt2.y = pts.y; m_renderbackend->drawLine(pt1, pt2, m_blockerColor.r, m_blockerColor.g, m_blockerColor.b); pt1 = pt2; } m_renderbackend->drawLine(pt2, Point(firstpt.x, firstpt.y), m_blockerColor.r, m_blockerColor.g, m_blockerColor.b); ScreenPoint spt1 = cam->toScreenCoordinates(cg->toMapCoordinates(vertices[0])); Point pt3(spt1.x, spt1.y); ScreenPoint spt2 = cam->toScreenCoordinates(cg->toMapCoordinates(vertices[halfind])); Point pt4(spt2.x, spt2.y); m_renderbackend->drawLine(pt3, pt4, m_blockerColor.r, m_blockerColor.g, m_blockerColor.b); } } if (render_costs) { bool match = false; double cost; std::set::iterator cost_it = m_visualCosts.begin(); for (; cost_it != m_visualCosts.end(); ++cost_it) { std::vector cell_costs = cache->getCellCosts(*cit); std::vector::iterator cc_it = cell_costs.begin(); for (; cc_it != cell_costs.end(); ++cc_it) { if (*cc_it == *cost_it) { match = true; cost = cache->getCost(*cost_it); break; } } if (match) { break; } } if (match) { Location loc(layer); loc.setLayerCoordinates((*cit)->getLayerCoordinates()); ScreenPoint drawpt = cam->toScreenCoordinates(loc.getMapCoordinates()); std::stringstream stream; stream << cost; Image* img = m_font->getAsImage(stream.str()); Rect r; if (zoomed) { double zoom = cam->getZoom(); r.x = drawpt.x - (img->getWidth()/2) * zoom; r.y = drawpt.y - (img->getHeight()/2) * zoom; r.w = img->getWidth() * zoom; r.h = img->getHeight() * zoom; img->render(r); } else { r.x = drawpt.x - img->getWidth()/2; r.y = drawpt.y - img->getHeight()/2; r.w = img->getWidth(); r.h = img->getHeight(); img->render(r); } } } } if (m_pathVisualEnabled && !m_visualPaths.empty()) { std::vector::iterator it = m_visualPaths.begin(); for (; it != m_visualPaths.end(); ++it) { Route* route = (*it)->getRoute(); if (route) { Path path = route->getPath(); if (!path.empty()) { Path::iterator pit = path.begin(); for (; pit != path.end(); ++pit) { if ((*pit).getLayer() != layer) { continue; } std::vector vertices; cg->getVertices(vertices, (*pit).getLayerCoordinates()); std::vector::const_iterator it = vertices.begin(); int32_t halfind = vertices.size() / 2; ScreenPoint firstpt = cam->toScreenCoordinates(cg->toMapCoordinates(*it)); Point pt1(firstpt.x, firstpt.y); Point pt2; ++it; for (; it != vertices.end(); it++) { ScreenPoint pts = cam->toScreenCoordinates(cg->toMapCoordinates(*it)); pt2.x = pts.x; pt2.y = pts.y; m_renderbackend->drawLine(pt1, pt2, m_pathColor.r, m_pathColor.g, m_pathColor.b); pt1 = pt2; } m_renderbackend->drawLine(pt2, Point(firstpt.x, firstpt.y), m_pathColor.r, m_pathColor.g, m_pathColor.b); } } } } } } void CellRenderer::setBlockerColor(uint8_t r, uint8_t g, uint8_t b) { m_blockerColor.r = r; m_blockerColor.g = g; m_blockerColor.b = b; } void CellRenderer::setPathColor(uint8_t r, uint8_t g, uint8_t b) { m_pathColor.r = r; m_pathColor.g = g; m_pathColor.b = b; } void CellRenderer::setEnabledBlocking(bool enabled) { m_blockingEnabled = enabled; } bool CellRenderer::isEnabledBlocking() { return m_blockingEnabled; } void CellRenderer::setEnabledPathVisual(bool enabled) { m_pathVisualEnabled = enabled; } bool CellRenderer::isEnabledPathVisual() { return m_pathVisualEnabled; } void CellRenderer::setFont(IFont* font) { m_font = font; } IFont* CellRenderer::getFont() { return m_font; } void CellRenderer::addPathVisual(Instance* instance) { m_visualPaths.push_back(instance); } void CellRenderer::removePathVisual(Instance* instance) { for (std::vector::iterator it = m_visualPaths.begin(); it != m_visualPaths.end(); ++it) { if (*it == instance) { m_visualPaths.erase(it); break; } } } void CellRenderer::setEnabledCost(const std::string& costId, bool enabled) { if (enabled) { m_visualCosts.insert(costId); } else { m_visualCosts.erase(costId); } } bool CellRenderer::isEnabledCost(const std::string& costId) { std::set::iterator it = m_visualCosts.find(costId); if (it != m_visualCosts.end()) { return true; } return false; } } fifengine-0.4.2/engine/core/view/renderers/cellrenderer.h000066400000000000000000000125151341615052600234350ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_CELLRENDERER_H #define FIFE_CELLRENDERER_H // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "view/rendererbase.h" #include "targetrenderer.h" namespace FIFE { class RenderBackend; class Cell; class IFont; class CellRenderer: public RendererBase { public: /** Constructor. * * @param renderbackend The renderbackend to use. * @param position The position for this renderer in rendering pipeline. * @ see setPipelinePosition */ CellRenderer(RenderBackend* renderbackend, int32_t position); /** Copy Constructor. */ CellRenderer(const CellRenderer& old); /** Makes copy of this renderer. */ RendererBase* clone(); /** Destructor. */ virtual ~CellRenderer(); /** Returns the renderer name. * * @return The name as string. */ std::string getName(); /** This method is called by the view to ask renderer to draw its rendering aspect based on * given parameters. * * @param cam Camera view to draw * @param layer Current layer to be rendered * @param instances Instances on the current layer */ void render(Camera* cam, Layer* layer, RenderList& instances); /** Sets color that is used to visualize blocker. * * @param r The value for red, range 0-255. * @param g The value for green, range 0-255. * @param b The value for blue, range 0-255. */ void setBlockerColor(uint8_t r, uint8_t g, uint8_t b); /** Sets color that is used to visualize paths. * * @param r The value for red, range 0-255. * @param g The value for green, range 0-255. * @param b The value for blue, range 0-255. */ void setPathColor(uint8_t r, uint8_t g, uint8_t b); /** Enables blocking visualization. * * @param enabled A bool that enables or disables the visualization. */ void setEnabledBlocking(bool enabled); /** Gets whether blocking visualization is enabled. * * @return A bool, true if visualization is enabled, otherwise false. */ bool isEnabledBlocking(); /** Enables path visualization. * * @param enabled A bool that enables or disables the visualization. */ void setEnabledPathVisual(bool enabled); /** Gets whether path visualization is enabled. * * @return A bool, true if visualization is enabled, otherwise false. */ bool isEnabledPathVisual(); /** Adds a instance to path visualization. The current path is automatically rendered. * * @param instance The instance's path is visualized. */ void addPathVisual(Instance* instance); /** Removes a instance from path visualization. * * @param instance The instance's path is visualized. */ void removePathVisual(Instance* instance); /** Enables cost visualization. * * @param costId The cost identifier as string. * @param enabled A bool that enables or disables the visualization. */ void setEnabledCost(const std::string& costId, bool enabled); /** Gets whether a cost visualization is enabled. * * @param costId The cost identifier as string. * @return A bool, true if visualization is enabled, otherwise false. */ bool isEnabledCost(const std::string& costId); /** Sets the font. * * @param font The used font. */ void setFont(IFont* font); /** Returns the font. * * @return The used font. */ IFont* getFont(); /** Gets instance for interface access. */ static CellRenderer* getInstance(IRendererContainer* cnt); private: SDL_Color m_blockerColor; SDL_Color m_pathColor; bool m_blockingEnabled; bool m_pathVisualEnabled; IFont* m_font; std::vector m_visualPaths; std::set m_visualCosts; }; } #endif fifengine-0.4.2/engine/core/view/renderers/cellrenderer.i000066400000000000000000000045531341615052600234410ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fife %{ #include "view/renderers/cellrenderer.h" %} namespace FIFE { class RenderBackend; class IFont; class CellRenderer: public RendererBase { public: virtual ~CellRenderer(); std::string getName(); void setBlockerColor(uint8_t r, uint8_t g, uint8_t b); void setPathColor(uint8_t r, uint8_t g, uint8_t b); void setEnabledBlocking(bool enabled); bool isEnabledBlocking(); void setEnabledPathVisual(bool enabled); bool isEnabledPathVisual(); void addPathVisual(Instance* instance); void removePathVisual(Instance* instance); void setEnabledCost(const std::string& costId, bool enabled); bool isEnabledCost(const std::string& costId); void setFont(IFont* font); IFont* getFont(); static CellRenderer* getInstance(IRendererContainer* cnt); private: CellRenderer(RenderBackend* renderbackend, int32_t position); }; } fifengine-0.4.2/engine/core/view/renderers/cellselectionrenderer.cpp000066400000000000000000000115721341615052600257000ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "video/renderbackend.h" #include "util/math/fife_math.h" #include "util/log/logger.h" #include "model/metamodel/grids/cellgrid.h" #include "model/structures/instance.h" #include "model/structures/layer.h" #include "model/structures/location.h" #include "view/camera.h" #include "cellselectionrenderer.h" namespace FIFE { /** Logger to use for this source file. * @relates Logger */ static Logger _log(LM_VIEWVIEW); CellSelectionRenderer::CellSelectionRenderer(RenderBackend* renderbackend, int32_t position): RendererBase(renderbackend, position) { setEnabled(false); m_color.r = 255; m_color.g = 0; m_color.b = 0; } CellSelectionRenderer::CellSelectionRenderer(const CellSelectionRenderer& old): RendererBase(old), m_color(old.m_color) { setEnabled(false); } RendererBase* CellSelectionRenderer::clone() { return new CellSelectionRenderer(*this); } CellSelectionRenderer::~CellSelectionRenderer() { } CellSelectionRenderer* CellSelectionRenderer::getInstance(IRendererContainer* cnt) { return dynamic_cast(cnt->getRenderer("CellSelectionRenderer")); } void CellSelectionRenderer::reset() { m_locations.clear(); } void CellSelectionRenderer::selectLocation(const Location* loc) { if (loc) { std::vector::const_iterator it = m_locations.begin(); for (; it != m_locations.end(); it++) { if ((*it).getLayerCoordinates() == loc->getLayerCoordinates()) { return; } } m_locations.push_back(Location(*loc)); } } void CellSelectionRenderer::deselectLocation(const Location* loc) { if (loc) { std::vector::iterator it = m_locations.begin(); for (; it != m_locations.end(); it++) { if ((*it).getLayerCoordinates() == loc->getLayerCoordinates()) { m_locations.erase(it); break; } } } } void CellSelectionRenderer::render(Camera* cam, Layer* layer, RenderList& instances) { if (m_locations.empty()) { return; } std::vector::const_iterator locit = m_locations.begin(); for (; locit != m_locations.end(); locit++) { const Location loc = *locit; if (layer != loc.getLayer()) { continue; } CellGrid* cg = layer->getCellGrid(); if (!cg) { FL_WARN(_log, "No cellgrid assigned to layer, cannot draw selection"); continue; } std::vector vertices; cg->getVertices(vertices, loc.getLayerCoordinates()); std::vector::const_iterator it = vertices.begin(); ScreenPoint firstpt = cam->toScreenCoordinates(cg->toMapCoordinates(*it)); Point pt1(firstpt.x, firstpt.y); Point pt2; ++it; for (; it != vertices.end(); it++) { ScreenPoint pts = cam->toScreenCoordinates(cg->toMapCoordinates(*it)); pt2.x = pts.x; pt2.y = pts.y; Point cpt1 = pt1; Point cpt2 = pt2; m_renderbackend->drawLine(cpt1, cpt2, m_color.r, m_color.g, m_color.b); pt1 = pt2; } m_renderbackend->drawLine(pt2, Point(firstpt.x, firstpt.y), m_color.r, m_color.g, m_color.b); } } void CellSelectionRenderer::setColor(uint8_t r, uint8_t g, uint8_t b) { m_color.r = r; m_color.g = g; m_color.b = b; } } fifengine-0.4.2/engine/core/view/renderers/cellselectionrenderer.h000066400000000000000000000077251341615052600253520ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_CELLSELECTIONRENDERER_H #define FIFE_CELLSELECTIONRENDERER_H // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "view/rendererbase.h" #include "model/structures/location.h" namespace FIFE { class RenderBackend; /** CellSelectionRenderer renders a frame around selected cells. */ class CellSelectionRenderer: public RendererBase { public: /** Constructor. * * @param renderbackend The renderbackend to use. * @param position The position for this renderer in rendering pipeline. * @ see setPipelinePosition */ CellSelectionRenderer(RenderBackend* renderbackend, int32_t position); /** Copy Constructor. */ CellSelectionRenderer(const CellSelectionRenderer& old); /** Makes copy of this renderer. */ RendererBase* clone(); /** Destructor. */ virtual ~CellSelectionRenderer(); /** This method is called by the view to ask renderer to draw its rendering aspect based on * given parameters. * * @param cam Camera view to draw * @param layer Current layer to be rendered * @param instances Instances on the current layer */ void render(Camera* cam, Layer* layer, RenderList& instances); /** Returns the renderer name. * * @return The name as string. */ std::string getName() { return "CellSelectionRenderer"; } /** Gets instance for interface access. */ static CellSelectionRenderer* getInstance(IRendererContainer* cnt); /** Deselects all locations. */ void reset(); /** Selects given location on map. * * @param loc The location. */ void selectLocation(const Location* loc); /** Deselects given location on map. * * @param loc The location. */ void deselectLocation(const Location* loc); /** Returns selected locations. * * @return A vector that contains all selected locations. */ const std::vector getLocations() const { return m_locations; } /** Changes the used color. * * @param r The value for red, range 0-255. * @param g The value for green, range 0-255. * @param b The value for blue, range 0-255. */ void setColor(uint8_t r, uint8_t g, uint8_t b); private: //! selected locations std::vector m_locations; //! currently used color SDL_Color m_color; }; } #endif fifengine-0.4.2/engine/core/view/renderers/cellselectionrenderer.i000066400000000000000000000041421341615052600253410ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fife %{ #include "view/renderers/cellselectionrenderer.h" %} namespace FIFE { class RenderBackend; class CellSelectionRenderer: public RendererBase { public: virtual ~CellSelectionRenderer(); std::string getName(); static CellSelectionRenderer* getInstance(IRendererContainer* cnt); void reset(); void selectLocation(const Location* loc); void deselectLocation(const Location* loc); const std::vector getLocations() const; void setColor(uint8_t r, uint8_t g, uint8_t b); private: CellSelectionRenderer(RenderBackend* renderbackend, int32_t position); }; } fifengine-0.4.2/engine/core/view/renderers/coordinaterenderer.cpp000066400000000000000000000144531341615052600252030ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "video/renderbackend.h" #include "video/image.h" #include "video/fonts/ifont.h" #include "util/math/fife_math.h" #include "util/log/logger.h" #include "model/metamodel/grids/cellgrid.h" #include "model/metamodel/action.h" #include "model/structures/instance.h" #include "model/structures/layer.h" #include "model/structures/location.h" #include "view/camera.h" #include "view/visual.h" #include "coordinaterenderer.h" namespace FIFE { /** Logger to use for this source file. * @relates Logger */ static Logger _log(LM_VIEWVIEW); CoordinateRenderer::CoordinateRenderer(RenderBackend* renderbackend, int32_t position): RendererBase(renderbackend, position), m_layer_area(), m_tmploc(), m_c(), m_font(0), m_font_color(false), m_zoom(true) { setEnabled(false); } CoordinateRenderer::CoordinateRenderer(const CoordinateRenderer& old): RendererBase(old), m_layer_area(), m_tmploc(), m_c(), m_font(old.m_font), m_font_color(false), m_color(old.m_color), m_zoom(old.m_zoom) { setEnabled(false); } RendererBase* CoordinateRenderer::clone() { return new CoordinateRenderer(*this); } CoordinateRenderer::~CoordinateRenderer() { } CoordinateRenderer* CoordinateRenderer::getInstance(IRendererContainer* cnt) { return dynamic_cast(cnt->getRenderer("CoordinateRenderer")); } void CoordinateRenderer::adjustLayerArea() { m_tmploc.setMapCoordinates(m_c); ModelCoordinate c = m_tmploc.getLayerCoordinates(); m_layer_area.x = std::min(c.x, m_layer_area.x); m_layer_area.w = std::max(c.x, m_layer_area.w); m_layer_area.y = std::min(c.y, m_layer_area.y); m_layer_area.h = std::max(c.y, m_layer_area.h); } const int32_t MIN_COORD = -9999999; const int32_t MAX_COORD = 9999999; void CoordinateRenderer::render(Camera* cam, Layer* layer, RenderList& instances) { if (!m_font) { //no font selected.. nothing to render return; } Rect r = Rect(); const bool zoomed = (!Mathd::Equal(1.0, cam->getZoom()) && m_zoom); Rect cv = cam->getViewPort(); m_tmploc.setLayer(layer); m_layer_area.x = MAX_COORD; m_layer_area.y = MAX_COORD; m_layer_area.w = MIN_COORD; m_layer_area.h = MIN_COORD; m_c = cam->toMapCoordinates(ScreenPoint(cv.x, cv.y), false); adjustLayerArea(); m_c = cam->toMapCoordinates(ScreenPoint(cv.x+cv.w, cv.y), false); adjustLayerArea(); m_c = cam->toMapCoordinates(ScreenPoint(cv.x, cv.y+cv.h), false); adjustLayerArea(); m_c = cam->toMapCoordinates(ScreenPoint(cv.x+cv.w, cv.y+cv.h), false); adjustLayerArea(); SDL_Color old_color = m_font->getColor(); if(old_color.r != m_color.r || old_color.g != m_color.g || old_color.b != m_color.b) { m_font->setColor(m_color.r, m_color.g, m_color.b); m_font_color = true; } for (int32_t x = m_layer_area.x-1; x < m_layer_area.w+1; x++) { for (int32_t y = m_layer_area.y-1; y < m_layer_area.h+1; y++) { ModelCoordinate mc(x, y); m_tmploc.setLayerCoordinates(mc); ScreenPoint drawpt = cam->toScreenCoordinates(m_tmploc.getMapCoordinates()); if (drawpt.x < cv.x || drawpt.x > cv.x + cv.w || drawpt.y < cv.y || drawpt.y > cv.y + cv.h) { continue; } // we split the stringstream in three images, because so the TextRenderPool can reuse the most images. // more to render but less images to generate std::stringstream sts; sts << mc.x; Image* imgx = m_font->getAsImage(sts.str()); sts.str(","); Image* imgc = m_font->getAsImage(sts.str()); sts.str(""); sts << mc.y; Image* imgy = m_font->getAsImage(sts.str()); if (zoomed) { double zoom = cam->getZoom(); r.x = drawpt.x - ((imgx->getWidth() + imgc->getWidth() + imgy->getWidth())/2) * zoom; r.y = drawpt.y - (imgx->getHeight()/2) * zoom; r.w = imgx->getWidth() * zoom; r.h = imgx->getHeight() * zoom; imgx->render(r); r.x += r.w; r.w = imgc->getWidth() * zoom; imgc->render(r); r.x += r.w; r.w = imgy->getWidth() * zoom; imgy->render(r); } else { r.x = drawpt.x - (imgx->getWidth() + imgc->getWidth() + imgy->getWidth())/2; r.y = drawpt.y - imgx->getHeight()/2; r.w = imgx->getWidth(); r.h = imgx->getHeight(); imgx->render(r); r.x += r.w; r.w = imgc->getWidth(); imgc->render(r); r.x += r.w; r.w = imgy->getWidth(); imgy->render(r); } } } if(m_font_color) { m_font->setColor(old_color.r, old_color.g, old_color.b); m_font_color = false; } } void CoordinateRenderer::setColor(uint8_t r, uint8_t g, uint8_t b) { m_color.r = r; m_color.g = g; m_color.b = b; } } fifengine-0.4.2/engine/core/view/renderers/coordinaterenderer.h000066400000000000000000000074401341615052600246460ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_COORDINATERENDERER_H #define FIFE_COORDINATERENDERER_H // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "view/rendererbase.h" #include "util/structures/rect.h" namespace FIFE { class RenderBackend; class IFont; class CoordinateRenderer: public RendererBase { public: /** Constructor. * * @param renderbackend The renderbackend to use. * @param position The position for this renderer in rendering pipeline. * @ see setPipelinePosition */ CoordinateRenderer(RenderBackend* renderbackend, int32_t position); /** Copy Constructor. */ CoordinateRenderer(const CoordinateRenderer& old); /** Makes copy of this renderer. */ RendererBase* clone(); /** Destructor. */ virtual ~CoordinateRenderer(); /** This method is called by the view to ask renderer to draw its rendering aspect based on * given parameters. * * @param cam Camera view to draw * @param layer Current layer to be rendered * @param instances Instances on the current layer */ void render(Camera* cam, Layer* layer, RenderList& instances); /** Returns the renderer name. * * @return The name as string. */ std::string getName() { return "CoordinateRenderer"; } /** Changes the used color. * * @param r The value for red, range 0-255. * @param g The value for green, range 0-255. * @param b The value for blue, range 0-255. */ void setColor(uint8_t r, uint8_t g, uint8_t b); /** Changes default font in the renderer * @note that this does not change the font ownership * * @param font Pointer to the font */ void setFont(IFont* font) { m_font = font; } /** Enables / disables zooming for coordinate images, by default it is enabled. */ void setZoom(bool enable) { m_zoom = enable; } /** Gets instance for interface access. */ static CoordinateRenderer* getInstance(IRendererContainer* cnt); private: void adjustLayerArea(); Rect m_layer_area; Location m_tmploc; ExactModelCoordinate m_c; IFont* m_font; bool m_font_color; SDL_Color m_color; bool m_zoom; }; } #endif fifengine-0.4.2/engine/core/view/renderers/coordinaterenderer.i000066400000000000000000000040011341615052600246350ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fife %{ #include "view/renderers/coordinaterenderer.h" %} namespace FIFE { class RenderBackend; class IFont; class CoordinateRenderer: public RendererBase { public: virtual ~CoordinateRenderer(); std::string getName(); void setFont(IFont* font); void setColor(uint8_t r, uint8_t g, uint8_t b); void setZoom(bool enable); static CoordinateRenderer* getInstance(IRendererContainer* cnt); private: CoordinateRenderer(RenderBackend* renderbackend, int32_t position); }; } fifengine-0.4.2/engine/core/view/renderers/floatingtextrenderer.cpp000066400000000000000000000141751341615052600255650ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "video/renderbackend.h" #include "util/math/fife_math.h" #include "util/log/logger.h" #include "video/fonts/ifont.h" #include "video/image.h" #include "model/structures/instance.h" #include "model/structures/layer.h" #include "model/structures/location.h" #include "view/visual.h" #include "view/camera.h" #include "floatingtextrenderer.h" namespace FIFE { /** Logger to use for this source file. * @relates Logger */ static Logger _log(LM_VIEWVIEW); FloatingTextRenderer::FloatingTextRenderer(RenderBackend* renderbackend, int32_t position): RendererBase(renderbackend, position), m_renderbackend(renderbackend), m_font(0), m_font_color(false), m_background(false), m_backborder(false) { setEnabled(false); } FloatingTextRenderer::FloatingTextRenderer(const FloatingTextRenderer& old): RendererBase(old), m_renderbackend(old.m_renderbackend), m_font(old.m_font), m_font_color(old.m_font_color), m_color(old.m_color), m_background(old.m_background), m_backborder(old.m_backborder) { setEnabled(false); } RendererBase* FloatingTextRenderer::clone() { return new FloatingTextRenderer(*this); } FloatingTextRenderer::~FloatingTextRenderer() { } void FloatingTextRenderer::render(Camera* cam, Layer* layer, RenderList& instances) { if (!m_font) { //no font selected.. nothing to render return; } RenderList::const_iterator instance_it = instances.begin(); uint32_t lm = m_renderbackend->getLightingModel(); SDL_Color old_color = m_font->getColor(); if(m_font_color) { m_font->setColor(m_color.r, m_color.g, m_color.b, m_color.a); } for (;instance_it != instances.end(); ++instance_it) { Instance* instance = (*instance_it)->instance; const std::string* saytext = instance->getSayText(); if (saytext) { const Rect& ir = (*instance_it)->dimensions; Image* img = m_font->getAsImageMultiline(*saytext); Rect r; r.x = (ir.x + ir.w/2) - img->getWidth()/2; /// the center of the text rect is always aligned to the instance's rect center. r.y = ir.y- img->getHeight(); /// make the text rect floating higher than the instance. r.w = img->getWidth(); r.h = img->getHeight(); // Without this check it can happen that changeRenderInfos() call produces an out_of_range error // because the image rendering can be skipped, if it's not on the screen. // The result is that it tried to modify more objects as exist. if (r.right() < 0 || r.x > static_cast(m_renderbackend->getWidth()) || r.bottom() < 0 || r.y > static_cast(m_renderbackend->getHeight())) { continue; } if(m_background || m_backborder) { const int32_t overdraw = 5; Point p = Point(r.x-overdraw, r.y-overdraw); if(m_background) { m_renderbackend->fillRectangle(p, r.w+2*overdraw, r.h+2*overdraw, m_backcolor.r, m_backcolor.g, m_backcolor.b, m_backcolor.a); } if(m_backborder) { m_renderbackend->drawRectangle(p, r.w+2*overdraw, r.h+2*overdraw, m_backbordercolor.r, m_backbordercolor.g, m_backbordercolor.b, m_backbordercolor.a); } } img->render(r); if(lm > 0) { uint16_t elements = 1; if (m_background) { ++elements; } if (m_backborder) { ++elements; } m_renderbackend->changeRenderInfos(RENDER_DATA_WITHOUT_Z, elements, 4, 5, false, true, 255, REPLACE, ALWAYS); } } } if(m_font_color) { m_font->setColor(old_color.r, old_color.g, old_color.b, old_color.a); } } void FloatingTextRenderer::setColor(uint8_t r, uint8_t g, uint8_t b, uint8_t a) { m_color.r = r; m_color.g = g; m_color.b = b; m_color.a = a; m_font_color = true; } void FloatingTextRenderer::setBackground(uint8_t br, uint8_t bg, uint8_t bb, uint8_t ba) { m_backcolor.r = br; m_backcolor.g = bg; m_backcolor.b = bb; m_backcolor.a = ba; m_background = true; } void FloatingTextRenderer::setBorder(uint8_t bbr, uint8_t bbg, uint8_t bbb, uint8_t bba) { m_backbordercolor.r = bbr; m_backbordercolor.g = bbg; m_backbordercolor.b = bbb; m_backbordercolor.a = bba; m_backborder = true; } void FloatingTextRenderer::resetBackground() { m_background = false; } void FloatingTextRenderer::resetBorder() { m_backborder = false; } FloatingTextRenderer* FloatingTextRenderer::getInstance(IRendererContainer* cnt) { return dynamic_cast(cnt->getRenderer("FloatingTextRenderer")); } } fifengine-0.4.2/engine/core/view/renderers/floatingtextrenderer.h000066400000000000000000000100641341615052600252230ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_FLOATINGTEXTRENDERER_H #define FIFE_FLOATINGTEXTRENDERER_H // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "view/rendererbase.h" namespace FIFE { class RenderBackend; class IFont; class FloatingTextRenderer: public RendererBase { public: /** Constructor. * * @param renderbackend The renderbackend to use. * @param position The position for this renderer in rendering pipeline. * @ see setPipelinePosition */ FloatingTextRenderer(RenderBackend* renderbackend, int32_t position); /** Copy Constructor. */ FloatingTextRenderer(const FloatingTextRenderer& old); /** Makes copy of this renderer. */ RendererBase* clone(); /** Destructor. */ virtual ~FloatingTextRenderer(); /** This method is called by the view to ask renderer to draw its rendering aspect based on * given parameters. * * @param cam Camera view to draw * @param layer Current layer to be rendered * @param instances Instances on the current layer */ void render(Camera* cam, Layer* layer, RenderList& instances); /** Returns the renderer name. * * @return The name as string. */ std::string getName() { return "FloatingTextRenderer"; } /** Changes default font in the renderer * Note that this does not change the font ownership */ void setFont(IFont* font) { m_font = font; } /** Changes default font color * Only useful for .ttf fonts */ void setColor(uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255); /** Set default background quad * r,g,b,a values for background */ void setBackground(uint8_t br, uint8_t bg, uint8_t bb, uint8_t ba = 255); /** Set default border * r,g,b,a values for border */ void setBorder(uint8_t bbr, uint8_t bbg, uint8_t bbb, uint8_t bba = 255); /** Disable the default background */ void resetBackground(); /** Disable the default border */ void resetBorder(); /** Gets instance for interface access. */ static FloatingTextRenderer* getInstance(IRendererContainer* cnt); /** Provides access point to the RenderBackend */ RenderBackend* getRenderBackend() const {return m_renderbackend;} private: RenderBackend* m_renderbackend; IFont* m_font; bool m_font_color; SDL_Color m_color; bool m_background; bool m_backborder; SDL_Color m_backcolor; SDL_Color m_backbordercolor; }; } #endif fifengine-0.4.2/engine/core/view/renderers/floatingtextrenderer.i000066400000000000000000000042661341615052600252330ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fife %{ #include "view/renderers/floatingtextrenderer.h" %} namespace FIFE { class RenderBackend; class IFont; class FloatingTextRenderer: public RendererBase { public: virtual ~FloatingTextRenderer(); void setFont(IFont* font); void setColor(uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255); void setBackground(uint8_t br, uint8_t bg, uint8_t bb, uint8_t ba = 255); void setBorder(uint8_t bbr, uint8_t bbg, uint8_t bbb, uint8_t bba = 255); void resetBackground(); void resetBorder(); static FloatingTextRenderer* getInstance(IRendererContainer* cnt); private: FloatingTextRenderer(RenderBackend* renderbackend, int32_t position, IFont* font); }; } fifengine-0.4.2/engine/core/view/renderers/genericrenderer.cpp000066400000000000000000000344311341615052600244660ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "video/renderbackend.h" #include "video/animation.h" #include "video/fonts/ifont.h" #include "video/image.h" #include "video/imagemanager.h" #include "util/math/fife_math.h" #include "util/log/logger.h" #include "util/time/timemanager.h" #include "model/metamodel/grids/cellgrid.h" #include "model/metamodel/timeprovider.h" #include "model/structures/instance.h" #include "model/structures/layer.h" #include "model/structures/location.h" #include "view/camera.h" #include "genericrenderer.h" namespace FIFE { /** Logger to use for this source file. * @relates Logger */ static Logger _log(LM_VIEWVIEW); GenericRendererLineInfo::GenericRendererLineInfo(RendererNode n1, RendererNode n2, uint8_t r, uint8_t g, uint8_t b, uint8_t a): GenericRendererElementInfo(), m_edge1(n1), m_edge2(n2), m_red(r), m_green(g), m_blue(b), m_alpha(a) { } void GenericRendererLineInfo::render(Camera* cam, Layer* layer, RenderList& instances, RenderBackend* renderbackend) { Point p1 = m_edge1.getCalculatedPoint(cam, layer); Point p2 = m_edge2.getCalculatedPoint(cam, layer); if(m_edge1.getLayer() == layer) { renderbackend->drawLine(p1, p2, m_red, m_green, m_blue, m_alpha); if (renderbackend->getLightingModel() > 0) { renderbackend->changeRenderInfos(RENDER_DATA_WITHOUT_Z, 1, 4, 5, false, false, 0, KEEP, ALWAYS); } } } GenericRendererPointInfo::GenericRendererPointInfo(RendererNode anchor, uint8_t r, uint8_t g, uint8_t b, uint8_t a): GenericRendererElementInfo(), m_anchor(anchor), m_red(r), m_green(g), m_blue(b), m_alpha(a) { } void GenericRendererPointInfo::render(Camera* cam, Layer* layer, RenderList& instances, RenderBackend* renderbackend) { Point p = m_anchor.getCalculatedPoint(cam, layer); if(m_anchor.getLayer() == layer) { renderbackend->putPixel(p.x, p.y, m_red, m_green, m_blue, m_alpha); if (renderbackend->getLightingModel() > 0) { renderbackend->changeRenderInfos(RENDER_DATA_WITHOUT_Z, 1, 4, 5, false, false, 0, KEEP, ALWAYS); } } } GenericRendererTriangleInfo::GenericRendererTriangleInfo(RendererNode n1, RendererNode n2, RendererNode n3, uint8_t r, uint8_t g, uint8_t b, uint8_t a): GenericRendererElementInfo(), m_edge1(n1), m_edge2(n2), m_edge3(n3), m_red(r), m_green(g), m_blue(b), m_alpha(a) { } void GenericRendererTriangleInfo::render(Camera* cam, Layer* layer, RenderList& instances, RenderBackend* renderbackend) { Point p1 = m_edge1.getCalculatedPoint(cam, layer); Point p2 = m_edge2.getCalculatedPoint(cam, layer); Point p3 = m_edge3.getCalculatedPoint(cam, layer); if(m_edge1.getLayer() == layer) { renderbackend->drawTriangle(p1, p2, p3, m_red, m_green, m_blue, m_alpha); if (renderbackend->getLightingModel() > 0) { renderbackend->changeRenderInfos(RENDER_DATA_WITHOUT_Z, 1, 4, 5, false, false, 0, KEEP, ALWAYS); } } } GenericRendererQuadInfo::GenericRendererQuadInfo(RendererNode n1, RendererNode n2, RendererNode n3, RendererNode n4, uint8_t r, uint8_t g, uint8_t b, uint8_t a): GenericRendererElementInfo(), m_edge1(n1), m_edge2(n2), m_edge3(n3), m_edge4(n4), m_red(r), m_green(g), m_blue(b), m_alpha(a) { } void GenericRendererQuadInfo::render(Camera* cam, Layer* layer, RenderList& instances, RenderBackend* renderbackend) { Point p1 = m_edge1.getCalculatedPoint(cam, layer); Point p2 = m_edge2.getCalculatedPoint(cam, layer); Point p3 = m_edge3.getCalculatedPoint(cam, layer); Point p4 = m_edge4.getCalculatedPoint(cam, layer); if(m_edge1.getLayer() == layer) { renderbackend->drawQuad(p1, p2, p3, p4, m_red, m_green, m_blue, m_alpha); if (renderbackend->getLightingModel() > 0) { renderbackend->changeRenderInfos(RENDER_DATA_WITHOUT_Z, 1, 4, 5, false, false, 0, KEEP, ALWAYS); } } } GenericRendererVertexInfo::GenericRendererVertexInfo(RendererNode center, int32_t size, uint8_t r, uint8_t g, uint8_t b, uint8_t a): GenericRendererElementInfo(), m_center(center), m_size(size), m_red(r), m_green(g), m_blue(b), m_alpha(a) { } void GenericRendererVertexInfo::render(Camera* cam, Layer* layer, RenderList& instances, RenderBackend* renderbackend) { Point p = m_center.getCalculatedPoint(cam, layer); if(m_center.getLayer() == layer) { renderbackend->drawVertex(p, m_size, m_red, m_green, m_blue, m_alpha); if (renderbackend->getLightingModel() > 0) { renderbackend->changeRenderInfos(RENDER_DATA_WITHOUT_Z, 1, 4, 5, false, false, 0, KEEP, ALWAYS); } } } GenericRendererImageInfo::GenericRendererImageInfo(RendererNode anchor, ImagePtr image, bool zoomed): GenericRendererElementInfo(), m_anchor(anchor), m_image(image), m_zoomed(zoomed) { } void GenericRendererImageInfo::render(Camera* cam, Layer* layer, RenderList& instances, RenderBackend* renderbackend) { Point p = m_anchor.getCalculatedPoint(cam, layer, m_zoomed); if(m_anchor.getLayer() == layer) { Rect r; Rect viewport = cam->getViewPort(); uint32_t width, height; if(m_zoomed) { width = static_cast(round(m_image->getWidth() * cam->getZoom())); height = static_cast(round(m_image->getHeight() * cam->getZoom())); } else { width = m_image->getWidth(); height = m_image->getHeight(); } r.x = p.x-width/2; r.y = p.y-height/2; r.w = width; r.h = height; if(r.intersects(viewport)) { m_image->render(r); } } } GenericRendererAnimationInfo::GenericRendererAnimationInfo(RendererNode anchor, AnimationPtr animation, bool zoomed): GenericRendererElementInfo(), m_anchor(anchor), m_animation(animation), m_start_time(TimeManager::instance()->getTime()), m_time_scale(1.0), m_zoomed(zoomed) { } void GenericRendererAnimationInfo::render(Camera* cam, Layer* layer, RenderList& instances, RenderBackend* renderbackend) { Point p = m_anchor.getCalculatedPoint(cam, layer, m_zoomed); if(m_anchor.getLayer() == layer) { int32_t animtime = scaleTime(m_time_scale, TimeManager::instance()->getTime() - m_start_time) % m_animation->getDuration(); ImagePtr img = m_animation->getFrameByTimestamp(animtime); Rect r; Rect viewport = cam->getViewPort(); uint32_t width, height; if(m_zoomed) { width = static_cast(round(img->getWidth() * cam->getZoom())); height = static_cast(round(img->getHeight() * cam->getZoom())); } else { width = img->getWidth(); height = img->getHeight(); } r.x = p.x-width/2; r.y = p.y-height/2; r.w = width; r.h = height; if(r.intersects(viewport)) { img->render(r); } } } GenericRendererTextInfo::GenericRendererTextInfo(RendererNode anchor, IFont* font, std::string text, bool zoomed): GenericRendererElementInfo(), m_anchor(anchor), m_font(font), m_text(text), m_zoomed(zoomed) { } void GenericRendererTextInfo::render(Camera* cam, Layer* layer, RenderList& instances, RenderBackend* renderbackend) { Point p = m_anchor.getCalculatedPoint(cam, layer, m_zoomed); if(m_anchor.getLayer() == layer) { Image* img = m_font->getAsImageMultiline(m_text); Rect r; Rect viewport = cam->getViewPort(); uint32_t width, height; if(m_zoomed) { width = static_cast(round(img->getWidth() * cam->getZoom())); height = static_cast(round(img->getHeight() * cam->getZoom())); } else { width = img->getWidth(); height = img->getHeight(); } r.x = p.x-width/2; r.y = p.y-height/2; r.w = width; r.h = height; if(r.intersects(viewport)) { img->render(r); if (renderbackend->getLightingModel() > 0) { renderbackend->changeRenderInfos(RENDER_DATA_WITHOUT_Z, 1, 4, 5, false, false, 0, KEEP, ALWAYS); } } } } GenericRendererResizeInfo::GenericRendererResizeInfo(RendererNode anchor, ImagePtr image, int32_t width, int32_t height, bool zoomed): GenericRendererElementInfo(), m_anchor(anchor), m_image(image), m_width(width), m_height(height), m_zoomed(zoomed) { } void GenericRendererResizeInfo::render(Camera* cam, Layer* layer, RenderList& instances, RenderBackend* renderbackend) { Point p = m_anchor.getCalculatedPoint(cam, layer, m_zoomed); if(m_anchor.getLayer() == layer) { Rect r; Rect viewport = cam->getViewPort(); uint32_t width, height; if(m_zoomed) { width = static_cast(round(m_width * cam->getZoom())); height = static_cast(round(m_height * cam->getZoom())); } else { width = m_width; height = m_height; } r.x = p.x-width/2; r.y = p.y-height/2; r.w = width; r.h = height; if(r.intersects(viewport)) { m_image->render(r); } } } GenericRenderer* GenericRenderer::getInstance(IRendererContainer* cnt) { return dynamic_cast(cnt->getRenderer("GenericRenderer")); } GenericRenderer::GenericRenderer(RenderBackend* renderbackend, int32_t position): RendererBase(renderbackend, position), m_groups() { setEnabled(false); } GenericRenderer::GenericRenderer(const GenericRenderer& old): RendererBase(old), m_groups() { setEnabled(false); } RendererBase* GenericRenderer::clone() { return new GenericRenderer(*this); } GenericRenderer::~GenericRenderer() { } void GenericRenderer::addLine(const std::string &group, RendererNode n1, RendererNode n2, uint8_t r, uint8_t g, uint8_t b, uint8_t a) { GenericRendererElementInfo* info = new GenericRendererLineInfo(n1, n2, r, g, b, a); m_groups[group].push_back(info); } void GenericRenderer::addPoint(const std::string &group, RendererNode n, uint8_t r, uint8_t g, uint8_t b, uint8_t a) { GenericRendererElementInfo* info = new GenericRendererPointInfo(n, r, g, b, a); m_groups[group].push_back(info); } void GenericRenderer::addTriangle(const std::string &group, RendererNode n1, RendererNode n2, RendererNode n3, uint8_t r, uint8_t g, uint8_t b, uint8_t a) { GenericRendererElementInfo* info = new GenericRendererTriangleInfo(n1, n2, n3, r, g, b, a); m_groups[group].push_back(info); } void GenericRenderer::addQuad(const std::string &group, RendererNode n1, RendererNode n2, RendererNode n3, RendererNode n4, uint8_t r, uint8_t g, uint8_t b, uint8_t a) { GenericRendererElementInfo* info = new GenericRendererQuadInfo(n1, n2, n3, n4, r, g, b, a); m_groups[group].push_back(info); } void GenericRenderer::addVertex(const std::string &group, RendererNode n, int32_t size, uint8_t r, uint8_t g, uint8_t b, uint8_t a) { GenericRendererElementInfo* info = new GenericRendererVertexInfo(n, size, r, g, b, a); m_groups[group].push_back(info); } void GenericRenderer::addText(const std::string &group, RendererNode n, IFont* font, const std::string &text, bool zoomed) { GenericRendererElementInfo* info = new GenericRendererTextInfo(n, font, text, zoomed); m_groups[group].push_back(info); } void GenericRenderer::addImage(const std::string &group, RendererNode n, ImagePtr image, bool zoomed) { GenericRendererElementInfo* info = new GenericRendererImageInfo(n, image, zoomed); m_groups[group].push_back(info); } void GenericRenderer::addAnimation(const std::string &group, RendererNode n, AnimationPtr animation, bool zoomed) { GenericRendererElementInfo* info = new GenericRendererAnimationInfo(n, animation, zoomed); m_groups[group].push_back(info); } void GenericRenderer::resizeImage(const std::string &group, RendererNode n, ImagePtr image, int32_t width, int32_t height, bool zoomed) { GenericRendererElementInfo* info = new GenericRendererResizeInfo(n, image, width, height, zoomed); m_groups[group].push_back(info); } void GenericRenderer::removeAll(const std::string &group) { std::vector::const_iterator info_it = m_groups[group].begin(); for (;info_it != m_groups[group].end(); ++info_it) { delete *info_it; } m_groups[group].clear(); m_groups.erase(group); } // Remove all groups void GenericRenderer::removeAll() { std::map >::iterator it = m_groups.begin(); for (; it != m_groups.end(); ++it) { std::vector::const_iterator info_it = it->second.begin(); for (;info_it != it->second.end(); ++info_it) { delete *info_it; } } m_groups.clear(); } // Clear all groups void GenericRenderer::reset() { removeAll(); } void GenericRenderer::render(Camera* cam, Layer* layer, RenderList& instances) { std::map >::iterator group_it = m_groups.begin(); for(; group_it != m_groups.end(); ++group_it) { std::vector::const_iterator info_it = group_it->second.begin(); for (;info_it != group_it->second.end(); ++info_it) { (*info_it)->render(cam, layer, instances, m_renderbackend); } } } } fifengine-0.4.2/engine/core/view/renderers/genericrenderer.h000066400000000000000000000277431341615052600241430ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_GENERICRENDERER_H #define FIFE_GENERICRENDERER_H // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "model/structures/renderernode.h" #include "view/rendererbase.h" #include "video/animation.h" namespace FIFE { class RenderBackend; class IFont; class GenericRendererElementInfo { public: virtual void render(Camera* cam, Layer* layer, RenderList& instances, RenderBackend* renderbackend) {}; virtual ~GenericRendererElementInfo() {}; }; class GenericRendererLineInfo : public GenericRendererElementInfo { public: void render(Camera* cam, Layer* layer, RenderList& instances, RenderBackend* renderbackend); GenericRendererLineInfo(RendererNode n1, RendererNode n2, uint8_t r, uint8_t g, uint8_t b, uint8_t a); virtual ~GenericRendererLineInfo() {}; private: RendererNode m_edge1; RendererNode m_edge2; uint8_t m_red; uint8_t m_green; uint8_t m_blue; uint8_t m_alpha; }; class GenericRendererPointInfo : public GenericRendererElementInfo { public: void render(Camera* cam, Layer* layer, RenderList& instances, RenderBackend* renderbackend); GenericRendererPointInfo(RendererNode n, uint8_t r, uint8_t g, uint8_t b, uint8_t a); virtual ~GenericRendererPointInfo() {}; private: RendererNode m_anchor; uint8_t m_red; uint8_t m_green; uint8_t m_blue; uint8_t m_alpha; }; class GenericRendererTriangleInfo : public GenericRendererElementInfo { public: void render(Camera* cam, Layer* layer, RenderList& instances, RenderBackend* renderbackend); GenericRendererTriangleInfo(RendererNode n1, RendererNode n2, RendererNode n3, uint8_t r, uint8_t g, uint8_t b, uint8_t a); virtual ~GenericRendererTriangleInfo() {}; private: RendererNode m_edge1; RendererNode m_edge2; RendererNode m_edge3; uint8_t m_red; uint8_t m_green; uint8_t m_blue; uint8_t m_alpha; }; class GenericRendererQuadInfo : public GenericRendererElementInfo { public: void render(Camera* cam, Layer* layer, RenderList& instances, RenderBackend* renderbackend); GenericRendererQuadInfo(RendererNode n1, RendererNode n2, RendererNode n3, RendererNode n4, uint8_t r, uint8_t g, uint8_t b, uint8_t a); virtual ~GenericRendererQuadInfo() {}; private: RendererNode m_edge1; RendererNode m_edge2; RendererNode m_edge3; RendererNode m_edge4; uint8_t m_red; uint8_t m_green; uint8_t m_blue; uint8_t m_alpha; }; class GenericRendererVertexInfo : public GenericRendererElementInfo { public: void render(Camera* cam, Layer* layer, RenderList& instances, RenderBackend* renderbackend); GenericRendererVertexInfo(RendererNode center, int32_t size, uint8_t r, uint8_t g, uint8_t b, uint8_t a); virtual ~GenericRendererVertexInfo() {}; private: RendererNode m_center; int32_t m_size; uint8_t m_red; uint8_t m_green; uint8_t m_blue; uint8_t m_alpha; }; class GenericRendererImageInfo : public GenericRendererElementInfo { public: void render(Camera* cam, Layer* layer, RenderList& instances, RenderBackend* renderbackend); GenericRendererImageInfo(RendererNode n, ImagePtr image, bool zoomed = true); virtual ~GenericRendererImageInfo() {}; private: RendererNode m_anchor; ImagePtr m_image; bool m_zoomed; }; class GenericRendererAnimationInfo : public GenericRendererElementInfo { public: void render(Camera* cam, Layer* layer, RenderList& instances, RenderBackend* renderbackend); GenericRendererAnimationInfo(RendererNode n, AnimationPtr animation, bool zoomed = true); virtual ~GenericRendererAnimationInfo() {}; private: RendererNode m_anchor; AnimationPtr m_animation; uint32_t m_start_time; float m_time_scale; bool m_zoomed; }; class GenericRendererTextInfo : public GenericRendererElementInfo { public: void render(Camera* cam, Layer* layer, RenderList& instances, RenderBackend* renderbackend); GenericRendererTextInfo(RendererNode n, IFont* font, std::string text, bool zoomed = true); virtual ~GenericRendererTextInfo() {}; private: RendererNode m_anchor; IFont* m_font; std::string m_text; bool m_zoomed; }; class GenericRendererResizeInfo : public GenericRendererElementInfo { public: void render(Camera* cam, Layer* layer, RenderList& instances, RenderBackend* renderbackend); GenericRendererResizeInfo(RendererNode n, ImagePtr image, int32_t width, int32_t height, bool zoomed = true); virtual ~GenericRendererResizeInfo() {}; private: RendererNode m_anchor; ImagePtr m_image; int32_t m_width; int32_t m_height; bool m_zoomed; }; class GenericRenderer: public RendererBase { public: /** Constructor. * * @param renderbackend The renderbackend to use. * @param position The position for this renderer in rendering pipeline. * @ see setPipelinePosition */ GenericRenderer(RenderBackend* renderbackend, int32_t position); /** Copy Constructor. */ GenericRenderer(const GenericRenderer& old); /** Makes copy of this renderer. */ RendererBase* clone(); /** Destructor. */ virtual ~GenericRenderer(); /** This method is called by the view to ask renderer to draw its rendering aspect based on * given parameters. * * @param cam Camera view to draw * @param layer Current layer to be rendered * @param instances Instances on the current layer */ void render(Camera* cam, Layer* layer, RenderList& instances); /** Returns the renderer name. * * @return The name as string. */ std::string getName() { return "GenericRenderer"; } /** Gets instance for interface access. */ static GenericRenderer* getInstance(IRendererContainer* cnt); /** Adds a line. * * @param group The group name as string. * @param n1 A RendererNode, contains the coordinates. * @param n2 A RendererNode, contains the coordinates. * @param r The value for red, range 0-255. * @param g The value for green, range 0-255. * @param b The value for blue, range 0-255. * @param a The value for alpha, range 0-255. Default value is 255, full opaque. */ void addLine(const std::string &group, RendererNode n1, RendererNode n2, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255); /** Adds a point. * * @param group The group name as string. * @param n A RendererNode, contains the coordinates. * @param r The value for red, range 0-255. * @param g The value for green, range 0-255. * @param b The value for blue, range 0-255. * @param a The value for alpha, range 0-255. Default value is 255, full opaque. */ void addPoint(const std::string &group, RendererNode n, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255); /** Adds a triangle. * * @param group The group name as string. * @param n1 A RendererNode, contains the coordinates. * @param n2 A RendererNode, contains the coordinates. * @param n3 A RendererNode, contains the coordinates. * @param r The value for red, range 0-255. * @param g The value for green, range 0-255. * @param b The value for blue, range 0-255. * @param a The value for alpha, range 0-255. Default value is 255, full opaque. */ void addTriangle(const std::string &group, RendererNode n1, RendererNode n2, RendererNode n3, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255); /** Adds a quad. * * @param group The group name as string. * @param n1 A RendererNode, contains the coordinates. * @param n2 A RendererNode, contains the coordinates. * @param n3 A RendererNode, contains the coordinates. * @param n4 A RendererNode, contains the coordinates. * @param r The value for red, range 0-255. * @param g The value for green, range 0-255. * @param b The value for blue, range 0-255. * @param a The value for alpha, range 0-255. Default value is 255, full opaque. */ void addQuad(const std::string &group, RendererNode n1, RendererNode n2, RendererNode n3, RendererNode n4, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255); /** Adds a vertex. * * @param group The group name as string. * @param n A RendererNode, contains the coordinates. * @param size The size of the vertex. * @param r The value for red, range 0-255. * @param g The value for green, range 0-255. * @param b The value for blue, range 0-255. * @param a The value for alpha, range 0-255. Default value is 255, full opaque. */ void addVertex(const std::string &group, RendererNode n, int32_t size, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255); /** Adds text. * * @param group The group name as string. * @param n A RendererNode, contains the coordinates. * @param font The used font. * @param text The text as string. * @param zoomed A flag that indicates whether the camera zoom to be used. Default is true. */ void addText(const std::string &group, RendererNode n, IFont* font, const std::string &text, bool zoomed = true); /** Adds an image. * * @param group The group name as string. * @param n A RendererNode, contains the coordinates. * @param image The used image. * @param zoomed A flag that indicates whether the camera zoom to be used. Default is true. */ void addImage(const std::string &group, RendererNode n, ImagePtr image, bool zoomed = true); /** Adds an animation. * * @param group The group name as string. * @param n A RendererNode, contains the coordinates. * @param animation The used animation. * @param zoomed A flag that indicates whether the camera zoom to be used. Default is true. */ void addAnimation(const std::string &group, RendererNode n, AnimationPtr animation, bool zoomed = true); /** Adds an image with another size. * * @param group The group name as string. * @param n A RendererNode, contains the coordinates. * @param image The used image. * @param width New width of the image. * @param height New height of the image. * @param zoomed A flag that indicates whether the camera zoom to be used. Default is true. */ void resizeImage(const std::string &group, RendererNode n, ImagePtr image, int32_t width, int32_t height, bool zoomed = true); /** Removes all elements of a group. * * @param group The group name as string. */ void removeAll(const std::string &group); /** Removes all elements. */ void removeAll(); /** Resets the renderer. */ void reset(); private: //! A map that holds the groups together with the appended render elements. std::map > m_groups; }; } #endif fifengine-0.4.2/engine/core/view/renderers/genericrenderer.i000066400000000000000000000121661341615052600241350ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fife %{ #include "view/renderers/genericrenderer.h" %} namespace FIFE { class RenderBackend; class GenericRendererElementInfo { public: virtual ~GenericRendererElementInfo() {}; }; class GenericRendererLineInfo : public GenericRendererElementInfo { public: GenericRendererLineInfo(RendererNode n1, RendererNode n2, uint8_t r, uint8_t g, uint8_t b, uint8_t a); virtual ~GenericRendererLineInfo() {}; }; class GenericRendererPointInfo : public GenericRendererElementInfo { public: GenericRendererPointInfo(RendererNode n, uint8_t r, uint8_t g, uint8_t b, uint8_t a); virtual ~GenericRendererPointInfo() {}; }; class GenericRendererTriangleInfo : public GenericRendererElementInfo { public: GenericRendererTriangleInfo(RendererNode n1, RendererNode n2, RendererNode n3, uint8_t r, uint8_t g, uint8_t b, uint8_t a); virtual ~GenericRendererTriangleInfo() {}; }; class GenericRendererQuadInfo : public GenericRendererElementInfo { public: GenericRendererQuadInfo(RendererNode n1, RendererNode n2, RendererNode n3, RendererNode n4, uint8_t r, uint8_t g, uint8_t b, uint8_t a); virtual ~GenericRendererQuadInfo() {}; }; class GenericRendererVertexInfo : public GenericRendererElementInfo { public: GenericRendererVertexInfo(RendererNode center, int32_t size, uint8_t r, uint8_t g, uint8_t b, uint8_t a); virtual ~GenericRendererVertexInfo() {}; }; class GenericRendererImageInfo : public GenericRendererElementInfo { public: GenericRendererImageInfo(RendererNode n, ImagePtr image, bool zoomed = true); virtual ~GenericRendererImageInfo() {}; }; class GenericRendererAnimationInfo : public GenericRendererElementInfo { public: GenericRendererAnimationInfo(RendererNode n, AnimationPtr animation, bool zoomed = true); virtual ~GenericRendererAnimationInfo() {}; }; class GenericRendererTextInfo : public GenericRendererElementInfo { public: GenericRendererTextInfo(RendererNode n, IFont* font, std::string text, bool zoomed = true); virtual ~GenericRendererTextInfo() {}; }; class GenericRendererResizeInfo : public GenericRendererElementInfo { public: GenericRendererResizeInfo(RendererNode n, ImagePtr image, int32_t width, int32_t height, bool zoomed = true); virtual ~GenericRendererResizeInfo() {}; }; class GenericRenderer: public RendererBase { public: GenericRenderer(RenderBackend* renderbackend, int32_t position); ~GenericRenderer(); std::string getName(); static GenericRenderer* getInstance(IRendererContainer* cnt); void addLine(const std::string &group, RendererNode n1, RendererNode n2, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255); void addPoint(const std::string &group, RendererNode n, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255); void addTriangle(const std::string &group, RendererNode n1, RendererNode n2, RendererNode n3, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255); void addQuad(const std::string &group, RendererNode n1, RendererNode n2, RendererNode n3, RendererNode n4, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255); void addVertex(const std::string &group, RendererNode n, int32_t size, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255); void addText(const std::string &group, RendererNode n, IFont* font, const std::string &text, bool zoomed = true); void addImage(const std::string &group, RendererNode n, ImagePtr image, bool zoomed = true); void addAnimation(const std::string &group, RendererNode n, AnimationPtr animation, bool zoomed = true); void resizeImage(const std::string &group, RendererNode n, ImagePtr image, int32_t width, int32_t height, bool zoomed = true); void removeAll(const std::string &group); void removeAll(); }; } fifengine-0.4.2/engine/core/view/renderers/gridrenderer.cpp000066400000000000000000000162221341615052600237750ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "video/renderbackend.h" #include "util/math/fife_math.h" #include "util/log/logger.h" #include "model/metamodel/grids/cellgrid.h" #include "model/structures/instance.h" #include "model/structures/layer.h" #include "model/structures/location.h" #include "view/camera.h" #include "gridrenderer.h" namespace FIFE { /** Logger to use for this source file. * @relates Logger */ static Logger _log(LM_VIEWVIEW); GridRenderer::GridRenderer(RenderBackend* renderbackend, int32_t position): RendererBase(renderbackend, position) { setEnabled(false); m_color.r = 0; m_color.g = 255; m_color.b = 0; } GridRenderer::GridRenderer(const GridRenderer& old): RendererBase(old), m_color(old.m_color) { setEnabled(false); } RendererBase* GridRenderer::clone() { return new GridRenderer(*this); } GridRenderer::~GridRenderer() { } GridRenderer* GridRenderer::getInstance(IRendererContainer* cnt) { return dynamic_cast(cnt->getRenderer("GridRenderer")); } void GridRenderer::render(Camera* cam, Layer* layer, RenderList& instances) { CellGrid* cg = layer->getCellGrid(); if (!cg) { FL_WARN(_log, "No cellgrid assigned to layer, cannot draw grid"); return; } // // //render elev_coord box // //draw front quad // // 1,1,1 // //1,-1,1 // //-1,-1,1 // //-1,1,1 //We don't need the elevation box atm // Point a,b,c,d; // // // ScreenPoint copt1 =cam->toScreenCoordinates(ExactModelCoordinate(1,1,1) ); // ScreenPoint copt2 =cam->toScreenCoordinates(ExactModelCoordinate(1,-1,1) ); // Point coptt1(copt1.x,copt1.y); // Point coptt2(copt2.x,copt2.y); // m_renderbackend->drawLine(coptt1,coptt2 ,15, 15, 200); // a = coptt1; // // copt1 =cam->toScreenCoordinates(ExactModelCoordinate(1,-1,1) ); // copt2 =cam->toScreenCoordinates(ExactModelCoordinate(-1,-1,1) ); // coptt1 = Point(copt1.x,copt1.y); // coptt2 = Point(copt2.x,copt2.y); // m_renderbackend->drawLine(coptt1,coptt2 ,15, 15, 200); // b = coptt1; // // copt1 =cam->toScreenCoordinates(ExactModelCoordinate(-1,-1,1) ); // copt2 =cam->toScreenCoordinates(ExactModelCoordinate(-1,1,1) ); // coptt1 = Point(copt1.x,copt1.y); // coptt2 = Point(copt2.x,copt2.y); // m_renderbackend->drawLine(coptt1,coptt2 ,15, 15, 200); // c = coptt1; // // copt1 =cam->toScreenCoordinates(ExactModelCoordinate(-1,1,1) ); // copt2 =cam->toScreenCoordinates(ExactModelCoordinate(1,1,1) ); // coptt1 = Point(copt1.x,copt1.y); // coptt2 = Point(copt2.x,copt2.y); // m_renderbackend->drawLine(coptt1,coptt2 ,15, 15, 20); // d = coptt1; // // m_renderbackend->drawQuad(a,b,c,d,15, 15, 200); // // // //draw back quad // copt1 =cam->toScreenCoordinates(ExactModelCoordinate(-1,-1,-1) ); // copt2 =cam->toScreenCoordinates(ExactModelCoordinate(-1,1,-1) ); // coptt1 = Point(copt1.x,copt1.y); // coptt2 = Point(copt2.x,copt2.y); // m_renderbackend->drawLine(coptt1,coptt2 ,200, 200, 200); // // copt1 =cam->toScreenCoordinates(ExactModelCoordinate(-1,1,-1) ); // copt2 =cam->toScreenCoordinates(ExactModelCoordinate(1,1,-1) ); // coptt1 = Point(copt1.x,copt1.y); // coptt2 = Point(copt2.x,copt2.y); // m_renderbackend->drawLine(coptt1,coptt2 ,200, 200, 200); // // copt1 =cam->toScreenCoordinates(ExactModelCoordinate(1,1,-1) ); // copt2 =cam->toScreenCoordinates(ExactModelCoordinate(1,-1,-1) ); // coptt1 = Point(copt1.x,copt1.y); // coptt2 = Point(copt2.x,copt2.y); // m_renderbackend->drawLine(coptt1,coptt2 ,200, 200, 200); // // copt1 =cam->toScreenCoordinates(ExactModelCoordinate(1,-1,-1) ); // copt2 =cam->toScreenCoordinates(ExactModelCoordinate(-1,-1,-1) ); // coptt1 = Point(copt1.x,copt1.y); // coptt2 = Point(copt2.x,copt2.y); // m_renderbackend->drawLine(coptt1,coptt2 ,200, 200, 200); // make the viewport 25% larger Rect cv = cam->getViewPort(); int32_t cvx2 = round((cv.x+cv.w) * 1.25); int32_t cvy2 = round((cv.y+cv.h) * 1.25); cv.x -= round((cv.x+cv.w) * 0.125); cv.y -= round((cv.y+cv.h) * 0.125); RenderList::const_iterator instance_it = instances.begin(); for (;instance_it != instances.end(); ++instance_it) { Instance* instance = (*instance_it)->instance; std::vector vertices; cg->getVertices(vertices, instance->getLocationRef().getLayerCoordinates()); std::vector::const_iterator it = vertices.begin(); ScreenPoint firstpt = cam->toScreenCoordinates(cg->toMapCoordinates(*it)); Point pt1(firstpt.x, firstpt.y); Point pt2; ++it; for (; it != vertices.end(); it++) { ScreenPoint pts = cam->toScreenCoordinates(cg->toMapCoordinates(*it)); pt2.x = pts.x; pt2.y = pts.y; Point cpt1 = pt1; Point cpt2 = pt2; if (cpt1.x < cv.x) cpt1.x = cv.x; if (cpt2.x < cv.x) cpt2.x = cv.x; if (cpt1.y < cv.y) cpt1.y = cv.y; if (cpt2.y < cv.y) cpt2.y = cv.y; if (cpt1.x > cvx2) cpt1.x = cvx2; if (cpt2.x > cvx2) cpt2.x = cvx2; if (cpt1.y > cvy2) cpt1.y = cvy2; if (cpt2.y > cvy2) cpt2.y = cvy2; m_renderbackend->drawLine(cpt1, cpt2, m_color.r, m_color.g, m_color.b); pt1 = pt2; } if ((pt2.x >= cv.x) && (pt2.x <= cvx2) && (pt2.y >= cv.y) && (pt2.y <= cvy2)) { if ((firstpt.x >= cv.x) && (firstpt.x <= cvx2) && (firstpt.y >= cv.y) && (firstpt.y <= cvy2)) { m_renderbackend->drawLine(pt2, Point(firstpt.x, firstpt.y), m_color.r, m_color.g, m_color.b); } } } } void GridRenderer::setColor(Uint8 r, Uint8 g, Uint8 b) { m_color.r = r; m_color.g = g; m_color.b = b; } } fifengine-0.4.2/engine/core/view/renderers/gridrenderer.h000066400000000000000000000050201341615052600234340ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_GRIDRENDERER_H #define FIFE_GRIDRENDERER_H // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "view/rendererbase.h" namespace FIFE { class RenderBackend; class GridRenderer: public RendererBase { public: /** constructor. * @param renderbackend to use * @param position position for this renderer in rendering pipeline */ GridRenderer(RenderBackend* renderbackend, int32_t position); GridRenderer(const GridRenderer& old); RendererBase* clone(); /** Destructor. */ virtual ~GridRenderer(); void render(Camera* cam, Layer* layer, RenderList& instances); std::string getName() { return "GridRenderer"; } void setColor(Uint8 r, Uint8 g, Uint8 b); static GridRenderer* getInstance(IRendererContainer* cnt); private: SDL_Color m_color; }; } #endif fifengine-0.4.2/engine/core/view/renderers/gridrenderer.i000066400000000000000000000036171341615052600234470ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fife %{ #include "view/renderers/gridrenderer.h" %} namespace FIFE { class RenderBackend; class GridRenderer: public RendererBase { public: virtual ~GridRenderer(); std::string getName(); void setColor(Uint8 r, Uint8 g, Uint8 b); static GridRenderer* getInstance(IRendererContainer* cnt); private: GridRenderer(RenderBackend* renderbackend, int32_t position); }; } fifengine-0.4.2/engine/core/view/renderers/instancerenderer.cpp000066400000000000000000001441031341615052600246540ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "video/renderbackend.h" #include "video/image.h" #include "video/imagemanager.h" #include "video/sdl/sdlimage.h" #include "video/animation.h" #include "util/math/fife_math.h" #include "util/log/logger.h" #include "util/time/timemanager.h" #include "model/metamodel/grids/cellgrid.h" #include "model/metamodel/action.h" #include "model/structures/instance.h" #include "model/structures/layer.h" #include "model/structures/location.h" #include "model/structures/map.h" #include "model/structures/cell.h" #include "model/structures/cellcache.h" #include "video/opengl/fife_opengl.h" #include "view/camera.h" #include "view/visual.h" #include "instancerenderer.h" namespace FIFE { /** Logger to use for this source file. * @relates Logger */ static Logger _log(LM_VIEWVIEW); class InstanceRendererDeleteListener : public InstanceDeleteListener { public: InstanceRendererDeleteListener(InstanceRenderer* r) { m_renderer = r; } virtual ~InstanceRendererDeleteListener() {} virtual void onInstanceDeleted(Instance* instance) { m_renderer->removeInstance(instance); } private: InstanceRenderer* m_renderer; }; InstanceRenderer::OutlineInfo::OutlineInfo(InstanceRenderer* r): r(0), g(0), b(0), width(1), threshold(1), dirty(false), curimg(NULL), renderer(r) { } InstanceRenderer::ColoringInfo::ColoringInfo(InstanceRenderer* r): r(0), g(0), b(0), a(128), dirty(false), curimg(NULL), renderer(r) { } InstanceRenderer::AreaInfo::AreaInfo(): instance(NULL), groups(), w(1), h(1), trans(0), front(true), z(0) { } InstanceRenderer::OutlineInfo::~OutlineInfo() { renderer->addToCheck(outline); } InstanceRenderer::ColoringInfo::~ColoringInfo() { if (renderer->needColorBinding()) { renderer->addToCheck(overlay); } } InstanceRenderer::AreaInfo::~AreaInfo() { } InstanceRenderer* InstanceRenderer::getInstance(IRendererContainer* cnt) { return dynamic_cast(cnt->getRenderer("InstanceRenderer")); } InstanceRenderer::InstanceRenderer(RenderBackend* renderbackend, int32_t position): RendererBase(renderbackend, position), m_area_layer(false), m_interval(60*1000), m_timer_enabled(false) { setEnabled(true); if (m_renderbackend->getName() == "OpenGL" && m_renderbackend->isDepthBufferEnabled()) { m_need_sorting = false; m_need_bind_coloring = false; } else { m_need_sorting = true; if (m_renderbackend->getName() == "SDL") { m_need_bind_coloring = true; } else { m_need_bind_coloring = false; } } // init timer m_timer.setInterval(m_interval); m_timer.setCallback(std::bind(&InstanceRenderer::check, this)); // create delete listener m_delete_listener = new InstanceRendererDeleteListener(this); } InstanceRenderer::InstanceRenderer(const InstanceRenderer& old): RendererBase(old), m_area_layer(false), m_interval(old.m_interval), m_timer_enabled(false) { setEnabled(true); if (m_renderbackend->getName() == "OpenGL" && m_renderbackend->isDepthBufferEnabled()) { m_need_sorting = false; m_need_bind_coloring = false; } else { m_need_sorting = true; if (m_renderbackend->getName() == "SDL") { m_need_bind_coloring = true; } else { m_need_bind_coloring = false; } } // init timer m_timer.setInterval(m_interval); m_timer.setCallback(std::bind(&InstanceRenderer::check, this)); // create delete listener m_delete_listener = new InstanceRendererDeleteListener(this); } RendererBase* InstanceRenderer::clone() { return new InstanceRenderer(*this); } InstanceRenderer::~InstanceRenderer() { // remove listener from instances if (!m_assigned_instances.empty()) { reset(); } // delete listener delete m_delete_listener; } void InstanceRenderer::render(Camera* cam, Layer* layer, RenderList& instances) { // FL_DBG(_log, "Iterating layer..."); CellGrid* cg = layer->getCellGrid(); if (!cg) { FL_WARN(_log, "No cellgrid assigned to layer, cannot draw instances"); return; } if(m_need_sorting) { renderAlreadySorted(cam, layer, instances); } else { renderUnsorted(cam, layer, instances); } } void InstanceRenderer::renderUnsorted(Camera* cam, Layer* layer, RenderList& instances) { // FIXME: Unlit is currently broken, maybe it would be the best to change Lightsystem const bool any_effects = !(m_instance_outlines.empty() && m_instance_colorings.empty()); const bool unlit = !m_unlit_groups.empty(); uint32_t lm = m_renderbackend->getLightingModel(); // thanks to multimap, we will have transparent instances already sorted by their z value (key) std::multimap transparentInstances; m_area_layer = false; if(!m_instance_areas.empty()) { InstanceToAreas_t::iterator area_it = m_instance_areas.begin(); for(;area_it != m_instance_areas.end(); area_it++) { AreaInfo& info = area_it->second; if(info.instance->getLocation().getLayer() == layer) { if(info.front) { DoublePoint3D instance_posv = cam->toVirtualScreenCoordinates(info.instance->getLocation().getMapCoordinates()); info.z = instance_posv.z; } m_area_layer = true; } } } RenderList::iterator instance_it = instances.begin(); for (;instance_it != instances.end(); ++instance_it) { // FL_DBG(_log, "Iterating instances..."); Instance* instance = (*instance_it)->instance; RenderItem& vc = **instance_it; float vertexZ = vc.vertexZ; if (m_area_layer) { InstanceToAreas_t::iterator areas_it = m_instance_areas.begin(); for(;areas_it != m_instance_areas.end(); areas_it++) { AreaInfo& infoa = areas_it->second; if (infoa.front) { if (infoa.z >= vc.screenpoint.z) { continue; } } std::string str_name = instance->getObject()->getNamespace(); std::list::iterator group_it = infoa.groups.begin(); for (;group_it != infoa.groups.end(); ++group_it) { if (str_name.find((*group_it)) != std::string::npos) { ScreenPoint p; Rect rec; p = cam->toScreenCoordinates(infoa.instance->getLocation().getMapCoordinates()); rec.x = p.x - infoa.w / 2; rec.y = p.y - infoa.h / 2; rec.w = infoa.w; rec.h = infoa.h; if (infoa.instance != instance && vc.dimensions.intersects(rec)) { vc.transparency = 255 - infoa.trans; // dirty hack to reset the transparency on next pump InstanceVisual* visual = instance->getVisual(); visual->setVisible(!visual->isVisible()); visual->setVisible(!visual->isVisible()); } } } } } // if instance is not opacous if (vc.transparency != 255) { transparentInstances.insert(std::pair(vertexZ, &vc)); continue; } uint8_t coloringColor[4] = { 0 }; Image* outlineImage = 0; bool recoloring = false; if (any_effects) { // coloring InstanceToColoring_t::iterator coloring_it = m_instance_colorings.find(instance); const bool coloring = coloring_it != m_instance_colorings.end(); if (coloring) { coloringColor[0] = coloring_it->second.r; coloringColor[1] = coloring_it->second.g; coloringColor[2] = coloring_it->second.b; coloringColor[3] = coloring_it->second.a; recoloring = true; } // outline InstanceToOutlines_t::iterator outline_it = m_instance_outlines.find(instance); const bool outline = outline_it != m_instance_outlines.end(); if (outline) { if (lm != 0) { // first render normal image without stencil and alpha test (0) // so it wont look aliased and then with alpha test render only outline (its 'binary' image) outlineImage = bindOutline(outline_it->second, vc, cam); } else { bindOutline(outline_it->second, vc, cam)->renderZ(vc.dimensions, vertexZ, vc.transparency, static_cast(0)); } } } // if(lm != 0) { // if(unlit) { // bool found = false; // std::string lit_name = instance->getObject()->getNamespace(); // std::list::iterator unlit_it = m_unlit_groups.begin(); // for(;unlit_it != m_unlit_groups.end(); ++unlit_it) { // if(lit_name.find(*unlit_it) != std::string::npos) { // found = true; // break; // } // } // vc.image->render(vc.dimensions, vc.transparency, recoloring ? coloringColor : 0); // if (found) { // m_renderbackend->changeRenderInfos(1, 4, 5, true, true, 255, REPLACE, ALWAYS, recoloring ? OVERLAY_TYPE_COLOR : OVERLAY_TYPE_NONE); // } else { // m_renderbackend->changeRenderInfos(1, 4, 5, true, true, 0, ZERO, ALWAYS, recoloring ? OVERLAY_TYPE_COLOR : OVERLAY_TYPE_NONE); // } // if (outlineImage) { // outlineImage->render(vc.dimensions, vc.transparency); // m_renderbackend->changeRenderInfos(1, 4, 5, false, true, 255, REPLACE, ALWAYS); // } // continue; // } // } // overlay if (vc.m_overlay) { renderOverlay(RENDER_DATA_MULTITEXTURE_Z, &vc, coloringColor, recoloring); // no overlay } else { vc.image->renderZ(vc.dimensions, vertexZ, vc.transparency, recoloring ? coloringColor : 0); } if (outlineImage) { outlineImage->renderZ(vc.dimensions, vertexZ, vc.transparency, static_cast(0)); m_renderbackend->changeRenderInfos(RENDER_DATA_TEXTURE_Z, 1, 4, 5, false, true, 255, REPLACE, ALWAYS); } } // iterate through all (semi) transparent instances std::multimap::iterator it = transparentInstances.begin(); for( ; it != transparentInstances.end(); ++it) { RenderItem& vc = *(it->second); Instance* instance = vc.instance; uint8_t alpha = vc.transparency; float vertexZ = it->first; uint8_t coloringColor[4] = { 0 }; Image* outlineImage = 0; bool recoloring = false; if (any_effects) { // coloring InstanceToColoring_t::iterator coloring_it = m_instance_colorings.find(instance); const bool coloring = coloring_it != m_instance_colorings.end(); if (coloring) { coloringColor[0] = coloring_it->second.r; coloringColor[1] = coloring_it->second.g; coloringColor[2] = coloring_it->second.b; coloringColor[3] = coloring_it->second.a; recoloring = true; } // outline InstanceToOutlines_t::iterator outline_it = m_instance_outlines.find(instance); const bool outline = outline_it != m_instance_outlines.end(); if (outline) { if (lm != 0) { // first render normal image without stencil and alpha test (0) // so it wont look aliased and then with alpha test render only outline (its 'binary' image) outlineImage = bindOutline(outline_it->second, vc, cam); } else { bindOutline(outline_it->second, vc, cam)->renderZ(vc.dimensions, vertexZ, vc.transparency, static_cast(0)); } } } // overlay if (vc.m_overlay) { renderOverlay(RENDER_DATA_MULTITEXTURE_Z, &vc, coloringColor, recoloring); // no overlay } else { vc.image->renderZ(vc.dimensions, vertexZ, vc.transparency, recoloring ? coloringColor : 0); } if (outlineImage) { outlineImage->renderZ(vc.dimensions, vertexZ, vc.transparency, static_cast(0)); m_renderbackend->changeRenderInfos(RENDER_DATA_TEXCOLOR_Z, 1, 4, 5, false, true, 255, REPLACE, ALWAYS); } } } void InstanceRenderer::renderAlreadySorted(Camera* cam, Layer* layer, RenderList& instances) { const bool any_effects = !(m_instance_outlines.empty() && m_instance_colorings.empty()); const bool unlit = !m_unlit_groups.empty(); uint32_t lm = m_renderbackend->getLightingModel(); m_area_layer = false; if(!m_instance_areas.empty()) { InstanceToAreas_t::iterator area_it = m_instance_areas.begin(); for(;area_it != m_instance_areas.end(); area_it++) { AreaInfo& info = area_it->second; if(info.instance->getLocation().getLayer() == layer) { if(info.front) { DoublePoint3D instance_posv = cam->toVirtualScreenCoordinates(info.instance->getLocation().getMapCoordinates()); info.z = instance_posv.z; } m_area_layer = true; } } } RenderList::iterator instance_it = instances.begin(); for (;instance_it != instances.end(); ++instance_it) { // FL_DBG(_log, "Iterating instances..."); Instance* instance = (*instance_it)->instance; RenderItem& vc = **instance_it; if(m_area_layer) { InstanceToAreas_t::iterator areas_it = m_instance_areas.begin(); for(;areas_it != m_instance_areas.end(); areas_it++) { AreaInfo& infoa = areas_it->second; if(infoa.front) { if(infoa.z >= vc.screenpoint.z) { continue; } } std::string str_name = instance->getObject()->getNamespace(); std::list::iterator group_it = infoa.groups.begin(); for(;group_it != infoa.groups.end(); ++group_it) { if(str_name.find((*group_it)) != std::string::npos) { ScreenPoint p; Rect rec; p = cam->toScreenCoordinates(infoa.instance->getLocation().getMapCoordinates()); rec.x = p.x - infoa.w / 2; rec.y = p.y - infoa.h / 2; rec.w = infoa.w; rec.h = infoa.h; if(infoa.instance != instance && vc.dimensions.intersects(rec)) { vc.transparency = 255 - infoa.trans; // dirty hack to reset the transparency on next pump InstanceVisual* visual = instance->getVisual(); visual->setVisible(!visual->isVisible()); visual->setVisible(!visual->isVisible()); } } } } } // FL_DBG(_log, LMsg("Instance layer coordinates = ") << instance->getLocationRef().getLayerCoordinates()); uint8_t coloringColor[4] = { 0 }; Image* outlineImage = 0; bool recoloring = false; if (any_effects) { // coloring InstanceToColoring_t::iterator coloring_it = m_instance_colorings.find(instance); const bool coloring = coloring_it != m_instance_colorings.end(); if (coloring && !m_need_bind_coloring) { coloringColor[0] = coloring_it->second.r; coloringColor[1] = coloring_it->second.g; coloringColor[2] = coloring_it->second.b; coloringColor[3] = coloring_it->second.a; recoloring = true; } // outline InstanceToOutlines_t::iterator outline_it = m_instance_outlines.find(instance); const bool outline = outline_it != m_instance_outlines.end(); if (outline) { if (lm != 0) { // first render normal image without stencil and alpha test (0) // so it wont look aliased and then with alpha test render only outline (its 'binary' image) outlineImage = bindOutline(outline_it->second, vc, cam); } else { bindOutline(outline_it->second, vc, cam)->render(vc.dimensions, vc.transparency); } } // coloring for SDL if (coloring && m_need_bind_coloring) { bindColoring(coloring_it->second, vc, cam)->render(vc.dimensions, vc.transparency); m_renderbackend->changeRenderInfos(RENDER_DATA_WITHOUT_Z, 1, 4, 5, true, false, 0, KEEP, ALWAYS); continue; } } if(lm != 0) { if(unlit) { bool found = false; std::string lit_name = instance->getObject()->getNamespace(); std::list::iterator unlit_it = m_unlit_groups.begin(); for(;unlit_it != m_unlit_groups.end(); ++unlit_it) { if(lit_name.find(*unlit_it) != std::string::npos) { found = true; break; } } vc.image->render(vc.dimensions, vc.transparency, recoloring ? coloringColor : 0); if (found) { m_renderbackend->changeRenderInfos(RENDER_DATA_WITHOUT_Z, 1, 4, 5, false, true, 255, REPLACE, ALWAYS, recoloring ? OVERLAY_TYPE_COLOR : OVERLAY_TYPE_NONE); } else { m_renderbackend->changeRenderInfos(RENDER_DATA_WITHOUT_Z, 1, 4, 5, true, true, 0, ZERO, ALWAYS, recoloring ? OVERLAY_TYPE_COLOR : OVERLAY_TYPE_NONE); } if (outlineImage) { outlineImage->render(vc.dimensions, vc.transparency); m_renderbackend->changeRenderInfos(RENDER_DATA_WITHOUT_Z, 1, 4, 5, false, true, 255, REPLACE, ALWAYS); } continue; } } // overlay if (vc.m_overlay) { renderOverlay(RENDER_DATA_WITHOUT_Z, &vc, coloringColor, recoloring); // no overlay } else { vc.image->render(vc.dimensions, vc.transparency, recoloring ? coloringColor : 0); } if (outlineImage) { outlineImage->render(vc.dimensions, vc.transparency); m_renderbackend->changeRenderInfos(RENDER_DATA_WITHOUT_Z, 1, 4, 5, false, true, 255, REPLACE, ALWAYS); } } } void InstanceRenderer::renderOverlay(RenderDataType type, RenderItem* item, uint8_t const* coloringColor, bool recoloring) { RenderItem& vc = *item; Instance* instance = vc.instance; bool withZ = type != RENDER_DATA_WITHOUT_Z; float vertexZ = vc.vertexZ; // animation overlay std::vector* animationOverlay = vc.getAnimationOverlay(); // animation color overlay std::vector* animationColorOverlay = vc.getAnimationColorOverlay(); // animation overlay without color overlay if (animationOverlay && !animationColorOverlay) { if (withZ) { for (std::vector::iterator it = animationOverlay->begin(); it != animationOverlay->end(); ++it) { (*it)->renderZ(vc.dimensions, vertexZ, vc.transparency, recoloring ? coloringColor : 0); } } else { for (std::vector::iterator it = animationOverlay->begin(); it != animationOverlay->end(); ++it) { (*it)->render(vc.dimensions, vc.transparency, recoloring ? coloringColor : 0); } } // animation overlay with color overlay } else if (animationOverlay && animationColorOverlay) { std::vector::iterator ovit = animationColorOverlay->begin(); std::vector::iterator it = animationOverlay->begin(); for (; it != animationOverlay->end(); ++it, ++ovit) { OverlayColors* oc = (*ovit); if (!oc) { if (withZ) { (*it)->renderZ(vc.dimensions, vertexZ, vc.transparency, recoloring ? coloringColor : 0); } else { (*it)->render(vc.dimensions, vc.transparency, recoloring ? coloringColor : 0); } } else { if (oc->getColors().size() > 1) { std::map::const_iterator cit = oc->getColors().begin(); uint8_t factor[4] = { 0, 0, 0, cit->second.getAlpha() }; // multi color overlay ImagePtr multiColorOverlay; if (recoloring) { // create temp OverlayColors OverlayColors* temp = new OverlayColors(oc->getColorOverlayImage()); float alphaFactor1 = static_cast(coloringColor[3] / 255.0); const std::map& defaultColors = oc->getColors(); for (std::map::const_iterator c_it = defaultColors.begin(); c_it != defaultColors.end(); ++c_it) { if (c_it->second.getAlpha() == 0) { continue; } float alphaFactor2 = static_cast(c_it->second.getAlpha() / 255.0); Color c(coloringColor[0]*(1.0-alphaFactor1) + (c_it->second.getR()*alphaFactor2)*alphaFactor1, coloringColor[1]*(1.0-alphaFactor1) + (c_it->second.getG()*alphaFactor2)*alphaFactor1, coloringColor[2]*(1.0-alphaFactor1) + (c_it->second.getB()*alphaFactor2)*alphaFactor1, 255); temp->changeColor(c_it->first, c); } // create new factor factor[3] = static_cast(255 - factor[3]); factor[3] = std::min(coloringColor[3], factor[3]); // get overlay image with temp colors multiColorOverlay = getMultiColorOverlay(vc, temp); delete temp; } else { multiColorOverlay = getMultiColorOverlay(vc, oc); factor[3] = 0; } if (withZ) { (*it)->renderZ(vc.dimensions, vertexZ, vc.transparency, recoloring ? coloringColor : 0); (*it)->renderZ(vc.dimensions, vertexZ, multiColorOverlay, vc.transparency, factor); } else { (*it)->render(vc.dimensions, vc.transparency, recoloring ? coloringColor : 0); (*it)->render(vc.dimensions, multiColorOverlay, vc.transparency, factor); } continue; } // single color overlay std::map::const_iterator color_it = oc->getColors().begin(); uint8_t rgba[4] = { color_it->second.getR(), color_it->second.getG(), color_it->second.getB(), static_cast(255-color_it->second.getAlpha()) }; bool noOverlay = rgba[3] == 255; if (recoloring) { if (!noOverlay) { float alphaFactor1 = static_cast(coloringColor[3] / 255.0); float alphaFactor2 = 1.0-static_cast(rgba[3] / 255.0); rgba[0] = coloringColor[0]*(1.0-alphaFactor1) + (rgba[0]*alphaFactor2)*alphaFactor1; rgba[1] = coloringColor[1]*(1.0-alphaFactor1) + (rgba[1]*alphaFactor2)*alphaFactor1; rgba[2] = coloringColor[2]*(1.0-alphaFactor1) + (rgba[2]*alphaFactor2)*alphaFactor1; rgba[3] = std::min(coloringColor[3], rgba[3]); } } if (withZ) { (*it)->renderZ(vc.dimensions, vertexZ, vc.transparency, recoloring ? coloringColor : 0); if (!noOverlay) { (*it)->renderZ(vc.dimensions, vertexZ, oc->getColorOverlayImage(), vc.transparency, rgba); m_renderbackend->changeRenderInfos(type, 1, 4, 5, true, false, 0, KEEP, ALWAYS, OVERLAY_TYPE_COLOR_AND_TEXTURE); } } else { (*it)->render(vc.dimensions, vc.transparency, recoloring ? coloringColor : 0); if (!noOverlay) { (*it)->render(vc.dimensions, oc->getColorOverlayImage(), vc.transparency, rgba); m_renderbackend->changeRenderInfos(type, 1, 4, 5, true, false, 0, KEEP, ALWAYS, OVERLAY_TYPE_COLOR_AND_TEXTURE); } } } } } else { OverlayColors* colorOverlay = vc.getColorOverlay(); if (colorOverlay->getColors().size() > 1) { // multi color overlay ImagePtr multiColorOverlay; // interpolation factor std::map::const_iterator it = colorOverlay->getColors().begin(); uint8_t factor[4] = { 0, 0, 0, it->second.getAlpha() }; if (recoloring) { // create temp OverlayColors OverlayColors* temp = new OverlayColors(colorOverlay->getColorOverlayImage()); float alphaFactor1 = static_cast(coloringColor[3] / 255.0); const std::map& defaultColors = colorOverlay->getColors(); for (std::map::const_iterator c_it = defaultColors.begin(); c_it != defaultColors.end(); ++c_it) { if (c_it->second.getAlpha() == 0) { continue; } float alphaFactor2 = static_cast(c_it->second.getAlpha() / 255.0); Color c(coloringColor[0]*(1.0-alphaFactor1) + (c_it->second.getR()*alphaFactor2)*alphaFactor1, coloringColor[1]*(1.0-alphaFactor1) + (c_it->second.getG()*alphaFactor2)*alphaFactor1, coloringColor[2]*(1.0-alphaFactor1) + (c_it->second.getB()*alphaFactor2)*alphaFactor1, 255); temp->changeColor(c_it->first, c); } // create new factor factor[3] = static_cast(255 - factor[3]); factor[3] = std::min(coloringColor[3], factor[3]); // get overlay image with temp colors multiColorOverlay = getMultiColorOverlay(vc, temp); delete temp; } if (!multiColorOverlay) { multiColorOverlay = getMultiColorOverlay(vc); factor[3] = 0; } if (withZ) { vc.image->renderZ(vc.dimensions, vertexZ, vc.transparency, recoloring ? coloringColor : 0); vc.image->renderZ(vc.dimensions, vertexZ, multiColorOverlay, vc.transparency, factor); } else { vc.image->render(vc.dimensions, vc.transparency, recoloring ? coloringColor : 0); vc.image->render(vc.dimensions, multiColorOverlay, vc.transparency, factor); } } else { // single color overlay std::map::const_iterator color_it = colorOverlay->getColors().begin(); uint8_t rgba[4] = { color_it->second.getR(), color_it->second.getG(), color_it->second.getB(), static_cast(255-color_it->second.getAlpha()) }; bool noOverlay = rgba[3] == 255; if (recoloring) { if (!noOverlay) { float alphaFactor1 = static_cast(coloringColor[3] / 255.0); float alphaFactor2 = 1.0-static_cast(rgba[3] / 255.0); rgba[0] = coloringColor[0]*(1.0-alphaFactor1) + (rgba[0]*alphaFactor2)*alphaFactor1; rgba[1] = coloringColor[1]*(1.0-alphaFactor1) + (rgba[1]*alphaFactor2)*alphaFactor1; rgba[2] = coloringColor[2]*(1.0-alphaFactor1) + (rgba[2]*alphaFactor2)*alphaFactor1; rgba[3] = std::min(coloringColor[3], rgba[3]); } } if (withZ) { vc.image->renderZ(vc.dimensions, vertexZ, vc.transparency, recoloring ? coloringColor : 0); if (!noOverlay) { vc.image->renderZ(vc.dimensions, vertexZ, colorOverlay->getColorOverlayImage(), vc.transparency, rgba); m_renderbackend->changeRenderInfos(type, 1, 4, 5, true, false, 0, KEEP, ALWAYS, OVERLAY_TYPE_COLOR_AND_TEXTURE); } } else { vc.image->render(vc.dimensions, vc.transparency, recoloring ? coloringColor : 0); if (!noOverlay) { vc.image->render(vc.dimensions, colorOverlay->getColorOverlayImage(), vc.transparency, rgba); m_renderbackend->changeRenderInfos(type, 1, 4, 5, true, false, 0, KEEP, ALWAYS, OVERLAY_TYPE_COLOR_AND_TEXTURE); } } } } } inline bool aboveThreshold(int32_t threshold, int32_t alpha, int32_t prev_alpha) { if(threshold > 1) { // new behavior if (((alpha - threshold) >= 0 || (prev_alpha - threshold) >= 0) && (alpha != prev_alpha)) { return true; } else { return false; } } else { // old behavior if((alpha == 0 || prev_alpha == 0) && (alpha != prev_alpha)) { return true; } else { return false; } } } Image* InstanceRenderer::bindOutline(OutlineInfo& info, RenderItem& vc, Camera* cam) { bool valid = isValidImage(info.outline); if (!info.dirty && info.curimg == vc.image.get() && valid) { removeFromCheck(info.outline); // optimization for outline that has not changed return info.outline.get(); } else { info.curimg = vc.image.get(); } // if outline has changed we can maybe free the old effect image if (valid) { addToCheck(info.outline); } // special case for animation overlay if (vc.getAnimationOverlay()) { return bindMultiOutline(info, vc, cam); } // NOTE: Since r3721 outline is just the 'border' so to render everything correctly // we need to first render normal image, and then its outline. // This helps much with lighting stuff and doesn't require from us to copy image. bool found = false; // create name std::stringstream sts; sts << vc.image.get()->getName() << "," << static_cast(info.r) << "," << static_cast(info.g) << "," << static_cast(info.b) << "," << info.width; // search image if (ImageManager::instance()->exists(sts.str())) { info.outline = ImageManager::instance()->getPtr(sts.str()); if (isValidImage(info.outline)) { removeFromCheck(info.outline); // mark outline as not dirty since we found it here info.dirty = false; return info.outline.get(); } found = true; } // With lazy loading we can come upon a situation where we need to generate outline from // uninitialised shared image if(vc.image->isSharedImage()) { vc.image->forceLoadInternal(); } SDL_Surface* outline_surface = SDL_CreateRGBSurface(0, vc.image->getWidth(), vc.image->getHeight(), 32, RMASK, GMASK, BMASK, AMASK); // TODO: optimize... uint8_t r, g, b, a = 0; // vertical sweep for (int32_t x = 0; x < outline_surface->w; x ++) { int32_t prev_a = 0; for (int32_t y = 0; y < outline_surface->h; y ++) { vc.image->getPixelRGBA(x, y, &r, &g, &b, &a); if (aboveThreshold(info.threshold, static_cast(a), prev_a)) { if (a < prev_a) { for (int32_t yy = y; yy < y + info.width; yy++) { Image::putPixel(outline_surface, x, yy, info.r, info.g, info.b); } } else { for (int32_t yy = y - info.width; yy < y; yy++) { Image::putPixel(outline_surface, x, yy, info.r, info.g, info.b); } } } prev_a = a; } } // horizontal sweep for (int32_t y = 0; y < outline_surface->h; y ++) { int32_t prev_a = 0; for (int32_t x = 0; x < outline_surface->w; x ++) { vc.image->getPixelRGBA(x, y, &r, &g, &b, &a); if (aboveThreshold(info.threshold, static_cast(a), prev_a)) { if (a < prev_a) { for (int32_t xx = x; xx < x + info.width; xx++) { Image::putPixel(outline_surface, xx, y, info.r, info.g, info.b); } } else { for (int32_t xx = x - info.width; xx < x; xx++) { Image::putPixel(outline_surface, xx, y, info.r, info.g, info.b); } } } prev_a = a; } } // In case of OpenGL backend, SDLImage needs to be converted Image* img = m_renderbackend->createImage(sts.str(), outline_surface); img->setState(IResource::RES_LOADED); if (found) { // image exists but is not "loaded" removeFromCheck(info.outline); ImagePtr temp(img); info.outline.get()->copySubimage(0, 0, temp); info.outline.get()->setState(IResource::RES_LOADED); } else { // create and add image info.outline = ImageManager::instance()->add(img); } // mark outline as not dirty since we created/recreated it here info.dirty = false; return info.outline.get(); } Image* InstanceRenderer::bindMultiOutline(OutlineInfo& info, RenderItem& vc, Camera* cam) { // NOTE: Since r3721 outline is just the 'border' so to render everything correctly // we need to first render normal image, and then its outline. // This helps much with lighting stuff and doesn't require from us to copy image. bool found = false; // create name std::stringstream sts; uint32_t mw = 0; uint32_t mh = 0; std::vector* animationOverlays = vc.getAnimationOverlay(); std::vector::iterator it = animationOverlays->begin(); for (; it != animationOverlays->end(); ++it) { // With lazy loading we can come upon a situation where we need to generate outline from // uninitialised shared image if ((*it)->isSharedImage()) { (*it)->forceLoadInternal(); } sts << (*it)->getName() << ","; mw = std::max(mw, (*it)->getWidth()); mh = std::max(mh, (*it)->getHeight()); } sts << static_cast(info.r) << "," << static_cast(info.g) << "," << static_cast(info.b) << "," << info.width; // search image if (ImageManager::instance()->exists(sts.str())) { info.outline = ImageManager::instance()->getPtr(sts.str()); if (isValidImage(info.outline)) { removeFromCheck(info.outline); // mark outline as not dirty since we found it here info.dirty = false; return info.outline.get(); } found = true; } SDL_Surface* outline_surface = SDL_CreateRGBSurface(0, mw, mh, 32, RMASK, GMASK, BMASK, AMASK); // TODO: optimize... uint8_t r, g, b, a = 0; it = animationOverlays->begin(); for (; it != animationOverlays->end(); ++it) { // vertical sweep for (uint32_t x = 0; x < (*it)->getWidth(); x++) { int32_t prev_a = 0; for (uint32_t y = 0; y < (*it)->getHeight(); y++) { (*it)->getPixelRGBA(x, y, &r, &g, &b, &a); if (aboveThreshold(info.threshold, static_cast(a), prev_a)) { if (a < prev_a) { for (uint32_t yy = y; yy < y + info.width; yy++) { int32_t tx = x + (mw/2 - (*it)->getWidth()/2); int32_t ty = yy + (mh/2 - (*it)->getHeight()/2); Image::putPixel(outline_surface, tx, ty, info.r, info.g, info.b); } } else { for (uint32_t yy = y - info.width; yy < y; yy++) { int32_t tx = x + (mw/2 - (*it)->getWidth()/2); int32_t ty = yy + (mh/2 - (*it)->getHeight()/2); Image::putPixel(outline_surface, tx, ty, info.r, info.g, info.b); } } } prev_a = a; } } // horizontal sweep for (uint32_t y = 0; y < (*it)->getHeight(); y++) { int32_t prev_a = 0; for (uint32_t x = 0; x < (*it)->getWidth(); x++) { (*it)->getPixelRGBA(x, y, &r, &g, &b, &a); if (aboveThreshold(info.threshold, static_cast(a), prev_a)) { if (a < prev_a) { for (uint32_t xx = x; xx < x + info.width; xx++) { int32_t tx = xx + (mw/2 - (*it)->getWidth()/2); int32_t ty = y + (mh/2 - (*it)->getHeight()/2); Image::putPixel(outline_surface, tx, ty, info.r, info.g, info.b); } } else { for (uint32_t xx = x - info.width; xx < x; xx++) { int32_t tx = xx + (mw/2 - (*it)->getWidth()/2); int32_t ty = y + (mh/2 - (*it)->getHeight()/2); Image::putPixel(outline_surface, tx, ty, info.r, info.g, info.b); } } } prev_a = a; } } } // In case of OpenGL backend, SDLImage needs to be converted Image* img = m_renderbackend->createImage(sts.str(), outline_surface); img->setState(IResource::RES_LOADED); if (found) { // image exists but is not "loaded" removeFromCheck(info.outline); ImagePtr temp(img); info.outline.get()->copySubimage(0, 0, temp); info.outline.get()->setState(IResource::RES_LOADED); } else { // create and add image info.outline = ImageManager::instance()->add(img); } // mark outline as not dirty since we created/recreated it here info.dirty = false; return info.outline.get(); } Image* InstanceRenderer::bindColoring(ColoringInfo& info, RenderItem& vc, Camera* cam) { bool valid = isValidImage(info.overlay); if (!info.dirty && info.curimg == vc.image.get() && valid) { removeFromCheck(info.overlay); // optimization for coloring that has not changed return info.overlay.get(); } else { info.curimg = vc.image.get(); } // if coloring has changed we can maybe free the old effect image if (valid) { addToCheck(info.overlay); } bool found = false; // create name std::stringstream sts; sts << vc.image.get()->getName() << "," << static_cast(info.r) << "," << static_cast(info.g) << "," << static_cast(info.b) << "," << static_cast(info.a); // search image if (ImageManager::instance()->exists(sts.str())) { info.overlay = ImageManager::instance()->getPtr(sts.str()); valid = isValidImage(info.overlay); if (valid) { removeFromCheck(info.overlay); // mark overlay as not dirty since we found it here info.dirty = false; return info.overlay.get(); } found = true; } // With lazy loading we can come upon a situation where we need to generate coloring from // uninitialised shared image if(vc.image->isSharedImage()) { vc.image->forceLoadInternal(); } // not found so we create it SDL_Surface* overlay_surface = SDL_CreateRGBSurface(0, vc.image->getWidth(), vc.image->getHeight(), 32, RMASK, GMASK, BMASK, AMASK); uint8_t r, g, b, a = 0; float alphaFactor = static_cast(info.a/255.0); for (int32_t x = 0; x < overlay_surface->w; x ++) { for (int32_t y = 0; y < overlay_surface->h; y ++) { vc.image->getPixelRGBA(x, y, &r, &g, &b, &a); if (a > 0) { Image::putPixel(overlay_surface, x, y, info.r*(1.0-alphaFactor) + r*alphaFactor, info.g*(1.0-alphaFactor) + g*alphaFactor, info.b*(1.0-alphaFactor) + b*alphaFactor, a); } } } // In case of OpenGL backend, SDLImage needs to be converted Image* img = m_renderbackend->createImage(sts.str(), overlay_surface); if (found) { // image exists but is not "loaded" removeFromCheck(info.overlay); ImagePtr temp(img); info.overlay.get()->copySubimage(0, 0, temp); info.overlay.get()->setState(IResource::RES_LOADED); } else { // add image img->setState(IResource::RES_LOADED); info.overlay = ImageManager::instance()->add(img); } // mark overlay as not dirty since we created/recreated it here info.dirty = false; return info.overlay.get(); } ImagePtr InstanceRenderer::getMultiColorOverlay(const RenderItem& vc, OverlayColors* colors) { // multi color overlay const std::map& colorMap = colors ? colors->getColors() : vc.getColorOverlay()->getColors(); std::map::const_iterator it = colorMap.begin(); ImagePtr colorOverlayImage = colors ? colors->getColorOverlayImage() : vc.getColorOverlay()->getColorOverlayImage(); ImagePtr colorOverlay; // create name std::stringstream sts; sts << colorOverlayImage.get()->getName(); for (; it != colorMap.end(); ++it) { sts << "," << static_cast(it->second.getR() | (it->second.getG() << 8) | (it->second.getB() << 16) | (it->second.getAlpha()<<24)); } bool exist = false; bool found = false; if (ImageManager::instance()->exists(sts.str())) { exist = true; colorOverlay = ImageManager::instance()->getPtr(sts.str()); if (isValidImage(colorOverlay)) { removeFromCheck(colorOverlay); found = true; } } if (!exist || !found) { // With lazy loading we can come upon a situation where we need to generate color overlay from // uninitialised shared image if (colorOverlayImage->isSharedImage()) { colorOverlayImage->forceLoadInternal(); } // not found so we create it SDL_Surface* overlay_surface = SDL_CreateRGBSurface(0, colorOverlayImage->getWidth(), colorOverlayImage->getHeight(), 32, RMASK, GMASK, BMASK, AMASK); uint8_t r, g, b, a = 0; for (int32_t x = 0; x < overlay_surface->w; x++) { for (int32_t y = 0; y < overlay_surface->h; y++) { colorOverlayImage->getPixelRGBA(x, y, &r, &g, &b, &a); Color c(r, g, b, a); it = colorMap.find(c); if (it != colorMap.end()) { Image::putPixel(overlay_surface, x, y, it->second.getR(), it->second.getG(), it->second.getB(), it->second.getAlpha()); } else { Image::putPixel(overlay_surface, x, y, r, g, b, a); } } } // In case of OpenGL backend, SDLImage needs to be converted Image* img = m_renderbackend->createImage(sts.str(), overlay_surface); if (exist) { // image exists but is not "loaded" removeFromCheck(colorOverlay); ImagePtr temp(img); colorOverlay.get()->setSurface(img->detachSurface()); colorOverlay.get()->setState(IResource::RES_LOADED); } else { // add image img->setState(IResource::RES_LOADED); colorOverlay = ImageManager::instance()->add(img); } } addToCheck(colorOverlay); return colorOverlay; } void InstanceRenderer::addOutlined(Instance* instance, int32_t r, int32_t g, int32_t b, int32_t width, int32_t threshold) { OutlineInfo newinfo(this); newinfo.r = r; newinfo.g = g; newinfo.b = b; newinfo.threshold = threshold; newinfo.width = width; newinfo.dirty = true; // attempts to insert the element into the outline map // will return false in the second value of the pair if the instance already exists // in the map and the first value of the pair will then be an iterator to the // existing data for the instance std::pair insertiter = m_instance_outlines.insert(std::make_pair(instance, newinfo)); if (insertiter.second == false) { // the insertion did not happen because the instance // already exists in the map so lets just update its outline info OutlineInfo& info = insertiter.first->second; if (info.r != r || info.g != g || info.b != b || info.width != width) { // only update the outline info if its changed since the last call // flag the outline info as dirty so it will get processed during rendering info.r = r; info.b = b; info.g = g; info.width = width; info.threshold = threshold; info.dirty = true; } } else { std::pair iter = m_assigned_instances.insert(std::make_pair(instance, OUTLINE)); if (iter.second) { instance->addDeleteListener(m_delete_listener); } else { Effect& effect = iter.first->second; if ((effect & OUTLINE) != OUTLINE) { effect += OUTLINE; } } } } void InstanceRenderer::addColored(Instance* instance, int32_t r, int32_t g, int32_t b, int32_t a) { ColoringInfo newinfo(this); newinfo.r = r; newinfo.g = g; newinfo.b = b; newinfo.a = a; newinfo.dirty = true; // attempts to insert the element into the coloring map // will return false in the second value of the pair if the instance already exists // in the map and the first value of the pair will then be an iterator to the // existing data for the instance std::pair insertiter = m_instance_colorings.insert(std::make_pair(instance, newinfo)); if (insertiter.second == false) { // the insertion did not happen because the instance // already exists in the map so lets just update its coloring info ColoringInfo& info = insertiter.first->second; if (info.r != r || info.g != g || info.b != b || info.a != a) { // only update the coloring info if its changed since the last call info.r = r; info.b = b; info.g = g; info.a = a; info.dirty = true; } } else { std::pair iter = m_assigned_instances.insert(std::make_pair(instance, COLOR)); if (iter.second) { instance->addDeleteListener(m_delete_listener); } else { Effect& effect = iter.first->second; if ((effect & COLOR) != COLOR) { effect += COLOR; } } } } void InstanceRenderer::addTransparentArea(Instance* instance, const std::list &groups, uint32_t w, uint32_t h, uint8_t trans, bool front) { AreaInfo newinfo; newinfo.instance = instance; newinfo.groups = groups; newinfo.w = w; newinfo.h = h; newinfo.trans = trans; newinfo.front = front; // attempts to insert the element into the area map // will return false in the second value of the pair if the instance already exists // in the map and the first value of the pair will then be an iterator to the // existing data for the instance std::pair insertiter = m_instance_areas.insert(std::make_pair(instance, newinfo)); if (insertiter.second == false) { // the insertion did not happen because the instance // already exists in the map so lets just update its area info AreaInfo& info = insertiter.first->second; info.groups = groups; info.w = w; info.h = h; info.trans = trans; info.front = front; } else { std::pair iter = m_assigned_instances.insert(std::make_pair(instance, AREA)); if (iter.second) { instance->addDeleteListener(m_delete_listener); } else { Effect& effect = iter.first->second; if ((effect & AREA) != AREA) { effect += AREA; } } } } void InstanceRenderer::removeOutlined(Instance* instance) { InstanceToEffects_t::iterator it = m_assigned_instances.find(instance); if (it != m_assigned_instances.end()) { if (it->second == OUTLINE) { instance->removeDeleteListener(m_delete_listener); m_instance_outlines.erase(instance); m_assigned_instances.erase(it); } else if ((it->second & OUTLINE) == OUTLINE) { it->second -= OUTLINE; m_instance_outlines.erase(instance); } } } void InstanceRenderer::removeColored(Instance* instance) { InstanceToEffects_t::iterator it = m_assigned_instances.find(instance); if (it != m_assigned_instances.end()) { if (it->second == COLOR) { instance->removeDeleteListener(m_delete_listener); m_instance_colorings.erase(instance); m_assigned_instances.erase(it); } else if ((it->second & COLOR) == COLOR) { it->second -= COLOR; m_instance_colorings.erase(instance); } } } void InstanceRenderer::removeTransparentArea(Instance* instance) { InstanceToEffects_t::iterator it = m_assigned_instances.find(instance); if (it != m_assigned_instances.end()) { if (it->second == AREA) { instance->removeDeleteListener(m_delete_listener); m_instance_areas.erase(instance); m_assigned_instances.erase(it); } else if ((it->second & AREA) == AREA) { it->second -= AREA; m_instance_areas.erase(instance); } } } void InstanceRenderer::removeAllOutlines() { if (!m_instance_outlines.empty()) { InstanceToOutlines_t::iterator outline_it = m_instance_outlines.begin(); for (; outline_it != m_instance_outlines.end(); ++outline_it) { InstanceToEffects_t::iterator it = m_assigned_instances.find((*outline_it).first); if (it != m_assigned_instances.end()) { if (it->second == OUTLINE) { (*outline_it).first->removeDeleteListener(m_delete_listener); m_assigned_instances.erase(it); } else if ((it->second & OUTLINE) == OUTLINE) { it->second -= OUTLINE; } } } m_instance_outlines.clear(); } } void InstanceRenderer::removeAllColored() { if (!m_instance_colorings.empty()) { InstanceToColoring_t::iterator color_it = m_instance_colorings.begin(); for (; color_it != m_instance_colorings.end(); ++color_it) { InstanceToEffects_t::iterator it = m_assigned_instances.find((*color_it).first); if (it != m_assigned_instances.end()) { if (it->second == COLOR) { (*color_it).first->removeDeleteListener(m_delete_listener); m_assigned_instances.erase(it); } else if ((it->second & COLOR) == COLOR) { it->second -= COLOR; } } } m_instance_colorings.clear(); } } void InstanceRenderer::removeAllTransparentAreas() { if (!m_instance_areas.empty()) { InstanceToAreas_t::iterator area_it = m_instance_areas.begin(); for (; area_it != m_instance_areas.end(); ++area_it) { InstanceToEffects_t::iterator it = m_assigned_instances.find((*area_it).first); if (it != m_assigned_instances.end()) { if (it->second == AREA) { (*area_it).first->removeDeleteListener(m_delete_listener); m_assigned_instances.erase(it); } else if ((it->second & AREA) == AREA) { it->second -= AREA; } } } m_instance_areas.clear(); } } void InstanceRenderer::addIgnoreLight(const std::list &groups) { std::list::const_iterator group_it = groups.begin(); for(;group_it != groups.end(); ++group_it) { m_unlit_groups.push_back(*group_it); } m_unlit_groups.sort(); m_unlit_groups.unique(); } void InstanceRenderer::removeIgnoreLight(const std::list &groups) { std::list::const_iterator group_it = groups.begin(); for(;group_it != groups.end(); ++group_it) { std::list::iterator unlit_it = m_unlit_groups.begin(); for(;unlit_it != m_unlit_groups.end(); ++unlit_it) { if((*group_it).find(*unlit_it) != std::string::npos) { m_unlit_groups.remove(*unlit_it); break; } } } } void InstanceRenderer::removeAllIgnoreLight() { m_unlit_groups.clear(); } void InstanceRenderer::reset() { // stop timer if (m_timer_enabled) { m_timer.stop(); } // remove all effects and listener removeAllOutlines(); removeAllColored(); removeAllTransparentAreas(); removeAllIgnoreLight(); // removes the references to the effect images m_check_images.clear(); } void InstanceRenderer::setRemoveInterval(uint32_t interval) { if (m_interval != interval*1000) { m_interval = interval*1000; m_timer.setInterval(m_interval); } } uint32_t InstanceRenderer::getRemoveInterval() const { return m_interval/1000; } void InstanceRenderer::addToCheck(const ImagePtr& image) { if (isValidImage(image)) { // if image is already inserted then return ImagesToCheck_t::iterator it = m_check_images.begin(); for (; it != m_check_images.end(); ++it) { if (it->image.get()->getName() == image.get()->getName()) { return; } } s_image_entry entry; entry.image = image; entry.timestamp = TimeManager::instance()->getTime(); m_check_images.push_front(entry); if (!m_timer_enabled) { m_timer_enabled = true; m_timer.start(); } } } void InstanceRenderer::check() { uint32_t now = TimeManager::instance()->getTime(); ImagesToCheck_t::iterator it = m_check_images.begin(); // free unused images while (it != m_check_images.end()) { if (now - it->timestamp > m_interval) { if (isValidImage(it->image)) { ImageManager::instance()->free(it->image.get()->getName()); } it = m_check_images.erase(it); } else { ++it; } } if (m_check_images.empty() && m_timer_enabled) { m_timer_enabled = false; m_timer.stop(); } } void InstanceRenderer::removeFromCheck(const ImagePtr& image) { if (isValidImage(image)) { // if the image is used then remove it here ImagesToCheck_t::iterator it = m_check_images.begin(); for (; it != m_check_images.end(); ++it) { if (it->image.get()->getName() == image.get()->getName()) { m_check_images.erase(it); break; } } if (m_check_images.empty() && m_timer_enabled) { m_timer_enabled = false; m_timer.stop(); } } } void InstanceRenderer::removeInstance(Instance* instance) { InstanceToEffects_t::iterator it = m_assigned_instances.find(instance); if (it != m_assigned_instances.end()) { m_instance_outlines.erase(instance); m_instance_colorings.erase(instance); m_instance_areas.erase(instance); instance->removeDeleteListener(m_delete_listener); m_assigned_instances.erase(it); } } bool InstanceRenderer::isValidImage(const ImagePtr& image) { if (image.get()) { if (image.get()->getState() == IResource::RES_LOADED) { return true; } } return false; } } fifengine-0.4.2/engine/core/view/renderers/instancerenderer.h000066400000000000000000000170231341615052600243210ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_INSTANCERENDERER_H #define FIFE_INSTANCERENDERER_H // Standard C++ library includes #include #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "view/rendererbase.h" #include "util/time/timer.h" namespace FIFE { class Location; class RenderBackend; class InstanceDeleteListener; class InstanceRenderer: public RendererBase { public: /** constructor. * @param renderbackend to use * @param position position for this renderer in rendering pipeline */ InstanceRenderer(RenderBackend* renderbackend, int32_t position); InstanceRenderer(const InstanceRenderer& old); RendererBase* clone(); /** Destructor. */ virtual ~InstanceRenderer(); void render(Camera* cam, Layer* layer, RenderList& instances); std::string getName() { return "InstanceRenderer"; } /** Marks given instance to be outlined with given parameters */ void addOutlined(Instance* instance, int32_t r, int32_t g, int32_t b, int32_t width, int32_t threshold = 1); /** Marks given instance to be colored with given parameters */ void addColored(Instance* instance, int32_t r, int32_t g, int32_t b, int32_t a = 128); /** Marks given instance to have a transparent area with given parameters */ void addTransparentArea(Instance* instance, const std::list &groups, uint32_t w, uint32_t h, uint8_t trans, bool front = true); /** Removes instance from outlining list */ void removeOutlined(Instance* instance); /** Removes instance from coloring list */ void removeColored(Instance* instance); /** Removes instance form area list */ void removeTransparentArea(Instance* instance); /** Removes all outlines */ void removeAllOutlines(); /** Removes all coloring */ void removeAllColored(); /** Removes all transparent areas */ void removeAllTransparentAreas(); /** Add groups(Namespaces) into a list. All instances, whose namespace is in the list * will not lighted from the LightRenderer. */ void addIgnoreLight(const std::list &groups); /** Removes groups(Namespaces) from the list */ void removeIgnoreLight(const std::list &groups); /** Removes all groups(Namespaces) */ void removeAllIgnoreLight(); /** Gets instance for interface access */ static InstanceRenderer* getInstance(IRendererContainer* cnt); /** Provides access point to the RenderBackend */ RenderBackend* getRenderBackend() const {return m_renderbackend;} /** Removes all stuff */ void reset(); /** Sets the interval in seconds (default is 60). */ void setRemoveInterval(uint32_t interval); /** Gets the interval in seconds (default is 60). */ uint32_t getRemoveInterval() const; /** Add properly old ImagePtr into a check list. * If it is still not used after a time(interval) then it is freed. */ void addToCheck(const ImagePtr& image); /** Timer callback, tried to remove old effect images */ void check(); /** Removes instance from all effects. * Should only be called by delete listener! */ void removeInstance(Instance* instance); /** Returns true if coloring need binding, otherwise false */ bool needColorBinding() { return m_need_bind_coloring; } private: bool m_area_layer; uint32_t m_interval; bool m_timer_enabled; std::list m_unlit_groups; bool m_need_sorting; bool m_need_bind_coloring; enum InstanceRendererEffect { NOTHING = 0x00, OUTLINE = 0x01, COLOR = 0x02, AREA = 0x04 }; typedef uint8_t Effect; // contains per-instance information for outline drawing class OutlineInfo { public: uint8_t r; uint8_t g; uint8_t b; int32_t width; int32_t threshold; bool dirty; ImagePtr outline; Image* curimg; InstanceRenderer* renderer; OutlineInfo(InstanceRenderer* r); ~OutlineInfo(); }; // contains per-instance information for overlay drawing class ColoringInfo { public: uint8_t r; uint8_t g; uint8_t b; uint8_t a; bool dirty; ImagePtr overlay; Image* curimg; InstanceRenderer* renderer; ColoringInfo(InstanceRenderer* r); ~ColoringInfo(); }; class AreaInfo { public: Instance* instance; std::list groups; uint32_t w; uint32_t h; uint8_t trans; bool front; double z; AreaInfo(); ~AreaInfo(); }; typedef std::map InstanceToOutlines_t; typedef std::map InstanceToColoring_t; typedef std::map InstanceToAreas_t; InstanceToOutlines_t m_instance_outlines; InstanceToColoring_t m_instance_colorings; InstanceToAreas_t m_instance_areas; // struct to hold the ImagePtr with a timestamp typedef struct { ImagePtr image; uint32_t timestamp; } s_image_entry; typedef std::list ImagesToCheck_t; // old effect images ImagesToCheck_t m_check_images; // timer Timer m_timer; // InstanceDeleteListener to automatically remove Instance effect (outline, coloring, ...) InstanceDeleteListener* m_delete_listener; typedef std::map InstanceToEffects_t; InstanceToEffects_t m_assigned_instances; void renderOverlay(RenderDataType type, RenderItem* item, uint8_t const* coloringColor, bool recoloring); /** Binds new outline (if needed) to the instance's OutlineInfo */ Image* bindOutline(OutlineInfo& info, RenderItem& vc, Camera* cam); Image* bindMultiOutline(OutlineInfo& info, RenderItem& vc, Camera* cam); Image* bindColoring(ColoringInfo& info, RenderItem& vc, Camera* cam); ImagePtr getMultiColorOverlay(const RenderItem& vc, OverlayColors* colors = 0); void renderUnsorted(Camera* cam, Layer* layer, RenderList& instances); void renderAlreadySorted(Camera* cam, Layer* layer, RenderList& instances); void removeFromCheck(const ImagePtr& image); bool isValidImage(const ImagePtr& image); }; } #endif fifengine-0.4.2/engine/core/view/renderers/instancerenderer.i000066400000000000000000000052551341615052600243260ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fife %{ #include "view/renderers/instancerenderer.h" %} namespace FIFE { class Location; class RenderBackend; class InstanceRenderer: public RendererBase { public: virtual ~InstanceRenderer(); std::string getName(); void addOutlined(Instance* instance, int32_t r, int32_t g, int32_t b, int32_t width, int32_t threshold = 1); void removeOutlined(Instance* instance); void removeAllOutlines(); void addColored(Instance* instance, int32_t r, int32_t g, int32_t b, int32_t a = 128); void removeColored(Instance* instance); void removeAllColored(); void addTransparentArea(Instance* instance, const std::list &groups, uint32_t w, uint32_t h, uint8_t trans, bool front = true); void removeTransparentArea(Instance* instance); void removeAllTransparentAreas(); void addIgnoreLight(const std::list &groups); void removeIgnoreLight(const std::list &groups); void removeAllIgnoreLight(); static InstanceRenderer* getInstance(IRendererContainer* cnt); void setRemoveInterval(uint32_t interval); uint32_t getRemoveInterval() const; private: InstanceRenderer(RenderBackend* renderbackend, int32_t position); }; } fifengine-0.4.2/engine/core/view/renderers/lightrenderer.cpp000066400000000000000000000311641341615052600241610ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "video/renderbackend.h" #include "video/animation.h" #include "video/fonts/ifont.h" #include "video/imagemanager.h" #include "video/image.h" #include "video/opengl/glimage.h" #include "video/opengl/renderbackendopengl.h" #include "util/math/fife_math.h" #include "util/log/logger.h" #include "util/time/timemanager.h" #include "model/metamodel/grids/cellgrid.h" #include "model/metamodel/timeprovider.h" #include "model/structures/instance.h" #include "model/structures/layer.h" #include "model/structures/location.h" #include "view/camera.h" #include "lightrenderer.h" namespace FIFE { /** Logger to use for this source file. * @relates Logger */ static Logger _log(LM_VIEWVIEW); LightRendererElementInfo::LightRendererElementInfo(RendererNode n, int32_t src, int32_t dst): m_anchor(n), m_src(src), m_dst(dst), m_stencil(false), m_stencil_ref(0) { } void LightRendererElementInfo::setStencil(uint8_t stencil_ref) { m_stencil = true; m_stencil_ref = stencil_ref; } int32_t LightRendererElementInfo::getStencil() { if(!m_stencil) { return -1; } return m_stencil_ref; } void LightRendererElementInfo::removeStencil() { m_stencil = false; m_stencil_ref = 0; } LightRendererImageInfo::LightRendererImageInfo(RendererNode anchor, ImagePtr image, int32_t src, int32_t dst): LightRendererElementInfo(anchor, src, dst), m_image(image){ } void LightRendererImageInfo::render(Camera* cam, Layer* layer, RenderList& instances, RenderBackend* renderbackend) { Point p = m_anchor.getCalculatedPoint(cam, layer, true); if(m_anchor.getLayer() == layer) { Rect r; Rect viewport = cam->getViewPort(); uint32_t width = static_cast(round(m_image->getWidth() * cam->getZoom())); uint32_t height = static_cast(round(m_image->getHeight() * cam->getZoom())); r.x = p.x-width/2; r.y = p.y-height/2; r.w = width; r.h = height; if(r.intersects(viewport)) { uint8_t lm = renderbackend->getLightingModel(); m_image->render(r); if (m_stencil) { renderbackend->changeRenderInfos(RENDER_DATA_WITHOUT_Z, 1, m_src, m_dst, false, true, m_stencil_ref, INCR, GEQUAL); } else if (lm == 1) { renderbackend->changeRenderInfos(RENDER_DATA_WITHOUT_Z, 1, m_src, m_dst, false, true, 255, KEEP, NOTEQUAL); } } } } LightRendererAnimationInfo::LightRendererAnimationInfo(RendererNode anchor, AnimationPtr animation, int32_t src, int32_t dst): LightRendererElementInfo(anchor, src, dst), m_animation(animation), m_start_time(TimeManager::instance()->getTime()), m_time_scale(1.0){ } void LightRendererAnimationInfo::render(Camera* cam, Layer* layer, RenderList& instances, RenderBackend* renderbackend) { Point p = m_anchor.getCalculatedPoint(cam, layer, true); if(m_anchor.getLayer() == layer) { int32_t animtime = scaleTime(m_time_scale, TimeManager::instance()->getTime() - m_start_time) % m_animation->getDuration(); ImagePtr img = m_animation->getFrameByTimestamp(animtime); Rect r; Rect viewport = cam->getViewPort(); uint32_t width = static_cast(round(img->getWidth() * cam->getZoom())); uint32_t height = static_cast(round(img->getHeight() * cam->getZoom())); r.x = p.x-width/2; r.y = p.y-height/2; r.w = width; r.h = height; if(r.intersects(viewport)) { uint8_t lm = renderbackend->getLightingModel(); img->render(r); if (m_stencil) { renderbackend->changeRenderInfos(RENDER_DATA_WITHOUT_Z, 1, m_src, m_dst, false, true, m_stencil_ref, INCR, GEQUAL); } else if (lm == 1) { renderbackend->changeRenderInfos(RENDER_DATA_WITHOUT_Z, 1, m_src, m_dst, false, true, 255, KEEP, NOTEQUAL); } } } } LightRendererResizeInfo::LightRendererResizeInfo(RendererNode anchor, ImagePtr image, int32_t width, int32_t height, int32_t src, int32_t dst): LightRendererElementInfo(anchor, src, dst), m_image(image), m_width(width), m_height(height) { } void LightRendererResizeInfo::render(Camera* cam, Layer* layer, RenderList& instances, RenderBackend* renderbackend) { Point p = m_anchor.getCalculatedPoint(cam, layer, true); if(m_anchor.getLayer() == layer) { Rect r; Rect viewport = cam->getViewPort(); uint32_t width = static_cast(round(m_width * cam->getZoom())); uint32_t height = static_cast(round(m_height * cam->getZoom())); r.x = p.x-width/2; r.y = p.y-height/2; r.w = width; r.h = height; if(r.intersects(viewport)) { uint8_t lm = renderbackend->getLightingModel(); m_image->render(r); if (m_stencil) { renderbackend->changeRenderInfos(RENDER_DATA_WITHOUT_Z, 1, m_src, m_dst, false, true, m_stencil_ref, INCR, GEQUAL); } else if (lm == 1) { renderbackend->changeRenderInfos(RENDER_DATA_WITHOUT_Z, 1, m_src, m_dst, false, true, 255, KEEP, NOTEQUAL); } } } } LightRendererSimpleLightInfo::LightRendererSimpleLightInfo(RendererNode anchor, uint8_t intensity, float radius, int32_t subdivisions, float xstretch, float ystretch, uint8_t r, uint8_t g, uint8_t b, int32_t src, int32_t dst): LightRendererElementInfo(anchor, src, dst), m_intensity(intensity), m_radius(radius), m_subdivisions(subdivisions), m_xstretch(xstretch), m_ystretch(ystretch), m_red(r), m_green(g), m_blue(b){ } void LightRendererSimpleLightInfo::render(Camera* cam, Layer* layer, RenderList& instances, RenderBackend* renderbackend) { Point p = m_anchor.getCalculatedPoint(cam, layer, true); if(m_anchor.getLayer() == layer) { double zoom = cam->getZoom(); uint8_t lm = renderbackend->getLightingModel(); renderbackend->drawLightPrimitive(p, m_intensity, m_radius, m_subdivisions, static_cast(m_xstretch * zoom), static_cast(m_ystretch * zoom), m_red, m_green, m_blue); if (m_stencil) { renderbackend->changeRenderInfos(RENDER_DATA_WITHOUT_Z, 1, m_src, m_dst, false, true, m_stencil_ref, INCR, GEQUAL); } else if (lm == 1) { renderbackend->changeRenderInfos(RENDER_DATA_WITHOUT_Z, 1, m_src, m_dst, false, true, 255, KEEP, NOTEQUAL); } } } std::vector LightRendererSimpleLightInfo::getColor() { std::vector colors; colors.push_back(m_red); colors.push_back(m_green); colors.push_back(m_blue); colors.push_back(m_intensity); return colors; } LightRenderer* LightRenderer::getInstance(IRendererContainer* cnt) { return dynamic_cast(cnt->getRenderer("LightRenderer")); } LightRenderer::LightRenderer(RenderBackend* renderbackend, int32_t position): RendererBase(renderbackend, position), m_groups() { setEnabled(false); } LightRenderer::LightRenderer(const LightRenderer& old): RendererBase(old), m_groups() { setEnabled(false); } RendererBase* LightRenderer::clone() { return new LightRenderer(*this); } LightRenderer::~LightRenderer() { } // Add a static lightmap void LightRenderer::addImage(const std::string &group, RendererNode n, ImagePtr image, int32_t src, int32_t dst) { LightRendererElementInfo* info = new LightRendererImageInfo(n, image, src, dst); m_groups[group].push_back(info); } // Add a animation lightmap void LightRenderer::addAnimation(const std::string &group, RendererNode n, AnimationPtr animation, int32_t src, int32_t dst) { LightRendererElementInfo* info = new LightRendererAnimationInfo(n, animation, src, dst); m_groups[group].push_back(info); } // Add a simple light void LightRenderer::addSimpleLight(const std::string &group, RendererNode n, uint8_t intensity, float radius, int32_t subdivisions, float xstretch, float ystretch, uint8_t r, uint8_t g, uint8_t b, int32_t src, int32_t dst) { LightRendererElementInfo* info = new LightRendererSimpleLightInfo(n, intensity, radius, subdivisions, xstretch, ystretch, r, g, b, src, dst); m_groups[group].push_back(info); } // Resize an Image void LightRenderer::resizeImage(const std::string &group, RendererNode n, ImagePtr image, int32_t width, int32_t height, int32_t src, int32_t dst) { LightRendererElementInfo* info = new LightRendererResizeInfo(n, image, width, height, src, dst); m_groups[group].push_back(info); } // Enable stencil test for the group void LightRenderer::addStencilTest(const std::string &group, uint8_t stencil_ref) { std::vector::const_iterator info_it = m_groups[group].begin(); for (;info_it != m_groups[group].end(); ++info_it) { (*info_it)->setStencil(stencil_ref); } } // Disable stencil test for the group void LightRenderer::removeStencilTest(const std::string &group) { std::vector::const_iterator info_it = m_groups[group].begin(); for (;info_it != m_groups[group].end(); ++info_it) { (*info_it)->removeStencil(); } } // Return a list of all groups std::list LightRenderer::getGroups() { std::list groups; std::map >::iterator group_it = m_groups.begin(); for(; group_it != m_groups.end(); ++group_it) { groups.push_back(group_it->first); } groups.sort(); groups.unique(); return groups; } // Return a vector of all LightElementInfos std::vector LightRenderer::getLightInfo(const std::string &group) { std::vector info; std::vector::const_iterator info_it = m_groups[group].begin(); for (;info_it != m_groups[group].end(); ++info_it) { info.push_back(*info_it); } return info; } // Remove the group void LightRenderer::removeAll(const std::string &group) { std::vector::const_iterator info_it = m_groups[group].begin(); for (;info_it != m_groups[group].end(); ++info_it) { delete *info_it; } m_groups[group].clear(); m_groups.erase(group); } // Remove all groups void LightRenderer::removeAll() { std::map >::iterator it = m_groups.begin(); for (; it != m_groups.end(); ++it) { std::vector::const_iterator info_it = it->second.begin(); for (;info_it != it->second.end(); ++info_it) { delete *info_it; } } m_groups.clear(); } // Clear all groups void LightRenderer::reset() { removeAll(); } // Render void LightRenderer::render(Camera* cam, Layer* layer, RenderList& instances) { uint8_t lm = m_renderbackend->getLightingModel(); if (!layer->areInstancesVisible()) { return; } std::map >::iterator group_it = m_groups.begin(); for (; group_it != m_groups.end(); ++group_it) { std::vector::const_iterator info_it = group_it->second.begin(); for (;info_it != group_it->second.end(); ++info_it) { if (lm != 0) { if ((*info_it)->getStencil() != -1 && (*info_it)->getStencil() < 255) { if(info_it != group_it->second.begin()) { (*info_it)->setStencil((*info_it)->getStencil()+1); } } } (*info_it)->render(cam, layer, instances, m_renderbackend); } } } } fifengine-0.4.2/engine/core/view/renderers/lightrenderer.h000066400000000000000000000154041341615052600236250ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_LIGHTRENDERER_H #define FIFE_LIGHTRENDERER_H // Standard C++ library includes #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "model/structures/renderernode.h" #include "view/rendererbase.h" #include "video/animation.h" namespace FIFE { class RenderBackend; class IFont; class LightRendererElementInfo { public: LightRendererElementInfo(RendererNode n, int32_t src, int32_t dst); virtual ~LightRendererElementInfo() {}; virtual void render(Camera* cam, Layer* layer, RenderList& instances, RenderBackend* renderbackend) = 0; virtual std::string getName() = 0; RendererNode* getNode() { return &m_anchor; }; int32_t getSrcBlend() { return m_src; }; int32_t getDstBlend() { return m_dst; }; void setStencil(uint8_t stencil_ref); int32_t getStencil(); void removeStencil(); virtual std::vector getColor() { return std::vector(); }; virtual float getRadius() { return 0; }; virtual int32_t getSubdivisions() { return 0; }; virtual float getXStretch() { return 0; }; virtual float getYStretch() { return 0; }; protected: RendererNode m_anchor; int32_t m_src; int32_t m_dst; bool m_stencil; uint8_t m_stencil_ref; }; class LightRendererImageInfo : public LightRendererElementInfo { public: LightRendererImageInfo(RendererNode n, ImagePtr image, int32_t src, int32_t dst); virtual ~LightRendererImageInfo() {}; virtual void render(Camera* cam, Layer* layer, RenderList& instances, RenderBackend* renderbackend); virtual std::string getName() { return "image"; }; ImagePtr getImage() { return m_image; }; private: ImagePtr m_image; }; class LightRendererAnimationInfo : public LightRendererElementInfo { public: LightRendererAnimationInfo(RendererNode n, AnimationPtr animation, int32_t src, int32_t dst); virtual ~LightRendererAnimationInfo() {}; virtual void render(Camera* cam, Layer* layer, RenderList& instances, RenderBackend* renderbackend); virtual std::string getName() { return "animation"; }; AnimationPtr getAnimation() { return m_animation; }; private: AnimationPtr m_animation; uint32_t m_start_time; float m_time_scale; }; class LightRendererSimpleLightInfo : public LightRendererElementInfo { public: LightRendererSimpleLightInfo(RendererNode n, uint8_t intensity, float radius, int32_t subdivisions, float xstretch, float ystretch, uint8_t r, uint8_t g, uint8_t b, int32_t src, int32_t dst); virtual ~LightRendererSimpleLightInfo() {}; virtual void render(Camera* cam, Layer* layer, RenderList& instances, RenderBackend* renderbackend); virtual std::string getName() { return "simple"; }; std::vector getColor(); float getRadius() { return m_radius; }; int32_t getSubdivisions() { return m_subdivisions; }; float getXStretch() { return m_xstretch; }; float getYStretch() { return m_ystretch; }; private: uint8_t m_intensity; float m_radius; int32_t m_subdivisions; float m_xstretch; float m_ystretch; uint8_t m_red; uint8_t m_green; uint8_t m_blue; }; class LightRendererResizeInfo : public LightRendererElementInfo { public: LightRendererResizeInfo(RendererNode n, ImagePtr image, int32_t width, int32_t height, int32_t src, int32_t dst); virtual ~LightRendererResizeInfo() {}; virtual void render(Camera* cam, Layer* layer, RenderList& instances, RenderBackend* renderbackend); virtual std::string getName() { return "resize"; }; ImagePtr getImage() { return m_image; }; private: ImagePtr m_image; int32_t m_width; int32_t m_height; }; class LightRenderer: public RendererBase { public: /** constructor. * @param renderbackend to use * @param position position for this renderer in rendering pipeline */ LightRenderer(RenderBackend* renderbackend, int32_t position); LightRenderer(const LightRenderer& old); RendererBase* clone(); /** Destructor. */ virtual ~LightRenderer(); void render(Camera* cam, Layer* layer, RenderList& instances); std::string getName() { return "LightRenderer"; } /** Gets instance for interface access */ static LightRenderer* getInstance(IRendererContainer* cnt); void addImage(const std::string &group, RendererNode n, ImagePtr image, int32_t src=-1, int32_t dst=-1); void addAnimation(const std::string &group, RendererNode n, AnimationPtr animation, int32_t src=-1, int32_t dst=-1); void addSimpleLight(const std::string &group, RendererNode n, uint8_t intensity, float radius, int32_t subdivisions, float xstretch, float ystretch, uint8_t r, uint8_t g, uint8_t b, int32_t src=-1, int32_t dst=-1); void resizeImage(const std::string &group, RendererNode n, ImagePtr image, int32_t width, int32_t height, int32_t src=-1, int32_t dst=-1); void addStencilTest(const std::string &group, uint8_t stencil_ref=0); void removeStencilTest(const std::string &group); std::list getGroups(); std::vector getLightInfo(const std::string &group); void removeAll(const std::string &group); void removeAll(); void reset(); private: std::map > m_groups; }; } #endif fifengine-0.4.2/engine/core/view/renderers/lightrenderer.i000066400000000000000000000107711341615052600236300ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fife %{ #include "view/renderers/lightrenderer.h" %} namespace FIFE { class RenderBackend; class LightRendererElementInfo { public: LightRendererElementInfo(RendererNode n, int32_t src, int32_t dst); virtual ~LightRendererElementInfo(); virtual std::string getName() = 0; RendererNode* getNode(); int32_t getSrcBlend(); int32_t getDstBlend(); void setStencil(uint8_t stencil_ref); int32_t getStencil(); void removeStencil(); virtual std::vector getColor(); virtual float getRadius(); virtual int32_t getSubdivisions(); virtual float getXStretch(); virtual float getYStretch(); }; class LightRendererImageInfo : public LightRendererElementInfo { public: LightRendererImageInfo(RendererNode n, ImagePtr image, int32_t src, int32_t dst); virtual ~LightRendererImageInfo(); ImagePtr getImage(); }; class LightRendererAnimationInfo : public LightRendererElementInfo { public: LightRendererAnimationInfo(RendererNode n, AnimationPtr animation, int32_t src, int32_t dst); virtual ~LightRendererAnimationInfo(); AnimationPtr getAnimation(); }; class LightRendererSimpleLightInfo : public LightRendererElementInfo { public: LightRendererSimpleLightInfo(RendererNode n, uint8_t intensity, float radius, int32_t subdivisions, float xstretch, float ystretch, uint8_t r, uint8_t g, uint8_t b, int32_t src, int32_t dst); virtual ~LightRendererSimpleLightInfo(); std::vector getColor(); float getRadius(); int32_t getSubdivisions(); float getXStretch(); float getYStretch(); }; class LightRendererResizeInfo : public LightRendererElementInfo { public: LightRendererResizeInfo(RendererNode n, ImagePtr image, int32_t width, int32_t height, int32_t src, int32_t dst); virtual ~LightRendererResizeInfo(); ImagePtr getImage(); }; class LightRenderer: public RendererBase { public: LightRenderer(RenderBackend* renderbackend, int32_t position); ~LightRenderer(); std::string getName(); static LightRenderer* getInstance(IRendererContainer* cnt); void addImage(const std::string &group, RendererNode n, ImagePtr image, int32_t src=-1, int32_t dst=-1); void addAnimation(const std::string &group, RendererNode n, AnimationPtr animation, int32_t src=-1, int32_t dst=-1); void addSimpleLight(const std::string &group, RendererNode n, uint8_t intensity, float radius, int32_t subdivisions, float xstretch, float ystretch, uint8_t r, uint8_t g, uint8_t b, int32_t src=-1, int32_t dst=-1); void resizeImage(const std::string &group, RendererNode n, ImagePtr image, int32_t width, int32_t height, int32_t src=-1, int32_t dst=-1); void addStencilTest(const std::string &group, uint8_t stencil_ref=0); void removeStencilTest(const std::string &group); std::list getGroups(); std::vector getLightInfo(const std::string &group); void removeAll(const std::string &group); void removeAll(); }; } namespace std { %template(LightRendererElementInfoVector) vector; } fifengine-0.4.2/engine/core/view/renderers/offrenderer.cpp000066400000000000000000000227341341615052600236270ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "video/renderbackend.h" #include "video/fonts/ifont.h" #include "video/image.h" #include "video/imagemanager.h" #include "util/math/fife_math.h" #include "util/log/logger.h" #include "util/time/timemanager.h" #include "model/metamodel/timeprovider.h" #include "offrenderer.h" namespace FIFE { /** Logger to use for this source file. * @relates Logger */ static Logger _log(LM_VIEWVIEW); OffRendererLineInfo::OffRendererLineInfo(Point n1, Point n2, uint8_t r, uint8_t g, uint8_t b, uint8_t a): OffRendererElementInfo(), m_edge1(n1), m_edge2(n2), m_red(r), m_green(g), m_blue(b), m_alpha(a) { } void OffRendererLineInfo::render(RenderBackend* renderbackend) { renderbackend->drawLine(m_edge1, m_edge2, m_red, m_green, m_blue, m_alpha); } OffRendererPointInfo::OffRendererPointInfo(Point anchor, uint8_t r, uint8_t g, uint8_t b, uint8_t a): OffRendererElementInfo(), m_anchor(anchor), m_red(r), m_green(g), m_blue(b), m_alpha(a) { } void OffRendererPointInfo::render(RenderBackend* renderbackend) { renderbackend->putPixel(m_anchor.x, m_anchor.y, m_red, m_green, m_blue, m_alpha); } OffRendererTriangleInfo::OffRendererTriangleInfo(Point n1, Point n2, Point n3, uint8_t r, uint8_t g, uint8_t b, uint8_t a): OffRendererElementInfo(), m_edge1(n1), m_edge2(n2), m_edge3(n3), m_red(r), m_green(g), m_blue(b), m_alpha(a) { } void OffRendererTriangleInfo::render(RenderBackend* renderbackend) { renderbackend->drawTriangle(m_edge1, m_edge2, m_edge3, m_red, m_green, m_blue, m_alpha); } OffRendererQuadInfo::OffRendererQuadInfo(Point n1, Point n2, Point n3, Point n4, uint8_t r, uint8_t g, uint8_t b, uint8_t a): OffRendererElementInfo(), m_edge1(n1), m_edge2(n2), m_edge3(n3), m_edge4(n4), m_red(r), m_green(g), m_blue(b), m_alpha(a) { } void OffRendererQuadInfo::render(RenderBackend* renderbackend) { renderbackend->drawQuad(m_edge1, m_edge2, m_edge3, m_edge4, m_red, m_green, m_blue, m_alpha); } OffRendererVertexInfo::OffRendererVertexInfo(Point center, int32_t size, uint8_t r, uint8_t g, uint8_t b, uint8_t a): OffRendererElementInfo(), m_center(center), m_size(size), m_red(r), m_green(g), m_blue(b), m_alpha(a) { } void OffRendererVertexInfo::render(RenderBackend* renderbackend) { renderbackend->drawVertex(m_center, m_size, m_red, m_green, m_blue, m_alpha); } OffRendererImageInfo::OffRendererImageInfo(Point anchor, ImagePtr image): OffRendererElementInfo(), m_anchor(anchor), m_image(image) { } void OffRendererImageInfo::render(RenderBackend* renderbackend) { Rect r; uint16_t width = m_image->getWidth(); uint16_t height = m_image->getHeight(); r.x = m_anchor.x-width/2; r.y = m_anchor.y-height/2; r.w = width; r.h = height; m_image->render(r); } OffRendererAnimationInfo::OffRendererAnimationInfo(Point anchor, AnimationPtr animation): OffRendererElementInfo(), m_anchor(anchor), m_animation(animation), m_start_time(TimeManager::instance()->getTime()), m_time_scale(1.0) { } void OffRendererAnimationInfo::render(RenderBackend* renderbackend) { int32_t animtime = scaleTime(m_time_scale, TimeManager::instance()->getTime() - m_start_time) % m_animation->getDuration(); ImagePtr img = m_animation->getFrameByTimestamp(animtime); Rect r; uint16_t width = img->getWidth(); uint16_t height = img->getHeight(); r.x = m_anchor.x-width/2; r.y = m_anchor.y-height/2; r.w = width; r.h = height; img->render(r); } OffRendererTextInfo::OffRendererTextInfo(Point anchor, IFont* font, std::string text): OffRendererElementInfo(), m_anchor(anchor), m_font(font), m_text(text) { } void OffRendererTextInfo::render(RenderBackend* renderbackend) { Image* img = m_font->getAsImageMultiline(m_text); Rect r; uint16_t width = img->getWidth(); uint16_t height = img->getHeight(); r.x = m_anchor.x-width/2; r.y = m_anchor.y-height/2; r.w = width; r.h = height; img->render(r); } OffRendererResizeInfo::OffRendererResizeInfo(Point anchor, ImagePtr image, int32_t width, int32_t height): OffRendererElementInfo(), m_anchor(anchor), m_image(image), m_width(width), m_height(height){ } void OffRendererResizeInfo::render(RenderBackend* renderbackend) { Rect r; uint16_t width = m_width; uint16_t height = m_height; r.x = m_anchor.x-width/2; r.y = m_anchor.y-height/2; r.w = width; r.h = height; m_image->render(r); } OffRenderer::OffRenderer(RenderBackend* renderbackend): m_groups(), m_renderbackend(renderbackend), m_enabled(false), m_area(renderbackend->getArea()) { } OffRenderer::~OffRenderer() { removeAll(); } void OffRenderer::setEnabled(bool enabled) { m_enabled = enabled; } bool OffRenderer::isEnabled() { return m_enabled; } void OffRenderer::setClipArea(Rect area) { m_area = area; } const Rect& OffRenderer::getClipArea() const { return m_area; } void OffRenderer::addLine(const std::string &group, Point n1, Point n2, uint8_t r, uint8_t g, uint8_t b, uint8_t a) { OffRendererElementInfo* info = new OffRendererLineInfo(n1, n2, r, g, b, a); m_groups[group].push_back(info); } void OffRenderer::addPoint(const std::string &group, Point n, uint8_t r, uint8_t g, uint8_t b, uint8_t a) { OffRendererElementInfo* info = new OffRendererPointInfo(n, r, g, b, a); m_groups[group].push_back(info); } void OffRenderer::addTriangle(const std::string &group, Point n1, Point n2, Point n3, uint8_t r, uint8_t g, uint8_t b, uint8_t a) { OffRendererElementInfo* info = new OffRendererTriangleInfo(n1, n2, n3, r, g, b, a); m_groups[group].push_back(info); } void OffRenderer::addQuad(const std::string &group, Point n1, Point n2, Point n3, Point n4, uint8_t r, uint8_t g, uint8_t b, uint8_t a) { OffRendererElementInfo* info = new OffRendererQuadInfo(n1, n2, n3, n4, r, g, b, a); m_groups[group].push_back(info); } void OffRenderer::addVertex(const std::string &group, Point n, int32_t size, uint8_t r, uint8_t g, uint8_t b, uint8_t a) { OffRendererElementInfo* info = new OffRendererVertexInfo(n, size, r, g, b, a); m_groups[group].push_back(info); } void OffRenderer::addText(const std::string &group, Point n, IFont* font, const std::string &text) { OffRendererElementInfo* info = new OffRendererTextInfo(n, font, text); m_groups[group].push_back(info); } void OffRenderer::addImage(const std::string &group, Point n, ImagePtr image) { OffRendererElementInfo* info = new OffRendererImageInfo(n, image); m_groups[group].push_back(info); } void OffRenderer::addAnimation(const std::string &group, Point n, AnimationPtr animation) { OffRendererElementInfo* info = new OffRendererAnimationInfo(n, animation); m_groups[group].push_back(info); } void OffRenderer::resizeImage(const std::string &group, Point n, ImagePtr image, int32_t width, int32_t height) { OffRendererElementInfo* info = new OffRendererResizeInfo(n, image, width, height); m_groups[group].push_back(info); } void OffRenderer::removeAll(const std::string &group) { std::vector::const_iterator info_it = m_groups[group].begin(); for (;info_it != m_groups[group].end(); ++info_it) { delete *info_it; } m_groups[group].clear(); m_groups.erase(group); } void OffRenderer::removeAll() { m_groups.clear(); } void OffRenderer::render() { if (!m_enabled) { return; } m_renderbackend->pushClipArea(m_area); std::map >::iterator group_it = m_groups.begin(); for(; group_it != m_groups.end(); ++group_it) { std::vector::const_iterator info_it = group_it->second.begin(); for (;info_it != group_it->second.end(); ++info_it) { (*info_it)->render(m_renderbackend); } } m_renderbackend->renderVertexArrays(); m_renderbackend->popClipArea(); } } fifengine-0.4.2/engine/core/view/renderers/offrenderer.h000066400000000000000000000150051341615052600232650ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_OFFRENDERER_H #define FIFE_OFFRENDERER_H // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "video/animation.h" namespace FIFE { class RenderBackend; class IFont; class OffRendererElementInfo { public: virtual void render(RenderBackend* renderbackend) {}; virtual ~OffRendererElementInfo() {}; }; class OffRendererLineInfo : public OffRendererElementInfo { public: void render(RenderBackend* renderbackend); OffRendererLineInfo(Point n1, Point n2, uint8_t r, uint8_t g, uint8_t b, uint8_t a); virtual ~OffRendererLineInfo() {}; private: Point m_edge1; Point m_edge2; uint8_t m_red; uint8_t m_green; uint8_t m_blue; uint8_t m_alpha; }; class OffRendererPointInfo : public OffRendererElementInfo { public: void render(RenderBackend* renderbackend); OffRendererPointInfo(Point n, uint8_t r, uint8_t g, uint8_t b, uint8_t a); virtual ~OffRendererPointInfo() {}; private: Point m_anchor; uint8_t m_red; uint8_t m_green; uint8_t m_blue; uint8_t m_alpha; }; class OffRendererTriangleInfo : public OffRendererElementInfo { public: void render(RenderBackend* renderbackend); OffRendererTriangleInfo(Point n1, Point n2, Point n3, uint8_t r, uint8_t g, uint8_t b, uint8_t a); virtual ~OffRendererTriangleInfo() {}; private: Point m_edge1; Point m_edge2; Point m_edge3; uint8_t m_red; uint8_t m_green; uint8_t m_blue; uint8_t m_alpha; }; class OffRendererQuadInfo : public OffRendererElementInfo { public: void render(RenderBackend* renderbackend); OffRendererQuadInfo(Point n1, Point n2, Point n3, Point n4, uint8_t r, uint8_t g, uint8_t b, uint8_t a); virtual ~OffRendererQuadInfo() {}; private: Point m_edge1; Point m_edge2; Point m_edge3; Point m_edge4; uint8_t m_red; uint8_t m_green; uint8_t m_blue; uint8_t m_alpha; }; class OffRendererVertexInfo : public OffRendererElementInfo { public: void render(RenderBackend* renderbackend); OffRendererVertexInfo(Point center, int32_t size, uint8_t r, uint8_t g, uint8_t b, uint8_t a); virtual ~OffRendererVertexInfo() {}; private: Point m_center; int32_t m_size; uint8_t m_red; uint8_t m_green; uint8_t m_blue; uint8_t m_alpha; }; class OffRendererImageInfo : public OffRendererElementInfo { public: void render(RenderBackend* renderbackend); OffRendererImageInfo(Point n, ImagePtr image); virtual ~OffRendererImageInfo() {}; private: Point m_anchor; ImagePtr m_image; }; class OffRendererAnimationInfo : public OffRendererElementInfo { public: void render(RenderBackend* renderbackend); OffRendererAnimationInfo(Point n, AnimationPtr animation); virtual ~OffRendererAnimationInfo() {}; private: Point m_anchor; AnimationPtr m_animation; uint32_t m_start_time; float m_time_scale; }; class OffRendererTextInfo : public OffRendererElementInfo { public: void render(RenderBackend* renderbackend); OffRendererTextInfo(Point n, IFont* font, std::string text); virtual ~OffRendererTextInfo() {}; private: Point m_anchor; IFont* m_font; std::string m_text; }; class OffRendererResizeInfo : public OffRendererElementInfo { public: void render(RenderBackend* renderbackend); OffRendererResizeInfo(Point n, ImagePtr image, int32_t width, int32_t height); virtual ~OffRendererResizeInfo() {}; private: Point m_anchor; ImagePtr m_image; int32_t m_width; int32_t m_height; }; class OffRenderer { public: /** constructor. * @param renderbackend to use */ OffRenderer(RenderBackend* renderbackend); /** Destructor. */ virtual ~OffRenderer(); void setEnabled(bool enabled); bool isEnabled(); void setClipArea(Rect area); const Rect& getClipArea() const; void render(); void addLine(const std::string &group, Point n1, Point n2, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255); void addPoint(const std::string &group, Point n, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255); void addTriangle(const std::string &group, Point n1, Point n2, Point n3, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255); void addQuad(const std::string &group, Point n1, Point n2, Point n3, Point n4, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255); void addVertex(const std::string &group, Point n, int32_t size, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255); void addText(const std::string &group, Point n, IFont* font, const std::string &text); void addImage(const std::string &group, Point n, ImagePtr image); void addAnimation(const std::string &group, Point n, AnimationPtr animation); void resizeImage(const std::string &group, Point n, ImagePtr image, int32_t width, int32_t height); void removeAll(const std::string &group); void removeAll(); private: std::map > m_groups; RenderBackend* m_renderbackend; bool m_enabled; Rect m_area; }; } #endif fifengine-0.4.2/engine/core/view/renderers/offrenderer.i000066400000000000000000000111231341615052600232630ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fife %{ #include "view/renderers/offrenderer.h" %} namespace FIFE { class RenderBackend; class OffRendererElementInfo { public: virtual ~OffRendererElementInfo() {}; }; class OffRendererLineInfo : public OffRendererElementInfo { public: OffRendererLineInfo(Point n1, Point n2, uint8_t r, uint8_t g, uint8_t b, uint8_t a); virtual ~OffRendererLineInfo() {}; }; class OffRendererPointInfo : public OffRendererElementInfo { public: OffRendererPointInfo(Point n, uint8_t r, uint8_t g, uint8_t b, uint8_t a); virtual ~OffRendererPointInfo() {}; }; class OffRendererTriangleInfo : public OffRendererElementInfo { public: OffRendererTriangleInfo(Point n1, Point n2, Point n3, uint8_t r, uint8_t g, uint8_t b, uint8_t a); virtual ~OffRendererTriangleInfo() {}; }; class OffRendererQuadInfo : public OffRendererElementInfo { public: OffRendererQuadInfo(Point n1, Point n2, Point n3, Point n4, uint8_t r, uint8_t g, uint8_t b, uint8_t a); virtual ~OffRendererQuadInfo() {}; }; class OffRendererVertexInfo : public OffRendererElementInfo { public: OffRendererVertexInfo(Point center, int32_t size, uint8_t r, uint8_t g, uint8_t b, uint8_t a); virtual ~OffRendererVertexInfo() {}; }; class OffRendererImageInfo : public OffRendererElementInfo { public: OffRendererImageInfo(Point n, ImagePtr image); virtual ~OffRendererImageInfo() {}; }; class OffRendererAnimationInfo : public OffRendererElementInfo { public: OffRendererAnimationInfo(Point n, AnimationPtr animation); virtual ~OffRendererAnimationInfo() {}; }; class OffRendererTextInfo : public OffRendererElementInfo { public: OffRendererTextInfo(Point n, IFont* font, std::string text); virtual ~OffRendererTextInfo() {}; }; class OffRendererResizeInfo : public OffRendererElementInfo { public: OffRendererResizeInfo(Point n, ImagePtr image, int32_t width, int32_t height); virtual ~OffRendererResizeInfo() {}; }; class OffRenderer { public: OffRenderer(RenderBackend* renderbackend); ~OffRenderer(); void setEnabled(bool enabled); bool isEnabled(); void setClipArea(Rect area); const Rect& getClipArea() const; void addLine(const std::string &group, Point n1, Point n2, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255); void addPoint(const std::string &group, Point n, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255); void addTriangle(const std::string &group, Point n1, Point n2, Point n3, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255); void addQuad(const std::string &group, Point n1, Point n2, Point n3, Point n4, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255); void addVertex(const std::string &group, Point n, int32_t size, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255); void addText(const std::string &group, Point n, IFont* font, const std::string &text); void addImage(const std::string &group, Point n, ImagePtr image); void addAnimation(const std::string &group, Point n, AnimationPtr animation); void resizeImage(const std::string &group, Point n, ImagePtr image, int32_t width, int32_t height); void removeAll(const std::string &group); void removeAll(); }; } fifengine-0.4.2/engine/core/view/renderers/quadtreerenderer.cpp000066400000000000000000000112171341615052600246610ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "video/renderbackend.h" #include "util/math/fife_math.h" #include "util/log/logger.h" #include "model/metamodel/grids/cellgrid.h" #include "model/structures/instance.h" #include "model/structures/layer.h" #include "model/structures/location.h" #include "view/camera.h" #include "quadtreerenderer.h" #include "model/structures/instancetree.h" #include "util/structures/quadtree.h" //credit to phoku for his NodeDisplay example which the visitor code is adapted from ( he coded the quadtree after all ) namespace FIFE { /** Logger to use for this source file. * @relates Logger */ static Logger _log(LM_VIEWVIEW); QuadTreeRenderer::QuadTreeRenderer(RenderBackend* renderbackend, int32_t position): RendererBase(renderbackend, position) { setEnabled(false); } QuadTreeRenderer::QuadTreeRenderer(const QuadTreeRenderer& old): RendererBase(old) { setEnabled(false); } RendererBase* QuadTreeRenderer::clone() { return new QuadTreeRenderer(*this); } QuadTreeRenderer::~QuadTreeRenderer() { } RenderVisitor::RenderVisitor(RenderBackend * rb, Layer * layer, Camera *camera) { m_renderbackend = rb; m_layer = layer; m_camera = camera; } RenderVisitor::~RenderVisitor() {} template bool RenderVisitor::visit(QuadNode* node, int32_t d) { if (d==0) visited = 0; int32_t x = node->x(); int32_t y = node->y(); int32_t size = node->size(); ++visited; CellGrid *cg = m_layer->getCellGrid(); ///we have checked for null pointer in quadtreerenderer::render().. no need to check again ExactModelCoordinate emc= cg->toMapCoordinates(ExactModelCoordinate( x,y) );//0.5 for each cell's half-width ScreenPoint scrpt1 =m_camera->toScreenCoordinates( emc ); emc= cg->toMapCoordinates(ExactModelCoordinate( x,y+size) );// this size usage is wrong.. me thinks ScreenPoint scrpt2 =m_camera->toScreenCoordinates( emc ); emc= cg->toMapCoordinates(ExactModelCoordinate( x+size,y) ); ScreenPoint scrpt3 =m_camera->toScreenCoordinates( emc ); emc= cg->toMapCoordinates(ExactModelCoordinate( x+size,y+size) ); ScreenPoint scrpt4 =m_camera->toScreenCoordinates( emc ); m_renderbackend->drawLine(Point(scrpt1.x,scrpt1.y), Point(scrpt2.x,scrpt2.y), 255, 255, 255); m_renderbackend->drawLine(Point(scrpt1.x,scrpt1.y), Point(scrpt3.x,scrpt3.y), 255, 255, 255); m_renderbackend->drawLine(Point(scrpt3.x,scrpt3.y), Point(scrpt4.x,scrpt4.y), 255, 255, 255); m_renderbackend->drawLine(Point(scrpt2.x,scrpt2.y), Point(scrpt4.x,scrpt4.y), 255, 255, 255); return true; } void QuadTreeRenderer::render(Camera* cam, Layer* layer, RenderList& instances) { CellGrid* cg = layer->getCellGrid(); if (!cg) { FL_WARN(_log, "No cellgrid assigned to layer, cannot draw grid"); return; } InstanceTree * itree = layer->getInstanceTree(); RenderVisitor VIPguess(m_renderbackend, layer,cam); itree->applyVisitor(VIPguess); } } fifengine-0.4.2/engine/core/view/renderers/quadtreerenderer.h000066400000000000000000000054751341615052600243370ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_QUADTREERENDERER_H #define FIFE_QUADTREERENDERER_H // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "view/rendererbase.h" #include "util/structures/quadtree.h" #include "model/structures/instancetree.h" namespace FIFE { class RenderBackend; class RenderVisitor { public: int32_t visited; RenderBackend * m_renderbackend; Layer * m_layer; Camera *m_camera; RenderVisitor(RenderBackend * rb, Layer * layer, Camera *camera); ~RenderVisitor(); template bool visit(QuadNode* node, int32_t d); }; class QuadTreeRenderer: public RendererBase { public: /** constructor. * @param renderbackend to use * @param position position for this renderer in rendering pipeline */ QuadTreeRenderer(RenderBackend* renderbackend, int32_t position); QuadTreeRenderer(const QuadTreeRenderer& old); RendererBase* clone(); /** Destructor. */ virtual ~QuadTreeRenderer(); void render(Camera* cam, Layer* layer, RenderList& instances); std::string getName() { return "QuadTreeRenderer"; } }; } #endif fifengine-0.4.2/engine/core/view/renderers/targetrenderer.cpp000066400000000000000000000156361341615052600243460ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "video/renderbackend.h" #include "video/imagemanager.h" #include "util/log/logger.h" #include "view/camera.h" #include "targetrenderer.h" namespace FIFE { /** Logger to use for this source file. * @relates Logger */ static Logger _log(LM_VIEWVIEW); RenderTarget::RenderTarget(RenderBackend* rb, const std::string& name, uint32_t width, uint32_t height): m_renderbackend(rb) { m_target = ImageManager::instance()->loadBlank(name, width, height); } RenderTarget::RenderTarget(RenderBackend* rb, ImagePtr& image): m_renderbackend(rb), m_target(image) { } RenderTarget::~RenderTarget() { } void RenderTarget::addLine(const std::string &group, Point n1, Point n2, uint8_t r, uint8_t g, uint8_t b, uint8_t a) { OffRendererElementInfo* info = new OffRendererLineInfo(n1, n2, r, g, b, a); m_groups[group].push_back(info); } void RenderTarget::addPoint(const std::string &group, Point n, uint8_t r, uint8_t g, uint8_t b, uint8_t a) { OffRendererElementInfo* info = new OffRendererPointInfo(n, r, g, b, a); m_groups[group].push_back(info); } void RenderTarget::addTriangle(const std::string &group, Point n1, Point n2, Point n3, uint8_t r, uint8_t g, uint8_t b, uint8_t a) { OffRendererElementInfo* info = new OffRendererTriangleInfo(n1, n2, n3, r, g, b, a); m_groups[group].push_back(info); } void RenderTarget::addQuad(const std::string &group, Point n1, Point n2, Point n3, Point n4, uint8_t r, uint8_t g, uint8_t b, uint8_t a) { OffRendererElementInfo* info = new OffRendererQuadInfo(n1, n2, n3, n4, r, g, b, a); m_groups[group].push_back(info); } void RenderTarget::addVertex(const std::string &group, Point n, int32_t size, uint8_t r, uint8_t g, uint8_t b, uint8_t a) { OffRendererElementInfo* info = new OffRendererVertexInfo(n, size, r, g, b, a); m_groups[group].push_back(info); } void RenderTarget::addText(const std::string &group, Point n, IFont* font, const std::string &text) { OffRendererElementInfo* info = new OffRendererTextInfo(n, font, text); m_groups[group].push_back(info); } void RenderTarget::addImage(const std::string &group, Point n, ImagePtr image) { OffRendererElementInfo* info = new OffRendererImageInfo(n, image); m_groups[group].push_back(info); } void RenderTarget::addAnimation(const std::string &group, Point n, AnimationPtr animation) { OffRendererElementInfo* info = new OffRendererAnimationInfo(n, animation); m_groups[group].push_back(info); } void RenderTarget::resizeImage(const std::string &group, Point n, ImagePtr image, int32_t width, int32_t height) { OffRendererElementInfo* info = new OffRendererResizeInfo(n, image, width, height); m_groups[group].push_back(info); } void RenderTarget::removeAll(const std::string &group) { std::vector::const_iterator info_it = m_groups[group].begin(); for (;info_it != m_groups[group].end(); ++info_it) { delete *info_it; } m_groups[group].clear(); m_groups.erase(group); } void RenderTarget::removeAll() { m_groups.clear(); } void RenderTarget::render() { std::map >::iterator group_it = m_groups.begin(); for(; group_it != m_groups.end(); ++group_it) { std::vector::const_iterator info_it = group_it->second.begin(); for (; info_it != group_it->second.end(); ++info_it) { (*info_it)->render(m_renderbackend); } } } TargetRenderer::TargetRenderer(RenderBackend* renderbackend) : m_renderbackend(renderbackend) { } TargetRenderer::~TargetRenderer() { } RenderTargetPtr TargetRenderer::createRenderTarget(const std::string& name, uint32_t width, uint32_t height) { RenderJob rj; rj.ndraws = -1; rj.lasttime_draw = 1; rj.target = RenderTargetPtr(new RenderTarget(m_renderbackend, name, width, height)); rj.discard = false; std::pair ret = m_targets.insert(std::make_pair(name, rj)); return ret.first->second.target; } RenderTargetPtr TargetRenderer::createRenderTarget(ImagePtr& image) { RenderJob rj; rj.ndraws = -1; rj.lasttime_draw = 1; rj.target = RenderTargetPtr(new RenderTarget(m_renderbackend, image)); rj.discard = false; std::pair ret = m_targets.insert(std::make_pair(image->getName(), rj)); return ret.first->second.target; } void TargetRenderer::setRenderTarget(const std::string& targetname, bool discard, int32_t ndraws) { RenderJobMap::iterator it = m_targets.find(targetname); if (it != m_targets.end()) { it->second.ndraws = ndraws; it->second.discard = discard; } } void TargetRenderer::render() { if (!m_targets.empty()) { for (RenderJobMap::iterator it = m_targets.begin(); it != m_targets.end(); ++it) { if (it->second.ndraws != -1) { if (it->second.ndraws <= it->second.lasttime_draw) { RenderTargetPtr rt = it->second.target; m_renderbackend->attachRenderTarget(rt->m_target, it->second.discard); rt->render(); m_renderbackend->detachRenderTarget(); if(it->second.ndraws == 0) { it->second.ndraws = -1; } else { it->second.lasttime_draw = 1; } } else { ++it->second.lasttime_draw; } } } } } } fifengine-0.4.2/engine/core/view/renderers/targetrenderer.h000066400000000000000000000105151341615052600240020ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_TARGETRENDERER_H #define FIFE_TARGETRENDERER_H // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "view/renderers/offrenderer.h" namespace FIFE { class RenderTarget { friend class TargetRenderer; public: /** Destructor. */ ~RenderTarget(); void addLine(const std::string &group, Point n1, Point n2, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255); void addPoint(const std::string &group, Point n, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255); void addTriangle(const std::string &group, Point n1, Point n2, Point n3, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255); void addQuad(const std::string &group, Point n1, Point n2, Point n3, Point n4, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255); void addVertex(const std::string &group, Point n, int32_t size, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255); void addText(const std::string &group, Point n, IFont* font, const std::string &text); void addImage(const std::string &group, Point n, ImagePtr image); void addAnimation(const std::string &group, Point n, AnimationPtr animation); void resizeImage(const std::string &group, Point n, ImagePtr image, int32_t width, int32_t height); void removeAll(const std::string &group); void removeAll(); void render(); ImagePtr getTarget() { return m_target; } private: RenderTarget(RenderBackend* rb, const std::string& name, uint32_t width, uint32_t height); RenderTarget(RenderBackend* rb, ImagePtr& image); // Non copyable RenderTarget(const RenderTarget& rhs); /* = delete */ RenderTarget& operator=(const RenderTarget& rhs); /* = delete */ std::map > m_groups; RenderBackend* m_renderbackend; ImagePtr m_target; }; typedef SharedPtr RenderTargetPtr; class TargetRenderer { public: /** Constructor. * @param renderbackend to use */ TargetRenderer(RenderBackend* renderbackend); /** Destructor. */ virtual ~TargetRenderer(); /** Creates render target */ RenderTargetPtr createRenderTarget(const std::string& name, uint32_t width, uint32_t height); RenderTargetPtr createRenderTarget(ImagePtr& image); // -1 - dont render // 0 - just for the next frame // 1 - every frame // 2 - every two frames, etc... void setRenderTarget(const std::string& targetname, bool discard, int32_t ndraws = 0); void render(); private: struct RenderJob { int32_t ndraws; int32_t lasttime_draw; RenderTargetPtr target; bool discard; }; typedef std::map RenderJobMap; RenderJobMap m_targets; RenderBackend* m_renderbackend; }; } #endif fifengine-0.4.2/engine/core/view/renderers/targetrenderer.i000066400000000000000000000064301341615052600240040ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fife %{ #include "view/renderers/targetrenderer.h" %} namespace FIFE { class RenderTarget { public: ~RenderTarget(); void addLine(const std::string &group, Point n1, Point n2, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255); void addPoint(const std::string &group, Point n, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255); void addTriangle(const std::string &group, Point n1, Point n2, Point n3, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255); void addQuad(const std::string &group, Point n1, Point n2, Point n3, Point n4, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255); void addVertex(const std::string &group, Point n, int32_t size, uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255); void addText(const std::string &group, Point n, IFont* font, const std::string &text); void addImage(const std::string &group, Point n, ImagePtr image); void addAnimation(const std::string &group, Point n, AnimationPtr animation); void resizeImage(const std::string &group, Point n, ImagePtr image, int32_t width, int32_t height); void removeAll(const std::string &group); void removeAll(); void render(); ImagePtr getTarget(); private: // Non copyable RenderTarget(const RenderTarget& rhs); /* = delete */ RenderTarget& operator=(const RenderTarget& rhs); /* = delete */ }; typedef SharedPtr RenderTargetPtr; %template(SharedRenderTargetPointer) SharedPtr; class TargetRenderer { public: TargetRenderer(RenderBackend* renderbackend); virtual ~TargetRenderer(); RenderTargetPtr createRenderTarget(const std::string& name, uint32_t width, uint32_t height); RenderTargetPtr createRenderTarget(ImagePtr& image); void setRenderTarget(const std::string& targetname, bool discard, int32_t ndraws = 0); void render(); }; } fifengine-0.4.2/engine/core/view/renderitem.cpp000066400000000000000000000106461341615052600214720ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "model/structures/instance.h" #include "model/metamodel/object.h" #include "model/metamodel/action.h" #include "visual.h" #include "renderitem.h" namespace FIFE { const int32_t STATIC_IMAGE_NOT_INITIALIZED = -1; OverlayData::OverlayData(): colorOverlay(0), animationOverlayImages(0), animationColorOverlays(0) { } OverlayData::~OverlayData() { delete animationOverlayImages; delete animationColorOverlays; // don't delete colorOverlay here } RenderItem::RenderItem(Instance* parent): instance(parent), screenpoint(), dimensions(), vertexZ(0), facingAngle(0), transparency(255), currentFrame(-1), m_overlay(0), m_cachedStaticImgId(STATIC_IMAGE_NOT_INITIALIZED), m_cachedStaticImgAngle(0) { } RenderItem::~RenderItem() { delete m_overlay; } int32_t RenderItem::getStaticImageIndexByAngle(uint32_t angle, Instance* instance) { ObjectVisual* objVis = instance->getObject()->getVisual(); if (!objVis) { return STATIC_IMAGE_NOT_INITIALIZED; } if (static_cast(angle) != m_cachedStaticImgAngle) { m_cachedStaticImgId = STATIC_IMAGE_NOT_INITIALIZED; } if (objVis->isColorOverlay()) { if (!m_overlay) { m_overlay = new OverlayData(); } m_overlay->colorOverlay = objVis->getStaticColorOverlay(angle); } if (m_cachedStaticImgId != STATIC_IMAGE_NOT_INITIALIZED) { return m_cachedStaticImgId; } m_cachedStaticImgId = objVis->getStaticImageIndexByAngle(angle); m_cachedStaticImgAngle = angle; return m_cachedStaticImgId; } void RenderItem::setAnimationOverlay(std::vector* ao, std::vector* aco) { if (!m_overlay) { m_overlay = new OverlayData(); } m_overlay->animationOverlayImages = ao; m_overlay->animationColorOverlays = aco; } std::vector* RenderItem::getAnimationOverlay() const { if (m_overlay) { return m_overlay->animationOverlayImages; } return NULL; } std::vector* RenderItem::getAnimationColorOverlay() const { if (m_overlay) { return m_overlay->animationColorOverlays; } return NULL; } void RenderItem::setColorOverlay(OverlayColors* co) { if (!m_overlay) { m_overlay = new OverlayData(); } m_overlay->colorOverlay = co; } OverlayColors* RenderItem::getColorOverlay() const { if (m_overlay) { return m_overlay->colorOverlay; } return NULL; } void RenderItem::deleteOverlayData() { if (m_overlay) { delete m_overlay; m_overlay = 0; } } void RenderItem::reset() { instance = 0; dimensions = Rect(); image.reset(); transparency = 255; currentFrame = -1; m_cachedStaticImgId = STATIC_IMAGE_NOT_INITIALIZED; deleteOverlayData(); } } fifengine-0.4.2/engine/core/view/renderitem.h000066400000000000000000000104731341615052600211350ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_VIEW_RENDERITEM_H #define FIFE_VIEW_RENDERITEM_H // Standard C++ library includes #include // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "visual.h" namespace FIFE { class Instance; class OverlayData { public: OverlayData(); ~OverlayData(); // pointer to single color overlay OverlayColors* colorOverlay; // pointer to vector that holds animation overlay images std::vector* animationOverlayImages; // pointer to vector that holds color overlays for animation overlay std::vector* animationColorOverlays; }; class RenderItem { public: RenderItem(Instance* parent); ~RenderItem(); Instance* instance; /** Returns closest matching static image for given angle * @return id for static image * @see ObjectVisual::getStaticImageIndexByAngle */ int32_t getStaticImageIndexByAngle(uint32_t angle, Instance* instance); /** Sets AnimationOverlay and if available AnimationOverlayColors. * Note: Ownership of the vectors do change. */ void setAnimationOverlay(std::vector* ao, std::vector* aco); /** Returns pointer to AnimationOverlay vector. * Returns 0 if no OverlayData or AnimationOverlay exists. */ std::vector* getAnimationOverlay() const; /** Returns pointer to AnimationColorOverlay vector. * Returns 0 if no OverlayData or AnimationColorOverlay exists. */ std::vector* getAnimationColorOverlay() const; /** Sets single ColorOverlay. * Note: Ownership does not change. */ void setColorOverlay(OverlayColors* co); /** Returns pointer to single ColorOverlay. * Returns 0 if no OverlayData or ColorOverlay exists. */ OverlayColors* getColorOverlay() const; /** Deletes OverlayData. */ void deleteOverlayData(); /** Resets the important values. */ void reset(); // point where instance was drawn during the previous render DoublePoint3D screenpoint; // dimensions of this visual on the virtual screen Rect bbox; // dimensions of this visual during the previous render Rect dimensions; // z value for sorting or depth buffer rendering float vertexZ; // image used during previous render ImagePtr image; // current facing angle int32_t facingAngle; // current transparency uint8_t transparency; // current frame index (e.g. needed for action frame) int32_t currentFrame; // pointer to overlay data class OverlayData* m_overlay; private: int32_t m_cachedStaticImgId; int32_t m_cachedStaticImgAngle; }; typedef std::vector RenderList; } #endif fifengine-0.4.2/engine/core/view/visual.cpp000066400000000000000000000270171341615052600206370ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "util/log/logger.h" #include "util/base/exception.h" #include "model/structures/instance.h" #include "model/metamodel/object.h" #include "model/metamodel/action.h" #include "visual.h" namespace FIFE { /** Logger to use for this source file. * @relates Logger */ static Logger _log(LM_VIEW); OverlayColors::OverlayColors() { } OverlayColors::OverlayColors(ImagePtr image): m_image(image) { } OverlayColors::OverlayColors(AnimationPtr animation): m_animation(animation) { } OverlayColors::~OverlayColors() { } void OverlayColors::setColorOverlayImage(ImagePtr image) { m_image = image; } ImagePtr OverlayColors::getColorOverlayImage() { return m_image; } void OverlayColors::setColorOverlayAnimation(AnimationPtr animation) { m_animation = animation; } AnimationPtr OverlayColors::getColorOverlayAnimation() { return m_animation; } void OverlayColors::changeColor(const Color& source, const Color& target) { std::pair::iterator, bool> inserter = m_colorMap.insert(std::make_pair(source, target)); if (!inserter.second) { Color& c = inserter.first->second; c.set(target.getR(), target.getG(), target.getB(), target.getAlpha()); } } const std::map& OverlayColors::getColors() { return m_colorMap; } void OverlayColors::resetColors() { m_colorMap.clear(); } Visual2DGfx::Visual2DGfx() { } Visual2DGfx::~Visual2DGfx() { } ObjectVisual::ObjectVisual() { } ObjectVisual* ObjectVisual::create(Object* object) { if (object->getVisual()) { throw Duplicate("Object already contains visualization"); } ObjectVisual* v = new ObjectVisual(); object->adoptVisual(v); return v; } ObjectVisual::~ObjectVisual() { } void ObjectVisual::addStaticImage(uint32_t angle, int32_t image_index) { m_angle2img[angle % 360] = image_index; } int32_t ObjectVisual::getStaticImageIndexByAngle(int32_t angle) { int32_t closestMatch = 0; return getIndexByAngle(angle, m_angle2img, closestMatch); } void ObjectVisual::addStaticColorOverlay(uint32_t angle, const OverlayColors& colors) { OverlayColors t = colors; m_map[angle % 360] = angle % 360; std::pair inserter = m_colorOverlayMap.insert(std::make_pair(angle % 360, colors)); if (!inserter.second) { OverlayColors tmp = colors; OverlayColors& c = inserter.first->second; c.setColorOverlayImage(tmp.getColorOverlayImage()); const std::map& colorMap = tmp.getColors(); std::map::const_iterator it = colorMap.begin(); for (; it != colorMap.end(); ++it) { c.changeColor(it->first, it->second); } } } OverlayColors* ObjectVisual::getStaticColorOverlay(int32_t angle) { if (m_colorOverlayMap.empty()) { return 0; } int32_t closestMatch = 0; return &m_colorOverlayMap[getIndexByAngle(angle, m_map, closestMatch)]; } void ObjectVisual::removeStaticColorOverlay(int32_t angle) { if (m_colorOverlayMap.empty()) { return; } int32_t closestMatch = 0; int32_t index = getIndexByAngle(angle, m_map, closestMatch); m_colorOverlayMap.erase(index); m_map.erase(index); } int32_t ObjectVisual::getClosestMatchingAngle(int32_t angle) { int32_t closestMatch = 0; getIndexByAngle(angle, m_angle2img, closestMatch); return closestMatch; } void ObjectVisual::getStaticImageAngles(std::vector& angles) { angles.clear(); type_angle2id::const_iterator i(m_angle2img.begin()); while (i != m_angle2img.end()) { angles.push_back(i->first); ++i; } } InstanceVisual::InstanceVisual(): m_transparency(0), m_visible(true), m_stackposition(0), m_instance(NULL) { } InstanceVisual* InstanceVisual::create(Instance* instance) { if (instance->getVisual()) { throw Duplicate("Instance already contains visualization"); } InstanceVisual* v = new InstanceVisual(); instance->setVisual(v); v->m_instance = instance; return v; } InstanceVisual::~InstanceVisual() { } void InstanceVisual::setTransparency(uint8_t transparency) { if (m_transparency != transparency) { m_transparency = transparency; m_instance->callOnTransparencyChange(); } } uint8_t InstanceVisual::getTransparency() { return m_transparency; } void InstanceVisual::setVisible(bool visible) { if (m_visible != visible) { m_visible = visible; m_instance->callOnVisibleChange(); } } bool InstanceVisual::isVisible() { return m_visible; } void InstanceVisual::setStackPosition(int32_t stackposition) { if (m_stackposition != stackposition) { m_stackposition = stackposition; m_instance->callOnStackPositionChange(); } } int32_t InstanceVisual::getStackPosition() { return m_stackposition; } ActionVisual::ActionVisual(): m_animation_map(), m_map() { } ActionVisual* ActionVisual::create(Action* action) { if (action->getVisual()) { throw Duplicate("Action already contains visualization"); } ActionVisual* v = new ActionVisual(); action->adoptVisual(v); return v; } ActionVisual::~ActionVisual() { } void ActionVisual::addAnimation(uint32_t angle, AnimationPtr animationptr) { m_animation_map[angle % 360] = animationptr; m_map[angle % 360] = angle % 360; } AnimationPtr ActionVisual::getAnimationByAngle(int32_t angle) { int32_t closestMatch = 0; return m_animation_map[getIndexByAngle(angle, m_map, closestMatch)]; } void ActionVisual::addAnimationOverlay(uint32_t angle, int32_t order, AnimationPtr animationptr) { std::map& orderMap = m_animationOverlayMap[angle % 360]; m_map[angle % 360] = angle % 360; orderMap.insert(std::pair(order, animationptr)); } std::map ActionVisual::getAnimationOverlay(int32_t angle) { int32_t closestMatch = 0; return m_animationOverlayMap[getIndexByAngle(angle, m_map, closestMatch)]; } void ActionVisual::removeAnimationOverlay(uint32_t angle, int32_t order) { if (m_animationOverlayMap.empty()) { return; } int32_t closestMatch = 0; AngleAnimationOverlayMap::iterator it = m_animationOverlayMap.find(getIndexByAngle(angle, m_map, closestMatch)); if (it != m_animationOverlayMap.end()) { it->second.erase(order); if (it->second.empty()) { m_animationOverlayMap.erase(it); } } } void ActionVisual::addColorOverlay(uint32_t angle, const OverlayColors& colors) { m_map[angle % 360] = angle % 360; std::pair inserter = m_colorOverlayMap.insert(std::make_pair(angle % 360, colors)); if (!inserter.second) { OverlayColors tmp = colors; OverlayColors& c = inserter.first->second; c.setColorOverlayAnimation(tmp.getColorOverlayAnimation()); const std::map& colorMap = tmp.getColors(); std::map::const_iterator it = colorMap.begin(); for (; it != colorMap.end(); ++it) { c.changeColor(it->first, it->second); } } } OverlayColors* ActionVisual::getColorOverlay(int32_t angle) { if (m_colorOverlayMap.empty()) { return 0; } int32_t closestMatch = 0; int32_t index = getIndexByAngle(angle, m_map, closestMatch); if (m_colorOverlayMap.find(index) == m_colorOverlayMap.end()) { return 0; } return &m_colorOverlayMap[getIndexByAngle(angle, m_map, closestMatch)]; } void ActionVisual::removeColorOverlay(int32_t angle) { if (m_colorOverlayMap.empty()) { return; } int32_t closestMatch = 0; int32_t index = getIndexByAngle(angle, m_map, closestMatch); m_colorOverlayMap.erase(index); } void ActionVisual::addColorOverlay(uint32_t angle, int32_t order, const OverlayColors& colors) { std::map& orderMap = m_colorAnimationOverlayMap[angle % 360]; m_map[angle % 360] = angle % 360; std::pair::iterator, bool> inserter = orderMap.insert(std::make_pair(order, colors)); if (!inserter.second) { OverlayColors tmp = colors; OverlayColors& c = inserter.first->second; c.setColorOverlayAnimation(tmp.getColorOverlayAnimation()); const std::map& colorMap = tmp.getColors(); std::map::const_iterator it = colorMap.begin(); for (; it != colorMap.end(); ++it) { c.changeColor(it->first, it->second); } } } OverlayColors* ActionVisual::getColorOverlay(int32_t angle, int32_t order) { if (m_colorAnimationOverlayMap.empty()) { return 0; } int32_t closestMatch = 0; AngleColorAnimationOverlayMap::iterator it = m_colorAnimationOverlayMap.find(getIndexByAngle(angle, m_map, closestMatch)); if (it != m_colorAnimationOverlayMap.end()) { std::map::iterator sit = it->second.find(order); if (sit != it->second.end()) { return &it->second[order]; } } return 0; } void ActionVisual::removeColorOverlay(int32_t angle, int32_t order) { if (m_colorAnimationOverlayMap.empty()) { return; } int32_t closestMatch = 0; AngleColorAnimationOverlayMap::iterator it = m_colorAnimationOverlayMap.find(getIndexByAngle(angle, m_map, closestMatch)); if (it != m_colorAnimationOverlayMap.end()) { it->second.erase(order); if (it->second.empty()) { m_colorAnimationOverlayMap.erase(it); } } } void ActionVisual::getActionImageAngles(std::vector& angles) { angles.clear(); type_angle2id::const_iterator i(m_map.begin()); while (i != m_map.end()) { angles.push_back(i->first); ++i; } } void ActionVisual::convertToOverlays(bool color) { bool colorOverlay = color && !m_colorOverlayMap.empty(); type_angle2id::const_iterator it = m_map.begin(); for (; it != m_map.end(); ++it) { addAnimationOverlay(it->first, 0, getAnimationByAngle(it->first)); if (colorOverlay) { OverlayColors* oldC = getColorOverlay(it->first); if (oldC) { OverlayColors c = OverlayColors(*oldC); addColorOverlay(it->first, 0, c); } } } } } fifengine-0.4.2/engine/core/view/visual.h000066400000000000000000000236171341615052600203060ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FIFE_VIEW_VISUAL_H #define FIFE_VIEW_VISUAL_H // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "model/metamodel/ivisual.h" #include "util/math/angles.h" #include "util/structures/rect.h" #include "video/animation.h" #include "video/color.h" namespace FIFE { class Object; class Instance; class Action; class Image; class OverlayColors { public: /** Constructors */ OverlayColors(); OverlayColors(ImagePtr image); OverlayColors(AnimationPtr animation); /** Destructor */ ~OverlayColors(); void setColorOverlayImage(ImagePtr image); ImagePtr getColorOverlayImage(); void setColorOverlayAnimation(AnimationPtr animation); AnimationPtr getColorOverlayAnimation(); void changeColor(const Color& source, const Color& target); const std::map& getColors(); void resetColors(); private: std::map m_colorMap; ImagePtr m_image; AnimationPtr m_animation; }; /** Base class for all 2 dimensional visual classes * Visual classes are extensions to visualize the stuff in model (e.g. instances) * The reason why its separated is to keep model view-agnostic, so that we could * have e.g. 3d, 2d and character based visualizations to the same data */ class Visual2DGfx: public IVisual { public: /** Destructor */ virtual ~Visual2DGfx(); protected: /** Constructor */ Visual2DGfx(); }; /** Object visual contains data that is needed for visualizing objects */ class ObjectVisual: public Visual2DGfx { public: /** Constructs and assigns it to the passed item */ static ObjectVisual* create(Object* object); /** Destructor */ virtual ~ObjectVisual(); /** Adds new static image with given angle (degrees) * Static images are used in case there are no actions active in the instance * There can be several static images for different angles, that are used in * case view / layer is rotated * In case there are no exact matches for current view angles, closest one is used * @param angle angle for image. 0 degrees starts from right and turns counter-clockwise * (normal math notation) @param image_index index of image to use for given degress */ void addStaticImage(uint32_t angle, int32_t image_index); /** Returns closest matching static image for given angle * @return id for static image */ int32_t getStaticImageIndexByAngle(int32_t angle); /** Adds new static color overlay with given angle (degrees). */ void addStaticColorOverlay(uint32_t angle, const OverlayColors& colors); /** Returns closest matching static color overlay for given angle * @return pointer to OverlayColor class */ OverlayColors* getStaticColorOverlay(int32_t angle); /** Removes a static color overlay with given angle (degrees). */ void removeStaticColorOverlay(int32_t angle); /** Returns closest matching image angle for given angle * @return closest matching angle */ int32_t getClosestMatchingAngle(int32_t angle); /** Returns list of available static image angles for this object */ void getStaticImageAngles(std::vector& angles); /** Indicates if there exists a color overlay. */ bool isColorOverlay() { return !m_colorOverlayMap.empty(); } private: /** Constructor */ ObjectVisual(); type_angle2id m_angle2img; typedef std::map AngleColorOverlayMap; AngleColorOverlayMap m_colorOverlayMap; type_angle2id m_map; }; /** Instance visual contains data that is needed to visualize the instance on screen */ class InstanceVisual: public Visual2DGfx { public: /** Constructs and assigns it to the passed item */ static InstanceVisual* create(Instance* instance); /** Destructor */ virtual ~InstanceVisual(); /** Sets transparency value for object to be visualized * @param transparency set the transparency */ void setTransparency(uint8_t transparency); /** Gets current transparency value (0-255) * @return current transparency value */ uint8_t getTransparency(); /** Sets visibility value for object to be visualized * @param visible is object visible or not */ void setVisible(bool visible); /** Is instance visible or not * @return is instance visible or not */ bool isVisible(); /** Sets stack position of the instance * Stack position is used to define the order in which instances residing * in the same location are drawn * @param stackposition new stack position */ void setStackPosition(int32_t stackposition); /** Gets current stack position of instance * @return current stack position */ int32_t getStackPosition(); private: /** Constructor */ InstanceVisual(); uint8_t m_transparency; bool m_visible; int32_t m_stackposition; Instance* m_instance; }; /** Action visual contains data that is needed to visualize different actions on screen */ class ActionVisual: public Visual2DGfx { public: /** Constructs and assigns it to the passed item */ static ActionVisual* create(Action* action); /** Destructor */ virtual ~ActionVisual(); /** Adds new animation with given angle (degrees) */ void addAnimation(uint32_t angle, AnimationPtr animationptr); /** Gets index to animation closest to given angle * @return animation index, -1 if no animations available */ AnimationPtr getAnimationByAngle(int32_t angle); /** Adds new animation overlay with given angle (degrees) and order */ void addAnimationOverlay(uint32_t angle, int32_t order, AnimationPtr animationptr); /** Gets map with animations closest to given angle * @return animation map */ std::map getAnimationOverlay(int32_t angle); /** Removes animation overlay with given angle (degrees) and order */ void removeAnimationOverlay(uint32_t angle, int32_t order); /** Adds new color overlay with given angle (degrees) and colors. * Note: Works only for single animations not for AnimationOverlays. (order is missing) */ void addColorOverlay(uint32_t angle, const OverlayColors& colors); /** Gets OverlayColors for given angle (degrees). * @return pointer to OverlayColors or Null */ OverlayColors* getColorOverlay(int32_t angle); /** Removes color overlay with given angle (degrees). */ void removeColorOverlay(int32_t angle); /** Adds new color overlay with given angle (degrees), order and colors. * Note: Works only for AnimationOverlays. */ void addColorOverlay(uint32_t angle, int32_t order, const OverlayColors& colors); /** Gets OverlayColors for given angle (degrees) and order. * @return pointer to OverlayColors or Null */ OverlayColors* getColorOverlay(int32_t angle, int32_t order); /** Removes color overlay with given angle (degrees) and order. */ void removeColorOverlay(int32_t angle, int32_t order); /** Returns list of available angles for this Action */ void getActionImageAngles(std::vector& angles); /** Convertes animations and optional color overlay to default animation overlay. * The default order value for both is 0. The old data remain, so if you remove the animation overlay * the old plain animations and colors be used again. */ void convertToOverlays(bool color); /** Returns true if it exists a animation overlay, otherwise false. */ bool isAnimationOverlay() { return !m_animationOverlayMap.empty(); } /** Returns true if it exists a color overlay, otherwise false. */ bool isColorOverlay() { return !m_colorOverlayMap.empty() || !m_colorAnimationOverlayMap.empty(); } private: /** Constructor */ ActionVisual(); // animations associated with this action typedef std::map AngleAnimationMap; AngleAnimationMap m_animation_map; typedef std::map > AngleAnimationOverlayMap; AngleAnimationOverlayMap m_animationOverlayMap; typedef std::map AngleColorOverlayMap; AngleColorOverlayMap m_colorOverlayMap; typedef std::map > AngleColorAnimationOverlayMap; AngleColorAnimationOverlayMap m_colorAnimationOverlayMap; //need this map to use the getIndexByAngle() function in angles.h type_angle2id m_map; }; } #endif fifengine-0.4.2/engine/core/view/visual.i000066400000000000000000000105521341615052600203010ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2019 by the FIFE team * * http://www.fifengine.net * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ %module fife %{ #include "view/visual.h" %} namespace FIFE { class OverlayColors { public: OverlayColors(); OverlayColors(ImagePtr image); OverlayColors(AnimationPtr animation); ~OverlayColors(); void setColorOverlayImage(ImagePtr image); ImagePtr getColorOverlayImage(); void setColorOverlayAnimation(AnimationPtr animation); AnimationPtr getColorOverlayAnimation(); void changeColor(const Color& source, const Color& target); const std::map& getColors(); void resetColors(); }; class Visual2DGfx { public: virtual ~Visual2DGfx(); private: Visual2DGfx(); }; %apply std::vector &OUTPUT { std::vector& angles }; class ObjectVisual: public Visual2DGfx { public: static ObjectVisual* create(Object* object); virtual ~ObjectVisual(); void addStaticImage(uint32_t angle, int32_t image_index); int32_t getStaticImageIndexByAngle(int32_t angle); void addStaticColorOverlay(uint32_t angle, const OverlayColors& colors); OverlayColors* getStaticColorOverlay(int32_t angle); void removeStaticColorOverlay(int32_t angle); int32_t getClosestMatchingAngle(int32_t angle); void getStaticImageAngles(std::vector& angles); private: ObjectVisual(); }; %template(get2dGfxVisual) Object::getVisual; %clear std::vector angles; class InstanceVisual: public Visual2DGfx { public: static InstanceVisual* create(Instance* instance); virtual ~InstanceVisual(); void setTransparency(uint8_t transparency); uint8_t getTransparency(); void setVisible(bool visible); bool isVisible(); void setStackPosition(int32_t stackposition); int32_t getStackPosition(); private: InstanceVisual(); }; %template(get2dGfxVisual) Instance::getVisual; %apply std::vector &OUTPUT { std::vector& angles }; class ActionVisual: public Visual2DGfx { public: static ActionVisual* create(Action* action); virtual ~ActionVisual(); void addAnimation(uint32_t angle, AnimationPtr animationptr); AnimationPtr getAnimationByAngle(int32_t angle); void addAnimationOverlay(uint32_t angle, int32_t order, AnimationPtr animationptr); void removeAnimationOverlay(uint32_t angle, int32_t order); std::map getAnimationOverlay(int32_t angle); void addColorOverlay(uint32_t angle, const OverlayColors& colors); OverlayColors* getColorOverlay(int32_t angle); void removeColorOverlay(int32_t angle); void addColorOverlay(uint32_t angle, int32_t order, const OverlayColors& colors); OverlayColors* getColorOverlay(int32_t angle, int32_t order); void removeColorOverlay(int32_t angle, int32_t order); void getActionImageAngles(std::vector& angles); void convertToOverlays(bool color); bool isAnimationOverlay(); bool isColorOverlay(); private: ActionVisual(); }; %template(get2dGfxVisual) Action::getVisual; } fifengine-0.4.2/engine/python/000077500000000000000000000000001341615052600162405ustar00rootroot00000000000000fifengine-0.4.2/engine/python/fife/000077500000000000000000000000001341615052600171515ustar00rootroot00000000000000fifengine-0.4.2/engine/python/fife/__init__.py000066400000000000000000000000561341615052600212630ustar00rootroot00000000000000# -*- coding: utf-8 -*- __all__ = [ 'fife' ]fifengine-0.4.2/engine/python/fife/extensions/000077500000000000000000000000001341615052600213505ustar00rootroot00000000000000fifengine-0.4.2/engine/python/fife/extensions/__init__.py000066400000000000000000000002541341615052600234620ustar00rootroot00000000000000# -*- coding: utf-8 -*- __all__ = [ 'basicapplication', 'fife_compat', 'fife_timer', 'fife_utils', 'fife_settings', 'fifelog', 'pythonize', 'savers', 'loaders' ] fifengine-0.4.2/engine/python/fife/extensions/basicapplication.py000066400000000000000000000211411341615052600252260ustar00rootroot00000000000000# -*- coding: utf-8 -*- # #################################################################### # Copyright (C) 2005-2019 by the FIFE team # http://www.fifengine.net # This file is part of FIFE. # # FIFE is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the # Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # #################################################################### """ The basic application and main loop. See the L{ApplicationBase} documentation. """ from __future__ import print_function from builtins import str from builtins import object from fife import fife from fife.extensions import fifelog from fife.extensions.fife_settings import Setting class ExitEventListener(fife.IKeyListener): """ Default, rudimentary event listener. Will cause the application to quit on pressing ESC. """ def __init__(self, app): self.app = app self.engine = app.engine eventmanager = self.engine.getEventManager() #eventmanager.setNonConsumableKeys([fife.Key.ESCAPE]) fife.IKeyListener.__init__(self) eventmanager.addKeyListener(self) self.quitRequested = False def keyPressed(self, evt): keyval = evt.getKey().getValue() if keyval == fife.Key.ESCAPE: self.app.quit() def keyReleased(self, evt): pass class ApplicationBase(object): """ ApplicationBase is an extendable class that provides a basic environment for a FIFE-based client. This kind of application base does not offer GUI support. The unextended application reads in and initializes engine settings, sets up a simple event listener, and pumps the engine while listening for a quit message. Specialized applications can modify settings.py to change initial engine settings. They can provide their own event listener by overriding L{createListener}. And they can override the L{_pump} method to define runtime behavior of the application. """ def __init__(self, setting=None): if setting: self._setting = setting else: self._setting = Setting(app_name="", settings_file="./settings.xml") self.engine = fife.Engine() self.initLogging() self.loadSettings() self.engine.init() """ we are giving users a valid screen resolution option that is supported """ screen_modes = self.engine.getDeviceCaps().getSupportedScreenModes() resolutions = list(set([(mode.getWidth(), mode.getHeight()) for mode in screen_modes])) resolutions = ["{0}x{1}".format(item[0], item[1]) for item in sorted(resolutions)[1:]] self._setting.setValidResolutions(resolutions) self.quitRequested = False self.breakRequested = False self.returnValues = [] def loadSettings(self): """ Load the settings from a python file and load them into the engine. Called in the ApplicationBase constructor. """ # get finalSetting (from the xml file, or if absent the default value) self._finalSetting = self._setting.getSettingsFromFile("FIFE", self._log) engineSetting = self.engine.getSettings() engineSetting.setDefaultFontGlyphs(self._finalSetting['FontGlyphs']) engineSetting.setDefaultFontPath(self._finalSetting['Font']) engineSetting.setDefaultFontSize(self._finalSetting['DefaultFontSize']) engineSetting.setBitsPerPixel(self._finalSetting['BitsPerPixel']) engineSetting.setInitialVolume(self._finalSetting['InitialVolume']) engineSetting.setSDLRemoveFakeAlpha(self._finalSetting['SDLRemoveFakeAlpha']) engineSetting.setGLCompressImages(self._finalSetting['GLCompressImages']) engineSetting.setGLUseFramebuffer(self._finalSetting['GLUseFramebuffer']) engineSetting.setGLUseNPOT(self._finalSetting['GLUseNPOT']) engineSetting.setGLUseMipmapping(self._finalSetting['GLUseMipmapping']) engineSetting.setGLUseMonochrome(self._finalSetting['GLUseMonochrome']) engineSetting.setGLUseDepthBuffer(self._finalSetting['GLUseDepthBuffer']) engineSetting.setGLAlphaTestValue(self._finalSetting['GLAlphaTestValue']) if self._finalSetting['GLTextureFiltering'] == 'None': engineSetting.setGLTextureFiltering(fife.TEXTURE_FILTER_NONE) elif self._finalSetting['GLTextureFiltering'] == 'Bilinear': engineSetting.setGLTextureFiltering(fife.TEXTURE_FILTER_BILINEAR) elif self._finalSetting['GLTextureFiltering'] == 'Trilinear': engineSetting.setGLTextureFiltering(fife.TEXTURE_FILTER_TRILINEAR) elif self._finalSetting['GLTextureFiltering'] == 'Anisotropic': engineSetting.setGLTextureFiltering(fife.TEXTURE_FILTER_ANISOTROPIC) (width, height) = self._finalSetting['ScreenResolution'].split('x') engineSetting.setScreenWidth(int(width)) engineSetting.setScreenHeight(int(height)) engineSetting.setRenderBackend(self._finalSetting['RenderBackend']) engineSetting.setFullScreen(self._finalSetting['FullScreen']) engineSetting.setRefreshRate(self._finalSetting['RefreshRate']) engineSetting.setDisplay(self._finalSetting['Display']) engineSetting.setVSync(self._finalSetting['VSync']) engineSetting.setVideoDriver(self._finalSetting['VideoDriver']) engineSetting.setSDLDriver(self._finalSetting['RenderDriver']) engineSetting.setLightingModel(self._finalSetting['Lighting']) engineSetting.setNativeImageCursorEnabled(self._finalSetting['NativeImageCursor']) engineSetting.setJoystickSupport(self._finalSetting['JoystickSupport']) try: engineSetting.setColorKeyEnabled(self._finalSetting['ColorKeyEnabled']) except: pass try: engineSetting.setColorKey(self._finalSetting['ColorKey'][0],self._finalSetting['ColorKey'][1],self._finalSetting['ColorKey'][2]) except: pass try: engineSetting.setWindowTitle(self._finalSetting['WindowTitle']) engineSetting.setWindowIcon(self._finalSetting['WindowIcon']) except: pass try: engineSetting.setFrameLimitEnabled(self._finalSetting['FrameLimitEnabled']) engineSetting.setFrameLimit(self._finalSetting['FrameLimit']) except: pass try: engineSetting.setMouseSensitivity(self._finalSetting['MouseSensitivity']) except: pass try: engineSetting.setMouseAccelerationEnabled(self._finalSetting['MouseAcceleration']) except: pass def initLogging(self): """ Initialize the LogManager. """ engineSetting = self.engine.getSettings() logmodules = self._setting.get("FIFE", "LogModules", ["controller"]) #log to both the console and log file self._log = fifelog.LogManager(self.engine, self._setting.get("FIFE", "LogToPrompt", False), self._setting.get("FIFE", "LogToFile", False)) self._log.setLevelFilter(self._setting.get("FIFE", "LogLevelFilter", fife.LogManager.LEVEL_DEBUG)) if logmodules: self._log.setVisibleModules(*logmodules) def createListener(self): """ This creates a default event listener, which will just close the program after pressing ESC. You should override this method to provide your own event handling. """ return ExitEventListener(self) def run(self): """ Initialize the event listener and event loop - and start it. """ eventlistener = self.createListener() self.engine.initializePumping() retval = self.mainLoop() self.engine.finalizePumping() self.engine.destroy() return retval def mainLoop(self): """ The programs main loop. Do not override this, instead provide your own L{_pump} method. You can call this recursively, e.g. to provide synchronous Dialogs :-) and break out of the current mainLoop by calling L{breakFromMainLoop}. It will return the argument passed to L{breakFromMainLoop}. """ self.returnValues.append(None) while not self.quitRequested: try: self.engine.pump() except fife.Exception as e: print(str(e)) self.quitRequested = True self._pump() if self.breakRequested: self.breakRequested = False break return self.returnValues.pop() def breakFromMainLoop(self,returnValue): """ Break from the currently running L{mainLoop}. The passed argument will be returned by the mainLoop. """ self.returnValues[-1] = returnValue self.breakRequested = True def _pump(self): """ Application pump. Derived classes can specialize this for unique behavior. This is called every frame. """ def quit(self): """ Quit the application. Really! """ self.quitRequested = True fifengine-0.4.2/engine/python/fife/extensions/cegui/000077500000000000000000000000001341615052600224445ustar00rootroot00000000000000fifengine-0.4.2/engine/python/fife/extensions/cegui/__init__.py000066400000000000000000000000021341615052600245450ustar00rootroot00000000000000 fifengine-0.4.2/engine/python/fife/extensions/cegui/ceguibasicapplication.py000066400000000000000000000113501341615052600273400ustar00rootroot00000000000000# -*- coding: utf-8 -*- # #################################################################### # Copyright (C) 2005-2019 by the FIFE team # http://www.fifengine.net # This file is part of FIFE. # # FIFE is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the # Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # #################################################################### """ The basic application and main loop. See the L{ApplicationBase} documentation. """ from builtins import map from fife import fife from fife.extensions.basicapplication import ApplicationBase import PyCEGUI class CEGUIEventListener(fife.IKeyListener, fife.ICommandListener): """ Default, rudimentary event listener. Will cause the application to quit on pressing ESC. """ def __init__(self, app): self.app = app self.engine = app.engine eventmanager = self.engine.getEventManager() #eventmanager.setNonConsumableKeys([fife.Key.ESCAPE]) fife.IKeyListener.__init__(self) eventmanager.addKeyListener(self) fife.ICommandListener.__init__(self) eventmanager.addCommandListener(self) self.quitrequested = False self.debuggeractive = False def keyPressed(self, evt): keyval = evt.getKey().getValue() if keyval == fife.Key.ESCAPE: self.app.quit() def keyReleased(self, evt): pass def onCommand(self, command): if command.getCommandType() == fife.CMD_QUIT_GAME: self.quitrequested = True command.consume() DEFAULT_GUI_DIR = "gui/" class CEGUIApplicationBase(ApplicationBase): def __init__(self, setting=None): super(CEGUIApplicationBase, self).__init__(setting) self._initGuiManager() self._loadCEGuiSettings() def _initGuiManager(self): settings = self.engine.getSettings() major_v, minor_v = list(map(int, PyCEGUI.Version__.split('.')[:2])) #For CEGUI versions lower than 0.8.0 we use the old CEGuiManager if major_v == 0 and minor_v <= 7: guimanager = fife.CEGuiManager() else: guimanager = fife.CEGuiManager() #transfer ownership to the engine guimanager.thisown = 0 self.guimanager = guimanager self.engine.setGuiManager(self.guimanager) self.engine.getEventManager().addSdlEventListener(self.guimanager) def _loadCEGuiSettings(self): self._loadResourcePaths() def _loadResourcePaths(self): resourceprovider = PyCEGUI.System.getSingleton().getResourceProvider() major_v, minor_v = list(map(int, PyCEGUI.Version__.split('.')[:2])) if major_v == 0 and minor_v <= 7: resourcetypemap = { "schemes" : PyCEGUI.Scheme.setDefaultResourceGroup, "imagesets" : PyCEGUI.Imageset.setDefaultResourceGroup, "fonts" : PyCEGUI.Font.setDefaultResourceGroup, "layouts" : PyCEGUI.WindowManager.setDefaultResourceGroup, "looksnfeels" : PyCEGUI.WidgetLookManager.setDefaultResourceGroup, } else: resourcetypemap = { "schemes" : PyCEGUI.Scheme.setDefaultResourceGroup, "imagesets" : PyCEGUI.ImageManager.setImagesetDefaultResourceGroup, "fonts" : PyCEGUI.Font.setDefaultResourceGroup, "layouts" : PyCEGUI.WindowManager.setDefaultResourceGroup, "looksnfeels" : PyCEGUI.WidgetLookManager.setDefaultResourceGroup, } if not self._setting: for restype, res_setfunc in resourcetypemap.items(): resourceprovider.setResourceGroupDirectory(restype, DEFAULT_GUI_DIR + restype) res_setfunc(restype) else: for restype, res_setfunc in resourcetypemap.items(): path = self._setting.get("CEGUI", restype) if path: resourceprovider.setResourceGroupDirectory(restype, path) res_setfunc(restype) else: #set default path resourceprovider.setResourceGroupDirectory(restype, DEFAULT_GUI_DIR + restype) res_setfunc(restype) parser = PyCEGUI.System.getSingleton().getXMLParser() if parser.isPropertyPresent("SchemaDefaultResourceGroup"): path = self._setting.get("CEGUI", "schemas") if path: rp.setResourceGroupDirectory("schemas", path) else: rp.setResourceGroupDirectory("schemas", DEFAULT_GUI_DIR + "schemas") parser.setProperty("SchemaDefaultResourceGroup", "schemas") def createListener(self): self._listener = CEGUIEventListener(self) return self._listener fifengine-0.4.2/engine/python/fife/extensions/fife_compat.py000066400000000000000000000052661341615052600242070ustar00rootroot00000000000000# -*- coding: utf-8 -*- # #################################################################### # Copyright (C) 2005-2019 by the FIFE team # http://www.fifengine.net # This file is part of FIFE. # # FIFE is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the # Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # #################################################################### """ FIFE Backwards Combatibility Layer ================================== This module can be imported if you want to run code that wasn't adapted to API changes in FIFE. 2008.1 ------ - Animation.addFrame now expects a fife.ResourcePtr instead of an fife.Image - Pool.getIndex is just an alias for Pool.addResourceFromFile. - EventManager.setNonConsumableKeys is superseeded by EventManager.setKeyFilter """ from __future__ import print_function from fife import fife # Utility functions def deprecated(revision,message): print("fife_compat: Deprecation warning - See revision %d " % revision) print(" - ",message) def this_is_deprecated(func,revision=0,message=None): if message is None: message = repr(func) + " is deprecated." def wrapped_func(*args,**kwargs): deprecated(revision,message) return func(*args,**kwargs) return wrapped_func def _compat_NonConsumableKeys(): class CompatKeyFilter(fife.IKeyFilter): def __init__(self, keys): fife.IKeyFilter.__init__(self) self.keys = keys def isFiltered(self, event): return event.getKey().getValue() in self.keys def _setNonConsumableKeys(self,keys): deprecated(2636, "Write an IKeyFilter instead of using EventManager.setNonConsumableKeys.\n" + "You probably don't need it anyway") self.compat_keyfilter = CompatKeyFilter(keys) self.compat_keyfilter.__disown__() self.setKeyFilter(self.compat_keyfilter) def _getNonConsumableKeys(self,keys): deprecated(2636, "Write an IKeyFilter instead of using EventManager.getNonConsumableKeys.") return self.compat_keyfilter.keys fife.EventManager.setNonConsumableKeys = _setNonConsumableKeys fife.EventManager.getNonConsumableKeys = _getNonConsumableKeys _compat_NonConsumableKeys() fifengine-0.4.2/engine/python/fife/extensions/fife_settings.py000066400000000000000000000536551341615052600245710ustar00rootroot00000000000000# -*- coding: utf-8 -*- # #################################################################### # Copyright (C) 2005-2019 by the FIFE team # http://www.fifengine.net # This file is part of FIFE. # # FIFE is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the # Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # #################################################################### """ Settings ================================== This module provides a nice framework for loading and saving game settings. It is by no means complete but it does provide a good starting point. """ from future import standard_library standard_library.install_aliases() from builtins import str from builtins import range from builtins import object import shutil import os from io import StringIO from fife.extensions import fifelog from fife.extensions.fife_utils import getUserDataDirectory from fife.extensions.serializers.simplexml import SimpleXMLSerializer FIFE_MODULE = "FIFE" class Setting(object): """ This class manages loading and saving of game settings. Usage:: from fife.extensions.fife_settings import Setting settings = Setting(app_name="myapp") screen_width = settings.get("FIFE", "ScreenWidth", 1024) screen_height = settings.get("FIFE", "ScreenHeight", 768) """ def __init__(self, app_name="", settings_file="", default_settings_file= "settings-dist.xml", copy_dist=True, serializer=None): r""" Initializes the Setting object. @param app_name: The applications name. If this parameter is provided alone it will try to read the settings file from the users home directory. In windows this will be something like: C:\Documents and Settings\user\Application Data\fife @type app_name: C{string} @param settings_file: The name of the settings file. If this parameter is provided it will look for the setting file as you specify it, first looking in the working directory. It will NOT look in the users home directory. @type settings_file: C{string} @param default_settings_file: The name of the default settings file. If the settings_file does not exist this file will be copied into the place of the settings_file. This file must exist in the root directory of your project! @type default_settings_file: C{string} @param copy_dist: Copies the default settings file to the settings_file location. If this is False it will create a new empty setting file. @param serializer: Overrides the default XML serializer @type serializer: C{SimpleSerializer} """ self._app_name = app_name self._settings_file = settings_file self._default_settings_file = default_settings_file # Holds SettingEntries self._entries = {} if self._settings_file == "": self._settings_file = "settings.xml" self._appdata = getUserDataDirectory("fife", self._app_name) else: self._appdata = os.path.dirname(self._settings_file) self._settings_file = os.path.basename(self._settings_file) if not os.path.exists(os.path.join(self._appdata, self._settings_file)): if os.path.exists(self._default_settings_file) and copy_dist: shutil.copyfile(self._default_settings_file, os.path.join(self._appdata, self._settings_file)) # valid values possible for the engineSettings self._validSetting = {} self._validSetting['FIFE'] = { 'FullScreen':[True,False], 'RefreshRate':[0,200], 'Display':[0,9], 'VSync':[True,False], 'PychanDebug':[True,False] , 'ProfilingOn':[True,False], 'SDLRemoveFakeAlpha':[True,False], 'GLCompressImages':[False,True], 'GLUseFramebuffer':[False,True], 'GLUseNPOT':[False,True], 'GLUseMipmapping':[False,True], 'GLTextureFiltering':['None', 'Bilinear', 'Trilinear', 'Anisotropic'], 'GLUseMonochrome':[False,True], 'GLUseDepthBuffer':[False,True], 'GLAlphaTestValue':[0.0,1.0], 'RenderBackend':['OpenGL', 'SDL'], 'ScreenResolution':['640x480', '800x600', '1024x600', '1024x768', '1280x768', '1280x800', '1280x960', '1280x1024', '1366x768', '1440x900', '1600x900', '1600x1200', '1680x1050', '1920x1080', '1920x1200'], 'BitsPerPixel':[0,16,24,32], 'InitialVolume':[0.0,10.0], 'WindowTitle':"", 'WindowIcon':"", 'Font':"", 'FontGlyphs':"", 'DefaultFontSize':"", 'Lighting':[0,1], 'ColorKeyEnabled':[True,False], 'ColorKey':['a','b','c'], 'VideoDriver':"", 'RenderDriver':"", 'PlaySounds':[True,False], 'LogToFile':[True,False], 'LogToPrompt':[True,False], 'LogLevelFilter':[0,1,2,3], 'LogModules':['all', 'controller','script','video','audio','loaders','vfs','pool','view','model','metamodel','event_channel','xml'], 'FrameLimitEnabled':[True,False], 'FrameLimit':[0], 'MouseSensitivity':[0.0], 'MouseAcceleration':[True,False], 'NativeImageCursor':[True,False], 'JoystickSupport':[True, False] } glyphDft = " abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.,!?-+/():;%&`'*#=[]\\\"" # we at this point assume default values are final values for engineSettings self._defaultSetting = {} self._defaultSetting['FIFE'] = { 'FullScreen':False, 'RefreshRate':60, 'Display':0, 'VSync':False, 'PychanDebug':False, 'ProfilingOn':False, 'SDLRemoveFakeAlpha':False, 'GLCompressImages':False, 'GLUseFramebuffer':True, 'GLUseNPOT':True, 'GLUseMipmapping':False, 'GLTextureFiltering':'None', 'GLUseMonochrome':False, 'GLUseDepthBuffer':False, 'GLAlphaTestValue':0.3, 'RenderBackend':'OpenGL', 'ScreenResolution':"1024x768", 'BitsPerPixel':0, 'InitialVolume':5.0, 'WindowTitle':"", 'WindowIcon':"", 'Font':"", 'FontGlyphs':glyphDft, 'DefaultFontSize':12, 'Lighting':0, 'ColorKeyEnabled':False, 'ColorKey':[255,0,255], 'VideoDriver':"", 'RenderDriver':"", 'PlaySounds':True, 'LogToFile':False, 'LogToPrompt':False,'LogLevelFilter':0, 'LogModules':['controller','script'], 'FrameLimitEnabled':False, 'FrameLimit':60, 'MouseSensitivity':0.0, 'MouseAcceleration':False, 'NativeImageCursor':False, 'JoystickSupport':False } # has the settings file been read self._readSettingsCompleted = {} # the global dictionary from which we will read after self._readSettingsCompleted is True self._settingsFromFile = {} # the logger needed to write in log file. It will be initialized in this file when self.getSettings() # method is called by logger self._logger = None #default settings self._resolutions = self._validSetting['FIFE']['ScreenResolution'] self._renderbackends = self._validSetting['FIFE']['RenderBackend'] self._lightingmodels = self._validSetting['FIFE']['Lighting'] #Used to stylize the options gui self._gui_style = "default" #Initialize the serializer if serializer: self._serializer = serializer else: self._serializer = SimpleXMLSerializer() self.initSerializer() # if there's no FIFE module assume the settings file is broken # and replace with default settings file if "FIFE" not in self._serializer.getModuleNameList(): self.setDefaults() # Get all modules and initialize reading of them from xml file as false self._allModules = self._serializer.getModuleNameList() # print("All Module Names:",self._allModules) for module in self._allModules: self._readSettingsCompleted[module] = False self._initDefaultSettingEntries() #self.setOneSetting('FIFE','Font','fonts/FreeSans.ttf',False) #print self.getSettingsFromFile('unknownhorizons') # set all Settings in either validSetting or defaultSetting def setAllSettings(self,module,settings,validSetting = True): if validSetting: self._validSetting[module] = settings else: self._defaultSetting[module] = settings # set an entry in the validSetting or defaultSetting dictionary def setOneSetting(self,module,name,value,validSetting = True): if validSetting: self._validSetting[module][name] = value else: self._defaultSetting[module][name] = value # get all the Settings(either validSetting or defaultSetting) def getAllSettings(self,module,validSetting = True): if validSetting: return self._validSetting[module] else: return self._defaultSetting[module] # get an entry from either validSetting or defaultSetting def getOneSetting(self,module,name,validSetting = True): if validSetting: return self._validSetting[module][name] else: return self._defaultSetting[module][name] # sets valid resolution options in the settings->Resolution def setValidResolutions(self, options): if options: self._resolutions = options self.createAndAddEntry(FIFE_MODULE, "ScreenResolution", initialdata = self._resolutions, requiresrestart=True) def initSerializer(self): self._serializer.load(os.path.join(self._appdata, self._settings_file)) def _initDefaultSettingEntries(self): """Initializes the default fife setting entries. Not to be called from outside this class.""" self.createAndAddEntry(FIFE_MODULE, "PlaySounds", requiresrestart=True) self.createAndAddEntry(FIFE_MODULE, "FullScreen", requiresrestart=True) self.createAndAddEntry(FIFE_MODULE, "ScreenResolution", initialdata = self._resolutions, requiresrestart=True) self.createAndAddEntry(FIFE_MODULE, "RenderBackend", initialdata = self._renderbackends, requiresrestart=True) def createAndAddEntry(self, module, name, applyfunction=None, initialdata=None, requiresrestart=False): """" @param module: The Setting module this Entry belongs to @type module: C{String} @param name: The Setting's name @type name: C{String} @param applyfunction: function that makes the changes when the Setting is saved @type applyfunction: C{function} @param initialdata: If the widget supports the setInitialData() function this can be used to set the initial data @type initialdata: C{String} or C{Boolean} @param requiresrestart: Whether or not the changing of this setting requires a restart @type requiresrestart: C{Boolean} """ entry = SettingEntry(module, name, applyfunction, initialdata, requiresrestart) self.addEntry(entry) def addEntry(self, entry): """Adds a new C{SettingEntry} to the Settting @param entry: A new SettingEntry that is to be added @type entry: C{SettingEntry} """ if entry.module not in self._entries: self._entries[entry.module] = {} self._entries[entry.module][entry.name] = entry """ # Make sure the new entry is available if self.get(entry.module, entry.name) is None: print "Updating", self._settings_file, "to the default, it is missing the entry:"\ , entry.name ,"for module", entry.module #self.setDefaults() if self.get(entry.module, entry.name) is None: print "WARNING:", entry.module, ":", entry.name, "still not found!" """ def saveSettings(self, filename=""): """ Writes the settings to the settings file @param filename: Specifies the file to save the settings to. If it is not specified the original settings file is used. @type filename: C{string} """ if self._serializer: if filename == "": self._serializer.save(os.path.join(self._appdata, self._settings_file)) else: self._serializer.save(filename) # get all the settings of a module name module def getSettingsFromFile(self, module, logger=None): if self._serializer: self._logger = logger modules = self._serializer.getModuleNameList() self._settingsFromFile[module] = self._serializer.getAllSettings(module) if self._logger: self._logger.log_log("Loading Settings From File ...") if self._settingsFromFile[module] is not None: self._readSettingsCompleted[module] = True # we need validation for the module FIFE only if module is not "FIFE": return self._settingsFromFile[module] """ Now we have all the settings we needed. We have to validate the settings. Applicable for module FIFE only """ for name in self._settingsFromFile[module]: # if the setting name is known, so that it is # both in self._settingsFromFile and validSetting if name in self._validSetting[module]: e_value = self._settingsFromFile[module][name] if name == "InitialVolume": if e_value >= self._validSetting[module][name][0] and e_value <= self._validSetting[module][name][1]: self._settingsFromFile[module][name] = e_value else: if self._logger: self._logger.log_log("InitalVolume must have a value between 0.0 and 10.0") elif name == "GLAlphaTestValue": if e_value >= self._validSetting[module][name][0] and e_value <= self._validSetting[module][name][1]: self._settingsFromFile[module][name] = e_value else: if self._logger: self._logger.log_log("GLAlphaTestValue must have a value between 0.0 and 1.0") elif name == "ColorKey": e_value = e_value.split(',') if int(e_value[0]) in range(0,256) and int(e_value[1]) in range(0,256) and int(e_value[2]) in range(0,256): self._settingsFromFile[name] = [int(e_value[0]),int(e_value[1]),int(e_value[2])]; else: if self._logger: self._logger.log_log("ColorKey values must be within 0 and 255. Setting to Default Value.") elif name == "ScreenResolution": temp = e_value.split('x') if len(temp) == 2: self._settingsFromFile[module][name]=e_value else: if self._logger: self._logger.log_log("Invalid Screen Resolution value. We expect two integer separated by x") elif len(self._validSetting[module][name]) == 0: self._settingsFromFile[module][name] = e_value elif name == "LogModules": for checking_element in e_value: module_valid = False for base_element in self._validSetting[module][name]: # checking_element is valid if checking_element == base_element: module_valid = True already_in = False for element in self._settingsFromFile[module][name]: if element == checking_element: already_in = True if already_in == False: self._settingsFromFile[module][name].append(checking_element) if module_valid == False: if self._logger: self._logger.log_log(checking_element +" is not a valid logModule") elif name == "FrameLimit": if e_value > 0: self._settingsFromFile[module][name] = e_value else: if self._logger: self._logger.log_log(e_value + " is not a valid FrameLimit setting. You must specify a positive integer!") elif name == "MouseSensitivity": self._settingsFromFile[module][name] = e_value elif name == "MouseAcceleration": self._settingsFromFile[module][name] = e_value elif name == "NativeImageCursor": self._settingsFromFile[module][name] = e_value elif name == "JoystickSupport": self._settingsFromFile[module][name] = e_value elif name in ("SDLRemoveFakeAlpha", "LogToPrompt", "LogToFile"): if type(e_value) == int: try: e_value = (False, True)[e_value] except IndexError: self._logger.log_warn("Invalid int-value for %s. Defaulted to False!"%name) e_value = False self._logger.log_warn("Use of type int for %s is deprecated. Use bool instead!"%name) self._settingsFromFile[module][name] = e_value else: if isinstance(self._settingsFromFile[module][name],list) == True or isinstance(self._settingsFromFile[module][name],dict) == True: valid = False for value in self._validSetting[module][name]: if value == e_value: valid = True self._settingsFromFile[module][name] = e_value; if valid == False: if self._logger: self._logger.log_log("Setting " + name + " got invalid value. Setting to Default.") else: self._settingsFromFile[module][name] = e_value # name is unknown else: if self._logger: self._logger.log_log("Setting "+ name + " is unknown") if self._logger: self._logger.log_log("Settings Loaded ...") """ Upto this point we have validated all the settings that are in settings.xml file. But, what if a setting is valid and still it is not present in the settings.xml file. For this, we should give them the default Values that are in defaultSetting. """ for name in self._defaultSetting[module]: if name not in self._settingsFromFile[module]: self._settingsFromFile[module][name] = self._defaultSetting[module][name] return self._settingsFromFile[module] else: return None def get(self, module, name, defaultValue=None): """ Gets the value of a specified setting @param module: Name of the module to get the setting from @param name: Setting name @param defaultValue: Specifies the default value to return if the setting is not found @type defaultValue: C{str} or C{unicode} or C{int} or C{float} or C{bool} or C{list} or C{dict} """ if self._serializer: if module is "FIFE": # check whether getAllSettings has been called already if self._readSettingsCompleted[module] is not True: value = self._serializer.get(module, name, defaultValue) if value is not None: return value else: if name in self._defaultSetting[module]: return self._defaultSetting[module][name] else: raise Exception(str(name) + ' is neither in settings.xml nor it has a default value set') else: if name in self._settingsFromFile[module]: return self._settingsFromFile[module][name] else: raise Exception(str(name) + ' is neither in settings.xml nor it has a default value set') else: return self._serializer.get(module, name, defaultValue) else: """ serializer not set, reading from default value """ if name in self._defaultSetting: return self._defaultSetting[module][name] else: raise Exception(str(name) + ' is neither in settings.xml nor it has a default value set') def set(self, module, name, value, extra_attrs={}): """ Sets a setting to specified value. @param module: Module where the setting should be set @param name: Name of setting @param value: Value to assign to setting @type value: C{str} or C{unicode} or C{int} or C{float} or C{bool} or C{list} or C{dict} @param extra_attrs: Extra attributes to be stored in the XML-file @type extra_attrs: C{dict} """ #update the setting cache if module in self._settingsFromFile: self._settingsFromFile[module][name] = value else: self._settingsFromFile[module] = { name: value } if self._serializer: self._serializer.set(module, name, value, extra_attrs) def remove(self, module, name): """ Removes a variable @param module: Module where the variable should be set @param name: Name of the variable """ #update the setting cache if module in self._settingsFromFile: del self._settingsFromFile[module][name] if self._serializer: self._serializer.remove(module, name) def setAvailableScreenResolutions(self, reslist): """ A list of valid default screen resolutions. This should be called once right after you instantiate Settings. Valid screen resolutions must be strings in the form of: WIDTHxHEIGHT Example: settings.setAvailableScreenResolutions(["800x600", "1024x768"]) """ self._resolutions = reslist def setDefaults(self): """ Overwrites the setting file with the default settings file. """ shutil.copyfile(self._default_settings_file, os.path.join(self._appdata, self._settings_file)) self.changesRequireRestart = True self.initSerializer() def _getEntries(self): return self._entries def _setEntries(self, entries): self._entries = entries def _getSerializer(self): return self._serializer entries = property(_getEntries, _setEntries) serializer = property(_getSerializer) class SettingEntry(object): def __init__(self, module, name, applyfunction=None, initialdata=None, requiresrestart=False): """ @param module: The Setting module this Entry belongs to @type module: C{String} @param name: The Setting's name @type name: C{String} @param applyfunction: function that makes the changes when the Setting is saved @type applyfunction: C{function} @param initialdata: If the widget supports the setInitialData() function this can be used to set the initial data @type initialdata: C{String} or C{Boolean} @param requiresrestart: Whether or not the changing of this setting requires a restart @type requiresrestart: C{Boolean} """ self._module = module self._name = name self._requiresrestart = requiresrestart self._initialdata = initialdata self._applyfunction = applyfunction def onApply(self, data): """Implement actions that need to be taken when the setting is changed here. """ if self._applyfunction is not None: self._applyfunction(data) def _getModule(self): return self._module def _setModule(self, module): self._module = module def _getName(self): return self._name def _setName(self, name): self._name = name def _getRequiresRestart(self): return self._requiresrestart def _setRequiresRestart(self, requiresrestart): self._requiresrestart = requiresrestart def _getInitialData(self): return self._initialdata def _setInitialData(self, initialdata): self._initialdata = initialdata def _getApplyFunction(self): return self._applyfunction def _setApplyFunction(self, applyfunction): self._applyfunction = applyfunction module = property(_getModule, _setModule) name = property(_getName, _setName) requiresrestart = property(_getRequiresRestart, _setRequiresRestart) initialdata = property(_getInitialData, _setInitialData) applyfunction = property(_getApplyFunction, _setApplyFunction) def __str__(self): return "SettingEntry: " + self.name + " Module: " + self.module + \ " requiresrestart: " + str(self.requiresrestart) + \ " initialdata: " + str(self.initialdata) fifengine-0.4.2/engine/python/fife/extensions/fife_timer.py000066400000000000000000000135321341615052600240370ustar00rootroot00000000000000# -*- coding: utf-8 -*- # #################################################################### # Copyright (C) 2005-2019 by the FIFE team # http://www.fifengine.net # This file is part of FIFE. # # FIFE is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the # Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # #################################################################### """ Convenient timers ================= Usage:: import fife.extensions.fife_timer fife_timer.init( my_fife_engine.getTimeManager() ) def spam(): print "SPAM SPAM ", repeater = fife_timer.repeatCall(500,spam) def stop_spam(): repeater.stop() print "BACON EGGS AND SPAM" delayed = fife_timer.delayCall(50000,stop_spam) """ from fife import fife #global time manager _manager = None def init(timemanager): """ Initialize timers. @param timemanager: A L{fife.TimeManager} as retuned by L{fife.Engine.getTimeManager}. """ global _manager _manager = timemanager class Timer(fife.TimeEvent): """ Timer This class wraps the fife.TimeEvent class to make it easily usable from Python It allows for a TimeEvent to be executed once or multiple times. Remember FIFE::TimeManager does NOT delete the timer so make sure you keep a reference to this timer to ensure python doesnt delete the timer prematurely. """ def __init__(self,delay=0,callback=None,repeat=0): """ @param delay: The delay in milliseconds to execute the callback @param callback: The function to execute when the time delay has passed @param repeat: The number of times to execute the callback. 1=once, 0=forever """ super(Timer,self).__init__(delay) self._active = False self._callback = callback self._manager = _manager self.setPeriod(delay) self._repeat = repeat self._executed = 0 def start(self): """ Call this to start the timer. This registers the timer with the time manager. The time manger then calls the timers updateEvent() function when the delay time has passed. """ if self._active: return self._active = True self._executed = 0 self.setLastUpdateTime(self._manager.getTime()) self._manager.registerEvent(self) def stop(self): """ Stops the timer This unregisters the timer from the time manager. """ if not self._active: return self._active = False self._manager.unregisterEvent(self) def updateEvent(self,delta): """ This is called by FIFE::TimeManager when the delay has passed. Should not be called directly. """ if self._repeat != 0: self._executed += 1 if self._executed >= self._repeat: self.stop() if callable(self._callback): self._callback() def _setDelay(self, delay): """ Sets how many milliseconds to wait before executing the callback. The timer must not be active to change this value @param delay: Number of milliseconds to wait before executing the callback. @type delay: C{integer} """ if not self._active: self.setPeriod(delay) def _getDelay(self): """ Returns the number of milliseconds to wait before executing the callback. @return: Number of milliseconds. @rtype: C{integer} """ return self.getPeriod() def _setCallback(self, callback): self._callback = callback def _getCallback(self): return self._callback def _setRepeat(self, repeat): """ Sets how many times the timer should be repeated. The timer must not be active to change it's repeat value. @param repeat: Number of times to repeat the timer. 0=forever, 1=once. @type repeat: C{integer} """ if not self._active: self._repeat = repeat def _getRepeat(self, repeat): """ Returns the number of times the timer will be executed. @return: Number of times the timer will be executed. @rtype: C{integer} """ return self._repeat def _getActive(self): """ Returns True if the timer is active and False if it is not. @return: True if timer is active, False if it is not. @rtype: C{boolean} """ return self._active def _getNumExecuted(self): """ Returns the number of times the timer has been executed @return: Number of times the timer has been executed @rtype: C{integer} """ return self._executed delay = property(_getDelay, _setDelay) callback = property(_getCallback, _setCallback) repeat = property(_getRepeat, _setRepeat) active = property(_getActive) numexecuted = property(_getNumExecuted) def delayCall(delay,callback): """ Delay a function call by a number of milliseconds. Remember to keep a reference to the timer this function returns. If you do not python will delete the timer prematurely which may case a segfault. @param delay: Delay in milliseconds. @param callback: The function to call. @return: The timer. @rtype: L{Timer} """ timer = Timer(delay, callback, 1) timer.start() return timer def repeatCall(period,callback): """ Repeat a function call. The call is repeated until the timer is stopped. Remember to keep a reference to the timer this function returns. If you do not python will delete the timer prematurely which may case a segfault. @param period: Period between calls in milliseconds. @param callback: The function to call. @return: The timer. @rtype: L{Timer} """ timer = Timer(period, callback, 0) timer.start() return timer __all__ = ['init','Timer','delayCall','repeatCall'] fifengine-0.4.2/engine/python/fife/extensions/fife_utils.py000066400000000000000000000063321341615052600240570ustar00rootroot00000000000000# -*- coding: utf-8 -*- # #################################################################### # Copyright (C) 2005-2019 by the FIFE team # http://www.fifengine.net # This file is part of FIFE. # # FIFE is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the # Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # #################################################################### """ This file contains some functions that may be useful """ from builtins import str import fife, re, sys, os __all__ = ['is_fife_exc', 'getUserDataDirectory'] _exc_re = re.compile(r'_\[(\w+)\]_') def is_fife_exc(type, original_exc): """ Checks if an exception is of given type. Example:: try: obj = self.model.createObject(str(id), str(nspace), parent) except RuntimeError, e: if is_fife_exc(fife.NameClash, e): raise NameClash('Tried to create already existing object, ignoring') raise """ ret = False m = _exc_re.search(str(original_exc)) if m: if m.group(1) == type('').getTypeStr(): ret = True return ret def getUserDataDirectory(vendor, appname): """ Gets the proper location to save configuration and data files, depending on depending on OS. Windows: %APPDATA%\vendor\appname Mac: ~/Library/Application Support/vendor/appname Linux/Unix/Other: ~/.vendor/appname See: Brian Vanderburg II @ http://mail.python.org/pipermail/python-list/2008-May/660779.html """ dir = None # WINDOWS if os.name == "nt": # Try env APPDATA or USERPROFILE or HOMEDRIVE/HOMEPATH if "APPDATA" in os.environ: dir = os.environ["APPDATA"] if ((dir is None) or (not os.path.isdir(dir))) and ("USERPROFILE" in os.environ): dir = os.environ["USERPROFILE"] if os.path.isdir(os.path.join(dir, "Application Data")): dir = os.path.join(dir, "Application Data") if ((dir is None) or (not os.path.isdir(dir))) and ("HOMEDRIVE" in os.environ) and ("HOMEPATH" in os.environ): dir = os.environ["HOMEDRIVE"] + os.environ["HOMEPATH"] if os.path.isdir(os.path.join(dir, "Application Data")): dir = os.path.join(dir, "Application Data") if (dir is None) or (not os.path.isdir(dir)): dir = os.path.expanduser("~") # On windows, add vendor and app name dir = os.path.join(dir, vendor, appname) # Mac elif os.name == "mac": # ?? may not be entirely correct dir = os.path.expanduser("~") dir = os.path.join(dir, "Library", "Application Support") dir = os.path.join(dir, vendor, appname) # Unix/Linux/all others if dir is None: dir = os.path.expanduser("~") dir = os.path.join(dir, "."+vendor, appname) # Create vendor/appname folder if it doesn't exist if not os.path.isdir(dir): os.makedirs(dir) return dir fifengine-0.4.2/engine/python/fife/extensions/fifelog.py000066400000000000000000000105131341615052600233350ustar00rootroot00000000000000# -*- coding: utf-8 -*- # #################################################################### # Copyright (C) 2005-2019 by the FIFE team # http://www.fifengine.net # This file is part of FIFE. # # FIFE is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the # Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # #################################################################### from __future__ import print_function from builtins import object from fife import fife class LogManager(object): """ Log manager provides convenient apis to access engine logging functionality. You can set log targets individually (prompt, file). You can also adjust things like visible modules through log manager. """ def __init__(self, engine, promptlog=True, filelog=False): """ Constructs new log manager @param engine: Engine to hook into @param promptlog: If true, logs to prompt @param filelog: If true, logs to file (fife.log) """ self.engine = engine self.lm = engine.getLogManager() self.lm.setLogToPrompt(promptlog) self.lm.setLogToFile(filelog) self.mod2name = {} for k, v in list(fife.__dict__.items()): if k.startswith('LM_') and k not in ('LM_CORE', 'LM_MODULE_MAX'): self.mod2name[v] = self.lm.getModuleName(v) self.name2mod = dict([(v.lower(), k) for k, v in list(self.mod2name.items())]) def addVisibleModules(self, *names): """ Adds modules that are visible in logs. By default, all modules are disabled. Does not remove previously visible modules @param names: module names to set visible @see: modules.h file for available modules in the engine """ names = [n.lower() for n in names] if 'all' in names: for k in list(self.mod2name.keys()): self.lm.addVisibleModule(k) else: for m in names: try: self.lm.addVisibleModule(self.name2mod[m]) except KeyError: print('Tried to enable non-existing log module "%s"' % m) def removeVisibleModules(self, *names): """ Removes modules that are visible in logs. By default, all modules are disabled. @param names: module names to set invisible @see: addVisibleModules """ names = [n.lower() for n in names] if 'all' in names: for k in list(self.mod2name.keys()): self.lm.removeVisibleModule(k) else: for m in names: self.lm.removeVisibleModule(self.name2mod[m]) def getVisibleModules(self): """ Gets currently visible modules @see: addVisibleModules """ mods = [] for k in list(self.mod2name.keys()): if self.lm.isVisible(k): mods.append(self.mod2name[k]) def setVisibleModules(self, *names): """ Sets visible modules. Clears previously set modules. @param names: module names to set visible @see: addVisibleModules """ self.lm.clearVisibleModules() self.addVisibleModules(*names) def setLevelFilter(self, fltr): """ Sets the minimum log level to view. @param fltr: The filter level Valid values: - L{fife.LogManager.LEVEL_DEBUG} - L{fife.LogManager.LEVEL_LOG} - L{fife.LogManager.LEVEL_WARN} - L{fife.LogManager.LEVEL_ERROR} """ self.lm.setLevelFilter(fltr) def setLogToPrompt(self, promptlog): return self.lm.setLogToPrompt(promptlog) def getLogToPrompt(self): return self.lm.isLogToPrompt() logToPrompt = property(getLogToPrompt, setLogToPrompt) def setLogToFile(self, filelog): return self.lm.setLogToFile(filelog) def getLogToFile(self): return self.lm.isLogToFile() logToFile = property(getLogToFile, setLogToFile) def log_debug(self, message): self.lm.log(0, self.name2mod["script"], message) def log_log(self, message): self.lm.log(1, self.name2mod["script"], message) def log_warn(self, message): self.lm.log(2, self.name2mod["script"], message) def log_error(self, message): self.lm.log(3, self.name2mod["script"], message) fifengine-0.4.2/engine/python/fife/extensions/librocket/000077500000000000000000000000001341615052600233265ustar00rootroot00000000000000fifengine-0.4.2/engine/python/fife/extensions/librocket/__init__.py000066400000000000000000000000001341615052600254250ustar00rootroot00000000000000fifengine-0.4.2/engine/python/fife/extensions/librocket/rocketbasicapplication.py000066400000000000000000000067331341615052600304260ustar00rootroot00000000000000# -*- coding: utf-8 -*- # #################################################################### # Copyright (C) 2005-2019 by the FIFE team # http://www.fifengine.net # This file is part of FIFE. # # FIFE is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the # Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # #################################################################### """ The basic application and main loop. See the L{ApplicationBase} documentation. """ from fife import fife from fife.extensions.basicapplication import ApplicationBase import rocket class RocketEventListener(fife.IKeyListener, fife.ICommandListener): """ Default, rudimentary event listener. Will cause the application to quit on pressing ESC. """ def __init__(self, app): self.app = app self.engine = app.engine eventmanager = self.engine.getEventManager() #eventmanager.setNonConsumableKeys([fife.Key.ESCAPE]) fife.IKeyListener.__init__(self) eventmanager.addKeyListener(self) fife.ICommandListener.__init__(self) eventmanager.addCommandListener(self) self.quitrequested = False self.debuggeractive = False def keyPressed(self, evt): keyval = evt.getKey().getValue() if keyval == fife.Key.ESCAPE: self.app.quit() def keyReleased(self, evt): keyval = evt.getKey().getValue() if keyval == fife.Key.F12: if not self.debuggeractive: self.app.guimanager.showDebugger() self.debuggeractive = True else: self.app.guimanager.hideDebugger() self.debuggeractive = False def onCommand(self, command): if command.getCommandType() == fife.CMD_QUIT_GAME: self.quitrequested = True command.consume() class RocketApplicationBase(ApplicationBase): """ PychanApplicationBase is an extendable class that provides a basic environment for a FIFE-based client. This class should be extended if you 've built fife with librocket support and want to create a game using it. """ def __init__(self, setting=None): super(RocketApplicationBase, self).__init__(setting) settings = self.engine.getSettings() guimanager = fife.LibRocketManager() #transfer ownership to the engine guimanager.thisown = 0 #initialize gui manager and set it as the engine's active gui manager guimanager.init(settings.getRenderBackend(), settings.getScreenWidth(), settings.getScreenHeight()) self.engine.setGuiManager(guimanager) self.guimanager = guimanager self.engine.getEventManager().addSdlEventListener(guimanager) #get reference to the active rocket context self.rocketcontext = rocket.contexts['default'] def createListener(self): self._listener = RocketEventListener(self) return self._listener def quit(self): self.rocketcontext.UnloadAllDocuments() self.rocketcontext.UnloadAllMouseCursors() #release reference to rocket context self.rocketcontext = None #call parent's quit super(RocketApplicationBase, self).quit() fifengine-0.4.2/engine/python/fife/extensions/loaders.py000066400000000000000000000051261341615052600233570ustar00rootroot00000000000000# -*- coding: utf-8 -*- # #################################################################### # Copyright (C) 2005-2019 by the FIFE team # http://www.fifengine.net # This file is part of FIFE. # # FIFE is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the # Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # #################################################################### """ Loaders plugin manager """ from __future__ import print_function import os.path from fife import fife from fife.extensions.serializers.xmlmap import XMLMapLoader mapFileMapping = { 'xml' : XMLMapLoader} fileExtensions = set(['xml']) def loadMapFile(path, engine, callback=None, debug=True, extensions={}): """ load map file and get (an optional) callback if major stuff is done: - map creation - parsed imports - parsed layers - parsed cameras the callback will send both a string and a float (which shows the overall process), callback(string, float) @type engine: object @param engine: FIFE engine instance @type callback: function @param callback: callback for maploading progress @type debug: bool @param debug: flag to activate / deactivate print statements @rtype object @return FIFE map object """ (filename, extension) = os.path.splitext(path) map_loader = mapFileMapping[extension[1:]](engine, callback, debug, extensions) map = map_loader.loadResource(path) if debug: print("--- Loading map took: ", map_loader.time_to_load, " seconds.") return map def addMapLoader(fileExtension, loaderClass): """Add a new loader for fileextension @type fileExtension: string @param fileExtension: The file extension the loader is registered for @type loaderClass: object @param loaderClass: A fife.ResourceLoader implementation that loads maps from files with the given fileExtension """ mapFileMapping[fileExtension] = loaderClass _updateMapFileExtensions() def _updateMapFileExtensions(): global fileExtensions fileExtensions = set(mapFileMapping.keys()) fifengine-0.4.2/engine/python/fife/extensions/pychan/000077500000000000000000000000001341615052600226325ustar00rootroot00000000000000fifengine-0.4.2/engine/python/fife/extensions/pychan/__init__.py000066400000000000000000000347441341615052600247570ustar00rootroot00000000000000# -*- coding: utf-8 -*- # #################################################################### # Copyright (C) 2005-2019 by the FIFE team # http://www.fifengine.net # This file is part of FIFE. # # FIFE is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the # Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # #################################################################### """\ Pythonic Fifechan Wrapper - PyChan ================================= Pythonic GUI API. Features -------- - Simpler Interface - Very Basic XML Format support - Basic Layout Engine - Pseudo-Synchronous Dialogs. - Automagic background tiling (WIP) - Basic Styling support. - Simple Font Handling TODO ---- - Make setting parent attribute imply containment relation. - Finalize Widget.execute - Documentation ( Allways not enough :-( ) - Handle Image Fonts - Move Font config files to XML, too ... - Implement real Menus - Implement StackWidget - Then implement TabWidget - GridLayout - Table BUGS ---- - Focus problems with Widget.execute. - Font.glyph_spacing is rendered incorrectly. - Is this a bug? At least inconvenient. MouseEntered events are not distributed for freshly shown widget. - It just looks bad. Problems -------- - Reference counting problems again -sigh- ... and thus possible leaks. - High amount of code reuse -> Complex code - Needs at least new style classes and other goodies. - Missing documentation on: - Styling - ScrollArea - Fonts How to use ========== At its core you only need a few functions. After setting up FIFE you need to initialize pychan. After that you can load a GUI from an XML file. Please see the documentation of L{loadXML} for the details of the XML format :: import pychan pychan.init(fifeEngine) guiElement = pychan.loadXML("contents/gui/myform.xml") The resulting guiElement can be shown and hidden with the obvious L{widgets.Widget.show} and L{widgets.Widget.hide} methods. To get a specific widget you have to give it a name in the XML definition and use that to extract the widget from the returned GUI element. :: okButton = guiElement.findChild(name="okButton") myInput = guiElement.findChild(name="myInput") The data is extracted and set via direct attribute access. These are using the python property technique to hide behind the scenes manipulations. Please keep in mind that the Layout engine and the exact way the widgets are displayed is somewhat limited. :: myInput.text = "Blahblah" myList.items = ["1","2"] guiElement.position = (80,90) A dialog without an OK button would be futile - so here's how you hook widget events to function calls. Every widget has a L{widgets.Widget.capture} method, which will directly call the passed function when a widget event occurs. As a convenience a L{widgets.Widget.mapEvents} function will batch the L{widgets.Widget.findChild} and L{widgets.Widget.capture} calls in an obvious way. :: myButton.capture( application.quit ) guiElement.mapEvents({ 'okButton' : self.applyAndClose, 'closeButton': guiElement.hide }) Other important places to look for information: - L{widgets.Widget} - Attributes explained. - L{loadXML} - Explain the XML format. - L{widgets.layout.LayoutBase} - Working of the layout engine. Initialization, data distribution and collection ================================================ Very often a dialogs text fields, labels and listboxes have to be filled with data after the creation of the dialog. This can be a tiresome process. After a dialog has executed, B{other} attributes have to be read out again, this to can be tiresome. PyChan simplifies both processes. But it treats them as three processes. One is setting the data that will never be read out again - called B{initial data} - the text of a checkbox or the list of a listBox are good examples. The second is setting the data that is mutable by the user and may be read out again - for example the state of a checkbox or the selected index in a list. The third and final process is collection of the user-mutable data:: guiElement.distributeInitialData({ 'myListBox' : choices, 'myLabel' : map.name, }) guiElement.distributeData({ 'myTextField' : map.description }) # ... process dialog. map.description, choice = guiElement.collectData('myListBox','myTextField') print "You selected:",choice,", good choice!" See L{widgets.Widget.distributeData},L{widgets.Widget.distributeInitialData}, L{widgets.Widget.collectData} and L{widgets.Widget.collectDataAsDict}. Styling and font handling ========================= Note: These features are B{work in progress} and likely to change. A style is a set of rules for matching widgets and a set of attributes applied to them after creation. The attributes can be any of the given attributes. Matching happens currently only by the widget class name itself. As an example the following style - written as a python data structure - will set the border size of all labels to 10:: style = { 'ListBox' : { # Matches all listboxes 'border_size : 10 # After creation call lisbox.border_size = 10 } } As a convenience you can use the string B{default} to match all widget classes and thus - for example apply a common font:: style = { 'default' : { 'font' : 'console_small' } } A new style is added to pychan with L{internal.Manager.addStyle}. You can set a new default style by adding a style with the name 'default'. The font is set via a string identifier pulled from a font definition in a PyChan configuration file. You have to load these by calling L{loadFonts} in your startup code:: import pychan pychan.init( fifeEngine ) pychan.loadFonts( "content/fonts/console.xml" ) The font definition files are in XML format. Unicode and internationalisation ================================ All text that is visible and editable by the player has to be a unicode object. All text that is used internally, e.g. widget names, have to be normal strings. While PyChan will not raise an exception, if you do not follow this guideline, you are encouraged to so. You can change the way unicode encoding errors are handled by using the function L{setUnicodePolicy}. Widget hierachy =============== Every widget can be contained in another container widget like L{Window}, L{VBox}, L{HBox}, L{Container} or L{ScrollArea}. Container widgets can contain any number of widgets. Thus we have a tree like structure of the widgets - which finally makes up the window or frame that is placed on the screen. In PyChan widgets are supposed to be manipulated via the root of this hierachy, so that the actual layout can be changed in the XML files without hassle. It can be compared to how HTML works. These bits and pieces connect things up:: - name - A (hopefully) unique name in the widget hierachy - findChildren - The accessor method to find widgets by name or any other attribute. - _parent - The parent widget in the widget hierachy - deepApply - The method used to walk over the widget hierachy. You have to reimplement this in case you want to provide custom widgets. Wrapping machinery ================== The wrapping mechanism works be redirecting attribute access to the Widget derived classes to a C{real_widget} member variable which in turn is an instance of the SWIG wrapped Fifechan widget. To ensure the real widget has already been constructed, when the wrapping machinery is already in use, this has to be the first attribute to set in the constructors. This leads to a reversed construction sequence as the super classes constructor has to be invoked I{after} the subclass specific construction has taken place. """ from __future__ import print_function from __future__ import absolute_import import sys from builtins import map __all__ = [ 'loadXML', 'loadFonts', 'init', 'manager' ] # This *import should really be removed! from .widgets import * from .widgets.tabbedarea import Tab from .exceptions import * from .fonts import loadFonts ### Initialisation ### manager = None def init(engine,debug=False, compat_layout=False): """ This has to be called before any other pychan methods can be used. It sets up a manager object which is available under pychan.manager. @param engine: The FIFE engine object. @param debug: bool - Enables and disables debugging output. Default is False. @param compat_layout: bool - Enables and disables compat layout. Default is False. """ from .compat import _munge_engine_hook from .internal import Manager global manager manager = Manager(_munge_engine_hook(engine),debug,compat_layout) # XML Loader from xml.sax import saxutils, handler from traceback import print_exc def traced(f): """ Simple decorator that prints tracebacks for any exceptions occuring in a function. Useful to avoid the infamous 'finally pops bad exception' that shadows the real cause of the error ... """ def traced_f(*args,**kwargs): try: return f(*args,**kwargs) except: print_exc() raise return traced_f if sys.version_info < (3, ): class __GuiLoaderBase(object, handler.ContentHandler): pass else: class __GuiLoaderBase(handler.ContentHandler): pass class _GuiLoader(__GuiLoaderBase): def __init__(self): super(_GuiLoader,self).__init__() self.root = None self.indent = "" self.stack = [] def _printTag(self,name,attrs): if not manager.debug: return attrstrings = ['%s="%s"' % tuple(map(str,t)) for t in list(attrs.items())] tag = "<%s " % name + " ".join(attrstrings) + ">" try: print(self.indent + tag) except UnicodeEncodeError as e: print(self.indent + tag.encode('ascii', 'backslashreplace')) def _resolveTag(self,name): """ Resolve a XML Tag to a PyChan GUI class. """ cls = WIDGETS.get(name,None) if cls is None: raise GuiXMLError("Unknown GUI Element: %s" % name) return cls def _setAttr(self,obj,name,value): if not hasattr(obj.__class__,'ATTRIBUTES'): raise PyChanException("The registered widget/spacer class %s does not supply an 'ATTRIBUTES'." % repr(obj)) try: for attr in obj.ATTRIBUTES: if attr.name == name: attr.set(obj,value) return except GuiXMLError as e: raise GuiXMLError("Error parsing attr '%s'='%s' for '%s': '%s'" % (name,value,obj,e)) raise GuiXMLError("Unknown GUI Attribute '%s' on '%s'" % (name,repr(obj))) def startElement(self, name, attrs): self._printTag(name,attrs) cls = self._resolveTag(name) if issubclass(cls,Widget): self.stack.append('gui_element') self._createInstance(cls,name,attrs) else: self.stack.append('unknown') self.indent += " "*4 def _createInstance(self,cls,name,attrs): obj = cls(parent=self.root) for k,v in list(attrs.items()): self._setAttr(obj,k,v) if self.root: if isinstance(obj,Tab): if hasattr(self.root,'addTabDefinition'): self.root.addTabDefinition(obj) else: raise GuiXMLError("A Tab needs to be added to a TabbedArea widget!") else: self.root.addChild( obj ) self.root = obj def endElement(self, name): self.indent = self.indent[:-4] if manager.debug: print(self.indent + "" % name) if self.stack.pop() in ('gui_element'): self.root = self.root.parent or self.root def loadXML(filename_or_stream): """ Loads a PyChan XML file and generates a widget from it. @param filename_or_stream: A filename or a file-like object (for example using StringIO). The XML format is very dynamic, in the sense, that the actual allowed tags and attributes depend on the PyChan code. So when a tag C{Button} is encountered, an instance of class Button will be generated, and added to the parent object. All attributes will then be parsed and then set in the following way: - position,size,min_size,max_size,margins - These are assumed to be comma separated tuples of integers. - foreground_color,base_color,background_color - These are assumed to be triples or quadruples of comma separated integers. (triples: r,g,b; quadruples: r,g,b,a) - border_size,padding - These are assumed to be simple integers. All other attributes are set verbatim as strings on the generated instance. In case a Widget does not accept an attribute to be set or the attribute can not be parsed correctly, the function will raise a GuiXMLError. In short::